From a8a47197e97da833417e7dd185ce0b0fdff9cda9 Mon Sep 17 00:00:00 2001 From: Xu Xuehui Date: Mon, 19 Oct 2015 11:08:20 +0800 Subject: [PATCH] 8723BU: Update 8723BU wifi driver to version v4.3.16_14189.20150519_BTCOEX2015119-5844 This driver is released by RealTek, main update as shown below: 1. Support Android 5.0,5.1 and older 2. Support Linux kernel 3.19.3 and older 3. Improve Wi-Fi/BT Coexistence stability and performance 4. Fix the problem of unexpected scan timeout 5. Add TDLS function 6. Fix STA mode disconnect problem caused by not checking TA of DEAUTH and DISASSOC frame 7. Fix the failed association issue with specific AP which supports only 11n MCS data rate Change-Id: I103d22a06eecc456c9777f17afdd1049efe9ff6a Signed-off-by: Xu Xuehui --- .../wireless/rockchip_wlan/rtl8723bu/Makefile | 431 +- .../rtl8723bu/core/efuse/rtw_efuse.c | 336 +- .../rockchip_wlan/rtl8723bu/core/rtw_ap.c | 30 +- .../rtl8723bu/core/rtw_beamforming.c | 10 +- .../rockchip_wlan/rtl8723bu/core/rtw_bt_mp.c | 30 +- .../rockchip_wlan/rtl8723bu/core/rtw_btcoex.c | 1396 ++- .../rockchip_wlan/rtl8723bu/core/rtw_cmd.c | 127 +- .../rockchip_wlan/rtl8723bu/core/rtw_debug.c | 748 +- .../rtl8723bu/core/rtw_ieee80211.c | 245 +- .../rtl8723bu/core/rtw_ioctl_rtl.c | 6 +- .../rtl8723bu/core/rtw_ioctl_set.c | 21 +- .../rockchip_wlan/rtl8723bu/core/rtw_mem.c | 2 + .../rockchip_wlan/rtl8723bu/core/rtw_mlme.c | 191 +- .../rtl8723bu/core/rtw_mlme_ext.c | 1873 ++-- .../rockchip_wlan/rtl8723bu/core/rtw_mp.c | 417 +- .../rtl8723bu/core/rtw_mp_ioctl.c | 2 - .../rockchip_wlan/rtl8723bu/core/rtw_odm.c | 83 +- .../rockchip_wlan/rtl8723bu/core/rtw_p2p.c | 73 +- .../rtl8723bu/core/rtw_pwrctrl.c | 197 +- .../rockchip_wlan/rtl8723bu/core/rtw_recv.c | 1027 +- .../rtl8723bu/core/rtw_security.c | 68 +- .../rockchip_wlan/rtl8723bu/core/rtw_sreset.c | 2 +- .../rtl8723bu/core/rtw_sta_mgt.c | 2 + .../rockchip_wlan/rtl8723bu/core/rtw_tdls.c | 2616 +++-- .../rockchip_wlan/rtl8723bu/core/rtw_vht.c | 45 +- .../rtl8723bu/core/rtw_wlan_util.c | 329 +- .../rockchip_wlan/rtl8723bu/core/rtw_xmit.c | 165 +- .../hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c | 172 +- .../hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c | 182 +- .../hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c | 2303 +++-- .../hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h | 68 +- .../hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c | 2277 +++-- .../hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h | 25 + .../hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c | 150 +- .../hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c | 326 +- .../hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c | 1677 ++- .../hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h | 52 +- .../hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c | 614 +- .../hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h | 8 + .../hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c | 2050 ++-- .../hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h | 72 +- .../hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c | 769 +- .../hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h | 3 + .../hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c | 305 +- .../hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c | 2969 +++--- .../hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h | 52 +- .../hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c | 345 +- .../hal/OUTSRC-BTCoexist/HalBtcOutSrc.h | 120 +- .../hal/OUTSRC-BTCoexist/Mp_Precomp.h | 30 + .../rtl8723bu/hal/OUTSRC/HalHWImg.h | 123 + .../rtl8723bu/hal/OUTSRC/HalPhyRf.c | 534 +- .../rtl8723bu/hal/OUTSRC/HalPhyRf.h | 12 +- .../rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.c | 1100 +- .../rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.h | 38 +- .../rtl8723bu/hal/OUTSRC/RtChnlPlan.c | 480 + .../rtl8723bu/hal/OUTSRC/RtChnlPlan.h | 699 ++ .../rockchip_wlan/rtl8723bu/hal/OUTSRC/odm.c | 6540 ------------ .../rockchip_wlan/rtl8723bu/hal/OUTSRC/odm.h | 2061 ---- .../rtl8723bu/hal/OUTSRC/odm_AntDiv.c | 2273 ----- .../rtl8723bu/hal/OUTSRC/odm_AntDiv.h | 136 - .../rtl8723bu/hal/OUTSRC/odm_CfoTracking.c | 363 - .../rtl8723bu/hal/OUTSRC/odm_CfoTracking.h | 66 - .../rtl8723bu/hal/OUTSRC/odm_DIG.c | 2647 ----- .../rtl8723bu/hal/OUTSRC/odm_DIG.h | 406 - .../hal/OUTSRC/odm_DynamicBBPowerSaving.c | 218 - .../hal/OUTSRC/odm_DynamicBBPowerSaving.h | 61 - .../rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.c | 884 -- .../rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.h | 87 - .../rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.c | 1915 ---- .../rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.h | 150 - .../rtl8723bu/hal/OUTSRC/odm_HWConfig.c | 2327 ----- .../rtl8723bu/hal/OUTSRC/odm_HWConfig.h | 237 - .../rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.c | 197 - .../rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.h | 49 - .../rtl8723bu/hal/OUTSRC/odm_PathDiv.c | 1580 --- .../rtl8723bu/hal/OUTSRC/odm_PathDiv.h | 196 - .../rtl8723bu/hal/OUTSRC/odm_RaInfo.c | 1583 --- .../rtl8723bu/hal/OUTSRC/odm_RaInfo.h | 169 - .../rtl8723bu/hal/OUTSRC/odm_RegDefine11AC.h | 75 - .../rtl8723bu/hal/OUTSRC/odm_RegDefine11N.h | 180 - .../rtl8723bu/hal/OUTSRC/odm_debug.c | 629 -- .../rtl8723bu/hal/OUTSRC/odm_debug.h | 892 -- .../rtl8723bu/hal/OUTSRC/odm_interface.c | 764 -- .../rtl8723bu/hal/OUTSRC/odm_interface.h | 400 - .../rtl8723bu/hal/OUTSRC/odm_precomp.h | 315 - .../rtl8723bu/hal/OUTSRC/odm_reg.h | 122 - .../rtl8723bu/hal/OUTSRC/odm_types.h | 274 - .../rtl8723bu/hal/OUTSRC/phydm.c | 1563 +-- .../rtl8723bu/hal/OUTSRC/phydm.h | 1130 +-- .../rtl8723bu/hal/OUTSRC/phydm_ACS.h | 2 +- .../rtl8723bu/hal/OUTSRC/phydm_AntDect.c | 59 +- .../rtl8723bu/hal/OUTSRC/phydm_AntDect.h | 52 +- .../rtl8723bu/hal/OUTSRC/phydm_AntDiv.c | 2490 +++-- .../rtl8723bu/hal/OUTSRC/phydm_AntDiv.h | 437 +- .../rtl8723bu/hal/OUTSRC/phydm_CfoTracking.c | 8 +- .../rtl8723bu/hal/OUTSRC/phydm_CfoTracking.h | 2 +- .../rtl8723bu/hal/OUTSRC/phydm_DIG.c | 88 +- .../rtl8723bu/hal/OUTSRC/phydm_DIG.h | 2 +- .../hal/OUTSRC/phydm_DynamicBBPowerSaving.h | 6 +- .../hal/OUTSRC/phydm_DynamicTxPower.c | 346 +- .../hal/OUTSRC/phydm_DynamicTxPower.h | 3 +- .../hal/OUTSRC/phydm_EdcaTurboCheck.c | 1134 +-- .../hal/OUTSRC/phydm_EdcaTurboCheck.h | 56 +- .../rtl8723bu/hal/OUTSRC/phydm_HWConfig.c | 1538 +-- .../rtl8723bu/hal/OUTSRC/phydm_HWConfig.h | 216 +- .../rtl8723bu/hal/OUTSRC/phydm_PathDiv.c | 903 +- .../rtl8723bu/hal/OUTSRC/phydm_PathDiv.h | 169 +- .../hal/OUTSRC/phydm_PowerTracking.c | 198 +- .../hal/OUTSRC/phydm_PowerTracking.h | 70 +- .../rtl8723bu/hal/OUTSRC/phydm_RXHP.c | 4 +- .../rtl8723bu/hal/OUTSRC/phydm_RaInfo.c | 2854 ++++-- .../rtl8723bu/hal/OUTSRC/phydm_RaInfo.h | 420 +- .../hal/OUTSRC/phydm_RegDefine11AC.h | 7 +- .../rtl8723bu/hal/OUTSRC/phydm_RegDefine11N.h | 21 +- .../rtl8723bu/hal/OUTSRC/phydm_beamforming.c | 2552 +++++ .../rtl8723bu/hal/OUTSRC/phydm_beamforming.h | 305 + .../rtl8723bu/hal/OUTSRC/phydm_debug.c | 1642 ++- .../rtl8723bu/hal/OUTSRC/phydm_debug.h | 103 +- .../rtl8723bu/hal/OUTSRC/phydm_interface.c | 407 +- .../rtl8723bu/hal/OUTSRC/phydm_interface.h | 20 +- .../rtl8723bu/hal/OUTSRC/phydm_pre_define.h | 564 ++ .../rtl8723bu/hal/OUTSRC/phydm_precomp.h | 344 +- .../rtl8723bu/hal/OUTSRC/phydm_types.h | 165 +- .../hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c | 178 +- .../hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h | 9 +- .../hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c | 8999 +++++++++-------- .../hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c | 109 +- .../hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h | 5 +- .../hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c | 336 +- .../hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h | 15 +- .../hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c | 104 +- .../hal/OUTSRC/rtl8723b/HalPhyRf_8723B.h | 2 +- .../hal/OUTSRC/rtl8723b/odm_RTL8723B.c | 578 -- .../hal/OUTSRC/rtl8723b/odm_RegConfig8723B.c | 234 - .../hal/OUTSRC/rtl8723b/odm_RegConfig8723B.h | 96 - .../hal/OUTSRC/rtl8723b/phydm_RTL8723B.c | 15 +- .../rtl8723bu/hal/efuse/efuse_mask.h | 60 + .../efuse/rtl8723b/HalEfuseMask8723B_PCIE.c | 101 + .../efuse/rtl8723b/HalEfuseMask8723B_PCIE.h | 40 + .../efuse/rtl8723b/HalEfuseMask8723B_USB.c | 100 + .../efuse/rtl8723b/HalEfuseMask8723B_USB.h | 42 + .../rockchip_wlan/rtl8723bu/hal/hal_btcoex.c | 709 +- .../rockchip_wlan/rtl8723bu/hal/hal_com.c | 1843 ++-- .../rtl8723bu/hal/hal_com_phycfg.c | 52 +- .../rockchip_wlan/rtl8723bu/hal/hal_dm.c | 88 +- .../rtl8723bu/hal/hal_hci/hal_usb.c | 297 +- .../rockchip_wlan/rtl8723bu/hal/hal_intf.c | 641 +- .../rtl8723bu/hal/led/hal_usb_led.c | 138 +- .../rtl8723bu/hal/rtl8723b/rtl8723b_cmd.c | 95 +- .../rtl8723bu/hal/rtl8723b/rtl8723b_dm.c | 143 +- .../hal/rtl8723b/rtl8723b_hal_init.c | 710 +- .../rtl8723bu/hal/rtl8723b/rtl8723b_mp.c | 58 +- .../rtl8723bu/hal/rtl8723b/rtl8723b_phycfg.c | 46 +- .../rtl8723bu/hal/rtl8723b/rtl8723b_rxdesc.c | 230 +- .../rtl8723bu/hal/rtl8723b/rtl8723b_sreset.c | 2 +- .../hal/rtl8723b/usb/rtl8723bu_recv.c | 185 +- .../hal/rtl8723b/usb/rtl8723bu_xmit.c | 5 +- .../rtl8723bu/hal/rtl8723b/usb/usb_halinit.c | 397 +- .../rtl8723bu/hal/rtl8723b/usb/usb_ops.c | 35 +- .../rtl8723bu/include/Hal8192CPhyReg.h | 1133 --- .../rtl8723bu/include/Hal8723BPhyReg.h | 1066 +- .../rtl8723bu/include/HalVerDef.h | 12 + .../rtl8723bu/include/autoconf.h | 48 +- .../rtl8723bu/include/basic_types.h | 14 +- .../rtl8723bu/include/drv_conf.h | 9 +- .../rtl8723bu/include/drv_types.h | 64 +- .../rtl8723bu/include/hal_btcoex.h | 5 + .../rockchip_wlan/rtl8723bu/include/hal_com.h | 51 +- .../rtl8723bu/include/hal_com_h2c.h | 23 +- .../rtl8723bu/include/hal_com_led.h | 3 +- .../rtl8723bu/include/hal_com_reg.h | 3 + .../rtl8723bu/include/hal_data.h | 461 +- .../rtl8723bu/include/hal_gspi.h | 32 - .../rtl8723bu/include/hal_intf.h | 241 +- .../rockchip_wlan/rtl8723bu/include/hal_pg.h | 234 +- .../rtl8723bu/include/hal_sdio.h | 32 - .../rtl8723bu/include/ieee80211.h | 15 +- .../rtl8723bu/include/ioctl_cfg80211.h | 177 - .../rtl8723bu/include/osdep_intf.h | 1 + .../rtl8723bu/include/osdep_service.h | 2 +- .../rtl8723bu/include/osdep_service_bsd.h | 749 -- .../rtl8723bu/include/osdep_service_ce.h | 192 - .../rtl8723bu/include/osdep_service_linux.h | 20 +- .../rtl8723bu/include/osdep_service_xp.h | 202 - .../rtl8723bu/include/recv_osdep.h | 2 + .../rtl8723bu/include/rtl8192c_recv.h | 113 - .../rtl8723bu/include/rtl8192c_rf.h | 45 - .../rtl8723bu/include/rtl8723b_cmd.h | 1 + .../rtl8723bu/include/rtl8723b_hal.h | 12 +- .../rtl8723bu/include/rtl8723b_recv.h | 46 +- .../rtl8723bu/include/rtl8723b_rf.h | 2 - .../rtl8723bu/include/rtl8723b_spec.h | 5 +- .../rtl8723bu/include/rtw_android.h | 3 +- .../rtl8723bu/include/rtw_br_ext.h | 2 +- .../rtl8723bu/include/rtw_btcoex.h | 319 +- .../rockchip_wlan/rtl8723bu/include/rtw_cmd.h | 9 +- .../rtl8723bu/include/rtw_debug.h | 21 + .../rtl8723bu/include/rtw_eeprom.h | 41 +- .../rtl8723bu/include/rtw_efuse.h | 57 +- .../rtl8723bu/include/rtw_ioctl_set.h | 2 +- .../rtl8723bu/include/rtw_mlme.h | 58 +- .../rtl8723bu/include/rtw_mlme_ext.h | 103 +- .../rockchip_wlan/rtl8723bu/include/rtw_mp.h | 163 +- .../rockchip_wlan/rtl8723bu/include/rtw_odm.h | 3 +- .../rockchip_wlan/rtl8723bu/include/rtw_p2p.h | 1 + .../rtl8723bu/include/rtw_pwrctrl.h | 4 +- .../rtl8723bu/include/rtw_recv.h | 11 +- .../rockchip_wlan/rtl8723bu/include/rtw_rf.h | 8 +- .../rtl8723bu/include/rtw_security.h | 2 + .../rtl8723bu/include/rtw_tdls.h | 100 +- .../rtl8723bu/include/rtw_version.h | 4 +- .../rockchip_wlan/rtl8723bu/include/rtw_vht.h | 2 +- .../rtl8723bu/include/rtw_xmit.h | 111 +- .../rtl8723bu/include/sta_info.h | 24 +- .../rockchip_wlan/rtl8723bu/include/usb_hal.h | 19 +- .../rockchip_wlan/rtl8723bu/include/usb_ops.h | 34 +- .../rockchip_wlan/rtl8723bu/include/wifi.h | 5 + .../rtl8723bu/include/wlan_bssdef.h | 7 +- .../os_dep/linux/custom_gpio_linux.c | 45 +- .../rtl8723bu/os_dep/linux/ioctl_cfg80211.c | 434 +- .../rtl8723bu/os_dep/linux/ioctl_cfg80211.h | 5 +- .../rtl8723bu/os_dep/linux/ioctl_linux.c | 1569 +-- .../rtl8723bu/os_dep/linux/os_intfs.c | 413 +- .../rtl8723bu/os_dep/linux/recv_linux.c | 51 +- .../rtl8723bu/os_dep/linux/rtw_android.c | 32 +- .../rtl8723bu/os_dep/linux/rtw_cfgvendor.c | 11 +- .../rtl8723bu/os_dep/linux/rtw_proc.c | 78 +- .../rtl8723bu/os_dep/linux/usb_intf.c | 288 +- .../rtl8723bu/os_dep/linux/usb_ops_linux.c | 166 +- .../rtl8723bu/os_dep/linux/wifi_version.h | 3 +- .../rtl8723bu/os_dep/osdep_service.c | 10 +- .../platform/platform_ARM_SUNnI_sdio.c | 15 + .../platform_arm_act_sdio.c} | 94 +- 233 files changed, 42770 insertions(+), 58972 deletions(-) create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalHWImg.h create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/RtChnlPlan.c create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/RtChnlPlan.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_AntDiv.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_AntDiv.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_CfoTracking.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_CfoTracking.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DIG.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DIG.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicBBPowerSaving.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicBBPowerSaving.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_HWConfig.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_HWConfig.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_PathDiv.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_PathDiv.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RaInfo.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RaInfo.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RegDefine11AC.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RegDefine11N.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_debug.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_debug.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_interface.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_interface.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_precomp.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_reg.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_types.h create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_beamforming.c create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_beamforming.h create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_pre_define.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RTL8723B.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RegConfig8723B.c delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RegConfig8723B.h create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/efuse_mask.h create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_PCIE.c create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_PCIE.h create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_USB.c create mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_USB.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/include/Hal8192CPhyReg.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_gspi.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_sdio.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/include/ioctl_cfg80211.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_bsd.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_ce.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_xp.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8192c_recv.h delete mode 100755 drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8192c_rf.h rename drivers/net/wireless/rockchip_wlan/rtl8723bu/{hal/OUTSRC/rtl8723b/odm_RTL8723B.h => platform/platform_arm_act_sdio.c} (52%) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/Makefile b/drivers/net/wireless/rockchip_wlan/rtl8723bu/Makefile index fd344535a3b5..2aa878d8ec79 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/Makefile +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/Makefile @@ -24,14 +24,12 @@ CONFIG_AUTOCFG_CP = n ########################## WIFI IC ############################ CONFIG_MULTIDRV = n -CONFIG_RTL8192C = n -CONFIG_RTL8192D = n -CONFIG_RTL8723A = n CONFIG_RTL8188E = n CONFIG_RTL8812A = n CONFIG_RTL8821A = n CONFIG_RTL8192E = n CONFIG_RTL8723B = y +CONFIG_RTL8814A = n ######################### Interface ########################### CONFIG_USB_HCI = y CONFIG_PCI_HCI = n @@ -44,7 +42,6 @@ CONFIG_USB_AUTOSUSPEND = n CONFIG_HW_PWRP_DETECTION = n CONFIG_WIFI_TEST = n CONFIG_BT_COEXIST = y -CONFIG_RTL8192CU_REDEFINE_1X1 = n CONFIG_INTEL_WIDI = n CONFIG_WAPI_SUPPORT = n CONFIG_EFUSE_CONFIG_FILE = n @@ -60,6 +57,7 @@ CONFIG_80211W = n CONFIG_REDUCE_TX_CPU_LOADING = n CONFIG_BR_EXT = y CONFIG_ANTENNA_DIVERSITY = n +CONFIG_TDLS = n ######################## Wake On Lan ########################## CONFIG_WOWLAN = n CONFIG_GPIO_WAKEUP = n @@ -105,9 +103,11 @@ CONFIG_PLATFORM_SZEBOOK = n CONFIG_PLATFORM_ARM_SUNxI = n CONFIG_PLATFORM_ARM_SUN6I = n CONFIG_PLATFORM_ARM_SUN7I = n -CONFIG_PLATFORM_ARM_SUN8I = n +CONFIG_PLATFORM_ARM_SUN8I_W3P1 = n +CONFIG_PLATFORM_ARM_SUN8I_W5P1 = n CONFIG_PLATFORM_ACTIONS_ATM702X = n CONFIG_PLATFORM_ACTIONS_ATV5201 = n +CONFIG_PLATFORM_ACTIONS_ATM705X = n CONFIG_PLATFORM_ARM_RTD299X = n CONFIG_PLATFORM_ARM_SPREADTRUM_6820 = n CONFIG_PLATFORM_ARM_SPREADTRUM_8810 = n @@ -115,6 +115,8 @@ CONFIG_PLATFORM_ARM_WMT = n CONFIG_PLATFORM_TI_DM365 = n CONFIG_PLATFORM_MOZART = n CONFIG_PLATFORM_RTK119X = n +CONFIG_PLATFORM_NOVATEK_NT72668 = n +CONFIG_PLATFORM_HISILICON = n ############################################################### CONFIG_DRVEXT_MODULE = n @@ -175,6 +177,7 @@ _HAL_INTFS_FILES := hal/hal_intf.o \ _OUTSRC_FILES := hal/OUTSRC/phydm_debug.o \ hal/OUTSRC/phydm_AntDiv.o\ + hal/OUTSRC/phydm_AntDect.o\ hal/OUTSRC/phydm_interface.o\ hal/OUTSRC/phydm_HWConfig.o\ hal/OUTSRC/phydm.o\ @@ -196,12 +199,8 @@ _PLATFORM_FILES := platform/platform_ops.o ifeq ($(CONFIG_BT_COEXIST), y) EXTRA_CFLAGS += -I$(src)/hal/OUTSRC-BTCoexist -_OUTSRC_FILES += hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.o \ - hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.o \ - hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.o \ +_OUTSRC_FILES += hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.o \ hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.o \ - hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.o \ - hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.o \ hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.o \ hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.o \ hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.o \ @@ -211,181 +210,6 @@ _OUTSRC_FILES += hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.o \ hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.o endif -########### HAL_RTL8192C ################################# - -ifeq ($(CONFIG_RTL8192C), y) -RTL871X = rtl8192c -ifeq ($(CONFIG_USB_HCI), y) -MODULE_NAME = 8192cu -endif -ifeq ($(CONFIG_PCI_HCI), y) -MODULE_NAME = 8192ce -endif -EXTRA_CFLAGS += -DCONFIG_RTL8192C - -_HAL_INTFS_FILES += \ - hal/$(RTL871X)/$(RTL871X)_sreset.o \ - hal/$(RTL871X)/$(RTL871X)_xmit.o - -_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ - hal/$(RTL871X)/$(RTL871X)_phycfg.o \ - hal/$(RTL871X)/$(RTL871X)_rf6052.o \ - hal/$(RTL871X)/$(RTL871X)_dm.o \ - hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ - hal/$(RTL871X)/$(RTL871X)_cmd.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_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o - - -ifeq ($(CONFIG_MP_INCLUDED), y) -_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o -endif - -_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/phydm_RTL8192C.o\ - hal/OUTSRC/$(RTL871X)/HalDMOutSrc8192C_CE.o - -ifeq ($(CONFIG_USB_HCI), y) -_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/Hal8192CUFWImg_CE.o \ - hal/OUTSRC/$(RTL871X)/Hal8192CUPHYImg_CE.o \ - hal/OUTSRC/$(RTL871X)/Hal8192CUMACImg_CE.o -endif - -ifeq ($(CONFIG_PCI_HCI), y) -_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/Hal8192CEFWImg_CE.o \ - hal/OUTSRC/$(RTL871X)/Hal8192CEPHYImg_CE.o \ - hal/OUTSRC/$(RTL871X)/Hal8192CEMACImg_CE.o -endif - -endif - -########### HAL_RTL8192D ################################# -ifeq ($(CONFIG_RTL8192D), y) -RTL871X = rtl8192d -ifeq ($(CONFIG_USB_HCI), y) -MODULE_NAME = 8192du -endif -ifeq ($(CONFIG_PCI_HCI), y) -MODULE_NAME = 8192de -endif -EXTRA_CFLAGS += -DCONFIG_RTL8192D - -_HAL_INTFS_FILES += \ - hal/$(RTL871X)/$(RTL871X)_xmit.o - -_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ - hal/$(RTL871X)/$(RTL871X)_phycfg.o \ - hal/$(RTL871X)/$(RTL871X)_rf6052.o \ - hal/$(RTL871X)/$(RTL871X)_dm.o \ - hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ - hal/$(RTL871X)/$(RTL871X)_cmd.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_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o - -ifeq ($(CONFIG_MP_INCLUDED), y) -_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o -endif - -_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 \ - hal/OUTSRC/$(RTL871X)/Hal8192DUMACImg_CE.o -endif - -ifeq ($(CONFIG_PCI_HCI), y) -_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/Hal8192DEFWImg_CE.o \ - hal/OUTSRC/$(RTL871X)/Hal8192DEPHYImg_CE.o \ - hal/OUTSRC/$(RTL871X)/Hal8192DEMACImg_CE.o -endif - -endif - -########### HAL_RTL8723A ################################# -ifeq ($(CONFIG_RTL8723A), y) - -RTL871X = rtl8723a -ifeq ($(CONFIG_GSPI_HCI), y) -MODULE_NAME = 8723as -endif -ifeq ($(CONFIG_SDIO_HCI), y) -MODULE_NAME = 8723as -endif -ifeq ($(CONFIG_USB_HCI), y) -MODULE_NAME = 8723au -endif -ifeq ($(CONFIG_PCI_HCI), y) -MODULE_NAME = 8723ae -endif -EXTRA_CFLAGS += -DCONFIG_RTL8723A - -_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 \ - hal/$(RTL871X)/$(RTL871X)_dm.o \ - hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ - hal/$(RTL871X)/$(RTL871X)_cmd.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 - -ifeq ($(CONFIG_SDIO_HCI), y) -_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -else -ifeq ($(CONFIG_GSPI_HCI), y) -_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o -else -_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o -endif -endif - -ifeq ($(CONFIG_MP_INCLUDED), y) -_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o -endif - -ifeq ($(CONFIG_GSPI_HCI), y) -_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/Hal8723SHWImg_CE.o -endif - -ifeq ($(CONFIG_SDIO_HCI), y) -_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/Hal8723SHWImg_CE.o -endif - -ifeq ($(CONFIG_USB_HCI), y) -_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/Hal8723UHWImg_CE.o -endif - -ifeq ($(CONFIG_PCI_HCI), y) -_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/Hal8723EHWImg_CE.o -endif - -#hal/OUTSRC/$(RTL871X)/HalHWImg8723A_FW.o -_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8723A_BB.o\ - hal/OUTSRC/$(RTL871X)/HalHWImg8723A_MAC.o\ - hal/OUTSRC/$(RTL871X)/HalHWImg8723A_RF.o\ - hal/OUTSRC/$(RTL871X)/phydm_RegConfig8723A.o - -_OUTSRC_FILES += hal/OUTSRC/rtl8192c/HalDMOutSrc8192C_CE.o - - -endif - ########### HAL_RTL8188E ################################# ifeq ($(CONFIG_RTL8188E), y) @@ -438,6 +262,16 @@ ifeq ($(CONFIG_MP_INCLUDED), y) _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o endif +ifeq ($(CONFIG_USB_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_USB.o +endif +ifeq ($(CONFIG_PCI_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_PCIE.o +endif +ifeq ($(CONFIG_SDIO_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_SDIO.o +endif + #hal/OUTSRC/$(RTL871X)/Hal8188EFWImg_CE.o _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8188E_MAC.o\ hal/OUTSRC/$(RTL871X)/HalHWImg8188E_BB.o\ @@ -496,6 +330,13 @@ ifeq ($(CONFIG_MP_INCLUDED), y) _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o endif +ifeq ($(CONFIG_USB_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8192E_USB.o +endif +ifeq ($(CONFIG_PCI_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8192E_PCIE.o +endif + #hal/OUTSRC/$(RTL871X)/HalHWImg8188E_FW.o _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8192E_MAC.o\ hal/OUTSRC/$(RTL871X)/HalHWImg8192E_BB.o\ @@ -553,6 +394,23 @@ ifeq ($(CONFIG_MP_INCLUDED), y) _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o endif +ifeq ($(CONFIG_RTL8812A), y) +ifeq ($(CONFIG_USB_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8812A_USB.o +endif +ifeq ($(CONFIG_PCI_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8812A_PCIE.o +endif +endif +ifeq ($(CONFIG_RTL8821A), y) +ifeq ($(CONFIG_USB_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8821A_USB.o +endif +ifeq ($(CONFIG_PCI_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8821A_PCIE.o +endif +endif + ifeq ($(CONFIG_RTL8812A), y) EXTRA_CFLAGS += -DCONFIG_RTL8812A _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8812A_FW.o\ @@ -587,10 +445,10 @@ _OUTSRC_FILES += hal/OUTSRC/rtl8821a/HalHWImg8821A_FW.o\ hal/OUTSRC/rtl8821a/HalHWImg8821A_BB.o\ hal/OUTSRC/rtl8821a/HalHWImg8821A_RF.o\ hal/OUTSRC/rtl8812a/HalPhyRf_8812A.o\ - hal/OUTSRC/rtl8821a/HalPhyRf_8821A.o\ + hal/OUTSRC/rtl8821a/HalPhyRf_8821A_CE.o\ hal/OUTSRC/rtl8821a/phydm_RegConfig8821A.o\ hal/OUTSRC/rtl8821a/phydm_RTL8821A.o\ - hal/OUTSRC/rtl8821a/PhyDM_IQK_8821A.o + hal/OUTSRC/rtl8821a/PhyDM_IQK_8821A_CE.o endif @@ -640,6 +498,13 @@ ifeq ($(CONFIG_MP_INCLUDED), y) _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o endif +ifeq ($(CONFIG_USB_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723B_USB.o +endif +ifeq ($(CONFIG_PCI_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723B_PCIE.o +endif + _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8723B_BB.o\ hal/OUTSRC/$(RTL871X)/HalHWImg8723B_MAC.o\ hal/OUTSRC/$(RTL871X)/HalHWImg8723B_RF.o\ @@ -651,6 +516,73 @@ _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8723B_BB.o\ endif +########### HAL_RTL8814A ################################# +ifeq ($(CONFIG_RTL8814A), y) + +RTL871X = rtl8814a +ifeq ($(CONFIG_USB_HCI), y) +MODULE_NAME = 8814au +endif +ifeq ($(CONFIG_PCI_HCI), y) +MODULE_NAME = 8814ae +endif +ifeq ($(CONFIG_SDIO_HCI), y) +MODULE_NAME = 8814as +endif + +EXTRA_CFLAGS += -DCONFIG_RTL8814A + +_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ + hal/$(RTL871X)/Hal8814PwrSeq.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 \ + 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 \ + 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 +ifeq ($(CONFIG_GSPI_HCI), y) +_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o +else +_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o +endif +endif + +ifeq ($(CONFIG_MP_INCLUDED), y) +_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o +endif + +ifeq ($(CONFIG_USB_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8814A_USB.o +endif +ifeq ($(CONFIG_PCI_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8814A_PCIE.o +endif + +_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8814A_BB.o\ + hal/OUTSRC/$(RTL871X)/HalHWImg8814A_MAC.o\ + hal/OUTSRC/$(RTL871X)/HalHWImg8814A_RF.o\ + hal/OUTSRC/$(RTL871X)/HalHWImg8814A_FW.o\ + hal/OUTSRC/$(RTL871X)/PhyDM_IQK_8814A.o\ + hal/OUTSRC/$(RTL871X)/phydm_RegConfig8814A.o\ + hal/OUTSRC/$(RTL871X)/HalPhyRf_8814A.o\ + hal/OUTSRC/$(RTL871X)/phydm_RTL8814A.o + +endif + ########### AUTO_CFG ################################# ifeq ($(CONFIG_AUTOCFG_CP), y) @@ -697,10 +629,6 @@ ifeq ($(CONFIG_BT_COEXIST), y) EXTRA_CFLAGS += -DCONFIG_BT_COEXIST endif -ifeq ($(CONFIG_RTL8192CU_REDEFINE_1X1), y) -EXTRA_CFLAGS += -DRTL8192C_RECONFIG_TO_1T1R -endif - ifeq ($(CONFIG_INTEL_WIDI), y) EXTRA_CFLAGS += -DCONFIG_INTEL_WIDI endif @@ -712,16 +640,29 @@ endif ifeq ($(CONFIG_EFUSE_CONFIG_FILE), y) EXTRA_CFLAGS += -DCONFIG_EFUSE_CONFIG_FILE -ifeq ($(MODULE_NAME), 8189es) + +#EFUSE_MAP_PATH +USER_EFUSE_MAP_PATH ?= +ifneq ($(USER_EFUSE_MAP_PATH),) +EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"$(USER_EFUSE_MAP_PATH)\" +else 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 + +#WIFIMAC_PATH +USER_WIFIMAC_PATH ?= +ifneq ($(USER_WIFIMAC_PATH),) +EXTRA_CFLAGS += -DWIFIMAC_PATH=\"$(USER_WIFIMAC_PATH)\" +else EXTRA_CFLAGS += -DWIFIMAC_PATH=\"/data/wifimac.txt\" endif +endif + ifeq ($(CONFIG_EXT_CLK), y) EXTRA_CFLAGS += -DCONFIG_EXT_CLK endif @@ -813,12 +754,13 @@ ifeq ($(CONFIG_ANTENNA_DIVERSITY), y) EXTRA_CFLAGS += -DCONFIG_ANTENNA_DIVERSITY endif +ifeq ($(CONFIG_TDLS), y) +EXTRA_CFLAGS += -DCONFIG_TDLS +endif ifeq ($(CONFIG_PLATFORM_I386_PC), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS SUBARCH := $(shell uname -m | sed -e s/i.86/i386/) ARCH ?= $(SUBARCH) CROSS_COMPILE ?= @@ -840,6 +782,28 @@ KSRC := $(KERNEL_BUILD_PATH) MODULE_NAME :=wlan endif +ifeq ($(CONFIG_PLATFORM_ACTIONS_ATM705X), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +#EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC +# default setting for Android 4.1, 4.2, 4.3, 4.4 +EXTRA_CFLAGS += -DCONFIG_PLATFORM_ACTIONS_ATM705X +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +EXTRA_CFLAGS += -DCONFIG_P2P_IPS + +# Enable this for Android 5.0 +EXTRA_CFLAGS += -DCONFIG_RADIO_WORK + +ifeq ($(CONFIG_SDIO_HCI), y) +EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS +_PLATFORM_FILES += platform/platform_arm_act_sdio.o +endif + +ARCH := arm +CROSS_COMPILE := /opt/arm-2011.09/bin/arm-none-linux-gnueabi- +KSRC := /home/android_sdk/Action-semi/705a_android_L/android/kernel +endif + ifeq ($(CONFIG_PLATFORM_TI_AM3517), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_SHUTTLE CROSS_COMPILE := arm-eabi- @@ -1092,9 +1056,9 @@ endif ifeq ($(CONFIG_PLATFORM_ARM_RK2818), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS ARCH := arm -#CROSS_COMPILE := /usr/src/release_fae_version/toolchain/arm-eabi-4.4.0/bin/arm-eabi- -#KSRC := /usr/src/release_fae_version/kernel25_A7_281x -MODULE_NAME := 8723bu +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 endif ifeq ($(CONFIG_PLATFORM_ARM_RK3188), y) @@ -1104,10 +1068,12 @@ EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE # default setting for Special function EXTRA_CFLAGS += -DCONFIG_P2P_IPS +EXTRA_CFLAGS += -DCONFIG_RADIO_WORK +EXTRA_CFLAGS += -DCONFIG_RESUME_IN_WORKQUEUE 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 := 8723bu +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 := wlan endif ifeq ($(CONFIG_PLATFORM_ARM_RK3066), y) @@ -1261,9 +1227,10 @@ CROSS_COMPILE := /home/android_sdk/Allwinner/a20/kitkat-a20_v4.4/lichee/out/andr KSRC := /home/android_sdk/Allwinner/a20/kitkat-a20_v4.4/lichee/linux-3.4 endif -ifeq ($(CONFIG_PLATFORM_ARM_SUN8I), y) +ifeq ($(CONFIG_PLATFORM_ARM_SUN8I_W3P1), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN8I +EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN8I_W3P1 EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE @@ -1288,6 +1255,34 @@ CROSS_COMPILE := /home/android_sdk/Allwinner/a23/android-kk44/lichee/out/android KSRC :=/home/android_sdk/Allwinner/a23/android-kk44/lichee/linux-3.4 endif +ifeq ($(CONFIG_PLATFORM_ARM_SUN8I_W5P1), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN8I +EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN8I_W5P1 +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 + +# Enable this for Android 5.0 +EXTRA_CFLAGS += -DCONFIG_RADIO_WORK + +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 L SDK === +CROSS_COMPILE := /home/android_sdk/Allwinner/a33/android-L/lichee/out/sun8iw5p1/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi- +KSRC :=/home/android_sdk/Allwinner/a33/android-L/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 @@ -1303,6 +1298,23 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DUSB_XMITBUF_ALIGN_SZ=1024 -DUSB_PACKET_ INSTALL_PREFIX := endif +ifeq ($(CONFIG_PLATFORM_HISILICON), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_HISILICON +ifeq ($(SUPPORT_CONCURRENT),y) +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +endif +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +EXTRA_CFLAGS += -DCONFIG_P2P_IPS +ARCH := arm +ifeq ($(CROSS_COMPILE),) + CROSS_COMPILE = arm-hisiv200-linux- +endif +MODULE_NAME := rtl8192eu +ifeq ($(KSRC),) + KSRC := ../../../../../../kernel/linux-3.4.y +endif +endif + # Platfrom setting ifeq ($(CONFIG_PLATFORM_ARM_SPREADTRUM_6820), y) ifeq ($(CONFIG_ANDROID_2X), y) @@ -1381,6 +1393,20 @@ MODULE_NAME := 8192eu endif +ifeq ($(CONFIG_PLATFORM_NOVATEK_NT72668), y) +EXTRA_CFLAGS += -DCONFIG_PLATFORM_NOVATEK_NT72668 +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +EXTRA_CFLAGS += -DDCONFIG_P2P_IPS +EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_RX +EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX +ARCH ?= arm +CROSS_COMPILE := arm-linux-gnueabihf- +KVER := 3.8.0 +KSRC := /Custom/Novatek/TCL/linux-3.8_header +#KSRC := $(KERNELDIR) +endif ifeq ($(CONFIG_MULTIDRV), y) @@ -1448,9 +1474,6 @@ $(MODULE_NAME)-y += $(_PLATFORM_FILES) $(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o \ core/rtw_mp_ioctl.o -ifeq ($(CONFIG_RTL8723A), y) -$(MODULE_NAME)-$(CONFIG_MP_INCLUDED)+= core/rtw_bt_mp.o -endif ifeq ($(CONFIG_RTL8723B), y) $(MODULE_NAME)-$(CONFIG_MP_INCLUDED)+= core/rtw_bt_mp.o endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/efuse/rtw_efuse.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/efuse/rtw_efuse.c index 5d3f80afea29..e36ae542c582 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/efuse/rtw_efuse.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/efuse/rtw_efuse.c @@ -22,6 +22,7 @@ #include #include +#include "../hal/efuse/efuse_mask.h" /*------------------------Define local variable------------------------------*/ u8 fakeEfuseBank=0; @@ -39,6 +40,8 @@ u32 fakeBTEfuseUsedBytes=0; u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0}; u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0}; + +u8 maskfileBuffer[32]; /*------------------------Define local variable------------------------------*/ //------------------------------------------------------------------------------ @@ -433,7 +436,8 @@ efuse_OneByteRead( u32 tmpidx = 0; u8 bResult; u8 readbyte; - + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + //DBG_871X("===> EFUSE_OneByteRead(), addr = %x\n", addr); //DBG_871X("===> EFUSE_OneByteRead() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST)); @@ -442,9 +446,12 @@ efuse_OneByteRead( bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data); return bResult; } - + if( IS_HARDWARE_TYPE_8723B(pAdapter) || - (IS_HARDWARE_TYPE_8192E(pAdapter) && IS_VENDOR_8192E_B_CUT(pAdapter))) + (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || + //(IS_HARDWARE_TYPE_8188E(pAdapter) && ((IS_I_CUT(pHalData->VersionID)) || (IS_J_CUT(pHalData->VersionID)))) + (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) + ) { // <20130121, Kordan> For SMIC EFUSE specificatoin. //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) @@ -495,7 +502,8 @@ efuse_OneByteWrite( u8 tmpidx = 0; u8 bResult=_FALSE; u32 efuseValue = 0; - + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + //DBG_871X("===> EFUSE_OneByteWrite(), addr = %x data=%x\n", addr, data); //DBG_871X("===> EFUSE_OneByteWrite() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST)); @@ -517,7 +525,11 @@ efuse_OneByteWrite( // <20130227, Kordan> 8192E MP chip A-cut had better not set 0x34[11] until B-Cut. - if (IS_HARDWARE_TYPE_8723B(pAdapter)||(IS_HARDWARE_TYPE_8192E(pAdapter) && IS_VENDOR_8192E_B_CUT(pAdapter))) + if ( IS_HARDWARE_TYPE_8723B(pAdapter) || + (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || + //(IS_HARDWARE_TYPE_8188E(pAdapter) && ((IS_I_CUT(pHalData->VersionID)) || (IS_J_CUT(pHalData->VersionID)))) + (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) + ) { // <20130121, Kordan> For SMIC EFUSE specificatoin. //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) @@ -548,7 +560,11 @@ efuse_OneByteWrite( } // disable Efuse program enable - if (IS_HARDWARE_TYPE_8723B(pAdapter)) + if ( IS_HARDWARE_TYPE_8723B(pAdapter) || + (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || + //(IS_HARDWARE_TYPE_8188E(pAdapter) && ((IS_I_CUT(pHalData->VersionID)) || (IS_J_CUT(pHalData->VersionID)))) + (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) + ) { PHY_SetMacReg(pAdapter, EFUSE_TEST, BIT(11), 0); } @@ -711,6 +727,8 @@ u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 * u16 efuse_GetMaxSize(PADAPTER padapter) { u16 max_size; + + max_size = 0; EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE); return max_size; } @@ -759,6 +777,153 @@ u8 rtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) return _SUCCESS; } + +BOOLEAN rtw_file_efuse_IsMasked( + PADAPTER pAdapter, + u16 Offset + ) +{ + int r = Offset/16; + int c = (Offset%16) / 2; + int result = 0; + + if(pAdapter->registrypriv.boffefusemask) + return FALSE; + + //DBG_871X(" %s ,Offset=%x r= %d , c=%d , maskfileBuffer[r]= %x \n",__func__,Offset,r,c,maskfileBuffer[r]); + if (c < 4) // Upper double word + result = (maskfileBuffer[r] & (0x10 << c)); + else + result = (maskfileBuffer[r] & (0x01 << (c-4))); + + return (result > 0) ? 0 : 1; + +} + + +u8 rtw_efuse_file_read(PADAPTER padapter,u8 *filepatch,u8 *buf,u32 len) +{ + char *ptmp; + char *ptmpbuf=NULL; + u32 rtStatus; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + ptmpbuf = rtw_zmalloc(2048); + + if (ptmpbuf == NULL) + return _FALSE; + + _rtw_memset(ptmpbuf,'\0',2048); + + rtStatus = rtw_retrive_from_file(filepatch, ptmpbuf, 2048); + + if( rtStatus > 100 ) + { + u32 i,j; + for(i=0,j=0;jregistrypriv.boffefusemask) + return FALSE; + +#if DEV_BUS_TYPE == RT_USB_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + return (IS_MASKED(8188E,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8812A) + if (IS_HARDWARE_TYPE_8812(pAdapter)) + return (IS_MASKED(8812A,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8821A) + //if (IS_HARDWARE_TYPE_8811AU(pAdapter)) + // return (IS_MASKED(8811A,_MUSB,Offset)) ? TRUE : FALSE; + if (IS_HARDWARE_TYPE_8821(pAdapter)) + return (IS_MASKED(8821A,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8192E) + if (IS_HARDWARE_TYPE_8192E(pAdapter)) + return (IS_MASKED(8192E,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8723B) + if (IS_HARDWARE_TYPE_8723B(pAdapter)) + return (IS_MASKED(8723B,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8814A) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + return (IS_MASKED(8814A, _MUSB, Offset)) ? TRUE : FALSE; +#endif +#elif DEV_BUS_TYPE == RT_PCI_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + return (IS_MASKED(8188E,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8192E) + if (IS_HARDWARE_TYPE_8192E(pAdapter)) + return (IS_MASKED(8192E,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8812A) + if (IS_HARDWARE_TYPE_8812(pAdapter)) + return (IS_MASKED(8812A,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8821A) + if (IS_HARDWARE_TYPE_8821(pAdapter)) + return (IS_MASKED(8821A,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8723B) + if (IS_HARDWARE_TYPE_8723B(pAdapter)) + return (IS_MASKED(8723B,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8814A) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + return (IS_MASKED(8814A, _MPCIE, Offset)) ? TRUE : FALSE; +#endif + //else if (IS_HARDWARE_TYPE_8821B(pAdapter)) + // return (IS_MASKED(8821B,_MPCIE,Offset)) ? TRUE : FALSE; + +#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE +#ifdef CONFIG_RTL8188E_SDIO + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + return (IS_MASKED(8188E,_MSDIO,Offset)) ? TRUE : FALSE; +#endif +#endif + + return FALSE; +} + //------------------------------------------------------------------------------ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { @@ -775,7 +940,6 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) s32 i, j, idx; u8 ret = _SUCCESS; u16 mapLen=0; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); @@ -796,6 +960,23 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) ret = rtw_efuse_map_read(padapter, 0, mapLen, map); if (ret == _FAIL) goto exit; + if(padapter->registrypriv.boffefusemask==0) + { + for (i =0; i < cnts; i++) + { + if(padapter->registrypriv.bFileMaskEfuse==_TRUE) + { + if (rtw_file_efuse_IsMasked(padapter, addr+i)) /*use file efuse mask. */ + data[i] = map[addr+i]; + } + else + { + if ( efuse_IsMasked(padapter, addr+i )) + data[i] = map[addr+i]; + } + DBG_8192C("%s , data[%d] = %x, map[addr+i]= %x\n", __func__, i, data[i], map[addr+i]); + } + } Efuse_PowerSwitch(padapter, _TRUE, _TRUE); idx = 0; @@ -816,10 +997,10 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { if (IS_C_CUT(pHalData->VersionID) || IS_B_CUT(pHalData->VersionID)) { - if(pEEPROM->adjuseVoltageVal == 6) + if(pHalData->adjuseVoltageVal == 6) { newdata[i] = map[addr + idx]; - DBG_8192C(" %s ,\n adjuseVoltageVal = %d ,newdata[%d] = %x \n",__func__,pEEPROM->adjuseVoltageVal,i,newdata[i]); + DBG_8192C(" %s ,\n adjuseVoltageVal = %d ,newdata[%d] = %x \n",__func__,pHalData->adjuseVoltageVal,i,newdata[i]); } } } @@ -851,8 +1032,35 @@ exit: return ret; } +u8 rtw_efuse_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) +{ + u8 ret = _SUCCESS; + u16 mapLen = 0, i = 0; + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); + + ret = rtw_efuse_map_read(padapter, 0, mapLen, data); + + if (padapter->registrypriv.boffefusemask == 0) { + + for (i = 0; i < cnts; i++) { + if (padapter->registrypriv.bFileMaskEfuse == _TRUE) { + if (rtw_file_efuse_IsMasked(padapter, addr+i)) /*use file efuse mask.*/ + data[i] = 0xff; + } else { + /*DBG_8192C(" %s , data[%d] = %x\n", __func__, i, data[i]);*/ + if (efuse_IsMasked(padapter, addr+i)) { + data[i] = 0xff; + /*DBG_8192C(" %s ,mask data[%d] = %x\n", __func__, i, data[i]);*/ + } + } + } + + } + return ret; + +} -//------------------------------------------------------------------------------ u8 rtw_BT_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { #define RT_ASSERT_RET(expr) \ @@ -1005,9 +1213,9 @@ efuse_ShadowRead1Byte( IN u16 Offset, IN OUT u8 *Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - *Value = pEEPROM->efuse_eeprom_data[Offset]; + *Value = pHalData->efuse_eeprom_data[Offset]; } // EFUSE_ShadowRead1Byte @@ -1018,10 +1226,10 @@ efuse_ShadowRead2Byte( IN u16 Offset, IN OUT u16 *Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - *Value = pEEPROM->efuse_eeprom_data[Offset]; - *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; + *Value = pHalData->efuse_eeprom_data[Offset]; + *Value |= pHalData->efuse_eeprom_data[Offset+1]<<8; } // EFUSE_ShadowRead2Byte @@ -1032,12 +1240,12 @@ efuse_ShadowRead4Byte( IN u16 Offset, IN OUT u32 *Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - *Value = pEEPROM->efuse_eeprom_data[Offset]; - *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; - *Value |= pEEPROM->efuse_eeprom_data[Offset+2]<<16; - *Value |= pEEPROM->efuse_eeprom_data[Offset+3]<<24; + *Value = pHalData->efuse_eeprom_data[Offset]; + *Value |= pHalData->efuse_eeprom_data[Offset+1]<<8; + *Value |= pHalData->efuse_eeprom_data[Offset+2]<<16; + *Value |= pHalData->efuse_eeprom_data[Offset+3]<<24; } // efuse_ShadowRead4Byte @@ -1073,9 +1281,9 @@ efuse_ShadowWrite1Byte( IN u16 Offset, IN u8 Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - pEEPROM->efuse_eeprom_data[Offset] = Value; + pHalData->efuse_eeprom_data[Offset] = Value; } // efuse_ShadowWrite1Byte @@ -1086,10 +1294,12 @@ efuse_ShadowWrite2Byte( IN u16 Offset, IN u16 Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); + - pEEPROM->efuse_eeprom_data[Offset] = Value&0x00FF; - pEEPROM->efuse_eeprom_data[Offset+1] = Value>>8; + pHalData->efuse_eeprom_data[Offset] = Value&0x00FF; + pHalData->efuse_eeprom_data[Offset+1] = Value>>8; } // efuse_ShadowWrite1Byte @@ -1100,12 +1310,12 @@ efuse_ShadowWrite4Byte( IN u16 Offset, IN u32 Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - pEEPROM->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF); - pEEPROM->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF); - pEEPROM->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF); - pEEPROM->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF); + pHalData->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF); + pHalData->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF); + pHalData->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF); + pHalData->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF); } // efuse_ShadowWrite1Byte @@ -1130,25 +1340,25 @@ void EFUSE_ShadowMapUpdate( IN u8 efuseType, IN BOOLEAN bPseudoTest) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); u16 mapLen=0; EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest); - if (pEEPROM->bautoload_fail_flag == _TRUE) + if (pHalData->bautoload_fail_flag == _TRUE) { - _rtw_memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen); + _rtw_memset(pHalData->efuse_eeprom_data, 0xFF, mapLen); } else { #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE - if(_SUCCESS != retriveAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pEEPROM)) { + if(_SUCCESS != retriveAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data)) { #endif - Efuse_ReadAllMap(pAdapter, efuseType, pEEPROM->efuse_eeprom_data, bPseudoTest); + Efuse_ReadAllMap(pAdapter, efuseType, pHalData->efuse_eeprom_data, bPseudoTest); #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE - storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pEEPROM); + storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data); } #endif } @@ -1274,12 +1484,12 @@ Efuse_InitSomeVar( return _TRUE; } -int storeAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv) +int storeAdaptorInfoFile(char *path, u8* efuse_data) { int ret =_SUCCESS; - if(path && eeprom_priv) { - ret = rtw_store_to_file(path, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE_512); + if(path && efuse_data) { + ret = rtw_store_to_file(path, efuse_data, EEPROM_MAX_SIZE_512); if(ret == EEPROM_MAX_SIZE) ret = _SUCCESS; else @@ -1291,15 +1501,15 @@ int storeAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv) return ret; } -int retriveAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv) +int retriveAdaptorInfoFile(char *path, u8* efuse_data) { int ret = _SUCCESS; mm_segment_t oldfs; struct file *fp; - if(path && eeprom_priv) { + if(path && efuse_data) { - ret = rtw_retrive_from_file(path, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE); + ret = rtw_retrive_from_file(path, efuse_data, EEPROM_MAX_SIZE); if(ret == EEPROM_MAX_SIZE) ret = _SUCCESS; @@ -1333,18 +1543,18 @@ void Rtw_Hal_ReadMACAddrFromFile(PADAPTER padapter) u8 source_addr[18]; loff_t pos = 0; u32 curtime = rtw_get_current_time(); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); u8 *head, *end; u8 null_mac_addr[ETH_ALEN] = {0, 0, 0,0, 0, 0}; u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; _rtw_memset(source_addr, 0, 18); - _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN); + _rtw_memset(pHalData->EEPROMMACAddr, 0, ETH_ALEN); fp = filp_open("/data/wifimac.txt", O_RDWR, 0644); if (IS_ERR(fp)) { - pEEPROM->bloadmac_fail_flag = _TRUE; + pHalData->bloadmac_fail_flag = _TRUE; DBG_871X("Error, wifi mac address file doesn't exist.\n"); } else { fs = get_fs(); @@ -1362,34 +1572,34 @@ void Rtw_Hal_ReadMACAddrFromFile(PADAPTER padapter) if (end && (*end == ':') ) *end = '\0'; - pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 ); + pHalData->EEPROMMACAddr[i] = simple_strtoul(head, NULL, 16 ); if (end) { end++; head = end; } - DBG_871X("%02x \n", pEEPROM->mac_addr[i]); + DBG_871X("%02x \n", pHalData->EEPROMMACAddr[i]); } DBG_871X("\n"); set_fs(fs); - pEEPROM->bloadmac_fail_flag = _FALSE; + pHalData->bloadmac_fail_flag = _FALSE; filp_close(fp, NULL); } - if ( (_rtw_memcmp(pEEPROM->mac_addr, null_mac_addr, ETH_ALEN)) || - (_rtw_memcmp(pEEPROM->mac_addr, multi_mac_addr, ETH_ALEN)) ) { - 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) ; + if ( (_rtw_memcmp(pHalData->EEPROMMACAddr, null_mac_addr, ETH_ALEN)) || + (_rtw_memcmp(pHalData->EEPROMMACAddr, multi_mac_addr, ETH_ALEN)) ) { + pHalData->EEPROMMACAddr[0] = 0x00; + pHalData->EEPROMMACAddr[1] = 0xe0; + pHalData->EEPROMMACAddr[2] = 0x4c; + pHalData->EEPROMMACAddr[3] = (u8)(curtime & 0xff) ; + pHalData->EEPROMMACAddr[4] = (u8)((curtime>>8) & 0xff) ; + pHalData->EEPROMMACAddr[5] = (u8)((curtime>>16) & 0xff) ; } DBG_871X("Hal_ReadMACAddrFromFile: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x !!!\n", - pEEPROM->mac_addr[0], pEEPROM->mac_addr[1], - pEEPROM->mac_addr[2], pEEPROM->mac_addr[3], - pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]); + pHalData->EEPROMMACAddr[0], pHalData->EEPROMMACAddr[1], + pHalData->EEPROMMACAddr[2], pHalData->EEPROMMACAddr[3], + pHalData->EEPROMMACAddr[4], pHalData->EEPROMMACAddr[5]); } @@ -1400,15 +1610,15 @@ u32 Rtw_Hal_readPGDataFromConfigFile(PADAPTER padapter) 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; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + u8 *PROMContent = pHalData->efuse_eeprom_data; temp[2] = 0; // add end of string '\0' fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDWR, 0644); if (IS_ERR(fp)) { - pEEPROM->bloadfile_fail_flag = _TRUE; + pHalData->bloadfile_fail_flag = _TRUE; DBG_871X("Error, Efuse configure file doesn't exist.\n"); return _FAIL; } @@ -1428,7 +1638,7 @@ u32 Rtw_Hal_readPGDataFromConfigFile(PADAPTER padapter) filp_close(fp, NULL); - pEEPROM->bloadfile_fail_flag = _FALSE; + pHalData->bloadfile_fail_flag = _FALSE; return _SUCCESS; } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ap.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ap.c index ca634367f4fe..f605febebbd3 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ap.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ap.c @@ -534,8 +534,8 @@ void expire_timeout_chk(_adapter *padapter) //add_ba_hdl(padapter, (u8*)paddbareq_parm); DBG_871X("issue addba_req to check if sta alive, keep_alive_trycnt=%d\n", psta->keep_alive_trycnt); - - issue_action_BA(padapter, psta->hwaddr, RTW_WLAN_ACTION_ADDBA_REQ, (u16)priority); + + issue_addba_req(padapter, psta->hwaddr, (u8)priority); _set_timer(&psta->addba_retry_timer, ADDBA_TO); @@ -1310,6 +1310,7 @@ void start_bss_network(_adapter *padapter, u8 *pbuf) rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, NULL); +#if 0 if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time { //u32 initialgain; @@ -1322,11 +1323,12 @@ void start_bss_network(_adapter *padapter, u8 *pbuf) //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); //turn on all dynamic functions - Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); + /* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE);*/ //rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); } +#endif #ifdef CONFIG_80211N_HT //set channel, bwmode p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); @@ -1380,9 +1382,6 @@ void start_bss_network(_adapter *padapter, u8 *pbuf) } #endif -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_set_ap_channel_bandwidth(padapter, cur_channel, cur_ch_offset, cur_bwmode); -#else //!CONFIG_DUALMAC_CONCURRENT #ifdef CONFIG_CONCURRENT_MODE //TODO: need to judge the phy parameters on concurrent mode for single phy concurrent_set_ap_chbw(padapter, cur_channel, cur_ch_offset, cur_bwmode); @@ -1393,7 +1392,6 @@ void start_bss_network(_adapter *padapter, u8 *pbuf) pmlmeext->cur_bwmode = cur_bwmode; pmlmeext->cur_ch_offset = cur_ch_offset; #endif //!CONFIG_CONCURRENT_MODE -#endif //!CONFIG_DUALMAC_CONCURRENT pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; @@ -1495,7 +1493,7 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) pbss_network->Rssi = 0; - _rtw_memcpy(pbss_network->MacAddress, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pbss_network->MacAddress, adapter_mac_addr(padapter), ETH_ALEN); //beacon interval p = rtw_get_beacon_interval_from_ie(ie);//ie + 8; // 8: TimeStamp, 2: Beacon Interval 2:Capability @@ -1798,8 +1796,13 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) set_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_1R); break; case RF_2T2R: - default: set_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_2R); + break; + case RF_3T3R: + set_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_3R); + break; + default: + DBG_871X("[warning] rf_type %d is not expected\n", rf_type); } for (i = 0; i < 10; i++) *(HT_CAP_ELE_RX_MCS_MAP(pht_cap)+i) &= padapter->mlmeextpriv.default_supported_mcs_set[i]; @@ -3172,7 +3175,7 @@ void rtw_ap_restore_network(_adapter *padapter) if( (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) { - rtw_setstakey_cmd(padapter, psta, _TRUE,_FALSE); + rtw_setstakey_cmd(padapter, psta, UNICAST_KEY,_FALSE); } } } @@ -3185,6 +3188,7 @@ void start_ap_mode(_adapter *padapter) struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); struct sta_priv *pstapriv = &padapter->stapriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; pmlmepriv->update_bcn = _FALSE; @@ -3202,10 +3206,12 @@ void start_ap_mode(_adapter *padapter) #ifdef CONFIG_80211N_HT pmlmepriv->num_sta_no_ht = 0; #endif //CONFIG_80211N_HT + pmlmeinfo->HT_info_enable =0; + pmlmeinfo->HT_caps_enable=0; + pmlmeinfo->HT_enable=0; + pmlmepriv->num_sta_ht_20mhz = 0; - pmlmepriv->olbc = _FALSE; - pmlmepriv->olbc_ht = _FALSE; #ifdef CONFIG_80211N_HT diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_beamforming.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_beamforming.c index 8d8c614e7b82..cfdba228ab9e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_beamforming.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_beamforming.c @@ -92,8 +92,8 @@ struct beamforming_entry *beamforming_add_entry(PADAPTER adapter, u8* ra, u16 ai pEntry->sound_bw = bw; if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { - u16 BSSID = ((adapter->eeprompriv.mac_addr[5] & 0xf0) >> 4) ^ - (adapter->eeprompriv.mac_addr[5] & 0xf); // BSSID[44:47] xor BSSID[40:43] + u16 BSSID = ((*(adapter_mac_addr(adapter) + 5) & 0xf0) >> 4) ^ + (*(adapter_mac_addr(adapter) + 5) & 0xf); /* BSSID[44:47] xor BSSID[40:43] */ pEntry->p_aid = (aid + BSSID * 32) & 0x1ff; // (dec(A) + dec(B)*32) mod 512 } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) @@ -145,7 +145,7 @@ void beamforming_dym_ndpa_rate(PADAPTER adapter) u16 NDPARate = MGN_6M; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter); - if(pHalData->dmpriv.MinUndecoratedPWDBForDM > 30) // link RSSI > 30% + if(pHalData->MinUndecoratedPWDBForDM > 30) // link RSSI > 30% NDPARate = MGN_24M; else NDPARate = MGN_6M; @@ -349,7 +349,7 @@ BOOLEAN issue_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx SetFrameSubType(pframe, WIFI_ACTION_NOACK); _rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(Adapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(Adapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); if( pmlmeext->cur_wireless_mode == WIRELESS_11B) @@ -429,7 +429,7 @@ BOOLEAN issue_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH b SetFrameSubType(pframe, WIFI_NDPA); _rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(Adapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(Adapter), ETH_ALEN); if (IsSupported5G(pmlmeext->cur_wireless_mode) || IsSupportedHT(pmlmeext->cur_wireless_mode)) aSifsTime = 16; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_bt_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_bt_mp.c index 73f2105beced..5a03484f5144 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_bt_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_bt_mp.c @@ -22,13 +22,11 @@ #include #include -#ifdef CONFIG_RTL8723A -#include -#elif defined(CONFIG_RTL8723B) +#if defined(CONFIG_RTL8723B) #include #endif -#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) +#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) void MPh2c_timeout_handle(void *FunctionContext) { PADAPTER pAdapter; @@ -135,9 +133,7 @@ mptbt_SendH2c( pMptCtx->MptH2cRspEvent = _FALSE; pMptCtx->MptBtC2hEvent = _FALSE; -#if defined(CONFIG_RTL8723A) - rtw_hal_fill_h2c_cmd(Adapter, 70, h2cCmdLen, (pu1Byte)pH2c); -#elif defined(CONFIG_RTL8723B) +#if defined(CONFIG_RTL8723B) rtl8723b_set_FwBtMpOper_cmd(Adapter, pH2c->opCode, pH2c->opCodeVer, pH2c->reqNum, pH2c->buf); #endif pMptCtx->h2cReqNum++; @@ -1089,25 +1085,7 @@ mptbt_BtSetGeneral( calVal = pBtReq->pParamStart[1]; break; case BT_GSET_UPDATE_BT_PATCH: - if(IS_HARDWARE_TYPE_8723AE(Adapter) && Adapter->bFWReady) - { - u1Byte i; - DBG_8192C ("[MPT], write regs for load patch\n"); - //BTFwPatch8723A(Adapter); - PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x2d); - rtw_msleep_os(50); - PlatformEFIOWrite4Byte(Adapter, 0x68, 0xa005000c); - rtw_msleep_os(50); - PlatformEFIOWrite4Byte(Adapter, 0x68, 0xb005000c); - rtw_msleep_os(50); - PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x29); - for(i=0; i<12; i++) - rtw_msleep_os(100); -//#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) -// BTFwPatch8723A(Adapter); -//#endif - DBG_8192C("[MPT], load BT FW Patch finished!!!\n"); - } + break; default: { diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_btcoex.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_btcoex.c index 157b8757066a..7930aa10ee8d 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_btcoex.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_btcoex.c @@ -19,8 +19,9 @@ ******************************************************************************/ #ifdef CONFIG_BT_COEXIST -#include +#include #include +#include void rtw_btcoex_Initialize(PADAPTER padapter) @@ -45,16 +46,38 @@ void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly) void rtw_btcoex_IpsNotify(PADAPTER padapter, u8 type) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + hal_btcoex_IpsNotify(padapter, type); } void rtw_btcoex_LpsNotify(PADAPTER padapter, u8 type) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + hal_btcoex_LpsNotify(padapter, type); } void rtw_btcoex_ScanNotify(PADAPTER padapter, u8 type) { + PHAL_DATA_TYPE pHalData; +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + struct bt_coex_info *pcoex_info = &padapter->coex_info; + PBT_MGNT pBtMgnt=&pcoex_info->BtMgnt; +#endif //CONFIG_BT_COEXIST_SOCKET_TRX + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + #ifdef CONFIG_CONCURRENT_MODE if ((_FALSE == type) && (padapter->pbuddy_adapter)) { @@ -64,11 +87,22 @@ void rtw_btcoex_ScanNotify(PADAPTER padapter, u8 type) } #endif +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + if(pBtMgnt->ExtConfig.bEnableWifiScanNotify) + rtw_btcoex_SendScanNotify(padapter, type); +#endif //CONFIG_BT_COEXIST_SOCKET_TRX + hal_btcoex_ScanNotify(padapter, type); } void rtw_btcoex_ConnectNotify(PADAPTER padapter, u8 action) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + #ifdef DBG_CONFIG_ERROR_RESET if (_TRUE == rtw_hal_sreset_inprogress(padapter)) { @@ -92,6 +126,12 @@ void rtw_btcoex_ConnectNotify(PADAPTER padapter, u8 action) void rtw_btcoex_MediaStatusNotify(PADAPTER padapter, u8 mediaStatus) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + #ifdef DBG_CONFIG_ERROR_RESET if (_TRUE == rtw_hal_sreset_inprogress(padapter)) { @@ -121,26 +161,56 @@ void rtw_btcoex_MediaStatusNotify(PADAPTER padapter, u8 mediaStatus) void rtw_btcoex_SpecialPacketNotify(PADAPTER padapter, u8 pktType) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + hal_btcoex_SpecialPacketNotify(padapter, pktType); } void rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + hal_btcoex_IQKNotify(padapter, state); } void rtw_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + hal_btcoex_BtInfoNotify(padapter, length, tmpBuf); } void rtw_btcoex_SuspendNotify(PADAPTER padapter, u8 state) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + hal_btcoex_SuspendNotify(padapter, state); } void rtw_btcoex_HaltNotify(PADAPTER padapter) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + if (_FALSE == padapter->bup) { DBG_871X(FUNC_ADPT_FMT ": bup=%d Skip!\n", @@ -177,14 +247,32 @@ u8 rtw_btcoex_IsBtDisabled(PADAPTER padapter) void rtw_btcoex_Handler(PADAPTER padapter) { + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + #if defined(CONFIG_CONCURRENT_MODE) if (padapter->adapter_type != PRIMARY_ADAPTER) return; #endif + + hal_btcoex_Hanlder(padapter); } +s32 rtw_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter) +{ + s32 coexctrl; + + coexctrl = hal_btcoex_IsBTCoexRejectAMPDU(padapter); + + return coexctrl; +} + s32 rtw_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER padapter) { s32 coexctrl; @@ -300,64 +388,27 @@ u8 rtw_btcoex_IsBtLinkExist(PADAPTER padapter) return hal_btcoex_IsBtLinkExist(padapter); } +void rtw_btcoex_SetBtPatchVersion(PADAPTER padapter,u16 btHciVer, u16 btPatchVer) +{ + hal_btcoex_SetBtPatchVersion(padapter,btHciVer,btPatchVer); +} + +void rtw_btcoex_SetHciVersion(PADAPTER padapter, u16 hciVersion) +{ + hal_btcoex_SetHciVersion(padapter, hciVersion); +} + +void rtw_btcoex_StackUpdateProfileInfo(void) +{ + hal_btcoex_StackUpdateProfileInfo(); +} + // ================================================== // Below Functions are called by BT-Coex // ================================================== -void rtw_btcoex_RejectApAggregatedPacket(PADAPTER padapter, u8 enable) +void rtw_btcoex_rx_ampdu_apply(PADAPTER padapter) { - struct mlme_ext_info *pmlmeinfo; - - pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; - - if (_TRUE == enable) - { - struct sta_info *psta = NULL; - - pmlmeinfo->bAcceptAddbaReq = _FALSE; - - 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 - { - pmlmeinfo->bAcceptAddbaReq = _TRUE; - } + rtw_rx_ampdu_apply(padapter); } void rtw_btcoex_LPS_Enter(PADAPTER padapter) @@ -387,5 +438,1240 @@ void rtw_btcoex_LPS_Leave(PADAPTER padapter) pwrpriv->bpower_saving = _FALSE; } } + + +// ================================================== +// Below Functions are BT-Coex socket related function +// ================================================== + +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX +_adapter *pbtcoexadapter = NULL; +u8 rtw_btcoex_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; +} + +u8 rtw_btcoex_send_event_to_BT(_adapter *padapter, u8 status, u8 event_code, u8 opcode_low, u8 opcode_high,u8 *dbg_msg) +{ + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0,tx_event_length = 0; + rtw_HCI_event *pEvent; + + pEvent = (rtw_HCI_event*)(&localBuf[0]); + + pEvent->EventCode = event_code; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = opcode_low; + pEvent->Data[2] = opcode_high; + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; +#if 0 + rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, dbg_msg); +#endif + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + + return status; +} + +/* +Ref: +Realtek Wi-Fi Driver +Host Controller Interface for +Bluetooth 3.0 + HS V1.4 2013/02/07 + +Window team code & BT team code + */ + + +u8 rtw_btcoex_parse_BT_info_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + #define BT_INFO_LENGTH 8 + + u8 curPollEnable = pcmd[0]; + u8 curPollTime = pcmd[1]; + u8 btInfoReason = pcmd[2]; + u8 btInfoLen = pcmd[3]; + u8 btinfo[BT_INFO_LENGTH]; + + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0,tx_event_length = 0; + RTW_HCI_STATUS status = HCI_STATUS_SUCCESS; + rtw_HCI_event *pEvent; + + DBG_871X("%s\n",__func__); + DBG_871X("current Poll Enable: %d, currrent Poll Time: %d\n",curPollEnable,curPollTime); + DBG_871X("BT Info reason: %d, BT Info length: %d\n",btInfoReason,btInfoLen); + /*DBG_871X("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n" + ,pcmd[4],pcmd[5],pcmd[6],pcmd[7],pcmd[8],pcmd[9],pcmd[10],pcmd[11]);*/ + + _rtw_memset(btinfo, 0, BT_INFO_LENGTH); + +#if 1 + if(BT_INFO_LENGTH != btInfoLen) + { + status = HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE; + DBG_871X("Error BT Info Length: %d\n",btInfoLen); + //return _FAIL; + } + else +#endif + { + if(0x1 == btInfoReason || 0x2 == btInfoReason) + { + _rtw_memcpy(btinfo, &pcmd[4], btInfoLen); + btinfo[0] = btInfoReason; + rtw_btcoex_btinfo_cmd(padapter,btinfo,btInfoLen); + } + else + { + DBG_871X("Other BT info reason\n"); + } + } + + //send complete event to BT + { + + pEvent = (rtw_HCI_event*)(&localBuf[0]); + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_BT_INFO_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_INFO_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; +#if 0 + rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length,"BT_info_event"); +#endif + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } +} + +u8 rtw_btcoex_parse_BT_patch_ver_info_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + u16 btPatchVer=0x0, btHciVer=0x0; + //u16 *pU2tmp; + + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + + btHciVer = pcmd[0] | pcmd[1]<<8; + btPatchVer = pcmd[2] | pcmd[3]<<8; + + + DBG_871X("%s, cmd:%02x %02x %02x %02x\n",__func__, pcmd[0] ,pcmd[1] ,pcmd[2] ,pcmd[3]); + DBG_871X("%s, HCI Ver:%d, Patch Ver:%d\n",__func__, btHciVer,btPatchVer); + + rtw_btcoex_SetBtPatchVersion(padapter,btHciVer,btPatchVer); + + + //send complete event to BT + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_BT_PATCH_VERSION_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_PATCH_VERSION_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; +#if 0 + rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length,"BT_patch_event"); +#endif + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } +} + +u8 rtw_btcoex_parse_HCI_Ver_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + u16 hciver = pcmd[0] | pcmd[1] <<8; + + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + + struct bt_coex_info *pcoex_info = &padapter->coex_info; + PBT_MGNT pBtMgnt=&pcoex_info->BtMgnt; + pBtMgnt->ExtConfig.HCIExtensionVer = hciver; + DBG_871X("%s, HCI Version: %d\n",__func__,pBtMgnt->ExtConfig.HCIExtensionVer); + if(pBtMgnt->ExtConfig.HCIExtensionVer < 4) + { + status = HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE; + DBG_871X("%s, Version = %d, HCI Version < 4\n",__func__,pBtMgnt->ExtConfig.HCIExtensionVer ); + } + else + { + rtw_btcoex_SetHciVersion(padapter,hciver); + } + //send complete event to BT + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_EXTENSION_VERSION_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_EXTENSION_VERSION_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; + + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } + +} + +u8 rtw_btcoex_parse_WIFI_scan_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + + struct bt_coex_info *pcoex_info = &padapter->coex_info; + PBT_MGNT pBtMgnt=&pcoex_info->BtMgnt; + pBtMgnt->ExtConfig.bEnableWifiScanNotify= pcmd[0]; + DBG_871X("%s, bEnableWifiScanNotify: %d\n",__func__,pBtMgnt->ExtConfig.bEnableWifiScanNotify); + + //send complete event to BT + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_ENABLE_WIFI_SCAN_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_ENABLE_WIFI_SCAN_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; + + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } +} + +u8 rtw_btcoex_parse_HCI_link_status_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + struct bt_coex_info *pcoex_info=&padapter->coex_info; + PBT_MGNT pBtMgnt=&pcoex_info->BtMgnt; + //PBT_DBG pBtDbg=&padapter->MgntInfo.BtInfo.BtDbg; + u8 i, numOfHandle=0, numOfAcl=0; + u16 conHandle; + u8 btProfile, btCoreSpec, linkRole; + u8 *pTriple; + + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + + //pBtDbg->dbgHciInfo.hciCmdCntLinkStatusNotify++; + //RT_DISP_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "LinkStatusNotify, Hex Data :\n", + // &pHciCmd->Data[0], pHciCmd->Length); + + DBG_871X("BTLinkStatusNotify\n"); + + // Current only RTL8723 support this command. + //pBtMgnt->bSupportProfile = TRUE; + pBtMgnt->bSupportProfile = _FALSE; + + pBtMgnt->ExtConfig.NumberOfACL = 0; + pBtMgnt->ExtConfig.NumberOfSCO = 0; + + numOfHandle = pcmd[0]; + //RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, ("numOfHandle = 0x%x\n", numOfHandle)); + //RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCIExtensionVer = %d\n", pBtMgnt->ExtConfig.HCIExtensionVer)); + DBG_871X("numOfHandle = 0x%x\n", numOfHandle); + DBG_871X("HCIExtensionVer = %d\n", pBtMgnt->ExtConfig.HCIExtensionVer); + + pTriple = &pcmd[1]; + for(i=0; iExtConfig.HCIExtensionVer < 1) + { + conHandle = *((u8 *)&pTriple[0]); + btProfile = pTriple[2]; + btCoreSpec = pTriple[3]; + if(BT_PROFILE_SCO == btProfile) + { + pBtMgnt->ExtConfig.NumberOfSCO++; + } + else + { + pBtMgnt->ExtConfig.NumberOfACL++; + pBtMgnt->ExtConfig.aclLink[i].ConnectHandle = conHandle; + pBtMgnt->ExtConfig.aclLink[i].BTProfile = btProfile; + pBtMgnt->ExtConfig.aclLink[i].BTCoreSpec = btCoreSpec; + } + //RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, + // ("Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d\n", + // conHandle, btProfile, btCoreSpec)); + DBG_871X("Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d\n", conHandle, btProfile, btCoreSpec); + pTriple += 4; + } + else if(pBtMgnt->ExtConfig.HCIExtensionVer >= 1) + { + conHandle = *((pu2Byte)&pTriple[0]); + btProfile = pTriple[2]; + btCoreSpec = pTriple[3]; + linkRole = pTriple[4]; + if(BT_PROFILE_SCO == btProfile) + { + pBtMgnt->ExtConfig.NumberOfSCO++; + } + else + { + pBtMgnt->ExtConfig.NumberOfACL++; + pBtMgnt->ExtConfig.aclLink[i].ConnectHandle = conHandle; + pBtMgnt->ExtConfig.aclLink[i].BTProfile = btProfile; + pBtMgnt->ExtConfig.aclLink[i].BTCoreSpec = btCoreSpec; + pBtMgnt->ExtConfig.aclLink[i].linkRole = linkRole; + } + //RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, + DBG_871X("Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d, LinkRole=%d\n", + conHandle, btProfile, btCoreSpec, linkRole); + pTriple += 5; + } + } + rtw_btcoex_StackUpdateProfileInfo(); + + //send complete event to BT + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_LINK_STATUS_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_LINK_STATUS_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; + + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } + + +} + +u8 rtw_btcoex_parse_HCI_BT_coex_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_BT_COEX_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_COEX_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; + + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } +} + +u8 rtw_btcoex_parse_HCI_BT_operation_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + + DBG_871X("%s, OP code: %d\n",__func__,pcmd[0]); + + switch(pcmd[0]) + { + case HCI_BT_OP_NONE: + DBG_871X("[bt operation] : Operation None!!\n"); + break; + case HCI_BT_OP_INQUIRY_START: + DBG_871X("[bt operation] : Inquiry start!!\n"); + break; + case HCI_BT_OP_INQUIRY_FINISH: + DBG_871X("[bt operation] : Inquiry finished!!\n"); + break; + case HCI_BT_OP_PAGING_START: + DBG_871X("[bt operation] : Paging is started!!\n"); + break; + case HCI_BT_OP_PAGING_SUCCESS: + DBG_871X("[bt operation] : Paging complete successfully!!\n"); + break; + case HCI_BT_OP_PAGING_UNSUCCESS: + DBG_871X("[bt operation] : Paging complete unsuccessfully!!\n"); + break; + case HCI_BT_OP_PAIRING_START: + DBG_871X("[bt operation] : Pairing start!!\n"); + break; + case HCI_BT_OP_PAIRING_FINISH: + DBG_871X("[bt operation] : Pairing finished!!\n"); + break; + case HCI_BT_OP_BT_DEV_ENABLE: + DBG_871X("[bt operation] : BT Device is enabled!!\n"); + break; + case HCI_BT_OP_BT_DEV_DISABLE: + DBG_871X("[bt operation] : BT Device is disabled!!\n"); + break; + default: + DBG_871X("[bt operation] : Unknown, error!!\n"); + break; + } + + //send complete event to BT + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_BT_OPERATION_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_OPERATION_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; + + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } +} + +u8 rtw_btcoex_parse_BT_AFH_MAP_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_BT_AFH_MAP_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_AFH_MAP_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; + + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } +} + +u8 rtw_btcoex_parse_BT_register_val_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_BT_REGISTER_VALUE_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_REGISTER_VALUE_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; + + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } +} + +u8 rtw_btcoex_parse_HCI_BT_abnormal_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_BT_ABNORMAL_NOTIFY, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_ABNORMAL_NOTIFY, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; + + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } +} + +u8 rtw_btcoex_parse_HCI_query_RF_status_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) +{ + u8 localBuf[6] = ""; + u8 *pRetPar; + u8 len=0, tx_event_length =0; + rtw_HCI_event *pEvent; + RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + + { + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + + pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; + pEvent->Data[0] = 0x1; //packet # + pEvent->Data[1] = HCIOPCODELOW(HCI_QUERY_RF_STATUS, OGF_EXTENSION); + pEvent->Data[2] = HCIOPCODEHIGHT(HCI_QUERY_RF_STATUS, OGF_EXTENSION); + len = len + 3; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + pRetPar[0] = status; //status + + len++; + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; + + status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + return status; + //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); + } +} + +/***************************************** +* HCI cmd format : +*| 15 - 0 | +*| OPcode (OCF|OGF<<10) | +*| 15 - 8 |7 - 0 | +*|Cmd para |Cmd para Length | +*|Cmd para...... | +******************************************/ + +//bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +// | OCF | OGF | +void rtw_btcoex_parse_hci_extend_cmd(_adapter *padapter, u8 *pcmd, u16 len,const u16 hci_OCF) +{ + + DBG_871X("%s: OCF: %x\n",__func__,hci_OCF); + switch(hci_OCF) + { + case HCI_EXTENSION_VERSION_NOTIFY: + DBG_871X("HCI_EXTENSION_VERSION_NOTIFY\n"); + rtw_btcoex_parse_HCI_Ver_notify_cmd(padapter,pcmd, len); + break; + case HCI_LINK_STATUS_NOTIFY: + DBG_871X("HCI_LINK_STATUS_NOTIFY\n"); + rtw_btcoex_parse_HCI_link_status_notify_cmd(padapter,pcmd, len); + break; + case HCI_BT_OPERATION_NOTIFY: + // only for 8723a 2ant + DBG_871X("HCI_BT_OPERATION_NOTIFY\n"); + rtw_btcoex_parse_HCI_BT_operation_notify_cmd(padapter,pcmd, len); + // + break; + case HCI_ENABLE_WIFI_SCAN_NOTIFY: + DBG_871X("HCI_ENABLE_WIFI_SCAN_NOTIFY\n"); + rtw_btcoex_parse_WIFI_scan_notify_cmd(padapter,pcmd, len); + break; + case HCI_QUERY_RF_STATUS: + // only for 8723b 2ant + DBG_871X("HCI_QUERY_RF_STATUS\n"); + rtw_btcoex_parse_HCI_query_RF_status_cmd(padapter,pcmd, len); + break; + case HCI_BT_ABNORMAL_NOTIFY: + DBG_871X("HCI_BT_ABNORMAL_NOTIFY\n"); + rtw_btcoex_parse_HCI_BT_abnormal_notify_cmd(padapter,pcmd, len); + break; + case HCI_BT_INFO_NOTIFY: + DBG_871X("HCI_BT_INFO_NOTIFY\n"); + rtw_btcoex_parse_BT_info_notify_cmd(padapter,pcmd, len); + break; + case HCI_BT_COEX_NOTIFY: + DBG_871X("HCI_BT_COEX_NOTIFY\n"); + rtw_btcoex_parse_HCI_BT_coex_notify_cmd(padapter,pcmd, len); + break; + case HCI_BT_PATCH_VERSION_NOTIFY: + DBG_871X("HCI_BT_PATCH_VERSION_NOTIFY\n"); + rtw_btcoex_parse_BT_patch_ver_info_cmd(padapter,pcmd, len); + break; + case HCI_BT_AFH_MAP_NOTIFY: + DBG_871X("HCI_BT_AFH_MAP_NOTIFY\n"); + rtw_btcoex_parse_BT_AFH_MAP_notify_cmd(padapter,pcmd, len); + break; + case HCI_BT_REGISTER_VALUE_NOTIFY: + DBG_871X("HCI_BT_REGISTER_VALUE_NOTIFY\n"); + rtw_btcoex_parse_BT_register_val_notify_cmd(padapter,pcmd, len); + break; + default: + DBG_871X("ERROR!!! Unknown OCF: %x\n",hci_OCF); + break; + + } +} + +void rtw_btcoex_parse_hci_cmd(_adapter *padapter, u8 *pcmd, u16 len) +{ + u16 opcode = pcmd[0] | pcmd[1]<<8; + u16 hci_OGF = HCI_OGF(opcode); + u16 hci_OCF = HCI_OCF(opcode); + u8 cmdlen = len -3; + u8 pare_len = pcmd[2]; + + DBG_871X("%s\n",__func__); + DBG_871X("OGF: %x,OCF: %x\n",hci_OGF,hci_OCF); + switch(hci_OGF) + { + case OGF_EXTENSION: + DBG_871X("HCI_EXTENSION_CMD_OGF\n"); + rtw_btcoex_parse_hci_extend_cmd(padapter, &pcmd[3], cmdlen, hci_OCF); + break; + default: + DBG_871X("Other OGF: %x\n",hci_OGF); + break; + } +} + +u16 rtw_btcoex_parse_recv_data(u8 *msg, u8 msg_size) +{ + u8 cmp_msg1[32] = attend_ack; + u8 cmp_msg2[32] = leave_ack; + u8 cmp_msg3[32] = bt_leave; + u8 cmp_msg4[32] = invite_req; + u8 cmp_msg5[32] = attend_req; + u8 cmp_msg6[32] = invite_rsp; + u8 res = OTHER; + + if (_rtw_memcmp(cmp_msg1, msg, msg_size) == _TRUE) { + /*DBG_871X("%s, msg:%s\n",__func__,msg);*/ + res = RX_ATTEND_ACK; + } else if (_rtw_memcmp(cmp_msg2, msg, msg_size) == _TRUE) { + /*DBG_871X("%s, msg:%s\n",__func__,msg);*/ + res = RX_LEAVE_ACK; + } else if (_rtw_memcmp(cmp_msg3, msg, msg_size) == _TRUE) { + /*DBG_871X("%s, msg:%s\n",__func__,msg);*/ + res = RX_BT_LEAVE; + } else if (_rtw_memcmp(cmp_msg4, msg, msg_size) == _TRUE) { + /*DBG_871X("%s, msg:%s\n",__func__,msg);*/ + res = RX_INVITE_REQ; + } else if (_rtw_memcmp(cmp_msg5, msg, msg_size) == _TRUE) { + res = RX_ATTEND_REQ; + } else if (_rtw_memcmp(cmp_msg6, msg, msg_size) == _TRUE) { + res = RX_INVITE_RSP; + } else { + DBG_871X("%s, %s\n", __func__, msg); + res = OTHER; + } + + DBG_871X("%s, res:%d\n", __func__, res); + + return res; +} + +void rtw_btcoex_recvmsgbysocket(void *data) +{ + u8 recv_data[255]; + u8 tx_msg[255] = leave_ack; + u32 len = 0; + + u16 recv_length = 0; + u16 parse_res = 0; +#if 0 + u8 para_len = 0, polling_enable = 0, poling_interval = 0, reason = 0, btinfo_len = 0; + u8 btinfo[BT_INFO_LEN] = {0}; +#endif + + struct bt_coex_info *pcoex_info = NULL; + struct sock *sk = NULL; + struct sk_buff *skb = NULL; + + DBG_871X("%s\n",__func__); + + if (pbtcoexadapter == NULL) { + DBG_871X("%s: btcoexadapter NULL!\n", __func__); + return; + } + + pcoex_info = &pbtcoexadapter->coex_info; + sk = pcoex_info->sk_store; + + if (sk == NULL) { + DBG_871X("%s: critical error when receive socket data!\n", __func__); + return; + } + + len = skb_queue_len(&sk->sk_receive_queue); + while (len > 0) { + skb = skb_dequeue(&sk->sk_receive_queue); + + /*important: cut the udp header from skb->data! header length is 8 byte*/ + recv_length = skb->len-8; + _rtw_memset(recv_data, 0, sizeof(recv_data)); + _rtw_memcpy(recv_data, skb->data+8, recv_length); + + parse_res = rtw_btcoex_parse_recv_data(recv_data, recv_length); +/* + if (RX_ATTEND_ACK == parse_res) { + //attend ack + pcoex_info->BT_attend = _TRUE; + DBG_871X("RX_ATTEND_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + } else if (RX_ATTEND_REQ == parse_res) { + //attend req from BT + pcoex_info->BT_attend = _TRUE; + DBG_871X("RX_BT_ATTEND_REQ!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + rtw_btcoex_sendmsgbysocket(pbtcoexadapter, attend_ack, sizeof(attend_ack), _FALSE); + } else if (RX_INVITE_REQ == parse_res) { + //invite req from BT + pcoex_info->BT_attend = _TRUE; + DBG_871X("RX_INVITE_REQ!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + rtw_btcoex_sendmsgbysocket(pbtcoexadapter, invite_rsp, sizeof(invite_rsp), _FALSE); + } else if (RX_INVITE_RSP == parse_res) { + //invite rsp + pcoex_info->BT_attend = _TRUE; + DBG_871X("RX_INVITE_RSP!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + } else if (RX_LEAVE_ACK == parse_res) { + //mean BT know wifi will leave + pcoex_info->BT_attend = _FALSE; + DBG_871X("RX_LEAVE_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + } else if (RX_BT_LEAVE == parse_res) { + //BT leave + rtw_btcoex_sendmsgbysocket(pbtcoexadapter, leave_ack, sizeof(leave_ack), _FALSE); // no ack + pcoex_info->BT_attend = _FALSE; + DBG_871X("RX_BT_LEAVE!sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + } else { + //todo: check if recv data are really hci cmds + if (_TRUE == pcoex_info->BT_attend) + rtw_btcoex_parse_hci_cmd(pbtcoexadapter, recv_data, recv_length); + } +*/ + switch (parse_res) { + case RX_ATTEND_ACK: + /* attend ack */ + pcoex_info->BT_attend = _TRUE; + DBG_871X("RX_ATTEND_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + break; + + case RX_ATTEND_REQ: + pcoex_info->BT_attend = _TRUE; + DBG_871X("RX_BT_ATTEND_REQ!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + rtw_btcoex_sendmsgbysocket(pbtcoexadapter, attend_ack, sizeof(attend_ack), _FALSE); + break; + + case RX_INVITE_REQ: + /* invite req from BT */ + pcoex_info->BT_attend = _TRUE; + DBG_871X("RX_INVITE_REQ!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + rtw_btcoex_sendmsgbysocket(pbtcoexadapter, invite_rsp, sizeof(invite_rsp), _FALSE); + break; + + case RX_INVITE_RSP: + /*invite rsp*/ + pcoex_info->BT_attend = _TRUE; + DBG_871X("RX_INVITE_RSP!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + break; + + case RX_LEAVE_ACK: + /* mean BT know wifi will leave */ + pcoex_info->BT_attend = _FALSE; + DBG_871X("RX_LEAVE_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + break; + + case RX_BT_LEAVE: + /* BT leave */ + rtw_btcoex_sendmsgbysocket(pbtcoexadapter, leave_ack, sizeof(leave_ack), _FALSE); /* no ack */ + pcoex_info->BT_attend = _FALSE; + DBG_871X("RX_BT_LEAVE!sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + break; + + default: + if (_TRUE == pcoex_info->BT_attend) + rtw_btcoex_parse_hci_cmd(pbtcoexadapter, recv_data, recv_length); + else + DBG_871X("ERROR!! BT is UP\n"); + break; + + } + + len--; + kfree_skb(skb); + } +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)) +void rtw_btcoex_recvmsg_init(struct sock *sk_in, s32 bytes) +#else +void rtw_btcoex_recvmsg_init(struct sock *sk_in) +#endif +{ + struct bt_coex_info *pcoex_info = NULL; + + if (pbtcoexadapter == NULL) { + DBG_871X("%s: btcoexadapter NULL\n", __func__); + return; + } + pcoex_info = &pbtcoexadapter->coex_info; + pcoex_info->sk_store = sk_in; + if (pcoex_info->btcoex_wq != NULL) + queue_delayed_work(pcoex_info->btcoex_wq, &pcoex_info->recvmsg_work, 0); + else + DBG_871X("%s: BTCOEX workqueue NULL\n", __func__); +} + +u8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool force) +{ + u8 error; + struct msghdr udpmsg; + mm_segment_t oldfs; + struct iovec iov; + struct bt_coex_info *pcoex_info = &padapter->coex_info; + + DBG_871X("%s: msg:%s, force:%s\n", __func__, msg, force == _TRUE?"TRUE":"FALSE"); + if (_FALSE == force) { + if (_FALSE == pcoex_info->BT_attend) { + DBG_871X("TX Blocked: WiFi-BT disconnected\n"); + return _FAIL; + } + } + + iov.iov_base = (void *)msg; + iov.iov_len = msg_size; + udpmsg.msg_name = &pcoex_info->bt_sockaddr; + udpmsg.msg_namelen = sizeof(struct sockaddr_in); + udpmsg.msg_iov = &iov; + udpmsg.msg_iovlen = 1; + udpmsg.msg_control = NULL; + udpmsg.msg_controllen = 0; + udpmsg.msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL; + oldfs = get_fs(); + set_fs(KERNEL_DS); + error = sock_sendmsg(pcoex_info->udpsock, &udpmsg, msg_size); + set_fs(oldfs); + if (error < 0) { + DBG_871X("Error when sendimg msg, error:%d\n", error); + return _FAIL; + } else + return _SUCCESS; +} + +u8 rtw_btcoex_create_kernel_socket(_adapter *padapter) +{ + s8 kernel_socket_err; + u8 tx_msg[255] = attend_req; + struct bt_coex_info *pcoex_info = &padapter->coex_info; + s32 sock_reuse = 1; + u8 status = _FAIL; + + DBG_871X("%s CONNECT_PORT %d\n", __func__, CONNECT_PORT); + + if (NULL == pcoex_info) { + DBG_871X("coex_info: NULL\n"); + status = _FAIL; + } + + kernel_socket_err = sock_create(PF_INET, SOCK_DGRAM, 0, &pcoex_info->udpsock); + + if (kernel_socket_err < 0) { + DBG_871X("Error during creation of socket error:%d\n", kernel_socket_err); + status = _FAIL; + } else { + _rtw_memset(&(pcoex_info->wifi_sockaddr), 0, sizeof(pcoex_info->wifi_sockaddr)); + pcoex_info->wifi_sockaddr.sin_family = AF_INET; + pcoex_info->wifi_sockaddr.sin_port = htons(CONNECT_PORT); + pcoex_info->wifi_sockaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + _rtw_memset(&(pcoex_info->bt_sockaddr), 0, sizeof(pcoex_info->bt_sockaddr)); + pcoex_info->bt_sockaddr.sin_family = AF_INET; + pcoex_info->bt_sockaddr.sin_port = htons(CONNECT_PORT_BT); + pcoex_info->bt_sockaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + pcoex_info->sk_store = NULL; + kernel_socket_err = pcoex_info->udpsock->ops->bind(pcoex_info->udpsock, (struct sockaddr *)&pcoex_info->wifi_sockaddr, + sizeof(pcoex_info->wifi_sockaddr)); + if (kernel_socket_err == 0) { + DBG_871X("binding socket success\n"); + pcoex_info->udpsock->sk->sk_data_ready = rtw_btcoex_recvmsg_init; + pcoex_info->sock_open |= KERNEL_SOCKET_OK; + pcoex_info->BT_attend = _FALSE; + DBG_871X("WIFI sending attend_req\n"); + rtw_btcoex_sendmsgbysocket(padapter, attend_req, sizeof(attend_req), _TRUE); + status = _SUCCESS; + } else { + pcoex_info->BT_attend = _FALSE; + sock_release(pcoex_info->udpsock); /* bind fail release socket */ + DBG_871X("Error binding socket: %d\n", kernel_socket_err); + status = _FAIL; + } + + } + + return status; +} + +void rtw_btcoex_close_kernel_socket(_adapter *padapter) +{ + struct bt_coex_info *pcoex_info = &padapter->coex_info; + if (pcoex_info->sock_open & KERNEL_SOCKET_OK) { + DBG_871X("release kernel socket\n"); + sock_release(pcoex_info->udpsock); + pcoex_info->sock_open &= ~(KERNEL_SOCKET_OK); + if (_TRUE == pcoex_info->BT_attend) + pcoex_info->BT_attend = _FALSE; + + DBG_871X("sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + } +} + +void rtw_btcoex_init_socket(_adapter *padapter) +{ + + u8 is_invite = _FALSE; + struct bt_coex_info *pcoex_info = &padapter->coex_info; + DBG_871X("%s\n", __func__); + if (_FALSE == pcoex_info->is_exist) { + _rtw_memset(pcoex_info,0,sizeof(struct bt_coex_info)); + pcoex_info->btcoex_wq = create_workqueue("BTCOEX"); + INIT_DELAYED_WORK(&pcoex_info->recvmsg_work, + (void *)rtw_btcoex_recvmsgbysocket); + pbtcoexadapter = padapter; + if (rtw_btcoex_create_kernel_socket(padapter) == _SUCCESS) { + pcoex_info->is_exist = _TRUE; + } else { + pcoex_info->is_exist = _FALSE; + pbtcoexadapter = NULL; + } + + DBG_871X("%s: pbtcoexadapter:%p, coex_info->is_exist: %s\n" + , __func__, pbtcoexadapter, pcoex_info->is_exist == _TRUE?"TRUE":"FALSE"); + } +} + +void rtw_btcoex_close_socket(_adapter *padapter) +{ + struct bt_coex_info *pcoex_info = &padapter->coex_info; + + DBG_871X("%s--coex_info->is_exist: %s, pcoex_info->BT_attend:%s\n" + , __func__, pcoex_info->is_exist == _TRUE?"TRUE":"FALSE", pcoex_info->BT_attend == _TRUE?"TRUE":"FALSE"); + + if (_TRUE == pcoex_info->is_exist) { + if (_TRUE == pcoex_info->BT_attend) { + /*inform BT wifi leave*/ + rtw_btcoex_sendmsgbysocket(padapter, wifi_leave, sizeof(wifi_leave), _FALSE); + msleep(50); + } + rtw_btcoex_close_kernel_socket(padapter); + pbtcoexadapter = NULL; + pcoex_info->is_exist = _FALSE; + } + if (pcoex_info->btcoex_wq != NULL) { + flush_workqueue(pcoex_info->btcoex_wq); + destroy_workqueue(pcoex_info->btcoex_wq); + } +} + +void rtw_btcoex_dump_tx_msg(u8 *tx_msg, u8 len, u8 *msg_name) +{ + u8 i = 0; + DBG_871X("======> Msg name: %s\n", msg_name); + for(i=0;iEventCode = HCI_EVENT_EXTENSION_RTK; + pEvent->Data[0] = HCI_EVENT_EXT_BT_COEX_CONTROL; //extension event code + len ++; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + _rtw_memcpy(&pRetPar[0], pData, dataLen); + + len += dataLen; + + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; +#if 0 + rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, "BT COEX CONTROL", _FALSE); +#endif + rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + +} + +/* Porting from Windows team */ +void rtw_btcoex_SendEventExtBtInfoControl(PADAPTER padapter, u8 dataLen, void *pData) +{ + rtw_HCI_event *pEvent; + u8 *pRetPar; + u8 len=0, tx_event_length = 0; + u8 localBuf[32] = ""; + + struct bt_coex_info *pcoex_info = &padapter->coex_info; + PBT_MGNT pBtMgnt = &pcoex_info->BtMgnt; + + DBG_871X("%s\n",__func__); + if(pBtMgnt->ExtConfig.HCIExtensionVer < 4) //not support + { + DBG_871X("ERROR: HCIExtensionVer = %d, HCIExtensionVer<4 !!!!\n",pBtMgnt->ExtConfig.HCIExtensionVer); + return; + } + + pEvent = (rtw_HCI_event *)(&localBuf[0]); + + //len += bthci_ExtensionEventHeaderRtk(&localBuf[0], + // HCI_EVENT_EXT_BT_INFO_CONTROL); + pEvent->EventCode = HCI_EVENT_EXTENSION_RTK; + pEvent->Data[0] = HCI_EVENT_EXT_BT_INFO_CONTROL; //extension event code + len ++; + + // Return parameters starts from here + pRetPar = &pEvent->Data[len]; + _rtw_memcpy(&pRetPar[0], pData, dataLen); + + len += dataLen; + + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; +#if 0 + rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, "BT INFO CONTROL"); +#endif + rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); + +} + +void rtw_btcoex_SendScanNotify(PADAPTER padapter, u8 scanType) +{ + u8 len=0, tx_event_length=0; + u8 localBuf[7] = ""; + u8 *pRetPar; + u8 *pu1Temp; + rtw_HCI_event *pEvent; + struct bt_coex_info *pcoex_info = &padapter->coex_info; + PBT_MGNT pBtMgnt = &pcoex_info->BtMgnt; + +// if(!pBtMgnt->BtOperationOn) +// return; + + pEvent = (rtw_HCI_event *)(&localBuf[0]); + +// len += bthci_ExtensionEventHeaderRtk(&localBuf[0], +// HCI_EVENT_EXT_WIFI_SCAN_NOTIFY); + + pEvent->EventCode = HCI_EVENT_EXTENSION_RTK; + pEvent->Data[0] = HCI_EVENT_EXT_WIFI_SCAN_NOTIFY; //extension event code + len ++; + + // Return parameters starts from here + //pRetPar = &PPacketIrpEvent->Data[len]; + //pu1Temp = (u8 *)&pRetPar[0]; + //*pu1Temp = scanType; + pEvent->Data[len] = scanType; + len += 1; + + pEvent->Length = len; + + //total tx event length + EventCode length + sizeof(length) + tx_event_length = pEvent->Length + 2; +#if 0 + rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, "WIFI SCAN OPERATION"); +#endif + rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); +} +#endif //CONFIG_BT_COEXIST_SOCKET_TRX #endif // CONFIG_BT_COEXIST diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_cmd.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_cmd.c index 6ed8f22b4947..e6309a874ea0 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_cmd.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_cmd.c @@ -20,7 +20,6 @@ #define _RTW_CMD_C_ #include - /* Caller and the rtw_cmd_thread can protect cmd_q by spin_lock. No irqsave is necessary. @@ -651,8 +650,8 @@ post_process: _enter_critical_mutex(&(pcmd->padapter->cmdpriv.sctx_mutex), NULL); if (pcmd->sctx) { if (0) - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" pcmd->sctx\n", - FUNC_ADPT_ARG(pcmd->padapter)); + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" pcmd->sctx\n", + FUNC_ADPT_ARG(pcmd->padapter)); if (pcmd->res == H2C_SUCCESS) rtw_sctx_done(&pcmd->sctx); else @@ -912,8 +911,8 @@ _func_enter_; _rtw_memcpy(&psurveyPara->ssid[i], &ssid[i], sizeof(NDIS_802_11_SSID)); psurveyPara->ssid_num++; if (0) - DBG_871X(FUNC_ADPT_FMT" ssid:(%s, %d)\n", FUNC_ADPT_ARG(padapter), - psurveyPara->ssid[i].Ssid, psurveyPara->ssid[i].SsidLength); + DBG_871X(FUNC_ADPT_FMT" ssid:(%s, %d)\n", FUNC_ADPT_ARG(padapter), + psurveyPara->ssid[i].Ssid, psurveyPara->ssid[i].SsidLength); } } } @@ -926,8 +925,8 @@ _func_enter_; _rtw_memcpy(&psurveyPara->ch[i], &ch[i], sizeof(struct rtw_ieee80211_channel)); psurveyPara->ch_num++; if (0) - DBG_871X(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter), - psurveyPara->ch[i].hw_value); + DBG_871X(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter), + psurveyPara->ch[i].hw_value); } } } @@ -942,11 +941,16 @@ _func_enter_; #ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE if((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE) - _set_timer(&pmlmepriv->scan_to_timer, SURVEY_TO * - ( padapter->mlmeextpriv.max_chan_nums + ( padapter->mlmeextpriv.max_chan_nums / RTW_SCAN_NUM_OF_CH ) * RTW_STAY_AP_CH_MILLISECOND ) + 1000 ); + { + if(IsSupported5G(padapter->registrypriv.wireless_mode) + && IsSupported24G(padapter->registrypriv.wireless_mode)) //dual band + mlme_set_scan_to_timer(pmlmepriv, CONC_SCANNING_TIMEOUT_DUAL_BAND); + else //single band + mlme_set_scan_to_timer(pmlmepriv, CONC_SCANNING_TIMEOUT_SINGLE_BAND); + } else #endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE - _set_timer(&pmlmepriv->scan_to_timer, SCANNING_TIMEOUT); + mlme_set_scan_to_timer(pmlmepriv, SCANNING_TIMEOUT); rtw_led_control(padapter, LED_CTL_SITE_SURVEY); } else { @@ -1437,6 +1441,7 @@ _func_enter_; case Ndis802_11APMode: case Ndis802_11AutoUnknown: case Ndis802_11InfrastructureMax: + case Ndis802_11Monitor: break; } @@ -1667,7 +1672,7 @@ _func_exit_; return res; } -u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 unicast_key, bool enqueue) +u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 key_type, bool enqueue) { struct cmd_obj* ph2c; struct set_stakey_parm *psetstakey_para; @@ -1689,27 +1694,23 @@ _func_enter_; _rtw_memcpy(psetstakey_para->addr, sta->hwaddr,ETH_ALEN); if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)){ -#ifdef CONFIG_TDLS - if(sta->tdls_sta_state&TDLS_LINKED_STATE) - psetstakey_para->algorithm=(u8)sta->dot118021XPrivacy; - else -#endif //CONFIG_TDLS psetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm; }else{ GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE); } - if (unicast_key == _TRUE) { + if (key_type == GROUP_KEY) { + _rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16); + } + else if (key_type == UNICAST_KEY) { + _rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16); + } #ifdef CONFIG_TDLS - if((sta->tdls_sta_state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) + else if(key_type == TDLS_KEY){ _rtw_memcpy(&psetstakey_para->key, sta->tpk.tk, 16); - else -#endif //CONFIG_TDLS - _rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16); - } - else { - _rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16); + psetstakey_para->algorithm=(u8)sta->dot118021XPrivacy; } +#endif /* CONFIG_TDLS */ //jeff: set this becasue at least sw key is ready padapter->securitypriv.busetkipkey=_TRUE; @@ -2318,7 +2319,8 @@ _func_enter_; } _rtw_spinlock(&(padapter->tdlsinfo.cmd_lock)); - _rtw_memcpy(TDLSoption->addr, addr, 6); + if (addr != NULL) + _rtw_memcpy(TDLSoption->addr, addr, 6); TDLSoption->option = option; _rtw_spinunlock(&(padapter->tdlsinfo.cmd_lock)); init_h2fwcmd_w_parm_no_rsp(pcmdobj, TDLSoption, GEN_CMD_CODE(_TDLS)); @@ -2458,8 +2460,8 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) #ifdef CONFIG_TDLS #ifdef CONFIG_TDLS_AUTOSETUP - if( ( ptdlsinfo->watchdog_count % TDLS_WATCHDOG_PERIOD ) == 0 ) //10 * 2sec, periodically sending - { + /* TDLS_WATCHDOG_PERIOD * 2sec, periodically send */ + if ((ptdlsinfo->watchdog_count % TDLS_WATCHDOG_PERIOD ) == 0) { _rtw_memcpy(txmgmt.peer, baddr, ETH_ALEN); issue_tdls_dis_req( padapter, &txmgmt ); } @@ -2477,7 +2479,10 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) #endif //CONFIG_LPS_SLOW_TRANSITION ) { - //DBG_871X("(-)Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); +#ifdef DBG_RX_COUNTER_DUMP + if( padapter->dump_rx_cnt_mode & DUMP_DRV_TRX_COUNTER_DATA) + DBG_871X("(-)Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); +#endif bEnterPS= _FALSE; #ifdef CONFIG_LPS_SLOW_TRANSITION if(bBusyTraffic == _TRUE) @@ -2499,7 +2504,10 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) } else { - //DBG_871X("(+)Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); +#ifdef DBG_RX_COUNTER_DUMP + if( padapter->dump_rx_cnt_mode & DUMP_DRV_TRX_COUNTER_DATA) + DBG_871X("(+)Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); +#endif #ifdef CONFIG_LPS_SLOW_TRANSITION if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount>=2) pmlmepriv->LinkDetectInfo.TrafficTransitionCount -=2; @@ -2627,8 +2635,11 @@ void dynamic_chk_wk_hdl(_adapter *padapter) //if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE) { - linked_status_chk(padapter, 0); + linked_status_chk(padapter, 0); traffic_status_watchdog(padapter, 0); + #ifdef DBG_RX_COUNTER_DUMP + rtw_dump_rx_counters(padapter); + #endif dm_DynamicUsbTxAgg(padapter, 0); } @@ -3282,35 +3293,39 @@ void btinfo_evt_dump(void *sel, void *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":"" - ); + 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); + 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); + 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 ":"" - ); + 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 +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + struct btinfo_8761ATV *info = (struct btinfo_8761ATV *)buf; +#else //!CONFIG_BT_COEXIST_SOCKET_TRX struct btinfo *info = (struct btinfo *)buf; +#endif //CONFIG_BT_COEXIST_SOCKET_TRX u8 cmd_idx; u8 len; @@ -3325,14 +3340,23 @@ static void rtw_btinfo_hdl(_adapter *adapter, u8 *buf, u16 buf_len) //#define DBG_PROC_SET_BTINFO_EVT #ifdef DBG_PROC_SET_BTINFO_EVT +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + DBG_871X("%s: btinfo[0]=%x,btinfo[1]=%x,btinfo[2]=%x,btinfo[3]=%x btinfo[4]=%x,btinfo[5]=%x,btinfo[6]=%x,btinfo[7]=%x\n" + , __func__, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +#else//!CONFIG_BT_COEXIST_SOCKET_TRX btinfo_evt_dump(RTW_DBGDUMP, info); -#endif +#endif //CONFIG_BT_COEXIST_SOCKET_TRX +#endif // DBG_PROC_SET_BTINFO_EVT /* 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; +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + else if(0x01 == cmd_idx || 0x02 == cmd_idx) + buf[1] = buf[0]; +#endif //CONFIG_BT_COEXIST_SOCKET_TRX rtw_btcoex_BtInfoNotify(adapter ,len+1, &buf[1]); } @@ -3379,7 +3403,7 @@ u8 rtw_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len) exit: return res; } -#endif +#endif //CONFIG_BT_COEXIST //#ifdef CONFIG_C2H_PACKET_EN u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length) @@ -3536,6 +3560,9 @@ static void c2h_wk_callback(_workitem *work) rtw_mfree(c2h_evt, 16); continue; } + } else { + rtw_warn_on(1); + continue; } /* Special pointer to trigger c2h_evt_clear only */ @@ -3676,10 +3703,10 @@ _func_enter_; { //TODO: cancel timer and do timeout handler directly... //need to make timeout handlerOS independent - _set_timer(&pmlmepriv->scan_to_timer, 1); + mlme_set_scan_to_timer(pmlmepriv, 1); } else if (pcmd->res != H2C_SUCCESS) { - _set_timer(&pmlmepriv->scan_to_timer, 1); + mlme_set_scan_to_timer(pmlmepriv, 1); RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: MgntActrtw_set_802_11_bssid_LIST_SCAN Fail ************\n\n.")); } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_debug.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_debug.c index 72cad7378d2c..ab58df17deb9 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_debug.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_debug.c @@ -60,6 +60,10 @@ u32 GlobalDebugLevel = _drv_err_; #include +#ifdef CONFIG_TDLS +#define TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE 41 +#endif + void dump_drv_version(void *sel) { DBG_871X_SEL_NL(sel, "%s %s\n", DRV_NAME, DRIVERVERSION); @@ -105,6 +109,19 @@ void mac_reg_dump(void *sel, _adapter *adapter) if((j++)%4 == 0) DBG_871X_SEL(sel, "\n"); } + +#ifdef CONFIG_RTL8814A + { + for(i=0x1000;i<0x1650;i+=4) + { + if(j%4==1) + DBG_871X_SEL_NL(sel, "0x%03x",i); + DBG_871X_SEL(sel, " 0x%08x ", rtw_read32(adapter,i)); + if((j++)%4 == 0) + DBG_871X_SEL(sel, "\n"); + } + } +#endif /* CONFIG_RTL8814A */ } void bb_reg_dump(void *sel, _adapter *adapter) @@ -154,7 +171,7 @@ 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() +bool rtw_fwdl_test_trigger_chksum_fail(void) { if (fwdl_test_chksum_fail) { DBG_871X_LEVEL(_drv_always_, "fwdl test case: trigger chksum_fail\n"); @@ -164,7 +181,7 @@ bool rtw_fwdl_test_trigger_chksum_fail() return _FALSE; } -bool rtw_fwdl_test_trigger_wintint_rdy_fail() +bool rtw_fwdl_test_trigger_wintint_rdy_fail(void) { if (fwdl_test_wintint_rdy_fail) { DBG_871X_LEVEL(_drv_always_, "fwdl test case: trigger wintint_rdy_fail\n"); @@ -176,11 +193,23 @@ bool rtw_fwdl_test_trigger_wintint_rdy_fail() static u32 g_wait_hiq_empty_ms = 0; -u32 rtw_get_wait_hiq_empty_ms() +u32 rtw_get_wait_hiq_empty_ms(void) { return g_wait_hiq_empty_ms; } +static u8 del_rx_ampdu_test_no_tx_fail = 0; + +bool rtw_del_rx_ampdu_test_trigger_no_tx_fail(void) +{ + if (del_rx_ampdu_test_no_tx_fail) { + DBG_871X_LEVEL(_drv_always_, "del_rx_ampdu test case: trigger no_tx_fail\n"); + del_rx_ampdu_test_no_tx_fail--; + return _TRUE; + } + return _FALSE; +} + void rtw_sink_rtp_seq_dbg( _adapter *adapter,_pkt *pkt) { struct recv_priv *precvpriv = &(adapter->recvpriv); @@ -196,6 +225,21 @@ void rtw_sink_rtp_seq_dbg( _adapter *adapter,_pkt *pkt) } } +void sta_rx_reorder_ctl_dump(void *sel, struct sta_info *sta) +{ + struct recv_reorder_ctrl *reorder_ctl; + int i; + + for (i = 0; i < 16; i++) { + reorder_ctl = &sta->recvreorder_ctrl[i]; + if (reorder_ctl->ampdu_size != RX_AMPDU_SIZE_INVALID || reorder_ctl->indicate_seq != 0xFFFF) { + DBG_871X_SEL_NL(sel, "tid=%d, enable=%d, ampdu_size=%u, indicate_seq=%u\n" + , i, reorder_ctl->enable, reorder_ctl->ampdu_size, reorder_ctl->indicate_seq + ); + } + } +} + #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) { @@ -593,16 +637,8 @@ int proc_get_ap_info(struct seq_file *m, void *v) DBG_871X_SEL_NL(m, "vht_ldpc_cap=0x%x, vht_stbc_cap=0x%x, vht_beamform_cap=0x%x\n", psta->vhtpriv.ldpc_cap, psta->vhtpriv.stbc_cap, psta->vhtpriv.beamform_cap); DBG_871X_SEL_NL(m, "vht_mcs_map=0x%x, vht_highest_rate=0x%x, vht_ampdu_len=%d\n", *(u16*)psta->vhtpriv.vht_mcs_map, psta->vhtpriv.vht_highest_rate, psta->vhtpriv.ampdu_len); #endif - - for(i=0;i<16;i++) - { - preorder_ctrl = &psta->recvreorder_ctrl[i]; - if(preorder_ctrl->enable) - { - DBG_871X_SEL_NL(m, "tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq); - } - } - + + sta_rx_reorder_ctl_dump(m, psta); } else { @@ -628,6 +664,27 @@ int proc_get_adapter_state(struct seq_file *m, void *v) return 0; } + +ssize_t proc_reset_trx_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; + pdbgpriv->dbg_rx_conflic_mac_addr_cnt = 0; + } + } + + return count; +} int proc_get_trx_info(struct seq_file *m, void *v) { @@ -636,6 +693,8 @@ int proc_get_trx_info(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct recv_priv *precvpriv = &padapter->recvpriv; + struct dvobj_priv *psdpriv = padapter->dvobj; + struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; struct hw_xmit *phwxmit; dump_os_queue(m, padapter); @@ -657,6 +716,17 @@ int proc_get_trx_info(struct seq_file *m, void *v) DBG_871X_SEL_NL(m, "rx_urb_pending_cn=%d\n", ATOMIC_READ(&(precvpriv->rx_pending_cnt))); #endif + //Folowing are RX info + //Counts of packets whose seq_num is less than preorder_ctrl->indicate_seq, Ex delay, retransmission, redundant packets and so on + DBG_871X_SEL_NL(m,"Rx: Counts of Packets Whose Seq_Num Less Than Reorder Control Seq_Num: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_drop_count); + //How many times the Rx Reorder Timer is triggered. + DBG_871X_SEL_NL(m,"Rx: Reorder Time-out Trigger Counts: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_forced_indicate_count); + //Total counts of packets loss + DBG_871X_SEL_NL(m,"Rx: Packet Loss Counts: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_loss_count); + DBG_871X_SEL_NL(m,"Rx: Duplicate Management Frame Drop Count: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_dup_mgt_frame_drop_count); + DBG_871X_SEL_NL(m,"Rx: AMPDU BA window shift Count: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_window_shift_cnt); + /*The same mac addr counts*/ + DBG_871X_SEL_NL(m, "Rx: Conflict MAC Address Frames Count: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_conflic_mac_addr_cnt); return 0; } @@ -704,7 +774,7 @@ int proc_get_rate_ctl(struct seq_file *m, void *v) 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_rate>DESC_RATE54M?(sgi?" SGI":" LGI"):"" , data_fb?" FB":"" ); DBG_871X_SEL_NL(m, "0x%02x %u\n", adapter->fix_rate, adapter->data_fb); @@ -738,7 +808,43 @@ ssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t c return count; } +#ifdef DBG_RX_COUNTER_DUMP +int proc_get_rx_cnt_dump(struct seq_file *m, void *v) +{ + struct net_device *dev = m->private; + int i; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + + DBG_871X_SEL_NL(m, "BIT0- Dump RX counters of DRV \n"); + DBG_871X_SEL_NL(m, "BIT1- Dump RX counters of MAC \n"); + DBG_871X_SEL_NL(m, "BIT2- Dump RX counters of PHY \n"); + DBG_871X_SEL_NL(m, "BIT3- Dump TRX data frame of DRV \n"); + DBG_871X_SEL_NL(m, "dump_rx_cnt_mode = 0x%02x \n", adapter->dump_rx_cnt_mode); + + return 0; +} +ssize_t proc_set_rx_cnt_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) +{ + struct net_device *dev = data; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[32]; + u8 dump_rx_cnt_mode; + + if (count < 1) + return -EFAULT; + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%hhx", &dump_rx_cnt_mode); + + rtw_dump_phy_rxcnts_preprocess(adapter,dump_rx_cnt_mode); + adapter->dump_rx_cnt_mode = dump_rx_cnt_mode; + + } + + return count; +} +#endif 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; @@ -755,6 +861,22 @@ ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, si return count; } +ssize_t proc_set_del_rx_ampdu_test_case(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]; + int num; + + if (count < 1) + return -EFAULT; + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) + num = sscanf(tmp, "%hhu", &del_rx_ampdu_test_no_tx_fail); + + return count; +} + 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; @@ -1096,9 +1218,11 @@ int proc_get_rx_signal(struct seq_file *m, void *v) //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); + + rtw_get_noise(padapter); 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_odm_get_perpkt_rssi(m,padapter); rtw_get_raw_rssi_info(m,padapter); #endif return 0; @@ -1261,14 +1385,24 @@ int proc_get_rx_ampdu(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; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - if(pregpriv) - DBG_871X_SEL_NL(m, - "bAcceptAddbaReq = %d , 0:Reject AP's Add BA req, 1:Accept AP's Add BA req.\n", pmlmeinfo->bAcceptAddbaReq - ); + DBG_871X_SEL(m, "accept: "); + if (padapter->fix_rx_ampdu_accept == RX_AMPDU_ACCEPT_INVALID) + DBG_871X_SEL_NL(m, "%u%s\n", rtw_rx_ampdu_is_accept(padapter), "(auto)"); + else + DBG_871X_SEL_NL(m, "%u%s\n", padapter->fix_rx_ampdu_accept, "(fixed)"); + + DBG_871X_SEL(m, "size: "); + if (padapter->fix_rx_ampdu_size == RX_AMPDU_SIZE_INVALID) + DBG_871X_SEL_NL(m, "%u%s\n", rtw_rx_ampdu_size(padapter), "(auto)"); + else + DBG_871X_SEL_NL(m, "%u%s\n", padapter->fix_rx_ampdu_size, "(fixed)"); + + DBG_871X_SEL_NL(m, "%19s %17s\n", "fix_rx_ampdu_accept", "fix_rx_ampdu_size"); + + DBG_871X_SEL(m, "%-19d %-17u\n" + , padapter->fix_rx_ampdu_accept + , padapter->fix_rx_ampdu_size); return 0; } @@ -1281,28 +1415,25 @@ ssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t c struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); char tmp[32]; - u32 mode; + u8 accept; + u8 size; if (count < 1) return -EFAULT; - if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { - int num = sscanf(tmp, "%d ", &mode); + int num = sscanf(tmp, "%hhu %hhu", &accept, &size); - if( pregpriv && mode < 2 ) - { - pmlmeinfo->bAcceptAddbaReq = mode; - DBG_871X("pmlmeinfo->bAcceptAddbaReq=%d \n",pmlmeinfo->bAcceptAddbaReq); - if(mode == 0) - { - //tear down Rx AMPDU - send_delba(padapter, 0, get_my_bssid(&(pmlmeinfo->network)));// recipient - } - } + if (num >= 1) + rtw_rx_ampdu_set_accept(padapter, accept, RX_AMPDU_DRV_FIXED); + if (num >= 2) + rtw_rx_ampdu_set_size(padapter, size, RX_AMPDU_DRV_FIXED); + rtw_rx_ampdu_apply(padapter); } +exit: return count; } int proc_get_rx_ampdu_factor(struct seq_file *m, void *v) @@ -1588,9 +1719,8 @@ int proc_get_all_sta_info(struct seq_file *m, void *v) struct sta_info *psta; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct sta_priv *pstapriv = &padapter->stapriv; - int i, j; + int i; _list *plist, *phead; - struct recv_reorder_ctrl *preorder_ctrl; DBG_871X_SEL_NL(m, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap); @@ -1632,15 +1762,8 @@ int proc_get_all_sta_info(struct seq_file *m, void *v) DBG_871X_SEL_NL(m, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher); DBG_871X_SEL_NL(m, "qos_info=0x%x\n", psta->qos_info); DBG_871X_SEL_NL(m, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy); - - for(j=0;j<16;j++) - { - preorder_ctrl = &psta->recvreorder_ctrl[j]; - if(preorder_ctrl->enable) - { - DBG_871X_SEL_NL(m, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq); - } - } + + sta_rx_reorder_ctl_dump(m, psta); #ifdef CONFIG_TDLS DBG_871X_SEL_NL(m, "tdls_sta_state=0x%08x\n", psta->tdls_sta_state); @@ -2040,5 +2163,538 @@ ssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_ return count; } + +#ifdef CONFIG_POWER_SAVING +int proc_get_ps_info(struct seq_file *m, void *v) +{ + struct net_device *dev = m->private; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + u8 ips_mode = pwrpriv->ips_mode; + u8 lps_mode = pwrpriv->power_mgnt; + char *str = ""; + + DBG_871X_SEL_NL(m, "======Power Saving Info:======\n"); + DBG_871X_SEL_NL(m, "*IPS:\n"); + + if (ips_mode == IPS_NORMAL) { +#ifdef CONFIG_FWLPS_IN_IPS + str = "FW_LPS_IN_IPS"; +#else + str = "Card Disable"; +#endif + } else if (ips_mode == IPS_NONE) { + str = "NO IPS"; + } else if (ips_mode == IPS_LEVEL_2) { + str = "IPS_LEVEL_2"; + } else { + str = "invalid ips_mode"; + } + + DBG_871X_SEL_NL(m, " IPS mode: %s\n", str); + DBG_871X_SEL_NL(m, " IPS enter count:%d, IPS leave count:%d\n", + pwrpriv->ips_enter_cnts, pwrpriv->ips_leave_cnts); + DBG_871X_SEL_NL(m, "------------------------------\n"); + DBG_871X_SEL_NL(m, "*LPS:\n"); + + if (lps_mode == PS_MODE_ACTIVE) { + str = "NO LPS"; + } else if (lps_mode == PS_MODE_MIN) { + str = "MIN"; + } else if (lps_mode == PS_MODE_MAX) { + str = "MAX"; + } else if (lps_mode == PS_MODE_DTIM) { + str = "DTIM"; + } else { + sprintf(str, "%d", lps_mode); + } + + DBG_871X_SEL_NL(m, " LPS mode: %s\n", str); + + if (pwrpriv->dtim != 0) + DBG_871X_SEL_NL(m, " DTIM: %d\n", pwrpriv->dtim); + DBG_871X_SEL_NL(m, " LPS enter count:%d, LPS leave count:%d\n", + pwrpriv->lps_enter_cnts, pwrpriv->lps_leave_cnts); + DBG_871X_SEL_NL(m, "=============================\n"); + return 0; +} +#endif //CONFIG_POWER_SAVING + +#ifdef CONFIG_TDLS +static int proc_tdls_display_tdls_function_info(struct seq_file *m) +{ + struct net_device *dev = m->private; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + u8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE; + u8 SpaceBtwnItemAndValueTmp = 0; + BOOLEAN FirstMatchFound = _FALSE; + int j= 0; + + DBG_871X_SEL_NL(m, "============[TDLS Function Info]============\n"); + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Prohibited", (ptdlsinfo->ap_prohibited == _TRUE) ? "_TRUE" : "_FALSE"); + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Channel Switch Prohibited", (ptdlsinfo->ch_switch_prohibited == _TRUE) ? "_TRUE" : "_FALSE"); + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Link Established", (ptdlsinfo->link_established == _TRUE) ? "_TRUE" : "_FALSE"); + DBG_871X_SEL_NL(m, "%-*s = %d/%d\n", SpaceBtwnItemAndValue, "TDLS STA Num (Linked/Allowed)", ptdlsinfo->sta_cnt, MAX_ALLOWED_TDLS_STA_NUM); + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Allowed STA Num Reached", (ptdlsinfo->sta_maximum == _TRUE) ? "_TRUE" : "_FALSE"); + +#ifdef CONFIG_TDLS_CH_SW + DBG_871X_SEL_NL(m, "%-*s =", SpaceBtwnItemAndValue, "TDLS CH SW State"); + if (ptdlsinfo->chsw_info.ch_sw_state == TDLS_STATE_NONE) + { + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_STATE_NONE"); + } + else + { + for (j = 0; j < 32; j++) + { + if (ptdlsinfo->chsw_info.ch_sw_state & BIT(j)) + { + if (FirstMatchFound == _FALSE) + { + SpaceBtwnItemAndValueTmp = 1; + FirstMatchFound = _TRUE; + } + else + { + SpaceBtwnItemAndValueTmp = SpaceBtwnItemAndValue + 3; + } + switch (BIT(j)) + { + case TDLS_INITIATOR_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_INITIATOR_STATE"); + break; + case TDLS_RESPONDER_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_RESPONDER_STATE"); + break; + case TDLS_LINKED_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_LINKED_STATE"); + break; + case TDLS_WAIT_PTR_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_WAIT_PTR_STATE"); + break; + case TDLS_ALIVE_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_ALIVE_STATE"); + break; + case TDLS_CH_SWITCH_ON_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SWITCH_ON_STATE"); + break; + case TDLS_PEER_AT_OFF_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_PEER_AT_OFF_STATE"); + break; + case TDLS_CH_SW_INITIATOR_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SW_INITIATOR_STATE"); + break; + case TDLS_WAIT_CH_RSP_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValue, " ", "TDLS_WAIT_CH_RSP_STATE"); + break; + default: + DBG_871X_SEL_NL(m, "%-*sBIT(%d)\n", SpaceBtwnItemAndValueTmp, " ", j); + break; + } + } + } + } + + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS CH SW On", (ATOMIC_READ(&ptdlsinfo->chsw_info.chsw_on) == _TRUE) ? "_TRUE" : "_FALSE"); + DBG_871X_SEL_NL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Off-Channel Num", ptdlsinfo->chsw_info.off_ch_num); + DBG_871X_SEL_NL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Channel Offset", ptdlsinfo->chsw_info.ch_offset); + DBG_871X_SEL_NL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Current Time", ptdlsinfo->chsw_info.cur_time); + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS CH SW Delay Switch Back", (ptdlsinfo->chsw_info.delay_switch_back == _TRUE) ? "_TRUE" : "_FALSE"); + DBG_871X_SEL_NL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Dump Back", ptdlsinfo->chsw_info.dump_stack); +#endif + + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Device Discovered", (ptdlsinfo->dev_discovered == _TRUE) ? "_TRUE" : "_FALSE"); + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Enable", (ptdlsinfo->tdls_enable == _TRUE) ? "_TRUE" : "_FALSE"); + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Driver Setup", (ptdlsinfo->driver_setup == _TRUE) ? "_TRUE" : "_FALSE"); + + return 0; +} + +static int proc_tdls_display_network_info(struct seq_file *m) +{ + struct net_device *dev = m->private; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + int i = 0; + u8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE; + + /* Display the linked AP/GO info */ + DBG_871X_SEL_NL(m, "============[Associated AP/GO Info]============\n"); + + if ((pmlmepriv->fw_state & WIFI_STATION_STATE) && (pmlmepriv->fw_state & _FW_LINKED)) + { + DBG_871X_SEL_NL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "BSSID", cur_network->network.Ssid.Ssid); + DBG_871X_SEL_NL(m, "%-*s = "MAC_FMT"\n", SpaceBtwnItemAndValue, "Mac Address", MAC_ARG(cur_network->network.MacAddress)); + + DBG_871X_SEL_NL(m, "%-*s = ", SpaceBtwnItemAndValue, "Wireless Mode"); + for (i = 0; i < 8; i++) + { + if (pmlmeext->cur_wireless_mode & BIT(i)) + { + switch (BIT(i)) + { + case WIRELESS_11B: + DBG_871X_SEL_NL(m, "%4s", "11B "); + break; + case WIRELESS_11G: + DBG_871X_SEL_NL(m, "%4s", "11G "); + break; + case WIRELESS_11A: + DBG_871X_SEL_NL(m, "%4s", "11A "); + break; + case WIRELESS_11_24N: + DBG_871X_SEL_NL(m, "%7s", "11_24N "); + break; + case WIRELESS_11_5N: + DBG_871X_SEL_NL(m, "%6s", "11_5N "); + break; + case WIRELESS_AUTO: + DBG_871X_SEL_NL(m, "%5s", "AUTO "); + break; + case WIRELESS_11AC: + DBG_871X_SEL_NL(m, "%5s", "11AC "); + break; + } + } + } + DBG_871X_SEL_NL(m, "\n"); + + DBG_871X_SEL_NL(m, "%-*s = ", SpaceBtwnItemAndValue, "Privacy"); + switch (padapter->securitypriv.dot11PrivacyAlgrthm) + { + case _NO_PRIVACY_: + DBG_871X_SEL_NL(m, "%s\n", "NO PRIVACY"); + break; + case _WEP40_: + DBG_871X_SEL_NL(m, "%s\n", "WEP 40"); + break; + case _TKIP_: + DBG_871X_SEL_NL(m, "%s\n", "TKIP"); + break; + case _TKIP_WTMIC_: + DBG_871X_SEL_NL(m, "%s\n", "TKIP WTMIC"); + break; + case _AES_: + DBG_871X_SEL_NL(m, "%s\n", "AES"); + break; + case _WEP104_: + DBG_871X_SEL_NL(m, "%s\n", "WEP 104"); + break; + case _WEP_WPA_MIXED_: + DBG_871X_SEL_NL(m, "%s\n", "WEP/WPA Mixed"); + break; + case _SMS4_: + DBG_871X_SEL_NL(m, "%s\n", "SMS4"); + break; +#ifdef CONFIG_IEEE80211W + case _BIP_: + DBG_871X_SEL_NL(m, "%s\n", "BIP"); + break; +#endif //CONFIG_IEEE80211W + } + + DBG_871X_SEL_NL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "Channel", pmlmeext->cur_channel); + DBG_871X_SEL_NL(m, "%-*s = ", SpaceBtwnItemAndValue, "Channel Offset"); + switch (pmlmeext->cur_ch_offset) + { + case HAL_PRIME_CHNL_OFFSET_DONT_CARE: + DBG_871X_SEL_NL(m, "%s\n", "N/A"); + break; + case HAL_PRIME_CHNL_OFFSET_LOWER: + DBG_871X_SEL_NL(m, "%s\n", "Lower"); + break; + case HAL_PRIME_CHNL_OFFSET_UPPER: + DBG_871X_SEL_NL(m, "%s\n", "Upper"); + break; + } + + DBG_871X_SEL_NL(m, "%-*s = ", SpaceBtwnItemAndValue, "Bandwidth Mode"); + switch (pmlmeext->cur_bwmode) + { + case CHANNEL_WIDTH_20: + DBG_871X_SEL_NL(m, "%s\n", "20MHz"); + break; + case CHANNEL_WIDTH_40: + DBG_871X_SEL_NL(m, "%s\n", "40MHz"); + break; + case CHANNEL_WIDTH_80: + DBG_871X_SEL_NL(m, "%s\n", "80MHz"); + break; + case CHANNEL_WIDTH_160: + DBG_871X_SEL_NL(m, "%s\n", "160MHz"); + break; + case CHANNEL_WIDTH_80_80: + DBG_871X_SEL_NL(m, "%s\n", "80MHz + 80MHz"); + break; + } + } + else + { + DBG_871X_SEL_NL(m, "No association with AP/GO exists!\n"); + } + + return 0; +} + +static int proc_tdls_display_tdls_sta_info(struct seq_file *m) +{ + struct net_device *dev = m->private; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct sta_priv *pstapriv = &padapter->stapriv; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct sta_info *psta; + int i = 0, j = 0; + _irqL irqL; + _list *plist, *phead; + u8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE; + u8 SpaceBtwnItemAndValueTmp = 0; + u8 NumOfTdlsStaToShow = 0; + BOOLEAN FirstMatchFound = _FALSE; + + /* Search for TDLS sta info to display */ + _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 (psta->tdls_sta_state != TDLS_STATE_NONE) + { + /* We got one TDLS sta info to show */ + DBG_871X_SEL_NL(m, "============[TDLS Peer STA Info: STA %d]============\n", ++NumOfTdlsStaToShow); + DBG_871X_SEL_NL(m, "%-*s = "MAC_FMT"\n", SpaceBtwnItemAndValue, "Mac Address", MAC_ARG(psta->hwaddr)); + DBG_871X_SEL_NL(m, "%-*s =", SpaceBtwnItemAndValue, "TDLS STA State"); + SpaceBtwnItemAndValueTmp = 0; + FirstMatchFound = _FALSE; + for (j = 0; j < 32; j++) + { + if (psta->tdls_sta_state & BIT(j)) + { + if (FirstMatchFound == _FALSE) + { + SpaceBtwnItemAndValueTmp = 1; + FirstMatchFound = _TRUE; + } + else + { + SpaceBtwnItemAndValueTmp = SpaceBtwnItemAndValue + 3; + } + switch (BIT(j)) + { + case TDLS_INITIATOR_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_INITIATOR_STATE"); + break; + case TDLS_RESPONDER_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_RESPONDER_STATE"); + break; + case TDLS_LINKED_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_LINKED_STATE"); + break; + case TDLS_WAIT_PTR_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_WAIT_PTR_STATE"); + break; + case TDLS_ALIVE_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_ALIVE_STATE"); + break; + case TDLS_CH_SWITCH_ON_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SWITCH_ON_STATE"); + break; + case TDLS_PEER_AT_OFF_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_PEER_AT_OFF_STATE"); + break; + case TDLS_CH_SW_INITIATOR_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SW_INITIATOR_STATE"); + break; + case TDLS_WAIT_CH_RSP_STATE: + DBG_871X_SEL_NL(m, "%-*s%s\n", SpaceBtwnItemAndValue, " ", "TDLS_WAIT_CH_RSP_STATE"); + break; + default: + DBG_871X_SEL_NL(m, "%-*sBIT(%d)\n", SpaceBtwnItemAndValueTmp, " ", j); + break; + } + } + } + + DBG_871X_SEL_NL(m, "%-*s = ", SpaceBtwnItemAndValue, "Wireless Mode"); + for (j = 0; j < 8; j++) + { + if (psta->wireless_mode & BIT(j)) + { + switch (BIT(j)) + { + case WIRELESS_11B: + DBG_871X_SEL_NL(m, "%4s", "11B "); + break; + case WIRELESS_11G: + DBG_871X_SEL_NL(m, "%4s", "11G "); + break; + case WIRELESS_11A: + DBG_871X_SEL_NL(m, "%4s", "11A "); + break; + case WIRELESS_11_24N: + DBG_871X_SEL_NL(m, "%7s", "11_24N "); + break; + case WIRELESS_11_5N: + DBG_871X_SEL_NL(m, "%6s", "11_5N "); + break; + case WIRELESS_AUTO: + DBG_871X_SEL_NL(m, "%5s", "AUTO "); + break; + case WIRELESS_11AC: + DBG_871X_SEL_NL(m, "%5s", "11AC "); + break; + } + } + } + DBG_871X_SEL_NL(m, "\n"); + + DBG_871X_SEL_NL(m, "%-*s = ", SpaceBtwnItemAndValue, "Bandwidth Mode"); + switch (psta->bw_mode) + { + case CHANNEL_WIDTH_20: + DBG_871X_SEL_NL(m, "%s\n", "20MHz"); + break; + case CHANNEL_WIDTH_40: + DBG_871X_SEL_NL(m, "%s\n", "40MHz"); + break; + case CHANNEL_WIDTH_80: + DBG_871X_SEL_NL(m, "%s\n", "80MHz"); + break; + case CHANNEL_WIDTH_160: + DBG_871X_SEL_NL(m, "%s\n", "160MHz"); + break; + case CHANNEL_WIDTH_80_80: + DBG_871X_SEL_NL(m, "%s\n", "80MHz + 80MHz"); + break; + } + + DBG_871X_SEL_NL(m, "%-*s = ", SpaceBtwnItemAndValue, "Privacy"); + switch (psta->dot118021XPrivacy) + { + case _NO_PRIVACY_: + DBG_871X_SEL_NL(m, "%s\n", "NO PRIVACY"); + break; + case _WEP40_: + DBG_871X_SEL_NL(m, "%s\n", "WEP 40"); + break; + case _TKIP_: + DBG_871X_SEL_NL(m, "%s\n", "TKIP"); + break; + case _TKIP_WTMIC_: + DBG_871X_SEL_NL(m, "%s\n", "TKIP WTMIC"); + break; + case _AES_: + DBG_871X_SEL_NL(m, "%s\n", "AES"); + break; + case _WEP104_: + DBG_871X_SEL_NL(m, "%s\n", "WEP 104"); + break; + case _WEP_WPA_MIXED_: + DBG_871X_SEL_NL(m, "%s\n", "WEP/WPA Mixed"); + break; + case _SMS4_: + DBG_871X_SEL_NL(m, "%s\n", "SMS4"); + break; +#ifdef CONFIG_IEEE80211W + case _BIP_: + DBG_871X_SEL_NL(m, "%s\n", "BIP"); + break; +#endif //CONFIG_IEEE80211W + } + + DBG_871X_SEL_NL(m, "%-*s = %d sec/%d sec\n", SpaceBtwnItemAndValue, "TPK Lifetime (Current/Expire)", psta->TPK_count, psta->TDLS_PeerKey_Lifetime); + DBG_871X_SEL_NL(m, "%-*s = %llu\n", SpaceBtwnItemAndValue, "Tx Packets Over Direct Link", psta->sta_stats.tx_pkts); + DBG_871X_SEL_NL(m, "%-*s = %llu\n", SpaceBtwnItemAndValue, "Rx Packets Over Direct Link", psta->sta_stats.rx_data_pkts); + } + } + } + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + if (NumOfTdlsStaToShow == 0) + { + DBG_871X_SEL_NL(m, "============[TDLS Peer STA Info]============\n"); + DBG_871X_SEL_NL(m, "No TDLS direct link exists!\n"); + } + + return 0; +} + +int proc_get_tdls_info(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 mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct sta_priv *pstapriv = &padapter->stapriv; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct sta_info *psta; + int i = 0, j = 0; + _irqL irqL; + _list *plist, *phead; + u8 SpaceBtwnItemAndValue = 41; + u8 SpaceBtwnItemAndValueTmp = 0; + u8 NumOfTdlsStaToShow = 0; + BOOLEAN FirstMatchFound = _FALSE; + + proc_tdls_display_tdls_function_info(m); + proc_tdls_display_network_info(m); + proc_tdls_display_tdls_sta_info(m); + + return 0; +} +#endif + +int proc_get_monitor(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 mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + if (WIFI_MONITOR_STATE == get_fwstate(pmlmepriv)) { + DBG_871X_SEL_NL(m, "Monitor mode : Enable\n"); + + DBG_871X_SEL_NL(m, "ch=%d, ch_offset=%d, bw=%d\n", + rtw_get_oper_ch(padapter), rtw_get_oper_choffset(padapter), rtw_get_oper_bw(padapter)); + } else { + DBG_871X_SEL_NL(m, "Monitor mode : Disable\n"); + } + + return 0; +} + +ssize_t proc_set_monitor(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) +{ + char tmp[32]; + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + u8 target_chan, target_offset, target_bw; + + if (count < 3) { + DBG_871X("argument size is less than 3\n"); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + int num = sscanf(tmp, "%hhu %hhu %hhu", &target_chan, &target_offset, &target_bw); + + if (num != 3) { + DBG_871X("invalid write_reg parameter!\n"); + return count; + } + + padapter->mlmeextpriv.cur_channel = target_chan; + set_channel_bwmode(padapter, target_chan, target_offset, target_bw); + } + + return count; +} + #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ieee80211.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ieee80211.c index ba6cad26514b..6c5f744e7c74 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ieee80211.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ieee80211.c @@ -88,7 +88,7 @@ uint rtw_is_cckrates_included(u8 *rate) { if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) - return _TRUE; + return _TRUE; i++; } @@ -104,8 +104,7 @@ uint rtw_is_cckratesonly_included(u8 *rate) { if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) - - return _FALSE; + return _FALSE; i++; } @@ -933,41 +932,45 @@ u8 *rtw_get_wps_ie_from_scan_queue(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) { uint cnt; - u8 *wpsie_ptr=NULL; - u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04}; + u8 *wpsie_ptr = NULL; + u8 eid, wps_oui[4] = {0x00, 0x50, 0xf2, 0x04}; - if(wps_ielen) + if (wps_ielen) *wps_ielen = 0; - if(!in_ie || in_len<=0) + if (!in_ie) { + rtw_warn_on(1); + return wpsie_ptr; + } + + if (in_len <= 0) return wpsie_ptr; cnt = 0; - while(cnt= MAX_IE_SZ) { + rtw_warn_on(1); + return NULL; + } - if(wps_ie) - _rtw_memcpy(wps_ie, &in_ie[cnt], in_ie[cnt+1]+2); - - if(wps_ielen) - *wps_ielen = in_ie[cnt+1]+2; - - cnt+=in_ie[cnt+1]+2; + if (eid == WLAN_EID_VENDOR_SPECIFIC && _rtw_memcmp(&in_ie[cnt + 2], wps_oui, 4) == _TRUE) { + wpsie_ptr = in_ie + cnt; + + if (wps_ie) + _rtw_memcpy(wps_ie, &in_ie[cnt], in_ie[cnt + 1] + 2); + + if (wps_ielen) + *wps_ielen = in_ie[cnt + 1] + 2; break; + } else { + cnt += in_ie[cnt + 1] + 2; } - else - { - cnt+=in_ie[cnt+1]+2; //goto next - } - } + } return wpsie_ptr; } @@ -1382,60 +1385,119 @@ int rtw_get_mac_addr_intel(unsigned char *buf) } #endif //CONFIG_PLATFORM_INTEL_BYT +/* + * Description: + * rtw_check_invalid_mac_address: + * This is only used for checking mac address valid or not. + * + * Input: + * adapter: mac_address pointer. + * + * Output: + * _TRUE: The mac address is invalid. + * _FALSE: The mac address is valid. + * + * Auther: Isaac.Li + */ +u8 rtw_check_invalid_mac_address(u8 *mac_addr) +{ + u8 null_mac_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; + u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + u8 res = _FALSE; + + if (_rtw_memcmp(mac_addr, null_mac_addr, ETH_ALEN)) { + res = _TRUE; + goto func_exit; + } + + if (_rtw_memcmp(mac_addr, multi_mac_addr, ETH_ALEN)) { + res = _TRUE; + goto func_exit; + } + + if (mac_addr[0] & BIT0) { + res = _TRUE; + goto func_exit; + } + + if (mac_addr[0] & BIT1) { + res = _TRUE; + goto func_exit; + } + +func_exit: + return res; +} + extern char* rtw_initmac; #include -void rtw_macaddr_cfg(u8 *mac_addr) +/** + * rtw_macaddr_cfg - Decide the mac address used + * @out: buf to store mac address decided + * @hw_mac_addr: mac address from efuse/epprom + */ +void rtw_macaddr_cfg(u8 *out, const u8 *hw_mac_addr) { 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 ) - { - 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); + if (out == NULL) { + rtw_warn_on(1); + return; } -#endif //CONFIG_PLATFORM_INTEL_BYT - 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]); + + /* Users specify the mac address */ + if (rtw_initmac) { + int jj,kk; + + for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) + mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk + 1]); + + goto err_chk; + } + + else { + + printk("Wifi Efuse Mac => %02x:%02x:%02x:%02x:%02x:%02x\n", out[0], out[1], + out[2], out[3], out[4], out[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); + _rtw_memcpy(out, mac, ETH_ALEN); + goto err_chk; } else { // Use the mac address stored in the Efuse - _rtw_memcpy(mac, mac_addr, ETH_ALEN); + _rtw_memcpy(mac, hw_mac_addr, ETH_ALEN); + goto err_chk; } - } - 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))) - { + } + +#ifdef CONFIG_PLATFORM_INTEL_BYT + if (rtw_get_mac_addr_intel(mac) == 0) + goto err_chk; +#endif + + + +err_chk: + //if (rtw_check_invalid_mac_address(mac) == _TRUE) + 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))){ + DBG_871X_LEVEL(_drv_err_, "invalid mac addr:"MAC_FMT", assign default one!!!\n", MAC_ARG(mac)); + + /* use default mac address */ 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)); + _rtw_memcpy(out, mac, ETH_ALEN); + DBG_871X("%s mac addr:"MAC_FMT"\n", __func__, MAC_ARG(out)); } #ifdef CONFIG_80211N_HT @@ -1647,47 +1709,48 @@ u8 *rtw_get_p2p_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ */ u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen) { - uint cnt = 0; - u8 *p2p_ie_ptr; - u8 eid, p2p_oui[4]={0x50,0x6F,0x9A,0x09}; + uint cnt; + u8 *p2p_ie_ptr = NULL; + u8 eid, p2p_oui[4] = {0x50, 0x6F, 0x9A, 0x09}; - if ( p2p_ielen != NULL ) + if (p2p_ielen) *p2p_ielen = 0; - while(cnt MAX_IE_SZ)) { - rtw_dump_stack(); + + if (cnt + 1 + 4 >= MAX_IE_SZ) { + rtw_warn_on(1); return NULL; - } - if( ( eid == _VENDOR_SPECIFIC_IE_ ) && ( _rtw_memcmp( &in_ie[cnt+2], p2p_oui, 4) == _TRUE ) ) - { + } + + if (eid == WLAN_EID_VENDOR_SPECIFIC && _rtw_memcmp(&in_ie[cnt + 2], p2p_oui, 4) == _TRUE) { p2p_ie_ptr = in_ie + cnt; - - if ( p2p_ie != NULL ) - { - _rtw_memcpy( p2p_ie, &in_ie[ cnt ], in_ie[ cnt + 1 ] + 2 ); - } - if ( p2p_ielen != NULL ) - { - *p2p_ielen = in_ie[ cnt + 1 ] + 2; - } - - return p2p_ie_ptr; + if (p2p_ie) + _rtw_memcpy(p2p_ie, &in_ie[cnt], in_ie[cnt + 1] + 2); + + if (p2p_ielen) + *p2p_ielen = in_ie[cnt + 1] + 2; break; + } else { + cnt += in_ie[cnt + 1] + 2; } - else - { - cnt += in_ie[ cnt + 1 ] +2; //goto next - } - - } - return NULL; + } + return p2p_ie_ptr; } /** @@ -1850,10 +1913,10 @@ 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(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(RTW_DBGDUMP, bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_); - } + 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(RTW_DBGDUMP, bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_); + } p2p_ielen=rtw_p2p_attr_remove(p2p_ie, p2p_ielen_ori, attr_id); if(p2p_ielen != p2p_ielen_ori) { diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ioctl_rtl.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ioctl_rtl.c index d97d3aa71a09..998965975491 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ioctl_rtl.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ioctl_rtl.c @@ -492,7 +492,6 @@ NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - struct eeprom_priv* peeprompriv = &padapter->eeprompriv; if(poid_par_priv->type_of_oid != QUERY_OID) { @@ -500,7 +499,7 @@ NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv) return status; } *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - *(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan ; + *(u16 *)poid_par_priv->information_buf = padapter->mlmepriv.ChannelPlan ; return status; } @@ -508,7 +507,6 @@ NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - struct eeprom_priv* peeprompriv = &padapter->eeprompriv; if(poid_par_priv->type_of_oid != SET_OID) { @@ -516,7 +514,7 @@ NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv) return status; } - peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf ; + padapter->mlmepriv.ChannelPlan = *(u16 *)poid_par_priv->information_buf ; return status; } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ioctl_set.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ioctl_set.c index 59b88f4d5c10..5ca4a56b57ab 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ioctl_set.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ioctl_set.c @@ -673,7 +673,10 @@ _func_enter_; case Ndis802_11AutoUnknown: case Ndis802_11InfrastructureMax: - break; + break; + case Ndis802_11Monitor: + set_fwstate(pmlmepriv, WIFI_MONITOR_STATE); + break; } //SecClearAllKeys(adapter); @@ -996,8 +999,8 @@ _func_enter_; } } - // Check key length for WEP. For NDTEST, 2005.01.27, by rcnjko. - if( (encryptionalgo== _WEP40_|| encryptionalgo== _WEP104_) && (key->KeyLength != 5 || key->KeyLength != 13)) { + /* Check key length for WEP. For NDTEST, 2005.01.27, by rcnjko. -> modify checking condition*/ + if (((encryptionalgo == _WEP40_) && (key->KeyLength != 5)) || ((encryptionalgo == _WEP104_) && (key->KeyLength != 13))) { RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("WEP KeyLength:0x%x != 5 or 13\n", key->KeyLength)); ret=_FAIL; goto exit; @@ -1252,16 +1255,22 @@ _func_enter_; //Set key to CAM through H2C command + #if 0 if(bgrouptkey)//never go to here { - res=rtw_setstakey_cmd(padapter, stainfo, _FALSE, _TRUE); + res=rtw_setstakey_cmd(padapter, stainfo, GROUP_KEY, _TRUE); RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(group)\n")); } else{ - res=rtw_setstakey_cmd(padapter, stainfo, _TRUE, _TRUE); + res=rtw_setstakey_cmd(padapter, stainfo, UNICAST_KEY, _TRUE); RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n")); } + #else + res = rtw_setstakey_cmd(padapter, stainfo, UNICAST_KEY, _TRUE); + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n")); + #endif + if(res ==_FALSE) ret= _FAIL; @@ -1469,7 +1478,7 @@ int rtw_set_country(_adapter *adapter, const char *country_code) * * Return _SUCCESS or _FAIL */ -int rtw_set_band(_adapter *adapter, enum _BAND band) +int rtw_set_band(_adapter *adapter, u8 band) { if (rtw_band_valid(band)) { DBG_871X(FUNC_ADPT_FMT" band:%d\n", FUNC_ADPT_ARG(adapter), band); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mem.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mem.c index a4de3e61431f..5675b63d55c8 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mem.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mem.c @@ -52,6 +52,8 @@ static int __init rtw_mem_init(void) struct sk_buff *pskb=NULL; printk("%s\n", __func__); + pr_info("NR_PREALLOC_RECV_SKB: %d\n", NR_PREALLOC_RECV_SKB); + pr_info("MAX_RECVBUF_SZ: %d\n", MAX_RECVBUF_SZ); #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX for(i=0; ilock, &irqL); #if defined(CONFIG_P2P) && defined(CONFIG_P2P_REMOVE_GROUP_INFO) - rtw_WLAN_BSSID_EX_remove_p2p_attr(pnetwork, P2P_ATTR_GROUP_INFO); + if (adapter->registrypriv.wifi_spec == 0) + rtw_WLAN_BSSID_EX_remove_p2p_attr(pnetwork, P2P_ATTR_GROUP_INFO); #endif update_current_network(adapter, pnetwork); @@ -1203,46 +1204,34 @@ _func_exit_; void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) { _irqL irqL; - u8 timer_cancelled = _FALSE; + u8 timer_cancelled; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - -#ifdef CONFIG_MLME_EXT +#ifdef CONFIG_MLME_EXT mlmeext_surveydone_event_callback(adapter); - #endif -_func_enter_; +_func_enter_; _enter_critical_bh(&pmlmepriv->lock, &irqL); - if(pmlmepriv->wps_probe_req_ie) - { + if (pmlmepriv->wps_probe_req_ie) { u32 free_len = pmlmepriv->wps_probe_req_ie_len; pmlmepriv->wps_probe_req_ie_len = 0; rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len); - pmlmepriv->wps_probe_req_ie = NULL; + pmlmepriv->wps_probe_req_ie = NULL; } - + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_surveydone_event_callback: fw_state:%x\n\n", get_fwstate(pmlmepriv))); - - if (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY)) - { - //u8 timer_cancelled; - timer_cancelled = _TRUE; - //_cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); - - _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); - } - else { - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("nic status =%x, survey done event comes too late!\n", get_fwstate(pmlmepriv))); + if (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY) == _FALSE) { + DBG_871X(FUNC_ADPT_FMT" fw_state:0x%x\n", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv)); + //rtw_warn_on(1); } - _exit_critical_bh(&pmlmepriv->lock, &irqL); - if(timer_cancelled) - _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); _enter_critical_bh(&pmlmepriv->lock, &irqL); @@ -1258,12 +1247,12 @@ _func_enter_; { set_fwstate(pmlmepriv, _FW_UNDER_LINKING); - if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS) - { - _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT ); - } - else - { + if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS) + { + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); + } + else + { WLAN_BSSID_EX *pdev_network = &(adapter->registrypriv.dev_network); u8 *pibss = adapter->registrypriv.dev_network.MacAddress; @@ -1278,7 +1267,8 @@ _func_enter_; rtw_update_registrypriv_dev_network(adapter); rtw_generate_random_ibss(pibss); - pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; + + pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; if(rtw_createbss_cmd(adapter)!=_SUCCESS) { @@ -1360,9 +1350,6 @@ _func_enter_; #ifdef CONFIG_CONCURRENT_MODE rtw_os_xmit_schedule(adapter->pbuddy_adapter); #endif -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_resume_xmit(adapter); -#endif #ifdef CONFIG_DRVEXT_MODULE_WSC drvext_surveydone_callback(&adapter->drvextpriv); @@ -1490,9 +1477,8 @@ _func_enter_; psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress); #ifdef CONFIG_TDLS - if(ptdlsinfo->link_established == _TRUE) - { - rtw_tdls_cmd(adapter, myid(&(adapter->eeprompriv)), TDLS_RS_RCR); + if (ptdlsinfo->link_established == _TRUE) { + rtw_tdls_cmd(adapter, NULL, TDLS_RS_RCR); rtw_reset_tdls_info(adapter); rtw_free_all_stainfo(adapter); //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); @@ -1524,9 +1510,8 @@ _func_enter_; if(lock_scanned_queue) _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - -// pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); - pwlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, tgt_network); + + pwlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, tgt_network); if(pwlan) { pwlan->fixed = _FALSE; @@ -1735,8 +1720,8 @@ u32 rtw_scan_abort_timeout(_adapter *adapter, u32 timeout_ms) { u32 start; u32 pass_ms; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); start = rtw_get_current_time(); pmlmeext->scan_abort = _TRUE; @@ -1873,6 +1858,7 @@ static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wl #endif preorder_ctrl->wend_b= 0xffff; preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 + preorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID; } @@ -1891,6 +1877,7 @@ static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wl #endif preorder_ctrl->wend_b= 0xffff; preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 + preorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID; } } } @@ -2207,10 +2194,6 @@ _func_enter_; rtw_os_xmit_schedule(adapter->pbuddy_adapter); #endif -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_resume_xmit(adapter); -#endif - _func_exit_; } @@ -2416,7 +2399,7 @@ _func_enter_; #ifdef CONFIG_RTL8711 //submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta - rtw_setstakey_cmd(adapter, psta, _FALSE, _TRUE); + rtw_setstakey_cmd(adapter, psta, GROUP_KEY, _TRUE); #endif exit: @@ -2705,16 +2688,19 @@ _func_exit_; void rtw_scan_timeout_handler (_adapter *adapter) { _irqL irqL; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; DBG_871X(FUNC_ADPT_FMT" fw_state=%x\n", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv)); _enter_critical_bh(&pmlmepriv->lock, &irqL); _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); - + _exit_critical_bh(&pmlmepriv->lock, &irqL); - + +#ifdef CONFIG_IOCTL_CFG80211 + rtw_cfg80211_surveydone_event_callback(adapter); +#endif //CONFIG_IOCTL_CFG80211 + rtw_indicate_scan_done(adapter, _TRUE); #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_IOCTL_CFG80211) @@ -2854,7 +2840,7 @@ void rtw_dynamic_check_timer_handlder(_adapter *adapter) DBG_871X("IsBtDisabled=%d, IsBtControlLps=%d\n", rtw_btcoex_IsBtDisabled(adapter), rtw_btcoex_IsBtControlLps(adapter)); #endif -#ifdef CONFIG_LPS_LCLK_WD_TIMER +#ifdef CONFIG_LPS_LCLK_WD_TIMER /* to avoid leaving lps 32k frequently*/ if ((adapter_to_pwrctl(adapter)->bFwCurrentInPSMode ==_TRUE ) #ifdef CONFIG_BT_COEXIST && (rtw_btcoex_IsBtControlLps(adapter) == _FALSE) @@ -2946,7 +2932,7 @@ inline void rtw_clear_scan_deny(_adapter *adapter) struct mlme_priv *mlmepriv = &adapter->mlmepriv; ATOMIC_SET(&mlmepriv->set_scan_deny, 0); if (0) - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); } void rtw_set_scan_deny_timer_hdl(_adapter *adapter) @@ -2962,7 +2948,7 @@ void rtw_set_scan_deny(_adapter *adapter, u32 ms) #endif if (0) - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); ATOMIC_SET(&mlmepriv->set_scan_deny, 1); _set_timer(&mlmepriv->set_scan_deny_timer, ms); @@ -2971,7 +2957,7 @@ void rtw_set_scan_deny(_adapter *adapter, u32 ms) return; if (0) - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter->pbuddy_adapter)); + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter->pbuddy_adapter)); b_mlmepriv = &adapter->pbuddy_adapter->mlmepriv; ATOMIC_SET(&b_mlmepriv->set_scan_deny, 1); _set_timer(&b_mlmepriv->set_scan_deny_timer, ms); @@ -3071,11 +3057,11 @@ _func_enter_; mlme->pscanned = get_next(mlme->pscanned); if (0) - DBG_871X("%s("MAC_FMT", ch%u) rssi:%d\n" - , pnetwork->network.Ssid.Ssid - , MAC_ARG(pnetwork->network.MacAddress) - , pnetwork->network.Configuration.DSConfig - , (int)pnetwork->network.Rssi); + DBG_871X("%s("MAC_FMT", ch%u) rssi:%d\n" + , pnetwork->network.Ssid.Ssid + , MAC_ARG(pnetwork->network.MacAddress) + , pnetwork->network.Configuration.DSConfig + , (int)pnetwork->network.Rssi); rtw_check_roaming_candidate(mlme, &candidate, pnetwork); @@ -3149,16 +3135,11 @@ static int rtw_check_join_candidate(struct mlme_priv *mlme } if(updated){ - DBG_871X("[by_bssid:%u][assoc_ssid:%s]" - #ifdef CONFIG_LAYER2_ROAMING - "[to_roam:%u] " - #endif + DBG_871X("[by_bssid:%u][assoc_ssid:%s][to_roam:%u] " "new candidate: %s("MAC_FMT", ch%u) rssi:%d\n", mlme->assoc_by_bssid, mlme->assoc_ssid.Ssid, - #ifdef CONFIG_LAYER2_ROAMING rtw_to_roam(adapter), - #endif (*candidate)->network.Ssid.Ssid, MAC_ARG((*candidate)->network.MacAddress), (*candidate)->network.Configuration.DSConfig, @@ -3221,11 +3202,11 @@ _func_enter_; pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); if (0) - DBG_871X("%s("MAC_FMT", ch%u) rssi:%d\n" - , pnetwork->network.Ssid.Ssid - , MAC_ARG(pnetwork->network.MacAddress) - , pnetwork->network.Configuration.DSConfig - , (int)pnetwork->network.Rssi); + DBG_871X("%s("MAC_FMT", ch%u) rssi:%d\n" + , pnetwork->network.Ssid.Ssid + , MAC_ARG(pnetwork->network.MacAddress) + , pnetwork->network.Configuration.DSConfig + , (int)pnetwork->network.Rssi); rtw_check_join_candidate(pmlmepriv, &candidate, pnetwork); @@ -3668,9 +3649,8 @@ _func_exit_; void rtw_init_registrypriv_dev_network( _adapter* adapter) { struct registry_priv* pregistrypriv = &adapter->registrypriv; - struct eeprom_priv* peepriv = &adapter->eeprompriv; WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; - u8 *myhwaddr = myid(peepriv); + u8 *myhwaddr = adapter_mac_addr(adapter); _func_enter_; @@ -3698,6 +3678,7 @@ void rtw_update_registrypriv_dev_network(_adapter* adapter) struct security_priv* psecuritypriv = &adapter->securitypriv; struct wlan_network *cur_network = &adapter->mlmepriv.cur_network; //struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; _func_enter_; @@ -3745,9 +3726,15 @@ _func_enter_; pdev_network->Configuration.DSConfig = (pregistrypriv->channel); RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("pregistrypriv->channel=%d, pdev_network->Configuration.DSConfig=0x%x\n", pregistrypriv->channel, pdev_network->Configuration.DSConfig)); - if(cur_network->network.InfrastructureMode == Ndis802_11IBSS) + if (cur_network->network.InfrastructureMode == Ndis802_11IBSS) { pdev_network->Configuration.ATIMWindow = (0); + if (pmlmeext->cur_channel != 0) + pdev_network->Configuration.DSConfig = pmlmeext->cur_channel; + else + pdev_network->Configuration.DSConfig = 1; + } + pdev_network->InfrastructureMode = (cur_network->network.InfrastructureMode); // 1. Supported rates @@ -3973,6 +3960,12 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui /* todo: disable SM power save mode */ ht_capie.cap_info |= IEEE80211_HT_CAP_SM_PS; + /* RX LDPC */ + if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX)) { + ht_capie.cap_info |= IEEE80211_HT_CAP_LDPC_CODING; + DBG_871X("[HT] Declare supporting RX LDPC\n"); + } + if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX)) { if((pregistrypriv->rx_stbc == 0x3) || /* enable for 2.4/5 GHz */ ((channel <= 14) && (pregistrypriv->rx_stbc == 0x1)) || /* enable for 2.4GHz */ @@ -4001,8 +3994,6 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui case RF_2T2R: case RF_1T2R: - default: - if (stbc_rx_enable) ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_2R;//RX STBC two spatial stream @@ -4012,9 +4003,14 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui else set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R); #else //CONFIG_DISABLE_MCS13TO15 - set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R); + set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R); #endif //CONFIG_DISABLE_MCS13TO15 break; + case RF_3T3R: + set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_3R); + break; + default: + DBG_871X("[warning] rf_type %d is not expected\n", rf_type); } { @@ -4186,7 +4182,7 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel) (pmlmeinfo->HT_info.infos[0] & BIT(2))) { int i; - u8 rf_type; + u8 rf_type = RF_1T1R; rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); @@ -4201,9 +4197,8 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel) 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 + case RF_2T2R: + #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 @@ -4211,6 +4206,12 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel) #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 + break; + case RF_3T3R: + set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_3R); + break; + default: + DBG_871X("[warning] rf_type %d is not expected\n", rf_type); } //switch to the 40M Hz mode accoring to the AP @@ -4307,21 +4308,17 @@ void rtw_issue_addbareq_cmd_tdls(_adapter *padapter, struct xmit_frame *pxmitfra priority = pattrib->priority; - if(pattrib->direct_link == _TRUE) - { + if (pattrib->direct_link == _TRUE) { ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst); - if((ptdls_sta != NULL) && (ptdls_sta->tdls_sta_state & TDLS_ESTABLISHED)) - { + if ((ptdls_sta != NULL) && (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) { phtpriv = &ptdls_sta->htpriv; - if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) - { + if ((phtpriv->ht_option == _TRUE) && (phtpriv->ampdu_enable == _TRUE)) { issued = (phtpriv->agg_enable_bitmap>>priority)&0x1; issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1; - if(0==issued) - { - DBG_871X("rtw_issue_addbareq_cmd, p=%d\n", priority); + if (0 == issued) { + DBG_871X("[%s], p=%d\n", __FUNCTION__, priority); ptdls_sta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); rtw_addbareq_cmd(padapter,(u8)priority, pattrib->dst); } @@ -4396,7 +4393,7 @@ void rtw_append_exented_cap(_adapter *padapter, u8 *out_ie, uint *pout_len) #endif //CONFIG_80211AC_VHT u8 cap_content[8] = {0}; u8 *pframe; - + u8 null_content[8] = {0}; if (phtpriv->bss_coexist) { SET_EXT_CAPABILITY_ELE_BSS_COEXIST(cap_content, 1); @@ -4407,8 +4404,13 @@ void rtw_append_exented_cap(_adapter *padapter, u8 *out_ie, uint *pout_len) SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(cap_content, 1); } #endif //CONFIG_80211AC_VHT - - pframe = rtw_set_ie(out_ie+*pout_len, EID_EXTCapability, 8, cap_content , pout_len); + /* + From 802.11 specification,if a STA does not support any of capabilities defined + in the Extended Capabilities element, then the STA is not required to + transmit the Extended Capabilities element. + */ + if (_FALSE == _rtw_memcmp(cap_content, null_content, 8)) + pframe = rtw_set_ie(out_ie + *pout_len, EID_EXTCapability, 8, cap_content , pout_len); } #endif @@ -4567,3 +4569,4 @@ const char *get_miracast_mode_str(int mode) return miracast_mode_str[mode]; } + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mlme_ext.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mlme_ext.c index 7cf52d00d135..41ec95655e95 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mlme_ext.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mlme_ext.c @@ -288,7 +288,7 @@ static RT_CHANNEL_PLAN_MAP RTW_ChannelPlanMap[RT_CHANNEL_DOMAIN_MAX] = { {0x01,0x23}, //0x58, RT_CHANNEL_DOMAIN_WORLD_MKK4 }; -static RT_CHANNEL_PLAN_MAP RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = {0x01,0x02}; //use the conbination for max channel numbers +static RT_CHANNEL_PLAN_MAP RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = {0x00,0x02}; //use the conbination for max channel numbers /* * Search the @param ch in given @param ch_set @@ -319,9 +319,9 @@ int rtw_ch_set_search_ch(RT_CHANNEL_INFO *ch_set, const u32 ch) */ bool rtw_mlme_band_check(_adapter *adapter, const u32 ch) { - if (adapter->setband == GHZ24_50 /* 2.4G and 5G */ - || (adapter->setband == GHZ_24 && ch < 35) /* 2.4G only */ - || (adapter->setband == GHZ_50 && ch > 35) /* 5G only */ + if (adapter->setband == WIFI_FREQUENCY_BAND_AUTO /* 2.4G and 5G */ + || (adapter->setband == WIFI_FREQUENCY_BAND_2GHZ && ch < 35) /* 2.4G only */ + || (adapter->setband == WIFI_FREQUENCY_BAND_5GHZ && ch > 35) /* 5G only */ ) { return _TRUE; } @@ -351,7 +351,7 @@ void init_mlme_default_rate_set(_adapter* padapter) unsigned char mixed_datarate[NumRates] = {_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_,_9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, _48M_RATE_, _54M_RATE_, 0xff}; unsigned char mixed_basicrate[NumRates] ={_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_, _12M_RATE_, _24M_RATE_, 0xff,}; - unsigned char supported_mcs_set[16] = {0xff, 0xff, 0x00, 0x00, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; + unsigned char supported_mcs_set[16] = {0xff, 0xff, 0xff, 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); @@ -679,7 +679,7 @@ static void _mgt_dispatcher(_adapter *padapter, struct mlme_handler *ptable, uni if(ptable->func) { //receive the frames that ra(a1) is my address or ra(a1) is bc address. - if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && + if (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN) && !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) { return; @@ -726,7 +726,7 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) } //receive the frames that ra(a1) is my address or ra(a1) is bc address. - if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && + if (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN) && !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) { return; @@ -738,9 +738,9 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_TDLS if((index << 4)==WIFI_ACTION){ - //category==public (4), action==TDLS_DISCOVERY_RESPONSE - if(*(pframe+24)==0x04 && *(pframe+25)==TDLS_DISCOVERY_RESPONSE){ - DBG_871X("recv tdls discovery response frame from "MAC_FMT"\n", MAC_ARG(GetAddr2Ptr(pframe))); + /* category==public (4), action==TDLS_DISCOVERY_RESPONSE */ + if (*(pframe+24) == RTW_WLAN_CATEGORY_PUBLIC && *(pframe+25) == TDLS_DISCOVERY_RESPONSE) { + DBG_871X("[TDLS] Recv %s from "MAC_FMT"\n", rtw_tdls_action_txt(TDLS_DISCOVERY_RESPONSE), MAC_ARG(GetAddr2Ptr(pframe))); On_TDLS_Dis_Rsp(padapter, precv_frame); } } @@ -1043,7 +1043,7 @@ _continue: _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); //generate pairing ID - mac_addr = myid(&(padapter->eeprompriv)); + mac_addr = adapter_mac_addr(padapter); peer_addr = psta->hwaddr; psta->pid = (u16)(((mac_addr[4]<<8) + mac_addr[5]) + ((peer_addr[4]<<8) + peer_addr[5])); @@ -1221,9 +1221,6 @@ unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame) report_survey_event(padapter, precv_frame); #ifdef CONFIG_CONCURRENT_MODE report_survey_event(padapter->pbuddy_adapter, precv_frame); -#endif -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_report_survey_event(padapter, precv_frame); #endif return _SUCCESS; } @@ -1259,6 +1256,10 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) int ret = _SUCCESS; u8 *p = NULL; u32 ielen = 0; +#ifdef CONFIG_TDLS + struct sta_info *ptdls_sta; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; +#endif /* CONFIG_TDLS */ #ifdef CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR p = rtw_get_ie(pframe + sizeof(struct rtw_ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ielen, precv_frame->u.hdr.len -sizeof(struct rtw_ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_); @@ -1279,11 +1280,6 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_CONCURRENT_MODE report_survey_event(padapter->pbuddy_adapter, precv_frame); #endif - -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_report_survey_event(padapter, precv_frame); -#endif - return _SUCCESS; } @@ -1334,6 +1330,17 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN)); #endif //CONFIG_P2P_PS +#if defined(CONFIG_P2P)&&defined(CONFIG_CONCURRENT_MODE) + if (padapter->registrypriv.wifi_spec) { + if (process_p2p_cross_connect_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN)) == _FALSE) { + if((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE) { + DBG_871X_LEVEL(_drv_always_, "no issue auth, P2P cross-connect does not permit\n "); + return _SUCCESS; + } + } + } +#endif // CONFIG_P2P CONFIG_P2P and CONFIG_CONCURRENT_MODE + //start auth start_clnt_auth(padapter); @@ -1372,6 +1379,24 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) adaptive_early_32k(pmlmeext, pframe, len); +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW + if (padapter->tdlsinfo.ch_switch_prohibited == _FALSE) + { + /* Send TDLS Channel Switch Request when receiving Beacon */ + if ((padapter->tdlsinfo.chsw_info.ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) && (pmlmeext->cur_channel == rtw_get_oper_ch(padapter))) { + ptdlsinfo->chsw_info.ch_sw_state |= TDLS_WAIT_CH_RSP_STATE; + /* DBG_871X("[%s] issue_tdls_ch_switch_req to "MAC_FMT"\n", __FUNCTION__, MAC_ARG(padapter->tdlsinfo.chsw_info.addr)); */ + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, padapter->tdlsinfo.chsw_info.addr); + if (ptdls_sta != NULL) { + if (ptdls_sta->tdls_sta_state | TDLS_LINKED_STATE) + issue_tdls_ch_switch_req(padapter, ptdls_sta); + } + } + } +#endif +#endif /* CONFIG_TDLS */ + #ifdef CONFIG_DFS process_csa_ie(padapter, pframe, len); //channel switch announcement #endif //CONFIG_DFS @@ -1721,7 +1746,7 @@ unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame) DBG_871X("%s\n", __FUNCTION__); //check A1 matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) + if (!_rtw_memcmp(adapter_mac_addr(padapter), get_da(pframe), ETH_ALEN)) return _SUCCESS; if (!(pmlmeinfo->state & WIFI_FW_AUTH_STATE)) @@ -2339,25 +2364,24 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) if (pstat->aid > 0) { DBG_871X(" old AID %d\n", pstat->aid); } else { - for (pstat->aid = 1; pstat->aid <= NUM_STA; pstat->aid++) - if (pstapriv->sta_aid[pstat->aid - 1] == NULL) - break; + for (pstat->aid = 1; pstat->aid <= NUM_STA; pstat->aid++) { + if (pstapriv->sta_aid[pstat->aid - 1] == NULL) { + if (pstat->aid > pstapriv->max_num_sta) { + pstat->aid = 0; - //if (pstat->aid > NUM_STA) { - if (pstat->aid > pstapriv->max_num_sta) { - - pstat->aid = 0; - - DBG_871X(" no room for more AIDs\n"); + DBG_871X(" no room for more AIDs\n"); - status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA; + status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA; - goto OnAssocReqFail; + goto OnAssocReqFail; - } else { - pstapriv->sta_aid[pstat->aid - 1] = pstat; - DBG_871X("allocate new AID = (%d)\n", pstat->aid); + } else { + pstapriv->sta_aid[pstat->aid - 1] = pstat; + DBG_871X("allocate new AID = (%d)\n", pstat->aid); + break; + } + } } } @@ -2465,7 +2489,7 @@ unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame) DBG_871X("%s\n", __FUNCTION__); //check A1 matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) + if (!_rtw_memcmp(adapter_mac_addr(padapter), get_da(pframe), ETH_ALEN)) return _SUCCESS; if (!(pmlmeinfo->state & (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE))) @@ -2543,7 +2567,15 @@ unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame) case _ERPINFO_IE_: ERP_IE_handler(padapter, pIE); - + break; +#ifdef CONFIG_TDLS + case _EXT_CAP_IE_: + if (check_ap_tdls_prohibited(pIE->data, pIE->Length) == _TRUE) + padapter->tdlsinfo.ap_prohibited = _TRUE; + if (check_ap_tdls_ch_switching_prohibited(pIE->data, pIE->Length) == _TRUE) + padapter->tdlsinfo.ch_switch_prohibited = _TRUE; + break; +#endif /* CONFIG_TDLS */ default: break; } @@ -2598,8 +2630,6 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); - DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); - rtw_lock_rx_suspend_timeout(8000); #ifdef CONFIG_AP_MODE @@ -2613,8 +2643,8 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) //rtw_free_stainfo(padapter, psta); //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - DBG_871X_LEVEL(_drv_always_, "ap recv deauth reason code(%d) sta:%pM\n", - reason, GetAddr2Ptr(pframe)); + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n" + , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe)); psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); if(psta) @@ -2659,12 +2689,12 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) } } - DBG_871X_LEVEL(_drv_always_, "sta recv deauth reason code(%d) sta:%pM, ignore = %d\n", - reason, GetAddr3Ptr(pframe), ignore_received_deauth); - + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM, ignore=%d\n" + , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe), ignore_received_deauth); + if ( 0 == ignore_received_deauth ) { - receive_disconnect(padapter, GetAddr3Ptr(pframe) ,reason); + receive_disconnect(padapter, GetAddr2Ptr(pframe), reason); } } pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; @@ -2697,8 +2727,6 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); - DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); - rtw_lock_rx_suspend_timeout(8000); #ifdef CONFIG_AP_MODE @@ -2712,8 +2740,8 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) //rtw_free_stainfo(padapter, psta); //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - DBG_871X_LEVEL(_drv_always_, "ap recv disassoc reason code(%d) sta:%pM\n", - reason, GetAddr2Ptr(pframe)); + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n" + , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe)); psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); if(psta) @@ -2738,10 +2766,10 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) else #endif { - DBG_871X_LEVEL(_drv_always_, "sta recv disassoc reason code(%d) sta:%pM\n", - reason, GetAddr3Ptr(pframe)); - - receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n" + , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe)); + + receive_disconnect(padapter, GetAddr2Ptr(pframe), reason); } pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; return _SUCCESS; @@ -2865,6 +2893,261 @@ unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame) return _SUCCESS; } +/** + * rtw_rx_ampdu_size - Get the target RX AMPDU buffer size for the specific @adapter + * @adapter: the adapter to get target RX AMPDU buffer size + * + * Returns: the target RX AMPDU buffer size + */ +u8 rtw_rx_ampdu_size(_adapter *adapter) +{ + u8 size; + HT_CAP_AMPDU_FACTOR max_rx_ampdu_factor; + + if (adapter->fix_rx_ampdu_size != RX_AMPDU_SIZE_INVALID) { + size = adapter->fix_rx_ampdu_size; + goto exit; + } + +#ifdef CONFIG_BT_COEXIST + if (rtw_btcoex_IsBTCoexCtrlAMPDUSize(adapter) == _TRUE) { + size = rtw_btcoex_GetAMPDUSize(adapter); + goto exit; + } +#endif + + /* default value based on max_rx_ampdu_factor */ + if (adapter->driver_rx_ampdu_factor != 0xFF) + max_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)adapter->driver_rx_ampdu_factor; + else + rtw_hal_get_def_var(adapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor); + + if (MAX_AMPDU_FACTOR_64K == max_rx_ampdu_factor) + size = 64; + else if (MAX_AMPDU_FACTOR_32K == max_rx_ampdu_factor) + size = 32; + else if (MAX_AMPDU_FACTOR_16K == max_rx_ampdu_factor) + size = 16; + else if (MAX_AMPDU_FACTOR_8K == max_rx_ampdu_factor) + size = 8; + else + size = 64; + +exit: + + if (size > 127) + size = 127; + + return size; +} + +/** + * rtw_rx_ampdu_is_accept - Get the permission if RX AMPDU should be set up for the specific @adapter + * @adapter: the adapter to get the permission if RX AMPDU should be set up + * + * Returns: accept or not + */ +bool rtw_rx_ampdu_is_accept(_adapter *adapter) +{ + bool accept; + + if (adapter->fix_rx_ampdu_accept != RX_AMPDU_ACCEPT_INVALID) { + accept = adapter->fix_rx_ampdu_accept; + goto exit; + } + +#ifdef CONFIG_BT_COEXIST + if (rtw_btcoex_IsBTCoexRejectAMPDU(adapter) == _TRUE) { + accept = _FALSE; + goto exit; + } +#endif + + /* default value for other cases */ + accept = adapter->mlmeextpriv.mlmext_info.bAcceptAddbaReq; + +exit: + return accept; +} + +/** + * rtw_rx_ampdu_set_size - Set the target RX AMPDU buffer size for the specific @adapter and specific @reason + * @adapter: the adapter to set target RX AMPDU buffer size + * @size: the target RX AMPDU buffer size to set + * @reason: reason for the target RX AMPDU buffer size setting + * + * Returns: whether the target RX AMPDU buffer size is changed + */ +bool rtw_rx_ampdu_set_size(_adapter *adapter, u8 size, u8 reason) +{ + bool is_adj = _FALSE; + struct mlme_ext_priv *mlmeext; + struct mlme_ext_info *mlmeinfo; + + mlmeext = &adapter->mlmeextpriv; + mlmeinfo = &mlmeext->mlmext_info; + + if (reason == RX_AMPDU_DRV_FIXED) { + if (adapter->fix_rx_ampdu_size != size) { + adapter->fix_rx_ampdu_size = size; + is_adj = _TRUE; + DBG_871X(FUNC_ADPT_FMT" fix_rx_ampdu_size:%u\n", FUNC_ADPT_ARG(adapter), size); + } + } + + return is_adj; +} + +/** + * rtw_rx_ampdu_set_accept - Set the permission if RX AMPDU should be set up for the specific @adapter and specific @reason + * @adapter: the adapter to set if RX AMPDU should be set up + * @accept: if RX AMPDU should be set up + * @reason: reason for the permission if RX AMPDU should be set up + * + * Returns: whether the permission if RX AMPDU should be set up is changed + */ +bool rtw_rx_ampdu_set_accept(_adapter *adapter, u8 accept, u8 reason) +{ + bool is_adj = _FALSE; + struct mlme_ext_priv *mlmeext; + struct mlme_ext_info *mlmeinfo; + + mlmeext = &adapter->mlmeextpriv; + mlmeinfo = &mlmeext->mlmext_info; + + if (reason == RX_AMPDU_DRV_FIXED) { + if (adapter->fix_rx_ampdu_accept != accept) { + adapter->fix_rx_ampdu_accept = accept; + is_adj = _TRUE; + DBG_871X(FUNC_ADPT_FMT" fix_rx_ampdu_accept:%u\n", FUNC_ADPT_ARG(adapter), accept); + } + } + + return is_adj; +} + +/** + * rx_ampdu_apply_sta_tid - Apply RX AMPDU setting to the specific @sta and @tid + * @adapter: the adapter to which @sta belongs + * @sta: the sta to be checked + * @tid: the tid to be checked + * @accept: the target permission if RX AMPDU should be set up + * @size: the target RX AMPDU buffer size + * + * Returns: + * 0: no canceled + * 1: canceled by no permission + * 2: canceled by different buffer size + * 3: canceled by potential mismatched status + * + * Blocking function, may sleep + */ +u8 rx_ampdu_apply_sta_tid(_adapter *adapter, struct sta_info *sta, u8 tid, u8 accept, u8 size) +{ + u8 ret = 0; + struct recv_reorder_ctrl *reorder_ctl = &sta->recvreorder_ctrl[tid]; + + if (reorder_ctl->enable == _FALSE) { + if (reorder_ctl->ampdu_size != RX_AMPDU_SIZE_INVALID) { + send_delba_sta_tid_wait_ack(adapter, 0, sta, tid, 1); + ret = 3; + } + goto exit; + } + + if (accept == _FALSE) { + send_delba_sta_tid_wait_ack(adapter, 0, sta, tid, 0); + ret = 1; + } else if (reorder_ctl->ampdu_size != size) { + send_delba_sta_tid_wait_ack(adapter, 0, sta, tid, 0); + ret = 2; + } + +exit: + return ret; +} + +/** + * rx_ampdu_apply_sta - Apply RX AMPDU setting to the specific @sta + * @adapter: the adapter to which @sta belongs + * @sta: the sta to be checked + * @accept: the target permission if RX AMPDU should be set up + * @size: the target RX AMPDU buffer size + * + * Returns: number of the RX AMPDU assciation canceled for applying current target setting + * + * Blocking function, may sleep + */ +u8 rx_ampdu_apply_sta(_adapter *adapter, struct sta_info *sta, u8 accept, u8 size) +{ + u8 change_cnt = 0; + int i; + + for (i = 0; i < TID_NUM; i++) { + if (rx_ampdu_apply_sta_tid(adapter, sta, i, accept, size) != 0) + change_cnt++; + } + + return change_cnt; +} + +/** + * rtw_rx_ampdu_apply - Apply the current target RX AMPDU setting for the specific @adapter + * @adapter: the adapter to be applied + * + * Returns: number of the RX AMPDU assciation canceled for applying current target setting + */ +u16 rtw_rx_ampdu_apply(_adapter *adapter) +{ + u16 adj_cnt = 0; + struct mlme_ext_priv *mlmeext; + struct sta_info *sta; + u8 accept = rtw_rx_ampdu_is_accept(adapter); + u8 size = rtw_rx_ampdu_size(adapter); + + mlmeext = &adapter->mlmeextpriv; + + if (mlmeext_msr(mlmeext) == WIFI_FW_STATION_STATE) { + sta = rtw_get_stainfo(&adapter->stapriv, get_bssid(&adapter->mlmepriv)); + if (sta) + adj_cnt += rx_ampdu_apply_sta(adapter, sta, accept, size); + + } else if (mlmeext_msr(mlmeext) == WIFI_FW_AP_STATE) { + _irqL irqL; + _list *phead, *plist; + u8 peer_num = 0; + char peers[NUM_STA]; + struct sta_priv *pstapriv = &adapter->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; + + sta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + + stainfo_offset = rtw_stainfo_offset(pstapriv, sta); + if (stainfo_offset_valid(stainfo_offset)) + peers[peer_num++] = stainfo_offset; + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + for (i = 0; i < peer_num; i++) { + sta = rtw_get_stainfo_by_offset(pstapriv, peers[i]); + if (sta) + adj_cnt += rx_ampdu_apply_sta(adapter, sta, accept, size); + } + } + + return adj_cnt; +} + unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame) { u8 *addr; @@ -2882,12 +3165,12 @@ unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame) DBG_871X("%s\n", __FUNCTION__); //check RA matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode + if (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN)) return _SUCCESS; /* //check A1 matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) + if (!_rtw_memcmp(adapter_mac_addr(padapter), get_da(pframe), ETH_ALEN)) return _SUCCESS; */ @@ -2929,15 +3212,6 @@ unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame) _rtw_memcpy(&(pmlmeinfo->ADDBA_req), &(frame_body[2]), sizeof(struct ADDBA_request)); //process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), GetAddr3Ptr(pframe)); process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), addr); - - if(pmlmeinfo->bAcceptAddbaReq == _TRUE) - { - issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 0); - } - else - { - issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 37);//reject ADDBA Req - } break; @@ -2982,13 +3256,9 @@ unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame) { tid = (frame_body[3] >> 4) & 0x0F; - preorder_ctrl = &psta->recvreorder_ctrl[tid]; + preorder_ctrl = &psta->recvreorder_ctrl[tid]; preorder_ctrl->enable = _FALSE; - preorder_ctrl->indicate_seq = 0xffff; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq); - #endif + preorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID; } DBG_871X("%s(): DELBA: %x(%x)\n", __FUNCTION__,pmlmeinfo->agg_enable_bitmap, reason_code); @@ -3088,8 +3358,8 @@ void issue_p2p_GO_request(_adapter *padapter, u8* raddr) *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; @@ -3275,7 +3545,7 @@ void issue_p2p_GO_request(_adapter *padapter, u8* raddr) p2pielen += 2; // Value: - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; @@ -3394,7 +3664,7 @@ void issue_p2p_GO_request(_adapter *padapter, u8* raddr) // Value: // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; // Config Method @@ -3536,8 +3806,8 @@ void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint le *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; @@ -3775,7 +4045,7 @@ void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint le p2pielen += 2; // Value: - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; // Channel List @@ -3893,7 +4163,7 @@ void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint le // Value: // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; // Config Method @@ -4011,8 +4281,8 @@ void issue_p2p_GO_confirm(_adapter *padapter, u8* raddr, u8 result) *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; @@ -4287,7 +4557,7 @@ void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ) *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -4374,7 +4644,7 @@ void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ) // Channel Number p2pie[ p2pielen++ ] = pwdinfo->invitereq_info.operating_ch; // operating channel number - if ( _rtw_memcmp( myid( &padapter->eeprompriv ), pwdinfo->invitereq_info.go_bssid, ETH_ALEN ) ) + if (_rtw_memcmp(adapter_mac_addr(padapter), pwdinfo->invitereq_info.go_bssid, ETH_ALEN)) { // P2P Group BSSID // Type: @@ -4524,7 +4794,7 @@ void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ) // Value: // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; // Config Method @@ -4627,7 +4897,7 @@ void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -4732,7 +5002,7 @@ void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken // Value: // P2P Device Address for GO - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; } @@ -4900,7 +5170,7 @@ void issue_p2p_provision_request(_adapter *padapter, u8* pssid, u8 ussidlen, u8* *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, pdev_raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, pdev_raddr, ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -5032,7 +5302,7 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - mac = myid(&(padapter->eeprompriv)); + mac = adapter_mac_addr(padapter); fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; @@ -5191,7 +5461,7 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) // Value: if (pwdinfo->external_uuid == 0) { _rtw_memset( wpsie + wpsielen, 0x0, 16 ); - _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(wpsie + wpsielen, mac, ETH_ALEN); } else { _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 ); } @@ -5374,7 +5644,7 @@ int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - mac = myid(&(padapter->eeprompriv)); + mac = adapter_mac_addr(padapter); fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; @@ -5471,7 +5741,7 @@ int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) // Value: if (pwdinfo->external_uuid == 0) { _rtw_memset( wpsie + wpsielen, 0x0, 16 ); - _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(wpsie + wpsielen, mac, ETH_ALEN); } else { _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 ); } @@ -5978,7 +6248,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); if ( attr_contentlen ) { - if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) ) + if (_rtw_memcmp(group_id.go_device_addr, adapter_mac_addr(padapter), ETH_ALEN)) { // The p2p device sending this p2p invitation request wants this Wi-Fi device to be the persistent GO. rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_GO ); @@ -6053,7 +6323,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); if ( attr_contentlen ) { - if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) ) + if (_rtw_memcmp(group_id.go_device_addr, adapter_mac_addr(padapter), ETH_ALEN)) { // In this case, the GO can't be myself. rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH ); @@ -6119,14 +6389,11 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) if ( attr_content == P2P_STATUS_SUCCESS ) { - if ( _rtw_memcmp( pwdinfo->invitereq_info.go_bssid, myid( &padapter->eeprompriv ), ETH_ALEN )) - { + if (_rtw_memcmp(pwdinfo->invitereq_info.go_bssid, adapter_mac_addr(padapter), ETH_ALEN)) rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO ); - } else - { rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - } + rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_OK ); } else @@ -6262,7 +6529,7 @@ unsigned int on_action_public(_adapter *padapter, union recv_frame *precv_frame) u8 category, action; /* check RA matches or not */ - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN)) + if (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN)) goto exit; category = frame_body[0]; @@ -6291,7 +6558,7 @@ unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame) u8 category, action; /* check RA matches or not */ - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN)) + if (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN)) goto exit; category = frame_body[0]; @@ -6370,7 +6637,7 @@ unsigned int OnAction_vht(_adapter *padapter, union recv_frame *precv_frame) struct sta_info *psta = NULL; /* check RA matches or not */ - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN)) + if (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN)) goto exit; category = frame_body[0]; @@ -6412,7 +6679,7 @@ unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame) 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 + if (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN)) return _SUCCESS; frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); @@ -6785,7 +7052,7 @@ void issue_beacon(_adapter *padapter, int timeout_ms) *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); @@ -7098,7 +7365,7 @@ void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probe pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - mac = myid(&(padapter->eeprompriv)); + mac = adapter_mac_addr(padapter); bssid = cur_network->MacAddress; fctrl = &(pwlanhdr->frame_ctl); @@ -7378,7 +7645,7 @@ int _issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, u8 ch, pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - mac = myid(&(padapter->eeprompriv)); + mac = adapter_mac_addr(padapter); fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; @@ -7543,8 +7810,8 @@ void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status #ifdef CONFIG_NATIVEAP_MLME _rtw_memcpy(pwlanhdr->addr1, psta->hwaddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); // setting auth algo number @@ -7580,7 +7847,7 @@ void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status else { _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); // setting auth algo number @@ -7688,7 +7955,7 @@ void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *p *(fctrl) = 0; _rtw_memcpy((void *)GetAddr1Ptr(pwlanhdr), pstat->hwaddr, ETH_ALEN); - _rtw_memcpy((void *)GetAddr2Ptr(pwlanhdr), myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy((void *)GetAddr2Ptr(pwlanhdr), adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy((void *)GetAddr3Ptr(pwlanhdr), get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); @@ -7904,7 +8171,7 @@ void issue_assocreq(_adapter *padapter) fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -8036,13 +8303,16 @@ void issue_assocreq(_adapter *padapter) } - if (bssrate_len > 8) { + if (bssrate_len > 8) + { pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } else if (bssrate_len > 0) { + } + else if (bssrate_len > 0) + { pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); } else { - DBG_871X("%s: Connect to AP without 11b and 11g data rate!\n", __FUNCTION__); + DBG_871X("%s: Connect to AP without 11b and 11g data rate!\n",__FUNCTION__); } //vendor specific IE, such as WPA, WMM, WPS @@ -8206,7 +8476,7 @@ void issue_assocreq(_adapter *padapter) // Value: // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; // Config Method @@ -8370,7 +8640,7 @@ static int _issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int p } _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -8546,7 +8816,7 @@ static int _issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, i SetAckpolicy(qc, pattrib->ack_policy); _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -8665,7 +8935,7 @@ static int _issue_deauth(_adapter *padapter, unsigned char *da, unsigned short r *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -8777,7 +9047,7 @@ void issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_of *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN); /* RA */ - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); /* TA */ + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); /* TA */ _rtw_memcpy(pwlanhdr->addr3, ra, ETH_ALEN); /* DA = RA */ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -8849,7 +9119,7 @@ void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned ch _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); else _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -8885,16 +9155,30 @@ void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned ch } #endif //CONFIG_IEEE80211W -void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status) +/** + * issue_action_ba - internal function to TX Block Ack action frame + * @padapter: the adapter to TX + * @raddr: receiver address + * @action: Block Ack Action + * @tid: tid + * @size: the announced AMPDU buffer size. used by ADDBA_RESP + * @status: status/reason code. used by ADDBA_RESP, DELBA + * @initiator: if we are the initiator of AMPDU association. used by DELBA + * @wait_ack: used xmit ack + * + * Returns: + * _SUCCESS: No xmit ack is used or acked + * _FAIL: not acked when using xmit ack + */ +static int issue_action_ba(_adapter *padapter, unsigned char *raddr, unsigned char action + , u8 tid, u8 size, u16 status, u8 initiator, int wait_ack) { + int ret = _FAIL; u8 category = RTW_WLAN_CATEGORY_BACK; u16 start_seq; u16 BA_para_set; - u16 reason_code; 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; @@ -8910,9 +9194,7 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act #ifdef CONFIG_80211N_HT if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } + goto exit; //update attribute pattrib = &pmgntframe->attrib; @@ -8928,7 +9210,7 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act //_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -8941,23 +9223,20 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - status = cpu_to_le16(status); - - if (category == 3) { switch (action) { - case 0: //ADDBA req + case RTW_WLAN_ACTION_ADDBA_REQ: do { pmlmeinfo->dialogToken++; } while (pmlmeinfo->dialogToken == 0); pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->dialogToken), &(pattrib->pktlen)); #if defined(CONFIG_RTL8188E) && defined(CONFIG_SDIO_HCI) - BA_para_set = (0x0802 | ((status & 0xf) << 2)); //immediate ack & 16 buffer size + BA_para_set = (0x0802 | ((tid & 0xf) << 2)); /* immediate ack & 16 buffer size */ #else - BA_para_set = (0x1002 | ((status & 0xf) << 2)); //immediate ack & 64 buffer size + BA_para_set = (0x1002 | ((tid & 0xf) << 2)); /* immediate ack & 64 buffer size */ #endif BA_para_set = cpu_to_le16(BA_para_set); @@ -8971,55 +9250,31 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act //if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) if ((psta = rtw_get_stainfo(pstapriv, raddr)) != NULL) { - start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07]&0xfff) + 1; + start_seq = (psta->sta_xmitpriv.txseq_tid[tid & 0x07]&0xfff) + 1; - DBG_871X("BA_starting_seqctrl = %d for TID=%d\n", start_seq, status & 0x07); + DBG_871X("BA_starting_seqctrl = %d for TID=%d\n", start_seq, tid & 0x07); - psta->BA_starting_seqctrl[status & 0x07] = start_seq; + psta->BA_starting_seqctrl[tid & 0x07] = start_seq; BA_starting_seqctrl = start_seq << 4; } 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 + case RTW_WLAN_ACTION_ADDBA_RESP: pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->ADDBA_req.dialog_token), &(pattrib->pktlen)); + status = cpu_to_le16(status); pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&status), &(pattrib->pktlen)); 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_rxbuf_sz = 64; - else if(MAX_AMPDU_FACTOR_32K == max_rx_ampdu_factor) - ba_rxbuf_sz = 32; - else if(MAX_AMPDU_FACTOR_16K == max_rx_ampdu_factor) - ba_rxbuf_sz = 16; - else if(MAX_AMPDU_FACTOR_8K == max_rx_ampdu_factor) - ba_rxbuf_sz = 8; - else - ba_rxbuf_sz = 64; - - #ifdef CONFIG_BT_COEXIST - if (rtw_btcoex_IsBTCoexCtrlAMPDUSize(padapter) == _TRUE) - 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 &= ~IEEE80211_ADDBA_PARAM_TID_MASK; + BA_para_set |= (tid << 2) & IEEE80211_ADDBA_PARAM_TID_MASK; BA_para_set &= ~RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK; - BA_para_set |= (ba_rxbuf_sz << 6) & RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK; + BA_para_set |= (size << 6) & RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK; if (!padapter->registrypriv.wifi_spec) { if(pregpriv->ampdu_amsdu==0)//disabled @@ -9032,17 +9287,17 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act 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; + + case RTW_WLAN_ACTION_DELBA: + BA_para_set = 0; + BA_para_set |= (tid << 12) & IEEE80211_DELBA_PARAM_TID_MASK; + BA_para_set |= (initiator << 11) & IEEE80211_DELBA_PARAM_INITIATOR_MASK; + BA_para_set = cpu_to_le16(BA_para_set); pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); - - 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); + status = cpu_to_le16(status); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(status)), &(pattrib->pktlen)); break; default: break; @@ -9051,8 +9306,130 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act pattrib->last_txcmdsz = pattrib->pktlen; - dump_mgntframe(padapter, pmgntframe); + if (wait_ack) { + ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); + } else { + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; + } + +exit: #endif //CONFIG_80211N_HT + return ret; +} + +/** + * issue_addba_req - TX ADDBA_REQ + * @adapter: the adapter to TX + * @ra: receiver address + * @tid: tid + */ +inline void issue_addba_req(_adapter *adapter, unsigned char *ra, u8 tid) +{ + issue_action_ba(adapter, ra, RTW_WLAN_ACTION_ADDBA_REQ + , tid + , 0 /* unused */ + , 0 /* unused */ + , 0 /* unused */ + , _FALSE + ); + DBG_871X(FUNC_ADPT_FMT" ra="MAC_FMT" tid=%u\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(ra), tid); + +} + +/** + * issue_addba_rsp - TX ADDBA_RESP + * @adapter: the adapter to TX + * @ra: receiver address + * @tid: tid + * @status: status code + * @size: the announced AMPDU buffer size + */ +inline void issue_addba_rsp(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size) +{ + issue_action_ba(adapter, ra, RTW_WLAN_ACTION_ADDBA_RESP + , tid + , size + , status + , 0 /* unused */ + , _FALSE + ); + DBG_871X(FUNC_ADPT_FMT" ra="MAC_FMT" status=%u, tid=%u, size=%u\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(ra), status, tid, size); +} + +/** + * issue_del_ba - TX DELBA + * @adapter: the adapter to TX + * @ra: receiver address + * @tid: tid + * @reason: reason code + * @initiator: if we are the initiator of AMPDU association. used by DELBA + */ +inline void issue_del_ba(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator) +{ + issue_action_ba(adapter, ra, RTW_WLAN_ACTION_DELBA + , tid + , 0 /* unused */ + , reason + , initiator + , _FALSE + ); + DBG_871X(FUNC_ADPT_FMT" ra="MAC_FMT" reason=%u, tid=%u, initiator=%u\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(ra), reason, tid, initiator); +} + +/** + * issue_del_ba_ex - TX DELBA with xmit ack options + * @adapter: the adapter to TX + * @ra: receiver address + * @tid: tid + * @reason: reason code + * @initiator: if we are the initiator of AMPDU association. used by DELBA + * @try_cnt: the max driver level TX count to try + * @wait_ms: the waiting ms for each driver level TX + */ +int issue_del_ba_ex(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator + , int try_cnt, int wait_ms) +{ + int ret; + int i = 0; + u32 start = rtw_get_current_time(); + + do { + ret = issue_action_ba(adapter, ra, RTW_WLAN_ACTION_DELBA + , tid + , 0 /* unused */ + , reason + , initiator + , wait_ms > 0?_TRUE:_FALSE + ); + + i++; + + if (adapter->bDriverStopped || adapter->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) { + DBG_871X(FUNC_ADPT_FMT" ra="MAC_FMT" reason=%u, tid=%u, initiator=%u%s, %d/%d in %u ms\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(ra), reason, tid, initiator + , ret == _SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start)); + } +exit: + return ret; } static void issue_action_BSSCoexistPacket(_adapter *padapter) @@ -9105,7 +9482,7 @@ static void issue_action_BSSCoexistPacket(_adapter *padapter) *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -9266,7 +9643,7 @@ int _issue_action_SM_PS(_adapter *padapter , unsigned char *raddr , u8 NewMimoP *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); /* RA */ - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); /* TA */ + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); /* TA */ _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); /* DA = RA */ SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -9347,62 +9724,101 @@ int issue_action_SM_PS(_adapter *padapter , unsigned char *raddr , u8 NewMimoPs return _issue_action_SM_PS(padapter, raddr, NewMimoPsMode , _FALSE ); } -unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr) +/** + * _send_delba_sta_tid - Cancel the AMPDU association for the specific @sta, @tid + * @adapter: the adapter to which @sta belongs + * @initiator: if we are the initiator of AMPDU association + * @sta: the sta to be checked + * @tid: the tid to be checked + * @force: cancel and send DELBA even when no AMPDU association is setup + * @wait_ack: send delba with xmit ack (valid when initiator == 0) + * + * Returns: + * _FAIL if sta is NULL + * when initiator is 1, always _SUCCESS + * when initiator is 0, _SUCCESS if DELBA is acked + */ +static unsigned int _send_delba_sta_tid(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid + , u8 force, int wait_ack) { - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta = NULL; - //struct recv_reorder_ctrl *preorder_ctrl; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u16 tid; + int ret = _SUCCESS; - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) - return _SUCCESS; - - psta = rtw_get_stainfo(pstapriv, addr); - if(psta==NULL) - return _SUCCESS; + if (sta == NULL) { + ret = _FAIL; + goto exit; + } - //DBG_871X("%s:%s\n", __FUNCTION__, (initiator==0)?"RX_DIR":"TX_DIR"); - - if(initiator==0) // recipient - { - for(tid = 0;tidrecvreorder_ctrl[tid].enable == _TRUE) - { - DBG_871X("rx agg disable tid(%d)\n",tid); - issue_action_BA(padapter, addr, RTW_WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F)); - psta->recvreorder_ctrl[tid].enable = _FALSE; - psta->recvreorder_ctrl[tid].indicate_seq = 0xffff; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, - psta->recvreorder_ctrl[tid].indicate_seq); - #endif - } + if (initiator == 0) { + /* recipient */ + if (force || sta->recvreorder_ctrl[tid].enable == _TRUE) { + u8 ampdu_size_bak = sta->recvreorder_ctrl[tid].ampdu_size; + + sta->recvreorder_ctrl[tid].enable = _FALSE; + sta->recvreorder_ctrl[tid].ampdu_size = RX_AMPDU_SIZE_INVALID; + + if (rtw_del_rx_ampdu_test_trigger_no_tx_fail()) + ret = _FAIL; + else if (wait_ack) + ret = issue_del_ba_ex(adapter, sta->hwaddr, tid, 37, initiator, 3, 1); + else + issue_del_ba(adapter, sta->hwaddr, tid, 37, initiator); + + if (ret == _FAIL && sta->recvreorder_ctrl[tid].enable == _FALSE) + sta->recvreorder_ctrl[tid].ampdu_size = ampdu_size_bak; } - } - else if(initiator == 1)// originator - { + } else if (initiator == 1) { + /* originator */ #ifdef CONFIG_80211N_HT - //DBG_871X("tx agg_enable_bitmap(0x%08x)\n", psta->htpriv.agg_enable_bitmap); - for(tid = 0;tidhtpriv.agg_enable_bitmap & BIT(tid)) - { - DBG_871X("tx agg disable tid(%d)\n",tid); - issue_action_BA(padapter, addr, RTW_WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F) ); - psta->htpriv.agg_enable_bitmap &= ~BIT(tid); - psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); - - } + if (force || sta->htpriv.agg_enable_bitmap & BIT(tid)) { + sta->htpriv.agg_enable_bitmap &= ~BIT(tid); + sta->htpriv.candidate_tid_bitmap &= ~BIT(tid); + issue_del_ba(adapter, sta->hwaddr, tid, 37, initiator); } -#endif //CONFIG_80211N_HT +#endif } - + +exit: + return ret; +} + +inline unsigned int send_delba_sta_tid(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid + , u8 force) +{ + return _send_delba_sta_tid(adapter, initiator, sta, tid, force, 0); +} + +inline unsigned int send_delba_sta_tid_wait_ack(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid + , u8 force) +{ + return _send_delba_sta_tid(adapter, initiator, sta, tid, force, 1); +} + +unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta = NULL; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u16 tid; + + if ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) + return _SUCCESS; + + psta = rtw_get_stainfo(pstapriv, addr); + if(psta==NULL) + return _SUCCESS; + + #if 0 + DBG_871X("%s:%s\n", __func__, (initiator == 0)?"RX_DIR":"TX_DIR"); + if (initiator == 1) /* originator */ + DBG_871X("tx agg_enable_bitmap(0x%08x)\n", psta->htpriv.agg_enable_bitmap); + #endif + + for (tid = 0; tid < TID_NUM; tid++) + send_delba_sta_tid(padapter, initiator, psta, tid, 0); + return _SUCCESS; - } unsigned int send_beacon(_adapter *padapter) @@ -9501,7 +9917,7 @@ void site_survey(_adapter *padapter) RT_SCAN_TYPE ScanType = SCAN_PASSIVE; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u32 initialgain = 0; + u8 initialgain = 0; u32 channel_scan_time_ms = 0,val32 = 0; #ifdef CONFIG_P2P @@ -9603,12 +10019,17 @@ void site_survey(_adapter *padapter) } else { pmlmeinfo->backop_cnt++; set_survey_timer(pmlmeext, pmlmeext->chan_scan_time); - return; + return; } } else { - pmlmeinfo->scan_cnt++; } + } else { + if (pmlmeinfo->backop_cnt > 0) { + stay_buddy_ch = 2; + pmlmeinfo->scan_cnt = 1; + pmlmeinfo->backop_cnt = 0; + } } #endif if(pmlmeext->sitesurvey_res.channel_idx == 0) @@ -9726,8 +10147,8 @@ void site_survey(_adapter *padapter) if (rtw_get_ch_setting_union(padapter, &cur_channel, &cur_bwmode, &cur_ch_offset) != 0) { if (0) - DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n", - FUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset); + DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n", + FUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset); } #ifdef CONFIG_IOCTL_CFG80211 else if(padapter->pbuddy_adapter @@ -9773,7 +10194,6 @@ void site_survey(_adapter *padapter) //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)); @@ -9831,9 +10251,6 @@ void site_survey(_adapter *padapter) #ifdef CONFIG_CONCURRENT_MODE set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); #else -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_set_channel_bwmode_survey_done(padapter); -#else #ifdef CONFIG_P2P if( (pwdinfo->driver_interface == DRIVER_WEXT) && (rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN)) ) @@ -9842,7 +10259,6 @@ void site_survey(_adapter *padapter) #endif //CONFIG_P2P set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); -#endif //CONFIG_DUALMAC_CONCURRENT #endif //CONFIG_CONCURRENT_MODE } @@ -9855,7 +10271,6 @@ void site_survey(_adapter *padapter) //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)); @@ -10254,6 +10669,7 @@ void start_clnt_join(_adapter* padapter) 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); @@ -10291,8 +10707,6 @@ void start_clnt_join(_adapter* padapter) for (pos = get_next(head);!rtw_end_of_queue_search(head, pos); pos = get_next(pos)) { scanned = LIST_CONTAINOR(pos, struct wlan_network, list); - if(scanned==NULL) - rtw_warn_on(1); if (_rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE && _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE @@ -10388,7 +10802,6 @@ unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsi struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - //check A3 if (!(_rtw_memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) return _SUCCESS; @@ -10576,7 +10989,7 @@ static void process_80211d(PADAPTER padapter, WLAN_BSSID_EX *bssid) if (pregistrypriv->wireless_mode & WIRELESS_11A) { do { - if ((i == MAX_CHANNEL_NUM) || + if ((i >= MAX_CHANNEL_NUM) || (chplan_sta[i].ChannelNum == 0)) break; @@ -11246,21 +11659,19 @@ static void rtw_mlmeext_disconnect(_adapter *padapter) } } -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_set_channel_bwmode_disconnect(padapter); -#else //!CONFIG_DUALMAC_CONCURRENT #ifdef CONFIG_CONCURRENT_MODE if((check_buddy_fwstate(padapter, _FW_LINKED)) != _TRUE) +#endif //CONFIG_CONCURRENT_MODE { -#endif //CONFIG_CONCURRENT_MODE + //switch to the 20M Hz mode after disconnect pmlmeext->cur_bwmode = CHANNEL_WIDTH_20; pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); -#ifdef CONFIG_CONCURRENT_MODE } -#endif //CONFIG_CONCURRENT_MODE + + #ifdef CONFIG_FCS_MODE else { @@ -11279,7 +11690,6 @@ static void rtw_mlmeext_disconnect(_adapter *padapter) } } #endif //!CONFIG_FCS_MODE -#endif //!CONFIG_DUALMAC_CONCURRENT flush_all_cam_entry(padapter); @@ -11290,6 +11700,16 @@ static void rtw_mlmeext_disconnect(_adapter *padapter) pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0; pmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0; +#ifdef CONFIG_TDLS + padapter->tdlsinfo.ap_prohibited = _FALSE; + + /* For TDLS channel switch, currently we only allow it to work in wifi logo test mode */ + if (padapter->registrypriv.wifi_spec == 1) + { + padapter->tdlsinfo.ch_switch_prohibited = _FALSE; + } +#endif /* CONFIG_TDLS */ + } void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) @@ -11318,7 +11738,7 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) //turn on dynamic functions - Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); + /* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); */ // update IOT-releated issue update_IOT_info(padapter); @@ -11393,9 +11813,6 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) exit_mlmeext_joinbss_event_callback: -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_handle_join_done(padapter, join_res); -#endif #ifdef CONFIG_CONCURRENT_MODE concurrent_chk_joinbss_done(padapter, join_res); #endif @@ -11485,7 +11902,7 @@ void _linked_info_dump(_adapter *padapter) int i; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - int UndecoratedSmoothedPWDB; + int UndecoratedSmoothedPWDB = 0; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); @@ -11660,8 +12077,7 @@ struct candidate_pool{ for(i=0; i< num_checkalive; i++) { #ifdef CONFIG_XMIT_ACK - //TDLS: Should we set wait_ms to 300 for keeping alive? - ack_chk = issue_nulldata_to_TDLS_peer_STA(padapter, checkalive[i].addr, 0, 3, 300); + ack_chk = issue_nulldata_to_TDLS_peer_STA(padapter, checkalive[i].addr, 0, 3, 500); if(ack_chk == _SUCCESS) { @@ -11735,13 +12151,16 @@ void linked_status_chk(_adapter *padapter, u8 from_timer) 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. - // todo: To check why we under miracast session, rx_chk would be _FALSE - //#ifdef CONFIG_INTEL_WIDI - //if (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_NONE) - // rx_chk_limit = 1; - //#endif +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW + if (ATOMIC_READ(&padapter->tdlsinfo.chsw_info.chsw_on) == _TRUE) + return; +#endif /* CONFIG_TDLS_CH_SW */ + +#ifdef CONFIG_TDLS_AUTOCHECKALIVE + linked_status_chk_tdls(padapter); +#endif /* CONFIG_TDLS_AUTOCHECKALIVE */ +#endif /* CONFIG_TDLS */ if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) { @@ -11825,10 +12244,6 @@ void linked_status_chk(_adapter *padapter, u8 from_timer) } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) -#if defined (CONFIG_TDLS) && defined (CONFIG_TDLS_AUTOCHECKALIVE) - linked_status_chk_tdls(padapter); -#endif //CONFIG_TDLS - } else if (is_client_associated_to_ibss(padapter)) { @@ -12241,6 +12656,8 @@ u8 setopmode_hdl(_adapter *padapter, u8 *pbuf) else if(psetop->mode == Ndis802_11IBSS) { type = _HW_STATE_ADHOC_; + } else if (psetop->mode == Ndis802_11Monitor) { + type = _HW_STATE_MONITOR_; } else { @@ -12290,7 +12707,7 @@ u8 createbss_hdl(_adapter *padapter, u8 *pbuf) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; - //u32 initialgain; + //u8 initialgain; #ifdef CONFIG_AP_MODE if (pmlmeinfo->state == WIFI_FW_AP_STATE) { @@ -12358,7 +12775,7 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) #endif //CONFIG_ANTENNA_DIVERSITY u32 i; u8 cbw40_enable=0; - //u32 initialgain; + //u8 initialgain; //u32 acparm; u8 ch, bw, offset; @@ -12412,7 +12829,11 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength return H2C_PARAMETERS_ERROR; - + + if (pnetwork->IELength < 2) { + report_join_res(padapter, (-4)); + return H2C_SUCCESS; + } _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; @@ -12422,8 +12843,7 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) //pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->IEs, pnetwork->IELength); //sizeof(NDIS_802_11_FIXED_IEs) - for (i = _FIXED_IE_LENGTH_; i < pnetwork->IELength;) - { + for (i = _FIXED_IE_LENGTH_ ; i < pnetwork->IELength - 2 ;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); switch (pIE->ElementID) @@ -12444,9 +12864,6 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) pmlmeinfo->HT_info_enable = 1; //spec case only for cisco's ap because cisco's ap issue assoc rsp using mcs rate @40MHz or @20MHz -//#if !defined(CONFIG_CONCURRENT_MODE) && !defined(CONFIG_DUALMAC_CONCURRENT) -// if(pmlmeinfo->assoc_AP_vendor == ciscoAP) -//#endif { struct HT_info_element *pht_info = (struct HT_info_element *)(pIE->data); @@ -12534,17 +12951,10 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) #endif /* check channel, bandwidth, offset and switch */ -#ifdef CONFIG_DUALMAC_CONCURRENT - if(dc_handle_join_request(padapter, &ch, &bw, &offset) == _FAIL) { - DBG_871X("dc_handle_join_request fail !!!\n"); - return H2C_SUCCESS; - } -#else //NON CONFIG_DUALMAC_CONCURRENT if(rtw_chk_start_clnt_join(padapter, &ch, &bw, &offset) == _FAIL) { report_join_res(padapter, (-4)); return H2C_SUCCESS; } -#endif //disable dynamic functions, such as high power, DIG //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); @@ -12709,7 +13119,8 @@ exit: return ret_num; } -static int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out, u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num) +static int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out, + u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num) { int i, j; int scan_ch_num = 0; @@ -12724,7 +13135,7 @@ static int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel for (i=0;ichannel_set, in[i].hw_value)) >=0 @@ -12753,7 +13164,7 @@ static int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel for (i=0;imax_chan_nums;i++) { if (0) - DBG_871X(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter), pmlmeext->channel_set[i].ChannelNum); + DBG_871X(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter), pmlmeext->channel_set[i].ChannelNum); if (rtw_mlme_band_check(padapter, pmlmeext->channel_set[i].ChannelNum) == _TRUE) { @@ -12785,7 +13196,7 @@ u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf; u8 bdelayscan = _FALSE; u8 val8; - u32 initialgain; + u8 initialgain; u32 i; struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; @@ -12828,10 +13239,6 @@ u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) pmlmeext->sitesurvey_res.scan_mode = pparm->scan_mode; -#ifdef CONFIG_DUALMAC_CONCURRENT - bdelayscan = dc_handle_site_survey(padapter); -#endif - //issue null data if associating to the AP if (is_client_associated_to_ap(padapter) == _TRUE) { @@ -12967,7 +13374,7 @@ u8 setkey_hdl(_adapter *padapter, u8 *pbuf) #endif //allow multicast packets to driver - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ON_RCR_AM, null_addr); + rtw_hal_set_hwreg(padapter, HW_VAR_ON_RCR_AM, null_addr); return H2C_SUCCESS; } @@ -12982,9 +13389,6 @@ u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf) struct set_stakey_parm *pparm = (struct set_stakey_parm *)pbuf; struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info *psta; -#ifdef CONFIG_TDLS - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; -#endif //CONFIG_TDLS if(pparm->algorithm == _NO_PRIVACY_) goto write_to_cam; @@ -13038,7 +13442,7 @@ u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf) //pmlmeinfo->ADDBA_retry_count = 0; //pmlmeinfo->candidate_tid_bitmap |= (0x1 << pparm->tid); //psta->htpriv.candidate_tid_bitmap |= BIT(pparm->tid); - issue_action_BA(padapter, pparm->addr, RTW_WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid); + issue_addba_req(padapter, pparm->addr, (u8)pparm->tid); //_set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO); _set_timer(&psta->addba_retry_timer, ADDBA_TO); } @@ -13047,8 +13451,7 @@ u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf) (psta->htpriv.ht_option==_TRUE) && (psta->htpriv.ampdu_enable==_TRUE) ) { - issue_action_BA(padapter, pparm->addr, RTW_WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid); - //_set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO); + issue_addba_req(padapter, pparm->addr, (u8)pparm->tid); _set_timer(&psta->addba_retry_timer, ADDBA_TO); } #endif //CONFIG @@ -13343,572 +13746,6 @@ void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork) } } -#ifdef CONFIG_DUALMAC_CONCURRENT -void dc_SelectChannel(_adapter *padapter, unsigned char channel) -{ - PADAPTER ptarget_adapter; - - if( (padapter->pbuddy_adapter != NULL) && - (padapter->DualMacConcurrent == _TRUE) && - (padapter->adapter_type == SECONDARY_ADAPTER)) - { - // only mac0 could control BB&RF - ptarget_adapter = padapter->pbuddy_adapter; - } - else - { - ptarget_adapter = padapter; - } - - _enter_critical_mutex(&(adapter_to_dvobj(ptarget_adapter)->setch_mutex), NULL); - - rtw_hal_set_chan(ptarget_adapter, channel); - - _exit_critical_mutex(&(adapter_to_dvobj(ptarget_adapter)->setch_mutex), NULL); -} - -void dc_SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset) -{ - PADAPTER ptarget_adapter; - - if( (padapter->pbuddy_adapter != NULL) && - (padapter->DualMacConcurrent == _TRUE) && - (padapter->adapter_type == SECONDARY_ADAPTER)) - { - // only mac0 could control BB&RF - ptarget_adapter = padapter->pbuddy_adapter; - } - else - { - ptarget_adapter = padapter; - } - - _enter_critical_mutex(&(adapter_to_dvobj(ptarget_adapter)->setbw_mutex), NULL); - - rtw_hal_set_bwmode(ptarget_adapter, (CHANNEL_WIDTH)bwmode, channel_offset); - - _exit_critical_mutex(&(adapter_to_dvobj(ptarget_adapter)->setbw_mutex), NULL); -} - -void dc_set_channel_bwmode_disconnect(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_priv *pbuddy_mlmepriv = NULL; - - if(pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - { - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - if((check_fwstate(pbuddy_mlmepriv, _FW_LINKED)) != _TRUE) - { - //switch to the 20M Hz mode after disconnect - pmlmeext->cur_bwmode = CHANNEL_WIDTH_20; - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - } - } - else - { - //switch to the 20M Hz mode after disconnect - pmlmeext->cur_bwmode = CHANNEL_WIDTH_20; - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - } -} - -u8 dc_handle_join_request(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = NULL; - struct mlme_priv *pbuddy_mlmepriv = NULL; - u8 ret = _SUCCESS; - - if(pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - { - pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - - if(pmlmeext->cur_channel != pbuddy_mlmeext->cur_channel || - pmlmeext->cur_bwmode != pbuddy_mlmeext->cur_bwmode || - pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset) - { - if((check_fwstate(pbuddy_mlmepriv, WIFI_AP_STATE)) == _TRUE) - { - //issue deauth to all stas if if2 is at ap mode - rtw_sta_flush(pbuddy_adapter); - - //rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0); - rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_CHECK_TXBUF, 0); - } - else if(check_fwstate(pbuddy_mlmepriv, _FW_LINKED) == _TRUE) - { - if(pmlmeext->cur_channel == pbuddy_mlmeext->cur_channel) - { - // CHANNEL_WIDTH_40 or CHANNEL_WIDTH_20 but channel offset is different - if((pmlmeext->cur_bwmode == pbuddy_mlmeext->cur_bwmode) && - (pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset) ) - { - report_join_res(padapter, -4); - ret = _FAIL; - } - } - else - { - report_join_res(padapter, -4); - ret = _FAIL; - } - } - } - else if (is_client_associated_to_ap(pbuddy_adapter) == _TRUE) - { - issue_nulldata(pbuddy_adapter, NULL, 1, 0, 0); - } - } - - if (!ch || !bw || !offset) { - rtw_warn_on(1); - ret = _FAIL; - } - - if (ret == _SUCCESS) { - *ch = pmlmeext->cur_channel; - *bw = pmlmeext->cur_bwmode; - *offset = pmlmeext->cur_ch_offset; - } - -exit: - return ret; -} - -void dc_handle_join_done(_adapter *padapter, u8 join_res) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_priv *pbuddy_mlmepriv = NULL; - struct mlme_ext_priv *pbuddy_mlmeext = NULL; - struct mlme_ext_info *pbuddy_mlmeinfo = NULL; - WLAN_BSSID_EX *pbuddy_network_mlmeext = NULL; - u8 change_band = _FALSE; - - - if(pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - { - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - pbuddy_mlmeinfo = &(pbuddy_mlmeext->mlmext_info); - pbuddy_network_mlmeext = &(pbuddy_mlmeinfo->network); - - if(((pbuddy_mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) && - check_fwstate(pbuddy_mlmepriv, _FW_LINKED)) - { - //restart and update beacon - DBG_871X("after join, current adapter, CH=%d, BW=%d, offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); - - if(join_res >= 0) - { - u8 *p; - int ie_len; - struct HT_info_element *pht_info=NULL; - - if((pbuddy_mlmeext->cur_channel <= 14 && pmlmeext->cur_channel >= 36) || - (pbuddy_mlmeext->cur_channel >= 36 && pmlmeext->cur_channel <= 14)) - { - change_band = _TRUE; - } - - //sync channel/bwmode/ch_offset with another adapter - pbuddy_mlmeext->cur_channel = pmlmeext->cur_channel; - - if(pbuddy_mlmeext->cur_bwmode == CHANNEL_WIDTH_40) - { - p = rtw_get_ie((pbuddy_network_mlmeext->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pbuddy_network_mlmeext->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if( p && ie_len) - { - pht_info = (struct HT_info_element *)(p+2); - pht_info->infos[0] &= ~(BIT(0)|BIT(1)); //no secondary channel is present - } - - if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40) - { - pbuddy_mlmeext->cur_ch_offset = pmlmeext->cur_ch_offset; - - //to update cur_ch_offset value in beacon - if( pht_info ) - { - switch(pmlmeext->cur_ch_offset) - { - case HAL_PRIME_CHNL_OFFSET_LOWER: - pht_info->infos[0] |= 0x1; - break; - case HAL_PRIME_CHNL_OFFSET_UPPER: - pht_info->infos[0] |= 0x3; - break; - case HAL_PRIME_CHNL_OFFSET_DONT_CARE: - default: - break; - } - } - } - else if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_20) - { - pbuddy_mlmeext->cur_bwmode = CHANNEL_WIDTH_20; - pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - if(pmlmeext->cur_channel>0 && pmlmeext->cur_channel<5) - { - if(pht_info) - pht_info->infos[0] |= 0x1; - - pbuddy_mlmeext->cur_bwmode = CHANNEL_WIDTH_40; - pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - } - - if(pmlmeext->cur_channel>7 && pmlmeext->cur_channel<(14+1)) - { - if(pht_info) - pht_info->infos[0] |= 0x3; - - pbuddy_mlmeext->cur_bwmode = CHANNEL_WIDTH_40; - pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - } - - set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); - } - } - - // to update channel value in beacon - pbuddy_network_mlmeext->Configuration.DSConfig = pmlmeext->cur_channel; - p = rtw_get_ie((pbuddy_network_mlmeext->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pbuddy_network_mlmeext->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if(p && ie_len>0) - *(p + 2) = pmlmeext->cur_channel; - - p = rtw_get_ie((pbuddy_network_mlmeext->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pbuddy_network_mlmeext->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if( p && ie_len) - { - pht_info = (struct HT_info_element *)(p+2); - pht_info->primary_channel = pmlmeext->cur_channel; - } - - // update mlmepriv's cur_network - _rtw_memcpy(&pbuddy_mlmepriv->cur_network.network, pbuddy_network_mlmeext, pbuddy_network_mlmeext->Length); - } - else - { - // switch back to original channel/bwmode/ch_offset; - set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); - } - - DBG_871X("after join, another adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset); - - if(change_band == _TRUE) - change_band_update_ie(pbuddy_adapter, pbuddy_network_mlmeext); - - DBG_871X("update pbuddy_adapter's beacon\n"); - - update_beacon(pbuddy_adapter, 0, NULL, _TRUE); - } - else if (is_client_associated_to_ap(pbuddy_adapter) == _TRUE) - { - if((pbuddy_mlmeext->cur_bwmode == CHANNEL_WIDTH_40) && - (pmlmeext->cur_bwmode == CHANNEL_WIDTH_20)) - { - set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); - } - - issue_nulldata(pbuddy_adapter, NULL, 0, 0, 0); - } - } -} - -sint dc_check_fwstate(_adapter *padapter, sint fw_state) -{ - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_priv *pbuddy_mlmepriv = NULL; - - if(padapter->pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - - { - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - - return check_fwstate(pbuddy_mlmepriv, fw_state); - } - - return _FALSE; -} - -u8 dc_handle_site_survey(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - - // only mac0 can do scan request, help issue nulldata(1) for mac1 - if(pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - { - if (is_client_associated_to_ap(pbuddy_adapter) == _TRUE) - { - pmlmeext->sitesurvey_res.state = SCAN_TXNULL; - - issue_nulldata(pbuddy_adapter, NULL, 1, 2, 0); - - return _TRUE; - } - } - - return _FALSE; -} - -void dc_report_survey_event(_adapter *padapter, union recv_frame *precv_frame) -{ - if(padapter->pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - { - report_survey_event(padapter->pbuddy_adapter, precv_frame); - } -} - -void dc_set_channel_bwmode_survey_done(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_priv *pbuddy_mlmepriv = NULL; - struct mlme_ext_priv *pbuddy_mlmeext = NULL; - struct mlme_ext_info *pbuddy_mlmeinfo = NULL; - u8 cur_channel; - u8 cur_bwmode; - u8 cur_ch_offset; - - if(pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - { - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - pbuddy_mlmeinfo = &(pbuddy_mlmeext->mlmext_info); - - if(check_fwstate(pbuddy_mlmepriv, _FW_LINKED)) - { - if(check_fwstate(pmlmepriv, _FW_LINKED) && - (pmlmeext->cur_bwmode == CHANNEL_WIDTH_40)) - { - cur_channel = pmlmeext->cur_channel; - cur_bwmode = pmlmeext->cur_bwmode; - cur_ch_offset = pmlmeext->cur_ch_offset; - } - else - { - cur_channel = pbuddy_mlmeext->cur_channel; - cur_bwmode = pbuddy_mlmeext->cur_bwmode; - cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; - } - } - else - { - cur_channel = pmlmeext->cur_channel; - cur_bwmode = pmlmeext->cur_bwmode; - cur_ch_offset = pmlmeext->cur_ch_offset; - } - - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); - - if (is_client_associated_to_ap(pbuddy_adapter) == _TRUE) - { - //issue null data - issue_nulldata(pbuddy_adapter, NULL, 0, 0, 0); - } - - if(((pbuddy_mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) && - check_fwstate(pbuddy_mlmepriv, _FW_LINKED)) - { - - DBG_871X("survey done, current CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); - - DBG_871X("restart pbuddy_adapter's beacon\n"); - - update_beacon(pbuddy_adapter, 0, NULL, _TRUE); - } - } - else - { - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - } -} - -void dc_set_ap_channel_bandwidth(_adapter *padapter, u8 channel, u8 channel_offset, u8 bwmode) -{ - u8 *p; - u8 val8, cur_channel, cur_bwmode, cur_ch_offset, change_band; - int ie_len; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct HT_info_element *pht_info=NULL; - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_priv *pbuddy_mlmepriv = NULL; - struct mlme_ext_priv *pbuddy_mlmeext = NULL; - - DBG_871X("dualmac_concurrent_ap_set_channel_bwmode ==>\n"); - - cur_channel = channel; - cur_bwmode = bwmode; - cur_ch_offset = channel_offset; - change_band = _FALSE; - - p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if( p && ie_len) - { - pht_info = (struct HT_info_element *)(p+2); - } - - if(pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - { - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - if(!check_fwstate(pbuddy_mlmepriv, _FW_LINKED|_FW_UNDER_LINKING|_FW_UNDER_SURVEY)) - { - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); - } - else if(check_fwstate(pbuddy_mlmepriv, _FW_LINKED)==_TRUE) - { - //To sync cur_channel/cur_bwmode/cur_ch_offset with another adapter - DBG_871X("Another iface is at linked state, sync cur_channel/cur_bwmode/cur_ch_offset\n"); - DBG_871X("Another adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset); - DBG_871X("Current adapter, CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); - - cur_channel = pbuddy_mlmeext->cur_channel; - if(cur_bwmode == CHANNEL_WIDTH_40) - { - if(pht_info) - pht_info->infos[0] &= ~(BIT(0)|BIT(1)); - - if(pbuddy_mlmeext->cur_bwmode == CHANNEL_WIDTH_40) - { - cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; - - //to update cur_ch_offset value in beacon - if(pht_info) - { - switch(cur_ch_offset) - { - case HAL_PRIME_CHNL_OFFSET_LOWER: - pht_info->infos[0] |= 0x1; - break; - case HAL_PRIME_CHNL_OFFSET_UPPER: - pht_info->infos[0] |= 0x3; - break; - case HAL_PRIME_CHNL_OFFSET_DONT_CARE: - default: - break; - } - } - } - else if(pbuddy_mlmeext->cur_bwmode == CHANNEL_WIDTH_20) - { - cur_bwmode = CHANNEL_WIDTH_20; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - if(cur_channel>0 && cur_channel<5) - { - if(pht_info) - pht_info->infos[0] |= 0x1; - - cur_bwmode = CHANNEL_WIDTH_40; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - } - - if(cur_channel>7 && cur_channel<(14+1)) - { - if(pht_info) - pht_info->infos[0] |= 0x3; - - cur_bwmode = CHANNEL_WIDTH_40; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - } - - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); - } - } - - // to update channel value in beacon - pnetwork->Configuration.DSConfig = cur_channel; - p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if(p && ie_len>0) - *(p + 2) = cur_channel; - - if(pht_info) - pht_info->primary_channel = cur_channel; - } - } - else - { - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); - } - - DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); - - if((channel <= 14 && cur_channel >= 36) || - (channel >= 36 && cur_channel <= 14)) - { - change_band = _TRUE; - } - - pmlmeext->cur_channel = cur_channel; - pmlmeext->cur_bwmode = cur_bwmode; - pmlmeext->cur_ch_offset = cur_ch_offset; - - if(change_band == _TRUE) - change_band_update_ie(padapter, pnetwork); - - DBG_871X("dualmac_concurrent_ap_set_channel_bwmode <==\n"); -} - -void dc_resume_xmit(_adapter *padapter) -{ - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - - if(pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - { - DBG_871X("dc_resume_xmit, resume pbuddy_adapter Tx\n"); - rtw_os_xmit_schedule(pbuddy_adapter); - } -} - -u8 dc_check_xmit(_adapter *padapter) -{ - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_priv *pbuddy_mlmepriv = NULL; - - if(pbuddy_adapter != NULL && - padapter->DualMacConcurrent == _TRUE) - { - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - if (check_fwstate(pbuddy_mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) - { - DBG_871X("dc_check_xmit pbuddy_adapter is under survey or under linking\n"); - return _FALSE; - } - } - - return _TRUE; -} -#endif - #ifdef CONFIG_CONCURRENT_MODE sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state) { @@ -14216,7 +14053,23 @@ int rtw_chk_start_clnt_join(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset) struct mlme_ext_priv *pbuddy_mlmeext; struct mlme_ext_info *pbuddy_pmlmeinfo; struct mlme_priv *pbuddy_mlmepriv; +#endif + + if (!ch || !bw || !offset) { + connect_allow = _FALSE; + rtw_warn_on(1); + goto exit; + } + if (cur_ch == 0) { + connect_allow = _FALSE; + DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" cur_ch:%u\n" + , FUNC_ADPT_ARG(padapter), cur_ch); + rtw_warn_on(1); + goto exit; + } + +#ifdef CONFIG_CONCURRENT_MODE if (!rtw_buddy_adapter_up(padapter)) { goto exit; } @@ -14350,13 +14203,9 @@ int rtw_chk_start_clnt_join(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset) } } -exit: #endif /* CONFIG_CONCURRENT_MODE */ - if (!ch || !bw || !offset) { - rtw_warn_on(1); - connect_allow = _FALSE; - } +exit: if (connect_allow == _TRUE) { DBG_871X("start_join_set_ch_bw: ch=%d, bwmode=%d, ch_offset=%d\n", cur_ch, cur_bw, cur_ch_offset); @@ -14531,201 +14380,171 @@ u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf) } -// TDLS_ESTABLISHED : write RCR DATA BIT -// TDLS_CS_OFF : go back to the channel linked with AP, terminating channel switch procedure -// TDLS_INIT_CH_SEN : init channel sensing, receive all data and mgnt frame -// TDLS_DONE_CH_SEN: channel sensing and report candidate channel -// TDLS_OFF_CH : first time set channel to off channel -// TDLS_BASE_CH : go back tp the channel linked with AP when set base channel as target channel -// TDLS_P_OFF_CH : periodically go to off channel -// TDLS_P_BASE_CH : periodically go back to base channel -// TDLS_RS_RCR : restore RCR -// TDLS_TEAR_STA : free tdls sta u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) { #ifdef CONFIG_TDLS _irqL irqL; struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; +#ifdef CONFIG_TDLS_CH_SW + struct tdls_ch_switch *pchsw_info = &ptdlsinfo->chsw_info; +#endif struct TDLSoption_param *TDLSoption; - struct sta_info *ptdls_sta; + struct sta_info *ptdls_sta = NULL; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; u8 survey_channel, i, min, option; + struct tdls_txmgmt txmgmt; + u32 setchtime, resp_sleep = 0, wait_time; + u8 zaddr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - if(!pbuf) + if (!pbuf) return H2C_PARAMETERS_ERROR; TDLSoption = (struct TDLSoption_param *)pbuf; - - ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), TDLSoption->addr ); option = TDLSoption->option; - if( ptdls_sta == NULL ) - { - if( option != TDLS_RS_RCR ) + if (!_rtw_memcmp(TDLSoption->addr, zaddr, ETH_ALEN)) { + ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), TDLSoption->addr ); + if (ptdls_sta == NULL) { + return H2C_REJECTED; + } + } else { + if (!(option == TDLS_RS_RCR || option == TDLS_CH_SW_BACK)) return H2C_REJECTED; } //_enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); - DBG_871X("[%s] option:%d\n", __FUNCTION__, option); + //DBG_871X("[%s] option:%d\n", __FUNCTION__, option); - switch(option){ - case TDLS_ESTABLISHED: - { - u8 sta_band = 0; - - //leave ALL PS when TDLS is established + switch (option) { + case TDLS_ESTABLISHED: + { + /* As long as TDLS handshake success, we should set RCR_CBSSID_DATA bit to 0 */ + /* So we can receive all kinds of data frames. */ + u8 sta_band = 0; + + //leave ALL PS when TDLS is established rtw_pwr_wakeup(padapter); + + rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_WRCR, 0); + DBG_871X("Created Direct Link with "MAC_FMT"\n", MAC_ARG(ptdls_sta->hwaddr)); + + pmlmeinfo->FW_sta_info[ptdls_sta->mac_id].psta = ptdls_sta; + /* Set TDLS sta rate. */ + /* Update station supportRate */ + rtw_hal_update_sta_rate_mask(padapter, ptdls_sta); + if (pmlmeext->cur_channel > 14) { + if (ptdls_sta->ra_mask & 0xffff000) + sta_band |= WIRELESS_11_5N ; + + if (ptdls_sta->ra_mask & 0xff0) + sta_band |= WIRELESS_11A; + + /* 5G band */ + #ifdef CONFIG_80211AC_VHT + if (ptdls_sta->vhtpriv.vht_option) + sta_band = WIRELESS_11_5AC; + #endif - //As long as TDLS handshake success, we should set RCR_CBSSID_DATA bit to 0 - //so we can receive all kinds of data frames. - rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_WRCR, 0); - DBG_871X("Created Direct Link with "MAC_FMT"\n", MAC_ARG(ptdls_sta->hwaddr)); - - pmlmeinfo->FW_sta_info[ptdls_sta->mac_id].psta = ptdls_sta; - //set TDLS sta rate. - //update station supportRate - rtw_hal_update_sta_rate_mask(padapter, ptdls_sta); - if(padapter->mlmeextpriv.cur_channel > 14) { - if (ptdls_sta->ra_mask & 0xffff000) - sta_band |= WIRELESS_11_5N ; - - if (ptdls_sta->ra_mask & 0xff0) - sta_band |= WIRELESS_11A; - - // 5G band - #ifdef CONFIG_80211AC_VHT - if (ptdls_sta->vhtpriv.vht_option) { - sta_band = WIRELESS_11_5AC; - } - #endif - - } else { - if (ptdls_sta->ra_mask & 0xffff000) - sta_band |= WIRELESS_11_24N; + } else { + if (ptdls_sta->ra_mask & 0xffff000) + sta_band |= WIRELESS_11_24N; - if (ptdls_sta->ra_mask & 0xff0) - sta_band |= WIRELESS_11G; + if (ptdls_sta->ra_mask & 0xff0) + sta_band |= WIRELESS_11G; - if (ptdls_sta->ra_mask & 0x0f) - sta_band |= WIRELESS_11B; - } - ptdls_sta->wireless_mode = sta_band; - ptdls_sta->raid = rtw_hal_networktype_to_raid(padapter,ptdls_sta); - set_sta_rate(padapter, ptdls_sta); - //sta mode - rtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,ptdls_sta,_TRUE); - break; + if (ptdls_sta->ra_mask & 0x0f) + sta_band |= WIRELESS_11B; } - case TDLS_SD_PTI: - ptdls_sta->tdls_sta_state |= TDLS_WAIT_PTR_STATE; - issue_tdls_peer_traffic_indication(padapter, ptdls_sta); - _set_timer(&ptdls_sta->pti_timer, TDLS_PTI_TIME); - break; - case TDLS_CS_OFF: - _cancel_timer_ex(&ptdls_sta->base_ch_timer); - _cancel_timer_ex(&ptdls_sta->off_ch_timer); - SelectChannel(padapter, pmlmeext->cur_channel); - ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SWITCH_ON_STATE | - TDLS_PEER_AT_OFF_STATE | - TDLS_AT_OFF_CH_STATE); - DBG_871X("go back to base channel\n "); + ptdls_sta->wireless_mode = sta_band; + ptdls_sta->raid = rtw_hal_networktype_to_raid(padapter,ptdls_sta); + set_sta_rate(padapter, ptdls_sta); + rtw_sta_media_status_rpt(padapter, ptdls_sta, 1); + /* Sta mode */ + rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, ptdls_sta,_TRUE); + break; + } + case TDLS_ISSUE_PTI: + ptdls_sta->tdls_sta_state |= TDLS_WAIT_PTR_STATE; + issue_tdls_peer_traffic_indication(padapter, ptdls_sta); + _set_timer(&ptdls_sta->pti_timer, TDLS_PTI_TIME); + break; +#ifdef CONFIG_TDLS_CH_SW + case TDLS_CH_SW_RESP: + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + txmgmt.status_code = 0; + _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN); + + issue_nulldata(padapter, NULL, 1, 0, 0); + + DBG_871X("issue tdls channel switch response\n"); + issue_tdls_ch_switch_rsp(padapter, &txmgmt, _FALSE); + resp_sleep = 5; + rtw_msleep_os(resp_sleep); + + /* If we receive TDLS_CH_SW_REQ at off channel which it's target is AP's channel */ + /* then we just SelectChannel to AP's channel*/ + if (padapter->mlmeextpriv.cur_channel == pchsw_info->off_ch_num) { + SelectChannel(padapter, padapter->mlmeextpriv.cur_channel); issue_nulldata(padapter, NULL, 0, 0, 0); + pchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE); + ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); break; - case TDLS_INIT_CH_SEN: - rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_INIT_CH_SEN, 0); - pmlmeext->sitesurvey_res.channel_idx = 0; - ptdls_sta->option = TDLS_DONE_CH_SEN; - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_DONE_CH_SEN); - break; - case TDLS_DONE_CH_SEN: - survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; - if(survey_channel){ - SelectChannel(padapter, survey_channel); - ptdlsinfo->cur_channel = survey_channel; - pmlmeext->sitesurvey_res.channel_idx++; - _set_timer(&ptdls_sta->option_timer, SURVEY_TO); - }else{ - SelectChannel(padapter, pmlmeext->cur_channel); - - rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_DONE_CH_SEN, 0); - - if(ptdlsinfo->ch_sensing==1){ - ptdlsinfo->ch_sensing=0; - ptdlsinfo->cur_channel=1; - min=ptdlsinfo->collect_pkt_num[0]; - for(i=1; i ptdlsinfo->collect_pkt_num[i]){ - ptdlsinfo->cur_channel=i+1; - min=ptdlsinfo->collect_pkt_num[i]; - } - ptdlsinfo->collect_pkt_num[i]=0; - } - ptdlsinfo->collect_pkt_num[0]=0; - ptdlsinfo->candidate_ch=ptdlsinfo->cur_channel; - DBG_871X("TDLS channel sensing done, candidate channel: %02x\n", ptdlsinfo->candidate_ch); - ptdlsinfo->cur_channel=0; + } - } + _set_timer(&ptdls_sta->delay_timer, pmlmeinfo->bcn_interval - 40); - if(ptdls_sta->tdls_sta_state & TDLS_PEER_SLEEP_STATE){ - ptdls_sta->tdls_sta_state |= TDLS_APSD_CHSW_STATE; - }else{ - //send null data with pwrbit==1 before send ch_switching_req to peer STA. - issue_nulldata(padapter, NULL, 1, 0, 0); + /* Continue following actions */ - ptdls_sta->tdls_sta_state |= TDLS_CH_SW_INITIATOR_STATE; + case TDLS_CH_SW: + issue_nulldata(padapter, NULL, 1, 0, 0); + _set_timer(&ptdls_sta->ch_sw_timer, (u32)(ptdls_sta->ch_switch_timeout)/1000); - issue_tdls_ch_switch_req(padapter, ptdls_sta->hwaddr); - DBG_871X("issue tdls ch switch req\n"); - } - } - break; - case TDLS_OFF_CH: - issue_nulldata(padapter, NULL, 1, 0, 0); - SelectChannel(padapter, ptdls_sta->off_ch); - - DBG_871X("change channel to tar ch:%02x\n", ptdls_sta->off_ch); - ptdls_sta->tdls_sta_state |= TDLS_AT_OFF_CH_STATE; - ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_AT_OFF_STATE); - _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time); - break; - case TDLS_BASE_CH: - _cancel_timer_ex(&ptdls_sta->base_ch_timer); - _cancel_timer_ex(&ptdls_sta->off_ch_timer); - SelectChannel(padapter, pmlmeext->cur_channel); - ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SWITCH_ON_STATE | - TDLS_PEER_AT_OFF_STATE | - TDLS_AT_OFF_CH_STATE); - DBG_871X("go back to base channel\n "); - issue_nulldata(padapter, NULL, 0, 0, 0); - _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time); - break; - case TDLS_P_OFF_CH: - SelectChannel(padapter, pmlmeext->cur_channel); + setchtime = rtw_systime_to_ms(rtw_get_current_time()); + SelectChannel(padapter, pchsw_info->off_ch_num); + setchtime = rtw_systime_to_ms(rtw_get_current_time()) - setchtime; + setchtime += resp_sleep; + + if (pmlmeext->cur_channel != rtw_get_oper_ch(padapter)) issue_nulldata(padapter, NULL, 0, 0, 0); - DBG_871X("change channel to base ch:%02x\n", pmlmeext->cur_channel); - ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_AT_OFF_STATE| TDLS_AT_OFF_CH_STATE); - _set_timer(&ptdls_sta->off_ch_timer, TDLS_STAY_TIME); - break; - case TDLS_P_BASE_CH: - issue_nulldata(ptdls_sta->padapter, NULL, 1, 0, 0); - SelectChannel(padapter, ptdls_sta->off_ch); - DBG_871X("change channel to off ch:%02x\n", ptdls_sta->off_ch); - ptdls_sta->tdls_sta_state |= TDLS_AT_OFF_CH_STATE; - if((ptdls_sta->tdls_sta_state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE){ - issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 3, 300); - } - _set_timer(&ptdls_sta->base_ch_timer, TDLS_STAY_TIME); - break; - case TDLS_RS_RCR: - rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_RS_RCR, 0); - DBG_871X("wirte REG_RCR, set bit6 on\n"); - break; - case TDLS_TEAR_STA: - free_tdls_sta(padapter, ptdls_sta); - break; - + pchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE); + + if ((u32)ptdls_sta->ch_switch_time/1000 > setchtime) + wait_time = (u32)ptdls_sta->ch_switch_time/1000 - setchtime; + else + wait_time = 0; + + if (wait_time > 0) + rtw_msleep_os(wait_time); + + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0); + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0); + + break; + case TDLS_CH_SW_BACK: + pchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE | TDLS_WAIT_CH_RSP_STATE); + ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); + SelectChannel(padapter, padapter->mlmeextpriv.cur_channel); + issue_nulldata(padapter, NULL, 0, 0, 0); + break; +#endif + case TDLS_RS_RCR: + rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_RS_RCR, 0); + DBG_871X("wirte REG_RCR, set bit6 on\n"); + break; + case TDLS_TEAR_STA: +#ifdef CONFIG_TDLS_CH_SW + if (_rtw_memcmp(TDLSoption->addr, pchsw_info->addr, ETH_ALEN) == _TRUE) { + pchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE | + TDLS_CH_SWITCH_ON_STATE | + TDLS_PEER_AT_OFF_STATE); + ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); + _rtw_memset(pchsw_info->addr, 0x00, ETH_ALEN); + } +#endif + rtw_sta_media_status_rpt(padapter, ptdls_sta, 0); + free_tdls_sta(padapter, ptdls_sta); + break; } //_exit_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); @@ -14733,7 +14552,7 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) return H2C_SUCCESS; #else return H2C_REJECTED; -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp.c index 772633e1111e..779340bbc3d8 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp.c @@ -26,7 +26,7 @@ #endif #include "../hal/OUTSRC/phydm_precomp.h" -#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) +#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) #include #endif @@ -139,12 +139,19 @@ static void _init_mp_priv_(struct mp_priv *pmp_priv) pmp_priv->network_macaddr[5] = 0x55; pmp_priv->bSetRxBssid = _FALSE; + pmp_priv->bRTWSmbCfg = _FALSE; pnetwork = &pmp_priv->mp_network.network; _rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN); pnetwork->Ssid.SsidLength = 8; _rtw_memcpy(pnetwork->Ssid.Ssid, "mp_871x", pnetwork->Ssid.SsidLength); + + pmp_priv->tx.payload = 2; +#ifdef CONFIG_80211N_HT + pmp_priv->tx.attrib.ht_en = 1; +#endif + } #ifdef PLATFORM_WINDOWS @@ -255,6 +262,8 @@ _exit_init_mp_priv: static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter) { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct pkt_attrib *pattrib; // init xmitframe attribute @@ -263,8 +272,10 @@ static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter) _rtw_memset(pmptx->desc, 0, TXDESC_SIZE); pattrib->ether_type = 0x8712; - //_rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); -// _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + #if 0 + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + #endif _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN); // pattrib->dhcp_pkt = 0; @@ -280,12 +291,28 @@ static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter) pattrib->encrypt = 0; pattrib->bswenc = _FALSE; pattrib->qos_en = _FALSE; + + pattrib->pktlen = 1500; + +#ifdef CONFIG_80211AC_VHT + if (pHalData->rf_type == RF_1T1R) + pattrib->raid = RATEID_IDX_VHT_1SS; + else if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_2T4R) + pattrib->raid = RATEID_IDX_VHT_2SS; + else if (pHalData->rf_type == RF_3T3R) + pattrib->raid = RATEID_IDX_VHT_3SS; + else + pattrib->raid = RATEID_IDX_BGN_40M_1SS; +#endif } s32 init_mp_priv(PADAPTER padapter) { struct mp_priv *pmppriv = &padapter->mppriv; + PHAL_DATA_TYPE pHalData; + pHalData = GET_HAL_DATA(padapter); + _init_mp_priv_(pmppriv); pmppriv->papdater = padapter; pmppriv->mp_dm =0; @@ -312,11 +339,14 @@ s32 init_mp_priv(PADAPTER padapter) pmppriv->antenna_rx = ANTENNA_AB; break; case RF_2T4R: - pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_tx = ANTENNA_BC; pmppriv->antenna_rx = ANTENNA_ABCD; break; } - + + pHalData->AntennaRxPath = pmppriv->antenna_rx; + pHalData->AntennaTxPath = pmppriv->antenna_tx; + return _SUCCESS; } @@ -356,8 +386,7 @@ static VOID PHY_SetRFPathSwitch_default( void mpt_InitHWConfig(PADAPTER Adapter) { - if (IS_HARDWARE_TYPE_8723B(Adapter)) - { + if (IS_HARDWARE_TYPE_8723B(Adapter)) { // TODO: <20130114, Kordan> The following setting is only for DPDT and Fixed board type. // TODO: A better solution is configure it according EFUSE during the run-time. @@ -376,32 +405,38 @@ void mpt_InitHWConfig(PADAPTER Adapter) PHY_SetMacReg(Adapter, 0x64, bMaskDWord, 0x36000000); //Fix BT S0/S1 PHY_SetMacReg(Adapter, 0x948, bMaskDWord, 0x0); //Fix BT can't Tx - // <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou) - PHY_SetBBReg(Adapter, 0xA00, BIT8, 0x0); //0xA01[0] = 0 - } + /* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou) */ + PHY_SetBBReg(Adapter, 0xA00, BIT8, 0x0); /*0xA01[0] = 0*/ + } else if (IS_HARDWARE_TYPE_8821(Adapter)) { + /* <20131121, VincentL> Add for 8821AU DPDT setting and fix switching antenna issue (Asked by Rock) + <20131122, VincentL> Enable for all 8821A/8811AU (Asked by Alex)*/ + PHY_SetMacReg(Adapter, 0x4C, BIT23, 0x0); /*0x4C[23:22]=01*/ + PHY_SetMacReg(Adapter, 0x4C, BIT22, 0x1); /*0x4C[23:22]=01*/ + } else if (IS_HARDWARE_TYPE_8188ES(Adapter)) + PHY_SetMacReg(Adapter, 0x4C , BIT23, 0); /*select DPDT_P and DPDT_N as output pin*/ +#ifdef CONFIG_RTL8814A + else if (IS_HARDWARE_TYPE_8814A(Adapter)) + PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8814A, 0x2000); +#endif + /* + else if(IS_HARDWARE_TYPE_8822B(Adapter)) + { + PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8822B, 0x2000); + }*/ } - -#if defined (CONFIG_RTL8192C) || defined (CONFIG_RTL8723A) -#define PHY_IQCalibrate(a,b) rtl8192c_PHY_IQCalibrate(a,b) -#define PHY_LCCalibrate(a) rtl8192c_PHY_LCCalibrate(a) -//#define dm_CheckTXPowerTracking(a) rtl8192c_odm_CheckTXPowerTracking(a) -#define PHY_SetRFPathSwitch(a,b) rtl8192c_PHY_SetRFPathSwitch(a,b) -#endif - -#ifdef CONFIG_RTL8192D -#define PHY_IQCalibrate(a,b) rtl8192d_PHY_IQCalibrate(a) -#define PHY_LCCalibrate(a) rtl8192d_PHY_LCCalibrate(a) -//#define dm_CheckTXPowerTracking(a) rtl8192d_odm_CheckTXPowerTracking(a) -#define PHY_SetRFPathSwitch(a,b) rtl8192d_PHY_SetRFPathSwitch(a,b) -#endif - #ifdef CONFIG_RTL8188E #define PHY_IQCalibrate(a,b) PHY_IQCalibrate_8188E(a,b) #define PHY_LCCalibrate(a) PHY_LCCalibrate_8188E(&(GET_HAL_DATA(a)->odmpriv)) #define PHY_SetRFPathSwitch(a,b) PHY_SetRFPathSwitch_8188E(a,b) #endif +#ifdef CONFIG_RTL8814A +#define PHY_IQCalibrate(a,b) PHY_IQCalibrate_8814A(&(GET_HAL_DATA(a)->odmpriv), b) +#define PHY_LCCalibrate(a) PHY_LCCalibrate_8814A(&(GET_HAL_DATA(a)->odmpriv)) +#define PHY_SetRFPathSwitch(a,b) PHY_SetRFPathSwitch_8814A(a,b) +#endif /* CONFIG_RTL8814A */ + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) /* #define PHY_IQCalibrate(a,b) PHY_IQCalibrate_8812A(a,b) @@ -477,7 +512,7 @@ MPT_InitializeAdapter( pMptCtx->bMptIndexEven = _TRUE; //default gain index is -6.0db pMptCtx->h2cReqNum = 0x0; //init for BT MP -#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) +#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) pMptCtx->bMPh2c_timeout = _FALSE; pMptCtx->MptH2cRspEvent = _FALSE; pMptCtx->MptBtC2hEvent = _FALSE; @@ -485,64 +520,40 @@ MPT_InitializeAdapter( _init_timer( &pMptCtx->MPh2c_timeout_timer, pAdapter->pnetdev, MPh2c_timeout_handle, pAdapter ); #endif -#ifdef CONFIG_RTL8723A - rtl8723a_InitAntenna_Selection(pAdapter); -#endif //CONFIG_RTL8723A + mpt_InitHWConfig(pAdapter); + #ifdef CONFIG_RTL8723B rtl8723b_InitAntenna_Selection(pAdapter); if (IS_HARDWARE_TYPE_8723B(pAdapter)) { - mpt_InitHWConfig(pAdapter); - // <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou) - PHY_SetBBReg(pAdapter, 0xA00, BIT8, 0x0); //0xA01[0] = 0 - PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main - //<20130522, Kordan> 0x51 and 0x71 should be set immediately after path switched, or they might be overwritten. + + /* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou)*/ + PHY_SetBBReg(pAdapter, 0xA00, BIT8, 0x0); + PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /*default use Main*/ + /*<20130522, Kordan> 0x51 and 0x71 should be set immediately after path switched, or they might be overwritten. */ if ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA90)) PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E); else PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E); } + /*set ant to wifi side in mp mode*/ + rtw_write16(pAdapter, 0x870, 0x300); + rtw_write16(pAdapter, 0x860, 0x110); #endif pMptCtx->bMptWorkItemInProgress = _FALSE; pMptCtx->CurrMptAct = NULL; pMptCtx->MptRfPath = ODM_RF_PATH_A; //------------------------------------------------------------------------- - -#if 1 // Don't accept any packets rtw_write32(pAdapter, REG_RCR, 0); -#else - // Accept CRC error and destination address - //pHalData->ReceiveConfig |= (RCR_ACRC32|RCR_AAP); - //rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); - rtw_write32(pAdapter, REG_RCR, 0x70000101); -#endif - -#if 0 - // If EEPROM or EFUSE is empty,we assign as RF 2T2R for MP. - if (pHalData->AutoloadFailFlag == TRUE) - { - pHalData->RF_Type = RF_2T2R; - } -#endif //ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); //rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS); - if(IS_HARDWARE_TYPE_8192DU(pAdapter)) - { - rtw_write32(pAdapter, REG_LEDCFG0, 0x8888); - } - else - { - //rtw_write32(pAdapter, REG_LEDCFG0, 0x08080); - ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); - - #if defined (CONFIG_RTL8192C) || defined( CONFIG_RTL8192D ) - rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~BIT(7)); - #endif - } + //rtw_write32(pAdapter, REG_LEDCFG0, 0x08080); + ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); + PHY_LCCalibrate(pAdapter); PHY_IQCalibrate(pAdapter, _FALSE); @@ -553,17 +564,12 @@ MPT_InitializeAdapter( pMptCtx->backup0xc50 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0); pMptCtx->backup0xc58 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0); pMptCtx->backup0xc30 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_RxDetector1, bMaskByte0); -#ifdef CONFIG_RTL8188E pMptCtx->backup0x52_RF_A = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0); - pMptCtx->backup0x52_RF_B = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0); + pMptCtx->backup0x52_RF_B = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0); +#ifdef CONFIG_RTL8188E rtw_write32(pAdapter, REG_MACID_NO_LINK_0, 0x0); rtw_write32(pAdapter, REG_MACID_NO_LINK_1, 0x0); #endif - - //set ant to wifi side in mp mode - rtw_write16(pAdapter, 0x870, 0x300); - rtw_write16(pAdapter, 0x860, 0x110); - return rtStatus; } @@ -592,7 +598,7 @@ MPT_DeInitAdapter( PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; pMptCtx->bMptDrvUnload = _TRUE; - #if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B) + #if defined(CONFIG_RTL8723B) _rtw_free_sema(&(pMptCtx->MPh2c_Sema)); _cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); #endif @@ -645,34 +651,22 @@ void GetPowerTracking(PADAPTER padapter, u8 *enable) static void disable_dm(PADAPTER padapter) { -#ifndef CONFIG_RTL8723A u8 v8; -#endif HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; //3 1. disable firmware dynamic mechanism // disable Power Training, Rate Adaptive -#ifdef CONFIG_RTL8723A - SetBcnCtrlReg(padapter, 0, EN_BCN_FUNCTION); -#else v8 = rtw_read8(padapter, REG_BCN_CTRL); v8 &= ~EN_BCN_FUNCTION; rtw_write8(padapter, REG_BCN_CTRL, v8); -#endif //3 2. disable driver dynamic mechanism - // disable Dynamic Initial Gain - // disable High Power - // disable Power Tracking Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); // enable APK, LCK and IQK but disable power tracking -#if !(defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8192E)) - pdmpriv->TxPowerTrackControl = _FALSE; -#endif - Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, _TRUE); + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE; + Switch_DM_Func(padapter, ODM_RF_CALIBRATION, _TRUE); //#ifdef CONFIG_BT_COEXIST // rtw_btcoex_Switch(padapter, 0); //remove for BT MP Down. @@ -683,35 +677,29 @@ static void disable_dm(PADAPTER padapter) void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; PDM_ODM_T pDM_Odm = &pHalData->odmpriv; if (bstart==1){ DBG_871X("in MPT_PwrCtlDM start \n"); - Switch_DM_Func(padapter, DYNAMIC_RF_TX_PWR_TRACK, _TRUE); - pdmpriv->InitODMFlag |= ODM_RF_TX_PWR_TRACK ; - pdmpriv->InitODMFlag |= ODM_RF_CALIBRATION ; - pdmpriv->TxPowerTrackControl = _TRUE; + Switch_DM_Func(padapter, ODM_RF_TX_PWR_TRACK |ODM_RF_CALIBRATION , _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); - pdmpriv->InitODMFlag = 0 ; - pdmpriv->TxPowerTrackControl = _FALSE; pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE; padapter->mppriv.mp_dm = 0; { TXPWRTRACK_CFG c; u1Byte chnl =0 ; - + _rtw_memset(&c, 0, sizeof(TXPWRTRACK_CFG)); 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); + if (*c.ODM_TxPwrTrackSetPwr) { + (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_A, chnl); + (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_B, chnl); + } } } @@ -730,7 +718,14 @@ 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; - + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + +#ifdef CONFIG_IOCTL_CFG80211 + struct wireless_dev *pwdev = padapter->rtw_wdev; + pwdev->iftype = NL80211_IFTYPE_ADHOC; +#endif //#ifdef CONFIG_IOCTL_CFG80211 // 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__, @@ -743,6 +738,7 @@ u32 mp_join(PADAPTER padapter,u8 mode) bssid.InfrastructureMode = Ndis802_11IBSS; bssid.NetworkTypeInUse = Ndis802_11DS; bssid.IELength = 0; + bssid.Configuration.DSConfig=pmppriv->channel; }else if(mode==WIFI_FW_STATION_STATE){ bssid.Ssid.SsidLength = strlen("mp_pseudo_STATION"); @@ -752,7 +748,6 @@ u32 mp_join(PADAPTER padapter,u8 mode) bssid.IELength = 0; } - length = get_WLAN_BSSID_EX_sz(&bssid); if (length % 4) bssid.Length = ((length >> 2) + 1) << 2; //round up to multiple of 4 bytes. @@ -772,14 +767,7 @@ u32 mp_join(PADAPTER padapter,u8 mode) } pmppriv->prev_fw_state = get_fwstate(pmlmepriv); 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")); - } else { - RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in normal mode\n")); - } -#endif + set_fwstate(pmlmepriv, _FW_UNDER_LINKING); //3 2. create a new psta for mp driver @@ -798,8 +786,18 @@ u32 mp_join(PADAPTER padapter,u8 mode) //3 3. join psudo AdHoc tgt_network->join_res = 1; tgt_network->aid = psta->aid = 1; - _rtw_memcpy(&tgt_network->network, &bssid, length); + _rtw_memcpy(&padapter->registrypriv.dev_network, &bssid, length); + rtw_update_registrypriv_dev_network(padapter); + _rtw_memcpy(&tgt_network->network,&padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length); + _rtw_memcpy(pnetwork,&padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length); + + if(rtw_createbss_cmd(padapter)!=_SUCCESS) + { + DBG_871X("mp_join: rtw_createbss_cmd status FAIL*** \n "); + res = _FALSE; + return res; + } rtw_indicate_connect(padapter); _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); set_fwstate(pmlmepriv,_FW_LINKED); @@ -839,15 +837,15 @@ s32 mp_start_test(PADAPTER padapter) //3 disable dynamic mechanism disable_dm(padapter); + #ifdef CONFIG_RTL8814A + rtl8814_InitHalDm(padapter); + #endif /* CONFIG_RTL8814A */ #ifdef CONFIG_RTL8812A rtl8812_InitHalDm(padapter); -#endif - #ifdef CONFIG_RTL8723A - rtl8723a_InitHalDm(padapter); - #endif + #endif /* CONFIG_RTL8812A */ #ifdef CONFIG_RTL8723B rtl8723b_InitHalDm(padapter); -#endif + #endif /* CONFIG_RTL8723B */ #ifdef CONFIG_RTL8192E rtl8192e_InitHalDm(padapter); #endif @@ -925,9 +923,6 @@ end_of_mp_stop_test: #ifdef CONFIG_RTL8812A rtl8812_InitHalDm(padapter); #endif - #ifdef CONFIG_RTL8723A - rtl8723a_InitHalDm(padapter); - #endif #ifdef CONFIG_RTL8723B rtl8723b_InitHalDm(padapter); #endif @@ -1079,7 +1074,7 @@ int SetTxPower(PADAPTER pAdapter) } TxPower[ODM_RF_PATH_A] = (u1Byte)(u1TxPower&0xff); - TxPower[ODM_RF_PATH_B] = (u1Byte)((u1TxPower&0xff00)>>8); + TxPower[ODM_RF_PATH_B] = (u1Byte)(u1TxPower&0xff); DBG_871X("TxPower(A, B) = (0x%x, 0x%x)\n", TxPower[ODM_RF_PATH_A], TxPower[ODM_RF_PATH_B]); for(rf=0; rf<2; rf++) @@ -1189,12 +1184,6 @@ void PhySetTxPowerLevel(PADAPTER pAdapter) #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) PHY_SetTxPowerLevel8812(pAdapter,pmp_priv->channel); #endif -#if defined(CONFIG_RTL8192D) - PHY_SetTxPowerLevel8192D(pAdapter,pmp_priv->channel); -#endif -#if defined(CONFIG_RTL8192C) - PHY_SetTxPowerLevel8192C(pAdapter,pmp_priv->channel); -#endif #if defined(CONFIG_RTL8192E) PHY_SetTxPowerLevel8192E(pAdapter,pmp_priv->channel); #endif @@ -1305,46 +1294,6 @@ void fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc) _rtw_memcpy(ptxdesc, pmp_priv->tx.desc, TXDESC_SIZE); } -#if defined(CONFIG_RTL8192C) || defined(CONFIG_RTL8192D) -void fill_tx_desc_8192cd(PADAPTER padapter) -{ - struct mp_priv *pmp_priv = &padapter->mppriv; - struct tx_desc *desc = (struct tx_desc *)&(pmp_priv->tx.desc); - struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib); - - desc->txdw1 |= cpu_to_le32(BK); // don't aggregate(AMPDU) - desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x1F); //CAM_ID(MAC_ID) - desc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); // Queue Select, TID - desc->txdw1 |= cpu_to_le32((pattrib->raid << Rate_ID_SHT) & 0x000F0000); // Rate Adaptive ID - - // offset 8 - // desc->txdw2 |= cpu_to_le32(AGG_BK);//AGG BK - desc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0x0fff0000); - desc->txdw4 |= cpu_to_le32(HW_SEQ_EN); - - desc->txdw4 |= cpu_to_le32(USERATE); - desc->txdw4 |= cpu_to_le32(DISDATAFB); - - if( pmp_priv->preamble ){ - if (pmp_priv->rateidx <= MPT_RATE_54M) - desc->txdw4 |= cpu_to_le32(DATA_SHORT); // CCK Short Preamble - } - - if (pmp_priv->bandwidth == CHANNEL_WIDTH_40) - desc->txdw4 |= cpu_to_le32(DATA_BW); - - // offset 20 - desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F); - - if( pmp_priv->preamble ){ - if (pmp_priv->rateidx > MPT_RATE_54M) - desc->txdw5 |= cpu_to_le32(SGI); // MCS Short Guard Interval - } - - desc->txdw5 |= cpu_to_le32(0x0001FF00); // DATA/RTS Rate Fallback Limit -} -#endif - #if defined(CONFIG_RTL8188E) void fill_tx_desc_8188e(PADAPTER padapter) { @@ -1397,6 +1346,64 @@ void fill_tx_desc_8188e(PADAPTER padapter) } #endif + +#if defined(CONFIG_RTL8814A) +void fill_tx_desc_8814a(PADAPTER padapter) +{ + struct mp_priv *pmp_priv = &padapter->mppriv; + u8 *pDesc = (u8 *)&(pmp_priv->tx.desc); + struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib); + + u32 pkt_size = pattrib->last_txcmdsz; + s32 bmcast = IS_MCAST(pattrib->ra); + u8 data_rate,pwr_status,offset; + + //SET_TX_DESC_FIRST_SEG_8814A(pDesc, 1); + SET_TX_DESC_LAST_SEG_8814A(pDesc, 1); + //SET_TX_DESC_OWN_(pDesc, 1); + + SET_TX_DESC_PKT_SIZE_8814A(pDesc, pkt_size); + + offset = TXDESC_SIZE + OFFSET_SZ; + + SET_TX_DESC_OFFSET_8814A(pDesc, offset); + SET_TX_DESC_PKT_OFFSET_8814A(pDesc, 1); + + if (bmcast) { + SET_TX_DESC_BMC_8814A(pDesc, 1); + } + + SET_TX_DESC_MACID_8814A(pDesc, pattrib->mac_id); + SET_TX_DESC_RATE_ID_8814A(pDesc, pattrib->raid); + + //SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G); + SET_TX_DESC_QUEUE_SEL_8814A(pDesc, pattrib->qsel); + //SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); + + if ( pmp_priv->preamble ){ + SET_TX_DESC_DATA_SHORT_8814A(pDesc, 1); + } + + if (!pattrib->qos_en) { + SET_TX_DESC_HWSEQ_EN_8814A(pDesc, 1); // Hw set sequence number + } else { + SET_TX_DESC_SEQ_8814A(pDesc, pattrib->seqnum); + } + + if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160) { + SET_TX_DESC_DATA_BW_8814A(pDesc, pmp_priv->bandwidth); + } else { + DBG_871X("%s:Err: unknown bandwidth %d, use 20M\n", __func__,pmp_priv->bandwidth); + SET_TX_DESC_DATA_BW_8814A(pDesc, CHANNEL_WIDTH_20); + } + + SET_TX_DESC_DISABLE_FB_8814A(pDesc, 1); + SET_TX_DESC_USE_RATE_8814A(pDesc, 1); + SET_TX_DESC_TX_RATE_8814A(pDesc, pmp_priv->rateidx); + +} +#endif + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) void fill_tx_desc_8812a(PADAPTER padapter) { @@ -1468,11 +1475,13 @@ void fill_tx_desc_8192e(PADAPTER padapter) 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); + SET_TX_DESC_OFFSET_92E(pDesc, offset+8); //work around + SET_TX_DESC_PKT_OFFSET_92E(pDesc, 0); /* 8192EE pkt_offset is 0 */ + #elif defined(CONFIG_SDIO_HCI) + SET_TX_DESC_OFFSET_92E(pDesc, offset); + #else //8192EU + SET_TX_DESC_OFFSET_92E(pDesc, offset); + SET_TX_DESC_PKT_OFFSET_92E(pDesc, 1); #endif if (bmcast) { @@ -1576,7 +1585,7 @@ void SetPacketTx(PADAPTER padapter) //3 1. update_attrib() pattrib = &pmp_priv->tx.attrib; - _rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); bmcast = IS_MCAST(pattrib->ra); @@ -1611,19 +1620,26 @@ void SetPacketTx(PADAPTER padapter) pkt_end = pkt_start + pkt_size; //3 3. init TX descriptor -#if defined(CONFIG_RTL8192C) || defined(CONFIG_RTL8192D) - if(IS_HARDWARE_TYPE_8192C(padapter) ||IS_HARDWARE_TYPE_8192D(padapter)) - fill_tx_desc_8192cd(padapter); -#endif - #if defined(CONFIG_RTL8188E) if(IS_HARDWARE_TYPE_8188E(padapter)) fill_tx_desc_8188e(padapter); #endif +#if defined(CONFIG_RTL8814A) + if(IS_HARDWARE_TYPE_8814A(padapter)) + fill_tx_desc_8814a(padapter); +#endif /* defined(CONFIG_RTL8814A) */ + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) if(IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) fill_tx_desc_8812a(padapter); + if (IS_HARDWARE_TYPE_8812AU(padapter)) { + /* <20130425, Kordan> Turn off OFDM Rx to prevent from CCA causing Tx hang.*/ + if (pmp_priv->mode == MP_PACKET_TX) + PHY_SetBBReg(padapter, rCCAonSec_Jaguar, BIT3, 1); + else + PHY_SetBBReg(padapter, rCCAonSec_Jaguar, BIT3, 0); + } #endif #if defined(CONFIG_RTL8192E) @@ -1704,7 +1720,7 @@ exit: return; } -void SetPacketRx(PADAPTER pAdapter, u8 bStartRx) +void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); struct mp_priv *pmppriv = &pAdapter->mppriv; @@ -1745,6 +1761,11 @@ void SetPacketRx(PADAPTER pAdapter, u8 bStartRx) #endif rtw_write32(pAdapter, REG_RCR, 0); } + + if (bAB) + rtw_write32(pAdapter, REG_RCR, rtw_read32(pAdapter, REG_RCR)|RCR_AB); + else + rtw_write32(pAdapter, REG_RCR, rtw_read32(pAdapter, REG_RCR)&(~RCR_AB)); } void ResetPhyRxPktCount(PADAPTER pAdapter) @@ -1802,14 +1823,12 @@ static u32 rtw_GetPSDData(PADAPTER pAdapter, u32 point) { u32 psd_val=0; -#if defined(CONFIG_RTL8812A)||defined(CONFIG_RTL8821A) //MP PSD for 8812A +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) u16 psd_reg = 0x910; u16 psd_regL= 0xF44; - #else u16 psd_reg = 0x808; u16 psd_regL= 0x8B4; - #endif psd_val = rtw_read32(pAdapter, psd_reg); @@ -2424,11 +2443,6 @@ ULONG mpt_ProQueryCalTxPower( ULONG TxPower = 1, PwrGroup=0, PowerDiffByRate=0; u1Byte limit = 0, rate = 0; - #if 0// defined(CONFIG_RTL8192D) ||defined(CONFIG_RTL8192C) - if(IS_HARDWARE_TYPE_8188E_before(pAdapter)) - return mpt_ProQueryCalTxPower_8192C(pAdapter, RfPath); - #endif - #if defined(CONFIG_RTL8188E) if (IS_HARDWARE_TYPE_8188E(pAdapter)) { @@ -2490,31 +2504,22 @@ void Hal_ProSetCrystalCap (PADAPTER pAdapter , u32 CrystalCap) CrystalCap = CrystalCap & 0x3F; - if(IS_HARDWARE_TYPE_8192D(pAdapter)) - { - PHY_SetBBReg(pAdapter, REG_AFE_XTAL_CTRL, 0xF0, CrystalCap & 0x0F); - PHY_SetBBReg(pAdapter, REG_AFE_PLL_CTRL, 0xF0000000, (CrystalCap & 0xF0) >> 4); - } - else if(IS_HARDWARE_TYPE_8188E(pAdapter)) - { - // write 0x24[16:11] = 0x24[22:17] = CrystalCap + if (IS_HARDWARE_TYPE_8188E(pAdapter)) { + /* write 0x24[16:11] = 0x24[22:17] = CrystalCap*/ PHY_SetBBReg(pAdapter, REG_AFE_XTAL_CTRL, 0x7FF800, (CrystalCap | (CrystalCap << 6))); - } - else if(IS_HARDWARE_TYPE_8812(pAdapter)) - { - // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap + } else if (IS_HARDWARE_TYPE_8812(pAdapter)) { + /* write 0x2C[30:25] = 0x2C[24:19] = CrystalCap*/ PHY_SetBBReg(pAdapter, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6))); - } - else if(IS_HARDWARE_TYPE_8821(pAdapter) || IS_HARDWARE_TYPE_8192E(pAdapter) || - IS_HARDWARE_TYPE_8723B(pAdapter)) - { - // write 0x2C[23:18] = 0x2C[17:12] = CrystalCap - PHY_SetBBReg(pAdapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6))); - } - else - { + } else if (IS_HARDWARE_TYPE_8821(pAdapter) || IS_HARDWARE_TYPE_8192E(pAdapter) || + IS_HARDWARE_TYPE_8723B(pAdapter)) { + /* write 0x2C[23:18] = 0x2C[17:12] = CrystalCap*/ PHY_SetBBReg(pAdapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6))); - } + } else if (IS_HARDWARE_TYPE_8814A(pAdapter)) { + /* write 0x2C[26:21] = 0x2C[20:15] = CrystalCap*/ + PHY_SetBBReg(pAdapter, REG_MAC_PHY_CTRL, 0x07FF8000, (CrystalCap | (CrystalCap << 6))); + } else + DBG_871X("%s ,unknown HARDWARE_TYPE\n", __func__); + } #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp_ioctl.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp_ioctl.c index 2b4c94fbc18f..bb94bfb471c2 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp_ioctl.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp_ioctl.c @@ -2237,8 +2237,6 @@ NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n",\ Adapter->mppriv.rx_with_status)); - //*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); - //*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x \n", Adapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\ Adapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5])); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_odm.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_odm.c index 05063bfdf990..44719c51e1f0 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_odm.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_odm.c @@ -40,18 +40,18 @@ const char *odm_comp_str[] = { /* BIT15 */"ODM_COMP_CFO_TRACKING", /* BIT16 */"ODM_COMP_ACS", /* BIT17 */"PHYDM_COMP_ADAPTIVITY", - /* BIT18 */NULL, - /* BIT19 */NULL, + /* BIT18 */"PHYDM_COMP_RA_DBG", + /* BIT19 */"PHYDM_COMP_TXBF", /* BIT20 */"ODM_COMP_EDCA_TURBO", /* BIT21 */"ODM_COMP_EARLY_MODE", - /* BIT22 */NULL, + /* BIT22 */"ODM_FW_DEBUG_TRACE", /* BIT23 */NULL, /* BIT24 */"ODM_COMP_TX_PWR_TRACK", /* BIT25 */"ODM_COMP_RX_GAIN_TRACK", /* BIT26 */"ODM_COMP_CALIBRATION", /* BIT27 */NULL, /* BIT28 */NULL, - /* BIT29 */NULL, + /* BIT29 */"BEAMFORMING_DEBUG", /* BIT30 */"ODM_COMP_COMMON", /* BIT31 */"ODM_COMP_INIT", }; @@ -76,7 +76,7 @@ const char *odm_ability_str[] = { /* BIT14 */"ODM_BB_CFO_TRACKING", /* BIT15 */"ODM_BB_NHM_CNT", /* BIT16 */"ODM_BB_PRIMARY_CCA", - /* BIT17 */NULL, + /* BIT17 */"ODM_BB_TXBF", /* BIT18 */NULL, /* BIT19 */NULL, /* BIT20 */"ODM_MAC_EDCA_TURBO", @@ -106,15 +106,15 @@ void rtw_odm_dbg_comp_msg(void *sel, _adapter *adapter) HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); DM_ODM_T *odm = &pHalData->odmpriv; int cnt = 0; - u64 dbg_comp; + u64 dbg_comp = 0; int i; rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_FLAG, &dbg_comp); DBG_871X_SEL_NL(sel, "odm.DebugComponents = 0x%016llx \n", dbg_comp); for (i=0;iodmpriv; int cnt = 0; - u32 dbg_level; + u32 dbg_level = 0; int i; rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_LEVEL, &dbg_level); @@ -156,8 +156,8 @@ void rtw_odm_ability_msg(void *sel, _adapter *adapter) DBG_871X_SEL_NL(sel, "odm.SupportAbility = 0x%08x\n", ability); for (i=0;iadaptivity_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"); } @@ -214,39 +210,46 @@ void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter) } } -#define RTW_NHM_EN_DISABLE 0 -#define RTW_NHM_EN_ENABLE 1 +#define RTW_ADAPTIVITY_DML_DISABLE 0 +#define RTW_ADAPTIVITY_DML_ENABLE 1 -void rtw_odm_nhm_en_msg(void *sel, _adapter *adapter) +void rtw_odm_adaptivity_dml_msg(void *sel, _adapter *adapter) { struct registry_priv *regsty = &adapter->registrypriv; - DBG_871X_SEL_NL(sel, "RTW_NHM_EN_"); + DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_DML_"); - if (regsty->nhm_en == RTW_NHM_EN_DISABLE) { + if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_DISABLE) { DBG_871X_SEL(sel, "DISABLE\n"); - } else if (regsty->nhm_en == RTW_NHM_EN_ENABLE) { + } else if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_ENABLE) { DBG_871X_SEL(sel, "ENABLE\n"); } else { DBG_871X_SEL(sel, "INVALID\n"); } } +void rtw_odm_adaptivity_dc_backoff_msg(void *sel, _adapter *adapter) +{ + struct registry_priv *regsty = &adapter->registrypriv; + + DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_DC_BACKOFF:%u\n", regsty->adaptivity_dc_backoff); +} + 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) + if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE) 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); + rtw_odm_adaptivity_dml_msg(RTW_DBGDUMP, adapter); + rtw_odm_adaptivity_dc_backoff_msg(RTW_DBGDUMP, adapter); } return ret; @@ -260,40 +263,32 @@ void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter) 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); + rtw_odm_adaptivity_dml_msg(sel, adapter); + rtw_odm_adaptivity_dc_backoff_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" + DBG_871X_SEL_NL(sel, "%10s %16s\n" + , "TH_L2H_ini", "TH_EDCCA_HL_diff"); + DBG_871X_SEL_NL(sel, "0x%-8x %-16d\n" , (u8)odm->TH_L2H_ini , odm->TH_EDCCA_HL_diff - , odm->IGI_Base - , odm->ForceEDCCA - , 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 + DBG_871X_SEL_NL(sel, "%15s %9s\n", "AdapEnableState","Adap_Flag"); + DBG_871X_SEL_NL(sel, "%-15x %-9x \n" + , odm->Adaptivity_enable , odm->adaptivity_flag ); } -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_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); DM_ODM_T *odm = &pHalData->odmpriv; odm->TH_L2H_ini = TH_L2H_ini; odm->TH_EDCCA_HL_diff = TH_EDCCA_HL_diff; - odm->IGI_Base = IGI_Base; - odm->ForceEDCCA = ForceEDCCA; - odm->AdapEn_RSSI = AdapEn_RSSI; - odm->IGI_LowerBound = IGI_LowerBound; } void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter) @@ -309,13 +304,12 @@ void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter) 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); + _enter_critical_bh(&pHalData->IQKSpinLock, &irqL); default: break; } @@ -324,13 +318,12 @@ void rtw_odm_acquirespinlock(_adapter *adapter, RT_SPINLOCK_TYPE type) 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); + _exit_critical_bh(&pHalData->IQKSpinLock, &irqL); default: break; } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_p2p.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_p2p.c index 697a69f68033..d85822d5d7cb 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_p2p.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_p2p.c @@ -325,8 +325,8 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; @@ -953,7 +953,7 @@ u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunnel // Value: // Alternative MAC Address - _rtw_memcpy( wfdie + wfdielen, &padapter->pbuddy_adapter->eeprompriv.mac_addr[ 0 ], ETH_ALEN ); + _rtw_memcpy(wfdie + wfdielen, adapter_mac_addr(padapter->pbuddy_adapter), ETH_ALEN); // This mac address is used to make the WFD session when TDLS is enable. wfdielen += ETH_ALEN; @@ -3422,7 +3422,7 @@ void pre_tx_invitereq_handler( _adapter* padapter ) _func_enter_; set_channel_bwmode(padapter, pwdinfo->invitereq_info.peer_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); issue_probereq_p2p(padapter, NULL); _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); @@ -3482,8 +3482,9 @@ _func_enter_; DBG_871X("%s, switch ch back to buddy's cur_channel=%d\n", __func__, pbuddy_mlmeext->cur_channel); set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); - - issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500); + + if (check_buddy_fwstate(padapter, WIFI_FW_STATION_STATE)) + issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500); } else if( pwdinfo->driver_interface == DRIVER_WEXT ) { @@ -3531,7 +3532,7 @@ _func_enter_; 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_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); } rtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE); issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500); @@ -3596,24 +3597,24 @@ _func_enter_; if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) { if (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); + DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n", + FUNC_ADPT_ARG(padapter), ch, bw, offset); } else if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->listen_channel) { ch = pwdinfo->listen_channel; bw = CHANNEL_WIDTH_20; offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; if (0) - DBG_871X(FUNC_ADPT_FMT" back to listen ch - ch:%u, bw:%u, offset:%u\n", - FUNC_ADPT_ARG(padapter), ch, bw, offset); + DBG_871X(FUNC_ADPT_FMT" back to listen ch - ch:%u, bw:%u, offset:%u\n", + FUNC_ADPT_ARG(padapter), ch, bw, offset); } else { ch = pcfg80211_wdinfo->restore_channel; bw = CHANNEL_WIDTH_20; offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; if (0) - DBG_871X(FUNC_ADPT_FMT" back to restore ch - ch:%u, bw:%u, offset:%u\n", - FUNC_ADPT_ARG(padapter), ch, bw, offset); + DBG_871X(FUNC_ADPT_FMT" back to restore ch - ch:%u, bw:%u, offset:%u\n", + FUNC_ADPT_ARG(padapter), ch, bw, offset); } set_channel_bwmode(padapter, ch, offset, bw); @@ -3626,9 +3627,9 @@ _func_enter_; pcfg80211_wdinfo->is_ro_ch = _FALSE; pcfg80211_wdinfo->last_ro_ch_time = rtw_get_current_time(); - DBG_871X("cfg80211_remain_on_channel_expired cookie:0x%llx, ch=%d, bw=%d, offset=%d\n", - pcfg80211_wdinfo->remain_on_ch_cookie, - rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter)); + DBG_871X("cfg80211_remain_on_channel_expired cookie:0x%llx, ch=%d, bw=%d, offset=%d\n" + , pcfg80211_wdinfo->remain_on_ch_cookie + , rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter)); rtw_cfg80211_remain_on_channel_expired(padapter, pcfg80211_wdinfo->remain_on_ch_cookie, @@ -4503,6 +4504,46 @@ _func_enter_; _func_exit_; } +int process_p2p_cross_connect_ie(PADAPTER padapter, u8 *IEs, u32 IELength) +{ + int ret = _TRUE; + u8 * ies; + u32 ies_len; + u8 * p2p_ie; + u32 p2p_ielen = 0; + u8 p2p_attr[MAX_P2P_IE_LEN] = { 0x00 };// NoA length should be n*(13) + 2 + u32 attr_contentlen = 0; + + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + +_func_enter_; + + if(IELength <= _BEACON_IE_OFFSET_) + return ret; + + ies = IEs + _BEACON_IE_OFFSET_; + ies_len = IELength - _BEACON_IE_OFFSET_; + + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen); + + while(p2p_ie) + { + // Get P2P Manageability IE. + if(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_MANAGEABILITY, p2p_attr, &attr_contentlen)) + { + if ((p2p_attr[0]&(BIT(0)|BIT(1))) == 0x01) { + ret = _FALSE; + } + break; + } + //Get the next P2P IE + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen); + } + +_func_exit_; + return ret; +} + #ifdef CONFIG_P2P_PS void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength) { diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_pwrctrl.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_pwrctrl.c index 0a16ad5c2e3b..99236dec978c 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_pwrctrl.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_pwrctrl.c @@ -532,9 +532,7 @@ _func_enter_; { if ( (pwrpriv->rpwm == pslv) #ifdef CONFIG_LPS_LCLK -#ifndef CONFIG_RTL8723A || ((pwrpriv->rpwm >= PS_STATE_S2)&&(pslv >= PS_STATE_S2)) -#endif #endif ) { @@ -610,14 +608,11 @@ _func_enter_; do { rtw_msleep_os(1); poll_cnt++; + cpwm_now = 0; rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_now); if ((cpwm_orig ^ cpwm_now) & 0x80) { -#ifdef CONFIG_RTL8723A - pwrpriv->cpwm = PS_STATE(cpwm_now); -#else // !CONFIG_RTL8723A pwrpriv->cpwm = PS_STATE_S4; -#endif // !CONFIG_RTL8723A pwrpriv->cpwm_tog = cpwm_now & PS_TOGGLE; #ifdef DBG_CHECK_FW_PS_STATE DBG_871X("%s: polling cpwm OK! poll_cnt=%d, cpwm_orig=%02x, cpwm_now=%02x , 0x100=0x%x\n" @@ -722,15 +717,14 @@ u8 PS_RDY_CHECK(_adapter * padapter) return _TRUE; } -#if defined(CONFIG_FWLPS_IN_IPS) && defined(CONFIG_PNO_SUPPORT) +#if defined(CONFIG_FWLPS_IN_IPS) 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 cpwm_orig = 0, cpwm_now = 0; u8 parm[H2C_INACTIVE_PS_LEN]={0}; if (padapter->netif_up == _FALSE) { @@ -738,23 +732,25 @@ void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable) 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__); + +#ifdef CONFIG_PNO_SUPPORT parm[0] = 0x03; - parm[1] = 0x01; - parm[2] = 0x01; - pHalFunc->fill_h2c_cmd(padapter, //H2C_FWLPS_IN_IPS_, + parm[1] = pwrpriv->pnlo_info->fast_scan_iterations; + parm[2] = pwrpriv->pnlo_info->slow_scan_period; +#else + parm[0] = 0x03; + parm[1] = 0x0; + parm[2] = 0x0; +#endif//CONFIG_PNO_SUPPORT + + rtw_hal_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. @@ -777,33 +773,18 @@ void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable) 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)); + if (parm[1] == 0 || parm[2] == 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)); } } } else { @@ -831,10 +812,6 @@ void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable) 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; } @@ -848,7 +825,7 @@ void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable) parm[0] = 0x0; parm[1] = 0x0; parm[2] = 0x0; - pHalFunc->fill_h2c_cmd(padapter, H2C_INACTIVE_PS_, + rtw_hal_fill_h2c_cmd(padapter, H2C_INACTIVE_PS_, H2C_INACTIVE_PS_LEN, parm); #ifdef CONFIG_BT_COEXIST rtw_btcoex_IpsNotify(padapter, IPS_NONE); @@ -924,6 +901,10 @@ _func_enter_; DBG_871X(FUNC_ADPT_FMT" Leave 802.11 power save - %s\n", FUNC_ADPT_ARG(padapter), msg); + if (pwrpriv->lps_leave_cnts < UINT_MAX) + pwrpriv->lps_leave_cnts++; + else + pwrpriv->lps_leave_cnts = 0; #ifdef CONFIG_TDLS _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); @@ -999,6 +980,10 @@ _func_enter_; DBG_871X(FUNC_ADPT_FMT" Enter 802.11 power save - %s\n", FUNC_ADPT_ARG(padapter), msg); + if (pwrpriv->lps_enter_cnts < UINT_MAX) + pwrpriv->lps_enter_cnts++; + else + pwrpriv->lps_enter_cnts = 0; #ifdef CONFIG_TDLS _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); @@ -1052,19 +1037,6 @@ _func_enter_; if (val8 & BIT(4)) pslv = PS_STATE_S2; -#ifdef CONFIG_RTL8723A - val8 = rtw_btcoex_RpwmVal(padapter); - switch (val8) - { - case 0x4: - pslv = PS_STATE_S3; - break; - - case 0xC: - pslv = PS_STATE_S4; - break; - } -#endif // CONFIG_RTL8723A } #endif // CONFIG_BT_COEXIST @@ -1291,11 +1263,7 @@ _func_enter_; rtw_hal_get_hwreg(Adapter, HW_VAR_CPWM, &cpwm_now); if ((cpwm_orig ^ cpwm_now) & 0x80) { -#ifdef CONFIG_RTL8723A - pwrpriv->cpwm = PS_STATE(cpwm_now); -#else // !CONFIG_RTL8723A pwrpriv->cpwm = PS_STATE_S4; -#endif // !CONFIG_RTL8723A pwrpriv->cpwm_tog = cpwm_now & PS_TOGGLE; #ifdef DBG_CHECK_FW_PS_STATE DBG_871X("%s: polling cpwm OK! cpwm_orig=%02x, cpwm_now=%02x, 0x100=0x%x \n" @@ -1680,24 +1648,6 @@ _func_enter_; pwrctrl = adapter_to_pwrctl(padapter); pslv = PS_STATE_S2; -#if defined(CONFIG_RTL8723A) && defined(CONFIG_BT_COEXIST) - if (rtw_btcoex_IsBtControlLps(padapter) == _TRUE) - { - u8 btcoex_rpwm; - btcoex_rpwm = rtw_btcoex_RpwmVal(padapter); - switch (btcoex_rpwm) - { - case 0x4: - pslv = PS_STATE_S3; - break; - - case 0xC: - pslv = PS_STATE_S4; - break; - } - } -#endif // CONFIG_RTL8723A & CONFIG_BT_COEXIST - _enter_pwrlock(&pwrctrl->lock); register_task_alive(pwrctrl, task); @@ -1762,19 +1712,6 @@ _func_enter_; if (val8 & BIT(4)) pslv = PS_STATE_S2; -#ifdef CONFIG_RTL8723A - val8 = rtw_btcoex_RpwmVal(padapter); - switch (val8) - { - case 0x4: - pslv = PS_STATE_S3; - break; - - case 0xC: - pslv = PS_STATE_S4; - break; - } -#endif // CONFIG_RTL8723A } #endif // CONFIG_BT_COEXIST @@ -1826,24 +1763,6 @@ _func_enter_; pwrctrl = adapter_to_pwrctl(padapter); pslv = PS_STATE_S2; -#if defined(CONFIG_RTL8723A) && defined(CONFIG_BT_COEXIST) - if (rtw_btcoex_IsBtControlLps(padapter) == _TRUE) - { - u8 btcoex_rpwm; - btcoex_rpwm = rtw_btcoex_RpwmVal(padapter); - switch (btcoex_rpwm) - { - case 0x4: - pslv = PS_STATE_S3; - break; - - case 0xC: - pslv = PS_STATE_S4; - break; - } - } -#endif // CONFIG_RTL8723A & CONFIG_BT_COEXIST - _enter_pwrlock(&pwrctrl->lock); register_task_alive(pwrctrl, XMIT_ALIVE); @@ -1903,24 +1822,6 @@ _func_enter_; pwrctrl = adapter_to_pwrctl(padapter); pslv = PS_STATE_S2; -#if defined(CONFIG_RTL8723A) && defined(CONFIG_BT_COEXIST) - if (rtw_btcoex_IsBtControlLps(padapter) == _TRUE) - { - u8 btcoex_rpwm; - btcoex_rpwm = rtw_btcoex_RpwmVal(padapter); - switch (btcoex_rpwm) - { - case 0x4: - pslv = PS_STATE_S3; - break; - - case 0xC: - pslv = PS_STATE_S4; - break; - } - } -#endif // CONFIG_RTL8723A & CONFIG_BT_COEXIST - _enter_pwrlock(&pwrctrl->lock); register_task_alive(pwrctrl, CMD_ALIVE); @@ -2044,19 +1945,6 @@ _func_enter_; if (val8 & BIT(4)) pslv = PS_STATE_S2; -#ifdef CONFIG_RTL8723A - val8 = rtw_btcoex_RpwmVal(padapter); - switch (val8) - { - case 0x4: - pslv = PS_STATE_S3; - break; - - case 0xC: - pslv = PS_STATE_S4; - break; - } -#endif // CONFIG_RTL8723A } #endif // CONFIG_BT_COEXIST @@ -2124,19 +2012,6 @@ _func_enter_; if (val8 & BIT(4)) pslv = PS_STATE_S2; -#ifdef CONFIG_RTL8723A - val8 = rtw_btcoex_RpwmVal(padapter); - switch (val8) - { - case 0x4: - pslv = PS_STATE_S3; - break; - - case 0xC: - pslv = PS_STATE_S4; - break; - } -#endif // CONFIG_RTL8723A } #endif // CONFIG_BT_COEXIST @@ -2245,6 +2120,8 @@ _func_enter_; pwrctrlpriv->rf_pwrstate = rf_on; pwrctrlpriv->ips_enter_cnts=0; pwrctrlpriv->ips_leave_cnts=0; + pwrctrlpriv->lps_enter_cnts=0; + pwrctrlpriv->lps_leave_cnts=0; pwrctrlpriv->bips_processing = _FALSE; pwrctrlpriv->ips_mode = padapter->registrypriv.ips_mode; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_recv.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_recv.c index a5e4e2d4a333..27bf5844f73f 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_recv.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_recv.c @@ -20,6 +20,7 @@ #define _RTW_RECV_C_ #include +#include #if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) @@ -30,8 +31,23 @@ #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS); -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS +enum { + SIGNAL_STAT_CALC_PROFILE_0 = 0, + SIGNAL_STAT_CALC_PROFILE_1, + SIGNAL_STAT_CALC_PROFILE_MAX +}; + +u8 signal_stat_calc_profile[SIGNAL_STAT_CALC_PROFILE_MAX][2] = { + {4, 1}, /* Profile 0 => pre_stat : curr_stat = 4 : 1 */ + {3, 7} /* Profile 1 => pre_stat : curr_stat = 3 : 7 */ +}; + +#ifndef RTW_SIGNAL_STATE_CALC_PROFILE +#define RTW_SIGNAL_STATE_CALC_PROFILE SIGNAL_STAT_CALC_PROFILE_0 +#endif + +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv) { @@ -646,7 +662,7 @@ _func_enter_; #ifdef CONFIG_CONCURRENT_MODE if(!IS_MCAST(prxattrib->ra))//bc/mc packets use sw decryption for concurrent mode #endif - psecuritypriv->hw_decrypted=_FALSE; + psecuritypriv->hw_decrypted=_FALSE; #ifdef DBG_RX_DECRYPTOR DBG_871X("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n", @@ -998,10 +1014,10 @@ sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame) u8 category_field = 1; #ifdef CONFIG_WFD u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a }; -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo); - //point to action field + /* point to action field */ paction+=pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE @@ -1009,82 +1025,76 @@ sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame) + PAYLOAD_TYPE_LEN + category_field; - if(ptdlsinfo->tdls_enable == _FALSE) - { + if (ptdlsinfo->tdls_enable == _FALSE) { DBG_871X("recv tdls frame, " "but tdls haven't enabled\n"); ret = _FAIL; return ret; } + + DBG_871X("[TDLS] Recv %s from "MAC_FMT"\n", rtw_tdls_action_txt(*paction), MAC_ARG(pattrib->src)); switch(*paction){ - case TDLS_SETUP_REQUEST: - DBG_871X("recv tdls setup request frame from "MAC_FMT"\n", MAC_ARG(pattrib->src)); - ret=On_TDLS_Setup_Req(adapter, precv_frame); - break; - case TDLS_SETUP_RESPONSE: - DBG_871X("recv tdls setup response frame from "MAC_FMT"\n", MAC_ARG(pattrib->src)); - ret=On_TDLS_Setup_Rsp(adapter, precv_frame); - break; - case TDLS_SETUP_CONFIRM: - DBG_871X("recv tdls setup confirm frame from "MAC_FMT"\n", MAC_ARG(pattrib->src)); - ret=On_TDLS_Setup_Cfm(adapter, precv_frame); - break; - case TDLS_TEARDOWN: - DBG_871X("recv tdls teardown, free sta_info from "MAC_FMT"\n", MAC_ARG(pattrib->src)); - ret=On_TDLS_Teardown(adapter, precv_frame); - break; - case TDLS_DISCOVERY_REQUEST: - DBG_871X("recv tdls discovery request frame from "MAC_FMT"\n", MAC_ARG(pattrib->src)); - ret=On_TDLS_Dis_Req(adapter, precv_frame); - break; - case TDLS_PEER_TRAFFIC_INDICATION: - DBG_871X("recv tdls peer traffic indication frame\n"); - ret=On_TDLS_Peer_Traffic_Indication(adapter, precv_frame); - break; - case TDLS_PEER_TRAFFIC_RESPONSE: - DBG_871X("recv tdls peer traffic response frame\n"); - ret=On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); - break; - case TDLS_CHANNEL_SWITCH_REQUEST: - DBG_871X("recv tdls channel switch request frame\n"); - ret=On_TDLS_Ch_Switch_Req(adapter, precv_frame); - break; - case TDLS_CHANNEL_SWITCH_RESPONSE: - DBG_871X("recv tdls channel switch response frame\n"); - ret=On_TDLS_Ch_Switch_Rsp(adapter, precv_frame); - break; + case TDLS_SETUP_REQUEST: + ret=On_TDLS_Setup_Req(adapter, precv_frame); + break; + case TDLS_SETUP_RESPONSE: + ret=On_TDLS_Setup_Rsp(adapter, precv_frame); + break; + case TDLS_SETUP_CONFIRM: + ret=On_TDLS_Setup_Cfm(adapter, precv_frame); + break; + case TDLS_TEARDOWN: + ret=On_TDLS_Teardown(adapter, precv_frame); + break; + case TDLS_DISCOVERY_REQUEST: + ret=On_TDLS_Dis_Req(adapter, precv_frame); + break; + case TDLS_PEER_TRAFFIC_INDICATION: + ret=On_TDLS_Peer_Traffic_Indication(adapter, precv_frame); + break; + case TDLS_PEER_TRAFFIC_RESPONSE: + ret=On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); + break; +#ifdef CONFIG_TDLS_CH_SW + case TDLS_CHANNEL_SWITCH_REQUEST: + ret=On_TDLS_Ch_Switch_Req(adapter, precv_frame); + break; + case TDLS_CHANNEL_SWITCH_RESPONSE: + ret=On_TDLS_Ch_Switch_Rsp(adapter, precv_frame); + break; +#endif #ifdef CONFIG_WFD - case 0x50: //First byte of WFA OUI - if( _rtw_memcmp(WFA_OUI, (paction), 3) ) - { - if( *(paction + 3) == 0x04) //Probe request frame - { - //WFDTDLS: for sigma test, do not setup direct link automatically - ptdlsinfo->dev_discovered = 1; - DBG_871X("recv tunneled probe request frame\n"); - issue_tunneled_probe_rsp(adapter, precv_frame); - } - if( *(paction + 3) == 0x05) //Probe response frame - { - //WFDTDLS: for sigma test, do not setup direct link automatically - ptdlsinfo->dev_discovered = 1; - DBG_871X("recv tunneled probe response frame\n"); - } + /* First byte of WFA OUI */ + case 0x50: + if (_rtw_memcmp(WFA_OUI, paction, 3)) { + /* Probe request frame */ + if (*(paction + 3) == 0x04) { + /* WFDTDLS: for sigma test, do not setup direct link automatically */ + ptdlsinfo->dev_discovered = _TRUE; + DBG_871X("recv tunneled probe request frame\n"); + issue_tunneled_probe_rsp(adapter, precv_frame); } - break; -#endif //CONFIG_WFD - default: - DBG_871X("receive TDLS frame %d but not support\n", *paction); - ret=_FAIL; - break; + /* Probe response frame */ + if (*(paction + 3) == 0x05) { + /* WFDTDLS: for sigma test, do not setup direct link automatically */ + ptdlsinfo->dev_discovered = _TRUE; + DBG_871X("recv tunneled probe response frame\n"); + } + } + break; +#endif /* CONFIG_WFD */ + default: + DBG_871X("receive TDLS frame %d but not support\n", *paction); + ret=_FAIL; + break; } exit: return ret; } -#endif +#endif /* CONFIG_TDLS */ void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info*sta); void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info*sta) @@ -1117,7 +1127,6 @@ void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_in pstats->rx_bytes += sz; #ifdef CONFIG_TDLS - if(psta->tdls_sta_state & TDLS_LINKED_STATE) { struct sta_info *pap_sta = NULL; @@ -1155,12 +1164,15 @@ sint sta2sta_data_frame( struct sta_priv *pstapriv = &adapter->stapriv; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; u8 *mybssid = get_bssid(pmlmepriv); - u8 *myhwaddr = myid(&adapter->eeprompriv); + u8 *myhwaddr = adapter_mac_addr(adapter); u8 * sta_addr = NULL; sint bmcast = IS_MCAST(pattrib->dst); #ifdef CONFIG_TDLS struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; +#ifdef CONFIG_TDLS_CH_SW + struct tdls_ch_switch *pchsw_info = &ptdlsinfo->chsw_info; +#endif struct sta_info *ptdls_sta=NULL; u8 *psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; //frame body located after [+2]: ether-type, [+1]: payload type @@ -1201,69 +1213,66 @@ _func_enter_; { #ifdef CONFIG_TDLS - //direct link data transfer - if(ptdlsinfo->link_established == _TRUE){ + /* direct link data transfer */ + if (ptdlsinfo->link_established == _TRUE) { ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); - if(ptdls_sta==NULL) - { + if (ptdls_sta == NULL) { ret=_FAIL; goto exit; - } - else if(ptdls_sta->tdls_sta_state&TDLS_LINKED_STATE) - { - // filter packets that SA is myself or multicast or broadcast - if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ + } else if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) { + /* filter packets that SA is myself or multicast or broadcast */ + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)) { ret= _FAIL; goto exit; } - // da should be for me - if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)) - { + /* da should be for me */ + if ((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) { ret= _FAIL; goto exit; } - // check BSSID - if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + /* check BSSID */ + if (_rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || - (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) - { + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN))) { ret= _FAIL; goto exit; } - //process UAPSD tdls sta +#ifdef CONFIG_TDLS_CH_SW + pchsw_info->ch_sw_state |= TDLS_PEER_AT_OFF_STATE; + + if(ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) { + if (!(pchsw_info->ch_sw_state & TDLS_PEER_AT_OFF_STATE)) { + DBG_871X("%s %d\n", __FUNCTION__, __LINE__); + issue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta->hwaddr, 0, 0, 0); + pchsw_info->ch_sw_state |= TDLS_PEER_AT_OFF_STATE; + /* On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); */ + } + } +#endif + + /* process UAPSD tdls sta */ process_pwrbit_data(adapter, precv_frame); - // if NULL-frame, check pwrbit - if ((GetFrameSubType(ptr) & WIFI_DATA_NULL) == WIFI_DATA_NULL) - { - //NULL-frame with pwrbit=1, buffer_STA should buffer frames for sleep_STA - if(GetPwrMgt(ptr)) - { + /* if NULL-frame, check pwrbit */ + if ((GetFrameSubType(ptr) & WIFI_DATA_NULL) == WIFI_DATA_NULL) { + /* NULL-frame with pwrbit=1, buffer_STA should buffer frames for sleep_STA */ + if (GetPwrMgt(ptr)) { + /* it would be triggered when we are off channel and receiving NULL DATA */ + /* we can confirm that peer STA is at off channel */ DBG_871X("TDLS: recv peer null frame with pwr bit 1\n"); //ptdls_sta->tdls_sta_state|=TDLS_PEER_SLEEP_STATE; - // it would be triggered when we are off channel and receiving NULL DATA - // we can confirm that peer STA is at off channel - } - else if(ptdls_sta->tdls_sta_state&TDLS_CH_SWITCH_ON_STATE) - { - if((ptdls_sta->tdls_sta_state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE) - { - issue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta->hwaddr, 0, 0, 0); - ptdls_sta->tdls_sta_state |= TDLS_PEER_AT_OFF_STATE; - On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); - } } - //[TDLS] TODO: Updated BSSID's seq. - DBG_871X("drop Null Data\n"); + /* TODO: Updated BSSID's seq. */ + //DBG_871X("drop Null Data\n"); ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE); ret= _FAIL; goto exit; } - //receive some of all TDLS management frames, process it at ON_TDLS - if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2))){ + /* receive some of all TDLS management frames, process it at ON_TDLS */ + if (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2)) { ret= OnTDLS(adapter, precv_frame); goto exit; } @@ -1280,7 +1289,7 @@ _func_enter_; } else -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ { // For Station mode, sa and bssid should always be BSSID, and DA is my mac-address if(!_rtw_memcmp(pattrib->bssid, pattrib->src, ETH_ALEN) ) @@ -1351,7 +1360,7 @@ _func_enter_; if (adapter->registrypriv.mp_mode == 1) { if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) - adapter->mppriv.rx_pktloss++; + adapter->mppriv.rx_pktloss++; } #endif ret= _FAIL; @@ -1379,7 +1388,7 @@ sint ap2sta_data_frame( struct sta_priv *pstapriv = &adapter->stapriv; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; u8 *mybssid = get_bssid(pmlmepriv); - u8 *myhwaddr = myid(&adapter->eeprompriv); + u8 *myhwaddr = adapter_mac_addr(adapter); sint bmcast = IS_MCAST(pattrib->dst); _func_enter_; @@ -1473,7 +1482,8 @@ _func_enter_; _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); // - _rtw_memcpy(pattrib->bssid, mybssid, ETH_ALEN); + if(adapter->mppriv.bRTWSmbCfg==_FALSE) + _rtw_memcpy(pattrib->bssid, mybssid, ETH_ALEN); *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info @@ -1587,17 +1597,15 @@ _func_enter_; else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ) { - DBG_871X("%s ,in WIFI_MP_STATE \n",__func__); - + //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); - + if(adapter->mppriv.bRTWSmbCfg == _FALSE) + _rtw_memcpy(pattrib->bssid, mybssid, ETH_ALEN); *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info if (*psta == NULL) { @@ -1611,7 +1619,7 @@ _func_enter_; } else { - u8 *myhwaddr = myid(&adapter->eeprompriv); + u8 *myhwaddr = adapter_mac_addr(adapter); if (!_rtw_memcmp(pattrib->ra, myhwaddr, ETH_ALEN)) { ret = RTW_RX_HANDLED; goto exit; @@ -1647,10 +1655,8 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame) } //receive the frames that ra(a1) is my address - if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN)) - { + if (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN)) return _FAIL; - } psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); if (psta==NULL) @@ -1842,7 +1848,7 @@ sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame) else if (GetFrameSubType(precv_frame->u.hdr.rx_data) == WIFI_PROBEREQ) psta->sta_stats.rx_probereq_pkts++; else if (GetFrameSubType(precv_frame->u.hdr.rx_data) == WIFI_PROBERSP) { - if (_rtw_memcmp(padapter->eeprompriv.mac_addr, GetAddr1Ptr(precv_frame->u.hdr.rx_data), ETH_ALEN) == _TRUE) + if (_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(precv_frame->u.hdr.rx_data), ETH_ALEN) == _TRUE) psta->sta_stats.rx_probersp_pkts++; else if (is_broadcast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data)) || is_multicast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data))) @@ -2009,9 +2015,9 @@ _func_enter_; pattrib->hdrlen = pattrib->to_fr_ds==3 ? 32 : 26; if(pattrib->priority!=0 && pattrib->priority!=3) - { adapter->recvpriv.bIsAnyNonBEPkts = _TRUE; - } + else + adapter->recvpriv.bIsAnyNonBEPkts = _FALSE; } else { @@ -2038,14 +2044,6 @@ _func_enter_; goto exit; } -#if 0 - if(psta->tdls_sta_state & TDLS_LINKED_STATE ) - { - if(psta->dot118021XPrivacy==_AES_) - pattrib->encrypt=psta->dot118021XPrivacy; - } -#endif //CONFIG_TDLS - if(pattrib->privacy){ RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("validate_recv_data_frame:pattrib->privacy=%x\n", pattrib->privacy)); @@ -2695,6 +2693,7 @@ static void recvframe_expand_pkt( _pkt *ppkt; u8 shift_sz; u32 alloc_sz; + u8 *ptr; pfhdr = &prframe->u.hdr; @@ -2724,7 +2723,9 @@ static void recvframe_expand_pkt( skb_reserve(ppkt, shift_sz); // copy data to new pkt - _rtw_memcpy(skb_put(ppkt, pfhdr->len), pfhdr->rx_data, pfhdr->len); + ptr = skb_put(ppkt, pfhdr->len); + if (ptr) + _rtw_memcpy(ptr, pfhdr->rx_data, pfhdr->len); rtw_skb_free(pfhdr->pkt); @@ -3703,6 +3704,8 @@ static sint MPwlanhdr_to_ethhdr ( union recv_frame *precvframe) u16 eth_type, len; u8 bsnaphdr; u8 *psnap_type; + u8 mcastheadermac[]={0x01,0x00,0x5e}; + struct ieee80211_snap_hdr *psnap; sint ret=_SUCCESS; @@ -3756,19 +3759,28 @@ _func_enter_; _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); + if(adapter->mppriv.bRTWSmbCfg==_TRUE) + { +// if(_rtw_memcmp(mcastheadermac, pattrib->dst, 3) == _TRUE)//SimpleConfig Dest. +// _rtw_memcpy(ptr+ETH_ALEN, pattrib->bssid, ETH_ALEN); + + if(_rtw_memcmp(mcastheadermac, pattrib->bssid, 3) == _TRUE) //SimpleConfig Dest. + _rtw_memcpy(ptr, pattrib->bssid, ETH_ALEN); + } + + _func_exit_; return ret; } -int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) +int mp_recv_frame(_adapter *padapter, union recv_frame *rframe) { int ret = _SUCCESS; struct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib; @@ -3782,37 +3794,30 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) 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) + DBG_COUNTER(padapter->rx_logs.core_rx_pre); + + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _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++; + } + else{ + if(_SUCCESS == validate_mp_recv_frame(padapter, rframe)) + padapter->mppriv.rx_pktcount++; + else + padapter->mppriv.rx_pktcount_filter_out++; + } + + if(pmppriv->rx_bindicatePkt == _FALSE) { - if (pattrib->crc_err == 1){ - padapter->mppriv.rx_crcerrpktcount++; - } - else{ - if(_SUCCESS == validate_mp_recv_frame(padapter, rframe)) - padapter->mppriv.rx_pktcount++; - else - 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); + //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); @@ -3870,22 +3875,21 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) if (ret != _SUCCESS) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); + 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__); + 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" )); + 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) - { + 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 @@ -3893,34 +3897,414 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) 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; - } - } } + 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; + +exit: + return ret; + +} + +static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, u8 *buf) +{ +#define CHAN2FREQ(a) ((a < 14)?(2407+5*a):(5000+5*a)) + +#if 0 +#define RTW_RX_RADIOTAP_PRESENT ( \ + (1 << IEEE80211_RADIOTAP_TSFT) | \ + (1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ + (1 << IEEE80211_RADIOTAP_CHANNEL) | \ + (0 << IEEE80211_RADIOTAP_FHSS) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ + (0 << IEEE80211_RADIOTAP_LOCK_QUALITY) | \ + (0 << IEEE80211_RADIOTAP_TX_ATTENUATION) | \ + (0 << IEEE80211_RADIOTAP_DB_TX_ATTENUATION) | \ + (0 << IEEE80211_RADIOTAP_DBM_TX_POWER) | \ + (1 << IEEE80211_RADIOTAP_ANTENNA) | \ + (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \ + (0 << IEEE80211_RADIOTAP_DB_ANTNOISE) | \ + (0 << IEEE80211_RADIOTAP_RX_FLAGS) | \ + (0 << IEEE80211_RADIOTAP_TX_FLAGS) | \ + (0 << IEEE80211_RADIOTAP_RTS_RETRIES) | \ + (0 << IEEE80211_RADIOTAP_DATA_RETRIES) | \ + (0 << IEEE80211_RADIOTAP_MCS) | \ + (0 << IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE)| \ + (0 << IEEE80211_RADIOTAP_VENDOR_NAMESPACE) | \ + (0 << IEEE80211_RADIOTAP_EXT) | \ + 0) + + /* (0 << IEEE80211_RADIOTAP_AMPDU_STATUS) | \ */ + /* (0 << IEEE80211_RADIOTAP_VHT) | \ */ +#endif +#ifndef IEEE80211_RADIOTAP_MCS +#define IEEE80211_RADIOTAP_MCS 19 +#endif +#ifndef IEEE80211_RADIOTAP_VHT +#define IEEE80211_RADIOTAP_VHT 21 +#endif + +#ifndef IEEE80211_RADIOTAP_F_BADFCS +#define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* bad FCS */ +#endif + + sint ret = _SUCCESS; + _adapter *adapter = precvframe->u.hdr.adapter; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + u16 tmp_16bit = 0; + + u8 data_rate[] = { + 2, 4, 11, 22, /* CCK */ + 12, 18, 24, 36, 48, 72, 93, 108, /* OFDM */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* HT MCS index */ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 1 */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 2 */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 3 */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 4 */ + }; + + _pkt *pskb = NULL; + + struct ieee80211_radiotap_header *rtap_hdr = NULL; + u8 *ptr = NULL; + + u8 hdr_buf[64] = {0}; + u16 rt_len = 8; + + /* create header */ + rtap_hdr = (struct ieee80211_radiotap_header *)&hdr_buf[0]; + rtap_hdr->it_version = PKTHDR_RADIOTAP_VERSION; + + /* tsft */ + if (pattrib->tsfl) { + u64 tmp_64bit; + + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_TSFT); + tmp_64bit = cpu_to_le64(pattrib->tsfl); + memcpy(&hdr_buf[rt_len], &tmp_64bit, 8); + rt_len += 8; + } + + /* flags */ + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_FLAGS); + if (0) + hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_CFP; + + if (0) + hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_SHORTPRE; + + if ((pattrib->encrypt == 1) || (pattrib->encrypt == 5)) + hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_WEP; + + if (pattrib->mfrag) + hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_FRAG; + +#ifndef CONFIG_RX_PACKET_APPEND_FCS + hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_FCS; +#endif + + if (0) + hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_DATAPAD; + + if (pattrib->crc_err) + hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_BADFCS; + + if (pattrib->sgi) { + /* Currently unspecified but used */ + hdr_buf[rt_len] |= 0x80; + } + rt_len += 1; + + /* rate */ + if (pattrib->data_rate < 12) { + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_RATE); + if (pattrib->data_rate < 4) { + /* CCK */ + hdr_buf[rt_len] = data_rate[pattrib->data_rate]; + } else { + /* OFDM */ + hdr_buf[rt_len] = data_rate[pattrib->data_rate]; } + } + rt_len += 1; /* force padding 1 byte for aligned */ + + /* channel */ + tmp_16bit = 0; + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_CHANNEL); + tmp_16bit = CHAN2FREQ(rtw_get_oper_ch(padapter)); + /*tmp_16bit = CHAN2FREQ(pHalData->CurrentChannel);*/ + memcpy(&hdr_buf[rt_len], &tmp_16bit, 2); + rt_len += 2; + + /* channel flags */ + tmp_16bit = 0; + if (pHalData->CurrentBandType == 0) + tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_2GHZ); + else + tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_5GHZ); + + if (pattrib->data_rate < 12) { + if (pattrib->data_rate < 4) { + /* CCK */ + tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_CCK); + } else { + /* OFDM */ + tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_OFDM); + } + } else { + tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_DYN); + } + memcpy(&hdr_buf[rt_len], &tmp_16bit, 2); + rt_len += 2; - 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 + /* dBm Antenna Signal */ + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL); + hdr_buf[rt_len] = pattrib->phy_info.RecvSignalPower; + rt_len += 1; + +#if 0 + /* dBm Antenna Noise */ + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE); + hdr_buf[rt_len] = 0; + rt_len += 1; + + /* Signal Quality */ + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_LOCK_QUALITY); + hdr_buf[rt_len] = pattrib->phy_info.SignalQuality; + rt_len += 1; +#endif + + /* Antenna */ + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_ANTENNA); + hdr_buf[rt_len] = 0; /* pHalData->rf_type; */ + rt_len += 1; + + /* RX flags */ + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_RX_FLAGS); +#if 0 + tmp_16bit = cpu_to_le16(0); + memcpy(ptr, &tmp_16bit, 1); +#endif + rt_len += 2; + + /* MCS information */ + if (pattrib->data_rate >= 12 && pattrib->data_rate < 44) { + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_MCS); + /* known, flag */ + hdr_buf[rt_len] |= BIT1; /* MCS index known */ + + /* bandwidth */ + hdr_buf[rt_len] |= BIT0; + hdr_buf[rt_len+1] |= (pattrib->bw & 0x03); + + /* guard interval */ + hdr_buf[rt_len] |= BIT2; + hdr_buf[rt_len+1] |= (pattrib->sgi & 0x01) << 2; + + /* STBC */ + hdr_buf[rt_len] |= BIT5; + hdr_buf[rt_len+1] |= (pattrib->stbc & 0x03) << 5; + + rt_len += 2; + + /* MCS rate index */ + hdr_buf[rt_len] = data_rate[pattrib->data_rate]; + rt_len += 1; + } + + /* VHT */ + if (pattrib->data_rate >= 44 && pattrib->data_rate < 84) { + rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_VHT); + + /* known 16 bit, flag 8 bit */ + tmp_16bit = 0; + + /* Bandwidth */ + tmp_16bit |= BIT6; + + /* Group ID */ + tmp_16bit |= BIT7; + + /* Partial AID */ + tmp_16bit |= BIT8; + + /* STBC */ + tmp_16bit |= BIT0; + hdr_buf[rt_len+2] |= (pattrib->stbc & 0x01); + + /* Guard interval */ + tmp_16bit |= BIT2; + hdr_buf[rt_len+2] |= (pattrib->sgi & 0x01) << 2; + + /* LDPC extra OFDM symbol */ + tmp_16bit |= BIT4; + hdr_buf[rt_len+2] |= (pattrib->ldpc & 0x01) << 4; + + memcpy(&hdr_buf[rt_len], &tmp_16bit, 2); + rt_len += 3; + + /* bandwidth */ + if (pattrib->bw == 0) + hdr_buf[rt_len] |= 0; + else if (pattrib->bw == 1) + hdr_buf[rt_len] |= 1; + else if (pattrib->bw == 2) + hdr_buf[rt_len] |= 4; + else if (pattrib->bw == 3) + hdr_buf[rt_len] |= 11; + rt_len += 1; + + /* mcs_nss */ + if (pattrib->data_rate >= 44 && pattrib->data_rate < 54) { + hdr_buf[rt_len] |= 1; + hdr_buf[rt_len] |= data_rate[pattrib->data_rate] << 4; + } else if (pattrib->data_rate >= 54 && pattrib->data_rate < 64) { + hdr_buf[rt_len + 1] |= 2; + hdr_buf[rt_len + 1] |= data_rate[pattrib->data_rate] << 4; + } else if (pattrib->data_rate >= 64 && pattrib->data_rate < 74) { + hdr_buf[rt_len + 2] |= 3; + hdr_buf[rt_len + 2] |= data_rate[pattrib->data_rate] << 4; + } else if (pattrib->data_rate >= 74 && pattrib->data_rate < 84) { + hdr_buf[rt_len + 3] |= 4; + hdr_buf[rt_len + 3] |= data_rate[pattrib->data_rate] << 4; + } + rt_len += 4; + + /* coding */ + hdr_buf[rt_len] = 0; + rt_len += 1; + + /* group_id */ + hdr_buf[rt_len] = 0; + rt_len += 1; + + /* partial_aid */ + tmp_16bit = 0; + memcpy(&hdr_buf[rt_len], &tmp_16bit, 2); + rt_len += 2; + } + + /* push to skb */ + pskb = (_pkt *)buf; + if (skb_headroom(pskb) < rt_len) { + DBG_871X("%s:%d %s headroom is too small.\n", __FILE__, __LINE__, __func__); ret = _FAIL; + return ret; + } + + ptr = skb_push(pskb, rt_len); + if (ptr) { + rtap_hdr->it_len = cpu_to_le16(rt_len); + memcpy(ptr, rtap_hdr, rt_len); + } else { + ret = _FAIL; + } + + return ret; + +} + +int recv_frame_monitor(_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; + _pkt *pskb = NULL; + + /* read skb information from recv frame */ + pskb = rframe->u.hdr.pkt; + pskb->len = rframe->u.hdr.len; + pskb->data = rframe->u.hdr.rx_data; + skb_set_tail_pointer(pskb, rframe->u.hdr.len); + + /* fill radiotap header */ + if (fill_radiotap_hdr(padapter, rframe, (u8 *)pskb) == _FAIL) { + ret = _FAIL; + rtw_free_recvframe(rframe, pfree_recv_queue); /* free this recv_frame */ goto exit; - } - + } + + /* write skb information to recv frame */ + skb_reset_mac_header(pskb); + rframe->u.hdr.len = pskb->len; + rframe->u.hdr.rx_data = pskb->data; + rframe->u.hdr.rx_head = pskb->head; + rframe->u.hdr.rx_tail = skb_tail_pointer(pskb); + rframe->u.hdr.rx_end = skb_end_pointer(pskb); + + if ((padapter->bDriverStopped == _FALSE) && (padapter->bSurpriseRemoved == _FALSE)) { + /* indicate this recv_frame */ + ret = rtw_recv_monitor(padapter, rframe); + if (ret != _SUCCESS) { + ret = _FAIL; + rtw_free_recvframe(rframe, pfree_recv_queue); /* free this recv_frame */ + goto exit; + } + } else { + ret = _FAIL; + rtw_free_recvframe(rframe, pfree_recv_queue); /* free this recv_frame */ + goto exit; + } + +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 DBG_RX_COUNTER_DUMP + if( padapter->dump_rx_cnt_mode & DUMP_DRV_RX_COUNTER ) + { + if (pattrib->crc_err == 1) + padapter->drv_rx_cnt_crcerror++; + else + padapter->drv_rx_cnt_ok++; + } #endif +#ifdef CONFIG_MP_INCLUDED + if (padapter->registrypriv.mp_mode == 1 || padapter->mppriv.bRTWSmbCfg ==_TRUE) + { + mp_recv_frame(padapter,rframe); + ret = _FAIL; + goto exit; + } + else +#endif + { //check the frame crtl field and decache ret = validate_recv_frame(padapter, rframe); if (ret != _SUCCESS) @@ -3929,7 +4313,7 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame goto exit; } - + } exit: return ret; } @@ -3984,10 +4368,9 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe) if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, ETH_TYPE_LEN)) && ((*pcategory==RTW_WLAN_CATEGORY_TDLS) || (*pcategory==RTW_WLAN_CATEGORY_P2P))){ - ret = OnTDLS(padapter, prframe); //all of functions will return _FAIL + ret = OnTDLS(padapter, prframe); if(ret == _FAIL) goto _exit_recv_func; - //goto _exit_recv_func; } #endif //CONFIG_TDLS @@ -4110,6 +4493,13 @@ int recv_func(_adapter *padapter, union recv_frame *rframe) struct security_priv *psecuritypriv=&padapter->securitypriv; struct mlme_priv *mlmepriv = &padapter->mlmepriv; + if (check_fwstate(mlmepriv, WIFI_MONITOR_STATE)) { + /* monitor mode */ + recv_frame_monitor(padapter, rframe); + ret = _SUCCESS; + goto exit; + } else + /* check if need to handle uc_swdec_pending_queue*/ if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && psecuritypriv->busetkipkey) { @@ -4213,7 +4603,7 @@ void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ u8 avg_signal_qual = 0; u32 num_signal_strength = 0; u32 num_signal_qual = 0; - u8 _alpha = 5; // this value is based on converging_constant = 5000 and sampling_interval = 1000 + u8 ratio_pre_stat = 0, ratio_curr_stat = 0, ratio_total = 0, ratio_profile = SIGNAL_STAT_CALC_PROFILE_0; if(adapter->recvpriv.is_signal_dbg) { //update the user specific value, signal_strength_dbg, to signal_strength, rssi @@ -4254,21 +4644,28 @@ void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ goto set_timer; #endif + if (RTW_SIGNAL_STATE_CALC_PROFILE < SIGNAL_STAT_CALC_PROFILE_MAX) + ratio_profile = RTW_SIGNAL_STATE_CALC_PROFILE; + + ratio_pre_stat = signal_stat_calc_profile[ratio_profile][0]; + ratio_curr_stat = signal_stat_calc_profile[ratio_profile][1]; + ratio_total = ratio_pre_stat + ratio_curr_stat; + //update value of signal_strength, rssi, signal_qual - tmp_s = (avg_signal_strength+(_alpha-1)*recvpriv->signal_strength); - if(tmp_s %_alpha) - tmp_s = tmp_s/_alpha + 1; + tmp_s = (ratio_curr_stat * avg_signal_strength + ratio_pre_stat * recvpriv->signal_strength); + if (tmp_s % ratio_total) + tmp_s = tmp_s / ratio_total + 1; else - tmp_s = tmp_s/_alpha; - if(tmp_s>100) + tmp_s = tmp_s / ratio_total; + if (tmp_s > 100) tmp_s = 100; - tmp_q = (avg_signal_qual+(_alpha-1)*recvpriv->signal_qual); - if(tmp_q %_alpha) - tmp_q = tmp_q/_alpha + 1; + tmp_q = (ratio_curr_stat * avg_signal_qual + ratio_pre_stat * recvpriv->signal_qual); + if (tmp_q % ratio_total) + tmp_q = tmp_q / ratio_total + 1; else - tmp_q = tmp_q/_alpha; - if(tmp_q>100) + tmp_q = tmp_q / ratio_total; + if (tmp_q > 100) tmp_q = 100; recvpriv->signal_strength = tmp_s; @@ -4296,5 +4693,219 @@ set_timer: } #endif //CONFIG_NEW_SIGNAL_STAT_PROCESS +static void rx_process_rssi(_adapter *padapter,union recv_frame *prframe) +{ + u32 last_rssi, tmp_val; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + struct signal_stat * signal_stat = &padapter->recvpriv.signal_strength_data; +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + //DBG_8192C("process_rssi=> pattrib->rssil(%d) signal_strength(%d)\n ",pattrib->RecvSignalPower,pattrib->signal_strength); + //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon) + { + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + if(signal_stat->update_req) { + signal_stat->total_num = 0; + signal_stat->total_val = 0; + signal_stat->update_req = 0; + } + + signal_stat->total_num++; + signal_stat->total_val += pattrib->phy_info.SignalStrength; + signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; + #else //CONFIG_NEW_SIGNAL_STAT_PROCESS + + //Adapter->RxStats.RssiCalculateCnt++; //For antenna Test + if(padapter->recvpriv.signal_strength_data.total_num++ >= PHY_RSSI_SLID_WIN_MAX) + { + padapter->recvpriv.signal_strength_data.total_num = PHY_RSSI_SLID_WIN_MAX; + last_rssi = padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index]; + padapter->recvpriv.signal_strength_data.total_val -= last_rssi; + } + padapter->recvpriv.signal_strength_data.total_val +=pattrib->phy_info.SignalStrength; + + padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index++] = pattrib->phy_info.SignalStrength; + if(padapter->recvpriv.signal_strength_data.index >= PHY_RSSI_SLID_WIN_MAX) + padapter->recvpriv.signal_strength_data.index = 0; + + + tmp_val = padapter->recvpriv.signal_strength_data.total_val/padapter->recvpriv.signal_strength_data.total_num; + + if(padapter->recvpriv.is_signal_dbg) { + padapter->recvpriv.signal_strength= 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)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)); + #endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + } +} + +static void rx_process_link_qual(_adapter *padapter,union recv_frame *prframe) +{ + u32 last_evm=0, tmpVal; + struct rx_pkt_attrib *pattrib; +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + struct signal_stat * signal_stat; +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + if(prframe == NULL || padapter==NULL){ + return; + } + + pattrib = &prframe->u.hdr.attrib; +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + signal_stat = &padapter->recvpriv.signal_qual_data; +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + //DBG_8192C("process_link_qual=> pattrib->signal_qual(%d)\n ",pattrib->signal_qual); + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + if(signal_stat->update_req) { + signal_stat->total_num = 0; + signal_stat->total_val = 0; + signal_stat->update_req = 0; + } + + signal_stat->total_num++; + signal_stat->total_val += pattrib->phy_info.SignalQuality; + signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; + +#else //CONFIG_NEW_SIGNAL_STAT_PROCESS + if(pattrib->phy_info.SignalQuality != 0) + { + // + // 1. Record the general EVM to the sliding window. + // + if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX) + { + padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX; + last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index]; + padapter->recvpriv.signal_qual_data.total_val -= last_evm; + } + padapter->recvpriv.signal_qual_data.total_val += pattrib->phy_info.SignalQuality; + + padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = pattrib->phy_info.SignalQuality; + if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) + padapter->recvpriv.signal_qual_data.index = 0; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, pattrib->phy_info.SignalQuality)); + + // <1> Showed on UI for user, in percentage. + tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num; + padapter->recvpriv.signal_qual=(u8)tmpVal; + + } + else + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" pattrib->signal_qual =%d\n", pattrib->phy_info.SignalQuality)); + } +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS +} + +void rx_process_phy_info(_adapter *padapter, union recv_frame *rframe) +{ + /* Check RSSI */ + rx_process_rssi(padapter, rframe); + + /* Check PWDB */ + //process_PWDB(padapter, rframe); + + //UpdateRxSignalStatistics8192C(Adapter, pRfd); + + /* Check EVM */ + rx_process_link_qual(padapter, rframe); + #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA + rtw_store_phy_info( padapter, rframe); + #endif +} + +void rx_query_phy_status( + union recv_frame *precvframe, + u8 *pphy_status) +{ + PADAPTER padapter = precvframe->u.hdr.adapter; + struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + PODM_PHY_INFO_T pPHYInfo = (PODM_PHY_INFO_T)(&pattrib->phy_info); + u8 *wlanhdr; + ODM_PACKET_INFO_T pkt_info; + u8 *sa; + struct sta_priv *pstapriv; + struct sta_info *psta = NULL; + struct dvobj_priv *psdpriv = padapter->dvobj; + struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; + //_irqL irqL; + + pkt_info.bPacketMatchBSSID =_FALSE; + pkt_info.bPacketToSelf = _FALSE; + pkt_info.bPacketBeacon = _FALSE; + + wlanhdr = get_recvframe_data(precvframe); + pkt_info.bPacketMatchBSSID = (!IsFrameTypeCtrl(wlanhdr)) + && (!pattrib->icv_err) && (!pattrib->crc_err) + && _rtw_memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN); + + pkt_info.bToSelf = (!pattrib->icv_err) && (!pattrib->crc_err) + && _rtw_memcmp(get_ra(wlanhdr), adapter_mac_addr(padapter), ETH_ALEN); + + pkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID + && _rtw_memcmp(get_ra(wlanhdr), adapter_mac_addr(padapter), ETH_ALEN); + + pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID + && (GetFrameSubType(wlanhdr) == WIFI_BEACON); + + sa = get_ta(wlanhdr); + + pkt_info.StationID = 0xFF; + + if (_rtw_memcmp(adapter_mac_addr(padapter), sa, ETH_ALEN) == _TRUE) { + static u32 start_time = 0; + + if ((start_time == 0) || (rtw_get_passing_time_ms(start_time) > 5000)) { + DBG_871X_LEVEL(_drv_always_, "Warning!!! %s: Confilc mac addr!!\n", __func__); + start_time = rtw_get_current_time(); + } + pdbgpriv->dbg_rx_conflic_mac_addr_cnt++; + } else{ + pstapriv = &padapter->stapriv; + psta = rtw_get_stainfo(pstapriv, sa); + if (psta) + pkt_info.StationID = psta->mac_id; + } + + pkt_info.DataRate = pattrib->data_rate; + + //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL); + ODM_PhyStatusQuery(&pHalData->odmpriv, pPHYInfo, pphy_status, &pkt_info); + if (psta) + psta->rssi = pattrib->phy_info.RecvSignalPower; + //_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL); + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + if (GET_HAL_DATA(padapter)->odmpriv.RSSI_test == _FALSE) +#endif + { + precvframe->u.hdr.psta = NULL; + if (pkt_info.bPacketMatchBSSID + && (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) + ) { + if (psta) { + precvframe->u.hdr.psta = psta; + rx_process_phy_info(padapter, precvframe); + } + } else if (pkt_info.bPacketToSelf || pkt_info.bPacketBeacon) { + if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) { + if (psta) + precvframe->u.hdr.psta = psta; + } + rx_process_phy_info(padapter, precvframe); + } + } +} diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_security.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_security.c index 9841568494ec..874ab1ad2e43 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_security.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_security.c @@ -1733,8 +1733,9 @@ _func_enter_; prwskey=pattrib->dot118021x_UncstKey.skey; } -#ifdef CONFIG_TDLS //swencryption +#ifdef CONFIG_TDLS { + /* Swencryption */ struct sta_info *ptdls_sta; ptdls_sta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->dst[0] ); if((ptdls_sta != NULL) && (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) ) @@ -3029,12 +3030,12 @@ void wpa_tdls_generate_tpk(_adapter *padapter, PVOID sta) * added by the KDF anyway.. */ - if (os_memcmp(myid(&(padapter->eeprompriv)), psta->hwaddr, ETH_ALEN) < 0) { - _rtw_memcpy(data, myid(&(padapter->eeprompriv)), ETH_ALEN); + if (os_memcmp(adapter_mac_addr(padapter), psta->hwaddr, ETH_ALEN) < 0) { + _rtw_memcpy(data, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(data + ETH_ALEN, psta->hwaddr, ETH_ALEN); } else { _rtw_memcpy(data, psta->hwaddr, ETH_ALEN); - _rtw_memcpy(data + ETH_ALEN, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(data + ETH_ALEN, adapter_mac_addr(padapter), ETH_ALEN); } _rtw_memcpy(data + 2 * ETH_ALEN, get_bssid(pmlmepriv), ETH_ALEN); @@ -3101,6 +3102,55 @@ int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, } +/** + * wpa_tdls_teardown_ftie_mic - Calculate TDLS TEARDOWN FTIE MIC + * @kck: TPK-KCK + * @lnkid: Pointer to the beginning of Link Identifier IE + * @reason: Reason code of TDLS Teardown + * @dialog_token: Dialog token that was used in the MIC calculation for TPK Handshake Message 3 + * @trans_seq: Transaction Sequence number (1 octet) which shall be set to the value 4 + * @ftie: Pointer to the beginning of FT IE + * @mic: Pointer for writing MIC + * + * Calculate MIC for TDLS TEARDOWN frame according to Section 10.22.5 in IEEE 802.11 - 2012. + */ +int wpa_tdls_teardown_ftie_mic(u8 *kck, u8 *lnkid, u16 reason, + u8 dialog_token, u8 trans_seq, u8 *ftie, u8 *mic) +{ + u8 *buf, *pos; + struct wpa_tdls_ftie *_ftie; + int ret; + int len = 2 + lnkid[1] + 2 + 1 + 1 + 2 + ftie[1]; + + buf = rtw_zmalloc(len); + if (!buf) { + DBG_871X("TDLS: No memory for MIC calculation\n"); + return -1; + } + + pos = buf; + /* 1) Link Identifier IE */ + _rtw_memcpy(pos, lnkid, 2 + lnkid[1]); + pos += 2 + lnkid[1]; + /* 2) Reason Code */ + _rtw_memcpy(pos, (u8 *)&reason, 2); + pos += 2; + /* 3) Dialog Token */ + *pos++ = dialog_token; + /* 4) Transaction Sequence number */ + *pos++ = trans_seq; + /* 5) FTIE, with the MIC field of the FTIE set to 0 */ + _rtw_memcpy(pos, ftie, 2 + ftie[1]); + _ftie = (struct wpa_tdls_ftie *) pos; + _rtw_memset(_ftie->mic, 0, TDLS_MIC_LEN); + pos += 2 + ftie[1]; + + ret = omac1_aes_128(kck, buf, pos - buf, mic); + rtw_mfree(buf, len); + return ret; + +} + int tdls_verify_mic(u8 *kck, u8 trans_seq, u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie) { @@ -3112,14 +3162,14 @@ int tdls_verify_mic(u8 *kck, u8 trans_seq, if (lnkid == NULL || rsnie == NULL || timeoutie == NULL || ftie == NULL){ - return 0; + return _FAIL; } len = 2 * ETH_ALEN + 1 + 2 + 18 + 2 + *(rsnie+1) + 2 + *(timeoutie+1) + 2 + *(ftie+1); buf = rtw_zmalloc(len); if (buf == NULL) - return 0; + return _FAIL; pos = buf; /* 1) TDLS initiator STA MAC address */ @@ -3149,17 +3199,17 @@ int tdls_verify_mic(u8 *kck, u8 trans_seq, ret = omac1_aes_128(kck, buf, pos - buf, mic); rtw_mfree(buf, len); if (ret) - return 0; + return _FAIL; rx_ftie = ftie+4; if (os_memcmp(mic, rx_ftie, 16) == 0) { //Valid MIC - return 1; + return _SUCCESS; } //Invalid MIC DBG_871X( "[%s] Invalid MIC\n", __FUNCTION__); - return 0; + return _FAIL; } #endif //CONFIG_TDLS diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sreset.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sreset.c index c7066f8fb9eb..ec95b4151592 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sreset.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sreset.c @@ -162,7 +162,7 @@ void sreset_restore_security_station(_adapter *padapter) else { //pairwise key - rtw_setstakey_cmd(padapter, psta, _TRUE,_FALSE); + rtw_setstakey_cmd(padapter, psta, UNICAST_KEY,_FALSE); //group key rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0,_FALSE); } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sta_mgt.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sta_mgt.c index f17b2a2dc475..be20de650e5e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sta_mgt.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sta_mgt.c @@ -412,6 +412,7 @@ _func_enter_; preorder_ctrl->wend_b= 0xffff; //preorder_ctrl->wsize_b = (NR_RECVBUFF-2); preorder_ctrl->wsize_b = 64;//64; + preorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID; _rtw_init_queue(&preorder_ctrl->pending_recvframe_queue); @@ -540,6 +541,7 @@ _func_enter_; _cancel_timer_ex(&psta->addba_retry_timer); #ifdef CONFIG_TDLS + psta->tdls_sta_state = TDLS_STATE_NONE; rtw_free_tdls_timer(psta); #endif //CONFIG_TDLS diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_tdls.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_tdls.c index 21f9fcc8342b..5aed6aeb8fd1 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_tdls.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_tdls.c @@ -22,6 +22,10 @@ #include #ifdef CONFIG_TDLS +#define ONE_SEC 1000 /* 1000 ms */ + +extern unsigned char MCS_rate_2R[16]; +extern unsigned char MCS_rate_1R[16]; extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame); void rtw_reset_tdls_info(_adapter* padapter) @@ -29,18 +33,38 @@ void rtw_reset_tdls_info(_adapter* padapter) struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; ptdlsinfo->ap_prohibited = _FALSE; + + /* For TDLS channel switch, currently we only allow it to work in wifi logo test mode */ + if (padapter->registrypriv.wifi_spec == 1) + { + ptdlsinfo->ch_switch_prohibited = _FALSE; + } + else + { + ptdlsinfo->ch_switch_prohibited = _TRUE; + } + ptdlsinfo->link_established = _FALSE; ptdlsinfo->sta_cnt = 0; ptdlsinfo->sta_maximum = _FALSE; + +#ifdef CONFIG_TDLS_CH_SW + ptdlsinfo->chsw_info.ch_sw_state = TDLS_STATE_NONE; + ATOMIC_SET(&ptdlsinfo->chsw_info.chsw_on, _FALSE); + ptdlsinfo->chsw_info.off_ch_num = 0; + ptdlsinfo->chsw_info.ch_offset = 0; + ptdlsinfo->chsw_info.cur_time = 0; + ptdlsinfo->chsw_info.delay_switch_back = _FALSE; + ptdlsinfo->chsw_info.dump_stack = _FALSE; +#endif + ptdlsinfo->ch_sensing = 0; - ptdlsinfo->cur_channel = 0; - ptdlsinfo->candidate_ch = 1; //when inplement channel switching, default candidate channel is 1 ptdlsinfo->watchdog_count = 0; - ptdlsinfo->dev_discovered = 0; + ptdlsinfo->dev_discovered = _FALSE; #ifdef CONFIG_WFD ptdlsinfo->wfd_info = &padapter->wfd_info; -#endif //CONFIG_WFD +#endif /* ONFIG_WFD */ } int rtw_init_tdls_info(_adapter* padapter) @@ -48,9 +72,15 @@ int rtw_init_tdls_info(_adapter* padapter) int res = _SUCCESS; struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - ptdlsinfo->tdls_enable = _TRUE; rtw_reset_tdls_info(padapter); + ptdlsinfo->tdls_enable = _TRUE; +#ifdef CONFIG_TDLS_DRIVER_SETUP + ptdlsinfo->driver_setup = _TRUE; +#else + ptdlsinfo->driver_setup = _FALSE; +#endif /* CONFIG_TDLS_DRIVER_SETUP */ + _rtw_spinlock_init(&ptdlsinfo->cmd_lock); _rtw_spinlock_init(&ptdlsinfo->hdl_lock); @@ -67,6 +97,36 @@ void rtw_free_tdls_info(struct tdls_info *ptdlsinfo) } +int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len) +{ + u8 tdls_prohibited_bit = 0x40; /* bit(38); TDLS_prohibited */ + + if (pkt_len < 5) { + return _FALSE; + } + + pframe += 4; + if ((*pframe) & tdls_prohibited_bit) + return _TRUE; + + return _FALSE; +} + +int check_ap_tdls_ch_switching_prohibited(u8 *pframe, u8 pkt_len) +{ + u8 tdls_ch_swithcing_prohibited_bit = 0x80; /* bit(39); TDLS_channel_switching prohibited */ + + if (pkt_len < 5) { + return _FALSE; + } + + pframe += 4; + if ((*pframe) & tdls_ch_swithcing_prohibited_bit) + return _TRUE; + + return _FALSE; +} + int _issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ack) { int ret = _FAIL; @@ -74,19 +134,22 @@ int _issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsi struct pkt_attrib *pattrib; unsigned char *pframe; struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; + unsigned short *fctrl, *qc; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - //update attribute pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); + + pattrib->hdrlen +=2; + pattrib->qos_en = _TRUE; + pattrib->eosp = 1; + pattrib->ack_policy = 0; + pattrib->mdata = 0; pattrib->retry_ctrl = _FALSE; _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); @@ -97,32 +160,33 @@ int _issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsi fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - // SetToDs(fctrl); - if (power_mode) - { SetPwrMgt(fctrl); - } + + qc = (unsigned short *)(pframe + pattrib->hdrlen - 2); + + SetPriority(qc, 7); /* Set priority to VO */ + + SetEOSP(qc, pattrib->eosp); + + SetAckpolicy(qc, pattrib->ack_policy); _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_DATA_NULL); + SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct rtw_ieee80211_hdr_3addr_qos); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); pattrib->last_txcmdsz = pattrib->pktlen; - if(wait_ack) - { + if (wait_ack) ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); - } - else - { + else { dump_mgntframe(padapter, pmgntframe); ret = _SUCCESS; } @@ -131,7 +195,6 @@ exit: return ret; } - int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms) { int ret; @@ -140,7 +203,6 @@ int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsig struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - //[TDLS] UAPSD : merge this from issue_nulldata() and mark it first. #if 0 psta = rtw_get_stainfo(&padapter->stapriv, da); if (psta) { @@ -155,8 +217,7 @@ int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsig } #endif - do - { + do { ret = _issue_nulldata_to_TDLS_peer_STA(padapter, da, power_mode, wait_ms>0 ? _TRUE : _FALSE); i++; @@ -164,10 +225,10 @@ int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsig if (padapter->bDriverStopped || padapter->bSurpriseRemoved) break; - if(i < try_cnt && wait_ms > 0 && ret==_FAIL) + if (i < try_cnt && wait_ms > 0 && ret == _FAIL) rtw_msleep_os(wait_ms); - }while((istapriv; _irqL irqL; - //free peer sta_info + /* free peer sta_info */ _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if(ptdlsinfo->sta_cnt != 0) + if (ptdlsinfo->sta_cnt != 0) ptdlsinfo->sta_cnt--; _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if( ptdlsinfo->sta_cnt < (NUM_STA - 2 - 4) ) // -2: AP + BC/MC sta, -4: default key - { + /* -2: AP + BC/MC sta, -4: default key */ + if (ptdlsinfo->sta_cnt < MAX_ALLOWED_TDLS_STA_NUM) { ptdlsinfo->sta_maximum = _FALSE; _rtw_memset( &ptdlsinfo->ss_record, 0x00, sizeof(struct tdls_ss_record) ); } - //clear cam + /* clear cam */ rtw_clearstakey_cmd(padapter, ptdls_sta, _TRUE); - if(ptdlsinfo->sta_cnt==0){ - rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR); + if (ptdlsinfo->sta_cnt == 0) { + rtw_tdls_cmd(padapter, NULL, TDLS_RS_RCR); ptdlsinfo->link_established = _FALSE; } else @@ -222,65 +283,51 @@ void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta) } -//TDLS encryption(if needed) will always be CCMP -void rtw_tdls_set_key(_adapter *padapter, struct rx_pkt_attrib *prx_pkt_attrib, struct sta_info *ptdls_sta) +/* TDLS encryption(if needed) will always be CCMP */ +void rtw_tdls_set_key(_adapter *padapter, struct sta_info *ptdls_sta) { - if(prx_pkt_attrib->encrypt) - { - ptdls_sta->dot118021XPrivacy=_AES_; - rtw_setstakey_cmd(padapter, ptdls_sta, _TRUE, _TRUE); - } + ptdls_sta->dot118021XPrivacy=_AES_; + rtw_setstakey_cmd(padapter, ptdls_sta, TDLS_KEY, _TRUE); } void rtw_tdls_process_ht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length) { - /* save HT capabilities in the sta object */ + /* Save HT capabilities in the sta object */ _rtw_memset(&ptdls_sta->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap)); - if (data && Length >= sizeof(struct rtw_ieee80211_ht_cap) ) - { + if (data && Length >= sizeof(struct rtw_ieee80211_ht_cap)) { ptdls_sta->flags |= WLAN_STA_HT; - ptdls_sta->flags |= WLAN_STA_WME; - + _rtw_memcpy(&ptdls_sta->htpriv.ht_cap, data, sizeof(struct rtw_ieee80211_ht_cap)); - } else ptdls_sta->flags &= ~WLAN_STA_HT; - if(ptdls_sta->flags & WLAN_STA_HT) - { - if(padapter->registrypriv.ht_enable == _TRUE) - { + if (ptdls_sta->flags & WLAN_STA_HT) { + if (padapter->registrypriv.ht_enable == _TRUE) { ptdls_sta->htpriv.ht_option = _TRUE; - } - else - { + ptdls_sta->qos_option = _TRUE; + } else { ptdls_sta->htpriv.ht_option = _FALSE; - ptdls_sta->stat_code = _STATS_FAILURE_; + ptdls_sta->qos_option = _FALSE; } } - //HT related cap - if(ptdls_sta->htpriv.ht_option) - { - //check if sta supports rx ampdu - if(padapter->registrypriv.ampdu_enable==1) + /* HT related cap */ + if (ptdls_sta->htpriv.ht_option) { + /* Check if sta supports rx ampdu */ + if (padapter->registrypriv.ampdu_enable == 1) ptdls_sta->htpriv.ampdu_enable = _TRUE; - //check if sta support s Short GI 20M - if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_20)) - { + /* Check if sta support s Short GI 20M */ + if (ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_20)) ptdls_sta->htpriv.sgi_20m = _TRUE; - } - //check if sta support s Short GI 40M - if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_40)) - { + + /* Check if sta support s Short GI 40M */ + if (ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_40)) ptdls_sta->htpriv.sgi_40m = _TRUE; - } - // bwmode would still followed AP's setting - if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) - { + /* Bwmode would still followed AP's setting */ + if (ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) { if (padapter->mlmeextpriv.cur_bwmode >= CHANNEL_WIDTH_40) ptdls_sta->bw_mode = CHANNEL_WIDTH_40; ptdls_sta->htpriv.ch_offset = padapter->mlmeextpriv.cur_ch_offset; @@ -289,17 +336,13 @@ void rtw_tdls_process_ht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 } -int rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) { - int tmplen; - rtw_ht_use_default_setting(padapter); - tmplen = pattrib->pktlen; rtw_restructure_ht_ie(padapter, NULL, pframe, 0, &(pattrib->pktlen), padapter->mlmeextpriv.cur_channel); - return (pattrib->pktlen - tmplen); - + return pframe + pattrib->pktlen; } u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib) @@ -308,64 +351,270 @@ u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_a u8 ch_24g = 0, b1 = 0, b4 = 0; u8 bit_table = 0, sup_ch_idx = 0; - do{ - if( pmlmeext->channel_set[ch_set_idx].ChannelNum >= 1 && - pmlmeext->channel_set[ch_set_idx].ChannelNum <= 14 ) - { - ch_24g = 1; // 2.4 G channels - } - else if( pmlmeext->channel_set[ch_set_idx].ChannelNum >= 36 && + do { + if (pmlmeext->channel_set[ch_set_idx].ChannelNum >= 1 && + pmlmeext->channel_set[ch_set_idx].ChannelNum <= 14) + ch_24g = 1; /* 2.4 G channels */ + else if (pmlmeext->channel_set[ch_set_idx].ChannelNum >= 36 && pmlmeext->channel_set[ch_set_idx].ChannelNum <= 48) - { - b1 = 1; // 5 G band1 - } - else if( pmlmeext->channel_set[ch_set_idx].ChannelNum >= 149 && + b1 = 1; /* 5 G band1 */ + else if (pmlmeext->channel_set[ch_set_idx].ChannelNum >= 149 && pmlmeext->channel_set[ch_set_idx].ChannelNum <= 165) - { - b4 = 1; // 5 G band4 - } - else - { - ch_set_idx++; // We don't claim that we support DFS channels. + b4 = 1; /* 5 G band4 */ + else { + ch_set_idx++; /* We don't support DFS channels. */ continue; } sup_ch_idx = (ch_24g + b1 + b4 - 1) * 2; - if( sup_ch_idx >= 0) - { - if(sup_ch[sup_ch_idx] == 0) + if (sup_ch_idx >= 0) { + if (sup_ch[sup_ch_idx] == 0) sup_ch[sup_ch_idx] = pmlmeext->channel_set[ch_set_idx].ChannelNum; sup_ch[sup_ch_idx+1]++; //Number of channel } ch_set_idx++; - } - while( pmlmeext->channel_set[ch_set_idx].ChannelNum != 0 && ch_set_idx < MAX_CHANNEL_NUM ); + } while (pmlmeext->channel_set[ch_set_idx].ChannelNum != 0 && ch_set_idx < MAX_CHANNEL_NUM); return(rtw_set_ie(pframe, _SUPPORTED_CH_IE_, sup_ch_idx+2, sup_ch, &(pattrib->pktlen))); } +u8 *rtw_tdls_set_rsnie(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib, int init, struct sta_info *ptdls_sta) +{ + u8 *p = NULL; + int len = 0; + + if (ptxmgmt->len > 0) + p = rtw_get_ie(ptxmgmt->buf, _RSN_IE_2_, &len, ptxmgmt->len); + + if (p != NULL) + return rtw_set_ie(pframe, _RSN_IE_2_, len, p+2, &(pattrib->pktlen)); + else + if (init == _TRUE) + return rtw_set_ie(pframe, _RSN_IE_2_, sizeof(TDLS_RSNIE), TDLS_RSNIE, &(pattrib->pktlen)); + else + return rtw_set_ie(pframe, _RSN_IE_2_, sizeof(ptdls_sta->TDLS_RSNIE), ptdls_sta->TDLS_RSNIE, &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_ext_cap(u8 *pframe, struct pkt_attrib *pattrib) +{ + return rtw_set_ie(pframe, _EXT_CAP_IE_ , sizeof(TDLS_EXT_CAPIE), TDLS_EXT_CAPIE, &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_qos_cap(u8 *pframe, struct pkt_attrib *pattrib) +{ + return rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(TDLS_WMMIE), TDLS_WMMIE, &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_ftie(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib, u8 *ANonce, u8 *SNonce) +{ + struct wpa_tdls_ftie FTIE = {0}; + u8 *p = NULL; + int len = 0; + + if (ptxmgmt->len > 0) + p = rtw_get_ie(ptxmgmt->buf, _FTIE_, &len, ptxmgmt->len); + + if (p != NULL) + return rtw_set_ie(pframe, _FTIE_, len, p+2, &(pattrib->pktlen)); + else { + if (ANonce != NULL) + _rtw_memcpy(FTIE.Anonce, ANonce, WPA_NONCE_LEN); + if (SNonce != NULL) + _rtw_memcpy(FTIE.Snonce, SNonce, WPA_NONCE_LEN); + return rtw_set_ie(pframe, _FTIE_ , 82, (u8 *)FTIE.mic_ctrl, &(pattrib->pktlen)); + } +} + +u8 *rtw_tdls_set_timeout_interval(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib, int init, struct sta_info *ptdls_sta) +{ + u8 timeout_itvl[5]; /* set timeout interval to maximum value */ + u32 timeout_interval= TPK_RESEND_COUNT; + u8 *p = NULL; + int len = 0; + + if (ptxmgmt->len > 0) + p = rtw_get_ie(ptxmgmt->buf, _TIMEOUT_ITVL_IE_, &len, ptxmgmt->len); + + if (p != NULL) + return rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, len, p+2, &(pattrib->pktlen)); + else { + /* Timeout interval */ + timeout_itvl[0]=0x02; + if (init == _TRUE) + _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); + else + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + + return rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } +} + +u8 *rtw_tdls_set_bss_coexist(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + u8 iedata=0; + + if (padapter->mlmepriv.num_FortyMHzIntolerant > 0) + iedata |= BIT(2); /* 20 MHz BSS Width Request */ + + /* Information Bit should be set by TDLS test plan 5.9 */ + iedata |= BIT(0); + return rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_payload_type(u8 *pframe, struct pkt_attrib *pattrib) +{ + u8 payload_type = 0x02; + return rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_category(u8 *pframe, struct pkt_attrib *pattrib, u8 category) +{ + return rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_action(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt) +{ + return rtw_set_fixed_ie(pframe, 1, &(ptxmgmt->action_code), &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_status_code(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt) +{ + return rtw_set_fixed_ie(pframe, 2, (u8 *)&(ptxmgmt->status_code), &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_dialog(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt) +{ + u8 dialogtoken = 1; + if (ptxmgmt->dialog_token) + return rtw_set_fixed_ie(pframe, 1, &(ptxmgmt->dialog_token), &(pattrib->pktlen)); + else + return rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_reg_class(u8 *pframe, struct pkt_attrib *pattrib, struct sta_info *ptdls_sta) +{ + u8 reg_class = 1; + return rtw_set_fixed_ie(pframe, 1, &(reg_class), &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_capability(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 cap_from_ie[2] = {0}; + + _rtw_memcpy(cap_from_ie, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + return rtw_set_fixed_ie(pframe, 2, cap_from_ie, &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_supported_rate(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + + rtw_set_supported_rate(bssrate, padapter->registrypriv.wireless_mode); + bssrate_len = rtw_get_rateset_len(bssrate); + + if (bssrate_len > 8) { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } else { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + /* extended supported rates */ + if (more_supportedrates == 1) { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + return pframe; +} + +u8 *rtw_tdls_set_sup_reg_class(u8 *pframe, struct pkt_attrib *pattrib) +{ + return rtw_set_ie(pframe, _SRC_IE_ , sizeof(TDLS_SRC), TDLS_SRC, &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_linkid(u8 *pframe, struct pkt_attrib *pattrib, u8 init) +{ + u8 link_id_addr[18] = {0}; + if (init == _TRUE) { + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + } else { + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + } + return rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); +} + +#ifdef CONFIG_TDLS_CH_SW +u8 *rtw_tdls_set_target_ch(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + u8 target_ch = 1; + if (padapter->tdlsinfo.chsw_info.off_ch_num) + return rtw_set_fixed_ie(pframe, 1, &(padapter->tdlsinfo.chsw_info.off_ch_num), &(pattrib->pktlen)); + else + return rtw_set_fixed_ie(pframe, 1, &(target_ch), &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_ch_sw(u8 *pframe, struct pkt_attrib *pattrib, struct sta_info *ptdls_sta) +{ + u8 ch_switch_timing[4] = {0}; + u16 switch_time = (ptdls_sta->ch_switch_time >= CH_SWITCH_TIME * 1000) ? + ptdls_sta->ch_switch_time : CH_SWITCH_TIME; + u16 switch_timeout = (ptdls_sta->ch_switch_timeout >= CH_SWITCH_TIMEOUT * 1000) ? + ptdls_sta->ch_switch_timeout : CH_SWITCH_TIMEOUT; + + _rtw_memcpy(ch_switch_timing, &switch_time, 2); + _rtw_memcpy(ch_switch_timing + 2, &switch_timeout, 2); + + return rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); +} +#endif + +u8 *rtw_tdls_set_wmm_params(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 wmm_param_ele[24] = {0}; + + if (&pmlmeinfo->WMM_param) { + _rtw_memcpy(wmm_param_ele, WMM_PARA_OUI, 6); + if (_rtw_memcmp(&pmlmeinfo->WMM_param, &wmm_param_ele[6], 18) == _TRUE) + /* Use default WMM Param */ + _rtw_memcpy(wmm_param_ele + 6, (u8 *)&TDLS_WMM_PARAM_IE, sizeof(TDLS_WMM_PARAM_IE)); + else + _rtw_memcpy(wmm_param_ele + 6, (u8 *)&pmlmeinfo->WMM_param, sizeof(pmlmeinfo->WMM_param)); + return rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 24, wmm_param_ele, &(pattrib->pktlen)); + } + else + return pframe; +} + #ifdef CONFIG_WFD void rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length) { u8 wfd_ie[ 128 ] = { 0x00 }; u32 wfd_ielen = 0; u32 wfd_offset = 0; - // Try to get the TCP port information when receiving the negotiation response. - // + /* Try to get the TCP port information when receiving the negotiation response. */ wfd_offset = 0; wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); - while( wfd_offset ) - { + while (wfd_offset) { u8 attr_content[ 10 ] = { 0x00 }; u32 attr_contentlen = 0; int i; DBG_871X( "[%s] WFD IE Found!!\n", __FUNCTION__ ); rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen); - if ( attr_contentlen ) - { + if (attr_contentlen) { ptdlsinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); DBG_871X( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, ptdlsinfo->wfd_info->peer_rtsp_ctrlport ); } @@ -373,13 +622,11 @@ void rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length) _rtw_memset( attr_content, 0x00, 10); attr_contentlen = 0; rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_LOCAL_IP_ADDR, attr_content, &attr_contentlen); - if ( attr_contentlen ) - { + if (attr_contentlen) { _rtw_memcpy(ptdlsinfo->wfd_info->peer_ip_address, ( attr_content + 1 ), 4); DBG_871X( "[%s] Peer IP = %02u.%02u.%02u.%02u \n", __FUNCTION__, ptdlsinfo->wfd_info->peer_ip_address[0], ptdlsinfo->wfd_info->peer_ip_address[1], - ptdlsinfo->wfd_info->peer_ip_address[2], ptdlsinfo->wfd_info->peer_ip_address[3] - ); + ptdlsinfo->wfd_info->peer_ip_address[2], ptdlsinfo->wfd_info->peer_ip_address[3]); } wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); } @@ -401,18 +648,15 @@ int issue_tunneled_probe_req(_adapter *padapter) txmgmt.action_code = TUNNELED_PROBE_REQ; if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - - //update attribute + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); @@ -445,18 +689,15 @@ int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame) txmgmt.action_code = TUNNELED_PROBE_RSP; if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - - //update attribute + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; _rtw_memcpy(pattrib->dst, precv_frame->u.hdr.attrib.src, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); @@ -473,7 +714,7 @@ exit: return ret; } -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack) { @@ -485,38 +726,35 @@ int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wa struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info *ptdls_sta= NULL; _irqL irqL; - static u8 dialogtoken = 0; int ret = _FAIL; - u32 timeout_interval= TPK_RESEND_COUNT * 1000; //retry timer should set at least 301 sec, using TPK_count counting 301 times. + /* Retry timer should be set at least 301 sec, using TPK_count counting 301 times. */ + u32 timeout_interval= TPK_RESEND_COUNT; + + DBG_871X("[TDLS] %s\n", __FUNCTION__); ptxmgmt->action_code = TDLS_SETUP_REQUEST; - if(ptdlsinfo->ap_prohibited == _TRUE) + if (ptdlsinfo->ap_prohibited == _TRUE) goto exit; if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - - //update attribute + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); update_tdls_attrib(padapter, pattrib); - //init peer sta_info + /* init peer sta_info */ ptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer); - if(ptdls_sta==NULL) - { + if (ptdls_sta == NULL) { ptdls_sta = rtw_alloc_stainfo(pstapriv, ptxmgmt->peer); - if(ptdls_sta==NULL) - { + if (ptdls_sta == NULL) { DBG_871X("[%s] rtw_alloc_stainfo fail\n", __FUNCTION__); rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); rtw_free_xmitframe(pxmitpriv, pmgntframe); @@ -526,21 +764,20 @@ int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wa if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) ptdlsinfo->sta_cnt++; - if( ptdlsinfo->sta_cnt == (NUM_STA - 2 - 4) ) // -2: AP + BC/MC sta, -4: default key - { + + if (ptdlsinfo->sta_cnt == MAX_ALLOWED_TDLS_STA_NUM) ptdlsinfo->sta_maximum = _TRUE; - } ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE; - //for tdls; ptdls_sta->aid is used to fill dialogtoken - ptdls_sta->dialog = dialogtoken; - dialogtoken = (dialogtoken+1)%256; - ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; - _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME ); + + if (rtw_tdls_is_driver_setup(padapter) == _TRUE) { + ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; + _set_timer(&ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME); + } pattrib->qsel = pattrib->priority; - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) !=_SUCCESS ){ + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) !=_SUCCESS) { rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); rtw_free_xmitframe(pxmitpriv, pmgntframe); goto exit; @@ -553,14 +790,12 @@ int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wa ret = _SUCCESS; } - ret = _SUCCESS; - exit: return ret; } -int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack) +int _issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack) { struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; @@ -571,26 +806,33 @@ int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait _irqL irqL; int ret = _FAIL; + DBG_871X("[TDLS] %s\n", __FUNCTION__); + ptxmgmt->action_code = TDLS_TEARDOWN; ptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer); - if(ptdls_sta==NULL){ + if (ptdls_sta == NULL) { DBG_871X("Np tdls_sta for tearing down\n"); goto exit; } if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - - //update attribute + + rtw_set_scan_deny(padapter, 550); + + rtw_scan_abort(padapter); +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_buddy_adapter_up(padapter)) + rtw_scan_abort(padapter->pbuddy_adapter); +#endif /* CONFIG_CONCURRENT_MODE */ + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); @@ -602,6 +844,11 @@ int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait goto exit; } + if (rtw_tdls_is_driver_setup(padapter) == _TRUE) + if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) + if (pattrib->encrypt) + _cancel_timer_ex(&ptdls_sta->TPK_timer); + if (wait_ack) { ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); } else { @@ -609,27 +856,28 @@ int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait ret = _SUCCESS; } - if(ret == _SUCCESS) - { - if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - } - - if( ptdls_sta->timer_flag == 1 ) - { - _enter_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); - ptdls_sta->timer_flag = 2; - _exit_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); - } - else - rtw_tdls_cmd(padapter, ptxmgmt->peer, TDLS_TEAR_STA ); - } + if (ret == _SUCCESS && rtw_tdls_is_driver_setup(padapter)) + rtw_tdls_cmd(padapter, ptxmgmt->peer, TDLS_TEAR_STA); exit: return ret; } +int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack) +{ + int ret = _FAIL; + + ret = _issue_tdls_teardown(padapter, ptxmgmt, wait_ack); + if ((ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_) && (ret == _FAIL)) { + /* Change status code and send teardown again via AP */ + ptxmgmt->status_code = _RSON_TDLS_TEAR_TOOFAR_; + ret = _issue_tdls_teardown(padapter, ptxmgmt, wait_ack); + } + + return ret; +} + int issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt) { struct xmit_frame *pmgntframe; @@ -638,19 +886,18 @@ int issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt) struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); int ret = _FAIL; + DBG_871X("[TDLS] %s\n", __FUNCTION__); + ptxmgmt->action_code = TDLS_DISCOVERY_REQUEST; if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - //update attribute pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); @@ -677,19 +924,18 @@ int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt) struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); int ret = _FAIL; + DBG_871X("[TDLS] %s\n", __FUNCTION__); + ptxmgmt->action_code = TDLS_SETUP_RESPONSE; if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - - //update attribute + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(&(padapter->mlmepriv)), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); @@ -718,19 +964,18 @@ int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt) struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); int ret = _FAIL; + DBG_871X("[TDLS] %s\n", __FUNCTION__); + ptxmgmt->action_code = TDLS_SETUP_CONFIRM; if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - - //update attribute + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&padapter->eeprompriv), ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(&padapter->mlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); @@ -751,7 +996,7 @@ exit: } -//TDLS Discovery Response frame is a management action frame +/* TDLS Discovery Response frame is a management action frame */ int issue_tdls_dis_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy) { struct xmit_frame *pmgntframe; @@ -763,12 +1008,11 @@ int issue_tdls_dis_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 priva struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); int ret = _FAIL; + DBG_871X("[TDLS] %s\n", __FUNCTION__); + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - //update attribute pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -780,14 +1024,14 @@ int issue_tdls_dis_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 priva fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - // unicast probe request frame + /* unicast probe request frame */ _rtw_memcpy(pwlanhdr->addr1, ptxmgmt->peer, ETH_ALEN); _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN); - + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); @@ -795,7 +1039,7 @@ int issue_tdls_dis_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 priva pframe += sizeof (struct rtw_ieee80211_hdr_3addr); pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); - rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, ptxmgmt->dialog_token, privacy); + rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, ptxmgmt, privacy); pattrib->nr_frags = 1; pattrib->last_txcmdsz = pattrib->pktlen; @@ -807,38 +1051,35 @@ exit: return ret; } -int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *ptdls_sta) +int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *ptdls_sta, struct tdls_txmgmt *ptxmgmt) { struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct tdls_txmgmt txmgmt; int ret = _FAIL; - _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - txmgmt.action_code = TDLS_PEER_TRAFFIC_RESPONSE; + DBG_871X("[TDLS] %s\n", __FUNCTION__); + + ptxmgmt->action_code = TDLS_PEER_TRAFFIC_RESPONSE; if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - - //update attribute + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); update_tdls_attrib(padapter, pattrib); pattrib->qsel = pattrib->priority; - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) !=_SUCCESS ){ + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) !=_SUCCESS) { rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); rtw_free_xmitframe(pxmitpriv, pmgntframe); goto exit; @@ -860,31 +1101,26 @@ int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdl struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); struct tdls_txmgmt txmgmt; int ret = _FAIL; - static u8 dialogtoken=0; + + DBG_871X("[TDLS] %s\n", __FUNCTION__); _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); txmgmt.action_code = TDLS_PEER_TRAFFIC_INDICATION; if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - - //update attribute + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - //for tdls; pattrib->nr_frags is used to fill dialogtoken - ptdls_sta->dialog = dialogtoken; - dialogtoken = (dialogtoken+1)%256; - //PTI frame's priority should be AC_VO + /* PTI frame's priority should be AC_VO */ pattrib->priority = 7; update_tdls_attrib(padapter, pattrib); @@ -903,7 +1139,7 @@ exit: return ret; } -int issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr) +int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta) { struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; @@ -912,28 +1148,32 @@ int issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr) struct tdls_txmgmt txmgmt; int ret = _FAIL; + DBG_871X("[TDLS] %s\n", __FUNCTION__); + + if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE) + { DBG_871X("[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\n", __FUNCTION__); + goto exit; + } + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); txmgmt.action_code = TDLS_CHANNEL_SWITCH_REQUEST; if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { goto exit; - } - - //update attribute + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); update_tdls_attrib(padapter, pattrib); pattrib->qsel = pattrib->priority; - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) !=_SUCCESS ){ + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) !=_SUCCESS) { rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); rtw_free_xmitframe(pxmitpriv, pmgntframe); goto exit; @@ -946,31 +1186,33 @@ exit: return ret; } -int issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr) +int issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack) { struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct tdls_txmgmt txmgmt; int ret = _FAIL; - _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - txmgmt.action_code = TDLS_CHANNEL_SWITCH_RESPONSE; + DBG_871X("[TDLS] %s\n", __FUNCTION__); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE) + { DBG_871X("[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\n", __FUNCTION__); goto exit; } - - //update attribute + + ptxmgmt->action_code = TDLS_CHANNEL_SWITCH_RESPONSE; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + goto exit; + pattrib = &pmgntframe->attrib; pmgntframe->frame_tag = DATA_FRAMETAG; pattrib->ether_type = 0x890d; - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); @@ -983,12 +1225,18 @@ int issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr) return _FALSE; } */ - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) !=_SUCCESS ){ + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) !=_SUCCESS) { rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; + goto exit; + } + + if (wait_ack) { + ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); + } else { + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; } - dump_mgntframe(padapter, pmgntframe); ret = _SUCCESS; exit: @@ -1008,71 +1256,55 @@ int On_TDLS_Dis_Rsp(_adapter *padapter, union recv_frame *precv_frame) int ret = _SUCCESS; _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - //WFDTDLS: for sigma test, not to setup direct link automatically - ptdlsinfo->dev_discovered = 1; + /* WFDTDLS: for sigma test, not to setup direct link automatically */ + ptdlsinfo->dev_discovered = _TRUE; #ifdef CONFIG_TDLS_AUTOSETUP + psa = get_sa(ptr); ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), psa); - if(ptdls_sta != NULL) - { + if (ptdls_sta != NULL) { ptdls_sta->tdls_sta_state |= TDLS_ALIVE_STATE; - //Record the tdls sta with lowest signal strength - if( (ptdlsinfo->sta_maximum == _TRUE) && (ptdls_sta->alive_count >= 1) ) - { - if( _rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN) ) - { + /* Record the tdls sta with lowest signal strength */ + if (ptdlsinfo->sta_maximum == _TRUE && ptdls_sta->alive_count >= 1 ) { + if (_rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN)) { _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); - ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; - } - else - { - if( ptdlsinfo->ss_record.RxPWDBAll < pattrib->RxPWDBAll ) - { + ptdlsinfo->ss_record.RxPWDBAll = pattrib->phy_info.RxPWDBAll; + } else { + if (ptdlsinfo->ss_record.RxPWDBAll < pattrib->phy_info.RxPWDBAll) { _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); - ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; + ptdlsinfo->ss_record.RxPWDBAll = pattrib->phy_info.RxPWDBAll; } } } - - } - else - { - if( ptdlsinfo->sta_maximum == _TRUE) - { - if( _rtw_memcmp( ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN ) ) - { - //All traffics are busy, do not set up another direct link. + } else { + if (ptdlsinfo->sta_maximum == _TRUE) { + if (_rtw_memcmp( ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN)) { + /* All traffics are busy, do not set up another direct link. */ ret = _FAIL; goto exit; - } - else - { - if( pattrib->RxPWDBAll > ptdlsinfo->ss_record.RxPWDBAll ) - { + } else { + if (pattrib->phy_info.RxPWDBAll > ptdlsinfo->ss_record.RxPWDBAll) { _rtw_memcpy(txmgmt.peer, ptdlsinfo->ss_record.macaddr, ETH_ALEN); - //issue_tdls_teardown(padapter, ptdlsinfo->ss_record.macaddr, _FALSE); - } - else - { + /* issue_tdls_teardown(padapter, ptdlsinfo->ss_record.macaddr, _FALSE); */ + } else { ret = _FAIL; goto exit; } } } - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); + rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); - if( pattrib->RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB); - { - DBG_871X("pattrib->RxPWDBAll=%d, pdmpriv->UndecoratedSmoothedPWDB=%d\n", pattrib->RxPWDBAll, UndecoratedSmoothedPWDB); + if (pattrib->phy_info.RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB) { + DBG_871X("pattrib->RxPWDBAll=%d, pdmpriv->UndecoratedSmoothedPWDB=%d\n", pattrib->phy_info.RxPWDBAll, UndecoratedSmoothedPWDB); _rtw_memcpy(txmgmt.peer, psa, ETH_ALEN); issue_tdls_setup_req(padapter, &txmgmt, _FALSE); } } -#endif //CONFIG_TDLS_AUTOSETUP +#endif /* CONFIG_TDLS_AUTOSETUP */ exit: return ret; @@ -1095,20 +1327,23 @@ sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame) u8 ccmp_included=0, rsnie_included=0; u16 j, pairwise_count; u8 SNonce[32]; - u32 *timeout_interval=NULL; - sint parsing_length; //frame body length, without icv_len + u32 timeout_interval = TPK_RESEND_COUNT; + sint parsing_length; /* Frame body length, without icv_len */ PNDIS_802_11_VARIABLE_IEs pIE; u8 FIXED_IE = 5; unsigned char supportRate[16]; int supportRateNum = 0; struct tdls_txmgmt txmgmt; + if (ptdlsinfo->ap_prohibited == _TRUE) + goto exit; + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); psa = get_sa(ptr); ptdls_sta = rtw_get_stainfo(pstapriv, psa); - pmyid=myid(&(padapter->eeprompriv)); - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + pmyid = adapter_mac_addr(padapter); + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN; parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len -prx_pkt_attrib->hdrlen -prx_pkt_attrib->iv_len @@ -1118,33 +1353,28 @@ sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame) -PAYLOAD_TYPE_LEN -FIXED_IE; - if(ptdlsinfo->ap_prohibited == _TRUE) - { - goto exit; - } - - if(ptdls_sta==NULL){ + if (ptdls_sta == NULL) { ptdls_sta = rtw_alloc_stainfo(pstapriv, psa); - }else{ - if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ - //If the direct link is already set up - //Process as re-setup after tear down + } else { + if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) { + /* If the direct link is already set up */ + /* Process as re-setup after tear down */ DBG_871X("re-setup a direct link\n"); } - //already receiving TDLS setup request - else if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ + /* Already receiving TDLS setup request */ + else if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) { DBG_871X("receive duplicated TDLS setup request frame in handshaking\n"); goto exit; } - //When receiving and sending setup_req to the same link at the same time, STA with higher MAC_addr would be initiator - //following is to check out MAC_addr - else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ + /* When receiving and sending setup_req to the same link at the same time */ + /* STA with higher MAC_addr would be initiator */ + else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) { DBG_871X("receive setup_req after sending setup_req\n"); for (i=0;i<6;i++){ if(*(pmyid+i)==*(psa+i)){ } else if(*(pmyid+i)>*(psa+i)){ - ptdls_sta->tdls_sta_state=TDLS_INITIATOR_STATE; + ptdls_sta->tdls_sta_state = TDLS_INITIATOR_STATE; break; }else if(*(pmyid+i)<*(psa+i)){ goto exit; @@ -1153,147 +1383,132 @@ sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame) } } - if(ptdls_sta) - { - ptdls_sta->dialog = *(ptr+2); //copy dialog token - ptdls_sta->stat_code = 0; + if (ptdls_sta) { + txmgmt.dialog_token = *(ptr+2); /* Copy dialog token */ + txmgmt.status_code = _STATS_SUCCESSFUL_; - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _SUPPORTEDRATES_IE_: - _rtw_memcpy(supportRate, pIE->data, pIE->Length); - supportRateNum = pIE->Length; - break; - case _COUNTRY_IE_: - break; - case _EXT_SUPPORTEDRATES_IE_: - if(supportRateNum<=sizeof(supportRate)) - { - _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); - supportRateNum += pIE->Length; - } - break; - case _SUPPORTED_CH_IE_: - break; - case _RSN_IE_2_: - rsnie_included=1; - if(prx_pkt_attrib->encrypt){ - prsnie=(u8*)pIE; - //check whether initiator STA has CCMP pairwise_cipher. - ppairwise_cipher=prsnie+10; - _rtw_memcpy(ptdls_sta->TDLS_RSNIE, pIE->data, pIE->Length); - pairwise_count = *(u16*)(ppairwise_cipher-2); - for(k=0;kstat_code=72; - } - } - break; - case _EXT_CAP_IE_: - break; - case _VENDOR_SPECIFIC_IE_: - break; - case _FTIE_: - if(prx_pkt_attrib->encrypt) - _rtw_memcpy(SNonce, (ptr+j+52), 32); - break; - case _TIMEOUT_ITVL_IE_: - if(prx_pkt_attrib->encrypt) - timeout_interval = (u32 *)(ptr+j+3); - break; - case _RIC_Descriptor_IE_: - break; - case _HT_CAPABILITY_IE_: - rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); - break; - case EID_BSSCoexistence: - break; - case _LINK_ID_IE_: - if(_rtw_memcmp(get_bssid(pmlmepriv), pIE->data, 6) == _FALSE) - { - //not in the same BSS - ptdls_sta->stat_code=7; + switch (pIE->ElementID) { + case _SUPPORTEDRATES_IE_: + _rtw_memcpy(supportRate, pIE->data, pIE->Length); + supportRateNum = pIE->Length; + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + if (supportRateNum<=sizeof(supportRate)) { + _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); + supportRateNum += pIE->Length; + } + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + rsnie_included=1; + if (prx_pkt_attrib->encrypt) { + prsnie=(u8*)pIE; + /* Check CCMP pairwise_cipher presence. */ + ppairwise_cipher=prsnie+10; + _rtw_memcpy(ptdls_sta->TDLS_RSNIE, pIE->data, pIE->Length); + pairwise_count = *(u16*)(ppairwise_cipher-2); + for (k=0; kencrypt) + _rtw_memcpy(SNonce, (ptr+j+52), 32); + break; + case _TIMEOUT_ITVL_IE_: + if (prx_pkt_attrib->encrypt) + timeout_interval = cpu_to_le32(*(u32*)(ptr+j+3)); + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + if (_rtw_memcmp(get_bssid(pmlmepriv), pIE->data, 6) == _FALSE) + txmgmt.status_code=_STATS_NOT_IN_SAME_BSS_; + break; + default: + break; } j += (pIE->Length + 2); } - //check status code - //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject - if(ptdls_sta->stat_code == 0 ) - { - if(rsnie_included && (prx_pkt_attrib->encrypt==0)){ - //security disabled - ptdls_sta->stat_code = 5; - }else if(rsnie_included==0 && (prx_pkt_attrib->encrypt)){ - //request haven't RSNIE - ptdls_sta->stat_code = 38; - } + /* Check status code */ + /* If responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject */ + if (txmgmt.status_code == _STATS_SUCCESSFUL_) { + if (rsnie_included && prx_pkt_attrib->encrypt == 0) + txmgmt.status_code = _STATS_SEC_DISABLED_; + else if (rsnie_included==0 && prx_pkt_attrib->encrypt) + txmgmt.status_code = _STATS_INVALID_PARAMETERS_; #ifdef CONFIG_WFD - //WFD test plan version 0.18.2 test item 5.1.5 - //SoUT does not use TDLS if AP uses weak security - if ( padapter->wdinfo.wfd_tdls_enable ) - { - if(rsnie_included && (prx_pkt_attrib->encrypt != _AES_)) - { - ptdls_sta->stat_code = 5; - } - } -#endif //CONFIG_WFD + /* WFD test plan version 0.18.2 test item 5.1.5 */ + /* SoUT does not use TDLS if AP uses weak security */ + if (padapter->wdinfo.wfd_tdls_enable && (rsnie_included && prx_pkt_attrib->encrypt != _AES_)) + txmgmt.status_code = _STATS_SEC_DISABLED_; +#endif /* CONFIG_WFD */ } ptdls_sta->tdls_sta_state|= TDLS_INITIATOR_STATE; - if(prx_pkt_attrib->encrypt){ + if (prx_pkt_attrib->encrypt) { _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); - _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4); + + if (timeout_interval <= 300) + ptdls_sta->TDLS_PeerKey_Lifetime = TPK_RESEND_COUNT; + else + ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; } - //update station supportRate + /* Update station supportRate */ ptdls_sta->bssratelen = supportRateNum; _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); - if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) + if (!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) ptdlsinfo->sta_cnt++; - if( ptdlsinfo->sta_cnt == (NUM_STA - 2 - 4) ) // -2: AP + BC/MC sta, -4: default key - { + /* -2: AP + BC/MC sta, -4: default key */ + if (ptdlsinfo->sta_cnt == MAX_ALLOWED_TDLS_STA_NUM) ptdlsinfo->sta_maximum = _TRUE; - } #ifdef CONFIG_WFD rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); -#endif // CONFIG_WFD +#endif /* CONFIG_WFD */ - } - else - { + }else { goto exit; } _rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN); - issue_tdls_setup_rsp(padapter, &txmgmt); - if(ptdls_sta->stat_code==0) - { - _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME); - } - else //status code!=0 ; setup unsuccess - { - free_tdls_sta(padapter, ptdls_sta); + if (rtw_tdls_is_driver_setup(padapter)) { + issue_tdls_setup_rsp(padapter, &txmgmt); + + if (txmgmt.status_code==_STATS_SUCCESSFUL_) { + _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME); + }else { + free_tdls_sta(padapter, ptdls_sta); + } } exit: @@ -1303,6 +1518,7 @@ exit: int On_TDLS_Setup_Rsp(_adapter *padapter, union recv_frame *precv_frame) { + struct registry_priv *pregistrypriv = &padapter->registrypriv; struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; struct sta_info *ptdls_sta= NULL; struct sta_priv *pstapriv = &padapter->stapriv; @@ -1310,8 +1526,8 @@ int On_TDLS_Setup_Rsp(_adapter *padapter, union recv_frame *precv_frame) _irqL irqL; struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; u8 *psa; - u16 stat_code; - sint parsing_length; //frame body length, without icv_len + u16 status_code=0; + sint parsing_length; /* Frame body length, without icv_len */ PNDIS_802_11_VARIABLE_IEs pIE; u8 FIXED_IE =7; u8 ANonce[32]; @@ -1322,161 +1538,162 @@ int On_TDLS_Setup_Rsp(_adapter *padapter, union recv_frame *precv_frame) int supportRateNum = 0; struct tdls_txmgmt txmgmt; int ret = _SUCCESS; + u32 timeout_interval = TPK_RESEND_COUNT; _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); psa = get_sa(ptr); ptdls_sta = rtw_get_stainfo(pstapriv, psa); - if ( NULL == ptdls_sta ) - { + if (NULL == ptdls_sta) { ret = _FAIL; goto exit; } - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN; parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len -prx_pkt_attrib->hdrlen -prx_pkt_attrib->iv_len -prx_pkt_attrib->icv_len -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN -FIXED_IE; - _rtw_memcpy(&stat_code, ptr+2, 2); + _rtw_memcpy(&status_code, ptr+2, 2); - if(stat_code!=0) - { - DBG_871X( "[%s] status_code = %d, free_tdls_sta\n", __FUNCTION__, stat_code ); + if (status_code != 0) { + DBG_871X( "[TDLS] %s status_code = %d, free_tdls_sta\n", __FUNCTION__, status_code ); free_tdls_sta(padapter, ptdls_sta); ret = _FAIL; goto exit; } - stat_code = 0; + status_code = 0; - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _SUPPORTEDRATES_IE_: - _rtw_memcpy(supportRate, pIE->data, pIE->Length); - supportRateNum = pIE->Length; - break; - case _COUNTRY_IE_: - break; - case _EXT_SUPPORTEDRATES_IE_: - if(supportRateNum<=sizeof(supportRate)) - { - _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); - supportRateNum += pIE->Length; - } - break; - case _SUPPORTED_CH_IE_: - break; - case _RSN_IE_2_: - prsnie=(u8*)pIE; - //check whether responder STA has CCMP pairwise_cipher. - ppairwise_cipher=prsnie+10; - _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2); - for(k=0;kANonce, (ptr+j+20), 32); - _rtw_memcpy(ANonce, (ptr+j+20), 32); - break; - case _TIMEOUT_ITVL_IE_: - ptimeout_ie=(u8*)pIE; - break; - case _RIC_Descriptor_IE_: - break; - case _HT_CAPABILITY_IE_: - rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); - break; - case EID_BSSCoexistence: - break; - case _LINK_ID_IE_: - plinkid_ie=(u8*)pIE; - break; - default: - break; + switch (pIE->ElementID) { + case _SUPPORTEDRATES_IE_: + _rtw_memcpy(supportRate, pIE->data, pIE->Length); + supportRateNum = pIE->Length; + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + if (supportRateNum<=sizeof(supportRate)) { + _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); + supportRateNum += pIE->Length; + } + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + prsnie=(u8*)pIE; + /* Check CCMP pairwise_cipher presence. */ + ppairwise_cipher=prsnie+10; + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2); + for (k=0;kwmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE)) + ptdls_sta->qos_option = _TRUE; + } + break; + case _FTIE_: + pftie=(u8*)pIE; + _rtw_memcpy(ANonce, (ptr+j+20), 32); + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + timeout_interval = cpu_to_le32(*(u32*)(ptimeout_ie+3)); + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; } j += (pIE->Length + 2); - + } - //update station's supportRate ptdls_sta->bssratelen = supportRateNum; _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); - _rtw_memcpy(ptdls_sta->ANonce, ANonce, 32); #ifdef CONFIG_WFD rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); -#endif // CONFIG_WFD +#endif /* CONFIG_WFD */ - if(stat_code != 0) - { - ptdls_sta->stat_code = stat_code; - } - else - { - if(prx_pkt_attrib->encrypt) - { - if(verify_ccmp==1) - { - wpa_tdls_generate_tpk(padapter, ptdls_sta); - ptdls_sta->stat_code=0; - if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0) //0: Invalid, 1: valid - { - free_tdls_sta(padapter, ptdls_sta); - ret = _FAIL; - goto exit; + if (status_code != _STATS_SUCCESSFUL_) { + txmgmt.status_code = status_code; + } else { + if (prx_pkt_attrib->encrypt) { + if (verify_ccmp == 1) { + txmgmt.status_code = _STATS_SUCCESSFUL_; + if (rtw_tdls_is_driver_setup(padapter) == _TRUE) { + wpa_tdls_generate_tpk(padapter, ptdls_sta); + if (tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie) == _FAIL) { + DBG_871X( "[TDLS] %s tdls_verify_mic fail, free_tdls_sta\n", __FUNCTION__); + free_tdls_sta(padapter, ptdls_sta); + ret = _FAIL; + goto exit; + } + ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; } } else { - ptdls_sta->stat_code=72; //invalide contents of RSNIE + txmgmt.status_code = _STATS_INVALID_RSNIE_; } }else{ - ptdls_sta->stat_code=0; + txmgmt.status_code = _STATS_SUCCESSFUL_; } } - DBG_871X("issue_tdls_setup_cfm\n"); - _rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN); - issue_tdls_setup_cfm(padapter, &txmgmt); + if (rtw_tdls_is_driver_setup(padapter) == _TRUE) { + _rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN); + issue_tdls_setup_cfm(padapter, &txmgmt); - if(ptdls_sta->stat_code==0) - { - ptdlsinfo->link_established = _TRUE; + if (txmgmt.status_code == _STATS_SUCCESSFUL_) { + ptdlsinfo->link_established = _TRUE; - if( ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE ) - { - ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE; - _cancel_timer_ex( &ptdls_sta->handshake_timer); - } + if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) { + ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE; + ptdls_sta->state |= _FW_LINKED; + _cancel_timer_ex( &ptdls_sta->handshake_timer); + } - rtw_tdls_set_key(padapter, prx_pkt_attrib, ptdls_sta); + if (prx_pkt_attrib->encrypt) + rtw_tdls_set_key(padapter, ptdls_sta); - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED); + } } exit: - return ret; + if (rtw_tdls_is_driver_setup(padapter) == _TRUE) + return ret; + else + return _SUCCESS; } @@ -1489,7 +1706,7 @@ int On_TDLS_Setup_Cfm(_adapter *padapter, union recv_frame *precv_frame) _irqL irqL; struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; u8 *psa; - u16 stat_code; + u16 status_code=0; sint parsing_length; PNDIS_802_11_VARIABLE_IEs pIE; u8 FIXED_IE =5; @@ -1500,14 +1717,13 @@ int On_TDLS_Setup_Cfm(_adapter *padapter, union recv_frame *precv_frame) psa = get_sa(ptr); ptdls_sta = rtw_get_stainfo(pstapriv, psa); - if(ptdls_sta == NULL) - { - DBG_871X( "[%s] Direct Link Peer = "MAC_FMT" not found\n", __FUNCTION__, MAC_ARG(psa) ); + if (ptdls_sta == NULL) { + DBG_871X("[%s] Direct Link Peer = "MAC_FMT" not found\n", __FUNCTION__, MAC_ARG(psa)); ret = _FAIL; goto exit; } - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN; parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len -prx_pkt_attrib->hdrlen -prx_pkt_attrib->iv_len @@ -1516,49 +1732,54 @@ int On_TDLS_Setup_Cfm(_adapter *padapter, union recv_frame *precv_frame) -ETH_TYPE_LEN -PAYLOAD_TYPE_LEN -FIXED_IE; - _rtw_memcpy(&stat_code, ptr+2, 2); - if(stat_code!=0){ - DBG_871X( "[%s] stat_code = %d\n, free_tdls_sta", __FUNCTION__, stat_code ); + _rtw_memcpy(&status_code, ptr+2, 2); + + if (status_code!= 0) { + DBG_871X("[%s] status_code = %d\n, free_tdls_sta", __FUNCTION__, status_code); free_tdls_sta(padapter, ptdls_sta); ret = _FAIL; goto exit; } - if(prx_pkt_attrib->encrypt){ - //parsing information element - for(j=FIXED_IE; jencrypt) { + /* Parsing information element */ + for(j=FIXED_IE; jElementID) - { - case _RSN_IE_2_: - prsnie=(u8*)pIE; - break; - case _VENDOR_SPECIFIC_IE_: - break; - case _FTIE_: - pftie=(u8*)pIE; - break; - case _TIMEOUT_ITVL_IE_: - ptimeout_ie=(u8*)pIE; - break; - case _HT_EXTRA_INFO_IE_: - break; - case _LINK_ID_IE_: - plinkid_ie=(u8*)pIE; - break; - default: - break; + switch (pIE->ElementID) { + case _RSN_IE_2_: + prsnie=(u8*)pIE; + break; + case _VENDOR_SPECIFIC_IE_: + if (_rtw_memcmp((u8 *)pIE + 2, WMM_PARA_OUI, 6) == _TRUE) { + /* WMM Parameter ID and OUI */ + ptdls_sta->qos_option = _TRUE; + } + break; + case _FTIE_: + pftie=(u8*)pIE; + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + break; + case _HT_EXTRA_INFO_IE_: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; } j += (pIE->Length + 2); } - //verify mic in FTIE MIC field - if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: Valid + /* Verify mic in FTIE MIC field */ + if (rtw_tdls_is_driver_setup(padapter) && + (tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie) == _FAIL)) { free_tdls_sta(padapter, ptdls_sta); ret = _FAIL; goto exit; @@ -1566,16 +1787,25 @@ int On_TDLS_Setup_Cfm(_adapter *padapter, union recv_frame *precv_frame) } - ptdlsinfo->link_established = _TRUE; - if( ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE ) - { - ptdls_sta->tdls_sta_state|=TDLS_LINKED_STATE; - _cancel_timer_ex( &ptdls_sta->handshake_timer); - } + if (rtw_tdls_is_driver_setup(padapter)) { + ptdlsinfo->link_established = _TRUE; - rtw_tdls_set_key(padapter, prx_pkt_attrib, ptdls_sta); + if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) { + ptdls_sta->tdls_sta_state|=TDLS_LINKED_STATE; + ptdls_sta->state |= _FW_LINKED; + _cancel_timer_ex(&ptdls_sta->handshake_timer); + } + + if (prx_pkt_attrib->encrypt) { + rtw_tdls_set_key(padapter, ptdls_sta); + + /* Start TPK timer */ + ptdls_sta->TPK_count = 0; + _set_timer(&ptdls_sta->TPK_timer, ONE_SEC); + } - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED); + } exit: return ret; @@ -1588,15 +1818,18 @@ int On_TDLS_Dis_Req(_adapter *padapter, union recv_frame *precv_frame) struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info *psta_ap; u8 *ptr = precv_frame->u.hdr.rx_data; - sint parsing_length; //frame body length, without icv_len + sint parsing_length; /* Frame body length, without icv_len */ PNDIS_802_11_VARIABLE_IEs pIE; u8 FIXED_IE = 3, *dst; u16 j; struct tdls_txmgmt txmgmt; int ret = _SUCCESS; + if (rtw_tdls_is_driver_setup(padapter) == _FALSE) + goto exit; + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE + 1; + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN; txmgmt.dialog_token = *(ptr+2); _rtw_memcpy(&txmgmt.peer, precv_frame->u.hdr.attrib.src, ETH_ALEN); txmgmt.action_code = TDLS_DISCOVERY_RESPONSE; @@ -1605,31 +1838,26 @@ int On_TDLS_Dis_Req(_adapter *padapter, union recv_frame *precv_frame) -prx_pkt_attrib->iv_len -prx_pkt_attrib->icv_len -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN -FIXED_IE; - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _LINK_ID_IE_: - psta_ap = rtw_get_stainfo(pstapriv, pIE->data); - if(psta_ap == NULL) - { - goto exit; - } - dst = pIE->data + 12; - if( (MacAddr_isBcst(dst) == _FALSE) && (_rtw_memcmp(myid(&(padapter->eeprompriv)), dst, 6) == _FALSE) ) - { - goto exit; - } - break; - default: - break; + switch (pIE->ElementID) { + case _LINK_ID_IE_: + psta_ap = rtw_get_stainfo(pstapriv, pIE->data); + if (psta_ap == NULL) + goto exit; + dst = pIE->data + 12; + if (MacAddr_isBcst(dst) == _FALSE && (_rtw_memcmp(adapter_mac_addr(padapter), dst, 6) == _FALSE)) + goto exit; + break; + default: + break; } j += (pIE->Length + 2); @@ -1637,7 +1865,7 @@ int On_TDLS_Dis_Req(_adapter *padapter, union recv_frame *precv_frame) } issue_tdls_dis_rsp(padapter, &txmgmt, prx_pkt_attrib->privacy); - + exit: return ret; @@ -1653,51 +1881,51 @@ int On_TDLS_Teardown(_adapter *padapter, union recv_frame *precv_frame) struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info *ptdls_sta= NULL; _irqL irqL; + u8 reason; + + reason = *(ptr + prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN + 2); + DBG_871X("[TDLS] %s Reason code(%d)\n", __FUNCTION__,reason); psa = get_sa(ptr); ptdls_sta = rtw_get_stainfo(pstapriv, psa); - if(ptdls_sta!=NULL){ - if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - } - free_tdls_sta(padapter, ptdls_sta); + if (ptdls_sta != NULL) { + if (rtw_tdls_is_driver_setup(padapter)) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEAR_STA); } - + return _SUCCESS; } +#if 0 u8 TDLS_check_ch_state(uint state){ - if( (state & TDLS_CH_SWITCH_ON_STATE) && - (state & TDLS_AT_OFF_CH_STATE) && - (state & TDLS_PEER_AT_OFF_STATE) ){ - - if(state & TDLS_PEER_SLEEP_STATE) - return 2; //U-APSD + ch. switch + if (state & TDLS_CH_SWITCH_ON_STATE && + state & TDLS_PEER_AT_OFF_STATE) { + if (state & TDLS_PEER_SLEEP_STATE) + return 2; /* U-APSD + ch. switch */ else - return 1; //ch. switch + return 1; /* ch. switch */ }else return 0; } +#endif int On_TDLS_Peer_Traffic_Indication(_adapter *padapter, union recv_frame *precv_frame) { struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->src); u8 *ptr = precv_frame->u.hdr.rx_data; + struct tdls_txmgmt txmgmt; - ptr +=pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE + 1; - - if(ptdls_sta != NULL) - { - ptdls_sta->dialog = *(ptr+2); - issue_tdls_peer_traffic_rsp(padapter, ptdls_sta); + ptr +=pattrib->hdrlen + pattrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN; + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + if (ptdls_sta != NULL) { + txmgmt.dialog_token = *(ptr+2); + issue_tdls_peer_traffic_rsp(padapter, ptdls_sta, &txmgmt); //issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 0, 0); - } - else - { + } else { DBG_871X("from unknown sta:"MAC_FMT"\n", MAC_ARG(pattrib->src)); return _FAIL; } @@ -1705,44 +1933,29 @@ int On_TDLS_Peer_Traffic_Indication(_adapter *padapter, union recv_frame *precv_ return _SUCCESS; } -//we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here +/* We process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here */ int On_TDLS_Peer_Traffic_Rsp(_adapter *padapter, union recv_frame *precv_frame) { struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; struct sta_priv *pstapriv = &padapter->stapriv; - //get peer sta infomation struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); - u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state); + u8 wmmps_ac=0; + /* u8 state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state); */ int i; ptdls_sta->sta_stats.rx_data_pkts++; ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE); - //receive peer traffic response frame, sleeping STA wakes up - //ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_SLEEP_STATE); - //process_wmmps_data( padapter, precv_frame); - - // if noticed peer STA wakes up by receiving peer traffic response - // and we want to do channel swtiching, then we will transmit channel switch request first - if(ptdls_sta->tdls_sta_state & TDLS_APSD_CHSW_STATE){ - issue_tdls_ch_switch_req(padapter, pattrib->src); - ptdls_sta->tdls_sta_state &= ~(TDLS_APSD_CHSW_STATE); - return _SUCCESS; - } - - //check 4-AC queue bit - if(ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk) + /* Check 4-AC queue bit */ + if (ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk) wmmps_ac=1; - //if it's a direct link and have buffered frame - if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ - //[TDLS] UAPSD - //if(wmmps_ac && state) - if(wmmps_ac && 1) - { + /* If it's a direct link and have buffered frame */ + if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) { + if (wmmps_ac) { _irqL irqL; _list *xmitframe_plist, *xmitframe_phead; struct xmit_frame *pxmitframe=NULL; @@ -1752,48 +1965,31 @@ int On_TDLS_Peer_Traffic_Rsp(_adapter *padapter, union recv_frame *precv_frame) xmitframe_phead = get_list_head(&ptdls_sta->sleep_q); xmitframe_plist = get_next(xmitframe_phead); - //transmit buffered frames - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { + /* transmit buffered frames */ + while (rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist) == _FALSE) { pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); xmitframe_plist = get_next(xmitframe_plist); rtw_list_delete(&pxmitframe->list); ptdls_sta->sleepq_len--; ptdls_sta->sleepq_ac_len--; - if(ptdls_sta->sleepq_len>0){ + if (ptdls_sta->sleepq_len>0) { pxmitframe->attrib.mdata = 1; pxmitframe->attrib.eosp = 0; - }else{ + } else { pxmitframe->attrib.mdata = 0; pxmitframe->attrib.eosp = 1; } pxmitframe->attrib.triggered = 1; rtw_hal_xmitframe_enqueue(padapter, pxmitframe); - - } - if(ptdls_sta->sleepq_len==0) - { + if (ptdls_sta->sleepq_len==0) DBG_871X("no buffered packets for tdls to xmit\n"); - //on U-APSD + CH. switch state, when there is no buffered date to xmit, - // we should go back to base channel - if(state==2){ - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - }else if(ptdls_sta->tdls_sta_state&TDLS_SW_OFF_STATE){ - ptdls_sta->tdls_sta_state &= ~(TDLS_SW_OFF_STATE); - ptdlsinfo->candidate_ch= pmlmeext->cur_channel; - issue_tdls_ch_switch_req(padapter, pattrib->src); - DBG_871X("issue tdls ch switch req back to base channel\n"); - } - - } - else - { + else { DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); - ptdls_sta->sleepq_len=0; + ptdls_sta->sleepq_len=0; } _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); @@ -1805,8 +2001,10 @@ int On_TDLS_Peer_Traffic_Rsp(_adapter *padapter, union recv_frame *precv_frame) return _SUCCESS; } +#ifdef CONFIG_TDLS_CH_SW sint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame) { + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; struct sta_info *ptdls_sta= NULL; struct sta_priv *pstapriv = &padapter->stapriv; u8 *ptr = precv_frame->u.hdr.rx_data; @@ -1814,14 +2012,25 @@ sint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame) u8 *psa; sint parsing_length; PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =3; + u8 FIXED_IE = 4; u16 j; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct tdls_txmgmt txmgmt; + u16 switch_time= CH_SWITCH_TIME * 1000, switch_timeout=CH_SWITCH_TIMEOUT * 1000; + if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE) + { DBG_871X("[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\n", __FUNCTION__); + return _SUCCESS; + } + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); psa = get_sa(ptr); ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + + ptdls_sta->ch_switch_time=switch_time; + ptdls_sta->ch_switch_timeout=switch_timeout; + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN; parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len -prx_pkt_attrib->hdrlen -prx_pkt_attrib->iv_len @@ -1831,55 +2040,54 @@ sint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame) -PAYLOAD_TYPE_LEN -FIXED_IE; - ptdls_sta->off_ch = *(ptr+2); - - //parsing information element - for(j=FIXED_IE; joff_ch_num = *(ptr + 2); + if (*(ptr + 2) == 2) { + pchsw_info->off_ch_num = 11; + } + + if (pchsw_info->off_ch_num != pmlmeext->cur_channel) { + pchsw_info->delay_switch_back = _FALSE; + } + + /* Parsing information element */ + for (j=FIXED_IE; jElementID) - { - case _COUNTRY_IE_: - break; - case _CH_SWTICH_ANNOUNCE_: - break; - case _LINK_ID_IE_: - break; - case _CH_SWITCH_TIMING_: - _rtw_memcpy(&ptdls_sta->ch_switch_time, pIE->data, 2); - _rtw_memcpy(&ptdls_sta->ch_switch_timeout, pIE->data+2, 2); - default: - break; + switch (pIE->ElementID) { + case EID_SecondaryChnlOffset: + padapter->tdlsinfo.chsw_info.ch_offset = *(pIE->data); + break; + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + ptdls_sta->ch_switch_time = (RTW_GET_LE16(pIE->data) >= CH_SWITCH_TIME * 1000) ? + RTW_GET_LE16(pIE->data) : CH_SWITCH_TIME * 1000; + ptdls_sta->ch_switch_timeout = (RTW_GET_LE16(pIE->data + 2) >= CH_SWITCH_TIMEOUT * 1000) ? + RTW_GET_LE16(pIE->data + 2) : CH_SWITCH_TIMEOUT * 1000; + DBG_871X("%s ch_switch_time:%d, ch_switch_timeout:%d\n" + , __FUNCTION__, RTW_GET_LE16(pIE->data), RTW_GET_LE16(pIE->data + 2)); + default: + break; } j += (pIE->Length + 2); - } - //todo: check status - ptdls_sta->stat_code=0; - ptdls_sta->tdls_sta_state |= TDLS_CH_SWITCH_ON_STATE; - - issue_nulldata(padapter, NULL, 1, 0, 0); - - issue_tdls_ch_switch_rsp(padapter, psa); + /* Todo: check status */ + txmgmt.status_code = 0; + _rtw_memcpy(txmgmt.peer, psa, ETH_ALEN); + + ATOMIC_SET(&pchsw_info->chsw_on, _TRUE); - DBG_871X("issue tdls channel switch response\n"); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_RESP); - if((ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){ - DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); - ptdls_sta->option=TDLS_BASE_CH; - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_BASE_CH); - }else{ - ptdls_sta->option=TDLS_OFF_CH; - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_OFF_CH); - } return _SUCCESS; } sint On_TDLS_Ch_Switch_Rsp(_adapter *padapter, union recv_frame *precv_frame) { + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; struct sta_info *ptdls_sta= NULL; struct sta_priv *pstapriv = &padapter->stapriv; u8 *ptr = precv_frame->u.hdr.rx_data; @@ -1887,38 +2095,31 @@ sint On_TDLS_Ch_Switch_Rsp(_adapter *padapter, union recv_frame *precv_frame) u8 *psa; sint parsing_length; PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =4; - u16 stat_code, j, switch_time, switch_timeout; + u8 FIXED_IE = 4; + u16 status_code, j, switch_time, switch_timeout; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; int ret = _SUCCESS; + if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE) + { DBG_871X("[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\n", __FUNCTION__); + return _SUCCESS; + } + psa = get_sa(ptr); ptdls_sta = rtw_get_stainfo(pstapriv, psa); - //if channel switch is running and receiving Unsolicited TDLS Channel Switch Response, - //it will go back to base channel and terminate this channel switch procedure - if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE ){ - if(pmlmeext->cur_channel==ptdls_sta->off_ch){ - DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); - ptdls_sta->option=TDLS_BASE_CH; - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_BASE_CH); - }else{ + /* If we receive Unsolicited TDLS Channel Switch Response when channel switch is running, */ + /* we will go back to base channel and terminate this channel switch procedure */ + if (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) { + if (pmlmeext->cur_channel != rtw_get_oper_ch(padapter)) { DBG_871X("receive unsolicited channel switch response \n"); - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF); + rtw_tdls_cmd(padapter, NULL, TDLS_CH_SW_BACK); + goto exit; } - ret = _FAIL; - goto exit; - } - - //avoiding duplicated or unconditional ch. switch. rsp - if(!(ptdls_sta->tdls_sta_state & TDLS_CH_SW_INITIATOR_STATE)) - { - ret = _FAIL; - goto exit; } - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN; + parsing_length = ((union recv_frame *)precv_frame)->u.hdr.len -prx_pkt_attrib->hdrlen -prx_pkt_attrib->iv_len -prx_pkt_attrib->icv_len @@ -1927,49 +2128,49 @@ sint On_TDLS_Ch_Switch_Rsp(_adapter *padapter, union recv_frame *precv_frame) -PAYLOAD_TYPE_LEN -FIXED_IE; - _rtw_memcpy(&stat_code, ptr+2, 2); + _rtw_memcpy(&status_code, ptr+2, 2); - if(stat_code!=0){ + if (status_code != 0) { + DBG_871X("[%s] status_code:%d\n", __FUNCTION__, status_code); + pchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE); + ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); ret = _FAIL; goto exit; } - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _LINK_ID_IE_: - break; - case _CH_SWITCH_TIMING_: - _rtw_memcpy(&switch_time, pIE->data, 2); - if(switch_time > ptdls_sta->ch_switch_time) - _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2); - - _rtw_memcpy(&switch_timeout, pIE->data+2, 2); - if(switch_timeout > ptdls_sta->ch_switch_timeout) - _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2); - - default: - break; + switch (pIE->ElementID) { + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + _rtw_memcpy(&switch_time, pIE->data, 2); + if (switch_time > ptdls_sta->ch_switch_time) + _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2); + + _rtw_memcpy(&switch_timeout, pIE->data + 2, 2); + if (switch_timeout > ptdls_sta->ch_switch_timeout) + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2); + break; + default: + break; } j += (pIE->Length + 2); - } - ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SW_INITIATOR_STATE); - ptdls_sta->tdls_sta_state |=TDLS_CH_SWITCH_ON_STATE; - - //goto set_channel_workitem_callback() - ptdls_sta->option=TDLS_OFF_CH; - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_OFF_CH); + if ((pmlmeext->cur_channel == rtw_get_oper_ch(padapter)) && + (pchsw_info->ch_sw_state & TDLS_WAIT_CH_RSP_STATE)) { + ATOMIC_SET(&pchsw_info->chsw_on, _TRUE); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW); + } exit: return ret; } +#endif /* CONFIG_TDLS_CH_SW */ #ifdef CONFIG_WFD void wfd_ie_tdls(_adapter * padapter, u8 *pframe, u32 *pktlen ) @@ -1979,376 +2180,230 @@ void wfd_ie_tdls(_adapter * padapter, u8 *pframe, u32 *pktlen ) u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; u32 wfdielen = 0; - // WFD OUI + /* WFD OUI */ wfdielen = 0; wfdie[ wfdielen++ ] = 0x50; wfdie[ wfdielen++ ] = 0x6F; wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 - - // Commented by Albert 20110825 - // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID ( Optional ) - // 3. Local IP Adress ( Optional ) - - // WFD Device Information ATTR - // Type: + wfdie[ wfdielen++ ] = 0x0A; /* WFA WFD v1.0 */ + + /* + * Commented by Albert 20110825 + * According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes + * 1. WFD Device Information + * 2. Associated BSSID ( Optional ) + * 3. Local IP Adress ( Optional ) + */ + + /* WFD Device Information ATTR */ + /* Type: */ wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; - // Length: - // Note: In the WFD specification, the size of length field is 2. + /* Length: */ + /* Note: In the WFD specification, the size of length field is 2. */ RTW_PUT_BE16(wfdie + wfdielen, 0x0006); wfdielen += 2; - // Value1: - // WFD device information - // available for WFD session + Preferred TDLS + WSD ( WFD Service Discovery ) + /* Value1: */ + /* WFD device information */ + /* available for WFD session + Preferred TDLS + WSD ( WFD Service Discovery ) */ RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_WSD); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 + /* Value2: */ + /* Session Management Control Port */ + /* Default TCP port for RTSP messages is 554 */ RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); wfdielen += 2; - // Value3: - // WFD Device Maximum Throughput - // 300Mbps is the maximum throughput + /* Value3: */ + /* WFD Device Maximum Throughput */ + /* 300Mbps is the maximum throughput */ RTW_PUT_BE16(wfdie + wfdielen, 300); wfdielen += 2; - // Associated BSSID ATTR - // Type: + /* Associated BSSID ATTR */ + /* Type: */ wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; - // Length: - // Note: In the WFD specification, the size of length field is 2. + /* Length: */ + /* Note: In the WFD specification, the size of length field is 2. */ RTW_PUT_BE16(wfdie + wfdielen, 0x0006); wfdielen += 2; - // Value: - // Associated BSSID - if ( check_fwstate( pmlmepriv, _FW_LINKED) == _TRUE ) - { - _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); - } + /* Value: */ + /* Associated BSSID */ + if (check_fwstate( pmlmepriv, _FW_LINKED) == _TRUE) + _rtw_memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN); else - { - _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN ); - } + _rtw_memset(wfdie + wfdielen, 0x00, ETH_ALEN); - // Local IP Address ATTR + /* Local IP Address ATTR */ wfdie[ wfdielen++ ] = WFD_ATTR_LOCAL_IP_ADDR; - // Length: - // Note: In the WFD specification, the size of length field is 2. + /* Length: */ + /* Note: In the WFD specification, the size of length field is 2. */ RTW_PUT_BE16(wfdie + wfdielen, 0x0005); wfdielen += 2; - // Version: - // 0x01: Version1;IPv4 + /* Version: */ + /* 0x01: Version1;IPv4 */ wfdie[ wfdielen++ ] = 0x01; - // IPv4 Address + /* IPv4 Address */ _rtw_memcpy( wfdie + wfdielen, pwfd_info->ip_address, 4 ); wfdielen += 4; pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, pktlen); } -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) { - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - struct pkt_attrib *pattrib = &pxmitframe->attrib; struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_TDLS; - u8 action = TDLS_SETUP_REQUEST; - u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; //Use NDIS_802_11_LENGTH_RATES_EX in order to call func.rtw_set_supported_rate - int bssrate_len = 0, i = 0 ; - u8 more_supportedrates = 0; - unsigned int ie_len; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 iedata=0; - u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel - u8 timeout_itvl[5]; //set timeout interval to maximum value + int i = 0 ; u32 time; u8 *pframe_head; - //SNonce - if(pattrib->encrypt){ - for(i=0;i<8;i++){ + /* SNonce */ + if (pattrib->encrypt) { + for (i=0;i<8;i++) { time=rtw_get_current_time(); _rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4); } } - pframe_head = pframe; // For rtw_tdls_set_ht_cap() + pframe_head = pframe; /* For rtw_tdls_set_ht_cap() */ - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, dialog token - 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, &(ptdls_sta->dialog), &(pattrib->pktlen)); + pframe = rtw_tdls_set_payload_type(pframe, pattrib); + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt); - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + pframe = rtw_tdls_set_capability(padapter, pframe, pattrib); + pframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib); + pframe = rtw_tdls_set_sup_ch(&(padapter->mlmeextpriv), pframe, pattrib); + pframe = rtw_tdls_set_sup_reg_class(pframe, pattrib); - if(pattrib->encrypt) - *pframe =*pframe | cap_Privacy; - pframe += 2; - pattrib->pktlen += 2; + if (pattrib->encrypt) + pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); - //supported rates - if(pmlmeext->cur_channel < 14 ) - { - rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); - bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; - } - else - { - rtw_set_supported_rate(bssrate, WIRELESS_11A_5N); - bssrate_len = IEEE80211_NUM_OFDM_RATESLEN; - } + pframe = rtw_tdls_set_ext_cap(pframe, pattrib); - //country(optional) + if (pattrib->encrypt) { + pframe = rtw_tdls_set_ftie(ptxmgmt + , pframe + , pattrib + , NULL + , ptdls_sta->SNonce); - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; + pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - - // SRC IE - pframe = rtw_set_ie( pframe, _SRC_IE_, sizeof(TDLS_SRC), TDLS_SRC, &(pattrib->pktlen)); - - //RSNIE - if(pattrib->encrypt) - pframe = rtw_set_ie(pframe, _RSN_IE_2_, sizeof(TDLS_RSNIE), TDLS_RSNIE, &(pattrib->pktlen)); - - //extended capabilities - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , sizeof(TDLS_EXT_CAPIE), TDLS_EXT_CAPIE, &(pattrib->pktlen)); - //QoS capability(WMM_IE) - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(TDLS_WMMIE), TDLS_WMMIE, &(pattrib->pktlen)); + /* Sup_reg_classes(optional) */ + if (pregistrypriv->ht_enable == _TRUE) + pframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib); + pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib); - if(pattrib->encrypt){ - //FTIE - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); - //Timeout interval - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //Sup_reg_classes(optional) - //HT capabilities - pframe += rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + if ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE)) + pframe = rtw_tdls_set_qos_cap(pframe, pattrib); #ifdef CONFIG_WFD wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ } void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) { - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct registry_priv *pregistrypriv = &padapter->registrypriv; struct pkt_attrib *pattrib = &pxmitframe->attrib; struct sta_info *ptdls_sta; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_SETUP_RESPONSE; - unsigned char bssrate[NDIS_802_11_LENGTH_RATES_EX]; - int bssrate_len = 0; - u8 more_supportedrates = 0; - unsigned int ie_len; - unsigned char *p; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 iedata=0; - u8 timeout_itvl[5]; //setup response timeout interval will copy from request - u8 ANonce[32]; //maybe it can put in ontdls_req - u8 k; //for random ANonce - u8 *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL; + u8 k; /* for random ANonce */ + u8 *pftie=NULL, *ptimeout_ie = NULL, *plinkid_ie = NULL, *prsnie = NULL, *pftie_mic = NULL; u32 time; u8 *pframe_head; ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); - if(ptdls_sta == NULL ) - { - DBG_871X("[%s] %d\n", __FUNCTION__, __LINE__); - return; - } + if (ptdls_sta == NULL) + DBG_871X("[%s] %d ptdls_sta is NULL\n", __FUNCTION__, __LINE__); - if(pattrib->encrypt){ - for(k=0;k<8;k++){ - time=rtw_get_current_time(); + if (pattrib->encrypt && ptdls_sta != NULL) { + for (k=0;k<8;k++) { + time = rtw_get_current_time(); _rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4); } } pframe_head = pframe; - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status code - 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, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + pframe = rtw_tdls_set_payload_type(pframe, pattrib); + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt); - if(ptdls_sta->stat_code!=0) //invalid setup request - { - DBG_871X("ptdls_sta->stat_code:%04x \n", ptdls_sta->stat_code); + if (ptxmgmt->status_code != 0) { + DBG_871X("[%s] status_code:%04x \n", __FUNCTION__, ptxmgmt->status_code); return; } - //dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt ) - *pframe =*pframe | cap_Privacy; - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - //supported rates - if(pmlmeext->cur_channel < 14 ) - { - rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); - bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; - } - else - { - rtw_set_supported_rate(bssrate, WIRELESS_11A_5N); - bssrate_len = IEEE80211_NUM_OFDM_RATESLEN; - } - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //country(optional) - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - - // SRC IE - pframe = rtw_set_ie(pframe, _SRC_IE_ , sizeof(TDLS_SRC), TDLS_SRC, &(pattrib->pktlen)); + pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_capability(padapter, pframe, pattrib); + pframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib); + pframe = rtw_tdls_set_sup_ch(&(padapter->mlmeextpriv), pframe, pattrib); + pframe = rtw_tdls_set_sup_reg_class(pframe, pattrib); - //RSNIE - if(pattrib->encrypt){ + if (pattrib->encrypt) { prsnie = pframe; - pframe = rtw_set_ie(pframe, _RSN_IE_2_, sizeof(ptdls_sta->TDLS_RSNIE), ptdls_sta->TDLS_RSNIE, &(pattrib->pktlen)); + pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _FALSE, ptdls_sta); } - //extended capabilities - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , sizeof(TDLS_EXT_CAPIE), TDLS_EXT_CAPIE, &(pattrib->pktlen)); - - //QoS capability(WMM_IE) - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(TDLS_WMMIE), TDLS_WMMIE, &(pattrib->pktlen)); + pframe = rtw_tdls_set_ext_cap(pframe, pattrib); - if(pattrib->encrypt){ - wpa_tdls_generate_tpk(padapter, ptdls_sta); + if (pattrib->encrypt) { + if (rtw_tdls_is_driver_setup(padapter) == _TRUE) + wpa_tdls_generate_tpk(padapter, ptdls_sta); - //FTIE pftie = pframe; pftie_mic = pframe+4; - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval + pframe = rtw_tdls_set_ftie(ptxmgmt + , pframe + , pattrib + , ptdls_sta->ANonce + , ptdls_sta->SNonce); + ptimeout_ie = pframe; - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _FALSE, ptdls_sta); } - //Sup_reg_classes(optional) - //HT capabilities - pframe += rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + /* Sup_reg_classes(optional) */ + if (pregistrypriv->ht_enable == _TRUE) + pframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib); + + pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib); - //Link identifier plinkid_ie = pframe; - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE); - //fill FTIE mic - if(pattrib->encrypt) + /* Fill FTIE mic */ + if (pattrib->encrypt && rtw_tdls_is_driver_setup(padapter) == _TRUE) wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); + if ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE)) + pframe = rtw_tdls_set_qos_cap(pframe, pattrib); + #ifdef CONFIG_WFD wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ } @@ -2360,397 +2415,231 @@ void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmit struct pkt_attrib *pattrib = &pxmitframe->attrib; struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_SETUP_CONFIRM; - u8 more_supportedrates = 0; unsigned int ie_len; unsigned char *p; - u8 timeout_itvl[5]; //set timeout interval to maximum value u8 wmm_param_ele[24] = {0}; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; u8 *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL; - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status code, dialog token - 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, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); + pframe = rtw_tdls_set_payload_type(pframe, pattrib); + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt); - if(ptdls_sta->stat_code!=0) //invalid setup request + if (ptxmgmt->status_code!=0) return; - //RSNIE - if(pattrib->encrypt){ + if (pattrib->encrypt) { prsnie = pframe; - pframe = rtw_set_ie(pframe, _RSN_IE_2_, sizeof(TDLS_RSNIE), TDLS_RSNIE, &(pattrib->pktlen)); + pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); } - //EDCA param set; WMM param ele. - if(pattrib->encrypt){ - //FTIE + if (pattrib->encrypt) { pftie = pframe; pftie_mic = pframe+4; - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval + pframe = rtw_tdls_set_ftie(ptxmgmt + , pframe + , pattrib + , ptdls_sta->ANonce + , ptdls_sta->SNonce); + ptimeout_ie = pframe; - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - ptdls_sta->TPK_count=0; - _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); + + if (rtw_tdls_is_driver_setup(padapter) == _TRUE) { + /* Start TPK timer */ + ptdls_sta->TPK_count=0; + _set_timer(&ptdls_sta->TPK_timer, ONE_SEC); + } } - //HT operation; todo - //Link identifier + /* HT operation; todo */ plinkid_ie = pframe; - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); - //FTIE mic - if(pattrib->encrypt) + if (pattrib->encrypt && (rtw_tdls_is_driver_setup(padapter) == _TRUE)) wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); - //WMM Parameter Set - if(&pmlmeinfo->WMM_param) - { - _rtw_memcpy(wmm_param_ele, WMM_PARA_OUI, 6); - _rtw_memcpy(wmm_param_ele+6, (u8 *)&pmlmeinfo->WMM_param, sizeof(pmlmeinfo->WMM_param)); - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 24, wmm_param_ele, &(pattrib->pktlen)); - } - + if (ptdls_sta->qos_option == _TRUE) + pframe = rtw_tdls_set_wmm_params(padapter, pframe, pattrib); } void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) { - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - u8 action = ptxmgmt->action_code; - u8 link_id_addr[18] = {0}; + struct pkt_attrib *pattrib = &pxmitframe->attrib; struct sta_info *ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); + u8 *pftie = NULL, *pftie_mic = NULL, *plinkid_ie = NULL; - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - 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, 2, (u8 *)&ptxmgmt->status_code, &(pattrib->pktlen)); + pframe = rtw_tdls_set_payload_type(pframe, pattrib); + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt); - //Link identifier - if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + if (pattrib->encrypt) { + pftie = pframe; + pftie_mic = pframe + 4; + pframe = rtw_tdls_set_ftie(ptxmgmt + , pframe + , pattrib + , ptdls_sta->ANonce + , ptdls_sta->SNonce); } - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - + + plinkid_ie = pframe; + if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE); + else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); + + if (pattrib->encrypt && (rtw_tdls_is_driver_setup(padapter) == _TRUE)) + wpa_tdls_teardown_ftie_mic(ptdls_sta->tpk.kck, plinkid_ie, ptxmgmt->status_code, 1, 4, pftie, pftie_mic); } void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) { + struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_TDLS; - u8 action = TDLS_DISCOVERY_REQUEST; - u8 link_id_addr[18] = {0}; - static u8 dialogtoken=0; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - if(ptxmgmt->external_support == _TRUE) { - pframe = rtw_set_fixed_ie(pframe, 1, &(ptxmgmt->dialog_token), &(pattrib->pktlen)); - } else { - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen)); - dialogtoken = (dialogtoken+1)%256; - } + pframe = rtw_tdls_set_payload_type(pframe, pattrib); + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - } -void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog, u8 privacy) +void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, u8 privacy) { + struct registry_priv *pregistrypriv = &padapter->registrypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - - u8 category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = TDLS_DISCOVERY_RESPONSE; - u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; - int bssrate_len = 0; - u8 more_supportedrates = 0; - u8 *p; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 iedata=0; - u8 timeout_itvl[5]; //set timeout interval to maximum value - u32 timeout_interval= TPK_RESEND_COUNT * 1000; u8 *pframe_head, pktlen_index; - pktlen_index = pattrib->pktlen; // For mgmt frame, pattrib->pktlen would count frame header + pktlen_index = pattrib->pktlen; pframe_head = pframe; - //category, action, dialog token - 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, &(dialog), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(privacy) - *pframe =*pframe | cap_Privacy; - pframe += 2; - pattrib->pktlen += 2; + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_PUBLIC); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_capability(padapter, pframe, pattrib); - //supported rates - rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); - bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; + pframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib); - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - //RSNIE - if(privacy) - pframe = rtw_set_ie(pframe, _RSN_IE_2_, sizeof(TDLS_RSNIE), TDLS_RSNIE, &(pattrib->pktlen)); - - //extended capability - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , sizeof(TDLS_EXT_CAPIE), TDLS_EXT_CAPIE, &(pattrib->pktlen)); + if (privacy) + pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, NULL); - if(privacy){ - //FTIE - _rtw_memset(pframe, 0, 84); //All fields shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - pframe += 84; - pattrib->pktlen += 84; + pframe = rtw_tdls_set_ext_cap(pframe, pattrib); - //Timeout interval - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + if (privacy) { + pframe = rtw_tdls_set_ftie(ptxmgmt, pframe, pattrib, NULL, NULL); + pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, NULL); } - //Sup_reg_classes(optional) - //HT capabilities - pframe += rtw_tdls_set_ht_cap(padapter, pframe_head - pktlen_index, pattrib); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + if (pregistrypriv->ht_enable == _TRUE) + pframe = rtw_tdls_set_ht_cap(padapter, pframe_head - pktlen_index, pattrib); + + pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib); + pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE); } -void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) + +void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) { struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_PEER_TRAFFIC_INDICATION; - - u8 link_id_addr[18] = {0}; u8 AC_queue=0; struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst); - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - 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, &(ptdls_sta->dialog), &(pattrib->pktlen)); + pframe = rtw_tdls_set_payload_type(pframe, pattrib); + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt); - //Link identifier - if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - } - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE); + else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); - //PTI control - //PU buffer status - if(ptdls_sta->uapsd_bk&BIT(1)) + /* PTI control */ + /* PU buffer status */ + if (ptdls_sta->uapsd_bk & BIT(1)) AC_queue=BIT(0); - if(ptdls_sta->uapsd_be&BIT(1)) + if (ptdls_sta->uapsd_be & BIT(1)) AC_queue=BIT(1); - if(ptdls_sta->uapsd_vi&BIT(1)) + if (ptdls_sta->uapsd_vi & BIT(1)) AC_queue=BIT(2); - if(ptdls_sta->uapsd_vo&BIT(1)) + if (ptdls_sta->uapsd_vo & BIT(1)) AC_queue=BIT(3); pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen)); } -void rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +void rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) { struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_TDLS; - u8 action = TDLS_PEER_TRAFFIC_RESPONSE; - u8 link_id_addr[18] = {0}; struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst); - static u8 dialogtoken=0; - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - 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, &ptdls_sta->dialog, &(pattrib->pktlen)); - - //Link identifier - if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - } - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + pframe = rtw_tdls_set_payload_type(pframe, pattrib); + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt); + if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE); + else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); } -void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +#ifdef CONFIG_TDLS_CH_SW +void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) { struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_CHANNEL_SWITCH_REQUEST; - u8 link_id_addr[18] = {0}; - struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - u8 ch_switch_timing[4] = {0}; - u16 switch_time= CH_SWITCH_TIME, switch_timeout=CH_SWITCH_TIMEOUT; + u16 switch_time= CH_SWITCH_TIME * 1000, switch_timeout=CH_SWITCH_TIMEOUT * 1000; - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, target_ch - 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, &(ptdlsinfo->candidate_ch), &(pattrib->pktlen)); + ptdls_sta->ch_switch_time=switch_time; + ptdls_sta->ch_switch_timeout=switch_timeout; - //Link identifier - if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - } - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + pframe = rtw_tdls_set_payload_type(pframe, pattrib); + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_target_ch(padapter, pframe, pattrib); + pframe = rtw_tdls_set_reg_class(pframe, pattrib, ptdls_sta); - //ch switch timing - _rtw_memcpy(ch_switch_timing, &switch_time, 2); - _rtw_memcpy(ch_switch_timing+2, &switch_timeout, 2); - pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE); + else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); - //update ch switch attrib to sta_info - ptdls_sta->off_ch=ptdlsinfo->candidate_ch; - ptdls_sta->ch_switch_time=switch_time; - ptdls_sta->ch_switch_timeout=switch_timeout; + pframe = rtw_tdls_set_ch_sw(pframe, pattrib, ptdls_sta); } -void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) { struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_CHANNEL_SWITCH_RESPONSE; - u8 link_id_addr[18] = {0}; struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u8 ch_switch_timing[4] = {0}; - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status_code - 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, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + pframe = rtw_tdls_set_payload_type(pframe, pattrib); + pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS); + pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt); + pframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt); - //Link identifier - if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - } - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //ch switch timing - _rtw_memcpy(ch_switch_timing, &ptdls_sta->ch_switch_time, 2); - _rtw_memcpy(ch_switch_timing+2, &ptdls_sta->ch_switch_timeout, 2); - pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE); + else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); + pframe = rtw_tdls_set_ch_sw(pframe, pattrib, ptdls_sta); } +#endif #ifdef CONFIG_WFD void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) @@ -2759,27 +2648,21 @@ void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * p struct pkt_attrib *pattrib = &pxmitframe->attrib; struct wifidirect_info *pwdinfo = &padapter->wdinfo; struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; - u8 payload_type = 0x02; u8 category = RTW_WLAN_CATEGORY_P2P; u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; u8 probe_req = 4; u8 wfdielen = 0; - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, OUI, frame_body_type + pframe = rtw_tdls_set_payload_type(pframe, pattrib); pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); pframe = rtw_set_fixed_ie(pframe, 1, &(probe_req), &(pattrib->pktlen)); - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); pframe += wfdielen; pattrib->pktlen += wfdielen; - } - else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) - { + } else if (!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) { wfdielen = build_probe_req_wfd_ie(pbuddy_wdinfo, pframe); pframe += wfdielen; pattrib->pktlen += wfdielen; @@ -2793,34 +2676,28 @@ void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * p struct pkt_attrib *pattrib = &pxmitframe->attrib; struct wifidirect_info *pwdinfo = &padapter->wdinfo; struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; - u8 payload_type = 0x02; u8 category = RTW_WLAN_CATEGORY_P2P; u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; u8 probe_rsp = 5; u8 wfdielen = 0; - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, OUI, frame_body_type + pframe = rtw_tdls_set_payload_type(pframe, pattrib); pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); pframe = rtw_set_fixed_ie(pframe, 1, &(probe_rsp), &(pattrib->pktlen)); - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 1); pframe += wfdielen; pattrib->pktlen += wfdielen; - } - else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) - { + } else if (!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) { wfdielen = build_probe_resp_wfd_ie(pbuddy_wdinfo, pframe, 1); pframe += wfdielen; pattrib->pktlen += wfdielen; } } -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ void _tdls_tpk_timer_hdl(void *FunctionContext) { @@ -2829,58 +2706,91 @@ void _tdls_tpk_timer_hdl(void *FunctionContext) _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); ptdls_sta->TPK_count++; - //TPK_timer set 1000 as default - //retry timer should set at least 301 sec. - if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){ + /* TPK_timer expired in a second */ + /* Retry timer should set at least 301 sec. */ + if (ptdls_sta->TPK_count >= ptdls_sta->TDLS_PeerKey_Lifetime) { + DBG_871X("[TDLS] %s, Re-Setup TDLS link with "MAC_FMT" since TPK lifetime expires!\n", __FUNCTION__, MAC_ARG(ptdls_sta->hwaddr)); ptdls_sta->TPK_count=0; _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN); issue_tdls_setup_req(ptdls_sta->padapter, &txmgmt, _FALSE); } - - _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); + + _set_timer(&ptdls_sta->TPK_timer, ONE_SEC); } -// TDLS_DONE_CH_SEN: channel sensing and report candidate channel -// TDLS_OFF_CH: first time set channel to off channel -// TDLS_BASE_CH: when go back to the channel linked with AP, send null data to peer STA as an indication +#ifdef CONFIG_TDLS_CH_SW void _tdls_ch_switch_timer_hdl(void *FunctionContext) { - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; _adapter *padapter = ptdls_sta->padapter; - - if( ptdls_sta->option == TDLS_DONE_CH_SEN ){ - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_DONE_CH_SEN); - }else if( ptdls_sta->option == TDLS_OFF_CH ){ - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0); - _set_timer(&ptdls_sta->base_ch_timer, 500); - }else if( ptdls_sta->option == TDLS_BASE_CH){ - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0); + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; + + //DBG_871X("%s %d, tdls_sta_state:0x%08x\n", __FUNCTION__, __LINE__, ptdls_sta->tdls_sta_state); + + if (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)) { + if (!(pchsw_info->ch_sw_state & TDLS_PEER_AT_OFF_STATE)) { + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_BACK); + ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); + DBG_871X("[TDLS] %s, can't get traffic from op_ch:%d\n", __FUNCTION__, rtw_get_oper_ch(padapter)); + } else { + //DBG_871X("%s %d\n", __FUNCTION__, __LINE__); + //_set_timer(&ptdls_sta->delay_timer, padapter->mlmeextpriv.mlmext_info.bcn_interval - 5 - ptdls_sta->ch_switch_timeout/1000); + } + } else { + //DBG_871X("%s %d, op_ch:%d, tdls_state:0x%08x\n", __FUNCTION__, __LINE__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state); } -} -void _tdls_base_ch_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_OFF_CH); +#if 0 + if (!(pchsw_info->ch_sw_state & TDLS_PEER_AT_OFF_STATE)) { + //SelectChannel(padapter, padapter->mlmeextpriv.cur_channel); + ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); + DBG_871X("%s %d, op_ch:%d, tdls_state:0x%08x\n", __FUNCTION__, __LINE__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state); + } + + if (pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) { + if (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)) { + DBG_871X("%s %d\n", __FUNCTION__, __LINE__); + _set_timer(&ptdls_sta->delay_timer, padapter->mlmeextpriv.mlmext_info.bcn_interval - 5 - ptdls_sta->ch_switch_timeout/1000); + //_set_timer(&ptdls_sta->delay_timer, 1000); + } else { + DBG_871X("%s %d\n", __FUNCTION__, __LINE__); + issue_tdls_ch_switch_req(padapter, ptdls_sta); + //_set_timer(&ptdls_sta->delay_timer, 500); + } + } +#endif } -void _tdls_off_ch_timer_hdl(void *FunctionContext) +void _tdls_delay_timer_hdl(void *FunctionContext) { struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_BASE_CH ); + _adapter *padapter = ptdls_sta->padapter; + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; + + DBG_871X("[TDLS] %s, op_ch:%d, tdls_state:0x%08x\n", __FUNCTION__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state); + pchsw_info->delay_switch_back = _TRUE; } +#endif void _tdls_handshake_timer_hdl(void *FunctionContext) { struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + struct tdls_txmgmt txmgmt; - if(ptdls_sta != NULL) - { - if( !(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) ) + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN); + txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_; + + if (ptdls_sta != NULL) { + DBG_871X("[TDLS] Handshake time out\n"); + if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) { - DBG_871X("tdls handshake time out\n"); - rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_TEAR_STA ); + issue_tdls_teardown(padapter, &txmgmt, _TRUE); + } + else + { + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEAR_STA); } } } @@ -2895,11 +2805,10 @@ void _tdls_pti_timer_hdl(void *FunctionContext) _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN); txmgmt.status_code = _RSON_TDLS_TEAR_TOOFAR_; - if(ptdls_sta != NULL) - { - if( ptdls_sta->tdls_sta_state & TDLS_WAIT_PTR_STATE ) - { - DBG_871X("Doesn't receive PTR from peer dev:"MAC_FMT"; Send TDLS Tear Down\n", MAC_ARG(ptdls_sta->hwaddr)); + if (ptdls_sta != NULL) { + if (ptdls_sta->tdls_sta_state & TDLS_WAIT_PTR_STATE) { + DBG_871X("[TDLS] Doesn't receive PTR from peer dev:"MAC_FMT"; " + "Send TDLS Tear Down\n", MAC_ARG(ptdls_sta->hwaddr)); issue_tdls_teardown(padapter, &txmgmt, _FALSE); } } @@ -2909,9 +2818,10 @@ void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta) { psta->padapter=padapter; _init_timer(&psta->TPK_timer, padapter->pnetdev, _tdls_tpk_timer_hdl, psta); - _init_timer(&psta->option_timer, padapter->pnetdev, _tdls_ch_switch_timer_hdl, psta); - _init_timer(&psta->base_ch_timer, padapter->pnetdev, _tdls_base_ch_timer_hdl, psta); - _init_timer(&psta->off_ch_timer, padapter->pnetdev, _tdls_off_ch_timer_hdl, psta); +#ifdef CONFIG_TDLS_CH_SW + _init_timer(&psta->ch_sw_timer, padapter->pnetdev, _tdls_ch_switch_timer_hdl, psta); + _init_timer(&psta->delay_timer, padapter->pnetdev, _tdls_delay_timer_hdl, psta); +#endif _init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta); _init_timer(&psta->pti_timer, padapter->pnetdev, _tdls_pti_timer_hdl, psta); } @@ -2919,9 +2829,10 @@ void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta) void rtw_free_tdls_timer(struct sta_info *psta) { _cancel_timer_ex(&psta->TPK_timer); - _cancel_timer_ex(&psta->option_timer); - _cancel_timer_ex(&psta->base_ch_timer); - _cancel_timer_ex(&psta->off_ch_timer); +#ifdef CONFIG_TDLS_CH_SW + _cancel_timer_ex(&psta->ch_sw_timer); + _cancel_timer_ex(&psta->delay_timer); +#endif _cancel_timer_ex(&psta->handshake_timer); _cancel_timer_ex(&psta->pti_timer); } @@ -2941,8 +2852,7 @@ u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta) rtw_hal_update_sta_rate_mask(padapter, psta); tx_ra_bitmap = psta->ra_mask; - if ( pcur_network->Configuration.DSConfig > 14 ) { - // 5G band + if (pcur_network->Configuration.DSConfig > 14) { if (tx_ra_bitmap & 0xffff000) sta_band |= WIRELESS_11_5N | WIRELESS_11A; else @@ -2963,5 +2873,41 @@ u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta) return tx_ra_bitmap; } -#endif //CONFIG_TDLS +int rtw_tdls_is_driver_setup(_adapter *padapter) +{ + return padapter->tdlsinfo.driver_setup; +} + +const char * rtw_tdls_action_txt(enum TDLS_ACTION_FIELD action) +{ + switch (action) { + case TDLS_SETUP_REQUEST: + return "TDLS_SETUP_REQUEST"; + case TDLS_SETUP_RESPONSE: + return "TDLS_SETUP_RESPONSE"; + case TDLS_SETUP_CONFIRM: + return "TDLS_SETUP_CONFIRM"; + case TDLS_TEARDOWN: + return "TDLS_TEARDOWN"; + case TDLS_PEER_TRAFFIC_INDICATION: + return "TDLS_PEER_TRAFFIC_INDICATION"; + case TDLS_CHANNEL_SWITCH_REQUEST: + return "TDLS_CHANNEL_SWITCH_REQUEST"; + case TDLS_CHANNEL_SWITCH_RESPONSE: + return "TDLS_CHANNEL_SWITCH_RESPONSE"; + case TDLS_PEER_PSM_REQUEST: + return "TDLS_PEER_PSM_REQUEST"; + case TDLS_PEER_PSM_RESPONSE: + return "TDLS_PEER_PSM_RESPONSE"; + case TDLS_PEER_TRAFFIC_RESPONSE: + return "TDLS_PEER_TRAFFIC_RESPONSE"; + case TDLS_DISCOVERY_REQUEST: + return "TDLS_DISCOVERY_REQUEST"; + case TDLS_DISCOVERY_RESPONSE: + return "TDLS_DISCOVERY_RESPONSE"; + default: + return "UNKNOWN"; + } +} +#endif /* CONFIG_TDLS */ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_vht.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_vht.c index ce971d5a5ed3..e24cc67efec3 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_vht.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_vht.c @@ -64,7 +64,7 @@ u8 rtw_get_vht_highest_rate(u8 *pvht_mcs_map) } } - //DBG_871X("HighestVHTMCSRate is %x\n", vht_mcs_rate); + /* DBG_871X("HighestVHTMCSRate is %x\n", vht_mcs_rate); */ return vht_mcs_rate; } @@ -88,7 +88,7 @@ u8 rtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map) } } - //DBG_871X("%s : %dSS\n", __FUNCTION__, nss); + DBG_871X("%s : %dSS\n", __FUNCTION__, nss); return nss; } @@ -119,9 +119,9 @@ void rtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map) u16 rtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate) { - if(vht_mcs_rate > MGN_VHT2SS_MCS9) - vht_mcs_rate = MGN_VHT2SS_MCS9; - + if(vht_mcs_rate > MGN_VHT3SS_MCS9) + vht_mcs_rate = MGN_VHT3SS_MCS9; + /* DBG_871X("bw=%d, short_GI=%d, ((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)=%d\n", bw, short_GI, ((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)); */ return VHT_MCS_DATA_RATE[bw][short_GI][((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)]; } @@ -189,10 +189,12 @@ void rtw_vht_use_default_setting(_adapter *padapter) rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - if (rf_type == RF_1T1R) - pvhtpriv->vht_mcs_map[0] = 0xfe; // Only support 1SS MCS 0~9; + if (rf_type == RF_3T3R) + pvhtpriv->vht_mcs_map[0] = 0xea; /* support 1SS MCS 0~9 2SS MCS 0~9 3SS MCS 0~9 */ + else if(rf_type == RF_2T2R) + pvhtpriv->vht_mcs_map[0] = 0xfa; /* support 1SS MCS 0~9 2SS MCS 0~9 */ else - pvhtpriv->vht_mcs_map[0] = 0xfa; //support 1SS MCS 0~9 2SS MCS 0~9 + pvhtpriv->vht_mcs_map[0] = 0xfe; /* Only support 1SS MCS 0~9; */ pvhtpriv->vht_mcs_map[1] = 0xff; if(pregistrypriv->vht_rate_sel == 1) @@ -235,19 +237,21 @@ void rtw_vht_use_default_setting(_adapter *padapter) pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map); } -u32 rtw_vht_rate_to_bitmap(u8 *pVHTRate) +u64 rtw_vht_rate_to_bitmap(u8 *pVHTRate) { u8 i,j , tmpRate; - u32 RateBitmap = 0; + u64 RateBitmap = 0; + u8 Bits_3ss = 6; - for(i = j= 0; i < 4; i+=2, j+=10) + for(i = j= 0; i < Bits_3ss; i+=2, j+=10) { + /* every two bits means single sptial stream */ tmpRate = (pVHTRate[0] >> i) & 3; switch(tmpRate){ case 2: - RateBitmap = RateBitmap | (0x03ff << j); + RateBitmap = RateBitmap | (0x03ff << j); break; case 1: RateBitmap = RateBitmap | (0x01ff << j); @@ -261,7 +265,7 @@ u32 rtw_vht_rate_to_bitmap(u8 *pVHTRate) break; } } - + DBG_871X("RateBitmap=%016llx , pVHTRate[0]=%02x\n", RateBitmap, pVHTRate[0]); return RateBitmap; } @@ -425,6 +429,8 @@ void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) vht_mcs[0] |= 0xfc; else if (rf_type == RF_2T2R) vht_mcs[0] |= 0xf0; + else if (rf_type == RF_3T3R) + vht_mcs[0] |= 0xc0; _rtw_memcpy(pvhtpriv->vht_mcs_map, vht_mcs, 2); @@ -530,10 +536,12 @@ u32 rtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw) chnl_width = bw; rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - if(rf_type == RF_1T1R) - rx_nss = 1; - else + if(rf_type == RF_3T3R) + rx_nss = 3; + else if(rf_type == RF_2T2R) rx_nss = 2; + else + rx_nss = 1; SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&opmode, chnl_width); SET_VHT_OPERATING_MODE_FIELD_RX_NSS(&opmode, (rx_nss-1)); @@ -558,7 +566,10 @@ u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf) pcap = pvhtpriv->vht_cap; _rtw_memset(pcap, 0, 32); - + + /* B0 B1 Maximum MPDU Length */ + SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 2); + // B2 B3 Supported Channel Width Set SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 0); //indicate we don't support neither 160M nor 80+80M bandwidth. diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_wlan_util.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_wlan_util.c index c2e4e48dddc9..1f2fc4edd780 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_wlan_util.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_wlan_util.c @@ -31,6 +31,7 @@ unsigned char ARTHEROS_OUI2[] = {0x00, 0x13, 0x74}; unsigned char BROADCOM_OUI1[] = {0x00, 0x10, 0x18}; unsigned char BROADCOM_OUI2[] = {0x00, 0x0a, 0xf7}; unsigned char BROADCOM_OUI3[] = {0x00, 0x05, 0xb5}; +unsigned char BROADCOM_OUI4[] = {0x00, 0x90, 0x4c}; unsigned char CISCO_OUI[] = {0x00, 0x40, 0x96}; unsigned char MARVELL_OUI[] = {0x00, 0x50, 0x43}; @@ -80,7 +81,7 @@ int cckrates_included(unsigned char *rate, int ratelen) { if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) - return _TRUE; + return _TRUE; } return _FALSE; @@ -95,7 +96,7 @@ int cckratesonly_included(unsigned char *rate, int ratelen) { if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) - return _FALSE; + return _FALSE; } return _TRUE; @@ -139,13 +140,17 @@ u8 networktype_to_raid(_adapter *adapter,struct sta_info *psta) u8 networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta) { struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - u8 raid, cur_rf_type, rf_type= RF_1T1R; + u8 raid = RATEID_IDX_BGN_40M_1SS, cur_rf_type, rf_type, custom_rf_type; + cur_rf_type = rf_type = RF_1T1R; + custom_rf_type = adapter->registrypriv.rf_config; rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&cur_rf_type)); if(cur_rf_type == RF_1T1R) { rf_type = RF_1T1R; } + else if(cur_rf_type == RF_3T3R) + rf_type = RF_3T3R; else if(IsSupportedVHT(psta->wireless_mode)) { if(psta->ra_mask & 0xffc00000) rf_type = RF_2T2R; @@ -155,6 +160,7 @@ u8 networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta) rf_type = RF_2T2R; } + switch(psta->wireless_mode) { case WIRELESS_11B: @@ -171,54 +177,82 @@ u8 networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta) case WIRELESS_11_5N: case WIRELESS_11A_5N: case WIRELESS_11G_24N: - if (rf_type == RF_2T2R) + if (rf_type == RF_1T1R || custom_rf_type == RF_1T2R) + raid = RATEID_IDX_GN_N1SS; + else if (rf_type == RF_2T2R || custom_rf_type == RF_2T4R) raid = RATEID_IDX_GN_N2SS; + else if (rf_type == RF_3T3R) + raid = RATEID_IDX_BGN_3SS; else - raid = RATEID_IDX_GN_N1SS; + DBG_871X("RF type error!(rf_type=%d)\n", rf_type); break; case WIRELESS_11B_24N: case WIRELESS_11BG_24N: if (psta->bw_mode == CHANNEL_WIDTH_20) { - if (rf_type == RF_2T2R) + if (rf_type == RF_1T1R || custom_rf_type == RF_1T2R) + raid = RATEID_IDX_BGN_20M_1SS_BN; + else if (rf_type == RF_2T2R || custom_rf_type == RF_2T4R) raid = RATEID_IDX_BGN_20M_2SS_BN; + else if(rf_type == RF_3T3R) + raid = RATEID_IDX_BGN_3SS; else - raid = RATEID_IDX_BGN_20M_1SS_BN; + DBG_871X("RF type error!(rf_type=%d)\n", rf_type); } else { - if (rf_type == RF_2T2R) + if (rf_type == RF_1T1R || custom_rf_type == RF_1T2R) + raid = RATEID_IDX_BGN_40M_1SS; + else if (rf_type == RF_2T2R || custom_rf_type == RF_2T4R) raid = RATEID_IDX_BGN_40M_2SS; + else if(rf_type == RF_3T3R) + raid = RATEID_IDX_BGN_3SS; else - raid = RATEID_IDX_BGN_40M_1SS; + DBG_871X("RF type error!(rf_type=%d)\n", rf_type); } break; #ifdef CONFIG_80211AC_VHT case WIRELESS_11_5AC: - if (rf_type == RF_1T1R) + if (rf_type == RF_1T1R || custom_rf_type == RF_1T2R) raid = RATEID_IDX_VHT_1SS; - else + else if (rf_type == RF_2T2R || custom_rf_type == RF_2T4R) raid = RATEID_IDX_VHT_2SS; + else if (rf_type == RF_3T3R) + raid = RATEID_IDX_VHT_3SS; + else + DBG_871X("RF type error!(rf_type=%d)\n", rf_type); break; case WIRELESS_11_24AC: if (psta->bw_mode >= CHANNEL_WIDTH_80) { - if (rf_type == RF_1T1R) + if (rf_type == RF_1T1R || custom_rf_type == RF_1T2R) raid = RATEID_IDX_VHT_1SS; - else + else if (rf_type == RF_2T2R || custom_rf_type == RF_2T4R) raid = RATEID_IDX_VHT_2SS; + else if (rf_type == RF_3T3R) + raid = RATEID_IDX_VHT_3SS; + else + DBG_871X("RF type error!(rf_type=%d)\n", rf_type); } else { - if (rf_type == RF_1T1R) - raid = 11; + if (rf_type == RF_1T1R || custom_rf_type == RF_1T2R) + raid = RATEID_IDX_MIX1; + else if (rf_type == RF_2T2R || custom_rf_type == RF_2T4R) + raid = RATEID_IDX_MIX2; + else if (rf_type == RF_3T3R) + raid = RATEID_IDX_VHT_3SS; else - raid = 12; + DBG_871X("RF type error!(rf_type=%d)\n", rf_type); } break; #endif default: - raid = RATEID_IDX_BGN_40M_2SS; + DBG_871X("unexpected wireless mode!(psta->wireless_mode=%x)\n", psta->wireless_mode); break; } + + /*DBG_871X("psta->wireless_mode=%x, cur_rf_type=%d , rf_type=%d , raid=%d \n" + , psta->wireless_mode, cur_rf_type, rf_type, raid);*/ + return raid; } @@ -662,12 +696,6 @@ void SelectChannel(_adapter *padapter, unsigned char channel) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -#ifdef CONFIG_DUALMAC_CONCURRENT - //saved channel info - rtw_set_oper_ch(padapter, channel); - dc_SelectChannel(padapter, channel); -#else //CONFIG_DUALMAC_CONCURRENT - _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); //saved channel info @@ -677,20 +705,12 @@ void SelectChannel(_adapter *padapter, unsigned char channel) _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); -#endif // CONFIG_DUALMAC_CONCURRENT } void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -#ifdef CONFIG_DUALMAC_CONCURRENT - //saved bw info - rtw_set_oper_bw(padapter, bwmode); - rtw_set_oper_choffset(padapter, channel_offset); - dc_SetBWMode(padapter, bwmode, channel_offset); -#else //CONFIG_DUALMAC_CONCURRENT - _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL); //saved bw info @@ -700,8 +720,6 @@ void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_ rtw_hal_set_bwmode(padapter, (CHANNEL_WIDTH)bwmode, channel_offset); _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL); - -#endif // CONFIG_DUALMAC_CONCURRENT } void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode) @@ -725,19 +743,10 @@ void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char else chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE; } - - //set Channel -#ifdef CONFIG_DUALMAC_CONCURRENT - //saved channel/bw info - rtw_set_oper_ch(padapter, channel); - rtw_set_oper_bw(padapter, bwmode); - rtw_set_oper_choffset(padapter, channel_offset); - SelectChannel(padapter, channel); - SetBWMode(padapter, bwmode, channel_offset); -#else //CONFIG_DUALMAC_CONCURRENT - _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); + + //set Channel //saved channel/bw info rtw_set_oper_ch(padapter, channel); rtw_set_oper_bw(padapter, bwmode); @@ -746,8 +755,6 @@ void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char rtw_hal_set_chnl_bw(padapter, center_ch, bwmode, channel_offset, chnl_offset80); // set center channel _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); - -#endif // CONFIG_DUALMAC_CONCURRENT } int get_bsstype(unsigned short capability) @@ -1659,7 +1666,7 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) { #ifdef CONFIG_80211N_HT unsigned int i; - u8 rf_type; + u8 rf_type = RF_1T1R; u8 max_AMPDU_len, min_MPDU_spacing; u8 cur_ldpc_cap=0, cur_stbc_cap=0, cur_beamform_cap=0; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -1730,9 +1737,8 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) 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 + case RF_2T2R: + #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 @@ -1740,6 +1746,12 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) #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 + break; + case RF_3T3R: + set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_3R); + break; + default: + DBG_871X("[warning] rf_type %d is not expected\n", rf_type); } if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { @@ -2007,23 +2019,6 @@ void update_ldpc_stbc_cap(struct sta_info *psta) #endif //CONFIG_80211N_HT } -#ifdef CONFIG_TDLS -int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len) -{ - u8 tdls_prohibited_bit = 0x40; //bit(38); TDLS_prohibited - - if(pkt_len < 5) - { - return _FALSE; - } - - pframe += 4; - if( (*pframe) & tdls_prohibited_bit ) - return _TRUE; - - return _FALSE; -} -#endif //CONFIG_TDLS /* * rtw_get_bcn_keys: get beacon keys from recv frame @@ -2495,6 +2490,8 @@ void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta case _EXT_CAP_IE_: if( check_ap_tdls_prohibited(pIE->data, pIE->Length) == _TRUE ) ptdlsinfo->ap_prohibited = _TRUE; + if (check_ap_tdls_ch_switching_prohibited(pIE->data, pIE->Length) == _TRUE) + ptdlsinfo->ch_switch_prohibited = _TRUE; break; #endif //CONFIG_TDLS default: @@ -2608,7 +2605,7 @@ unsigned int should_forbid_n_rate(_adapter * padapter) case _RSN_IE_2_: if ((_rtw_memcmp((pIE->data + 8), RSN_CIPHER_SUITE_CCMP, 4)) || (_rtw_memcmp((pIE->data + 12), RSN_CIPHER_SUITE_CCMP, 4))) - return _FALSE; + return _FALSE; default: break; @@ -2898,9 +2895,10 @@ unsigned char check_assoc_AP(u8 *pframe, uint len) DBG_871X("link to Artheros AP\n"); return HT_IOT_PEER_ATHEROS; } - else if ((_rtw_memcmp(pIE->data, BROADCOM_OUI1, 3)) - || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3)) - || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3))) + else if ( (_rtw_memcmp(pIE->data, BROADCOM_OUI1, 3)) + || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3)) + || (_rtw_memcmp(pIE->data, BROADCOM_OUI3, 3)) + || (_rtw_memcmp(pIE->data, BROADCOM_OUI4, 3))) { DBG_871X("link to Broadcom AP\n"); return HT_IOT_PEER_BROADCOM; @@ -2977,38 +2975,6 @@ unsigned char check_assoc_AP(u8 *pframe, uint len) return HT_IOT_PEER_UNKNOWN; } -void update_IOT_info(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - switch (pmlmeinfo->assoc_AP_vendor) - { - case HT_IOT_PEER_MARVELL: - pmlmeinfo->turboMode_cts2self = 1; - pmlmeinfo->turboMode_rtsen = 0; - break; - - case HT_IOT_PEER_RALINK: - pmlmeinfo->turboMode_cts2self = 0; - pmlmeinfo->turboMode_rtsen = 1; - //disable high power - Switch_DM_Func(padapter, (~DYNAMIC_BB_DYNAMIC_TXPWR), _FALSE); - break; - case HT_IOT_PEER_REALTEK: - //rtw_write16(padapter, 0x4cc, 0xffff); - //rtw_write16(padapter, 0x546, 0x01c0); - //disable high power - Switch_DM_Func(padapter, (~DYNAMIC_BB_DYNAMIC_TXPWR), _FALSE); - break; - default: - pmlmeinfo->turboMode_cts2self = 0; - pmlmeinfo->turboMode_rtsen = 1; - break; - } - -} - void update_capinfo(PADAPTER Adapter, u16 updateCap) { struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; @@ -3123,6 +3089,7 @@ void update_wireless_mode(_adapter *padapter) } pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode; + /* DBG_871X("network_type=%02x, padapter->registrypriv.wireless_mode=%02x\n", network_type, padapter->registrypriv.wireless_mode); */ /* if((pmlmeext->cur_wireless_mode==WIRELESS_11G) || (pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G) @@ -3134,9 +3101,9 @@ void update_wireless_mode(_adapter *padapter) SIFS_Timer = 0x0a0a0808; //0x0808 -> for CCK, 0x0a0a -> for OFDM //change this value if having IOT issues. - padapter->HalFunc.SetHwRegHandler( padapter, HW_VAR_RESP_SIFS, (u8 *)&SIFS_Timer); + rtw_hal_set_hwreg( padapter, HW_VAR_RESP_SIFS, (u8 *)&SIFS_Timer); - padapter->HalFunc.SetHwRegHandler( padapter, HW_VAR_WIRELESS_MODE, (u8 *)&(pmlmeext->cur_wireless_mode)); + rtw_hal_set_hwreg( padapter, HW_VAR_WIRELESS_MODE, (u8 *)&(pmlmeext->cur_wireless_mode)); #ifdef CONFIG_P2P // Added by Thomas 20130822 @@ -3232,31 +3199,41 @@ void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr) struct ADDBA_request *preq = (struct ADDBA_request*)paddba_req; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 size; psta = rtw_get_stainfo(pstapriv, addr); + if (!psta) + goto exit; - if(psta) - { - start_seq = le16_to_cpu(preq->BA_starting_seqctrl) >> 4; - - param = le16_to_cpu(preq->BA_para_set); - tid = (param>>2)&0x0f; - - preorder_ctrl = &psta->recvreorder_ctrl[tid]; + start_seq = le16_to_cpu(preq->BA_starting_seqctrl) >> 4; - #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ - preorder_ctrl->indicate_seq = start_seq; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, start_seq); - #endif - #else - preorder_ctrl->indicate_seq = 0xffff; - #endif - - preorder_ctrl->enable =(pmlmeinfo->bAcceptAddbaReq == _TRUE)? _TRUE :_FALSE; + param = le16_to_cpu(preq->BA_para_set); + tid = (param>>2)&0x0f; + + preorder_ctrl = &psta->recvreorder_ctrl[tid]; + + #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ + preorder_ctrl->indicate_seq = start_seq; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __func__, __LINE__, + preorder_ctrl->indicate_seq, start_seq); + #endif + #else + preorder_ctrl->indicate_seq = 0xffff; + #endif + + preorder_ctrl->enable = rtw_rx_ampdu_is_accept(padapter); + size = rtw_rx_ampdu_size(padapter); + + if (preorder_ctrl->enable == _TRUE) { + preorder_ctrl->ampdu_size = size; + issue_addba_rsp(padapter, addr, tid, 0, size); + } else { + issue_addba_rsp(padapter, addr, tid, 37, size); /* reject ADDBA Req */ } +exit: + return; } void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) @@ -3511,7 +3488,7 @@ void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta) //static u8 last_id = 0; /* for testing */ u8 last_id = 0; - if (_rtw_memcmp(psta->hwaddr, myid(&padapter->eeprompriv), ETH_ALEN)) { + if (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(padapter), ETH_ALEN)) { psta->mac_id = macid_ctl->num; return; } @@ -3585,7 +3562,7 @@ void rtw_release_macid(_adapter *padapter, struct sta_info *psta) 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)) + if (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(padapter), ETH_ALEN)) return; #ifdef CONFIG_SHARED_BMC_MACID @@ -3679,7 +3656,7 @@ unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame) *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); SetFrameSubType(pframe, WIFI_BEACON); @@ -3756,59 +3733,6 @@ unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame) } #endif -static _adapter *pbuddy_padapter = NULL; - -int rtw_handle_dualmac(_adapter *adapter, bool init) -{ - int status = _SUCCESS; - struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); - - if(adapter->chip_type != RTL8192D) - goto exit; - - if (init) { - #if 0 - /* For SMSP on 92DU-VC, driver do not probe another Interface. */ - if(dvobj->NumInterfaces == 2 && dvobj->InterfaceNumber != 0 && - adapter->registrypriv.mac_phy_mode == 1) { - DBG_871X("%s(): Do not init another USB Interface because SMSP\n",__FUNCTION__); - status = _FAIL; - goto exit; - } - #endif - - if (pbuddy_padapter == NULL) { - pbuddy_padapter = adapter; - DBG_871X("%s(): pbuddy_padapter == NULL, Set pbuddy_padapter\n",__FUNCTION__); - } else { - adapter->pbuddy_adapter = pbuddy_padapter; - pbuddy_padapter->pbuddy_adapter = adapter; - // clear global value - pbuddy_padapter = NULL; - DBG_871X("%s(): pbuddy_padapter exist, Exchange Information\n",__FUNCTION__); - } -#ifdef CONFIG_DUALMAC_CONCURRENT - if (dvobj->InterfaceNumber == 0) { - //set adapter_type/iface type - adapter->isprimary = _TRUE; - adapter->adapter_type = PRIMARY_ADAPTER; - adapter->iface_type = IFACE_PORT0; - DBG_871X("%s(): PRIMARY_ADAPTER\n",__FUNCTION__); - } else { - //set adapter_type/iface type - adapter->isprimary = _FALSE; - adapter->adapter_type = SECONDARY_ADAPTER; - adapter->iface_type = IFACE_PORT1; - DBG_871X("%s(): SECONDARY_ADAPTER\n",__FUNCTION__); - } -#endif - }else { - pbuddy_padapter = NULL; - } -exit: - return status; -} - _adapter *dvobj_get_port0_adapter(struct dvobj_priv *dvobj) { _adapter *port0_iface = NULL; @@ -3826,51 +3750,6 @@ _adapter *dvobj_get_port0_adapter(struct dvobj_priv *dvobj) return port0_iface; } -/* - * Description: - * rtw_check_invalid_mac_address: - * This is only used for checking mac address valid or not. - * - * Input: - * adapter: mac_address pointer. - * - * Output: - * _TRUE: The mac address is invalid. - * _FALSE: The mac address is valid. - * - * Auther: Isaac.Li - */ -u8 rtw_check_invalid_mac_address(u8 *mac_addr) { - u8 null_mac_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; - u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - u8 res = _FALSE; - - if (_rtw_memcmp(mac_addr, null_mac_addr, ETH_ALEN)) { - res = _TRUE; - goto func_exit; - } - - if (_rtw_memcmp(mac_addr, multi_mac_addr, ETH_ALEN)) { - res = _TRUE; - goto func_exit; - } - - if (mac_addr[0] & BIT0) { - res = _TRUE; - goto func_exit; - } - - if (mac_addr[0] & BIT1) { - res = _TRUE; - goto func_exit; - } - -func_exit: - return res; -} - - - #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip) { diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_xmit.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_xmit.c index 581113925c23..7902a737878a 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_xmit.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_xmit.c @@ -658,6 +658,19 @@ static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattri // pattrib->ampdu_en = _TRUE; //} +#ifdef CONFIG_TDLS + if (pattrib->direct_link==_TRUE) { + psta = pattrib->ptdls_sta; + + pattrib->raid = psta->raid; +#ifdef CONFIG_80211N_HT + pattrib->bwmode = psta->bw_mode; + pattrib->ht_en = psta->htpriv.ht_option; + pattrib->ch_offset = psta->htpriv.ch_offset; + pattrib->sgi= query_ra_short_GI(psta); +#endif /* CONFIG_80211N_HT */ + } +#endif /* CONFIG_TDLS */ pattrib->retry_ctrl = _FALSE; @@ -728,6 +741,13 @@ static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib } +#ifdef CONFIG_TDLS + if (pattrib->direct_link == _TRUE) { + if (pattrib->encrypt > 0) + pattrib->encrypt = _AES_; + } +#endif + switch (pattrib->encrypt) { case _WEP40_: @@ -816,19 +836,6 @@ static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib pattrib->bswenc = _FALSE; #endif -#ifdef CONFIG_TDLS - if(pattrib->direct_link == _TRUE) - { - pattrib->mac_id = pattrib->ptdls_sta->mac_id; - if(pattrib->encrypt>0) - { - pattrib->encrypt= _AES_; - pattrib->iv_len=8; - pattrib->icv_len=8; - pattrib->bswenc = _FALSE; - } - } -#endif //CONFIG_TDLS exit: return res; @@ -896,20 +903,37 @@ static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib) } #ifdef CONFIG_TDLS -void rtw_check_tdls_established(_adapter *padapter, struct pkt_attrib *pattrib) +u8 rtw_check_tdls_established(_adapter *padapter, struct pkt_attrib *pattrib) { pattrib->ptdls_sta = NULL; pattrib->direct_link = _FALSE; - if((padapter->tdlsinfo.link_established == _TRUE)){ + if (padapter->tdlsinfo.link_established == _TRUE) { pattrib->ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst); +#if 1 if((pattrib->ptdls_sta!=NULL)&& (pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)&& (pattrib->ether_type!=0x0806)){ pattrib->direct_link = _TRUE; //DBG_871X("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst)); } +#else + if (pattrib->ptdls_sta != NULL && + pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) { + pattrib->direct_link = _TRUE; + #if 0 + DBG_871X("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst)); + #endif + } + + /* ARP frame may be helped by AP*/ + if (pattrib->ether_type != 0x0806) { + pattrib->direct_link = _FALSE; + } +#endif } + + return pattrib->direct_link; } s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) @@ -933,7 +957,7 @@ s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) pattrib->psta = psta; pattrib->ack_policy = 0; // get ether_hdr_len - pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag + pattrib->pkt_hdrlen = ETH_HLEN; // [TDLS] TODO: setup req/rsp should be AC_BK if (pqospriv->qos_option && psta->qos_option) { @@ -1007,12 +1031,17 @@ 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, myid(&padapter->eeprompriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN); DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc); } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { +#ifdef CONFIG_TDLS + if (rtw_check_tdls_established(padapter, pattrib) == _TRUE) + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); /* For TDLS direct link Tx, set ra to be same to dst */ + else +#endif _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, myid(&padapter->eeprompriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN); DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta); } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { @@ -1023,10 +1052,6 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr else DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown); -#ifdef CONFIG_TDLS - rtw_check_tdls_established(padapter, pattrib); -#endif //CONFIG_TDLS - pattrib->pktlen = pktfile.pkt_len; if (ETH_P_IP == pattrib->ether_type) @@ -1181,13 +1206,18 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr } else { - if(pqospriv->qos_option) +#ifdef CONFIG_TDLS + if (pattrib->direct_link == _TRUE) { + if (pattrib->qos_en) + set_qos(&pktfile, pattrib); + } else +#endif { - set_qos(&pktfile, pattrib); + if (pqospriv->qos_option) { + set_qos(&pktfile, pattrib); - if(pmlmepriv->acm_mask != 0) - { - pattrib->priority = qos_acm(pmlmepriv->acm_mask, pattrib->priority); + if (pmlmepriv->acm_mask != 0) + pattrib->priority = qos_acm(pmlmepriv->acm_mask, pattrib->priority); } } } @@ -1404,11 +1434,6 @@ s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct qos_priv *pqospriv = &pmlmepriv->qospriv; u8 qos_option = _FALSE; -#ifdef CONFIG_TDLS - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct sta_priv *pstapriv = &padapter->stapriv; -#endif //CONFIG_TDLS - sint res = _SUCCESS; u16 *fctrl = &pwlanhdr->frame_ctl; @@ -1452,6 +1477,9 @@ _func_enter_; _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); + + if (pattrib->qos_en) + qos_option = _TRUE; } else #endif //CONFIG_TDLS @@ -1463,11 +1491,10 @@ _func_enter_; _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); - } - - if (pqospriv->qos_option) - qos_option = _TRUE; + if (pqospriv->qos_option) + qos_option = _TRUE; + } } else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ) { //to_ds = 0, fr_ds = 1; @@ -1539,25 +1566,6 @@ _func_enter_; if(psta) { -#ifdef CONFIG_TDLS - if(pattrib->direct_link==_TRUE) - { - psta = pattrib->ptdls_sta; - - //qos_en, ht_en, init rate, ,bw, ch_offset, sgi - //pattrib->qos_en = ptdls_sta->qos_option; - - pattrib->raid = psta->raid; -#ifdef CONFIG_80211N_HT - pattrib->bwmode = psta->bw_mode; - pattrib->ht_en = psta->htpriv.ht_option; - pattrib->ch_offset = psta->htpriv.ch_offset; - pattrib->sgi= query_ra_short_GI(psta); -#endif //CONFIG_80211N_HT - } -#endif //CONFIG_TDLS - - psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; @@ -1709,16 +1717,18 @@ int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 * rtw_build_tdls_dis_req_ies(padapter, pxmitframe, pframe, ptxmgmt); break; case TDLS_PEER_TRAFFIC_INDICATION: - rtw_build_tdls_peer_traffic_indication_ies(padapter, pxmitframe, pframe); + rtw_build_tdls_peer_traffic_indication_ies(padapter, pxmitframe, pframe, ptxmgmt); break; +#ifdef CONFIG_TDLS_CH_SW case TDLS_CHANNEL_SWITCH_REQUEST: - rtw_build_tdls_ch_switch_req_ies(padapter, pxmitframe, pframe); + rtw_build_tdls_ch_switch_req_ies(padapter, pxmitframe, pframe, ptxmgmt); break; case TDLS_CHANNEL_SWITCH_RESPONSE: - rtw_build_tdls_ch_switch_rsp_ies(padapter, pxmitframe, pframe); + rtw_build_tdls_ch_switch_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt); break; +#endif case TDLS_PEER_TRAFFIC_RESPONSE: - rtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe); + rtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt); break; #ifdef CONFIG_WFD case TUNNELED_PROBE_REQ: @@ -1760,7 +1770,7 @@ _func_enter_; case TDLS_SETUP_RESPONSE: case TDLS_SETUP_CONFIRM: case TDLS_PEER_TRAFFIC_INDICATION: - case TDLS_PEER_PSM_REQUEST: //directly to peer STA or via AP + case TDLS_PEER_PSM_REQUEST: case TUNNELED_PROBE_REQ: case TUNNELED_PROBE_RSP: case TDLS_DISCOVERY_REQUEST: @@ -1876,11 +1886,15 @@ _func_enter_; } } - if(psta==NULL) - return _FAIL; + if (psta==NULL) { + res = _FAIL; + goto exit; + } - if (pxmitframe->buf_addr == NULL) - return _FAIL; + if (pxmitframe->buf_addr == NULL) { + res = _FAIL; + goto exit; + } pbuf_start = pxmitframe->buf_addr; mem_start = pbuf_start + TXDESC_OFFSET; @@ -1944,6 +1958,7 @@ _func_enter_; if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) { + res = _FAIL; goto exit; } @@ -3096,7 +3111,7 @@ static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, str { pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - xmitframe_plist = get_next(xmitframe_plist); + /* xmitframe_plist = get_next(xmitframe_plist); */ /*#ifdef RTK_DMP_PLATFORM #ifdef CONFIG_USB_TX_AGGREGATION @@ -3900,13 +3915,11 @@ sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_fra break; } + /* Transmit TDLS PTI via AP */ if(ptdls_sta->sleepq_len==1) - { - //transmit TDLS PTI via AP - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_SD_PTI); - } - ret = _TRUE; + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ISSUE_PTI); + ret = _TRUE; } _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); @@ -3941,8 +3954,8 @@ if (adapter->interface_type != RTW_PCIE) { || 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":""); + 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; } } @@ -4236,10 +4249,7 @@ void stop_sta_xmit(_adapter *padapter, struct sta_info *psta) rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending)); #ifdef CONFIG_TDLS - if( !(psta->tdls_sta_state & TDLS_LINKED_STATE) ) - { - if( psta_bmc != NULL ) - { + if (!(psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta_bmc != NULL)) { #endif //CONFIG_TDLS @@ -4251,7 +4261,6 @@ void stop_sta_xmit(_adapter *padapter, struct sta_info *psta) #ifdef CONFIG_TDLS } - } #endif //CONFIG_TDLS _exit_critical_bh(&pxmitpriv->lock, &irqL0); @@ -4539,7 +4548,7 @@ exit: return; } -#endif +#endif /* defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS) */ #ifdef CONFIG_XMIT_THREAD_MODE void enqueue_pending_xmitbuf( diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c index 6e9454ca5cca..d8d4a11fa8e2 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c @@ -11,6 +11,11 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8188c2Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -45,12 +50,10 @@ halbtc8188c2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8188C_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -58,12 +61,10 @@ halbtc8188c2ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -71,7 +72,7 @@ halbtc8188c2ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -81,12 +82,10 @@ halbtc8188c2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8188C_2ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -95,17 +94,14 @@ halbtc8188c2ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8188C_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -113,12 +109,10 @@ halbtc8188c2ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -139,7 +133,7 @@ halbtc8188c2ant_ActionAlgorithm( if(!pStackInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No profile exists!!!\n")); return algorithm; } @@ -154,7 +148,7 @@ halbtc8188c2ant_ActionAlgorithm( if(pStackInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO algorithm\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO algorithm\n")); algorithm = BT_8188C_2ANT_COEX_ALGO_SCO; } else @@ -163,17 +157,17 @@ halbtc8188c2ant_ActionAlgorithm( { if(pStackInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID only\n")); algorithm = BT_8188C_2ANT_COEX_ALGO_HID; } else if(pStackInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP only\n")); algorithm = BT_8188C_2ANT_COEX_ALGO_A2DP; } else if(pStackInfo->bPanExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN only\n")); algorithm = BT_8188C_2ANT_COEX_ALGO_PAN; } } @@ -182,19 +176,19 @@ halbtc8188c2ant_ActionAlgorithm( if( pStackInfo->bHidExist && pStackInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP\n")); algorithm = BT_8188C_2ANT_COEX_ALGO_HID_A2DP; } else if( pStackInfo->bHidExist && pStackInfo->bPanExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN\n")); algorithm = BT_8188C_2ANT_COEX_ALGO_HID_PAN; } else if( pStackInfo->bPanExist && pStackInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN + A2DP\n")); algorithm = BT_8188C_2ANT_COEX_ALGO_PAN_A2DP; } } @@ -225,7 +219,7 @@ halbtc8188c2ant_SetFwBalance( H2C_Parameter[0] = 0; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Balance=[%s:%dms:%dms], write 0xc=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Balance=[%s:%dms:%dms], write 0xc=0x%x\n", bBalanceOn?"ON":"OFF", ms0, ms1, H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); @@ -241,15 +235,12 @@ halbtc8188c2ant_Balance( IN u1Byte ms1 ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Balance %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Balance %s\n", (bForceExec? "force to":""), (bBalanceOn? "ON":"OFF"))); pCoexDm->bCurBalanceOn = bBalanceOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBalanceOn = %d, bCurBalanceOn = %d!!\n", - pCoexDm->bPreBalanceOn, pCoexDm->bCurBalanceOn)); - if(pCoexDm->bPreBalanceOn == pCoexDm->bCurBalanceOn) return; } @@ -271,7 +262,7 @@ halbtc8188c2ant_SetFwDiminishWifi( if((pBtCoexist->stackInfo.minBtRssi <= -5) && (fwDacSwingLvl == 0x20)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], DiminishWiFi 0x20 original, but set 0x18 for Low RSSI!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], DiminishWiFi 0x20 original, but set 0x18 for Low RSSI!\n")); fwDacSwingLvl = 0x18; } @@ -291,7 +282,7 @@ halbtc8188c2ant_SetFwDiminishWifi( H2C_Parameter[2] |= 0x08; //BIT3 } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], bDacOn=%s, bInterruptOn=%s, bNavOn=%s, write 0xe=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bDacOn=%s, bInterruptOn=%s, bNavOn=%s, write 0xe=0x%x\n", (bDacOn?"ON":"OFF"), (bInterruptOn?"ON":"OFF"), (bNavOn?"ON":"OFF"), (H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]))); pBtCoexist->fBtcFillH2c(pBtCoexist, 0xe, 3, H2C_Parameter); @@ -307,7 +298,7 @@ halbtc8188c2ant_DiminishWifi( IN BOOLEAN bNavOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set Diminish Wifi, bDacOn=%s, bInterruptOn=%s, fwDacSwingLvl=%d, bNavOn=%s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set Diminish Wifi, bDacOn=%s, bInterruptOn=%s, fwDacSwingLvl=%d, bNavOn=%s\n", (bForceExec? "force to":""), (bDacOn? "ON":"OFF"), (bInterruptOn? "ON":"OFF"), fwDacSwingLvl, (bNavOn? "ON":"OFF"))); pCoexDm->bCurDacOn = bDacOn; @@ -317,16 +308,6 @@ halbtc8188c2ant_DiminishWifi( if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDacOn=%d, bCurDacOn=%d!!\n", - pCoexDm->bPreDacOn, pCoexDm->bCurDacOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreInterruptOn=%d, bCurInterruptOn=%d!!\n", - pCoexDm->bPreInterruptOn, pCoexDm->bCurInterruptOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d!!\n", - pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreNavOn=%d, bCurNavOn=%d!!\n", - pCoexDm->bPreNavOn, pCoexDm->bCurNavOn)); - - if( (pCoexDm->bPreDacOn==pCoexDm->bCurDacOn) && (pCoexDm->bPreInterruptOn==pCoexDm->bCurInterruptOn) && (pCoexDm->preFwDacSwingLvl==pCoexDm->curFwDacSwingLvl) && @@ -350,7 +331,7 @@ halbtc8188c2ant_SetSwRfRxLpfCorner( if(bRxRfShrinkOn) { //Shrink RF Rx LPF corner - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xf0, 0xf); } else @@ -359,7 +340,7 @@ halbtc8188c2ant_SetSwRfRxLpfCorner( // After initialized, we can use pCoexDm->btRf0x1eBackup if(pBtCoexist->bInitilized) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xf0, pCoexDm->btRf0x1eBackup); } } @@ -372,15 +353,12 @@ halbtc8188c2ant_RfShrink( IN BOOLEAN bRxRfShrinkOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Rx RF Shrink = %s\n", (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF"))); pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", - pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); - if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) return; } @@ -400,12 +378,12 @@ halbtc8188c2ant_SetSwPenaltyTxRateAdaptive( tmpU1 = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd); if(bLowPenaltyRa) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); tmpU1 &= ~BIT2; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set normal!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set normal!!\n")); tmpU1 |= BIT2; } pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, tmpU1); @@ -418,15 +396,12 @@ halbtc8188c2ant_LowPenaltyRa( IN BOOLEAN bLowPenaltyRa ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -470,17 +445,13 @@ halbtc8188c2ant_DacSwing( IN u4Byte dacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl)); pCoexDm->bCurDacSwingOn = bDacSwingOn; pCoexDm->curDacSwingLvl = dacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", - pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl, - pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl)); - if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) && (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) ) return; @@ -500,12 +471,12 @@ halbtc8188c2ant_SetAdcBackOff( { if(bAdcBackOff) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level On!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a07611); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level Off!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a05611); } } @@ -517,15 +488,12 @@ halbtc8188c2ant_AdcBackOff( IN BOOLEAN bAdcBackOff ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn AdcBackOff = %s\n", (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF"))); pCoexDm->bCurAdcBackOff = bAdcBackOff; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", - pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff)); - if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) return; } @@ -544,7 +512,7 @@ halbtc8188c2ant_SetAgcTable( if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4e1c0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4d1d0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4c1e0001); @@ -559,7 +527,7 @@ halbtc8188c2ant_SetAgcTable( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x641c0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x631d0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x621e0001); @@ -585,15 +553,12 @@ halbtc8188c2ant_AgcTable( IN BOOLEAN bAgcTableEn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s %s Agc Table\n", (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable"))); pCoexDm->bCurAgcTableEn = bAgcTableEn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", - pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn)); - if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) return; } @@ -610,13 +575,13 @@ halbtc8188c2ant_SetCoexTable( IN u4Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -629,19 +594,14 @@ halbtc8188c2ant_CoexTable( IN u4Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s write Coex Table 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c4, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c4 = val0x6c4; pCoexDm->curVal0x6c8 = val0x6c8; pCoexDm->curVal0x6cc = val0x6cc; if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - + { if( (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) ) @@ -691,7 +651,7 @@ halbtc8188c2ant_MonitorBtState( BOOLEAN bRejApAggPkt=FALSE; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], FirmwareVersion = 0x%x(%d)\n", fwVer, fwVer)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FirmwareVersion = 0x%x(%d)\n", fwVer, fwVer)); if(fwVer < 62) { regBTActive = 0x488; @@ -710,15 +670,15 @@ halbtc8188c2ant_MonitorBtState( btBusyThresh = 60; BT_Active = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTActive); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT_Active(0x%x)=0x%x\n", regBTActive, BT_Active)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT_Active(0x%x)=0x%x\n", regBTActive, BT_Active)); BT_Active = BT_Active & 0x00ffffff; BT_State = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTState); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT_State(0x%x)=0x%x\n", regBTState, BT_State)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT_State(0x%x)=0x%x\n", regBTState, BT_State)); BT_State = BT_State & 0x00ffffff; BT_Polling = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTPolling); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT_Polling(0x%x)=0x%x\n", regBTPolling, BT_Polling)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT_Polling(0x%x)=0x%x\n", regBTPolling, BT_Polling)); if(BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff ) return; @@ -733,8 +693,8 @@ halbtc8188c2ant_MonitorBtState( Ratio_Act = BT_Active*1000/BT_Polling; Ratio_STA = BT_State*1000/BT_Polling; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Ratio_Act=%d\n", Ratio_Act)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Ratio_STA=%d\n", Ratio_STA)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ratio_Act=%d\n", Ratio_Act)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ratio_STA=%d\n", Ratio_STA)); if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType) { @@ -1738,7 +1698,7 @@ EXhalbtc8188c2ant_InitHwConfig( { u1Byte u1Tmp=0; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Init HW Config!!\n")); // backup rf 0x1e value pCoexDm->btRf0x1eBackup = @@ -1759,7 +1719,7 @@ EXhalbtc8188c2ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); halbtc8188c2ant_InitCoexDm(pBtCoexist); } @@ -1791,7 +1751,7 @@ EXhalbtc8188c2ant_DisplayCoexInfo( CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \ ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion); CL_PRINTF(cliBuf); - + // wifi status CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); CL_PRINTF(cliBuf); @@ -1857,12 +1817,12 @@ EXhalbtc8188c2ant_IpsNotify( { if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); halbtc8188c2ant_CoexAllOff(pBtCoexist); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); //halbtc8188c2ant_InitCoexDm(pBtCoexist); } } @@ -1875,12 +1835,12 @@ EXhalbtc8188c2ant_LpsNotify( { if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); halbtc8188c2ant_CoexAllOff(pBtCoexist); } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); halbtc8188c2ant_InitCoexDm(pBtCoexist); } } @@ -1893,11 +1853,11 @@ EXhalbtc8188c2ant_ScanNotify( { if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); } } @@ -1909,11 +1869,11 @@ EXhalbtc8188c2ant_ConnectNotify( { if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); } } @@ -1925,11 +1885,11 @@ EXhalbtc8188c2ant_MediaStatusNotify( { if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); } } @@ -1942,7 +1902,7 @@ EXhalbtc8188c2ant_SpecialPacketNotify( { if(type == BTC_PACKET_DHCP) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); } } @@ -1960,7 +1920,7 @@ EXhalbtc8188c2ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); EXhalbtc8188c2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); } @@ -1972,7 +1932,7 @@ EXhalbtc8188c2ant_Periodical( { u1Byte algorithm; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], 2Ant Periodical!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Periodical!!\n")); // NOTE: // sw mechanism must be done after fw mechanism @@ -1989,31 +1949,31 @@ EXhalbtc8188c2ant_Periodical( switch(pCoexDm->curAlgorithm) { case BT_8188C_2ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO\n")); halbtc8188c2ant_ActionSco(pBtCoexist); break; case BT_8188C_2ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID\n")); halbtc8188c2ant_ActionHid(pBtCoexist); break; case BT_8188C_2ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP\n")); halbtc8188c2ant_ActionA2dp(pBtCoexist); break; case BT_8188C_2ANT_COEX_ALGO_PAN: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN\n")); halbtc8188c2ant_ActionPan(pBtCoexist); break; case BT_8188C_2ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n")); halbtc8188c2ant_ActionHidA2dp(pBtCoexist); break; case BT_8188C_2ANT_COEX_ALGO_HID_PAN: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+HID\n")); halbtc8188c2ant_ActionHidPan(pBtCoexist); break; case BT_8188C_2ANT_COEX_ALGO_PAN_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n")); halbtc8188c2ant_ActionPanA2dp(pBtCoexist); break; default: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c index cb60379c9a86..239c073c1b8b 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c @@ -11,6 +11,11 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8192d2Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -45,12 +50,10 @@ halbtc8192d2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192D_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -58,12 +61,10 @@ halbtc8192d2ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -71,7 +72,7 @@ halbtc8192d2ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -81,12 +82,10 @@ halbtc8192d2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192D_2ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -95,17 +94,14 @@ halbtc8192d2ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192D_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -113,12 +109,10 @@ halbtc8192d2ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -142,7 +136,7 @@ halbtc8192d2ant_ActionAlgorithm( if(!pStackInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No profile exists!!!\n")); return algorithm; } @@ -157,7 +151,7 @@ halbtc8192d2ant_ActionAlgorithm( if(pStackInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO algorithm\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO algorithm\n")); algorithm = BT_8192D_2ANT_COEX_ALGO_SCO; } else @@ -166,17 +160,17 @@ halbtc8192d2ant_ActionAlgorithm( { if(pStackInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID only\n")); algorithm = BT_8192D_2ANT_COEX_ALGO_HID; } else if(pStackInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP only\n")); algorithm = BT_8192D_2ANT_COEX_ALGO_A2DP; } else if(pStackInfo->bPanExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN only\n")); algorithm = BT_8192D_2ANT_COEX_ALGO_PAN; } } @@ -185,19 +179,19 @@ halbtc8192d2ant_ActionAlgorithm( if( pStackInfo->bHidExist && pStackInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP\n")); algorithm = BT_8192D_2ANT_COEX_ALGO_HID_A2DP; } else if( pStackInfo->bHidExist && pStackInfo->bPanExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN\n")); algorithm = BT_8192D_2ANT_COEX_ALGO_HID_PAN; } else if( pStackInfo->bPanExist && pStackInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN + A2DP\n")); algorithm = BT_8192D_2ANT_COEX_ALGO_PAN_A2DP; } } @@ -228,7 +222,7 @@ halbtc8192d2ant_SetFwBalance( H2C_Parameter[0] = 0; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Balance=[%s:%dms:%dms], write 0xc=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Balance=[%s:%dms:%dms], write 0xc=0x%x\n", bBalanceOn?"ON":"OFF", ms0, ms1, H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); @@ -244,15 +238,12 @@ halbtc8192d2ant_Balance( IN u1Byte ms1 ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Balance %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Balance %s\n", (bForceExec? "force to":""), (bBalanceOn? "ON":"OFF"))); pCoexDm->bCurBalanceOn = bBalanceOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBalanceOn = %d, bCurBalanceOn = %d!!\n", - pCoexDm->bPreBalanceOn, pCoexDm->bCurBalanceOn)); - if(pCoexDm->bPreBalanceOn == pCoexDm->bCurBalanceOn) return; } @@ -274,7 +265,7 @@ halbtc8192d2ant_SetFwDiminishWifi( if((pBtCoexist->stackInfo.minBtRssi <= -5) && (fwDacSwingLvl == 0x20)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], DiminishWiFi 0x20 original, but set 0x18 for Low RSSI!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], DiminishWiFi 0x20 original, but set 0x18 for Low RSSI!\n")); fwDacSwingLvl = 0x18; } @@ -294,7 +285,7 @@ halbtc8192d2ant_SetFwDiminishWifi( H2C_Parameter[2] |= 0x08; //BIT3 } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], bDacOn=%s, bInterruptOn=%s, bNavOn=%s, write 0x12=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bDacOn=%s, bInterruptOn=%s, bNavOn=%s, write 0x12=0x%x\n", (bDacOn?"ON":"OFF"), (bInterruptOn?"ON":"OFF"), (bNavOn?"ON":"OFF"), (H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]))); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x12, 3, H2C_Parameter); @@ -311,7 +302,7 @@ halbtc8192d2ant_DiminishWifi( IN BOOLEAN bNavOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set Diminish Wifi, bDacOn=%s, bInterruptOn=%s, fwDacSwingLvl=%d, bNavOn=%s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set Diminish Wifi, bDacOn=%s, bInterruptOn=%s, fwDacSwingLvl=%d, bNavOn=%s\n", (bForceExec? "force to":""), (bDacOn? "ON":"OFF"), (bInterruptOn? "ON":"OFF"), fwDacSwingLvl, (bNavOn? "ON":"OFF"))); pCoexDm->bCurDacOn = bDacOn; @@ -321,16 +312,6 @@ halbtc8192d2ant_DiminishWifi( if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDacOn=%d, bCurDacOn=%d!!\n", - pCoexDm->bPreDacOn, pCoexDm->bCurDacOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreInterruptOn=%d, bCurInterruptOn=%d!!\n", - pCoexDm->bPreInterruptOn, pCoexDm->bCurInterruptOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d!!\n", - pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreNavOn=%d, bCurNavOn=%d!!\n", - pCoexDm->bPreNavOn, pCoexDm->bCurNavOn)); - - if( (pCoexDm->bPreDacOn==pCoexDm->bCurDacOn) && (pCoexDm->bPreInterruptOn==pCoexDm->bCurInterruptOn) && (pCoexDm->preFwDacSwingLvl==pCoexDm->curFwDacSwingLvl) && @@ -354,7 +335,7 @@ halbtc8192d2ant_SetSwRfRxLpfCorner( if(bRxRfShrinkOn) { //Shrink RF Rx LPF corner - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xf2ff7); } else @@ -363,7 +344,7 @@ halbtc8192d2ant_SetSwRfRxLpfCorner( // After initialized, we can use pCoexDm->btRf0x1eBackup if(pBtCoexist->bInitilized) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup); } } @@ -377,15 +358,12 @@ halbtc8192d2ant_RfShrink( IN BOOLEAN bRxRfShrinkOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Rx RF Shrink = %s\n", (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF"))); pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", - pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); - if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) return; } @@ -405,12 +383,12 @@ halbtc8192d2ant_SetSwPenaltyTxRateAdaptive( tmpU1 = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd); if(bLowPenaltyRa) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); tmpU1 &= ~BIT2; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set normal!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set normal!!\n")); tmpU1 |= BIT2; } pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, tmpU1); @@ -423,15 +401,12 @@ halbtc8192d2ant_LowPenaltyRa( IN BOOLEAN bLowPenaltyRa ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -475,17 +450,13 @@ halbtc8192d2ant_DacSwing( IN u4Byte dacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl)); pCoexDm->bCurDacSwingOn = bDacSwingOn; pCoexDm->curDacSwingLvl = dacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", - pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl, - pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl)); - if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) && (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) ) return; @@ -505,12 +476,12 @@ halbtc8192d2ant_SetAdcBackOff( { if(bAdcBackOff) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level On!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a07611); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level Off!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a05611); } } @@ -522,15 +493,12 @@ halbtc8192d2ant_AdcBackOff( IN BOOLEAN bAdcBackOff ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn AdcBackOff = %s\n", (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF"))); pCoexDm->bCurAdcBackOff = bAdcBackOff; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", - pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff)); - if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) return; } @@ -549,7 +517,7 @@ halbtc8192d2ant_SetAgcTable( if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1a, 0xfffff, 0xa99); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xd4000); @@ -602,7 +570,7 @@ halbtc8192d2ant_SetAgcTable( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1a, 0xfffff, 0x30a99); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xdc000); @@ -665,15 +633,12 @@ halbtc8192d2ant_AgcTable( IN BOOLEAN bAgcTableEn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s %s Agc Table\n", (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable"))); pCoexDm->bCurAgcTableEn = bAgcTableEn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", - pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn)); - if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) return; } @@ -690,13 +655,13 @@ halbtc8192d2ant_SetCoexTable( IN u4Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -709,19 +674,14 @@ halbtc8192d2ant_CoexTable( IN u4Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s write Coex Table 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c4, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c4 = val0x6c4; pCoexDm->curVal0x6c8 = val0x6c8; pCoexDm->curVal0x6cc = val0x6cc; if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - + { if( (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) ) @@ -772,23 +732,23 @@ halbtc8192d2ant_MonitorBtEnableDisable( btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); @@ -815,7 +775,7 @@ halbtc8192d2ant_MonitorBtState( pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], FirmwareVersion = 0x%x(%d)\n", fwVer, fwVer)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FirmwareVersion = 0x%x(%d)\n", fwVer, fwVer)); regBTActive = 0x444; regBTState = 0x448; @@ -824,15 +784,15 @@ halbtc8192d2ant_MonitorBtState( btBusyThresh = 40; BT_Active = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTActive); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT_Active(0x%x)=0x%x\n", regBTActive, BT_Active)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT_Active(0x%x)=0x%x\n", regBTActive, BT_Active)); BT_Active = BT_Active & 0x00ffffff; BT_State = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTState); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT_State(0x%x)=0x%x\n", regBTState, BT_State)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT_State(0x%x)=0x%x\n", regBTState, BT_State)); BT_State = BT_State & 0x00ffffff; BT_Polling = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTPolling); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT_Polling(0x%x)=0x%x\n", regBTPolling, BT_Polling)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT_Polling(0x%x)=0x%x\n", regBTPolling, BT_Polling)); if(BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff ) return; @@ -849,8 +809,8 @@ halbtc8192d2ant_MonitorBtState( Ratio_Act = BT_Active*1000/BT_Polling; Ratio_STA = BT_State*1000/BT_Polling; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Ratio_Act=%d\n", Ratio_Act)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Ratio_STA=%d\n", Ratio_STA)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ratio_Act=%d\n", Ratio_Act)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ratio_STA=%d\n", Ratio_STA)); if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType) { @@ -1695,13 +1655,13 @@ halbtc8192d2ant_IsBtCoexistEnter( if(BTC_SMSP != macPhyMode) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Only support single mac single phy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Only support single mac single phy!!\n")); bRet = FALSE; } if(bWifiUnder5G) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under 5G or A band\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under 5G or A band\n")); halbtc8192d2ant_CoexAllOff(pBtCoexist); bRet = FALSE; } @@ -1727,7 +1687,7 @@ EXhalbtc8192d2ant_InitHwConfig( { u1Byte u1Tmp=0; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Init HW Config!!\n")); // backup rf 0x1e value pCoexDm->btRf0x1eBackup = @@ -1765,7 +1725,7 @@ EXhalbtc8192d2ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); halbtc8192d2ant_InitCoexDm(pBtCoexist); } @@ -1863,12 +1823,12 @@ EXhalbtc8192d2ant_IpsNotify( { if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); halbtc8192d2ant_CoexAllOff(pBtCoexist); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); //halbtc8192d2ant_InitCoexDm(pBtCoexist); } } @@ -1881,12 +1841,12 @@ EXhalbtc8192d2ant_LpsNotify( { if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); halbtc8192d2ant_CoexAllOff(pBtCoexist); } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); halbtc8192d2ant_InitCoexDm(pBtCoexist); } } @@ -1899,11 +1859,11 @@ EXhalbtc8192d2ant_ScanNotify( { if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); } } @@ -1915,11 +1875,11 @@ EXhalbtc8192d2ant_ConnectNotify( { if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); } } @@ -1931,11 +1891,11 @@ EXhalbtc8192d2ant_MediaStatusNotify( { if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); } } @@ -1947,7 +1907,7 @@ EXhalbtc8192d2ant_SpecialPacketNotify( { if(type == BTC_PACKET_DHCP) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); } } @@ -1965,7 +1925,7 @@ EXhalbtc8192d2ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); EXhalbtc8192d2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); } @@ -1977,7 +1937,7 @@ EXhalbtc8192d2ant_Periodical( { u1Byte algorithm; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], 2Ant Periodical!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Periodical!!\n")); // NOTE: // sw mechanism must be done after fw mechanism @@ -1995,31 +1955,31 @@ EXhalbtc8192d2ant_Periodical( switch(pCoexDm->curAlgorithm) { case BT_8192D_2ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO\n")); halbtc8192d2ant_ActionSco(pBtCoexist); break; case BT_8192D_2ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID\n")); halbtc8192d2ant_ActionHid(pBtCoexist); break; case BT_8192D_2ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP\n")); halbtc8192d2ant_ActionA2dp(pBtCoexist); break; case BT_8192D_2ANT_COEX_ALGO_PAN: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN\n")); halbtc8192d2ant_ActionPan(pBtCoexist); break; case BT_8192D_2ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n")); halbtc8192d2ant_ActionHidA2dp(pBtCoexist); break; case BT_8192D_2ANT_COEX_ALGO_HID_PAN: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+HID\n")); halbtc8192d2ant_ActionHidPan(pBtCoexist); break; case BT_8192D_2ANT_COEX_ALGO_PAN_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n")); halbtc8192d2ant_ActionPanA2dp(pBtCoexist); break; default: diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c index 12dfe4b210eb..86e006dba32b 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c @@ -1,7 +1,7 @@ //============================================================ // Description: // -// This file is for 8192e1ant Co-exist mechanism +// This file is for RTL8192E Co-exist mechanism // // History // 2012/11/15 Cosa first check in. @@ -12,6 +12,11 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8192e1Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -27,8 +32,8 @@ const char *const GLBtInfoSrc8192e1Ant[]={ "BT Info[bt auto report]", }; -u4Byte GLCoexVerDate8192e1Ant=20130729; -u4Byte GLCoexVer8192e1Ant=0x10; +u4Byte GLCoexVerDate8192e1Ant=20140527; +u4Byte GLCoexVer8192e1Ant=0x4f; //============================================================ // local function proto type if needed @@ -56,12 +61,10 @@ halbtc8192e1ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else @@ -69,12 +72,10 @@ halbtc8192e1ant_BtRssiState( if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -82,7 +83,7 @@ halbtc8192e1ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } @@ -92,12 +93,10 @@ halbtc8192e1ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || @@ -106,17 +105,14 @@ halbtc8192e1ant_BtRssiState( if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else @@ -124,12 +120,10 @@ halbtc8192e1ant_BtRssiState( if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -161,12 +155,10 @@ halbtc8192e1ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -174,12 +166,10 @@ halbtc8192e1ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -187,7 +177,7 @@ halbtc8192e1ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -197,12 +187,10 @@ halbtc8192e1ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -211,17 +199,14 @@ halbtc8192e1ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -229,12 +214,10 @@ halbtc8192e1ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -248,18 +231,10 @@ VOID halbtc8192e1ant_UpdateRaMask( IN PBTC_COEXIST pBtCoexist, IN BOOLEAN bForceExec, - IN u1Byte type, - IN u4Byte rateMask + IN u4Byte disRateMask ) { - if(BTC_RATE_DISABLE == type) - { - pCoexDm->curRaMask |= rateMask; // disable rate - } - else if(BTC_RATE_ENABLE == type) - { - pCoexDm->curRaMask &= ~rateMask; // enable rate - } + pCoexDm->curRaMask = disRateMask; if( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask)) { @@ -268,15 +243,197 @@ halbtc8192e1ant_UpdateRaMask( pCoexDm->preRaMask = pCoexDm->curRaMask; } +VOID +halbtc8192e1ant_AutoRateFallbackRetry( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte type + ) +{ + BOOLEAN bWifiUnderBMode=FALSE; + + pCoexDm->curArfrType = type; + + if( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType)) + { + switch(pCoexDm->curArfrType) + { + case 0: // normal mode + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2); + break; + case 1: + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode); + if(bWifiUnderBMode) + { + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101); + } + else + { + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201); + } + break; + default: + break; + } + } + + pCoexDm->preArfrType = pCoexDm->curArfrType; +} + +VOID +halbtc8192e1ant_RetryLimit( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte type + ) +{ + pCoexDm->curRetryLimitType = type; + + if( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType)) + { + switch(pCoexDm->curRetryLimitType) + { + case 0: // normal mode + pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit); + break; + case 1: // retry limit=8 + pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808); + break; + default: + break; + } + } + + pCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType; +} + +VOID +halbtc8192e1ant_AmpduMaxTime( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte type + ) +{ + pCoexDm->curAmpduTimeType = type; + + if( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType)) + { + switch(pCoexDm->curAmpduTimeType) + { + case 0: // normal mode + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime); + break; + case 1: // AMPDU timw = 0x38 * 32us + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38); + break; + default: + break; + } + } + + pCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType; +} + +VOID +halbtc8192e1ant_LimitedTx( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte raMaskType, + IN u1Byte arfrType, + IN u1Byte retryLimitType, + IN u1Byte ampduTimeType + ) +{ + switch(raMaskType) + { + case 0: // normal mode + halbtc8192e1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0); + break; + case 1: // disable cck 1/2 + halbtc8192e1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x00000003); + break; + case 2: // disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 + halbtc8192e1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7); + break; + default: + break; + } + + halbtc8192e1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType); + halbtc8192e1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType); + halbtc8192e1ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType); +} + +VOID +halbtc8192e1ant_LimitedRx( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN BOOLEAN bRejApAggPkt, + IN BOOLEAN bBtCtrlAggBufSize, + IN u1Byte aggBufSize + ) +{ + BOOLEAN bRejectRxAgg=bRejApAggPkt; + BOOLEAN bBtCtrlRxAggSize=bBtCtrlAggBufSize; + u1Byte rxAggSize=aggBufSize; + + //============================================ + // Rx Aggregation related setting + //============================================ + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg); + // decide BT control aggregation buf size or not + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize); + // aggregation buf size, only work when BT control Rx aggregation size. + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize); + // real update aggregation setting + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); + + +} + +VOID +halbtc8192e1ant_QueryBtInfo( + IN PBTC_COEXIST pBtCoexist + ) +{ + u1Byte H2C_Parameter[1] ={0}; + + pCoexSta->bC2hBtInfoReqSent = TRUE; + + H2C_Parameter[0] |= BIT0; // trigger + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", + H2C_Parameter[0])); + + pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter); +} + VOID halbtc8192e1ant_MonitorBtCtr( IN PBTC_COEXIST pBtCoexist ) { - u4Byte regHPTxRx, regLPTxRx, u4Tmp; + u4Byte regHPTxRx, regLPTxRx, u4Tmp, u4Tmp1; u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0; - u1Byte u1Tmp; - + u1Byte u1Tmp, u1Tmp1; + s4Byte wifiRssi; + static u1Byte NumOfBtCounterChk = 0; + + //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS + //if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) + + if (pCoexSta->bUnderIps) + { + pCoexSta->highPriorityTx = 65535; + pCoexSta->highPriorityRx = 65535; + pCoexSta->lowPriorityTx = 65535; + pCoexSta->lowPriorityRx = 65535; + return; + } + regHPTxRx = 0x770; regLPTxRx = 0x774; @@ -293,30 +450,122 @@ halbtc8192e1ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", - regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", - regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx)); + if( (pCoexSta->lowPriorityTx >= 1050) && (!pCoexSta->bC2hBtInquiryPage)) + pCoexSta->popEventCnt++; + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n", + regHPRx, regHPTx, regLPRx, regLPTx)); // reset counter pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); + + if ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0)) + { + NumOfBtCounterChk++; + if (NumOfBtCounterChk >= 3) + { + halbtc8192e1ant_QueryBtInfo(pBtCoexist); + NumOfBtCounterChk = 0; + } + } } + VOID -halbtc8192e1ant_QueryBtInfo( +halbtc8192e1ant_MonitorWiFiCtr( IN PBTC_COEXIST pBtCoexist ) { - u1Byte H2C_Parameter[1] ={0}; + u4Byte u4Tmp; + u2Byte u2Tmp[3]; + s4Byte wifiRssi=0; + BOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE; + static u1Byte nCCKLockCounter = 0; - pCoexSta->bC2hBtInfoReqSent = TRUE; + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode); - H2C_Parameter[0] |= BIT0; // trigger + if (pCoexSta->bUnderIps) + { + pCoexSta->nCRCOK_CCK = 0; + pCoexSta->nCRCOK_11g = 0; + pCoexSta->nCRCOK_11n = 0; + pCoexSta->nCRCOK_11nAgg = 0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", - H2C_Parameter[0])); + pCoexSta->nCRCErr_CCK = 0; + pCoexSta->nCRCErr_11g = 0; + pCoexSta->nCRCErr_11n = 0; + pCoexSta->nCRCErr_11nAgg = 0; + } + else + { + pCoexSta->nCRCOK_CCK = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88); + pCoexSta->nCRCOK_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94); + pCoexSta->nCRCOK_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90); + pCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8); + + pCoexSta->nCRCErr_CCK = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84); + pCoexSta->nCRCErr_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96); + pCoexSta->nCRCErr_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92); + pCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba); + } + + + //reset counter + pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1); + pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0); + + if ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode)) + { + if ( (pCoexDm->btStatus == BT_8192E_1ANT_BT_STATUS_ACL_BUSY) || + (pCoexDm->btStatus == BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY) || + (pCoexDm->btStatus == BT_8192E_1ANT_BT_STATUS_SCO_BUSY) ) + { + if (pCoexSta->nCRCOK_CCK >(pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + + pCoexSta->nCRCOK_11nAgg) ) + { + if (nCCKLockCounter < 5) + nCCKLockCounter++; + } + else + { + if (nCCKLockCounter > 0) + nCCKLockCounter--; + } + + } + else + { + if (nCCKLockCounter > 0) + nCCKLockCounter--; + } + } + else + { + if (nCCKLockCounter > 0) + nCCKLockCounter--; + } + + if (!pCoexSta->bPreCCKLock) + { + + if (nCCKLockCounter >= 5) + pCoexSta->bCCKLock = TRUE; + else + pCoexSta->bCCKLock = FALSE; + } + else + { + if (nCCKLockCounter == 0) + pCoexSta->bCCKLock = FALSE; + else + pCoexSta->bCCKLock = TRUE; + } + + pCoexSta->bPreCCKLock = pCoexSta->bCCKLock; + - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter); } BOOLEAN @@ -325,8 +574,8 @@ halbtc8192e1ant_IsWifiStatusChanged( ) { static BOOLEAN bPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE; - BOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE; - BOOLEAN bWifiConnected=FALSE; + BOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE; + BOOLEAN bWifiConnected=FALSE; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); @@ -361,6 +610,9 @@ halbtc8192e1ant_UpdateBtLinkInfo( ) { PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bBtHsOn=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); pBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist; pBtLinkInfo->bScoExist = pCoexSta->bScoExist; @@ -368,6 +620,13 @@ halbtc8192e1ant_UpdateBtLinkInfo( pBtLinkInfo->bPanExist = pCoexSta->bPanExist; pBtLinkInfo->bHidExist = pCoexSta->bHidExist; + // work around for HS mode. + if(bBtHsOn) + { + pBtLinkInfo->bPanExist = TRUE; + pBtLinkInfo->bBtLinkExist = TRUE; + } + // check if Sco only if( pBtLinkInfo->bScoExist && !pBtLinkInfo->bA2dpExist && @@ -416,10 +675,10 @@ halbtc8192e1ant_ActionAlgorithm( u1Byte numOfDiffProfile=0; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - + if(!pBtLinkInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No BT link exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); return algorithm; } @@ -436,31 +695,31 @@ halbtc8192e1ant_ActionAlgorithm( { if(pBtLinkInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO only\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; } else { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID only\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP only\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_A2DP; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(HS) only\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(EDR) only\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR; } } @@ -472,24 +731,24 @@ halbtc8192e1ant_ActionAlgorithm( { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP ==> SCO\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(HS)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(EDR)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -499,7 +758,7 @@ halbtc8192e1ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP; } else if( pBtLinkInfo->bHidExist && @@ -507,12 +766,12 @@ halbtc8192e1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(HS)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(EDR)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -521,12 +780,12 @@ halbtc8192e1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(HS)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(EDR)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -539,7 +798,7 @@ halbtc8192e1ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_HID; } else if( pBtLinkInfo->bHidExist && @@ -547,12 +806,12 @@ halbtc8192e1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(HS)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -561,12 +820,12 @@ halbtc8192e1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -579,12 +838,12 @@ halbtc8192e1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -600,12 +859,12 @@ halbtc8192e1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -615,64 +874,6 @@ halbtc8192e1ant_ActionAlgorithm( return algorithm; } -VOID -halbtc8192e1ant_SetFwDacSwingLevel( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte dacSwingLvl - ) -{ - u1Byte H2C_Parameter[1] ={0}; - - // There are several type of dacswing - // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 - H2C_Parameter[0] = dacSwingLvl; - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); - - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter); -} - -VOID -halbtc8192e1ant_SetFwDecBtPwr( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte decBtPwrLvl - ) -{ - u1Byte H2C_Parameter[1] ={0}; - - H2C_Parameter[0] = decBtPwrLvl; - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\n", - decBtPwrLvl, H2C_Parameter[0])); - - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter); -} - -VOID -halbtc8192e1ant_DecBtPwr( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte decBtPwrLvl - ) -{ - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power level = %d\n", - (bForceExec? "force to":""), decBtPwrLvl)); - pCoexDm->curBtDecPwrLvl = decBtPwrLvl; - - if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], BtDecPwrLvl=%d, curBtDecPwrLvl=%d\n", - pCoexDm->preBtDecPwrLvl, pCoexDm->curBtDecPwrLvl)); - - if(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) - return; - } - halbtc8192e1ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl); - - pCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl; -} - VOID halbtc8192e1ant_SetBtAutoReport( IN PBTC_COEXIST pBtCoexist, @@ -688,7 +889,7 @@ halbtc8192e1ant_SetBtAutoReport( H2C_Parameter[0] |= BIT0; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter); @@ -701,15 +902,12 @@ halbtc8192e1ant_BtAutoReport( IN BOOLEAN bEnableAutoReport ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); pCoexDm->bCurBtAutoReport = bEnableAutoReport; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", - pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport)); - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) return; } @@ -718,53 +916,29 @@ halbtc8192e1ant_BtAutoReport( pCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport; } -VOID -halbtc8192e1ant_FwDacSwingLvl( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte fwDacSwingLvl - ) -{ - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n", - (bForceExec? "force to":""), fwDacSwingLvl)); - pCoexDm->curFwDacSwingLvl = fwDacSwingLvl; - - if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", - pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); - - if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) - return; - } - - halbtc8192e1ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl); - - pCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl; -} - VOID halbtc8192e1ant_SetSwPenaltyTxRateAdaptive( IN PBTC_COEXIST pBtCoexist, IN BOOLEAN bLowPenaltyRa ) { - u1Byte tmpU1; + u1Byte H2C_Parameter[6] ={0}; + + H2C_Parameter[0] = 0x6; // opCode, 0x6= Retry_Penalty - tmpU1 = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd); - tmpU1 |= BIT0; if(bLowPenaltyRa) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); - tmpU1 &= ~BIT2; - } - else - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set normal!!\n")); - tmpU1 |= BIT2; + H2C_Parameter[1] |= BIT0; + H2C_Parameter[2] = 0x00; //normal rate except MCS7/6/5, OFDM54/48/36 + H2C_Parameter[3] = 0xf7; //MCS7 or OFDM54 + H2C_Parameter[4] = 0xf8; //MCS6 or OFDM48 + H2C_Parameter[5] = 0xf9; //MCS5 or OFDM36 } - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, tmpU1); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", + (bLowPenaltyRa? "ON!!":"OFF!!") )); + + pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); } VOID @@ -774,16 +948,10 @@ halbtc8192e1ant_LowPenaltyRa( IN BOOLEAN bLowPenaltyRa ) { - return; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", - (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -793,110 +961,46 @@ halbtc8192e1ant_LowPenaltyRa( } VOID -halbtc8192e1ant_SetDacSwingReg( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte level +halbtc8192e1ant_SetCoexTable( + IN PBTC_COEXIST pBtCoexist, + IN u4Byte val0x6c0, + IN u4Byte val0x6c4, + IN u4Byte val0x6c8, + IN u1Byte val0x6cc ) { - u1Byte val=(u1Byte)level; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x883, 0x3e, val); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } VOID -halbtc8192e1ant_SetSwFullTimeDacSwing( +halbtc8192e1ant_CoexTable( IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bSwDacSwingOn, - IN u4Byte swDacSwingLvl + IN BOOLEAN bForceExec, + IN u4Byte val0x6c0, + IN u4Byte val0x6c4, + IN u4Byte val0x6c8, + IN u1Byte val0x6cc ) { - if(bSwDacSwingOn) - { - halbtc8192e1ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl); - } - else - { - halbtc8192e1ant_SetDacSwingReg(pBtCoexist, 0x18); - } -} - -VOID -halbtc8192e1ant_DacSwing( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bDacSwingOn, - IN u4Byte dacSwingLvl - ) -{ - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", - (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl)); - pCoexDm->bCurDacSwingOn = bDacSwingOn; - pCoexDm->curDacSwingLvl = dacSwingLvl; - - if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", - pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl, - pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl)); - - if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) && - (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) ) - return; - } - delay_ms(30); - halbtc8192e1ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl); - - pCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn; - pCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl; -} - -VOID -halbtc8192e1ant_SetCoexTable( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte val0x6c0, - IN u4Byte val0x6c4, - IN u4Byte val0x6c8, - IN u1Byte val0x6cc - ) -{ - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); -} - -VOID -halbtc8192e1ant_CoexTable( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u4Byte val0x6c0, - IN u4Byte val0x6c4, - IN u4Byte val0x6c8, - IN u1Byte val0x6cc - ) -{ - 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", - (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6cc=0x%x\n", + (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c4 = val0x6c4; pCoexDm->curVal0x6c8 = val0x6c8; pCoexDm->curVal0x6cc = val0x6cc; if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - + { if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && @@ -918,6 +1022,10 @@ halbtc8192e1ant_CoexTableWithType( IN u1Byte type ) { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** CoexTable(%d) **********\n", type)); + + pCoexSta->nCoexTableType = type; + switch(type) { case 0: @@ -930,25 +1038,19 @@ halbtc8192e1ant_CoexTableWithType( halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3); break; case 3: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3); + halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); break; case 4: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffffff, 0x3); + halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3); break; case 5: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3); + halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaa5a5a5a, 0xffffff, 0x3); break; case 6: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3); + halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3); break; case 7: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0xddffddff, 0xddffddff, 0xffffff, 0x3); - break; - case 8: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5afa5afa, 0xffffff, 0x3); - break; - case 9: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x5f5f5f5f, 0x5f5f5f5f, 0xffffff, 0x3); + halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3); break; default: break; @@ -968,7 +1070,7 @@ halbtc8192e1ant_SetFwIgnoreWlanAct( H2C_Parameter[0] |= BIT0; // function enable } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter); @@ -981,15 +1083,12 @@ halbtc8192e1ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -998,37 +1097,6 @@ halbtc8192e1ant_IgnoreWlanAct( pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct; } -VOID -halbtc8192e1ant_SetFwPstdma( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte byte1, - IN u1Byte byte2, - IN u1Byte byte3, - IN u1Byte byte4, - IN u1Byte byte5 - ) -{ - u1Byte H2C_Parameter[5] ={0}; - - H2C_Parameter[0] = byte1; - H2C_Parameter[1] = byte2; - H2C_Parameter[2] = byte3; - H2C_Parameter[3] = byte4; - H2C_Parameter[4] = byte5; - - pCoexDm->psTdmaPara[0] = byte1; - pCoexDm->psTdmaPara[1] = byte2; - pCoexDm->psTdmaPara[2] = byte3; - pCoexDm->psTdmaPara[3] = byte4; - pCoexDm->psTdmaPara[4] = byte5; - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n", - H2C_Parameter[0], - H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); - - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter); -} - VOID halbtc8192e1ant_SetLpsRpwm( IN PBTC_COEXIST pBtCoexist, @@ -1053,16 +1121,13 @@ halbtc8192e1ant_LpsRpwm( { BOOLEAN bForceExecPwrCmd=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", (bForceExec? "force to":""), lpsVal, rpwmVal)); pCoexDm->curLps = lpsVal; pCoexDm->curRpwm = rpwmVal; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preLps/curLps=0x%x/0x%x, preRpwm/curRpwm=0x%x/0x%x!!\n", - pCoexDm->preLps, pCoexDm->curLps, pCoexDm->preRpwm, pCoexDm->curRpwm)); - if( (pCoexDm->preLps == pCoexDm->curLps) && (pCoexDm->preRpwm == pCoexDm->curRpwm) ) { @@ -1075,6 +1140,15 @@ halbtc8192e1ant_LpsRpwm( pCoexDm->preRpwm = pCoexDm->curRpwm; } +VOID +halbtc8192e1ant_SwMechanism( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bLowPenaltyRA + ) +{ + halbtc8192e1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA); +} + VOID halbtc8192e1ant_SetAntPath( IN PBTC_COEXIST pBtCoexist, @@ -1130,6 +1204,55 @@ halbtc8192e1ant_SetAntPath( } } +VOID +halbtc8192e1ant_SetFwPstdma( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte byte1, + IN u1Byte byte2, + IN u1Byte byte3, + IN u1Byte byte4, + IN u1Byte byte5 + ) +{ + u1Byte H2C_Parameter[5] ={0}; + u1Byte realByte1=byte1, realByte5=byte5; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + if(bApEnable) + { + if(byte1&BIT4 && !(byte1&BIT5)) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FW for 1Ant AP mode\n")); + realByte1 &= ~BIT4; + realByte1 |= BIT5; + + realByte5 |= BIT5; + realByte5 &= ~BIT6; + } + } + + H2C_Parameter[0] = realByte1; + H2C_Parameter[1] = byte2; + H2C_Parameter[2] = byte3; + H2C_Parameter[3] = byte4; + H2C_Parameter[4] = realByte5; + + pCoexDm->psTdmaPara[0] = realByte1; + pCoexDm->psTdmaPara[1] = byte2; + pCoexDm->psTdmaPara[2] = byte3; + pCoexDm->psTdmaPara[3] = byte4; + pCoexDm->psTdmaPara[4] = realByte5; + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", + H2C_Parameter[0], + H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); + + pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter); +} + + VOID halbtc8192e1ant_PsTdma( IN PBTC_COEXIST pBtCoexist, @@ -1138,52 +1261,80 @@ halbtc8192e1ant_PsTdma( IN u1Byte type ) { - BOOLEAN bTurnOnByCnt=FALSE; + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bTurnOnByCnt=FALSE, bWifiBusy=FALSE, bWiFiNoisy=FALSE; u1Byte psTdmaTypeByCnt=0, rssiAdjustVal=0; + u1Byte psTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val = 0x10; + s1Byte nWiFiDurationAdjust = 0x0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", - (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); pCoexDm->bCurPsTdmaOn = bTurnOn; pCoexDm->curPsTdma = type; + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + + if (pCoexDm->bCurPsTdmaOn) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(on, %d) **********\n", + pCoexDm->curPsTdma)); + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(off, %d) **********\n", + pCoexDm->curPsTdma)); + } + if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", - pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", - pCoexDm->prePsTdma, pCoexDm->curPsTdma)); - if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) return; } - if(bTurnOn) + + if (pCoexSta->nScanAPNum <= 5) + nWiFiDurationAdjust = 5; + else if (pCoexSta->nScanAPNum >= 40) + nWiFiDurationAdjust = -15; + else if (pCoexSta->nScanAPNum >= 20) + nWiFiDurationAdjust = -10; + + if (!pCoexSta->bForceLpsOn) //only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30 { + psTdmaByte0Val = 0x61; //no null-pkt + psTdmaByte3Val = 0x11; // no tx-pause at BT-slot + psTdmaByte4Val = 0x10; // 0x778 = d/1 toggle + } + + if ( (type == 3) || (type == 13) || (type == 14) ) + psTdmaByte4Val = psTdmaByte4Val & 0xbf; //no dynamic slot for multi-profile + + if (pBtLinkInfo->bSlaveRole == TRUE) + psTdmaByte4Val = psTdmaByte4Val | 0x1; //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) + + if(bTurnOn) + { switch(type) { default: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x53, 0x2c, 0x03, 0x10, 0x50); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val); break; case 1: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x53, 0x2c, 0x03, 0x10, 0x50); - rssiAdjustVal = 11; + halbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); break; case 2: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x53, 0x25, 0x03, 0x10, 0x50); - rssiAdjustVal = 14; + halbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); break; case 3: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x40); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val); break; case 4: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0); - rssiAdjustVal = 17; break; case 5: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x31, 0x0); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x11); break; case 6: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x0, 0x0); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11); break; case 7: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0); @@ -1192,61 +1343,55 @@ halbtc8192e1ant_PsTdma( halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); break; case 9: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1e, 0x03, 0x10, 0x50); - rssiAdjustVal = 18; + halbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); break; case 10: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40); break; case 11: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x53, 0x12, 0x03, 0x10, 0x50); - rssiAdjustVal = 20; + halbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val); break; case 12: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xeb, 0xa, 0x3, 0x31, 0x18); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50); + break; + case 13: + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val); + break; + case 14: + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, psTdmaByte4Val); break; - case 15: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0); break; case 16: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0); - rssiAdjustVal = 18; break; - case 18: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); - rssiAdjustVal = 14; break; - case 20: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0x25, 0x25, 0x0, 0x0); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10); break; case 21: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x20, 0x3, 0x10, 0x40); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11); break; case 22: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0x8, 0x8, 0x0, 0x40); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10); break; case 23: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18); - rssiAdjustVal = 22; break; case 24: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18); - rssiAdjustVal = 22; break; case 25: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - rssiAdjustVal = 22; break; case 26: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - rssiAdjustVal = 22; break; case 27: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98); - rssiAdjustVal = 22; break; case 28: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0); @@ -1255,133 +1400,72 @@ halbtc8192e1ant_PsTdma( halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10); break; case 30: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10); break; case 31: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58); break; case 32: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xab, 0xa, 0x3, 0x31, 0x90); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11); break; case 33: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90); break; case 34: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0x0, 0x10); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10); break; case 35: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x0, 0x10); + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10); break; case 36: halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50); break; - case 37: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x53, 0x25, 0x3, 0x10, 0x50); - break; - case 38: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); - break; + case 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving + /* here softap mode screen off will cost 70-80mA for phone */ + halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24); + break; } } else - { + { + // disable PS tdma switch(type) { - case 8: //0x778 = 1, ant2PTA + case 8: //PTA Control halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0); halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE); break; - case 0: //0x778 = 1, ant2BT - default: + case 0: + default: //Software control, Antenna at BT side halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); - delay_ms(5); halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE); break; - case 9: //0x778 = 1, ant2WIFI + case 9: //Software control, Antenna at WiFi side halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE); - break; - case 10: //0x778 = 3, ant2BT - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x8, 0x0); - delay_ms(5); - halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE); - break; + break; } } rssiAdjustVal =0; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal); + + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67))); + // update pre state pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn; pCoexDm->prePsTdma = pCoexDm->curPsTdma; } -VOID -halbtc8192e1ant_SetSwitchSsType( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte ssType - ) -{ - u1Byte mimoPs=BTC_MIMO_PS_DYNAMIC; - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], REAL set SS Type = %d\n", ssType)); - - if(ssType == 1) - { - halbtc8192e1ant_UpdateRaMask(pBtCoexist, FORCE_EXEC, BTC_RATE_DISABLE, 0xfff00000); // disable 2ss - halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); - // switch ofdm path - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xc04, 0x11); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xd04, 0x1); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x90c, 0x81111111); - // switch cck patch - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x1); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xa07, 0x81); - mimoPs=BTC_MIMO_PS_STATIC; - } - else if(ssType == 2) - { - halbtc8192e1ant_UpdateRaMask(pBtCoexist, FORCE_EXEC, BTC_RATE_ENABLE, 0xfff00000); // enable 2ss - halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xc04, 0x33); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xd04, 0x3); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x90c, 0x81121313); - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x0); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xa07, 0x41); - mimoPs=BTC_MIMO_PS_DYNAMIC; - } - - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_SEND_MIMO_PS, &mimoPs); // set rx 1ss or 2ss -} - -VOID -halbtc8192e1ant_SwitchSsType( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte newSsType - ) -{ - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], %s Switch SS Type = %d\n", - (bForceExec? "force to":""), newSsType)); - pCoexDm->curSsType = newSsType; - - if(!bForceExec) - { - if(pCoexDm->preSsType == pCoexDm->curSsType) - return; - } - halbtc8192e1ant_SetSwitchSsType(pBtCoexist, pCoexDm->curSsType); - - pCoexDm->preSsType = pCoexDm->curSsType; -} - VOID halbtc8192e1ant_CoexAllOff( IN PBTC_COEXIST pBtCoexist ) { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + // sw all off + halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); // hw all off halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); @@ -1400,39 +1484,59 @@ halbtc8192e1ant_IsCommonAction( if(!bWifiConnected && BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); + + //halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); + bCommon = TRUE; } else if(bWifiConnected && (BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + + //halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; } else if(!bWifiConnected && (BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); + + //halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; } else if(bWifiConnected && (BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + + //halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; } else if(!bWifiConnected && (BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); + + //halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; } else - { + { + if (bWifiBusy) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); + } + bCommon = FALSE; } @@ -1449,8 +1553,15 @@ halbtc8192e1ant_TdmaDurationAdjustForAcl( static s4Byte up,dn,m,n,WaitCount; s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0, btInfoExt; + static BOOLEAN bPreWifiBusy=FALSE; + BOOLEAN bWifiBusy = FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); + + if(BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifiStatus) + bWifiBusy = TRUE; + else + bWifiBusy = FALSE; if( (BT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) || (BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) || @@ -1477,7 +1588,7 @@ halbtc8192e1ant_TdmaDurationAdjustForAcl( if(!pCoexDm->bAutoTdmaAdjust) { pCoexDm->bAutoTdmaAdjust = TRUE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); pCoexDm->psTdmaDuAdjType = 2; @@ -1494,9 +1605,10 @@ halbtc8192e1ant_TdmaDurationAdjustForAcl( //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; btInfoExt = pCoexSta->btInfoExt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", - up, dn, m, n, WaitCount)); + + if ( (pCoexSta->lowPriorityTx) > 1050 || (pCoexSta->lowPriorityRx) > 1250 ) + retryCount++; + result = 0; WaitCount++; @@ -1515,7 +1627,7 @@ halbtc8192e1ant_TdmaDurationAdjustForAcl( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -1541,7 +1653,7 @@ halbtc8192e1ant_TdmaDurationAdjustForAcl( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -1559,7 +1671,7 @@ halbtc8192e1ant_TdmaDurationAdjustForAcl( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } if(result == -1) @@ -1610,6 +1722,19 @@ halbtc8192e1ant_TdmaDurationAdjustForAcl( pCoexDm->psTdmaDuAdjType = 1; } } + else //no change + { + /* Bryant Modify + if(bWifiBusy != bPreWifiBusy) //if busy / idle change + { + bPreWifiBusy = bWifiBusy; + halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, pCoexDm->curPsTdma); + } + */ + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n", + pCoexDm->curPsTdma)); + } if( pCoexDm->curPsTdma != 1 && pCoexDm->curPsTdma != 2 && @@ -1622,41 +1747,6 @@ halbtc8192e1ant_TdmaDurationAdjustForAcl( } } -u1Byte -halbtc8192e1ant_PsTdmaTypeByWifiRssi( - IN s4Byte wifiRssi, - IN s4Byte preWifiRssi, - IN u1Byte wifiRssiThresh - ) -{ - u1Byte psTdmaType=0; - - if(wifiRssi > preWifiRssi) - { - if(wifiRssi > (wifiRssiThresh+5)) - { - psTdmaType = 26; - } - else - { - psTdmaType = 25; - } - } - else - { - if(wifiRssi > wifiRssiThresh) - { - psTdmaType = 26; - } - else - { - psTdmaType = 25; - } - } - - return psTdmaType; -} - VOID halbtc8192e1ant_PsTdmaCheckForPowerSaveState( IN PBTC_COEXIST pBtCoexist, @@ -1702,7 +1792,7 @@ halbtc8192e1ant_PowerSaveState( ) { BOOLEAN bLowPwrDisable=FALSE; - + switch(psType) { case BTC_PS_WIFI_NATIVE: @@ -1710,26 +1800,28 @@ halbtc8192e1ant_PowerSaveState( bLowPwrDisable = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL); + pCoexSta->bForceLpsOn = FALSE; break; case BTC_PS_LPS_ON: halbtc8192e1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE); - halbtc8192e1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal); + halbtc8192e1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal); // when coex force to enter LPS, do not enter 32k low power. bLowPwrDisable = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - // power save must executed before psTdma. + // power save must executed before psTdma. pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL); + pCoexSta->bForceLpsOn = TRUE; break; case BTC_PS_LPS_OFF: halbtc8192e1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL); + pCoexSta->bForceLpsOn = FALSE; break; default: break; } } - VOID halbtc8192e1ant_ActionWifiOnly( IN PBTC_COEXIST pBtCoexist @@ -1769,24 +1861,24 @@ halbtc8192e1ant_MonitorBtEnableDisable( btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); halbtc8192e1ant_ActionWifiOnly(pBtCoexist); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); bPreBtDisabled = bBtDisabled; @@ -1808,18 +1900,23 @@ halbtc8192e1ant_MonitorBtEnableDisable( //============================================= // SCO only or SCO+PAN(HS) + +/* VOID halbtc8192e1ant_ActionSco( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); } + VOID halbtc8192e1ant_ActionHid( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); } //A2DP only / PAN(EDR) only/ A2DP+PAN(HS) @@ -1828,6 +1925,7 @@ halbtc8192e1ant_ActionA2dp( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); } VOID @@ -1835,6 +1933,7 @@ halbtc8192e1ant_ActionA2dpPanHs( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); } VOID @@ -1842,6 +1941,7 @@ halbtc8192e1ant_ActionPanEdr( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); } //PAN(HS) only @@ -1850,6 +1950,7 @@ halbtc8192e1ant_ActionPanHs( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); } //PAN(EDR)+A2DP @@ -1858,6 +1959,7 @@ halbtc8192e1ant_ActionPanEdrA2dp( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); } VOID @@ -1865,6 +1967,7 @@ halbtc8192e1ant_ActionPanEdrHid( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); } // HID+A2DP+PAN(EDR) @@ -1873,6 +1976,7 @@ halbtc8192e1ant_ActionHidA2dpPanEdr( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); } VOID @@ -1880,58 +1984,77 @@ halbtc8192e1ant_ActionHidA2dp( IN PBTC_COEXIST pBtCoexist ) { + halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); } +*/ + //============================================= // // Non-Software Coex Mechanism start // //============================================= VOID -halbtc8192e1ant_ActionBtInquiry( +halbtc8192e1ant_ActionWifiMultiPort( IN PBTC_COEXIST pBtCoexist ) { - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; - - // Note: - // Do not do DacSwing here, use original setting. + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - if(bBtHsOn) - return; + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); +} - if(!bWifiConnected) - { - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); +VOID +halbtc8192e1ant_ActionHs( + IN PBTC_COEXIST pBtCoexist + ) +{ + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); +} +VOID +halbtc8192e1ant_ActionBtInquiry( + IN PBTC_COEXIST pBtCoexist + ) +{ + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy); + + if((!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask)) + { + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } - else if( (pBtLinkInfo->bScoExist) || - (pBtLinkInfo->bHidOnly) ) + else if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist)) { - // SCO/HID-only busy + // SCO/HID/A2DP busy halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); + + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else if ((pBtLinkInfo->bPanExist) || (bWifiBusy)) + { + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); } else { - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x0); - - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 30); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } } @@ -1942,141 +2065,100 @@ halbtc8192e1ant_ActionBtScoHidOnlyBusy( ) { PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - u1Byte btRssiState=BTC_RSSI_STATE_HIGH; + BOOLEAN bWifiConnected=FALSE; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH; - if(BT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); - - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - } - else - { - if(pBtLinkInfo->bHidOnly) - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); - - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - } - else - { - // dec bt power for diff level - btRssiState = halbtc8192e1ant_BtRssiState(3, 34, 42); - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 6); - } + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - // sw dacSwing - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0xc); + // tdma and coex table - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); - } + if(pBtLinkInfo->bScoExist) + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); + } + else //HID + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); } } VOID -halbtc8192e1ant_ActionHs( - IN PBTC_COEXIST pBtCoexist +halbtc8192e1ant_ActionWifiConnectedBtAclBusy( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte wifiStatus ) { + u1Byte btRssiState; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + btRssiState = halbtc8192e1ant_BtRssiState(2, 28, 0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action for HS!!!\n")); - - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - if(BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) + if ( (pCoexSta->lowPriorityRx >= 1000) && (pCoexSta->lowPriorityRx != 65535) ) { - // error, should not be here - pCoexDm->errorCondition = 1; + pBtLinkInfo->bSlaveRole = TRUE; } - else if(BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) + else { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 6); + pBtLinkInfo->bSlaveRole = FALSE; + } - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 10); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + if(pBtLinkInfo->bHidOnly) //HID + { + halbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus); + pCoexDm->bAutoTdmaAdjust = FALSE; + return; } - else if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && - !pBtCoexist->btLinkInfo.bHidOnly) + else if(pBtLinkInfo->bA2dpOnly) //A2DP { - if(pCoexDm->curSsType == 1) + if(BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus) { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 6); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 10); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + pCoexDm->bAutoTdmaAdjust = FALSE; + } + else + { + halbtc8192e1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus); +#if 0 + if (pCoexSta->bCCKLock) + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); + else +#endif + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + pCoexDm->bAutoTdmaAdjust = TRUE; } } - else + else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) || + (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) { - halbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist, - BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY); + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + pCoexDm->bAutoTdmaAdjust = FALSE; } -} - -VOID -halbtc8192e1ant_ActionWifiConnectedBtAclBusy( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte wifiStatus - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - - if(pBtLinkInfo->bHidOnly) + else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist) //HID+A2DP { - halbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus); + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); pCoexDm->bAutoTdmaAdjust = FALSE; - return; - } - - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); - if( (pBtLinkInfo->bA2dpOnly) || - (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist) ) - { - halbtc8192e1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); } - else if( (pBtLinkInfo->bPanOnly) || - (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) + else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP) { halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); pCoexDm->bAutoTdmaAdjust = FALSE; } else - { - if( (BT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) || - (BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) || - (BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) ) - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - else - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); + { + //BT no-profile busy (0x9) + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); pCoexDm->bAutoTdmaAdjust = FALSE; - } - - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); + } } - VOID halbtc8192e1ant_ActionWifiNotConnected( IN PBTC_COEXIST pBtCoexist @@ -2085,25 +2167,78 @@ halbtc8192e1ant_ActionWifiNotConnected( // power save state halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); - - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + // tdma and coex table + halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } VOID -halbtc8192e1ant_ActionWifiNotConnectedAssoAuthScan( +halbtc8192e1ant_ActionWifiNotConnectedScan( IN PBTC_COEXIST pBtCoexist ) { + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); + // tdma and coex table + if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) + { + if (pBtLinkInfo->bA2dpExist) + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + } + else if( (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || + (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) + { + halbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN); + } + else + { + //Bryant Add + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + } +} + +VOID +halbtc8192e1ant_ActionWifiNotConnectedAssoAuth( + IN PBTC_COEXIST pBtCoexist + ) +{ + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + // tdma and coex table + if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) ) + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else if (pBtLinkInfo->bPanExist) + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + } } VOID @@ -2111,16 +2246,28 @@ halbtc8192e1ant_ActionWifiConnectedScan( IN PBTC_COEXIST pBtCoexist ) { - // power save state - if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x0); - else - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + // tdma and coex table if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) { - halbtc8192e1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, - BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN); + if (pBtLinkInfo->bA2dpExist) + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } } else if( (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) @@ -2129,35 +2276,35 @@ halbtc8192e1ant_ActionWifiConnectedScan( BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN); } else - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); + { + //Bryant Add halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); } } - VOID halbtc8192e1ant_ActionWifiConnectedSpecialPacket( IN PBTC_COEXIST pBtCoexist ) { - // power save state - if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x0); - else - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + // tdma and coex table + if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist)) { - halbtc8192e1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, - BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT); + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); } - else + else if(pBtLinkInfo->bPanExist) + { + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); } @@ -2168,45 +2315,65 @@ halbtc8192e1ant_ActionWifiConnected( IN PBTC_COEXIST pBtCoexist ) { - BOOLEAN bWifiConnected=FALSE, bWifiBusy=FALSE; - BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BOOLEAN bUnder4way=FALSE; + BOOLEAN bWifiBusy=FALSE; + BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; + BOOLEAN bUnder4way=FALSE, bApEnable=FALSE; u4Byte wifiBw; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect()===>\n")); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - if(!bWifiConnected) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi not connected<===\n")); - return; - } + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect()===>\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way); if(bUnder4way) { halbtc8192e1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n")); return; } - + 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); if(bScan || bLink || bRoam) { - halbtc8192e1ant_ActionWifiConnectedScan(pBtCoexist); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n")); + if(bScan) + halbtc8192e1ant_ActionWifiConnectedScan(pBtCoexist); + else + halbtc8192e1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n")); return; } + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + // power save state - if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x0); + if(!bApEnable && BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) + { + if(pBtCoexist->btLinkInfo.bA2dpOnly) //A2DP + { + if(!bWifiBusy) + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else //busy + { + if (pCoexSta->nScanAPNum >= BT_8192E_1ANT_WIFI_NOISY_THRESH) //no force LPS, no PS-TDMA, use pure TDMA + { + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + } + else + { + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + } + } + } + else if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE)) + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + } else halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + // tdma and coex table if(!bWifiBusy) { if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) @@ -2221,30 +2388,18 @@ halbtc8192e1ant_ActionWifiConnected( BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE); } else - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); + { halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + + if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 ) + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } } else { - if(BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - } - else if(BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - } - else if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) + if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) { halbtc8192e1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY); @@ -2256,11 +2411,13 @@ halbtc8192e1ant_ActionWifiConnected( BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY); } else - { - halbtc8192e1ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0); + { halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + + if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 ) + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } } } @@ -2270,65 +2427,62 @@ halbtc8192e1ant_RunSwCoexistMechanism( IN PBTC_COEXIST pBtCoexist ) { - BOOLEAN bWifiUnder5G=FALSE, bWifiBusy=FALSE, bWifiConnected=FALSE; - u1Byte btInfoOriginal=0, btRetryCnt=0; u1Byte algorithm=0; - return; - algorithm = halbtc8192e1ant_ActionAlgorithm(pBtCoexist); pCoexDm->curAlgorithm = algorithm; if(halbtc8192e1ant_IsCommonAction(pBtCoexist)) { + } else { switch(pCoexDm->curAlgorithm) { case BT_8192E_1ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = SCO.\n")); - halbtc8192e1ant_ActionSco(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = SCO.\n")); + //halbtc8192e1ant_ActionSco(pBtCoexist); break; case BT_8192E_1ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID.\n")); - halbtc8192e1ant_ActionHid(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID.\n")); + //halbtc8192e1ant_ActionHid(pBtCoexist); break; case BT_8192E_1ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP.\n")); - halbtc8192e1ant_ActionA2dp(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP.\n")); + //halbtc8192e1ant_ActionA2dp(pBtCoexist); break; case BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); - halbtc8192e1ant_ActionA2dpPanHs(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); + //halbtc8192e1ant_ActionA2dpPanHs(pBtCoexist); break; case BT_8192E_1ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR).\n")); - halbtc8192e1ant_ActionPanEdr(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR).\n")); + //halbtc8192e1ant_ActionPanEdr(pBtCoexist); break; case BT_8192E_1ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HS mode.\n")); - halbtc8192e1ant_ActionPanHs(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HS mode.\n")); + //halbtc8192e1ant_ActionPanHs(pBtCoexist); break; case BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); - halbtc8192e1ant_ActionPanEdrA2dp(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); + //halbtc8192e1ant_ActionPanEdrA2dp(pBtCoexist); break; case BT_8192E_1ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n")); - halbtc8192e1ant_ActionPanEdrHid(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n")); + //halbtc8192e1ant_ActionPanEdrHid(pBtCoexist); break; case BT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n")); - halbtc8192e1ant_ActionHidA2dpPanEdr(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n")); + //halbtc8192e1ant_ActionHidA2dpPanEdr(pBtCoexist); break; case BT_8192E_1ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP.\n")); - halbtc8192e1ant_ActionHidA2dp(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP.\n")); + //halbtc8192e1ant_ActionHidA2dp(pBtCoexist); break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = coexist All Off!!\n")); - halbtc8192e1ant_CoexAllOff(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = coexist All Off!!\n")); + //halbtc8192e1ant_CoexAllOff(pBtCoexist); break; } pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; @@ -2340,76 +2494,139 @@ halbtc8192e1ant_RunCoexistMechanism( IN PBTC_COEXIST pBtCoexist ) { - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + BOOLEAN bIncreaseScanDevNum=FALSE; + BOOLEAN bBtCtrlAggBufSize=FALSE; + BOOLEAN bMiracastPlusBt=FALSE; + u1Byte aggBufSize=5; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH; + u4Byte wifiLinkStatus=0; + u4Byte numOfWifiLink=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); return; } if(pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); return; } if(pCoexSta->bUnderIps) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS !!!\n")); return; } - - halbtc8192e1ant_RunSwCoexistMechanism(pBtCoexist); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - if(pCoexSta->bC2hBtInquiryPage) + if( (BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || + (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || + (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) { - halbtc8192e1ant_ActionBtInquiry(pBtCoexist); - return; + bIncreaseScanDevNum = TRUE; } - // 1ss or 2ss - if(pBtLinkInfo->bScoExist) + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); + numOfWifiLink = wifiLinkStatus>>16; + + if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED)) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) ); + + if(pBtLinkInfo->bBtLinkExist) + { + halbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); + bMiracastPlusBt = TRUE; + } + else + { + halbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + bMiracastPlusBt = FALSE; + } + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); + halbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); + + if ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) ) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], BT Is Inquirying \n") ); + halbtc8192e1ant_ActionBtInquiry(pBtCoexist); + } + else + halbtc8192e1ant_ActionWifiMultiPort(pBtCoexist); + + return; + } + else { - halbtc8192e1ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); + bMiracastPlusBt = FALSE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); } - else if(bBtHsOn) + + if ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) ) { - if(pBtLinkInfo->bHidOnly) - halbtc8192e1ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); + + if(pBtLinkInfo->bScoExist) + halbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5); else - halbtc8192e1ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); + halbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); + + halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); + halbtc8192e1ant_RunSwCoexistMechanism(pBtCoexist); //just print debug message } else - halbtc8192e1ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2); - - if(bBtHsOn) + { + halbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + + halbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); + + halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); + halbtc8192e1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message + } + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + if(pCoexSta->bC2hBtInquiryPage) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], BT Is Inquirying \n") ); + halbtc8192e1ant_ActionBtInquiry(pBtCoexist); + return; + } + else if(bBtHsOn) { halbtc8192e1ant_ActionHs(pBtCoexist); return; } - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + if(!bWifiConnected) { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is non connected-idle !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is non connected-idle !!!\n")); 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); if(bScan || bLink || bRoam) - halbtc8192e1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist); + { + if (bScan) + halbtc8192e1ant_ActionWifiNotConnectedScan(pBtCoexist); + else + halbtc8192e1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); + } else halbtc8192e1ant_ActionWifiNotConnected(pBtCoexist); } - else + else // wifi LPS/Busy { halbtc8192e1ant_ActionWifiConnected(pBtCoexist); } @@ -2421,30 +2638,18 @@ halbtc8192e1ant_InitCoexDm( ) { // force to reset coex mechanism - halbtc8192e1ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6); - halbtc8192e1ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0); - - halbtc8192e1ant_SwitchSsType(pBtCoexist, FORCE_EXEC, 2); - halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); + // sw all off + halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); + + //halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); halbtc8192e1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); -} -//============================================================ -// work around function start with wa_halbtc8192e1ant_ -//============================================================ -//============================================================ -// extern function start with EXhalbtc8192e1ant_ -//============================================================ -VOID -EXhalbtc8192e1ant_PowerOnSetting( - IN PBTC_COEXIST pBtCoexist - ) -{ + pCoexSta->popEventCnt = 0; } VOID -EXhalbtc8192e1ant_InitHwConfig( +halbtc8192e1ant_InitHwConfig( IN PBTC_COEXIST pBtCoexist, IN BOOLEAN bWifiOnly ) @@ -2453,7 +2658,7 @@ EXhalbtc8192e1ant_InitHwConfig( u2Byte u2Tmp=0; u1Byte u1Tmp=0; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 1Ant Init HW Config!!\n")); // antenna sw ctrl to bt halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE); @@ -2496,16 +2701,122 @@ EXhalbtc8192e1ant_InitHwConfig( pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp); } + +/* +VOID +halbtc8192e1ant_WifiOffHwCfg( + IN PBTC_COEXIST pBtCoexist + ) +{ + // set wlan_act to low + //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); +} +*/ + +//============================================================ +// work around function start with wa_halbtc8192e1ant_ +//============================================================ +//============================================================ +// extern function start with EXhalbtc8192e1ant_ +//============================================================ +VOID +EXhalbtc8192e1ant_PowerOnSetting( + IN PBTC_COEXIST pBtCoexist + ) +{ +#if 0 + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + u1Byte u1Tmp=0x0; + u2Byte u2Tmp=0x0; + + pBtCoexist->bStopCoexDm = TRUE; + + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20); + + // enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. + u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2); + pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1); + + // set GRAN_BT = 1 + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); + // set WLAN_ACT = 0 + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); + + // + // S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) + // Local setting bit define + // BIT0: "0" for no antenna inverse; "1" for antenna inverse + // BIT1: "0" for internal switch; "1" for external switch + // BIT2: "0" for one antenna; "1" for two antenna + // NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0 + if(pBtCoexist->chipInterface == BTC_INTF_USB) + { + // fixed at S0 for USB interface + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); + + u1Tmp |= 0x1; // antenna inverse + pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp); + + pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT; + } + else + { + // for PCIE and SDIO interface, we check efuse 0xc3[6] + if(pBoardInfo->singleAntPath == 0) + { + // set to S1 + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); + pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT; + } + else if(pBoardInfo->singleAntPath == 1) + { + // set to S0 + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); + u1Tmp |= 0x1; // antenna inverse + pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT; + } + + if(pBtCoexist->chipInterface == BTC_INTF_PCI) + { + pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp); + } + else if(pBtCoexist->chipInterface == BTC_INTF_SDIO) + { + pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp); + } + } +#endif +} + +VOID +EXhalbtc8192e1ant_PreLoadFirmware( + IN PBTC_COEXIST pBtCoexist + ) +{ +} + +VOID +EXhalbtc8192e1ant_InitHwConfig( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bWifiOnly + ) +{ + halbtc8192e1ant_InitHwConfig(pBtCoexist, bWifiOnly); + pBtCoexist->bStopCoexDm = FALSE; +} + VOID EXhalbtc8192e1ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); pBtCoexist->bStopCoexDm = FALSE; halbtc8192e1ant_InitCoexDm(pBtCoexist); + + halbtc8192e1ant_QueryBtInfo(pBtCoexist); } VOID @@ -2557,7 +2868,7 @@ EXhalbtc8192e1ant_DisplayCoexInfo( pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1], pCoexDm->wifiChnlInfo[2]); CL_PRINTF(cliBuf); - + // wifi status CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); CL_PRINTF(cliBuf); @@ -2689,7 +3000,6 @@ EXhalbtc8192e1ant_DisplayCoexInfo( pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS); } - VOID EXhalbtc8192e1ant_IpsNotify( IN PBTC_COEXIST pBtCoexist, @@ -2703,15 +3013,21 @@ EXhalbtc8192e1ant_IpsNotify( if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); pCoexSta->bUnderIps = TRUE; - halbtc8192e1ant_CoexAllOff(pBtCoexist); - halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); + + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); pCoexSta->bUnderIps = FALSE; + + halbtc8192e1ant_InitHwConfig(pBtCoexist, FALSE); + halbtc8192e1ant_InitCoexDm(pBtCoexist); + halbtc8192e1ant_QueryBtInfo(pBtCoexist); } } @@ -2726,12 +3042,12 @@ EXhalbtc8192e1ant_LpsNotify( if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); pCoexSta->bUnderLps = TRUE; } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); pCoexSta->bUnderLps = FALSE; } } @@ -2742,14 +3058,59 @@ EXhalbtc8192e1ant_ScanNotify( IN u1Byte type ) { - BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + u4Byte wifiLinkStatus=0; + u4Byte numOfWifiLink=0; + BOOLEAN bBtCtrlAggBufSize=FALSE; + u1Byte aggBufSize=5; + + u1Byte u1Tmpa, u1Tmpb; + u4Byte u4Tmp; if(pBtCoexist->bManualControl || - pBtCoexist->bStopCoexDm || - pBtCoexist->btInfo.bBtDisabled ) + pBtCoexist->bStopCoexDm ) + return; + + if(BTC_SCAN_START == type) + { + pCoexSta->bWiFiIsHighPriTask = TRUE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); + + halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue + u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948); + u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765); + u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67); + + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + u4Tmp, u1Tmpa, u1Tmpb)); + } + else + { + pCoexSta->bWiFiIsHighPriTask = FALSE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum); + } + + if(pBtCoexist->btInfo.bBtDisabled) return; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + + halbtc8192e1ant_QueryBtInfo(pBtCoexist); + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); + numOfWifiLink = wifiLinkStatus>>16; + if(numOfWifiLink >= 2) + { + halbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); + halbtc8192e1ant_ActionWifiMultiPort(pBtCoexist); + return; + } + if(pCoexSta->bC2hBtInquiryPage) { halbtc8192e1ant_ActionBtInquiry(pBtCoexist); @@ -2761,13 +3122,12 @@ EXhalbtc8192e1ant_ScanNotify( return; } - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); if(!bWifiConnected) // non-connected scan { - halbtc8192e1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist); + halbtc8192e1ant_ActionWifiNotConnectedScan(pBtCoexist); } else // wifi is connected { @@ -2776,7 +3136,7 @@ EXhalbtc8192e1ant_ScanNotify( } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); if(!bWifiConnected) // non-connected scan { halbtc8192e1ant_ActionWifiNotConnected(pBtCoexist); @@ -2794,13 +3154,40 @@ EXhalbtc8192e1ant_ConnectNotify( IN u1Byte type ) { - BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + u4Byte wifiLinkStatus=0; + u4Byte numOfWifiLink=0; + BOOLEAN bBtCtrlAggBufSize=FALSE; + u1Byte aggBufSize=5; if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm || pBtCoexist->btInfo.bBtDisabled ) return; + if(BTC_ASSOCIATE_START == type) + { + pCoexSta->bWiFiIsHighPriTask = TRUE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); + pCoexDm->nArpCnt = 0; + } + else + { + pCoexSta->bWiFiIsHighPriTask = FALSE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); + //pCoexDm->nArpCnt = 0; + } + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); + numOfWifiLink = wifiLinkStatus>>16; + if(numOfWifiLink >= 2) + { + halbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); + halbtc8192e1ant_ActionWifiMultiPort(pBtCoexist); + return; + } + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); if(pCoexSta->bC2hBtInquiryPage) { @@ -2815,12 +3202,12 @@ EXhalbtc8192e1ant_ConnectNotify( if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); - halbtc8192e1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); + halbtc8192e1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(!bWifiConnected) // non-connected scan @@ -2843,6 +3230,7 @@ EXhalbtc8192e1ant_MediaStatusNotify( u1Byte H2C_Parameter[3] ={0}; u4Byte wifiBw; u1Byte wifiCentralChnl; + BOOLEAN bWifiUnderBMode = FALSE; if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm || @@ -2851,11 +3239,34 @@ EXhalbtc8192e1ant_MediaStatusNotify( if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode); + + //Set CCK Tx/Rx high Pri except 11b mode + if (bWifiUnderBMode) + { + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); //CCK Rx + } + else + { + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); //CCK Tx + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx + } + + pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430); + pCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434); + pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a); + pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); + pCoexDm->nArpCnt = 0; + + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx } // only 2.4G we need to inform bt the chnl mask @@ -2863,7 +3274,8 @@ EXhalbtc8192e1ant_MediaStatusNotify( if( (BTC_MEDIA_CONNECT == type) && (wifiCentralChnl <= 14) ) { - H2C_Parameter[0] = 0x1; + //H2C_Parameter[0] = 0x1; + H2C_Parameter[0] = 0x0; H2C_Parameter[1] = wifiCentralChnl; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); if(BTC_WIFI_BW_HT40 == wifiBw) @@ -2876,7 +3288,7 @@ EXhalbtc8192e1ant_MediaStatusNotify( pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1]; pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x66=0x%x\n", H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); @@ -2889,12 +3301,60 @@ EXhalbtc8192e1ant_SpecialPacketNotify( ) { BOOLEAN bBtHsOn=FALSE; + u4Byte wifiLinkStatus=0; + u4Byte numOfWifiLink=0; + BOOLEAN bBtCtrlAggBufSize=FALSE; + u1Byte aggBufSize=5; if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm || pBtCoexist->btInfo.bBtDisabled ) return; + if( BTC_PACKET_DHCP == type || + BTC_PACKET_EAPOL == type || + BTC_PACKET_ARP == type ) + { + if(BTC_PACKET_ARP == type) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet ARP notify\n")); + + pCoexDm->nArpCnt++; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt)); + + if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) + { + pCoexSta->bWiFiIsHighPriTask = FALSE; + } + else + { + pCoexSta->bWiFiIsHighPriTask = TRUE; + } + } + else + { + pCoexSta->bWiFiIsHighPriTask = TRUE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet DHCP or EAPOL notify\n")); + } + } + else + { + pCoexSta->bWiFiIsHighPriTask = FALSE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet [Type = %d] notify\n", type)); + } + + pCoexSta->specialPktPeriodCnt = 0; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); + numOfWifiLink = wifiLinkStatus>>16; + if(numOfWifiLink >= 2) + { + halbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); + halbtc8192e1ant_ActionWifiMultiPort(pBtCoexist); + return; + } + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); if(pCoexSta->bC2hBtInquiryPage) { @@ -2908,9 +3368,9 @@ EXhalbtc8192e1ant_SpecialPacketNotify( } if( BTC_PACKET_DHCP == type || - BTC_PACKET_EAPOL == type ) + BTC_PACKET_EAPOL == type || + ( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type)); halbtc8192e1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); } } @@ -2925,11 +3385,9 @@ EXhalbtc8192e1ant_BtInfoNotify( PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; u1Byte btInfo=0; u1Byte i, rspSource=0; - static u4Byte setBtPsdMode=0; - BOOLEAN bBtBusy=FALSE; BOOLEAN bWifiConnected=FALSE; - BOOLEAN bBtCtrlAggBufSize=FALSE; - + BOOLEAN bBtBusy=FALSE; + pCoexSta->bC2hBtInfoReqSent = FALSE; rspSource = tmpBuf[0]&0xf; @@ -2937,7 +3395,7 @@ EXhalbtc8192e1ant_BtInfoNotify( rspSource = BT_INFO_SRC_8192E_1ANT_WIFI_FW; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -2945,47 +3403,48 @@ EXhalbtc8192e1ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } - if(pBtCoexist->btInfo.bBtDisabled) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for BT is disabled <===\n")); - return; - } - - if(pBtCoexist->bManualControl) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n")); - return; - } - if(pBtCoexist->bStopCoexDm) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for Coex STOPPED!!<===\n")); - return; - } - if(BT_INFO_SRC_8192E_1ANT_WIFI_FW != rspSource) { pCoexSta->btRetryCnt = // [3:0] pCoexSta->btInfoC2h[rspSource][2]&0xf; + if (pCoexSta->btRetryCnt >= 1) + pCoexSta->popEventCnt++; + + if (pCoexSta->btInfoC2h[rspSource][2]&0x20) + pCoexSta->bC2hBtPage = TRUE; + else + pCoexSta->bC2hBtPage = FALSE; + pCoexSta->btRssi = - pCoexSta->btInfoC2h[rspSource][3]*2+10; + pCoexSta->btInfoC2h[rspSource][3]*2-90; + //pCoexSta->btInfoC2h[rspSource][3]*2+10; pCoexSta->btInfoExt = pCoexSta->btInfoC2h[rspSource][4]; + pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask); + if(!pCoexSta->bBtTxRxMask) + { + /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n")); + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); + } + // Here we need to resend some wifi info to BT // because bt is reset and loss of the info. - if( (pCoexSta->btInfoExt & BIT1) ) + if(pCoexSta->btInfoExt & BIT1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(bWifiConnected) { @@ -2995,35 +3454,30 @@ EXhalbtc8192e1ant_BtInfoNotify( { EXhalbtc8192e1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); } - - setBtPsdMode = 0; } - - // test-chip bt patch only rsp the status for BT_RSP, - // so temporary we consider the following only under BT_RSP - if(BT_INFO_SRC_8192E_1ANT_BT_RSP == rspSource) + + if(pCoexSta->btInfoExt & BIT3) { - if( (pCoexSta->btInfoExt & BIT3) ) + if(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); halbtc8192e1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); } - else - { - // BT already NOT ignore Wlan active, do nothing here. - } + } + else + { + // BT already NOT ignore Wlan active, do nothing here. + } #if(BT_AUTO_REPORT_ONLY_8192E_1ANT == 0) - if( (pCoexSta->btInfoExt & BIT4) ) - { - // BT auto report already enabled, do nothing - } - else - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit4 check, set BT to enable Auto Report!!\n")); - halbtc8192e1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE); - } -#endif + if( (pCoexSta->btInfoExt & BIT4) ) + { + // BT auto report already enabled, do nothing + } + else + { + halbtc8192e1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE); } +#endif } // check BIT2 first ==> check if bt is under inquiry or page scan @@ -3041,7 +3495,7 @@ EXhalbtc8192e1ant_BtInfoNotify( pCoexSta->bHidExist = FALSE; pCoexSta->bScoExist = FALSE; } - else // connection exists + else // connection exists { pCoexSta->bBtLinkExist = TRUE; if(btInfo & BT_INFO_8192E_1ANT_B_FTP) @@ -3063,75 +3517,86 @@ EXhalbtc8192e1ant_BtInfoNotify( } halbtc8192e1ant_UpdateBtLinkInfo(pBtCoexist); - + + btInfo = btInfo & 0x1f; //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41) + if(!(btInfo&BT_INFO_8192E_1ANT_B_CONNECTION)) { pCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt non-connected idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); } else if(btInfo == BT_INFO_8192E_1ANT_B_CONNECTION) // connection exists but no busy { pCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt connected-idle!!!\n")); - } + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); + } else if((btInfo&BT_INFO_8192E_1ANT_B_SCO_ESCO) || (btInfo&BT_INFO_8192E_1ANT_B_SCO_BUSY)) { pCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_SCO_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt sco busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); } - else if( (btInfo&BT_INFO_8192E_1ANT_B_ACL_BUSY) || - (btInfo&BT_INFO_8192E_1ANT_B_A2DP) || - (btInfo&BT_INFO_8192E_1ANT_B_FTP) ) + else if(btInfo&BT_INFO_8192E_1ANT_B_ACL_BUSY) { if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus) pCoexDm->bAutoTdmaAdjust = FALSE; pCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_ACL_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt acl busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); } else { pCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_MAX; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt non-defined state!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); } - // ra mask check - if(pBtLinkInfo->bScoExist || pBtLinkInfo->bHidExist) - { - halbtc8192e1ant_UpdateRaMask(pBtCoexist, NORMAL_EXEC, BTC_RATE_DISABLE, 0x00000003); // disable tx cck 1M/2M - } - else - { - halbtc8192e1ant_UpdateRaMask(pBtCoexist, NORMAL_EXEC, BTC_RATE_ENABLE, 0x00000003); // enable tx cck 1M/2M - } - if( (BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { bBtBusy = TRUE; - if(pBtLinkInfo->bHidExist) - bBtCtrlAggBufSize = TRUE; - } else - { bBtBusy = FALSE; - } pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy); - //============================================ - // Aggregation related setting - //============================================ - // if sco, reject AddBA - //pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejApAggPkt); + halbtc8192e1ant_RunCoexistMechanism(pBtCoexist); +} - // decide BT control aggregation buf size or not - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlAggBufSize); - // real update aggregation setting - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); - //============================================ +VOID +EXhalbtc8192e1ant_RfStatusNotify( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte type + ) +{ + u4Byte u4Tmp; + u1Byte u1Tmpa,u1Tmpb, u1Tmpc; + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RF Status notify\n")); - halbtc8192e1ant_RunCoexistMechanism(pBtCoexist); + if(BTC_RF_ON == type) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RF is turned ON!!\n")); + pBtCoexist->bStopCoexDm = FALSE; + } + else if(BTC_RF_OFF == type) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RF is turned OFF!!\n")); + + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); + halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); + + halbtc8192e1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + pBtCoexist->bStopCoexDm = TRUE; + + u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948); + u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765); + u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67); + u1Tmpc = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e); + + + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n", + u4Tmp, u1Tmpa, u1Tmpb, u1Tmpc)); + + } } VOID @@ -3139,16 +3604,19 @@ EXhalbtc8192e1ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); - - pBtCoexist->bStopCoexDm = TRUE; - halbtc8192e1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + u4Byte u4Tmp; + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - + halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); + halbtc8192e1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + EXhalbtc8192e1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); + + pBtCoexist->bStopCoexDm = TRUE; } VOID @@ -3157,21 +3625,42 @@ EXhalbtc8192e1ant_PnpNotify( IN u1Byte pnpState ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify\n")); if(BTC_WIFI_PNP_SLEEP == pnpState) { - pBtCoexist->bStopCoexDm = TRUE; - halbtc8192e1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to SLEEP\n")); + halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); + halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); + + pBtCoexist->bStopCoexDm = TRUE; } else if(BTC_WIFI_PNP_WAKE_UP == pnpState) { - + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to WAKE UP\n")); + pBtCoexist->bStopCoexDm = FALSE; + halbtc8192e1ant_InitHwConfig(pBtCoexist, FALSE); + halbtc8192e1ant_InitCoexDm(pBtCoexist); + halbtc8192e1ant_QueryBtInfo(pBtCoexist); } } +VOID +EXhalbtc8192e1ant_CoexDmReset( + IN PBTC_COEXIST pBtCoexist + ) +{ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], *****************Coex DM Reset*****************\n")); + + halbtc8192e1ant_InitHwConfig(pBtCoexist, FALSE); + //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0); + halbtc8192e1ant_InitCoexDm(pBtCoexist); +} + VOID EXhalbtc8192e1ant_Periodical( IN PBTC_COEXIST pBtCoexist @@ -3182,35 +3671,42 @@ EXhalbtc8192e1ant_Periodical( PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); if(disVerInfoCnt <= 5) { disVerInfoCnt += 1; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", GLCoexVerDate8192e1Ant, GLCoexVer8192e1Ant, fwVer, btPatchVer, btPatchVer)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); } + #if(BT_AUTO_REPORT_ONLY_8192E_1ANT == 0) halbtc8192e1ant_QueryBtInfo(pBtCoexist); - halbtc8192e1ant_MonitorBtCtr(pBtCoexist); halbtc8192e1ant_MonitorBtEnableDisable(pBtCoexist); #else + halbtc8192e1ant_MonitorBtCtr(pBtCoexist); + halbtc8192e1ant_MonitorWiFiCtr(pBtCoexist); + if( halbtc8192e1ant_IsWifiStatusChanged(pBtCoexist) || - pCoexDm->bAutoTdmaAdjust) + pCoexDm->bAutoTdmaAdjust ) { - halbtc8192e1ant_RunCoexistMechanism(pBtCoexist); + + halbtc8192e1ant_RunCoexistMechanism(pBtCoexist); } + + pCoexSta->specialPktPeriodCnt++; #endif } + VOID EXhalbtc8192e1ant_DbgControl( IN PBTC_COEXIST pBtCoexist, @@ -3237,5 +3733,6 @@ EXhalbtc8192e1ant_DbgControl( break; } } + #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h index 8792ec8d381c..02914bcad506 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h @@ -1,7 +1,7 @@ //=========================================== -// The following is for 8192E_1ANT BT Co-exist definition +// The following is for 8192E 1ANT BT Co-exist definition //=========================================== -#define BT_AUTO_REPORT_ONLY_8192E_1ANT 0 +#define BT_AUTO_REPORT_ONLY_8192E_1ANT 1 #define BT_INFO_8192E_1ANT_B_FTP BIT7 #define BT_INFO_8192E_1ANT_B_A2DP BIT6 @@ -17,6 +17,8 @@ #define BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT 2 +#define BT_8192E_1ANT_WIFI_NOISY_THRESH 30 //max: 255 + typedef enum _BT_INFO_SRC_8192E_1ANT{ BT_INFO_SRC_8192E_1ANT_WIFI_FW = 0x0, BT_INFO_SRC_8192E_1ANT_BT_RSP = 0x1, @@ -61,10 +63,6 @@ typedef enum _BT_8192E_1ANT_COEX_ALGO{ typedef struct _COEX_DM_8192E_1ANT{ // fw mechanism - u1Byte preBtDecPwrLvl; - u1Byte curBtDecPwrLvl; - u1Byte preFwDacSwingLvl; - u1Byte curFwDacSwingLvl; BOOLEAN bCurIgnoreWlanAct; BOOLEAN bPreIgnoreWlanAct; u1Byte prePsTdma; @@ -84,10 +82,6 @@ typedef struct _COEX_DM_8192E_1ANT{ // sw mechanism BOOLEAN bPreLowPenaltyRa; BOOLEAN bCurLowPenaltyRa; - BOOLEAN bPreDacSwingOn; - u4Byte preDacSwingLvl; - BOOLEAN bCurDacSwingOn; - u4Byte curDacSwingLvl; u4Byte preVal0x6c0; u4Byte curVal0x6c0; u4Byte preVal0x6c4; @@ -96,6 +90,12 @@ typedef struct _COEX_DM_8192E_1ANT{ u4Byte curVal0x6c8; u1Byte preVal0x6cc; u1Byte curVal0x6cc; + BOOLEAN bLimitedDig; + + u4Byte backupArfrCnt1; // Auto Rate Fallback Retry cnt + u4Byte backupArfrCnt2; // Auto Rate Fallback Retry cnt + u2Byte backupRetryLimit; + u1Byte backupAmpduMaxTime; // algorithm related u1Byte preAlgorithm; @@ -103,11 +103,15 @@ typedef struct _COEX_DM_8192E_1ANT{ u1Byte btStatus; u1Byte wifiChnlInfo[3]; - u1Byte preSsType; - u1Byte curSsType; - u4Byte preRaMask; u4Byte curRaMask; + u1Byte preArfrType; + u1Byte curArfrType; + u1Byte preRetryLimitType; + u1Byte curRetryLimitType; + u1Byte preAmpduTimeType; + u1Byte curAmpduTimeType; + u4Byte nArpCnt; u1Byte errorCondition; } COEX_DM_8192E_1ANT, *PCOEX_DM_8192E_1ANT; @@ -121,19 +125,41 @@ typedef struct _COEX_STA_8192E_1ANT{ BOOLEAN bUnderLps; BOOLEAN bUnderIps; + u4Byte specialPktPeriodCnt; u4Byte highPriorityTx; u4Byte highPriorityRx; u4Byte lowPriorityTx; u4Byte lowPriorityRx; - u1Byte btRssi; + s1Byte btRssi; + BOOLEAN bBtTxRxMask; u1Byte preBtRssiState; u1Byte preWifiRssiState[4]; BOOLEAN bC2hBtInfoReqSent; u1Byte btInfoC2h[BT_INFO_SRC_8192E_1ANT_MAX][10]; u4Byte btInfoC2hCnt[BT_INFO_SRC_8192E_1ANT_MAX]; BOOLEAN bC2hBtInquiryPage; + BOOLEAN bC2hBtPage; //Add for win8.1 page out issue + BOOLEAN bWiFiIsHighPriTask; //Add for win8.1 page out issue u1Byte btRetryCnt; u1Byte btInfoExt; + u4Byte popEventCnt; + u1Byte nScanAPNum; + + u4Byte nCRCOK_CCK; + u4Byte nCRCOK_11g; + u4Byte nCRCOK_11n; + u4Byte nCRCOK_11nAgg; + + u4Byte nCRCErr_CCK; + u4Byte nCRCErr_11g; + u4Byte nCRCErr_11n; + u4Byte nCRCErr_11nAgg; + + BOOLEAN bCCKLock; + BOOLEAN bPreCCKLock; + u1Byte nCoexTableType; + + BOOLEAN bForceLpsOn; }COEX_STA_8192E_1ANT, *PCOEX_STA_8192E_1ANT; //=========================================== @@ -144,6 +170,10 @@ EXhalbtc8192e1ant_PowerOnSetting( IN PBTC_COEXIST pBtCoexist ); VOID +EXhalbtc8192e1ant_PreLoadFirmware( + IN PBTC_COEXIST pBtCoexist + ); +VOID EXhalbtc8192e1ant_InitHwConfig( IN PBTC_COEXIST pBtCoexist, IN BOOLEAN bWifiOnly @@ -189,6 +219,11 @@ EXhalbtc8192e1ant_BtInfoNotify( IN u1Byte length ); VOID +EXhalbtc8192e1ant_RfStatusNotify( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte type + ); +VOID EXhalbtc8192e1ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ); @@ -198,6 +233,10 @@ EXhalbtc8192e1ant_PnpNotify( IN u1Byte pnpState ); VOID +EXhalbtc8192e1ant_CoexDmReset( + IN PBTC_COEXIST pBtCoexist + ); +VOID EXhalbtc8192e1ant_Periodical( IN PBTC_COEXIST pBtCoexist ); @@ -212,3 +251,4 @@ EXhalbtc8192e1ant_DbgControl( IN u1Byte opLen, IN pu1Byte pData ); + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c index 8bde294c93f2..798eec7439e9 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c @@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8192e2Ant[]={ "BT Info[bt auto report]", }; -u4Byte GLCoexVerDate8192e2Ant=20130912; -u4Byte GLCoexVer8192e2Ant=0x35; +u4Byte GLCoexVerDate8192e2Ant=20150105; +u4Byte GLCoexVer8192e2Ant=0x40; //============================================================ // local function proto type if needed @@ -53,30 +53,24 @@ halbtc8192e2ant_BtRssiState( if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) || (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=LOW\n")); if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=HIGH\n")); if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -84,57 +78,47 @@ halbtc8192e2ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) || (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=LOW\n")); if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=MEDIUM\n")); if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=HIGH\n")); if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -166,12 +150,10 @@ halbtc8192e2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -179,12 +161,10 @@ halbtc8192e2ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { - wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); + wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; } } } @@ -192,7 +172,7 @@ halbtc8192e2ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -202,12 +182,10 @@ halbtc8192e2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -216,17 +194,14 @@ halbtc8192e2ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -234,12 +209,10 @@ halbtc8192e2ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -279,23 +252,23 @@ halbtc8192e2ant_MonitorBtEnableDisable( btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); bPreBtDisabled = bBtDisabled; @@ -527,9 +500,9 @@ halbtc8192e2ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx)); // reset counter @@ -547,7 +520,7 @@ halbtc8192e2ant_QueryBtInfo( H2C_Parameter[0] |= BIT0; // trigger - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter); @@ -561,6 +534,8 @@ halbtc8192e2ant_IsWifiStatusChanged( static BOOLEAN bPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE; BOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE; BOOLEAN bWifiConnected=FALSE; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH; + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); @@ -584,6 +559,15 @@ halbtc8192e2ant_IsWifiStatusChanged( bPreBtHsOn = bBtHsOn; return TRUE; } + + + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist,3, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + + if ( (BTC_RSSI_STATE_HIGH ==wifiRssiState ) || (BTC_RSSI_STATE_LOW ==wifiRssiState )) + { + return TRUE; + } + } return FALSE; @@ -664,7 +648,7 @@ halbtc8192e2ant_ActionAlgorithm( if(!pBtLinkInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No BT link exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); return algorithm; } @@ -676,36 +660,37 @@ halbtc8192e2ant_ActionAlgorithm( numOfDiffProfile++; if(pBtLinkInfo->bA2dpExist) numOfDiffProfile++; - + + if(numOfDiffProfile == 1) { if(pBtLinkInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO only\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; } else { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID only\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP only\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_A2DP; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(HS) only\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(EDR) only\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR; } } @@ -717,24 +702,24 @@ halbtc8192e2ant_ActionAlgorithm( { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP ==> SCO\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(HS)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(EDR)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_SCO_PAN; } } @@ -746,12 +731,12 @@ halbtc8192e2ant_ActionAlgorithm( { if(pStackInfo->numOfHid >= 2) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID*2 + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID*2 + A2DP\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP; } } @@ -760,12 +745,12 @@ halbtc8192e2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(HS)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(EDR)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -774,12 +759,12 @@ halbtc8192e2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(HS)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(EDR)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -792,7 +777,7 @@ halbtc8192e2ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; } else if( pBtLinkInfo->bHidExist && @@ -800,12 +785,12 @@ halbtc8192e2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(HS)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(EDR)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_SCO_PAN; } } @@ -814,12 +799,12 @@ halbtc8192e2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -832,12 +817,12 @@ halbtc8192e2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(HS)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -853,12 +838,12 @@ halbtc8192e2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -880,8 +865,8 @@ halbtc8192e2ant_SetFwDacSwingLevel( // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 H2C_Parameter[0] = dacSwingLvl; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter); } @@ -896,7 +881,7 @@ halbtc8192e2ant_SetFwDecBtPwr( H2C_Parameter[0] = decBtPwrLvl; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\n", decBtPwrLvl, H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter); @@ -909,13 +894,13 @@ halbtc8192e2ant_DecBtPwr( IN u1Byte decBtPwrLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s Dec BT power level = %d\n", (bForceExec? "force to":""), decBtPwrLvl)); pCoexDm->curBtDecPwrLvl = decBtPwrLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n", pCoexDm->preBtDecPwrLvl, pCoexDm->curBtDecPwrLvl)); #if 0 // work around, avoid h2c command fail. if(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) @@ -942,7 +927,7 @@ halbtc8192e2ant_SetBtAutoReport( H2C_Parameter[0] |= BIT0; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter); @@ -955,13 +940,13 @@ halbtc8192e2ant_BtAutoReport( IN BOOLEAN bEnableAutoReport ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); pCoexDm->bCurBtAutoReport = bEnableAutoReport; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport)); if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) @@ -979,13 +964,13 @@ halbtc8192e2ant_FwDacSwingLvl( IN u1Byte fwDacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set FW Dac Swing level = %d\n", (bForceExec? "force to":""), fwDacSwingLvl)); pCoexDm->curFwDacSwingLvl = fwDacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) @@ -1006,7 +991,7 @@ halbtc8192e2ant_SetSwRfRxLpfCorner( if(bRxRfShrinkOn) { //Shrink RF Rx LPF corner - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc); } else @@ -1015,7 +1000,7 @@ halbtc8192e2ant_SetSwRfRxLpfCorner( // After initialized, we can use pCoexDm->btRf0x1eBackup if(pBtCoexist->bInitilized) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup); } } @@ -1028,13 +1013,13 @@ halbtc8192e2ant_RfShrink( IN BOOLEAN bRxRfShrinkOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Rx RF Shrink = %s\n", (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF"))); pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) @@ -1064,7 +1049,7 @@ halbtc8192e2ant_SetSwPenaltyTxRateAdaptive( H2C_Parameter[5] = 0xf9; //MCS5 or OFDM36 } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set WiFi Low-Penalty Retry: %s", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", (bLowPenaltyRa? "ON!!":"OFF!!")) ); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); @@ -1078,13 +1063,13 @@ halbtc8192e2ant_LowPenaltyRa( ) { //return; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) @@ -1103,7 +1088,7 @@ halbtc8192e2ant_SetDacSwingReg( { u1Byte val=(u1Byte)level; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x883, 0x3e, val); } @@ -1133,14 +1118,14 @@ halbtc8192e2ant_DacSwing( IN u4Byte dacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl)); pCoexDm->bCurDacSwingOn = bDacSwingOn; pCoexDm->curDacSwingLvl = dacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl)); @@ -1163,12 +1148,12 @@ halbtc8192e2ant_SetAdcBackOff( { if(bAdcBackOff) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level On!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x3); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level Off!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x1); } } @@ -1180,13 +1165,13 @@ halbtc8192e2ant_AdcBackOff( IN BOOLEAN bAdcBackOff ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn AdcBackOff = %s\n", (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF"))); pCoexDm->bCurAdcBackOff = bAdcBackOff; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff)); if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) @@ -1208,7 +1193,7 @@ halbtc8192e2ant_SetAgcTable( //=================BB AGC Gain Table if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB Agc Table On!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x0a1A0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x091B0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x081C0001); @@ -1218,7 +1203,7 @@ halbtc8192e2ant_SetAgcTable( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB Agc Table Off!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xaa1A0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa91B0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa81C0001); @@ -1232,13 +1217,13 @@ halbtc8192e2ant_SetAgcTable( pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000); if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38fff); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38ffe); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x380c3); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28ce6); } @@ -1247,13 +1232,13 @@ halbtc8192e2ant_SetAgcTable( pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x1); if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38fff); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38ffe); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x380c3); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x28ce6); } @@ -1276,13 +1261,13 @@ halbtc8192e2ant_AgcTable( IN BOOLEAN bAgcTableEn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s %s Agc Table\n", (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable"))); pCoexDm->bCurAgcTableEn = bAgcTableEn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn)); if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) @@ -1302,16 +1287,16 @@ halbtc8192e2ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -1325,7 +1310,7 @@ halbtc8192e2ant_CoexTable( IN u1Byte val0x6cc ) { - 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", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c4 = val0x6c4; @@ -1334,9 +1319,9 @@ halbtc8192e2ant_CoexTable( if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && @@ -1360,6 +1345,8 @@ halbtc8192e2ant_CoexTableWithType( IN u1Byte type ) { + pCoexSta->nCoexTableType = type; + switch(type) { case 0: @@ -1377,7 +1364,21 @@ halbtc8192e2ant_CoexTableWithType( case 4: halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0xdfffdfff, 0x5ffb5ffb, 0xffffff, 0x3); break; - + case 5: + halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5ddd5ddd, 0x5fdb5fdb, 0xffffff, 0x3); + break; + case 6: + halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 7: + if(pCoexSta->nScanAPNum <= NOISY_AP_NUM_THRESH) + halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xfafafafa, 0xffffff, 0x3); + else + halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 8: + halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5f5f5f5f, 0x5a5a5a5a, 0xffffff, 0x3); + break; default: break; } @@ -1396,12 +1397,13 @@ halbtc8192e2ant_SetFwIgnoreWlanAct( H2C_Parameter[0] |= BIT0; // function enable } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter); } + VOID halbtc8192e2ant_IgnoreWlanAct( IN PBTC_COEXIST pBtCoexist, @@ -1409,13 +1411,13 @@ halbtc8192e2ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) @@ -1426,6 +1428,59 @@ halbtc8192e2ant_IgnoreWlanAct( pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct; } + +VOID +halbtc8192e2ant_SetLpsRpwm( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte lpsVal, + IN u1Byte rpwmVal + ) +{ + u1Byte lps=lpsVal; + u1Byte rpwm=rpwmVal; + + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm); +} + + +VOID +halbtc8192e2ant_LpsRpwm( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte lpsVal, + IN u1Byte rpwmVal + ) +{ + BOOLEAN bForceExecPwrCmd=FALSE; + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", + (bForceExec? "force to":""), lpsVal, rpwmVal)); + pCoexDm->curLps = lpsVal; + pCoexDm->curRpwm = rpwmVal; + + if(!bForceExec) + { + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], preLps/curLps=0x%x/0x%x, preRpwm/curRpwm=0x%x/0x%x!!\n", + pCoexDm->preLps, pCoexDm->curLps, pCoexDm->preRpwm, pCoexDm->curRpwm)); + + if( (pCoexDm->preLps == pCoexDm->curLps) && + (pCoexDm->preRpwm == pCoexDm->curRpwm) ) + { + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], LPS-RPWM_Last=0x%x , LPS-RPWM_Now=0x%x!!\n", + pCoexDm->preRpwm, pCoexDm->curRpwm)); + + return; + } + } + halbtc8192e2ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal); + + pCoexDm->preLps = pCoexDm->curLps; + pCoexDm->preRpwm = pCoexDm->curRpwm; +} + + + VOID halbtc8192e2ant_SetFwPstdma( IN PBTC_COEXIST pBtCoexist, @@ -1437,26 +1492,44 @@ halbtc8192e2ant_SetFwPstdma( ) { u1Byte H2C_Parameter[5] ={0}; + u1Byte realByte1=byte1, realByte5=byte5; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + if(bApEnable) + { + if(byte1&BIT4 && !(byte1&BIT5)) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FW for 1Ant AP mode\n")); + realByte1 &= ~BIT4; + realByte1 |= BIT5; + + realByte5 |= BIT5; + realByte5 &= ~BIT6; + } + } - H2C_Parameter[0] = byte1; + H2C_Parameter[0] = realByte1; H2C_Parameter[1] = byte2; H2C_Parameter[2] = byte3; H2C_Parameter[3] = byte4; - H2C_Parameter[4] = byte5; + H2C_Parameter[4] = realByte5; - pCoexDm->psTdmaPara[0] = byte1; + pCoexDm->psTdmaPara[0] = realByte1; pCoexDm->psTdmaPara[1] = byte2; pCoexDm->psTdmaPara[2] = byte3; pCoexDm->psTdmaPara[3] = byte4; - pCoexDm->psTdmaPara[4] = byte5; + pCoexDm->psTdmaPara[4] = realByte5; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", H2C_Parameter[0], H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter); } + VOID halbtc8192e2ant_SwMechanism1( IN PBTC_COEXIST pBtCoexist, @@ -1561,75 +1634,103 @@ halbtc8192e2ant_PsTdma( { BOOLEAN bTurnOnByCnt=FALSE; u1Byte psTdmaTypeByCnt=0; + s1Byte nWiFiDurationAdjust = 0x0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); pCoexDm->bCurPsTdmaOn = bTurnOn; pCoexDm->curPsTdma = type; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", pCoexDm->prePsTdma, pCoexDm->curPsTdma)); if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) return; } + + if (pCoexSta->nScanAPNum >= 40) + nWiFiDurationAdjust = -15; + else if (pCoexSta->nScanAPNum >= 20) + nWiFiDurationAdjust = -10; + +/* + if (!pCoexSta->bForceLpsOn) //only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30 + { + psTdmaByte0Val = 0x61; //no null-pkt + psTdmaByte3Val = 0x11; // no tx-pause at BT-slot + psTdmaByte4Val = 0x10; // 0x778 = d/1 toggle + } + + + if ( (type == 3) || (type == 13) || (type == 14) ) + { + psTdmaByte4Val = psTdmaByte4Val & 0xbf; //no dynamic slot for multi-profile + + if (!bWifiBusy) + psTdmaByte4Val = psTdmaByte4Val | 0x1; //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) + } + + if (pBtLinkInfo->bSlaveRole == TRUE) + psTdmaByte4Val = psTdmaByte4Val | 0x1; //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) + +*/ if(bTurnOn) { switch(type) { case 1: - default: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); + default: //d1,wb + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x11, 0x10); break; case 2: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x11, 0x10); break; case 3: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x11, 0x10); break; case 4: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xf1, 0x90); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x11, 0x10); break; - case 5: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90); + case 5: //d1,pb,TXpause + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x3c, 0x03, 0x90, 0x10); break; case 6: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x32, 0x03, 0x90, 0x10); break; case 7: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x28, 0x03, 0x90, 0x10); break; - case 8: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90); + case 8: + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x1e, 0x03, 0x90, 0x10); break; - case 9: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x10); + case 9: //d1,bb + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x31, 0x10); break; case 10: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x10); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x31, 0x10); break; case 11: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x10); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x31, 0x10); break; case 12: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xf1, 0x10); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x31, 0x10); break; - case 13: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe0, 0x10); + case 13: //d1,bb,TXpause + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x30, 0x10); break; case 14: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe0, 0x10); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x30, 0x10); break; case 15: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf0, 0x10); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x30, 0x10); break; case 16: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x3, 0xf0, 0x10); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x30, 0x10); break; case 17: halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x03, 0x10, 0x10); @@ -1644,11 +1745,35 @@ halbtc8192e2ant_PsTdma( halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90); break; case 21: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90); + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x03, 0x11, 0x11); break; case 71: halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); break; + + // following cases is for wifi rssi low // bad antenna isolation, started from 81 + case 80: + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x3c, 0x3, 0x90, 0x50); + break; + case 81: + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x3a+nWiFiDurationAdjust, 0x3, 0x90, 0x50); + break; + case 82: + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x30+nWiFiDurationAdjust, 0x03, 0x90, 0x50); + break; + case 83: + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x21, 0x03, 0x90, 0x50); + break; + case 84: + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x15, 0x3, 0x90, 0x50); + break; + case 85: + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x1d, 0x1d, 0x80, 0x50); + break; + case 86: + halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x15, 0x15, 0x80, 0x50); + break; + } } else @@ -1684,7 +1809,7 @@ halbtc8192e2ant_SetSwitchSsType( u1Byte mimoPs=BTC_MIMO_PS_DYNAMIC; u4Byte disRaMask=0x0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], REAL set SS Type = %d\n", ssType)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], REAL set SS Type = %d\n", ssType)); disRaMask = halbtc8192e2ant_DecideRaMask(pBtCoexist, ssType, pCoexDm->curRaMaskType); halbtc8192e2ant_UpdateRaMask(pBtCoexist, FORCE_EXEC, disRaMask); @@ -1697,7 +1822,6 @@ halbtc8192e2ant_SetSwitchSsType( pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xd04, 0x1); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x90c, 0x81111111); // switch cck patch - //Jenyu suggest to remove 0xe77 this line for tx issue //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x1); //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xa07, 0x81); mimoPs=BTC_MIMO_PS_STATIC; @@ -1708,7 +1832,7 @@ halbtc8192e2ant_SetSwitchSsType( pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xc04, 0x33); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xd04, 0x3); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x90c, 0x81121313); - //Jenyu suggest to remove 0xe77 this line for tx issue + // remove, if 0xe77[2]=0x0 then CCK will fail, advised by Jenyu //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x0); //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xa07, 0x41); mimoPs=BTC_MIMO_PS_DYNAMIC; @@ -1724,7 +1848,7 @@ halbtc8192e2ant_SwitchSsType( IN u1Byte newSsType ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], %s Switch SS Type = %d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], %s Switch SS Type = %d\n", (bForceExec? "force to":""), newSsType)); pCoexDm->curSsType = newSsType; @@ -1738,12 +1862,89 @@ halbtc8192e2ant_SwitchSsType( pCoexDm->preSsType = pCoexDm->curSsType; } +VOID +halbtc8192e2ant_PsTdmaCheckForPowerSaveState( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bNewPsState + ) +{ + u1Byte lpsMode=0x0; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode); + + if(lpsMode) // already under LPS state + { + if(bNewPsState) + { + // keep state under LPS, do nothing. + } + else + { + // will leave LPS state, turn off psTdma first + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + } + } + else // NO PS state + { + if(bNewPsState) + { + // will enter LPS state, turn off psTdma first + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + } + else + { + // keep state under NO PS state, do nothing. + } + } +} + +VOID +halbtc8192e2ant_PowerSaveState( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte psType, + IN u1Byte lpsVal, + IN u1Byte rpwmVal + ) +{ + BOOLEAN bLowPwrDisable=FALSE; + + switch(psType) + { + case BTC_PS_WIFI_NATIVE: + // recover to original 32k low power setting + bLowPwrDisable = TRUE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL); + pCoexSta->bForceLpsOn = FALSE; + break; + case BTC_PS_LPS_ON: + halbtc8192e2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE); + halbtc8192e2ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal); + // when coex force to enter LPS, do not enter 32k low power. + bLowPwrDisable = TRUE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); + // power save must executed before psTdma. + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL); + pCoexSta->bForceLpsOn = TRUE; + break; + case BTC_PS_LPS_OFF: + halbtc8192e2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL); + pCoexSta->bForceLpsOn = FALSE; + break; + default: + break; + } +} + + VOID halbtc8192e2ant_CoexAllOff( IN PBTC_COEXIST pBtCoexist ) { // fw all off + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); @@ -1763,6 +1964,7 @@ halbtc8192e2ant_InitCoexDm( { // force to reset coex mechanism + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6); halbtc8192e2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0); @@ -1779,14 +1981,15 @@ halbtc8192e2ant_ActionBtInquiry( IN PBTC_COEXIST pBtCoexist ) { - BOOLEAN bLowPwrDisable=TRUE; +// BOOLEAN bLowPwrDisable=TRUE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); +// pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); +// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21); halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); @@ -1794,6 +1997,14 @@ halbtc8192e2ant_ActionBtInquiry( halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } +VOID +halbtc8192e2ant_ActionWiFiLinkProcess( + IN PBTC_COEXIST pBtCoexist + ) +{ + +} + BOOLEAN halbtc8192e2ant_IsCommonAction( IN PBTC_COEXIST pBtCoexist @@ -1818,21 +2029,23 @@ halbtc8192e2ant_IsCommonAction( if(!bWifiConnected) { - bLowPwrDisable = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-connected idle!!\n")); +// bLowPwrDisable = FALSE; +// pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); + + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non-connected idle!!\n")); if( (BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) || (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2); +// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2); halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); } else { - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); +// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); } @@ -1849,13 +2062,13 @@ halbtc8192e2ant_IsCommonAction( { if(BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) { - bLowPwrDisable = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); +// bLowPwrDisable = FALSE; +// pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); - - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); +// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); @@ -1867,15 +2080,16 @@ halbtc8192e2ant_IsCommonAction( } else if(BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) { - bLowPwrDisable = TRUE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); +// bLowPwrDisable = TRUE; +// pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); if(bBtHsOn) return FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); +// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); @@ -1887,20 +2101,21 @@ halbtc8192e2ant_IsCommonAction( } else { - bLowPwrDisable = TRUE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); +// bLowPwrDisable = TRUE; +// pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); if(bWifiBusy) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); bCommon = FALSE; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); +// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21); halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); @@ -1913,6 +2128,8 @@ halbtc8192e2ant_IsCommonAction( return bCommon; } + + VOID halbtc8192e2ant_TdmaDurationAdjust( IN PBTC_COEXIST pBtCoexist, @@ -1925,12 +2142,12 @@ halbtc8192e2ant_TdmaDurationAdjust( s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjust()\n")); if(!pCoexDm->bAutoTdmaAdjust) { pCoexDm->bAutoTdmaAdjust = TRUE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); { if(bScoHid) { @@ -2043,8 +2260,8 @@ halbtc8192e2ant_TdmaDurationAdjust( { //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], retryCount = %d\n", retryCount)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", up, dn, m, n, WaitCount)); result = 0; WaitCount++; @@ -2064,7 +2281,7 @@ halbtc8192e2ant_TdmaDurationAdjust( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -2090,7 +2307,7 @@ halbtc8192e2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -2108,22 +2325,17 @@ halbtc8192e2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval)); if(maxInterval == 1) { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); - if(pCoexDm->curPsTdma == 71) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - pCoexDm->psTdmaDuAdjType = 5; - } - else if(pCoexDm->curPsTdma == 1) + if(pCoexDm->curPsTdma == 1) { halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); pCoexDm->psTdmaDuAdjType = 5; @@ -2233,11 +2445,11 @@ halbtc8192e2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71); - pCoexDm->psTdmaDuAdjType = 71; + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); + pCoexDm->psTdmaDuAdjType = 1; } else if(pCoexDm->curPsTdma == 6) { @@ -2277,12 +2489,7 @@ halbtc8192e2ant_TdmaDurationAdjust( if(result == -1) { - if(pCoexDm->curPsTdma == 71) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); - pCoexDm->psTdmaDuAdjType = 1; - } - else if(pCoexDm->curPsTdma == 1) + if(pCoexDm->curPsTdma == 1) { halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); pCoexDm->psTdmaDuAdjType = 2; @@ -2330,11 +2537,6 @@ halbtc8192e2ant_TdmaDurationAdjust( halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); pCoexDm->psTdmaDuAdjType = 1; } - else if(pCoexDm->curPsTdma == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71); - pCoexDm->psTdmaDuAdjType = 71; - } else if(pCoexDm->curPsTdma == 12) { halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); @@ -2357,7 +2559,7 @@ halbtc8192e2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); @@ -2467,7 +2669,7 @@ halbtc8192e2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); @@ -2580,7 +2782,7 @@ halbtc8192e2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); @@ -2690,7 +2892,7 @@ halbtc8192e2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); @@ -2806,7 +3008,7 @@ halbtc8192e2ant_TdmaDurationAdjust( if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); @@ -2819,392 +3021,725 @@ halbtc8192e2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); } } } -// SCO only or SCO+PAN(HS) VOID -halbtc8192e2ant_ActionSco( - IN PBTC_COEXIST pBtCoexist +halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow( + IN PBTC_COEXIST pBtCoexist//, + //IN u1Byte wifiStatus ) { - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_STAY_LOW; - u4Byte wifiBw; - - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - - halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + static s4Byte up,dn,m,n,WaitCount; + s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration + u1Byte retryCount=0, btInfoExt; + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow()\n")); +#if 0 + if( (BT_8192E_2ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) || + (BT_8192E_2ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) || + (BT_8192E_2ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) ) + { + if( pCoexDm->curPsTdma != 81 && + pCoexDm->curPsTdma != 82 && + pCoexDm->curPsTdma != 83 && + pCoexDm->curPsTdma != 84 ) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82); + pCoexDm->psTdmaDuAdjType = 82; - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + up = 0; + dn = 0; + m = 1; + n= 3; + result = 0; + WaitCount = 0; + } + return; + } +#endif + pCoexDm->bAutoTdmaAdjust = FALSE; - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + retryCount = pCoexSta->btRetryCnt; + btInfoExt = pCoexSta->btInfoExt; - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) + if(!pCoexDm->bAutoTdmaAdjustLowRssi) { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - } - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + pCoexDm->bAutoTdmaAdjustLowRssi = TRUE; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjustForWifiRssiLow()!!\n")); - // sw mechanism - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) +/* + if(BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(btInfoExt)) { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x6); + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83); + pCoexDm->psTdmaDuAdjType = 83; } else +*/ { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x6); - } + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 81); + pCoexDm->psTdmaDuAdjType = 81; + } + //============ + up = 0; + dn = 0; + m = 1; + n= 3; + result = 0; + WaitCount = 0; } else { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x6); - } - else + //accquire the BT TRx retry count from BT_Info byte2 +// retryCount = pCoexSta->btRetryCnt; +// btInfoExt = pCoexSta->btInfoExt; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], retryCount = %d\n", retryCount)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", + up, dn, m, n, WaitCount)); + result = 0; + WaitCount++; + + if ( (pCoexSta->lowPriorityTx) > 1050 || (pCoexSta->lowPriorityRx) > 1250 ) + retryCount++; + + if(retryCount == 0) // no retry in the last 2-second duration { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x6); - } - } -} - -VOID -halbtc8192e2ant_ActionScoPan( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_STAY_LOW; - u4Byte wifiBw; + up++; + dn--; - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); + if (dn <= 0) + dn = 0; - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + if(up >= n) // if ³sÄò n ­Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration + { + WaitCount = 0; + n = 3; + up = 0; + dn = 0; + result = 1; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); + } + } + else if (retryCount <= 3) // <=3 retry in the last 2-second duration + { + up--; + dn++; - halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + if (up <= 0) + up = 0; - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + if (dn == 2) // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration + { + if (WaitCount <= 2) + m++; // ÁקK¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^ + else + m = 1; - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration. + m = 20; - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - } - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - - // sw mechanism - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + n = 3*m; + up = 0; + dn = 0; + WaitCount = 0; + result = -1; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + } + } + else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x6); + if (WaitCount == 1) + m++; // ÁקK¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^ + else + m = 1; + + if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration. + m = 20; + + n = 3*m; + up = 0; + dn = 0; + WaitCount = 0; + result = -1; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } - else + + if(result == -1) { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x6); - } - } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) +/* + if( (BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(btInfoExt)) && + ((pCoexDm->curPsTdma == 81) ||(pCoexDm->curPsTdma == 82)) ) + if( (BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(btInfoExt)) && + ((pCoexDm->curPsTdma == 81) ||(pCoexDm->curPsTdma == 82)) ) + + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 84); + pCoexDm->psTdmaDuAdjType = 84; + } +*/ + if(pCoexDm->curPsTdma == 80) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 81); + pCoexDm->psTdmaDuAdjType = 81; + } + else if(pCoexDm->curPsTdma == 81) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82); + pCoexDm->psTdmaDuAdjType = 82; + } + else if(pCoexDm->curPsTdma == 82) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83); + pCoexDm->psTdmaDuAdjType = 83; + } + else if(pCoexDm->curPsTdma == 83) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 84); + pCoexDm->psTdmaDuAdjType = 84; + } + } + else if(result == 1) { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x6); +/* + if( (BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(btInfoExt)) && + ((pCoexDm->curPsTdma == 81) ||(pCoexDm->curPsTdma == 82)) ) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83); + pCoexDm->psTdmaDuAdjType = 83; + } +*/ + if(pCoexDm->curPsTdma == 84) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83); + pCoexDm->psTdmaDuAdjType = 83; + } + else if(pCoexDm->curPsTdma == 83) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82); + pCoexDm->psTdmaDuAdjType = 82; + } + else if(pCoexDm->curPsTdma == 82) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 81); + pCoexDm->psTdmaDuAdjType = 81; + } + else if((pCoexDm->curPsTdma == 81)&&((pCoexSta->nScanAPNum <= NOISY_AP_NUM_THRESH))) + { + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 80); + pCoexDm->psTdmaDuAdjType = 80; + } + } - else + + if( pCoexDm->curPsTdma != 80 && + pCoexDm->curPsTdma != 81 && + pCoexDm->curPsTdma != 82 && + pCoexDm->curPsTdma != 83 && + pCoexDm->curPsTdma != 84 ) { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x6); - } + // recover to previous adjust type + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType); + } } } VOID -halbtc8192e2ant_ActionHid( - IN PBTC_COEXIST pBtCoexist +halbtc8192e2ant_GetBtRssiThreshold( + IN PBTC_COEXIST pBtCoexist, + IN pu1Byte pThres0, + IN pu1Byte pThres1 ) { - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH; - u4Byte wifiBw; + u1Byte antType, btThreshold=0; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &antType); - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + switch(antType) + { + case BTC_ANT_TYPE_0: // 92E with SPDT + *pThres0 = 100; + *pThres1 = 100; + break; + case BTC_ANT_TYPE_1: //92E without SPDT, poor antenna isolation + *pThres0 = 34; + *pThres1 = 42; + break; + case BTC_ANT_TYPE_2: //92E without SPDT, normal antenna isolation + *pThres0 = 34; //92E with coupler, goodl antenna isolation + *pThres1 = 42; + break; + case BTC_ANT_TYPE_3: + *pThres0 = 34; + *pThres1 = 42; + break; + case BTC_ANT_TYPE_4: + *pThres0 = 34; + *pThres1 = 42; + break; + default: + break; + } +} + + +//undefined +VOID +halbtc8192e2ant_ActionUndefined( + IN PBTC_COEXIST pBtCoexist + ) +{ + // power save state + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + // coex table + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + // pstdma + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + + // decrease BT power + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); + // limited Rx halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + // fw dac swing level halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + // sw mechanism + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); +} - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { +// SCO only or SCO+PAN(HS) +VOID +halbtc8192e2ant_ActionSco( + IN PBTC_COEXIST pBtCoexist + ) +{ + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; + u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + halbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1); + + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + // btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + + // power save state + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + // halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, TRUE, 0x50, 0x4); + + // coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + else + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + // pstdma + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + else + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + + // decrease BT power halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - } + + // limited Rx + halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + // fw dac swing level + halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); // sw mechanism - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } -//A2DP only / PAN(EDR) only/ A2DP+PAN(HS) VOID -halbtc8192e2ant_ActionA2dp( +halbtc8192e2ant_ActionScoPan( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; - BOOLEAN bLongDist=FALSE; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); - if( (btRssiState == BTC_RSSI_STATE_LOW||btRssiState == BTC_RSSI_STATE_STAY_LOW) && - (wifiRssiState == BTC_RSSI_STATE_LOW||wifiRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2dp, wifi/bt rssi both LOW!!\n")); - bLongDist = TRUE; - } - if(bLongDist) - { - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x4); - } + halbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1); + + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + // btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + + // power save state + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); else - { - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - } + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + + // coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + else + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + // pstdm + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); //shielding room + else if (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 10); //open space //antenna at BT + else //low RSSI + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86); + + + + // decrease BT power + if(BTC_RSSI_LOW(btRssiState)) + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + else if(BTC_RSSI_MEDIUM(btRssiState)) + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH) // BT HIGH RSSI & shielding room + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); + + // limited Rx + halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + // fw dac swing level halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - if(bLongDist) - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - else - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + // sw mechanism + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //shielding room + else if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //open space + else //low RSSI + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); +} + +VOID +halbtc8192e2ant_ActionHid( + IN PBTC_COEXIST pBtCoexist + ) +{ + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; + u4Byte wifiBw; + u1Byte anttype=0; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &anttype); +// halbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); +// btRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1); - if(bLongDist) + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + + if(anttype == 0)//ANTTYPE = 0 92E 2ant with SPDT { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 17); - pCoexDm->bAutoTdmaAdjust = FALSE; - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + // power save state & pstdma & coex table + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } - else - { - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1); - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1); - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else if(anttype == 1) //92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation + { + // power save state & pstdma & coex table + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + } + else if(anttype == 2)//ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); + } + else //WIFI RSSI || BT RSSI == low { - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1); - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); } } - - // sw mechanism - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + else if(anttype == 3) //ANTTYPE = 3, 92E 3ant with good ant. isolation + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + } - else + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + } + else //WIFI RSSI || BT RSSI == low { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + else //ANTTYPE = 4 for test + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } - else + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } + else //WIFI RSSI || BT RSSI == low { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } } + + // power save state + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + // coex table + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + // pstdma + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + + // decrease BT power + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + // limited Rx + halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + // fw dac swing level + halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + + // sw mechanism + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } +//A2DP only / PAN(EDR) only/ A2DP+PAN(HS) VOID -halbtc8192e2ant_ActionA2dpPanHs( +halbtc8192e2ant_ActionA2dp( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte anttype=0; + BOOLEAN bApEnable=FALSE; - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &anttype); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); +// halbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); +// btRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1); - halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) +// anttype = 4; + + if(anttype == 0)//ANTTYPE = 0 92E 2ant with SPDT { - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2); - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + } + else //WIFI RSSI || BT RSSI == low + { + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 2); - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else if(anttype == 1) //92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1); //shielding room + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + } + else //WIFI RSSI || BT RSSI == low + { + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } + } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 2); - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); + else if(anttype == 2)//ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); + } + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + } + else //WIFI RSSI || BT RSSI == low + { + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } } + else if(anttype == 3) //ANTTYPE = 3, 92E 3ant with good ant. isolation + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - // sw mechanism - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6); } - else + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + } + else //WIFI RSSI || BT RSSI == low { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x6); + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6); + else //ANTTYPE = 4 for test + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } - else + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } + else //WIFI RSSI || BT RSSI == low { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x6); - } + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } } + + // decrease BT power + if(BTC_RSSI_LOW(btRssiState)) + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + else if(BTC_RSSI_MEDIUM(btRssiState)) + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH) // BT HIGH RSSI & shielding room + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); + + // limited Rx + halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + // fw dac swing level + halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + + // sw mechanism + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //shielding room + else if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x06); //open space + else //low RSSI + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } VOID -halbtc8192e2ant_ActionPanEdr( +halbtc8192e2ant_ActionA2dpPanHs( IN PBTC_COEXIST pBtCoexist ) { @@ -3214,134 +3749,104 @@ halbtc8192e2ant_ActionPanEdr( wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); +// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); if( (btRssiState == BTC_RSSI_STATE_LOW) || (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) { + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2); halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); } else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) { + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 2); halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); } else if( (btRssiState == BTC_RSSI_STATE_HIGH) || (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 2); halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); } - + // sw mechanism pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } -//PAN(HS) only VOID -halbtc8192e2ant_ActionPanHs( +halbtc8192e2ant_ActionPanEdr( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + halbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1); - halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + // btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + // power save state + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { + // coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + // pstdma + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); //shielding room + else if (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); //open space //antenna at BT + else //low RSSI + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 85); + + + // decrease BT power + if(BTC_RSSI_LOW(btRssiState)) halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { + else if(BTC_RSSI_MEDIUM(btRssiState)) halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { + else if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH) // BT HIGH RSSI & shielding room halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - } - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } + + // limited Rx + halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + // fw dac swing level + halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + + // sw mechanism + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //shielding room + else if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //open space + else //low RSSI + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } -//PAN(EDR)+A2DP +//PAN(HS) only VOID -halbtc8192e2ant_ActionPanEdrA2dp( +halbtc8192e2ant_ActionPanHs( IN PBTC_COEXIST pBtCoexist ) { @@ -3351,272 +3856,417 @@ halbtc8192e2ant_ActionPanEdrA2dp( wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); +// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - if( (btRssiState == BTC_RSSI_STATE_LOW) || (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) { halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3); } else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) { halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); } else if( (btRssiState == BTC_RSSI_STATE_HIGH) || (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); - } - - // sw mechanism - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } } + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } +//PAN(EDR)+A2DP VOID -halbtc8192e2ant_ActionPanEdrHid( +halbtc8192e2ant_ActionPanEdrA2dp( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + halbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + // btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + // power save state + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); + // coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { + // pstdma + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); //shielding room + else if (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); //open space //antenna at BT + else //low RSSI +{ + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86); +} + + // decrease BT power + if(BTC_RSSI_LOW(btRssiState)) halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { + else if(BTC_RSSI_MEDIUM(btRssiState)) halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { + else if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH) // BT HIGH RSSI & shielding room halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - } + + + // limited Rx + halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + // fw dac swing level + halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); // sw mechanism - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //shielding room + else if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //open space + else //low RSSI + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } -// HID+A2DP+PAN(EDR) VOID -halbtc8192e2ant_ActionHidA2dpPanEdr( +halbtc8192e2ant_ActionPanEdrHid( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + halbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1); - halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + // btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + // power save state + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); + // coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); + else + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { + // pstdm + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); //shielding room + else if (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); //open space //antenna at BT + else //low RSSI + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86); + + + // decrease BT power + if(BTC_RSSI_LOW(btRssiState)) halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { + else if(BTC_RSSI_MEDIUM(btRssiState)) halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3); - } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { + else if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH) // BT HIGH RSSI & shielding room halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3); - } + + // limited Rx + halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + // fw dac swing level + halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + // sw mechanism - if(BTC_WIFI_BW_HT40 == wifiBw) - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - } - } + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //shielding room + else if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //open space + else //low RSSI + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } +// HID+A2DP+PAN(EDR) VOID -halbtc8192e2ant_ActionHidA2dp( +halbtc8192e2ant_ActionHidA2dpPanEdr( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); - halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + halbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + // btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); + // power save state + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + + // coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); + else + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); //6 + + // pstdma + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3); //shielding room + else if (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3); //open space //antenna at BT + else //low RSSI + { + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86); + } - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { + // decrease BT power + if(BTC_RSSI_LOW(btRssiState)) halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { + else if(BTC_RSSI_MEDIUM(btRssiState)) halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2); - } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { + else if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH) // BT HIGH RSSI & shielding room halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2); - } + + // limited Rx + halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + // fw dac swing level + halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); // sw mechanism - if(BTC_WIFI_BW_HT40 == wifiBw) + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //shielding room + else if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //open space + else //low RSSI + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); +} + +VOID +halbtc8192e2ant_ActionHidA2dp( + IN PBTC_COEXIST pBtCoexist + ) +{ + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; + u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0, anttype=0; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &anttype); + + // halbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + // btRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1); + + wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); + + if(anttype == 0)//ANTTYPE = 0 92E 2ant with SPDT { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8); + + } + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } else { - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8); } } - else - { - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + else if(anttype == 1) //92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8); + } + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } else { - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8); + } + } + else if(anttype == 2)//ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8); + } + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8); + } + else //WIFI RSSI || BT RSSI == low + { + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8); + } + } + else if(anttype == 3) //ANTTYPE = 3, 92E 3ant with good ant. isolation + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + } + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + } + else //WIFI RSSI || BT RSSI == low + { + pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } } + else //ANTTYPE = 4 for test + { + // power save state & pstdma & coex table + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & shielding room + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } + else if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + { //WIFI RSSI = high & BT RSSI = high & noisy enviroment + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } + else //WIFI RSSI || BT RSSI == low + { + halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); + halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + } + } + + // decrease BT power + if(BTC_RSSI_LOW(btRssiState)) + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + else if(BTC_RSSI_MEDIUM(btRssiState)) + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH) // BT HIGH RSSI & shielding room + halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); + + + // limited Rx + halbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + // fw dac swing level + halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + + // sw mechanism + halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); //shielding room + else if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH)) + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x06); //open space + else //low RSSI + halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); +} + +VOID +halbtc8192e2ant_ActionBtWhckTest( + IN PBTC_COEXIST pBtCoexist + ) +{ + +} + +VOID +halbtc8192e2ant_ActionWifiMultiPort( + IN PBTC_COEXIST pBtCoexist + ) +{ + } VOID @@ -3628,93 +4278,95 @@ halbtc8192e2ant_RunCoexistMechanism( u1Byte btInfoOriginal=0, btRetryCnt=0; u1Byte algorithm=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n")); if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); return; } if(pCoexSta->bUnderIps) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS !!!\n")); return; } algorithm = halbtc8192e2ant_ActionAlgorithm(pBtCoexist); if(pCoexSta->bC2hBtInquiryPage && (BT_8192E_2ANT_COEX_ALGO_PANHS!=algorithm)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under inquiry/page scan !!\n")); halbtc8192e2ant_ActionBtInquiry(pBtCoexist); return; } pCoexDm->curAlgorithm = algorithm; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); if(halbtc8192e2ant_IsCommonAction(pBtCoexist)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant common.\n")); pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; } else { if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", pCoexDm->preAlgorithm, pCoexDm->curAlgorithm)); pCoexDm->bAutoTdmaAdjust = FALSE; + pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; } switch(pCoexDm->curAlgorithm) { case BT_8192E_2ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); halbtc8192e2ant_ActionSco(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_SCO_PAN: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO+PAN(EDR).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO+PAN(EDR).\n")); halbtc8192e2ant_ActionScoPan(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); halbtc8192e2ant_ActionHid(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); halbtc8192e2ant_ActionA2dp(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); halbtc8192e2ant_ActionA2dpPanHs(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); halbtc8192e2ant_ActionPanEdr(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); halbtc8192e2ant_ActionPanHs(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); halbtc8192e2ant_ActionPanEdrA2dp(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); halbtc8192e2ant_ActionPanEdrHid(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); halbtc8192e2ant_ActionHidA2dpPanEdr(pBtCoexist); break; case BT_8192E_2ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); halbtc8192e2ant_ActionHidA2dp(pBtCoexist); break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = unknown!!\n")); - //halbtc8192e2ant_CoexAllOff(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = undefined!!\n")); + halbtc8192e2ant_ActionUndefined(pBtCoexist); break; } pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; @@ -3731,7 +4383,7 @@ halbtc8192e2ant_InitHwConfig( u2Byte u2Tmp=0; u1Byte u1Tmp=0; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Init HW Config!!\n")); if(bBackUp) { @@ -3813,7 +4465,7 @@ EXhalbtc8192e2ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); halbtc8192e2ant_InitCoexDm(pBtCoexist); } @@ -3847,6 +4499,10 @@ EXhalbtc8192e2ant_DisplayCoexInfo( pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum); CL_PRINTF(cliBuf); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Antenna type:", \ + pBoardInfo->antType); + CL_PRINTF(cliBuf); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \ ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion); CL_PRINTF(cliBuf); @@ -3861,7 +4517,7 @@ EXhalbtc8192e2ant_DisplayCoexInfo( pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1], pCoexDm->wifiChnlInfo[2]); CL_PRINTF(cliBuf); - + // wifi status CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); CL_PRINTF(cliBuf); @@ -3898,11 +4554,11 @@ EXhalbtc8192e2ant_DisplayCoexInfo( CL_PRINTF(cliBuf); } } - +/* CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "SS Type", \ pCoexDm->curSsType); CL_PRINTF(cliBuf); - +*/ // Sw mechanism CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============"); CL_PRINTF(cliBuf); @@ -4016,14 +4672,14 @@ EXhalbtc8192e2ant_IpsNotify( { if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); pCoexSta->bUnderIps = TRUE; halbtc8192e2ant_CoexAllOff(pBtCoexist); halbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); pCoexSta->bUnderIps = FALSE; } } @@ -4036,12 +4692,12 @@ EXhalbtc8192e2ant_LpsNotify( { if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); pCoexSta->bUnderLps = TRUE; } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); pCoexSta->bUnderLps = FALSE; } } @@ -4054,11 +4710,13 @@ EXhalbtc8192e2ant_ScanNotify( { if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum); + } } @@ -4070,11 +4728,11 @@ EXhalbtc8192e2ant_ConnectNotify( { if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); } } @@ -4095,13 +4753,14 @@ EXhalbtc8192e2ant_MediaStatusNotify( if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); } + // only 2.4G we need to inform bt the chnl mask pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl); if( (BTC_MEDIA_CONNECT == type) && @@ -4120,7 +4779,7 @@ EXhalbtc8192e2ant_MediaStatusNotify( pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1]; pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x66=0x%x\n", H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); @@ -4134,7 +4793,7 @@ EXhalbtc8192e2ant_SpecialPacketNotify( { if(type == BTC_PACKET_DHCP) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); } } @@ -4158,7 +4817,7 @@ EXhalbtc8192e2ant_BtInfoNotify( rspSource = BT_INFO_SRC_8192E_2ANT_WIFI_FW; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -4166,11 +4825,11 @@ EXhalbtc8192e2ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } @@ -4189,7 +4848,7 @@ EXhalbtc8192e2ant_BtInfoNotify( // because bt is reset and loss of the info. if( (pCoexSta->btInfoExt & BIT1) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(bWifiConnected) { @@ -4205,7 +4864,7 @@ EXhalbtc8192e2ant_BtInfoNotify( { if(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); halbtc8192e2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); } } @@ -4267,28 +4926,28 @@ EXhalbtc8192e2ant_BtInfoNotify( if(!(btInfo&BT_INFO_8192E_2ANT_B_CONNECTION)) { pCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); } else if(btInfo == BT_INFO_8192E_2ANT_B_CONNECTION) // connection exists but no busy { pCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); } else if((btInfo&BT_INFO_8192E_2ANT_B_SCO_ESCO) || (btInfo&BT_INFO_8192E_2ANT_B_SCO_BUSY)) { pCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_SCO_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); } else if(btInfo&BT_INFO_8192E_2ANT_B_ACL_BUSY) { pCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_ACL_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); } else { pCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_MAX; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); } if( (BT_8192E_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || @@ -4317,7 +4976,7 @@ EXhalbtc8192e2ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); halbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); halbtc8192e2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); @@ -4334,21 +4993,21 @@ EXhalbtc8192e2ant_Periodical( PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); if(disVerInfoCnt <= 5) { disVerInfoCnt += 1; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", GLCoexVerDate8192e2Ant, GLCoexVer8192e2Ant, fwVer, btPatchVer, btPatchVer)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); } #if(BT_AUTO_REPORT_ONLY_8192E_2ANT == 0) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h index 58cddce87a41..1876bf470892 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h @@ -12,7 +12,11 @@ #define BT_INFO_8192E_2ANT_B_SCO_ESCO BIT1 #define BT_INFO_8192E_2ANT_B_CONNECTION BIT0 +#define BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_) \ + (((_BT_INFO_EXT_&BIT0))? TRUE:FALSE) + #define BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT 2 +#define NOISY_AP_NUM_THRESH 5 typedef enum _BT_INFO_SRC_8192E_2ANT{ BT_INFO_SRC_8192E_2ANT_WIFI_FW = 0x0, @@ -61,10 +65,15 @@ typedef struct _COEX_DM_8192E_2ANT{ u1Byte psTdmaDuAdjType; BOOLEAN bResetTdmaAdjust; BOOLEAN bAutoTdmaAdjust; + BOOLEAN bAutoTdmaAdjustLowRssi; BOOLEAN bPrePsTdmaOn; BOOLEAN bCurPsTdmaOn; BOOLEAN bPreBtAutoReport; BOOLEAN bCurBtAutoReport; + u1Byte preLps; + u1Byte curLps; + u1Byte preRpwm; + u1Byte curRpwm; // sw mechanism BOOLEAN bPreRfRxLpfShrink; @@ -137,6 +146,22 @@ typedef struct _COEX_STA_8192E_2ANT{ BOOLEAN bC2hBtInquiryPage; u1Byte btRetryCnt; u1Byte btInfoExt; + u1Byte nScanAPNum; + + u4Byte nCRCOK_CCK; + u4Byte nCRCOK_11g; + u4Byte nCRCOK_11n; + u4Byte nCRCOK_11nAgg; + + u4Byte nCRCErr_CCK; + u4Byte nCRCErr_11g; + u4Byte nCRCErr_11n; + u4Byte nCRCErr_11nAgg; + + u1Byte nCoexTableType; + BOOLEAN bForceLpsOn; + + u1Byte disVerInfoCnt; }COEX_STA_8192E_2ANT, *PCOEX_STA_8192E_2ANT; //=========================================== diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c index 8ea08e87d3de..db5b42e48b3f 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c @@ -13,6 +13,11 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8723a1Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -52,7 +57,7 @@ halbtc8723a1ant_Reg0x550Bit3( u1tmp &= ~BIT3; } pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x550, u1tmp); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], set 0x550[3]=%d\n", (bSet? 1:0))); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], set 0x550[3]=%d\n", (bSet? 1:0))); } VOID @@ -66,7 +71,7 @@ halbtc8723a1ant_NotifyFwScan( if(BTC_SCAN_START == scanType) H2C_Parameter[0] = 0x1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Notify FW for wifi scan, write 0x3b=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Notify FW for wifi scan, write 0x3b=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x3b, 1, H2C_Parameter); @@ -83,7 +88,7 @@ halbtc8723a1ant_QueryBtInfo( H2C_Parameter[0] |= BIT0; // trigger - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x38=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Query Bt Info, FW write 0x38=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x38, 1, H2C_Parameter); @@ -98,7 +103,7 @@ halbtc8723a1ant_SetSwRfRxLpfCorner( if(bRxRfShrinkOn) { //Shrink RF Rx LPF corner - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xf0ff7); } else @@ -107,7 +112,7 @@ halbtc8723a1ant_SetSwRfRxLpfCorner( // After initialized, we can use pCoexDm->btRf0x1eBackup if(pBtCoexist->bInitilized) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup); } } @@ -120,15 +125,12 @@ halbtc8723a1ant_RfShrink( IN BOOLEAN bRxRfShrinkOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Rx RF Shrink = %s\n", (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF"))); pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", - pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); - if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) return; } @@ -149,12 +151,12 @@ halbtc8723a1ant_SetSwPenaltyTxRateAdaptive( tmpU1 |= BIT0; if(bLowPenaltyRa) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); tmpU1 &= ~BIT2; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set normal!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set normal!!\n")); tmpU1 |= BIT2; } @@ -169,15 +171,12 @@ halbtc8723a1ant_LowPenaltyRa( ) { return; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -194,13 +193,13 @@ halbtc8723a1ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -213,19 +212,14 @@ halbtc8723a1ant_CoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c0, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c8 = val0x6c8; pCoexDm->curVal0x6cc = val0x6cc; if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - + { if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) ) @@ -251,7 +245,7 @@ halbtc8723a1ant_SetFwIgnoreWlanAct( H2C_Parameter[0] |= BIT0; // function enable } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x25=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x25=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x25, 1, H2C_Parameter); @@ -264,15 +258,12 @@ halbtc8723a1ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -306,7 +297,7 @@ halbtc8723a1ant_SetFwPstdma( { if(type != 5 && type != 12) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FW for 1Ant AP mode\n")); realByte1 &= ~BIT4; realByte1 |= BIT5; @@ -327,7 +318,7 @@ halbtc8723a1ant_SetFwPstdma( pCoexDm->psTdmaPara[3] = byte4; pCoexDm->psTdmaPara[4] = realByte5; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x3a(5bytes)=0x%x%08x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x3a(5bytes)=0x%x%08x\n", H2C_Parameter[0], H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); @@ -342,18 +333,13 @@ halbtc8723a1ant_PsTdma( IN u1Byte type ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); pCoexDm->bCurPsTdmaOn = bTurnOn; pCoexDm->curPsTdma = type; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", - pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", - pCoexDm->prePsTdma, pCoexDm->curPsTdma)); - if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) return; @@ -515,9 +501,9 @@ halbtc8723a1ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx)); // reset counter @@ -554,23 +540,23 @@ halbtc8723a1ant_MonitorBtEnableDisable( btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); bPreBtDisabled = bBtDisabled; @@ -600,7 +586,7 @@ halbtc8723a1ant_TdmaDurationAdjust( pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); btState = pCoexDm->btStatus; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], TdmaDurationAdjust()\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], TdmaDurationAdjust()\n")); if(pCoexDm->psTdmaGlobalCnt != pCoexDm->psTdmaMonitorCnt) { pCoexDm->psTdmaMonitorCnt = 0; @@ -608,7 +594,7 @@ halbtc8723a1ant_TdmaDurationAdjust( } if(pCoexDm->psTdmaMonitorCnt == 0) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], first run BT A2DP + WiFi busy state!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], first run BT A2DP + WiFi busy state!!\n")); if(btState == BT_STATE_8723A_1ANT_ACL_ONLY_BUSY) { halbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); @@ -631,7 +617,7 @@ halbtc8723a1ant_TdmaDurationAdjust( { //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], retryCount = %d\n", retryCount)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], retryCount = %d\n", retryCount)); result = 0; WaitCount++; @@ -650,7 +636,7 @@ halbtc8723a1ant_TdmaDurationAdjust( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -676,7 +662,7 @@ halbtc8723a1ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -694,17 +680,17 @@ halbtc8723a1ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT TxRx counter H+L <= 1200\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT TxRx counter H+L <= 1200\n")); if(btState != BT_STATE_8723A_1ANT_ACL_ONLY_BUSY) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], NOT ACL only busy!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], NOT ACL only busy!\n")); if(BTC_WIFI_BW_HT40 != wifiBw) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], 20MHz\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 20MHz\n")); if(result == -1) { if(pCoexDm->curPsTdma == 22) @@ -748,14 +734,14 @@ halbtc8723a1ant_TdmaDurationAdjust( (pCoexDm->psTdmaDuAdjType != 24) && (pCoexDm->psTdmaDuAdjType != 25) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], duration case out of handle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], duration case out of handle!!\n")); halbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23); pCoexDm->psTdmaDuAdjType = 23; } } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], 40MHz\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 40MHz\n")); if(result == -1) { if(pCoexDm->curPsTdma == 23) @@ -799,7 +785,7 @@ halbtc8723a1ant_TdmaDurationAdjust( (pCoexDm->psTdmaDuAdjType != 25) && (pCoexDm->psTdmaDuAdjType != 27) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], duration case out of handle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], duration case out of handle!!\n")); halbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 24); pCoexDm->psTdmaDuAdjType = 24; } @@ -807,7 +793,7 @@ halbtc8723a1ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ACL only busy\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ACL only busy\n")); if (result == -1) { if(pCoexDm->curPsTdma == 1) @@ -852,7 +838,7 @@ halbtc8723a1ant_TdmaDurationAdjust( (pCoexDm->psTdmaDuAdjType != 9) && (pCoexDm->psTdmaDuAdjType != 11) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], duration case out of handle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], duration case out of handle!!\n")); halbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); pCoexDm->psTdmaDuAdjType = 2; } @@ -864,7 +850,7 @@ halbtc8723a1ant_TdmaDurationAdjust( // then we have to adjust it back to the previous record one. if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); @@ -877,7 +863,7 @@ halbtc8723a1ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); } } pCoexDm->psTdmaMonitorCnt++; @@ -899,14 +885,14 @@ halbtc8723a1ant_CoexForWifiConnect( if(bWifiConnected) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi connected!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi connected!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); if( !bWifiBusy && ((BT_STATE_8723A_1ANT_NO_CONNECTION == btState) || (BT_STATE_8723A_1ANT_CONNECT_IDLE == btState)) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], [Wifi is idle] or [Bt is non connected idle or Bt is connected idle]!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], [Wifi is idle] or [Bt is non connected idle or Bt is connected idle]!!\n")); if(BT_STATE_8723A_1ANT_NO_CONNECTION == btState) halbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); @@ -965,14 +951,14 @@ halbtc8723a1ant_CoexForWifiConnect( } break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], error!!!, undefined case in halbtc8723a1ant_CoexForWifiConnect()!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], error!!!, undefined case in halbtc8723a1ant_CoexForWifiConnect()!!\n")); break; } } } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is disconnected!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is disconnected!!\n")); } pCoexDm->psTdmaGlobalCnt++; @@ -1021,7 +1007,7 @@ EXhalbtc8723a1ant_InitHwConfig( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 1Ant Init HW Config!!\n")); // backup rf 0x1e value pCoexDm->btRf0x1eBackup = @@ -1053,7 +1039,7 @@ EXhalbtc8723a1ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); halbtc8723a1ant_InitCoexDm(pBtCoexist); } @@ -1090,7 +1076,7 @@ EXhalbtc8723a1ant_DisplayCoexInfo( pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1], pCoexDm->wifiChnlInfo[2]); CL_PRINTF(cliBuf); - + // wifi status CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); CL_PRINTF(cliBuf); @@ -1236,12 +1222,12 @@ EXhalbtc8723a1ant_IpsNotify( { if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); halbtc8723a1ant_CoexAllOff(pBtCoexist); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); //halbtc8723a1ant_InitCoexDm(pBtCoexist); } } @@ -1254,11 +1240,11 @@ EXhalbtc8723a1ant_LpsNotify( { if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); halbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); } } @@ -1282,7 +1268,7 @@ EXhalbtc8723a1ant_ScanNotify( pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); if(!bWifiConnected) // non-connected scan { //set 0x550[3]=1 before PsTdma @@ -1293,7 +1279,7 @@ EXhalbtc8723a1ant_ScanNotify( } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); if(!bWifiConnected) // non-connected scan { halbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); @@ -1322,14 +1308,14 @@ EXhalbtc8723a1ant_ConnectNotify( { if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); //set 0x550[3]=1 before PsTdma halbtc8723a1ant_Reg0x550Bit3(pBtCoexist, TRUE); halbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8); // extend wifi slot } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(!bWifiConnected) // non-connected scan { @@ -1351,11 +1337,11 @@ EXhalbtc8723a1ant_MediaStatusNotify( { if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); } } @@ -1367,7 +1353,7 @@ EXhalbtc8723a1ant_SpecialPacketNotify( { if(type == BTC_PACKET_DHCP) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); if(pBtCoexist->btInfo.bBtDisabled) { halbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); @@ -1395,7 +1381,7 @@ EXhalbtc8723a1ant_BtInfoNotify( rspSource = BT_INFO_SRC_8723A_1ANT_BT_RSP; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -1403,11 +1389,11 @@ EXhalbtc8723a1ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } @@ -1508,7 +1494,7 @@ EXhalbtc8723a1ant_Periodical( { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE, bWifiConnected=FALSE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], 1Ant Periodical!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 1Ant Periodical!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c index ffe117596f5b..f32bd9f8e33e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c @@ -13,6 +13,11 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8723a2Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -103,12 +108,10 @@ halbtc8723a2ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else @@ -116,12 +119,10 @@ halbtc8723a2ant_BtRssiState( if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -129,7 +130,7 @@ halbtc8723a2ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } @@ -139,12 +140,10 @@ halbtc8723a2ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || @@ -153,17 +152,14 @@ halbtc8723a2ant_BtRssiState( if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else @@ -171,12 +167,10 @@ halbtc8723a2ant_BtRssiState( if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -208,12 +202,10 @@ halbtc8723a2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -221,12 +213,10 @@ halbtc8723a2ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -234,7 +224,7 @@ halbtc8723a2ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -244,12 +234,10 @@ halbtc8723a2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -258,17 +246,14 @@ halbtc8723a2ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -276,12 +261,10 @@ halbtc8723a2ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -319,7 +302,7 @@ halbtc8723a2ant_IndicateWifiChnlBwInfo( pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1]; pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x19=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x19=0x%x\n", H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x19, 3, H2C_Parameter); @@ -336,7 +319,7 @@ halbtc8723a2ant_QueryBtInfo( H2C_Parameter[0] |= BIT0; // trigger - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x38=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Query Bt Info, FW write 0x38=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x38, 1, H2C_Parameter); @@ -360,7 +343,7 @@ halbtc8723a2ant_ActionAlgorithm( if((pStackInfo->bScoExist) ||(bBtHsOn) ||(pStackInfo->bHidExist)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO or HID or HS exists, set BT non-idle !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO or HID or HS exists, set BT non-idle !!!\n")); pCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_NON_IDLE; } else @@ -371,12 +354,12 @@ halbtc8723a2ant_ActionAlgorithm( { if( (pCoexSta->lowPriorityTx+ pCoexSta->lowPriorityRx) < 100) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP, low priority tx+rx < 100, set BT connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP, low priority tx+rx < 100, set BT connected-idle!!!\n")); pCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP, low priority tx+rx >= 100, set BT non-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP, low priority tx+rx >= 100, set BT non-idle!!!\n")); pCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_NON_IDLE; } } @@ -386,7 +369,7 @@ halbtc8723a2ant_ActionAlgorithm( { if((pCoexSta->lowPriorityTx+ pCoexSta->lowPriorityRx) < 600) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN, low priority tx+rx < 600, set BT connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN, low priority tx+rx < 600, set BT connected-idle!!!\n")); pCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE; } else @@ -395,14 +378,14 @@ halbtc8723a2ant_ActionAlgorithm( { if((pCoexSta->lowPriorityRx /pCoexSta->lowPriorityTx)>9 ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN, low priority rx/tx > 9, set BT connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN, low priority rx/tx > 9, set BT connected-idle!!!\n")); pCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE; } } } if(BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN, set BT non-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN, set BT non-idle!!!\n")); pCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_NON_IDLE; } } @@ -413,7 +396,7 @@ halbtc8723a2ant_ActionAlgorithm( { if((pCoexSta->lowPriorityTx+ pCoexSta->lowPriorityRx) < 600) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN+A2DP, low priority tx+rx < 600, set BT connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN+A2DP, low priority tx+rx < 600, set BT connected-idle!!!\n")); pCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE; } else @@ -422,14 +405,14 @@ halbtc8723a2ant_ActionAlgorithm( { if((pCoexSta->lowPriorityRx /pCoexSta->lowPriorityTx)>9 ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN+A2DP, low priority rx/tx > 9, set BT connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN+A2DP, low priority rx/tx > 9, set BT connected-idle!!!\n")); pCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE; } } } if(BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN+A2DP, set BT non-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN+A2DP, set BT non-idle!!!\n")); pCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_NON_IDLE; } } @@ -450,7 +433,7 @@ halbtc8723a2ant_ActionAlgorithm( if(!pStackInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No profile exists!!!\n")); return algorithm; } @@ -467,31 +450,31 @@ halbtc8723a2ant_ActionAlgorithm( { if(pStackInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO only\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_SCO; } else { if(pStackInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID only\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_HID; } else if(pStackInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP only\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_A2DP; } else if(pStackInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(HS) only\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(EDR) only\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR; } } @@ -503,24 +486,24 @@ halbtc8723a2ant_ActionAlgorithm( { if(pStackInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_HID; } else if(pStackInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP ==> SCO\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_SCO; } else if(pStackInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(HS)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(EDR)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -530,7 +513,7 @@ halbtc8723a2ant_ActionAlgorithm( if( pStackInfo->bHidExist && pStackInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP; } else if( pStackInfo->bHidExist && @@ -538,12 +521,12 @@ halbtc8723a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(HS)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(EDR)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -552,12 +535,12 @@ halbtc8723a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(HS)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(EDR)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -570,7 +553,7 @@ halbtc8723a2ant_ActionAlgorithm( if( pStackInfo->bHidExist && pStackInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_HID; } else if( pStackInfo->bHidExist && @@ -578,12 +561,12 @@ halbtc8723a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(HS)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(EDR)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -592,12 +575,12 @@ halbtc8723a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -610,12 +593,12 @@ halbtc8723a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(HS)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -631,12 +614,12 @@ halbtc8723a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); algorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -673,13 +656,13 @@ halbtc8723a2ant_NeedToDecBtPwr( { if(btHsRssi > 37) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Need to decrease bt power for HS mode!!\n")); bRet = TRUE; } } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n")); bRet = TRUE; } } @@ -699,8 +682,8 @@ halbtc8723a2ant_SetFwDacSwingLevel( // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 H2C_Parameter[0] = dacSwingLvl; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x29=0x%x\n", H2C_Parameter[0])); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x29=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x29, 1, H2C_Parameter); } @@ -720,7 +703,7 @@ halbtc8723a2ant_SetFwDecBtPwr( H2C_Parameter[0] |= BIT1; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s, FW write 0x21=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], decrease Bt Power : %s, FW write 0x21=0x%x\n", (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x21, 1, H2C_Parameter); @@ -733,15 +716,12 @@ halbtc8723a2ant_DecBtPwr( IN BOOLEAN bDecBtPwr ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s Dec BT power = %s\n", (bForceExec? "force to":""), ((bDecBtPwr)? "ON":"OFF"))); pCoexDm->bCurDecBtPwr = bDecBtPwr; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n", - pCoexDm->bPreDecBtPwr, pCoexDm->bCurDecBtPwr)); - if(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr) return; } @@ -757,15 +737,12 @@ halbtc8723a2ant_FwDacSwingLvl( IN u1Byte fwDacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set FW Dac Swing level = %d\n", (bForceExec? "force to":""), fwDacSwingLvl)); pCoexDm->curFwDacSwingLvl = fwDacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", - pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); - if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) return; } @@ -784,7 +761,7 @@ halbtc8723a2ant_SetSwRfRxLpfCorner( if(bRxRfShrinkOn) { //Shrink RF Rx LPF corner - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xf0ff7); } else @@ -793,7 +770,7 @@ halbtc8723a2ant_SetSwRfRxLpfCorner( // After initialized, we can use pCoexDm->btRf0x1eBackup if(pBtCoexist->bInitilized) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup); } } @@ -806,15 +783,12 @@ halbtc8723a2ant_RfShrink( IN BOOLEAN bRxRfShrinkOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Rx RF Shrink = %s\n", (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF"))); pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", - pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); - if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) return; } @@ -835,12 +809,12 @@ halbtc8723a2ant_SetSwPenaltyTxRateAdaptive( tmpU1 |= BIT0; if(bLowPenaltyRa) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); tmpU1 &= ~BIT2; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set normal!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set normal!!\n")); tmpU1 |= BIT2; } @@ -855,15 +829,12 @@ halbtc8723a2ant_LowPenaltyRa( ) { return; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -898,17 +869,13 @@ halbtc8723a2ant_DacSwing( IN u4Byte dacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl)); pCoexDm->bCurDacSwingOn = bDacSwingOn; pCoexDm->curDacSwingLvl = dacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", - pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl, - pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl)); - if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) && (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) ) return; @@ -928,12 +895,12 @@ halbtc8723a2ant_SetAdcBackOff( { if(bAdcBackOff) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level On!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a07611); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level Off!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a05611); } } @@ -945,15 +912,12 @@ halbtc8723a2ant_AdcBackOff( IN BOOLEAN bAdcBackOff ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn AdcBackOff = %s\n", (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF"))); pCoexDm->bCurAdcBackOff = bAdcBackOff; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", - pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff)); - if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) return; } @@ -972,7 +936,7 @@ halbtc8723a2ant_SetAgcTable( if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4e1c0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4d1d0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4c1e0001); @@ -989,7 +953,7 @@ halbtc8723a2ant_SetAgcTable( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x641c0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x631d0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x621e0001); @@ -1015,15 +979,12 @@ halbtc8723a2ant_AgcTable( IN BOOLEAN bAgcTableEn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s %s Agc Table\n", (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable"))); pCoexDm->bCurAgcTableEn = bAgcTableEn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", - pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn)); - if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) return; } @@ -1040,13 +1001,13 @@ halbtc8723a2ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -1059,19 +1020,14 @@ halbtc8723a2ant_CoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c0, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c8 = val0x6c8; pCoexDm->curVal0x6cc = val0x6cc; if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - + { if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) ) @@ -1097,7 +1053,7 @@ halbtc8723a2ant_SetFwIgnoreWlanAct( H2C_Parameter[0] |= BIT0; // function enable } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x25=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x25=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x25, 1, H2C_Parameter); @@ -1110,15 +1066,12 @@ halbtc8723a2ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -1151,7 +1104,7 @@ halbtc8723a2ant_SetFwPstdma( pCoexDm->psTdmaPara[3] = byte4; pCoexDm->psTdmaPara[4] = byte5; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x3a(5bytes)=0x%x%08x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x3a(5bytes)=0x%x%08x\n", H2C_Parameter[0], H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); @@ -1175,12 +1128,12 @@ halbtc8723a2ant_PsTdma( { pCoexDm->bCurPsTdmaOn = TRUE; pCoexDm->curPsTdma = 8; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], turn ON PS TDMA, type=%d for BT tx/rx counters=%d(>3000)\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], turn ON PS TDMA, type=%d for BT tx/rx counters=%d(>3000)\n", pCoexDm->curPsTdma, btTxRxCnt)); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); pCoexDm->bCurPsTdmaOn = bTurnOn; pCoexDm->curPsTdma = type; @@ -1188,11 +1141,6 @@ halbtc8723a2ant_PsTdma( if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", - pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", - pCoexDm->prePsTdma, pCoexDm->curPsTdma)); - if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) return; @@ -1389,9 +1337,9 @@ halbtc8723a2ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx)); // reset counter @@ -1428,23 +1376,23 @@ halbtc8723a2ant_MonitorBtEnableDisable( btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); bPreBtDisabled = bBtDisabled; @@ -1480,7 +1428,7 @@ halbtc8723a2ant_IsCommonAction( if(halbtc8723a2ant_IsWifiIdle(pBtCoexist) && BT_8723A_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi idle + Bt idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi idle + Bt idle!!\n")); halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, FALSE); halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE); @@ -1499,7 +1447,7 @@ halbtc8723a2ant_IsCommonAction( else if(!halbtc8723a2ant_IsWifiIdle(pBtCoexist) && (BT_8723A_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-idle + BT idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non-idle + BT idle!!\n")); halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE); halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE); @@ -1519,7 +1467,7 @@ halbtc8723a2ant_IsCommonAction( else if(halbtc8723a2ant_IsWifiIdle(pBtCoexist) && (BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi idle + Bt connected idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi idle + Bt connected idle!!\n")); halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE); halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE); @@ -1539,7 +1487,7 @@ halbtc8723a2ant_IsCommonAction( else if(!halbtc8723a2ant_IsWifiIdle(pBtCoexist) && (BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-idle + Bt connected idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non-idle + Bt connected idle!!\n")); halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE); halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE); @@ -1559,7 +1507,7 @@ halbtc8723a2ant_IsCommonAction( else if(halbtc8723a2ant_IsWifiIdle(pBtCoexist) && (BT_8723A_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi idle + BT non-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi idle + BT non-idle!!\n")); halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE); halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE); @@ -1579,7 +1527,7 @@ halbtc8723a2ant_IsCommonAction( else if(halbtc8723a2ant_IsWifiConnectedIdle(pBtCoexist) && (BT_8723A_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected-idle + BT non-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected-idle + BT non-idle!!\n")); halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE); halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE); @@ -1598,7 +1546,7 @@ halbtc8723a2ant_IsCommonAction( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-idle + BT non-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non-idle + BT non-idle!!\n")); halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE); halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE); halbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE); @@ -1621,12 +1569,12 @@ halbtc8723a2ant_TdmaDurationAdjust( s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjust()\n")); if(pCoexDm->bResetTdmaAdjust) { pCoexDm->bResetTdmaAdjust = FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); { if(bScoHid) { @@ -1739,8 +1687,8 @@ halbtc8723a2ant_TdmaDurationAdjust( { //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], retryCount = %d\n", retryCount)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", up, dn, m, n, WaitCount)); result = 0; WaitCount++; @@ -1760,7 +1708,7 @@ halbtc8723a2ant_TdmaDurationAdjust( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -1786,7 +1734,7 @@ halbtc8723a2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -1804,15 +1752,15 @@ halbtc8723a2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval)); if(maxInterval == 1) { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { @@ -1924,7 +1872,7 @@ halbtc8723a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); @@ -2038,7 +1986,7 @@ halbtc8723a2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); @@ -2148,7 +2096,7 @@ halbtc8723a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); @@ -2261,7 +2209,7 @@ halbtc8723a2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); @@ -2371,7 +2319,7 @@ halbtc8723a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); @@ -2487,7 +2435,7 @@ halbtc8723a2ant_TdmaDurationAdjust( if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); @@ -2500,7 +2448,7 @@ halbtc8723a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); } } } @@ -3253,7 +3201,7 @@ halbtc8723a2ant_RunCoexistMechanism( if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Manual control!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Manual control!!!\n")); return; } @@ -3268,7 +3216,7 @@ halbtc8723a2ant_RunCoexistMechanism( algorithm = halbtc8723a2ant_ActionAlgorithm(pBtCoexist); if(pCoexSta->bHoldPeriodCnt && (BT_8723A_2ANT_COEX_ALGO_PANHS!=algorithm)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex],Hold BT inquiry/page scan setting (cnt = %d)!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex],Hold BT inquiry/page scan setting (cnt = %d)!!\n", pCoexSta->bHoldPeriodCnt)); if(pCoexSta->bHoldPeriodCnt >= 6) { @@ -3281,60 +3229,60 @@ halbtc8723a2ant_RunCoexistMechanism( } pCoexDm->curAlgorithm = algorithm; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); if(halbtc8723a2ant_IsCommonAction(pBtCoexist)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant common.\n")); pCoexDm->bResetTdmaAdjust = TRUE; } else { if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", pCoexDm->preAlgorithm, pCoexDm->curAlgorithm)); pCoexDm->bResetTdmaAdjust = TRUE; } switch(pCoexDm->curAlgorithm) { case BT_8723A_2ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); halbtc8723a2ant_ActionSco(pBtCoexist); break; case BT_8723A_2ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); halbtc8723a2ant_ActionHid(pBtCoexist); break; case BT_8723A_2ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); halbtc8723a2ant_ActionA2dp(pBtCoexist); break; case BT_8723A_2ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); halbtc8723a2ant_ActionPanEdr(pBtCoexist); break; case BT_8723A_2ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); halbtc8723a2ant_ActionPanHs(pBtCoexist); break; case BT_8723A_2ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); halbtc8723a2ant_ActionPanEdrA2dp(pBtCoexist); break; case BT_8723A_2ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); halbtc8723a2ant_ActionPanEdrHid(pBtCoexist); break; case BT_8723A_2ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); halbtc8723a2ant_ActionHidA2dpPanEdr(pBtCoexist); break; case BT_8723A_2ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); halbtc8723a2ant_ActionHidA2dp(pBtCoexist); break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); halbtc8723a2ant_CoexAllOff(pBtCoexist); break; } @@ -3397,7 +3345,7 @@ EXhalbtc8723a2ant_InitHwConfig( u4Byte u4Tmp=0; u1Byte u1Tmp=0; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Init HW Config!!\n")); // backup rf 0x1e value pCoexDm->btRf0x1eBackup = @@ -3414,7 +3362,7 @@ EXhalbtc8723a2ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); halbtc8723a2ant_InitCoexDm(pBtCoexist); } @@ -3451,7 +3399,7 @@ EXhalbtc8723a2ant_DisplayCoexInfo( pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1], pCoexDm->wifiChnlInfo[2]); CL_PRINTF(cliBuf); - + // wifi status CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); CL_PRINTF(cliBuf); @@ -3600,12 +3548,12 @@ EXhalbtc8723a2ant_IpsNotify( { if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); halbtc8723a2ant_CoexAllOff(pBtCoexist); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); //halbtc8723a2ant_InitCoexDm(pBtCoexist); } } @@ -3618,11 +3566,11 @@ EXhalbtc8723a2ant_LpsNotify( { if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); } } @@ -3634,11 +3582,11 @@ EXhalbtc8723a2ant_ScanNotify( { if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); } } @@ -3650,11 +3598,11 @@ EXhalbtc8723a2ant_ConnectNotify( { if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); } } @@ -3666,11 +3614,11 @@ EXhalbtc8723a2ant_MediaStatusNotify( { if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); } halbtc8723a2ant_IndicateWifiChnlBwInfo(pBtCoexist, type); @@ -3684,7 +3632,7 @@ EXhalbtc8723a2ant_SpecialPacketNotify( { if(type == BTC_PACKET_DHCP) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); } } @@ -3705,7 +3653,7 @@ EXhalbtc8723a2ant_BtInfoNotify( rspSource = BT_INFO_SRC_8723A_2ANT_BT_RSP; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -3713,11 +3661,11 @@ EXhalbtc8723a2ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } @@ -3753,14 +3701,14 @@ EXhalbtc8723a2ant_StackOperationNotify( { if(BTC_STACK_OP_INQ_PAGE_PAIR_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], StackOP Inquiry/page/pair start notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], StackOP Inquiry/page/pair start notify\n")); pCoexSta->bHoldForStackOperation = TRUE; pCoexSta->bHoldPeriodCnt = 1; halbtc8723a2ant_BtInquiryPage(pBtCoexist); } else if(BTC_STACK_OP_INQ_PAGE_PAIR_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], StackOP Inquiry/page/pair finish notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], StackOP Inquiry/page/pair finish notify\n")); pCoexSta->bHoldForStackOperation = FALSE; } } @@ -3770,7 +3718,7 @@ EXhalbtc8723a2ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); halbtc8723a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); EXhalbtc8723a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); @@ -3781,7 +3729,7 @@ EXhalbtc8723a2ant_Periodical( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], 2Ant Periodical!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Periodical!!\n")); // work around for c2h hang wa_halbtc8723a2ant_MonitorC2h(pBtCoexist); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c index bada4139b1f2..265ef130af0d 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c @@ -12,6 +12,12 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8723b1Ant.tmh" +#endif + +//#include #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -30,8 +36,8 @@ const char *const GLBtInfoSrc8723b1Ant[]={ "BT Info[bt auto report]", }; -u4Byte GLCoexVerDate8723b1Ant=20140929; -u4Byte GLCoexVer8723b1Ant=0x54; +u4Byte GLCoexVerDate8723b1Ant=20150119; +u4Byte GLCoexVer8723b1Ant=0x58; //============================================================ // local function proto type if needed @@ -59,12 +65,10 @@ halbtc8723b1ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else @@ -72,12 +76,10 @@ halbtc8723b1ant_BtRssiState( if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -85,7 +87,7 @@ halbtc8723b1ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } @@ -95,12 +97,10 @@ halbtc8723b1ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || @@ -109,17 +109,14 @@ halbtc8723b1ant_BtRssiState( if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else @@ -127,12 +124,10 @@ halbtc8723b1ant_BtRssiState( if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -164,12 +159,10 @@ halbtc8723b1ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -177,12 +170,10 @@ halbtc8723b1ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -190,7 +181,7 @@ halbtc8723b1ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -200,12 +191,10 @@ halbtc8723b1ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -214,17 +203,14 @@ halbtc8723b1ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -232,12 +218,10 @@ halbtc8723b1ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -425,7 +409,7 @@ halbtc8723b1ant_QueryBtInfo( H2C_Parameter[0] |= BIT0; // trigger - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter); @@ -440,7 +424,7 @@ halbtc8723b1ant_MonitorBtCtr( u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0; u1Byte u1Tmp, u1Tmp1; s4Byte wifiRssi; - static u1Byte NumOfBtCounterChk = 0; + static u4Byte NumOfBtCounterChk = 0; //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS //if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) @@ -470,25 +454,34 @@ halbtc8723b1ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; - if( (pCoexSta->lowPriorityTx > 1150) && (!pCoexSta->bC2hBtInquiryPage)) + if( (pCoexSta->lowPriorityTx > 1050) && (!pCoexSta->bC2hBtInquiryPage)) pCoexSta->popEventCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n", regHPRx, regHPTx, regLPRx, regLPTx)); // reset counter pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); + // This part is for wifi FW and driver to update BT's status as disabled. + // The flow is as the following + // 1. disable BT + // 2. if all BT Tx/Rx counter=0, after 6 sec we query bt info + // 3. Because BT will not rsp from mailbox, so wifi fw will know BT is disabled + // 4. FW will rsp c2h for BT that driver will know BT is disabled. if ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0)) { NumOfBtCounterChk++; - if (NumOfBtCounterChk >= 3) + if (NumOfBtCounterChk == 3) { halbtc8723b1ant_QueryBtInfo(pBtCoexist); + } + } + else + { NumOfBtCounterChk = 0; } } -} VOID @@ -501,6 +494,7 @@ halbtc8723b1ant_MonitorWiFiCtr( s4Byte wifiRssi=0; BOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE; static u1Byte nCCKLockCounter = 0; + u4Byte TotalCnt; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi); @@ -538,14 +532,16 @@ halbtc8723b1ant_MonitorWiFiCtr( if ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode)) { + TotalCnt = pCoexSta->nCRCOK_CCK + pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + + pCoexSta->nCRCOK_11nAgg; + if ( (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) || (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) || (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) ) { - if (pCoexSta->nCRCOK_CCK >(pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + - pCoexSta->nCRCOK_11nAgg) ) + if (pCoexSta->nCRCOK_CCK >(TotalCnt -pCoexSta->nCRCOK_CCK)) { - if (nCCKLockCounter < 5) + if (nCCKLockCounter < 3) nCCKLockCounter++; } else @@ -570,7 +566,7 @@ halbtc8723b1ant_MonitorWiFiCtr( if (!pCoexSta->bPreCCKLock) { - if (nCCKLockCounter >= 5) + if (nCCKLockCounter >= 3) pCoexSta->bCCKLock = TRUE; else pCoexSta->bCCKLock = FALSE; @@ -599,6 +595,7 @@ halbtc8723b1ant_IsWifiStatusChanged( static BOOLEAN bPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE; BOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE; BOOLEAN bWifiConnected=FALSE; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); @@ -622,6 +619,8 @@ halbtc8723b1ant_IsWifiStatusChanged( bPreBtHsOn = bBtHsOn; return TRUE; } + + } return FALSE; @@ -702,7 +701,7 @@ halbtc8723b1ant_ActionAlgorithm( if(!pBtLinkInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No BT link exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); return algorithm; } @@ -719,31 +718,31 @@ halbtc8723b1ant_ActionAlgorithm( { if(pBtLinkInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO only\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_SCO; } else { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID only\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP only\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_A2DP; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(HS) only\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(EDR) only\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR; } } @@ -755,24 +754,24 @@ halbtc8723b1ant_ActionAlgorithm( { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + A2DP ==> SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP ==> SCO\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_SCO; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(HS)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(EDR)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -782,7 +781,7 @@ halbtc8723b1ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP; } else if( pBtLinkInfo->bHidExist && @@ -790,12 +789,12 @@ halbtc8723b1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(HS)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(EDR)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -804,12 +803,12 @@ halbtc8723b1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(HS)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(EDR)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -822,7 +821,7 @@ halbtc8723b1ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_HID; } else if( pBtLinkInfo->bHidExist && @@ -830,12 +829,12 @@ halbtc8723b1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(HS)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -844,12 +843,12 @@ halbtc8723b1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -862,12 +861,12 @@ halbtc8723b1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -883,12 +882,12 @@ halbtc8723b1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -913,7 +912,7 @@ halbtc8723b1ant_SetBtAutoReport( H2C_Parameter[0] |= BIT0; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter); @@ -926,15 +925,12 @@ halbtc8723b1ant_BtAutoReport( IN BOOLEAN bEnableAutoReport ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); pCoexDm->bCurBtAutoReport = bEnableAutoReport; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", - pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport)); - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) return; } @@ -962,7 +958,7 @@ halbtc8723b1ant_SetSwPenaltyTxRateAdaptive( H2C_Parameter[5] = 0xf9; //MCS5 or OFDM36 } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set WiFi Low-Penalty Retry: %s", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", (bLowPenaltyRa? "ON!!":"OFF!!") )); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); @@ -996,16 +992,16 @@ halbtc8723b1ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -1019,7 +1015,7 @@ halbtc8723b1ant_CoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6cc=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c4 = val0x6c4; @@ -1028,11 +1024,6 @@ halbtc8723b1ant_CoexTable( if(!bForceExec) { - //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - // pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - // pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && @@ -1054,7 +1045,23 @@ halbtc8723b1ant_CoexTableWithType( IN u1Byte type ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type)); + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + +#if BT_8723B_1ANT_ANTDET_ENABLE +#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE + if (pBoardInfo->btdmAntNumByAntDet == 2) + { + if (type == 3) + type = 14; + else if (type == 4) + type = 13; + else if (type == 5) + type = 8; + } +#endif +#endif + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type)); pCoexSta->nCoexTableType = type; @@ -1073,13 +1080,16 @@ halbtc8723b1ant_CoexTableWithType( halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); break; case 4: - if ((pCoexSta->nScanAPNum <= 5) || ( pCoexSta->bCCKEverLock) ) + if ( pCoexSta->bCCKEverLock) halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3); else halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3); break; case 5: - halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3); + if ( pCoexSta->bCCKEverLock) + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaa5a5a, 0xaaaa5a5a, 0xffffff, 0x3); + else + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3); break; case 6: halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3); @@ -1087,6 +1097,30 @@ halbtc8723b1ant_CoexTableWithType( case 7: halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3); break; + case 8: + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 9: + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 10: + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 11: + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 12: + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 13: + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3); + break; + case 14: + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3); + break; + case 15: + halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3); + break; default: break; } @@ -1105,7 +1139,7 @@ halbtc8723b1ant_SetFwIgnoreWlanAct( H2C_Parameter[0] |= BIT0; // function enable } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter); @@ -1118,15 +1152,12 @@ halbtc8723b1ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -1159,22 +1190,16 @@ halbtc8723b1ant_LpsRpwm( { BOOLEAN bForceExecPwrCmd=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", (bForceExec? "force to":""), lpsVal, rpwmVal)); pCoexDm->curLps = lpsVal; pCoexDm->curRpwm = rpwmVal; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], LPS-RxBeaconMode=0x%x , LPS-RPWM=0x%x!!\n", - pCoexDm->curLps, pCoexDm->curRpwm)); - if( (pCoexDm->preLps == pCoexDm->curLps) && (pCoexDm->preRpwm == pCoexDm->curRpwm) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], LPS-RPWM_Last=0x%x , LPS-RPWM_Now=0x%x!!\n", - pCoexDm->preRpwm, pCoexDm->curRpwm)); - return; } } @@ -1190,9 +1215,6 @@ halbtc8723b1ant_SwMechanism( IN BOOLEAN bLowPenaltyRA ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], SM[LpRA] = %d\n", - bLowPenaltyRA)); - halbtc8723b1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA); } @@ -1220,6 +1242,21 @@ halbtc8723b1ant_SetAntPath( if((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch) bUseExtSwitch = TRUE; +#if BT_8723B_1ANT_ANTDET_ENABLE +#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE + if (antPosType == BTC_ANT_PATH_PTA) + { + if ((pBoardInfo->btdmAntDetFinish) && (pBoardInfo->btdmAntNumByAntDet == 2)) + { + if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) + antPosType = BTC_ANT_PATH_WIFI; + else + antPosType = BTC_ANT_PATH_BT; + } + } +#endif +#endif + if(bInitHwCfg) { pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi TRx Mask on @@ -1295,12 +1332,12 @@ halbtc8723b1ant_SetAntPath( cntBtCalChk++; if(u1Tmp & BIT0) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n", cntBtCalChk)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n", cntBtCalChk)); delay_ms(50); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n", cntBtCalChk)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n", cntBtCalChk)); break; } } @@ -1448,7 +1485,7 @@ halbtc8723b1ant_SetAntPathDCut( u1Byte dataLen=5; u1Byte buf[6] = {0}; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT Ant, bAntennaAux/bExtSwitch/bTwoAntenna/antennaPos/wifiState=%d/%d/%d/%d/%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set BT Ant, bAntennaAux/bExtSwitch/bTwoAntenna/antennaPos/wifiState=%d/%d/%d/%d/%d\n", bAntennaAux, bExtSwitch, bTwoAntenna, antennaPos, wifiState)); buf[0] = dataLen; @@ -1489,7 +1526,7 @@ halbtc8723b1ant_SetFwPstdma( { if(byte1&BIT4 && !(byte1&BIT5)) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FW for 1Ant AP mode\n")); realByte1 &= ~BIT4; realByte1 |= BIT5; @@ -1510,7 +1547,7 @@ halbtc8723b1ant_SetFwPstdma( pCoexDm->psTdmaPara[3] = byte4; pCoexDm->psTdmaPara[4] = realByte5; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", H2C_Parameter[0], H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); @@ -1534,11 +1571,22 @@ halbtc8723b1ant_PsTdma( s1Byte nWiFiDurationAdjust = 0x0; static BOOLEAN bPreWifiBusy=FALSE; - //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", - // (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); pCoexDm->bCurPsTdmaOn = bTurnOn; pCoexDm->curPsTdma = type; +#if BT_8723B_1ANT_ANTDET_ENABLE +#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE + if (pBoardInfo->btdmAntNumByAntDet == 2) + { + if (bTurnOn) + type = type +100; //for WiFi RSSI low or BT RSSI low + else + type = 1; //always translate to TDMA(off,1) for TDMA-off case + } + +#endif +#endif + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); if (bWifiBusy != bPreWifiBusy) @@ -1549,12 +1597,12 @@ halbtc8723b1ant_PsTdma( if (pCoexDm->bCurPsTdmaOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(on, %d) **********\n", pCoexDm->curPsTdma)); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(off, %d) **********\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(off, %d) **********\n", pCoexDm->curPsTdma)); } @@ -1566,31 +1614,85 @@ halbtc8723b1ant_PsTdma( } if (pCoexSta->nScanAPNum <= 5) + { nWiFiDurationAdjust = 5; - //nWiFiDurationAdjust = 2; + + if (pCoexSta->nA2DPBitPool >= 35) + nWiFiDurationAdjust = -10; + else if (pCoexSta->nA2DPBitPool >= 45) + nWiFiDurationAdjust = -15; + } else if (pCoexSta->nScanAPNum >= 40) + { nWiFiDurationAdjust = -15; + + if (pCoexSta->nA2DPBitPool < 35) + nWiFiDurationAdjust = -5; + else if (pCoexSta->nA2DPBitPool < 45) + nWiFiDurationAdjust = -10; + } else if (pCoexSta->nScanAPNum >= 20) + { nWiFiDurationAdjust = -10; - if (!pCoexSta->bForceLpsOn) //only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30 + if (pCoexSta->nA2DPBitPool >= 45) + nWiFiDurationAdjust = -15; + } + else + { + nWiFiDurationAdjust = 0; + + if (pCoexSta->nA2DPBitPool >= 35) + nWiFiDurationAdjust = -10; + else if (pCoexSta->nA2DPBitPool >= 45) + nWiFiDurationAdjust = -15; + } + + if ((type == 1) || (type == 2) || (type == 9) || (type == 11) || (type == 101) + || (type == 102) || (type == 109) || (type == 101)) + { + if (!pCoexSta->bForceLpsOn) //Native power save TDMA, only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30 { psTdmaByte0Val = 0x61; //no null-pkt psTdmaByte3Val = 0x11; // no tx-pause at BT-slot - psTdmaByte4Val = 0x10; // 0x778 = d/1 toggle + psTdmaByte4Val = 0x10; // 0x778 = d/1 toggle, no dynamic slot } - - if ( (type == 3) || (type == 13) || (type == 14) ) + else + { + psTdmaByte0Val = 0x51; //null-pkt + psTdmaByte3Val = 0x10; //tx-pause at BT-slot + psTdmaByte4Val = 0x50; // 0x778 = d/1 toggle, dynamic slot + } + } + else if ((type == 3) || (type == 13) || (type == 14) || (type == 103) || (type == 113) || (type == 114)) { - psTdmaByte4Val = psTdmaByte4Val & 0xbf; //no dynamic slot for multi-profile - + psTdmaByte0Val = 0x51; //null-pkt + psTdmaByte3Val = 0x10; //tx-pause at BT-slot + psTdmaByte4Val = 0x10; // 0x778 = d/1 toggle, no dynamic slot +#if 0 if (!bWifiBusy) psTdmaByte4Val = psTdmaByte4Val | 0x1; //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) +#endif + } + else //native power save case + { + psTdmaByte0Val = 0x61; //no null-pkt + psTdmaByte3Val = 0x11; // no tx-pause at BT-slot + psTdmaByte4Val = 0x11; // 0x778 = d/1 toggle, no dynamic slot + //psTdmaByte4Va is not defne for 0x778 = d/1, 1/1 case } - if (pBtLinkInfo->bSlaveRole == TRUE) + //if (pBtLinkInfo->bSlaveRole == TRUE) + if ((pBtLinkInfo->bSlaveRole == TRUE) && (pBtLinkInfo->bA2dpExist)) psTdmaByte4Val = psTdmaByte4Val | 0x1; //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) + if (type > 100) + { + psTdmaByte0Val = psTdmaByte0Val | 0x82; //set antenna control by SW + psTdmaByte3Val = psTdmaByte3Val | 0x60; //set antenna no toggle, control by antenna diversity + } + + if(bTurnOn) { switch(type) @@ -1605,16 +1707,16 @@ halbtc8723b1ant_PsTdma( halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); break; case 3: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x03, psTdmaByte3Val, psTdmaByte4Val); break; case 4: halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0); break; case 5: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x11); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x15, 0x3, psTdmaByte3Val, 0x11); break; case 6: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x20, 0x3, psTdmaByte3Val, 0x11); break; case 7: halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0); @@ -1635,10 +1737,10 @@ halbtc8723b1ant_PsTdma( halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50); break; case 13: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); break; case 14: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, psTdmaByte4Val); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); break; case 15: halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0); @@ -1650,13 +1752,13 @@ halbtc8723b1ant_PsTdma( halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); break; case 20: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3f, 0x03, psTdmaByte3Val, 0x10); break; case 21: halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11); break; case 22: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x10); break; case 23: halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18); @@ -1686,10 +1788,10 @@ halbtc8723b1ant_PsTdma( halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58); break; case 32: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, psTdmaByte4Val); break; case 33: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, 0x10); break; case 34: halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10); @@ -1704,6 +1806,50 @@ halbtc8723b1ant_PsTdma( /* here softap mode screen off will cost 70-80mA for phone */ halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24); break; + + //for 1-Ant translate to 2-Ant + case 101: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); + break; + case 102: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); + break; + case 103: + //halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x03, psTdmaByte3Val, psTdmaByte4Val); + break; + case 105: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x15, 0x3, psTdmaByte3Val, 0x11); + break; + case 106: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x20, 0x3, psTdmaByte3Val, 0x11); + break; + case 109: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); + break; + case 111: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val); + break; + case 113: + //halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val); + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); + break; + case 114: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); + break; + case 120: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3f, 0x03, psTdmaByte3Val, 0x10); + break; + case 122: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x10); + break; + case 132: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, psTdmaByte4Val); + break; + case 133: + halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x11); + break; + } } else @@ -1714,14 +1860,13 @@ halbtc8723b1ant_PsTdma( { case 8: //PTA Control halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0); - //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_PTA, BTC_WIFI_STAT_NORMAL); - //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE); break; case 0: default: //Software control, Antenna at BT side halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); - //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL); - //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE); + break; + case 1: // 2-Ant, 0x778=3, antenna control by antenna diversity + halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0); break; #if 0 case 9: //Software control, Antenna at WiFi side @@ -1736,7 +1881,7 @@ halbtc8723b1ant_PsTdma( pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67))); // update pre state @@ -1757,7 +1902,7 @@ halbtc8723b1ant_IsCommonAction( if(!bWifiConnected && BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); @@ -1766,7 +1911,7 @@ halbtc8723b1ant_IsCommonAction( else if(bWifiConnected && (BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); @@ -1775,7 +1920,7 @@ halbtc8723b1ant_IsCommonAction( else if(!bWifiConnected && (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); @@ -1784,7 +1929,7 @@ halbtc8723b1ant_IsCommonAction( else if(bWifiConnected && (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); @@ -1793,7 +1938,7 @@ halbtc8723b1ant_IsCommonAction( else if(!bWifiConnected && (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); @@ -1803,11 +1948,11 @@ halbtc8723b1ant_IsCommonAction( { if (bWifiBusy) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); } bCommon = FALSE; @@ -1829,7 +1974,7 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl( static BOOLEAN bPreWifiBusy=FALSE; BOOLEAN bWifiBusy = FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); if(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifiStatus) bWifiBusy = TRUE; @@ -1861,7 +2006,7 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl( if(!pCoexDm->bAutoTdmaAdjust) { pCoexDm->bAutoTdmaAdjust = TRUE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); pCoexDm->psTdmaDuAdjType = 2; @@ -1878,11 +2023,8 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl( //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; btInfoExt = pCoexSta->btInfoExt; - //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", - // up, dn, m, n, WaitCount)); - if ( (pCoexSta->lowPriorityTx) > 1150 || (pCoexSta->lowPriorityRx) > 1250 ) + if ( (pCoexSta->lowPriorityTx) > 1050 || (pCoexSta->lowPriorityRx) > 1250 ) retryCount++; result = 0; @@ -1903,7 +2045,7 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -1929,7 +2071,7 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -1947,18 +2089,18 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } if(result == -1) { - if( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(btInfoExt)) && +/* if( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(btInfoExt)) && ((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) ) { halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); pCoexDm->psTdmaDuAdjType = 9; } - else if(pCoexDm->curPsTdma == 1) + else */ if(pCoexDm->curPsTdma == 1) { halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); pCoexDm->psTdmaDuAdjType = 2; @@ -1976,13 +2118,13 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl( } else if(result == 1) { - if( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(btInfoExt)) && +/* if( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(btInfoExt)) && ((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) ) { halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); pCoexDm->psTdmaDuAdjType = 9; } - else if(pCoexDm->curPsTdma == 11) + else */ if(pCoexDm->curPsTdma == 11) { halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); pCoexDm->psTdmaDuAdjType = 9; @@ -2008,7 +2150,7 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl( } */ - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(on, %d) **********\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n", pCoexDm->curPsTdma)); } @@ -2137,33 +2279,26 @@ halbtc8723b1ant_MonitorBtEnableDisable( { btDisableCnt = 0; bBtDisabled = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", - btDisableCnt)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); - halbtc8723b1ant_ActionWifiOnly(pBtCoexist); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", - (bPreBtDisabled ? "disabled":"enabled"), + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); + bPreBtDisabled = bBtDisabled; - if(!bBtDisabled) - { - } - else + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); + if(bBtDisabled) { + halbtc8723b1ant_ActionWifiOnly(pBtCoexist); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL); } @@ -2328,6 +2463,10 @@ halbtc8723b1ant_ActionBtInquiry( { // SCO/HID/A2DP busy halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + if (pCoexSta->bC2hBtRemoteNameReq) + halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 33); + else halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); @@ -2336,8 +2475,9 @@ halbtc8723b1ant_ActionBtInquiry( { halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - //for BT inquiry/page fail after S4 resume - //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + if (pCoexSta->bC2hBtRemoteNameReq) + halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 33); + else halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); @@ -2350,9 +2490,6 @@ halbtc8723b1ant_ActionBtInquiry( halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); - - //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); } } @@ -2446,7 +2583,7 @@ halbtc8723b1ant_ActionWifiConnectedBtAclBusy( else { //BT no-profile busy (0x9) - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 33); halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); pCoexDm->bAutoTdmaAdjust = FALSE; } @@ -2586,11 +2723,23 @@ halbtc8723b1ant_ActionWifiConnectedSpecialPacket( ) { PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bWifiBusy = FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + + //no special packet process for both WiFi and BT very busy + if ((bWifiBusy) && ((pBtLinkInfo->bPanExist) || (pCoexSta->nNumOfProfile >= 2))) + return; halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); // tdma and coex table - if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) ) + if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist)) + { + halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); + } + else if (pBtLinkInfo->bA2dpExist) { halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); @@ -2618,13 +2767,13 @@ halbtc8723b1ant_ActionWifiConnected( BOOLEAN bUnder4way=FALSE, bApEnable=FALSE; u4Byte wifiBw; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect()===>\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect()===>\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way); if(bUnder4way) { halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n")); return; } @@ -2637,7 +2786,7 @@ halbtc8723b1ant_ActionWifiConnected( halbtc8723b1ant_ActionWifiConnectedScan(pBtCoexist); else halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n")); return; } @@ -2690,7 +2839,7 @@ halbtc8723b1ant_ActionWifiConnected( halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 ) - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); else halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } @@ -2713,7 +2862,7 @@ halbtc8723b1ant_ActionWifiConnected( halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 ) - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); else halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } @@ -2739,47 +2888,47 @@ halbtc8723b1ant_RunSwCoexistMechanism( switch(pCoexDm->curAlgorithm) { case BT_8723B_1ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = SCO.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = SCO.\n")); //halbtc8723b1ant_ActionSco(pBtCoexist); break; case BT_8723B_1ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID.\n")); //halbtc8723b1ant_ActionHid(pBtCoexist); break; case BT_8723B_1ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP.\n")); //halbtc8723b1ant_ActionA2dp(pBtCoexist); break; case BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); //halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist); break; case BT_8723B_1ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR).\n")); //halbtc8723b1ant_ActionPanEdr(pBtCoexist); break; case BT_8723B_1ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HS mode.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HS mode.\n")); //halbtc8723b1ant_ActionPanHs(pBtCoexist); break; case BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); //halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist); break; case BT_8723B_1ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n")); //halbtc8723b1ant_ActionPanEdrHid(pBtCoexist); break; case BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n")); //halbtc8723b1ant_ActionHidA2dpPanEdr(pBtCoexist); break; case BT_8723B_1ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP.\n")); //halbtc8723b1ant_ActionHidA2dp(pBtCoexist); break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = coexist All Off!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = coexist All Off!!\n")); //halbtc8723b1ant_CoexAllOff(pBtCoexist); break; } @@ -2793,7 +2942,7 @@ halbtc8723b1ant_RunCoexistMechanism( ) { PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE, bWifiBusy = FALSE; BOOLEAN bIncreaseScanDevNum=FALSE; BOOLEAN bBtCtrlAggBufSize=FALSE; BOOLEAN bMiracastPlusBt=FALSE; @@ -2801,30 +2950,31 @@ halbtc8723b1ant_RunCoexistMechanism( u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiLinkStatus=0; u4Byte numOfWifiLink=0, wifiBw; + u1Byte iotPeer=BTC_IOT_PEER_UNKNOWN; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); return; } if(pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); return; } if(pCoexSta->bUnderIps) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS !!!\n")); return; } if(pCoexSta->bBtWhckTest) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under WHCK TEST!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under WHCK TEST!!!\n")); halbtc8723b1ant_ActionBtWhckTest(pBtCoexist); return; } @@ -2838,13 +2988,14 @@ halbtc8723b1ant_RunCoexistMechanism( pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); numOfWifiLink = wifiLinkStatus>>16; if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED)) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) ); + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) ); if(pBtLinkInfo->bBtLinkExist) { @@ -2859,9 +3010,9 @@ halbtc8723b1ant_RunCoexistMechanism( pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); - if ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) ) + if (( (pBtLinkInfo->bA2dpExist) || (bWifiBusy) ) && (pCoexSta->bC2hBtInquiryPage) ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], BT Is Inquirying \n") ); + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], BT Is Inquirying \n") ); halbtc8723b1ant_ActionBtInquiry(pBtCoexist); } else @@ -2881,21 +3032,29 @@ halbtc8723b1ant_RunCoexistMechanism( { halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); - if(pBtLinkInfo->bScoExist)//if (pBtLinkInfo->bBtHiPriLinkExist) - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5); - else - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); - /* - if(pBtLinkInfo->bScoExist) - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5); - else + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_IOT_PEER, &iotPeer); + + if(BTC_IOT_PEER_CISCO != iotPeer) { - if (BTC_WIFI_BW_HT40==wifiBw) - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x10); + if(pBtLinkInfo->bScoExist)//if (pBtLinkInfo->bBtHiPriLinkExist) + //halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5); + halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); + else + halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); + //halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); + } else - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); + { + if(pBtLinkInfo->bScoExist) + halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5); + else + { + if (BTC_WIFI_BW_HT40==wifiBw) + halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x10); + else + halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); + } } - */ halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE); halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); //just print debug message @@ -2913,7 +3072,7 @@ halbtc8723b1ant_RunCoexistMechanism( pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); if(pCoexSta->bC2hBtInquiryPage) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], BT Is Inquirying \n") ); + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], BT Is Inquirying \n") ); halbtc8723b1ant_ActionBtInquiry(pBtCoexist); return; } @@ -2928,7 +3087,7 @@ halbtc8723b1ant_RunCoexistMechanism( { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is non connected-idle !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is non connected-idle !!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink); @@ -2951,7 +3110,7 @@ halbtc8723b1ant_RunCoexistMechanism( } u4Byte -halbtc8723b1ant_Log2Base( +halbtc8723b1ant_PSD_Log2Base( IN PBTC_COEXIST pBtCoexist, IN u4Byte val @@ -3001,8 +3160,6 @@ halbtc8723b1ant_Log2Base( } - - VOID halbtc8723b1ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist @@ -3032,9 +3189,13 @@ halbtc8723b1ant_InitHwConfig( u1Byte u1Tmp=0, u1Tmpa=0, u1Tmpb=0; u1Byte H2C_Parameter[2] ={0}; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 1Ant Init HW Config!!\n")); + + pPsdScan->nAntDet_IsAntDetAvailable = FALSE; - pPsdScan->bIsAntDetEnable = FALSE; + //0xf0[15:12] --> Chip Cut information + pCoexSta->nCutVersion = (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xf1) & 0xf0) >> 4; + #if 0//move to BTC_MEDIA_CONNECT if(bBackUp) { @@ -3084,12 +3245,182 @@ halbtc8723b1ant_InitHwConfig( u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765); u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", u4Tmp, u1Tmpa, u1Tmpb)); } + + + + +VOID +halbtc8723b1ant_MechanismSwitch( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bSwitchTo2Antenna + ) +{ + + if (bSwitchTo2Antenna) // 1-Ant -> 2-Ant + { + //un-lock TRx Mask setup for 8723b f-cut + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x1); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x1); + //WiFi TRx Mask on + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + + //BT TRx Mask un-lock 0x2c[0], 0x30[0] = 1 + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x2c, 0x7c45); + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x30, 0x7c45); + + //BT TRx Mask on + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x1); + + halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, FALSE); + } + else + { + //WiFi TRx Mask on + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); + + //lock TRx Mask setup for 8723b f-cut + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x0); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x0); + + //BT TRx Mask on + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); + + //BT TRx Mask ock 0x2c[0], 0x30[0] = 0 + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x2c, 0x7c44); + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x30, 0x7c44); + + + halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); + } + +} + + + + +VOID +halbtc8723b1ant_PSD_ShowAntennaDetectResult( + IN PBTC_COEXIST pBtCoexist + ) +{ + pu1Byte cliBuf=pBtCoexist->cliBuf; + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n============[Antenna Detection info] ============\n"); + CL_PRINTF(cliBuf); + + if (pPsdScan->nAntDet_Result == 1) + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (>%d)", "Ant Det Result", "2-Antenna (Bad-Isolation)", + BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION); + else if (pPsdScan->nAntDet_Result == 2) + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (%d~%d)", "Ant Det Result", "2-Antenna (Good-Isolation)", + BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION+pPsdScan->nAntDet_ThresOffset, BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION); + else + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (%d~%d)", "Ant Det Result", "1-Antenna", + BT_8723B_1ANT_ANTDET_PSDTHRES_1ANT, BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION+pPsdScan->nAntDet_ThresOffset); + + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s ", "Antenna Detection Finish", + (pBoardInfo->btdmAntDetFinish? "Yes":"No")); + CL_PRINTF(cliBuf); + + switch(pPsdScan->nAntDet_Result) + { + case 0: + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(BT is not available)"); + break; + case 1: // 2-Ant bad-isolation + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(BT is available)"); + break; + case 2: // 2-Ant good-isolation + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(BT is available)"); + break; + case 3: // 1-Ant + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(BT is available)"); + break; + case 4: + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(Uncertainty result)"); + break; + case 5: + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(Pre-Scan fai)"); + break; + case 6: + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(WiFi is Scanning)"); + break; + case 7: + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(BT is not idle)"); + break; + case 8: + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(Abort by WiFi Scanning)"); + break; + case 9: + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(Antenna Init is not ready)"); + break; + case 10: + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(BT is Inquiry or page)"); + break; + case 11: + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "(BT is Disabled)"); + break; +} + CL_PRINTF(cliBuf); + + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Ant Detect Total Count",pPsdScan->bAntDet_TryCount); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Ant Detect Fail Count",pPsdScan->bAntDet_FailCount); + CL_PRINTF(cliBuf); + + if ( (!pBoardInfo->btdmAntDetFinish) && (pPsdScan->nAntDet_Result != 5) ) + return; + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Response",(pPsdScan->nAntDet_Result? "ok":"fail")); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ms", "BT Tx Time", pPsdScan->nAntDet_BTTxTime); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "BT Tx Ch", pPsdScan->nAntDet_BTLEChannel); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "WiFi PSD Cent-Ch/Offset/Span", + pPsdScan->nRealCentFreq, pPsdScan->nRealOffset, pPsdScan->nRealSpan); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d dB", "PSD Pre-Scan Peak Value", pPsdScan->nAntDet_PrePSDScanPeakVal/100); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (<= %d)", "PSD Pre-Scan result", + (pPsdScan->nAntDet_Result != 5? "ok":"fail"), BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND+pPsdScan->nAntDet_ThresOffset); + CL_PRINTF(cliBuf); + + if (pPsdScan->nAntDet_Result == 5) + return; + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s dB", "PSD Scan Peak Value", pPsdScan->nAntDet_PeakVal); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s MHz", "PSD Scan Peak Freq", pPsdScan->nAntDet_PeakFreq); + CL_PRINTF(cliBuf); + + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "TFBGA Package", + (pBoardInfo->bTfbgaPackage)? "Yes":"No"); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "PSD Threshold Offset", pPsdScan->nAntDet_ThresOffset); + CL_PRINTF(cliBuf); + +} + VOID -halbtc8723b1ant_ShowPSDData( +halbtc8723b1ant_PSD_ShowData( IN PBTC_COEXIST pBtCoexist ) { @@ -3097,13 +3428,11 @@ halbtc8723b1ant_ShowPSDData( u4Byte nDeltaFreqPerPoint; u4Byte freq,freq1,freq2,n=0,i=0, j=0, m=0, PsdRep1, PsdRep2; - DbgPrint("xxxxxxxxxxxxxxxx DisplayAntIsolation()\n"); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n============[Antenna Detection info] (%d/%d)============\n", - pPsdScan->nPSDGenCount, pPsdScan->nPSDGenTotalCount); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n\n============[PSD info] (%d)============\n", + pPsdScan->nPSDGenCount); CL_PRINTF(cliBuf); - if (pPsdScan->nPSDGenTotalCount == 0) + if (pPsdScan->nPSDGenCount == 0) { CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n No Data !!\n"); CL_PRINTF(cliBuf); @@ -3115,12 +3444,13 @@ halbtc8723b1ant_ShowPSDData( else nDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint; - if (pPsdScan->bIsPSDShowMaxOnly) + //if (pPsdScan->bIsPSDShowMaxOnly) + if (0) { PsdRep1 = pPsdScan->nPSDMaxValue/100; PsdRep2 = pPsdScan->nPSDMaxValue - PsdRep1 * 100; - freq = ((pPsdScan->realcentFreq-20) * 1000000 + pPsdScan->nPSDMaxValuePoint * nDeltaFreqPerPoint); + freq = ((pPsdScan->nRealCentFreq-20) * 1000000 + pPsdScan->nPSDMaxValuePoint * nDeltaFreqPerPoint); freq1 = freq/1000000; freq2 = freq/1000 - freq1 * 1000; @@ -3132,11 +3462,11 @@ halbtc8723b1ant_ShowPSDData( freq1, freq2); if (PsdRep2 < 10) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, ", Value = %d.0%d dB, (%d/%d) \n", - PsdRep1, PsdRep2, pPsdScan->nPSDGenCount, pPsdScan->nPSDGenTotalCount); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, ", Value = %d.0%d dB, (%d) \n", + PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue); else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, ", Value = %d.%d dB, %d, (%d/%d)\n", - PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue, pPsdScan->nPSDGenCount, pPsdScan->nPSDGenTotalCount); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, ", Value = %d.%d dB, (%d)\n", + PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue); CL_PRINTF(cliBuf); } @@ -3151,7 +3481,7 @@ halbtc8723b1ant_ShowPSDData( { do { - freq = ((pPsdScan->realcentFreq-20) * 1000000 + m * nDeltaFreqPerPoint); + freq = ((pPsdScan->nRealCentFreq-20) * 1000000 + m * nDeltaFreqPerPoint); freq1 = freq/1000000; freq2 = freq/1000 - freq1 * 1000; @@ -3181,7 +3511,7 @@ halbtc8723b1ant_ShowPSDData( CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.0%2d", freq1,freq2); else CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.%3d", freq1,freq2); -} + } i++; m++; @@ -3237,30 +3567,87 @@ halbtc8723b1ant_ShowPSDData( } -u4Byte -halbtc8723b1ant_GetPSDData( +VOID +halbtc8723b1ant_PSD_MaxHoldData( IN PBTC_COEXIST pBtCoexist, - IN u4Byte nPoint + IN u4Byte GenCount ) { - //reg 0x808[9:0]: FFT data x - //reg 0x808[22]: 0-->1 to get 1 FFT data y - //reg 0x8b4[15:0]: FFT data y report - - u4Byte val = 0, psd_report =0; - - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808); + u4Byte i=0, i_max=0, val_max=0, j; + + if (GenCount== 1) + { + memcpy(pPsdScan->nPSDReport_MaxHold, pPsdScan->nPSDReport, BT_8723B_1ANT_ANTDET_PSD_POINTS*sizeof(u4Byte)); - val &= 0xffbffc00; - val |= nPoint; - - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val); + for (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++) + { + //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\n", i, pPsdScan->nPSDReport_MaxHold[i])); + } - val |= 0x00400000; - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val); + pPsdScan->nPSDMaxValuePoint = 0; + pPsdScan->nPSDMaxValue = 0; + } + else + { + for (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++) + { + if (pPsdScan->nPSDReport[i] > pPsdScan->nPSDReport_MaxHold[i]) + pPsdScan->nPSDReport_MaxHold[i] = pPsdScan->nPSDReport[i]; - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x8b4); + //search Max Value + if (i ==pPsdScan->nPSDStartPoint ) + { + i_max = i; + val_max = pPsdScan->nPSDReport_MaxHold[i]; + } + else + { + if (pPsdScan->nPSDReport_MaxHold[i] > val_max) + { + i_max = i; + val_max = pPsdScan->nPSDReport_MaxHold[i]; + } + } + + //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\n", i, pPsdScan->nPSDReport_MaxHold[i])); + + } + + pPsdScan->nPSDMaxValuePoint = i_max; + pPsdScan->nPSDMaxValue = val_max; + + //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i_Max = %d, PSDReport_Max = %d dB\n", pPsdScan->nPSDMaxValuePoint + // ,pPsdScan->nPSDMaxValue)); + } + + +} + +u4Byte +halbtc8723b1ant_PSD_GetData( + IN PBTC_COEXIST pBtCoexist, + IN u4Byte nPoint + ) +{ + //reg 0x808[9:0]: FFT data x + //reg 0x808[22]: 0-->1 to get 1 FFT data y + //reg 0x8b4[15:0]: FFT data y report + + u4Byte val = 0, psd_report =0; + + val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808); + + val &= 0xffbffc00; + val |= nPoint; + + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val); + + val |= 0x00400000; + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val); + + + val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x8b4); psd_report = val & 0x0000ffff; @@ -3268,11 +3655,11 @@ halbtc8723b1ant_GetPSDData( } -void -halbtc8723b1ant_SweepPSDPoint( +VOID +halbtc8723b1ant_PSD_SweepPoint( IN PBTC_COEXIST pBtCoexist, IN u4Byte centFreq, - IN u4Byte offset, + IN s4Byte offset, IN u4Byte span, IN u4Byte points, IN u4Byte avgnum @@ -3285,6 +3672,7 @@ IN PBTC_COEXIST pBtCoexist, BOOLEAN outloop = FALSE; u1Byte flag = 0; u4Byte tmp, PsdRep1, PsdRep2; + u4Byte WiFi_OriginalChannel = 1; pPsdScan->bIsPSDRunning = TRUE; @@ -3294,13 +3682,17 @@ IN PBTC_COEXIST pBtCoexist, { case 0: //Get PSD parameters default: - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), centFreq=0x%x, offset=0x%x, span=0x%x\n", - centFreq, offset, span); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), centFreq=0x%x, offset=0x%x, span=0x%x\n", + // centFreq, offset, span)); pPsdScan->nPSDBandWidth = 40*1000000; pPsdScan->nPSDPoint = points; pPsdScan->nPSDStartBase = points/2; pPsdScan->nPSDAvgNum = avgnum; + pPsdScan->nRealCentFreq = centFreq; + pPsdScan->nRealOffset = offset; + pPsdScan->nRealSpan = span; + nPoints = pPsdScan->nPSDPoint; nDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint; @@ -3344,21 +3736,21 @@ IN PBTC_COEXIST pBtCoexist, } pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val); - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD BW= %d, DeltaFreq=%d\n" - , pPsdScan->nPSDBandWidth, nDeltaFreqPerPoint); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD BW= %d, DeltaFreq=%d\n" + // , pPsdScan->nPSDBandWidth, nDeltaFreqPerPoint)); flag = 1; break; case 1: //calculate the PSD point index from freq/offset/span nPSDCenterFreq = pPsdScan->nPSDBandWidth /2 +offset*(1000000); - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD Center Freq = %d\n", (centFreq + offset)); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD Center Freq = %d\n", (centFreq + offset))); nStartP = pPsdScan->nPSDStartBase + (nPSDCenterFreq - span *(1000000)/2) /nDeltaFreqPerPoint; pPsdScan->nPSDStartPoint = nStartP - pPsdScan->nPSDStartBase; - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Start PSD Poin Matrix Index = %d\n", pPsdScan->nPSDStartPoint); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), Start PSD Poin Matrix Index = %d\n", pPsdScan->nPSDStartPoint)); nStopP = pPsdScan->nPSDStartBase + (nPSDCenterFreq + span *(1000000)/2) /nDeltaFreqPerPoint; pPsdScan->nPSDStopPoint = nStopP - pPsdScan->nPSDStartBase-1; - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Stop PSD Poin Matrix Index = %d\n",pPsdScan->nPSDStopPoint); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), Stop PSD Poin Matrix Index = %d\n",pPsdScan->nPSDStopPoint)); flag = 2; break; @@ -3374,15 +3766,21 @@ IN PBTC_COEXIST pBtCoexist, val &= 0xfeffffff; pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val); + //store WiFi original channel + WiFi_OriginalChannel = pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff); + //Set RF channel if (centFreq == 2484) - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, 0xe); //WiFi TRx Mask on + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, 0xe); else pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, (centFreq-2412)/5 + 1); //WiFi TRx Mask on //Set RF mode = Rx, RF Gain = 0x8a0 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x0, 0xfffff, 0x308a0); + //Set RF Rx filter corner + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0x3e4); + //Set TRx mask off //un-lock TRx Mask setup pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x1); @@ -3403,11 +3801,11 @@ IN PBTC_COEXIST pBtCoexist, { if (i >= nPoints) { - psd_report = halbtc8723b1ant_GetPSDData(pBtCoexist,i-nPoints); + psd_report = halbtc8723b1ant_PSD_GetData(pBtCoexist,i-nPoints); } else { - psd_report = halbtc8723b1ant_GetPSDData(pBtCoexist,i); + psd_report = halbtc8723b1ant_PSD_GetData(pBtCoexist,i); } if (psd_report == 0) @@ -3415,8 +3813,7 @@ IN PBTC_COEXIST pBtCoexist, else //tmp = 20*log10((double)psd_report); //20*log2(x)/log2(10), log2Base return theresult of the psd_report*100 - tmp = 6 * halbtc8723b1ant_Log2Base(pBtCoexist, psd_report); - + tmp = 6 * halbtc8723b1ant_PSD_Log2Base(pBtCoexist, psd_report); n = i-pPsdScan->nPSDStartBase; pPsdScan->nPSDReport[n] = tmp; @@ -3426,17 +3823,17 @@ IN PBTC_COEXIST pBtCoexist, freq = ((centFreq-20) * 1000000 + n * nDeltaFreqPerPoint); freq1 = freq/1000000; freq2 = freq/1000 - freq1 * 1000; - +/* if (freq2 < 100) - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.0%d MHz)", n, freq1, freq2); + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.0%d MHz)", n, freq1, freq2)); else - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.%d MHz)", n, freq1, freq2); + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.%d MHz)", n, freq1, freq2)); if (PsdRep2 < 10) - DbgPrint(", PSDReport = %d (%d.0%d dB)\n",psd_report, PsdRep1, PsdRep2); + RT_TRACE(COMP_COEX, DBG_LOUD, (", PSDReport = %d (%d.0%d dB)\n",psd_report, PsdRep1, PsdRep2)); else - DbgPrint(", PSDReport = %d (%d.%d dB)\n",psd_report, PsdRep1,PsdRep2); - + RT_TRACE(COMP_COEX, DBG_LOUD, (", PSDReport = %d (%d.%d dB)\n",psd_report, PsdRep1,PsdRep2)); +*/ i++; k=0; @@ -3448,7 +3845,7 @@ IN PBTC_COEXIST pBtCoexist, break; } - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint()==============\n"); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint()==============\n")); } flag = 100; @@ -3475,10 +3872,17 @@ IN PBTC_COEXIST pBtCoexist, pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x808,val); //TRx Mask on + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); + + //lock TRx Mask setup pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x0); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x0); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); + //Set RF Rx filter corner + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0x0); + + //restore WiFi original channel + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, WiFi_OriginalChannel); outloop = TRUE; break; @@ -3495,98 +3899,337 @@ IN PBTC_COEXIST pBtCoexist, } VOID -halbtc8723b1ant_AntennaDetection( +halbtc8723b1ant_PSD_AntennaDetection( IN PBTC_COEXIST pBtCoexist, - IN u4Byte centFreq, - IN u4Byte offset, - IN u4Byte span, - IN u4Byte seconds + IN u4Byte BTTxTime, + IN u4Byte BTLEChannel ) { - u4Byte realseconds = 0, i=0, i_max=0, val_max=0, j; + u4Byte realseconds = 0, i=0, j=0; + u4Byte WLPSD_CentFreq = 2484, WLPSD_Span = 2, WLPSD_SweepCount = 50; + s4Byte WLPSD_Offset = -4; + u1Byte BTLECh[13] = {3,6,8,11,13,16,18,21,23,26,28,31,33}; + + u1Byte H2C_Parameter[3] ={0},u1Tmpa,u1Tmpb; + + u1Byte state=0; + BOOLEAN outloop = FALSE, BTResp = FALSE, bScan ,bRoam; + u4Byte freq,freq1,freq2,PsdRep1, PsdRep2, nDeltaFreqPerPoint,u4Tmp; + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + + pBoardInfo->btdmAntDetFinish = FALSE; + memset(pPsdScan->nAntDet_PeakVal, 0, 16*sizeof(UCHAR)); + memset(pPsdScan->nAntDet_PeakFreq, 0, 16*sizeof(UCHAR)); + + if (pBoardInfo->bTfbgaPackage) //for TFBGA + pPsdScan->nAntDet_ThresOffset = 5; + else + pPsdScan->nAntDet_ThresOffset = 0; + + do + { + switch(state) + { + case 0: + if (BTLEChannel == 39) + WLPSD_CentFreq = 2484; + else + { + for (i=1; i<=13; i++) + { + if (BTLECh[i-1] == BTLEChannel) + { + WLPSD_CentFreq = 2412 + (i-1) * 5; + break; + } + } + + if (i == 14) + { + + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Abort!!, Invalid LE channel = %d\n ", BTLEChannel)); + outloop = TRUE; + break; + } + } + + WLPSD_SweepCount = BTTxTime * 238 /100; //BTTxTime/0.42 + if (WLPSD_SweepCount % 5 != 0) + WLPSD_SweepCount = (WLPSD_SweepCount/5 + 1) * 5; + + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), BT_LETxTime=%d, BT_LECh = %d\n", BTTxTime, BTLEChannel)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), WLPSD_CentFreq=%d, WLPSD_Offset = %d, WLPSD_Span = %d, WLPSD_SweepCount = %d\n", + WLPSD_CentFreq, WLPSD_Offset, WLPSD_Span,WLPSD_SweepCount)); + + state = 1; + break; + case 1: //stop coex DM & set antenna path //Stop Coex DM pBtCoexist->bStopCoexDm = TRUE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Stop Coex DM!!\n")); + + //set native power save + halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + //Set TDMA off, + halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); + + //Set coex table + halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); + + if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Antenna at Main Port\n")); + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Antenna at Aux Port\n")); + } + //Set Antenna path, switch WiFi to un-certain antenna port halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, FALSE); - //Mailbox handshake - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, 0x0); - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Set BT LE Tx\n"); + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Set Antenna to BT!!\n")); - //sweep PSD - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), \n"); - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), \n"); - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), \n"); + //Set AFH mask on at WiFi channel 2472MHz +/- 10MHz + H2C_Parameter[0] = 0x1; + H2C_Parameter[1] = 0xd; + H2C_Parameter[2] = 0x14; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Set AFH on, Cent-Ch= %d, Mask=%d\n", + H2C_Parameter[1],H2C_Parameter[2])); - //Analysis Data + pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); - do + u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948); + u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765); + u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778); + + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x778=0x%x\n", + u4Tmp, u1Tmpa, u1Tmpb)); + + state =2; + break; + case 2: //Pre-sweep background psd + for (pPsdScan->nPSDGenCount=1; pPsdScan->nPSDGenCount<=3; pPsdScan->nPSDGenCount++) { - halbtc8723b1ant_SweepPSDPoint(pBtCoexist, centFreq, offset,span, BT_8723B_1ANT_ANTDET_PSD_POINTS, BT_8723B_1ANT_ANTDET_PSD_AVGNUM); + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), PSDGenCount = %d\n ", pPsdScan->nPSDGenCount)); + halbtc8723b1ant_PSD_SweepPoint(pBtCoexist, WLPSD_CentFreq, WLPSD_Offset, WLPSD_Span, BT_8723B_1ANT_ANTDET_PSD_POINTS, BT_8723B_1ANT_ANTDET_PSD_AVGNUM); + halbtc8723b1ant_PSD_MaxHoldData(pBtCoexist, pPsdScan->nPSDGenCount); + } - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), PSDGenCount = %d\n ", pPsdScan->nPSDGenCount); + pPsdScan->nAntDet_PrePSDScanPeakVal = pPsdScan->nPSDMaxValue; - if (pPsdScan->nPSDGenCount == 0) + if (pPsdScan->nPSDMaxValue > (BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND+pPsdScan->nAntDet_ThresOffset)*100) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Abort Antenna Detection!! becaus background = %d > thres (%d)\n", + pPsdScan->nPSDMaxValue/100, BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND+pPsdScan->nAntDet_ThresOffset)); + pBoardInfo->btdmAntDetFinish = FALSE; + pBoardInfo->btdmAntNumByAntDet = 1; + pPsdScan->nAntDet_Result = 5; + state = 99; + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Start Antenna Detection!! becaus background = %d <= thres (%d)\n", + pPsdScan->nPSDMaxValue/100, BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND+pPsdScan->nAntDet_ThresOffset)); + state = 3; + } + break; + case 3: + BTResp = pBtCoexist->fBtcSetBtAntDetection(pBtCoexist, (u1Byte)(BTTxTime&0xff), (u1Byte)(BTLEChannel&0xff)); + + for (pPsdScan->nPSDGenCount=1; pPsdScan->nPSDGenCount<=WLPSD_SweepCount; pPsdScan->nPSDGenCount++) { - memcpy(pPsdScan->nPSDReport_MaxHold, pPsdScan->nPSDReport, BT_8723B_1ANT_ANTDET_PSD_POINTS*sizeof(u4Byte)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), PSDGenCount = %d\n ", pPsdScan->nPSDGenCount)); + halbtc8723b1ant_PSD_SweepPoint(pBtCoexist, WLPSD_CentFreq, WLPSD_Offset, WLPSD_Span, BT_8723B_1ANT_ANTDET_PSD_POINTS, BT_8723B_1ANT_ANTDET_PSD_AVGNUM); + halbtc8723b1ant_PSD_MaxHoldData(pBtCoexist, pPsdScan->nPSDGenCount); - for (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++) + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam); + + if (bScan ||bRoam) { - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\n", i, pPsdScan->nPSDReport_MaxHold[i]); + pBoardInfo->btdmAntDetFinish = FALSE; + pBoardInfo->btdmAntNumByAntDet = 1; + pPsdScan->nAntDet_Result = 8; + state = 99; + break; } } + + pPsdScan->nAntDet_PSDScanPeakVal = pPsdScan->nPSDMaxValue; + pPsdScan->nAntDet_PSDScanPeakFreq = pPsdScan->nPSDMaxValuePoint; + state = 4; + break; + case 4: + + if (pPsdScan->nPSDPoint == 0) + nDeltaFreqPerPoint = 0; else + nDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint; + + PsdRep1 = pPsdScan->nPSDMaxValue/100; + PsdRep2 = pPsdScan->nPSDMaxValue - PsdRep1 * 100; + + freq = ((pPsdScan->nRealCentFreq-20) * 1000000 + pPsdScan->nPSDMaxValuePoint * nDeltaFreqPerPoint); + freq1 = freq/1000000; + freq2 = freq/1000 - freq1 * 1000; + + if (freq2 < 100) { - for (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++) + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Max Value: Freq = %d.0%d MHz", freq1, freq2)); + CL_SPRINTF(pPsdScan->nAntDet_PeakFreq, BT_8723B_1ANT_ANTDET_BUF_LEN, "%d.0%d", freq1,freq2); + } + else { - if (pPsdScan->nPSDReport[i] > pPsdScan->nPSDReport_MaxHold[i]) - pPsdScan->nPSDReport_MaxHold[i] = pPsdScan->nPSDReport[i]; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Max Value: Freq = %d.%d MHz", freq1, freq2)); + CL_SPRINTF(pPsdScan->nAntDet_PeakFreq, BT_8723B_1ANT_ANTDET_BUF_LEN, "%d.%d", freq1,freq2); + } - //search Max Value - if (i ==pPsdScan->nPSDStartPoint ) + if (PsdRep2 < 10) { - i_max = i; - val_max = pPsdScan->nPSDReport_MaxHold[i]; + RT_TRACE(COMP_COEX, DBG_LOUD, (", Value = %d.0%d dB\n", PsdRep1, PsdRep2)); + CL_SPRINTF(pPsdScan->nAntDet_PeakVal, BT_8723B_1ANT_ANTDET_BUF_LEN, "%d.0%d", PsdRep1,PsdRep2); } else { - if (pPsdScan->nPSDReport_MaxHold[i] > val_max) + RT_TRACE(COMP_COEX, DBG_LOUD, (", Value = %d.%d dB\n",PsdRep1, PsdRep2)); + CL_SPRINTF(pPsdScan->nAntDet_PeakVal, BT_8723B_1ANT_ANTDET_BUF_LEN, "%d.%d", PsdRep1,PsdRep2); + } + + pPsdScan->nAntDet_IsBTReplyAvailable = TRUE; + + if (BTResp == FALSE) + { + pPsdScan->nAntDet_IsBTReplyAvailable = FALSE; + pPsdScan->nAntDet_Result = 0; + pBoardInfo->btdmAntDetFinish = FALSE; + pBoardInfo->btdmAntNumByAntDet = 1; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), BT Response = Fail \n ")); + } + else if (pPsdScan->nPSDMaxValue > (BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION)*100) + { + pPsdScan->nAntDet_Result = 1; + pBoardInfo->btdmAntDetFinish = TRUE; + pBoardInfo->btdmAntNumByAntDet = 2; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 2-Ant, Bad-Isolation!! \n")); + } + else if (pPsdScan->nPSDMaxValue > (BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION+pPsdScan->nAntDet_ThresOffset)*100) { - i_max = i; - val_max = pPsdScan->nPSDReport_MaxHold[i]; + pPsdScan->nAntDet_Result = 2; + pBoardInfo->btdmAntDetFinish = TRUE; + pBoardInfo->btdmAntNumByAntDet = 2; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 2-Ant, Good-Isolation!! \n")); + } + else if (pPsdScan->nPSDMaxValue > (BT_8723B_1ANT_ANTDET_PSDTHRES_1ANT)*100) + { + pPsdScan->nAntDet_Result = 3; + pBoardInfo->btdmAntDetFinish = TRUE; + pBoardInfo->btdmAntNumByAntDet = 1; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 1-Ant!!\n")); } + else + { + pPsdScan->nAntDet_Result = 4; + pBoardInfo->btdmAntDetFinish = FALSE; + pBoardInfo->btdmAntNumByAntDet = 1; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 1-Ant, un-certainity!!\n")); } - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\n", i, pPsdScan->nPSDReport_MaxHold[i]); + state = 99; + break; + case 99: //restore setup + + //Set AFH mask off at WiFi channel 2472MHz +/- 10MHz + H2C_Parameter[0] = 0x0; + H2C_Parameter[1] = 0x0; + H2C_Parameter[2] = 0x0; + + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Set AFH on, Cent-Ch= %d, Mask=%d\n", + H2C_Parameter[1],H2C_Parameter[2])); + + pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); + + //Set Antenna Path + halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Set Antenna to PTA\n!!")); + + //Resume Coex DM + pBtCoexist->bStopCoexDm = FALSE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Resume Coex DM\n!!")); + + //stimulate coex running + halbtc8723b1ant_RunCoexistMechanism(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Stimulate Coex running\n!!")); + outloop = TRUE; + break; } - pPsdScan->nPSDMaxValuePoint = i_max; - pPsdScan->nPSDMaxValue = val_max; + }while(!outloop); + + - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i_Max = %d, PSDReport_Max = %d dB, TotalCnt = %d\n", pPsdScan->nPSDMaxValuePoint - ,pPsdScan->nPSDMaxValue, pPsdScan->nPSDGenTotalCount); } - if (pPsdScan->nPSDGenCount+1 <= pPsdScan->realseconds) +VOID +halbtc8723b1ant_PSD_AntennaDetectionCheck( + IN PBTC_COEXIST pBtCoexist + ) +{ + static u4Byte AntDetCount = 0, AntDetFailCount = 0; + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + + BOOLEAN bScan, bRoam; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam); + + + pPsdScan->nAntDet_BTTxTime = 20; //0.42ms*50 = 20ms + pPsdScan->nAntDet_BTLEChannel = 39; + + AntDetCount++; + + pPsdScan->bAntDet_TryCount = AntDetCount; + + if (bScan ||bRoam) { - pPsdScan->nPSDGenCount++; - pPsdScan->nPSDGenTotalCount++; + pBoardInfo->btdmAntDetFinish = FALSE; + pPsdScan->nAntDet_Result = 6; + } + else if(pBtCoexist->btInfo.bBtDisabled) + { + pBoardInfo->btdmAntDetFinish = FALSE; + pPsdScan->nAntDet_Result = 11; + } + else if (pCoexSta->nNumOfProfile >= 1) + { + pBoardInfo->btdmAntDetFinish = FALSE; + pPsdScan->nAntDet_Result = 7; + } + else if (!pPsdScan->nAntDet_IsAntDetAvailable) //Antenna initial setup is not ready + { + pBoardInfo->btdmAntDetFinish = FALSE; + pPsdScan->nAntDet_Result = 9; + } + else if (pCoexSta->bC2hBtInquiryPage) + { + pBoardInfo->btdmAntDetFinish = FALSE; + pPsdScan->nAntDet_Result = 10; } else { - break; + halbtc8723b1ant_PSD_AntennaDetection(pBtCoexist, pPsdScan->nAntDet_BTTxTime, pPsdScan->nAntDet_BTLEChannel); } - } while (1); - //Set Antenna Path - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); + if (!pBoardInfo->btdmAntDetFinish) + AntDetFailCount++; - //Resume Coex DM - pBtCoexist->bStopCoexDm = FALSE; + pPsdScan->bAntDet_FailCount = AntDetFailCount; } @@ -3606,6 +4249,11 @@ EXhalbtc8723b1ant_PowerOnSetting( u1Byte u1Tmp=0x0; u2Byte u2Tmp=0x0; + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx Execute 8723b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n")); + + RT_TRACE(COMP_COEX, DBG_LOUD, ("Ant Det Finish = %s, Ant Det Number = %d\n", + (pBoardInfo->btdmAntDetFinish? "Yes":"No"), pBoardInfo->btdmAntNumByAntDet)); + pBtCoexist->bStopCoexDm = TRUE; pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20); @@ -3686,7 +4334,7 @@ EXhalbtc8723b1ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); pBtCoexist->bStopCoexDm = FALSE; @@ -3711,12 +4359,6 @@ EXhalbtc8723b1ant_DisplayCoexInfo( u4Byte fwVer=0, btPatchVer=0; static u1Byte PopReportIn10s = 0; - if (pPsdScan->bIsAntDetEnable == TRUE) - { - halbtc8723b1ant_ShowPSDData(pBtCoexist); - return; - } - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============"); CL_PRINTF(cliBuf); @@ -3735,9 +4377,25 @@ EXhalbtc8723b1ant_DisplayCoexInfo( CL_PRINTF(cliBuf); } - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Ant PG Num/ Ant Mech/ Ant Pos:", \ + if (pPsdScan->bAntDet_TryCount == 0) + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Ant PG Num/ Mech/ Pos", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos); CL_PRINTF(cliBuf); + } + else + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d (%d/%d/%d)", "Ant PG Num/ Mech(Ant_Det)/ Pos", + pBoardInfo->pgAntNum, pBoardInfo->btdmAntNumByAntDet, pBoardInfo->btdmAntPos, + pPsdScan->bAntDet_TryCount, pPsdScan->bAntDet_FailCount, pPsdScan->nAntDet_Result); + CL_PRINTF(cliBuf); + + if (pBoardInfo->btdmAntDetFinish) + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "Ant Det PSD Value", pPsdScan->nAntDet_PeakVal); + CL_PRINTF(cliBuf); + } + } CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \ ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion); @@ -3745,15 +4403,15 @@ EXhalbtc8723b1ant_DisplayCoexInfo( pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)", "CoexVer/ FwVer/ PatchVer", \ - GLCoexVerDate8723b1Ant, GLCoexVer8723b1Ant, fwVer, btPatchVer, btPatchVer); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)/ %c", "Version Coex/ Fw/ Patch/ Cut", \ + GLCoexVerDate8723b1Ant, GLCoexVer8723b1Ant, fwVer, btPatchVer, btPatchVer, pCoexSta->nCutVersion+65); CL_PRINTF(cliBuf); CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \ pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1], pCoexDm->wifiChnlInfo[2]); CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s", "Wifi bHi-Pri/ CCK lock/ CCK ever-lock", \ + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s", "WifibHiPri/ Ccklock/ CckEverLock", \ (pCoexSta->bWiFiIsHighPriTask? "Yes":"No"), (pCoexSta->bCCKLock? "Yes":"No"), (pCoexSta->bCCKEverLock? "Yes":"No")); @@ -3780,8 +4438,8 @@ EXhalbtc8723b1ant_DisplayCoexInfo( PopReportIn10s = 0; } - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d / %d", "SCO/HID/PAN/A2DP/Hi-Pri", \ - pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist, pBtLinkInfo->bBtHiPriLinkExist); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d / %d / %d", "SCO/HID/PAN/A2DP/NameReq/WHQL", \ + pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist, pCoexSta->bC2hBtRemoteNameReq, pCoexSta->bBtWhckTest ); CL_PRINTF(cliBuf); if (pStackInfo->bProfileNotified) @@ -3796,8 +4454,8 @@ EXhalbtc8723b1ant_DisplayCoexInfo( } btInfoExt = pCoexSta->btInfoExt; - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \ - (btInfoExt&BIT0)? "Basic rate":"EDR rate"); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %d", "A2DP Rate/Bitpool", \ + (btInfoExt&BIT0)? "BR":"EDR", pCoexSta->nA2DPBitPool); CL_PRINTF(cliBuf); for(i=0; ibManualControl) + + if(pBtCoexist->bManualControl) + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism] (before Manual)============"); + } + else { - // Sw mechanism CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============"); + } + CL_PRINTF(cliBuf); CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "SM[LowPenaltyRA]", \ @@ -3832,14 +4496,33 @@ EXhalbtc8723b1ant_DisplayCoexInfo( CL_PRINTF(cliBuf); // Fw mechanism - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============"); + if(pBtCoexist->bManualControl) + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism] (before Manual) ============"); + } + else + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============"); + } + CL_PRINTF(cliBuf); psTdmaCase = pCoexDm->curPsTdma; - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)", "PS TDMA", \ + if (pBoardInfo->btdmAntNumByAntDet == 2) + { + if (pCoexDm->bCurPsTdmaOn) + psTdmaCase = psTdmaCase +100; //for WiFi RSSI low or BT RSSI low + else + psTdmaCase = 1; //always translate to TDMA(off,1) for TDMA-off case + } + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)", "PS TDMA", \ pCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1], pCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3], - pCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust); + pCoexDm->psTdmaPara[4], psTdmaCase, + (pCoexDm->bCurPsTdmaOn? "On":"Off"), + (pCoexDm->bAutoTdmaAdjust? "Adj":"Fix") ); + CL_PRINTF(cliBuf); CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Coex Table Type", \ @@ -3855,7 +4538,6 @@ EXhalbtc8723b1ant_DisplayCoexInfo( pCoexDm->errorCondition); CL_PRINTF(cliBuf); */ - } // Hw setting CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============"); @@ -3973,7 +4655,7 @@ EXhalbtc8723b1ant_IpsNotify( if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); pCoexSta->bUnderIps = TRUE; halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); @@ -3983,7 +4665,7 @@ EXhalbtc8723b1ant_IpsNotify( } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); halbtc8723b1ant_InitCoexDm(pBtCoexist); @@ -4004,12 +4686,12 @@ EXhalbtc8723b1ant_LpsNotify( if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); pCoexSta->bUnderLps = TRUE; } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); pCoexSta->bUnderLps = FALSE; } } @@ -4036,8 +4718,8 @@ EXhalbtc8723b1ant_ScanNotify( if(BTC_SCAN_START == type) { pCoexSta->bWiFiIsHighPriTask = TRUE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); - + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); + pPsdScan->nAntDet_IsAntDetAvailable = TRUE; halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948); @@ -4045,13 +4727,13 @@ EXhalbtc8723b1ant_ScanNotify( u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", u4Tmp, u1Tmpa, u1Tmpb)); } else { pCoexSta->bWiFiIsHighPriTask = FALSE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum); } @@ -4087,7 +4769,7 @@ EXhalbtc8723b1ant_ScanNotify( if(BTC_SCAN_START == type) { - //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); if(!bWifiConnected) // non-connected scan { halbtc8723b1ant_ActionWifiNotConnectedScan(pBtCoexist); @@ -4099,7 +4781,7 @@ EXhalbtc8723b1ant_ScanNotify( } else if(BTC_SCAN_FINISH == type) { - //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); if(!bWifiConnected) // non-connected scan { halbtc8723b1ant_ActionWifiNotConnected(pBtCoexist); @@ -4131,15 +4813,16 @@ EXhalbtc8723b1ant_ConnectNotify( if(BTC_ASSOCIATE_START == type) { pCoexSta->bWiFiIsHighPriTask = TRUE; + pPsdScan->nAntDet_IsAntDetAvailable = TRUE; halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); pCoexDm->nArpCnt = 0; } else { pCoexSta->bWiFiIsHighPriTask = FALSE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); //pCoexDm->nArpCnt = 0; } @@ -4167,12 +4850,12 @@ EXhalbtc8723b1ant_ConnectNotify( if(BTC_ASSOCIATE_START == type) { - //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); } else if(BTC_ASSOCIATE_FINISH == type) { - //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(!bWifiConnected) // non-connected scan @@ -4204,9 +4887,10 @@ EXhalbtc8723b1ant_MediaStatusNotify( if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); + pPsdScan->nAntDet_IsAntDetAvailable = TRUE; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode); //Set CCK Tx/Rx high Pri except 11b mode @@ -4228,7 +4912,7 @@ EXhalbtc8723b1ant_MediaStatusNotify( } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); pCoexDm->nArpCnt = 0; pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx @@ -4256,7 +4940,7 @@ EXhalbtc8723b1ant_MediaStatusNotify( pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1]; pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x66=0x%x\n", H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); @@ -4271,9 +4955,11 @@ EXhalbtc8723b1ant_SpecialPacketNotify( BOOLEAN bBtHsOn=FALSE; u4Byte wifiLinkStatus=0; u4Byte numOfWifiLink=0; - BOOLEAN bBtCtrlAggBufSize=FALSE; + BOOLEAN bBtCtrlAggBufSize=FALSE, bUnder4way=FALSE; u1Byte aggBufSize=5; + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way); + if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm || pBtCoexist->btInfo.bBtDisabled ) @@ -4285,12 +4971,12 @@ EXhalbtc8723b1ant_SpecialPacketNotify( { if (BTC_PACKET_ARP == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet ARP notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet ARP notify\n")); pCoexDm->nArpCnt++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt)); - if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) + if((pCoexDm->nArpCnt >= 10) && (!bUnder4way)) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) { pCoexSta->bWiFiIsHighPriTask = FALSE; } @@ -4302,13 +4988,13 @@ EXhalbtc8723b1ant_SpecialPacketNotify( else { pCoexSta->bWiFiIsHighPriTask = TRUE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet DHCP or EAPOL notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet DHCP or EAPOL notify\n")); } } else { pCoexSta->bWiFiIsHighPriTask = FALSE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet [Type = %d] notify\n", type)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet [Type = %d] notify\n", type)); } pCoexSta->specialPktPeriodCnt = 0; @@ -4355,6 +5041,7 @@ EXhalbtc8723b1ant_BtInfoNotify( u1Byte i, rspSource=0; BOOLEAN bWifiConnected=FALSE; BOOLEAN bBtBusy=FALSE; + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; pCoexSta->bC2hBtInfoReqSent = FALSE; @@ -4363,7 +5050,7 @@ EXhalbtc8723b1ant_BtInfoNotify( rspSource = BT_INFO_SRC_8723B_1ANT_WIFI_FW; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -4371,11 +5058,11 @@ EXhalbtc8723b1ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } @@ -4394,9 +5081,9 @@ EXhalbtc8723b1ant_BtInfoNotify( pCoexSta->popEventCnt++; if (pCoexSta->btInfoC2h[rspSource][2]&0x20) - pCoexSta->bC2hBtPage = TRUE; + pCoexSta->bC2hBtRemoteNameReq = TRUE; else - pCoexSta->bC2hBtPage = FALSE; + pCoexSta->bC2hBtRemoteNameReq = FALSE; pCoexSta->btRssi = pCoexSta->btInfoC2h[rspSource][3]*2-90; @@ -4405,20 +5092,55 @@ EXhalbtc8723b1ant_BtInfoNotify( pCoexSta->btInfoExt = pCoexSta->btInfoC2h[rspSource][4]; + if (pCoexSta->btInfoC2h[rspSource][1] == 0x49) + { + pCoexSta->nA2DPBitPool = + pCoexSta->btInfoC2h[rspSource][6]; + } + else + pCoexSta->nA2DPBitPool = 0; + pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask); - if(!pCoexSta->bBtTxRxMask) + +#if BT_8723B_1ANT_ANTDET_ENABLE +#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE + if ((pBoardInfo->btdmAntDetFinish) && (pBoardInfo->btdmAntNumByAntDet == 2)) + { + if(pCoexSta->bBtTxRxMask) + { + /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x1\n")); + + //BT TRx Mask un-lock 0x2c[0], 0x30[0] = 1 + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x2c, 0x7c45); + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x30, 0x7c45); + + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x1); + } + } + else +#endif +#endif + { - /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */ - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n")); - pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); + if(!pCoexSta->bBtTxRxMask) + { + /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n")); + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); + + //BT TRx Mask lock 0x2c[0], 0x30[0] = 0 + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x2c, 0x7c44); + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x30, 0x7c44); + } } // Here we need to resend some wifi info to BT // because bt is reset and loss of the info. if(pCoexSta->btInfoExt & BIT1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(bWifiConnected) { @@ -4434,7 +5156,7 @@ EXhalbtc8723b1ant_BtInfoNotify( { if(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); } } @@ -4460,6 +5182,8 @@ EXhalbtc8723b1ant_BtInfoNotify( else pCoexSta->bC2hBtInquiryPage = FALSE; + pCoexSta->nNumOfProfile = 0; + // set link exist status if(!(btInfo&BT_INFO_8723B_1ANT_B_CONNECTION)) { @@ -4475,32 +5199,60 @@ EXhalbtc8723b1ant_BtInfoNotify( { pCoexSta->bBtLinkExist = TRUE; if(btInfo & BT_INFO_8723B_1ANT_B_FTP) + { pCoexSta->bPanExist = TRUE; + pCoexSta->nNumOfProfile++; + } else pCoexSta->bPanExist = FALSE; if(btInfo & BT_INFO_8723B_1ANT_B_A2DP) + { pCoexSta->bA2dpExist = TRUE; + pCoexSta->nNumOfProfile++; + } else pCoexSta->bA2dpExist = FALSE; if(btInfo & BT_INFO_8723B_1ANT_B_HID) + { pCoexSta->bHidExist = TRUE; + pCoexSta->nNumOfProfile++; + } else pCoexSta->bHidExist = FALSE; if(btInfo & BT_INFO_8723B_1ANT_B_SCO_ESCO) + { pCoexSta->bScoExist = TRUE; + pCoexSta->nNumOfProfile++; + } else pCoexSta->bScoExist = FALSE; - if ( (pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) ) + if ((pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) &&( pCoexSta->bScoExist == FALSE)) { if (pCoexSta->highPriorityTx + pCoexSta->highPriorityRx >= 160) + { pCoexSta->bHidExist = TRUE; + pCoexSta->wrongProfileNotification++; + pCoexSta->nNumOfProfile++; + btInfo = btInfo | 0x28; + } } //Add Hi-Pri Tx/Rx counter to avoid false detection - if ( ( (pCoexSta->bHidExist) || (pCoexSta->bScoExist) ) && (pCoexSta->highPriorityTx > 60) && (pCoexSta->highPriorityRx > 60) - && (!pCoexSta->bC2hBtInquiryPage)) + if (((pCoexSta->bHidExist) || (pCoexSta->bScoExist)) && (pCoexSta->highPriorityTx + pCoexSta->highPriorityRx >= 160) + && (!pCoexSta->bC2hBtInquiryPage)) pCoexSta->bBtHiPriLinkExist = TRUE; + + if((btInfo&BT_INFO_8723B_1ANT_B_ACL_BUSY) && (pCoexSta->nNumOfProfile == 0)) + { + if (pCoexSta->lowPriorityTx + pCoexSta->lowPriorityRx >= 160) + { + pCoexSta->bPanExist = TRUE; + pCoexSta->nNumOfProfile++; + pCoexSta->wrongProfileNotification++; + btInfo = btInfo | 0x88; + } + } } halbtc8723b1ant_UpdateBtLinkInfo(pBtCoexist); @@ -4510,30 +5262,30 @@ EXhalbtc8723b1ant_BtInfoNotify( if(!(btInfo&BT_INFO_8723B_1ANT_B_CONNECTION)) { pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); } else if(btInfo == BT_INFO_8723B_1ANT_B_CONNECTION) // connection exists but no busy { pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); } else if((btInfo&BT_INFO_8723B_1ANT_B_SCO_ESCO) || (btInfo&BT_INFO_8723B_1ANT_B_SCO_BUSY)) { pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_SCO_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); } else if(btInfo&BT_INFO_8723B_1ANT_B_ACL_BUSY) { if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus) pCoexDm->bAutoTdmaAdjust = FALSE; pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_ACL_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); } else { pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_MAX; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); } if( (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || @@ -4556,16 +5308,16 @@ EXhalbtc8723b1ant_RfStatusNotify( u4Byte u4Tmp; u1Byte u1Tmpa,u1Tmpb, u1Tmpc; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF Status notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RF Status notify\n")); if(BTC_RF_ON == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF is turned ON!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RF is turned ON!!\n")); pBtCoexist->bStopCoexDm = FALSE; } else if(BTC_RF_OFF == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF is turned OFF!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RF is turned OFF!!\n")); halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); @@ -4581,7 +5333,7 @@ EXhalbtc8723b1ant_RfStatusNotify( u1Tmpc = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n", u4Tmp, u1Tmpa, u1Tmpb, u1Tmpc)); } @@ -4594,7 +5346,7 @@ EXhalbtc8723b1ant_HaltNotify( { u4Byte u4Tmp; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); @@ -4614,11 +5366,11 @@ EXhalbtc8723b1ant_PnpNotify( IN u1Byte pnpState ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify\n")); if(BTC_WIFI_PNP_SLEEP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to SLEEP\n")); halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); @@ -4630,7 +5382,7 @@ EXhalbtc8723b1ant_PnpNotify( } else if(BTC_WIFI_PNP_WAKE_UP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to WAKE UP\n")); pBtCoexist->bStopCoexDm = FALSE; halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); halbtc8723b1ant_InitCoexDm(pBtCoexist); @@ -4643,7 +5395,7 @@ EXhalbtc8723b1ant_CoexDmReset( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], *****************Coex DM Reset*****************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], *****************Coex DM Reset*****************\n")); halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); @@ -4660,22 +5412,23 @@ EXhalbtc8723b1ant_Periodical( u4Byte fwVer=0, btPatchVer=0; PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); if(disVerInfoCnt <= 5) { disVerInfoCnt += 1; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", GLCoexVerDate8723b1Ant, GLCoexVer8723b1Ant, fwVer, btPatchVer, btPatchVer)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); } #if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 0) @@ -4684,16 +5437,25 @@ EXhalbtc8723b1ant_Periodical( #else halbtc8723b1ant_MonitorBtCtr(pBtCoexist); halbtc8723b1ant_MonitorWiFiCtr(pBtCoexist); +#if BT_8723B_1ANT_ANTDET_ENABLE + halbtc8723b1ant_MonitorBtEnableDisable(pBtCoexist); +#endif + + if ( (pCoexSta->highPriorityTx + pCoexSta->highPriorityRx < 50) && (pBtLinkInfo->bHidExist == TRUE)) + { + pBtLinkInfo->bHidExist = FALSE; + } if( halbtc8723b1ant_IsWifiStatusChanged(pBtCoexist) || pCoexDm->bAutoTdmaAdjust ) { - halbtc8723b1ant_RunCoexistMechanism(pBtCoexist); } pCoexSta->specialPktPeriodCnt++; + // sample to set bt to execute Ant detection + //pBtCoexist->fBtcSetBtAntDetection(pBtCoexist, 20, 14); /* if (pPsdScan->bIsAntDetEnable) { @@ -4717,70 +5479,111 @@ EXhalbtc8723b1ant_AntennaDetection( IN u4Byte seconds ) { - pPsdScan->bIsAntDetEnable = FALSE; + static u4Byte AntDetCount = 0, AntDetFailCount = 0; + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + BOOLEAN bScan, bRoam; + +#if BT_8723B_1ANT_ANTDET_ENABLE - //do antenna detection periodically (every 2 seconds) - if (centFreq == 0) + if (seconds == 0) { + pPsdScan->bAntDet_TryCount = 0; + pPsdScan->bAntDet_FailCount = 0; + AntDetCount = 0; + AntDetFailCount = 0; + pBoardInfo->btdmAntDetFinish = FALSE; + pBoardInfo->btdmAntNumByAntDet = 1; return; } + + if (!pBoardInfo->btdmAntDetFinish) + { + pPsdScan->nAntDet_IntevalCount = pPsdScan->nAntDet_IntevalCount+2; + + if (pPsdScan->nAntDet_IntevalCount >= BT_8723B_1ANT_ANTDET_RETRY_INTERVAL) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Timer is up, Try Detect!!\n")); + halbtc8723b1ant_PSD_AntennaDetectionCheck(pBtCoexist); + + if (pBoardInfo->btdmAntDetFinish) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Success!!\n")); +#if 1 + if (pBoardInfo->btdmAntNumByAntDet == 2) + halbtc8723b1ant_MechanismSwitch(pBtCoexist, TRUE); + else + halbtc8723b1ant_MechanismSwitch(pBtCoexist, FALSE); +#endif + } + else + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Fail!!\n")); + + pPsdScan->nAntDet_IntevalCount = 0; + } else { - //parse parameter - pPsdScan->realcentFreq = ((centFreq & 0xf000) >> 12) * 1000 + ((centFreq & 0xf00) >> 8) * 100 + - ((centFreq & 0xf0) >> 4) * 10 + (centFreq & 0xf); - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), real freq = %d\n", pPsdScan->realcentFreq); + RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Timer is not up! (%d)\n", pPsdScan->nAntDet_IntevalCount)); + } + + } +#endif - pPsdScan->realoffset =( (offset & 0x70) >> 4) * 10 + (offset & 0xf); - if (offset & 0x80) - pPsdScan->realoffset = 0 - pPsdScan->realoffset; - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), real offst = %d\n", pPsdScan->realoffset); +/* + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam); - if (span & 0x80) - pPsdScan->bIsPSDShowMaxOnly = TRUE; - else - pPsdScan->bIsPSDShowMaxOnly = FALSE; - pPsdScan->realspan = ((span & 0x70) >> 4) * 10 + (span & 0xf); - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), real span = %d\n", pPsdScan->realspan); + + pPsdScan->nAntDet_BTTxTime = seconds; //0.42ms*50 = 20ms + pPsdScan->nAntDet_BTLEChannel = centFreq; - if ( (pPsdScan->realcentFreq < 2412) || ( (pPsdScan->realcentFreq > 2472) && (pPsdScan->realcentFreq != 2484) ) ) + if (seconds == 0) { - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), center freq is not valid!!\n"); + pPsdScan->bAntDet_TryCount = 0; + pPsdScan->bAntDet_FailCount = 0; + AntDetCount = 0; + AntDetFailCount = 0; + pBoardInfo->btdmAntDetFinish = FALSE; + pBoardInfo->btdmAntNumByAntDet = 1; return; + } + else + { + AntDetCount++; + + pPsdScan->bAntDet_TryCount = AntDetCount; + if (bScan ||bRoam) + { + pBoardInfo->btdmAntDetFinish = FALSE; + pPsdScan->nAntDet_Result = 6; } - else if ( ( (pPsdScan->realcentFreq - 2412) % 5 != 0 ) && (pPsdScan->realcentFreq != 2484) ) + else if (pCoexSta->nNumOfProfile >= 1) { - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), center freq is not valid!!\n"); - return; + pBoardInfo->btdmAntDetFinish = FALSE; + pPsdScan->nAntDet_Result = 7; } - - if ( (pPsdScan->realoffset > 20) || (pPsdScan->realoffset < -20) ) + else if (!pPsdScan->nAntDet_IsAntDetAvailable) //Antenna initial setup is not ready { - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), freq offset is not valid!!\n"); - return; + pBoardInfo->btdmAntDetFinish = FALSE; + pPsdScan->nAntDet_Result = 9; } - - if (pPsdScan->realspan > 40) + else if (pCoexSta->bC2hBtInquiryPage) { - DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), freq span is not valid!!\n"); - return; + pBoardInfo->btdmAntDetFinish = FALSE; + pPsdScan->nAntDet_Result = 10; } - - pPsdScan->realseconds =( (seconds & 0xf0) >> 4) * 10 + (seconds & 0xf); - pPsdScan->nPSDGenCount = 0; - pPsdScan->nPSDGenTotalCount= 0; + else + { + //halbtc8723b1ant_PSD_AntennaDetection(pBtCoexist, pPsdScan->nAntDet_BTTxTime, pPsdScan->nAntDet_BTLEChannel); } + if (!pBoardInfo->btdmAntDetFinish) + AntDetFailCount++; - pPsdScan->bIsAntDetEnable = TRUE; - - - halbtc8723b1ant_AntennaDetection(pBtCoexist, pPsdScan->realcentFreq, pPsdScan->realoffset, pPsdScan->realspan, pPsdScan->realseconds); - - - + pPsdScan->bAntDet_FailCount = AntDetFailCount; + } +*/ } VOID @@ -4810,10 +5613,22 @@ EXhalbtc8723b1ant_PSDScan( } VOID -EXhalbtc8723b1ant_DisplayAntIsolation( +EXhalbtc8723b1ant_DisplayAntDetection( IN PBTC_COEXIST pBtCoexist ) { + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + +#if BT_8723B_1ANT_ANTDET_ENABLE + if (pPsdScan->bAntDet_TryCount != 0) + { + halbtc8723b1ant_PSD_ShowAntennaDetectResult(pBtCoexist); + + if (pBoardInfo->btdmAntDetFinish) + halbtc8723b1ant_PSD_ShowData(pBtCoexist); + return; + } +#endif //halbtc8723b1ant_ShowPSDData(pBtCoexist); } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h index 248874d55f56..8e70ac6636c2 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h @@ -17,7 +17,16 @@ #define BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT 2 -#define BT_8723B_1ANT_WIFI_NOISY_THRESH 30 //max: 255 +#define BT_8723B_1ANT_WIFI_NOISY_THRESH 50 //30 //max: 255 + +//for Antenna detection +#define BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND 50 +#define BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION 70 +#define BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION 55 +#define BT_8723B_1ANT_ANTDET_PSDTHRES_1ANT 35 +#define BT_8723B_1ANT_ANTDET_RETRY_INTERVAL 10 //retry timer if ant det is fail, unit: second +#define BT_8723B_1ANT_ANTDET_ENABLE 0 +#define BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE 0 typedef enum _BT_INFO_SRC_8723B_1ANT{ BT_INFO_SRC_8723B_1ANT_WIFI_FW = 0x0, @@ -126,6 +135,7 @@ typedef struct _COEX_STA_8723B_1ANT{ BOOLEAN bHidExist; BOOLEAN bPanExist; BOOLEAN bBtHiPriLinkExist; + u1Byte nNumOfProfile; BOOLEAN bUnderLps; BOOLEAN bUnderIps; @@ -143,7 +153,7 @@ typedef struct _COEX_STA_8723B_1ANT{ u4Byte btInfoC2hCnt[BT_INFO_SRC_8723B_1ANT_MAX]; BOOLEAN bBtWhckTest; BOOLEAN bC2hBtInquiryPage; - BOOLEAN bC2hBtPage; //Add for win8.1 page out issue + BOOLEAN bC2hBtRemoteNameReq; BOOLEAN bWiFiIsHighPriTask; //Add for win8.1 page out issue u1Byte btRetryCnt; u1Byte btInfoExt; @@ -166,24 +176,38 @@ typedef struct _COEX_STA_8723B_1ANT{ u1Byte nCoexTableType; BOOLEAN bForceLpsOn; + u4Byte wrongProfileNotification; + + u1Byte nA2DPBitPool; + u1Byte nCutVersion; }COEX_STA_8723B_1ANT, *PCOEX_STA_8723B_1ANT; #define BT_8723B_1ANT_ANTDET_PSD_POINTS 256 //MAX:1024 -#define BT_8723B_1ANT_ANTDET_PSD_AVGNUM 1 //MAX:3 +#define BT_8723B_1ANT_ANTDET_PSD_AVGNUM 1 //MAX:3 +#define BT_8723B_1ANT_ANTDET_BUF_LEN 16 typedef struct _PSDSCAN_STA_8723B_1ANT{ -BOOLEAN bIsAntDetEnable; -BOOLEAN bIsAntIsoEnable; -BOOLEAN bIsPSDScanEnable; +u4Byte nAntDet_BTLEChannel; //BT LE Channel ex:2412 +u4Byte nAntDet_BTTxTime; +u4Byte nAntDet_PrePSDScanPeakVal; +BOOLEAN nAntDet_IsAntDetAvailable; +u4Byte nAntDet_PSDScanPeakVal; +BOOLEAN nAntDet_IsBTReplyAvailable; +u4Byte nAntDet_PSDScanPeakFreq; + +u1Byte nAntDet_Result; +u1Byte nAntDet_PeakVal[BT_8723B_1ANT_ANTDET_BUF_LEN]; +u1Byte nAntDet_PeakFreq[BT_8723B_1ANT_ANTDET_BUF_LEN]; +u4Byte bAntDet_TryCount; +u4Byte bAntDet_FailCount; +u4Byte nAntDet_IntevalCount; +u4Byte nAntDet_ThresOffset; -u4Byte realcentFreq; //ex:2412 -s4Byte realoffset; -u4Byte realspan; -u4Byte realseconds; +u4Byte nRealCentFreq; +s4Byte nRealOffset; +u4Byte nRealSpan; -BOOLEAN bAntDetFinish; -u1Byte nAntIsolation; u4Byte nPSDBandWidth; //unit: Hz u4Byte nPSDPoint; //128/256/512/1024 u4Byte nPSDReport[1024]; //unit:dB (20logx), 0~255 @@ -195,8 +219,6 @@ u4Byte nPSDMaxValue; u4Byte nPSDStartBase; u4Byte nPSDAvgNum; // 1/8/16/32 u4Byte nPSDGenCount; -u4Byte nPSDGenTotalCount; -BOOLEAN bIsSetupFinish; BOOLEAN bIsPSDRunning; BOOLEAN bIsPSDShowMaxOnly; } PSDSCAN_STA_8723B_1ANT, *PPSDSCAN_STA_8723B_1ANT; @@ -309,7 +331,7 @@ EXhalbtc8723b1ant_PSDScan( IN u4Byte seconds ); VOID -EXhalbtc8723b1ant_DisplayAntIsolation( +EXhalbtc8723b1ant_DisplayAntDetection( IN PBTC_COEXIST pBtCoexist ); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c index c0ced8e21a89..6273bcc75fa0 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c @@ -12,6 +12,11 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8723b2Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -27,8 +32,8 @@ const char *const GLBtInfoSrc8723b2Ant[]={ "BT Info[bt auto report]", }; -u4Byte GLCoexVerDate8723b2Ant=20140903; -u4Byte GLCoexVer8723b2Ant=0x43; +u4Byte GLCoexVerDate8723b2Ant=20150119; +u4Byte GLCoexVer8723b2Ant=0x44; //============================================================ // local function proto type if needed @@ -56,12 +61,10 @@ halbtc8723b2ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else @@ -69,12 +72,10 @@ halbtc8723b2ant_BtRssiState( if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -82,7 +83,7 @@ halbtc8723b2ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } @@ -92,12 +93,10 @@ halbtc8723b2ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || @@ -106,17 +105,14 @@ halbtc8723b2ant_BtRssiState( if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else @@ -124,12 +120,10 @@ halbtc8723b2ant_BtRssiState( if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -161,12 +155,10 @@ halbtc8723b2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -174,12 +166,10 @@ halbtc8723b2ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -187,7 +177,7 @@ halbtc8723b2ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -197,12 +187,10 @@ halbtc8723b2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -211,17 +199,14 @@ halbtc8723b2ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -229,12 +214,10 @@ halbtc8723b2ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -273,36 +256,32 @@ halbtc8723b2ant_MonitorBtEnableDisable( { btDisableCnt = 0; bBtDisabled = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", - btDisableCnt)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", - (bPreBtDisabled ? "disabled":"enabled"), + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); + bPreBtDisabled = bBtDisabled; - if(!bBtDisabled) - { - } - else + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); + if(bBtDisabled) { + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL); } } } + VOID halbtc8723b2ant_LimitedRx( IN PBTC_COEXIST pBtCoexist, @@ -355,6 +334,9 @@ halbtc8723b2ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; + if( (pCoexSta->lowPriorityTx > 1050) && (!pCoexSta->bC2hBtInquiryPage)) + pCoexSta->popEventCnt++; + if ( (pCoexSta->lowPriorityRx >= 950) && (pCoexSta->lowPriorityRx >= pCoexSta->lowPriorityTx) && (!pCoexSta->bUnderIps) ) { pBtLinkInfo->bSlaveRole = TRUE; @@ -364,9 +346,9 @@ halbtc8723b2ant_MonitorBtCtr( pBtLinkInfo->bSlaveRole = FALSE; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx)); // reset counter @@ -426,7 +408,7 @@ halbtc8723b2ant_QueryBtInfo( H2C_Parameter[0] |= BIT0; // trigger - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter); @@ -568,7 +550,7 @@ halbtc8723b2ant_ActionAlgorithm( if(!pBtLinkInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No BT link exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); return algorithm; } @@ -585,31 +567,31 @@ halbtc8723b2ant_ActionAlgorithm( { if(pBtLinkInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO only\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_SCO; } else { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID only\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP only\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(HS) only\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(EDR) only\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR; } } @@ -621,24 +603,24 @@ halbtc8723b2ant_ActionAlgorithm( { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP ==> SCO\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(HS)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(EDR)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -651,13 +633,13 @@ halbtc8723b2ant_ActionAlgorithm( #if 0 if(pStackInfo->numOfHid >= 2) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID*2 + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID*2 + A2DP\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } else #endif { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP; } } @@ -666,12 +648,12 @@ halbtc8723b2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(HS)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(EDR)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -680,12 +662,12 @@ halbtc8723b2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(HS)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(EDR)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -698,7 +680,7 @@ halbtc8723b2ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } else if( pBtLinkInfo->bHidExist && @@ -706,12 +688,12 @@ halbtc8723b2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(HS)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(EDR)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -720,12 +702,12 @@ halbtc8723b2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -738,12 +720,12 @@ halbtc8723b2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(HS)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -759,12 +741,12 @@ halbtc8723b2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -786,8 +768,8 @@ halbtc8723b2ant_SetFwDacSwingLevel( // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 H2C_Parameter[0] = dacSwingLvl; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter); } @@ -802,7 +784,7 @@ halbtc8723b2ant_SetFwDecBtPwr( H2C_Parameter[0] = decBtPwrLvl; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\n", decBtPwrLvl, H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter); @@ -815,15 +797,12 @@ halbtc8723b2ant_DecBtPwr( IN u1Byte decBtPwrLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s Dec BT power level = %d\n", (bForceExec? "force to":""), decBtPwrLvl)); pCoexDm->curBtDecPwrLvl = decBtPwrLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n", - pCoexDm->preBtDecPwrLvl, pCoexDm->curBtDecPwrLvl)); - if(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) return; } @@ -847,7 +826,7 @@ halbtc8723b2ant_SetBtAutoReport( H2C_Parameter[0] |= BIT0; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter); @@ -860,15 +839,12 @@ halbtc8723b2ant_BtAutoReport( IN BOOLEAN bEnableAutoReport ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); pCoexDm->bCurBtAutoReport = bEnableAutoReport; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", - pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport)); - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) return; } @@ -884,15 +860,12 @@ halbtc8723b2ant_FwDacSwingLvl( IN u1Byte fwDacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set FW Dac Swing level = %d\n", (bForceExec? "force to":""), fwDacSwingLvl)); pCoexDm->curFwDacSwingLvl = fwDacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", - pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); - if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) return; } @@ -911,7 +884,7 @@ halbtc8723b2ant_SetSwRfRxLpfCorner( if(bRxRfShrinkOn) { //Shrink RF Rx LPF corner - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc); } else @@ -920,7 +893,7 @@ halbtc8723b2ant_SetSwRfRxLpfCorner( // After initialized, we can use pCoexDm->btRf0x1eBackup if(pBtCoexist->bInitilized) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup); } } @@ -933,15 +906,12 @@ halbtc8723b2ant_RfShrink( IN BOOLEAN bRxRfShrinkOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Rx RF Shrink = %s\n", (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF"))); pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", - pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); - if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) return; } @@ -969,7 +939,7 @@ halbtc8723b2ant_SetSwPenaltyTxRateAdaptive( H2C_Parameter[5] = 0xf9; //MCS5 or OFDM36 } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set WiFi Low-Penalty Retry: %s", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", (bLowPenaltyRa? "ON!!":"OFF!!")) ); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); @@ -983,15 +953,12 @@ halbtc8723b2ant_LowPenaltyRa( ) { //return; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -1008,7 +975,7 @@ halbtc8723b2ant_SetDacSwingReg( { u1Byte val=(u1Byte)level; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x883, 0x3e, val); } @@ -1038,17 +1005,13 @@ halbtc8723b2ant_DacSwing( IN u4Byte dacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl)); pCoexDm->bCurDacSwingOn = bDacSwingOn; pCoexDm->curDacSwingLvl = dacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", - pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl, - pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl)); - if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) && (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) ) return; @@ -1068,12 +1031,12 @@ halbtc8723b2ant_SetAdcBackOff( { if(bAdcBackOff) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level On!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x3); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level Off!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x1); } } @@ -1085,15 +1048,12 @@ halbtc8723b2ant_AdcBackOff( IN BOOLEAN bAdcBackOff ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn AdcBackOff = %s\n", (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF"))); pCoexDm->bCurAdcBackOff = bAdcBackOff; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", - pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff)); - if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) return; } @@ -1113,7 +1073,7 @@ halbtc8723b2ant_SetAgcTable( //=================BB AGC Gain Table if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB Agc Table On!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6e1A0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6d1B0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6c1C0001); @@ -1124,7 +1084,7 @@ halbtc8723b2ant_SetAgcTable( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB Agc Table Off!\n")); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xaa1A0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa91B0001); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa81C0001); @@ -1139,13 +1099,13 @@ halbtc8723b2ant_SetAgcTable( pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000); if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38fff); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38ffe); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x380c3); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28ce6); } @@ -1154,13 +1114,13 @@ halbtc8723b2ant_SetAgcTable( pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x1); if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38fff); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38ffe); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x380c3); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x28ce6); } @@ -1181,15 +1141,12 @@ halbtc8723b2ant_AgcTable( IN BOOLEAN bAgcTableEn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s %s Agc Table\n", (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable"))); pCoexDm->bCurAgcTableEn = bAgcTableEn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", - pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn)); - if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) return; } @@ -1207,16 +1164,16 @@ halbtc8723b2ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -1230,7 +1187,7 @@ halbtc8723b2ant_CoexTable( IN u1Byte val0x6cc ) { - 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", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c4 = val0x6c4; @@ -1239,11 +1196,6 @@ halbtc8723b2ant_CoexTable( if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && @@ -1335,7 +1287,7 @@ halbtc8723b2ant_SetFwIgnoreWlanAct( H2C_Parameter[0] |= BIT0; // function enable } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter); @@ -1365,22 +1317,16 @@ halbtc8723b2ant_LpsRpwm( { BOOLEAN bForceExecPwrCmd=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", (bForceExec? "force to":""), lpsVal, rpwmVal)); pCoexDm->curLps = lpsVal; pCoexDm->curRpwm = rpwmVal; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], LPS-RxBeaconMode=0x%x , LPS-RPWM=0x%x!!\n", - pCoexDm->curLps, pCoexDm->curRpwm)); - if( (pCoexDm->preLps == pCoexDm->curLps) && (pCoexDm->preRpwm == pCoexDm->curRpwm) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], LPS-RPWM_Last=0x%x , LPS-RPWM_Now=0x%x!!\n", - pCoexDm->preRpwm, pCoexDm->curRpwm)); - return; } } @@ -1397,15 +1343,12 @@ halbtc8723b2ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -1444,7 +1387,7 @@ halbtc8723b2ant_SetFwPstdma( pCoexDm->psTdmaPara[3] = byte4; pCoexDm->psTdmaPara[4] = byte5; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n", H2C_Parameter[0], H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); @@ -1630,96 +1573,130 @@ halbtc8723b2ant_PsTdma( BOOLEAN bTurnOnByCnt=FALSE; u1Byte psTdmaTypeByCnt=0; u1Byte wifiRssiState1, btRssiState; + s1Byte nWiFiDurationAdjust = 0x0; + u1Byte psTdmaByte4Modify = 0x0; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", + (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); + pCoexDm->bCurPsTdmaOn = bTurnOn; + pCoexDm->curPsTdma = type; + if (!(BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) && bTurnOn) { type = type +100; //for WiFi RSSI low or BT RSSI low + pCoexDm->bIsSwitchTo1dot5Ant = TRUE; + } + else + { + pCoexDm->bIsSwitchTo1dot5Ant = FALSE; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", - (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); - pCoexDm->bCurPsTdmaOn = bTurnOn; - pCoexDm->curPsTdma = type; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", - pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", - pCoexDm->prePsTdma, pCoexDm->curPsTdma)); - if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) return; } + + if (pCoexSta->nScanAPNum <= 5) + { + if (pCoexSta->nA2DPBitPool >= 45) + nWiFiDurationAdjust = -15; + else if (pCoexSta->nA2DPBitPool >= 35) + nWiFiDurationAdjust = -10; + else + nWiFiDurationAdjust = 5; + } + else if (pCoexSta->nScanAPNum <= 20) + { + if (pCoexSta->nA2DPBitPool >= 45) + nWiFiDurationAdjust = -15; + else if (pCoexSta->nA2DPBitPool >= 35) + nWiFiDurationAdjust = -10; + else + nWiFiDurationAdjust = 0; + } + else if (pCoexSta->nScanAPNum <= 40) + { + if (pCoexSta->nA2DPBitPool >= 45) + nWiFiDurationAdjust = -15; + else if (pCoexSta->nA2DPBitPool >= 35) + nWiFiDurationAdjust = -10; + else + nWiFiDurationAdjust = -5; + } + else + { + if (pCoexSta->nA2DPBitPool >= 45) + nWiFiDurationAdjust = -15; + else if (pCoexSta->nA2DPBitPool >= 35) + nWiFiDurationAdjust = -10; + else + nWiFiDurationAdjust = -10; + } + + if ( (pBtLinkInfo->bSlaveRole == TRUE) && (pBtLinkInfo->bA2dpExist) ) + psTdmaByte4Modify = 0x1; //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) + + if(bTurnOn) { switch(type) { case 1: default: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x03, 0xf1, 0x90|psTdmaByte4Modify); break; case 2: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d+nWiFiDurationAdjust, 0x03, 0xf1, 0x90|psTdmaByte4Modify); break; case 3: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90|psTdmaByte4Modify); break; case 4: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90|psTdmaByte4Modify); break; case 5: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x3, 0x70, 0x90|psTdmaByte4Modify); break; case 6: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d+nWiFiDurationAdjust, 0x3, 0x70, 0x90|psTdmaByte4Modify); break; case 7: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90|psTdmaByte4Modify); break; case 8: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90|psTdmaByte4Modify); break; case 9: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x03, 0xf1, 0x90|psTdmaByte4Modify); break; case 10: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d+nWiFiDurationAdjust, 0x03, 0xf1, 0x90|psTdmaByte4Modify); break; case 11: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90|psTdmaByte4Modify); break; case 12: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xf1, 0x90|psTdmaByte4Modify); break; case 13: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x3, 0x70, 0x90|psTdmaByte4Modify); break; case 14: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d+nWiFiDurationAdjust, 0x3, 0x70, 0x90|psTdmaByte4Modify); break; case 15: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90|psTdmaByte4Modify); break; case 16: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90); - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0x70, 0x90|psTdmaByte4Modify); break; case 17: halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90); @@ -1737,41 +1714,39 @@ halbtc8723b2ant_PsTdma( halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90); break; case 71: - //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); - - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x03, 0xf1, 0x90); break; case 101: case 105: case 171: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x3a, 0x03, 0x70, 0x50); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x3a+nWiFiDurationAdjust, 0x03, 0x70, 0x50|psTdmaByte4Modify); break; case 102: case 106: case 110: case 114: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x2d, 0x03, 0x70, 0x50); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x2d+nWiFiDurationAdjust, 0x03, 0x70, 0x50|psTdmaByte4Modify); break; case 103: case 107: case 111: case 115: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1c, 0x03, 0x70, 0x50); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1c, 0x03, 0x70, 0x50|psTdmaByte4Modify); break; case 104: case 108: case 112: case 116: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x10, 0x03, 0x70, 0x50); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x10, 0x03, 0x70, 0x50|psTdmaByte4Modify); break; case 109: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90|psTdmaByte4Modify); break; case 113: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x70, 0x90|psTdmaByte4Modify); break; case 121: - halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90); + halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90|psTdmaByte4Modify); break; case 22: case 122: @@ -1912,6 +1887,9 @@ halbtc8723b2ant_InitCoexDm( halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + + pCoexSta->popEventCnt = 0; + } VOID @@ -1941,19 +1919,19 @@ halbtc8723b2ant_ActionBtInquiry( if(bScan || bLink || bRoam) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi link process + BT Inq/Page!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi link process + BT Inq/Page!!\n")); halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15); halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); } else if(bWifiConnected) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT Inq/Page!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT Inq/Page!!\n")); halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15); halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi no-link + BT Inq/Page!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi no-link + BT Inq/Page!!\n")); halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); } @@ -1991,7 +1969,7 @@ halbtc8723b2ant_ActionWiFiLinkProcess( u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765); u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\n", u4Tmp, u1Tmpa, u1Tmpb)); } @@ -2016,7 +1994,7 @@ halbtc8723b2ant_ActionWifiIdleProcess( (pCoexSta->bHidExist == TRUE) && (pCoexSta->bA2dpExist == TRUE)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi idle process for BT HID+A2DP exist!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi idle process for BT HID+A2DP exist!!\n")); halbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x6); halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); @@ -2063,7 +2041,7 @@ halbtc8723b2ant_IsCommonAction( pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-connected idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non-connected idle!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); @@ -2086,7 +2064,7 @@ halbtc8723b2ant_IsCommonAction( pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); @@ -2108,7 +2086,7 @@ halbtc8723b2ant_IsCommonAction( if(bBtHsOn) return FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); @@ -2131,16 +2109,16 @@ halbtc8723b2ant_IsCommonAction( if(bWifiBusy) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_IS_ASUS_8723B, &bAsus8723b); if(!bAsus8723b) - bCommon = FALSE; + bCommon = FALSE; else bCommon = halbtc8723b2ant_ActionWifiIdleProcess(pBtCoexist); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); //bCommon = FALSE; bCommon = halbtc8723b2ant_ActionWifiIdleProcess(pBtCoexist); } @@ -2161,12 +2139,12 @@ halbtc8723b2ant_TdmaDurationAdjust( s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjust()\n")); if(!pCoexDm->bAutoTdmaAdjust) { pCoexDm->bAutoTdmaAdjust = TRUE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); { if(bScoHid) { @@ -2279,8 +2257,12 @@ halbtc8723b2ant_TdmaDurationAdjust( { //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", + + if ( (pCoexSta->lowPriorityTx) > 1050 || (pCoexSta->lowPriorityRx) > 1250 ) + retryCount++; + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], retryCount = %d\n", retryCount)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", up, dn, m, n, WaitCount)); result = 0; WaitCount++; @@ -2300,7 +2282,7 @@ halbtc8723b2ant_TdmaDurationAdjust( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -2326,7 +2308,7 @@ halbtc8723b2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -2344,15 +2326,15 @@ halbtc8723b2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval)); if(maxInterval == 1) { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 71) { @@ -2469,7 +2451,7 @@ halbtc8723b2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71); @@ -2593,7 +2575,7 @@ halbtc8723b2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); @@ -2703,7 +2685,7 @@ halbtc8723b2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); @@ -2816,7 +2798,7 @@ halbtc8723b2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); @@ -2926,7 +2908,7 @@ halbtc8723b2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); @@ -3042,7 +3024,7 @@ halbtc8723b2ant_TdmaDurationAdjust( if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); @@ -3055,7 +3037,7 @@ halbtc8723b2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); } } } @@ -3919,23 +3901,23 @@ halbtc8723b2ant_RunCoexistMechanism( BOOLEAN bMiracastPlusBt=FALSE; BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); return; } if(pCoexSta->bUnderIps) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS !!!\n")); return; } if(pCoexSta->bBtWhckTest) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under WHCK TEST!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under WHCK TEST!!!\n")); halbtc8723b2ant_ActionBtWhckTest(pBtCoexist); return; } @@ -3943,7 +3925,7 @@ halbtc8723b2ant_RunCoexistMechanism( algorithm = halbtc8723b2ant_ActionAlgorithm(pBtCoexist); if(pCoexSta->bC2hBtInquiryPage && (BT_8723B_2ANT_COEX_ALGO_PANHS!=algorithm)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under inquiry/page scan !!\n")); halbtc8723b2ant_ActionBtInquiry(pBtCoexist); return; } @@ -3964,7 +3946,7 @@ halbtc8723b2ant_RunCoexistMechanism( if(bScan || bLink || bRoam) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], WiFi is under Link Process !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], WiFi is under Link Process !!\n")); halbtc8723b2ant_ActionWiFiLinkProcess(pBtCoexist); return; } @@ -3976,7 +3958,7 @@ halbtc8723b2ant_RunCoexistMechanism( if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED)) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) ); + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) ); if(pBtLinkInfo->bBtLinkExist) { @@ -3999,65 +3981,65 @@ halbtc8723b2ant_RunCoexistMechanism( } pCoexDm->curAlgorithm = algorithm; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); if(halbtc8723b2ant_IsCommonAction(pBtCoexist)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant common.\n")); pCoexDm->bAutoTdmaAdjust = FALSE; } else { if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", pCoexDm->preAlgorithm, pCoexDm->curAlgorithm)); pCoexDm->bAutoTdmaAdjust = FALSE; } switch(pCoexDm->curAlgorithm) { case BT_8723B_2ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); halbtc8723b2ant_ActionSco(pBtCoexist); break; case BT_8723B_2ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); halbtc8723b2ant_ActionHid(pBtCoexist); break; case BT_8723B_2ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); halbtc8723b2ant_ActionA2dp(pBtCoexist); break; case BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); halbtc8723b2ant_ActionA2dpPanHs(pBtCoexist); break; case BT_8723B_2ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); halbtc8723b2ant_ActionPanEdr(pBtCoexist); break; case BT_8723B_2ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); halbtc8723b2ant_ActionPanHs(pBtCoexist); break; case BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); halbtc8723b2ant_ActionPanEdrA2dp(pBtCoexist); break; case BT_8723B_2ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); halbtc8723b2ant_ActionPanEdrHid(pBtCoexist); break; case BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); halbtc8723b2ant_ActionHidA2dpPanEdr(pBtCoexist); break; case BT_8723B_2ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); halbtc8723b2ant_ActionHidA2dp(pBtCoexist); break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); halbtc8723b2ant_CoexAllOff(pBtCoexist); break; } @@ -4110,7 +4092,10 @@ halbtc8723b2ant_InitHwConfig( u1Byte H2C_Parameter[2] ={0}; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Init HW Config!!\n")); + + //0xf0[15:12] --> Chip Cut information + pCoexSta->nCutVersion = (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xf1) & 0xf0) >> 4; // backup rf 0x1e value pCoexDm->btRf0x1eBackup = @@ -4236,7 +4221,7 @@ EXhalbtc8723b2ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); halbtc8723b2ant_InitCoexDm(pBtCoexist); } @@ -4254,6 +4239,7 @@ EXhalbtc8723b2ant_DisplayCoexInfo( u4Byte u4Tmp[4]; u4Byte faOfdm, faCck; u4Byte fwVer=0, btPatchVer=0; + static u1Byte PopReportIn10s = 0; CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============"); CL_PRINTF(cliBuf); @@ -4276,8 +4262,8 @@ EXhalbtc8723b2ant_DisplayCoexInfo( pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)", "CoexVer/ FwVer/ PatchVer", \ - GLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)/ %c", "Version Coex/ Fw/ Patch/ Cut", \ + GLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer, pCoexSta->nCutVersion+65); CL_PRINTF(cliBuf); CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \ @@ -4293,14 +4279,22 @@ EXhalbtc8723b2ant_DisplayCoexInfo( CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============"); CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %ddBm/ %d] ", "BT [status/ rssi/ retryCnt]", \ - ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"): ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle": + PopReportIn10s++; + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d/ %d] ", "BT [status/ rssi/ retryCnt/ popCnt]", \ + ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"): ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle": ( (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))), - pCoexSta->btRssi-100, pCoexSta->btRetryCnt); + pCoexSta->btRssi-100, pCoexSta->btRetryCnt, pCoexSta->popEventCnt); CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \ - pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist); + if (PopReportIn10s >= 5) + { + pCoexSta->popEventCnt = 0; + PopReportIn10s = 0; + } + + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d / %d / %d", "SCO/HID/PAN/A2DP/NameReq/WHQL", \ + pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist, pCoexSta->bC2hBtRemoteNameReq, pCoexSta->bBtWhckTest ); CL_PRINTF(cliBuf); if (pStackInfo->bProfileNotified) @@ -4315,8 +4309,8 @@ EXhalbtc8723b2ant_DisplayCoexInfo( } btInfoExt = pCoexSta->btInfoExt; - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \ - (btInfoExt&BIT0)? "Basic rate":"EDR rate"); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "A2DP Rate/Bitpool", \ + (btInfoExt&BIT0)? "BR":"EDR", pCoexSta->nA2DPBitPool); CL_PRINTF(cliBuf); for(i=0; ibManualControl) + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism] (before Manual)============"); + } + else + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============"); + } + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig]", \ pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig); CL_PRINTF(cliBuf); @@ -4343,14 +4344,26 @@ EXhalbtc8723b2ant_DisplayCoexInfo( CL_PRINTF(cliBuf); // Fw mechanism - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============"); - CL_PRINTF(cliBuf); + if(pBtCoexist->bManualControl) + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism] (before Manual) ============"); + } + else + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============"); + } psTdmaCase = pCoexDm->curPsTdma; - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)", "PS TDMA", \ + + if (pCoexDm->bIsSwitchTo1dot5Ant) + psTdmaCase = psTdmaCase + 100; + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)", "PS TDMA", \ pCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1], pCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3], - pCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust); + pCoexDm->psTdmaPara[4], psTdmaCase, + (pCoexDm->bCurPsTdmaOn? "On":"Off"), + (pCoexDm->bAutoTdmaAdjust? "Adj":"Fix") ); CL_PRINTF(cliBuf); CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Coex Table Type", \ @@ -4464,7 +4477,7 @@ EXhalbtc8723b2ant_IpsNotify( { if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); pCoexSta->bUnderIps = TRUE; halbtc8723b2ant_WifiOffHwCfg(pBtCoexist); halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); @@ -4472,7 +4485,7 @@ EXhalbtc8723b2ant_IpsNotify( } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); pCoexSta->bUnderIps = FALSE; halbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE); halbtc8723b2ant_InitCoexDm(pBtCoexist); @@ -4488,12 +4501,12 @@ EXhalbtc8723b2ant_LpsNotify( { if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); pCoexSta->bUnderLps = TRUE; } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); pCoexSta->bUnderLps = FALSE; } } @@ -4515,14 +4528,15 @@ EXhalbtc8723b2ant_ScanNotify( if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum); } - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\n", u4Tmp, u1Tmpa, u1Tmpb)); } @@ -4534,11 +4548,11 @@ EXhalbtc8723b2ant_ConnectNotify( { if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); } } @@ -4555,11 +4569,11 @@ EXhalbtc8723b2ant_MediaStatusNotify( if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); } // only 2.4G we need to inform bt the chnl mask @@ -4586,7 +4600,7 @@ EXhalbtc8723b2ant_MediaStatusNotify( pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1]; pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x66=0x%x\n", H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); @@ -4600,7 +4614,7 @@ EXhalbtc8723b2ant_SpecialPacketNotify( { if(type == BTC_PACKET_DHCP) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); } } @@ -4626,7 +4640,7 @@ EXhalbtc8723b2ant_BtInfoNotify( rspSource = BT_INFO_SRC_8723B_2ANT_WIFI_FW; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -4634,17 +4648,17 @@ EXhalbtc8723b2ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n")); return; } @@ -4659,18 +4673,34 @@ EXhalbtc8723b2ant_BtInfoNotify( pCoexSta->btRetryCnt = // [3:0] pCoexSta->btInfoC2h[rspSource][2]&0xf; + if (pCoexSta->btRetryCnt >= 1) + pCoexSta->popEventCnt++; + pCoexSta->btRssi = pCoexSta->btInfoC2h[rspSource][3]*2+10; pCoexSta->btInfoExt = pCoexSta->btInfoC2h[rspSource][4]; + if (pCoexSta->btInfoC2h[rspSource][2]&0x20) + pCoexSta->bC2hBtRemoteNameReq = TRUE; + else + pCoexSta->bC2hBtRemoteNameReq = FALSE; + + if (pCoexSta->btInfoC2h[rspSource][1] == 0x49) + { + pCoexSta->nA2DPBitPool = + pCoexSta->btInfoC2h[rspSource][6]; + } + else + pCoexSta->nA2DPBitPool = 0; + pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask); if (pCoexSta->bBtTxRxMask) { /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */ - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n")); pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); } @@ -4678,7 +4708,7 @@ EXhalbtc8723b2ant_BtInfoNotify( // because bt is reset and loss of the info. if( (pCoexSta->btInfoExt & BIT1) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(bWifiConnected) { @@ -4692,7 +4722,7 @@ EXhalbtc8723b2ant_BtInfoNotify( if( (pCoexSta->btInfoExt & BIT3) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); } else @@ -4746,10 +4776,13 @@ EXhalbtc8723b2ant_BtInfoNotify( else pCoexSta->bScoExist = FALSE; - if ( (pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) ) + if ( (pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) && (pCoexSta->bScoExist == FALSE)) { if (pCoexSta->highPriorityTx + pCoexSta->highPriorityRx >= 160) + { pCoexSta->bHidExist = TRUE; + btInfo = btInfo | 0x28; + } } } @@ -4758,28 +4791,28 @@ EXhalbtc8723b2ant_BtInfoNotify( if(!(btInfo&BT_INFO_8723B_2ANT_B_CONNECTION)) { pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); } else if(btInfo == BT_INFO_8723B_2ANT_B_CONNECTION) // connection exists but no busy { pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); } else if((btInfo&BT_INFO_8723B_2ANT_B_SCO_ESCO) || (btInfo&BT_INFO_8723B_2ANT_B_SCO_BUSY)) { pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_SCO_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); } else if(btInfo&BT_INFO_8723B_2ANT_B_ACL_BUSY) { pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_ACL_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); } else { pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_MAX; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); } if( (BT_8723B_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || @@ -4808,7 +4841,7 @@ EXhalbtc8723b2ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); halbtc8723b2ant_WifiOffHwCfg(pBtCoexist); //remove due to interrupt is disabled that polling c2h will fail and delay 100ms. @@ -4824,15 +4857,15 @@ EXhalbtc8723b2ant_PnpNotify( IN u1Byte pnpState ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify\n")); if(BTC_WIFI_PNP_SLEEP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to SLEEP\n")); } else if(BTC_WIFI_PNP_WAKE_UP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to WAKE UP\n")); halbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE); halbtc8723b2ant_InitCoexDm(pBtCoexist); halbtc8723b2ant_QueryBtInfo(pBtCoexist); @@ -4848,27 +4881,28 @@ EXhalbtc8723b2ant_Periodical( u4Byte fwVer=0, btPatchVer=0; PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); if(pCoexSta->disVerInfoCnt <= 5) { pCoexSta->disVerInfoCnt += 1; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", GLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); if (pCoexSta->disVerInfoCnt == 3) { //Antenna config to set 0x765 = 0x0 (GNT_BT control by PTA) after initial - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Set GNT_BT control by PTA\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set GNT_BT control by PTA\n")); halbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, FALSE, FALSE); } } @@ -4880,6 +4914,12 @@ EXhalbtc8723b2ant_Periodical( halbtc8723b2ant_MonitorBtCtr(pBtCoexist); halbtc8723b2ant_MonitorWiFiCtr(pBtCoexist); + //for some BT speaker that Hi-Pri pkt appear begore start play, this will cause HID exist + if ( (pCoexSta->highPriorityTx + pCoexSta->highPriorityRx < 50) && (pBtLinkInfo->bHidExist == TRUE)) + { + pBtLinkInfo->bHidExist = FALSE; + } + if( halbtc8723b2ant_IsWifiStatusChanged(pBtCoexist) || pCoexDm->bAutoTdmaAdjust) { diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h index 2c049f9fcebf..de7a9bda4e60 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h @@ -107,6 +107,8 @@ typedef struct _COEX_DM_8723B_2ANT{ u1Byte curLps; u1Byte preRpwm; u1Byte curRpwm; + + BOOLEAN bIsSwitchTo1dot5Ant; } COEX_DM_8723B_2ANT, *PCOEX_DM_8723B_2ANT; typedef struct _COEX_STA_8723B_2ANT{ @@ -131,8 +133,11 @@ typedef struct _COEX_STA_8723B_2ANT{ u4Byte btInfoC2hCnt[BT_INFO_SRC_8723B_2ANT_MAX]; BOOLEAN bBtWhckTest; BOOLEAN bC2hBtInquiryPage; + BOOLEAN bC2hBtRemoteNameReq; u1Byte btRetryCnt; u1Byte btInfoExt; + u4Byte popEventCnt; + u1Byte nScanAPNum; u4Byte nCRCOK_CCK; u4Byte nCRCOK_11g; @@ -148,6 +153,9 @@ typedef struct _COEX_STA_8723B_2ANT{ BOOLEAN bForceLpsOn; u1Byte disVerInfoCnt; + + u1Byte nA2DPBitPool; + u1Byte nCutVersion; }COEX_STA_8723B_2ANT, *PCOEX_STA_8723B_2ANT; //=========================================== diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c index d081053b8c5c..b911f31dbcfe 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c @@ -1,7 +1,7 @@ //============================================================ // Description: // -// This file is for 8812a1ant Co-exist mechanism +// This file is for RTL8812A Co-exist mechanism // // History // 2012/11/15 Cosa first check in. @@ -12,6 +12,11 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8812a1Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -27,8 +32,8 @@ const char *const GLBtInfoSrc8812a1Ant[]={ "BT Info[bt auto report]", }; -u4Byte GLCoexVerDate8812a1Ant=20130729; -u4Byte GLCoexVer8812a1Ant=0x10; +u4Byte GLCoexVerDate8812a1Ant=20140708; +u4Byte GLCoexVer8812a1Ant=0x52; //============================================================ // local function proto type if needed @@ -56,12 +61,10 @@ halbtc8812a1ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else @@ -69,12 +72,10 @@ halbtc8812a1ant_BtRssiState( if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -82,7 +83,7 @@ halbtc8812a1ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } @@ -92,12 +93,10 @@ halbtc8812a1ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || @@ -106,17 +105,14 @@ halbtc8812a1ant_BtRssiState( if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else @@ -124,12 +120,10 @@ halbtc8812a1ant_BtRssiState( if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -161,12 +155,10 @@ halbtc8812a1ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -174,12 +166,10 @@ halbtc8812a1ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -187,7 +177,7 @@ halbtc8812a1ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -197,12 +187,10 @@ halbtc8812a1ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -211,17 +199,14 @@ halbtc8812a1ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -229,12 +214,10 @@ halbtc8812a1ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -248,18 +231,10 @@ VOID halbtc8812a1ant_UpdateRaMask( IN PBTC_COEXIST pBtCoexist, IN BOOLEAN bForceExec, - IN u1Byte type, - IN u4Byte rateMask + IN u4Byte disRateMask ) { - if(BTC_RATE_DISABLE == type) - { - pCoexDm->curRaMask |= rateMask; // disable rate - } - else if(BTC_RATE_ENABLE == type) - { - pCoexDm->curRaMask &= ~rateMask; // enable rate - } + pCoexDm->curRaMask = disRateMask; if( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask)) { @@ -268,15 +243,195 @@ halbtc8812a1ant_UpdateRaMask( pCoexDm->preRaMask = pCoexDm->curRaMask; } +//to check 0x430/0x434 is correct?? +VOID +halbtc8812a1ant_AutoRateFallbackRetry( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte type + ) +{ + BOOLEAN bWifiUnderBMode=FALSE; + + pCoexDm->curArfrType = type; + + if( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType)) + { + switch(pCoexDm->curArfrType) + { + case 0: // normal mode + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2); + break; + case 1: + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode); + if(bWifiUnderBMode) + { + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101); + } + else + { + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201); + } + break; + default: + break; + } + } + + pCoexDm->preArfrType = pCoexDm->curArfrType; +} + +//to check 0x42a ?? +VOID +halbtc8812a1ant_RetryLimit( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte type + ) +{ + pCoexDm->curRetryLimitType = type; + + if( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType)) + { + switch(pCoexDm->curRetryLimitType) + { + case 0: // normal mode + pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit); + break; + case 1: // retry limit=8 + pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808); + break; + default: + break; + } + } + + pCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType; +} + +//to check 0x456?? +VOID +halbtc8812a1ant_AmpduMaxTime( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte type + ) +{ + pCoexDm->curAmpduTimeType = type; + + if( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType)) + { + switch(pCoexDm->curAmpduTimeType) + { + case 0: // normal mode + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime); + break; + case 1: // AMPDU timw = 0x38 * 32us + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38); + break; + default: + break; + } + } + + pCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType; +} + +VOID +halbtc8812a1ant_LimitedTx( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte raMaskType, + IN u1Byte arfrType, + IN u1Byte retryLimitType, + IN u1Byte ampduTimeType + ) +{ + switch(raMaskType) + { + case 0: // normal mode + halbtc8812a1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0); + break; + case 1: // disable cck 1/2 + halbtc8812a1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x00000003); + break; + case 2: // disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 + halbtc8812a1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7); + break; + default: + break; + } + + halbtc8812a1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType); + halbtc8812a1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType); + halbtc8812a1ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType); +} + +VOID +halbtc8812a1ant_LimitedRx( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN BOOLEAN bRejApAggPkt, + IN BOOLEAN bBtCtrlAggBufSize, + IN u1Byte aggBufSize + ) +{ + BOOLEAN bRejectRxAgg=bRejApAggPkt; + BOOLEAN bBtCtrlRxAggSize=bBtCtrlAggBufSize; + u1Byte rxAggSize=aggBufSize; + + //============================================ + // Rx Aggregation related setting + //============================================ + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg); + // decide BT control aggregation buf size or not + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize); + // aggregation buf size, only work when BT control Rx aggregation size. + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize); + // real update aggregation setting + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); + + +} + +VOID +halbtc8812a1ant_QueryBtInfo( + IN PBTC_COEXIST pBtCoexist + ) +{ + u1Byte dataLen=3; + u1Byte buf[5] = {0}; + + if(!pBtCoexist->btInfo.bBtDisabled) + { + if(!pCoexSta->btInfoQueryCnt || + (pCoexSta->btInfoC2hCnt[BT_INFO_SRC_8812A_1ANT_BT_RSP]-pCoexSta->btInfoQueryCnt)>2) + { + buf[0] = dataLen; + buf[1] = 0x1; // polling enable, 1=enable, 0=disable + buf[2] = 0x2; // polling time in seconds + buf[3] = 0x1; // auto report enable, 1=enable, 0=disable + + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_INFO, (PVOID)&buf[0]); + } + } + pCoexSta->btInfoQueryCnt++; +} + VOID halbtc8812a1ant_MonitorBtCtr( IN PBTC_COEXIST pBtCoexist ) { - u4Byte regHPTxRx, regLPTxRx, u4Tmp; + u4Byte regHPTxRx, regLPTxRx, u4Tmp, u4Tmp1; u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0; - u1Byte u1Tmp; - + u1Byte u1Tmp, u1Tmp1; + s4Byte wifiRssi; + static u1Byte NumOfBtCounterChk = 0; + regHPTxRx = 0x770; regLPTxRx = 0x774; @@ -293,37 +448,158 @@ halbtc8812a1ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", - regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", - regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx)); + if( (pCoexSta->lowPriorityTx > 1150) && (!pCoexSta->bC2hBtInquiryPage)) + pCoexSta->popEventCnt++; + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n", + regHPRx, regHPTx, regLPRx, regLPTx)); // reset counter pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); + + if ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0)) + { + NumOfBtCounterChk++; + if (NumOfBtCounterChk >= 3) + { + halbtc8812a1ant_QueryBtInfo(pBtCoexist); + NumOfBtCounterChk = 0; + } + } } +//to check registers VOID -halbtc8812a1ant_QueryBtInfo( +halbtc8812a1ant_MonitorWiFiCtr( IN PBTC_COEXIST pBtCoexist ) -{ - u1Byte dataLen=3; - u1Byte buf[5] = {0}; +{ + u4Byte u4Tmp; + u2Byte u2Tmp[3]; + s4Byte wifiRssi=0; + BOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE; + static u1Byte nCCKLockCounter = 0; - if(!pBtCoexist->btInfo.bBtDisabled) + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode); + + if (pCoexSta->bUnderIps) { - if(!pCoexSta->btInfoQueryCnt || - (pCoexSta->btInfoC2hCnt[BT_INFO_SRC_8812A_1ANT_BT_RSP]-pCoexSta->btInfoQueryCnt)>2) + pCoexSta->nCRCOK_CCK = 0; + pCoexSta->nCRCOK_11g = 0; + pCoexSta->nCRCOK_11n = 0; + pCoexSta->nCRCOK_11nAgg = 0; + + pCoexSta->nCRCErr_CCK = 0; + pCoexSta->nCRCErr_11g = 0; + pCoexSta->nCRCErr_11n = 0; + pCoexSta->nCRCErr_11nAgg = 0; + } + else + { + pCoexSta->nCRCOK_CCK = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf04); + pCoexSta->nCRCOK_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf14); + pCoexSta->nCRCOK_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf10); + pCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf40); + + pCoexSta->nCRCErr_CCK = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf06); + pCoexSta->nCRCErr_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf16); + pCoexSta->nCRCErr_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf12); + pCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf42); + } + + + //reset counter + pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xb58, 0x1, 0x1); + pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xb58, 0x1, 0x0); + + if ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode)) + { + if ( (pCoexDm->btStatus == BT_8812A_1ANT_BT_STATUS_ACL_BUSY) || + (pCoexDm->btStatus == BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY) || + (pCoexDm->btStatus == BT_8812A_1ANT_BT_STATUS_SCO_BUSY) ) { - buf[0] = dataLen; - buf[1] = 0x1; // polling enable, 1=enable, 0=disable - buf[2] = 0x2; // polling time in seconds - buf[3] = 0x1; // auto report enable, 1=enable, 0=disable - - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_INFO, (PVOID)&buf[0]); + if (pCoexSta->nCRCOK_CCK >(pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + + pCoexSta->nCRCOK_11nAgg) ) + { + if (nCCKLockCounter < 5) + nCCKLockCounter++; + } + else + { + if (nCCKLockCounter > 0) + nCCKLockCounter--; + } + + } + else + { + if (nCCKLockCounter > 0) + nCCKLockCounter--; } } - pCoexSta->btInfoQueryCnt++; + else + { + if (nCCKLockCounter > 0) + nCCKLockCounter--; + } + + if (!pCoexSta->bPreCCKLock) + { + + if (nCCKLockCounter >= 5) + pCoexSta->bCCKLock = TRUE; + else + pCoexSta->bCCKLock = FALSE; + } + else + { + if (nCCKLockCounter == 0) + pCoexSta->bCCKLock = FALSE; + else + pCoexSta->bCCKLock = TRUE; + } + + pCoexSta->bPreCCKLock = pCoexSta->bCCKLock; + + +} + +BOOLEAN +halbtc8812a1ant_IsWifiStatusChanged( + IN PBTC_COEXIST pBtCoexist + ) +{ + static BOOLEAN bPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE; + BOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE; + BOOLEAN bWifiConnected=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way); + + if(bWifiConnected) + { + if(bWifiBusy != bPreWifiBusy) + { + bPreWifiBusy = bWifiBusy; + return TRUE; + } + if(bUnder4way != bPreUnder4way) + { + bPreUnder4way = bUnder4way; + return TRUE; + } + if(bBtHsOn != bPreBtHsOn) + { + bPreBtHsOn = bBtHsOn; + return TRUE; + } + } + + return FALSE; } VOID @@ -332,6 +608,9 @@ halbtc8812a1ant_UpdateBtLinkInfo( ) { PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bBtHsOn=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); pBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist; pBtLinkInfo->bScoExist = pCoexSta->bScoExist; @@ -339,6 +618,13 @@ halbtc8812a1ant_UpdateBtLinkInfo( pBtLinkInfo->bPanExist = pCoexSta->bPanExist; pBtLinkInfo->bHidExist = pCoexSta->bHidExist; + // work around for HS mode. + if(bBtHsOn) + { + pBtLinkInfo->bPanExist = TRUE; + pBtLinkInfo->bBtLinkExist = TRUE; + } + // check if Sco only if( pBtLinkInfo->bScoExist && !pBtLinkInfo->bA2dpExist && @@ -387,10 +673,10 @@ halbtc8812a1ant_ActionAlgorithm( u1Byte numOfDiffProfile=0; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - + if(!pBtLinkInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); return algorithm; } @@ -407,31 +693,31 @@ halbtc8812a1ant_ActionAlgorithm( { if(pBtLinkInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO only\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_SCO; } else { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID only\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP only\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_A2DP; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(HS) only\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(EDR) only\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR; } } @@ -443,24 +729,24 @@ halbtc8812a1ant_ActionAlgorithm( { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP ==> SCO\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_SCO; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(HS)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(EDR)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -470,7 +756,7 @@ halbtc8812a1ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP; } else if( pBtLinkInfo->bHidExist && @@ -478,12 +764,12 @@ halbtc8812a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(HS)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(EDR)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -492,12 +778,12 @@ halbtc8812a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(HS)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(EDR)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -510,7 +796,7 @@ halbtc8812a1ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_HID; } else if( pBtLinkInfo->bHidExist && @@ -518,12 +804,12 @@ halbtc8812a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(HS)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -532,12 +818,12 @@ halbtc8812a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -550,12 +836,12 @@ halbtc8812a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -571,12 +857,12 @@ halbtc8812a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -592,6 +878,19 @@ halbtc8812a1ant_SetBtAutoReport( IN BOOLEAN bEnableAutoReport ) { + u1Byte H2C_Parameter[1] ={0}; + + H2C_Parameter[0] = 0; + + if(bEnableAutoReport) + { + H2C_Parameter[0] |= BIT0; + } + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", + (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0])); + + pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter); } VOID @@ -601,15 +900,12 @@ halbtc8812a1ant_BtAutoReport( IN BOOLEAN bEnableAutoReport ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); pCoexDm->bCurBtAutoReport = bEnableAutoReport; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", - pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport)); - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) return; } @@ -618,6 +914,7 @@ halbtc8812a1ant_BtAutoReport( pCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport; } +//to check VOID halbtc8812a1ant_SetSwPenaltyTxRateAdaptive( IN PBTC_COEXIST pBtCoexist, @@ -630,12 +927,12 @@ halbtc8812a1ant_SetSwPenaltyTxRateAdaptive( tmpU1 |= BIT0; if(bLowPenaltyRa) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); tmpU1 &= ~BIT2; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set normal!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set normal!!\n")); tmpU1 |= BIT2; } @@ -649,16 +946,10 @@ halbtc8812a1ant_LowPenaltyRa( IN BOOLEAN bLowPenaltyRa ) { - return; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", - (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -676,16 +967,16 @@ halbtc8812a1ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -699,8 +990,8 @@ halbtc8812a1ant_CoexTable( IN u1Byte val0x6cc ) { - 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", - (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6cc=0x%x\n", + (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c4 = val0x6c4; pCoexDm->curVal0x6c8 = val0x6c8; @@ -708,11 +999,6 @@ halbtc8812a1ant_CoexTable( if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && @@ -734,31 +1020,35 @@ halbtc8812a1ant_CoexTableWithType( IN u1Byte type ) { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** CoexTable(%d) **********\n", type)); + + pCoexSta->nCoexTableType = type; + switch(type) { case 0: - halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffff, 0x3); + halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3); break; case 1: - halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffff, 0x3); + halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); break; case 2: - halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3); + halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3); break; case 3: - halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffff, 0x3); + halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); break; case 4: - halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffff, 0x3); + halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3); break; case 5: - halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffff, 0x3); + halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaa5a5a5a, 0xffffff, 0x3); break; case 6: - halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3); + halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3); break; case 7: - halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x5afa5afa, 0x5afa5afa, 0xffff, 0x3); + halbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3); break; default: break; @@ -774,14 +1064,14 @@ halbtc8812a1ant_SetFwIgnoreWlanAct( u1Byte dataLen=3; u1Byte buf[5] = {0}; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], %s BT Ignore Wlan_Act\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Ignore Wlan_Act\n", (bEnable? "Enable":"Disable"))); buf[0] = dataLen; buf[1] = 0x1; // OP_Code buf[2] = 0x1; // OP_Code_Length if(bEnable) - buf[3] = 0x1; // OP_Code_Content + buf[3] = 0x1; // OP_Code_Content else buf[3] = 0x0; @@ -795,15 +1085,12 @@ halbtc8812a1ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -812,37 +1099,6 @@ halbtc8812a1ant_IgnoreWlanAct( pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct; } -VOID -halbtc8812a1ant_SetFwPstdma( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte byte1, - IN u1Byte byte2, - IN u1Byte byte3, - IN u1Byte byte4, - IN u1Byte byte5 - ) -{ - u1Byte H2C_Parameter[5] ={0}; - - H2C_Parameter[0] = byte1; - H2C_Parameter[1] = byte2; - H2C_Parameter[2] = byte3; - H2C_Parameter[3] = byte4; - H2C_Parameter[4] = byte5; - - pCoexDm->psTdmaPara[0] = byte1; - pCoexDm->psTdmaPara[1] = byte2; - pCoexDm->psTdmaPara[2] = byte3; - pCoexDm->psTdmaPara[3] = byte4; - pCoexDm->psTdmaPara[4] = byte5; - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n", - H2C_Parameter[0], - H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); - - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter); -} - VOID halbtc8812a1ant_SetLpsRpwm( IN PBTC_COEXIST pBtCoexist, @@ -867,16 +1123,13 @@ halbtc8812a1ant_LpsRpwm( { BOOLEAN bForceExecPwrCmd=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", (bForceExec? "force to":""), lpsVal, rpwmVal)); pCoexDm->curLps = lpsVal; pCoexDm->curRpwm = rpwmVal; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preLps/curLps=0x%x/0x%x, preRpwm/curRpwm=0x%x/0x%x!!\n", - pCoexDm->preLps, pCoexDm->curLps, pCoexDm->preRpwm, pCoexDm->curRpwm)); - if( (pCoexDm->preLps == pCoexDm->curLps) && (pCoexDm->preRpwm == pCoexDm->curRpwm) ) { @@ -889,53 +1142,123 @@ halbtc8812a1ant_LpsRpwm( pCoexDm->preRpwm = pCoexDm->curRpwm; } +VOID +halbtc8812a1ant_SwMechanism( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bLowPenaltyRA + ) +{ + halbtc8812a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA); +} + +//to check bForceExec VOID halbtc8812a1ant_SetAntPath( IN PBTC_COEXIST pBtCoexist, IN u1Byte antPosType, + IN BOOLEAN bForceExec, IN BOOLEAN bInitHwCfg, IN BOOLEAN bWifiOff ) { u1Byte u1Tmp=0; + + pCoexDm->curAntPosType = antPosType; if(bInitHwCfg) { pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb3, 0x77); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x900, 0x00000400); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76d, 0x1); + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76d, 0x1); } else if(bWifiOff) { + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb3, 0x77); + u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7); + u1Tmp &= ~BIT3; + u1Tmp |= BIT2; + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp); + } + if(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType)) + { + // ext switch setting + switch(antPosType) + { + case BTC_ANT_PATH_WIFI: + u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7); + u1Tmp |= BIT3; + u1Tmp &= ~BIT2; + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp); + break; + case BTC_ANT_PATH_BT: + u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7); + u1Tmp &= ~BIT3; + u1Tmp |= BIT2; + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp); + break; + default: + case BTC_ANT_PATH_PTA: + u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7); + u1Tmp |= BIT3; + u1Tmp &= ~BIT2; + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp); + break; + } } - // ext switch setting - switch(antPosType) - { - case BTC_ANT_PATH_WIFI: - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7); - u1Tmp |= BIT3; - u1Tmp &= ~BIT2; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp); - break; - case BTC_ANT_PATH_BT: - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7); - u1Tmp &= ~BIT3; - u1Tmp |= BIT2; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp); - break; - default: - case BTC_ANT_PATH_PTA: - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7); - u1Tmp |= BIT3; - u1Tmp &= ~BIT2; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp); - break; + pCoexDm->preAntPosType = pCoexDm->curAntPosType; +} + +VOID +halbtc8812a1ant_SetFwPstdma( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte byte1, + IN u1Byte byte2, + IN u1Byte byte3, + IN u1Byte byte4, + IN u1Byte byte5 + ) +{ + u1Byte H2C_Parameter[5] ={0}; + u1Byte realByte1=byte1, realByte5=byte5; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + if(bApEnable) + { + if(byte1&BIT4 && !(byte1&BIT5)) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FW for 1Ant AP mode\n")); + realByte1 &= ~BIT4; + realByte1 |= BIT5; + + realByte5 |= BIT5; + realByte5 &= ~BIT6; + } } + + H2C_Parameter[0] = realByte1; + H2C_Parameter[1] = byte2; + H2C_Parameter[2] = byte3; + H2C_Parameter[3] = byte4; + H2C_Parameter[4] = realByte5; + + pCoexDm->psTdmaPara[0] = realByte1; + pCoexDm->psTdmaPara[1] = byte2; + pCoexDm->psTdmaPara[2] = byte3; + pCoexDm->psTdmaPara[3] = byte4; + pCoexDm->psTdmaPara[4] = realByte5; + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", + H2C_Parameter[0], + H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); + + pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter); } + VOID halbtc8812a1ant_PsTdma( IN PBTC_COEXIST pBtCoexist, @@ -944,52 +1267,92 @@ halbtc8812a1ant_PsTdma( IN u1Byte type ) { - BOOLEAN bTurnOnByCnt=FALSE; + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bTurnOnByCnt=FALSE, bWifiBusy=FALSE, bWiFiNoisy=FALSE; u1Byte psTdmaTypeByCnt=0, rssiAdjustVal=0; + u1Byte psTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val = 0x10; + s1Byte nWiFiDurationAdjust = 0x0; + static BOOLEAN bPreWifiBusy=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", - (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); pCoexDm->bCurPsTdmaOn = bTurnOn; pCoexDm->curPsTdma = type; - if(!bForceExec) + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + + if (bWifiBusy != bPreWifiBusy) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", - pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", - pCoexDm->prePsTdma, pCoexDm->curPsTdma)); + bForceExec = TRUE; + bPreWifiBusy = bWifiBusy; + } + if (pCoexDm->bCurPsTdmaOn) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(on, %d) **********\n", + pCoexDm->curPsTdma)); + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(off, %d) **********\n", + pCoexDm->curPsTdma)); + } + + if(!bForceExec) + { if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) return; } - if(bTurnOn) + + if (pCoexSta->nScanAPNum <= 5) + nWiFiDurationAdjust = 2; + else if (pCoexSta->nScanAPNum >= 40) + nWiFiDurationAdjust = -15; + else if (pCoexSta->nScanAPNum >= 20) + nWiFiDurationAdjust = -10; + + if (!pCoexSta->bForceLpsOn) //only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30 { + psTdmaByte0Val = 0x61; //no null-pkt + psTdmaByte3Val = 0x11; // no tx-pause at BT-slot + psTdmaByte4Val = 0x10; // 0x778 = d/1 toggle + } + + if ( (type == 3) || (type == 13) || (type == 14) ) + { + psTdmaByte4Val = psTdmaByte4Val & 0xbf; //no dynamic slot for multi-profile + + if (!bWifiBusy) + psTdmaByte4Val = psTdmaByte4Val | 0x1; //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) + } + + if (pBtLinkInfo->bSlaveRole == TRUE) + psTdmaByte4Val = psTdmaByte4Val | 0x1; //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) + + if(bTurnOn) + { switch(type) { default: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0x0, 0x50); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val); break; case 1: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0x0, 0x50); - rssiAdjustVal = 11; + halbtc8812a1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); break; case 2: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x12, 0x0, 0x50); - rssiAdjustVal = 14; + halbtc8812a1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); break; case 3: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x40); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val); break; case 4: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0); - rssiAdjustVal = 17; break; case 5: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x31, 0x0); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x11); break; case 6: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x0, 0x0); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11); break; case 7: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0); @@ -998,61 +1361,55 @@ halbtc8812a1ant_PsTdma( halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); break; case 9: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0xa, 0xa, 0x0, 0x50); - rssiAdjustVal = 18; + halbtc8812a1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); break; case 10: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40); break; case 11: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x5, 0x5, 0x0, 0x50); - rssiAdjustVal = 20; + halbtc8812a1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val); break; case 12: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xeb, 0xa, 0x3, 0x31, 0x18); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50); + break; + case 13: + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val); + break; + case 14: + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, psTdmaByte4Val); break; - case 15: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0); break; case 16: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0); - rssiAdjustVal = 18; break; - case 18: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); - rssiAdjustVal = 14; break; - case 20: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x13, 0x25, 0x25, 0x0, 0x0); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10); break; case 21: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x20, 0x3, 0x10, 0x40); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11); break; case 22: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x13, 0x8, 0x8, 0x0, 0x40); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10); break; case 23: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18); - rssiAdjustVal = 22; break; case 24: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18); - rssiAdjustVal = 22; break; case 25: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - rssiAdjustVal = 22; break; case 26: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - rssiAdjustVal = 22; break; case 27: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98); - rssiAdjustVal = 22; break; case 28: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0); @@ -1061,72 +1418,56 @@ halbtc8812a1ant_PsTdma( halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10); break; case 30: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10); break; case 31: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58); break; case 32: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xab, 0xa, 0x3, 0x31, 0x90); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11); break; case 33: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90); break; case 34: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0x0, 0x10); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10); break; case 35: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x0, 0x10); + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10); break; case 36: halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50); break; - case 37: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x53, 0x25, 0x3, 0x10, 0x50); - break; + case 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving + /* here softap mode screen off will cost 70-80mA for phone */ + halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24); + break; } } else - { + { + // disable PS tdma switch(type) { - case 8: + case 8: //PTA Control halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0); - halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE); break; case 0: - default: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); - halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE); - break; - case 9: + default: //Software control, Antenna at BT side halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); - halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE); - break; - case 10: - halbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x8, 0x0); - halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE); break; } } rssiAdjustVal =0; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal); + // update pre state pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn; pCoexDm->prePsTdma = pCoexDm->curPsTdma; } -VOID -halbtc8812a1ant_CoexAllOff( - IN PBTC_COEXIST pBtCoexist - ) -{ - // hw all off - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); -} - BOOLEAN halbtc8812a1ant_IsCommonAction( IN PBTC_COEXIST pBtCoexist @@ -1140,40 +1481,59 @@ halbtc8812a1ant_IsCommonAction( if(!bWifiConnected && BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); + + //halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; } else if(bWifiConnected && (BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + + //halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; } else if(!bWifiConnected && (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); + + //halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; } else if(bWifiConnected && (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + + //halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; } else if(!bWifiConnected && (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); + + //halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; } else - { + { + if (bWifiBusy) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); + } + bCommon = FALSE; } @@ -1190,8 +1550,15 @@ halbtc8812a1ant_TdmaDurationAdjustForAcl( static s4Byte up,dn,m,n,WaitCount; s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0, btInfoExt; + static BOOLEAN bPreWifiBusy=FALSE; + BOOLEAN bWifiBusy = FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); + + if(BT_8812A_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifiStatus) + bWifiBusy = TRUE; + else + bWifiBusy = FALSE; if( (BT_8812A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) || (BT_8812A_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) || @@ -1214,11 +1581,11 @@ halbtc8812a1ant_TdmaDurationAdjustForAcl( } return; } - - if(pCoexDm->bResetTdmaAdjust) + + if(!pCoexDm->bAutoTdmaAdjust) { - pCoexDm->bResetTdmaAdjust = FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + pCoexDm->bAutoTdmaAdjust = TRUE; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); pCoexDm->psTdmaDuAdjType = 2; @@ -1235,9 +1602,10 @@ halbtc8812a1ant_TdmaDurationAdjustForAcl( //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; btInfoExt = pCoexSta->btInfoExt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", - up, dn, m, n, WaitCount)); + + if ( (pCoexSta->lowPriorityTx) > 1150 || (pCoexSta->lowPriorityRx) > 1250 ) + retryCount++; + result = 0; WaitCount++; @@ -1256,7 +1624,7 @@ halbtc8812a1ant_TdmaDurationAdjustForAcl( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -1282,7 +1650,7 @@ halbtc8812a1ant_TdmaDurationAdjustForAcl( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -1300,7 +1668,7 @@ halbtc8812a1ant_TdmaDurationAdjustForAcl( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } if(result == -1) @@ -1351,6 +1719,19 @@ halbtc8812a1ant_TdmaDurationAdjustForAcl( pCoexDm->psTdmaDuAdjType = 1; } } + else //no change + { + /* Bryant Modify + if(bWifiBusy != bPreWifiBusy) //if busy / idle change + { + bPreWifiBusy = bWifiBusy; + halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, pCoexDm->curPsTdma); + } + */ + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(on, %d) **********\n", + pCoexDm->curPsTdma)); + } if( pCoexDm->curPsTdma != 1 && pCoexDm->curPsTdma != 2 && @@ -1363,41 +1744,6 @@ halbtc8812a1ant_TdmaDurationAdjustForAcl( } } -u1Byte -halbtc8812a1ant_PsTdmaTypeByWifiRssi( - IN s4Byte wifiRssi, - IN s4Byte preWifiRssi, - IN u1Byte wifiRssiThresh - ) -{ - u1Byte psTdmaType=0; - - if(wifiRssi > preWifiRssi) - { - if(wifiRssi > (wifiRssiThresh+5)) - { - psTdmaType = 26; - } - else - { - psTdmaType = 25; - } - } - else - { - if(wifiRssi > wifiRssiThresh) - { - psTdmaType = 26; - } - else - { - psTdmaType = 25; - } - } - - return psTdmaType; -} - VOID halbtc8812a1ant_PsTdmaCheckForPowerSaveState( IN PBTC_COEXIST pBtCoexist, @@ -1417,7 +1763,7 @@ halbtc8812a1ant_PsTdmaCheckForPowerSaveState( else { // will leave LPS state, turn off psTdma first - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); } } else // NO PS state @@ -1425,7 +1771,7 @@ halbtc8812a1ant_PsTdmaCheckForPowerSaveState( if(bNewPsState) { // will enter LPS state, turn off psTdma first - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); } else { @@ -1443,7 +1789,7 @@ halbtc8812a1ant_PowerSaveState( ) { BOOLEAN bLowPwrDisable=FALSE; - + switch(psType) { case BTC_PS_WIFI_NATIVE: @@ -1451,45 +1797,36 @@ halbtc8812a1ant_PowerSaveState( bLowPwrDisable = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL); + pCoexSta->bForceLpsOn = FALSE; break; case BTC_PS_LPS_ON: halbtc8812a1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE); - halbtc8812a1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal); + halbtc8812a1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal); // when coex force to enter LPS, do not enter 32k low power. bLowPwrDisable = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - // power save must executed before psTdma. + // power save must executed before psTdma. pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL); + pCoexSta->bForceLpsOn = TRUE; break; case BTC_PS_LPS_OFF: halbtc8812a1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL); + pCoexSta->bForceLpsOn = FALSE; break; default: break; } } - -VOID -halbtc8812a1ant_CoexUnder5G( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 10); - - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); -} - VOID halbtc8812a1ant_ActionWifiOnly( IN PBTC_COEXIST pBtCoexist ) { - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); + halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); } VOID @@ -1497,17 +1834,10 @@ halbtc8812a1ant_MonitorBtEnableDisable( IN PBTC_COEXIST pBtCoexist ) { - PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; static BOOLEAN bPreBtDisabled=FALSE; - static u4Byte btDisableCnt=0; + static u4Byte btDisableCnt=0; BOOLEAN bBtActive=TRUE, bBtDisabled=FALSE; - // only 8812a need to consider if core stack is installed. - if(!pStackInfo->hciVersion) - { - bBtActive = FALSE; - } - // This function check if bt is disabled if( pCoexSta->highPriorityTx == 0 && @@ -1529,24 +1859,24 @@ halbtc8812a1ant_MonitorBtEnableDisable( btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); halbtc8812a1ant_ActionWifiOnly(pBtCoexist); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); bPreBtDisabled = bBtDisabled; @@ -1568,18 +1898,23 @@ halbtc8812a1ant_MonitorBtEnableDisable( //============================================= // SCO only or SCO+PAN(HS) + +/* VOID halbtc8812a1ant_ActionSco( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, TRUE); } + VOID halbtc8812a1ant_ActionHid( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, TRUE); } //A2DP only / PAN(EDR) only/ A2DP+PAN(HS) @@ -1588,6 +1923,7 @@ halbtc8812a1ant_ActionA2dp( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); } VOID @@ -1595,6 +1931,7 @@ halbtc8812a1ant_ActionA2dpPanHs( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); } VOID @@ -1602,6 +1939,7 @@ halbtc8812a1ant_ActionPanEdr( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); } //PAN(HS) only @@ -1610,6 +1948,7 @@ halbtc8812a1ant_ActionPanHs( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); } //PAN(EDR)+A2DP @@ -1618,6 +1957,7 @@ halbtc8812a1ant_ActionPanEdrA2dp( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); } VOID @@ -1625,6 +1965,7 @@ halbtc8812a1ant_ActionPanEdrHid( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, TRUE); } // HID+A2DP+PAN(EDR) @@ -1633,6 +1974,7 @@ halbtc8812a1ant_ActionHidA2dpPanEdr( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, TRUE); } VOID @@ -1640,69 +1982,78 @@ halbtc8812a1ant_ActionHidA2dp( IN PBTC_COEXIST pBtCoexist ) { + halbtc8812a1ant_SwMechanism(pBtCoexist, TRUE); } +*/ + //============================================= // // Non-Software Coex Mechanism start // //============================================= - VOID -halbtc8812a1ant_ActionHs( +halbtc8812a1ant_ActionWifiMultiPort( IN PBTC_COEXIST pBtCoexist ) { - BOOLEAN bHsConnecting=FALSE; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_CONNECTING, &bHsConnecting); - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action for HS, bHsConnecting=%d!!!\n", bHsConnecting)); + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); +} - if(bHsConnecting) - { - halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 3); - } - else - { - if((pCoexSta->highPriorityTx+pCoexSta->highPriorityRx+ - pCoexSta->lowPriorityTx+pCoexSta->lowPriorityRx)<=1200) - halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 3); - else - halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4); - } +VOID +halbtc8812a1ant_ActionHs( + IN PBTC_COEXIST pBtCoexist + ) +{ + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); } VOID halbtc8812a1ant_ActionBtInquiry( IN PBTC_COEXIST pBtCoexist ) -{ +{ PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BOOLEAN bWifiConnected=FALSE; - + BOOLEAN bWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy); - if(!bWifiConnected) + if((!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask)) { halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } - else if( (pBtLinkInfo->bScoExist) || - (pBtLinkInfo->bHidOnly) ) + else if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist)) { - // SCO/HID-only busy + // SCO/HID/A2DP busy halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); + + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else if ((pBtLinkInfo->bPanExist) || (bWifiBusy)) + { + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); } else { - halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x0); - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 30); - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } } @@ -1712,13 +2063,24 @@ halbtc8812a1ant_ActionBtScoHidOnlyBusy( IN u1Byte wifiStatus ) { + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bWifiConnected=FALSE; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + // tdma and coex table - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - if(BT_8812A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - else - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + if(pBtLinkInfo->bScoExist) + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); + } + else //HID + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); + } } VOID @@ -1727,37 +2089,68 @@ halbtc8812a1ant_ActionWifiConnectedBtAclBusy( IN u1Byte wifiStatus ) { + u1Byte btRssiState; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + btRssiState = halbtc8812a1ant_BtRssiState(2, 28, 0); + + if ( (pCoexSta->lowPriorityRx >= 950) && (!pCoexSta->bUnderIps) ) + { + pBtLinkInfo->bSlaveRole = TRUE; + } + else + { + pBtLinkInfo->bSlaveRole = FALSE; + } - if(pBtLinkInfo->bHidOnly) + if(pBtLinkInfo->bHidOnly) //HID { halbtc8812a1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus); - pCoexDm->bResetTdmaAdjust = TRUE; + pCoexDm->bAutoTdmaAdjust = FALSE; return; } - else if( (pBtLinkInfo->bA2dpOnly) || - (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist) ) + else if(pBtLinkInfo->bA2dpOnly) //A2DP { - halbtc8812a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus); + if(BT_8812A_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus) + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + pCoexDm->bAutoTdmaAdjust = FALSE; + } + else + { + halbtc8812a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + pCoexDm->bAutoTdmaAdjust = TRUE; + } } - else if( (pBtLinkInfo->bPanOnly) || - (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) + else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) || + (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) { - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->bResetTdmaAdjust = TRUE; + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + pCoexDm->bAutoTdmaAdjust = FALSE; } - else + else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist) //HID+A2DP { - if( (BT_8812A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) || - (BT_8812A_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) || - (BT_8812A_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) ) - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - else - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->bResetTdmaAdjust = TRUE; + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); + pCoexDm->bAutoTdmaAdjust = FALSE; + + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); } - - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); + else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP) + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + pCoexDm->bAutoTdmaAdjust = FALSE; + } + else + { + //BT no-profile busy (0x9) + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + pCoexDm->bAutoTdmaAdjust = FALSE; + } } VOID @@ -1768,21 +2161,81 @@ halbtc8812a1ant_ActionWifiNotConnected( // power save state halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - // tdma and coex table - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + // tdma and coex table + halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } VOID -halbtc8812a1ant_ActionWifiNotConnectedAssoAuthScan( +halbtc8812a1ant_ActionWifiNotConnectedScan( IN PBTC_COEXIST pBtCoexist ) { + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); // tdma and coex table - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) + { + if (pBtLinkInfo->bA2dpExist) + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + } + else if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || + (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) + { + halbtc8812a1ant_ActionBtScoHidOnlyBusy(pBtCoexist, + BT_8812A_1ANT_WIFI_STATUS_CONNECTED_SCAN); + } + else + { + //Bryant Add + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + } +} + +VOID +halbtc8812a1ant_ActionWifiNotConnectedAssoAuth( + IN PBTC_COEXIST pBtCoexist + ) +{ + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + // tdma and coex table + if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) ) + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4); + } + else if (pBtLinkInfo->bPanExist) + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4); + } + else + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2); + } } VOID @@ -1790,17 +2243,28 @@ halbtc8812a1ant_ActionWifiConnectedScan( IN PBTC_COEXIST pBtCoexist ) { - // power save state - if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) - halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x0); - else - halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); // tdma and coex table if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) { - halbtc8812a1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, - BT_8812A_1ANT_WIFI_STATUS_CONNECTED_SCAN); + if (pBtLinkInfo->bA2dpExist) + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else + { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } } else if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) @@ -1810,7 +2274,9 @@ halbtc8812a1ant_ActionWifiConnectedScan( } else { + //Bryant Add halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); } } @@ -1820,21 +2286,25 @@ halbtc8812a1ant_ActionWifiConnectedSpecialPacket( IN PBTC_COEXIST pBtCoexist ) { - // power save state - if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) - halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x0); - else - halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); // tdma and coex table - if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) + if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist)) { - halbtc8812a1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, - BT_8812A_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT); + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); } - else + else if(pBtLinkInfo->bPanExist) { + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } + else + { halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); } } @@ -1844,25 +2314,18 @@ halbtc8812a1ant_ActionWifiConnected( IN PBTC_COEXIST pBtCoexist ) { - BOOLEAN bWifiConnected=FALSE, bWifiBusy=FALSE; - BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BOOLEAN bUnder4way=FALSE; + BOOLEAN bWifiBusy=FALSE; + BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; + BOOLEAN bUnder4way=FALSE, bApEnable=FALSE; u4Byte wifiBw; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect()===>\n")); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - if(!bWifiConnected) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi not connected<===\n")); - return; - } + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect()===>\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way); if(bUnder4way) { halbtc8812a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n")); return; } @@ -1871,19 +2334,45 @@ halbtc8812a1ant_ActionWifiConnected( pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam); if(bScan || bLink || bRoam) { - halbtc8812a1ant_ActionWifiConnectedScan(pBtCoexist); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n")); + if(bScan) + halbtc8812a1ant_ActionWifiConnectedScan(pBtCoexist); + else + halbtc8812a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n")); return; } + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + // power save state - if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) - halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x0); + if(!bApEnable && BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) + { + if(pBtCoexist->btLinkInfo.bA2dpOnly) //A2DP + { + if(!bWifiBusy) + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else //busy + { + if (pCoexSta->nScanAPNum >= BT_8812A_1ANT_WIFI_NOISY_THRESH) //no force LPS, no PS-TDMA, use pure TDMA + { + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + } + else + { + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + } + } + } + else if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE)) + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + } else halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); // tdma and coex table - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); if(!bWifiBusy) { if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) @@ -1900,22 +2389,16 @@ halbtc8812a1ant_ActionWifiConnected( else { halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); + if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 ) + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } } else { - if(BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) - { - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - } - else if(BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) - { - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - } - else if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) + if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) { halbtc8812a1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, BT_8812A_1ANT_WIFI_STATUS_CONNECTED_BUSY); @@ -1929,7 +2412,11 @@ halbtc8812a1ant_ActionWifiConnected( else { halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); + if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 ) + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } } } @@ -1939,65 +2426,62 @@ halbtc8812a1ant_RunSwCoexistMechanism( IN PBTC_COEXIST pBtCoexist ) { - BOOLEAN bWifiUnder5G=FALSE, bWifiBusy=FALSE, bWifiConnected=FALSE; - u1Byte btInfoOriginal=0, btRetryCnt=0; u1Byte algorithm=0; - return; - algorithm = halbtc8812a1ant_ActionAlgorithm(pBtCoexist); - pCoexDm->curAlgorithm = algorithm; + pCoexDm->curAlgorithm = algorithm; if(halbtc8812a1ant_IsCommonAction(pBtCoexist)) { + } else { switch(pCoexDm->curAlgorithm) { case BT_8812A_1ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = SCO.\n")); - halbtc8812a1ant_ActionSco(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = SCO.\n")); + //halbtc8812a1ant_ActionSco(pBtCoexist); break; case BT_8812A_1ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID.\n")); - halbtc8812a1ant_ActionHid(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID.\n")); + //halbtc8812a1ant_ActionHid(pBtCoexist); break; case BT_8812A_1ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP.\n")); - halbtc8812a1ant_ActionA2dp(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP.\n")); + //halbtc8812a1ant_ActionA2dp(pBtCoexist); break; case BT_8812A_1ANT_COEX_ALGO_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); - halbtc8812a1ant_ActionA2dpPanHs(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); + //halbtc8812a1ant_ActionA2dpPanHs(pBtCoexist); break; case BT_8812A_1ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR).\n")); - halbtc8812a1ant_ActionPanEdr(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR).\n")); + //halbtc8812a1ant_ActionPanEdr(pBtCoexist); break; case BT_8812A_1ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HS mode.\n")); - halbtc8812a1ant_ActionPanHs(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HS mode.\n")); + //halbtc8812a1ant_ActionPanHs(pBtCoexist); break; case BT_8812A_1ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); - halbtc8812a1ant_ActionPanEdrA2dp(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); + //halbtc8812a1ant_ActionPanEdrA2dp(pBtCoexist); break; case BT_8812A_1ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n")); - halbtc8812a1ant_ActionPanEdrHid(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n")); + //halbtc8812a1ant_ActionPanEdrHid(pBtCoexist); break; case BT_8812A_1ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n")); - halbtc8812a1ant_ActionHidA2dpPanEdr(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n")); + //halbtc8812a1ant_ActionHidA2dpPanEdr(pBtCoexist); break; case BT_8812A_1ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP.\n")); - halbtc8812a1ant_ActionHidA2dp(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP.\n")); + //halbtc8812a1ant_ActionHidA2dp(pBtCoexist); break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = coexist All Off!!\n")); - halbtc8812a1ant_CoexAllOff(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = coexist All Off!!\n")); + //halbtc8812a1ant_CoexAllOff(pBtCoexist); break; } pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; @@ -2009,41 +2493,115 @@ halbtc8812a1ant_RunCoexistMechanism( IN PBTC_COEXIST pBtCoexist ) { - BOOLEAN bWifiUnder5G=FALSE, bWifiBusy=FALSE, bWifiConnected=FALSE, bBtHsOn=FALSE; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + BOOLEAN bIncreaseScanDevNum=FALSE; + BOOLEAN bBtCtrlAggBufSize=FALSE; + BOOLEAN bMiracastPlusBt=FALSE; + u1Byte aggBufSize=5; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH; + u4Byte wifiLinkStatus=0; + u4Byte numOfWifiLink=0, wifiBw; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); return; } - + if(pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); return; } if(pCoexSta->bUnderIps) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS !!!\n")); + return; + } + + if( (BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || + (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || + (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) + { + bIncreaseScanDevNum = TRUE; + } + + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); + numOfWifiLink = wifiLinkStatus>>16; + + if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED)) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) ); + + if(pBtLinkInfo->bBtLinkExist) + { + halbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); + bMiracastPlusBt = TRUE; + } + else + { + halbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + bMiracastPlusBt = FALSE; + } + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); + halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); + + if ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) ) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], BT Is Inquirying \n") ); + halbtc8812a1ant_ActionBtInquiry(pBtCoexist); + } + else + halbtc8812a1ant_ActionWifiMultiPort(pBtCoexist); + return; } + else + { + bMiracastPlusBt = FALSE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); + } + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G); - if(bWifiUnder5G) + if ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n")); - halbtc8812a1ant_CoexUnder5G(pBtCoexist); - return; + halbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); + + if(pBtLinkInfo->bScoExist) + halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5); + else + { + if (BTC_WIFI_BW_HT40==wifiBw) + halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x10); + else + halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); + } + + halbtc8812a1ant_SwMechanism(pBtCoexist, TRUE); + halbtc8812a1ant_RunSwCoexistMechanism(pBtCoexist); //just print debug message } + else + { + halbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - halbtc8812a1ant_RunSwCoexistMechanism(pBtCoexist); + halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); + + halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); + halbtc8812a1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message + } pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); if(pCoexSta->bC2hBtInquiryPage) { + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], BT Is Inquirying \n") ); halbtc8812a1ant_ActionBtInquiry(pBtCoexist); return; } @@ -2053,19 +2611,24 @@ halbtc8812a1ant_RunCoexistMechanism( return; } - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + if(!bWifiConnected) { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is non connected-idle !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is non connected-idle !!!\n")); 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); if(bScan || bLink || bRoam) - halbtc8812a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist); + { + if (bScan) + halbtc8812a1ant_ActionWifiNotConnectedScan(pBtCoexist); + else + halbtc8812a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); + } else halbtc8812a1ant_ActionWifiNotConnected(pBtCoexist); } @@ -2081,26 +2644,20 @@ halbtc8812a1ant_InitCoexDm( ) { // force to reset coex mechanism - halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); -} -//============================================================ -// work around function start with wa_halbtc8812a1ant_ -//============================================================ -//============================================================ -// extern function start with EXhalbtc8812a1ant_ -//============================================================ -VOID -EXhalbtc8812a1ant_PowerOnSetting( - IN PBTC_COEXIST pBtCoexist - ) -{ + // sw all off + halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE); + + //halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); + //halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); + + pCoexSta->popEventCnt = 0; } VOID -EXhalbtc8812a1ant_InitHwConfig( +halbtc8812a1ant_InitHwConfig( IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bBackUp, IN BOOLEAN bWifiOnly ) { @@ -2108,10 +2665,10 @@ EXhalbtc8812a1ant_InitHwConfig( u2Byte u2Tmp=0; u1Byte u1Tmp=0; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 1Ant Init HW Config!!\n")); //ant sw control to BT - halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, TRUE, FALSE); // 0x790[5:0]=0x5 u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790); @@ -2145,16 +2702,48 @@ EXhalbtc8812a1ant_InitHwConfig( pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp); } +//============================================================ +// work around function start with wa_halbtc8812a1ant_ +//============================================================ +//============================================================ +// extern function start with EXhalbtc8812a1ant_ +//============================================================ VOID -EXhalbtc8812a1ant_InitCoexDm( +EXhalbtc8812a1ant_PowerOnSetting( + IN PBTC_COEXIST pBtCoexist + ) +{ +} + +VOID +EXhalbtc8812a1ant_PreLoadFirmware( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); +} +VOID +EXhalbtc8812a1ant_InitHwConfig( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bWifiOnly + ) +{ + halbtc8812a1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly); pBtCoexist->bStopCoexDm = FALSE; +} + +VOID +EXhalbtc8812a1ant_InitCoexDm( + IN PBTC_COEXIST pBtCoexist + ) +{ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); + pBtCoexist->bStopCoexDm = FALSE; + halbtc8812a1ant_InitCoexDm(pBtCoexist); + + halbtc8812a1ant_QueryBtInfo(pBtCoexist); } VOID @@ -2162,10 +2751,10 @@ EXhalbtc8812a1ant_DisplayCoexInfo( IN PBTC_COEXIST pBtCoexist ) { - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - pu1Byte cliBuf=pBtCoexist->cliBuf; + pu1Byte cliBuf=pBtCoexist->cliBuf; u1Byte u1Tmp[4], i, btInfoExt, psTdmaCase=0; u4Byte u4Tmp[4]; u4Byte fwVer=0, btPatchVer=0; @@ -2206,7 +2795,7 @@ EXhalbtc8812a1ant_DisplayCoexInfo( pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1], pCoexDm->wifiChnlInfo[2]); CL_PRINTF(cliBuf); - + // wifi status CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); CL_PRINTF(cliBuf); @@ -2246,7 +2835,7 @@ EXhalbtc8812a1ant_DisplayCoexInfo( if(!pBtCoexist->bManualControl) { - // Sw mechanism + // Sw mechanism CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============"); CL_PRINTF(cliBuf); @@ -2258,7 +2847,7 @@ EXhalbtc8812a1ant_DisplayCoexInfo( pBtCoexist->btInfo.raMask); CL_PRINTF(cliBuf); - // Fw mechanism + // Fw mechanism CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============"); CL_PRINTF(cliBuf); @@ -2329,6 +2918,7 @@ EXhalbtc8812a1ant_DisplayCoexInfo( } + VOID EXhalbtc8812a1ant_IpsNotify( IN PBTC_COEXIST pBtCoexist, @@ -2342,14 +2932,21 @@ EXhalbtc8812a1ant_IpsNotify( if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); - pCoexSta->bUnderIps = TRUE; - halbtc8812a1ant_CoexAllOff(pBtCoexist); - halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); + pCoexSta->bUnderIps = TRUE; + + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); + + halbtc8812a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); + halbtc8812a1ant_InitCoexDm(pBtCoexist); + halbtc8812a1ant_QueryBtInfo(pBtCoexist); + pCoexSta->bUnderIps = FALSE; } } @@ -2365,12 +2962,12 @@ EXhalbtc8812a1ant_LpsNotify( if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); pCoexSta->bUnderLps = TRUE; } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); pCoexSta->bUnderLps = FALSE; } } @@ -2381,14 +2978,53 @@ EXhalbtc8812a1ant_ScanNotify( IN u1Byte type ) { - BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + u4Byte wifiLinkStatus=0; + u4Byte numOfWifiLink=0; + BOOLEAN bBtCtrlAggBufSize=FALSE; + u1Byte aggBufSize=5; + + u1Byte u1Tmpa, u1Tmpb; + u4Byte u4Tmp; if(pBtCoexist->bManualControl || - pBtCoexist->bStopCoexDm || - pBtCoexist->btInfo.bBtDisabled ) + pBtCoexist->bStopCoexDm ) + return; + + if(BTC_SCAN_START == type) + { + pCoexSta->bWiFiIsHighPriTask = TRUE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); + + halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); + } + else + { + pCoexSta->bWiFiIsHighPriTask = FALSE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum); + } + + if(pBtCoexist->btInfo.bBtDisabled) return; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + + halbtc8812a1ant_QueryBtInfo(pBtCoexist); + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); + numOfWifiLink = wifiLinkStatus>>16; + if(numOfWifiLink >= 2) + { + halbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); + halbtc8812a1ant_ActionWifiMultiPort(pBtCoexist); + return; + } + if(pCoexSta->bC2hBtInquiryPage) { halbtc8812a1ant_ActionBtInquiry(pBtCoexist); @@ -2400,13 +3036,12 @@ EXhalbtc8812a1ant_ScanNotify( return; } - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); if(!bWifiConnected) // non-connected scan { - halbtc8812a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist); + halbtc8812a1ant_ActionWifiNotConnectedScan(pBtCoexist); } else // wifi is connected { @@ -2415,7 +3050,7 @@ EXhalbtc8812a1ant_ScanNotify( } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); if(!bWifiConnected) // non-connected scan { halbtc8812a1ant_ActionWifiNotConnected(pBtCoexist); @@ -2434,12 +3069,41 @@ EXhalbtc8812a1ant_ConnectNotify( ) { BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE; + u4Byte wifiLinkStatus=0; + u4Byte numOfWifiLink=0; + BOOLEAN bBtCtrlAggBufSize=FALSE; + u1Byte aggBufSize=5; if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm || pBtCoexist->btInfo.bBtDisabled ) return; + if(BTC_ASSOCIATE_START == type) + { + pCoexSta->bWiFiIsHighPriTask = TRUE; + halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); + pCoexDm->nArpCnt = 0; + } + else + { + pCoexSta->bWiFiIsHighPriTask = FALSE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); + //pCoexDm->nArpCnt = 0; + } + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); + numOfWifiLink = wifiLinkStatus>>16; + if(numOfWifiLink >= 2) + { + halbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); + halbtc8812a1ant_ActionWifiMultiPort(pBtCoexist); + return; + } + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); if(pCoexSta->bC2hBtInquiryPage) { @@ -2454,12 +3118,12 @@ EXhalbtc8812a1ant_ConnectNotify( if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); - halbtc8812a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); + halbtc8812a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(!bWifiConnected) // non-connected scan @@ -2473,6 +3137,7 @@ EXhalbtc8812a1ant_ConnectNotify( } } +//to check registers... VOID EXhalbtc8812a1ant_MediaStatusNotify( IN PBTC_COEXIST pBtCoexist, @@ -2484,6 +3149,7 @@ EXhalbtc8812a1ant_MediaStatusNotify( u1Byte H2C_Parameter[3] ={0}; u4Byte wifiBw; u1Byte wifiCentralChnl; + BOOLEAN bWifiUnderBMode = FALSE; if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm || @@ -2492,11 +3158,35 @@ EXhalbtc8812a1ant_MediaStatusNotify( if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); + halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode); +#if 0 + //Set CCK Tx/Rx high Pri except 11b mode + if (bWifiUnderBMode) + { + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); //CCK Rx + } + else + { + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); //CCK Tx + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx + } +#endif + pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430); + pCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434); + pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a); + pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); + pCoexDm->nArpCnt = 0; + + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx } // only 2.4G we need to inform bt the chnl mask @@ -2504,7 +3194,8 @@ EXhalbtc8812a1ant_MediaStatusNotify( if( (BTC_MEDIA_CONNECT == type) && (wifiCentralChnl <= 14) ) { - H2C_Parameter[0] = 0x1; + //H2C_Parameter[0] = 0x1; + H2C_Parameter[0] = 0x0; H2C_Parameter[1] = wifiCentralChnl; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); if(BTC_WIFI_BW_HT40 == wifiBw) @@ -2516,15 +3207,15 @@ EXhalbtc8812a1ant_MediaStatusNotify( pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0]; pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1]; pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2]; - + buf[0] = dataLen; buf[1] = 0x5; // OP_Code buf[2] = 0x3; // OP_Code_Length buf[3] = H2C_Parameter[0]; // OP_Code_Content buf[4] = H2C_Parameter[1]; buf[5] = H2C_Parameter[2]; - - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]); + + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]); } VOID @@ -2533,13 +3224,61 @@ EXhalbtc8812a1ant_SpecialPacketNotify( IN u1Byte type ) { - BOOLEAN bBtHsOn=FALSE; + BOOLEAN bBtHsOn=FALSE; + u4Byte wifiLinkStatus=0; + u4Byte numOfWifiLink=0; + BOOLEAN bBtCtrlAggBufSize=FALSE; + u1Byte aggBufSize=5; if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm || pBtCoexist->btInfo.bBtDisabled ) return; + if( BTC_PACKET_DHCP == type || + BTC_PACKET_EAPOL == type || + BTC_PACKET_ARP == type ) + { + if(BTC_PACKET_ARP == type) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet ARP notify\n")); + + pCoexDm->nArpCnt++; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt)); + + if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) + { + pCoexSta->bWiFiIsHighPriTask = FALSE; + } + else + { + pCoexSta->bWiFiIsHighPriTask = TRUE; + } + } + else + { + pCoexSta->bWiFiIsHighPriTask = TRUE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet DHCP or EAPOL notify\n")); + } + } + else + { + pCoexSta->bWiFiIsHighPriTask = FALSE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet [Type = %d] notify\n", type)); + } + + pCoexSta->specialPktPeriodCnt = 0; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); + numOfWifiLink = wifiLinkStatus>>16; + if(numOfWifiLink >= 2) + { + halbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); + halbtc8812a1ant_ActionWifiMultiPort(pBtCoexist); + return; + } + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); if(pCoexSta->bC2hBtInquiryPage) { @@ -2553,9 +3292,9 @@ EXhalbtc8812a1ant_SpecialPacketNotify( } if( BTC_PACKET_DHCP == type || - BTC_PACKET_EAPOL == type ) + BTC_PACKET_EAPOL == type || + ( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type)); halbtc8812a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); } } @@ -2570,20 +3309,17 @@ EXhalbtc8812a1ant_BtInfoNotify( PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; u1Byte btInfo=0; u1Byte i, rspSource=0; - static u4Byte setBtPsdMode=0; - BOOLEAN bBtBusy=FALSE; BOOLEAN bWifiConnected=FALSE; - BOOLEAN bBtCtrlAggBufSize=FALSE, bRejApAggPkt=FALSE; + BOOLEAN bBtBusy=FALSE; + + pCoexSta->bC2hBtInfoReqSent = FALSE; rspSource = tmpBuf[0]&0xf; if(rspSource >= BT_INFO_SRC_8812A_1ANT_MAX) rspSource = BT_INFO_SRC_8812A_1ANT_WIFI_FW; pCoexSta->btInfoC2hCnt[rspSource]++; - if(BT_INFO_SRC_8812A_1ANT_BT_RSP == rspSource) - pCoexSta->btInfoQueryCnt = pCoexSta->btInfoC2hCnt[BT_INFO_SRC_8812A_1ANT_BT_RSP]; - - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -2591,47 +3327,48 @@ EXhalbtc8812a1ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } - if(pBtCoexist->btInfo.bBtDisabled) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for BT is disabled <===\n")); - return; - } - - if(pBtCoexist->bManualControl) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n")); - return; - } - if(pBtCoexist->bStopCoexDm) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for Coex STOPPED!!<===\n")); - return; - } - if(BT_INFO_SRC_8812A_1ANT_WIFI_FW != rspSource) { pCoexSta->btRetryCnt = // [3:0] pCoexSta->btInfoC2h[rspSource][2]&0xf; + if (pCoexSta->btRetryCnt >= 1) + pCoexSta->popEventCnt++; + + if (pCoexSta->btInfoC2h[rspSource][2]&0x20) + pCoexSta->bC2hBtPage = TRUE; + else + pCoexSta->bC2hBtPage = FALSE; + pCoexSta->btRssi = - pCoexSta->btInfoC2h[rspSource][3]*2+10; + pCoexSta->btInfoC2h[rspSource][3]*2-90; + //pCoexSta->btInfoC2h[rspSource][3]*2+10; pCoexSta->btInfoExt = pCoexSta->btInfoC2h[rspSource][4]; + pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask); + if(!pCoexSta->bBtTxRxMask) + { + /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n")); + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); + } + // Here we need to resend some wifi info to BT // because bt is reset and loss of the info. - if( (pCoexSta->btInfoExt & BIT1) ) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); + if(pCoexSta->btInfoExt & BIT1) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(bWifiConnected) { @@ -2641,34 +3378,30 @@ EXhalbtc8812a1ant_BtInfoNotify( { EXhalbtc8812a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); } - - setBtPsdMode = 0; } - - // test-chip bt patch only rsp the status for BT_RSP, - // so temporary we consider the following only under BT_RSP - if(BT_INFO_SRC_8812A_1ANT_BT_RSP == rspSource) + + if(pCoexSta->btInfoExt & BIT3) { - if( (pCoexSta->btInfoExt & BIT3) ) + if(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); halbtc8812a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); } - else - { - // BT already NOT ignore Wlan active, do nothing here. - } - - if( (pCoexSta->btInfoExt & BIT4) ) - { - // BT auto report already enabled, do nothing - } - else - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit4 check, set BT to enable Auto Report!!\n")); - halbtc8812a1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE); - } } + else + { + // BT already NOT ignore Wlan active, do nothing here. + } +#if(BT_AUTO_REPORT_ONLY_8812A_1ANT == 0) + if( (pCoexSta->btInfoExt & BIT4) ) + { + // BT auto report already enabled, do nothing + } + else + { + halbtc8812a1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE); + } +#endif } // check BIT2 first ==> check if bt is under inquiry or page scan @@ -2709,84 +3442,95 @@ EXhalbtc8812a1ant_BtInfoNotify( halbtc8812a1ant_UpdateBtLinkInfo(pBtCoexist); + btInfo = btInfo & 0x1f; //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41) + if(!(btInfo&BT_INFO_8812A_1ANT_B_CONNECTION)) { pCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt non-connected idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); } else if(btInfo == BT_INFO_8812A_1ANT_B_CONNECTION) // connection exists but no busy { pCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt connected-idle!!!\n")); - } + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); + } else if((btInfo&BT_INFO_8812A_1ANT_B_SCO_ESCO) || (btInfo&BT_INFO_8812A_1ANT_B_SCO_BUSY)) { pCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_SCO_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt sco busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); } else if(btInfo&BT_INFO_8812A_1ANT_B_ACL_BUSY) { if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus) - pCoexDm->bResetTdmaAdjust = TRUE; + pCoexDm->bAutoTdmaAdjust = FALSE; pCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_ACL_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt acl busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); } else { pCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_MAX; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt non-defined state!!!\n")); - } - - if(pBtLinkInfo->bScoExist) - { - bRejApAggPkt = TRUE; - halbtc8812a1ant_UpdateRaMask(pBtCoexist, NORMAL_EXEC, BTC_RATE_DISABLE, 0x00000003); // disable cck 1M2M. - } - else - { - halbtc8812a1ant_UpdateRaMask(pBtCoexist, NORMAL_EXEC, BTC_RATE_ENABLE, 0x00000003); // enable cck 1M2M. + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); } if( (BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { bBtBusy = TRUE; - if(pBtLinkInfo->bHidExist) - bBtCtrlAggBufSize = TRUE; - } else - { bBtBusy = FALSE; - } pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy); - //============================================ - // Aggregation related setting - //============================================ - // if sco, reject AddBA - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejApAggPkt); - // decide BT control aggregation buf size or not - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlAggBufSize); - // real update aggregation setting - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); - //============================================ - halbtc8812a1ant_RunCoexistMechanism(pBtCoexist); } +VOID +EXhalbtc8812a1ant_RfStatusNotify( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte type + ) +{ + u4Byte u4Tmp; + u1Byte u1Tmpa,u1Tmpb, u1Tmpc; + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RF Status notify\n")); + + if(BTC_RF_ON == type) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RF is turned ON!!\n")); + pBtCoexist->bStopCoexDm = FALSE; + } + else if(BTC_RF_OFF == type) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RF is turned OFF!!\n")); + + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE); + + halbtc8812a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + pBtCoexist->bStopCoexDm = TRUE; + } +} + VOID EXhalbtc8812a1ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + u4Byte u4Tmp; + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); - halbtc8812a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); - halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE); + + halbtc8812a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + EXhalbtc8812a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); + + pBtCoexist->bStopCoexDm = TRUE; } VOID @@ -2795,21 +3539,40 @@ EXhalbtc8812a1ant_PnpNotify( IN u1Byte pnpState ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify\n")); if(BTC_WIFI_PNP_SLEEP == pnpState) { - pBtCoexist->bStopCoexDm = TRUE; - halbtc8812a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to SLEEP\n")); + halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); + halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); + halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE); + halbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + + pBtCoexist->bStopCoexDm = TRUE; } else if(BTC_WIFI_PNP_WAKE_UP == pnpState) { - + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to WAKE UP\n")); + pBtCoexist->bStopCoexDm = FALSE; + halbtc8812a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); + halbtc8812a1ant_InitCoexDm(pBtCoexist); + halbtc8812a1ant_QueryBtInfo(pBtCoexist); } } +VOID +EXhalbtc8812a1ant_CoexDmReset( + IN PBTC_COEXIST pBtCoexist + ) +{ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], *****************Coex DM Reset*****************\n")); + + halbtc8812a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); + halbtc8812a1ant_InitCoexDm(pBtCoexist); +} + VOID EXhalbtc8812a1ant_Periodical( IN PBTC_COEXIST pBtCoexist @@ -2820,26 +3583,38 @@ EXhalbtc8812a1ant_Periodical( PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); if(disVerInfoCnt <= 5) { disVerInfoCnt += 1; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", GLCoexVerDate8812a1Ant, GLCoexVer8812a1Ant, fwVer, btPatchVer, btPatchVer)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); } +#if(BT_AUTO_REPORT_ONLY_8812A_1ANT == 0) halbtc8812a1ant_QueryBtInfo(pBtCoexist); - halbtc8812a1ant_MonitorBtCtr(pBtCoexist); halbtc8812a1ant_MonitorBtEnableDisable(pBtCoexist); +#else + halbtc8812a1ant_MonitorBtCtr(pBtCoexist); + halbtc8812a1ant_MonitorWiFiCtr(pBtCoexist); + + if( halbtc8812a1ant_IsWifiStatusChanged(pBtCoexist) || + pCoexDm->bAutoTdmaAdjust ) + { + halbtc8812a1ant_RunCoexistMechanism(pBtCoexist); + } + + pCoexSta->specialPktPeriodCnt++; +#endif } VOID @@ -2853,24 +3628,24 @@ EXhalbtc8812a1ant_DbgControl( switch(opCode) { case BTC_DBG_SET_COEX_NORMAL: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set CoexMode to Normal\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set CoexMode to Normal\n")); pBtCoexist->bManualControl = FALSE; halbtc8812a1ant_InitCoexDm(pBtCoexist); break; case BTC_DBG_SET_COEX_WIFI_ONLY: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set CoexMode to Wifi Only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set CoexMode to Wifi Only\n")); pBtCoexist->bManualControl = TRUE; halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); break; case BTC_DBG_SET_COEX_BT_ONLY: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set CoexMode to BT only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set CoexMode to BT only\n")); pBtCoexist->bManualControl = TRUE; halbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); break; case BTC_DBG_SET_COEX_DEC_BT_PWR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set Dec BT power\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set Dec BT power\n")); { u1Byte dataLen=4; u1Byte buf[6] = {0}; @@ -2886,14 +3661,14 @@ EXhalbtc8812a1ant_DbgControl( buf[3] = decBtPwr; // OP_Code_Content buf[4] = pwrLevel; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set Dec BT power=%d, pwrLevel=%d\n", decBtPwr, pwrLevel)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set Dec BT power=%d, pwrLevel=%d\n", decBtPwr, pwrLevel)); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]); } } break; case BTC_DBG_SET_COEX_BT_AFH_MAP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set BT AFH Map\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set BT AFH Map\n")); { u1Byte dataLen=5; u1Byte buf[6] = {0}; @@ -2907,7 +3682,7 @@ EXhalbtc8812a1ant_DbgControl( buf[4] = pData[1]; buf[5] = pData[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set BT AFH Map = %02x %02x %02x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set BT AFH Map = %02x %02x %02x\n", pData[0], pData[1], pData[2])); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]); } @@ -2915,7 +3690,7 @@ EXhalbtc8812a1ant_DbgControl( break; case BTC_DBG_SET_COEX_BT_IGNORE_WLAN_ACT: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set BT Ignore Wlan Active\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set BT Ignore Wlan Active\n")); { u1Byte dataLen=3; u1Byte buf[6] = {0}; @@ -2926,7 +3701,7 @@ EXhalbtc8812a1ant_DbgControl( buf[2] = 0x1; // OP_Code_Length buf[3] = pData[0]; // OP_Code_Content - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set BT Ignore Wlan Active = 0x%x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set BT Ignore Wlan Active = 0x%x\n", pData[0])); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]); @@ -2937,5 +3712,6 @@ EXhalbtc8812a1ant_DbgControl( break; } } + #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h index 4f2df7a6033d..c4ec1a4c8f16 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h @@ -1,6 +1,8 @@ //=========================================== -// The following is for 8812A_1ANT BT Co-exist definition +// The following is for 8812A 1ANT BT Co-exist definition //=========================================== +#define BT_AUTO_REPORT_ONLY_8812A_1ANT 1 + #define BT_INFO_8812A_1ANT_B_FTP BIT7 #define BT_INFO_8812A_1ANT_B_A2DP BIT6 #define BT_INFO_8812A_1ANT_B_HID BIT5 @@ -15,8 +17,7 @@ #define BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT 2 -#define BTC_8812A_1ANT_SWITCH_TO_WIFI 0 -#define BTC_8812A_1ANT_SWITCH_TO_BT 1 +#define BT_8812A_1ANT_WIFI_NOISY_THRESH 30 //max: 255 typedef enum _BT_INFO_SRC_8812A_1ANT{ BT_INFO_SRC_8812A_1ANT_WIFI_FW = 0x0, @@ -61,6 +62,9 @@ typedef enum _BT_8812A_1ANT_COEX_ALGO{ }BT_8812A_1ANT_COEX_ALGO,*PBT_8812A_1ANT_COEX_ALGO; typedef struct _COEX_DM_8812A_1ANT{ + // hw setting + u1Byte preAntPosType; + u1Byte curAntPosType; // fw mechanism BOOLEAN bCurIgnoreWlanAct; BOOLEAN bPreIgnoreWlanAct; @@ -68,7 +72,7 @@ typedef struct _COEX_DM_8812A_1ANT{ u1Byte curPsTdma; u1Byte psTdmaPara[5]; u1Byte psTdmaDuAdjType; - BOOLEAN bResetTdmaAdjust; + BOOLEAN bAutoTdmaAdjust; BOOLEAN bPrePsTdmaOn; BOOLEAN bCurPsTdmaOn; BOOLEAN bPreBtAutoReport; @@ -81,7 +85,6 @@ typedef struct _COEX_DM_8812A_1ANT{ // sw mechanism BOOLEAN bPreLowPenaltyRa; BOOLEAN bCurLowPenaltyRa; - BOOLEAN bPreDacSwingOn; u4Byte preVal0x6c0; u4Byte curVal0x6c0; u4Byte preVal0x6c4; @@ -90,6 +93,12 @@ typedef struct _COEX_DM_8812A_1ANT{ u4Byte curVal0x6c8; u1Byte preVal0x6cc; u1Byte curVal0x6cc; + BOOLEAN bLimitedDig; + + u4Byte backupArfrCnt1; // Auto Rate Fallback Retry cnt + u4Byte backupArfrCnt2; // Auto Rate Fallback Retry cnt + u2Byte backupRetryLimit; + u1Byte backupAmpduMaxTime; // algorithm related u1Byte preAlgorithm; @@ -99,6 +108,13 @@ typedef struct _COEX_DM_8812A_1ANT{ u4Byte preRaMask; u4Byte curRaMask; + u1Byte preArfrType; + u1Byte curArfrType; + u1Byte preRetryLimitType; + u1Byte curRetryLimitType; + u1Byte preAmpduTimeType; + u1Byte curAmpduTimeType; + u4Byte nArpCnt; u1Byte errorCondition; } COEX_DM_8812A_1ANT, *PCOEX_DM_8812A_1ANT; @@ -112,11 +128,13 @@ typedef struct _COEX_STA_8812A_1ANT{ BOOLEAN bUnderLps; BOOLEAN bUnderIps; + u4Byte specialPktPeriodCnt; u4Byte highPriorityTx; u4Byte highPriorityRx; u4Byte lowPriorityTx; u4Byte lowPriorityRx; - u1Byte btRssi; + s1Byte btRssi; + BOOLEAN bBtTxRxMask; u1Byte preBtRssiState; u1Byte preWifiRssiState[4]; BOOLEAN bC2hBtInfoReqSent; @@ -124,8 +142,28 @@ typedef struct _COEX_STA_8812A_1ANT{ u4Byte btInfoC2hCnt[BT_INFO_SRC_8812A_1ANT_MAX]; u4Byte btInfoQueryCnt; BOOLEAN bC2hBtInquiryPage; + BOOLEAN bC2hBtPage; //Add for win8.1 page out issue + BOOLEAN bWiFiIsHighPriTask; //Add for win8.1 page out issue u1Byte btRetryCnt; u1Byte btInfoExt; + u4Byte popEventCnt; + u1Byte nScanAPNum; + + u4Byte nCRCOK_CCK; + u4Byte nCRCOK_11g; + u4Byte nCRCOK_11n; + u4Byte nCRCOK_11nAgg; + + u4Byte nCRCErr_CCK; + u4Byte nCRCErr_11g; + u4Byte nCRCErr_11n; + u4Byte nCRCErr_11nAgg; + + BOOLEAN bCCKLock; + BOOLEAN bPreCCKLock; + u1Byte nCoexTableType; + + BOOLEAN bForceLpsOn; }COEX_STA_8812A_1ANT, *PCOEX_STA_8812A_1ANT; //=========================================== @@ -136,6 +174,10 @@ EXhalbtc8812a1ant_PowerOnSetting( IN PBTC_COEXIST pBtCoexist ); VOID +EXhalbtc8812a1ant_PreLoadFirmware( + IN PBTC_COEXIST pBtCoexist + ); +VOID EXhalbtc8812a1ant_InitHwConfig( IN PBTC_COEXIST pBtCoexist, IN BOOLEAN bWifiOnly @@ -181,6 +223,11 @@ EXhalbtc8812a1ant_BtInfoNotify( IN u1Byte length ); VOID +EXhalbtc8812a1ant_RfStatusNotify( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte type + ); +VOID EXhalbtc8812a1ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ); @@ -190,17 +237,22 @@ EXhalbtc8812a1ant_PnpNotify( IN u1Byte pnpState ); VOID -EXhalbtc8812a1ant_Periodical( +EXhalbtc8812a1ant_CoexDmReset( IN PBTC_COEXIST pBtCoexist ); VOID -EXhalbtc8812a1ant_DisplayCoexInfo( - IN PBTC_COEXIST pBtCoexist +EXhalbtc8812a1ant_Periodical( + IN PBTC_COEXIST pBtCoexist ); VOID EXhalbtc8812a1ant_DbgControl( IN PBTC_COEXIST pBtCoexist, IN u1Byte opCode, IN u1Byte opLen, - IN pu1Byte pData + IN pu1Byte pData ); +VOID +EXhalbtc8812a1ant_DisplayCoexInfo( + IN PBTC_COEXIST pBtCoexist + ); + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c index 82029305e9b1..796ac14bdf86 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c @@ -13,6 +13,11 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8812a2Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -28,9 +33,9 @@ const char *const GLBtInfoSrc8812a2Ant[]={ "BT Info[bt auto report]", }; -u4Byte GLCoexVerDate8812a2Ant=20131017; -u4Byte GLCoexVer8812a2Ant=0x36; - +u4Byte GLCoexVerDate8812a2Ant=20150127; +u4Byte GLCoexVer8812a2Ant=0x37; +//improve 8761ATV D-cut BT off/on fail issue //============================================================ // local function proto type if needed //============================================================ @@ -54,30 +59,24 @@ halbtc8812a2ant_BtRssiState( if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) || (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=LOW\n")); if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=HIGH\n")); if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -85,57 +84,47 @@ halbtc8812a2ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) || (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=LOW\n")); if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=MEDIUM\n")); if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi pre state=HIGH\n")); if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -167,12 +156,10 @@ halbtc8812a2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -180,12 +167,10 @@ halbtc8812a2ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -193,7 +178,7 @@ halbtc8812a2ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -203,12 +188,10 @@ halbtc8812a2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -217,17 +200,14 @@ halbtc8812a2ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -235,12 +215,10 @@ halbtc8812a2ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -282,36 +260,49 @@ halbtc8812a2ant_MonitorBtEnableDisable( { bBtActive = FALSE; } + + if((pCoexSta->prebtInfoC2hCnt_BT_RSP == pCoexSta->btInfoC2hCnt[1]) && + (pCoexSta->prebtInfoC2hCnt_BT_SEND == pCoexSta->btInfoC2hCnt[2])) + { + bBtActive = FALSE; + } + pCoexSta->prebtInfoC2hCnt_BT_RSP = pCoexSta->btInfoC2hCnt[1]; + pCoexSta->prebtInfoC2hCnt_BT_SEND = pCoexSta->btInfoC2hCnt[2]; + if(bBtActive) { btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt is detected as disabled %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt is detected as disabled %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); bPreBtDisabled = bBtDisabled; if(!bBtDisabled) { + // enable PTA + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20); } else { + // disable PTA + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x00); } } } @@ -525,9 +516,9 @@ halbtc8812a2ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx)); // reset counter @@ -611,6 +602,7 @@ halbtc8812a2ant_UpdateBtLinkInfo( pBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist; pBtLinkInfo->bPanExist = pCoexSta->bPanExist; pBtLinkInfo->bHidExist = pCoexSta->bHidExist; + pBtLinkInfo->bAclBusy = pCoexSta->bAclBusy; // work around for HS mode. if(bBtHsOn) @@ -684,7 +676,7 @@ halbtc8812a2ant_ActionAlgorithm( if(!pBtLinkInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No BT link exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); return algorithm; } @@ -697,35 +689,43 @@ halbtc8812a2ant_ActionAlgorithm( if(pBtLinkInfo->bA2dpExist) numOfDiffProfile++; - if(numOfDiffProfile == 1) + if(numOfDiffProfile == 0) + { + if(pBtLinkInfo->bAclBusy) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ACL Busy only\n")); + algorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR; + } + } + else if(numOfDiffProfile == 1) { if(pBtLinkInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO only\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_SCO; } else { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID only\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP only\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_A2DP; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(HS) only\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(EDR) only\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR; } } @@ -737,24 +737,24 @@ halbtc8812a2ant_ActionAlgorithm( { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_SCO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP ==> SCO\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(HS)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(EDR)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_SCO; } } @@ -766,12 +766,12 @@ halbtc8812a2ant_ActionAlgorithm( { if(pStackInfo->numOfHid >= 2) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID*2 + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID*2 + A2DP\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_HID_A2DP; } } @@ -780,12 +780,12 @@ halbtc8812a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(HS)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(EDR)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -794,12 +794,12 @@ halbtc8812a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(HS)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(EDR)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -812,7 +812,7 @@ halbtc8812a2ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID; } else if( pBtLinkInfo->bHidExist && @@ -820,12 +820,12 @@ halbtc8812a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(HS)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_SCO_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(EDR)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_SCO_HID; } } @@ -834,12 +834,12 @@ halbtc8812a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -852,12 +852,12 @@ halbtc8812a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(HS)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -873,12 +873,12 @@ halbtc8812a2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); algorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -900,8 +900,8 @@ halbtc8812a2ant_SetFwDacSwingLevel( // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 H2C_Parameter[0] = dacSwingLvl; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter); } @@ -915,7 +915,7 @@ halbtc8812a2ant_SetFwDecBtPwr( u1Byte dataLen=4; u1Byte buf[6] = {0}; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], decrease Bt Power level = %d\n", decBtPwrLvl)); buf[0] = dataLen; @@ -937,15 +937,12 @@ halbtc8812a2ant_DecBtPwr( IN u1Byte decBtPwrLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s Dec BT power level = %d\n", (bForceExec? "force to":""), decBtPwrLvl)); pCoexDm->curBtDecPwrLvl = decBtPwrLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n", - pCoexDm->preBtDecPwrLvl, pCoexDm->curBtDecPwrLvl)); - if(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) return; } @@ -961,15 +958,12 @@ halbtc8812a2ant_FwDacSwingLvl( IN u1Byte fwDacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set FW Dac Swing level = %d\n", (bForceExec? "force to":""), fwDacSwingLvl)); pCoexDm->curFwDacSwingLvl = fwDacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", - pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); - if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) return; } @@ -988,7 +982,7 @@ halbtc8812a2ant_SetSwRfRxLpfCorner( if(bRxRfShrinkOn) { //Shrink RF Rx LPF corner - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc); } else @@ -997,7 +991,7 @@ halbtc8812a2ant_SetSwRfRxLpfCorner( // After initialized, we can use pCoexDm->btRf0x1eBackup if(pBtCoexist->bInitilized) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup); } } @@ -1010,15 +1004,12 @@ halbtc8812a2ant_RfShrink( IN BOOLEAN bRxRfShrinkOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Rx RF Shrink = %s\n", (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF"))); pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", - pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); - if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) return; } @@ -1039,12 +1030,12 @@ halbtc8812a2ant_SetSwPenaltyTxRateAdaptive( tmpU1 |= BIT0; if(bLowPenaltyRa) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set low penalty!!\n")); tmpU1 &= ~BIT2; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set normal!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Tx rate adaptive, set normal!!\n")); tmpU1 |= BIT2; } @@ -1059,15 +1050,12 @@ halbtc8812a2ant_LowPenaltyRa( ) { return; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -1084,7 +1072,7 @@ halbtc8812a2ant_SetDacSwingReg( { u1Byte val=(u1Byte)level; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc5b, 0x3e, val); } @@ -1114,17 +1102,13 @@ halbtc8812a2ant_DacSwing( IN u4Byte dacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl)); pCoexDm->bCurDacSwingOn = bDacSwingOn; pCoexDm->curDacSwingLvl = dacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", - pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl, - pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl)); - if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) && (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) ) return; @@ -1144,12 +1128,12 @@ halbtc8812a2ant_SetAdcBackOff( { if(bAdcBackOff) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level On!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x3); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level Off!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x1); } } @@ -1161,15 +1145,12 @@ halbtc8812a2ant_AdcBackOff( IN BOOLEAN bAdcBackOff ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn AdcBackOff = %s\n", (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF"))); pCoexDm->bCurAdcBackOff = bAdcBackOff; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", - pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff)); - if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) return; } @@ -1189,14 +1170,14 @@ halbtc8812a2ant_SetAgcTable( pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000); if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28F4B); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x10AB2); rssiAdjustVal = 8; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x2884B); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x104B2); } @@ -1213,15 +1194,12 @@ halbtc8812a2ant_AgcTable( IN BOOLEAN bAgcTableEn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s %s Agc Table\n", (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable"))); pCoexDm->bCurAgcTableEn = bAgcTableEn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", - pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn)); - if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) return; } @@ -1239,16 +1217,16 @@ halbtc8812a2ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -1262,7 +1240,7 @@ halbtc8812a2ant_CoexTable( IN u1Byte val0x6cc ) { - 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", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c4 = val0x6c4; @@ -1270,12 +1248,7 @@ halbtc8812a2ant_CoexTable( pCoexDm->curVal0x6cc = val0x6cc; if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - + { if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && @@ -1332,7 +1305,7 @@ halbtc8812a2ant_SetFwIgnoreWlanAct( u1Byte dataLen=3; u1Byte buf[5] = {0}; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], %s BT Ignore Wlan_Act\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Ignore Wlan_Act\n", (bEnable? "Enable":"Disable"))); buf[0] = dataLen; @@ -1353,15 +1326,12 @@ halbtc8812a2ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -1381,20 +1351,38 @@ halbtc8812a2ant_SetFwPstdma( ) { u1Byte H2C_Parameter[5] ={0}; + u1Byte realByte1=byte1, realByte5=byte5; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + if(bApEnable) + { + if(byte1&BIT4 && !(byte1&BIT5)) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FW for 1Ant AP mode\n")); + realByte1 &= ~BIT4; + realByte1 |= BIT5; - H2C_Parameter[0] = byte1; + realByte5 |= BIT5; + realByte5 &= ~BIT6; + } + } + + H2C_Parameter[0] = realByte1; H2C_Parameter[1] = byte2; H2C_Parameter[2] = byte3; H2C_Parameter[3] = byte4; - H2C_Parameter[4] = byte5; + H2C_Parameter[4] = realByte5; + - pCoexDm->psTdmaPara[0] = byte1; + pCoexDm->psTdmaPara[0] = realByte1; pCoexDm->psTdmaPara[1] = byte2; pCoexDm->psTdmaPara[2] = byte3; pCoexDm->psTdmaPara[3] = byte4; - pCoexDm->psTdmaPara[4] = byte5; - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n", + pCoexDm->psTdmaPara[4] = realByte5; + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", H2C_Parameter[0], H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); @@ -1425,16 +1413,13 @@ halbtc8812a2ant_LpsRpwm( { BOOLEAN bForceExecPwrCmd=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", (bForceExec? "force to":""), lpsVal, rpwmVal)); pCoexDm->curLps = lpsVal; pCoexDm->curRpwm = rpwmVal; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preLps/curLps=0x%x/0x%x, preRpwm/curRpwm=0x%x/0x%x!!\n", - pCoexDm->preLps, pCoexDm->curLps, pCoexDm->preRpwm, pCoexDm->curRpwm)); - if( (pCoexDm->preLps == pCoexDm->curLps) && (pCoexDm->preRpwm == pCoexDm->curRpwm) ) { @@ -1533,18 +1518,13 @@ halbtc8812a2ant_PsTdma( BOOLEAN bTurnOnByCnt=FALSE; u1Byte psTdmaTypeByCnt=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); pCoexDm->bCurPsTdmaOn = bTurnOn; pCoexDm->curPsTdma = type; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", - pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", - pCoexDm->prePsTdma, pCoexDm->curPsTdma)); - if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) return; @@ -1564,7 +1544,7 @@ halbtc8812a2ant_PsTdma( halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xb1, 0x90); break; case 4: - halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xb1, 0x90); + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xb1, 0x90); break; case 5: halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x21, 0x10); @@ -1585,10 +1565,10 @@ halbtc8812a2ant_PsTdma( halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xa1, 0x10); break; case 11: - halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x03, 0xb1, 0x10); + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xb1, 0x10); break; case 12: - halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xb1, 0x10); + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xb1, 0x10); break; case 13: halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x21, 0x10); @@ -1597,13 +1577,13 @@ halbtc8812a2ant_PsTdma( halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x21, 0x10); break; case 15: - halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x03, 0x21, 0x10); + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x21, 0x10); break; case 16: - halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0x21, 0x10); + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0x21, 0x10); break; case 17: - halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0xb1, 0x10); + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x35, 0x3, 0xb1, 0x11); break; case 18: halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90); @@ -1615,8 +1595,15 @@ halbtc8812a2ant_PsTdma( halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90); break; case 21: - halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90); + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x70, 0x90); + break; + case 22: + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x61, 0x1a, 0x1a, 0x21, 0x10); break; + case 23: + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x03, 0x31, 0x10); + break; + case 71: halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); break; @@ -1651,12 +1638,12 @@ halbtc8812a2ant_PsTdma( halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0); break; case 1: //ANT2BT, 0x778=3 - halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x08, 0x0); + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x8, 0x0); delay_ms(5); halbtc8812a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_CPL_AUX, FALSE, FALSE); break; default: - halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x00, 0x0); + halbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); break; } } @@ -1794,6 +1781,14 @@ halbtc8812a2ant_IsCommonAction( pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + + if(pCoexSta->bC2hBtInquiryPage) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under inquiry/page scan !!\n")); + halbtc8812a2ant_ActionBtInquiry(pBtCoexist); + return TRUE; + } + if(pBtLinkInfo->bScoExist || pBtLinkInfo->bHidExist) { halbtc8812a2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 0, 0, 0); @@ -1808,7 +1803,7 @@ halbtc8812a2ant_IsCommonAction( halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, FALSE, 0x0, 0x0); halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-connected idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non-connected idle!!\n")); if( (BT_8812A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) || (BT_8812A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) @@ -1834,11 +1829,11 @@ halbtc8812a2ant_IsCommonAction( { if(BT_8812A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, FALSE, 0x0, 0x0); halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); + halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); halbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); halbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); @@ -1853,11 +1848,11 @@ halbtc8812a2ant_IsCommonAction( if(bBtHsOn) return FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); + halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); halbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); halbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); @@ -1871,30 +1866,21 @@ halbtc8812a2ant_IsCommonAction( { if(bWifiBusy) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); bCommon = FALSE; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); - wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); - if(BTC_RSSI_HIGH(wifiRssiState)) - halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); - else - halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, TRUE, 0x50, 0x4); + halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - if(BTC_RSSI_HIGH(wifiRssiState)) - halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - else - halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 17); - if(BTC_RSSI_HIGH(wifiRssiState)) - halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 17); - else - halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83); halbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); halbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); halbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); @@ -1919,14 +1905,14 @@ halbtc8812a2ant_TdmaDurationAdjust( s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjust()\n")); pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; if(!pCoexDm->bAutoTdmaAdjust) { pCoexDm->bAutoTdmaAdjust = TRUE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); { if(bScoHid) { @@ -2039,8 +2025,8 @@ halbtc8812a2ant_TdmaDurationAdjust( { //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], retryCount = %d\n", retryCount)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", up, dn, m, n, WaitCount)); result = 0; WaitCount++; @@ -2060,7 +2046,7 @@ halbtc8812a2ant_TdmaDurationAdjust( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -2086,7 +2072,7 @@ halbtc8812a2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -2104,15 +2090,15 @@ halbtc8812a2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval)); if(maxInterval == 1) { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 71) { @@ -2229,7 +2215,7 @@ halbtc8812a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71); @@ -2353,7 +2339,7 @@ halbtc8812a2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); @@ -2463,7 +2449,7 @@ halbtc8812a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); @@ -2576,7 +2562,7 @@ halbtc8812a2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); @@ -2686,7 +2672,7 @@ halbtc8812a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); @@ -2802,7 +2788,7 @@ halbtc8812a2ant_TdmaDurationAdjust( if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); @@ -2815,7 +2801,7 @@ halbtc8812a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); } } } @@ -2833,7 +2819,7 @@ halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow( s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0, btInfoExt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow()\n")); #if 0 if( (BT_8812A_2ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) || (BT_8812A_2ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) || @@ -2859,13 +2845,24 @@ halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow( #endif pCoexDm->bAutoTdmaAdjust = FALSE; + retryCount = pCoexSta->btRetryCnt; + btInfoExt = pCoexSta->btInfoExt; + if(!pCoexDm->bAutoTdmaAdjustLowRssi) { pCoexDm->bAutoTdmaAdjustLowRssi = TRUE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjustForWifiRssiLow()!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjustForWifiRssiLow()!!\n")); + if(BT_INFO_8812A_2ANT_A2DP_BASIC_RATE(btInfoExt)) + { + halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83); + pCoexDm->psTdmaDuAdjType = 83; + } + else + { halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82); pCoexDm->psTdmaDuAdjType = 82; + } //============ up = 0; dn = 0; @@ -2877,14 +2874,17 @@ halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow( else { //accquire the BT TRx retry count from BT_Info byte2 - retryCount = pCoexSta->btRetryCnt; - btInfoExt = pCoexSta->btInfoExt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", +// retryCount = pCoexSta->btRetryCnt; +// btInfoExt = pCoexSta->btInfoExt; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], retryCount = %d\n", retryCount)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", up, dn, m, n, WaitCount)); result = 0; WaitCount++; + if ( (pCoexSta->lowPriorityTx) > 1150 || (pCoexSta->lowPriorityRx) > 1250 ) + retryCount++; + if(retryCount == 0) // no retry in the last 2-second duration { up++; @@ -2900,7 +2900,7 @@ halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -2926,7 +2926,7 @@ halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -2944,7 +2944,7 @@ halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } if(result == -1) @@ -2952,8 +2952,8 @@ halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow( if( (BT_INFO_8812A_2ANT_A2DP_BASIC_RATE(btInfoExt)) && ((pCoexDm->curPsTdma == 81) ||(pCoexDm->curPsTdma == 82)) ) { - halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83); - pCoexDm->psTdmaDuAdjType = 83; + halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 84); + pCoexDm->psTdmaDuAdjType = 84; } else if(pCoexDm->curPsTdma == 81) { @@ -3007,6 +3007,46 @@ halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow( } } +VOID +halbtc8812a2ant_GetBtRssiThreshold( + IN PBTC_COEXIST pBtCoexist, + IN pu1Byte pThres0, + IN pu1Byte pThres1 + ) +{ + u1Byte antType, btThreshold=0; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &antType); + + switch(antType) + { + case BTC_ANT_TYPE_0: + *pThres0 = 100; + *pThres1 = 100; + break; + case BTC_ANT_TYPE_1: + *pThres0 = 34; + *pThres1 = 42; + break; + case BTC_ANT_TYPE_2: + *pThres0 = 34; + *pThres1 = 42; + break; + case BTC_ANT_TYPE_3: + *pThres0 = 34; + *pThres1 = 42; + break; + case BTC_ANT_TYPE_4: + *pThres0 = 34; + *pThres1 = 42; + break; + default: + break; + } +} + + + VOID halbtc8812a2ant_ActionSco( IN PBTC_COEXIST pBtCoexist @@ -3014,9 +3054,14 @@ halbtc8812a2ant_ActionSco( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); @@ -3085,9 +3130,13 @@ halbtc8812a2ant_ActionScoHid( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); @@ -3153,24 +3202,28 @@ halbtc8812a2ant_ActionHid( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); // coex table - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); else - halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); + halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); // pstdma - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); else - halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); + halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); // decrease BT power if(BTC_RSSI_LOW(btRssiState)) @@ -3181,9 +3234,9 @@ halbtc8812a2ant_ActionHid( halbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); // limited Rx - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); else halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); @@ -3230,24 +3283,31 @@ halbtc8812a2ant_ActionA2dp( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); + wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); + //btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); else halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, TRUE, 0x50, 0x4); // coex table - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); else halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); // pstdma - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1); else halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist); @@ -3304,21 +3364,25 @@ halbtc8812a2ant_ActionA2dpPanHs( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); // coex table - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); else halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); // pstdma - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 2); else halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2); @@ -3375,24 +3439,32 @@ halbtc8812a2ant_ActionPanEdr( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); else halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, TRUE, 0x50, 0x4); // coex table - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); else halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); // pstdma - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); else halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 85); @@ -3515,30 +3587,38 @@ halbtc8812a2ant_ActionPanEdrA2dp( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); + wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); else halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, TRUE, 0x50, 0x4); // coex table - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); else halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); // pstdma - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3); else { @@ -3598,30 +3678,37 @@ halbtc8812a2ant_ActionPanEdrHid( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); else halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, TRUE, 0x50, 0x4); // coex table - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); else halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); // pstdma - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); else halbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 85); @@ -3635,9 +3722,9 @@ halbtc8812a2ant_ActionPanEdrHid( halbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); // limited Rx - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); else halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); @@ -3684,30 +3771,37 @@ halbtc8812a2ant_ActionHidA2dpPanEdr( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); else halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, TRUE, 0x50, 0x4); // coex table - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); else halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); // pstdma - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); else { @@ -3724,9 +3818,9 @@ halbtc8812a2ant_ActionHidA2dpPanEdr( halbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); // limited Rx - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); else halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); @@ -3772,25 +3866,30 @@ halbtc8812a2ant_ActionHidA2dpPanHs( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); + wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); // coex table - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); else - halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); + halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); // pstdma - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); else halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); @@ -3804,9 +3903,9 @@ halbtc8812a2ant_ActionHidA2dpPanHs( halbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); // limited Rx - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); else halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); @@ -3852,30 +3951,37 @@ halbtc8812a2ant_ActionHidA2dp( { u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; u4Byte wifiBw; + u1Byte btThresh0=0, btThresh1=0; + BOOLEAN bApEnable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + halbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1); + btRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1); wifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); +// btRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42); // power save state - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, TRUE, 0x0, 0x0); else halbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, TRUE, 0x50, 0x4); // coex table - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); else halbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); // pstdma - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); else { @@ -3892,9 +3998,9 @@ halbtc8812a2ant_ActionHidA2dp( halbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); // limited Rx - if(BTC_RSSI_HIGH(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - else if(BTC_RSSI_LOW(wifiRssiState) && BTC_RSSI_HIGH(btRssiState)) + else if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))) halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); else halbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); @@ -3941,6 +4047,7 @@ halbtc8812a2ant_CoexUnder5G( { halbtc8812a2ant_CoexAllOff(pBtCoexist); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Under 5G, force set BT to ignore Wlan active!!\n")); halbtc8812a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE); } //==================================================== @@ -3953,42 +4060,43 @@ halbtc8812a2ant_RunCoexistMechanism( u1Byte btInfoOriginal=0, btRetryCnt=0; u1Byte algorithm=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); return; } if(pCoexSta->bUnderIps) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS !!!\n")); return; } pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G); if(bWifiUnder5G) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n")); halbtc8812a2ant_CoexUnder5G(pBtCoexist); return; } + algorithm = halbtc8812a2ant_ActionAlgorithm(pBtCoexist); if(pCoexSta->bC2hBtInquiryPage && (BT_8812A_2ANT_COEX_ALGO_PANHS!=algorithm)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under inquiry/page scan !!\n")); halbtc8812a2ant_ActionBtInquiry(pBtCoexist); return; } pCoexDm->curAlgorithm = algorithm; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); if(halbtc8812a2ant_IsCommonAction(pBtCoexist)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant common.\n")); pCoexDm->bAutoTdmaAdjust = FALSE; pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; } @@ -3996,7 +4104,7 @@ halbtc8812a2ant_RunCoexistMechanism( { if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", pCoexDm->preAlgorithm, pCoexDm->curAlgorithm)); pCoexDm->bAutoTdmaAdjust = FALSE; pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; @@ -4004,60 +4112,61 @@ halbtc8812a2ant_RunCoexistMechanism( switch(pCoexDm->curAlgorithm) { case BT_8812A_2ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); halbtc8812a2ant_ActionSco(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_SCO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO+HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO+HID.\n")); halbtc8812a2ant_ActionScoHid(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); halbtc8812a2ant_ActionHid(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); halbtc8812a2ant_ActionA2dp(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); halbtc8812a2ant_ActionA2dpPanHs(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); halbtc8812a2ant_ActionPanEdr(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); halbtc8812a2ant_ActionPanHs(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); halbtc8812a2ant_ActionPanEdrA2dp(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); halbtc8812a2ant_ActionPanEdrHid(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); halbtc8812a2ant_ActionHidA2dpPanEdr(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN(HS).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN(HS).\n")); halbtc8812a2ant_ActionHidA2dpPanHs(pBtCoexist); break; case BT_8812A_2ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); halbtc8812a2ant_ActionHidA2dp(pBtCoexist); break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); halbtc8812a2ant_CoexAllOff(pBtCoexist); break; } pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; } + } VOID @@ -4070,7 +4179,7 @@ halbtc8812a2ant_InitHwConfig( u2Byte u2Tmp=0; u1Byte u1Tmp=0; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Init HW Config!!\n")); if(bBackUp) { @@ -4146,7 +4255,7 @@ EXhalbtc8812a2ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); halbtc8812a2ant_InitCoexDm(pBtCoexist); } @@ -4351,17 +4460,30 @@ EXhalbtc8812a2ant_IpsNotify( IN u1Byte type ) { + BOOLEAN bWifiUnder5G=FALSE; + if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); pCoexSta->bUnderIps = TRUE; halbtc8812a2ant_CoexAllOff(pBtCoexist); halbtc8812a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_CPL_AUX, FALSE, TRUE); + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS notify, force set BT to ignore Wlan active!!\n")); + halbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + EXhalbtc8812a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); pCoexSta->bUnderIps = FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G); + if(!bWifiUnder5G) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS notify, force set BT NOT to ignore Wlan active!!\n")); + halbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); + } } } @@ -4373,12 +4495,12 @@ EXhalbtc8812a2ant_LpsNotify( { if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); pCoexSta->bUnderLps = TRUE; } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); pCoexSta->bUnderLps = FALSE; } } @@ -4391,11 +4513,11 @@ EXhalbtc8812a2ant_ScanNotify( { if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); } } @@ -4407,11 +4529,11 @@ EXhalbtc8812a2ant_ConnectNotify( { if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); } } @@ -4434,11 +4556,11 @@ EXhalbtc8812a2ant_MediaStatusNotify( if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); } // only 2.4G we need to inform bt the chnl mask @@ -4477,8 +4599,9 @@ EXhalbtc8812a2ant_SpecialPacketNotify( { if(type == BTC_PACKET_DHCP) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); } + } VOID @@ -4496,13 +4619,13 @@ EXhalbtc8812a2ant_BtInfoNotify( pCoexSta->bC2hBtInfoReqSent = FALSE; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G); - + rspSource = tmpBuf[0]&0xf; if(rspSource >= BT_INFO_SRC_8812A_2ANT_MAX) rspSource = BT_INFO_SRC_8812A_2ANT_WIFI_FW; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -4510,11 +4633,11 @@ EXhalbtc8812a2ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } @@ -4533,7 +4656,7 @@ EXhalbtc8812a2ant_BtInfoNotify( // because bt is reset and loss of the info. if( (pCoexSta->btInfoExt & BIT1) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(bWifiConnected) { @@ -4547,15 +4670,26 @@ EXhalbtc8812a2ant_BtInfoNotify( if( (pCoexSta->btInfoExt&BIT3) && !bWifiUnder5G) { + // BT already ignored WlanAct if(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); - halbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); + if(!pCoexSta->bUnderIps) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); + halbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); + } } } else { // BT already NOT ignore Wlan active, do nothing here. + + if(pCoexSta->bUnderIps) + { + // work around for 8812a combo hw bug => when IPS, wlanAct is always high. + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS, set BT to ignore Wlan active!!\n")); + halbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + } } } @@ -4573,6 +4707,7 @@ EXhalbtc8812a2ant_BtInfoNotify( pCoexSta->bA2dpExist = FALSE; pCoexSta->bHidExist = FALSE; pCoexSta->bScoExist = FALSE; + pCoexSta->bAclBusy = FALSE; } else // connection exists { @@ -4593,6 +4728,11 @@ EXhalbtc8812a2ant_BtInfoNotify( pCoexSta->bScoExist = TRUE; else pCoexSta->bScoExist = FALSE; + if(btInfo & BT_INFO_8812A_2ANT_B_ACL_BUSY) + pCoexSta->bAclBusy = TRUE; + else + pCoexSta->bAclBusy = FALSE; + } halbtc8812a2ant_UpdateBtLinkInfo(pBtCoexist); @@ -4600,28 +4740,28 @@ EXhalbtc8812a2ant_BtInfoNotify( if(!(btInfo&BT_INFO_8812A_2ANT_B_CONNECTION)) { pCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_NON_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); } else if(btInfo == BT_INFO_8812A_2ANT_B_CONNECTION) // connection exists but no busy { pCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); } else if((btInfo&BT_INFO_8812A_2ANT_B_SCO_ESCO) || (btInfo&BT_INFO_8812A_2ANT_B_SCO_BUSY)) { pCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_SCO_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); } else if(btInfo&BT_INFO_8812A_2ANT_B_ACL_BUSY) { pCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_ACL_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); } else { pCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_MAX; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); } if( (BT_8812A_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || @@ -4653,9 +4793,10 @@ EXhalbtc8812a2ant_HaltNotify( { u1Byte u1Tmp=0; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); halbtc8812a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_CPL_AUX, FALSE, TRUE); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify, force set BT to ignore Wlan active!!\n")); halbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); EXhalbtc8812a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); @@ -4675,21 +4816,21 @@ EXhalbtc8812a2ant_Periodical( PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); if(disVerInfoCnt <= 5) { disVerInfoCnt += 1; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", GLCoexVerDate8812a2Ant, GLCoexVer8812a2Ant, fwVer, btPatchVer, btPatchVer)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); } #if(BT_AUTO_REPORT_ONLY_8812A_2ANT == 0) @@ -4717,7 +4858,7 @@ EXhalbtc8812a2ant_DbgControl( switch(opCode) { case BTC_DBG_SET_COEX_DEC_BT_PWR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set Dec BT power\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set Dec BT power\n")); { u1Byte dataLen=4; u1Byte buf[6] = {0}; @@ -4733,14 +4874,14 @@ EXhalbtc8812a2ant_DbgControl( buf[3] = decBtPwr; // OP_Code_Content buf[4] = pwrLevel; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set Dec BT power=%d, pwrLevel=%d\n", decBtPwr, pwrLevel)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set Dec BT power=%d, pwrLevel=%d\n", decBtPwr, pwrLevel)); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]); } } break; case BTC_DBG_SET_COEX_BT_AFH_MAP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set BT AFH Map\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set BT AFH Map\n")); { u1Byte dataLen=5; u1Byte buf[6] = {0}; @@ -4754,7 +4895,7 @@ EXhalbtc8812a2ant_DbgControl( buf[4] = pData[1]; buf[5] = pData[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set BT AFH Map = %02x %02x %02x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set BT AFH Map = %02x %02x %02x\n", pData[0], pData[1], pData[2])); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]); } @@ -4762,7 +4903,7 @@ EXhalbtc8812a2ant_DbgControl( break; case BTC_DBG_SET_COEX_BT_IGNORE_WLAN_ACT: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set BT Ignore Wlan Active\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set BT Ignore Wlan Active\n")); { u1Byte dataLen=3; u1Byte buf[6] = {0}; @@ -4773,7 +4914,7 @@ EXhalbtc8812a2ant_DbgControl( buf[2] = 0x1; // OP_Code_Length buf[3] = pData[0]; // OP_Code_Content - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Set BT Ignore Wlan Active = 0x%x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set BT Ignore Wlan Active = 0x%x\n", pData[0])); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h index 4f6f5d1210c7..ea7480224a94 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h @@ -125,6 +125,7 @@ typedef struct _COEX_STA_8812A_2ANT{ BOOLEAN bA2dpExist; BOOLEAN bHidExist; BOOLEAN bPanExist; + BOOLEAN bAclBusy; BOOLEAN bUnderLps; BOOLEAN bUnderIps; @@ -138,6 +139,8 @@ typedef struct _COEX_STA_8812A_2ANT{ BOOLEAN bC2hBtInfoReqSent; u1Byte btInfoC2h[BT_INFO_SRC_8812A_2ANT_MAX][10]; u4Byte btInfoC2hCnt[BT_INFO_SRC_8812A_2ANT_MAX]; + u4Byte prebtInfoC2hCnt_BT_RSP; + u4Byte prebtInfoC2hCnt_BT_SEND; u4Byte btInfoQueryCnt; BOOLEAN bC2hBtInquiryPage; u1Byte btRetryCnt; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c index c05c7668623d..c840c7792653 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c @@ -12,6 +12,11 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8821a1Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables @@ -56,12 +61,10 @@ halbtc8821a1ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else @@ -69,12 +72,10 @@ halbtc8821a1ant_BtRssiState( if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -82,7 +83,7 @@ halbtc8821a1ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } @@ -92,12 +93,10 @@ halbtc8821a1ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || @@ -106,17 +105,14 @@ halbtc8821a1ant_BtRssiState( if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else @@ -124,12 +120,10 @@ halbtc8821a1ant_BtRssiState( if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -161,12 +155,10 @@ halbtc8821a1ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -174,12 +166,10 @@ halbtc8821a1ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -187,7 +177,7 @@ halbtc8821a1ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -197,12 +187,10 @@ halbtc8821a1ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -211,17 +199,14 @@ halbtc8821a1ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -229,12 +214,10 @@ halbtc8821a1ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -421,7 +404,7 @@ halbtc8821a1ant_MonitorBtCtr( u1Byte u1Tmp, u1Tmp1; s4Byte wifiRssi; #if 0 - //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS + //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) { pCoexSta->highPriorityTx = 65535; @@ -462,7 +445,7 @@ halbtc8821a1ant_QueryBtInfo( H2C_Parameter[0] |= BIT0; // trigger - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter); @@ -578,7 +561,7 @@ halbtc8821a1ant_ActionAlgorithm( if(!pBtLinkInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No BT link exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); return algorithm; } @@ -595,31 +578,31 @@ halbtc8821a1ant_ActionAlgorithm( { if(pBtLinkInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO only\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_SCO; } else { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID only\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP only\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(HS) only\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(EDR) only\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR; } } @@ -631,24 +614,24 @@ halbtc8821a1ant_ActionAlgorithm( { if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_HID; } else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + A2DP ==> SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP ==> SCO\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_SCO; } else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(HS)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(EDR)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -658,7 +641,7 @@ halbtc8821a1ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP; } else if( pBtLinkInfo->bHidExist && @@ -666,12 +649,12 @@ halbtc8821a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(HS)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(EDR)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -680,12 +663,12 @@ halbtc8821a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(HS)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(EDR)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -698,7 +681,7 @@ halbtc8821a1ant_ActionAlgorithm( if( pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_HID; } else if( pBtLinkInfo->bHidExist && @@ -706,12 +689,12 @@ halbtc8821a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(HS)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -720,12 +703,12 @@ halbtc8821a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -738,12 +721,12 @@ halbtc8821a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -759,12 +742,12 @@ halbtc8821a1ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID; } } @@ -789,7 +772,7 @@ halbtc8821a1ant_SetBtAutoReport( H2C_Parameter[0] |= BIT0; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter); @@ -802,15 +785,12 @@ halbtc8821a1ant_BtAutoReport( IN BOOLEAN bEnableAutoReport ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); pCoexDm->bCurBtAutoReport = bEnableAutoReport; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", - pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport)); - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) return; } @@ -838,7 +818,7 @@ halbtc8821a1ant_SetSwPenaltyTxRateAdaptive( H2C_Parameter[5] = 0xf9; //MCS5 or OFDM36 } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set WiFi Low-Penalty Retry: %s", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", (bLowPenaltyRa? "ON!!":"OFF!!") )); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); @@ -872,16 +852,16 @@ halbtc8821a1ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -895,7 +875,7 @@ halbtc8821a1ant_CoexTable( IN u1Byte val0x6cc ) { - 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", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c4 = val0x6c4; @@ -925,7 +905,7 @@ halbtc8821a1ant_CoexTableWithType( IN u1Byte type ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** CoexTable(%d) **********\n", type)); switch(type) { @@ -971,7 +951,7 @@ halbtc8821a1ant_SetFwIgnoreWlanAct( H2C_Parameter[0] |= BIT0; // function enable } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter); @@ -984,15 +964,12 @@ halbtc8821a1ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -1021,7 +998,7 @@ halbtc8821a1ant_SetFwPstdma( { if(byte1&BIT4 && !(byte1&BIT5)) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FW for 1Ant AP mode\n")); realByte1 &= ~BIT4; realByte1 |= BIT5; @@ -1042,7 +1019,7 @@ halbtc8821a1ant_SetFwPstdma( pCoexDm->psTdmaPara[3] = byte4; pCoexDm->psTdmaPara[4] = realByte5; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", H2C_Parameter[0], H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); @@ -1073,22 +1050,16 @@ halbtc8821a1ant_LpsRpwm( { BOOLEAN bForceExecPwrCmd=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", (bForceExec? "force to":""), lpsVal, rpwmVal)); pCoexDm->curLps = lpsVal; pCoexDm->curRpwm = rpwmVal; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], LPS-RxBeaconMode=0x%x , LPS-RPWM=0x%x!!\n", - pCoexDm->curLps, pCoexDm->curRpwm)); - if( (pCoexDm->preLps == pCoexDm->curLps) && (pCoexDm->preRpwm == pCoexDm->curRpwm) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], LPS-RPWM_Last=0x%x , LPS-RPWM_Now=0x%x!!\n", - pCoexDm->preRpwm, pCoexDm->curRpwm)); - return; } } @@ -1104,9 +1075,6 @@ halbtc8821a1ant_SwMechanism( IN BOOLEAN bLowPenaltyRA ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], SM[LpRA] = %d\n", - bLowPenaltyRA)); - halbtc8821a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA); } @@ -1215,12 +1183,12 @@ halbtc8821a1ant_PsTdma( if (pCoexDm->bCurPsTdmaOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(on, %d) **********\n", pCoexDm->curPsTdma)); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(off, %d) **********\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(off, %d) **********\n", pCoexDm->curPsTdma)); } @@ -1414,7 +1382,7 @@ halbtc8821a1ant_IsCommonAction( if(!bWifiConnected && BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); halbtc8821a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; @@ -1422,7 +1390,7 @@ halbtc8821a1ant_IsCommonAction( else if(bWifiConnected && (BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); halbtc8821a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; @@ -1430,7 +1398,7 @@ halbtc8821a1ant_IsCommonAction( else if(!bWifiConnected && (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); halbtc8821a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; @@ -1438,7 +1406,7 @@ halbtc8821a1ant_IsCommonAction( else if(bWifiConnected && (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); halbtc8821a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; @@ -1446,7 +1414,7 @@ halbtc8821a1ant_IsCommonAction( else if(!bWifiConnected && (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); halbtc8821a1ant_SwMechanism(pBtCoexist, FALSE); bCommon = TRUE; @@ -1455,11 +1423,11 @@ halbtc8821a1ant_IsCommonAction( { if (bWifiBusy) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); } bCommon = FALSE; @@ -1479,7 +1447,7 @@ halbtc8821a1ant_TdmaDurationAdjustForAcl( s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0, btInfoExt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); if( (BT_8821A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) || (BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) || @@ -1506,7 +1474,7 @@ halbtc8821a1ant_TdmaDurationAdjustForAcl( if(!pCoexDm->bAutoTdmaAdjust) { pCoexDm->bAutoTdmaAdjust = TRUE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); pCoexDm->psTdmaDuAdjType = 2; @@ -1523,9 +1491,6 @@ halbtc8821a1ant_TdmaDurationAdjustForAcl( //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; btInfoExt = pCoexSta->btInfoExt; - //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", - // up, dn, m, n, WaitCount)); result = 0; WaitCount++; @@ -1544,7 +1509,7 @@ halbtc8821a1ant_TdmaDurationAdjustForAcl( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -1570,7 +1535,7 @@ halbtc8821a1ant_TdmaDurationAdjustForAcl( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -1588,7 +1553,7 @@ halbtc8821a1ant_TdmaDurationAdjustForAcl( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } if(result == -1) @@ -1641,7 +1606,7 @@ halbtc8821a1ant_TdmaDurationAdjustForAcl( } else //no change { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(on, %d) **********\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** TDMA(on, %d) **********\n", pCoexDm->curPsTdma)); } @@ -1785,24 +1750,24 @@ halbtc8821a1ant_MonitorBtEnableDisable( btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); halbtc8821a1ant_ActionWifiOnly(pBtCoexist); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); bPreBtDisabled = bBtDisabled; @@ -2247,13 +2212,13 @@ halbtc8821a1ant_ActionWifiConnected( BOOLEAN bUnder4way=FALSE, bApEnable=FALSE; u4Byte wifiBw; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect()===>\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect()===>\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way); if(bUnder4way) { halbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n")); return; } @@ -2266,7 +2231,7 @@ halbtc8821a1ant_ActionWifiConnected( halbtc8821a1ant_ActionWifiConnectedScan(pBtCoexist); else halbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n")); return; } @@ -2343,47 +2308,47 @@ halbtc8821a1ant_RunSwCoexistMechanism( switch(pCoexDm->curAlgorithm) { case BT_8821A_1ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = SCO.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = SCO.\n")); halbtc8821a1ant_ActionSco(pBtCoexist); break; case BT_8821A_1ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID.\n")); halbtc8821a1ant_ActionHid(pBtCoexist); break; case BT_8821A_1ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP.\n")); halbtc8821a1ant_ActionA2dp(pBtCoexist); break; case BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); halbtc8821a1ant_ActionA2dpPanHs(pBtCoexist); break; case BT_8821A_1ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR).\n")); halbtc8821a1ant_ActionPanEdr(pBtCoexist); break; case BT_8821A_1ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HS mode.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HS mode.\n")); halbtc8821a1ant_ActionPanHs(pBtCoexist); break; case BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); halbtc8821a1ant_ActionPanEdrA2dp(pBtCoexist); break; case BT_8821A_1ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n")); halbtc8821a1ant_ActionPanEdrHid(pBtCoexist); break; case BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n")); halbtc8821a1ant_ActionHidA2dpPanEdr(pBtCoexist); break; case BT_8821A_1ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP.\n")); halbtc8821a1ant_ActionHidA2dp(pBtCoexist); break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = coexist All Off!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = coexist All Off!!\n")); //halbtc8821a1ant_CoexAllOff(pBtCoexist); break; } @@ -2406,30 +2371,30 @@ halbtc8821a1ant_RunCoexistMechanism( u4Byte numOfWifiLink=0; BOOLEAN bWifiUnder5G=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); return; } if(pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); return; } if(pCoexSta->bUnderIps) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS !!!\n")); return; } pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G); if(bWifiUnder5G) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for 5G <===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for 5G <===\n")); halbtc8821a1ant_CoexUnder5G(pBtCoexist); return; } @@ -2516,7 +2481,7 @@ halbtc8821a1ant_RunCoexistMechanism( { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is non connected-idle !!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is non connected-idle !!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink); @@ -2525,9 +2490,9 @@ halbtc8821a1ant_RunCoexistMechanism( if(bScan || bLink || bRoam) { if (bScan) - halbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist); + halbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist); else - halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); + halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); } else halbtc8821a1ant_ActionWifiNotConnected(pBtCoexist); @@ -2566,7 +2531,7 @@ halbtc8821a1ant_InitHwConfig( BOOLEAN bWifiUnder5G=FALSE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 1Ant Init HW Config!!\n")); if(bWifiOnly) return; @@ -2629,7 +2594,7 @@ EXhalbtc8821a1ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); pBtCoexist->bStopCoexDm = FALSE; @@ -2689,7 +2654,7 @@ EXhalbtc8821a1ant_DisplayCoexInfo( pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1], pCoexDm->wifiChnlInfo[2]); CL_PRINTF(cliBuf); - + // wifi status CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); CL_PRINTF(cliBuf); @@ -2857,7 +2822,7 @@ EXhalbtc8821a1ant_IpsNotify( if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); pCoexSta->bUnderIps = TRUE; halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); @@ -2867,7 +2832,7 @@ EXhalbtc8821a1ant_IpsNotify( } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); pCoexSta->bUnderIps = FALSE; halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); @@ -2887,12 +2852,12 @@ EXhalbtc8821a1ant_LpsNotify( if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); pCoexSta->bUnderLps = TRUE; } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); pCoexSta->bUnderLps = FALSE; } } @@ -2916,14 +2881,14 @@ EXhalbtc8821a1ant_ScanNotify( if(BTC_SCAN_START == type) { pCoexSta->bWiFiIsHighPriTask = TRUE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue } else { pCoexSta->bWiFiIsHighPriTask = FALSE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); } if(pBtCoexist->btInfo.bBtDisabled) @@ -2957,7 +2922,7 @@ EXhalbtc8821a1ant_ScanNotify( if(BTC_SCAN_START == type) { - //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); if(!bWifiConnected) // non-connected scan { halbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist); @@ -2969,7 +2934,7 @@ EXhalbtc8821a1ant_ScanNotify( } else if(BTC_SCAN_FINISH == type) { - //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); if(!bWifiConnected) // non-connected scan { halbtc8821a1ant_ActionWifiNotConnected(pBtCoexist); @@ -3001,13 +2966,13 @@ EXhalbtc8821a1ant_ConnectNotify( if(BTC_ASSOCIATE_START == type) { pCoexSta->bWiFiIsHighPriTask = TRUE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); - pCoexDm->nArpCnt = 0; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); + pCoexDm->nArpCnt = 0; } else { - pCoexSta->bWiFiIsHighPriTask = FALSE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + pCoexSta->bWiFiIsHighPriTask = FALSE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); pCoexDm->nArpCnt = 0; } @@ -3035,12 +3000,12 @@ EXhalbtc8821a1ant_ConnectNotify( if(BTC_ASSOCIATE_START == type) { - //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); } else if(BTC_ASSOCIATE_FINISH == type) { - //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(!bWifiConnected) // non-connected scan @@ -3071,11 +3036,11 @@ EXhalbtc8821a1ant_MediaStatusNotify( if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); pCoexDm->nArpCnt = 0; } @@ -3098,7 +3063,7 @@ EXhalbtc8821a1ant_MediaStatusNotify( pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1]; pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x66=0x%x\n", H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); @@ -3129,17 +3094,17 @@ EXhalbtc8821a1ant_SpecialPacketNotify( if(BTC_PACKET_ARP == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet ARP notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet ARP notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet DHCP or EAPOL notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet DHCP or EAPOL notify\n")); } } else { pCoexSta->bWiFiIsHighPriTask = FALSE; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet [Type = %d] notify\n", type)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet [Type = %d] notify\n", type)); } pCoexSta->specialPktPeriodCnt = 0; @@ -3170,11 +3135,11 @@ EXhalbtc8821a1ant_SpecialPacketNotify( BTC_PACKET_EAPOL == type || BTC_PACKET_ARP == type ) { - //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type)); + //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet(%d) notify\n", type)); if(BTC_PACKET_ARP == type) { pCoexDm->nArpCnt++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt)); if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) return; } @@ -3206,7 +3171,7 @@ EXhalbtc8821a1ant_BtInfoNotify( rspSource = BT_INFO_SRC_8821A_1ANT_WIFI_FW; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -3214,11 +3179,11 @@ EXhalbtc8821a1ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } @@ -3243,7 +3208,7 @@ EXhalbtc8821a1ant_BtInfoNotify( if(!pCoexSta->bBtTxRxMask) { /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */ - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n")); pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); } @@ -3251,7 +3216,7 @@ EXhalbtc8821a1ant_BtInfoNotify( // because bt is reset and loss of the info. if(pCoexSta->btInfoExt & BIT1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); if(bWifiConnected) { @@ -3267,7 +3232,7 @@ EXhalbtc8821a1ant_BtInfoNotify( { if(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); } } @@ -3330,30 +3295,30 @@ EXhalbtc8821a1ant_BtInfoNotify( if(!(btInfo&BT_INFO_8821A_1ANT_B_CONNECTION)) { pCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); } else if(btInfo == BT_INFO_8821A_1ANT_B_CONNECTION) // connection exists but no busy { pCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); } else if((btInfo&BT_INFO_8821A_1ANT_B_SCO_ESCO) || (btInfo&BT_INFO_8821A_1ANT_B_SCO_BUSY)) { pCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_SCO_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); } else if(btInfo&BT_INFO_8821A_1ANT_B_ACL_BUSY) { if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus) pCoexDm->bAutoTdmaAdjust = FALSE; pCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_ACL_BUSY; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); } else { pCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_MAX; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); } if( (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || @@ -3374,7 +3339,7 @@ EXhalbtc8821a1ant_HaltNotify( { u4Byte u4Tmp; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); @@ -3394,23 +3359,23 @@ EXhalbtc8821a1ant_PnpNotify( IN u1Byte pnpState ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify\n")); if(BTC_WIFI_PNP_SLEEP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to SLEEP\n")); halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE); - //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF); + //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF); pBtCoexist->bStopCoexDm = TRUE; } else if(BTC_WIFI_PNP_WAKE_UP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to WAKE UP\n")); pBtCoexist->bStopCoexDm = FALSE; halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); halbtc8821a1ant_InitCoexDm(pBtCoexist); @@ -3428,21 +3393,21 @@ EXhalbtc8821a1ant_Periodical( PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); if(disVerInfoCnt <= 5) { disVerInfoCnt += 1; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", GLCoexVerDate8821a1Ant, GLCoexVer8821a1Ant, fwVer, btPatchVer, btPatchVer)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); } #if(BT_AUTO_REPORT_ONLY_8821A_1ANT == 0) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c index 14ad651a9eb3..759418ea69ad 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c @@ -4,8 +4,7 @@ // This file is for RTL8821A Co-exist mechanism // // History -// 2012/08/22 Cosa first check in. -// 2012/11/14 Cosa Revise for 8821A 2Ant out sourcing. +// 2012/11/15 Cosa first check in. // //============================================================ @@ -13,13 +12,18 @@ // include files //============================================================ #include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "HalBtc8821a2Ant.tmh" +#endif + #if(BT_30_SUPPORT == 1) //============================================================ // Global variables, these are static variables //============================================================ -static COEX_DM_8821A_2ANT GLCoexDm8821a2Ant; +static COEX_DM_8821A_2ANT GLCoexDm8821a2Ant; static PCOEX_DM_8821A_2ANT pCoexDm=&GLCoexDm8821a2Ant; -static COEX_STA_8821A_2ANT GLCoexSta8821a2Ant; +static COEX_STA_8821A_2ANT GLCoexSta8821a2Ant; static PCOEX_STA_8821A_2ANT pCoexSta=&GLCoexSta8821a2Ant; const char *const GLBtInfoSrc8821a2Ant[]={ @@ -28,8 +32,8 @@ const char *const GLBtInfoSrc8821a2Ant[]={ "BT Info[bt auto report]", }; -u4Byte GLCoexVerDate8821a2Ant=20130618; -u4Byte GLCoexVer8821a2Ant=0x5050; +u4Byte GLCoexVerDate8821a2Ant=20150128; +u4Byte GLCoexVer8821a2Ant=0x51; //============================================================ // local function proto type if needed @@ -57,12 +61,10 @@ halbtc8821a2ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else @@ -70,12 +72,10 @@ halbtc8821a2ant_BtRssiState( if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -83,7 +83,7 @@ halbtc8821a2ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } @@ -93,12 +93,10 @@ halbtc8821a2ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || @@ -107,17 +105,14 @@ halbtc8821a2ant_BtRssiState( if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else @@ -125,12 +120,10 @@ halbtc8821a2ant_BtRssiState( if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -162,12 +155,10 @@ halbtc8821a2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -175,12 +166,10 @@ halbtc8821a2ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -188,7 +177,7 @@ halbtc8821a2ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -198,12 +187,10 @@ halbtc8821a2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -212,17 +199,14 @@ halbtc8821a2ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -230,12 +214,10 @@ halbtc8821a2ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -275,23 +257,23 @@ halbtc8821a2ant_MonitorBtEnableDisable( btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); bPreBtDisabled = bBtDisabled; @@ -304,6 +286,31 @@ halbtc8821a2ant_MonitorBtEnableDisable( } } +VOID +halbtc8821a2ant_LimitedRx( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN BOOLEAN bRejApAggPkt, + IN BOOLEAN bBtCtrlAggBufSize, + IN u1Byte aggBufSize + ) +{ + BOOLEAN bRejectRxAgg=bRejApAggPkt; + BOOLEAN bBtCtrlRxAggSize=bBtCtrlAggBufSize; + u1Byte rxAggSize=aggBufSize; + + //============================================ + // Rx Aggregation related setting + //============================================ + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg); + // decide BT control aggregation buf size or not + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize); + // aggregation buf size, only work when BT control Rx aggregation size. + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize); + // real update aggregation setting + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); +} + VOID halbtc8821a2ant_MonitorBtCtr( IN PBTC_COEXIST pBtCoexist @@ -313,6 +320,8 @@ halbtc8821a2ant_MonitorBtCtr( u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0; u1Byte u1Tmp; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + regHPTxRx = 0x770; regLPTxRx = 0x774; @@ -329,15 +338,66 @@ halbtc8821a2ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + if ( (pCoexSta->lowPriorityRx >= 950) && (pCoexSta->lowPriorityRx >= pCoexSta->lowPriorityTx) && (!pCoexSta->bUnderIps) ) + { + pBtLinkInfo->bSlaveRole = TRUE; + } + else + { + pBtLinkInfo->bSlaveRole = FALSE; + } + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx)); // reset counter pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); } +VOID +halbtc8821a2ant_MonitorWiFiCtr( + IN PBTC_COEXIST pBtCoexist + ) +{ + u4Byte u4Tmp; + u2Byte u2Tmp[3]; + s4Byte wifiRssi=0; + BOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE; + static u1Byte nCCKLockCounter = 0; + + + if (pCoexSta->bUnderIps) + { + pCoexSta->nCRCOK_CCK = 0; + pCoexSta->nCRCOK_11g = 0; + pCoexSta->nCRCOK_11n = 0; + pCoexSta->nCRCOK_11nAgg = 0; + + pCoexSta->nCRCErr_CCK = 0; + pCoexSta->nCRCErr_11g = 0; + pCoexSta->nCRCErr_11n = 0; + pCoexSta->nCRCErr_11nAgg = 0; + } + else + { + pCoexSta->nCRCOK_CCK = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88); + pCoexSta->nCRCOK_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94); + pCoexSta->nCRCOK_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90); + pCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8); + + pCoexSta->nCRCErr_CCK = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84); + pCoexSta->nCRCErr_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96); + pCoexSta->nCRCErr_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92); + pCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba); + } + + //reset counter + pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1); + pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0); +} + VOID halbtc8821a2ant_QueryBtInfo( IN PBTC_COEXIST pBtCoexist @@ -349,74 +409,190 @@ halbtc8821a2ant_QueryBtInfo( H2C_Parameter[0] |= BIT0; // trigger - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter); } -u1Byte -halbtc8821a2ant_ActionAlgorithm( + +BOOLEAN +halbtc8821a2ant_IsWifiStatusChanged( IN PBTC_COEXIST pBtCoexist ) { - PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BOOLEAN bBtHsOn=FALSE; - u1Byte algorithm=BT_8821A_2ANT_COEX_ALGO_UNDEFINED; - u1Byte numOfDiffProfile=0; + static BOOLEAN bPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE; + BOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE; + BOOLEAN bWifiConnected=FALSE; + u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way); + + if(bWifiConnected) + { + if(bWifiBusy != bPreWifiBusy) + { + bPreWifiBusy = bWifiBusy; + return TRUE; + } + if(bUnder4way != bPreUnder4way) + { + bPreUnder4way = bUnder4way; + return TRUE; + } + if(bBtHsOn != bPreBtHsOn) + { + bPreBtHsOn = bBtHsOn; + return TRUE; + } + + + wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist,3, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + + if ( (BTC_RSSI_STATE_HIGH ==wifiRssiState ) || (BTC_RSSI_STATE_LOW ==wifiRssiState )) + { + return TRUE; + } + } + + return FALSE; +} + +VOID +halbtc8821a2ant_UpdateBtLinkInfo( + IN PBTC_COEXIST pBtCoexist + ) +{ + PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bBtHsOn=FALSE; + +#if(BT_AUTO_REPORT_ONLY_8821A_2ANT == 1) // profile from bt patch + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + + pBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist; + pBtLinkInfo->bScoExist = pCoexSta->bScoExist; + pBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist; + pBtLinkInfo->bPanExist = pCoexSta->bPanExist; + pBtLinkInfo->bHidExist = pCoexSta->bHidExist; + + // work around for HS mode. + if(bBtHsOn) + { + pBtLinkInfo->bPanExist = TRUE; + pBtLinkInfo->bBtLinkExist = TRUE; + } +#else // profile from bt stack + pBtLinkInfo->bBtLinkExist = pStackInfo->bBtLinkExist; + pBtLinkInfo->bScoExist = pStackInfo->bScoExist; + pBtLinkInfo->bA2dpExist = pStackInfo->bA2dpExist; + pBtLinkInfo->bPanExist = pStackInfo->bPanExist; + pBtLinkInfo->bHidExist = pStackInfo->bHidExist; + //for win-8 stack HID report error if(!pStackInfo->bHidExist) pStackInfo->bHidExist = pCoexSta->bHidExist; //sync BTInfo with BT firmware and stack // when stack HID report error, here we use the info from bt fw. if(!pStackInfo->bBtLinkExist) - pStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist; + pStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist; +#endif + // check if Sco only + if( pBtLinkInfo->bScoExist && + !pBtLinkInfo->bA2dpExist && + !pBtLinkInfo->bPanExist && + !pBtLinkInfo->bHidExist ) + pBtLinkInfo->bScoOnly = TRUE; + else + pBtLinkInfo->bScoOnly = FALSE; + + // check if A2dp only + if( !pBtLinkInfo->bScoExist && + pBtLinkInfo->bA2dpExist && + !pBtLinkInfo->bPanExist && + !pBtLinkInfo->bHidExist ) + pBtLinkInfo->bA2dpOnly = TRUE; + else + pBtLinkInfo->bA2dpOnly = FALSE; + + // check if Pan only + if( !pBtLinkInfo->bScoExist && + !pBtLinkInfo->bA2dpExist && + pBtLinkInfo->bPanExist && + !pBtLinkInfo->bHidExist ) + pBtLinkInfo->bPanOnly = TRUE; + else + pBtLinkInfo->bPanOnly = FALSE; - if(!pStackInfo->bBtLinkExist) + // check if Hid only + if( !pBtLinkInfo->bScoExist && + !pBtLinkInfo->bA2dpExist && + !pBtLinkInfo->bPanExist && + pBtLinkInfo->bHidExist ) + pBtLinkInfo->bHidOnly = TRUE; + else + pBtLinkInfo->bHidOnly = FALSE; +} + +u1Byte +halbtc8821a2ant_ActionAlgorithm( + IN PBTC_COEXIST pBtCoexist + ) +{ + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bBtHsOn=FALSE; + u1Byte algorithm=BT_8821A_2ANT_COEX_ALGO_UNDEFINED; + u1Byte numOfDiffProfile=0; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + + if(!pBtLinkInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); return algorithm; } - if(pStackInfo->bScoExist) + if(pBtLinkInfo->bScoExist) numOfDiffProfile++; - if(pStackInfo->bHidExist) + if(pBtLinkInfo->bHidExist) numOfDiffProfile++; - if(pStackInfo->bPanExist) + if(pBtLinkInfo->bPanExist) numOfDiffProfile++; - if(pStackInfo->bA2dpExist) + if(pBtLinkInfo->bA2dpExist) numOfDiffProfile++; if(numOfDiffProfile == 1) { - if(pStackInfo->bScoExist) + if(pBtLinkInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO only\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } else { - if(pStackInfo->bHidExist) + if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID only\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_HID; } - else if(pStackInfo->bA2dpExist) + else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP only\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_A2DP; } - else if(pStackInfo->bPanExist) + else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(HS) only\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(EDR) only\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR; } } @@ -424,73 +600,75 @@ halbtc8821a2ant_ActionAlgorithm( } else if(numOfDiffProfile == 2) { - if(pStackInfo->bScoExist) + if(pBtLinkInfo->bScoExist) { - if(pStackInfo->bHidExist) + if(pBtLinkInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } - else if(pStackInfo->bA2dpExist) + else if(pBtLinkInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP ==> SCO\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } - else if(pStackInfo->bPanExist) + else if(pBtLinkInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(HS)\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(EDR)\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } } } else { - if( pStackInfo->bHidExist && - pStackInfo->bA2dpExist ) + if( pBtLinkInfo->bHidExist && + pBtLinkInfo->bA2dpExist ) { +#if 0 if(pStackInfo->numOfHid >= 2) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID*2 + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID*2 + A2DP\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } else +#endif { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP; } } - else if( pStackInfo->bHidExist && - pStackInfo->bPanExist ) + else if( pBtLinkInfo->bHidExist && + pBtLinkInfo->bPanExist ) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(HS)\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(EDR)\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; } } - else if( pStackInfo->bPanExist && - pStackInfo->bA2dpExist ) + else if( pBtLinkInfo->bPanExist && + pBtLinkInfo->bA2dpExist ) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(HS)\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(EDR)\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -498,57 +676,57 @@ halbtc8821a2ant_ActionAlgorithm( } else if(numOfDiffProfile == 3) { - if(pStackInfo->bScoExist) + if(pBtLinkInfo->bScoExist) { - if( pStackInfo->bHidExist && - pStackInfo->bA2dpExist ) + if( pBtLinkInfo->bHidExist && + pBtLinkInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP ==> SCO\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } - else if( pStackInfo->bHidExist && - pStackInfo->bPanExist ) + else if( pBtLinkInfo->bHidExist && + pBtLinkInfo->bPanExist ) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(HS) ==> SCO\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(EDR) ==> SCO\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } } - else if( pStackInfo->bPanExist && - pStackInfo->bA2dpExist ) + else if( pBtLinkInfo->bPanExist && + pBtLinkInfo->bA2dpExist ) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } } } else { - if( pStackInfo->bHidExist && - pStackInfo->bPanExist && - pStackInfo->bA2dpExist ) + if( pBtLinkInfo->bHidExist && + pBtLinkInfo->bPanExist && + pBtLinkInfo->bA2dpExist ) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(HS)\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); algorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -556,21 +734,21 @@ halbtc8821a2ant_ActionAlgorithm( } else if(numOfDiffProfile >= 3) { - if(pStackInfo->bScoExist) + if(pBtLinkInfo->bScoExist) { - if( pStackInfo->bHidExist && - pStackInfo->bPanExist && - pStackInfo->bA2dpExist ) + if( pBtLinkInfo->bHidExist && + pBtLinkInfo->bPanExist && + pBtLinkInfo->bA2dpExist ) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); - algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + algorithm = BT_8821A_2ANT_COEX_ALGO_SCO; } } } @@ -579,50 +757,6 @@ halbtc8821a2ant_ActionAlgorithm( return algorithm; } -BOOLEAN -halbtc8821a2ant_NeedToDecBtPwr( - IN PBTC_COEXIST pBtCoexist - ) -{ - BOOLEAN bRet=FALSE; - BOOLEAN bBtHsOn=FALSE, bWifiConnected=FALSE; - s4Byte btHsRssi=0; - u1Byte btRssiState; - - if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn)) - return FALSE; - if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected)) - return FALSE; - if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi)) - return FALSE; - - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); - - if(bWifiConnected) - { - if(bBtHsOn) - { - if(btHsRssi > 37) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n")); - bRet = TRUE; - } - } - else - { - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n")); - bRet = TRUE; - } - } - } - - return bRet; -} - VOID halbtc8821a2ant_SetFwDacSwingLevel( IN PBTC_COEXIST pBtCoexist, @@ -635,8 +769,8 @@ halbtc8821a2ant_SetFwDacSwingLevel( // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 H2C_Parameter[0] = dacSwingLvl; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter); } @@ -644,20 +778,15 @@ halbtc8821a2ant_SetFwDacSwingLevel( VOID halbtc8821a2ant_SetFwDecBtPwr( IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bDecBtPwr + IN u1Byte decBtPwrLvl ) { u1Byte H2C_Parameter[1] ={0}; - H2C_Parameter[0] = 0; - - if(bDecBtPwr) - { - H2C_Parameter[0] |= BIT1; - } + H2C_Parameter[0] = decBtPwrLvl; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n", - (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0])); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\n", + decBtPwrLvl, H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter); } @@ -665,25 +794,22 @@ halbtc8821a2ant_SetFwDecBtPwr( VOID halbtc8821a2ant_DecBtPwr( IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bDecBtPwr + IN BOOLEAN bForceExec, + IN u1Byte decBtPwrLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n", - (bForceExec? "force to":""), ((bDecBtPwr)? "ON":"OFF"))); - pCoexDm->bCurDecBtPwr = bDecBtPwr; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s Dec BT power level = %d\n", + (bForceExec? "force to":""), decBtPwrLvl)); + pCoexDm->curBtDecPwrLvl = decBtPwrLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n", - pCoexDm->bPreDecBtPwr, pCoexDm->bCurDecBtPwr)); - - if(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr) + if(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) return; } - halbtc8821a2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->bCurDecBtPwr); + halbtc8821a2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl); - pCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr; + pCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl; } VOID @@ -701,7 +827,7 @@ halbtc8821a2ant_SetBtAutoReport( H2C_Parameter[0] |= BIT0; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter); @@ -714,15 +840,12 @@ halbtc8821a2ant_BtAutoReport( IN BOOLEAN bEnableAutoReport ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); pCoexDm->bCurBtAutoReport = bEnableAutoReport; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", - pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport)); - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) return; } @@ -738,15 +861,12 @@ halbtc8821a2ant_FwDacSwingLvl( IN u1Byte fwDacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set FW Dac Swing level = %d\n", (bForceExec? "force to":""), fwDacSwingLvl)); pCoexDm->curFwDacSwingLvl = fwDacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", - pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); - if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) return; } @@ -765,7 +885,7 @@ halbtc8821a2ant_SetSwRfRxLpfCorner( if(bRxRfShrinkOn) { //Shrink RF Rx LPF corner - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc); } else @@ -774,7 +894,7 @@ halbtc8821a2ant_SetSwRfRxLpfCorner( // After initialized, we can use pCoexDm->btRf0x1eBackup if(pBtCoexist->bInitilized) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup); } } @@ -787,15 +907,12 @@ halbtc8821a2ant_RfShrink( IN BOOLEAN bRxRfShrinkOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Rx RF Shrink = %s\n", (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF"))); pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", - pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); - if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) return; } @@ -823,8 +940,8 @@ halbtc8821a2ant_SetSwPenaltyTxRateAdaptive( H2C_Parameter[5] = 0xf9; //MCS5 or OFDM36 } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set WiFi Low-Penalty Retry: %s", - (bLowPenaltyRa? "ON!!":"OFF!!") )); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", + (bLowPenaltyRa? "ON!!":"OFF!!")) ); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); } @@ -837,15 +954,12 @@ halbtc8821a2ant_LowPenaltyRa( ) { //return; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -862,7 +976,7 @@ halbtc8821a2ant_SetDacSwingReg( { u1Byte val=(u1Byte)level; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc5b, 0x3e, val); } @@ -892,17 +1006,13 @@ halbtc8821a2ant_DacSwing( IN u4Byte dacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl)); pCoexDm->bCurDacSwingOn = bDacSwingOn; pCoexDm->curDacSwingLvl = dacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", - pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl, - pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl)); - if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) && (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) ) return; @@ -922,12 +1032,12 @@ halbtc8821a2ant_SetAdcBackOff( { if(bAdcBackOff) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level On!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x3); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level Off!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x1); } } @@ -939,15 +1049,12 @@ halbtc8821a2ant_AdcBackOff( IN BOOLEAN bAdcBackOff ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn AdcBackOff = %s\n", (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF"))); pCoexDm->bCurAdcBackOff = bAdcBackOff; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", - pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff)); - if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) return; } @@ -964,23 +1071,67 @@ halbtc8821a2ant_SetAgcTable( { u1Byte rssiAdjustVal=0; + //=================BB AGC Gain Table + if(bAgcTableEn) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB Agc Table On!\n")); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6e1A0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6d1B0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6c1C0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6b1D0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6a1E0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x691F0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x68200001); + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB Agc Table Off!\n")); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xaa1A0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa91B0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa81C0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa71D0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa61E0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa51F0001); + pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa4200001); + } + + + //=================RF Gain pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000); if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28F4B); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x10AB2); - rssiAdjustVal = 8; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38fff); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38ffe); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x2884B); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x104B2); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x380c3); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28ce6); } pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x1); + if(bAgcTableEn) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38fff); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38ffe); + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x380c3); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x28ce6); + } + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x0); + // set rssiAdjustVal for wifi module. + if(bAgcTableEn) + { + rssiAdjustVal = 8; + } pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal); } @@ -991,15 +1142,12 @@ halbtc8821a2ant_AgcTable( IN BOOLEAN bAgcTableEn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s %s Agc Table\n", (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable"))); pCoexDm->bCurAgcTableEn = bAgcTableEn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", - pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn)); - if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) return; } @@ -1017,16 +1165,16 @@ halbtc8821a2ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -1040,7 +1188,7 @@ halbtc8821a2ant_CoexTable( IN u1Byte val0x6cc ) { - 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", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c4 = val0x6c4; @@ -1048,12 +1196,7 @@ halbtc8821a2ant_CoexTable( pCoexDm->curVal0x6cc = val0x6cc; if(!bForceExec) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - + { if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && @@ -1068,6 +1211,76 @@ halbtc8821a2ant_CoexTable( pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc; } +VOID +halbtc8821a2ant_CoexTableWithType( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte type + ) +{ + pCoexSta->nCoexTableType = type; + + switch(type) + { + case 0: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3); + break; + case 1: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5afa5afa, 0xffffff, 0x3); + break; + case 2: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5ada5ada, 0x5ada5ada, 0xffffff, 0x3); + break; + case 3: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3); + break; + case 4: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffffff, 0x3); + break; + case 5: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3); + break; + case 6: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 7: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 8: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 9: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 10: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 11: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 12: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 13: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3); + break; + case 14: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3); + break; + case 15: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3); + break; + case 16: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fdf5fdf, 0x5fdb5fdb, 0xffffff, 0x3); + break; + case 17: + halbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0xfafafafa, 0xfafafafa, 0xffffff, 0x3); + break; + default: + break; + } +} + VOID halbtc8821a2ant_SetFwIgnoreWlanAct( IN PBTC_COEXIST pBtCoexist, @@ -1081,12 +1294,55 @@ halbtc8821a2ant_SetFwIgnoreWlanAct( H2C_Parameter[0] |= BIT0; // function enable } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter); } +VOID +halbtc8821a2ant_SetLpsRpwm( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte lpsVal, + IN u1Byte rpwmVal + ) +{ + u1Byte lps=lpsVal; + u1Byte rpwm=rpwmVal; + + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm); +} + +VOID +halbtc8821a2ant_LpsRpwm( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bForceExec, + IN u1Byte lpsVal, + IN u1Byte rpwmVal + ) +{ + BOOLEAN bForceExecPwrCmd=FALSE; + + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", + (bForceExec? "force to":""), lpsVal, rpwmVal)); + pCoexDm->curLps = lpsVal; + pCoexDm->curRpwm = rpwmVal; + + if(!bForceExec) + { + if( (pCoexDm->preLps == pCoexDm->curLps) && + (pCoexDm->preRpwm == pCoexDm->curRpwm) ) + { + return; + } + } + halbtc8821a2ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal); + + pCoexDm->preLps = pCoexDm->curLps; + pCoexDm->preRpwm = pCoexDm->curRpwm; +} + VOID halbtc8821a2ant_IgnoreWlanAct( IN PBTC_COEXIST pBtCoexist, @@ -1094,15 +1350,12 @@ halbtc8821a2ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -1122,7 +1375,7 @@ halbtc8821a2ant_SetFwPstdma( ) { u1Byte H2C_Parameter[5] ={0}; - + H2C_Parameter[0] = byte1; H2C_Parameter[1] = byte2; H2C_Parameter[2] = byte3; @@ -1135,7 +1388,7 @@ halbtc8821a2ant_SetFwPstdma( pCoexDm->psTdmaPara[3] = byte4; pCoexDm->psTdmaPara[4] = byte5; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n", H2C_Parameter[0], H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); @@ -1151,6 +1404,7 @@ halbtc8821a2ant_SwMechanism1( IN BOOLEAN bBTLNAConstrain ) { + /* u4Byte wifiBw; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); @@ -1160,12 +1414,10 @@ halbtc8821a2ant_SwMechanism1( if (bShrinkRxLPF) bShrinkRxLPF = FALSE; } - - halbtc8821a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF); + */ + + //halbtc8821a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF); halbtc8821a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA); - - //no limited DIG - //halbtc8821a2ant_SetBtLnaConstrain(pBtCoexist, NORMAL_EXEC, bBTLNAConstrain); } VOID @@ -1178,7 +1430,7 @@ halbtc8821a2ant_SwMechanism2( ) { //halbtc8821a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift); - halbtc8821a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff); + //halbtc8821a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff); halbtc8821a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl); } @@ -1243,19 +1495,24 @@ halbtc8821a2ant_PsTdma( { BOOLEAN bTurnOnByCnt=FALSE; u1Byte psTdmaTypeByCnt=0; + u1Byte wifiRssiState1, btRssiState; + + + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); + + if (!(BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) && bTurnOn) + { + type = type +100; //for WiFi RSSI low or BT RSSI low + } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); pCoexDm->bCurPsTdmaOn = bTurnOn; pCoexDm->curPsTdma = type; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", - pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", - pCoexDm->prePsTdma, pCoexDm->curPsTdma)); - if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) return; @@ -1266,10 +1523,12 @@ halbtc8821a2ant_PsTdma( { case 1: default: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90); break; case 2: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90); break; case 3: halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90); @@ -1278,10 +1537,12 @@ halbtc8821a2ant_PsTdma( halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90); break; case 5: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90); break; case 6: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90); break; case 7: halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90); @@ -1290,28 +1551,36 @@ halbtc8821a2ant_PsTdma( halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90); break; case 9: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90); break; case 10: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90); break; case 11: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90); break; case 12: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xf1, 0x90); break; case 13: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90); break; case 14: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90); break; case 15: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90); break; case 16: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90); + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0x70, 0x90); break; case 17: halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90); @@ -1325,11 +1594,59 @@ halbtc8821a2ant_PsTdma( case 20: halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90); break; - case 21: + case 21: halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90); + break; + case 23: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x03, 0xf1, 0x10); + break; + case 24: + case 124: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x3c, 0x03, 0x70, 0x50); break; case 71: - halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); + //halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); + + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90); + break; + case 101: + case 105: + case 171: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x3a, 0x03, 0x70, 0x50); + break; + case 102: + case 106: + case 110: + case 114: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x2d, 0x03, 0x70, 0x50); + break; + case 103: + case 107: + case 111: + case 115: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1c, 0x03, 0x70, 0x50); + break; + case 104: + case 108: + case 112: + case 116: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x10, 0x03, 0x70, 0x50); + break; + case 109: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90); + break; + case 113: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x70, 0x90); + break; + case 121: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90); + break; + case 22: + case 122: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x35, 0x03, 0x71, 0x11); + break; + case 123: + halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1c, 0x03, 0x70, 0x50); break; } } @@ -1356,32 +1673,110 @@ halbtc8821a2ant_PsTdma( } VOID -halbtc8821a2ant_CoexAllOff( - IN PBTC_COEXIST pBtCoexist - ) -{ - // fw all off - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); - - // sw all off - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - - // hw all off - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3); -} - -VOID -halbtc8821a2ant_CoexUnder5G( - IN PBTC_COEXIST pBtCoexist +halbtc8821a2ant_PsTdmaCheckForPowerSaveState( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bNewPsState ) { - halbtc8821a2ant_CoexAllOff(pBtCoexist); - - halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE); -} + u1Byte lpsMode=0x0; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode); + + if(lpsMode) // already under LPS state + { + if(bNewPsState) + { + // keep state under LPS, do nothing. + } + else + { + // will leave LPS state, turn off psTdma first + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + } + } + else // NO PS state + { + if(bNewPsState) + { + // will enter LPS state, turn off psTdma first + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + } + else + { + // keep state under NO PS state, do nothing. + } + } +} + +VOID +halbtc8821a2ant_PowerSaveState( + IN PBTC_COEXIST pBtCoexist, + IN u1Byte psType, + IN u1Byte lpsVal, + IN u1Byte rpwmVal + ) +{ + BOOLEAN bLowPwrDisable=FALSE; + + switch(psType) + { + case BTC_PS_WIFI_NATIVE: + // recover to original 32k low power setting + bLowPwrDisable = FALSE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL); + pCoexSta->bForceLpsOn = FALSE; + break; + case BTC_PS_LPS_ON: + halbtc8821a2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE); + halbtc8821a2ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal); + // when coex force to enter LPS, do not enter 32k low power. + bLowPwrDisable = TRUE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); + // power save must executed before psTdma. + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL); + pCoexSta->bForceLpsOn = TRUE; + break; + case BTC_PS_LPS_OFF: + halbtc8821a2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL); + pCoexSta->bForceLpsOn = FALSE; + break; + default: + break; + } +} + + +VOID +halbtc8821a2ant_CoexAllOff( + IN PBTC_COEXIST pBtCoexist + ) +{ + // fw all off + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + // sw all off + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + + // hw all off + //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); +} + +VOID +halbtc8821a2ant_CoexUnder5G( + IN PBTC_COEXIST pBtCoexist + ) +{ + halbtc8821a2ant_CoexAllOff(pBtCoexist); + + halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE); +} VOID halbtc8821a2ant_InitCoexDm( @@ -1389,169 +1784,239 @@ halbtc8821a2ant_InitCoexDm( ) { // force to reset coex mechanism - halbtc8821a2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3); - + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8821a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6); - halbtc8821a2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, FALSE); + halbtc8821a2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0); halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } VOID -halbtc8821a2ant_BtInquiryPage( +halbtc8821a2ant_ActionBtInquiry( IN PBTC_COEXIST pBtCoexist ) { + u1Byte wifiRssiState, wifiRssiState1, btRssiState; + BOOLEAN bWifiConnected=FALSE; BOOLEAN bLowPwrDisable=TRUE; + BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; + + + wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + + 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); + + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + if(bScan || bLink || bRoam) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi link process + BT Inq/Page!!\n")); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); + } + else if(bWifiConnected) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT Inq/Page!!\n")); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi no-link + BT Inq/Page!!\n")); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + } + + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3); - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + } -BOOLEAN -halbtc8821a2ant_IsCommonAction( + + +VOID +halbtc8821a2ant_ActionWiFiLinkProcess( IN PBTC_COEXIST pBtCoexist ) { - BOOLEAN bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE; - BOOLEAN bLowPwrDisable=FALSE; + u1Byte u1Tmpa, u1Tmpb; + + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3); - if(!bWifiConnected && - BT_8821A_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus) - { - bLowPwrDisable = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT IPS!!\n")); + u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765); + u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e); - - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); - - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x765=0x%x, 0x76e=0x%x\n", u1Tmpa, u1Tmpb)); +} - bCommon = TRUE; - } - else if(bWifiConnected && - (BT_8821A_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus) ) - { - bLowPwrDisable = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); +BOOLEAN +halbtc8821a2ant_ActionWifiIdleProcess( + IN PBTC_COEXIST pBtCoexist + ) +{ + u1Byte wifiRssiState, wifiRssiState1, btRssiState; + u4Byte wifiBw; + u1Byte apNum=0; - if(bWifiBusy) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT IPS!!\n")); - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - } - else - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT IPS!!\n")); - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - } - - halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); + //wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES-20, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum); - bCommon = TRUE; - } - else if(!bWifiConnected && - (BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) + // define the office environment + if(BTC_RSSI_HIGH(wifiRssiState1) && + (pCoexSta->bHidExist == TRUE) && (pCoexSta->bA2dpExist == TRUE)) { - bLowPwrDisable = TRUE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT LPS!!\n")); - - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi idle process for BT HID+A2DP exist!!\n")); + + halbtc8821a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x6); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + // sw all off halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - bCommon = TRUE; + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + + return TRUE; } - else if(bWifiConnected && - (BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) + else { - bLowPwrDisable = TRUE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - - if(bWifiBusy) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT LPS!!\n")); - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - } - else - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT LPS!!\n")); - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - } - - halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + halbtc8821a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18); + return FALSE; + } + + +} - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - bCommon = TRUE; - } - else if(!bWifiConnected && - (BT_8821A_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) ) + +BOOLEAN +halbtc8821a2ant_IsCommonAction( + IN PBTC_COEXIST pBtCoexist + ) +{ + u1Byte btRssiState=BTC_RSSI_STATE_HIGH; + BOOLEAN bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE; + BOOLEAN bBtHsOn=FALSE, bLowPwrDisable=FALSE; + + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + + if(!bWifiConnected) { bLowPwrDisable = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non-connected idle!!\n")); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT Busy!!\n")); - + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); - - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + bCommon = TRUE; } else { - bLowPwrDisable = TRUE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - - if(bWifiBusy) + if(BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT Busy!!\n")); - bCommon = FALSE; + bLowPwrDisable = FALSE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); + + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + + bCommon = TRUE; } - else + else if(BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT Busy!!\n")); - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21); + bLowPwrDisable = TRUE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); - else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + if(bBtHsOn) + return FALSE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + bCommon = TRUE; } + else + { + bLowPwrDisable = TRUE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE); + if(bWifiBusy) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); + bCommon = FALSE; + //bCommon = halbtc8821a2ant_ActionWifiIdleProcess(pBtCoexist); + } + else + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); + //bCommon = FALSE; + bCommon = halbtc8821a2ant_ActionWifiIdleProcess(pBtCoexist); + } + } } - + return bCommon; } VOID @@ -1566,12 +2031,12 @@ halbtc8821a2ant_TdmaDurationAdjust( s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjust()\n")); - if(pCoexDm->bResetTdmaAdjust) + if(!pCoexDm->bAutoTdmaAdjust) { - pCoexDm->bResetTdmaAdjust = FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + pCoexDm->bAutoTdmaAdjust = TRUE; + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); { if(bScoHid) { @@ -1684,8 +2149,8 @@ halbtc8821a2ant_TdmaDurationAdjust( { //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], retryCount = %d\n", retryCount)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", up, dn, m, n, WaitCount)); result = 0; WaitCount++; @@ -1705,7 +2170,7 @@ halbtc8821a2ant_TdmaDurationAdjust( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -1731,7 +2196,7 @@ halbtc8821a2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -1749,15 +2214,15 @@ halbtc8821a2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval)); if(maxInterval == 1) { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 71) { @@ -1874,7 +2339,7 @@ halbtc8821a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71); @@ -1998,7 +2463,7 @@ halbtc8821a2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); @@ -2108,7 +2573,7 @@ halbtc8821a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); @@ -2221,7 +2686,7 @@ halbtc8821a2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); @@ -2331,7 +2796,7 @@ halbtc8821a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); @@ -2447,7 +2912,7 @@ halbtc8821a2ant_TdmaDurationAdjust( if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); @@ -2460,15 +2925,9 @@ halbtc8821a2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); } } - - // when halbtc8821a2ant_TdmaDurationAdjust() is called, fw dac swing is included in the function. - //if(pCoexDm->psTdmaDuAdjType == 71) - // halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xc); //Skip because A2DP get worse at HT40 - //else - halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x6); } // SCO only or SCO+PAN(HS) @@ -2477,85 +2936,73 @@ halbtc8821a2ant_ActionSco( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState,btRssiState; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + u1Byte wifiRssiState, btRssiState; u4Byte wifiBw; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); if (BTC_WIFI_BW_LEGACY == wifiBw) //for SCO quality at 11b/g mode { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); } else //for SCO quality & wifi performance balance at 11n mode { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3); - } - - if(BTC_WIFI_BW_HT40 == wifiBw) - { - - // fw mechanism - //halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality - } + if(BTC_WIFI_BW_HT40 == wifiBw) + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8); else { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality + if(pBtLinkInfo->bScoOnly) + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 17); + else + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12); } + } - // sw mechanism + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality + + // sw mechanism + if(BTC_WIFI_BW_HT40 == wifiBw) + { if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x18); } else { halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x18); } } else { - // fw mechanism - //halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality - } - else - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x18); } } } @@ -2570,76 +3017,61 @@ halbtc8821a2ant_ActionHid( u4Byte wifiBw; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); + + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); } else //for HID quality & wifi performance balance at 11n mode { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aea5aea, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); } + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 24); + + // sw mechanism if(BTC_WIFI_BW_HT40 == wifiBw) { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - } - else - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } else { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - } - else - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } } @@ -2650,73 +3082,109 @@ halbtc8821a2ant_ActionA2dp( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState; + u1Byte wifiRssiState, wifiRssiState1, btRssiState; u4Byte wifiBw; + u1Byte apNum=0; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); - - //fw dac swing is called in halbtc8821a2ant_TdmaDurationAdjust() - //halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); - else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum); - if(BTC_WIFI_BW_HT40 == wifiBw) + // define the office environment + if( (apNum >= 10) && BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + //DbgPrint(" AP#>10(%d)\n", apNum); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + + // sw mechanism + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + if(BTC_WIFI_BW_HT40 == wifiBw) { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6); } else { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6); } - - // sw mechanism + return; + + } + + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + + if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) + { + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + } + else + { + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + } + + + if( (btRssiState == BTC_RSSI_STATE_HIGH) || + (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + { + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1); + } + else + { + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1); + } + + // sw mechanism + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + if(BTC_WIFI_BW_HT40 == wifiBw) + { if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } else { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1); - } - else - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1); - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } } @@ -2726,72 +3194,65 @@ halbtc8821a2ant_ActionA2dpPanHs( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState, btInfoExt; + u1Byte wifiRssiState, wifiRssiState1, btRssiState; u4Byte wifiBw; - btInfoExt = pCoexSta->btInfoExt; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2,35, 0); + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); - //fw dac swing is called in halbtc8821a2ant_TdmaDurationAdjust() - //halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); + + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) + { + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + } + else + { + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + } + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2); + + // sw mechanism + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); if(BTC_WIFI_BW_HT40 == wifiBw) { - // fw mechanism - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1); - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } else { - // fw mechanism - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1); - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } } @@ -2801,80 +3262,73 @@ halbtc8821a2ant_ActionPanEdr( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState; + u1Byte wifiRssiState,wifiRssiState1, btRssiState; u4Byte wifiBw; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); + + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - - if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode + if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 10); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); } - else //for HID quality & wifi performance balance at 11n mode + else { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); } - + + if( (btRssiState == BTC_RSSI_STATE_HIGH) || + (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + { + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); //1->3 for TENCENT spp profile delay time + } + else + { + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); + } + + // sw mechanism + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); if(BTC_WIFI_BW_HT40 == wifiBw) { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); - } - else - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } else { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); - } - else - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } } @@ -2886,77 +3340,56 @@ halbtc8821a2ant_ActionPanHs( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState; + u1Byte wifiRssiState, wifiRssiState1, btRssiState; u4Byte wifiBw; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); + + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); if(BTC_WIFI_BW_HT40 == wifiBw) { - // fw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); - } - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - - // sw mechanism - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); - } - else - { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } else { - // fw mechanism - if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || - (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); - } - else - { - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); - } - - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - } - else - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } } @@ -2967,109 +3400,74 @@ halbtc8821a2ant_ActionPanEdrA2dp( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState, btInfoExt; + u1Byte wifiRssiState, wifiRssiState1, btRssiState; u4Byte wifiBw; - btInfoExt = pCoexSta->btInfoExt; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); + + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode + if( (btRssiState == BTC_RSSI_STATE_HIGH) || + (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12); + + if(BTC_WIFI_BW_HT40 == wifiBw) + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3); + else + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); } - else //for HID quality & wifi performance balance at 11n mode + else { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13); + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3); } - + + // sw mechanism if(BTC_WIFI_BW_HT40 == wifiBw) { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); - } - } - else - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3); - } - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - }; + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + } } else { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3); - } - } - else - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3); - } - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } } @@ -3079,82 +3477,84 @@ halbtc8821a2ant_ActionPanEdrHid( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState; + u1Byte wifiRssiState, wifiRssiState1, btRssiState; u4Byte wifiBw; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode + if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); } - else //for HID quality & wifi performance balance at 11n mode + else { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); } - if(BTC_WIFI_BW_HT40 == wifiBw) - { - halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3); - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + if( (btRssiState == BTC_RSSI_STATE_HIGH) || + (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + { + if(BTC_WIFI_BW_HT40 == wifiBw) { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3); + //halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); } else { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + //halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); } - - // sw mechanism + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2); + } + else + { + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + //halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); + } + + // sw mechanism + if(BTC_WIFI_BW_HT40 == wifiBw) + { if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } else { - halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - } - else - { - halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } } @@ -3165,109 +3565,77 @@ halbtc8821a2ant_ActionHidA2dpPanEdr( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState, btInfoExt; + u1Byte wifiRssiState,wifiRssiState1, btRssiState; u4Byte wifiBw; - btInfoExt = pCoexSta->btInfoExt; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0); + + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8); halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) + { + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + } + else + { + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); + } pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode + if( (btRssiState == BTC_RSSI_STATE_HIGH) || + (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3); + if(BTC_WIFI_BW_HT40 == wifiBw) + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); + else + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3); } - else //for HID quality & wifi performance balance at 11n mode + else { - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3); + halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); } + // sw mechanism if(BTC_WIFI_BW_HT40 == wifiBw) { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); - } - } - else - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); - } - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } else { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3); - } - } - else - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); - } - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } } @@ -3277,287 +3645,438 @@ halbtc8821a2ant_ActionHidA2dp( IN PBTC_COEXIST pBtCoexist ) { - u1Byte wifiRssiState, btRssiState, btInfoExt; + u1Byte wifiRssiState, wifiRssiState1, btRssiState; u4Byte wifiBw; + u1Byte apNum=0; - btInfoExt = pCoexSta->btInfoExt; wifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8821a2ant_BtRssiState(2, 35, 0); + //btRssiState = halbtc8821a2ant_BtRssiState(2, 29, 0); + wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); + btRssiState = halbtc8821a2ant_BtRssiState(3, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 37); - if(halbtc8821a2ant_NeedToDecBtPwr(pBtCoexist)) - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE); - else - halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + + halbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5); + + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + if(BTC_WIFI_BW_LEGACY == wifiBw) + { + if(BTC_RSSI_HIGH(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else if(BTC_RSSI_MEDIUM(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + } + else + { // only 802.11N mode we have to dec bt power to 4 degree + if(BTC_RSSI_HIGH(btRssiState)) + { + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum); + // need to check ap Number of Not + if(apNum < 10) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); + else + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + } + else if(BTC_RSSI_MEDIUM(btRssiState)) + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); + else + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + } - if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode + if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) { -//Allen halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3); - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); } - else //for HID quality & wifi performance balance at 11n mode + else { -//Allen halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3); - halbtc8821a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3); - + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14); + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); } + if( (btRssiState == BTC_RSSI_STATE_HIGH) || + (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) + { + //halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23); + } + else + { + //halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23); + } + + // sw mechanism if(BTC_WIFI_BW_HT40 == wifiBw) { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); - } - } - else - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); - } - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } else { - // fw mechanism - if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - if(btInfoExt&BIT0) //a2dp basic rate - { -// halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2); - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); - - } - else //a2dp edr rate - { -//Allen halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2); - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); - } - } - else - { - if(btInfoExt&BIT0) //a2dp basic rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); - } - else //a2dp edr rate - { - halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2); - } - } - - // sw mechanism if( (wifiRssiState == BTC_RSSI_STATE_HIGH) || (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18); } else { - halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); - halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); } } } +VOID +halbtc8821a2ant_ActionBtWhckTest( + IN PBTC_COEXIST pBtCoexist + ) +{ + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + // sw all off + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); +} + +VOID +halbtc8821a2ant_ActionWifiMultiPort( + IN PBTC_COEXIST pBtCoexist + ) +{ + halbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); + halbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); + + // sw all off + halbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); + halbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); + + // hw all off + //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); + + halbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); +} + VOID halbtc8821a2ant_RunCoexistMechanism( IN PBTC_COEXIST pBtCoexist ) { - PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BOOLEAN bWifiUnder5G=FALSE; + BOOLEAN bWifiUnder5G=FALSE, bBtHsOn=FALSE; u1Byte btInfoOriginal=0, btRetryCnt=0; u1Byte algorithm=0; + u4Byte numOfWifiLink=0; + u4Byte wifiLinkStatus=0; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; + BOOLEAN bMiracastPlusBt=FALSE; + BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; + + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Manual control!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); return; } - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G); if(bWifiUnder5G) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n")); halbtc8821a2ant_CoexUnder5G(pBtCoexist); return; } - if(pStackInfo->bProfileNotified) + if(pCoexSta->bUnderIps) { - algorithm = halbtc8821a2ant_ActionAlgorithm(pBtCoexist); - if(pCoexSta->bC2hBtInquiryPage && (BT_8821A_2ANT_COEX_ALGO_PANHS!=algorithm)) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n")); - halbtc8821a2ant_BtInquiryPage(pBtCoexist); - return; - } + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS !!!\n")); + return; + } + + if(pCoexSta->bBtWhckTest) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under WHCK TEST!!!\n")); + halbtc8821a2ant_ActionBtWhckTest(pBtCoexist); + return; + } + + algorithm = halbtc8821a2ant_ActionAlgorithm(pBtCoexist); + if(pCoexSta->bC2hBtInquiryPage && (BT_8821A_2ANT_COEX_ALGO_PANHS!=algorithm)) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under inquiry/page scan !!\n")); + halbtc8821a2ant_ActionBtInquiry(pBtCoexist); + return; + } + else + { + + } + + 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); + + if(bScan || bLink || bRoam) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], WiFi is under Link Process !!\n")); + halbtc8821a2ant_ActionWiFiLinkProcess(pBtCoexist); + return; + } - pCoexDm->curAlgorithm = algorithm; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); + //for P2P - if(halbtc8821a2ant_IsCommonAction(pBtCoexist)) + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); + numOfWifiLink = wifiLinkStatus>>16; + + if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED)) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) ); + + if(pBtLinkInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n")); - pCoexDm->bResetTdmaAdjust = TRUE; + bMiracastPlusBt = TRUE; } else { - if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm) - { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", - pCoexDm->preAlgorithm, pCoexDm->curAlgorithm)); - pCoexDm->bResetTdmaAdjust = TRUE; - } - switch(pCoexDm->curAlgorithm) - { - case BT_8821A_2ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); - halbtc8821a2ant_ActionSco(pBtCoexist); - break; - case BT_8821A_2ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); - halbtc8821a2ant_ActionHid(pBtCoexist); - break; - case BT_8821A_2ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); - halbtc8821a2ant_ActionA2dp(pBtCoexist); - break; - case BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); - halbtc8821a2ant_ActionA2dpPanHs(pBtCoexist); - break; - case BT_8821A_2ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); - halbtc8821a2ant_ActionPanEdr(pBtCoexist); - break; - case BT_8821A_2ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); - halbtc8821a2ant_ActionPanHs(pBtCoexist); - break; - case BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); - halbtc8821a2ant_ActionPanEdrA2dp(pBtCoexist); - break; - case BT_8821A_2ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); - halbtc8821a2ant_ActionPanEdrHid(pBtCoexist); - break; - case BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); - halbtc8821a2ant_ActionHidA2dpPanEdr(pBtCoexist); - break; - case BT_8821A_2ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); - halbtc8821a2ant_ActionHidA2dp(pBtCoexist); - break; - default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); - halbtc8821a2ant_CoexAllOff(pBtCoexist); - break; - } - pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; + bMiracastPlusBt = FALSE; } + + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); + halbtc8821a2ant_ActionWifiMultiPort(pBtCoexist); + + return; } else - { // stack doesn't notify profile info. - // use the following profile info from bt fw. - //pCoexSta->bBtLinkExist - //pCoexSta->bScoExist - //pCoexSta->bA2dpExist - //pCoexSta->bHidExist - //pCoexSta->bPanExist -} -} + { + bMiracastPlusBt = FALSE; + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); + } + pCoexDm->curAlgorithm = algorithm; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); + if(halbtc8821a2ant_IsCommonAction(pBtCoexist)) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant common.\n")); + pCoexDm->bAutoTdmaAdjust = FALSE; + } + else + { + if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", + pCoexDm->preAlgorithm, pCoexDm->curAlgorithm)); + pCoexDm->bAutoTdmaAdjust = FALSE; + } + switch(pCoexDm->curAlgorithm) + { + case BT_8821A_2ANT_COEX_ALGO_SCO: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); + halbtc8821a2ant_ActionSco(pBtCoexist); + break; + case BT_8821A_2ANT_COEX_ALGO_HID: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); + halbtc8821a2ant_ActionHid(pBtCoexist); + break; + case BT_8821A_2ANT_COEX_ALGO_A2DP: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); + halbtc8821a2ant_ActionA2dp(pBtCoexist); + break; + case BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); + halbtc8821a2ant_ActionA2dpPanHs(pBtCoexist); + break; + case BT_8821A_2ANT_COEX_ALGO_PANEDR: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); + halbtc8821a2ant_ActionPanEdr(pBtCoexist); + break; + case BT_8821A_2ANT_COEX_ALGO_PANHS: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); + halbtc8821a2ant_ActionPanHs(pBtCoexist); + break; + case BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); + halbtc8821a2ant_ActionPanEdrA2dp(pBtCoexist); + break; + case BT_8821A_2ANT_COEX_ALGO_PANEDR_HID: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); + halbtc8821a2ant_ActionPanEdrHid(pBtCoexist); + break; + case BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); + halbtc8821a2ant_ActionHidA2dpPanEdr(pBtCoexist); + break; + case BT_8821A_2ANT_COEX_ALGO_HID_A2DP: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); + halbtc8821a2ant_ActionHidA2dp(pBtCoexist); + break; + default: + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); + halbtc8821a2ant_CoexAllOff(pBtCoexist); + break; + } + pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; + } +} -//============================================================ -// work around function start with wa_halbtc8821a2ant_ -//============================================================ -//============================================================ -// extern function start with EXhalbtc8821a2ant_ -//============================================================ VOID -EXhalbtc8821a2ant_PowerOnSetting( +halbtc8821a2ant_WifiOffHwCfg( IN PBTC_COEXIST pBtCoexist ) { + BOOLEAN bIsInMpMode = FALSE; + u1Byte H2C_Parameter[2] ={0}; + u4Byte fwVer=0; + + // set wlan_act to low + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); + + pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1 + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); + if(fwVer >= 0x180000) + { + /* Use H2C to set GNT_BT to HIGH */ + H2C_Parameter[0] = 1; + pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter); + } + else + { + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); + } } VOID -EXhalbtc8821a2ant_InitHwConfig( +halbtc8821a2ant_InitHwConfig( IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bWifiOnly + IN BOOLEAN bBackUp ) { PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - u4Byte u4Tmp=0; + u4Byte u4Tmp=0, fwVer; u2Byte u2Tmp=0; u1Byte u1Tmp=0; u1Byte H2C_Parameter[2] ={0}; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Init HW Config!!\n")); // backup rf 0x1e value pCoexDm->btRf0x1eBackup = - pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff); + pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff); // 0x790[5:0]=0x5 u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790); u1Tmp &= 0xc0; u1Tmp |= 0x5; pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp); - - //Antenna config + + //Antenna config halbtc8821a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, TRUE, FALSE); + pCoexSta->disVerInfoCnt = 0; // PTA parameter - halbtc8821a2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3); + halbtc8821a2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); // Enable counter statistics - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA + pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); //0x76e[3] =1, WLAN_Act control by PTA pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1); } +//============================================================ +// work around function start with wa_halbtc8821a2ant_ +//============================================================ +//============================================================ +// extern function start with EXhalbtc8821a2ant_ +//============================================================ +VOID +EXhalbtc8821a2ant_PowerOnSetting( + IN PBTC_COEXIST pBtCoexist + ) +{ + +} + +VOID +EXhalbtc8821a2ant_PreLoadFirmware( + IN PBTC_COEXIST pBtCoexist + ) +{ + PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + u1Byte u1Tmp=0x4; /* Set BIT2 by default since it's 2ant case */ + + // + // S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) + // Local setting bit define + // BIT0: "0" for no antenna inverse; "1" for antenna inverse + // BIT1: "0" for internal switch; "1" for external switch + // BIT2: "0" for one antenna; "1" for two antenna + // NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0 + if(pBtCoexist->chipInterface == BTC_INTF_USB) + { + // fixed at S0 for USB interface + u1Tmp |= 0x1; // antenna inverse + pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp); + } + else + { + // for PCIE and SDIO interface, we check efuse 0xc3[6] + if(pBoardInfo->singleAntPath == 0) + { + } + else if(pBoardInfo->singleAntPath == 1) + { + // set to S0 + u1Tmp |= 0x1; // antenna inverse + } + + if(pBtCoexist->chipInterface == BTC_INTF_PCI) + { + pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp); + } + else if(pBtCoexist->chipInterface == BTC_INTF_SDIO) + { + pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp); + } + } +} + +VOID +EXhalbtc8821a2ant_InitHwConfig( + IN PBTC_COEXIST pBtCoexist, + IN BOOLEAN bWifiOnly + ) +{ + halbtc8821a2ant_InitHwConfig(pBtCoexist, TRUE); +} + VOID EXhalbtc8821a2ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); halbtc8821a2ant_InitCoexDm(pBtCoexist); } @@ -3569,23 +4088,27 @@ EXhalbtc8821a2ant_DisplayCoexInfo( { PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; pu1Byte cliBuf=pBtCoexist->cliBuf; u1Byte u1Tmp[4], i, btInfoExt, psTdmaCase=0; u4Byte u4Tmp[4]; + u4Byte faOfdm, faCck; u4Byte fwVer=0, btPatchVer=0; CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============"); CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \ - pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum); - CL_PRINTF(cliBuf); - if(pBtCoexist->bManualControl) { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "[Action Manual control]!!"); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[Under Manual Control]============"); + CL_PRINTF(cliBuf); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n =========================================="); CL_PRINTF(cliBuf); } + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \ + pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum); + CL_PRINTF(cliBuf); CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \ ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion); @@ -3593,7 +4116,7 @@ EXhalbtc8821a2ant_DisplayCoexInfo( pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)", "CoexVer/ FwVer/ PatchVer", \ + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)", "CoexVer/ FwVer/ PatchVer", \ GLCoexVerDate8821a2Ant, GLCoexVer8821a2Ant, fwVer, btPatchVer, btPatchVer); CL_PRINTF(cliBuf); @@ -3601,7 +4124,7 @@ EXhalbtc8821a2ant_DisplayCoexInfo( pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1], pCoexDm->wifiChnlInfo[2]); CL_PRINTF(cliBuf); - + // wifi status CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); CL_PRINTF(cliBuf); @@ -3610,19 +4133,26 @@ EXhalbtc8821a2ant_DisplayCoexInfo( CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============"); CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \ - ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8821A_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)? "idle":( (BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy"))), - pCoexSta->btRssi, pCoexSta->btRetryCnt); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %ddBm/ %d] ", "BT [status/ rssi/ retryCnt]", \ + ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"): ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle": + ( (BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))), + pCoexSta->btRssi-100, pCoexSta->btRetryCnt); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \ + pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist); CL_PRINTF(cliBuf); - - if(pStackInfo->bProfileNotified) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \ - pStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist); - CL_PRINTF(cliBuf); - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO); + if (pStackInfo->bProfileNotified) + { + pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO); } + else + { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Role", \ + (pBtLinkInfo->bSlaveRole )? "Slave":"Master"); + CL_PRINTF(cliBuf); + } btInfoExt = pCoexSta->btInfoExt; CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \ @@ -3655,20 +4185,21 @@ EXhalbtc8821a2ant_DisplayCoexInfo( // Fw mechanism CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============"); CL_PRINTF(cliBuf); - - if(!pBtCoexist->bManualControl) - { - psTdmaCase = pCoexDm->curPsTdma; - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d", "PS TDMA", \ - pCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1], - pCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3], - pCoexDm->psTdmaPara[4], psTdmaCase); - CL_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \ - pCoexDm->bCurDecBtPwr, pCoexDm->bCurIgnoreWlanAct); + + psTdmaCase = pCoexDm->curPsTdma; + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)", "PS TDMA", \ + pCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1], + pCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3], + pCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Coex Table Type", \ + pCoexSta->nCoexTableType); CL_PRINTF(cliBuf); - } + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \ + pCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct); + CL_PRINTF(cliBuf); // Hw setting CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============"); @@ -3679,16 +4210,17 @@ EXhalbtc8821a2ant_DisplayCoexInfo( CL_PRINTF(cliBuf); u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778); - u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x ", "0x778 (W_Act)/ 0x6cc (CoTab Sel)", \ - u1Tmp[0], u1Tmp[1]); + u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xc5b); + u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x778/0x880[29:25]/0xc58[29:25]", \ + u1Tmp[0], (u4Tmp[0]&0x3e000000) >> 25, ((u1Tmp[1]&0x3e)>>1)); CL_PRINTF(cliBuf); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x8db); - u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xc5b); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x8db(ADC)/0xc5b[29:25](DAC)", \ - ((u1Tmp[0]&0x60)>>5), ((u1Tmp[1]&0x3e)>>1)); - CL_PRINTF(cliBuf); + u4Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x764); + u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x764/ 0x765/ 0x76e", \ + (u4Tmp[0]&0xff), (u4Tmp[0]&0xff00)>>8, u1Tmp[0]); + CL_PRINTF(cliBuf); u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcb4); CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)", \ @@ -3709,32 +4241,52 @@ EXhalbtc8821a2ant_DisplayCoexInfo( CL_PRINTF(cliBuf); u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa0a); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xc50(DIG)/0xa0a(CCK-TH)", \ - u4Tmp[0], u1Tmp[0]); + u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49c); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xc50(dig)/0x49c(null-drop)", \ + u4Tmp[0]&0xff, u1Tmp[0]); CL_PRINTF(cliBuf); - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf48); + u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0); + u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4); + u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8); + u4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcf0); + u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b); u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA", \ - u4Tmp[0], (u1Tmp[0]<<8) + u1Tmp[1] ); + + faOfdm = ((u4Tmp[0]&0xffff0000) >> 16) + ((u4Tmp[1]&0xffff0000) >> 16) + (u4Tmp[1] & 0xffff) + (u4Tmp[2] & 0xffff) + \ + ((u4Tmp[3]&0xffff0000) >> 16) + (u4Tmp[3] & 0xffff) ; + faCck = (u1Tmp[0] << 8) + u1Tmp[1]; + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "OFDM-CCA/OFDM-FA/CCK-FA", \ + u4Tmp[0]&0xffff, faOfdm, faCck); + CL_PRINTF(cliBuf); + + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_OK CCK/11g/11n/11n-Agg", \ + pCoexSta->nCRCOK_CCK, pCoexSta->nCRCOK_11g, pCoexSta->nCRCOK_11n, pCoexSta->nCRCOK_11nAgg); CL_PRINTF(cliBuf); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_Err CCK/11g/11n/11n-Agg", \ + pCoexSta->nCRCErr_CCK, pCoexSta->nCRCErr_11g, pCoexSta->nCRCErr_11n, pCoexSta->nCRCErr_11nAgg); + CL_PRINTF(cliBuf); + u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0); u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4); u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8", \ - u4Tmp[0], u4Tmp[1], u4Tmp[2]); + u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \ + u4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]); CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x770 (hi-pri Rx/Tx)", \ + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x770(high-pri rx/tx)", \ pCoexSta->highPriorityRx, pCoexSta->highPriorityTx); CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x774(low-pri Rx/Tx)", \ + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x774(low-pri rx/tx)", \ pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx); CL_PRINTF(cliBuf); - +#if(BT_AUTO_REPORT_ONLY_8821A_2ANT == 1) + //halbtc8821a2ant_MonitorBtCtr(pBtCoexist); +#endif pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS); } @@ -3747,15 +4299,19 @@ EXhalbtc8821a2ant_IpsNotify( { if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); pCoexSta->bUnderIps = TRUE; + halbtc8821a2ant_WifiOffHwCfg(pBtCoexist); + halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); halbtc8821a2ant_CoexAllOff(pBtCoexist); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); pCoexSta->bUnderIps = FALSE; - //halbtc8821a2ant_InitCoexDm(pBtCoexist); + halbtc8821a2ant_InitHwConfig(pBtCoexist, FALSE); + halbtc8821a2ant_InitCoexDm(pBtCoexist); + halbtc8821a2ant_QueryBtInfo(pBtCoexist); } } @@ -3767,12 +4323,12 @@ EXhalbtc8821a2ant_LpsNotify( { if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); pCoexSta->bUnderLps = TRUE; } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); pCoexSta->bUnderLps = FALSE; } } @@ -3783,14 +4339,21 @@ EXhalbtc8821a2ant_ScanNotify( IN u1Byte type ) { + u1Byte u1Tmpa, u1Tmpb; + + u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765); + u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e); + if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); } + + RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], 0x765=0x%x, 0x76e=0x%x\n", u1Tmpa, u1Tmpb)); } VOID @@ -3801,31 +4364,32 @@ EXhalbtc8821a2ant_ConnectNotify( { if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); } } VOID EXhalbtc8821a2ant_MediaStatusNotify( - IN PBTC_COEXIST pBtCoexist, + IN PBTC_COEXIST pBtCoexist, IN u1Byte type ) { u1Byte H2C_Parameter[3] ={0}; u4Byte wifiBw; u1Byte wifiCentralChnl; + u1Byte apNum=0; if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); } // only 2.4G we need to inform bt the chnl mask @@ -3839,17 +4403,23 @@ EXhalbtc8821a2ant_MediaStatusNotify( if(BTC_WIFI_BW_HT40 == wifiBw) H2C_Parameter[2] = 0x30; else - H2C_Parameter[2] = 0x20; + { + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum); + if(apNum < 10) + H2C_Parameter[2] = 0x30; + else + H2C_Parameter[2] = 0x20; + } } - + pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0]; pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1]; pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x66=0x%x\n", H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); + pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); } VOID @@ -3860,7 +4430,7 @@ EXhalbtc8821a2ant_SpecialPacketNotify( { if(type == BTC_PACKET_DHCP) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); } } @@ -3871,20 +4441,24 @@ EXhalbtc8821a2ant_BtInfoNotify( IN u1Byte length ) { + PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; u1Byte btInfo=0; u1Byte i, rspSource=0; BOOLEAN bBtBusy=FALSE, bLimitedDig=FALSE; - BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE, bWifiUnder5G=FALSE; + BOOLEAN bWifiConnected=FALSE, bWifiUnder5G=FALSE; + static BOOLEAN bPreScoExist=FALSE; + u4Byte raMask=0x0; pCoexSta->bC2hBtInfoReqSent = FALSE; pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G); + pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); rspSource = tmpBuf[0]&0xf; if(rspSource >= BT_INFO_SRC_8821A_2ANT_MAX) rspSource = BT_INFO_SRC_8821A_2ANT_WIFI_FW; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -3892,15 +4466,26 @@ EXhalbtc8821a2ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); + if(pBtCoexist->bManualControl) + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n")); + return; + } + + // if 0xff, it means BT is under WHCK test + if (btInfo == 0xff) + pCoexSta->bBtWhckTest = TRUE; + else + pCoexSta->bBtWhckTest = FALSE; + if(BT_INFO_SRC_8821A_2ANT_WIFI_FW != rspSource) { pCoexSta->btRetryCnt = // [3:0] @@ -3911,12 +4496,21 @@ EXhalbtc8821a2ant_BtInfoNotify( pCoexSta->btInfoExt = pCoexSta->btInfoC2h[rspSource][4]; - + + pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40); + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask); + if(pCoexSta->bBtTxRxMask) + { + /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n")); + pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); + } + // Here we need to resend some wifi info to BT // because bt is reset and loss of the info. if( (pCoexSta->btInfoExt & BIT1) ) - { - + { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n")); if(bWifiConnected) { EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT); @@ -3927,27 +4521,32 @@ EXhalbtc8821a2ant_BtInfoNotify( } } + if(!pBtCoexist->bManualControl && !bWifiUnder5G) { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info = 0x%x!!\n", pCoexSta->btInfoExt)); if( (pCoexSta->btInfoExt&BIT3) ) { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3=1, bWifiConnected=%d\n", bWifiConnected)); if(bWifiConnected) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); } } else { + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3=0, bWifiConnected=%d\n", bWifiConnected)); // BT already NOT ignore Wlan active, do nothing here. if(!bWifiConnected) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n")); halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); } } } +#if(BT_AUTO_REPORT_ONLY_8821A_2ANT == 0) if( (pCoexSta->btInfoExt & BIT4) ) { // BT auto report already enabled, do nothing @@ -3956,78 +4555,95 @@ EXhalbtc8821a2ant_BtInfoNotify( { halbtc8821a2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE); } +#endif } - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + // check BIT2 first ==> check if bt is under inquiry or page scan if(btInfo & BT_INFO_8821A_2ANT_B_INQ_PAGE) - { pCoexSta->bC2hBtInquiryPage = TRUE; - pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_NON_IDLE; - } else - { pCoexSta->bC2hBtInquiryPage = FALSE; - if(btInfo == 0x1) // connection exists but no busy - { - pCoexSta->bBtLinkExist = TRUE; - pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE; - } - else if(btInfo & BT_INFO_8821A_2ANT_B_CONNECTION) // connection exists and some link is busy - { - pCoexSta->bBtLinkExist = TRUE; - if(btInfo & BT_INFO_8821A_2ANT_B_FTP) - pCoexSta->bPanExist = TRUE; - else - pCoexSta->bPanExist = FALSE; - if(btInfo & BT_INFO_8821A_2ANT_B_A2DP) - pCoexSta->bA2dpExist = TRUE; - else - pCoexSta->bA2dpExist = FALSE; - if(btInfo & BT_INFO_8821A_2ANT_B_HID) - pCoexSta->bHidExist = TRUE; - else - pCoexSta->bHidExist = FALSE; - if(btInfo & BT_INFO_8821A_2ANT_B_SCO_ESCO) - pCoexSta->bScoExist = TRUE; - else - pCoexSta->bScoExist = FALSE; - pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_NON_IDLE; - } + + // set link exist status + if(!(btInfo&BT_INFO_8821A_2ANT_B_CONNECTION)) + { + pCoexSta->bBtLinkExist = FALSE; + pCoexSta->bPanExist = FALSE; + pCoexSta->bA2dpExist = FALSE; + pCoexSta->bHidExist = FALSE; + pCoexSta->bScoExist = FALSE; + } + else // connection exists + { + pCoexSta->bBtLinkExist = TRUE; + if(btInfo & BT_INFO_8821A_2ANT_B_FTP) + pCoexSta->bPanExist = TRUE; else - { - pCoexSta->bBtLinkExist = FALSE; pCoexSta->bPanExist = FALSE; + if(btInfo & BT_INFO_8821A_2ANT_B_A2DP) + pCoexSta->bA2dpExist = TRUE; + else pCoexSta->bA2dpExist = FALSE; + if(btInfo & BT_INFO_8821A_2ANT_B_HID) + pCoexSta->bHidExist = TRUE; + else pCoexSta->bHidExist = FALSE; + if(btInfo & BT_INFO_8821A_2ANT_B_SCO_ESCO) + pCoexSta->bScoExist = TRUE; + else pCoexSta->bScoExist = FALSE; - pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_IDLE; - } - - if(bBtHsOn) + + if ( (pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) && (pCoexSta->bScoExist == FALSE)) { - pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_NON_IDLE; + if (pCoexSta->highPriorityTx + pCoexSta->highPriorityRx >= 160) + pCoexSta->bHidExist = TRUE; } } - if(BT_8821A_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) + halbtc8821a2ant_UpdateBtLinkInfo(pBtCoexist); + + if(!(btInfo&BT_INFO_8821A_2ANT_B_CONNECTION)) { - bBtBusy = TRUE; + pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); + } + else if(btInfo == BT_INFO_8821A_2ANT_B_CONNECTION) // connection exists but no busy + { + pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); + } + else if((btInfo&BT_INFO_8821A_2ANT_B_SCO_ESCO) || + (btInfo&BT_INFO_8821A_2ANT_B_SCO_BUSY)) + { + pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_SCO_BUSY; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); + } + else if(btInfo&BT_INFO_8821A_2ANT_B_ACL_BUSY) + { + pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_ACL_BUSY; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); } else { - bBtBusy = FALSE; + pCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_MAX; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); } - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy); - - if(BT_8821A_2ANT_BT_STATUS_IDLE != pCoexDm->btStatus) + + if( (BT_8821A_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || + (BT_8821A_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || + (BT_8821A_2ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) { + bBtBusy = TRUE; bLimitedDig = TRUE; } else { + bBtBusy = FALSE; bLimitedDig = FALSE; } + + pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy); + pCoexDm->bLimitedDig = bLimitedDig; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig); @@ -4039,9 +4655,13 @@ EXhalbtc8821a2ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); + halbtc8821a2ant_WifiOffHwCfg(pBtCoexist); + //remove due to interrupt is disabled that polling c2h will fail and delay 100ms. + //pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0 halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); } @@ -4051,16 +4671,18 @@ EXhalbtc8821a2ant_PnpNotify( IN u1Byte pnpState ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify\n")); if(BTC_WIFI_PNP_SLEEP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n")); - halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to SLEEP\n")); } else if(BTC_WIFI_PNP_WAKE_UP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to WAKE UP\n")); + halbtc8821a2ant_InitHwConfig(pBtCoexist, FALSE); + halbtc8821a2ant_InitCoexDm(pBtCoexist); + halbtc8821a2ant_QueryBtInfo(pBtCoexist); } } @@ -4069,31 +4691,48 @@ EXhalbtc8821a2ant_Periodical( IN PBTC_COEXIST pBtCoexist ) { - static u1Byte disVerInfoCnt=0; + //static u1Byte disVerInfoCnt=0; u4Byte fwVer=0, btPatchVer=0; PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); - if(disVerInfoCnt <= 5) + if(pCoexSta->disVerInfoCnt <= 5) { - disVerInfoCnt += 1; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \ + pCoexSta->disVerInfoCnt += 1; + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", GLCoexVerDate8821a2Ant, GLCoexVer8821a2Ant, fwVer, btPatchVer, btPatchVer)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + + if (pCoexSta->disVerInfoCnt == 3) + { + //Antenna config to set 0x765 = 0x0 (GNT_BT control by PTA) after initial + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Set GNT_BT control by PTA\n")); + halbtc8821a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, FALSE, FALSE); + } } - halbtc8821a2ant_QueryBtInfo(pBtCoexist); - halbtc8821a2ant_MonitorBtCtr(pBtCoexist); +#if(BT_AUTO_REPORT_ONLY_8821A_2ANT == 0) + halbtc8821a2ant_QueryBtInfo(pBtCoexist); halbtc8821a2ant_MonitorBtEnableDisable(pBtCoexist); +#else + halbtc8821a2ant_MonitorBtCtr(pBtCoexist); + halbtc8821a2ant_MonitorWiFiCtr(pBtCoexist); + + if( halbtc8821a2ant_IsWifiStatusChanged(pBtCoexist) || + pCoexDm->bAutoTdmaAdjust) + { + halbtc8821a2ant_RunCoexistMechanism(pBtCoexist); + } +#endif } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h index 3da55176f5ba..6b465e33ecd1 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h @@ -1,6 +1,9 @@ //=========================================== // The following is for 8821A 2Ant BT Co-exist definition //=========================================== +#define BT_AUTO_REPORT_ONLY_8821A_2ANT 1 + + #define BT_INFO_8821A_2ANT_B_FTP BIT7 #define BT_INFO_8821A_2ANT_B_A2DP BIT6 #define BT_INFO_8821A_2ANT_B_HID BIT5 @@ -12,6 +15,10 @@ #define BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT 2 + +#define BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES 42 //WiFi RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation +#define BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES 46 //BT RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation + typedef enum _BT_INFO_SRC_8821A_2ANT{ BT_INFO_SRC_8821A_2ANT_WIFI_FW = 0x0, BT_INFO_SRC_8821A_2ANT_BT_RSP = 0x1, @@ -20,9 +27,12 @@ typedef enum _BT_INFO_SRC_8821A_2ANT{ }BT_INFO_SRC_8821A_2ANT,*PBT_INFO_SRC_8821A_2ANT; typedef enum _BT_8821A_2ANT_BT_STATUS{ - BT_8821A_2ANT_BT_STATUS_IDLE = 0x0, - BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1, - BT_8821A_2ANT_BT_STATUS_NON_IDLE = 0x2, + BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0, + BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1, + BT_8821A_2ANT_BT_STATUS_INQ_PAGE = 0x2, + BT_8821A_2ANT_BT_STATUS_ACL_BUSY = 0x3, + BT_8821A_2ANT_BT_STATUS_SCO_BUSY = 0x4, + BT_8821A_2ANT_BT_STATUS_ACL_SCO_BUSY = 0x5, BT_8821A_2ANT_BT_STATUS_MAX }BT_8821A_2ANT_BT_STATUS,*PBT_8821A_2ANT_BT_STATUS; @@ -43,8 +53,8 @@ typedef enum _BT_8821A_2ANT_COEX_ALGO{ typedef struct _COEX_DM_8821A_2ANT{ // fw mechanism - BOOLEAN bPreDecBtPwr; - BOOLEAN bCurDecBtPwr; + u1Byte preBtDecPwrLvl; + u1Byte curBtDecPwrLvl; u1Byte preFwDacSwingLvl; u1Byte curFwDacSwingLvl; BOOLEAN bCurIgnoreWlanAct; @@ -54,6 +64,7 @@ typedef struct _COEX_DM_8821A_2ANT{ u1Byte psTdmaPara[5]; u1Byte psTdmaDuAdjType; BOOLEAN bResetTdmaAdjust; + BOOLEAN bAutoTdmaAdjust; BOOLEAN bPrePsTdmaOn; BOOLEAN bCurPsTdmaOn; BOOLEAN bPreBtAutoReport; @@ -88,9 +99,17 @@ typedef struct _COEX_DM_8821A_2ANT{ u1Byte curAlgorithm; u1Byte btStatus; u1Byte wifiChnlInfo[3]; + + BOOLEAN bNeedRecover0x948; + u4Byte backup0x948; + + u1Byte preLps; + u1Byte curLps; + u1Byte preRpwm; + u1Byte curRpwm; } COEX_DM_8821A_2ANT, *PCOEX_DM_8821A_2ANT; -typedef struct _COEX_STA_8821A_2ANT{ +typedef struct _COEX_STA_8821A_2ANT{ BOOLEAN bBtLinkExist; BOOLEAN bScoExist; BOOLEAN bA2dpExist; @@ -104,14 +123,31 @@ typedef struct _COEX_STA_8821A_2ANT{ u4Byte lowPriorityTx; u4Byte lowPriorityRx; u1Byte btRssi; + BOOLEAN bBtTxRxMask; u1Byte preBtRssiState; u1Byte preWifiRssiState[4]; BOOLEAN bC2hBtInfoReqSent; u1Byte btInfoC2h[BT_INFO_SRC_8821A_2ANT_MAX][10]; u4Byte btInfoC2hCnt[BT_INFO_SRC_8821A_2ANT_MAX]; + BOOLEAN bBtWhckTest; BOOLEAN bC2hBtInquiryPage; u1Byte btRetryCnt; u1Byte btInfoExt; + + u4Byte nCRCOK_CCK; + u4Byte nCRCOK_11g; + u4Byte nCRCOK_11n; + u4Byte nCRCOK_11nAgg; + + u4Byte nCRCErr_CCK; + u4Byte nCRCErr_11g; + u4Byte nCRCErr_11n; + u4Byte nCRCErr_11nAgg; + + u1Byte nCoexTableType; + BOOLEAN bForceLpsOn; + + u1Byte disVerInfoCnt; }COEX_STA_8821A_2ANT, *PCOEX_STA_8821A_2ANT; //=========================================== @@ -122,6 +158,10 @@ EXhalbtc8821a2ant_PowerOnSetting( IN PBTC_COEXIST pBtCoexist ); VOID +EXhalbtc8821a2ant_PreLoadFirmware( + IN PBTC_COEXIST pBtCoexist + ); +VOID EXhalbtc8821a2ant_InitHwConfig( IN PBTC_COEXIST pBtCoexist, IN BOOLEAN bWifiOnly diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c index 824b8fbb0f69..bd60df4ebb24 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c @@ -1,7 +1,7 @@ //============================================================ // Description: // -// This file is for RTL8821A_CSR Co-exist mechanism +// This file is for RTL8821A_CSR_CSR Co-exist mechanism // // History // 2012/08/22 Cosa first check in. @@ -14,6 +14,10 @@ //============================================================ #include "Mp_Precomp.h" +#if WPP_SOFTWARE_TRACE +#include "HalBtcCsr8821a2Ant.tmh" +#endif + #define _BTCOEX_CSR 1 #ifndef rtw_warn_on @@ -35,8 +39,8 @@ const char *const GLBtInfoSrc8821aCsr2Ant[]={ "BT Info[bt auto report]", }; -u4Byte GLCoexVerDate8821aCsr2Ant=20130618; -u4Byte GLCoexVer8821aCsr2Ant=0x5050; +u4Byte GLCoexVerDate8821aCsr2Ant=20140901; +u4Byte GLCoexVer8821aCsr2Ant=0x51; //============================================================ // local function proto type if needed @@ -64,12 +68,10 @@ halbtc8821aCsr2ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else @@ -77,12 +79,10 @@ halbtc8821aCsr2ant_BtRssiState( if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -90,7 +90,7 @@ halbtc8821aCsr2ant_BtRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Rssi thresh error!!\n")); return pCoexSta->preBtRssiState; } @@ -100,12 +100,10 @@ halbtc8821aCsr2ant_BtRssiState( if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT)) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n")); } } else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || @@ -114,17 +112,14 @@ halbtc8821aCsr2ant_BtRssiState( if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT)) { btRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n")); } else if(btRssi < rssiThresh) { btRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n")); } } else @@ -132,12 +127,10 @@ halbtc8821aCsr2ant_BtRssiState( if(btRssi < rssiThresh1) { btRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n")); } else { btRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n")); } } } @@ -169,12 +162,10 @@ halbtc8821aCsr2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else @@ -182,12 +173,10 @@ halbtc8821aCsr2ant_WifiRssiState( if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -195,7 +184,7 @@ halbtc8821aCsr2ant_WifiRssiState( { if(rssiThresh > rssiThresh1) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); return pCoexSta->preWifiRssiState[index]; } @@ -205,12 +194,10 @@ halbtc8821aCsr2ant_WifiRssiState( if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT)) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n")); } } else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || @@ -219,17 +206,14 @@ halbtc8821aCsr2ant_WifiRssiState( if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT)) { wifiRssiState = BTC_RSSI_STATE_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n")); } else if(wifiRssi < rssiThresh) { wifiRssiState = BTC_RSSI_STATE_LOW; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n")); } } else @@ -237,12 +221,10 @@ halbtc8821aCsr2ant_WifiRssiState( if(wifiRssi < rssiThresh1) { wifiRssiState = BTC_RSSI_STATE_MEDIUM; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n")); } else { wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n")); } } } @@ -282,23 +264,23 @@ halbtc8821aCsr2ant_MonitorBtEnableDisable( btDisableCnt = 0; bBtDisabled = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); } else { btDisableCnt++; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); if(btDisableCnt >= 2) { bBtDisabled = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); } } if(bPreBtDisabled != bBtDisabled) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), (bBtDisabled ? "disabled":"enabled"))); bPreBtDisabled = bBtDisabled; @@ -336,9 +318,9 @@ halbtc8821aCsr2ant_MonitorBtCtr( pCoexSta->lowPriorityTx = regLPTx; pCoexSta->lowPriorityRx = regLPRx; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx)); // reset counter @@ -559,7 +541,7 @@ halbtc8821aCsr2ant_QueryBtInfo( H2C_Parameter[0] |= BIT0; // trigger - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", H2C_Parameter[0])); rtw_warn_on(_BTCOEX_CSR); @@ -587,7 +569,7 @@ halbtc8821aCsr2ant_ActionAlgorithm( if(!pStackInfo->bBtLinkExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No profile exists!!!\n")); return algorithm; } @@ -604,31 +586,31 @@ halbtc8821aCsr2ant_ActionAlgorithm( { if(pStackInfo->bScoExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO only\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO; } else { if(pStackInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID only\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID; } else if(pStackInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP only\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP; } else if(pStackInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(HS) only\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(EDR) only\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR; } } @@ -640,24 +622,24 @@ halbtc8821aCsr2ant_ActionAlgorithm( { if(pStackInfo->bHidExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } else if(pStackInfo->bA2dpExist) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP ==> SCO\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } else if(pStackInfo->bPanExist) { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(HS)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(EDR)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -669,12 +651,12 @@ halbtc8821aCsr2ant_ActionAlgorithm( { if(pStackInfo->numOfHid >= 2) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID*2 + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID*2 + A2DP\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP; } } @@ -683,12 +665,12 @@ halbtc8821aCsr2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(HS)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(EDR)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -697,12 +679,12 @@ halbtc8821aCsr2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(HS)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(EDR)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP; } } @@ -715,7 +697,7 @@ halbtc8821aCsr2ant_ActionAlgorithm( if( pStackInfo->bHidExist && pStackInfo->bA2dpExist ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } else if( pStackInfo->bHidExist && @@ -723,12 +705,12 @@ halbtc8821aCsr2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(HS)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(EDR)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -737,12 +719,12 @@ halbtc8821aCsr2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -755,12 +737,12 @@ halbtc8821aCsr2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(HS)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR; } } @@ -776,12 +758,12 @@ halbtc8821aCsr2ant_ActionAlgorithm( { if(bBtHsOn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID; } } @@ -816,7 +798,7 @@ halbtc8821aCsr2ant_NeedToDecBtPwr( { if(btHsRssi > 37) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Need to decrease bt power for HS mode!!\n")); bRet = TRUE; } } @@ -826,7 +808,7 @@ halbtc8821aCsr2ant_NeedToDecBtPwr( (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n")); bRet = TRUE; } } @@ -847,8 +829,8 @@ halbtc8821aCsr2ant_SetFwDacSwingLevel( // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 H2C_Parameter[0] = dacSwingLvl; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0])); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter); } @@ -868,7 +850,7 @@ halbtc8821aCsr2ant_SetFwDecBtPwr( H2C_Parameter[0] |= BIT1; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n", (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0])); rtw_warn_on(_BTCOEX_CSR); @@ -882,15 +864,12 @@ halbtc8821aCsr2ant_DecBtPwr( IN BOOLEAN bDecBtPwr ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s Dec BT power = %s\n", (bForceExec? "force to":""), ((bDecBtPwr)? "ON":"OFF"))); pCoexDm->bCurDecBtPwr = bDecBtPwr; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n", - pCoexDm->bPreDecBtPwr, pCoexDm->bCurDecBtPwr)); - if(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr) return; } @@ -916,7 +895,7 @@ halbtc8821aCsr2ant_SetBtAutoReport( H2C_Parameter[0] |= BIT0; } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0])); rtw_warn_on(_BTCOEX_CSR); @@ -930,15 +909,12 @@ halbtc8821aCsr2ant_BtAutoReport( IN BOOLEAN bEnableAutoReport ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); pCoexDm->bCurBtAutoReport = bEnableAutoReport; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", - pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport)); - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) return; } @@ -954,15 +930,12 @@ halbtc8821aCsr2ant_FwDacSwingLvl( IN u1Byte fwDacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set FW Dac Swing level = %d\n", (bForceExec? "force to":""), fwDacSwingLvl)); pCoexDm->curFwDacSwingLvl = fwDacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", - pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); - if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) return; } @@ -981,7 +954,7 @@ halbtc8821aCsr2ant_SetSwRfRxLpfCorner( if(bRxRfShrinkOn) { //Shrink RF Rx LPF corner - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc); } else @@ -990,7 +963,7 @@ halbtc8821aCsr2ant_SetSwRfRxLpfCorner( // After initialized, we can use pCoexDm->btRf0x1eBackup if(pBtCoexist->bInitilized) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup); } } @@ -1003,15 +976,12 @@ halbtc8821aCsr2ant_RfShrink( IN BOOLEAN bRxRfShrinkOn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Rx RF Shrink = %s\n", (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF"))); pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", - pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); - if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) return; } @@ -1039,7 +1009,7 @@ halbtc8821aCsr2ant_SetSwPenaltyTxRateAdaptive( H2C_Parameter[5] = 0xf9; //MCS5 or OFDM36 } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set WiFi Low-Penalty Retry: %s", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", (bLowPenaltyRa? "ON!!":"OFF!!") )); pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); @@ -1052,15 +1022,12 @@ halbtc8821aCsr2ant_LowPenaltyRa( IN BOOLEAN bLowPenaltyRa ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) return; } @@ -1077,7 +1044,7 @@ halbtc8821aCsr2ant_SetDacSwingReg( { u1Byte val=(u1Byte)level; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc5b, 0x3e, val); } @@ -1107,17 +1074,13 @@ halbtc8821aCsr2ant_DacSwing( IN u4Byte dacSwingLvl ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n", (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl)); pCoexDm->bCurDacSwingOn = bDacSwingOn; pCoexDm->curDacSwingLvl = dacSwingLvl; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", - pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl, - pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl)); - if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) && (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) ) return; @@ -1137,12 +1100,12 @@ halbtc8821aCsr2ant_SetAdcBackOff( { if(bAdcBackOff) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level On!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x3); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level Off!\n")); pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x1); } } @@ -1154,15 +1117,12 @@ halbtc8821aCsr2ant_AdcBackOff( IN BOOLEAN bAdcBackOff ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn AdcBackOff = %s\n", (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF"))); pCoexDm->bCurAdcBackOff = bAdcBackOff; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", - pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff)); - if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) return; } @@ -1182,14 +1142,14 @@ halbtc8821aCsr2ant_SetAgcTable( pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000); if(bAgcTableEn) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table On!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28F4B); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x10AB2); rssiAdjustVal = 8; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Agc Table Off!\n")); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x2884B); pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x104B2); } @@ -1206,15 +1166,12 @@ halbtc8821aCsr2ant_AgcTable( IN BOOLEAN bAgcTableEn ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s %s Agc Table\n", (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable"))); pCoexDm->bCurAgcTableEn = bAgcTableEn; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", - pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn)); - if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) return; } @@ -1232,16 +1189,16 @@ halbtc8821aCsr2ant_SetCoexTable( IN u1Byte val0x6cc ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); } @@ -1255,7 +1212,7 @@ halbtc8821aCsr2ant_CoexTable( IN u1Byte val0x6cc ) { - 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", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc)); pCoexDm->curVal0x6c0 = val0x6c0; pCoexDm->curVal0x6c4 = val0x6c4; @@ -1264,11 +1221,6 @@ halbtc8821aCsr2ant_CoexTable( if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", - pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", - pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc)); - if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && @@ -1296,7 +1248,7 @@ halbtc8821aCsr2ant_SetFwIgnoreWlanAct( H2C_Parameter[0] |= BIT0; // function enable } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", H2C_Parameter[0])); rtw_warn_on(_BTCOEX_CSR); @@ -1310,15 +1262,12 @@ halbtc8821aCsr2ant_IgnoreWlanAct( IN BOOLEAN bEnable ) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); pCoexDm->bCurIgnoreWlanAct = bEnable; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) return; } @@ -1353,7 +1302,7 @@ halbtc8821aCsr2ant_SetFwPstdma( pCoexDm->psTdmaPara[4] = byte5; pCoexDm->psTdmaPara[5] = 0x01; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(6bytes)=0x%x%08x%02x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x60(6bytes)=0x%x%08x%02x\n", H2C_Parameter[0], H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4], H2C_Parameter[5])); @@ -1462,18 +1411,13 @@ halbtc8821aCsr2ant_PsTdma( BOOLEAN bTurnOnByCnt=FALSE; u1Byte psTdmaTypeByCnt=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type)); pCoexDm->bCurPsTdmaOn = bTurnOn; pCoexDm->curPsTdma = type; if(!bForceExec) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", - pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", - pCoexDm->prePsTdma, pCoexDm->curPsTdma)); - if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) return; @@ -1652,7 +1596,7 @@ halbtc8821aCsr2ant_IsCommonAction( bLowPwrDisable = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT IPS!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi IPS + BT IPS!!\n")); halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); @@ -1674,12 +1618,12 @@ halbtc8821aCsr2ant_IsCommonAction( if(bWifiBusy) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT IPS!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Busy + BT IPS!!\n")); halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT IPS!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi LPS + BT IPS!!\n")); halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); } @@ -1699,7 +1643,7 @@ halbtc8821aCsr2ant_IsCommonAction( bLowPwrDisable = TRUE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT LPS!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi IPS + BT LPS!!\n")); halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); @@ -1720,12 +1664,12 @@ halbtc8821aCsr2ant_IsCommonAction( if(bWifiBusy) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT LPS!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Busy + BT LPS!!\n")); halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT LPS!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi LPS + BT LPS!!\n")); halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); } @@ -1745,9 +1689,10 @@ halbtc8821aCsr2ant_IsCommonAction( bLowPwrDisable = FALSE; pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi IPS + BT Busy!!\n")); - halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + //halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); + halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE); @@ -1765,12 +1710,12 @@ halbtc8821aCsr2ant_IsCommonAction( if(bWifiBusy) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Busy + BT Busy!!\n")); bCommon = FALSE; } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT Busy!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi LPS + BT Busy!!\n")); halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21); if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist)) @@ -1801,12 +1746,12 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration u1Byte retryCount=0; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjust()\n")); if(pCoexDm->bResetTdmaAdjust) { pCoexDm->bResetTdmaAdjust = FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); { if(bScoHid) { @@ -1919,8 +1864,8 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( { //accquire the BT TRx retry count from BT_Info byte2 retryCount = pCoexSta->btRetryCnt; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount)); - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], retryCount = %d\n", retryCount)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", up, dn, m, n, WaitCount)); result = 0; WaitCount++; @@ -1940,7 +1885,7 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( up = 0; dn = 0; result = 1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); } } else if (retryCount <= 3) // <=3 retry in the last 2-second duration @@ -1966,7 +1911,7 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n")); } } else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration @@ -1984,15 +1929,15 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( dn = 0; WaitCount = 0; result = -1; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n")); } - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval)); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval)); if(maxInterval == 1) { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 71) { @@ -2109,7 +2054,7 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71); @@ -2233,7 +2178,7 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); @@ -2343,7 +2288,7 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); @@ -2456,7 +2401,7 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( { if(bTxPause) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); if(pCoexDm->curPsTdma == 1) { halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); @@ -2566,7 +2511,7 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n")); + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); if(pCoexDm->curPsTdma == 5) { halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); @@ -2682,7 +2627,7 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) { BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); @@ -2695,7 +2640,7 @@ halbtc8821aCsr2ant_TdmaDurationAdjust( } else { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); } } @@ -3668,7 +3613,7 @@ halbtc8821aCsr2ant_RunCoexistMechanism( if(pBtCoexist->bManualControl) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Manual control!!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Manual control!!!\n")); return; } @@ -3676,7 +3621,7 @@ halbtc8821aCsr2ant_RunCoexistMechanism( if(bWifiUnder5G) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n")); halbtc8821aCsr2ant_CoexUnder5G(pBtCoexist); return; } @@ -3686,71 +3631,71 @@ halbtc8821aCsr2ant_RunCoexistMechanism( algorithm = halbtc8821aCsr2ant_ActionAlgorithm(pBtCoexist); if(pCoexSta->bC2hBtInquiryPage && (BT_8821A_CSR_2ANT_COEX_ALGO_PANHS!=algorithm)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under inquiry/page scan !!\n")); halbtc8821aCsr2ant_BtInquiryPage(pBtCoexist); return; } pCoexDm->curAlgorithm = algorithm; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); if(halbtc8821aCsr2ant_IsCommonAction(pBtCoexist)) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant common.\n")); pCoexDm->bResetTdmaAdjust = TRUE; } else { if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", pCoexDm->preAlgorithm, pCoexDm->curAlgorithm)); pCoexDm->bResetTdmaAdjust = TRUE; } switch(pCoexDm->curAlgorithm) { case BT_8821A_CSR_2ANT_COEX_ALGO_SCO: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n")); halbtc8821aCsr2ant_ActionSco(pBtCoexist); break; case BT_8821A_CSR_2ANT_COEX_ALGO_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); halbtc8821aCsr2ant_ActionHid(pBtCoexist); break; case BT_8821A_CSR_2ANT_COEX_ALGO_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n")); halbtc8821aCsr2ant_ActionA2dp(pBtCoexist); break; case BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n")); halbtc8821aCsr2ant_ActionA2dpPanHs(pBtCoexist); break; case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n")); halbtc8821aCsr2ant_ActionPanEdr(pBtCoexist); break; case BT_8821A_CSR_2ANT_COEX_ALGO_PANHS: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n")); halbtc8821aCsr2ant_ActionPanHs(pBtCoexist); break; case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n")); halbtc8821aCsr2ant_ActionPanEdrA2dp(pBtCoexist); break; case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n")); halbtc8821aCsr2ant_ActionPanEdrHid(pBtCoexist); break; case BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n")); halbtc8821aCsr2ant_ActionHidA2dpPanEdr(pBtCoexist); break; case BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); halbtc8821aCsr2ant_ActionHidA2dp(pBtCoexist); break; default: - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n")); halbtc8821aCsr2ant_CoexAllOff(pBtCoexist); break; } @@ -3787,7 +3732,7 @@ EXhalbtc8821aCsr2ant_InitHwConfig( u1Byte H2C_Parameter[2] ={0}; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Init HW Config!!\n")); if(bWifiOnly) return; @@ -3831,7 +3776,7 @@ EXhalbtc8821aCsr2ant_InitCoexDm( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); halbtc8821aCsr2ant_InitCoexDm(pBtCoexist); } @@ -4021,13 +3966,13 @@ EXhalbtc8821aCsr2ant_IpsNotify( { if(BTC_IPS_ENTER == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); pCoexSta->bUnderIps = TRUE; halbtc8821aCsr2ant_CoexAllOff(pBtCoexist); } else if(BTC_IPS_LEAVE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); pCoexSta->bUnderIps = FALSE; //halbtc8821aCsr2ant_InitCoexDm(pBtCoexist); } @@ -4041,12 +3986,12 @@ EXhalbtc8821aCsr2ant_LpsNotify( { if(BTC_LPS_ENABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); pCoexSta->bUnderLps = TRUE; } else if(BTC_LPS_DISABLE == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); pCoexSta->bUnderLps = FALSE; } } @@ -4059,11 +4004,11 @@ EXhalbtc8821aCsr2ant_ScanNotify( { if(BTC_SCAN_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); } else if(BTC_SCAN_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); } } @@ -4075,11 +4020,11 @@ EXhalbtc8821aCsr2ant_ConnectNotify( { if(BTC_ASSOCIATE_START == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); } else if(BTC_ASSOCIATE_FINISH == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); } } @@ -4095,11 +4040,11 @@ EXhalbtc8821aCsr2ant_MediaStatusNotify( if(BTC_MEDIA_CONNECT == type) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA disconnect notify\n")); } // only 2.4G we need to inform bt the chnl mask @@ -4121,7 +4066,7 @@ EXhalbtc8821aCsr2ant_MediaStatusNotify( pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1]; pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2]; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n", + RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], FW write 0x66=0x%x\n", H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); rtw_warn_on(_BTCOEX_CSR); @@ -4137,7 +4082,7 @@ EXhalbtc8821aCsr2ant_SpecialPacketNotify( { if(type == BTC_PACKET_DHCP) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); } } @@ -4161,7 +4106,7 @@ EXhalbtc8821aCsr2ant_BtInfoNotify( rspSource = BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW; pCoexSta->btInfoC2hCnt[rspSource]++; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; @@ -4169,11 +4114,11 @@ EXhalbtc8821aCsr2ant_BtInfoNotify( btInfo = tmpBuf[i]; if(i == length-1) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); } else { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i])); + RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); } } @@ -4213,7 +4158,7 @@ EXhalbtc8821aCsr2ant_BtInfoNotify( { if(bWifiConnected) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); } } @@ -4222,7 +4167,7 @@ EXhalbtc8821aCsr2ant_BtInfoNotify( // BT already NOT ignore Wlan active, do nothing here. if(!bWifiConnected) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n")); halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); } } @@ -4335,7 +4280,7 @@ EXhalbtc8821aCsr2ant_HaltNotify( IN PBTC_COEXIST pBtCoexist ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); @@ -4347,16 +4292,16 @@ EXhalbtc8821aCsr2ant_PnpNotify( IN u1Byte pnpState ) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify\n")); if(BTC_WIFI_PNP_SLEEP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to SLEEP\n")); halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); } else if(BTC_WIFI_PNP_WAKE_UP == pnpState) { - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to WAKE UP\n")); } } @@ -4370,21 +4315,21 @@ EXhalbtc8821aCsr2ant_Periodical( PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); if(disVerInfoCnt <= 5) { disVerInfoCnt += 1; - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion)); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer); pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \ + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", GLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer)); - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n")); + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); } //halbtc8821aCsr2ant_QueryBtInfo(pBtCoexist); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h index d74397076ee5..040a790f3b7f 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h @@ -11,10 +11,11 @@ #define BTC_RF_B 0x1 #define BTC_RF_C 0x2 #define BTC_RF_D 0x3 - +#if 0 #define BTC_SMSP SINGLEMAC_SINGLEPHY #define BTC_DMDP DUALMAC_DUALPHY #define BTC_DMSP DUALMAC_SINGLEPHY +#endif #define BTC_MP_UNKNOWN 0xff #define BT_COEX_ANT_TYPE_PG 0 @@ -72,29 +73,6 @@ typedef enum _BTC_CHIP_TYPE{ BTC_CHIP_MAX } BTC_CHIP_TYPE, *PBTC_CHIP_TYPE; -typedef enum _BTC_MSG_TYPE{ - BTC_MSG_INTERFACE = 0x0, - BTC_MSG_ALGORITHM = 0x1, - BTC_MSG_MAX -}BTC_MSG_TYPE; -extern u4Byte GLBtcDbgType[]; - -// following is for BTC_MSG_INTERFACE -#define INTF_INIT BIT0 -#define INTF_NOTIFY BIT2 - -// following is for BTC_ALGORITHM -#define ALGO_BT_RSSI_STATE BIT0 -#define ALGO_WIFI_RSSI_STATE BIT1 -#define ALGO_BT_MONITOR BIT2 -#define ALGO_TRACE BIT3 -#define ALGO_TRACE_FW BIT4 -#define ALGO_TRACE_FW_DETAIL BIT5 -#define ALGO_TRACE_FW_EXEC BIT6 -#define ALGO_TRACE_SW BIT7 -#define ALGO_TRACE_SW_DETAIL BIT8 -#define ALGO_TRACE_SW_EXEC BIT9 - // following is for wifi link status #define WIFI_STA_CONNECTED BIT0 #define WIFI_AP_CONNECTED BIT1 @@ -106,70 +84,18 @@ extern u4Byte GLBtcDbgType[]; #define CL_SPRINTF rsprintf #define CL_PRINTF DCMD_Printf -// The following is for dbgview print -#if DBG -#define BTC_PRINT(dbgtype, dbgflag, printstr)\ -{\ - if (GLBtcDbgType[dbgtype] & dbgflag)\ - {\ - DbgPrint printstr;\ - }\ -} - -#define BTC_PRINT_F(dbgtype, dbgflag, printstr)\ -{\ - if (GLBtcDbgType[dbgtype] & dbgflag)\ - {\ - DbgPrint("%s(): ", __FUNCTION__);\ - DbgPrint printstr;\ - }\ -} - -#define BTC_PRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr)\ -{\ - if (GLBtcDbgType[dbgtype] & dbgflag)\ - {\ - int __i; \ - pu1Byte ptr = (pu1Byte)_Ptr; \ - DbgPrint printstr; \ - DbgPrint(" "); \ - for( __i=0; __i<6; __i++ ) \ - DbgPrint("%02X%s", ptr[__i], (__i==5)?"":"-"); \ - DbgPrint("\n"); \ - }\ -} - -#define BTC_PRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\ -{\ - if (GLBtcDbgType[dbgtype] & dbgflag)\ - {\ - int __i; \ - pu1Byte ptr = (pu1Byte)_HexData; \ - DbgPrint(_TitleString); \ - for( __i=0; __i<(int)_HexDataLen; __i++ ) \ - { \ - DbgPrint("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" ");\ - if (((__i + 1) % 16) == 0) DbgPrint("\n");\ - } \ - DbgPrint("\n"); \ - }\ -} - -#else -#define BTC_PRINT(dbgtype, dbgflag, printstr) -#define BTC_PRINT_F(dbgtype, dbgflag, printstr) -#define BTC_PRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr) -#define BTC_PRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen) -#endif typedef struct _BTC_BOARD_INFO{ // The following is some board information u1Byte btChipType; u1Byte pgAntNum; // pg ant number u1Byte btdmAntNum; // ant number for btdm + u1Byte btdmAntNumByAntDet; // ant number for btdm after antenna detection u1Byte btdmAntPos; //Bryant Add to indicate Antenna Position for (pgAntNum = 2) && (btdmAntNum =1) (DPDT+1Ant case) u1Byte singleAntPath; // current used for 8723b only, 1=>s0, 0=>s1 - //BOOLEAN bBtExist; + u1Byte bTfbgaPackage; //for Antenna detect threshold + u1Byte btdmAntDetFinish; + u1Byte antType; } BTC_BOARD_INFO, *PBTC_BOARD_INFO; typedef enum _BTC_DBG_OPCODE{ @@ -230,6 +156,29 @@ typedef enum _BTC_WIFI_PNP{ BTC_WIFI_PNP_MAX }BTC_WIFI_PNP,*PBTC_WIFI_PNP; +typedef enum _BTC_IOT_PEER +{ + BTC_IOT_PEER_UNKNOWN = 0, + BTC_IOT_PEER_REALTEK = 1, + BTC_IOT_PEER_REALTEK_92SE = 2, + BTC_IOT_PEER_BROADCOM = 3, + BTC_IOT_PEER_RALINK = 4, + BTC_IOT_PEER_ATHEROS = 5, + BTC_IOT_PEER_CISCO = 6, + BTC_IOT_PEER_MERU = 7, + BTC_IOT_PEER_MARVELL = 8, + BTC_IOT_PEER_REALTEK_SOFTAP = 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17 + BTC_IOT_PEER_SELF_SOFTAP = 10, // Self is SoftAP + BTC_IOT_PEER_AIRGO = 11, + BTC_IOT_PEER_INTEL = 12, + BTC_IOT_PEER_RTK_APCLIENT = 13, + BTC_IOT_PEER_REALTEK_81XX = 14, + BTC_IOT_PEER_REALTEK_WOW = 15, + BTC_IOT_PEER_REALTEK_JAGUAR_BCUTAP = 16, + BTC_IOT_PEER_REALTEK_JAGUAR_CCUTAP = 17, + BTC_IOT_PEER_MAX, +}BTC_IOT_PEER, *PBTC_IOT_PEER; + //for 8723b-d cut large current issue typedef enum _BT_WIFI_COEX_STATE{ BTC_WIFI_STAT_INIT, @@ -287,6 +236,7 @@ typedef enum _BTC_GET_TYPE{ BTC_GET_U1_MAC_PHY_MODE, BTC_GET_U1_AP_NUM, BTC_GET_U1_ANT_TYPE, + BTC_GET_U1_IOT_PEER, //===== for 1Ant ====== BTC_GET_U1_LPS_MODE, @@ -490,6 +440,12 @@ typedef VOID IN u4Byte offset, IN u4Byte value ); +typedef BOOLEAN +(*BFP_BTC_SET_BT_ANT_DETECTION)( + IN PVOID pBtcContext, + IN u1Byte txTime, + IN u1Byte btChnl + ); typedef u4Byte (*BFP_BTC_GET_BT_REG)( IN PVOID pBtcContext, @@ -626,6 +582,8 @@ typedef struct _BTC_COEXIST{ BFP_BTC_GET_BT_REG fBtcGetBtReg; BFP_BTC_SET_BT_REG fBtcSetBtReg; + + BFP_BTC_SET_BT_ANT_DETECTION fBtcSetBtAntDetection; } BTC_COEXIST, *PBTC_COEXIST; extern BTC_COEXIST GLBtCoexist; @@ -770,7 +728,7 @@ EXhalbtcoutsrc_DisplayBtCoexInfo( IN PBTC_COEXIST pBtCoexist ); VOID -EXhalbtcoutsrc_DisplayAntIsolation( +EXhalbtcoutsrc_DisplayAntDetection( IN PBTC_COEXIST pBtCoexist ); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/Mp_Precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/Mp_Precomp.h index b1fc17ba1484..d70ae3d10335 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/Mp_Precomp.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/Mp_Precomp.h @@ -39,6 +39,36 @@ #undef bEnable #endif +#define WPP_SOFTWARE_TRACE 0 + +typedef enum _BTC_MSG_COMP_TYPE{ + COMP_COEX = 0, + COMP_MAX +}BTC_MSG_COMP_TYPE; +extern u4Byte GLBtcDbgType[]; + +#define DBG_OFF 0 +#define DBG_SEC 1 +#define DBG_SERIOUS 2 +#define DBG_WARNING 3 +#define DBG_LOUD 4 +#define DBG_TRACE 5 + +#if DBG +#ifdef RT_TRACE +#undef RT_TRACE +#define RT_TRACE(dbgtype, dbgflag, printstr)\ +do {\ + if (GLBtcDbgType[dbgtype] & BIT(dbgflag))\ + {\ + DbgPrint printstr;\ + }\ +} while (0) +#endif +#else +//#define RT_TRACE(dbgtype, dbgflag, printstr) +#endif + #include "HalBtcOutSrc.h" #include "HalBtc8188c2Ant.h" #include "HalBtc8192d2Ant.h" diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalHWImg.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalHWImg.h new file mode 100755 index 000000000000..108f71509129 --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalHWImg.h @@ -0,0 +1,123 @@ +#pragma once +#ifndef __INC_HW_IMG_H +#define __INC_HW_IMG_H + +// +// 2011/03/15 MH Add for different IC HW image file selection. code size consideration. +// +#if RT_PLATFORM == PLATFORM_LINUX + + #if (DEV_BUS_TYPE == RT_PCI_INTERFACE) + // For 92C + #define RTL8192CE_HWIMG_SUPPORT 1 + #define RTL8192CE_TEST_HWIMG_SUPPORT 0 + #define RTL8192CU_HWIMG_SUPPORT 0 + #define RTL8192CU_TEST_HWIMG_SUPPORT 0 + + // For 92D + #define RTL8192DE_HWIMG_SUPPORT 1 + #define RTL8192DE_TEST_HWIMG_SUPPORT 0 + #define RTL8192DU_HWIMG_SUPPORT 0 + #define RTL8192DU_TEST_HWIMG_SUPPORT 0 + + // For 8723 + #define RTL8723E_HWIMG_SUPPORT 1 + #define RTL8723U_HWIMG_SUPPORT 0 + #define RTL8723S_HWIMG_SUPPORT 0 + + //For 88E + #define RTL8188EE_HWIMG_SUPPORT 0 + #define RTL8188EU_HWIMG_SUPPORT 0 + #define RTL8188ES_HWIMG_SUPPORT 0 + + #elif (DEV_BUS_TYPE == RT_USB_INTERFACE) + // For 92C + #define RTL8192CE_HWIMG_SUPPORT 0 + #define RTL8192CE_TEST_HWIMG_SUPPORT 0 + #define RTL8192CU_HWIMG_SUPPORT 1 + #define RTL8192CU_TEST_HWIMG_SUPPORT 0 + + //For 92D + #define RTL8192DE_HWIMG_SUPPORT 0 + #define RTL8192DE_TEST_HWIMG_SUPPORT 0 + #define RTL8192DU_HWIMG_SUPPORT 1 + #define RTL8192DU_TEST_HWIMG_SUPPORT 0 + + // For 8723 + #define RTL8723E_HWIMG_SUPPORT 0 + #define RTL8723U_HWIMG_SUPPORT 1 + #define RTL8723S_HWIMG_SUPPORT 0 + + //For 88E + #define RTL8188EE_HWIMG_SUPPORT 0 + #define RTL8188EU_HWIMG_SUPPORT 0 + #define RTL8188ES_HWIMG_SUPPORT 0 + + #elif (DEV_BUS_TYPE == RT_SDIO_INTERFACE) + // For 92C + #define RTL8192CE_HWIMG_SUPPORT 0 + #define RTL8192CE_TEST_HWIMG_SUPPORT 0 + #define RTL8192CU_HWIMG_SUPPORT 1 + #define RTL8192CU_TEST_HWIMG_SUPPORT 0 + + //For 92D + #define RTL8192DE_HWIMG_SUPPORT 0 + #define RTL8192DE_TEST_HWIMG_SUPPORT 0 + #define RTL8192DU_HWIMG_SUPPORT 1 + #define RTL8192DU_TEST_HWIMG_SUPPORT 0 + + // For 8723 + #define RTL8723E_HWIMG_SUPPORT 0 + #define RTL8723U_HWIMG_SUPPORT 0 + #define RTL8723S_HWIMG_SUPPORT 1 + + //For 88E + #define RTL8188EE_HWIMG_SUPPORT 0 + #define RTL8188EU_HWIMG_SUPPORT 0 + #define RTL8188ES_HWIMG_SUPPORT 0 + #endif + +#else // PLATFORM_WINDOWS & MacOSX + +//For 92C +#define RTL8192CE_HWIMG_SUPPORT 1 +#define RTL8192CE_TEST_HWIMG_SUPPORT 1 +#define RTL8192CU_HWIMG_SUPPORT 1 +#define RTL8192CU_TEST_HWIMG_SUPPORT 1 + +// For 92D +#define RTL8192DE_HWIMG_SUPPORT 1 +#define RTL8192DE_TEST_HWIMG_SUPPORT 1 +#define RTL8192DU_HWIMG_SUPPORT 1 +#define RTL8192DU_TEST_HWIMG_SUPPORT 1 + + #if defined(UNDER_CE) + // For 8723 + #define RTL8723E_HWIMG_SUPPORT 0 + #define RTL8723U_HWIMG_SUPPORT 0 + #define RTL8723S_HWIMG_SUPPORT 1 + + // For 88E + #define RTL8188EE_HWIMG_SUPPORT 0 + #define RTL8188EU_HWIMG_SUPPORT 0 + #define RTL8188ES_HWIMG_SUPPORT 0 + + #else + + // For 8723 + #define RTL8723E_HWIMG_SUPPORT 1 + //#define RTL_8723E_TEST_HWIMG_SUPPORT 1 + #define RTL8723U_HWIMG_SUPPORT 1 + //#define RTL_8723U_TEST_HWIMG_SUPPORT 1 + #define RTL8723S_HWIMG_SUPPORT 1 + //#define RTL_8723S_TEST_HWIMG_SUPPORT 1 + + //For 88E + #define RTL8188EE_HWIMG_SUPPORT 1 + #define RTL8188EU_HWIMG_SUPPORT 1 + #define RTL8188ES_HWIMG_SUPPORT 1 + #endif + +#endif + +#endif //__INC_HW_IMG_H diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalPhyRf.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalPhyRf.c index 3070e792b9f1..caacff139be9 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalPhyRf.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalPhyRf.c @@ -37,12 +37,70 @@ _offset = _size-1;\ } while(0) +#if (RTL8192C_SUPPORT||RTL8192D_SUPPORT||RTL8723A_SUPPORT) +void phydm_txpwrtrack_setpwr_dummy( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath, + u1Byte ChannelMappedIndex + ) +{}; + +void doiqk_dummy( + PDM_ODM_T pDM_Odm, + u1Byte DeltaThermalIndex, + u1Byte ThermalValue, + u1Byte Threshold + ) +{}; + +VOID phy_lccalibrate_dummy( + IN PDM_ODM_T pDM_Odm + ) +{}; + +VOID get_delta_swing_table_dummy( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_A, + OUT pu1Byte *TemperatureDOWN_A, + OUT pu1Byte *TemperatureUP_B, + OUT pu1Byte *TemperatureDOWN_B + ) +{}; + +void configure_txpower_track_dummy( + PTXPWRTRACK_CFG pConfig + ) +{ + + pConfig->ODM_TxPwrTrackSetPwr = phydm_txpwrtrack_setpwr_dummy; + pConfig->DoIQK = doiqk_dummy; + pConfig->PHY_LCCalibrate = phy_lccalibrate_dummy; + pConfig->GetDeltaSwingTable = get_delta_swing_table_dummy; +} +#endif void ConfigureTxpowerTrack( IN PDM_ODM_T pDM_Odm, OUT PTXPWRTRACK_CFG pConfig ) { + +#if RTL8192C_SUPPORT + if(pDM_Odm->SupportICType==ODM_RTL8192C) + configure_txpower_track_dummy(pConfig); +#endif + +#if RTL8192D_SUPPORT + if(pDM_Odm->SupportICType==ODM_RTL8192D) + configure_txpower_track_dummy(pConfig); +#endif + +#if RTL8723A_SUPPORT + if(pDM_Odm->SupportICType==ODM_RTL8723A) + configure_txpower_track_dummy(pConfig); +#endif + #if RTL8192E_SUPPORT if(pDM_Odm->SupportICType==ODM_RTL8192E) ConfigureTxpowerTrack_8192E(pConfig); @@ -65,6 +123,11 @@ void ConfigureTxpowerTrack( ConfigureTxpowerTrack_8723B(pConfig); #endif +#if RTL8814A_SUPPORT + if (pDM_Odm->SupportICType == ODM_RTL8814A) + ConfigureTxpowerTrack_8814A(pConfig); +#endif + } //====================================================================== @@ -82,32 +145,36 @@ ODM_ClearTxPowerTrackingState( { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pDM_Odm->Adapter); u1Byte p = 0; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex; - pDM_Odm->BbSwingIdxCck = pDM_Odm->DefaultCckIndex; + pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex; + pRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->DefaultCckIndex; pDM_Odm->RFCalibrateInfo.CCK_index = 0; for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) { - pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex; - pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->DefaultOfdmIndex; - pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex; - - pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0; - pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0; - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0; - pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0; - - pDM_Odm->Absolute_OFDMSwingIdx[p] = 0; // Initial Mix mode power tracking - pDM_Odm->Remnant_OFDMSwingIdx[p] = 0; + pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex; + pRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->DefaultOfdmIndex; + pRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex; + + pRFCalibrateInfo->PowerIndexOffset[p] = 0; + pRFCalibrateInfo->DeltaPowerIndex[p] = 0; + pRFCalibrateInfo->DeltaPowerIndexLast[p] = 0; + pRFCalibrateInfo->PowerIndexOffset[p] = 0; + + pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = 0; /* Initial Mix mode power tracking*/ + pRFCalibrateInfo->Remnant_OFDMSwingIdx[p] = 0; + pRFCalibrateInfo->KfreeOffset[p] = 0; } - pDM_Odm->Modify_TxAGC_Flag_PathA= FALSE; //Initial at Modify Tx Scaling Mode - pDM_Odm->Modify_TxAGC_Flag_PathB= FALSE; //Initial at Modify Tx Scaling Mode - pDM_Odm->Remnant_CCKSwingIdx= 0; - pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter; - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter; - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter; + pRFCalibrateInfo->Modify_TxAGC_Flag_PathA = FALSE; /*Initial at Modify Tx Scaling Mode*/ + pRFCalibrateInfo->Modify_TxAGC_Flag_PathB = FALSE; /*Initial at Modify Tx Scaling Mode*/ + pRFCalibrateInfo->Modify_TxAGC_Flag_PathC = FALSE; /*Initial at Modify Tx Scaling Mode*/ + pRFCalibrateInfo->Modify_TxAGC_Flag_PathD = FALSE; /*Initial at Modify Tx Scaling Mode*/ + pRFCalibrateInfo->Remnant_CCKSwingIdx = 0; + pRFCalibrateInfo->ThermalValue = pHalData->EEPROMThermalMeter; + pRFCalibrateInfo->ThermalValue_IQK = pHalData->EEPROMThermalMeter; + pRFCalibrateInfo->ThermalValue_LCK = pHalData->EEPROMThermalMeter; } VOID @@ -128,22 +195,29 @@ ODM_TXPowerTrackingCallback_ThermalMeter( PDM_ODM_T pDM_Odm = &pHalData->odmpriv; #endif #endif - + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0; + s1Byte diff_DPK[4] = {0}; u1Byte ThermalValue_AVG_count = 0; u4Byte ThermalValue_AVG = 0; u1Byte OFDM_min_index = 0; // OFDM BB Swing should be less than +3.0dB, which is required by Arthur u1Byte Indexforchannel = 0; // GetRightChnlPlaceforIQK(pHalData->CurrentChannel) + BOOLEAN bTSSIenable = FALSE; TXPWRTRACK_CFG c; - //4 1. The following TWO tables decide the final index of OFDM/CCK swing table. pu1Byte deltaSwingTableIdx_TUP_A; pu1Byte deltaSwingTableIdx_TDOWN_A; pu1Byte deltaSwingTableIdx_TUP_B; pu1Byte deltaSwingTableIdx_TDOWN_B; + /*for 8814 add by Yu Chen*/ + pu1Byte deltaSwingTableIdx_TUP_C; + pu1Byte deltaSwingTableIdx_TDOWN_C; + pu1Byte deltaSwingTableIdx_TUP_D; + pu1Byte deltaSwingTableIdx_TDOWN_D; //4 2. Initilization ( 7 steps in total ) @@ -152,6 +226,11 @@ ODM_TXPowerTrackingCallback_ThermalMeter( (*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_A, (pu1Byte*)&deltaSwingTableIdx_TDOWN_A, (pu1Byte*)&deltaSwingTableIdx_TUP_B, (pu1Byte*)&deltaSwingTableIdx_TDOWN_B); + if (pDM_Odm->SupportICType & ODM_RTL8814A) /*for 8814 path C & D*/ + (*c.GetDeltaSwingTable8814only)(pDM_Odm, (pu1Byte *)&deltaSwingTableIdx_TUP_C, (pu1Byte *)&deltaSwingTableIdx_TDOWN_C, + (pu1Byte *)&deltaSwingTableIdx_TUP_D, (pu1Byte *)&deltaSwingTableIdx_TDOWN_D); + + pDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++; //cosa add for debug pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = TRUE; @@ -167,15 +246,16 @@ ODM_TXPowerTrackingCallback_ThermalMeter( pDM_Odm->RFCalibrateInfo.RegA24 = 0x090e1317; #endif - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("===>ODM_TXPowerTrackingCallback_ThermalMeter, \ - \n pDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase[A]: %d, pDM_Odm->DefaultOfdmIndex: %d\n", - pDM_Odm->BbSwingIdxCckBase, pDM_Odm->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pDM_Odm->DefaultOfdmIndex)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("===>ODM_TXPowerTrackingCallback_ThermalMeter Start\n pRFCalibrateInfo->BbSwingIdxCckBase: %d, pRFCalibrateInfo->BbSwingIdxOfdmBase[A]: %d, pRFCalibrateInfo->DefaultOfdmIndex: %d\n", + pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pRFCalibrateInfo->DefaultOfdmIndex)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("pDM_Odm->RFCalibrateInfo.TxPowerTrackControl %d, pHalData->EEPROMThermalMeter %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl, pHalData->EEPROMThermalMeter)); ThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00); //0x42: RF Reg[15:10] 88E if( ! pDM_Odm->RFCalibrateInfo.TxPowerTrackControl || pHalData->EEPROMThermalMeter == 0 || pHalData->EEPROMThermalMeter == 0xFF) - return; + return; //4 3. Initialize ThermalValues of RFCalibrateInfo @@ -215,7 +295,27 @@ ODM_TXPowerTrackingCallback_ThermalMeter( delta_LCK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK):(pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue); delta_IQK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK):(pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue); + if (pDM_Odm->RFCalibrateInfo.ThermalValue_IQK == 0xff) { /*no PG, use thermal value for IQK*/ + pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = ThermalValue; + delta_IQK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK):(pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, use ThermalValue for IQK\n")); + } + + for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) + diff_DPK[p] = (s1Byte)ThermalValue - (s1Byte)pDM_Odm->RFCalibrateInfo.DpkThermal[p]; + + /*4 6. If necessary, do LCK.*/ + + if (pDM_Odm->RFCalibrateInfo.ThermalValue_LCK == 0xff) { /*no PG , do LCK at initial status*/ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, do LCK\n")); + pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue; + if (c.PHY_LCCalibrate) + (*c.PHY_LCCalibrate)(pDM_Odm); + delta_LCK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK):(pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n", delta, delta_LCK, delta_IQK)); + /*DBG_871X("(delta, delta_LCK, delta_IQK) = (%d, %d, %d), %d\n", delta, delta_LCK, delta_IQK, c.Threshold_IQK);*/ //4 6. If necessary, do LCK. @@ -247,83 +347,125 @@ ODM_TXPowerTrackingCallback_ThermalMeter( #else if(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) { #endif - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("deltaSwingTableIdx_TUP_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta])); - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A]; - pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] = deltaSwingTableIdx_TUP_A[delta]; + for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) { + pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p]; /* recording power index offset */ + switch (p) { + case ODM_RF_PATH_B: + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("deltaSwingTableIdx_TUP_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta])); - pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = deltaSwingTableIdx_TUP_A[delta]; // Record delta swing for mix mode power tracking + pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_B[delta]; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_B[delta]; /* Record delta swing for mix mode power tracking */ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A])); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A])); - if(c.RfPathCount > 1) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("deltaSwingTableIdx_TUP_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta])); - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B]; - pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] = deltaSwingTableIdx_TUP_B[delta]; - pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = deltaSwingTableIdx_TUP_B[delta]; // Record delta swing for mix mode power tracking + break; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B])); - } + case ODM_RF_PATH_C: + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("deltaSwingTableIdx_TUP_C[%d] = %d\n", delta, deltaSwingTableIdx_TUP_C[delta])); - } - else { + pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_C[delta]; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_C[delta]; /* Record delta swing for mix mode power tracking */ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); + break; + + case ODM_RF_PATH_D: + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("deltaSwingTableIdx_TUP_D[%d] = %d\n", delta, deltaSwingTableIdx_TUP_D[delta])); + + pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_D[delta]; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_D[delta]; /* Record delta swing for mix mode power tracking */ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); + break; + + default: + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("deltaSwingTableIdx_TUP_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta])); + + pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_A[delta]; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_A[delta]; /* Record delta swing for mix mode power tracking */ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); + break; + } + } + } else { + for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) { + pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p]; /* recording poer index offset */ + switch (p) { + case ODM_RF_PATH_B: + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("deltaSwingTableIdx_TDOWN_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta])); + pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta]; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta]; /* Record delta swing for mix mode power tracking */ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); + break; + + case ODM_RF_PATH_C: + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("deltaSwingTableIdx_TDOWN_C[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_C[delta])); + pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta]; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta]; /* Record delta swing for mix mode power tracking */ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); + break; + + case ODM_RF_PATH_D: + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("deltaSwingTableIdx_TDOWN_D[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_D[delta])); + pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta]; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta]; /* Record delta swing for mix mode power tracking */ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); + break; + + default: + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("deltaSwingTableIdx_TDOWN_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta])); + pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta]; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta]; /* Record delta swing for mix mode power tracking */ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); + break; + } + } + } + + for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("deltaSwingTableIdx_TDOWN_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta])); - - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A]; - pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] = -1 * deltaSwingTableIdx_TDOWN_A[delta]; - - pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = -1 * deltaSwingTableIdx_TDOWN_A[delta]; // Record delta swing for mix mode power tracking - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A])); + ("\n\n=========================== [Path-%d] Calculating PowerIndexOffset===========================\n", p)); + if (pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] == pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]) /* If Thermal value changes but lookup table value still the same */ + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0; + else + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]; /* Power Index Diff between 2 times Power Tracking */ - if(c.RfPathCount > 1) - { ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("deltaSwingTableIdx_TDOWN_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta])); - - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B]; - pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] = -1 * deltaSwingTableIdx_TDOWN_B[delta]; + ("[Path-%d] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n", p, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p], pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p])); + + pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pRFCalibrateInfo->BbSwingIdxOfdmBase[p] + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]; + pDM_Odm->RFCalibrateInfo.CCK_index = pRFCalibrateInfo->BbSwingIdxCckBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]; - pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = -1 * deltaSwingTableIdx_TDOWN_B[delta]; // Record delta swing for mix mode power tracking + pRFCalibrateInfo->BbSwingIdxCck = pDM_Odm->RFCalibrateInfo.CCK_index; + pRFCalibrateInfo->BbSwingIdxOfdm[p] = pDM_Odm->RFCalibrateInfo.OFDM_index[p]; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B])); - } - } - - for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("\n\n================================ [Path-%c] Calculating PowerIndexOffset ================================\n", (p == ODM_RF_PATH_A ? 'A' : 'B'))); - - if (pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] == pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]) // If Thermal value changes but lookup table value still the same - pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0; - else - pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]; // Power Index Diff between 2 times Power Tracking - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n", - (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p], - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p])); - - pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->BbSwingIdxOfdmBase[p] + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]; - pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->BbSwingIdxCckBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]; - pDM_Odm->BbSwingIdxCck = pDM_Odm->RFCalibrateInfo.CCK_index; - pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->RFCalibrateInfo.OFDM_index[p]; - // *************Print BB Swing Base and Index Offset************* + /* *************Print BB Swing Base and Index Offset************* */ - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n", - pDM_Odm->BbSwingIdxCck, pDM_Odm->BbSwingIdxCckBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p])); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n", - pDM_Odm->BbSwingIdxOfdm[p], (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->BbSwingIdxOfdmBase[p], pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p])); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxCck, pRFCalibrateInfo->BbSwingIdxCckBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p])); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("The 'OFDM' final index(%d) = BaseIndex[%d](%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxOfdm[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p], pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p])); //4 7.1 Handle boundary conditions of index. - if(pDM_Odm->RFCalibrateInfo.OFDM_index[p] > c.SwingTableSize_OFDM-1) { pDM_Odm->RFCalibrateInfo.OFDM_index[p] = c.SwingTableSize_OFDM-1; @@ -333,35 +475,38 @@ ODM_TXPowerTrackingCallback_ThermalMeter( pDM_Odm->RFCalibrateInfo.OFDM_index[p] = OFDM_min_index; } } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("\n\n========================================================================================================\n")); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("\n\n========================================================================================================\n")); if(pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1) pDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1; - //else if (pDM_Odm->RFCalibrateInfo.CCK_index < 0) - //pDM_Odm->RFCalibrateInfo.CCK_index = 0; - } - else - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + else if (pDM_Odm->RFCalibrateInfo.CCK_index <= 0) + pDM_Odm->RFCalibrateInfo.CCK_index = 0; + } else { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl, ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue)); for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0; } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n", - pDM_Odm->RFCalibrateInfo.CCK_index, pDM_Odm->BbSwingIdxCckBase)); //Print Swing base & current + pDM_Odm->RFCalibrateInfo.CCK_index, pRFCalibrateInfo->BbSwingIdxCckBase)); /*Print Swing base & current*/ + for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%c]: %d\n", - pDM_Odm->RFCalibrateInfo.OFDM_index[p], (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->BbSwingIdxOfdmBase[p])); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%d]: %d\n", + pDM_Odm->RFCalibrateInfo.OFDM_index[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p])); } if ((pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A] != 0 || - pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B] != 0 ) && - pDM_Odm->RFCalibrateInfo.TxPowerTrackControl) + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B] != 0 || + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_C] != 0 || + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_D] != 0) && + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl && (pHalData->EEPROMThermalMeter != 0xff)) { //4 7.2 Configure the Swing Table to adjust Tx Power. @@ -373,100 +518,131 @@ ODM_TXPowerTrackingCallback_ThermalMeter( // 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E. if (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue) { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("Temperature Increasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", - pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue)); - - if(c.RfPathCount > 1) - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("Temperature Increasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", - pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue)); - + for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("Temperature Increasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", + p, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue)); + } } else if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue)// Low temperature { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", - pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue)); - - if(c.RfPathCount > 1) - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("Temperature Decreasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", - pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue)); - + for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("Temperature Decreasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", + p, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue)); + } } + #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) if (ThermalValue > pHalData->EEPROMThermalMeter) #else if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) #endif { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter)); - if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || - pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking MIX_MODE**********\n")); + if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 || + pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A || + pDM_Odm->SupportICType == ODM_RTL8822B) { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n")); for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0); } else { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking BBSWING_MODE**********\n")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n")); for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel); } } else { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter)); - if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || - pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking MIX_MODE**********\n")); + if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 || + pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A || + pDM_Odm->SupportICType == ODM_RTL8822B) { + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n")); for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel); } else { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking BBSWING_MODE**********\n")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n")); for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel); } } - pDM_Odm->BbSwingIdxCckBase = pDM_Odm->BbSwingIdxCck; // Record last time Power Tracking result as base. + pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->BbSwingIdxCck; /*Record last time Power Tracking result as base.*/ for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) - pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->BbSwingIdxOfdm[p]; + pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->BbSwingIdxOfdm[p]; ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue= %d\n", pDM_Odm->RFCalibrateInfo.ThermalValue, ThermalValue)); - pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue; //Record last Power Tracking Thermal Value + pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue; /*Record last Power Tracking Thermal Value*/ } + #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) -#if (RTL8723B_SUPPORT == 0) - // Delta temperature is equal to or larger than 20 centigrade (When threshold is 8). - if ((delta_IQK >= c.Threshold_IQK)) { - if ( ! pDM_Odm->RFCalibrateInfo.bIQKInProgress) - (*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8); + + if (!IS_HARDWARE_TYPE_8723B(Adapter) && !IS_HARDWARE_TYPE_8192E(Adapter) && !IS_HARDWARE_TYPE_8703B(Adapter)) { + /* Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/ + if (delta_IQK >= c.Threshold_IQK) { + if (!pDM_Odm->RFCalibrateInfo.bIQKInProgress) + (*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8); + } + } + if (!(pDM_Odm->SupportICType & ODM_RTL8814A)) { + if (pDM_Odm->RFCalibrateInfo.DpkThermal[ODM_RF_PATH_A] != 0) { + if (diff_DPK[ODM_RF_PATH_A] >= c.Threshold_DPK) { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK)); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); + } else if ((diff_DPK[ODM_RF_PATH_A] <= -1 * c.Threshold_DPK)) { + s4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK); + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, value); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); + } else { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, 0); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); + } + } + if (pDM_Odm->RFCalibrateInfo.DpkThermal[ODM_RF_PATH_B] != 0) { + if (diff_DPK[ODM_RF_PATH_B] >= c.Threshold_DPK) { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK)); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); + } else if ((diff_DPK[ODM_RF_PATH_B] <= -1 * c.Threshold_DPK)) { + s4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK); + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, value); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); + } else { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, 0); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); + } + } } -#endif + #endif - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("<===ODM_TXPowerTrackingCallback_ThermalMeter\n")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("<===ODM_TXPowerTrackingCallback_ThermalMeter End\n")); pDM_Odm->RFCalibrateInfo.TXPowercount = 0; } - - //3============================================================ //3 IQ Calibration //3============================================================ @@ -528,3 +704,77 @@ u1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl) } #endif +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 (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + if (!IS_HARDWARE_TYPE_JAGUAR(Adapter)) + return; +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) + else if (IS_HARDWARE_TYPE_8812AU(Adapter)) + return; +#endif +#endif + +#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*/ +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PHY_IQCalibrate_8821A(pDM_Odm, FALSE); +#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PHY_IQCalibrate(Adapter, FALSE); +#else + PHY_IQCalibrate_8821A(Adapter, FALSE); +#endif + } + } else + pDM_Odm->LinkedInterval = 0; +#endif +} + +void phydm_rf_init(IN PDM_ODM_T pDM_Odm) +{ + + odm_TXPowerTrackingInit(pDM_Odm); + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + ODM_ClearTxPowerTrackingState(pDM_Odm); +#endif + +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) +#if (RTL8814A_SUPPORT == 1) + if (pDM_Odm->SupportICType & ODM_RTL8814A) + PHY_IQCalibrate_8814A_Init(pDM_Odm); +#endif +#endif + +} + +void phydm_rf_watchdog(IN PDM_ODM_T 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); +#endif +} diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalPhyRf.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalPhyRf.h index d084e768da3f..f7b3ed0e52a3 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalPhyRf.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalPhyRf.h @@ -29,25 +29,29 @@ typedef enum _SPUR_CAL_METHOD { typedef enum _PWRTRACK_CONTROL_METHOD { BBSWING, TXAGC, - MIX_MODE + MIX_MODE, + TSSI_MODE } PWRTRACK_METHOD; typedef VOID (*FuncSetPwr)(PDM_ODM_T, PWRTRACK_METHOD, u1Byte, u1Byte); -typedef VOID (*FuncIQK)(PDM_ODM_T, u1Byte, u1Byte, u1Byte); +typedef VOID(*FuncIQK)(PVOID, u1Byte, u1Byte, u1Byte); typedef VOID (*FuncLCK)(PDM_ODM_T); typedef VOID (*FuncSwing)(PDM_ODM_T, pu1Byte*, pu1Byte*, pu1Byte*, pu1Byte*); +typedef VOID (*FuncSwing8814only)(PDM_ODM_T, pu1Byte*, pu1Byte*, pu1Byte*, pu1Byte*); typedef struct _TXPWRTRACK_CFG { u1Byte SwingTableSize_CCK; u1Byte SwingTableSize_OFDM; u1Byte Threshold_IQK; + u1Byte Threshold_DPK; u1Byte AverageThermalNum; u1Byte RfPathCount; u4Byte ThermalRegAddr; FuncSetPwr ODM_TxPwrTrackSetPwr; FuncIQK DoIQK; FuncLCK PHY_LCCalibrate; - FuncSwing GetDeltaSwingTable; + FuncSwing GetDeltaSwingTable; + FuncSwing8814only GetDeltaSwingTable8814only; } TXPWRTRACK_CFG, *PTXPWRTRACK_CFG; void ConfigureTxpowerTrack( @@ -84,6 +88,8 @@ ODM_GetRightChnlPlaceforIQK( IN u1Byte chnl ); +void phydm_rf_init(IN PDM_ODM_T pDM_Odm); +void phydm_rf_watchdog(IN PDM_ODM_T pDM_Odm); #endif // #ifndef __HAL_PHY_RF_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.c index 64ed3bc57493..bd3073a6a4c0 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -24,147 +24,192 @@ #include "Mp_Precomp.h" #include "phydm_precomp.h" +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if WPP_SOFTWARE_TRACE +#include "PhyDM_Adaptivity.tmh" +#endif +#endif + VOID Phydm_CheckAdaptivity( IN PVOID pDM_VOID - ) +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) - { - if(pDM_Odm->bAdaOn == TRUE) + PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY); + + if (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) { +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + if (pDM_Odm->APTotalNum > Adaptivity->APNumTH) { + pDM_Odm->Adaptivity_enable = FALSE; + pDM_Odm->adaptivity_flag = FALSE; + Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("AP total num > %d!!, disable adaptivity\n", Adaptivity->APNumTH)); + } else +#endif { - if(pDM_Odm->DynamicLinkAdaptivity == TRUE) - { - if(pDM_Odm->bLinked && pDM_Odm->bCheck == FALSE) - { + if (Adaptivity->DynamicLinkAdaptivity == TRUE) { + if (pDM_Odm->bLinked && Adaptivity->bCheck == FALSE) { Phydm_NHMCounterStatistics(pDM_Odm); Phydm_CheckEnvironment(pDM_Odm); - } - else if(!pDM_Odm->bLinked) - { - pDM_Odm->bCheck = FALSE; - } - } - else - { - Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA); - pDM_Odm->adaptivity_flag = TRUE; + } else if (!pDM_Odm->bLinked) + Adaptivity->bCheck = FALSE; + } else { + pDM_Odm->Adaptivity_enable = TRUE; + + if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8195A)) + pDM_Odm->adaptivity_flag = FALSE; + else + pDM_Odm->adaptivity_flag = TRUE; } } - else - { - Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA); - pDM_Odm->adaptivity_flag = FALSE; + } else { + pDM_Odm->Adaptivity_enable = FALSE; + pDM_Odm->adaptivity_flag = FALSE; + } + + + +} + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +BOOLEAN +Phydm_CheckChannelPlan( + IN PVOID pDM_VOID +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PADAPTER pAdapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo); + + if (pMgntInfo->RegEnableAdaptivity == 2) { + if (pDM_Odm->Carrier_Sense_enable == FALSE) { /*check domain Code for Adaptivity or CarrierSense*/ + if ((*pDM_Odm->pBandType == ODM_BAND_5G) && + !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW)) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 5G domain code : %d\n", pDM_Odm->odm_Regulation5G)); + return TRUE; + } else if ((*pDM_Odm->pBandType == ODM_BAND_2_4G) && + !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 2.4G domain code : %d\n", pDM_Odm->odm_Regulation2_4G)); + return TRUE; + + } else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity neither 2G nor 5G band, return\n")); + return TRUE; + } + } else { + if ((*pDM_Odm->pBandType == ODM_BAND_5G) && + !(pDM_Odm->odm_Regulation5G == REGULATION_MKK || pDM_Odm->odm_Regulation5G == REGULATION_WW)) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 5G domain code : %d\n", pDM_Odm->odm_Regulation5G)); + return TRUE; + } + + else if ((*pDM_Odm->pBandType == ODM_BAND_2_4G) && + !(pDM_Odm->odm_Regulation2_4G == REGULATION_MKK || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 2.4G domain code : %d\n", pDM_Odm->odm_Regulation2_4G)); + return TRUE; + + } else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense neither 2G nor 5G band, return\n")); + return TRUE; + } } - } + } + + return FALSE; + } +#endif VOID Phydm_NHMCounterStatisticsInit( IN PVOID pDM_VOID - ) +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - { - //PHY parameters initialize for ac series - ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC+2, 0xC350); //0x990[31:16]=0xC350 Time duration for NHM unit: us, 0xc350=200ms - ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC+2, 0xffff); //0x994[31:16]=0xffff th_9, th_10 - //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff5c); //0x998=0xffffff5c th_3, th_2, th_1, th_0 - ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff50); //0x998=0xffffff52 th_3, th_2, th_1, th_0 - ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff); //0x99c=0xffffffff th_7, th_6, th_5, th_4 - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff); //0x9a0[7:0]=0xff th_8 - //ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, 0x7); //0x994[9:8]=3 enable CCX - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, 0x1); //0x994[10:8]=1 ignoreCCA ignore PHYTXON enable CCX - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1); //0x9e8[7]=1 max power among all RX ants - + if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) { + /*PHY parameters initialize for n series*/ + ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N + 2, 0xC350); /*0x894[31:16]=0x0xC350 Time duration for NHM unit: us, 0xc350=200ms*/ + ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N + 2, 0xffff); /*0x890[31:16]=0xffff th_9, th_10*/ + ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff50); /*0x898=0xffffff52 th_3, th_2, th_1, th_0*/ + ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff); /*0x89c=0xffffffff th_7, th_6, th_5, th_4*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff); /*0xe28[7:0]=0xff th_8*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10 | BIT9 | BIT8, 0x1); /*0x890[10:8]=1 ignoreCCA ignore PHYTXON enable CCX*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1); /*0xc0c[7]=1 max power among all RX ants*/ } - else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - { - //PHY parameters initialize for n series - ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0xC350); //0x894[31:16]=0x0xC350 Time duration for NHM unit: us, 0xc350=200ms - //ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x4e20); //0x894[31:16]=0x4e20 Time duration for NHM unit: 4us, 0x4e20=80ms - ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N+2, 0xffff); //0x890[31:16]=0xffff th_9, th_10 - //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff5c); //0x898=0xffffff5c th_3, th_2, th_1, th_0 - ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff50); //0x898=0xffffff52 th_3, th_2, th_1, th_0 - ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff); //0x89c=0xffffffff th_7, th_6, th_5, th_4 - ODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff); //0xe28[7:0]=0xff th_8 - //ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x7); //0x890[9:8]=3 enable CCX - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x1); //0x890[10:8]=1 ignoreCCA ignore PHYTXON enable CCX - ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1); //0xc0c[7]=1 max power among all RX ants +#if (RTL8195A_SUPPORT == 0) + else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) { + /*PHY parameters initialize for ac series*/ + ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC + 2, 0xC350); /*0x990[31:16]=0xC350 Time duration for NHM unit: us, 0xc350=200ms*/ + ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC + 2, 0xffff); /*0x994[31:16]=0xffff th_9, th_10*/ + ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff50); /*0x998=0xffffff52 th_3, th_2, th_1, th_0*/ + ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff); /*0x99c=0xffffffff th_7, th_6, th_5, th_4*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff); /*0x9a0[7:0]=0xff th_8*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8 | BIT9 | BIT10, 0x1); /*0x994[10:8]=1 ignoreCCA ignore PHYTXON enable CCX*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1); /*0x9e8[7]=1 max power among all RX ants*/ + } +#endif } VOID Phydm_NHMCounterStatistics( IN PVOID pDM_VOID - ) +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - if(!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT)) + if (!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT)) return; - // Get NHM report + /*Get NHM report*/ Phydm_GetNHMCounterStatistics(pDM_Odm); - // Reset NHM counter + /*Reset NHM counter*/ Phydm_NHMCounterStatisticsReset(pDM_Odm); } VOID Phydm_GetNHMCounterStatistics( IN PVOID pDM_VOID - ) +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u4Byte value32 = 0; - +#if (RTL8195A_SUPPORT == 0) if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11AC, bMaskDWord); else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) +#endif value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11N, bMaskDWord); pDM_Odm->NHM_cnt_0 = (u1Byte)(value32 & bMaskByte0); - pDM_Odm->NHM_cnt_1 = (u1Byte)((value32 & bMaskByte1)>>8); + pDM_Odm->NHM_cnt_1 = (u1Byte)((value32 & bMaskByte1) >> 8); } VOID Phydm_NHMCounterStatisticsReset( IN PVOID pDM_VOID - ) +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - - if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - { - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0); - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1); + + if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) { + ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0); + ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1); } - else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - { - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0); - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1); +#if (RTL8195A_SUPPORT == 0) + else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) { + ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0); + ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1); } -} -VOID -Phydm_NHMBBInit( - IN PVOID pDM_VOID -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; +#endif - pDM_Odm->adaptivity_flag = FALSE; - pDM_Odm->tolerance_cnt = 3; - pDM_Odm->NHMLastTxOkcnt = 0; - pDM_Odm->NHMLastRxOkcnt = 0; - pDM_Odm->NHMCurTxOkcnt = 0; - pDM_Odm->NHMCurRxOkcnt = 0; } VOID @@ -175,17 +220,18 @@ Phydm_SetEDCCAThreshold( ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - - if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - { - ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)L2H); - ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)H2L); - } - else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - { + + if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) { + ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)L2H); + ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)H2L); + } +#if (RTL8195A_SUPPORT == 0) + else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) { ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskByte0, (u1Byte)L2H); ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskByte1, (u1Byte)H2L); - } + } +#endif + } VOID @@ -197,26 +243,24 @@ Phydm_SetTRxMux( { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - { - ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT3|BIT2|BIT1, txMode); // set TXmod to standby mode to remove outside noise affect - ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT22|BIT21|BIT20, rxMode); // set RXmod to standby mode to remove outside noise affect - if(pDM_Odm->RFType > ODM_1T1R) - { - 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 - 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 + if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) { + ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT3 | BIT2 | BIT1, txMode); /*set TXmod to standby mode to remove outside noise affect*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT22 | BIT21 | BIT20, rxMode); /*set RXmod to standby mode to remove outside noise affect*/ + if (pDM_Odm->RFType > ODM_1T1R) { + 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*/ + 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*/ } } - else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - { - ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT11|BIT10|BIT9|BIT8, txMode); // set TXmod to standby mode to remove outside noise affect - ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT7|BIT6|BIT5|BIT4, rxMode); // set RXmod to standby mode to remove outside noise affect - if(pDM_Odm->RFType > ODM_1T1R) - { - ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT11|BIT10|BIT9|BIT8, txMode); // set TXmod to standby mode to remove outside noise affect - ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT7|BIT6|BIT5|BIT4, rxMode); // set RXmod to standby mode to remove outside noise affect +#if (RTL8195A_SUPPORT == 0) + else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) { + ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT11 | BIT10 | BIT9 | BIT8, txMode); /*set TXmod to standby mode to remove outside noise affect*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT7 | BIT6 | BIT5 | BIT4, rxMode); /*set RXmod to standby mode to remove outside noise affect*/ + if (pDM_Odm->RFType > ODM_1T1R) { + ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT11 | BIT10 | BIT9 | BIT8, txMode); /*set TXmod to standby mode to remove outside noise affect*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT7 | BIT6 | BIT5 | BIT4, rxMode); /*set RXmod to standby mode to remove outside noise affect*/ } } +#endif } @@ -227,20 +271,14 @@ Phydm_MACEDCCAState( ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - if(State == PhyDM_IGNORE_EDCCA) - { - ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1); //ignore EDCCA reg520[15]=1 - ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0); //reg524[11]=0 - } - else // don't set MAC ignore EDCCA signal - { - ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0); //don't ignore EDCCA reg520[15]=0 - ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); //reg524[11]=1 + if (State == PhyDM_IGNORE_EDCCA) { + ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1); /*ignore EDCCA reg520[15]=1*/ + ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0); /*reg524[11]=0*/ + } else { /*don't set MAC ignore EDCCA signal*/ + ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0); /*don't ignore EDCCA reg520[15]=0*/ + ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); /*reg524[11]=1 */ } - - pDM_Odm->EDCCA_enable_state = State; - - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("EDCCA enable State = %d \n", State)); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("EDCCA enable State = %d\n", State)); } @@ -254,15 +292,14 @@ Phydm_CalNHMcnt( Base = pDM_Odm->NHM_cnt_0 + pDM_Odm->NHM_cnt_1; - if(Base != 0) - { + if (Base != 0) { pDM_Odm->NHM_cnt_0 = ((pDM_Odm->NHM_cnt_0) << 8) / Base; pDM_Odm->NHM_cnt_1 = ((pDM_Odm->NHM_cnt_1) << 8) / Base; } - if((pDM_Odm->NHM_cnt_0 - pDM_Odm->NHM_cnt_1) >= 100) - return TRUE; // clean environment + if ((pDM_Odm->NHM_cnt_0 - pDM_Odm->NHM_cnt_1) >= 100) + return TRUE; /*clean environment*/ else - return FALSE; //noisy environment + return FALSE; /*noisy environment*/ } @@ -273,150 +310,54 @@ Phydm_CheckEnvironment( ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY); BOOLEAN isCleanEnvironment = FALSE; - u1Byte i, clean = 0; - if(pDM_Odm->bFirstLink == TRUE) - { - pDM_Odm->adaptivity_flag = TRUE; - pDM_Odm->bFirstLink = FALSE; + if (Adaptivity->bFirstLink == TRUE) { + if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8195A)) + pDM_Odm->adaptivity_flag = FALSE; + else + pDM_Odm->adaptivity_flag = TRUE; + + Adaptivity->bFirstLink = FALSE; return; - } - else - { - if(pDM_Odm->NHMWait < 3) // Start enter NHM after 4 NHMWait - { - pDM_Odm->NHMWait ++; + } else { + if (Adaptivity->NHMWait < 3) { /*Start enter NHM after 4 NHMWait*/ + Adaptivity->NHMWait++; Phydm_NHMCounterStatistics(pDM_Odm); return; - } - else - { + } else { Phydm_NHMCounterStatistics(pDM_Odm); isCleanEnvironment = Phydm_CalNHMcnt(pDM_Odm); - if(isCleanEnvironment == TRUE) - { - Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA); + if (isCleanEnvironment == TRUE) { #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup; //mode 1 - pDM_Odm->TH_EDCCA_HL_diff= pDM_Odm->TH_EDCCA_HL_diff_backup; + pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup; /*mode 1*/ + pDM_Odm->TH_EDCCA_HL_diff = Adaptivity->TH_EDCCA_HL_diff_backup; #endif - pDM_Odm->adaptivity_flag = TRUE; - } - else - { + pDM_Odm->Adaptivity_enable = TRUE; + + if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8195A)) + pDM_Odm->adaptivity_flag = FALSE; + else + pDM_Odm->adaptivity_flag = TRUE; + } else { #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA); + Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f); #else - Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA); - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2; // for AP mode 2 - pDM_Odm->TH_EDCCA_HL_diff= pDM_Odm->TH_EDCCA_HL_diff_mode2; + pDM_Odm->TH_L2H_ini = Adaptivity->TH_L2H_ini_mode2; /*for AP mode 2*/ + pDM_Odm->TH_EDCCA_HL_diff = Adaptivity->TH_EDCCA_HL_diff_mode2; #endif pDM_Odm->adaptivity_flag = FALSE; + pDM_Odm->Adaptivity_enable = FALSE; } - - pDM_Odm->bFirstLink = TRUE; - pDM_Odm->bCheck = TRUE; + Adaptivity->NHMWait = 0; + Adaptivity->bFirstLink = TRUE; + Adaptivity->bCheck = TRUE; } - - } - - -} - -VOID -Phydm_NHMBB( - IN PVOID pDM_VOID -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - BOOLEAN bCleanEnvironment; - - bCleanEnvironment = Phydm_CalNHMcnt(pDM_Odm); + } - pDM_Odm->NHMCurTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_Odm->NHMLastTxOkcnt; - pDM_Odm->NHMCurRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_Odm->NHMLastRxOkcnt; - pDM_Odm->NHMLastTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast); - pDM_Odm->NHMLastRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast); - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("cnt_0=%d, cnt_1=%d, bCleanEnvironment = %d, NHMCurTxOkcnt = %llu, NHMCurRxOkcnt = %llu\n", - pDM_Odm->NHM_cnt_0, pDM_Odm->NHM_cnt_1, bCleanEnvironment, pDM_Odm->NHMCurTxOkcnt, pDM_Odm->NHMCurRxOkcnt)); - if(pDM_Odm->NHMWait < 4) // Start enter NHM after 4 NHMWait - { - pDM_Odm->NHMWait ++; - Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA); - } - 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 - { - if(bCleanEnvironment == TRUE || pDM_Odm->adaptivity_flag == TRUE) - { - //Enable EDCCA since it is possible running Adaptivity testing - pDM_Odm->adaptivity_flag = TRUE; - Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA); - pDM_Odm->tolerance_cnt = 0; -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup; - pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ; -#endif - } - else - { - if(pDM_Odm->tolerance_cnt < 3) - pDM_Odm->tolerance_cnt ++; - else - { -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2; - pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ; -#else - Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA); -#endif - pDM_Odm->adaptivity_flag = FALSE; - } - } - } - else // TXadaptivity_flag == TRUE && bCleanEnvironment == FALSE) - { - Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA); - pDM_Odm->tolerance_cnt = 0; -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup; - pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ; -#endif - } -#if(DM_ODM_SUPPORT_TYPE & ODM_AP) // for repeater mode add by YuChen 2014.06.23 -#ifdef UNIVERSAL_REPEATER - else if((bCleanEnvironment == TRUE) && (pDM_Odm->VXD_bLinked) && ((pDM_Odm->NHMCurTxOkcnt>>10) > 1)) // clean environment and VXD linked and Tx TP>1Mb - { - pDM_Odm->adaptivity_flag = TRUE; - Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA); - pDM_Odm->tolerance_cnt = 0; - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup; - pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ; - } -#endif -#endif // for repeater mode add by YuChen 2014.06.23 - else - { - if(pDM_Odm->tolerance_cnt < 3) - pDM_Odm->tolerance_cnt ++; - else - { -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2; - pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ; -#else - Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA); -#endif - pDM_Odm->adaptivity_flag = FALSE; - } - } - } - - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("adaptivity_flag = %d\n ", pDM_Odm->adaptivity_flag)); } VOID @@ -425,75 +366,77 @@ Phydm_SearchPwdBLowerBound( ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - u4Byte value32 =0; - u1Byte cnt, IGI_Pause = 0x7f, IGI_Resume = 0x20, IGI = 0x50; //IGI = 0x50 for cal EDCCA lower bound + PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY); + u4Byte value32 = 0; + u1Byte cnt, IGI_Pause = 0x7f, IGI_Resume = 0x20, IGI = 0x45; /*IGI = 0x50 for cal EDCCA lower bound*/ u1Byte txEdcca1 = 0, txEdcca0 = 0; - BOOLEAN bAdjust=TRUE; + BOOLEAN bAdjust = TRUE; s1Byte TH_L2H_dmc, TH_H2L_dmc, IGI_target = 0x32; s1Byte Diff; Phydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE); ODM_Write_DIG(pDM_Odm, IGI_Pause); - - Diff = IGI_target -(s1Byte)IGI; + + Diff = IGI_target - (s1Byte)IGI; TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff; - if(TH_L2H_dmc > 10) - TH_L2H_dmc = 10; + if (TH_L2H_dmc > 10) + TH_L2H_dmc = 10; TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; - Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc); + Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc); ODM_delay_ms(5); - - while(bAdjust) - { - for(cnt=0; cnt<20; cnt ++) - { - if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11N, bMaskDWord); - else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11AC, bMaskDWord); - - if (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8723B|ODM_RTL8188E))) - txEdcca1 = txEdcca1 + 1; - else if(value32 & BIT29) - txEdcca1 = txEdcca1 + 1; - else - txEdcca0 = txEdcca0 + 1; - } - - if(txEdcca1 > 9 ) - { - IGI = IGI -1; - TH_L2H_dmc = TH_L2H_dmc + 1; - if(TH_L2H_dmc > 10) - TH_L2H_dmc = 10; - TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; - - Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc); - - txEdcca1 = 0; - txEdcca0 = 0; - - if(TH_L2H_dmc == 10) - { - bAdjust = FALSE; - pDM_Odm->H2L_lb = TH_H2L_dmc; - pDM_Odm->L2H_lb = TH_L2H_dmc; - pDM_Odm->Adaptivity_IGI_upper = IGI; - } - } - else - { - bAdjust = FALSE; - pDM_Odm->H2L_lb = TH_H2L_dmc; - pDM_Odm->L2H_lb = TH_L2H_dmc; - pDM_Odm->Adaptivity_IGI_upper = IGI; - } + + while (bAdjust) { + for (cnt = 0; cnt < 20; cnt++) { + if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11N, bMaskDWord); +#if (RTL8195A_SUPPORT == 0) + else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC, bMaskDWord); +#endif + if (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723A | ODM_RTL8723B | ODM_RTL8188E))) + txEdcca1 = txEdcca1 + 1; + else if (value32 & BIT29) + txEdcca1 = txEdcca1 + 1; + else + txEdcca0 = txEdcca0 + 1; + } + + if (txEdcca1 > 1) { + IGI = IGI - 1; + TH_L2H_dmc = TH_L2H_dmc + 1; + if (TH_L2H_dmc > 10) + TH_L2H_dmc = 10; + TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; + + Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc); + if (TH_L2H_dmc == 10) { + bAdjust = FALSE; + Adaptivity->H2L_lb = TH_H2L_dmc; + Adaptivity->L2H_lb = TH_L2H_dmc; + pDM_Odm->Adaptivity_IGI_upper = IGI; } - + + txEdcca1 = 0; + txEdcca0 = 0; + + } else { + bAdjust = FALSE; + Adaptivity->H2L_lb = TH_H2L_dmc; + Adaptivity->L2H_lb = TH_L2H_dmc; + pDM_Odm->Adaptivity_IGI_upper = IGI; + txEdcca1 = 0; + txEdcca0 = 0; + } + } + + pDM_Odm->Adaptivity_IGI_upper = pDM_Odm->Adaptivity_IGI_upper - pDM_Odm->DCbackoff; + Adaptivity->H2L_lb = Adaptivity->H2L_lb + pDM_Odm->DCbackoff; + Adaptivity->L2H_lb = Adaptivity->L2H_lb + pDM_Odm->DCbackoff; + Phydm_SetTRxMux(pDM_Odm, PhyDM_TX_MODE, PhyDM_RX_MODE); ODM_Write_DIG(pDM_Odm, IGI_Resume); - Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f); // resume to no link state + Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f); /*resume to no link state*/ } VOID @@ -502,320 +445,379 @@ Phydm_AdaptivityInit( ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY); #if(DM_ODM_SUPPORT_TYPE == ODM_WIN) PADAPTER pAdapter = pDM_Odm->Adapter; PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo); pDM_Odm->Carrier_Sense_enable = (BOOLEAN)pMgntInfo->RegEnableCarrierSense; - pDM_Odm->NHM_enable = (BOOLEAN)pMgntInfo->RegNHMEnable; - pDM_Odm->DynamicLinkAdaptivity = (BOOLEAN)pMgntInfo->RegDmLinkAdaptivity; + pDM_Odm->DCbackoff = (u1Byte)pMgntInfo->RegDCbackoff; + Adaptivity->DynamicLinkAdaptivity = (BOOLEAN)pMgntInfo->RegDmLinkAdaptivity; + Adaptivity->APNumTH = (u1Byte)pMgntInfo->RegAPNumTH; #elif(DM_ODM_SUPPORT_TYPE == ODM_CE) - pDM_Odm->Carrier_Sense_enable = (pDM_Odm->Adapter->registrypriv.adaptivity_mode!=0)?TRUE:FALSE; - pDM_Odm->NHM_enable = (BOOLEAN)pDM_Odm->Adapter->registrypriv.nhm_en; - pDM_Odm->DynamicLinkAdaptivity = FALSE; // Jeff please add this + pDM_Odm->Carrier_Sense_enable = (pDM_Odm->Adapter->registrypriv.adaptivity_mode != 0) ? TRUE : FALSE; + pDM_Odm->DCbackoff = pDM_Odm->Adapter->registrypriv.adaptivity_dc_backoff; + Adaptivity->DynamicLinkAdaptivity = (pDM_Odm->Adapter->registrypriv.adaptivity_dml != 0) ? TRUE : FALSE; #endif #if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - if(pDM_Odm->Carrier_Sense_enable == FALSE) - { + if (pDM_Odm->Carrier_Sense_enable == FALSE) { #if(DM_ODM_SUPPORT_TYPE == ODM_WIN) - if( pMgntInfo->RegL2HForAdaptivity != 0 ) + if (pMgntInfo->RegL2HForAdaptivity != 0) pDM_Odm->TH_L2H_ini = pMgntInfo->RegL2HForAdaptivity; else #endif - pDM_Odm->TH_L2H_ini = 0xf5; // -7 - } - else - { + { + pDM_Odm->TH_L2H_ini = 0xf5; + } + } else { #if(DM_ODM_SUPPORT_TYPE == ODM_WIN) - if( pMgntInfo->RegL2HForAdaptivity != 0 ) + if (pMgntInfo->RegL2HForAdaptivity != 0) pDM_Odm->TH_L2H_ini = pMgntInfo->RegL2HForAdaptivity; else #endif - pDM_Odm->TH_L2H_ini = 0xa; + pDM_Odm->TH_L2H_ini = 0xa; } - pDM_Odm->AdapEn_RSSI = 20; - #if(DM_ODM_SUPPORT_TYPE == ODM_WIN) - if( pMgntInfo->RegHLDiffForAdaptivity != 0 ) + if (pMgntInfo->RegHLDiffForAdaptivity != 0) pDM_Odm->TH_EDCCA_HL_diff = pMgntInfo->RegHLDiffForAdaptivity; else #endif - pDM_Odm->TH_EDCCA_HL_diff = 7; + pDM_Odm->TH_EDCCA_HL_diff = 7; - 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)); + 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)); #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; + prtl8192cd_priv priv = pDM_Odm->priv; - if(pDM_Odm->Carrier_Sense_enable){ - pDM_Odm->TH_L2H_ini = 10; - pDM_Odm->TH_EDCCA_HL_diff = 7; - pDM_Odm->AdapEn_RSSI = 30; - } - else - { - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup; //set by mib + if (pDM_Odm->Carrier_Sense_enable) { + pDM_Odm->TH_L2H_ini = 0xa; + pDM_Odm->TH_EDCCA_HL_diff = 7; + } else { + pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup; /*set by mib*/ pDM_Odm->TH_EDCCA_HL_diff = 7; - pDM_Odm->AdapEn_RSSI = 20; } - pDM_Odm->TH_L2H_ini_mode2 = 20; - pDM_Odm->TH_EDCCA_HL_diff_mode2 = 8; - //pDM_Odm->TH_L2H_ini_backup = pDM_Odm->TH_L2H_ini; - pDM_Odm->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff ; - if(priv->pshare->rf_ft_var.adaptivity_enable == 2) - pDM_Odm->DynamicLinkAdaptivity = TRUE; + Adaptivity->TH_L2H_ini_mode2 = 20; + Adaptivity->TH_EDCCA_HL_diff_mode2 = 8; + Adaptivity->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff; + if (priv->pshare->rf_ft_var.adaptivity_enable == 2) + Adaptivity->DynamicLinkAdaptivity = TRUE; else - pDM_Odm->DynamicLinkAdaptivity = FALSE; -// pDM_Odm->NHM_enable = FALSE; + Adaptivity->DynamicLinkAdaptivity = FALSE; + #endif - pDM_Odm->IGI_Base = 0x32; - pDM_Odm->IGI_target = 0x1c; - pDM_Odm->ForceEDCCA = 0; - pDM_Odm->H2L_lb= 0; - pDM_Odm->L2H_lb= 0; pDM_Odm->Adaptivity_IGI_upper = 0; - pDM_Odm->NHMWait = 0; - Phydm_NHMBBInit(pDM_Odm); - pDM_Odm->bCheck = FALSE; - pDM_Odm->bFirstLink = TRUE; - pDM_Odm->bAdaOn = TRUE; + pDM_Odm->Adaptivity_enable = FALSE; /*use this flag to decide enable or disable*/ + + Adaptivity->IGI_Base = 0x32; + Adaptivity->IGI_target = 0x1c; + Adaptivity->H2L_lb = 0; + Adaptivity->L2H_lb = 0; + Adaptivity->NHMWait = 0; + Adaptivity->bCheck = FALSE; + Adaptivity->bFirstLink = TRUE; - ODM_SetBBReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); // stop counting if EDCCA is asserted + Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA); - //Search pwdB lower bound - { + /*Search pwdB lower bound*/ if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208); - else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209); - Phydm_SearchPwdBLowerBound(pDM_Odm); + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208); +#if (RTL8195A_SUPPORT == 0) + else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209); +#endif + +#if (RTL8195A_SUPPORT == 1) + if (pDM_Odm->SupportICType & ODM_RTL8195A) { + ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DOWN_OPT_11N, BIT12 | BIT11 | BIT10, 0x7); /*interfernce need > 2^x us, and then EDCCA will be 1*/ + ODM_SetBBReg(pDM_Odm, DOM_REG_EDCCA_DCNF_11N, BIT21 | BIT20, 0x1); /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/ } - Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA); +#else + if (pDM_Odm->SupportICType & ODM_RTL8814A) { /*8814a no need to find pwdB lower bound, maybe*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DOWN_OPT, BIT30 | BIT29 | BIT28, 0x7); /*interfernce need > 2^x us, and then EDCCA will be 1*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_POWER_CAL, BIT5, 1); /*0:mean, 1:max pwdB*/ + ODM_SetBBReg(pDM_Odm, ODM_REG_ACBB_EDCCA_ENHANCE, BIT29 | BIT28, 0x1); /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/ + } else + Phydm_SearchPwdBLowerBound(pDM_Odm); +#endif + } -BOOLEAN +VOID Phydm_Adaptivity( IN PVOID pDM_VOID, IN u1Byte IGI ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - s1Byte TH_L2H_dmc, TH_H2L_dmc, L2H_nolink_Band4 = 0x7f, H2L_nolink_Band4 = 0x7f; - s1Byte Diff, IGI_target; - BOOLEAN EDCCA_State = FALSE; - + s1Byte TH_L2H_dmc, TH_H2L_dmc; + s1Byte Diff, IGI_target; + PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY); #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)); + 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 FALSE; + /*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,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA() \n")); - // Add by Neil Chen to enable edcca to MP Platform + if (!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, 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) + /*Adjust EDCCA.*/ + if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) Phydm_DynamicEDCCA(pDM_Odm); #endif - return FALSE; + return; } - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - if(pMgntInfo->RegEnableAdaptivity== 2) -#else - if (pDM_Odm->Adapter->registrypriv.adaptivity_en == 2) + if (Phydm_CheckChannelPlan(pDM_Odm)) + return; + if (pDM_Odm->APTotalNum > Adaptivity->APNumTH) + return; #endif - { - if(pDM_Odm->Carrier_Sense_enable == FALSE) // check domain Code for Adaptivity or CarrierSense - { - if ((*pDM_Odm->pBandType == ODM_BAND_5G) && - !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW)) - { - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 5G domain code : %d \n", pDM_Odm->odm_Regulation5G)); - return FALSE; - } - else if((*pDM_Odm->pBandType == ODM_BAND_2_4G) && - !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) - { - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 2.4G domain code : %d \n", pDM_Odm->odm_Regulation2_4G)); - return FALSE; - - } - else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) - { - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity neither 2G nor 5G band, return\n")); - return FALSE; - } - } - else - { - if ((*pDM_Odm->pBandType == ODM_BAND_5G) && - !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW)) - { - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 5G domain code : %d\n", pDM_Odm->odm_Regulation5G)); - return FALSE; - } - - else if((*pDM_Odm->pBandType == ODM_BAND_2_4G) && - !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) - { - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 2.4G domain code : %d\n", pDM_Odm->odm_Regulation2_4G)); - return FALSE; - - } - else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) - { - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense neither 2G nor 5G band, return\n")); - return FALSE; - } - } + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("odm_Adaptivity() =====>\n")); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d\n", + Adaptivity->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff)); +#if (RTL8195A_SUPPORT == 0) + if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) { + /*fix AC series when enable EDCCA hang issue*/ + ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 1); /*ADC_mask disable*/ + ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); /*ADC_mask enable*/ } #endif - - - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("odm_Adaptivity() =====> \n")); - 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", - 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->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 + 2; + if (*pDM_Odm->pBandWidth == ODM_BW20M) /*CHANNEL_WIDTH_20*/ + IGI_target = Adaptivity->IGI_Base; + else if (*pDM_Odm->pBandWidth == ODM_BW40M) + IGI_target = Adaptivity->IGI_Base + 2; +#if (RTL8195A_SUPPORT == 0) + else if (*pDM_Odm->pBandWidth == ODM_BW80M) + IGI_target = Adaptivity->IGI_Base + 2; +#endif else - IGI_target = pDM_Odm->IGI_Base; - pDM_Odm->IGI_target = (u1Byte) IGI_target; - - if(*pDM_Odm->pChannel >= 149) // Band4 -> for AP : mode2, for sd4 and sd7 : turnoff adaptivity - { + IGI_target = Adaptivity->IGI_Base; + Adaptivity->IGI_target = (u1Byte) IGI_target; + + if (*pDM_Odm->pChannel >= 149) { /*Band4 -> for AP : mode2*/ #if (DM_ODM_SUPPORT_TYPE & ODM_AP) - if(pDM_Odm->bLinked) - { - Diff = IGI_target -(s1Byte)IGI; - L2H_nolink_Band4 = pDM_Odm->TH_L2H_ini_mode2 + Diff; - if(L2H_nolink_Band4 > 10) - L2H_nolink_Band4 = 10; - H2L_nolink_Band4 = L2H_nolink_Band4 - pDM_Odm->TH_EDCCA_HL_diff_mode2; + s1Byte L2H_nolink_Band4 = 0x7f, H2L_nolink_Band4 = 0x7f; + if (pDM_Odm->bLinked) { + if (pDM_Odm->SupportICType & ODM_RTL8814A) { + L2H_nolink_Band4 = (s1Byte)Adaptivity->TH_L2H_ini_mode2 + IGI_target; + H2L_nolink_Band4 = L2H_nolink_Band4 - Adaptivity->TH_EDCCA_HL_diff_mode2; + } else { + Diff = IGI_target - (s1Byte)IGI; + L2H_nolink_Band4 = Adaptivity->TH_L2H_ini_mode2 + Diff; + if (L2H_nolink_Band4 > 10) + L2H_nolink_Band4 = 10; + H2L_nolink_Band4 = L2H_nolink_Band4 - Adaptivity->TH_EDCCA_HL_diff_mode2; + } + } else { + L2H_nolink_Band4 = 0x7f; + H2L_nolink_Band4 = 0x7f; } -#endif Phydm_SetEDCCAThreshold(pDM_Odm, H2L_nolink_Band4, L2H_nolink_Band4); - return FALSE; - } - - 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; + return; +#endif } - else - EDCCA_State = 1; - if(pDM_Odm->Carrier_Sense_enable == FALSE && pDM_Odm->NHM_enable == TRUE) - Phydm_NHMBB(pDM_Odm); - - 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", - (*pDM_Odm->pBandWidth==ODM_BW80M)?"80M":((*pDM_Odm->pBandWidth==ODM_BW40M)?"40M":"20M"), IGI_target, EDCCA_State, pDM_Odm->EDCCA_enable_state)); - 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)); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, DynamicLinkAdaptivity = %d\n", + (*pDM_Odm->pBandWidth == ODM_BW80M) ? "80M" : ((*pDM_Odm->pBandWidth == ODM_BW40M) ? "40M" : "20M"), IGI_target, Adaptivity->DynamicLinkAdaptivity)); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("RSSI_min = %d, AdapIGIUpper= 0x%x, adaptivity_flag = %d, Adaptivity_enable = %d\n", + pDM_Odm->RSSI_Min, pDM_Odm->Adaptivity_IGI_upper, pDM_Odm->adaptivity_flag, pDM_Odm->Adaptivity_enable)); + if ((Adaptivity->DynamicLinkAdaptivity == TRUE) && (!pDM_Odm->bLinked) && (pDM_Odm->Adaptivity_enable == FALSE)) { + Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("In DynamicLink mode(noisy) and No link, Turn off EDCCA!!\n")); + return; + } +#if (!(DM_ODM_SUPPORT_TYPE & ODM_AP)) + else if ((Adaptivity->DynamicLinkAdaptivity == TRUE) && (pDM_Odm->Adaptivity_enable == FALSE)) { + Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("In DynamicLink mode(noisy) disable EDCCA, return!!\n")); + return; + } +#endif - if(EDCCA_State == 1) - { - Diff = IGI_target -(s1Byte)IGI; + if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8195A)) { + TH_L2H_dmc = (s1Byte)pDM_Odm->TH_L2H_ini + IGI_target; + TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; + } +#if (RTL8195A_SUPPORT == 0) + else { + Diff = IGI_target - (s1Byte)IGI; TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff; - if(TH_L2H_dmc > 10) + if (TH_L2H_dmc > 10) TH_L2H_dmc = 10; - + TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; - //replace lower bound to prevent EDCCA always equal 1 - if(TH_H2L_dmc < pDM_Odm->H2L_lb) - TH_H2L_dmc = pDM_Odm->H2L_lb; - if(TH_L2H_dmc < pDM_Odm->L2H_lb) - TH_L2H_dmc = pDM_Odm->L2H_lb; - } - else - { - TH_L2H_dmc = 0x7f; - TH_H2L_dmc = 0x7f; + /*replace lower bound to prevent EDCCA always equal 1*/ + if (TH_H2L_dmc < Adaptivity->H2L_lb) + TH_H2L_dmc = Adaptivity->H2L_lb; + if (TH_L2H_dmc < Adaptivity->L2H_lb) + TH_L2H_dmc = Adaptivity->L2H_lb; } - 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", - IGI, TH_L2H_dmc, TH_H2L_dmc, pDM_Odm->adaptivity_flag, pDM_Odm->bAdaOn, pDM_Odm->DynamicLinkAdaptivity, pDM_Odm->NHM_enable)); - +#endif + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n", IGI, TH_L2H_dmc, TH_H2L_dmc)); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity_IGI_upper=0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\n", pDM_Odm->Adaptivity_IGI_upper, Adaptivity->H2L_lb, Adaptivity->L2H_lb)); + Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc); - return TRUE; + return; } #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + +VOID +Phydm_AdaptivityBSOD( + IN PVOID pDM_VOID +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PADAPTER pAdapter = pDM_Odm->Adapter; + PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo); + u1Byte count = 0; + u4Byte u4Value; + + /* + 1. turn off RF (TRX Mux in standby mode) + 2. H2C mac id drop + 3. ignore EDCCA + 4. wait for clear FIFO + 5. don't ignore EDCCA + 6. turn on RF (TRX Mux in TRx mdoe) + 7. H2C mac id resume + */ + + RT_TRACE(COMP_MLME, DBG_WARNING, ("MAC id drop packet!!!!!\n")); + + pAdapter->dropPktByMacIdCnt++; + pMgntInfo->bDropPktInProgress = TRUE; + + pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_MAX_Q_PAGE_NUM, (pu1Byte)(&u4Value)); + RT_TRACE(COMP_INIT, DBG_LOUD, ("Queue Reserved Page Number = 0x%08x\n", u4Value)); + pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_AVBL_Q_PAGE_NUM, (pu1Byte)(&u4Value)); + RT_TRACE(COMP_INIT, DBG_LOUD, ("Available Queue Page Number = 0x%08x\n", u4Value)); + +#if 1 + + /*Standby mode*/ + Phydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE); + ODM_Write_DIG(pDM_Odm, 0x20); + + /*H2C mac id drop*/ + MacIdIndicateDisconnect(pAdapter); + + /*Ignore EDCCA*/ + Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA); + + delay_ms(50); + count = 5; + +#else + + do { + + u8Byte diffTime, curTime, oldestTime; + u1Byte queueIdx + + //3 Standby mode + Phydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE); + ODM_Write_DIG(pDM_Odm, 0x20); + + //3 H2C mac id drop + MacIdIndicateDisconnect(pAdapter); + + //3 Ignore EDCCA + Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA); + + count++; + delay_ms(10); + + // Check latest packet + curTime = PlatformGetCurrentTime(); + oldestTime = 0xFFFFFFFFFFFFFFFF; + + for (queueIdx = 0; queueIdx < MAX_TX_QUEUE; queueIdx++) { + if (!IS_DATA_QUEUE(queueIdx)) + continue; + + if (!pAdapter->bTcbBusyQEmpty[queueIdx]) { + RT_TRACE(COMP_MLME, DBG_WARNING, ("oldestTime = %llu\n", oldestTime)); + RT_TRACE(COMP_MLME, DBG_WARNING, ("Q[%d] = %llu\n", queueIdx, pAdapter->firstTcbSysTime[queueIdx])); + if (pAdapter->firstTcbSysTime[queueIdx] < oldestTime) + oldestTime = pAdapter->firstTcbSysTime[queueIdx]; + } + } + + diffTime = curTime - oldestTime; + + RT_TRACE(COMP_MLME, DBG_WARNING, ("diff s = %llu\n", (diffTime / 1000000))); + + } while (((diffTime / 1000000) >= 4) && (oldestTime != 0xFFFFFFFFFFFFFFFF)); +#endif + + /*Resume EDCCA*/ + Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA); + + /*Turn on TRx mode*/ + Phydm_SetTRxMux(pDM_Odm, PhyDM_TX_MODE, PhyDM_RX_MODE); + ODM_Write_DIG(pDM_Odm, 0x20); + + /*Resume H2C macid*/ + MacIdRecoverMediaStatus(pAdapter); + + pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_AVBL_Q_PAGE_NUM, (pu1Byte)(&u4Value)); + RT_TRACE(COMP_INIT, DBG_LOUD, ("Available Queue Page Number = 0x%08x\n", u4Value)); + + pMgntInfo->bDropPktInProgress = FALSE; + RT_TRACE(COMP_MLME, DBG_WARNING, ("End of MAC id drop packet, spent %dms\n", count * 10)); + +} + VOID Phydm_EnableEDCCA( IN PVOID pDM_VOID ) { - // This should be moved out of OUTSRC + /*This should be moved out of OUTSRC*/ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 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); + /*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))) { + ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x00); + ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold + 2, 0xFD); + } else { + ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x03); + ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold + 2, 0x00); + } } VOID Phydm_DisableEDCCA( IN PVOID pDM_VOID ) -{ - // Disable EDCCA.. +{ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f); - ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 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 Phydm_DynamicEDCCA( IN PVOID pDM_VOID @@ -825,52 +827,44 @@ Phydm_DynamicEDCCA( PADAPTER pAdapter = pDM_Odm->Adapter; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); u1Byte RegC50, RegC58; - BOOLEAN bEDCCAenable = FALSE; - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - BOOLEAN bFwCurrentInPSMode=FALSE; - pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode)); +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + 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) + /*Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.*/ + if (bFwCurrentInPSMode) return; #endif - // - // 2013/11/14 Ken According to BB team Jame's suggestion, we need to disable soft AP mode EDCCA. - // 2014/01/08 MH For Miracst AP mode test. We need to disable EDCCA. Otherwise, we may stop - // to send beacon in noisy environment or platform. - // - if(ACTING_AS_AP(pAdapter) || ACTING_AS_AP(GetFirstAPAdapter(pAdapter))) - //if(ACTING_AS_AP(pAdapter)) - { - ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("At least One Port as AP disable EDCCA\n")); + + /*2013/11/14 Ken According to BB team Jame's suggestion, we need to disable soft AP mode EDCCA.*/ + /*2014/01/08 MH For Miracst AP mode test. We need to disable EDCCA. Otherwise, we may stop*/ + /*to send beacon in noisy environment or platform.*/ + + if (ACTING_AS_AP(pAdapter) || ACTING_AS_AP(GetFirstAPAdapter(pAdapter))) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("At least One Port as AP disable EDCCA\n")); Phydm_DisableEDCCA(pDM_Odm); - if(pHalData->bPreEdccaEnable) + if (pHalData->bPreEdccaEnable) Phydm_DisableEDCCA(pDM_Odm); pHalData->bPreEdccaEnable = FALSE; 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) - { + 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) { Phydm_EnableEDCCA(pDM_Odm); pHalData->bPreEdccaEnable = TRUE; } - - } - else if((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25)) - { - if(pHalData->bPreEdccaEnable) - { + + } else if ((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25)) { + if (pHalData->bPreEdccaEnable) { Phydm_DisableEDCCA(pDM_Odm); pHalData->bPreEdccaEnable = FALSE; } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.h index e586ac8cf3a7..62dd8a2dd9d4 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.h @@ -1,3 +1,4 @@ + /****************************************************************************** * * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. @@ -21,9 +22,9 @@ #ifndef __PHYDMADAPTIVITY_H__ #define __PHYDMADAPTIVITY_H__ -#define ADAPTIVITY_VERSION "7.1" +#define ADAPTIVITY_VERSION "8.5.1" -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) typedef enum _tag_PhyDM_REGULATION_Type { REGULATION_FCC = 0, REGULATION_MKK = 1, @@ -34,6 +35,7 @@ typedef enum _tag_PhyDM_REGULATION_Type { } PhyDM_REGULATION_TYPE; #endif + typedef enum tag_PhyDM_TRx_MUX_Type { PhyDM_SHUTDOWN = 0, @@ -48,6 +50,20 @@ typedef enum tag_PhyDM_MACEDCCA_Type PhyDM_DONT_IGNORE_EDCCA = 1 }PhyDM_MACEDCCA_Type; +typedef struct _ADAPTIVITY_STATISTICS { + s1Byte TH_L2H_ini_mode2; + s1Byte TH_EDCCA_HL_diff_mode2; + s1Byte TH_EDCCA_HL_diff_backup; + s1Byte IGI_Base; + u1Byte IGI_target; + u1Byte NHMWait; + s1Byte H2L_lb; + s1Byte L2H_lb; + BOOLEAN bFirstLink; + BOOLEAN bCheck; + BOOLEAN DynamicLinkAdaptivity; + u1Byte APNumTH; +} ADAPTIVITY_STATISTICS, *PADAPTIVITY_STATISTICS; VOID Phydm_CheckAdaptivity( @@ -69,16 +85,6 @@ Phydm_NHMCounterStatistics( IN PVOID pDM_VOID ); -VOID -Phydm_NHMBBInit( - IN PVOID pDM_VOID -); - -VOID -Phydm_NHMBB( - IN PVOID pDM_VOID -); - VOID Phydm_NHMCounterStatisticsReset( IN PVOID pDM_VOID @@ -124,7 +130,7 @@ Phydm_AdaptivityInit( IN PVOID pDM_VOID ); -BOOLEAN +VOID Phydm_Adaptivity( IN PVOID pDM_VOID, IN u1Byte IGI @@ -140,6 +146,12 @@ VOID Phydm_DynamicEDCCA( IN PVOID pDM_VOID ); + +VOID +Phydm_AdaptivityBSOD( + IN PVOID pDM_VOID +); + #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/RtChnlPlan.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/RtChnlPlan.c new file mode 100755 index 000000000000..1f2351f2f0b1 --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/RtChnlPlan.c @@ -0,0 +1,480 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 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 + * + * + ******************************************************************************/ + +/****************************************************************************** + + History: + Data Who Remark (Internal History) + + 05/14/2012 MH Collect RTK inernal infromation and generate channel plan draft. + +******************************************************************************/ + +//============================================================ +// include files +//============================================================ +#include "Mp_Precomp.h" +#include "RtChnlPlan.h" + + + +// +// Channel Plan Domain Code +// + +/* + Channel Plan Contents + Domain Code EEPROM Countries in Specific Domain + 2G RD 5G RD Bit[6:0] 2G 5G + Case Old Define 00h~1Fh Old Define Old Define + 1 2G_WORLD 5G_NULL 20h Worldwird 13 NA + 2 2G_ETSI1 5G_NULL 21h Europe 2G NA + 3 2G_FCC1 5G_NULL 22h US 2G NA + 4 2G_MKK1 5G_NULL 23h Japan 2G NA + 5 2G_ETSI2 5G_NULL 24h France 2G NA + 6 2G_FCC1 5G_FCC1 25h US 2G US 5G ¤K¤j°ê»{ÃÒ + 7 2G_WORLD 5G_ETSI1 26h Worldwird 13 Europe ¤K¤j°ê»{ÃÒ + 8 2G_MKK1 5G_MKK1 27h Japan 2G Japan 5G ¤K¤j°ê»{ÃÒ + 9 2G_WORLD 5G_KCC1 28h Worldwird 13 Korea ¤K¤j°ê»{ÃÒ + 10 2G_WORLD 5G_FCC2 29h Worldwird 13 US o/w DFS Channels + 11 2G_WORLD 5G_FCC3 30h Worldwird 13 India, Mexico + 12 2G_WORLD 5G_FCC4 31h Worldwird 13 Venezuela + 13 2G_WORLD 5G_FCC5 32h Worldwird 13 China + 14 2G_WORLD 5G_FCC6 33h Worldwird 13 Israel + 15 2G_FCC1 5G_FCC7 34h US 2G US/Canada ¤K¤j°ê»{ÃÒ + 16 2G_WORLD 5G_ETSI2 35h Worldwird 13 Australia, New Zealand ¤K¤j°ê»{ÃÒ + 17 2G_WORLD 5G_ETSI3 36h Worldwird 13 Russia + 18 2G_MKK1 5G_MKK2 37h Japan 2G Japan (W52, W53) + 19 2G_MKK1 5G_MKK3 38h Japan 2G Japan (W56) + 20 2G_FCC1 5G_NCC1 39h US 2G Taiwan ¤K¤j°ê»{ÃÒ + + NA 2G_WORLD 5G_FCC1 7F FCC FCC DFS Channels Realtek Define + + + + + + 2.4G Regulatory Domains + Case 2G RD Regulation Channels Frequencyes Note Countries in Specific Domain + 1 2G_WORLD ETSI 1~13 2412~2472 Passive scan CH 12, 13 Worldwird 13 + 2 2G_ETSI1 ETSI 1~13 2412~2472 Europe + 3 2G_FCC1 FCC 1~11 2412~2462 US + 4 2G_MKK1 MKK 1~13, 14 2412~2472, 2484 Japan + 5 2G_ETSI2 ETSI 10~13 2457~2472 France + + + + + 5G Regulatory Domains + Case 5G RD Regulation Channels Frequencyes Note Countries in Specific Domain + 1 5G_NULL NA NA NA Do not support 5GHz + 2 5G_ETSI1 ETSI "36~48, 52~64, + 100~140" "5180~5240, 5260~5230 + 5500~5700" Band1, Ban2, Band3 Europe + 3 5G_ETSI2 ETSI "36~48, 52~64, + 100~140, 149~165" "5180~5240, 5260~5230 + 5500~5700, 5745~5825" Band1, Ban2, Band3, Band4 Australia, New Zealand + 4 5G_ETSI3 ETSI "36~48, 52~64, + 100~132, 149~165" + "5180~5240, 5260~5230 + 5500~5660, 5745~5825" Band1, Ban2, Band3(except CH 136, 140), Band4" Russia + 5 5G_FCC1 FCC "36~48, 52~64, + 100~140, 149~165" + "5180~5240, 5260~5230 + 5500~5700, 5745~5825" Band1(5150~5250MHz), + Band2(5250~5350MHz), + Band3(5470~5725MHz), + Band4(5725~5850MHz)" US + 6 5G_FCC2 FCC 36~48, 149~165 5180~5240, 5745~5825 Band1, Band4 FCC o/w DFS Channels + 7 5G_FCC3 FCC "36~48, 52~64, + 149~165" "5180~5240, 5260~5230 + 5745~5825" Band1, Ban2, Band4 India, Mexico + 8 5G_FCC4 FCC "36~48, 52~64, + 149~161" "5180~5240, 5260~5230 + 5745~5805" Band1, Ban2, + Band4(except CH 165)" Venezuela + 9 5G_FCC5 FCC 149~165 5745~5825 Band4 China + 10 5G_FCC6 FCC 36~48, 52~64 5180~5240, 5260~5230 Band1, Band2 Israel + 11 5G_FCC7 + 5G_IC1 FCC + IC" "36~48, 52~64, + 100~116, 136, 140, + 149~165" "5180~5240, 5260~5230 + 5500~5580, 5680, 5700, + 5745~5825" "Band1, Band2, + Band3(except 5600~5650MHz), + Band4" "US + Canada" + 12 5G_KCC1 KCC "36~48, 52~64, + 100~124, 149~165" "5180~5240, 5260~5230 + 5500~5620, 5745~5825" "Band1, Ban2, + Band3(5470~5650MHz), + Band4" Korea + 13 5G_MKK1 MKK "36~48, 52~64, + 100~140" "5180~5240, 5260~5230 + 5500~5700" W52, W53, W56 Japan + 14 5G_MKK2 MKK 36~48, 52~64 5180~5240, 5260~5230 W52, W53 Japan (W52, W53) + 15 5G_MKK3 MKK 100~140 5500~5700 W56 Japan (W56) + 16 5G_NCC1 NCC "56~64, + 100~116, 136, 140, + 149~165" "5260~5320 + 5500~5580, 5680, 5700, + 5745~5825" "Band2(except CH 52), + Band3(except 5600~5650MHz), + Band4" Taiwan + + +*/ + +// +// 2.4G CHannel +// +/* + + 2.4G Band Regulatory Domains RTL8192D + Channel Number Channel Frequency US Canada Europe Spain France Japan Japan 20M 40M + (MHz) (FCC) (IC) (ETSI) (MPHPT) + 1 2412 v v v v v + 2 2417 v v v v v + 3 2422 v v v v v v + 4 2427 v v v v v v + 5 2432 v v v v v v + 6 2437 v v v v v v + 7 2442 v v v v v v + 8 2447 v v v v v v + 9 2452 v v v v v v + 10 2457 v v v v v v v v + 11 2462 v v v v v v v v + 12 2467 v v v v v + 13 2472 v v v v + 14 2484 v v + + +*/ + + +// +// 5G Operating Channel +// +/* + + 5G Band RTL8192D RTL8195 (Jaguar) Jaguar 2 Regulatory Domains + Channel Number Channel Frequency Global Global Global "US +(FCC 15.407)" "Canada +(FCC, except 5.6~5.65GHz)" Argentina, Australia, New Zealand, Brazil, S. Africa (FCC/ETSI) "Europe +(CE 301 893)" China India, Mexico, Singapore Israel, Turkey "Japan +(MIC Item 19-3, 19-3-2)" Korea Russia, Ukraine "Taiwan +(NCC)" Venezuela + (MHz) (20MHz) (20MHz) (40MHz) (80MHz) (160MHz) (20MHz) (20MHz) (20MHz) (20MHz) (20MHz) (20MHz) (20MHz) (20MHz) (20MHz) (20MHz) (20MHz) (20MHz) (20MHz) +"Band 1 +5.15GHz +~ +5.25GHz" 36 5180 v v v v v Indoor Indoor v Indoor v Indoor Indoor v v v + 40 5200 v v v Indoor Indoor v Indoor v Indoor Indoor v v v + 44 5220 v v v v Indoor Indoor v Indoor v Indoor Indoor v v v + 48 5240 v v v Indoor Indoor v Indoor v Indoor Indoor v v v +"Band 2 +5.25GHz +~ +5.35GHz +(DFS)" 52 5260 v v v v v v v v Indoor v Indoor Indoor v v v + 56 5280 v v v v v v Indoor v Indoor Indoor v v Indoor v + 60 5300 v v v v v v v Indoor v Indoor Indoor v v Indoor v + 64 5320 v v v v v v Indoor v Indoor Indoor v v Indoor v + +"Band 3 +5.47GHz +~ +5.725GHz +(DFS)" 100 5500 v v v v v v v v v v v v v + 104 5520 v v v v v v v v v v v + 108 5540 v v v v v v v v v v v v + 112 5560 v v v v v v v v v v v + 116 5580 v v v v v v v v v v v v v + 120 5600 v v v Indoor v Indoor v v v + 124 5620 v v v v Indoor v Indoor v v v + 128 5640 v v v Indoor v Indoor v v + 132 5660 v v v E v Indoor v Indoor v v + 136 5680 v v v v v v v v v + 140 5700 v v E v v v v v v v + 144 5720 E E E +"Band 4 +5.725GHz +~ +5.85GHz +(~5.9GHz)" 149 5745 v v v v v v v v v v v v v v + 153 5765 v v v v v v v v v v v v + 157 5785 v v v v v v v v v v v v v + 161 5805 v v v v v v v v v v v v + 165 5825 v v P P v v v v v v v v v + 169 5845 P P P + 173 5865 P P P P + 177 5885 P P P +Channel Count 28 28 14 7 0 28 24 20 24 19 5 13 8 19 20 22 15 12 + E: FCC accepted the ask for CH144 from Accord. PS: 160MHz ¥Î 80MHz+80MHz¹ê²{¡H Argentina Belgium (¤ñ§Q®É) India Israel Russia + P: Customer's requirement from James. Australia The Netherlands (²üÄõ) Mexico Turkey Ukraine + New Zealand UK (­^°ê) Singapore + Brazil Switzerland (·ç¤h) + + +*/ + +/*---------------------------Define Local Constant---------------------------*/ + + +// define Maximum Power v.s each band for each region +// ISRAEL +// Format: +// RT_CHANNEL_DOMAIN_Region ={{{Chnl_Start, Chnl_end, Pwr_dB_Max}, {Chn2_Start, Chn2_end, Pwr_dB_Max}, {Chn3_Start, Chn3_end, Pwr_dB_Max}, {Chn4_Start, Chn4_end, Pwr_dB_Max}, {Chn5_Start, Chn5_end, Pwr_dB_Max}}, Limit_Num} */ +// RT_CHANNEL_DOMAIN_FCC ={{{01,11,30}, {36,48,17}, {52,64,24}, {100,140,24}, {149,165,30}}, 5} +// "NR" is non-release channle. +// Issue--- Israel--Russia--New Zealand +// DOMAIN_01= (2G_WORLD, 5G_NULL) +// DOMAIN_02= (2G_ETSI1, 5G_NULL) +// DOMAIN_03= (2G_FCC1, 5G_NULL) +// DOMAIN_04= (2G_MKK1, 5G_NULL) +// DOMAIN_05= (2G_ETSI2, 5G_NULL) +// DOMAIN_06= (2G_FCC1, 5G_FCC1) +// DOMAIN_07= (2G_WORLD, 5G_ETSI1) +// DOMAIN_08= (2G_MKK1, 5G_MKK1) +// DOMAIN_09= (2G_WORLD, 5G_KCC1) +// DOMAIN_10= (2G_WORLD, 5G_FCC2) +// DOMAIN_11= (2G_WORLD, 5G_FCC3)----india +// DOMAIN_12= (2G_WORLD, 5G_FCC4)----Venezuela +// DOMAIN_13= (2G_WORLD, 5G_FCC5)----China +// DOMAIN_14= (2G_WORLD, 5G_FCC6)----Israel +// DOMAIN_15= (2G_FCC1, 5G_FCC7)-----Canada +// DOMAIN_16= (2G_WORLD, 5G_ETSI2)---Australia +// DOMAIN_17= (2G_WORLD, 5G_ETSI3)---Russia +// DOMAIN_18= (2G_MKK1, 5G_MKK2)-----Japan +// DOMAIN_19= (2G_MKK1, 5G_MKK3)-----Japan +// DOMAIN_20= (2G_FCC1, 5G_NCC1)-----Taiwan +// DOMAIN_21= (2G_FCC1, 5G_NCC1)-----Taiwan + + +static RT_CHANNEL_PLAN_MAXPWR ChnlPlanPwrMax_2G[] = { + + // 2G_WORLD, + {{1, 13, 20}, 1}, + + // 2G_ETSI1 + {{1, 13, 20}, 1}, + + /* RT_CHANNEL_DOMAIN_ETSI */ + {{{1, 11, 17}, {40, 56, 17}, {60, 128, 17}, {0, 0, 0}, {149, 165, 17}}, 4}, + + // RT_CHANNEL_DOMAIN_MKK + {{{1, 11, 17}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}}, 1}, + + // Add new channel plan mex power table. + // ...... + }; + + +/* +//===========================================1:(2G_WORLD, 5G_NULL) + +RT_CHANNEL_PLAN_MAXPWR RT_DOMAIN_01 ={{{01,13,20}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1} + +//===========================================2:(2G_ETSI1, 5G_NULL) + +RT_DOMAIN_02 ={{{01,13,20}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1} + +//===========================================3:(2G_FCC1, 5G_NULL) + +RT_DOMAIN_03 ={{{01,11,30}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1} + +//===========================================4:(2G_MKK1, 5G_NULL) + +RT_DOMAIN_04 ={{{01,14,23}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1} + +//===========================================5:(2G_ETSI2, 5G_NULL) + +RT_DOMAIN_05 ={{{10,13,20}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1} + +//===========================================6:(2G_FCC1, 5G_FCC1) + +RT_DOMAIN_06 ={{{01,13,30}, {36,48,17}, {52,64,24}, {100,140,24}, {149,165,30}}, 5} + +//===========================================7:(2G_WORLD, 5G_ETSI1) + +RT_DOMAIN_07 ={{{01,13,20}, {36,48,23}, {52,64,23}, {100,140,30}, {NR,NR,0}}, 4} + +//===========================================8:(2G_MKK1, 5G_MKK1) + +RT_DOMAIN_08 ={{{01,14,23}, {36,48,23}, {52,64,23}, {100,140,23}, {NR,NR,0}}, 4} + +//===========================================9:(2G_WORLD, 5G_KCC1) + +RT_DOMAIN_09 ={{{01,13,20}, {36,48,17}, {52,64,23}, {100,124,23}, {149,165,23}}, 5} + +//===========================================10:(2G_WORLD, 5G_FCC2) + +RT_DOMAIN_10 ={{{01,13,20}, {36,48,17}, {NR,NR,0}, {NR,NR,0}, {149,165,30}}, 3} + +//===========================================11:(2G_WORLD, 5G_FCC3) +RT_DOMAIN_11 ={{{01,13,20}, {36,48,23}, {52,64,23}, {NR,NR,0}, {149,165,23}}, 4} + +//===========================================12:(2G_WORLD, 5G_FCC4) +RT_DOMAIN_12 ={{{01,13,20}, {36,48,24}, {52,64,24}, {NR,NR,0}, {149,161,27}}, 4} + +//===========================================13:(2G_WORLD, 5G_FCC5) +RT_DOMAIN_13 ={{{01,13,20}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {149,165,27}}, 2} + +//===========================================14:(2G_WORLD, 5G_FCC6) +RT_DOMAIN_14 ={{{01,13,20}, {36,48,17}, {52,64,17}, {NR,NR,0}, {NR,NR,0}}, 3} + +//===========================================15:(2G_FCC1, 5G_FCC7) +RT_DOMAIN_15 ={{{01,11,30}, {36,48,23}, {52,64,24}, {100,140,24}, {149,165,30}}, 5} + +//===========================================16:(2G_WORLD, 5G_ETSI2) +RT_DOMAIN_16 ={{{01,13,20}, {36,48,23}, {52,64,23}, {100,140,30}, {149,165,30}}, 5} + +//===========================================17:(2G_WORLD, 5G_ETSI3) +RT_DOMAIN_17 ={{{01,13,20}, {36,48,23}, {52,64,23}, {100,132,30}, {149,165,20}}, 5} + +//===========================================18:(2G_MKK1, 5G_MKK2) +RT_DOMAIN_18 ={{{01,14,23}, {36,48,23}, {52,64,23}, {NR,NR,0}, {NR,NR,0}}, 3} + +//===========================================19:(2G_MKK1, 5G_MKK3) +RT_DOMAIN_19 ={{{01,14,23}, {NR,NR,0}, {NR,NR,0}, {100,140,23}, {NR,NR,0}}, 2} + +//===========================================20:(2G_FCC1, 5G_NCC1) +RT_DOMAIN_20 ={{{01,11,30}, {NR,NR,0}, {56,64,23}, {100,140,24}, {149,165,30}}, 4} + +//===========================================21:(2G_FCC1, 5G_NCC2) +RT_DOMAIN_21 ={{{01,11,30}, {NR,NR,0}, {56,64,23}, {NR,NR,0}, {149,165,30}}, 3} + +//===========================================22:(2G_WORLD, 5G_FCC3) +RT_DOMAIN_22 ={{{01,13,24}, {36,48,20}, {52,64,24}, {NR,NR,0}, {149,165,30}}, 4} + +//===========================================23:(2G_WORLD, 5G_ETSI2) +RT_DOMAIN_23 ={{{01,13,20}, {36,48,23}, {52,64,23}, {100,140,30}, {149,165,30}}, 5} + +*/ + +// +// Counter & Realtek Channel plan transfer table. +// +RT_CHNL_CTRY_TBL RtCtryChnlTbl[] = +{ + + { + RT_CTRY_AL, // "Albaniaªüº¸¤Ú¥§¨È" + "AL", + RT_2G_WORLD, + RT_5G_WORLD, + RT_CHANNEL_DOMAIN_UNDEFINED // 2G/5G world. + }, +#if 0 + { + RT_CTRY_BB, // "Barbados¤Ú¤Ú¦h´µ" + "BB", + RT_2G_WORLD, + RT_5G_NULL, + RT_CHANNEL_DOMAIN_EFUSE_0x20 // 2G world. 5G_NULL + }, + + { + RT_CTRY_DE, // "Germany¼w°ê" + "DE", + RT_2G_WORLD, + RT_5G_ETSI1, + RT_CHANNEL_DOMAIN_EFUSE_0x26 + }, + + { + RT_CTRY_US, // "Germany¼w°ê" + "US", + RT_2G_FCC1, + RT_5G_FCC7, + RT_CHANNEL_DOMAIN_EFUSE_0x34 + }, + + { + RT_CTRY_JP, // "Germany¼w°ê" + "JP", + RT_2G_MKK1, + RT_5G_MKK1, + RT_CHANNEL_DOMAIN_EFUSE_0x34 + }, + + { + RT_CTRY_TW, // "Germany¼w°ê" + "TW", + RT_2G_FCC1, + RT_5G_NCC1, + RT_CHANNEL_DOMAIN_EFUSE_0x39 + }, +#endif + +}; // RtCtryChnlTbl + +// +// Realtek Defined Channel plan. +// +#if 0 + +static RT_CHANNEL_PLAN_NEW RtChnlPlan[] = +{ + // Channel Plan 0x20. + { + &RtCtryChnlTbl[1], // RT_CHNL_CTRY_TBL Country & channel plan transfer table. + RT_CHANNEL_DOMAIN_EFUSE_0x20, // RT_CHANNEL_DOMAIN RT Channel Plan Define + RT_2G_WORLD, // RT_REGULATION_2G + RT_5G_NULL, // RT_REGULATION_5G + RT_WORLD, // RT_REGULATION_CMN RT Regulatory domain definition. + RT_SREQ_NA, // RT Channel plan special & customerize requirement. + + CHNL_RT_2G_WORLD, + CHNL_RT_2G_WORLD_SCAN_TYPE, + &ChnlPlanPwrMax_2G[0], + + CHNL_RT_5G_NULL, + CHNL_RT_5G_NULL_SCAN_TYPE, + + + }, + + // Channel Plan 0x26. + { + &RtCtryChnlTbl[1], // RT_CHNL_CTRY_TBL Country & channel plan transfer table. + RT_CHANNEL_DOMAIN_EFUSE_0x26, // RT_CHANNEL_DOMAIN RT Channel Plan Define + RT_2G_WORLD, // RT_REGULATION_2G + RT_5G_ETSI1, // RT_REGULATION_5G + RT_WORLD, // RT_REGULATION_CMN RT Regulatory domain definition. + RT_SREQ_NA, // RT Channel plan special & customerize requirement. + + CHNL_RT_2G_WORLD, // 2G workd cannel + CHNL_RT_2G_WORLD_SCAN_TYPE, + &ChnlPlanPwrMax_2G[1], + + CHNL_RT_5G_ETSI1, + CHNL_RT_5G_ETSI1_SCAN_TYPE, + + } + + +}; +#endif + + + + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/RtChnlPlan.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/RtChnlPlan.h new file mode 100755 index 000000000000..37786cf8f00d --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/RtChnlPlan.h @@ -0,0 +1,699 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 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 + * + * + ******************************************************************************/ + + +#ifndef __RT_CHANNELPLAN_H__ +#define __RT_CHANNELPLAN_H__ + +typedef enum _RT_CHANNEL_DOMAIN_NEW +{ + + //===== Add new channel plan above this line ===============// + + // For new architecture we define different 2G/5G CH area for all country. + // 2.4 G only + RT_CHANNEL_DOMAIN_2G_WORLD_5G_NULL = 0x20, + RT_CHANNEL_DOMAIN_2G_ETSI1_5G_NULL = 0x21, + RT_CHANNEL_DOMAIN_2G_FCC1_5G_NULL = 0x22, + RT_CHANNEL_DOMAIN_2G_MKK1_5G_NULL = 0x23, + RT_CHANNEL_DOMAIN_2G_ETSI2_5G_NULL = 0x24, + // 2.4 G + 5G type 1 + RT_CHANNEL_DOMAIN_2G_FCC1_5G_FCC1 = 0x25, + RT_CHANNEL_DOMAIN_2G_WORLD_5G_ETSI1 = 0x26, + //RT_CHANNEL_DOMAIN_2G_WORLD_5G_ETSI1 = 0x27, + // ..... + + RT_CHANNEL_DOMAIN_MAX_NEW, + +}RT_CHANNEL_DOMAIN_NEW, *PRT_CHANNEL_DOMAIN_NEW; + + +#if 0 +#define DOMAIN_CODE_2G_WORLD \ + {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13 +#define DOMAIN_CODE_2G_ETSI1 \ + {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13 +#define DOMAIN_CODE_2G_ETSI2 \ + {1,2,3,4,5,6,7,8,9,10,11}, 11 +#define DOMAIN_CODE_2G_FCC1 \ + {1,2,3,4,5,6,7,8,9,10,11,12,13,14}, 14 +#define DOMAIN_CODE_2G_MKK1 \ + {10,11,12,13}, 4 + +#define DOMAIN_CODE_5G_ETSI1 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19 +#define DOMAIN_CODE_5G_ETSI2 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24 +#define DOMAIN_CODE_5G_ETSI3 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,149,153,157,161,165}, 22 +#define DOMAIN_CODE_5G_FCC1 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24 +#define DOMAIN_CODE_5G_FCC2 \ + {36,40,44,48,149,153,157,161,165}, 9 +#define DOMAIN_CODE_5G_FCC3 \ + {36,40,44,48,52,56,60,64,149,153,157,161,165}, 13 +#define DOMAIN_CODE_5G_FCC4 \ + {36,40,44,48,52,56,60,64,149,153,157,161}, 12 +#define DOMAIN_CODE_5G_FCC5 \ + {149,153,157,161,165}, 5 +#define DOMAIN_CODE_5G_FCC6 \ + {36,40,44,48,52,56,60,64}, 8 +#define DOMAIN_CODE_5G_FCC7 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20 +#define DOMAIN_CODE_5G_IC1 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20 +#define DOMAIN_CODE_5G_KCC1 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165}, 20 +#define DOMAIN_CODE_5G_MKK1 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19 +#define DOMAIN_CODE_5G_MKK2 \ + {36,40,44,48,52,56,60,64}, 8 +#define DOMAIN_CODE_5G_MKK3 \ + {100,104,108,112,116,120,124,128,132,136,140}, 11 +#define DOMAIN_CODE_5G_NCC1 \ + {56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 24 +#define DOMAIN_CODE_5G_NCC2 \ + {56,60,64,149,153,157,161,165}, 8 +#define UNDEFINED \ + {0}, 0 +#endif + +// +// +// +/* + +Countries "Country Abbreviation" Domain Code SKU's Ch# of 20MHz + 2G 5G Ch# of 40MHz +"Albaniaªüº¸¤Ú¥§¨È" AL Local Test + +"Algeriaªüº¸¤Î§Q¨È" DZ CE TCF + +"Antigua & Barbuda¦w´£¥Ê®q&¤Ú¥¬¹F" AG 2G_WORLD FCC TCF + +"Argentinaªü®Ú§Ê" AR 2G_WORLD Local Test + +"Armenia¨È¬ü¥§¨È" AM 2G_WORLD ETSI + +"Arubaªü¾|¤Ú®q" AW 2G_WORLD FCC TCF + +"Australia¿D¬w" AU 2G_WORLD 5G_ETSI2 + +"Austria¶ø¦a§Q" AT 2G_WORLD 5G_ETSI1 CE + +"Azerbaijanªü¶ë«ô¾Ê" AZ 2G_WORLD CE TCF + +"Bahamas¤Ú«¢°¨" BS 2G_WORLD + +"Barbados¤Ú¤Ú¦h´µ" BB 2G_WORLD FCC TCF + +"Belgium¤ñ§Q®É" BE 2G_WORLD 5G_ETSI1 CE + +"Bermuda¦Ê¼}¹F" BM 2G_WORLD FCC TCF + +"Brazil¤Ú¦è" BR 2G_WORLD Local Test + +"Bulgaria«O¥[§Q¨È" BG 2G_WORLD 5G_ETSI1 CE + +"Canada¥[®³¤j" CA 2G_FCC1 5G_FCC7 IC / FCC IC / FCC + +"Cayman Islands¶}°Ò¸s®q" KY 2G_WORLD 5G_ETSI1 CE + +"Chile´¼§Q" CL 2G_WORLD FCC TCF + +"China¤¤°ê" CN 2G_WORLD 5G_FCC5 «H³¡?¡i2002¡j353? + +"Columbia­ô­Û¤ñ¨È" CO 2G_WORLD Voluntary + +"Costa Rica­ô´µ¹F¾¤¥[" CR 2G_WORLD FCC TCF + +"Cyprus¶ë®ú¸ô´µ" CY 2G_WORLD 5G_ETSI1 CE + +"Czech ±¶§J" CZ 2G_WORLD 5G_ETSI1 CE + +"Denmark¤¦³Á" DK 2G_WORLD 5G_ETSI1 CE + +"Dominican Republic¦h©ú¥§¥[¦@©M°ê" DO 2G_WORLD FCC TCF + +"Egypt®J¤Î" EG 2G_WORLD CE T CF + +"El SalvadorÂĺ¸¥Ë¦h" SV 2G_WORLD Voluntary + +"Estonia·R¨F¥§¨È" EE 2G_WORLD 5G_ETSI1 CE + +"FinlandªâÄõ" FI 2G_WORLD 5G_ETSI1 CE + +"Franceªk°ê" FR 5G_E TSI1 CE + +"Germany¼w°ê" DE 2G_WORLD 5G_ETSI1 CE + +"Greece §Æþ" GR 2G_WORLD 5G_ETSI1 CE + +"GuamÃö®q" GU 2G_WORLD + +"Guatemala¥Ê¦a°¨©Ô" GT 2G_WORLD + +"Haiti®ü¦a" HT 2G_WORLD FCC TCF + +"Honduras§»³£©Ô´µ" HN 2G_WORLD FCC TCF + +"Hungary¦I¤ú§Q" HU 2G_WORLD 5G_ETSI1 CE + +"Iceland¦B®q" IS 2G_WORLD 5G_ETSI1 CE + +"India¦L«×" IN 2G_WORLD 5G_FCC3 FCC/CE TCF + +"Ireland·Rº¸Äõ" IE 2G_WORLD 5G_ETSI1 CE + +"Israel¥H¦â¦C" IL 5G_F CC6 CE TCF + +"Italy¸q¤j§Q" IT 2G_WORLD 5G_ETSI1 CE + +"Japan¤é¥»" JP 2G_MKK1 5G_MKK1 MKK MKK + +"KoreaÁú°ê" KR 2G_WORLD 5G_KCC1 KCC KCC + +"Latvia©Ô²æºû¨È" LV 2G_WORLD 5G_ETSI1 CE + +"Lithuania¥ß³³©{" LT 2G_WORLD 5G_ETSI1 CE + +"Luxembourg¿c´Ë³ù" LU 2G_WORLD 5G_ETSI1 CE + +"Malaysia°¨¨Ó¦è¨È" MY 2G_WORLD Local Test + +"Malta°¨º¸¥L" MT 2G_WORLD 5G_ETSI1 CE + +"Mexico¾¥¦è­ô" MX 2G_WORLD 5G_FCC3 Local Test + +"Morocco¼¯¬¥­ô" MA CE TCF + +"Netherlands²üÄõ" NL 2G_WORLD 5G_ETSI1 CE + +"New Zealand¯Ã¦èÄõ" NZ 2G_WORLD 5G_ETSI2 + +"Norway®¿«Â" NO 2G_WORLD 5G_ETSI1 CE + +"Panama¤Ú®³°¨ " PA 2G_FCC1 Voluntary + +"Philippinesµá«ß»«" PH 2G_WORLD FCC TCF + +"PolandªiÄõ" PL 2G_WORLD 5G_ETSI1 CE + +"Portugal¸²µå¤ú" PT 2G_WORLD 5G_ETSI1 CE + +"Romaniaù°¨¥§¨È" RO 2G_WORLD 5G_ETSI1 CE + +"Russia«Xù´µ" RU 2G_WORLD 5G_ETSI3 CE TCF + +"Saudi Arabia¨F¦aªü©Ô§B" SA 2G_WORLD CE TCF + +"Singapore·s¥[©Y" SG 2G_WORLD + +"Slovakia´µ¬¥¥ï§J" SK 2G_WORLD 5G_ETSI1 CE + +"Slovenia´µ¬¥ºû¥§¨È" SI 2G_WORLD 5G_ETSI1 CE + +"South Africa«n«D" ZA 2G_WORLD CE TCF + +"Spain¦è¯Z¤ú" ES 5G_ETSI1 CE + +"Sweden·ç¨å" SE 2G_WORLD 5G_ETSI1 CE + +"Switzerland·ç¤h" CH 2G_WORLD 5G_ETSI1 CE + +"Taiwan»OÆW" TW 2G_FCC1 5G_NCC1 NCC + +"Thailand®õ°ê" TH 2G_WORLD FCC/CE TCF + +"Turkey¤g¦Õ¨ä" TR 2G_WORLD + +"Ukraine¯Q§JÄõ" UA 2G_WORLD Local Test + +"United Kingdom­^°ê" GB 2G_WORLD 5G_ETSI1 CE ETSI + +"United States¬ü°ê" US 2G_FCC1 5G_FCC7 FCC FCC + +"Venezuela©e¤º·ç©Ô" VE 2G_WORLD 5G_FCC4 FCC TCF + +"Vietnam¶V«n" VN 2G_WORLD FCC/CE TCF + + + +*/ + +// Counter abbervation. +typedef enum _RT_COUNTRY_DEFINE_NUM +{ + RT_CTRY_AL, // "Albaniaªüº¸¤Ú¥§¨È" + RT_CTRY_DZ, // "Algeriaªüº¸¤Î§Q¨È" + RT_CTRY_AG, // "Antigua & Barbuda¦w´£¥Ê®q&¤Ú¥¬¹F" + RT_CTRY_AR, // "Argentinaªü®Ú§Ê" + RT_CTRY_AM, // "Armenia¨È¬ü¥§¨È" + RT_CTRY_AW, // "Arubaªü¾|¤Ú®q" + RT_CTRY_AU, // "Australia¿D¬w" + RT_CTRY_AT, // "Austria¶ø¦a§Q" + RT_CTRY_AZ, // "Azerbaijanªü¶ë«ô¾Ê" + RT_CTRY_BS, // "Bahamas¤Ú«¢°¨" + RT_CTRY_BB, // "Barbados¤Ú¤Ú¦h´µ" + RT_CTRY_BE, // "Belgium¤ñ§Q®É" + RT_CTRY_BM, // "Bermuda¦Ê¼}¹F" + RT_CTRY_BR, // "Brazil¤Ú¦è" + RT_CTRY_BG, // "Bulgaria«O¥[§Q¨È" + RT_CTRY_CA, // "Canada¥[®³¤j" + RT_CTRY_KY, // "Cayman Islands¶}°Ò¸s®q" + RT_CTRY_CL, // "Chile´¼§Q" + RT_CTRY_CN, // "China¤¤°ê" + RT_CTRY_CO, // "Columbia­ô­Û¤ñ¨È" + RT_CTRY_CR, // "Costa Rica­ô´µ¹F¾¤¥[" + RT_CTRY_CY, // "Cyprus¶ë®ú¸ô´µ" + RT_CTRY_CZ, // "Czech ±¶§J" + RT_CTRY_DK, // "Denmark¤¦³Á" + RT_CTRY_DO, // "Dominican Republic¦h©ú¥§¥[¦@©M°ê" + RT_CTRY_CE, // "Egypt®J¤Î" EG 2G_WORLD + RT_CTRY_SV, // "El SalvadorÂĺ¸¥Ë¦h" + RT_CTRY_EE, // "Estonia·R¨F¥§¨È" + RT_CTRY_FI, // "FinlandªâÄõ" + RT_CTRY_FR, // "Franceªk°ê" + RT_CTRY_DE, // "Germany¼w°ê" + RT_CTRY_GR, // "Greece §Æþ" + RT_CTRY_GU, // "GuamÃö®q" + RT_CTRY_GT, // "Guatemala¥Ê¦a°¨©Ô" + RT_CTRY_HT, // "Haiti®ü¦a" + RT_CTRY_HN, // "Honduras§»³£©Ô´µ" + RT_CTRY_HU, // "Hungary¦I¤ú§Q" + RT_CTRY_IS, // "Iceland¦B®q" + RT_CTRY_IN, // "India¦L«×" + RT_CTRY_IE, // "Ireland·Rº¸Äõ" + RT_CTRY_IL, // "Israel¥H¦â¦C" + RT_CTRY_IT, // "Italy¸q¤j§Q" + RT_CTRY_JP, // "Japan¤é¥»" + RT_CTRY_KR, // "KoreaÁú°ê" + RT_CTRY_LV, // "Latvia©Ô²æºû¨È" + RT_CTRY_LT, // "Lithuania¥ß³³©{" + RT_CTRY_LU, // "Luxembourg¿c´Ë³ù" + RT_CTRY_MY, // "Malaysia°¨¨Ó¦è¨È" + RT_CTRY_MT, // "Malta°¨º¸¥L" + RT_CTRY_MX, // "Mexico¾¥¦è­ô" + RT_CTRY_MA, // "Morocco¼¯¬¥­ô" + RT_CTRY_NL, // "Netherlands²üÄõ" + RT_CTRY_NZ, // "New Zealand¯Ã¦èÄõ" + RT_CTRY_NO, // "Norway®¿«Â" + RT_CTRY_PA, // "Panama¤Ú®³°¨ " + RT_CTRY_PH, // "Philippinesµá«ß»«" + RT_CTRY_PL, // "PolandªiÄõ" + RT_CTRY_PT, // "Portugal¸²µå¤ú" + RT_CTRY_RO, // "Romaniaù°¨¥§¨È" + RT_CTRY_RU, // "Russia«Xù´µ" + RT_CTRY_SA, // "Saudi Arabia¨F¦aªü©Ô§B" + RT_CTRY_SG, // "Singapore·s¥[©Y" + RT_CTRY_SK, // "Slovakia´µ¬¥¥ï§J" + RT_CTRY_SI, // "Slovenia´µ¬¥ºû¥§¨È" + RT_CTRY_ZA, // "South Africa«n«D" + RT_CTRY_ES, // "Spain¦è¯Z¤ú" + RT_CTRY_SE, // "Sweden·ç¨å" + RT_CTRY_CH, // "Switzerland·ç¤h" + RT_CTRY_TW, // "Taiwan»OÆW" + RT_CTRY_TH, // "Thailand®õ°ê" + RT_CTRY_TR, // "Turkey¤g¦Õ¨ä" + RT_CTRY_UA, // "Ukraine¯Q§JÄõ" + RT_CTRY_GB, // "United Kingdom­^°ê" + RT_CTRY_US, // "United States¬ü°ê" + RT_CTRY_VE, // "Venezuela©e¤º·ç©Ô" + RT_CTRY_VN, // "Vietnam¶V«n" + RT_CTRY_MAX, // + +}RT_COUNTRY_NAME, *PRT_COUNTRY_NAME; + +// Scan type including active and passive scan. +typedef enum _RT_SCAN_TYPE_NEW +{ + SCAN_NULL, + SCAN_ACT, + SCAN_PAS, + SCAN_BOTH, +}RT_SCAN_TYPE_NEW, *PRT_SCAN_TYPE_NEW; + + +// Power table sample. + +typedef struct _RT_CHNL_PLAN_LIMIT +{ + u2Byte Chnl_Start; + u2Byte Chnl_end; + + u2Byte Freq_Start; + u2Byte Freq_end; +}RT_CHNL_PLAN_LIMIT, *PRT_CHNL_PLAN_LIMIT; + + +// +// 2.4G Regulatory Domains +// +typedef enum _RT_REGULATION_DOMAIN_2G +{ + RT_2G_NULL, + RT_2G_WORLD, + RT_2G_ETSI1, + RT_2G_FCC1, + RT_2G_MKK1, + RT_2G_ETSI2 + +}RT_REGULATION_2G, *PRT_REGULATION_2G; + + +//typedef struct _RT_CHANNEL_BEHAVIOR +//{ +// u1Byte Chnl; +// RT_SCAN_TYPE_NEW +// +//}RT_CHANNEL_BEHAVIOR, *PRT_CHANNEL_BEHAVIOR; + +//typedef struct _RT_CHANNEL_PLAN_TYPE +//{ +// RT_CHANNEL_BEHAVIOR +// u1Byte Chnl_num; +//}RT_CHNL_PLAN_TYPE, *PRT_CHNL_PLAN_TYPE; + +// +// 2.4G Channel Number +// Channel definition & number +// +#define CHNL_RT_2G_NULL \ + {0}, 0 +#define CHNL_RT_2G_WORLD \ + {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13 +#define CHNL_RT_2G_WORLD_TEST \ + {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13 + +#define CHNL_RT_2G_EFSI1 \ + {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13 +#define CHNL_RT_2G_FCC1 \ + {1,2,3,4,5,6,7,8,9,10,11}, 11 +#define CHNL_RT_2G_MKK1 \ + {1,2,3,4,5,6,7,8,9,10,11,12,13,14}, 14 +#define CHNL_RT_2G_ETSI2 \ + {10,11,12,13}, 4 + +// +// 2.4G Channel Active or passive scan. +// +#define CHNL_RT_2G_NULL_SCAN_TYPE \ + {SCAN_NULL} +#define CHNL_RT_2G_WORLD_SCAN_TYPE \ + {1,1,1,1,1,1,1,1,1,1,1,0,0} +#define CHNL_RT_2G_EFSI1_SCAN_TYPE \ + {1,1,1,1,1,1,1,1,1,1,1,1,1} +#define CHNL_RT_2G_FCC1_SCAN_TYPE \ + {1,1,1,1,1,1,1,1,1,1,1} +#define CHNL_RT_2G_MKK1_SCAN_TYPE \ + {1,1,1,1,1,1,1,1,1,1,1,1,1,1} +#define CHNL_RT_2G_ETSI2_SCAN_TYPE \ + {1,1,1,1} + + +// +// 2.4G Band & Frequency Section +// Freqency start & end / band number +// +#define FREQ_RT_2G_NULL \ + {0}, 0 + // Passive scan CH 12, 13 +#define FREQ_RT_2G_WORLD \ + {2412, 2472}, 1 +#define FREQ_RT_2G_EFSI1 \ + {2412, 2472}, 1 +#define FREQ_RT_2G_FCC1 \ + {2412, 2462}, 1 +#define FREQ_RT_2G_MKK1 \ + {2412, 2484}, 1 +#define FREQ_RT_2G_ETSI2 \ + {2457, 2472}, 1 + + +// +// 5G Regulatory Domains +// +typedef enum _RT_REGULATION_DOMAIN_5G +{ + RT_5G_NULL, + RT_5G_WORLD, + RT_5G_ETSI1, + RT_5G_ETSI2, + RT_5G_ETSI3, + RT_5G_FCC1, + RT_5G_FCC2, + RT_5G_FCC3, + RT_5G_FCC4, + RT_5G_FCC5, + RT_5G_FCC6, + RT_5G_FCC7, + RT_5G_IC1, + RT_5G_KCC1, + RT_5G_MKK1, + RT_5G_MKK2, + RT_5G_MKK3, + RT_5G_NCC1, + +}RT_REGULATION_5G, *PRT_REGULATION_5G; + +// +// 5G Channel Number +// +#define CHNL_RT_5G_NULL \ + {0}, 0 +#define CHNL_RT_5G_WORLD \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19 +#define CHNL_RT_5G_ETSI1 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24 +#define CHNL_RT_5G_ETSI2 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,149,153,157,161,165}, 22 +#define CHNL_RT_5G_ETSI3 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24 +#define CHNL_RT_5G_FCC1 \ + {36,40,44,48,149,153,157,161,165}, 9 +#define CHNL_RT_5G_FCC2 \ + {36,40,44,48,52,56,60,64,149,153,157,161,165}, 13 +#define CHNL_RT_5G_FCC3 \ + {36,40,44,48,52,56,60,64,149,153,157,161}, 12 +#define CHNL_RT_5G_FCC4 \ + {149,153,157,161,165}, 5 +#define CHNL_RT_5G_FCC5 \ + {36,40,44,48,52,56,60,64}, 8 +#define CHNL_RT_5G_FCC6 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20 +#define CHNL_RT_5G_FCC7 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20 +#define CHNL_RT_5G_IC1 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165}, 20 +#define CHNL_RT_5G_KCC1 \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19 +#define CHNL_RT_5G_MKK1 \ + {36,40,44,48,52,56,60,64}, 8 +#define CHNL_RT_5G_MKK2 \ + {100,104,108,112,116,120,124,128,132,136,140}, 11 +#define CHNL_RT_5G_MKK3 \ + {56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 24 +#define CHNL_RT_5G_NCC1 \ + {56,60,64,149,153,157,161,165}, 8 + +// +// 5G Channel Active or passive scan. +// +#define CHNL_RT_5G_NULL_SCAN_TYPE \ + {SCAN_NULL} +#define CHNL_RT_5G_WORLD_SCAN_TYPE \ + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} +#define CHNL_RT_5G_ETSI1_SCAN_TYPE \ + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} +#define CHNL_RT_5G_ETSI2_SCAN_TYPE \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,149,153,157,161,165}, 22 +#define CHNL_RT_5G_ETSI3_SCAN_TYPE \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24 +#define CHNL_RT_5G_FCC1_SCAN_TYPE \ + {36,40,44,48,149,153,157,161,165}, 9 +#define CHNL_RT_5G_FCC2_SCAN_TYPE \ + {36,40,44,48,52,56,60,64,149,153,157,161,165}, 13 +#define CHNL_RT_5G_FCC3_SCAN_TYPE \ + {36,40,44,48,52,56,60,64,149,153,157,161}, 12 +#define CHNL_RT_5G_FCC4_SCAN_TYPE \ + {149,153,157,161,165}, 5 +#define CHNL_RT_5G_FCC5_SCAN_TYPE \ + {36,40,44,48,52,56,60,64}, 8 +#define CHNL_RT_5G_FCC6_SCAN_TYPE \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20 +#define CHNL_RT_5G_FCC7_SCAN_TYPE \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20 +#define CHNL_RT_5G_IC1_SCAN_TYPE \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165}, 20 +#define CHNL_RT_5G_KCC1_SCAN_TYPE \ + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19 +#define CHNL_RT_5G_MKK1_SCAN_TYPE \ + {36,40,44,48,52,56,60,64}, 8 +#define CHNL_RT_5G_MKK2_SCAN_TYPE \ + {100,104,108,112,116,120,124,128,132,136,140}, 11 +#define CHNL_RT_5G_MKK3_SCAN_TYPE \ + {56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 24 +#define CHNL_RT_5G_NCC1_SCAN_TYPE \ + {56,60,64,149,153,157,161,165}, 8 + +// +// Global Regulation +// +typedef enum _RT_REGULATION_COMMON +{ + RT_WORLD, + RT_FCC, + RT_MKK, + RT_ETSI, + RT_IC, + RT_CE, + RT_NCC, + +}RT_REGULATION_CMN, *PRT_REGULATION_CMN; + + + +// +// Special requirement for different regulation domain. +// For internal test or customerize special request. +// +typedef enum _RT_CHNLPLAN_SREQ +{ + RT_SREQ_NA = 0x0, + RT_SREQ_2G_ADHOC_11N = 0x00000001, + RT_SREQ_2G_ADHOC_11B = 0x00000002, + RT_SREQ_2G_ALL_PASS = 0x00000004, + RT_SREQ_2G_ALL_ACT = 0x00000008, + RT_SREQ_5G_ADHOC_11N = 0x00000010, + RT_SREQ_5G_ADHOC_11AC = 0x00000020, + RT_SREQ_5G_ALL_PASS = 0x00000040, + RT_SREQ_5G_ALL_ACT = 0x00000080, + RT_SREQ_C1_PLAN = 0x00000100, + RT_SREQ_C2_PLAN = 0x00000200, + RT_SREQ_C3_PLAN = 0x00000400, + RT_SREQ_C4_PLAN = 0x00000800, + RT_SREQ_NFC_ON = 0x00001000, + RT_SREQ_MASK = 0x0000FFFF, /* Requirements bit mask */ + +}RT_CHNLPLAN_SREQ, *PRT_CHNLPLAN_SREQ; + + +// +// RT_COUNTRY_NAME & RT_REGULATION_2G & RT_REGULATION_5G transfer table +// +// +typedef struct _RT_CHANNEL_PLAN_COUNTRY_TRANSFER_TABLE +{ + // + // Define countery domain and corresponding + // + RT_COUNTRY_NAME Country_Enum; + char Country_Name[3]; + + //char Domain_Name[12]; + RT_REGULATION_2G Domain_2G; + + RT_REGULATION_5G Domain_5G; + + RT_CHANNEL_DOMAIN RtChDomain; + //u1Byte Country_Area; + +}RT_CHNL_CTRY_TBL, *PRT_CHNL_CTRY_TBL; + + +#define RT_MAX_CHNL_NUM_2G 13 +#define RT_MAX_CHNL_NUM_5G 44 + +// Power table sample. + +typedef struct _RT_CHNL_PLAN_PWR_LIMIT +{ + u2Byte Chnl_Start; + u2Byte Chnl_end; + u1Byte dB_Max; + u2Byte mW_Max; +}RT_CHNL_PWR_LIMIT, *PRT_CHNL_PWR_LIMIT; + + +#define RT_MAX_BAND_NUM 5 + +typedef struct _RT_CHANNEL_PLAN_MAXPWR +{ +// STRING_T + RT_CHNL_PWR_LIMIT Chnl[RT_MAX_BAND_NUM]; + u1Byte Band_Useful_Num; + + +}RT_CHANNEL_PLAN_MAXPWR, *PRT_CHANNEL_PLAN_MAXPWR; + + +// +// Power By Rate Table. +// + + + +typedef struct _RT_CHANNEL_PLAN_NEW +{ + // + // Define countery domain and corresponding + // + //char Country_Name[36]; + //u1Byte Country_Enum; + + //char Domain_Name[12]; + + + PRT_CHNL_CTRY_TBL pCtryTransfer; + + RT_CHANNEL_DOMAIN RtChDomain; + + RT_REGULATION_2G Domain_2G; + + RT_REGULATION_5G Domain_5G; + + RT_REGULATION_CMN Regulator; + + RT_CHNLPLAN_SREQ ChnlSreq; + + //RT_CHNL_PLAN_LIMIT RtChnl; + + u1Byte Chnl2G[MAX_CHANNEL_NUM]; // CHNL_RT_2G_WORLD + u1Byte Len2G; + u1Byte Chnl2GScanTp[MAX_CHANNEL_NUM]; // CHNL_RT_2G_WORLD_SCAN_TYPE + //u1Byte Freq2G[2]; // FREQ_RT_2G_WORLD + + u1Byte Chnl5G[MAX_CHANNEL_NUM]; + u1Byte Len5G; + u1Byte Chnl5GScanTp[MAX_CHANNEL_NUM]; + //u1Byte Freq2G[2]; // FREQ_RT_2G_WORLD + + RT_CHANNEL_PLAN_MAXPWR ChnlMaxPwr; + + +}RT_CHANNEL_PLAN_NEW, *PRT_CHANNEL_PLAN_NEW; + + +#endif // __RT_CHANNELPLAN_H__ + + + + + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm.c deleted file mode 100755 index 25d53cb24eae..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm.c +++ /dev/null @@ -1,6540 +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}}; - - -//============================================================ -// 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---------------------------// - -//Remove by Yuchen - -//END---------------DIG---------------------------// - -//START-------BB POWER SAVE-----------------------// -//Remove BB power Saving by YuChen -//END---------BB POWER SAVE-----------------------// - -//START-----------------PSD-----------------------// -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) -//============================================================ -// Function predefine. -//============================================================ - -//Remove PathDiversity related funtion predefine to odm_PathDiv.h - -//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 -----------------------// - -#endif - -//END-------------------PSD-----------------------// - -//Remove RAMASK by RS_James - -//Remove by YuChen - -//Remove Rssimonitorcheck by RS_James - -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 - ); - -//Remove RAMask by RS_James - -VOID -ODM_TXPowerTrackingCheck( - IN PDM_ODM_T pDM_Odm - ); - -VOID -odm_TXPowerTrackingCheckAP( - 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_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 - -//Remove Edca by Yu Chen - - -#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 -); - - -//============================================================ -//3 Export Interface -//============================================================ - -// -// 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_CmnInfoInit_Debug(pDM_Odm); - odm_DIGInit(pDM_Odm); - odm_NHMCounterStatisticsInit(pDM_Odm); - odm_AdaptivityInit(pDM_Odm); - odm_RateAdaptiveMaskInit(pDM_Odm); - ODM_CfoTrackingInit(pDM_Odm); - ODM_EdcaTurboInit(pDM_Odm); - odm_RSSIMonitorInit(pDM_Odm); - odm_TXPowerTrackingInit(pDM_Odm); - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - ODM_ClearTxPowerTrackingState(pDM_Odm); - - if ( *(pDM_Odm->mp_mode) != 1) - odm_PathDiversityInit(pDM_Odm); - -#endif - -#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) - 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); - } -#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 - - } - -} - -// -// 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_NHMCounterStatistics(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_CfoTracking(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; - 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; - - //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_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; - -/* - 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; ipODM_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; ipODM_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; ipODM_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)) -#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 - ) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - if(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES))) - return; -#endif - - 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 - pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = 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 ( *(pDM_Odm->mp_mode) != 1) - 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) != 1) - 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 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; iMainAnt_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; indexpODM_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; indexbAssociated) - 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) -} - - -// Remove odm_SwAntDivSelectScanChnl() and odm_SwAntDivConstructScanChnl() to odm_PathDiv.c - - -// -// 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; iCCK_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; ipODM_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; itx_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; itx_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 -//============================================================ - -//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 - -// -// 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 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_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->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); -} - -//Remove by Yuchen (seperate to odm_DIG.c) - - //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_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) - -//Remove PathDiversity related function to odm_PathDiv.c - -#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 - -#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= 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;iRSSI_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/rtl8723bu/hal/OUTSRC/odm.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm.h deleted file mode 100755 index 3144724646de..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm.h +++ /dev/null @@ -1,2061 +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 __HALDMOUTSRC_H__ -#define __HALDMOUTSRC_H__ - - -#include "odm_EdcaTurboCheck.h" -#include "odm_DIG.h" -#include "odm_PathDiv.h" -#include "odm_RaInfo.h" -#include "odm_DynamicBBPowerSaving.h" -#include "odm_DynamicTxPower.h" -#include "odm_CfoTracking.h" -#include "odm_NoiseMonitor.h" - -//============================================================ -// Definition -//============================================================ -// -// 2011/09/22 MH Define all team supprt ability. -// - -// -// 2011/09/22 MH Define for all teams. Please Define the constan in your precomp header. -// -//#define DM_ODM_SUPPORT_AP 0 -//#define DM_ODM_SUPPORT_ADSL 0 -//#define DM_ODM_SUPPORT_CE 0 -//#define DM_ODM_SUPPORT_MP 1 - -// -// 2011/09/28 MH Define ODM SW team support flag. -// - - - -// -// Antenna Switch Relative Definition. -// - -// -// 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. -// -#define TP_MODE 0 -#define RSSI_MODE 1 -#define TRAFFIC_LOW 0 -#define TRAFFIC_HIGH 1 - - -//============================================================ -//3 Tx Power Tracking -//3============================================================ -#define DPK_DELTA_MAPPING_NUM 13 -#define index_mapping_HP_NUM 15 -#define OFDM_TABLE_SIZE 43 -#define CCK_TABLE_SIZE 33 -#define TXSCALE_TABLE_SIZE 37 -#define TXPWR_TRACK_TABLE_SIZE 30 -#define DELTA_SWINGIDX_SIZE 30 -#define BAND_NUM 4 - -//============================================================ -//3 PSD Handler -//3============================================================ - -#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 PSD_SCAN_INTERVAL 700 //ms - - - -//8723A High Power IGI Setting -#define DM_DIG_HIGH_PWR_IGI_LOWER_BOUND 0x22 -#define DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND 0x28 -#define DM_DIG_HIGH_PWR_THRESHOLD 0x3a -#define DM_DIG_LOW_PWR_THRESHOLD 0x14 - -//ANT Test -#define ANTTESTALL 0x00 //Ant A or B will be Testing -#define ANTTESTA 0x01 //Ant A will be Testing -#define ANTTESTB 0x02 //Ant B will be testing - -//for 8723A Ant Definition--2012--06--07 due to different IC may be different ANT define -#define MAIN_ANT 1 //Ant A or Ant Main -#define AUX_ANT 2 //AntB or Ant Aux -#define MAX_ANT 3 // 3 for AP using - - -//Antenna Diversity Type -#define SW_ANTDIV 0 -#define HW_ANTDIV 1 -//============================================================ -// structure and define -//============================================================ - -// -// 2011/09/20 MH Add for AP/ADSLpseudo DM structuer requirement. -// We need to remove to other position??? -// -#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) -typedef struct rtl8192cd_priv { - u1Byte temp; - -}rtl8192cd_priv, *prtl8192cd_priv; -#endif - - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -typedef struct _ADAPTER{ - u1Byte temp; - #ifdef AP_BUILD_WORKAROUND - HAL_DATA_TYPE* temp2; - prtl8192cd_priv priv; - #endif -}ADAPTER, *PADAPTER; -#endif - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - -typedef struct _WLAN_STA{ - u1Byte temp; -} WLAN_STA, *PRT_WLAN_STA; - -#endif - -//Remove DIG by Yuchen - -//Remoce BB power saving by Yuchn - -//Remove DIG by yuchen - -typedef struct _Dynamic_Primary_CCA{ - u1Byte PriCCA_flag; - u1Byte intf_flag; - u1Byte intf_type; - u1Byte DupRTS_flag; - u1Byte Monitor_flag; - u1Byte CH_offset; - u1Byte MF_state; -}Pri_CCA_T, *pPri_CCA_T; - -//Remove RA_T,*pRA_T by RS_James - -typedef struct _RX_High_Power_ -{ - u1Byte RXHP_flag; - u1Byte PSD_func_trigger; - u1Byte PSD_bitmap_RXHP[80]; - u1Byte Pre_IGI; - u1Byte Cur_IGI; - u1Byte Pre_pw_th; - u1Byte Cur_pw_th; - BOOLEAN First_time_enter; - BOOLEAN RXHP_enable; - u1Byte TP_Mode; - RT_TIMER PSDTimer; -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - #if USE_WORKITEM - RT_WORK_ITEM PSDTimeWorkitem; - #endif -#endif - -}RXHP_T, *pRXHP_T; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_CE)) -#define ASSOCIATE_ENTRY_NUM 32 // Max size of AsocEntry[]. -#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM - -#elif(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#define ASSOCIATE_ENTRY_NUM NUM_STAT -#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1 - -#else -// -// 2012/01/12 MH Revise for compatiable with other SW team. -// 0 is for STA 1-n is for AP clients. -// -#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1// Default port only one -#endif - -//#ifdef CONFIG_ANTENNA_DIVERSITY -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 - -#define TP_MODE 0 -#define RSSI_MODE 1 -#define TRAFFIC_LOW 0 -#define TRAFFIC_HIGH 1 -#define TRAFFIC_UltraLOW 2 - -typedef struct _SW_Antenna_Switch_ -{ - u1Byte Double_chk_flag; - u1Byte try_flag; - s4Byte PreRSSI; - u1Byte CurAntenna; - u1Byte PreAntenna; - u1Byte RSSI_Trying; - u1Byte TestMode; - u1Byte bTriggerAntennaSwitch; - u1Byte SelectAntennaMap; - u1Byte RSSI_target; - u1Byte reset_idx; - - // Before link Antenna Switch check - u1Byte SWAS_NoLink_State; - u4Byte SWAS_NoLink_BK_Reg860; - u4Byte SWAS_NoLink_BK_Reg92c; - BOOLEAN ANTA_ON; //To indicate Ant A is or not - BOOLEAN ANTB_ON; //To indicate Ant B is on or not - u1Byte Ant5G; - u1Byte Ant2G; - - s4Byte RSSI_sum_A; - s4Byte RSSI_sum_B; - s4Byte RSSI_cnt_A; - s4Byte RSSI_cnt_B; - - u8Byte lastTxOkCnt; - u8Byte lastRxOkCnt; - u8Byte TXByteCnt_A; - u8Byte TXByteCnt_B; - u8Byte RXByteCnt_A; - u8Byte RXByteCnt_B; - u1Byte TrafficLoad; - u1Byte Train_time; - u1Byte Train_time_flag; - RT_TIMER SwAntennaSwitchTimer; - RT_TIMER SwAntennaSwitchTimer_8723B; -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - #if USE_WORKITEM - RT_WORK_ITEM SwAntennaSwitchWorkitem; - RT_WORK_ITEM SwAntennaSwitchWorkitem_8723B; - #endif -#endif -/* CE Platform use -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - _timer SwAntennaSwitchTimer; - u8Byte lastTxOkCnt; - u8Byte lastRxOkCnt; - u8Byte TXByteCnt_A; - u8Byte TXByteCnt_B; - u8Byte RXByteCnt_A; - u8Byte RXByteCnt_B; - u1Byte DoubleComfirm; - u1Byte TrafficLoad; - //SW Antenna Switch - - -#endif -*/ -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - //Hybrid Antenna Diversity - u4Byte CCK_Ant1_Cnt[ASSOCIATE_ENTRY_NUM+1]; - u4Byte CCK_Ant2_Cnt[ASSOCIATE_ENTRY_NUM+1]; - u4Byte OFDM_Ant1_Cnt[ASSOCIATE_ENTRY_NUM+1]; - u4Byte OFDM_Ant2_Cnt[ASSOCIATE_ENTRY_NUM+1]; - u4Byte RSSI_Ant1_Sum[ASSOCIATE_ENTRY_NUM+1]; - u4Byte RSSI_Ant2_Sum[ASSOCIATE_ENTRY_NUM+1]; - u1Byte TxAnt[ASSOCIATE_ENTRY_NUM+1]; - u1Byte TargetSTA; - u1Byte antsel; - u1Byte RxIdleAnt; - -#endif - -}SWAT_T, *pSWAT_T; -//#endif - -//Remove Edca by YuChen - -//Remove ODM_RATE_ADAPTIVE by RS_James - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - - -#ifdef ADSL_AP_BUILD_WORKAROUND -#define MAX_TOLERANCE 5 -#define IQK_DELAY_TIME 1 //ms -#endif - -// -// Indicate different AP vendor for IOT issue. -// -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_MAX = 16 -}HT_IOT_PEER_E, *PHTIOT_PEER_E; -#endif//#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - - - -#define IQK_MAC_REG_NUM 4 -#define IQK_ADDA_REG_NUM 16 -#define IQK_BB_REG_NUM_MAX 10 -#if (RTL8192D_SUPPORT==1) -#define IQK_BB_REG_NUM 10 -#else -#define IQK_BB_REG_NUM 9 -#endif -#define HP_THERMAL_NUM 8 - -#define AVG_THERMAL_NUM 8 -#define IQK_Matrix_REG_NUM 8 -#define IQK_Matrix_Settings_NUM 14+24+21 // Channels_2_4G_NUM + Channels_5G_20M_NUM + Channels_5G - -#define DM_Type_ByFW 0 -#define DM_Type_ByDriver 1 - -// -// Declare for common info -// -#define MAX_PATH_NUM_92CS 2 -#define MAX_PATH_NUM_8188E 1 -#define MAX_PATH_NUM_8192E 2 -#define MAX_PATH_NUM_8723B 1 -#define MAX_PATH_NUM_8812A 2 -#define MAX_PATH_NUM_8821A 1 - -#define IQK_THRESHOLD 8 - -typedef struct _ODM_Phy_Status_Info_ -{ - // - // Be care, if you want to add any element please insert between - // RxPWDBAll & SignalStrength. - // -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - u4Byte RxPWDBAll; -#else - u1Byte RxPWDBAll; -#endif - - u1Byte SignalQuality; // in 0-100 index. - s1Byte RxMIMOSignalQuality[4]; //per-path's EVM - u1Byte RxMIMOEVMdbm[4]; //per-path's EVM dbm - - u1Byte RxMIMOSignalStrength[4];// in 0~100 index - - u2Byte Cfo_short[4]; // per-path's Cfo_short - u2Byte Cfo_tail[4]; // per-path's Cfo_tail - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - s1Byte RxPower; // in dBm Translate from PWdB - s1Byte RecvSignalPower; // Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. - u1Byte BTRxRSSIPercentage; - u1Byte SignalStrength; // in 0-100 index. - - s1Byte RxPwr[4]; //per-path's pwdb -#endif - u1Byte RxSNR[4]; //per-path's SNR - u1Byte BandWidth; - u1Byte btCoexPwrAdjust; -}ODM_PHY_INFO_T,*PODM_PHY_INFO_T; - - -typedef struct _ODM_Per_Pkt_Info_ -{ - //u1Byte Rate; - u1Byte DataRate; - u1Byte StationID; - BOOLEAN bPacketMatchBSSID; - BOOLEAN bPacketToSelf; - BOOLEAN bPacketBeacon; -}ODM_PACKET_INFO_T,*PODM_PACKET_INFO_T; - - -typedef struct _ODM_Phy_Dbg_Info_ -{ - //ODM Write,debug info - s1Byte RxSNRdB[4]; - u4Byte NumQryPhyStatus; - u4Byte NumQryPhyStatusCCK; - u4Byte NumQryPhyStatusOFDM; - u1Byte NumQryBeaconPkt; - //Others - s4Byte RxEVM[4]; - -}ODM_PHY_DBG_INFO_T; - - -typedef struct _ODM_Mac_Status_Info_ -{ - u1Byte test; - -}ODM_MAC_INFO; - - -typedef enum tag_Dynamic_ODM_Support_Ability_Type -{ - // BB Team - ODM_DIG = 0x00000001, - ODM_HIGH_POWER = 0x00000002, - ODM_CCK_CCA_TH = 0x00000004, - ODM_FA_STATISTICS = 0x00000008, - ODM_RAMASK = 0x00000010, - ODM_RSSI_MONITOR = 0x00000020, - ODM_SW_ANTDIV = 0x00000040, - ODM_HW_ANTDIV = 0x00000080, - ODM_BB_PWRSV = 0x00000100, - ODM_2TPATHDIV = 0x00000200, - ODM_1TPATHDIV = 0x00000400, - ODM_PSD2AFH = 0x00000800 -}ODM_Ability_E; - -// -// 2011/20/20 MH For MP driver RT_WLAN_STA = STA_INFO_T -// Please declare below ODM relative info in your STA info structure. -// -#if 1 -typedef struct _ODM_STA_INFO{ - // Driver Write - BOOLEAN bUsed; // record the sta status link or not? - //u1Byte WirelessMode; // - u1Byte IOTPeer; // Enum value. HT_IOT_PEER_E - - // ODM Write - //1 PHY_STATUS_INFO - u1Byte RSSI_Path[4]; // - u1Byte RSSI_Ave; - u1Byte RXEVM[4]; - u1Byte RXSNR[4]; - - // ODM Write - //1 TX_INFO (may changed by IC) - //TX_INFO_T pTxInfo; // Define in IC folder. Move lower layer. -#if 0 - u1Byte ANTSEL_A; //in Jagar: 4bit; others: 2bit - u1Byte ANTSEL_B; //in Jagar: 4bit; others: 2bit - u1Byte ANTSEL_C; //only in Jagar: 4bit - u1Byte ANTSEL_D; //only in Jagar: 4bit - u1Byte TX_ANTL; //not in Jagar: 2bit - u1Byte TX_ANT_HT; //not in Jagar: 2bit - u1Byte TX_ANT_CCK; //not in Jagar: 2bit - u1Byte TXAGC_A; //not in Jagar: 4bit - u1Byte TXAGC_B; //not in Jagar: 4bit - u1Byte TXPWR_OFFSET; //only in Jagar: 3bit - u1Byte TX_ANT; //only in Jagar: 4bit for TX_ANTL/TX_ANTHT/TX_ANT_CCK -#endif - - // - // Please use compile flag to disabe the strcutrue for other IC except 88E. - // Move To lower layer. - // - // ODM Write Wilson will handle this part(said by Luke.Lee) - //TX_RPT_T pTxRpt; // Define in IC folder. Move lower layer. -#if 0 - //1 For 88E RA (don't redefine the naming) - u1Byte rate_id; - u1Byte rate_SGI; - u1Byte rssi_sta_ra; - u1Byte SGI_enable; - u1Byte Decision_rate; - u1Byte Pre_rate; - u1Byte Active; - - // Driver write Wilson handle. - //1 TX_RPT (don't redefine the naming) - u2Byte RTY[4]; // ??? - u2Byte TOTAL; // ??? - u2Byte DROP; // ??? - // - // Please use compile flag to disabe the strcutrue for other IC except 88E. - // -#endif - -}ODM_STA_INFO_T, *PODM_STA_INFO_T; -#endif - -// -// 2011/10/20 MH Define Common info enum for all team. -// -typedef enum _ODM_Common_Info_Definition -{ -//-------------REMOVED CASE-----------// - //ODM_CMNINFO_CCK_HP, - //ODM_CMNINFO_RFPATH_ENABLE, // Define as ODM write??? - //ODM_CMNINFO_BT_COEXIST, // ODM_BT_COEXIST_E - //ODM_CMNINFO_OP_MODE, // ODM_OPERATION_MODE_E -//-------------REMOVED CASE-----------// - - // - // Fixed value: - // - - //-----------HOOK BEFORE REG INIT-----------// - ODM_CMNINFO_PLATFORM = 0, - ODM_CMNINFO_ABILITY, // ODM_ABILITY_E - ODM_CMNINFO_INTERFACE, // ODM_INTERFACE_E - ODM_CMNINFO_MP_TEST_CHIP, - ODM_CMNINFO_IC_TYPE, // ODM_IC_TYPE_E - ODM_CMNINFO_CUT_VER, // ODM_CUT_VERSION_E - ODM_CMNINFO_FAB_VER, // ODM_FAB_E - ODM_CMNINFO_RF_TYPE, // ODM_RF_PATH_E or ODM_RF_TYPE_E? - ODM_CMNINFO_RFE_TYPE, - ODM_CMNINFO_BOARD_TYPE, // ODM_BOARD_TYPE_E - ODM_CMNINFO_PACKAGE_TYPE, - ODM_CMNINFO_EXT_LNA, // TRUE - ODM_CMNINFO_5G_EXT_LNA, - ODM_CMNINFO_EXT_PA, - ODM_CMNINFO_5G_EXT_PA, - ODM_CMNINFO_GPA, - ODM_CMNINFO_APA, - ODM_CMNINFO_GLNA, - ODM_CMNINFO_ALNA, - ODM_CMNINFO_EXT_TRSW, - ODM_CMNINFO_PATCH_ID, //CUSTOMER ID - ODM_CMNINFO_BINHCT_TEST, - ODM_CMNINFO_BWIFI_TEST, - ODM_CMNINFO_SMART_CONCURRENT, - ODM_CMNINFO_DOMAIN_CODE_2G, - ODM_CMNINFO_DOMAIN_CODE_5G, - //-----------HOOK BEFORE REG INIT-----------// - - - // - // Dynamic value: - // -//--------- POINTER REFERENCE-----------// - ODM_CMNINFO_MAC_PHY_MODE, // ODM_MAC_PHY_MODE_E - ODM_CMNINFO_TX_UNI, - ODM_CMNINFO_RX_UNI, - ODM_CMNINFO_WM_MODE, // ODM_WIRELESS_MODE_E - ODM_CMNINFO_BAND, // ODM_BAND_TYPE_E - ODM_CMNINFO_SEC_CHNL_OFFSET, // ODM_SEC_CHNL_OFFSET_E - ODM_CMNINFO_SEC_MODE, // ODM_SECURITY_E - ODM_CMNINFO_BW, // ODM_BW_E - ODM_CMNINFO_CHNL, - ODM_CMNINFO_FORCED_RATE, - - ODM_CMNINFO_DMSP_GET_VALUE, - ODM_CMNINFO_BUDDY_ADAPTOR, - ODM_CMNINFO_DMSP_IS_MASTER, - ODM_CMNINFO_SCAN, - ODM_CMNINFO_POWER_SAVING, - ODM_CMNINFO_ONE_PATH_CCA, // ODM_CCA_PATH_E - ODM_CMNINFO_DRV_STOP, - ODM_CMNINFO_PNP_IN, - ODM_CMNINFO_INIT_ON, - ODM_CMNINFO_ANT_TEST, - ODM_CMNINFO_NET_CLOSED, - ODM_CMNINFO_MP_MODE, - //ODM_CMNINFO_RTSTA_AID, // For win driver only? - ODM_CMNINFO_FORCED_IGI_LB, -//--------- POINTER REFERENCE-----------// - -//------------CALL BY VALUE-------------// - ODM_CMNINFO_WIFI_DIRECT, - ODM_CMNINFO_WIFI_DISPLAY, - ODM_CMNINFO_LINK_IN_PROGRESS, - ODM_CMNINFO_LINK, - ODM_CMNINFO_STATION_STATE, - ODM_CMNINFO_RSSI_MIN, - ODM_CMNINFO_DBG_COMP, // u8Byte - ODM_CMNINFO_DBG_LEVEL, // u4Byte - ODM_CMNINFO_RA_THRESHOLD_HIGH, // u1Byte - ODM_CMNINFO_RA_THRESHOLD_LOW, // u1Byte - ODM_CMNINFO_RF_ANTENNA_TYPE, // u1Byte - ODM_CMNINFO_BT_ENABLED, - ODM_CMNINFO_BT_HS_CONNECT_PROCESS, - ODM_CMNINFO_BT_HS_RSSI, - ODM_CMNINFO_BT_OPERATION, - ODM_CMNINFO_BT_LIMITED_DIG, //Need to Limited Dig or not - ODM_CMNINFO_BT_DISABLE_EDCA, -//------------CALL BY VALUE-------------// - - // - // Dynamic ptr array hook itms. - // - ODM_CMNINFO_STA_STATUS, - ODM_CMNINFO_PHY_STATUS, - ODM_CMNINFO_MAC_STATUS, - - ODM_CMNINFO_MAX, - - -}ODM_CMNINFO_E; - -// -// 2011/10/20 MH Define ODM support ability. ODM_CMNINFO_ABILITY -// -typedef enum _ODM_Support_Ability_Definition -{ - // - // BB ODM section BIT 0-15 - // - ODM_BB_DIG = BIT0, - ODM_BB_RA_MASK = BIT1, - ODM_BB_DYNAMIC_TXPWR = BIT2, - ODM_BB_FA_CNT = BIT3, - ODM_BB_RSSI_MONITOR = BIT4, - ODM_BB_CCK_PD = BIT5, - ODM_BB_ANT_DIV = BIT6, - ODM_BB_PWR_SAVE = BIT7, - ODM_BB_PWR_TRAIN = BIT8, - ODM_BB_RATE_ADAPTIVE = BIT9, - ODM_BB_PATH_DIV = BIT10, - ODM_BB_PSD = BIT11, - ODM_BB_RXHP = BIT12, - ODM_BB_ADAPTIVITY = BIT13, - ODM_BB_CFO_TRACKING = BIT14, - - // - // MAC DM section BIT 16-23 - // - ODM_MAC_EDCA_TURBO = BIT16, - ODM_MAC_EARLY_MODE = BIT17, - - // - // RF ODM section BIT 24-31 - // - ODM_RF_TX_PWR_TRACK = BIT24, - ODM_RF_RX_GAIN_TRACK = BIT25, - ODM_RF_CALIBRATION = BIT26, - -}ODM_ABILITY_E; - -// ODM_CMNINFO_INTERFACE -typedef enum tag_ODM_Support_Interface_Definition -{ - ODM_ITRF_PCIE = 0x1, - ODM_ITRF_USB = 0x2, - ODM_ITRF_SDIO = 0x4, - ODM_ITRF_ALL = 0x7, -}ODM_INTERFACE_E; - -// ODM_CMNINFO_IC_TYPE -typedef enum tag_ODM_Support_IC_Type_Definition -{ - ODM_RTL8192S = BIT0, - ODM_RTL8192C = BIT1, - ODM_RTL8192D = BIT2, - ODM_RTL8723A = BIT3, - ODM_RTL8188E = BIT4, - ODM_RTL8812 = BIT5, - ODM_RTL8821 = BIT6, - ODM_RTL8192E = BIT7, - ODM_RTL8723B = BIT8, - ODM_RTL8814A = BIT9, - ODM_RTL8881A = BIT10, - ODM_RTL8821B = BIT11 -}ODM_IC_TYPE_E; - -#define ODM_IC_11N_SERIES (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B) -#define ODM_IC_11AC_SERIES (ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A) - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#ifdef RTK_AC_SUPPORT -#define ODM_IC_11AC_SERIES_SUPPORT 1 -#else -#define ODM_IC_11AC_SERIES_SUPPORT 0 -#endif -#else -#define ODM_IC_11AC_SERIES_SUPPORT 1 -#endif - -//ODM_CMNINFO_CUT_VER -typedef enum tag_ODM_Cut_Version_Definition -{ - ODM_CUT_A = 0, - ODM_CUT_B = 1, - ODM_CUT_C = 2, - ODM_CUT_D = 3, - ODM_CUT_E = 4, - ODM_CUT_F = 5, - - ODM_CUT_I = 8, - ODM_CUT_TEST = 15, -}ODM_CUT_VERSION_E; - -// ODM_CMNINFO_FAB_VER -typedef enum tag_ODM_Fab_Version_Definition -{ - ODM_TSMC = 0, - ODM_UMC = 1, -}ODM_FAB_E; - -// ODM_CMNINFO_RF_TYPE -// -// For example 1T2R (A+AB = BIT0|BIT4|BIT5) -// -typedef enum tag_ODM_RF_Path_Bit_Definition -{ - ODM_RF_TX_A = BIT0, - ODM_RF_TX_B = BIT1, - ODM_RF_TX_C = BIT2, - ODM_RF_TX_D = BIT3, - ODM_RF_RX_A = BIT4, - ODM_RF_RX_B = BIT5, - ODM_RF_RX_C = BIT6, - ODM_RF_RX_D = BIT7, -}ODM_RF_PATH_E; - - -typedef enum tag_ODM_RF_Type_Definition -{ - ODM_1T1R = 0, - ODM_1T2R = 1, - ODM_2T2R = 2, - ODM_2T3R = 3, - ODM_2T4R = 4, - ODM_3T3R = 5, - ODM_3T4R = 6, - ODM_4T4R = 7, -}ODM_RF_TYPE_E; - - -// -// ODM Dynamic common info value definition -// - -//typedef enum _MACPHY_MODE_8192D{ -// SINGLEMAC_SINGLEPHY, -// DUALMAC_DUALPHY, -// DUALMAC_SINGLEPHY, -//}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D; -// Above is the original define in MP driver. Please use the same define. THX. -typedef enum tag_ODM_MAC_PHY_Mode_Definition -{ - ODM_SMSP = 0, - ODM_DMSP = 1, - ODM_DMDP = 2, -}ODM_MAC_PHY_MODE_E; - - -typedef enum tag_BT_Coexist_Definition -{ - ODM_BT_BUSY = 1, - ODM_BT_ON = 2, - ODM_BT_OFF = 3, - ODM_BT_NONE = 4, -}ODM_BT_COEXIST_E; - -// ODM_CMNINFO_OP_MODE -typedef enum tag_Operation_Mode_Definition -{ - ODM_NO_LINK = BIT0, - ODM_LINK = BIT1, - ODM_SCAN = BIT2, - ODM_POWERSAVE = BIT3, - ODM_AP_MODE = BIT4, - ODM_CLIENT_MODE = BIT5, - ODM_AD_HOC = BIT6, - ODM_WIFI_DIRECT = BIT7, - ODM_WIFI_DISPLAY = BIT8, -}ODM_OPERATION_MODE_E; - -// ODM_CMNINFO_WM_MODE -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE)) -typedef enum tag_Wireless_Mode_Definition -{ - ODM_WM_UNKNOW = 0x0, - ODM_WM_B = BIT0, - ODM_WM_G = BIT1, - ODM_WM_A = BIT2, - ODM_WM_N24G = BIT3, - ODM_WM_N5G = BIT4, - ODM_WM_AUTO = BIT5, - ODM_WM_AC = BIT6, -}ODM_WIRELESS_MODE_E; -#else -typedef enum tag_Wireless_Mode_Definition -{ - ODM_WM_UNKNOWN = 0x00, - ODM_WM_A = BIT0, - ODM_WM_B = BIT1, - ODM_WM_G = BIT2, - ODM_WM_AUTO = BIT3, - ODM_WM_N24G = BIT4, - ODM_WM_N5G = BIT5, - ODM_WM_AC_5G = BIT6, - ODM_WM_AC_24G = BIT7, - ODM_WM_AC_ONLY = BIT8, - ODM_WM_MAX = BIT9 -}ODM_WIRELESS_MODE_E; -#endif - -// ODM_CMNINFO_BAND -typedef enum tag_Band_Type_Definition -{ - ODM_BAND_2_4G = 0, - ODM_BAND_5G, - ODM_BAND_ON_BOTH, - ODM_BANDMAX - -}ODM_BAND_TYPE_E; - -// ODM_CMNINFO_SEC_CHNL_OFFSET -typedef enum tag_Secondary_Channel_Offset_Definition -{ - ODM_DONT_CARE = 0, - ODM_BELOW = 1, - ODM_ABOVE = 2 -}ODM_SEC_CHNL_OFFSET_E; - -// ODM_CMNINFO_SEC_MODE -typedef enum tag_Security_Definition -{ - ODM_SEC_OPEN = 0, - ODM_SEC_WEP40 = 1, - ODM_SEC_TKIP = 2, - ODM_SEC_RESERVE = 3, - ODM_SEC_AESCCMP = 4, - ODM_SEC_WEP104 = 5, - ODM_WEP_WPA_MIXED = 6, // WEP + WPA - ODM_SEC_SMS4 = 7, -}ODM_SECURITY_E; - -// ODM_CMNINFO_BW -typedef enum tag_Bandwidth_Definition -{ - ODM_BW20M = 0, - ODM_BW40M = 1, - ODM_BW80M = 2, - ODM_BW160M = 3, - ODM_BW10M = 4, -}ODM_BW_E; - - -// ODM_CMNINFO_BOARD_TYPE -// For non-AC-series IC , ODM_BOARD_5G_EXT_PA and ODM_BOARD_5G_EXT_LNA are ignored -// For AC-series IC, external PA & LNA can be indivisuallly added on 2.4G and/or 5G -typedef enum tag_Board_Definition -{ - ODM_BOARD_DEFAULT = 0, // The DEFAULT case. - ODM_BOARD_MINICARD = BIT(0), // 0 = non-mini card, 1= mini card. - ODM_BOARD_SLIM = BIT(1), // 0 = non-slim card, 1 = slim card - ODM_BOARD_BT = BIT(2), // 0 = without BT card, 1 = with BT - ODM_BOARD_EXT_PA = BIT(3), // 0 = no 2G ext-PA, 1 = existing 2G ext-PA - ODM_BOARD_EXT_LNA = BIT(4), // 0 = no 2G ext-LNA, 1 = existing 2G ext-LNA - ODM_BOARD_EXT_TRSW = BIT(5), // 0 = no ext-TRSW, 1 = existing ext-TRSW - ODM_BOARD_EXT_PA_5G = BIT(6), // 0 = no 5G ext-PA, 1 = existing 5G ext-PA - ODM_BOARD_EXT_LNA_5G= BIT(7), // 0 = no 5G ext-LNA, 1 = existing 5G ext-LNA -}ODM_BOARD_TYPE_E; - -typedef enum tag_ODM_Package_Definition -{ - ODM_PACKAGE_DEFAULT = 0, - ODM_PACKAGE_QFN68 = BIT(0), - ODM_PACKAGE_TFBGA90 = BIT(1), - ODM_PACKAGE_TFBGA79 = BIT(2), -}ODM_Package_TYPE_E; - -typedef enum tag_ODM_TYPE_GPA_Definition -{ - TYPE_GPA0 = 0, - TYPE_GPA1 = BIT(1)|BIT(0) -}ODM_TYPE_GPA_E; - -typedef enum tag_ODM_TYPE_APA_Definition -{ - TYPE_APA0 = 0, - TYPE_APA1 = BIT(1)|BIT(0) -}ODM_TYPE_APA_E; - -typedef enum tag_ODM_TYPE_GLNA_Definition -{ - TYPE_GLNA0 = 0, - TYPE_GLNA1 = BIT(2)|BIT(0), - TYPE_GLNA2 = BIT(3)|BIT(1), - TYPE_GLNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0) -}ODM_TYPE_GLNA_E; - -typedef enum tag_ODM_TYPE_ALNA_Definition -{ - TYPE_ALNA0 = 0, - TYPE_ALNA1 = BIT(2)|BIT(0), - TYPE_ALNA2 = BIT(3)|BIT(1), - TYPE_ALNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0) -}ODM_TYPE_ALNA_E; - -// ODM_CMNINFO_ONE_PATH_CCA -typedef enum tag_CCA_Path -{ - ODM_CCA_2R = 0, - ODM_CCA_1R_A = 1, - ODM_CCA_1R_B = 2, -}ODM_CCA_PATH_E; - - -typedef struct _ODM_RA_Info_ -{ - u1Byte RateID; - u4Byte RateMask; - u4Byte RAUseRate; - u1Byte RateSGI; - u1Byte RssiStaRA; - u1Byte PreRssiStaRA; - u1Byte SGIEnable; - u1Byte DecisionRate; - u1Byte PreRate; - u1Byte HighestRate; - u1Byte LowestRate; - u4Byte NscUp; - u4Byte NscDown; - u2Byte RTY[5]; - u4Byte TOTAL; - u2Byte DROP; - u1Byte Active; - u2Byte RptTime; - u1Byte RAWaitingCounter; - u1Byte RAPendingCounter; -#if 1 //POWER_TRAINING_ACTIVE == 1 // For compile pass only~! - u1Byte PTActive; // on or off - u1Byte PTTryState; // 0 trying state, 1 for decision state - u1Byte PTStage; // 0~6 - u1Byte PTStopCount; //Stop PT counter - u1Byte PTPreRate; // if rate change do PT - u1Byte PTPreRssi; // if RSSI change 5% do PT - u1Byte PTModeSS; // decide whitch rate should do PT - u1Byte RAstage; // StageRA, decide how many times RA will be done between PT - u1Byte PTSmoothFactor; -#endif -} ODM_RA_INFO_T,*PODM_RA_INFO_T; - -typedef struct _IQK_MATRIX_REGS_SETTING{ - BOOLEAN bIQKDone; - s4Byte Value[3][IQK_Matrix_REG_NUM]; - BOOLEAN bBWIqkResultSaved[3]; -}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING; - - -//Remove PATHDIV_PARA struct to odm_PathDiv.h - -typedef struct ODM_RF_Calibration_Structure -{ - //for tx power tracking - - u4Byte RegA24; // for TempCCK - s4Byte RegE94; - s4Byte RegE9C; - s4Byte RegEB4; - s4Byte RegEBC; - - u1Byte TXPowercount; - BOOLEAN bTXPowerTrackingInit; - BOOLEAN bTXPowerTracking; - u1Byte TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default - u1Byte TM_Trigger; - u1Byte InternalPA5G[2]; //pathA / pathB - - u1Byte ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 - u1Byte ThermalValue; - u1Byte ThermalValue_LCK; - u1Byte ThermalValue_IQK; - u1Byte ThermalValue_DPK; - u1Byte ThermalValue_AVG[AVG_THERMAL_NUM]; - u1Byte ThermalValue_AVG_index; - u1Byte ThermalValue_RxGain; - u1Byte ThermalValue_Crystal; - u1Byte ThermalValue_DPKstore; - u1Byte ThermalValue_DPKtrack; - BOOLEAN TxPowerTrackingInProgress; - - BOOLEAN bReloadtxpowerindex; - u1Byte bRfPiEnable; - u4Byte TXPowerTrackingCallbackCnt; //cosa add for debug - - - //------------------------- Tx power Tracking -------------------------// - u1Byte bCCKinCH14; - u1Byte CCK_index; - u1Byte OFDM_index[MAX_RF_PATH]; - s1Byte PowerIndexOffset[MAX_RF_PATH]; - s1Byte DeltaPowerIndex[MAX_RF_PATH]; - s1Byte DeltaPowerIndexLast[MAX_RF_PATH]; - BOOLEAN bTxPowerChanged; - - u1Byte ThermalValue_HP[HP_THERMAL_NUM]; - u1Byte ThermalValue_HP_index; - IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; - BOOLEAN bNeedIQK; - BOOLEAN bIQKInProgress; - u1Byte Delta_IQK; - u1Byte Delta_LCK; - s1Byte BBSwingDiff2G, BBSwingDiff5G; // Unit: dB - u1Byte DeltaSwingTableIdx_2GCCKA_P[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GCCKA_N[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GCCKB_P[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GCCKB_N[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GA_P[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GA_N[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GB_P[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GB_N[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_5GA_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_5GA_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_5GB_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_5GB_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GA_P_8188E[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GA_N_8188E[DELTA_SWINGIDX_SIZE]; - - //--------------------------------------------------------------------// - - //for IQK - u4Byte RegC04; - u4Byte Reg874; - u4Byte RegC08; - u4Byte RegB68; - u4Byte RegB6C; - u4Byte Reg870; - u4Byte Reg860; - u4Byte Reg864; - - BOOLEAN bIQKInitialized; - BOOLEAN bLCKInProgress; - BOOLEAN bAntennaDetected; - u4Byte ADDA_backup[IQK_ADDA_REG_NUM]; - u4Byte IQK_MAC_backup[IQK_MAC_REG_NUM]; - u4Byte IQK_BB_backup_recover[9]; - u4Byte IQK_BB_backup[IQK_BB_REG_NUM]; - - //for APK - u4Byte APKoutput[2][2]; //path A/B; output1_1a/output1_2a - u1Byte bAPKdone; - u1Byte bAPKThermalMeterIgnore; - u1Byte bDPdone; - u1Byte bDPPathAOK; - u1Byte bDPPathBOK; - - u4Byte TxIQC_8723B[2][3][2]; // { {S1: 0xc94, 0xc80, 0xc4c} , {S0: 0xc9c, 0xc88, 0xc4c}} - u4Byte RxIQC_8723B[2][2][2]; // { {S1: 0xc14, 0xca0} , {S0: 0xc14, 0xca0}} - u4Byte TxLOK[2]; - -}ODM_RF_CAL_T,*PODM_RF_CAL_T; -// -// ODM Dynamic common info value definition -// - -typedef struct _FAST_ANTENNA_TRAINNING_ -{ - u1Byte Bssid[6]; - u1Byte antsel_rx_keep_0; - u1Byte antsel_rx_keep_1; - u1Byte antsel_rx_keep_2; - u4Byte antSumRSSI[7]; - u4Byte antRSSIcnt[7]; - u4Byte antAveRSSI[7]; - u1Byte FAT_State; - u4Byte TrainIdx; - u1Byte antsel_a[ODM_ASSOCIATE_ENTRY_NUM]; - u1Byte antsel_b[ODM_ASSOCIATE_ENTRY_NUM]; - u1Byte antsel_c[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte MainAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte AuxAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte MainAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte AuxAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; - u1Byte RxIdleAnt; - BOOLEAN bBecomeLinked; - u4Byte MinMaxRSSI; - u1Byte idx_AntDiv_counter_2G; - u1Byte idx_AntDiv_counter_5G; - u4Byte AntDiv_2G_5G; - u4Byte CCK_counter_main; - u4Byte CCK_counter_aux; - u4Byte OFDM_counter_main; - u4Byte OFDM_counter_aux; - -}FAT_T,*pFAT_T; - -typedef enum _FAT_STATE -{ - FAT_NORMAL_STATE = 0, - FAT_TRAINING_STATE = 1, -}FAT_STATE_E, *PFAT_STATE_E; - -typedef enum _ANT_DIV_TYPE -{ - NO_ANTDIV = 0xFF, - CG_TRX_HW_ANTDIV = 0x01, - CGCS_RX_HW_ANTDIV = 0x02, - FIXED_HW_ANTDIV = 0x03, - CG_TRX_SMART_ANTDIV = 0x04, - CGCS_RX_SW_ANTDIV = 0x05, - S0S1_SW_ANTDIV = 0x06 //8723B intrnal switch S0 S1 -}ANT_DIV_TYPE_E, *PANT_DIV_TYPE_E; - -typedef struct _ODM_PATH_DIVERSITY_ -{ - u1Byte RespTxPath; - u1Byte PathSel[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte PathA_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte PathB_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte PathA_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte PathB_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; -}PATHDIV_T, *pPATHDIV_T; - - -typedef enum _BASEBAND_CONFIG_PHY_REG_PG_VALUE_TYPE{ - PHY_REG_PG_RELATIVE_VALUE = 0, - PHY_REG_PG_EXACT_VALUE = 1 -} PHY_REG_PG_TYPE; - - -// -// Antenna detection information from single tone mechanism, added by Roger, 2012.11.27. -// -typedef struct _ANT_DETECTED_INFO{ - BOOLEAN bAntDetected; - u4Byte dBForAntA; - u4Byte dBForAntB; - u4Byte dBForAntO; -}ANT_DETECTED_INFO, *PANT_DETECTED_INFO; - -// -// 2011/09/22 MH Copy from SD4 defined structure. We use to support PHY DM integration. -// -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) -#if (RT_PLATFORM != PLATFORM_LINUX) -typedef -#endif -struct DM_Out_Source_Dynamic_Mechanism_Structure -#else// for AP,ADSL,CE Team -typedef struct DM_Out_Source_Dynamic_Mechanism_Structure -#endif -{ - //RT_TIMER FastAntTrainingTimer; - // - // Add for different team use temporarily - // - PADAPTER Adapter; // For CE/NIC team - prtl8192cd_priv priv; // For AP/ADSL team - // WHen you use Adapter or priv pointer, you must make sure the pointer is ready. - BOOLEAN odm_ready; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - rtl8192cd_priv fake_priv; -#endif -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - // ADSL_AP_BUILD_WORKAROUND - ADAPTER fake_adapter; -#endif - - PHY_REG_PG_TYPE PhyRegPgValueType; - u1Byte PhyRegPgVersion; - - u8Byte DebugComponents; - u4Byte DebugLevel; - - u4Byte NumQryPhyStatusAll; //CCK + OFDM - u4Byte LastNumQryPhyStatusAll; - u4Byte RxPWDBAve; - BOOLEAN MPDIG_2G; //off MPDIG - u1Byte Times_2G; - -//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------// - BOOLEAN bCckHighPower; - u1Byte RFPathRxEnable; // ODM_CMNINFO_RFPATH_ENABLE - u1Byte ControlChannel; -//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------// - -//--------REMOVED COMMON INFO----------// - //u1Byte PseudoMacPhyMode; - //BOOLEAN *BTCoexist; - //BOOLEAN PseudoBtCoexist; - //u1Byte OPMode; - //BOOLEAN bAPMode; - //BOOLEAN bClientMode; - //BOOLEAN bAdHocMode; - //BOOLEAN bSlaveOfDMSP; -//--------REMOVED COMMON INFO----------// - - -//1 COMMON INFORMATION - - // - // Init Value - // -//-----------HOOK BEFORE REG INIT-----------// - // ODM Platform info AP/ADSL/CE/MP = 1/2/3/4 - u1Byte SupportPlatform; - // ODM Support Ability DIG/RATR/TX_PWR_TRACK/ ¡K¡K = 1/2/3/¡K - u4Byte SupportAbility; - // ODM PCIE/USB/SDIO = 1/2/3 - u1Byte SupportInterface; - // ODM composite or independent. Bit oriented/ 92C+92D+ .... or any other type = 1/2/3/... - u4Byte SupportICType; - // Cut Version TestChip/A-cut/B-cut... = 0/1/2/3/... - u1Byte CutVersion; - // Fab Version TSMC/UMC = 0/1 - u1Byte FabVersion; - // RF Type 4T4R/3T3R/2T2R/1T2R/1T1R/... - u1Byte RFType; - u1Byte RFEType; - // Board Type Normal/HighPower/MiniCard/SLIM/Combo/... = 0/1/2/3/4/... - u1Byte BoardType; - u1Byte PackageType; - u1Byte TypeGLNA; - u1Byte TypeGPA; - u1Byte TypeALNA; - u1Byte TypeAPA; - // with external LNA NO/Yes = 0/1 - u1Byte ExtLNA; - u1Byte ExtLNA5G; - // with external PA NO/Yes = 0/1 - u1Byte ExtPA; - u1Byte ExtPA5G; - // with external TRSW NO/Yes = 0/1 - u1Byte ExtTRSW; - u1Byte PatchID; //Customer ID - BOOLEAN bInHctTest; - BOOLEAN bWIFITest; - - BOOLEAN bDualMacSmartConcurrent; - u4Byte BK_SupportAbility; - u1Byte AntDivType; - - u1Byte odm_Regulation2_4G; - u1Byte odm_Regulation5G; -//-----------HOOK BEFORE REG INIT-----------// - - // - // Dynamic Value - // -//--------- POINTER REFERENCE-----------// - - u1Byte u1Byte_temp; - BOOLEAN BOOLEAN_temp; - PADAPTER PADAPTER_temp; - - // MAC PHY Mode SMSP/DMSP/DMDP = 0/1/2 - u1Byte *pMacPhyMode; - //TX Unicast byte count - u8Byte *pNumTxBytesUnicast; - //RX Unicast byte count - u8Byte *pNumRxBytesUnicast; - // Wireless mode B/G/A/N = BIT0/BIT1/BIT2/BIT3 - u1Byte *pWirelessMode; //ODM_WIRELESS_MODE_E - // Frequence band 2.4G/5G = 0/1 - u1Byte *pBandType; - // Secondary channel offset don't_care/below/above = 0/1/2 - u1Byte *pSecChOffset; - // Security mode Open/WEP/AES/TKIP = 0/1/2/3 - u1Byte *pSecurity; - // BW info 20M/40M/80M = 0/1/2 - u1Byte *pBandWidth; - // Central channel location Ch1/Ch2/.... - u1Byte *pChannel; //central channel number - BOOLEAN DPK_Done; - // Common info for 92D DMSP - - BOOLEAN *pbGetValueFromOtherMac; - PADAPTER *pBuddyAdapter; - BOOLEAN *pbMasterOfDMSP; //MAC0: master, MAC1: slave - // Common info for Status - BOOLEAN *pbScanInProcess; - BOOLEAN *pbPowerSaving; - // CCA Path 2-path/path-A/path-B = 0/1/2; using ODM_CCA_PATH_E. - u1Byte *pOnePathCCA; - //pMgntInfo->AntennaTest - u1Byte *pAntennaTest; - BOOLEAN *pbNet_closed; - u1Byte *mp_mode; - //u1Byte *pAidMap; - u1Byte *pu1ForcedIgiLb; -//--------- POINTER REFERENCE-----------// - pu2Byte pForcedDataRate; -//------------CALL BY VALUE-------------// - BOOLEAN bLinkInProcess; - BOOLEAN bWIFI_Direct; - BOOLEAN bWIFI_Display; - BOOLEAN bLinked; - - BOOLEAN bsta_state; - u1Byte RSSI_Min; - u1Byte InterfaceIndex; // Add for 92D dual MAC: 0--Mac0 1--Mac1 - BOOLEAN bIsMPChip; - BOOLEAN bOneEntryOnly; - // Common info for BTDM - BOOLEAN bBtEnabled; // BT is disabled - BOOLEAN bBtConnectProcess; // BT HS is under connection progress. - u1Byte btHsRssi; // BT HS mode wifi rssi value. - BOOLEAN bBtHsOperation; // BT HS mode is under progress - BOOLEAN bBtDisableEdcaTurbo; // Under some condition, don't enable the EDCA Turbo - BOOLEAN bBtLimitedDig; // BT is busy. -//------------CALL BY VALUE-------------// - u1Byte RSSI_A; - u1Byte RSSI_B; - u8Byte RSSI_TRSW; - u8Byte RSSI_TRSW_H; - u8Byte RSSI_TRSW_L; - u8Byte RSSI_TRSW_iso; - - u1Byte RxRate; - BOOLEAN bNoisyState; - u1Byte TxRate; - u1Byte LinkedInterval; - u1Byte preChannel; - u4Byte TxagcOffsetValueA; - BOOLEAN IsTxagcOffsetPositiveA; - u4Byte TxagcOffsetValueB; - BOOLEAN IsTxagcOffsetPositiveB; - u8Byte lastTxOkCnt; - u8Byte lastRxOkCnt; - u4Byte BbSwingOffsetA; - BOOLEAN IsBbSwingOffsetPositiveA; - u4Byte BbSwingOffsetB; - BOOLEAN IsBbSwingOffsetPositiveB; - s1Byte TH_L2H_ini; - s1Byte TH_EDCCA_HL_diff; - s1Byte IGI_Base; - u1Byte IGI_target; - BOOLEAN ForceEDCCA; - u1Byte AdapEn_RSSI; - s1Byte Force_TH_H; - s1Byte Force_TH_L; - u1Byte IGI_LowerBound; - u1Byte antdiv_rssi; - u1Byte AntType; - u1Byte pre_AntType; - u1Byte antdiv_period; - u1Byte antdiv_select; - u1Byte NdpaPeriod; - - // add by Yu Cehn for adaptivtiy - BOOLEAN adaptivity_flag; - BOOLEAN NHM_disable; - BOOLEAN TxHangFlg; - BOOLEAN Carrier_Sense_enable; - u1Byte tolerance_cnt; - u8Byte NHMCurTxOkcnt; - u8Byte NHMCurRxOkcnt; - u8Byte NHMLastTxOkcnt; - u8Byte NHMLastRxOkcnt; - u1Byte txEdcca1; - u1Byte txEdcca0; - s1Byte H2L_lb; - s1Byte L2H_lb; - u1Byte Adaptivity_IGI_upper; - u1Byte NHM_cnt_0; - - - ODM_NOISE_MONITOR noise_level;//[ODM_MAX_CHANNEL_NUM]; - // - //2 Define STA info. - // _ODM_STA_INFO - // 2012/01/12 MH For MP, we need to reduce one array pointer for default port.?? - PSTA_INFO_T pODM_StaInfo[ODM_ASSOCIATE_ENTRY_NUM]; - -#if (RATE_ADAPTIVE_SUPPORT == 1) - u2Byte CurrminRptTime; - ODM_RA_INFO_T RAInfo[ODM_ASSOCIATE_ENTRY_NUM]; //See HalMacID support -#endif - // - // 2012/02/14 MH Add to share 88E ra with other SW team. - // We need to colelct all support abilit to a proper area. - // - BOOLEAN RaSupport88E; - - // Define ........... - - // Latest packet phy info (ODM write) - ODM_PHY_DBG_INFO_T PhyDbgInfo; - //PHY_INFO_88E PhyInfo; - - // Latest packet phy info (ODM write) - ODM_MAC_INFO *pMacInfo; - //MAC_INFO_88E MacInfo; - - // Different Team independt structure?? - - // - //TX_RTP_CMN TX_retrpo; - //TX_RTP_88E TX_retrpo; - //TX_RTP_8195 TX_retrpo; - - // - //ODM Structure - // - FAT_T DM_FatTable; - DIG_T DM_DigTable; - PS_T DM_PSTable; - Pri_CCA_T DM_PriCCA; - RXHP_T DM_RXHP_Table; - RA_T DM_RA_Table; - FALSE_ALARM_STATISTICS FalseAlmCnt; - FALSE_ALARM_STATISTICS FlaseAlmCntBuddyAdapter; - //#ifdef CONFIG_ANTENNA_DIVERSITY - SWAT_T DM_SWAT_Table; - BOOLEAN RSSI_test; - CFO_TRACKING DM_CfoTrack; - //#endif - -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - //Path Div Struct - PATHDIV_PARA pathIQK; -#endif - - EDCA_T DM_EDCA_Table; - u4Byte WMMEDCA_BE; - PATHDIV_T DM_PathDiv; - // Copy from SD4 structure - // - // ================================================== - // - - //common - //u1Byte DM_Type; - //u1Byte PSD_Report_RXHP[80]; // Add By Gary - //u1Byte PSD_func_flag; // Add By Gary - //for DIG - //u1Byte bDMInitialGainEnable; - //u1Byte binitialized; // for dm_initial_gain_Multi_STA use. - //for Antenna diversity - //u8 AntDivCfg;// 0:OFF , 1:ON, 2:by efuse - //PSTA_INFO_T RSSI_target; - - BOOLEAN *pbDriverStopped; - BOOLEAN *pbDriverIsGoingToPnpSetPowerSleep; - BOOLEAN *pinit_adpt_in_progress; - - //PSD - BOOLEAN bUserAssignLevel; - RT_TIMER PSDTimer; - u1Byte RSSI_BT; //come from BT - BOOLEAN bPSDinProcess; - BOOLEAN bPSDactive; - BOOLEAN bDMInitialGainEnable; - - //MPT DIG - RT_TIMER MPT_DIGTimer; - - //for rate adaptive, in fact, 88c/92c fw will handle this - u1Byte bUseRAMask; - - ODM_RATE_ADAPTIVE RateAdaptive; - - ANT_DETECTED_INFO AntDetectedInfo; // Antenna detected information for RSSI tool - - ODM_RF_CAL_T RFCalibrateInfo; - - // - // TX power tracking - // - u1Byte BbSwingIdxOfdm[MAX_RF_PATH]; - u1Byte BbSwingIdxOfdmCurrent; - u1Byte BbSwingIdxOfdmBase[MAX_RF_PATH]; - BOOLEAN BbSwingFlagOfdm; - u1Byte BbSwingIdxCck; - u1Byte BbSwingIdxCckCurrent; - u1Byte BbSwingIdxCckBase; - u1Byte DefaultOfdmIndex; - u1Byte DefaultCckIndex; - BOOLEAN BbSwingFlagCck; - - s1Byte Absolute_OFDMSwingIdx[MAX_RF_PATH]; - s1Byte Remnant_OFDMSwingIdx[MAX_RF_PATH]; - s1Byte Remnant_CCKSwingIdx; - s1Byte Modify_TxAGC_Value; //Remnat compensate value at TxAGC - BOOLEAN Modify_TxAGC_Flag_PathA; - BOOLEAN Modify_TxAGC_Flag_PathB; - BOOLEAN Modify_TxAGC_Flag_PathA_CCK; - - // - // ODM system resource. - // - - // ODM relative time. - RT_TIMER PathDivSwitchTimer; - //2011.09.27 add for Path Diversity - RT_TIMER CCKPathDiversityTimer; - RT_TIMER FastAntTrainingTimer; - - // ODM relative workitem. -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - #if USE_WORKITEM - RT_WORK_ITEM PathDivSwitchWorkitem; - RT_WORK_ITEM CCKPathDiversityWorkitem; - RT_WORK_ITEM FastAntTrainingWorkitem; - RT_WORK_ITEM MPT_DIGWorkitem; - RT_WORK_ITEM RaRptWorkitem; - #endif -#endif - -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - -#if (RT_PLATFORM != PLATFORM_LINUX) -} DM_ODM_T, *PDM_ODM_T; // DM_Dynamic_Mechanism_Structure -#else -}; -#endif - -#else// for AP,ADSL,CE Team -} DM_ODM_T, *PDM_ODM_T; // DM_Dynamic_Mechanism_Structure -#endif - - - -#if 1 //92c-series -#define ODM_RF_PATH_MAX 2 -#else //jaguar - series -#define ODM_RF_PATH_MAX 4 -#endif - -typedef enum _ODM_RF_RADIO_PATH { - ODM_RF_PATH_A = 0, //Radio Path A - ODM_RF_PATH_B = 1, //Radio Path B - ODM_RF_PATH_C = 2, //Radio Path C - ODM_RF_PATH_D = 3, //Radio Path D - ODM_RF_PATH_AB, - ODM_RF_PATH_AC, - ODM_RF_PATH_AD, - ODM_RF_PATH_BC, - ODM_RF_PATH_BD, - ODM_RF_PATH_CD, - ODM_RF_PATH_ABC, - ODM_RF_PATH_ACD, - ODM_RF_PATH_BCD, - ODM_RF_PATH_ABCD, - // ODM_RF_PATH_MAX, //Max RF number 90 support -} ODM_RF_RADIO_PATH_E, *PODM_RF_RADIO_PATH_E; - - typedef enum _ODM_RF_CONTENT{ - odm_radioa_txt = 0x1000, - odm_radiob_txt = 0x1001, - odm_radioc_txt = 0x1002, - odm_radiod_txt = 0x1003 -} ODM_RF_CONTENT; - -typedef enum _ODM_BB_Config_Type{ - CONFIG_BB_PHY_REG, - CONFIG_BB_AGC_TAB, - CONFIG_BB_AGC_TAB_2G, - CONFIG_BB_AGC_TAB_5G, - CONFIG_BB_PHY_REG_PG, - CONFIG_BB_PHY_REG_MP, - CONFIG_BB_AGC_TAB_DIFF, -} ODM_BB_Config_Type, *PODM_BB_Config_Type; - -typedef enum _ODM_RF_Config_Type{ - CONFIG_RF_RADIO, - CONFIG_RF_TXPWR_LMT, -} ODM_RF_Config_Type, *PODM_RF_Config_Type; - -typedef enum _ODM_FW_Config_Type{ - CONFIG_FW_NIC, - CONFIG_FW_NIC_2, - CONFIG_FW_AP, - CONFIG_FW_MP, - CONFIG_FW_WoWLAN, - CONFIG_FW_WoWLAN_2, - CONFIG_FW_AP_WoWLAN, - CONFIG_FW_BT, -} ODM_FW_Config_Type; - -// Status code -#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) -typedef enum _RT_STATUS{ - RT_STATUS_SUCCESS, - RT_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, -}RT_STATUS,*PRT_STATUS; -#endif // end of RT_STATUS definition - -#ifdef REMOVE_PACK -#pragma pack() -#endif - -//#include "odm_function.h" - -//3=========================================================== -//3 DIG -//3=========================================================== - -//Remove DIG by Yuchen - -//3=========================================================== -//3 AGC RX High Power Mode -//3=========================================================== -#define LNA_Low_Gain_1 0x64 -#define LNA_Low_Gain_2 0x5A -#define LNA_Low_Gain_3 0x58 - -#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 - -//3=========================================================== -//3 EDCA -//3=========================================================== - -//3=========================================================== -//3 Dynamic Tx Power -//3=========================================================== -//Dynamic Tx Power Control Threshold - -//Remove By YuChen - -//3=========================================================== -//3 Tx Power Tracking -//3=========================================================== -#if 0 //mask this, since these have been defined in typdef.h, vivi -#define OFDM_TABLE_SIZE 43 -#define CCK_TABLE_SIZE 33 -#endif - - -//3=========================================================== -//3 Rate Adaptive -//3=========================================================== -//Remove to odm_RaInfo.h by RS_James - -//3=========================================================== -//3 BB Power Save -//3=========================================================== - -typedef enum tag_1R_CCA_Type_Definition -{ - CCA_1R =0, - CCA_2R = 1, - CCA_MAX = 2, -}DM_1R_CCA_E; - -typedef enum tag_RF_Type_Definition -{ - RF_Save =0, - RF_Normal = 1, - RF_MAX = 2, -}DM_RF_E; - -//3=========================================================== -//3 Antenna Diversity -//3=========================================================== -typedef enum tag_SW_Antenna_Switch_Definition -{ - Antenna_A = 1, - Antenna_B = 2, - Antenna_MAX = 3, -}DM_SWAS_E; - - -// Maximal number of antenna detection mechanism needs to perform, added by Roger, 2011.12.28. -#define MAX_ANTENNA_DETECTION_CNT 10 - -// -// Extern Global Variables. -// -extern u4Byte OFDMSwingTable[OFDM_TABLE_SIZE]; -extern u1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8]; -extern u1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]; - -extern u4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE]; -extern u1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8]; -extern u1Byte CCKSwingTable_Ch14_New [CCK_TABLE_SIZE][8]; - -extern u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE]; - -// <20121018, Kordan> In case fail to read TxPowerTrack.txt, we use the table of 88E as the default table. -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}; -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}; - -// -// check Sta pointer valid or not -// -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#define IS_STA_VALID(pSta) (pSta && pSta->expire_to) -#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN) -#define IS_STA_VALID(pSta) (pSta && pSta->bUsed) -#else -#define IS_STA_VALID(pSta) (pSta) -#endif -// 20100514 Joseph: Add definition for antenna switching test after link. -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 - -//Remove DIG by yuchen - -VOID -ODM_SetAntenna( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Antenna); - - -//Remove BB power saving by Yuchen - -#define SwAntDivRestAfterLink ODM_SwAntDivRestAfterLink -VOID ODM_SwAntDivRestAfterLink( IN PDM_ODM_T pDM_Odm); - -#define dm_CheckTXPowerTracking ODM_TXPowerTrackingCheck -VOID -ODM_TXPowerTrackingCheck( - IN PDM_ODM_T pDM_Odm - ); - -//Remove ODM_RAStateCheck() by RS_James - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_AP|ODM_ADSL)) -//============================================================ -// function prototype -//============================================================ -//#define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh -//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter, -// IN INT32 DM_Type, -// IN INT32 DM_Value); - -//Remove DIG by yuchen - - -BOOLEAN -ODM_CheckPowerStatus( - IN PADAPTER Adapter - ); - - -//Remove ODM_RateAdaptiveStateApInit() by RS_James - -//Remove Edca by Yuchen - -#if(DM_ODM_SUPPORT_TYPE==ODM_AP) -#ifdef HW_ANT_SWITCH -u1Byte -ODM_Diversity_AntennaSelect( - IN PDM_ODM_T pDM_Odm, - IN u1Byte *data -); -#endif -#endif - -#define SwAntDivResetBeforeLink ODM_SwAntDivResetBeforeLink -VOID ODM_SwAntDivResetBeforeLink(IN PDM_ODM_T pDM_Odm); - -#define SwAntDivCheckBeforeLink ODM_SwAntDivCheckBeforeLink - -BOOLEAN -ODM_SwAntDivCheckBeforeLink( - IN PDM_ODM_T pDM_Odm - ); - - -#endif - -#define dm_SWAW_RSSI_Check ODM_SwAntDivChkPerPktRssi -VOID ODM_SwAntDivChkPerPktRssi( - IN PDM_ODM_T pDM_Odm, - IN u1Byte StationID, - IN PODM_PHY_INFO_T pPhyInfo - ); - -#if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) - -u4Byte ConvertTo_dB(u4Byte Value); - -u4Byte -GetPSDData( - PDM_ODM_T pDM_Odm, - unsigned int point, - u1Byte initial_gain_psd); - -#endif - -//Remove ODM_Get_Rate_Bitmap() by RS_James - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) -#define dm_PSDMonitorCallback odm_PSDMonitorCallback -VOID odm_PSDMonitorCallback(PRT_TIMER pTimer); - -VOID -odm_PSDMonitorWorkItemCallback( - IN PVOID pContext - ); - -VOID -PatchDCTone( - IN PDM_ODM_T pDM_Odm, - pu4Byte PSD_report, - u1Byte initial_gain_psd -); -VOID -ODM_PSDMonitor( - IN PDM_ODM_T pDM_Odm - ); -VOID odm_PSD_Monitor(PDM_ODM_T pDM_Odm); -VOID odm_PSDMonitorInit(PDM_ODM_T pDM_Odm); - -VOID -ODM_PSDDbgControl( - IN PADAPTER Adapter, - IN u4Byte mode, - IN u4Byte btRssi - ); - -#endif // DM_ODM_SUPPORT_TYPE - - -#if (BEAMFORMING_SUPPORT == 1) -BEAMFORMING_CAP -Beamforming_GetEntryBeamCapByMacId( - IN PMGNT_INFO pMgntInfo, - IN u1Byte MacId - ); -#endif - -VOID -odm_TXPowerTrackingInit( - IN PDM_ODM_T pDM_Odm - ); - -VOID ODM_DMInit( IN PDM_ODM_T pDM_Odm); - -VOID -ODM_DMWatchdog( - IN PDM_ODM_T pDM_Odm // For common use in the future - ); - -VOID -ODM_CmnInfoInit( - IN PDM_ODM_T pDM_Odm, - IN ODM_CMNINFO_E CmnInfo, - IN u4Byte Value - ); - -VOID -ODM_CmnInfoHook( - IN PDM_ODM_T pDM_Odm, - IN ODM_CMNINFO_E CmnInfo, - IN PVOID pValue - ); - -VOID -ODM_CmnInfoPtrArrayHook( - IN PDM_ODM_T pDM_Odm, - IN ODM_CMNINFO_E CmnInfo, - IN u2Byte Index, - IN PVOID pValue - ); - -VOID -ODM_CmnInfoUpdate( - IN PDM_ODM_T pDM_Odm, - IN u4Byte CmnInfo, - IN u8Byte Value - ); - -VOID -ODM_InitAllTimers( - IN PDM_ODM_T pDM_Odm - ); - -VOID -ODM_CancelAllTimers( - IN PDM_ODM_T pDM_Odm - ); - -VOID -ODM_ReleaseAllTimers( - IN PDM_ODM_T pDM_Odm - ); - -VOID -ODM_ResetIQKResult( - IN PDM_ODM_T pDM_Odm - ); - - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm ); -VOID ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm ); - - -//===========================================// -// Neil Chen----2011--06--15-- - -//3 Path Diversity -//=========================================================== - -#define TP_MODE 0 -#define RSSI_MODE 1 -#define TRAFFIC_LOW 0 -#define TRAFFIC_HIGH 1 - -//#define PATHDIV_ENABLE 1 -//#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi - -u8Byte -PlatformDivision64( - IN u8Byte x, - IN u8Byte y -); - - -// 20100514 Joseph: Add definition for antenna switching test after link. -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 - -//==================================================== -//3 PathDiV End -//==================================================== - -//#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C - -#define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh -//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter, -// IN INT32 DM_Type, -// IN INT32 DM_Value); -// - - -typedef enum tag_DIG_Connect_Definition -{ - DIG_STA_DISCONNECT = 0, - DIG_STA_CONNECT = 1, - DIG_STA_BEFORE_CONNECT = 2, - DIG_MultiSTA_DISCONNECT = 3, - DIG_MultiSTA_CONNECT = 4, - DIG_CONNECT_MAX -}DM_DIG_CONNECT_E; - - -#define dm_SWAW_RSSI_Check ODM_SwAntDivChkPerPktRssi - -// -// 2012/01/12 MH Check afapter status. Temp fix BSOD. -// -#define HAL_ADAPTER_STS_CHK(pDM_Odm)\ - if (pDM_Odm->Adapter == NULL)\ - {\ - return;\ - }\ - - -// -// For new definition in MP temporarily fro power tracking, -// -#define odm_TXPowerTrackingDirectCall(_Adapter) \ - IS_HARDWARE_TYPE_8192D(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92D(_Adapter) : \ - IS_HARDWARE_TYPE_8192C(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92C(_Adapter) : \ - IS_HARDWARE_TYPE_8723A(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_8723A(_Adapter) :\ - ODM_TXPowerTrackingCallback_ThermalMeter(_Adapter) - -VOID -ODM_SetTxAntByTxInfo_88C_92D( - IN PDM_ODM_T pDM_Odm, - IN pu1Byte pDesc, - IN u1Byte macId - ); - -#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID -ODM_AntselStatistics_88C( - IN PDM_ODM_T pDM_Odm, - IN u1Byte MacId, - IN u4Byte PWDBAll, - IN BOOLEAN isCCKrate -); - -#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE)) - -VOID -ODM_SingleDualAntennaDefaultSetting( - IN PDM_ODM_T pDM_Odm - ); - -BOOLEAN -ODM_SingleDualAntennaDetection( - IN PDM_ODM_T pDM_Odm, - IN u1Byte mode - ); - -#endif // #if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) -VOID -ODM_UpdateNoisyState( - IN PDM_ODM_T pDM_Odm, - IN BOOLEAN bNoisyStateFromC2H -); - -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 -); - -VOID -ODM_UpdateInitRate( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Rate - ); - -//Remove ODM_DynamicARFBSelect() by RS_James - -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -void odm_dtc(PDM_ODM_T pDM_Odm); -#endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */ - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_AntDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_AntDiv.c deleted file mode 100755 index 1f21d6c5c00e..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_AntDiv.c +++ /dev/null @@ -1,2273 +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" - -#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) -VOID -odm_AntDiv_on_off( IN PDM_ODM_T pDM_Odm ,IN u1Byte swch) -{ - if(pDM_Odm->AntDivType==S0S1_SW_ANTDIV || pDM_Odm->AntDivType==CGCS_RX_SW_ANTDIV) - return; - - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) N-Series AntDiv Function\n",(swch==ANTDIV_ON)?"ON" : "OFF")); - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable - ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable - } - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) AC-Series AntDiv Function\n",(swch==ANTDIV_ON)?"ON" : "OFF")); - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable - ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable - } - else - { - ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, swch); //OFDM AntDiv function block enable - ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, swch); //CCK AntDiv function block enable - } - } -} - -VOID -ODM_UpdateRxIdleAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant) -{ - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - u4Byte DefaultAnt, OptionalAnt,value32; - - #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER pAdapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - #endif - - if(pDM_FatTable->RxIdleAnt != Ant) - { - 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")); - pDM_FatTable->RxIdleAnt = Ant; - - if(Ant == MAIN_ANT) - { - DefaultAnt = ANT1_2G; - OptionalAnt = ANT2_2G; - } - else - { - DefaultAnt = ANT2_2G; - OptionalAnt = ANT1_2G; - } - - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - { - if(pDM_Odm->SupportICType==ODM_RTL8192E) - { - ODM_SetBBReg(pDM_Odm, 0xB38 , BIT5|BIT4|BIT3, DefaultAnt); //Default RX - ODM_SetBBReg(pDM_Odm, 0xB38 , BIT8|BIT7|BIT6, OptionalAnt);//Optional RX - } - else - { - ODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, DefaultAnt); //Default RX - ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, OptionalAnt); //Optional RX - - if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - value32 = ODM_GetBBReg(pDM_Odm, 0x948, 0xFFF); - - if (value32 !=0x280) - ODM_SetBBReg(pDM_Odm, 0x948 , BIT9, DefaultAnt); - - rtw_hal_set_tx_power_level(pAdapter, pHalData->CurrentChannel); - } - - } - ODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt); //Default TX - } - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - { - ODM_SetBBReg(pDM_Odm, 0xC08 , BIT21|BIT20|BIT19, DefaultAnt); //Default RX - ODM_SetBBReg(pDM_Odm, 0xC08 , BIT24|BIT23|BIT22, OptionalAnt);//Optional RX - ODM_SetBBReg(pDM_Odm, 0xC08 , BIT27|BIT26|BIT25, DefaultAnt); //Default TX - } - ODM_SetMACReg(pDM_Odm, 0x6D8 , BIT10|BIT9|BIT8, DefaultAnt); //PathA Resp Tx - } - else// pDM_FatTable->RxIdleAnt == Ant - { - 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")); - pDM_FatTable->RxIdleAnt = Ant; - } -} - - -VOID -odm_UpdateTxAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant, IN u4Byte MacId) -{ - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - u1Byte TxAnt; - - if(Ant == MAIN_ANT) - TxAnt = ANT1_2G; - else - TxAnt = ANT2_2G; - - pDM_FatTable->antsel_a[MacId] = TxAnt&BIT0; - pDM_FatTable->antsel_b[MacId] = (TxAnt&BIT1)>>1; - pDM_FatTable->antsel_c[MacId] = (TxAnt&BIT2)>>2; - #if (DM_ODM_SUPPORT_TYPE == ODM_AP) - if (pDM_Odm->antdiv_rssi) - { - //panic_printk("[Tx from TxInfo]: MacID:(( %d )), TxAnt = (( %s ))\n",MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"); - //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] ); - } - #endif - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tx from TxInfo]: MacID:(( %d )), TxAnt = (( %s ))\n", - // MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=(( 3'b%d%d%d ))\n", - //pDM_FatTable->antsel_c[MacId] , pDM_FatTable->antsel_b[MacId] , pDM_FatTable->antsel_a[MacId] )); - -} - - - -#if (RTL8188E_SUPPORT == 1) - - -VOID -odm_RX_HWAntDiv_Init_88E( - IN PDM_ODM_T pDM_Odm -) -{ - u4Byte value32; - - pDM_Odm->AntType = ODM_AUTO_ANT; - -#if (MP_DRIVER == 1) - pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; - ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv - ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1); // 1:CG, 0:CS - return; -#else - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CGCS_RX_HW_ANTDIV]\n")); - - //MAC Setting - value32 = ODM_GetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord); - ODM_SetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output - //Pin Settings - ODM_SetBBReg(pDM_Odm, ODM_REG_PIN_CTRL_11N , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 //antsel antselb by HW - ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT10, 0); //Reg864[10]=1'b0 //antsel2 by HW - ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT22, 1); //Regb2c[22]=1'b0 //disable CS/CG switch - ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1); //Regb2c[31]=1'b1 //output at CG only - //OFDM Settings - ODM_SetBBReg(pDM_Odm, ODM_REG_ANTDIV_PARA1_11N , bMaskDWord, 0x000000a0); - //CCK Settings - ODM_SetBBReg(pDM_Odm, ODM_REG_BB_PWR_SAV4_11N , BIT7, 1); //Fix CCK PHY status report issue - ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_ANTDIV_PARA2_11N , BIT4, 1); //CCK complete HW AntDiv within 64 samples - - ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , 0xFFFF, 0x0102); //antenna mapping table - -#endif -} - -VOID -odm_TRX_HWAntDiv_Init_88E( - IN PDM_ODM_T pDM_Odm -) -{ - u4Byte value32; - -#if (MP_DRIVER == 1) - pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; - ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv - ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT5|BIT4|BIT3, 0); //Default RX (0/1) - return; -#else - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV (SPDT)]\n")); - - //MAC Setting - value32 = ODM_GetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord); - ODM_SetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output - //Pin Settings - ODM_SetBBReg(pDM_Odm, ODM_REG_PIN_CTRL_11N , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 //antsel antselb by HW - ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT10, 0); //Reg864[10]=1'b0 //antsel2 by HW - ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT22, 0); //Regb2c[22]=1'b0 //disable CS/CG switch - ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1); //Regb2c[31]=1'b1 //output at CG only - //OFDM Settings - ODM_SetBBReg(pDM_Odm, ODM_REG_ANTDIV_PARA1_11N , bMaskDWord, 0x000000a0); - //CCK Settings - ODM_SetBBReg(pDM_Odm, ODM_REG_BB_PWR_SAV4_11N , BIT7, 1); //Fix CCK PHY status report issue - ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_ANTDIV_PARA2_11N , BIT4, 1); //CCK complete HW AntDiv within 64 samples - - //antenna mapping table - if(!pDM_Odm->bIsMPChip) //testchip - { - ODM_SetBBReg(pDM_Odm, ODM_REG_RX_DEFUALT_A_11N , BIT10|BIT9|BIT8, 1); //Reg858[10:8]=3'b001 - ODM_SetBBReg(pDM_Odm, ODM_REG_RX_DEFUALT_A_11N , BIT13|BIT12|BIT11, 2); //Reg858[13:11]=3'b010 - } - else //MPchip - ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , bMaskDWord, 0x0201); //Reg914=3'b010, Reg915=3'b001 -#endif -} - -VOID -odm_Smart_HWAntDiv_Init_88E( - IN PDM_ODM_T pDM_Odm -) -{ - u4Byte value32, i; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - u4Byte AntCombination = 2; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_SMART_ANTDIV]\n")); - -#if (MP_DRIVER == 1) - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->AntDivType: %d\n", pDM_Odm->AntDivType)); - return; -#else - - for(i=0; i<6; i++) - { - pDM_FatTable->Bssid[i] = 0; - pDM_FatTable->antSumRSSI[i] = 0; - pDM_FatTable->antRSSIcnt[i] = 0; - pDM_FatTable->antAveRSSI[i] = 0; - } - pDM_FatTable->TrainIdx = 0; - pDM_FatTable->FAT_State = FAT_NORMAL_STATE; - - //MAC Setting - value32 = ODM_GetMACReg(pDM_Odm, 0x4c, bMaskDWord); - ODM_SetMACReg(pDM_Odm, 0x4c, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output - value32 = ODM_GetMACReg(pDM_Odm, 0x7B4, bMaskDWord); - ODM_SetMACReg(pDM_Odm, 0x7b4, bMaskDWord, value32|(BIT16|BIT17)); //Reg7B4[16]=1 enable antenna training, Reg7B4[17]=1 enable A2 match - //value32 = PlatformEFIORead4Byte(Adapter, 0x7B4); - //PlatformEFIOWrite4Byte(Adapter, 0x7b4, value32|BIT18); //append MACID in reponse packet - - //Match MAC ADDR - ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, 0); - ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, 0); - - ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 //antsel antselb by HW - ODM_SetBBReg(pDM_Odm, 0x864 , BIT10, 0); //Reg864[10]=1'b0 //antsel2 by HW - ODM_SetBBReg(pDM_Odm, 0xb2c , BIT22, 0); //Regb2c[22]=1'b0 //disable CS/CG switch - ODM_SetBBReg(pDM_Odm, 0xb2c , BIT31, 1); //Regb2c[31]=1'b1 //output at CG only - ODM_SetBBReg(pDM_Odm, 0xca4 , bMaskDWord, 0x000000a0); - - //antenna mapping table - if(AntCombination == 2) - { - if(!pDM_Odm->bIsMPChip) //testchip - { - ODM_SetBBReg(pDM_Odm, 0x858 , BIT10|BIT9|BIT8, 1); //Reg858[10:8]=3'b001 - ODM_SetBBReg(pDM_Odm, 0x858 , BIT13|BIT12|BIT11, 2); //Reg858[13:11]=3'b010 - } - else //MPchip - { - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 1); - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 2); - } - } - else if(AntCombination == 7) - { - if(!pDM_Odm->bIsMPChip) //testchip - { - ODM_SetBBReg(pDM_Odm, 0x858 , BIT10|BIT9|BIT8, 0); //Reg858[10:8]=3'b000 - ODM_SetBBReg(pDM_Odm, 0x858 , BIT13|BIT12|BIT11, 1); //Reg858[13:11]=3'b001 - ODM_SetBBReg(pDM_Odm, 0x878 , BIT16, 0); - ODM_SetBBReg(pDM_Odm, 0x858 , BIT15|BIT14, 2); //(Reg878[0],Reg858[14:15])=3'b010 - ODM_SetBBReg(pDM_Odm, 0x878 , BIT19|BIT18|BIT17, 3);//Reg878[3:1]=3b'011 - ODM_SetBBReg(pDM_Odm, 0x878 , BIT22|BIT21|BIT20, 4);//Reg878[6:4]=3b'100 - ODM_SetBBReg(pDM_Odm, 0x878 , BIT25|BIT24|BIT23, 5);//Reg878[9:7]=3b'101 - ODM_SetBBReg(pDM_Odm, 0x878 , BIT28|BIT27|BIT26, 6);//Reg878[12:10]=3b'110 - ODM_SetBBReg(pDM_Odm, 0x878 , BIT31|BIT30|BIT29, 7);//Reg878[15:13]=3b'111 - } - else //MPchip - { - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0); - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1); - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte2, 2); - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte3, 3); - ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte0, 4); - ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte1, 5); - ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte2, 6); - ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte3, 7); - } - } - - //Default Ant Setting when no fast training - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1 //from TX Info - ODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, 0); //Default RX - ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, 1); //Optional RX - //ODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, 1); //Default TX - - //Enter Traing state - ODM_SetBBReg(pDM_Odm, 0x864 , BIT2|BIT1|BIT0, (AntCombination-1)); //Reg864[2:0]=3'd6 //ant combination=reg864[2:0]+1 - //ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv - //ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0); //RegE08[16]=1'b0 //disable fast training - //ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 1); //RegE08[16]=1'b1 //enable fast training - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 1); //RegC50[7]=1'b1 //enable HW AntDiv - - //SW Control - //PHY_SetBBReg(Adapter, 0x864 , BIT10, 1); - //PHY_SetBBReg(Adapter, 0x870 , BIT9, 1); - //PHY_SetBBReg(Adapter, 0x870 , BIT8, 1); - //PHY_SetBBReg(Adapter, 0x864 , BIT11, 1); - //PHY_SetBBReg(Adapter, 0x860 , BIT9, 0); - //PHY_SetBBReg(Adapter, 0x860 , BIT8, 0); - -#endif -} -#endif //#if (RTL8188E_SUPPORT == 1) - - -#if (RTL8192E_SUPPORT == 1) -VOID -odm_RX_HWAntDiv_Init_92E( - IN PDM_ODM_T pDM_Odm -) -{ - -#if (MP_DRIVER == 1) - //pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta Regc50[8]=1'b0 0: control by c50[9] - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1); // 1:CG, 0:CS - return; -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => AntDivType=[CGCS_RX_HW_ANTDIV]\n")); - - //Pin Settings - ODM_SetBBReg(pDM_Odm, 0x870 , BIT8, 0);//Reg870[8]=1'b0, // "antsel" is controled by HWs - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 1); //Regc50[8]=1'b1 //" CS/CG switching" is controled by HWs - - //Mapping table - ODM_SetBBReg(pDM_Odm, 0x914 , 0xFFFF, 0x0100); //antenna mapping table - - //OFDM Settings - ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF, 0xA0); //thershold - ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF000, 0x0); //bias - - //CCK Settings - ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2 - ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 1); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 - ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue - ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples -} - -VOID -odm_TRX_HWAntDiv_Init_92E( - IN PDM_ODM_T pDM_Odm -) -{ - -#if (MP_DRIVER == 1) - //pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta Regc50[8]=1'b0 0: control by c50[9] - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1); // 1:CG, 0:CS - return; -#endif - -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - pDM_Odm->antdiv_rssi=0; -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV]\n")); - - //3 --RFE pin setting--------- - //[MAC] - ODM_SetMACReg(pDM_Odm, 0x38, BIT11, 1); //DBG PAD Driving control (GPIO 8) - ODM_SetMACReg(pDM_Odm, 0x4c, BIT23, 0); //path-A , RFE_CTRL_3 & RFE_CTRL_4 - //[BB] - ODM_SetBBReg(pDM_Odm, 0x944 , BIT4|BIT3, 0x3); //RFE_buffer - ODM_SetBBReg(pDM_Odm, 0x940 , BIT7|BIT6, 0x0); // r_rfe_path_sel_ (RFE_CTRL_3) - ODM_SetBBReg(pDM_Odm, 0x940 , BIT9|BIT8, 0x0); // r_rfe_path_sel_ (RFE_CTRL_4) - ODM_SetBBReg(pDM_Odm, 0x944 , BIT31, 0); //RFE_buffer - ODM_SetBBReg(pDM_Odm, 0x92C , BIT3, 0); //rfe_inv (RFE_CTRL_3) - ODM_SetBBReg(pDM_Odm, 0x92C , BIT4, 1); //rfe_inv (RFE_CTRL_4) - ODM_SetBBReg(pDM_Odm, 0x930 , 0xFF000, 0x88); //path-A , RFE_CTRL_3 & 4=> ANTSEL[0] - //3 ------------------------- - - //Pin Settings - ODM_SetBBReg(pDM_Odm, 0xC50 , BIT8, 0); //path-A //disable CS/CG switch - ODM_SetBBReg(pDM_Odm, 0xC50 , BIT9, 1); //path-A //output at CG only - ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0); //path-A //antsel antselb by HW - ODM_SetBBReg(pDM_Odm, 0xB38 , BIT10, 0); //path-A //antsel2 by HW - - //Mapping table - ODM_SetBBReg(pDM_Odm, 0x914 , 0xFFFF, 0x0100); //antenna mapping table - - //OFDM Settings - ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF, 0xA0); //thershold - ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF000, 0x0); //bias - - //CCK Settings - ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2 - ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 1); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 - ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue - ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples - - //Timming issue - ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec) -} - -VOID -odm_Smart_HWAntDiv_Init_92E( - IN PDM_ODM_T pDM_Odm -) -{ - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_SMART_ANTDIV]\n")); -} -#endif //#if (RTL8192E_SUPPORT == 1) - - -#if (RTL8723B_SUPPORT == 1) -VOID -odm_TRX_HWAntDiv_Init_8723B( - IN PDM_ODM_T pDM_Odm -) -{ - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8723B AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV(DPDT)]\n")); - - //Mapping Table - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0); - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1); - - //OFDM HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0xCA4 , 0x7FF, 0xa0); //thershold - ODM_SetBBReg(pDM_Odm, 0xCA4 , 0x7FF000, 0x00); //bias - - //CCK HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M - ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples - - //BT Coexistence - ODM_SetBBReg(pDM_Odm, 0x864, BIT12, 0); //keep antsel_map when GNT_BT = 1 - ODM_SetBBReg(pDM_Odm, 0x874 , BIT23, 0); //Disable hw antsw & fast_train.antsw when GNT_BT=1 - - //Output Pin Settings - ODM_SetBBReg(pDM_Odm, 0x870 , BIT8, 0); // - - ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0); //WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL) - ODM_SetBBReg(pDM_Odm, 0x948 , BIT7, 0); - - ODM_SetMACReg(pDM_Odm, 0x40 , BIT3, 1); - ODM_SetMACReg(pDM_Odm, 0x38 , BIT11, 1); - ODM_SetMACReg(pDM_Odm, 0x4C , BIT24|BIT23, 2); //select DPDT_P and DPDT_N as output pin - - ODM_SetBBReg(pDM_Odm, 0x944 , BIT0|BIT1, 3); //in/out - ODM_SetBBReg(pDM_Odm, 0x944 , BIT31, 0); // - - ODM_SetBBReg(pDM_Odm, 0x92C , BIT1, 0); //DPDT_P non-inverse - ODM_SetBBReg(pDM_Odm, 0x92C , BIT0, 1); //DPDT_N inverse - - ODM_SetBBReg(pDM_Odm, 0x930 , 0xF0, 8); // DPDT_P = ANTSEL[0] - ODM_SetBBReg(pDM_Odm, 0x930 , 0xF, 8); // DPDT_N = ANTSEL[0] - - //Timming issue - ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec) - - //2 [--For HW Bug Setting] - if(pDM_Odm->AntType == ODM_AUTO_ANT) - ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function block enable - - //ODM_SetBBReg(pDM_Odm, 0x80C , BIT21, 0); //TX Ant by Reg - - -} - - - -VOID -odm_S0S1_SWAntDiv_Init_8723B( - IN PDM_ODM_T pDM_Odm -) -{ - pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8723B AntDiv_Init => AntDivType=[ S0S1_SW_AntDiv] \n")); - - //Mapping Table - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0); - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1); - - //Output Pin Settings - //ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0x1); - ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0); - - pDM_FatTable->bBecomeLinked =FALSE; - pDM_SWAT_Table->try_flag = 0xff; - pDM_SWAT_Table->Double_chk_flag = 0; - pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW; - - //Timming issue - ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec) - - //2 [--For HW Bug Setting] - ODM_SetBBReg(pDM_Odm, 0x80C , BIT21, 0); //TX Ant by Reg - -} -#endif //#if (RTL8723B_SUPPORT == 1) - - -#if (RTL8821A_SUPPORT == 1) -VOID -odm_TRX_HWAntDiv_Init_8821A( - IN PDM_ODM_T pDM_Odm -) -{ - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - - PADAPTER pAdapter = pDM_Odm->Adapter; - pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType)); -#else - pDM_Odm->AntType = ODM_AUTO_ANT; -#endif - pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType)); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (DPDT)] \n")); - - //Output Pin Settings - ODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0); - - ODM_SetMACReg(pDM_Odm, 0x64 , BIT29, 1); //PAPE by WLAN control - ODM_SetMACReg(pDM_Odm, 0x64 , BIT28, 1); //LNAON by WLAN control - - ODM_SetBBReg(pDM_Odm, 0xCB0 , bMaskDWord, 0x77775745); - ODM_SetBBReg(pDM_Odm, 0xCB8 , BIT16, 0); - - ODM_SetMACReg(pDM_Odm, 0x4C , BIT23, 0); //select DPDT_P and DPDT_N as output pin - ODM_SetMACReg(pDM_Odm, 0x4C , BIT24, 1); //by WLAN control - ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF, 8); // DPDT_P = ANTSEL[0] - ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF0, 8); // DPDT_N = ANTSEL[0] - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT29, 0); //DPDT_P non-inverse - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT28, 1); //DPDT_N inverse - - //Mapping Table - ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0); - ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1); - - //Set ANT1_8821A as MAIN_ANT - if((pDM_Odm->AntType == ODM_FIX_MAIN_ANT) || (pDM_Odm->AntType == ODM_AUTO_ANT)) - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - else - ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); - - //OFDM HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold - ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias - - //CCK HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M - ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples - - ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable - - //BT Coexistence - ODM_SetBBReg(pDM_Odm, 0xCAC , BIT9, 1); //keep antsel_map when GNT_BT = 1 - ODM_SetBBReg(pDM_Odm, 0x804 , BIT4, 1); //Disable hw antsw & fast_train.antsw when GNT_BT=1 - - //Timming issue - ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec) - ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns - - //response TX ant by RX ant - ODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1); - - //2 [--For HW Bug Setting] - if(pDM_Odm->AntType == ODM_AUTO_ANT) - ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable - -} - -VOID -odm_S0S1_SWAntDiv_Init_8821A( - IN PDM_ODM_T pDM_Odm -) -{ - pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - - - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - - PADAPTER pAdapter = pDM_Odm->Adapter; - pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType)); -#else - pDM_Odm->AntType = ODM_AUTO_ANT; -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => AntDivType=[ S0S1_SW_AntDiv] \n")); - - //Output Pin Settings - ODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0); - - ODM_SetMACReg(pDM_Odm, 0x64 , BIT29, 1); //PAPE by WLAN control - ODM_SetMACReg(pDM_Odm, 0x64 , BIT28, 1); //LNAON by WLAN control - - ODM_SetBBReg(pDM_Odm, 0xCB0 , bMaskDWord, 0x77775745); - ODM_SetBBReg(pDM_Odm, 0xCB8 , BIT16, 0); - - ODM_SetMACReg(pDM_Odm, 0x4C , BIT23, 0); //select DPDT_P and DPDT_N as output pin - ODM_SetMACReg(pDM_Odm, 0x4C , BIT24, 1); //by WLAN control - ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF, 8); // DPDT_P = ANTSEL[0] - ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF0, 8); // DPDT_N = ANTSEL[0] - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT29, 0); //DPDT_P non-inverse - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT28, 1); //DPDT_N inverse - - //Mapping Table - ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0); - ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1); - - //Set ANT1_8821A as MAIN_ANT - if((pDM_Odm->AntType == ODM_FIX_MAIN_ANT) || (pDM_Odm->AntType == ODM_AUTO_ANT)) - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - else - ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); - - //OFDM HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold - ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias - - //CCK HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M - ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples - - ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable - - //BT Coexistence - ODM_SetBBReg(pDM_Odm, 0xCAC , BIT9, 1); //keep antsel_map when GNT_BT = 1 - ODM_SetBBReg(pDM_Odm, 0x804 , BIT4, 1); //Disable hw antsw & fast_train.antsw when GNT_BT=1 - - //Timming issue - ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec) - ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns - - //response TX ant by RX ant - ODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1); - - //2 [--For HW Bug Setting] - if(pDM_Odm->AntType == ODM_AUTO_ANT) - ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable - - - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); - - pDM_SWAT_Table->try_flag = 0xff; - pDM_SWAT_Table->Double_chk_flag = 0; - pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW; - pDM_SWAT_Table->CurAntenna = MAIN_ANT; - pDM_SWAT_Table->PreAntenna = MAIN_ANT; - pDM_SWAT_Table->SWAS_NoLink_State = 0; - -} -#endif //#if (RTL8821A_SUPPORT == 1) - -#if (RTL8881A_SUPPORT == 1) -VOID -odm_RX_HWAntDiv_Init_8881A( - IN PDM_ODM_T pDM_Odm -) -{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8881A AntDiv_Init => AntDivType=[ CGCS_RX_HW_ANTDIV] \n")); - -} - -VOID -odm_TRX_HWAntDiv_Init_8881A( - IN PDM_ODM_T pDM_Odm -) -{ - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8881A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \n")); - - //Output Pin Settings - // [SPDT related] - ODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0); - ODM_SetMACReg(pDM_Odm, 0x4C , BIT26, 0); - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT31, 0); //delay buffer - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT22, 0); - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT24, 1); - ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF00, 8); // DPDT_P = ANTSEL[0] - ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF0000, 8); // DPDT_N = ANTSEL[0] - - //Mapping Table - ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0); - ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1); - - //OFDM HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold - ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x0); //bias - ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns - - //CCK HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M - ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples - - //Timming issue - ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec) - - //2 [--For HW Bug Setting] - - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); //TX Ant by Reg // A-cut bug -} - -#endif //#if (RTL8881A_SUPPORT == 1) - - -#if (RTL8812A_SUPPORT == 1) -VOID -odm_TRX_HWAntDiv_Init_8812A( - IN PDM_ODM_T pDM_Odm -) -{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8812A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \n")); - - //3 //3 --RFE pin setting--------- - //[BB] - ODM_SetBBReg(pDM_Odm, 0x900 , BIT10|BIT9|BIT8, 0x0); //disable SW switch - ODM_SetBBReg(pDM_Odm, 0x900 , BIT17|BIT16, 0x0); - ODM_SetBBReg(pDM_Odm, 0x974 , BIT7|BIT6, 0x3); // in/out - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT31, 0); //delay buffer - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT26, 0); - ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT27, 1); - ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF000000, 8); // DPDT_P = ANTSEL[0] - ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF0000000, 8); // DPDT_N = ANTSEL[0] - //3 ------------------------- - - //Mapping Table - ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0); - ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1); - - //OFDM HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold - ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x0); //bias - ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns - - //CCK HW AntDiv Parameters - ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M - ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples - - //Timming issue - ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec) - - //2 [--For HW Bug Setting] - - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); //TX Ant by Reg // A-cut bug - -} - -#endif //#if (RTL8812A_SUPPORT == 1) - -VOID -odm_HW_AntDiv( - IN PDM_ODM_T pDM_Odm -) -{ - u4Byte i,MinMaxRSSI=0xFF, AntDivMaxRSSI=0, MaxRSSI=0, LocalMaxRSSI; - u4Byte Main_RSSI, Aux_RSSI, pkt_ratio_m=0, pkt_ratio_a=0,pkt_threshold=10; - u1Byte RxIdleAnt=0, TargetAnt=7; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; - PSTA_INFO_T pEntry; - - if(!pDM_Odm->bLinked) //bLinked==False - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n")); - - #if(DM_ODM_SUPPORT_TYPE == ODM_AP) - if (pDM_Odm->antdiv_rssi) - panic_printk("[No Link!!!]\n"); - #endif - - if(pDM_FatTable->bBecomeLinked == TRUE) - { - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - - pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked; - } - return; - } - else - { - if(pDM_FatTable->bBecomeLinked ==FALSE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n")); - odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON); - if(pDM_Odm->SupportICType == ODM_RTL8821 ) - ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable - - #if(DM_ODM_SUPPORT_TYPE == ODM_AP) - else if(pDM_Odm->SupportICType == ODM_RTL8881 ) - ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable - #endif - - else if(pDM_Odm->SupportICType == ODM_RTL8723B ||pDM_Odm->SupportICType == ODM_RTL8812) - ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function disable - - pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked; - - if(pDM_Odm->SupportICType==ODM_RTL8723B && pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) - { - ODM_SetBBReg(pDM_Odm, 0x930 , 0xF0, 8); // DPDT_P = ANTSEL[0] // for 8723B AntDiv function patch. BB Dino 130412 - ODM_SetBBReg(pDM_Odm, 0x930 , 0xF, 8); // DPDT_N = ANTSEL[0] - } - } - } - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n[HW AntDiv] Start =>\n")); - - for (i=0; ipODM_StaInfo[i]; - if(IS_STA_VALID(pEntry)) - { - //2 Caculate RSSI per Antenna - Main_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0; - Aux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0; - TargetAnt = (Main_RSSI==Aux_RSSI)?pDM_FatTable->RxIdleAnt:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT); - /* - if( pDM_FatTable->MainAnt_Cnt[i]!=0 && pDM_FatTable->AuxAnt_Cnt[i]!=0 ) - { - pkt_ratio_m=( pDM_FatTable->MainAnt_Cnt[i] / pDM_FatTable->AuxAnt_Cnt[i] ); - pkt_ratio_a=( pDM_FatTable->AuxAnt_Cnt[i] / pDM_FatTable->MainAnt_Cnt[i] ); - - if (pkt_ratio_m >= pkt_threshold) - TargetAnt=MAIN_ANT; - - else if(pkt_ratio_a >= pkt_threshold) - TargetAnt=AUX_ANT; - } - */ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** SupportICType=[%u] \n",pDM_Odm->SupportICType)); - 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)); - 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 )); - 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")); - - 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, - ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0))); - #if(DM_ODM_SUPPORT_TYPE == ODM_AP) - if (pDM_Odm->antdiv_rssi) - { - panic_printk("*** SupportICType=[%lu] \n",pDM_Odm->SupportICType); - //panic_printk("*** Phy_AntSel_A=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT2)>>2, - // ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0)); - //panic_printk("*** Phy_AntSel_B=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT2)>>2, - // ((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT0)) - panic_printk("*** Client[ %lu ] , Main_Cnt = (( %lu )) , Main_RSSI= (( %lu )) \n",i, pDM_FatTable->MainAnt_Cnt[i], Main_RSSI); - panic_printk("*** Client[ %lu ] , Aux_Cnt = (( %lu )) , Aux_RSSI = (( %lu )) \n" ,i, pDM_FatTable->AuxAnt_Cnt[i] , Aux_RSSI); - } - #endif - - - LocalMaxRSSI = (Main_RSSI>Aux_RSSI)?Main_RSSI:Aux_RSSI; - //2 Select MaxRSSI for DIG - if((LocalMaxRSSI > AntDivMaxRSSI) && (LocalMaxRSSI < 40)) - AntDivMaxRSSI = LocalMaxRSSI; - if(LocalMaxRSSI > MaxRSSI) - MaxRSSI = LocalMaxRSSI; - - //2 Select RX Idle Antenna - if ( (LocalMaxRSSI != 0) && (LocalMaxRSSI < MinMaxRSSI) ) - { - RxIdleAnt = TargetAnt; - MinMaxRSSI = LocalMaxRSSI; - } - /* - if((pDM_FatTable->RxIdleAnt == MAIN_ANT) && (Main_RSSI == 0)) - Main_RSSI = Aux_RSSI; - else if((pDM_FatTable->RxIdleAnt == AUX_ANT) && (Aux_RSSI == 0)) - Aux_RSSI = Main_RSSI; - - LocalMinRSSI = (Main_RSSI>Aux_RSSI)?Aux_RSSI:Main_RSSI; - if(LocalMinRSSI < MinRSSI) - { - MinRSSI = LocalMinRSSI; - RxIdleAnt = TargetAnt; - } - */ - //2 Select TX Antenna - - #if TX_BY_REG - - #else - if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) - odm_UpdateTxAnt(pDM_Odm, TargetAnt, i); - #endif - - } - pDM_FatTable->MainAnt_Sum[i] = 0; - pDM_FatTable->AuxAnt_Sum[i] = 0; - pDM_FatTable->MainAnt_Cnt[i] = 0; - pDM_FatTable->AuxAnt_Cnt[i] = 0; - } - - //2 Set RX Idle Antenna - ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt); - - #if(DM_ODM_SUPPORT_TYPE == ODM_AP) - if (pDM_Odm->antdiv_rssi) - panic_printk("*** RxIdleAnt = (( %s )) \n \n", ( RxIdleAnt ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"); - #endif - - pDM_DigTable->AntDiv_RSSI_max = AntDivMaxRSSI; - pDM_DigTable->RSSI_max = MaxRSSI; -} - - - -#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) -VOID -odm_S0S1_SwAntDiv( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Step - ) -{ - u4Byte i,MinMaxRSSI=0xFF, LocalMaxRSSI,LocalMinRSSI; - u4Byte Main_RSSI, Aux_RSSI; - u1Byte reset_period=10, SWAntDiv_threshold=35; - u1Byte HighTraffic_TrainTime_U=0x32,HighTraffic_TrainTime_L,Train_time_temp; - u1Byte LowTraffic_TrainTime_U=200,LowTraffic_TrainTime_L; - u1Byte RxIdleAnt, TargetAnt, nextAnt; - pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - PSTA_INFO_T pEntry=NULL; - //static u1Byte reset_idx; - u4Byte value32; - PADAPTER Adapter = pDM_Odm->Adapter; - u8Byte curTxOkCnt=0, curRxOkCnt=0,TxCntOffset, RxCntOffset; - - if(!pDM_Odm->bLinked) //bLinked==False - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n")); - if(pDM_FatTable->bBecomeLinked == TRUE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set REG 948[9:6]=0x0 \n")); - if(pDM_Odm->SupportICType == ODM_RTL8723B) - ODM_SetBBReg(pDM_Odm, 0x948 , BIT9|BIT8|BIT7|BIT6, 0x0); - - pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked; - } - return; - } - else - { - if(pDM_FatTable->bBecomeLinked ==FALSE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n")); - - if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - value32 = ODM_GetBBReg(pDM_Odm, 0x864, BIT5|BIT4|BIT3); - - if (value32==0x0) - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - else if (value32==0x1) - ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); - - ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0x1); - 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 )); - } - - pDM_SWAT_Table->lastTxOkCnt = 0; - pDM_SWAT_Table->lastRxOkCnt =0; - TxCntOffset = Adapter->TxStats.NumTxBytesUnicast; - RxCntOffset = Adapter->RxStats.NumRxBytesUnicast; - - pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked; - } - else - { - TxCntOffset = 0; - RxCntOffset = 0; - } - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[%d] { try_flag=(( %d )), Step=(( %d )), Double_chk_flag = (( %d )) }\n", - __LINE__,pDM_SWAT_Table->try_flag,Step,pDM_SWAT_Table->Double_chk_flag)); - - // 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_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Step != try_flag] Need to Reset After Link\n")); - ODM_SwAntDivRestAfterLink(pDM_Odm); - } - - if(pDM_SWAT_Table->try_flag == 0xff) - { - pDM_SWAT_Table->try_flag = 0; - pDM_SWAT_Table->Train_time_flag=0; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag = 0] Prepare for peak!\n\n")); - return; - } - else//if( try_flag != 0xff ) - { - //1 Normal State (Begin Trying) - if(pDM_SWAT_Table->try_flag == 0) - { - - //---trafic decision--- - curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_SWAT_Table->lastTxOkCnt - TxCntOffset; - curRxOkCnt =Adapter->RxStats.NumRxBytesUnicast - pDM_SWAT_Table->lastRxOkCnt - RxCntOffset; - pDM_SWAT_Table->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast; - pDM_SWAT_Table->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast; - - if (curTxOkCnt > 1875000 || curRxOkCnt > 1875000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000) ( 1.875M * 8bit ) / 2= 7.5M bits /sec ) - { - pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH; - Train_time_temp=pDM_SWAT_Table->Train_time ; - - if(pDM_SWAT_Table->Train_time_flag==3) - { - HighTraffic_TrainTime_L=0xa; - - if(Train_time_temp<=16) - Train_time_temp=HighTraffic_TrainTime_L; - else - Train_time_temp-=16; - - } - else if(pDM_SWAT_Table->Train_time_flag==2) - { - Train_time_temp-=8; - HighTraffic_TrainTime_L=0xf; - } - else if(pDM_SWAT_Table->Train_time_flag==1) - { - Train_time_temp-=4; - HighTraffic_TrainTime_L=0x1e; - } - else if(pDM_SWAT_Table->Train_time_flag==0) - { - Train_time_temp+=8; - HighTraffic_TrainTime_L=0x28; - } - - - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Train_time_temp = ((%d))\n",Train_time_temp)); - - //-- - if(Train_time_temp > HighTraffic_TrainTime_U) - Train_time_temp=HighTraffic_TrainTime_U; - - else if(Train_time_temp < HighTraffic_TrainTime_L) - Train_time_temp=HighTraffic_TrainTime_L; - - pDM_SWAT_Table->Train_time = Train_time_temp; //50ms~10ms - - 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)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [HIGH Traffic] \n" )); - } - else if (curTxOkCnt > 125000 || curRxOkCnt > 125000) // ( 0.125M * 8bit ) / 2 = 0.5M bits /sec ) - { - pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW; - Train_time_temp=pDM_SWAT_Table->Train_time ; - - if(pDM_SWAT_Table->Train_time_flag==3) - { - LowTraffic_TrainTime_L=10; - if(Train_time_temp<50) - Train_time_temp=LowTraffic_TrainTime_L; - else - Train_time_temp-=50; - } - else if(pDM_SWAT_Table->Train_time_flag==2) - { - Train_time_temp-=30; - LowTraffic_TrainTime_L=36; - } - else if(pDM_SWAT_Table->Train_time_flag==1) - { - Train_time_temp-=10; - LowTraffic_TrainTime_L=40; - } - else - Train_time_temp+=10; - - //-- - if(Train_time_temp >= LowTraffic_TrainTime_U) - Train_time_temp=LowTraffic_TrainTime_U; - - else if(Train_time_temp <= LowTraffic_TrainTime_L) - Train_time_temp=LowTraffic_TrainTime_L; - - pDM_SWAT_Table->Train_time = Train_time_temp; //50ms~20ms - - 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)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [Low Traffic] \n" )); - } - else - { - pDM_SWAT_Table->TrafficLoad = TRAFFIC_UltraLOW; - pDM_SWAT_Table->Train_time = 0xc8; //200ms - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [Ultra-Low Traffic] \n" )); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TxOkCnt=(( %llu )), RxOkCnt=(( %llu )) \n", - curTxOkCnt ,curRxOkCnt )); - - //----------------- - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" Current MinMaxRSSI is ((%d)) \n",pDM_FatTable->MinMaxRSSI)); - - //---reset index--- - if(pDM_SWAT_Table->reset_idx>=reset_period) - { - pDM_FatTable->MinMaxRSSI=0; // - pDM_SWAT_Table->reset_idx=0; - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reset_idx = (( %d )) \n",pDM_SWAT_Table->reset_idx )); - //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("reset_idx=%d\n",pDM_SWAT_Table->reset_idx)); - pDM_SWAT_Table->reset_idx++; - - //---double check flag--- - if(pDM_FatTable->MinMaxRSSI > SWAntDiv_threshold && pDM_SWAT_Table->Double_chk_flag== 0) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" MinMaxRSSI is ((%d)), and > %d \n", - pDM_FatTable->MinMaxRSSI,SWAntDiv_threshold)); - - pDM_SWAT_Table->Double_chk_flag =1; - pDM_SWAT_Table->try_flag = 1; - pDM_SWAT_Table->RSSI_Trying = 0; - - 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)); - ODM_UpdateRxIdleAnt(pDM_Odm, pDM_FatTable->RxIdleAnt); - ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer_8723B, pDM_SWAT_Table->Train_time ); //ms - return; - } - - nextAnt = (pDM_FatTable->RxIdleAnt == MAIN_ANT)? AUX_ANT : MAIN_ANT; - - pDM_SWAT_Table->try_flag = 1; - - if(pDM_SWAT_Table->reset_idx<=1) - pDM_SWAT_Table->RSSI_Trying = 2; - else - pDM_SWAT_Table->RSSI_Trying = 1; - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag=1] Normal State: Begin Trying!! \n")); - - } - - else if(pDM_SWAT_Table->try_flag == 1 && pDM_SWAT_Table->Double_chk_flag== 0) - { - nextAnt = (pDM_FatTable->RxIdleAnt == MAIN_ANT)? AUX_ANT : MAIN_ANT; - pDM_SWAT_Table->RSSI_Trying--; - } - - //1 Decision State - if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0) ) - { - - for (i=0; ipODM_StaInfo[i]; - if(IS_STA_VALID(pEntry)) - { - //2 Caculate RSSI per Antenna - Main_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0; - Aux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0; - - if(pDM_FatTable->MainAnt_Cnt[i]<=1 && pDM_FatTable->CCK_counter_main>=1) - Main_RSSI=0; - - if(pDM_FatTable->AuxAnt_Cnt[i]<=1 && pDM_FatTable->CCK_counter_aux>=1) - Aux_RSSI=0; - - TargetAnt = (Main_RSSI==Aux_RSSI)?pDM_SWAT_Table->PreAntenna:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT); - LocalMaxRSSI = (Main_RSSI>=Aux_RSSI) ? Main_RSSI : Aux_RSSI; - LocalMinRSSI = (Main_RSSI>=Aux_RSSI) ? Aux_RSSI : Main_RSSI; - - 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)); - 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)); - 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)); - 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 )); - 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")); - - //2 Select RX Idle Antenna - - if (LocalMaxRSSI != 0 && LocalMaxRSSI < MinMaxRSSI) - { - RxIdleAnt = TargetAnt; - MinMaxRSSI = LocalMaxRSSI; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** LocalMaxRSSI-LocalMinRSSI = ((%d))\n",(LocalMaxRSSI-LocalMinRSSI))); - - if((LocalMaxRSSI-LocalMinRSSI)>8) - { - if(LocalMinRSSI != 0) - pDM_SWAT_Table->Train_time_flag=3; - else - { - if(MinMaxRSSI > SWAntDiv_threshold) - pDM_SWAT_Table->Train_time_flag=0; - else - pDM_SWAT_Table->Train_time_flag=3; - } - } - else if((LocalMaxRSSI-LocalMinRSSI)>5) - pDM_SWAT_Table->Train_time_flag=2; - else if((LocalMaxRSSI-LocalMinRSSI)>2) - pDM_SWAT_Table->Train_time_flag=1; - else - pDM_SWAT_Table->Train_time_flag=0; - - } - - //2 Select TX Antenna - if(TargetAnt == MAIN_ANT) - pDM_FatTable->antsel_a[i] = ANT1_2G; - else - pDM_FatTable->antsel_a[i] = ANT2_2G; - - } - pDM_FatTable->MainAnt_Sum[i] = 0; - pDM_FatTable->AuxAnt_Sum[i] = 0; - pDM_FatTable->MainAnt_Cnt[i] = 0; - pDM_FatTable->AuxAnt_Cnt[i] = 0; - pDM_FatTable->CCK_counter_main=0; - pDM_FatTable->CCK_counter_aux=0; - pDM_FatTable->OFDM_counter_main=0; - pDM_FatTable->OFDM_counter_aux=0; - - } - - - pDM_FatTable->MinMaxRSSI=MinMaxRSSI; - pDM_SWAT_Table->try_flag = 0; - - if( pDM_SWAT_Table->Double_chk_flag==1) - { - pDM_SWAT_Table->Double_chk_flag=0; - if(pDM_FatTable->MinMaxRSSI > SWAntDiv_threshold) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" [Double check] MinMaxRSSI ((%d)) > %d again!! \n", - pDM_FatTable->MinMaxRSSI,SWAntDiv_threshold)); - - ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[reset try_flag = 0] Training accomplished !!!] \n\n\n")); - return; - } - else - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" [Double check] MinMaxRSSI ((%d)) <= %d !! \n", - pDM_FatTable->MinMaxRSSI,SWAntDiv_threshold)); - - nextAnt = (pDM_FatTable->RxIdleAnt == MAIN_ANT)? AUX_ANT : MAIN_ANT; - pDM_SWAT_Table->try_flag = 0; - pDM_SWAT_Table->reset_idx=reset_period; - 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")); - return; - } - } - else - { - pDM_SWAT_Table->PreAntenna =RxIdleAnt; - ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt ); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[reset try_flag = 0] Training accomplished !!!] \n\n\n")); - return; - } - - } - - } - - //1 4.Change TRX antenna - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = (( %d )), Ant: (( %s )) >>> (( %s )) \n", - pDM_SWAT_Table->RSSI_Trying, (pDM_FatTable->RxIdleAnt == MAIN_ANT?"MAIN":"AUX"),(nextAnt == MAIN_ANT?"MAIN":"AUX"))); - - ODM_UpdateRxIdleAnt(pDM_Odm, nextAnt); - - //1 5.Reset Statistics - - pDM_FatTable->RxIdleAnt = nextAnt; - - //1 6.Set next timer (Trying State) - - 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)); - ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer_8723B, pDM_SWAT_Table->Train_time ); //ms -} - - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID -ODM_SW_AntDiv_Callback( - 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_8723B); - #else - { - //DbgPrint("SW_antdiv_Callback"); - odm_S0S1_SwAntDiv(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE); - } - #endif - #else - ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem_8723B); - #endif -} -VOID -ODM_SW_AntDiv_WorkitemCallback( - IN PVOID pContext - ) -{ - PADAPTER pAdapter = (PADAPTER)pContext; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - //DbgPrint("SW_antdiv_Workitem_Callback"); - odm_S0S1_SwAntDiv(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE); -} -#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -VOID -ODM_SW_AntDiv_Callback(void *FunctionContext) -{ - PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext; - PADAPTER padapter = pDM_Odm->Adapter; - if(padapter->net_closed == _TRUE) - return; - //odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_DETERMINE); -} -#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - -#endif //#if (RTL8723B_SUPPORT == 1) - - -#if(RTL8188E_SUPPORT == 1 || RTL8192E_SUPPORT == 1) -#if (!(DM_ODM_SUPPORT_TYPE == ODM_CE)) -VOID -odm_SetNextMACAddrTarget( - IN PDM_ODM_T pDM_Odm -) -{ - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - PSTA_INFO_T pEntry; - //u1Byte Bssid[6]; - u4Byte value32, i; - - // - //2012.03.26 LukeLee: The MAC address is changed according to MACID in turn - // - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SetNextMACAddrTarget() ==>\n")); - if(pDM_Odm->bLinked) - { - for (i=0; iTrainIdx+1) == ODM_ASSOCIATE_ENTRY_NUM) - pDM_FatTable->TrainIdx = 0; - else - pDM_FatTable->TrainIdx++; - - pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx]; - if(IS_STA_VALID(pEntry)) - { - //Match MAC ADDR -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - value32 = (pEntry->hwaddr[5]<<8)|pEntry->hwaddr[4]; -#else - value32 = (pEntry->MacAddr[5]<<8)|pEntry->MacAddr[4]; -#endif - ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32); -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - value32 = (pEntry->hwaddr[3]<<24)|(pEntry->hwaddr[2]<<16) |(pEntry->hwaddr[1]<<8) |pEntry->hwaddr[0]; -#else - value32 = (pEntry->MacAddr[3]<<24)|(pEntry->MacAddr[2]<<16) |(pEntry->MacAddr[1]<<8) |pEntry->MacAddr[0]; -#endif - ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_FatTable->TrainIdx=%lu\n",pDM_FatTable->TrainIdx)); -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training MAC Addr = %x:%x:%x:%x:%x:%x\n", - pEntry->hwaddr[5],pEntry->hwaddr[4],pEntry->hwaddr[3],pEntry->hwaddr[2],pEntry->hwaddr[1],pEntry->hwaddr[0])); -#else - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training MAC Addr = %x:%x:%x:%x:%x:%x\n", - pEntry->MacAddr[5],pEntry->MacAddr[4],pEntry->MacAddr[3],pEntry->MacAddr[2],pEntry->MacAddr[1],pEntry->MacAddr[0])); -#endif - - break; - } - } - - } - -#if 0 - // - //2012.03.26 LukeLee: This should be removed later, the MAC address is changed according to MACID in turn - // - #if( DM_ODM_SUPPORT_TYPE & ODM_WIN) - { - PADAPTER Adapter = pDM_Odm->Adapter; - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - - for (i=0; i<6; i++) - { - Bssid[i] = pMgntInfo->Bssid[i]; - //DbgPrint("Bssid[%d]=%x\n", i, Bssid[i]); - } - } - #endif - - //odm_SetNextMACAddrTarget(pDM_Odm); - - //1 Select MAC Address Filter - for (i=0; i<6; i++) - { - if(Bssid[i] != pDM_FatTable->Bssid[i]) - { - bMatchBSSID = FALSE; - break; - } - } - if(bMatchBSSID == FALSE) - { - //Match MAC ADDR - value32 = (Bssid[5]<<8)|Bssid[4]; - ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32); - value32 = (Bssid[3]<<24)|(Bssid[2]<<16) |(Bssid[1]<<8) |Bssid[0]; - ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32); - } - - return bMatchBSSID; -#endif - -} - -VOID -odm_FastAntTraining( - IN PDM_ODM_T pDM_Odm -) -{ - u4Byte i, MaxRSSI=0; - u1Byte TargetAnt=2; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - BOOLEAN bPktFilterMacth = FALSE; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("==>odm_FastAntTraining()\n")); - - //1 TRAINING STATE - if(pDM_FatTable->FAT_State == FAT_TRAINING_STATE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Enter FAT_TRAINING_STATE\n")); - //2 Caculate RSSI per Antenna - for (i=0; i<7; i++) - { - if(pDM_FatTable->antRSSIcnt[i] == 0) - pDM_FatTable->antAveRSSI[i] = 0; - else - { - pDM_FatTable->antAveRSSI[i] = pDM_FatTable->antSumRSSI[i] /pDM_FatTable->antRSSIcnt[i]; - bPktFilterMacth = TRUE; - } - if(pDM_FatTable->antAveRSSI[i] > MaxRSSI) - { - MaxRSSI = pDM_FatTable->antAveRSSI[i]; - TargetAnt = (u1Byte) i; - } - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_FatTable->antAveRSSI[%lu] = %lu, pDM_FatTable->antRSSIcnt[%lu] = %lu\n", - i, pDM_FatTable->antAveRSSI[i], i, pDM_FatTable->antRSSIcnt[i])); - } - - //2 Select TRX Antenna - if(bPktFilterMacth == FALSE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("None Packet is matched\n")); - - ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0); //RegE08[16]=1'b0 //disable fast training - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv - } - else - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TargetAnt=%d, MaxRSSI=%lu\n",TargetAnt,MaxRSSI)); - - ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0); //RegE08[16]=1'b0 //disable fast training - //ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv - ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, TargetAnt); //Default RX is Omni, Optional RX is the best decision by FAT - //ODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, TargetAnt); //Default TX - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1 //from TX Info - -#if 0 - pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx]; - - if(IS_STA_VALID(pEntry)) - { - pEntry->antsel_a = TargetAnt&BIT0; - pEntry->antsel_b = (TargetAnt&BIT1)>>1; - pEntry->antsel_c = (TargetAnt&BIT2)>>2; - } -#else - pDM_FatTable->antsel_a[pDM_FatTable->TrainIdx] = TargetAnt&BIT0; - pDM_FatTable->antsel_b[pDM_FatTable->TrainIdx] = (TargetAnt&BIT1)>>1; - pDM_FatTable->antsel_c[pDM_FatTable->TrainIdx] = (TargetAnt&BIT2)>>2; -#endif - - - if(TargetAnt == 0) - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv - - } - - //2 Reset Counter - for(i=0; i<7; i++) - { - pDM_FatTable->antSumRSSI[i] = 0; - pDM_FatTable->antRSSIcnt[i] = 0; - } - - pDM_FatTable->FAT_State = FAT_NORMAL_STATE; - return; - } - - //1 NORMAL STATE - if(pDM_FatTable->FAT_State == FAT_NORMAL_STATE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Enter FAT_NORMAL_STATE\n")); - - odm_SetNextMACAddrTarget(pDM_Odm); - -#if 0 - pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx]; - if(IS_STA_VALID(pEntry)) - { - pEntry->antsel_a = TargetAnt&BIT0; - pEntry->antsel_b = (TargetAnt&BIT1)>>1; - pEntry->antsel_c = (TargetAnt&BIT2)>>2; - } -#endif - - //2 Prepare Training - pDM_FatTable->FAT_State = FAT_TRAINING_STATE; - ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 1); //RegE08[16]=1'b1 //enable fast training - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 1); //RegC50[7]=1'b1 //enable HW AntDiv - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Start FAT_TRAINING_STATE\n")); - ODM_SetTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer, 500 ); //ms - - } - -} - -VOID -odm_FastAntTrainingCallback( - IN PDM_ODM_T pDM_Odm -) -{ - -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PADAPTER padapter = pDM_Odm->Adapter; - if(padapter->net_closed == _TRUE) - return; - //if(*pDM_Odm->pbNet_closed == TRUE) - // return; -#endif - -#if USE_WORKITEM - ODM_ScheduleWorkItem(&pDM_Odm->FastAntTrainingWorkitem); -#else - odm_FastAntTraining(pDM_Odm); -#endif -} - -VOID -odm_FastAntTrainingWorkItemCallback( - IN PDM_ODM_T pDM_Odm -) -{ - odm_FastAntTraining(pDM_Odm); -} -#endif - -#endif - - -VOID -ODM_AntDivInit( - IN PDM_ODM_T pDM_Odm - ) -{ - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - - - if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] Not Support Antenna Diversity Function\n")); - return; - } - //--- -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_2G) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[2G AntDiv Init]: Only Support 2G Antenna Diversity Function\n")); - if(!(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC)) - return; - } - else if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_5G) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[5G AntDiv Init]: Only Support 5G Antenna Diversity Function\n")); - if(!(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC)) - return; - } - else if(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G)) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[2G & 5G AntDiv Init]:Support Both 2G & 5G Antenna Diversity Function\n")); - } - - pDM_Odm->antdiv_rssi=0; - -#endif - //--- - - //2 [--General---] - pDM_Odm->antdiv_period=0; - pDM_Odm->antdiv_select=0; - pDM_SWAT_Table->Ant5G = MAIN_ANT; - pDM_SWAT_Table->Ant2G = MAIN_ANT; - pDM_FatTable->CCK_counter_main=0; - pDM_FatTable->CCK_counter_aux=0; - pDM_FatTable->OFDM_counter_main=0; - pDM_FatTable->OFDM_counter_aux=0; - - //3 [Set MAIN_ANT as default antenna if Auto-Ant enable] - if (pDM_Odm->antdiv_select==1) - pDM_Odm->AntType = ODM_FIX_MAIN_ANT; - else if (pDM_Odm->antdiv_select==2) - pDM_Odm->AntType = ODM_FIX_AUX_ANT; - else if(pDM_Odm->antdiv_select==0) - pDM_Odm->AntType = ODM_AUTO_ANT; - - if(pDM_Odm->AntType == ODM_AUTO_ANT) - { - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - } - else - { - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - - if(pDM_Odm->AntType == ODM_FIX_MAIN_ANT) - { - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - return; - } - else if(pDM_Odm->AntType == ODM_FIX_AUX_ANT) - { - ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); - return; - } - } - //--- - if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) - { - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - { - #if TX_BY_REG - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 0); //Reg80c[21]=1'b0 //from Reg - #else - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); - #endif - } - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - { - #if TX_BY_REG - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); - #else - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 1); - #endif - } - } - - //2 [--88E---] - if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - #if (RTL8188E_SUPPORT == 1) - //pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV; - //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV; - //pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV; - - if( (pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_SMART_ANTDIV)) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 88E Not Supprrt This AntDiv Type\n")); - pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV); - return; - } - - if(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV) - odm_RX_HWAntDiv_Init_88E(pDM_Odm); - else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) - odm_TRX_HWAntDiv_Init_88E(pDM_Odm); - else if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) - odm_Smart_HWAntDiv_Init_88E(pDM_Odm); - #endif - } - - //2 [--92E---] - #if (RTL8192E_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8192E) - { - //pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV; - //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV; - //pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV; - - if( (pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_SMART_ANTDIV)) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8192E Not Supprrt This AntDiv Type\n")); - pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV); - return; - } - - if(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV) - odm_RX_HWAntDiv_Init_92E(pDM_Odm); - else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) - odm_TRX_HWAntDiv_Init_92E(pDM_Odm); - else if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) - odm_Smart_HWAntDiv_Init_92E(pDM_Odm); - - } - #endif - - //2 [--8723B---] - #if (RTL8723B_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - //pDM_Odm->AntDivType = S0S1_SW_ANTDIV; - //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV; - - if(pDM_Odm->AntDivType != S0S1_SW_ANTDIV && pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8723B Not Supprrt This AntDiv Type\n")); - pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV); - return; - } - - if( pDM_Odm->AntDivType==S0S1_SW_ANTDIV) - odm_S0S1_SWAntDiv_Init_8723B(pDM_Odm); - else if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV) - odm_TRX_HWAntDiv_Init_8723B(pDM_Odm); - } - #endif - - //2 [--8811A 8821A---] - #if (RTL8821A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8821) - { - //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV; - pDM_Odm->AntDivType = S0S1_SW_ANTDIV; - - if( pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV && pDM_Odm->AntDivType != S0S1_SW_ANTDIV) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8821A & 8811A Not Supprrt This AntDiv Type\n")); - pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV); - return; - } - if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV) - odm_TRX_HWAntDiv_Init_8821A(pDM_Odm); - else if( pDM_Odm->AntDivType==S0S1_SW_ANTDIV) - odm_S0S1_SWAntDiv_Init_8821A(pDM_Odm); - } - #endif - - //2 [--8881A---] - #if (RTL8881A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8881A) - { - //pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV; - //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV; - - if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV && pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8881A Not Supprrt This AntDiv Type\n")); - pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV); - return; - } - if(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV) - odm_RX_HWAntDiv_Init_8881A(pDM_Odm); - else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) - odm_TRX_HWAntDiv_Init_8881A(pDM_Odm); - } - #endif - - //2 [--8812---] - #if (RTL8812A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8812) - { - //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV; - - if( pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8812A Not Supprrt This AntDiv Type\n")); - pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV); - return; - } - odm_TRX_HWAntDiv_Init_8812A(pDM_Odm); - } - #endif - //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** SupportICType=[%lu] \n",pDM_Odm->SupportICType)); - //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** AntDiv SupportAbility=[%lu] \n",(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)>>6)); - //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** AntDiv Type=[%d] \n",pDM_Odm->AntDivType)); - -} - -VOID -ODM_AntDiv( - IN PDM_ODM_T pDM_Odm -) -{ - PADAPTER pAdapter = pDM_Odm->Adapter; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - -//#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - if(*pDM_Odm->pBandType == ODM_BAND_5G ) - { - if(pDM_FatTable->idx_AntDiv_counter_5G < pDM_Odm->antdiv_period ) - { - pDM_FatTable->idx_AntDiv_counter_5G++; - return; - } - else - pDM_FatTable->idx_AntDiv_counter_5G=0; - } - else if(*pDM_Odm->pBandType == ODM_BAND_2_4G ) - { - if(pDM_FatTable->idx_AntDiv_counter_2G < pDM_Odm->antdiv_period ) - { - pDM_FatTable->idx_AntDiv_counter_2G++; - return; - } - else - pDM_FatTable->idx_AntDiv_counter_2G=0; - } -//#endif - //---------- - if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] Not Support Antenna Diversity Function\n")); - return; - } - - //---------- -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - if(pAdapter->MgntInfo.AntennaTest) - return; - - { - #if (BEAMFORMING_SUPPORT == 1) - BEAMFORMING_CAP BeamformCap = (pAdapter->MgntInfo.BeamformingInfo.BeamformCap); - - if( BeamformCap & BEAMFORMEE_CAP ) // BFmee On && Div On -> Div Off - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ AntDiv : OFF ] BFmee ==1 \n")); - if(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) - { - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV); - return; - } - } - else // BFmee Off && Div Off -> Div On - #endif - { - if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) && pDM_Odm->bLinked) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ AntDiv : ON ] BFmee ==0 \n")); - if((pDM_Odm->AntDivType!=S0S1_SW_ANTDIV) ) - odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON); - - pDM_Odm->SupportAbility |= (ODM_BB_ANT_DIV); - } - } - } -#endif - - //---------- -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_2G) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G AntDiv Running ]\n")); - if(!(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC)) - return; - } - else if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_5G) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 5G AntDiv Running ]\n")); - if(!(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC)) - return; - } - else if(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G)) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G & 5G AntDiv Running ]\n")); - } -#endif - - //---------- - - if (pDM_Odm->antdiv_select==1) - pDM_Odm->AntType = ODM_FIX_MAIN_ANT; - else if (pDM_Odm->antdiv_select==2) - pDM_Odm->AntType = ODM_FIX_AUX_ANT; - else if (pDM_Odm->antdiv_select==0) - pDM_Odm->AntType = ODM_AUTO_ANT; - - //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)); - - if(pDM_Odm->AntType != ODM_AUTO_ANT) - { - 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")); - - if(pDM_Odm->AntType != pDM_Odm->pre_AntType) - { - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 0); - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); - - if(pDM_Odm->AntType == ODM_FIX_MAIN_ANT) - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - else if(pDM_Odm->AntType == ODM_FIX_AUX_ANT) - ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); - } - pDM_Odm->pre_AntType=pDM_Odm->AntType; - return; - } - else - { - if(pDM_Odm->AntType != pDM_Odm->pre_AntType) - { - odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON); - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 1); - } - pDM_Odm->pre_AntType=pDM_Odm->AntType; - } - - - //3 ----------------------------------------------------------------------------------------------------------- - //2 [--88E---] - if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - #if (RTL8188E_SUPPORT == 1) - if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV ||pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV) - odm_HW_AntDiv(pDM_Odm); - #if (!(DM_ODM_SUPPORT_TYPE == ODM_CE)) - else if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV) - odm_FastAntTraining(pDM_Odm); - #endif - #endif - } - //2 [--92E---] - #if (RTL8192E_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8192E) - { - if(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV) - odm_HW_AntDiv(pDM_Odm); - #if (!(DM_ODM_SUPPORT_TYPE == ODM_CE)) - else if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV) - odm_FastAntTraining(pDM_Odm); - #endif - } - #endif - - #if (RTL8723B_SUPPORT == 1) - //2 [--8723B---] - else if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - if (pDM_Odm->AntDivType==S0S1_SW_ANTDIV) - odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_PEAK); - else if (pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV) - odm_HW_AntDiv(pDM_Odm); - } - #endif - - //2 [--8821A---] - #if (RTL8821A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8821) - { - if(!pDM_Odm->bBtEnabled) //BT disabled - { - if(pDM_Odm->AntDivType == S0S1_SW_ANTDIV) - { - pDM_Odm->AntDivType=CG_TRX_HW_ANTDIV; - ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 1); - } - } - else //BT enabled - { - if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) - { - pDM_Odm->AntDivType=S0S1_SW_ANTDIV; - ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 0); - } - } - - if (pDM_Odm->AntDivType==S0S1_SW_ANTDIV) - odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_PEAK); - else if (pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV) - odm_HW_AntDiv(pDM_Odm); - } - #endif - //2 [--8881A---] - #if (RTL8881A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8881A) - odm_HW_AntDiv(pDM_Odm); - #endif - //2 [--8812A---] - #if (RTL8812A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8812) - odm_HW_AntDiv(pDM_Odm); - #endif -} - - -VOID -odm_AntselStatistics( - IN PDM_ODM_T pDM_Odm, - IN u1Byte antsel_tr_mux, - IN u4Byte MacId, - IN u4Byte RxPWDBAll -) -{ - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - - if(antsel_tr_mux == ANT1_2G) - { - pDM_FatTable->MainAnt_Sum[MacId]+=RxPWDBAll; - pDM_FatTable->MainAnt_Cnt[MacId]++; - } - else - { - pDM_FatTable->AuxAnt_Sum[MacId]+=RxPWDBAll; - pDM_FatTable->AuxAnt_Cnt[MacId]++; - } -} - - -VOID -ODM_Process_RSSIForAntDiv( - IN OUT PDM_ODM_T pDM_Odm, - IN PODM_PHY_INFO_T pPhyInfo, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ -u1Byte isCCKrate=0,CCKMaxRate=DESC_RATE11M; -pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - u4Byte RxPower_Ant0, RxPower_Ant1; -#else - u1Byte RxPower_Ant0, RxPower_Ant1; -#endif - - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - CCKMaxRate=DESC_RATE11M; - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - CCKMaxRate=DESC_RATE11M; - isCCKrate = (pPktinfo->DataRate <= CCKMaxRate)?TRUE:FALSE; - -#if ((RTL8192C_SUPPORT == 1) ||(RTL8192D_SUPPORT == 1)) - if(pDM_Odm->SupportICType & ODM_RTL8192C|ODM_RTL8192D) - { - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) - { - //if(pPktinfo->bPacketBeacon) - //{ - // DbgPrint("This is beacon, isCCKrate=%d\n", isCCKrate); - //} - ODM_AntselStatistics_88C(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxPWDBAll, isCCKrate); - } - } -#endif - - if( (pDM_Odm->SupportICType == ODM_RTL8192E||pDM_Odm->SupportICType == ODM_RTL8812) && (pPktinfo->DataRate > CCKMaxRate) ) - { - RxPower_Ant0 = pPhyInfo->RxMIMOSignalStrength[0]; - RxPower_Ant1= pPhyInfo->RxMIMOSignalStrength[1]; - } - else - RxPower_Ant0=pPhyInfo->RxPWDBAll; - - if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) - { - if( (pDM_Odm->SupportICType & ODM_SMART_ANT_SUPPORT) && pPktinfo->bPacketToSelf && pDM_FatTable->FAT_State == FAT_TRAINING_STATE )//(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon)) - { - u1Byte antsel_tr_mux; - antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; - pDM_FatTable->antSumRSSI[antsel_tr_mux] += RxPower_Ant0; - pDM_FatTable->antRSSIcnt[antsel_tr_mux]++; - } - } - else //AntDivType != CG_TRX_SMART_ANTDIV - { - if( ( pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT ) && (pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) ) - { - if(pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E) - odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID,RxPower_Ant0); - else// SupportICType == ODM_RTL8821 and ODM_RTL8723B and ODM_RTL8812) - { - if(isCCKrate && (pDM_Odm->AntDivType == S0S1_SW_ANTDIV)) - { - pDM_FatTable->antsel_rx_keep_0 = (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ANT1_2G : ANT2_2G; - - - if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G) - pDM_FatTable->CCK_counter_main++; - else// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G) - pDM_FatTable->CCK_counter_aux++; - - odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0); - } - else - { - - if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G) - pDM_FatTable->OFDM_counter_main++; - else// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G) - pDM_FatTable->OFDM_counter_aux++; - odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0); - } - } - } - } - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("isCCKrate=%d, PWDB_ALL=%d\n",isCCKrate, pPhyInfo->RxPWDBAll)); - //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)); -} - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -VOID -ODM_SetTxAntByTxInfo( - IN PDM_ODM_T pDM_Odm, - IN pu1Byte pDesc, - IN u1Byte macId -) -{ - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - - if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) - return; - - if(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV) - return; - - - if(pDM_Odm->SupportICType == ODM_RTL8723B) - { -#if (RTL8723B_SUPPORT == 1) - SET_TX_DESC_ANTSEL_A_8723B(pDesc, pDM_FatTable->antsel_a[macId]); - //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", - //macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId])); -#endif - } - else if(pDM_Odm->SupportICType == ODM_RTL8821) - { -#if (RTL8821A_SUPPORT == 1) - SET_TX_DESC_ANTSEL_A_8812(pDesc, pDM_FatTable->antsel_a[macId]); - //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", - //macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId])); -#endif - } - else if(pDM_Odm->SupportICType == ODM_RTL8188E) - { -#if (RTL8188E_SUPPORT == 1) - SET_TX_DESC_ANTSEL_A_88E(pDesc, pDM_FatTable->antsel_a[macId]); - SET_TX_DESC_ANTSEL_B_88E(pDesc, pDM_FatTable->antsel_b[macId]); - SET_TX_DESC_ANTSEL_C_88E(pDesc, pDM_FatTable->antsel_c[macId]); - //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", - //macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId])); -#endif - } - else if(pDM_Odm->SupportICType == ODM_RTL8192E) - { - - - } -} -#else// (DM_ODM_SUPPORT_TYPE == ODM_AP) - -VOID -ODM_SetTxAntByTxInfo( - //IN PDM_ODM_T pDM_Odm, - struct rtl8192cd_priv *priv, - struct tx_desc *pdesc, - struct tx_insn *txcfg, - unsigned short aid -) -{ - pFAT_T pDM_FatTable = &priv->pshare->_dmODM.DM_FatTable; - u4Byte SupportICType=priv->pshare->_dmODM.SupportICType; - - if(SupportICType == ODM_RTL8881A) - { - //panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E****** \n",__FUNCTION__,__LINE__); - pdesc->Dword6 &= set_desc(~ (BIT(18)|BIT(17)|BIT(16))); - pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16); - } - else if(SupportICType == ODM_RTL8192E) - { - //panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8192E****** \n",__FUNCTION__,__LINE__); - pdesc->Dword6 &= set_desc(~ (BIT(18)|BIT(17)|BIT(16))); - pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16); - } - else if(SupportICType == ODM_RTL8812) - { - //3 [path-A] - //panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E****** \n",__FUNCTION__,__LINE__); - - pdesc->Dword6 &= set_desc(~ BIT(16)); - pdesc->Dword6 &= set_desc(~ BIT(17)); - pdesc->Dword6 &= set_desc(~ BIT(18)); - if(txcfg->pstat) - { - pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16); - pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_b[aid]<<17); - pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_c[aid]<<18); - } - } -} -#endif - -#else - -VOID ODM_AntDivInit( IN PDM_ODM_T pDM_Odm ){} -VOID ODM_AntDiv( IN PDM_ODM_T pDM_Odm){} - -#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) - - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_AntDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_AntDiv.h deleted file mode 100755 index 832ee6b4f3cb..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_AntDiv.h +++ /dev/null @@ -1,136 +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 __ODMANTDIV_H__ -#define __ODMANTDIV_H__ - - - -#define ANT1_2G 0 // = ANT2_5G -#define ANT2_2G 1 // = ANT1_5G - -//Antenna Diversty Control Type -#define ODM_AUTO_ANT 0 -#define ODM_FIX_MAIN_ANT 1 -#define ODM_FIX_AUX_ANT 2 - -#define TX_BY_REG 0 - -#if (DM_ODM_SUPPORT_TYPE != ODM_AP) -#define ODM_RTL8881A 0 //Just for windows driver to jointly use ODM-driver -#endif - -#define ODM_ANTDIV_SUPPORT (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812) -#define ODM_N_ANTDIV_SUPPORT (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B) -#define ODM_AC_ANTDIV_SUPPORT (ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812) -#define ODM_SMART_ANT_SUPPORT (ODM_RTL8188E|ODM_RTL8192E) - -#define ODM_ANTDIV_2G_SUPPORT_IC (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8881A) -#define ODM_ANTDIV_5G_SUPPORT_IC (ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812) -#define ODM_ANTDIV_2G BIT0 -#define ODM_ANTDIV_5G BIT1 - -#define ANTDIV_ON 1 -#define ANTDIV_OFF 0 - -VOID -ODM_AntDivInit( - IN PDM_ODM_T pDM_Odm -); - -VOID -ODM_AntDiv( - IN PDM_ODM_T pDM_Odm -); - -#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) - -VOID -ODM_UpdateRxIdleAnt( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Ant -); - -#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID -ODM_SW_AntDiv_Callback( - IN PRT_TIMER pTimer -); - -VOID -ODM_SW_AntDiv_WorkitemCallback( - IN PVOID pContext -); -#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -VOID -ODM_SW_AntDiv_Callback(void *FunctionContext); -#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -#endif - -#if(RTL8188E_SUPPORT == 1 || RTL8192E_SUPPORT == 1) -#if ( !(DM_ODM_SUPPORT_TYPE == ODM_CE)) -VOID -odm_FastAntTraining( - IN PDM_ODM_T pDM_Odm -); - -VOID -odm_FastAntTrainingCallback( - IN PDM_ODM_T pDM_Odm -); - -VOID -odm_FastAntTrainingWorkItemCallback( - IN PDM_ODM_T pDM_Odm -); -#endif -#endif - -VOID -ODM_Process_RSSIForAntDiv( - IN OUT PDM_ODM_T pDM_Odm, - IN PODM_PHY_INFO_T pPhyInfo, - IN PODM_PACKET_INFO_T pPktinfo -); - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -VOID -ODM_SetTxAntByTxInfo( - IN PDM_ODM_T pDM_Odm, - IN pu1Byte pDesc, - IN u1Byte macId -); - -#else// (DM_ODM_SUPPORT_TYPE == ODM_AP) -VOID -ODM_SetTxAntByTxInfo( - //IN PDM_ODM_T pDM_Odm, - struct rtl8192cd_priv *priv, - struct tx_desc *pdesc, - struct tx_insn *txcfg, - unsigned short aid -); - -#endif - -#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) -#endif //#ifndef __ODMANTDIV_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_CfoTracking.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_CfoTracking.c deleted file mode 100755 index e0c2a58ef088..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_CfoTracking.c +++ /dev/null @@ -1,363 +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" - -VOID -odm_SetCrystalCap( - IN PVOID pDM_VOID, - IN u1Byte CrystalCap -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - PCFO_TRACKING pCfoTrack = &pDM_Odm->DM_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 = &pDM_Odm->DM_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 = &pDM_Odm->DM_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 = &pDM_Odm->DM_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 = &pDM_Odm->DM_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 (DM_ODM_SUPPORT_TYPE == ODM_WIN && MP_DRIVER == 1) - if(0) -#else - if(!pDM_Odm->bLinked || !pDM_Odm->bOneEntryOnly) -#endif - { - //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 = &pDM_Odm->DM_CfoTrack; - u1Byte i; - - if(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING)) - return; - -#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN) && (MP_DRIVER == 1)) - if(1) -#elif(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - if(pPktinfo->bPacketMatchBSSID) -#else - if(pPktinfo->StationID != 0) -#endif - { - //3 Update CFO report for path-A & path-B - // Only paht-A and path-B have CFO tail and short CFO - for(i = ODM_RF_PATH_A; i <= ODM_RF_PATH_B; i++) - { - pCfoTrack->CFO_tail[i] = (int)pcfotail[i]; - } - - //3 Update packet counter - if(pCfoTrack->packetCount == 0xffffffff) - pCfoTrack->packetCount = 0; - else - pCfoTrack->packetCount++; - } -} - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_CfoTracking.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_CfoTracking.h deleted file mode 100755 index 48ead72c3217..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_CfoTracking.h +++ /dev/null @@ -1,66 +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 __ODMCFOTRACK_H__ -#define __ODMCFOTRACK_H__ - -#define CFO_TH_XTAL_HIGH 20 // kHz -#define CFO_TH_XTAL_LOW 10 // kHz -#define CFO_TH_ATC 80 // kHz - -typedef struct _CFO_TRACKING_ -{ - BOOLEAN bATCStatus; - BOOLEAN largeCFOHit; - BOOLEAN bAdjust; - u1Byte CrystalCap; - u1Byte DefXCap; - int CFO_tail[2]; - int CFO_ave_pre; - u4Byte packetCount; - u4Byte packetCount_pre; - - BOOLEAN bForceXtalCap; - BOOLEAN bReset; -}CFO_TRACKING, *PCFO_TRACKING; - -VOID -ODM_CfoTrackingReset( - IN PVOID pDM_VOID -); - -VOID -ODM_CfoTrackingInit( - IN PVOID pDM_VOID -); - -VOID -ODM_CfoTracking( - IN PVOID pDM_VOID -); - -VOID -ODM_ParsingCFO( - IN PVOID pDM_VOID, - IN PVOID pPktinfo_VOID, - IN s1Byte* pcfotail -); - -#endif \ No newline at end of file diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DIG.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DIG.c deleted file mode 100755 index 09a3c8f18705..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DIG.c +++ /dev/null @@ -1,2647 +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" -#define ADAPTIVITY_VERSION "5.0" - - -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 // - -VOID -odm_NHMCounterStatisticsInit( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - - if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - { - //PHY parameters initialize for ac series - ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC+2, 0x2710); //0x990[31:16]=0x2710 Time duration for NHM unit: 4us, 0x2710=40ms - ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC+2, 0xffff); //0x994[31:16]=0xffff th_9, th_10 - //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff5c); //0x998=0xffffff5c th_3, th_2, th_1, th_0 - ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff52); //0x998=0xffffff52 th_3, th_2, th_1, th_0 - ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff); //0x99c=0xffffffff th_7, th_6, th_5, th_4 - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff); //0x9a0[7:0]=0xff th_8 - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, 0x7); //0x994[9:8]=3 enable CCX - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1); //0x9e8[7]=1 max power among all RX ants - - //panic_printk("RTL8812AU phy parameters init %s,%d\n", __FUNCTION__, __LINE__); - } - else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - { - //PHY parameters initialize for n series - ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x2710); //0x894[31:16]=0x2710 Time duration for NHM unit: 4us, 0x2710=40ms - //ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x4e20); //0x894[31:16]=0x4e20 Time duration for NHM unit: 4us, 0x4e20=80ms - ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N+2, 0xffff); //0x890[31:16]=0xffff th_9, th_10 - //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff5c); //0x898=0xffffff5c th_3, th_2, th_1, th_0 - ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff52); //0x898=0xffffff52 th_3, th_2, th_1, th_0 - ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff); //0x89c=0xffffffff th_7, th_6, th_5, th_4 - ODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff); //0xe28[7:0]=0xff th_8 - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x7); //0x890[9:8]=3 enable CCX - ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1); //0xc0c[7]=1 max power among all RX ants - } -} - -VOID -odm_NHMCounterStatistics( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - - // Get NHM report - odm_GetNHMCounterStatistics(pDM_Odm); - - // Reset NHM counter - odm_NHMCounterStatisticsReset(pDM_Odm); -} - -VOID -odm_GetNHMCounterStatistics( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - u4Byte value32 = 0; - - if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11AC, bMaskDWord); - else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11N, bMaskDWord); - - pDM_Odm->NHM_cnt_0 = (u1Byte)(value32 & bMaskByte0); -} - -VOID -odm_NHMCounterStatisticsReset( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - - if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - { - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0); - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1); - } - else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - { - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0); - ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1); - } -} - -VOID -odm_NHMBBInit( - IN PVOID pDM_VOID -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - - pDM_Odm->adaptivity_flag = 0; - pDM_Odm->tolerance_cnt = 3; - pDM_Odm->NHMLastTxOkcnt = 0; - pDM_Odm->NHMLastRxOkcnt = 0; - pDM_Odm->NHMCurTxOkcnt = 0; - pDM_Odm->NHMCurRxOkcnt = 0; -} - -// -VOID -odm_NHMBB( - IN PVOID pDM_VOID -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - u4Byte value32; - //u1Byte test_status; - //PFALSE_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt); - - pDM_Odm->NHMCurTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_Odm->NHMLastTxOkcnt; - pDM_Odm->NHMCurRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_Odm->NHMLastRxOkcnt; - pDM_Odm->NHMLastTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast); - pDM_Odm->NHMLastRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NHM_cnt_0=%d, NHMCurTxOkcnt = %llu, NHMCurRxOkcnt = %llu\n", - pDM_Odm->NHM_cnt_0, pDM_Odm->NHMCurTxOkcnt, pDM_Odm->NHMCurRxOkcnt)); - - - if ( (pDM_Odm->NHMCurTxOkcnt) + 1 > (u8Byte)(pDM_Odm->NHMCurRxOkcnt<<2) + 1) //Tx > 4*Rx possible for adaptivity test - { - if(pDM_Odm->NHM_cnt_0 >= 190 || pDM_Odm->adaptivity_flag == TRUE) - { - //Enable EDCCA since it is possible running Adaptivity testing - //test_status = 1; - pDM_Odm->adaptivity_flag = TRUE; - ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0); //don't ignore EDCCA reg520[15]=0 - ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); //reg524[11]=1 - pDM_Odm->tolerance_cnt = 0; -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup; - pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ; -#endif - } - else - { - if(pDM_Odm->tolerance_cnt<3) - pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1; - else - pDM_Odm->tolerance_cnt = 4; - //test_status = 5; - if(pDM_Odm->tolerance_cnt > 3) - { - //test_status = 3; -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2; - pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ; -#else - ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1); //ignore EDCCA reg520[15]=1 - ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0); //reg524[11]=0 -#endif - pDM_Odm->adaptivity_flag = FALSE; - } - } - } - else // TXadaptivity_flag == TRUE && pDM_Odm->NHM_cnt_0 <= 200) - { - //test_status = 2; - ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0); //don't ignore EDCCA reg520[15]=0 - ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); //reg524[11]=1 - pDM_Odm->tolerance_cnt = 0; -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup; - pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ; -#endif - } - else - { - if(pDM_Odm->tolerance_cnt<3) - pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1; - else - pDM_Odm->tolerance_cnt = 4; - //test_status = 5; - if(pDM_Odm->tolerance_cnt >3) - { - //test_status = 4; -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2; - pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ; -#else - ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1); //ignore EDCCA reg520[15]=1 - ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0); //reg524[11]=0 -#endif - pDM_Odm->adaptivity_flag = FALSE; - } - } - } - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("adaptivity_flag = %d\n ", pDM_Odm->adaptivity_flag)); -} - -VOID -odm_SearchPwdBLowerBound( - IN PVOID pDM_VOID, - IN u1Byte IGI_target -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - u4Byte value32 =0; - u1Byte cnt, IGI; - BOOLEAN bAdjust=TRUE; - s1Byte TH_L2H_dmc, TH_H2L_dmc; - s1Byte TH_L2H, TH_H2L, Diff; - - IGI = 0x50; // find H2L, L2H lower bound - ODM_Write_DIG(pDM_Odm, IGI); - - - 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; - 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); - - ODM_delay_ms(5); - - while(bAdjust) - { - for(cnt=0; cnt<20; cnt ++) - { - if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11N, bMaskDWord); - else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11AC, bMaskDWord); - - if (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8723B|ODM_RTL8188E))) - pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1; - else if(value32 & BIT29) - pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1; - else - pDM_Odm->txEdcca0 = pDM_Odm->txEdcca0 + 1; - } - //DbgPrint("txEdcca1 = %d, txEdcca0 = %d\n", pDM_Odm->txEdcca1, pDM_Odm->txEdcca0); - - if(pDM_Odm->txEdcca1 > 5 ) - { - IGI = IGI -1; - TH_L2H_dmc = TH_L2H_dmc + 1; - if(TH_L2H_dmc > 10) - TH_L2H_dmc = 10; - TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; - 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); - - pDM_Odm->TxHangFlg = TRUE; - pDM_Odm->txEdcca1 = 0; - pDM_Odm->txEdcca0 = 0; - - if(TH_L2H_dmc == 10) - { - bAdjust = FALSE; - pDM_Odm->TxHangFlg = FALSE; - pDM_Odm->txEdcca1 = 0; - pDM_Odm->txEdcca0 = 0; - pDM_Odm->H2L_lb = TH_H2L_dmc; - pDM_Odm->L2H_lb = TH_L2H_dmc; - pDM_Odm->Adaptivity_IGI_upper = IGI; - } - } - else - { - bAdjust = FALSE; - pDM_Odm->TxHangFlg = FALSE; - pDM_Odm->txEdcca1 = 0; - pDM_Odm->txEdcca0 = 0; - pDM_Odm->H2L_lb = TH_H2L_dmc; - pDM_Odm->L2H_lb = TH_L2H_dmc; - pDM_Odm->Adaptivity_IGI_upper = IGI; - } - } - - -ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI = 0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\n", IGI, pDM_Odm->H2L_lb , pDM_Odm->L2H_lb)); - -} - -VOID -odm_AdaptivityInit( - 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; - PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo); - pDM_Odm->Carrier_Sense_enable = (BOOLEAN)pMgntInfo->RegEnableCarrierSense; -#endif - -#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - - if(pDM_Odm->Carrier_Sense_enable == FALSE) - { - pDM_Odm->TH_L2H_ini = 0xf7; // -7 - } - else - pDM_Odm->TH_L2H_ini = 0xa; - - pDM_Odm->AdapEn_RSSI = 20; - pDM_Odm->TH_EDCCA_HL_diff = 7; - -#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - - if(pDM_Odm->Carrier_Sense_enable){ - pDM_Odm->TH_L2H_ini = 10; - pDM_Odm->TH_EDCCA_HL_diff = 3; - pDM_Odm->AdapEn_RSSI = 30; - } - else - { - pDM_Odm->TH_L2H_ini = 0xf7; - pDM_Odm->TH_EDCCA_HL_diff = 7; - pDM_Odm->AdapEn_RSSI = 20; - } - - pDM_Odm->TH_L2H_ini_mode2 = 20; - pDM_Odm->TH_EDCCA_HL_diff_mode2 = 8; - pDM_Odm->TH_L2H_ini_backup = pDM_Odm->TH_L2H_ini; - pDM_Odm->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff ; - -#endif - - pDM_Odm->IGI_Base = 0x32; - pDM_Odm->IGI_target = 0x1c; - pDM_Odm->ForceEDCCA = 0; - pDM_Odm->NHM_disable = FALSE; - pDM_Odm->TxHangFlg = TRUE; - pDM_Odm->txEdcca0 = 0; - pDM_Odm->txEdcca1 = 0; - pDM_Odm->H2L_lb= 0; - pDM_Odm->L2H_lb= 0; - pDM_Odm->Adaptivity_IGI_upper = 0; - odm_NHMBBInit(pDM_Odm); - - ODM_SetBBReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); // stop counting if EDCCA is asserted -} - - -VOID -odm_Adaptivity( - IN PVOID pDM_VOID, - IN u1Byte IGI -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - s1Byte TH_L2H_dmc, TH_H2L_dmc; - s1Byte Diff, IGI_target; - BOOLEAN EDCCA_State = FALSE; - -#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; - } - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - if(pMgntInfo->RegEnableAdaptivity== 2) -#else - if (pDM_Odm->Adapter->registrypriv.adaptivity_en == 2) -#endif - { - if(pDM_Odm->Carrier_Sense_enable == FALSE) // check domain Code for Adaptivity or CarrierSense - { - if ((*pDM_Odm->pBandType == ODM_BAND_5G) && - !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW)) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Adaptivity skip 5G domain code : %d \n", pDM_Odm->odm_Regulation5G)); - return; - } - - else if((*pDM_Odm->pBandType == ODM_BAND_2_4G) && - !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Adaptivity skip 2.4G domain code : %d \n", pDM_Odm->odm_Regulation2_4G)); - return; - - } - else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Adaptivity neither 2G nor 5G band, return\n")); - return; - } - } - else - { - if ((*pDM_Odm->pBandType == ODM_BAND_5G) && - !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW)) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CarrierSense skip 5G domain code : %d\n", pDM_Odm->odm_Regulation5G)); - return; - } - - else if((*pDM_Odm->pBandType == ODM_BAND_2_4G) && - !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CarrierSense skip 2.4G domain code : %d\n", pDM_Odm->odm_Regulation2_4G)); - return; - - } - else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CarrierSense neither 2G nor 5G band, return\n")); - return; - } - } - } -#endif - - - 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->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 + 2; - else - IGI_target = pDM_Odm->IGI_Base; - pDM_Odm->IGI_target = (u1Byte) IGI_target; - - //Search pwdB lower bound - if(pDM_Odm->TxHangFlg == TRUE) - { - if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208); - else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209); - odm_SearchPwdBLowerBound(pDM_Odm, pDM_Odm->IGI_target ); - } - - if((!pDM_Odm->bLinked)||(*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(!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->bLinked && pDM_Odm->Carrier_Sense_enable == FALSE && pDM_Odm->NHM_disable == FALSE &&pDM_Odm->TxHangFlg == FALSE) - odm_NHMBB(pDM_Odm); - - 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; - - //replace lower bound to prevent EDCCA always equal 1 - if(TH_H2L_dmc < pDM_Odm->H2L_lb) - TH_H2L_dmc = pDM_Odm->H2L_lb; - if(TH_L2H_dmc < pDM_Odm->L2H_lb) - TH_L2H_dmc = pDM_Odm->L2H_lb; - } - 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); -} - -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_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",pDM_DigTable->rx_gain_range_max)); - 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; - static BOOLEAN bPaused = FALSE; - - 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_Odm->SupportAbility & ODM_BB_ADAPTIVITY) && pDM_Odm->TxHangFlg == TRUE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Dynamic adjust threshold in progress !!\n")); - return; - } - - if(!bPaused && (!(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(!bPaused) - { - pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue; - bPaused = 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(bPaused) - { - //2 Write backup IGI value - ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup); - bPaused = FALSE; - 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; - -#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; - } - - //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; - PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt); - - pDM_DigTable->bStopDIG = 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 = &pDM_Odm->FalseAlmCnt; - BOOLEAN FirstConnect,FirstDisConnect; - u1Byte DIG_MaxOfMin, DIG_Dynamic_MIN, i; - 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; -#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(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); - } - -#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; ipODM_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((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 - { -#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_AP; - } - 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(FirstDisConnect) - { - pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; - 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) - if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(pAdapter)) - pDM_Odm->bsta_state = TRUE; -#endif - - -#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(pDM_Odm->SupportICType == ODM_RTL8812) - ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF); -#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) - if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(pAdapter)) //STA mode is linked to AP - pDM_Odm->bsta_state = _TRUE; -#endif - -#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|ODM_CE)) - 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 = &pDM_Odm->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; - - 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 -} - -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 -} - - -//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 = &(pDM_Odm->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(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)); - } - else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - { - u4Byte CCKenable; - u4Byte Cnt_Ofdm_fail_temp = 0; - - //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; - - // For 8881A - if(pDM_Odm->SupportICType == ODM_RTL8881A) - { - 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")); - } - } - - // 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; - } - - } - - 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)); -} - - -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 = &(pDM_Odm->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; -} - -//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 = &(pDM_Odm->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) - -VOID -odm_EnableEDCCA( - IN PVOID pDM_VOID -) -{ - - // This should be moved out of OUTSRC - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 PVOID pDM_VOID -) -{ - // Disable EDCCA.. - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 PVOID pDM_VOID -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - PADAPTER pAdapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u1Byte RegC50, RegC58; - BOOLEAN bEDCCAenable = FALSE; - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - 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; -#endif - // - // 2013/11/14 Ken According to BB team Jame's suggestion, we need to disable soft AP mode EDCCA. - // 2014/01/08 MH For Miracst AP mode test. We need to disable EDCCA. Otherwise, we may stop - // to send beacon in noisy environment or platform. - // - if(ACTING_AS_AP(pAdapter) || ACTING_AS_AP(GetFirstAPAdapter(pAdapter))) - //if(ACTING_AS_AP(pAdapter)) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("At least One Port as AP disable EDCCA\n")); - odm_DisableEDCCA(pDM_Odm); - if(pHalData->bPreEdccaEnable) - odm_DisableEDCCA(pDM_Odm); - pHalData->bPreEdccaEnable = FALSE; - 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; - } - } -} - -// <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 = &pDM_Odm->FalseAlmCnt; - u1Byte CurrentIGI = pDM_DigTable->CurIGValue; - u1Byte DIG_Upper = 0x40, DIG_Lower = 0x20; - u4Byte RXOK_cal; - u4Byte RxPWDBAve_final; - u1Byte IGI_A = 0x20, IGI_B = 0x20; - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - - #if ODM_FIX_2G_DIG - IGI_A = 0x22; - IGI_B = 0x24; - #endif - -#else - if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on)) - return; - - if (*pDM_Odm->pBandType == ODM_BAND_5G) - DIG_Lower = 0x22; -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType)); - -#if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))) - if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & ODM_RTL8814A)) // for 5G or 8814 -#else - if (1) // for both 2G/5G -#endif - { - odm_FalseAlarmCounterStatistics(pDM_Odm); - - RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM; - RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0; - - pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0; - pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0; - pDM_Odm->RxPWDBAve = 0; - pDM_Odm->MPDIG_2G = FALSE; - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - pDM_Odm->Times_2G = 0; -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal)); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final)); - - if (RXOK_cal >= 70 && RxPWDBAve_final <= 40) - { - if (CurrentIGI > 0x24) - odm_MPT_Write_DIG(pDM_Odm, 0x24); - } - else - { - if(pFalseAlmCnt->Cnt_all > 1000){ - CurrentIGI = CurrentIGI + 8; - } - else if(pFalseAlmCnt->Cnt_all > 200){ - CurrentIGI = CurrentIGI + 4; - } - else if (pFalseAlmCnt->Cnt_all > 50){ - CurrentIGI = CurrentIGI + 2; - } - else if (pFalseAlmCnt->Cnt_all < 2){ - CurrentIGI = CurrentIGI - 2; - } - - if (CurrentIGI < DIG_Lower ){ - CurrentIGI = DIG_Lower; - } - - if(CurrentIGI > DIG_Upper){ - CurrentIGI = DIG_Upper; - } - - odm_MPT_Write_DIG(pDM_Odm, CurrentIGI); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG = 0x%x, Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n", - CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail)); - } - } - else - { - if(pDM_Odm->MPDIG_2G == FALSE) - { - if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & ODM_RTL8814A)) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n")); - ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A); - ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B); - pDM_DigTable->CurIGValue = IGI_B; - } - else - odm_MPT_Write_DIG(pDM_Odm, IGI_A); - } - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - pDM_Odm->Times_2G++; - - if (pDM_Odm->Times_2G == 3) -#endif - { - pDM_Odm->MPDIG_2G = TRUE; - } - } - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - if (pDM_Odm->SupportICType == ODM_RTL8812) - odm_RFEControl(pDM_Odm, RxPWDBAve_final); -#endif - - ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700); -} -#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DIG.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DIG.h deleted file mode 100755 index a112fdb8662f..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DIG.h +++ /dev/null @@ -1,406 +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 __ODMDIG_H__ -#define __ODMDIG_H__ - -typedef struct _Dynamic_Initial_Gain_Threshold_ -{ - BOOLEAN bStopDIG; - BOOLEAN bPSDInProgress; - - u1Byte Dig_Enable_Flag; - u1Byte Dig_Ext_Port_Stage; - - int RssiLowThresh; - int RssiHighThresh; - - u4Byte FALowThresh; - u4Byte FAHighThresh; - - u1Byte CurSTAConnectState; - u1Byte PreSTAConnectState; - u1Byte CurMultiSTAConnectState; - - u1Byte PreIGValue; - u1Byte CurIGValue; - u1Byte BackupIGValue; //MP DIG - u1Byte BT30_CurIGI; - u1Byte IGIBackup; - - s1Byte BackoffVal; - s1Byte BackoffVal_range_max; - s1Byte BackoffVal_range_min; - u1Byte rx_gain_range_max; - u1Byte rx_gain_range_min; - u1Byte Rssi_val_min; - - u1Byte PreCCK_CCAThres; - u1Byte CurCCK_CCAThres; - u1Byte PreCCKPDState; - u1Byte CurCCKPDState; - u1Byte CCKPDBackup; - - u1Byte LargeFAHit; - u1Byte ForbiddenIGI; - u4Byte Recover_cnt; - - u1Byte DIG_Dynamic_MIN_0; - u1Byte DIG_Dynamic_MIN_1; - BOOLEAN bMediaConnect_0; - BOOLEAN bMediaConnect_1; - - u4Byte AntDiv_RSSI_max; - u4Byte RSSI_max; - - u1Byte *pbP2pLinkInProgress; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - BOOLEAN bTpTarget; - BOOLEAN bNoiseEst; - u4Byte TpTrainTH_min; - u1Byte IGIOffset_A; - u1Byte IGIOffset_B; -#endif -}DIG_T,*pDIG_T; - -typedef struct _FALSE_ALARM_STATISTICS{ - u4Byte Cnt_Parity_Fail; - u4Byte Cnt_Rate_Illegal; - u4Byte Cnt_Crc8_fail; - u4Byte Cnt_Mcs_fail; - u4Byte Cnt_Ofdm_fail; - u4Byte Cnt_Ofdm_fail_pre; //For RTL8881A - u4Byte Cnt_Cck_fail; - u4Byte Cnt_all; - u4Byte Cnt_Fast_Fsync; - u4Byte Cnt_SB_Search_fail; - u4Byte Cnt_OFDM_CCA; - u4Byte Cnt_CCK_CCA; - u4Byte Cnt_CCA_all; - u4Byte Cnt_BW_USC; //Gary - u4Byte Cnt_BW_LSC; //Gary -}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; - -typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition -{ - DIG_TYPE_THRESH_HIGH = 0, - DIG_TYPE_THRESH_LOW = 1, - DIG_TYPE_BACKOFF = 2, - DIG_TYPE_RX_GAIN_MIN = 3, - DIG_TYPE_RX_GAIN_MAX = 4, - DIG_TYPE_ENABLE = 5, - DIG_TYPE_DISABLE = 6, - DIG_OP_TYPE_MAX -}DM_DIG_OP_E; - -typedef enum tag_ODM_PauseDIG_Type { - ODM_PAUSE_DIG = BIT0, - ODM_RESUME_DIG = BIT1 -} ODM_Pause_DIG_TYPE; - -typedef enum tag_ODM_PauseCCKPD_Type { - ODM_PAUSE_CCKPD = BIT0, - ODM_RESUME_CCKPD = BIT1 -} ODM_Pause_CCKPD_TYPE; - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -typedef enum _tag_ODM_REGULATION_Type { - REGULATION_FCC = 0, - REGULATION_MKK = 1, - REGULATION_ETSI = 2, - REGULATION_WW = 3, - - MAX_REGULATION_NUM = 4 -} ODM_REGULATION_TYPE; -#endif - -/* -typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition -{ - CCK_PD_STAGE_LowRssi = 0, - CCK_PD_STAGE_HighRssi = 1, - CCK_PD_STAGE_MAX = 3, -}DM_CCK_PDTH_E; - -typedef enum tag_DIG_EXT_PORT_ALGO_Definition -{ - DIG_EXT_PORT_STAGE_0 = 0, - DIG_EXT_PORT_STAGE_1 = 1, - DIG_EXT_PORT_STAGE_2 = 2, - DIG_EXT_PORT_STAGE_3 = 3, - DIG_EXT_PORT_STAGE_MAX = 4, -}DM_DIG_EXT_PORT_ALG_E; - -typedef enum tag_DIG_Connect_Definition -{ - DIG_STA_DISCONNECT = 0, - DIG_STA_CONNECT = 1, - DIG_STA_BEFORE_CONNECT = 2, - DIG_MultiSTA_DISCONNECT = 3, - DIG_MultiSTA_CONNECT = 4, - DIG_CONNECT_MAX -}DM_DIG_CONNECT_E; - - -#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} - -#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER) \ - DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT) - -#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER) \ - DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT) -*/ -#define DM_DIG_THRESH_HIGH 40 -#define DM_DIG_THRESH_LOW 35 - -#define DM_FALSEALARM_THRESH_LOW 400 -#define DM_FALSEALARM_THRESH_HIGH 1000 - -#define DM_DIG_MAX_NIC 0x3e -#define DM_DIG_MIN_NIC 0x1e //0x22//0x1c -#define DM_DIG_MAX_OF_MIN_NIC 0x3e - -#define DM_DIG_MAX_AP 0x3e -#define DM_DIG_MIN_AP 0x1c -#define DM_DIG_MAX_OF_MIN 0x2A //0x32 -#define DM_DIG_MIN_AP_DFS 0x20 - -#define DM_DIG_MAX_NIC_HP 0x46 -#define DM_DIG_MIN_NIC_HP 0x2e - -#define DM_DIG_MAX_AP_HP 0x42 -#define DM_DIG_MIN_AP_HP 0x30 - -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#define DM_DIG_MAX_AP_COVERAGR 0x26 -#define DM_DIG_MIN_AP_COVERAGE 0x1c -#define DM_DIG_MAX_OF_MIN_COVERAGE 0x22 - -#define DM_DIG_TP_Target_TH0 500 -#define DM_DIG_TP_Target_TH1 1000 -#define DM_DIG_TP_Training_Period 10 -#endif - -//vivi 92c&92d has different definition, 20110504 -//this is for 92c -#if (DM_ODM_SUPPORT_TYPE & ODM_CE) - #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV - #define DM_DIG_FA_TH0 0x80//0x20 - #else - #define DM_DIG_FA_TH0 0x200//0x20 - #endif -#else - #define DM_DIG_FA_TH0 0x200//0x20 -#endif - -#define DM_DIG_FA_TH1 0x300 -#define DM_DIG_FA_TH2 0x400 -//this is for 92d -#define DM_DIG_FA_TH0_92D 0x100 -#define DM_DIG_FA_TH1_92D 0x400 -#define DM_DIG_FA_TH2_92D 0x600 - -#define DM_DIG_BACKOFF_MAX 12 -#define DM_DIG_BACKOFF_MIN -4 -#define DM_DIG_BACKOFF_DEFAULT 10 - -#define DM_DIG_FA_TH0_LPS 4 //-> 4 in lps -#define DM_DIG_FA_TH1_LPS 15 //-> 15 lps -#define DM_DIG_FA_TH2_LPS 30 //-> 30 lps -#define RSSI_OFFSET_DIG 0x05 - -VOID -ODM_ChangeDynamicInitGainThresh( - IN PVOID pDM_VOID, - IN u4Byte DM_Type, - IN u4Byte DM_Value - ); - -VOID -odm_NHMCounterStatisticsInit( - IN PVOID pDM_VOID - ); - -VOID -odm_NHMCounterStatistics( - IN PVOID pDM_VOID - ); - -VOID -odm_NHMBBInit( - IN PVOID pDM_VOID -); - -VOID -odm_NHMBB( - IN PVOID pDM_VOID -); - -VOID -odm_NHMCounterStatisticsReset( - IN PVOID pDM_VOID -); - -VOID -odm_GetNHMCounterStatistics( - IN PVOID pDM_VOID -); - -VOID -odm_SearchPwdBLowerBound( - IN PVOID pDM_VOID, - IN u1Byte IGI_target -); - -VOID -odm_AdaptivityInit( - IN PVOID pDM_VOID - ); - -VOID -odm_Adaptivity( - IN PVOID pDM_VOID, - IN u1Byte IGI - ); - -VOID -ODM_Write_DIG( - IN PVOID pDM_VOID, - IN u1Byte CurrentIGI - ); - -VOID -odm_PauseDIG( - IN PVOID pDM_VOID, - IN ODM_Pause_DIG_TYPE PauseType, - IN u1Byte IGIValue - ); - -VOID -odm_DIGInit( - IN PVOID pDM_VOID - ); - -VOID -odm_DIG( - IN PVOID pDM_VOID - ); - -VOID -odm_DIGbyRSSI_LPS( - IN PVOID pDM_VOID - ); - -VOID -odm_DigForBtHsMode( - IN PVOID pDM_VOID - ); - -VOID -odm_FalseAlarmCounterStatistics( - IN PVOID pDM_VOID - ); - -VOID -odm_FAThresholdCheck( - IN PVOID pDM_VOID, - IN BOOLEAN bDFSBand, - IN BOOLEAN bPerformance, - IN u4Byte RxTp, - IN u4Byte TxTp, - OUT u4Byte* dm_FA_thres - ); - -u1Byte -odm_ForbiddenIGICheck( - IN PVOID pDM_VOID, - IN u1Byte DIG_Dynamic_MIN, - IN u1Byte CurrentIGI - ); - -VOID -odm_InbandNoiseCalculate ( - IN PVOID pDM_VOID - ); - -BOOLEAN -odm_DigAbort( - IN PVOID pDM_VOID - ); - -VOID -odm_PauseCCKPacketDetection( - IN PVOID pDM_VOID, - IN ODM_Pause_CCKPD_TYPE PauseType, - IN u1Byte CCKPDThreshold - ); - -VOID -odm_CCKPacketDetectionThresh( - IN PVOID pDM_VOID - ); - -VOID -ODM_Write_CCK_CCA_Thres( - IN PVOID pDM_VOID, - IN u1Byte CurCCK_CCAThres - ); - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - -VOID -odm_DisableEDCCA( - IN PVOID pDM_VOID -); - -VOID -odm_DynamicEDCCA( - IN PVOID pDM_VOID -); - -VOID -odm_MPT_DIGCallback( - PRT_TIMER pTimer -); - -VOID -odm_MPT_DIGWorkItemCallback( - IN PVOID pContext - ); - -#endif - -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -VOID -odm_MPT_DIGCallback( - IN PVOID pDM_VOID -); -#endif - -#if (DM_ODM_SUPPORT_TYPE != ODM_CE) -VOID -ODM_MPT_DIG( - IN PVOID pDM_VOID -); -#endif - - -#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicBBPowerSaving.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicBBPowerSaving.c deleted file mode 100755 index 9ceb2fdc5edf..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicBBPowerSaving.c +++ /dev/null @@ -1,218 +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" - -VOID -odm_DynamicBBPowerSavingInit( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#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 PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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; - } -} - -void -ODM_RF_Saving( - IN PVOID pDM_VOID, - IN u1Byte bForceInNormal - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#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) - { - // 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode. - // Suggested by SD3 Yu-Nan. 2011.01.20. - if(pDM_Odm->SupportICType == ODM_RTL8723A) - { - ODM_SetBBReg(pDM_Odm, 0x874 , BIT5, 0x1); //Reg874[5]=1b'1 - } - ODM_SetBBReg(pDM_Odm, 0x874 , 0x1C0000, 0x2); //Reg874[20:18]=3'b010 - ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0 - ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63 - ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10 - ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3 - ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0 - ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1 - } - else - { - ODM_SetBBReg(pDM_Odm, 0x874 , 0x1CC000, pDM_PSTable->Reg874); - ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70); - ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C); - ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74); - ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0); - - if(pDM_Odm->SupportICType == ODM_RTL8723A) - { - ODM_SetBBReg(pDM_Odm,0x874 , BIT5, 0x0); //Reg874[5]=1b'0 - } - } - pDM_PSTable->PreRFState =pDM_PSTable->CurRFState; - } -#endif -} \ No newline at end of file diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicBBPowerSaving.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicBBPowerSaving.h deleted file mode 100755 index 2fdcd6e6d5bf..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicBBPowerSaving.h +++ /dev/null @@ -1,61 +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 __ODMDYNAMICBBPOWERSAVING_H__ -#define __ODMDYNAMICBBPOWERSAVING_H__ - -typedef struct _Dynamic_Power_Saving_ -{ - u1Byte PreCCAState; - u1Byte CurCCAState; - - u1Byte PreRFState; - u1Byte CurRFState; - - int Rssi_val_min; - - u1Byte initialize; - u4Byte Reg874,RegC70,Reg85C,RegA74; - -}PS_T,*pPS_T; - -#define dm_RF_Saving ODM_RF_Saving - -void ODM_RF_Saving( - IN PVOID pDM_VOID, - IN u1Byte bForceInNormal - ); - -VOID -odm_DynamicBBPowerSavingInit( - IN PVOID pDM_VOID - ); - -VOID -odm_DynamicBBPowerSaving( - IN PVOID pDM_VOID - ); - -VOID -odm_1R_CCA( - IN PVOID pDM_VOID - ); - -#endif \ No newline at end of file diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.c deleted file mode 100755 index 7fbeb9fac350..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.c +++ /dev/null @@ -1,884 +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" - -VOID -odm_DynamicTxPowerInit( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#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 PVOID pDM_VOID - ) -{ - 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}; - -#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 - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - u1Byte index; - PADAPTER Adapter = pDM_Odm->Adapter; - 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, - IN u1Byte Value) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 PVOID pDM_VOID - ) -{ - // - // 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; - 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 - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - - 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 PVOID pDM_VOID - - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#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; ipODM_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 - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#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) || - (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,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 - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#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,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) - -} - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.h deleted file mode 100755 index 67221e51c3bd..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_DynamicTxPower.h +++ /dev/null @@ -1,87 +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 __ODMDYNAMICTXPOWER_H__ -#define __ODMDYNAMICTXPOWER_H__ - -#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 -#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 -#define TX_POWER_NEAR_FIELD_THRESH_AP 0x3F -#define TX_POWER_NEAR_FIELD_THRESH_8812 60 - -#define TxHighPwrLevel_Normal 0 -#define TxHighPwrLevel_Level1 1 -#define TxHighPwrLevel_Level2 2 -#define TxHighPwrLevel_BT1 3 -#define TxHighPwrLevel_BT2 4 -#define TxHighPwrLevel_15 5 -#define TxHighPwrLevel_35 6 -#define TxHighPwrLevel_50 7 -#define TxHighPwrLevel_70 8 -#define TxHighPwrLevel_100 9 - -VOID -odm_DynamicTxPowerInit( - IN PVOID pDM_VOID - ); - -VOID -odm_DynamicTxPowerRestorePowerIndex( - IN PVOID pDM_VOID - ); - -VOID -odm_DynamicTxPowerNIC( - IN PVOID pDM_VOID - ); - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -VOID -odm_DynamicTxPowerSavePowerIndex( - IN PVOID pDM_VOID - ); - -VOID -odm_DynamicTxPowerWritePowerIndex( - IN PVOID pDM_VOID, - IN u1Byte Value); - -VOID -odm_DynamicTxPower_92C( - IN PVOID pDM_VOID - ); - -VOID -odm_DynamicTxPower_92D( - IN PVOID pDM_VOID - ); -#endif - -VOID -odm_DynamicTxPower( - IN PVOID pDM_VOID - ); - -VOID -odm_DynamicTxPowerAP( - IN PVOID pDM_VOID - ); - -#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.c deleted file mode 100755 index 34bfd08ff809..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.c +++ /dev/null @@ -1,1915 +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 "Mp_Precomp.h" -#include "odm_precomp.h" - -VOID -ODM_EdcaTurboInit( - IN PVOID pDM_VOID) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#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 PVOID pDM_VOID - ) -{ - // - // 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. - // - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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) - { - precvpriv->bIsAnyNonBEPkts = _FALSE; - return; - } - - if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0)) - { - precvpriv->bIsAnyNonBEPkts = _FALSE; - return; - } - - if(pDM_Odm->pWirelessMode!=NULL) - WirelessMode=*(pDM_Odm->pWirelessMode); - - IOTPeer = pmlmeinfo->assoc_AP_vendor; - - if (IOTPeer >= HT_IOT_PEER_MAX) - { - precvpriv->bIsAnyNonBEPkts = _FALSE; - return; - } - - 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; - } - } - -} - - -#elif(DM_ODM_SUPPORT_TYPE==ODM_WIN) -VOID -odm_EdcaTurboCheckMP( - IN PVOID pDM_VOID - ) -{ - - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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))?TRUE:FALSE; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx \n",pHalData->bIsAnyNonBEPkts)); - - -////=============================== -////check if edca turbo is disabled -////=============================== - if(odm_IsEdcaTurboDisable(pDM_Odm)) - { - 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; - - } - -////=============================== -////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)); - - } - } - -} - - -//check if edca turbo is disabled -BOOLEAN -odm_IsEdcaTurboDisable( - IN PVOID pDM_VOID -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - PADAPTER Adapter = pDM_Odm->Adapter; - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - u4Byte IOTPeer=pMgntInfo->IOTPeer; - - 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; - } - - - // 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; - } - - return FALSE; - - -} - -//add iot case here: for MP/CE -VOID -ODM_EdcaParaSelByIot( - IN PVOID pDM_VOID, - OUT u4Byte *EDCA_BE_UL, - OUT u4Byte *EDCA_BE_DL - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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; - - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE; - - if(pDM_Odm->pWirelessMode!=NULL) - WirelessMode=*(pDM_Odm->pWirelessMode); - -/////////////////////////////////////////////////////////// -////list paramter for different platform - - IOTPeer=pMgntInfo->IOTPeer; - IOTPeerSubType=pMgntInfo->IOTPeerSubtype; - GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus); - - - 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 -////============================ - - 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->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. - if(WirelessMode==ODM_WM_G) - (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer]; - else - (*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; - } - - 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 PVOID pDM_VOID, - IN u8Byte cur_tx_bytes, - IN u8Byte cur_rx_bytes, - IN BOOLEAN bBiasOnRx, - OUT BOOLEAN *pbIsCurRDLState - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - - 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 PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - prtl8192cd_priv priv = pDM_Odm->priv; - int mode=priv->pmib->dot11BssType.net_work_type; - - static unsigned int slot_time, 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; - - -#ifdef RTK_AC_SUPPORT //for 11ac logo, edit aifs time for cca test cases - if(AC_SIGMA_MODE != AC_SIGMA_NONE) - sifs_time = 10; -#endif - - -#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)); - -#if defined(RTK_AC_SUPPORT) && defined(RTL_MANUAL_EDCA) //for 11ac logo, make BK worse to seperate with BE. - if((AC_SIGMA_MODE != AC_SIGMA_NONE) && (priv->pmib->dot11QosEntry.ManualEDCA)) - { - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | 0xa4 ); - } -#endif - -// 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 WMM_BEBK_PRI - priv->pshare->iot_mode_BK_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 PVOID pDM_VOID, - IN PSTA_INFO_T pstat - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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); - int assoc_num = GET_ROOT(priv)->assoc_num; -#ifdef MBSSID - if (GET_ROOT(priv)->pmib->miscEntry.vap_enable){ - for (i=0; ipvap_priv[i]-> assoc_num; - } -#endif -#ifdef UNIVERSAL_REPEATER - if (IS_DRV_OPEN(GET_VXD_PRIV(GET_ROOT(priv)))) - assoc_num += GET_VXD_PRIV(GET_ROOT(priv))-> assoc_num; -#endif -#ifdef WDS - if(GET_ROOT(priv)->pmib->dot11WdsInfo.wdsEnabled) - assoc_num ++; -#endif - - - pstat->current_tx_bytes += pstat->tx_byte_cnt; - pstat->current_rx_bytes += pstat->rx_byte_cnt; - - if (total_sum != 0) { - if (total_sum <= 1000000) { - 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 && ( -#ifdef SUPPORT_TX_AMSDU - AMSDU_ENABLE || -#endif - aggReady)) || (pstat->IOTPeer==HT_IOT_PEER_INTEL)) - { - if ((assoc_num==1) || (tx_2s_avg + rx_2s_avg >= 25)) { - priv->pshare->highTP_found_pstat = pstat; - } - - #ifdef CLIENT_MODE - if (OPMODE & WIFI_STATION_STATE) { - if ((tx_2s_avg + rx_2s_avg) >= 20) - 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 PVOID pDM_VOID, - IN unsigned char enable - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - u32 be_edca, vi_edca; - u16 disable_cfe; -#endif - -#if (DM_ODM_SUPPORT_TYPE==ODM_AP) - if (!(!priv->pmib->dot11OperationEntry.wifi_specific || - ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific)) - #ifdef CLIENT_MODE - || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific)) - #endif - )) - return; -#endif - -#ifdef RTK_AC_SUPPORT //for 11ac logo, do not dynamic switch edca - if(AC_SIGMA_MODE != AC_SIGMA_NONE) - 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 defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - vi_edca = -1; - disable_cfe = -1; -#endif - -#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); - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs; -#else - 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 - -#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); - } - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16) - | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs; -#else - 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 - - #ifdef WMM_BEBK_PRI - #ifdef CONFIG_RTL_88E_SUPPORT - if ((GET_CHIP_VER(priv) == VERSION_8188E) && priv->pshare->iot_mode_BK_exist) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (10 << 12) | (6 << 8) | 0x4f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (10 << 12) | (6 << 8) | 0x4f); -#endif - } - #endif - #endif -#if defined(CONFIG_WLAN_HAL_8881A) - if (GET_CHIP_VER(priv) == VERSION_8881A) - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, 0xa64f); -#endif - } -#endif - - - -#if (DM_ODM_SUPPORT_TYPE==ODM_AP) - if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist) { -#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) - if (GET_CHIP_VER(priv) == VERSION_8188E || GET_CHIP_VER(priv) == VERSION_8812E) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (10 << 12) | (6 << 8) | 0x4f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (6 << 8) | 0x4f); -#endif - } - else -#endif - { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (10 << 12) | (4 << 8) | 0x4f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f); -#endif - } - } else if(!enable) -#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL) - if(!enable) //if iot is disable ,maintain original BEQ PARAM -#endif - { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8) - | (sifs_time + 3 * slot_time); - disable_cfe = 1; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8) - | (sifs_time + 3 * slot_time)); -#endif -#ifdef CONFIG_PCI_HCI -// ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE)); -#endif - } - else - { - int txop; - unsigned int cw_max; -#ifdef LOW_TP_TXOP - unsigned int txop_close; -#endif - - #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); - if (pDM_Odm->RFType==ODM_1T1R) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (5 << 12) | (3 << 8) | 0x1f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (5 << 12) | (3 << 8) | 0x1f); -#endif - } - else { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (8 << 12) | (5 << 8) | 0x1f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (8 << 12) | (5 << 8) | 0x1f); -#endif - } - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - disable_cfe = 0; -#endif -#ifdef CONFIG_PCI_HCI -// ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE)); -#endif - 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 -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (6 << 12) | (5 << 8) | 0x2b; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (6 << 12) | (5 << 8) | 0x2b); -#endif - priv->pshare->txop_enlarge = 2; - } - #endif -#endif - else - { -// if (txop == 0) { -//#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) -// disable_cfe = 1; -//#endif -//#ifdef CONFIG_PCI_HCI -// ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE)); -//#endif -// } - - if (pDM_Odm->RFType==ODM_2T2R) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time); -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | - (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time)); -#endif - } - else - #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP) - { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (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) | - (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time)); -#endif - } - #else - { - PSTA_INFO_T pstat = priv->pshare->highTP_found_pstat; - if ((GET_CHIP_VER(priv)==VERSION_8881A) && pstat && (pstat->IOTPeer == HT_IOT_PEER_HTC)) - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, 0x642b); - else { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (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 - } - } - #endif - } - } - else - { - #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)) -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time); -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time)); -#endif - #else - #if defined(CONFIG_RTL_8196D) || defined(CONFIG_RTL_8197DL) || defined(CONFIG_RTL_8196E) || (defined(CONFIG_RTL_8197D) && !defined(CONFIG_PORT0_EXT_GIGA)) -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (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) | (5 << 8) | (sifs_time + 3 * slot_time)); -#endif - #else -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 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 -/* - if (priv->pshare->txop_enlarge == 0xe) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - disable_cfe = 0; -#endif - #ifdef CONFIG_PCI_HCI - ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE)); - #endif - } else { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - disable_cfe = 1; -#endif - #ifdef CONFIG_PCI_HCI - ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE)); - #endif - } -*/ - #endif - } - - } - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - notify_IOT_EDCA_switch(priv, be_edca, vi_edca, disable_cfe); -#endif -} -#endif - -VOID -odm_IotEngine( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - struct rtl8192cd_priv *priv=pDM_Odm->priv; - PSTA_INFO_T pstat = NULL; - u4Byte i; - -#ifdef WIFI_WMM - unsigned int switch_turbo = 0, avg_tp; -#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; ipODM_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; - if(pstat) { - if((pstat->tx_avarage + pstat->rx_avarage) < (1<<17)) // 1M bps - pstat = NULL; - } - -#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)) - #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++; -#ifdef CONFIG_WLAN_HAL_8881A - if (GET_CHIP_VER(priv) == VERSION_8881A) { - RTL_W32(0x460, 0x03086666); - } -#endif //CONFIG_WLAN_HAL_8881A - } 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++; -//#ifdef CONFIG_WLAN_HAL_8881A -#if 0 - if (GET_CHIP_VER(priv) == VERSION_8881A) { - if (get_bonding_type_8881A()==BOND_8881AB) { - RTL_W32(0x460, 0x03086666); - } - else { - RTL_W32(0x460, 0x0320ffff); - } - } -#endif //CONFIG_WLAN_HAL_8881A - } - } - - - #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_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_BEBK_PRI))) - if (priv->pshare->phw->BE_pkt_count) { - //printk("[%s %d] BK_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BK_pkt_count); - if (!priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count > 250)) { - priv->pshare->iot_mode_BK_exist++; - switch_turbo++; - } else if (priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count < 250)) { - priv->pshare->iot_mode_BK_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)) - { - 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 (pstat->IOTPeer==HT_IOT_PEER_INTEL) - { - 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 (pstat->IOTPeer==HT_IOT_PEER_INTEL) - priv->pshare->txop_enlarge = 0xe; - else if (pstat->IOTPeer==HT_IOT_PEER_RALINK) - priv->pshare->txop_enlarge = 0xd; - else if (pstat->IOTPeer==HT_IOT_PEER_HTC) - priv->pshare->txop_enlarge = 0; - 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->IOTPeer==HT_IOT_PEER_INTEL && (((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; - }else { - if ((GET_CHIP_VER(priv) == VERSION_8881A)||(GET_CHIP_VER(priv) == VERSION_8192E)|| (GET_CHIP_VER(priv) == VERSION_8188E) ){ - unsigned int uldl_tp = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes)>>17; - if((uldl_tp > 40) && (priv->pshare->agg_to!= 1)) { - RTL_W8(0x462, 0x08); - priv->pshare->agg_to = 1; - } else if((uldl_tp < 35) && (priv->pshare->agg_to !=0)) { - RTL_W8(0x462, 0x02); - priv->pshare->agg_to = 0; - } - } - } - -#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE)) - if(AMPDU_ENABLE) { -#ifdef TX_EARLY_MODE - if (GET_TX_EARLY_MODE) { - if (!GET_EM_SWQ_ENABLE && - ((priv->assoc_num > 1) || - (pstat && pstat->IOTPeer != HT_IOT_PEER_UNKNOWN))) { - if ((priv->pshare->em_tx_byte_cnt >> 17) > EM_TP_UP_BOUND) - priv->pshare->reach_tx_limit_cnt++; - else - priv->pshare->reach_tx_limit_cnt = 0; - - if (priv->pshare->txop_enlarge && priv->pshare->reach_tx_limit_cnt) { //>= WAIT_TP_TIME// - GET_EM_SWQ_ENABLE = 1; - priv->pshare->reach_tx_limit_cnt = 0; - - if (pstat->IOTPeer == HT_IOT_PEER_INTEL) - MAX_EM_QUE_NUM = 12; - else if (pstat->IOTPeer == HT_IOT_PEER_RALINK) - MAX_EM_QUE_NUM = 10; - - enable_em(priv); - } - } - else if (GET_EM_SWQ_ENABLE) { - if ((priv->pshare->em_tx_byte_cnt >> 17) < EM_TP_LOW_BOUND) - priv->pshare->reach_tx_limit_cnt++; - else - priv->pshare->reach_tx_limit_cnt = 0; - - if (!priv->pshare->txop_enlarge || priv->pshare->reach_tx_limit_cnt >= WAIT_TP_TIME) { - GET_EM_SWQ_ENABLE = 0; - priv->pshare->reach_tx_limit_cnt = 0; - disable_em(priv); - } - } - } -#endif - -#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_RTL_8812_SUPPORT) - if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812) { - if (priv->assoc_num > 9) - { - if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){ - if ((priv->swq_decision == 0)){ - switch_turbo++; - if (priv->pshare->txop_enlarge == 0) - priv->pshare->txop_enlarge = 2; - priv->swq_decision = 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_decision = 0; - } - else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) { - priv->pshare->txop_enlarge = 2; - switch_turbo--; - } - } else { - priv->swq_decision = 0; - } - } else if(CONFIG_WLAN_NOT_HAL_EXIST) -#endif - { - if (priv->assoc_num > 1) - { - if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){ - if ((priv->swq_decision == 0)){ - switch_turbo++; - if (priv->pshare->txop_enlarge == 0) - priv->pshare->txop_enlarge = 2; - priv->swq_decision = 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_decision = 0; - } - else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) { - priv->pshare->txop_enlarge = 2; - switch_turbo--; - } - } - //#if (defined CONFIG_RTL_819XD)) - else if (priv->assoc_num == 1 && (priv->up_time % 2 == 0) -#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE) - && (!GET_TX_EARLY_MODE || !GET_EM_SWQ_ENABLE) -#endif - ) { - if ((pstat) && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3])) { - //int en_thd = 14417920>>(priv->up_time % 2); - avg_tp = (pstat->current_tx_bytes >> 17); - - //if ((priv->swq_decision == 0) && (pstat->current_tx_bytes > en_thd) && (pstat->current_rx_bytes > en_thd) ) { //50Mbps - if ((priv->swq_decision == 0) && (avg_tp > TP_HIGH_WATER_MARK)) { //55Mbps - //printk("[%s:%d] swq_decision=1 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp); - priv->swq_decision = 1; - } - //else if ((priv->swq_decision == 1) && ((pstat->tx_avarage < 4587520) || (pstat->rx_avarage < 4587520))) { //35Mbps - else if ((priv->swq_decision == 1) && (avg_tp < TP_LOW_WATER_MARK)) { //35Mbps - //printk("[%s:%d] swq_decision=0 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp); - priv->swq_decision = 0; - } - } else { - priv->swq_decision = 0; - } - } - } - if( (priv->swq_decision == 1) -#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE) - || (GET_EM_SWQ_ENABLE == 1) -#endif - ) { - priv->swq_en = 1; - priv->swqen_keeptime = priv->up_time; - } else { - priv->swq_en = 0; - priv->swqen_keeptime = 0; - } - } -#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. -#if defined(UNIVERSAL_REPEATER) || defined(MBSSID) - if(IS_STA_VALID(pstat)) - { - struct rtl8192cd_priv *tmppriv; - struct aid_obj *aidarray; - aidarray = container_of(pstat, struct aid_obj, station); - tmppriv = aidarray->priv; - - curr_tp = (unsigned int)(tmppriv->ext_stats.tx_avarage>>17) + (unsigned int)(tmppriv->ext_stats.rx_avarage>>17); - } - else -#endif - 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 - -#ifdef WMM_DSCP_C42 - if (switch_turbo) { - if (!priv->pshare->iot_mode_enable && !priv->pshare->aggrmax_change) { - RTL_W16(0x4ca, 0x0404); - priv->pshare->aggrmax_change = 1; - } - else if (priv->pshare->iot_mode_enable && priv->pshare->aggrmax_change) { - RTL_W16(0x4ca, priv->pshare->aggrmax_bak); - priv->pshare->aggrmax_change = 0; - } - } -#endif -#ifdef TX_EARLY_MODE - unsigned int em_tp = ((priv->ext_stats.tx_avarage>>17) + (priv->ext_stats.rx_avarage>>17)); - if (em_tp > 80) - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (4 << 12) | (3 << 8) | 0x19); - else //if (em_tp < 75) - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (6 << 12) | (5 << 8) | 0x2b); -#endif - if (switch_turbo) - ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable ); -#endif -} -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.h deleted file mode 100755 index 8fba8a264529..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_EdcaTurboCheck.h +++ /dev/null @@ -1,150 +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 __ODMEDCATURBOCHECK_H__ -#define __ODMEDCATURBOCHECK_H__ - -typedef struct _EDCA_TURBO_ -{ - BOOLEAN bCurrentTurboEDCA; - BOOLEAN bIsCurRDLState; - - #if(DM_ODM_SUPPORT_TYPE == ODM_CE ) - u4Byte prv_traffic_idx; // edca turbo - #endif - -}EDCA_T,*pEDCA_T; - -#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 - - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#ifdef WIFI_WMM -VOID -ODM_IotEdcaSwitch( - IN PVOID pDM_VOID, - IN unsigned char enable - ); -#endif - -BOOLEAN -ODM_ChooseIotMainSTA( - IN PVOID pDM_VOID, - IN PSTA_INFO_T pstat - ); -#endif - -VOID -odm_EdcaTurboCheck( - IN PVOID pDM_VOID - ); -VOID -ODM_EdcaTurboInit( - IN PVOID pDM_VOID -); - -#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) -VOID -odm_EdcaTurboCheckMP( - IN PVOID pDM_VOID - ); - -//check if edca turbo is disabled -BOOLEAN -odm_IsEdcaTurboDisable( - IN PVOID pDM_VOID -); -//choose edca paramter for special IOT case -VOID -ODM_EdcaParaSelByIot( - IN PVOID pDM_VOID, - OUT u4Byte *EDCA_BE_UL, - OUT u4Byte *EDCA_BE_DL - ); -//check if it is UL or DL -VOID -odm_EdcaChooseTrafficIdx( - IN PVOID pDM_VOID, - 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 PVOID pDM_VOID - ); -#else -VOID -odm_IotEngine( - IN PVOID pDM_VOID - ); - -VOID -odm_EdcaParaInit( - IN PVOID pDM_VOID - ); -#endif - -#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_HWConfig.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_HWConfig.c deleted file mode 100755 index b37efd10f455..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_HWConfig.c +++ /dev/null @@ -1,2327 +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" - -#define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig_MP_##ic##txt(pDM_Odm)) -#define READ_AND_CONFIG_TC(ic, txt) (ODM_ReadAndConfig_TC_##ic##txt(pDM_Odm)) - - -#if (TESTCHIP_SUPPORT == 1) -#define READ_AND_CONFIG(ic, txt) do {\ - if (pDM_Odm->bIsMPChip)\ - READ_AND_CONFIG_MP(ic,txt);\ - else\ - READ_AND_CONFIG_TC(ic,txt);\ - } while(0) -#else - #define READ_AND_CONFIG READ_AND_CONFIG_MP -#endif - - -#define READ_FIRMWARE_MP(ic, txt) (ODM_ReadFirmware_MP_##ic##txt(pDM_Odm, pFirmware, pSize)) -#define READ_FIRMWARE_TC(ic, txt) (ODM_ReadFirmware_TC_##ic##txt(pDM_Odm, pFirmware, pSize)) - -#if (TESTCHIP_SUPPORT == 1) -#define READ_FIRMWARE(ic, txt) do {\ - if (pDM_Odm->bIsMPChip)\ - READ_FIRMWARE_MP(ic,txt);\ - else\ - READ_FIRMWARE_TC(ic,txt);\ - } while(0) -#else -#define READ_FIRMWARE READ_FIRMWARE_MP -#endif - -#define GET_VERSION_MP(ic, txt) (ODM_GetVersion_MP_##ic##txt()) -#define GET_VERSION_TC(ic, txt) (ODM_GetVersion_TC_##ic##txt()) -#define GET_VERSION(ic, txt) (pDM_Odm->bIsMPChip?GET_VERSION_MP(ic,txt):GET_VERSION_TC(ic,txt)) - - -u1Byte -odm_QueryRxPwrPercentage( - IN s1Byte AntPower - ) -{ - if ((AntPower <= -100) || (AntPower >= 20)) - { - return 0; - } - else if (AntPower >= 0) - { - return 100; - } - else - { - return (100+AntPower); - } - -} - -#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) -// -// 2012/01/12 MH MOve some signal strength smooth method to MP HAL layer. -// IF other SW team do not support the feature, remove this section.?? -// -s4Byte -odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo( - IN OUT PDM_ODM_T pDM_Odm, - s4Byte CurrSig -) -{ - s4Byte RetSig = 0; -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - //if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - { - // Step 1. Scale mapping. - // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo. - // 20100426 Joseph: Modify Signal strength mapping. - // This modification makes the RSSI indication similar to Intel solution. - // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE. - if(CurrSig >= 54 && CurrSig <= 100) - { - RetSig = 100; - } - else if(CurrSig>=42 && CurrSig <= 53 ) - { - RetSig = 95; - } - else if(CurrSig>=36 && CurrSig <= 41 ) - { - RetSig = 74 + ((CurrSig - 36) *20)/6; - } - else if(CurrSig>=33 && CurrSig <= 35 ) - { - RetSig = 65 + ((CurrSig - 33) *8)/2; - } - else if(CurrSig>=18 && CurrSig <= 32 ) - { - RetSig = 62 + ((CurrSig - 18) *2)/15; - } - else if(CurrSig>=15 && CurrSig <= 17 ) - { - RetSig = 33 + ((CurrSig - 15) *28)/2; - } - else if(CurrSig>=10 && CurrSig <= 14 ) - { - RetSig = 39; - } - else if(CurrSig>=8 && CurrSig <= 9 ) - { - RetSig = 33; - } - else if(CurrSig <= 8 ) - { - RetSig = 19; - } - } -#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN) - return RetSig; -} - -s4Byte -odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore( - IN OUT PDM_ODM_T pDM_Odm, - s4Byte CurrSig -) -{ - s4Byte RetSig = 0; -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - //if(pDM_Odm->SupportInterface == ODM_ITRF_USB) - { - // Netcore request this modification because 2009.04.13 SU driver use it. - if(CurrSig >= 31 && CurrSig <= 100) - { - RetSig = 100; - } - else if(CurrSig >= 21 && CurrSig <= 30) - { - RetSig = 90 + ((CurrSig - 20) / 1); - } - else if(CurrSig >= 11 && CurrSig <= 20) - { - RetSig = 80 + ((CurrSig - 10) / 1); - } - else if(CurrSig >= 7 && CurrSig <= 10) - { - RetSig = 69 + (CurrSig - 7); - } - else if(CurrSig == 6) - { - RetSig = 54; - } - else if(CurrSig == 5) - { - RetSig = 45; - } - else if(CurrSig == 4) - { - RetSig = 36; - } - else if(CurrSig == 3) - { - RetSig = 27; - } - else if(CurrSig == 2) - { - RetSig = 18; - } - else if(CurrSig == 1) - { - RetSig = 9; - } - else - { - RetSig = CurrSig; - } - } -#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN) - return RetSig; -} - - -s4Byte -odm_SignalScaleMapping_92CSeries( - IN OUT PDM_ODM_T pDM_Odm, - IN s4Byte CurrSig -) -{ - s4Byte RetSig = 0; -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) - if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - { - // Step 1. Scale mapping. - if(CurrSig >= 61 && CurrSig <= 100) - { - RetSig = 90 + ((CurrSig - 60) / 4); - } - else if(CurrSig >= 41 && CurrSig <= 60) - { - RetSig = 78 + ((CurrSig - 40) / 2); - } - else if(CurrSig >= 31 && CurrSig <= 40) - { - RetSig = 66 + (CurrSig - 30); - } - else if(CurrSig >= 21 && CurrSig <= 30) - { - RetSig = 54 + (CurrSig - 20); - } - else if(CurrSig >= 5 && CurrSig <= 20) - { - RetSig = 42 + (((CurrSig - 5) * 2) / 3); - } - else if(CurrSig == 4) - { - RetSig = 36; - } - else if(CurrSig == 3) - { - RetSig = 27; - } - else if(CurrSig == 2) - { - RetSig = 18; - } - else if(CurrSig == 1) - { - RetSig = 9; - } - else - { - RetSig = CurrSig; - } - } -#endif - -#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) ||(DEV_BUS_TYPE == RT_SDIO_INTERFACE)) - if((pDM_Odm->SupportInterface == ODM_ITRF_USB) || (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)) - { - if(CurrSig >= 51 && CurrSig <= 100) - { - RetSig = 100; - } - else if(CurrSig >= 41 && CurrSig <= 50) - { - RetSig = 80 + ((CurrSig - 40)*2); - } - else if(CurrSig >= 31 && CurrSig <= 40) - { - RetSig = 66 + (CurrSig - 30); - } - else if(CurrSig >= 21 && CurrSig <= 30) - { - RetSig = 54 + (CurrSig - 20); - } - else if(CurrSig >= 10 && CurrSig <= 20) - { - RetSig = 42 + (((CurrSig - 10) * 2) / 3); - } - else if(CurrSig >= 5 && CurrSig <= 9) - { - RetSig = 22 + (((CurrSig - 5) * 3) / 2); - } - else if(CurrSig >= 1 && CurrSig <= 4) - { - RetSig = 6 + (((CurrSig - 1) * 3) / 2); - } - else - { - RetSig = CurrSig; - } - } - -#endif - return RetSig; -} -s4Byte -odm_SignalScaleMapping( - IN OUT PDM_ODM_T pDM_Odm, - IN s4Byte CurrSig -) -{ - if( (pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->SupportInterface != ODM_ITRF_PCIE) && //USB & SDIO - (pDM_Odm->PatchID==10))//pMgntInfo->CustomerID == RT_CID_819x_Netcore - { - return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore(pDM_Odm,CurrSig); - } - else if( (pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) && - (pDM_Odm->PatchID==19))//pMgntInfo->CustomerID == RT_CID_819x_Lenovo) - { - return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(pDM_Odm, CurrSig); - } - else{ - return odm_SignalScaleMapping_92CSeries(pDM_Odm,CurrSig); - } - -} -#endif - - -static u1Byte odm_SQ_process_patch_RT_CID_819x_Lenovo( - IN PDM_ODM_T pDM_Odm, - IN u1Byte isCCKrate, - IN u1Byte PWDB_ALL, - IN u1Byte path, - IN u1Byte RSSI -) -{ - u1Byte SQ = 0; -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - - if(isCCKrate){ - - if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter)) - { - - // - // Expected signal strength and bars indication at Lenovo lab. 2013.04.11 - // 802.11n, 802.11b, 802.11g only at channel 6 - // - // Attenuation (dB) OS Signal Bars RSSI by Xirrus (dBm) - // 50 5 -52 - // 55 5 -54 - // 60 5 -55 - // 65 5 -59 - // 70 5 -63 - // 75 5 -66 - // 80 4 -72 - // 85 3 -75 - // 90 3 -80 - // 95 2 -85 - // 100 1 -89 - // 102 1 -90 - // 104 1 -91 - // - RT_TRACE(COMP_DBG, DBG_WARNING, ("odm_SQ_process_patch_RT_CID_819x_Lenovo\n")); - -#if OS_WIN_FROM_WIN8(OS_VERSION) - if(PWDB_ALL >= 50) - SQ = 100; - else if(PWDB_ALL >= 23 && PWDB_ALL < 50) - SQ = 80; - else if(PWDB_ALL >= 18 && PWDB_ALL < 23) - SQ = 60; - else if(PWDB_ALL >= 8 && PWDB_ALL < 18) - SQ = 40; - else - SQ = 10; -#else - if(PWDB_ALL >= 34) - SQ = 100; - else if(PWDB_ALL >= 23 && PWDB_ALL < 34) - SQ = 80; - else if(PWDB_ALL >= 18 && PWDB_ALL < 23) - SQ = 60; - else if(PWDB_ALL >= 8 && PWDB_ALL < 18) - SQ = 40; - else - SQ = 10; - - if(PWDB_ALL == 0)// Abnormal case, do not indicate the value above 20 on Win7 - SQ = 20; -#endif - - } - else if(IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter)){ - - // - // Expected signal strength and bars indication at Lenovo lab. 2013.04.11 - // 802.11n, 802.11b, 802.11g only at channel 6 - // - // Attenuation (dB) OS Signal Bars RSSI by Xirrus (dBm) - // 50 5 -49 - // 55 5 -49 - // 60 5 -50 - // 65 5 -51 - // 70 5 -52 - // 75 5 -54 - // 80 5 -55 - // 85 4 -60 - // 90 3 -63 - // 95 3 -65 - // 100 2 -67 - // 102 2 -67 - // 104 1 -70 - // - - if(PWDB_ALL >= 50) - SQ = 100; - else if(PWDB_ALL >= 35 && PWDB_ALL < 50) - SQ = 80; - else if(PWDB_ALL >= 31 && PWDB_ALL < 35) - SQ = 60; - else if(PWDB_ALL >= 22 && PWDB_ALL < 31) - SQ = 40; - else if(PWDB_ALL >= 18 && PWDB_ALL < 22) - SQ = 20; - else - SQ = 10; - } - else - { - if(PWDB_ALL >= 50) - SQ = 100; - else if(PWDB_ALL >= 35 && PWDB_ALL < 50) - SQ = 80; - else if(PWDB_ALL >= 22 && PWDB_ALL < 35) - SQ = 60; - else if(PWDB_ALL >= 18 && PWDB_ALL < 22) - SQ = 40; - else - SQ = 10; - } - - } - else - {//OFDM rate - - if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter) || - IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter)) - { - if(RSSI >= 45) - SQ = 100; - else if(RSSI >= 22 && RSSI < 45) - SQ = 80; - else if(RSSI >= 18 && RSSI < 22) - SQ = 40; - else - SQ = 20; - } - else - { - if(RSSI >= 45) - SQ = 100; - else if(RSSI >= 22 && RSSI < 45) - SQ = 80; - else if(RSSI >= 18 && RSSI < 22) - SQ = 40; - else - SQ = 20; - } - } - - RT_TRACE(COMP_DBG, DBG_TRACE, ("isCCKrate(%#d), PWDB_ALL(%#d), RSSI(%#d), SQ(%#d)\n", isCCKrate, PWDB_ALL, RSSI, SQ)); - -#endif - return SQ; -} - -static u1Byte odm_SQ_process_patch_RT_CID_819x_Acer( - IN PDM_ODM_T pDM_Odm, - IN u1Byte isCCKrate, - IN u1Byte PWDB_ALL, - IN u1Byte path, - IN u1Byte RSSI -) -{ - u1Byte SQ = 0; - -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - - if(isCCKrate){ - - RT_TRACE(COMP_DBG, DBG_WARNING, ("odm_SQ_process_patch_RT_Acer\n")); - -#if OS_WIN_FROM_WIN8(OS_VERSION) - - if(PWDB_ALL >= 50) - SQ = 100; - else if(PWDB_ALL >= 35 && PWDB_ALL < 50) - SQ = 80; - else if(PWDB_ALL >= 30 && PWDB_ALL < 35) - SQ = 60; - else if(PWDB_ALL >= 25 && PWDB_ALL < 30) - SQ = 40; - else if(PWDB_ALL >= 20 && PWDB_ALL < 25) - SQ = 20; - else - SQ = 10; -#else - if(PWDB_ALL >= 50) - SQ = 100; - else if(PWDB_ALL >= 35 && PWDB_ALL < 50) - SQ = 80; - else if(PWDB_ALL >= 30 && PWDB_ALL < 35) - SQ = 60; - else if(PWDB_ALL >= 25 && PWDB_ALL < 30) - SQ = 40; - else if(PWDB_ALL >= 20 && PWDB_ALL < 25) - SQ = 20; - else - SQ = 10; - - if(PWDB_ALL == 0)// Abnormal case, do not indicate the value above 20 on Win7 - SQ = 20; -#endif - - - - } - else - {//OFDM rate - - if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter) || - IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter)) - { - if(RSSI >= 45) - SQ = 100; - else if(RSSI >= 22 && RSSI < 45) - SQ = 80; - else if(RSSI >= 18 && RSSI < 22) - SQ = 40; - else - SQ = 20; - } - else - { - if(RSSI >= 35) - SQ = 100; - else if(RSSI >= 30 && RSSI < 35) - SQ = 80; - else if(RSSI >= 25 && RSSI < 30) - SQ = 40; - else - SQ = 20; - } - } - - RT_TRACE(COMP_DBG, DBG_LOUD, ("isCCKrate(%#d), PWDB_ALL(%#d), RSSI(%#d), SQ(%#d)\n", isCCKrate, PWDB_ALL, RSSI, SQ)); - -#endif - return SQ; -} - -static u1Byte -odm_EVMdbToPercentage( - IN s1Byte Value - ) -{ - // - // -33dB~0dB to 0%~99% - // - s1Byte ret_val; - - ret_val = Value; - ret_val /= 2; - - //DbgPrint("Value=%d\n", Value); - //ODM_RT_DISP(FRX, RX_PHY_SQ, ("EVMdbToPercentage92C Value=%d / %x \n", ret_val, ret_val)); - - if(ret_val >= 0) - ret_val = 0; - if(ret_val <= -33) - ret_val = -33; - - ret_val = 0 - ret_val; - ret_val*=3; - - if(ret_val == 99) - ret_val = 100; - - return(ret_val); -} - -static u1Byte -odm_EVMdbm_JaguarSeries( - IN s1Byte Value - ) -{ - s1Byte ret_val = Value; - - // -33dB~0dB to 33dB ~ 0dB - if(ret_val == -128) - ret_val = 127; - else if (ret_val < 0) - ret_val = 0 - ret_val; - - ret_val = ret_val >> 1; - return ret_val; -} - -static u2Byte -odm_Cfo( - IN s1Byte Value -) -{ - s2Byte ret_val; - - if (Value < 0) - { - ret_val = 0 - Value; - ret_val = (ret_val << 1) + (ret_val >> 1) ; // *2.5~=312.5/2^7 - ret_val = ret_val | BIT12; // set bit12 as 1 for negative cfo - } - else - { - ret_val = Value; - ret_val = (ret_val << 1) + (ret_val>>1) ; // *2.5~=312.5/2^7 - } - return ret_val; -} - - -VOID -odm_RxPhyStatus92CSeries_Parsing( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - u1Byte i, Max_spatial_stream; - s1Byte rx_pwr[4], rx_pwr_all=0; - u1Byte EVM, PWDB_ALL = 0, PWDB_ALL_BT; - u1Byte RSSI, total_rssi=0; - BOOLEAN isCCKrate=FALSE; - u1Byte rf_rx_num = 0; - u1Byte cck_highpwr = 0; - u1Byte LNA_idx, VGA_idx; - PPHY_STATUS_RPT_8192CD_T pPhyStaRpt = (PPHY_STATUS_RPT_8192CD_T)pPhyStatus; - - isCCKrate = (pPktinfo->DataRate <= DESC_RATE11M)?TRUE :FALSE; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - - - if(isCCKrate) - { - u1Byte report; - u1Byte cck_agc_rpt; - - pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; - // - // (1)Hardware does not provide RSSI for CCK - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - - //if(pHalData->eRFPowerState == eRfOn) - cck_highpwr = pDM_Odm->bCckHighPower; - //else - // cck_highpwr = FALSE; - - cck_agc_rpt = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a ; - - //2011.11.28 LukeLee: 88E use different LNA & VGA gain table - //The RSSI formula should be modified according to the gain table - //In 88E, cck_highpwr is always set to 1 - if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B)) - { - LNA_idx = ((cck_agc_rpt & 0xE0) >>5); - VGA_idx = (cck_agc_rpt & 0x1F); - if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E)) - { - switch(LNA_idx) - { - case 7: - if(VGA_idx <= 27) - rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 - else - rx_pwr_all = -100; - break; - case 6: - rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 - break; - case 5: - rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 - break; - case 4: - rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 - break; - case 3: - //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 - rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 - break; - case 2: - if(cck_highpwr) - rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 - else - rx_pwr_all = -6+ 2*(5-VGA_idx); - break; - case 1: - rx_pwr_all = 8-2*VGA_idx; - break; - case 0: - rx_pwr_all = 14-2*VGA_idx; - break; - default: - //DbgPrint("CCK Exception default\n"); - break; - } - rx_pwr_all += 6; - - //2012.10.08 LukeLee: Modify for 92E CCK RSSI - if(pDM_Odm->SupportICType == ODM_RTL8192E) - rx_pwr_all += 10; - - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - if(cck_highpwr == FALSE) - { - if(PWDB_ALL >= 80) - PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; - else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) - PWDB_ALL += 3; - if(PWDB_ALL>100) - PWDB_ALL = 100; - } - } - else if(pDM_Odm->SupportICType & (ODM_RTL8723B)) - { -#if (RTL8723B_SUPPORT == 1) - rx_pwr_all = odm_CCKRSSI_8723B(LNA_idx,VGA_idx); - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - if(PWDB_ALL>100) - PWDB_ALL = 100; -#endif - } - } - else - { - if(!cck_highpwr) - { - report =( cck_agc_rpt & 0xc0 )>>6; - switch(report) - { - // 03312009 modified by cosa - // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion - // Note: different RF with the different RNA gain. - case 0x3: - rx_pwr_all = -46 - (cck_agc_rpt & 0x3e); - break; - case 0x2: - rx_pwr_all = -26 - (cck_agc_rpt & 0x3e); - break; - case 0x1: - rx_pwr_all = -12 - (cck_agc_rpt & 0x3e); - break; - case 0x0: - rx_pwr_all = 16 - (cck_agc_rpt & 0x3e); - break; - } - } - else - { - //report = pDrvInfo->cfosho[0] & 0x60; - //report = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a& 0x60; - - report = (cck_agc_rpt & 0x60)>>5; - switch(report) - { - case 0x3: - rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f)<<1) ; - break; - case 0x2: - rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f)<<1); - break; - case 0x1: - rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f)<<1) ; - break; - case 0x0: - rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f)<<1) ; - break; - } - } - - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - - //Modification for ext-LNA board - if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) - { - if((cck_agc_rpt>>7) == 0){ - PWDB_ALL = (PWDB_ALL>94)?100:(PWDB_ALL +6); - } - else - { - if(PWDB_ALL > 38) - PWDB_ALL -= 16; - else - PWDB_ALL = (PWDB_ALL<=16)?(PWDB_ALL>>2):(PWDB_ALL -12); - } - - //CCK modification - if(PWDB_ALL > 25 && PWDB_ALL <= 60) - PWDB_ALL += 6; - //else if (PWDB_ALL <= 25) - // PWDB_ALL += 8; - } - else//Modification for int-LNA board - { - if(PWDB_ALL > 99) - PWDB_ALL -= 8; - else if(PWDB_ALL > 50 && PWDB_ALL <= 68) - PWDB_ALL += 4; - } - } - - pPhyInfo->RxPWDBAll = PWDB_ALL; -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; - pPhyInfo->RecvSignalPower = rx_pwr_all; -#endif - // - // (3) Get Signal Quality (EVM) - // - //if(pPktinfo->bPacketMatchBSSID) - { - u1Byte SQ,SQ_rpt; - - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)){ - SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); - } - else if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Acer)) - { - SQ = odm_SQ_process_patch_RT_CID_819x_Acer(pDM_Odm,isCCKrate,PWDB_ALL,0,0); - } - else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ - SQ = 100; - } - else{ - SQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all; - - if(SQ_rpt > 64) - SQ = 0; - else if (SQ_rpt < 20) - SQ = 100; - else - SQ = ((64-SQ_rpt) * 100) / 44; - - } - - //DbgPrint("cck SQ = %d\n", SQ); - pPhyInfo->SignalQuality = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - } - } - else //is OFDM rate - { - pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; - - // - // (1)Get RSSI for HT rate - // - - for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) - { - // 2008/01/30 MH we will judge RF RX path now. - if (pDM_Odm->RFPathRxEnable & BIT(i)) - rf_rx_num++; - //else - //continue; - - rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain& 0x3F)*2) - 110; - - - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->RxPwr[i] = rx_pwr[i]; - #endif - - /* Translate DBM to percentage. */ - RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); - total_rssi += RSSI; - //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); - - //Modification for ext-LNA board - if(pDM_Odm->SupportICType&ODM_RTL8192C) - { - if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) - { - if((pPhyStaRpt->path_agc[i].trsw) == 1) - RSSI = (RSSI>94)?100:(RSSI +6); - else - RSSI = (RSSI<=16)?(RSSI>>3):(RSSI -16); - - if((RSSI <= 34) && (RSSI >=4)) - RSSI -= 4; - } - } - - pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; - - #if (DM_ODM_SUPPORT_TYPE & (/*ODM_WIN|*/ODM_CE|ODM_AP|ODM_ADSL)) - //Get Rx snr value in DB - pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s4Byte)(pPhyStaRpt->path_rxsnr[i]/2); - #endif - - /* Record Signal Strength for next packet */ - //if(pPktinfo->bPacketMatchBSSID) - { - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)) - { - if(i==ODM_RF_PATH_A) - pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI); - - } - else if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Acer)) - { - pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Acer(pDM_Odm,isCCKrate,PWDB_ALL,0,RSSI); - } - - } - } - - - // - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1 )& 0x7f) -110; - - PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - //RT_DISP(FRX, RX_PHY_SS, ("PWDB_ALL=%d\n",PWDB_ALL)); - - pPhyInfo->RxPWDBAll = PWDB_ALL; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; - pPhyInfo->RxPower = rx_pwr_all; - pPhyInfo->RecvSignalPower = rx_pwr_all; - #endif - - if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19)){ - //do nothing - }else if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==25)){ - //do nothing - } - else{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo - // - // (3)EVM of HT rate - // - if(pPktinfo->DataRate >=DESC_RATEMCS8 && pPktinfo->DataRate <=DESC_RATEMCS15) - Max_spatial_stream = 2; //both spatial stream make sense - else - Max_spatial_stream = 1; //only spatial stream 1 makes sense - - for(i=0; i>= 1" because the compilor of free build environment - // fill most significant bit to "zero" when doing shifting operation which may change a negative - // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. - EVM = odm_EVMdbToPercentage( (pPhyStaRpt->stream_rxevm[i] )); //dbm - - //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", - //GET_RX_STATUS_DESC_RX_MCS(pDesc), pDrvInfo->rxevm[i], "%", EVM)); - - //if(pPktinfo->bPacketMatchBSSID) - { - if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only - { - pPhyInfo->SignalQuality = (u1Byte)(EVM & 0xff); - } - pPhyInfo->RxMIMOSignalQuality[i] = (u1Byte)(EVM & 0xff); - } - } - } - - ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->path_cfotail); - - } -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - //UI BSS List signal strength(in percentage), make it good looking, from 0~100. - //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). - if(isCCKrate) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; -#else -#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING - pPhyInfo->SignalStrength = (u1Byte)PWDB_ALL; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; -#endif -#endif - } - else - { - if (rf_rx_num != 0) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; -#else -#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING - total_rssi/=rf_rx_num; - pPhyInfo->SignalStrength = (u1Byte)total_rssi; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); -#endif -#endif - } - } -#endif - - //DbgPrint("isCCKrate = %d, pPhyInfo->RxPWDBAll = %d, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a = 0x%x\n", - //isCCKrate, pPhyInfo->RxPWDBAll, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a); - - //For 92C/92D HW (Hybrid) Antenna Diversity -#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) - pDM_SWAT_Table->antsel = pPhyStaRpt->ant_sel; - //For 88E HW Antenna Diversity - pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->ant_sel; - pDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->ant_sel_b; - pDM_Odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antsel_rx_keep_2; -#endif -} - -#if ODM_IC_11AC_SERIES_SUPPORT - -VOID -odm_RxPhyStatusJaguarSeries_Parsing( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - u1Byte i, Max_spatial_stream; - s1Byte rx_pwr[4], rx_pwr_all=0; - u1Byte EVM = 0, EVMdbm, PWDB_ALL = 0, PWDB_ALL_BT; - u1Byte RSSI, total_rssi=0; - u1Byte isCCKrate=0; - u1Byte rf_rx_num = 0; - u1Byte cck_highpwr = 0; - u1Byte LNA_idx, VGA_idx; - - - PPHY_STATUS_RPT_8812_T pPhyStaRpt = (PPHY_STATUS_RPT_8812_T)pPhyStatus; - - if(pPktinfo->DataRate <= DESC_RATE54M) - { - switch(pPhyStaRpt->r_RFMOD){ - case 1: - if(pPhyStaRpt->sub_chnl == 0) - pPhyInfo->BandWidth = 1; - else - pPhyInfo->BandWidth = 0; - break; - - case 2: - if(pPhyStaRpt->sub_chnl == 0) - pPhyInfo->BandWidth = 2; - else if(pPhyStaRpt->sub_chnl == 9 || pPhyStaRpt->sub_chnl == 10) - pPhyInfo->BandWidth = 1; - else - pPhyInfo->BandWidth = 0; - break; - - default: case 0: - pPhyInfo->BandWidth = 0; - break; - } - } - - if(pPktinfo->DataRate <= DESC_RATE11M) - isCCKrate = TRUE; - else - isCCKrate = FALSE; - - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - - - if(isCCKrate) - { - u1Byte cck_agc_rpt; - pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; - // - // (1)Hardware does not provide RSSI for CCK - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - - //if(pHalData->eRFPowerState == eRfOn) - cck_highpwr = pDM_Odm->bCckHighPower; - //else - // cck_highpwr = FALSE; - - cck_agc_rpt = pPhyStaRpt->cfosho[0] ; - - LNA_idx = ((cck_agc_rpt & 0xE0) >>5); - VGA_idx = (cck_agc_rpt & 0x1F); - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - switch(LNA_idx) - { - case 7: - if(VGA_idx <= 27) - rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 - else - rx_pwr_all = -100; - break; - case 6: - rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 - break; - case 5: - rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 - break; - case 4: - rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 - break; - case 3: - //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 - rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 - break; - case 2: - if(cck_highpwr) - rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 - else - rx_pwr_all = -6+ 2*(5-VGA_idx); - break; - case 1: - rx_pwr_all = 8-2*VGA_idx; - break; - case 0: - rx_pwr_all = 14-2*VGA_idx; - break; - default: - //DbgPrint("CCK Exception default\n"); - break; - } - rx_pwr_all += 6; - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - if(cck_highpwr == FALSE) - { - if(PWDB_ALL >= 80) - PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; - else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) - PWDB_ALL += 3; - if(PWDB_ALL>100) - PWDB_ALL = 100; - } - } - else if(pDM_Odm->SupportICType == ODM_RTL8821) - { - s1Byte Pout = -6; - - switch(LNA_idx) - { - case 5: - rx_pwr_all = Pout -32 -(2*VGA_idx); - break; - case 4: - rx_pwr_all = Pout -24 -(2*VGA_idx); - break; - case 2: - rx_pwr_all = Pout -11 -(2*VGA_idx); - break; - case 1: - rx_pwr_all = Pout + 5 -(2*VGA_idx); - break; - case 0: - rx_pwr_all = Pout + 21 -(2*VGA_idx); - break; - } - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - } - - pPhyInfo->RxPWDBAll = PWDB_ALL; - //if(pPktinfo->StationID == 0) - //{ - // DbgPrint("CCK: LNA_idx = %d, VGA_idx = %d, pPhyInfo->RxPWDBAll = %d\n", - // LNA_idx, VGA_idx, pPhyInfo->RxPWDBAll); - //} -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; - pPhyInfo->RecvSignalPower = rx_pwr_all; -#endif - // - // (3) Get Signal Quality (EVM) - // - //if(pPktinfo->bPacketMatchBSSID) - { - u1Byte SQ,SQ_rpt; - - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)){ - SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); - } - else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ - SQ = 100; - } - else{ - SQ_rpt = pPhyStaRpt->pwdb_all; - - if(SQ_rpt > 64) - SQ = 0; - else if (SQ_rpt < 20) - SQ = 100; - else - SQ = ((64-SQ_rpt) * 100) / 44; - - } - - //DbgPrint("cck SQ = %d\n", SQ); - pPhyInfo->SignalQuality = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - } - } - else //is OFDM rate - { - pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; - - // - // (1)Get RSSI for OFDM rate - // - - for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) - { - // 2008/01/30 MH we will judge RF RX path now. - //DbgPrint("pDM_Odm->RFPathRxEnable = %x\n", pDM_Odm->RFPathRxEnable); - if (pDM_Odm->RFPathRxEnable & BIT(i)) - { - rf_rx_num++; - } - //else - //continue; - //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip - //if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip)) - rx_pwr[i] = (pPhyStaRpt->gain_trsw[i]&0x7F) - 110; - //else - // rx_pwr[i] = ((pPhyStaRpt->gain_trsw[i]& 0x3F)*2) - 110; //OLD FORMULA - - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->RxPwr[i] = rx_pwr[i]; - #endif - - /* Translate DBM to percentage. */ - RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); - - total_rssi += RSSI; - //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); - - - - pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; - - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) - //Get Rx snr value in DB - pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = pPhyStaRpt->rxsnr[i]/2; - #endif - - // - // (2) CFO_short & CFO_tail - // - pPhyInfo->Cfo_short[i] = odm_Cfo( (pPhyStaRpt->cfosho[i]) ); - pPhyInfo->Cfo_tail[i] = odm_Cfo( (pPhyStaRpt->cfotail[i]) ); - - /* Record Signal Strength for next packet */ - //if(pPktinfo->bPacketMatchBSSID) - { - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)) - { - if(i==ODM_RF_PATH_A) - pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI); - - } - } - } - - - // - // (3)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip - if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip)) - rx_pwr_all = (pPhyStaRpt->pwdb_all& 0x7f) -110; - else - rx_pwr_all = (((pPhyStaRpt->pwdb_all) >> 1 )& 0x7f) -110; //OLD FORMULA - - - PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - - - pPhyInfo->RxPWDBAll = PWDB_ALL; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; - pPhyInfo->RxPower = rx_pwr_all; - pPhyInfo->RecvSignalPower = rx_pwr_all; - #endif - - //DbgPrint("OFDM: pPhyInfo->RxPWDBAll = %d, pPhyInfo->RxMIMOSignalStrength[0] = %d, pPhyInfo->RxMIMOSignalStrength[1] = %d\n", - // pPhyInfo->RxPWDBAll, pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1]); - - - if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19)){ - //do nothing - } - else{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo - // - // (4)EVM of OFDM rate - // - if( (pPktinfo->DataRate>=DESC_RATEMCS8) && - (pPktinfo->DataRate <=DESC_RATEMCS15)) - Max_spatial_stream = 2; - else if( (pPktinfo->DataRate>=DESC_RATEVHTSS2MCS0) && - (pPktinfo->DataRate <=DESC_RATEVHTSS2MCS9)) - Max_spatial_stream = 2; - else - Max_spatial_stream = 1; - - //if(pPktinfo->bPacketMatchBSSID) - { - //DbgPrint("pPktinfo->DataRate = %d\n", pPktinfo->DataRate); - - for(i=0; i>= 1" because the compilor of free build environment - // fill most significant bit to "zero" when doing shifting operation which may change a negative - // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. - // - // 2013/09/02 MH According to 8812AU test, when use RX evm the value sometimes - // will be incorrect and 1SS-MCS-0-7 always incorrect. Only use LSIG the evm value - // seems ok. This seems BB bug, we need use another way to display better SQ. - // - //if (pPktinfo->DataRate>=DESC8812_RATE6M && pPktinfo->DataRate<=DESC8812_RATE54M) - { - - if(i==ODM_RF_PATH_A ) - { - EVM = odm_EVMdbToPercentage( (pPhyStaRpt->sigevm )); //dbm - EVM += 20; - if (EVM > 100) - EVM = 100; - } - } -#if 0 - else - { - if (pPhyStaRpt->rxevm[i] == -128) - { - pPhyStaRpt->rxevm[i] = -25; - } - EVM = odm_EVMdbToPercentage( (pPhyStaRpt->rxevm[i] )); //dbm - } -#endif - EVMdbm = odm_EVMdbm_JaguarSeries(pPhyStaRpt->rxevm[i]); - //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", - //pPktinfo->DataRate, pPhyStaRpt->rxevm[i], "%", EVM)); - - - { - if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only - { - pPhyInfo->SignalQuality = EVM; - } - pPhyInfo->RxMIMOSignalQuality[i] = EVM; - pPhyInfo->RxMIMOEVMdbm[i] = EVMdbm; - } - } - } - } - - ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->cfotail); - - } - //DbgPrint("isCCKrate= %d, pPhyInfo->SignalStrength=%d % PWDB_AL=%d rf_rx_num=%d\n", isCCKrate, pPhyInfo->SignalStrength, PWDB_ALL, rf_rx_num); - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - //UI BSS List signal strength(in percentage), make it good looking, from 0~100. - //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). - if(isCCKrate) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; -#endif - } - else - { - if (rf_rx_num != 0) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); -#endif - } - } -#endif - pDM_Odm->RxPWDBAve = pDM_Odm->RxPWDBAve + pPhyInfo->RxPWDBAll; - - pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->antidx_anta; - pDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->antidx_antb; - - //DbgPrint("pPhyStaRpt->antidx_anta = %d, pPhyStaRpt->antidx_antb = %d, pPhyStaRpt->resvd_1 = %d", - // pPhyStaRpt->antidx_anta, pPhyStaRpt->antidx_antb, pPhyStaRpt->resvd_1); - - //DbgPrint("----------------------------\n"); - //DbgPrint("pPktinfo->StationID=%d, pPktinfo->DataRate=0x%x\n",pPktinfo->StationID, pPktinfo->DataRate); - //DbgPrint("pPhyStaRpt->gain_trsw[0]=0x%x, pPhyStaRpt->gain_trsw[1]=0x%x, pPhyStaRpt->pwdb_all=0x%x\n", - // pPhyStaRpt->gain_trsw[0],pPhyStaRpt->gain_trsw[1], pPhyStaRpt->pwdb_all); - //DbgPrint("pPhyInfo->RxMIMOSignalStrength[0]=%d, pPhyInfo->RxMIMOSignalStrength[1]=%d, RxPWDBAll=%d\n", - // pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1], pPhyInfo->RxPWDBAll); - -} - -#endif - -VOID -odm_Init_RSSIForDM( - IN OUT PDM_ODM_T pDM_Odm - ) -{ - -} - -VOID -odm_Process_RSSIForDM( - IN OUT PDM_ODM_T pDM_Odm, - IN PODM_PHY_INFO_T pPhyInfo, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - - s4Byte UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK, UndecoratedSmoothedOFDM, RSSI_Ave; - u1Byte isCCKrate=0; - u1Byte RSSI_max, RSSI_min, i; - u4Byte OFDM_pkt=0; - u4Byte Weighting=0; - PSTA_INFO_T pEntry; - - - if(pPktinfo->StationID == 0xFF) - return; - - // - // 2012/05/30 MH/Luke.Lee Add some description - // In windows driver: AP/IBSS mode STA - // - //if (pDM_Odm->SupportPlatform == ODM_WIN) - //{ - // pEntry = pDM_Odm->pODM_StaInfo[pDM_Odm->pAidMap[pPktinfo->StationID-1]]; - //} - //else - pEntry = pDM_Odm->pODM_StaInfo[pPktinfo->StationID]; - - if(!IS_STA_VALID(pEntry) ){ - return; - } - if((!pPktinfo->bPacketMatchBSSID) ) - { - return; - } - - if(pPktinfo->bPacketBeacon) - pDM_Odm->PhyDbgInfo.NumQryBeaconPkt++; - - isCCKrate = (pPktinfo->DataRate <= DESC_RATE11M)?TRUE :FALSE; - pDM_Odm->RxRate = pPktinfo->DataRate; - /* - if(!isCCKrate) - { - DbgPrint("OFDM: pPktinfo->StationID=%d, isCCKrate=%d, pPhyInfo->RxPWDBAll=%d\n", - pPktinfo->StationID, isCCKrate, pPhyInfo->RxPWDBAll); - } - */ - - //--------------Statistic for antenna/path diversity------------------ - if(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) - { - #if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) - ODM_Process_RSSIForAntDiv(pDM_Odm,pPhyInfo,pPktinfo); - #endif - } - else if(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV) - { - #if (RTL8812A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv; - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) - { - if(pPktinfo->DataRate > DESC_RATE11M) - ODM_PathStatistics_8812A(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A], - pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]); - } - } - #endif - } - - //-----------------Smart Antenna Debug Message------------------// - - UndecoratedSmoothedCCK = pEntry->rssi_stat.UndecoratedSmoothedCCK; - UndecoratedSmoothedOFDM = pEntry->rssi_stat.UndecoratedSmoothedOFDM; - UndecoratedSmoothedPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB; - - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) - { - - if(!isCCKrate)//ofdm rate - { - if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B] == 0){ - RSSI_Ave = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - pDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - pDM_Odm->RSSI_B = 0; - } - else - { - //DbgPrint("pRfd->Status.RxMIMOSignalStrength[0] = %d, pRfd->Status.RxMIMOSignalStrength[1] = %d \n", - //pRfd->Status.RxMIMOSignalStrength[0], pRfd->Status.RxMIMOSignalStrength[1]); - pDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - pDM_Odm->RSSI_B = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; - - if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A] > pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]) - { - RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; - } - else - { - RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; - RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - } - if((RSSI_max -RSSI_min) < 3) - RSSI_Ave = RSSI_max; - else if((RSSI_max -RSSI_min) < 6) - RSSI_Ave = RSSI_max - 1; - else if((RSSI_max -RSSI_min) < 10) - RSSI_Ave = RSSI_max - 2; - else - RSSI_Ave = RSSI_max - 3; - } - - //1 Process OFDM RSSI - if(UndecoratedSmoothedOFDM <= 0) // initialize - { - UndecoratedSmoothedOFDM = pPhyInfo->RxPWDBAll; - } - else - { - if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedOFDM) - { - UndecoratedSmoothedOFDM = - ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + - (RSSI_Ave)) /(Rx_Smooth_Factor); - UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM + 1; - } - else - { - UndecoratedSmoothedOFDM = - ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + - (RSSI_Ave)) /(Rx_Smooth_Factor); - } - } - - pEntry->rssi_stat.PacketMap = (pEntry->rssi_stat.PacketMap<<1) | BIT0; - - } - else - { - RSSI_Ave = pPhyInfo->RxPWDBAll; - pDM_Odm->RSSI_A = (u1Byte) pPhyInfo->RxPWDBAll; - pDM_Odm->RSSI_B = 0; - - //1 Process CCK RSSI - if(UndecoratedSmoothedCCK <= 0) // initialize - { - UndecoratedSmoothedCCK = pPhyInfo->RxPWDBAll; - } - else - { - if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedCCK) - { - UndecoratedSmoothedCCK = - ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + - (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); - UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1; - } - else - { - UndecoratedSmoothedCCK = - ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + - (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); - } - } - pEntry->rssi_stat.PacketMap = pEntry->rssi_stat.PacketMap<<1; - } - - //if(pEntry) - { - //2011.07.28 LukeLee: modified to prevent unstable CCK RSSI - if(pEntry->rssi_stat.ValidBit >= 64) - pEntry->rssi_stat.ValidBit = 64; - else - pEntry->rssi_stat.ValidBit++; - - for(i=0; irssi_stat.ValidBit; i++) - OFDM_pkt += (u1Byte)(pEntry->rssi_stat.PacketMap>>i)&BIT0; - - if(pEntry->rssi_stat.ValidBit == 64) - { - Weighting = ((OFDM_pkt<<4) > 64)?64:(OFDM_pkt<<4); - UndecoratedSmoothedPWDB = (Weighting*UndecoratedSmoothedOFDM+(64-Weighting)*UndecoratedSmoothedCCK)>>6; - } - else - { - if(pEntry->rssi_stat.ValidBit != 0) - UndecoratedSmoothedPWDB = (OFDM_pkt*UndecoratedSmoothedOFDM+(pEntry->rssi_stat.ValidBit-OFDM_pkt)*UndecoratedSmoothedCCK)/pEntry->rssi_stat.ValidBit; - else - UndecoratedSmoothedPWDB = 0; - } - - pEntry->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; - pEntry->rssi_stat.UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM; - pEntry->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; - - //DbgPrint("OFDM_pkt=%d, Weighting=%d\n", OFDM_pkt, Weighting); - //DbgPrint("UndecoratedSmoothedOFDM=%d, UndecoratedSmoothedPWDB=%d, UndecoratedSmoothedCCK=%d\n", - // UndecoratedSmoothedOFDM, UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK); - - } - - } -} - - -// -// Endianness before calling this API -// -VOID -ODM_PhyStatusQuery_92CSeries( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - - odm_RxPhyStatus92CSeries_Parsing( - pDM_Odm, - pPhyInfo, - pPhyStatus, - pPktinfo); - - if( pDM_Odm->RSSI_test == TRUE) - { - // Select the packets to do RSSI checking for antenna switching. - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon ) - { - /* - #if 0//(DM_ODM_SUPPORT_TYPE == ODM_WIN) - dm_SWAW_RSSI_Check( - Adapter, - (tmppAdapter!=NULL)?(tmppAdapter==Adapter):TRUE, - bPacketMatchBSSID, - pEntry, - pRfd); - #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - // Select the packets to do RSSI checking for antenna switching. - //odm_SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll); - #endif - */ - ODM_SwAntDivChkPerPktRssi(pDM_Odm,pPktinfo->StationID,pPhyInfo); - } - } - else - { - odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo); - } - -} - - - -// -// Endianness before calling this API -// -VOID -ODM_PhyStatusQuery_JaguarSeries( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - odm_RxPhyStatusJaguarSeries_Parsing( - pDM_Odm, - pPhyInfo, - pPhyStatus, - pPktinfo); - - odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo); -} - -VOID -ODM_PhyStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - - if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES ) - { - ODM_PhyStatusQuery_JaguarSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); - } - else - { - ODM_PhyStatusQuery_92CSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); - } -} - -// For future use. -VOID -ODM_MacStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - IN pu1Byte pMacStatus, - IN u1Byte MacID, - IN BOOLEAN bPacketMatchBSSID, - IN BOOLEAN bPacketToSelf, - IN BOOLEAN bPacketBeacon - ) -{ - // 2011/10/19 Driver team will handle in the future. - -} - - -// -// If you want to add a new IC, Please follow below template and generate a new one. -// -// - -HAL_STATUS -ODM_ConfigRFWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_Config_Type ConfigType, - IN ODM_RF_RADIO_PATH_E eRFPath - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("===>ODM_ConfigRFWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", - pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); - -#if (RTL8723A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723A) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG_MP(8723A,_RadioA); - } - } -#endif - -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG_MP(8188E,_RadioA); - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG_MP(8188E,_TXPWR_LMT); - } - } -#endif - -#if (RTL8812A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8812) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - { - READ_AND_CONFIG(8812A,_RadioA); - } - else if(eRFPath == ODM_RF_PATH_B) - { - READ_AND_CONFIG(8812A,_RadioB); - } - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG(8812A,_TXPWR_LMT); - } - } -#endif - -#if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - { - READ_AND_CONFIG_MP(8821A,_RadioA); - } - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { - - if (pDM_Odm->SupportInterface == ODM_ITRF_USB) { - if (pDM_Odm->ExtPA5G || pDM_Odm->ExtLNA5G) - READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_FEM); - else - READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_IPA); - } else { - READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A); - } - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigRFWithHeaderFile\n")); - } -#endif - -#if (RTL8723B_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723B) - { - if(ConfigType == CONFIG_RF_RADIO) { - READ_AND_CONFIG(8723B,_RadioA); - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG(8723B,_TXPWR_LMT); - } - } -#endif - -#if (RTL8192E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8192E) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG_MP(8192E,_RadioA); - else if(eRFPath == ODM_RF_PATH_B) - READ_AND_CONFIG_MP(8192E,_RadioB); - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG_MP(8192E,_TXPWR_LMT); - } - } -#endif - -#if (RTL8814A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8814A) - { - /* - if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG(8813A,_TXPWR_LMT); - } - */ - } -#endif - - return HAL_STATUS_SUCCESS; -} - -HAL_STATUS -ODM_ConfigRFWithTxPwrTrackHeaderFile( - IN PDM_ODM_T pDM_Odm - ) -{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("===>ODM_ConfigRFWithTxPwrTrackHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", - pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); - - if(0) - { - } -#if (RTL8821A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8821) - { - if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE); - else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) - READ_AND_CONFIG_MP(8821A,_TxPowerTrack_USB); - else - READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE); - } -#endif -#if (RTL8812A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8812) - { - if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - READ_AND_CONFIG(8812A,_TxPowerTrack_PCIE); - else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) { - if (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) - READ_AND_CONFIG_MP(8812A,_TxPowerTrack_RFE3); - else - READ_AND_CONFIG(8812A,_TxPowerTrack_USB); - } - - } -#endif -#if (RTL8192E_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8192E) - { - if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - READ_AND_CONFIG_MP(8192E,_TxPowerTrack_PCIE); - else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) - READ_AND_CONFIG_MP(8192E,_TxPowerTrack_USB); - } -#endif -#if RTL8723B_SUPPORT - else if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - READ_AND_CONFIG(8723B,_TxPowerTrack_PCIE); - else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) - READ_AND_CONFIG(8723B,_TxPowerTrack_USB); - else if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO) - READ_AND_CONFIG(8723B,_TxPowerTrack_SDIO); - } -#endif -#if RTL8188E_SUPPORT - else if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE); - else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) - READ_AND_CONFIG_MP(8188E,_TxPowerTrack_USB); - else - READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE); - } -#endif - - return HAL_STATUS_SUCCESS; -} - -HAL_STATUS -ODM_ConfigBBWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_BB_Config_Type ConfigType - ) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); -#endif -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("===>ODM_ConfigBBWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", - pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); - -#if (RTL8723A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8723A) - { - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG_MP(8723A,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG_MP(8723A,_AGC_TAB); - } - } -#endif - -#if (RTL8188E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG_MP(8188E,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG_MP(8188E,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - READ_AND_CONFIG_MP(8188E,_PHY_REG_PG); - } - } -#endif - -#if (RTL8812A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8812A,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8812A,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - if (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) - READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_ASUS); -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - else if (pMgntInfo->CustomerID == RT_CID_WNC_NEC && pDM_Odm->bIsMPChip) - READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_NEC); -#endif - else - READ_AND_CONFIG(8812A,_PHY_REG_PG); - } - else if(ConfigType == CONFIG_BB_PHY_REG_MP) - { - READ_AND_CONFIG_MP(8812A,_PHY_REG_MP); - } - else if(ConfigType == CONFIG_BB_AGC_TAB_DIFF) - { - if ((36 <= *pDM_Odm->pChannel) && (*pDM_Odm->pChannel <= 64)) - AGC_DIFF_CONFIG_MP(8812A,LB); - else if (100 <= *pDM_Odm->pChannel) - AGC_DIFF_CONFIG_MP(8812A,HB); - } - } -#endif - -#if (RTL8821A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8821) - { - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG_MP(8821A,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG_MP(8821A,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - READ_AND_CONFIG_MP(8821A,_PHY_REG_PG); - } - } -#endif -#if (RTL8723B_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8723B,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8723B,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - READ_AND_CONFIG(8723B,_PHY_REG_PG); - } - } -#endif -#if (RTL8192E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8192E) - { - - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG_MP(8192E,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG_MP(8192E,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - READ_AND_CONFIG_MP(8192E,_PHY_REG_PG); - } - } -#endif -#if (RTL8814A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8814A) - { - - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8813A,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8813A,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - //READ_AND_CONFIG(8813A,_PHY_REG_PG); - } - } -#endif - return HAL_STATUS_SUCCESS; -} - -HAL_STATUS -ODM_ConfigMACWithHeaderFile( - IN PDM_ODM_T pDM_Odm - ) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; -#endif - u1Byte result = HAL_STATUS_SUCCESS; - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("===>ODM_ConfigMACWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", - pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); - -#if (RTL8723A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723A) - { - READ_AND_CONFIG_MP(8723A,_MAC_REG); - } -#endif -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - READ_AND_CONFIG_MP(8188E,_MAC_REG); - } -#endif -#if (RTL8812A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8812) - { - READ_AND_CONFIG(8812A,_MAC_REG); - } -#endif -#if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - { - READ_AND_CONFIG_MP(8821A,_MAC_REG); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigMACwithHeaderFile\n")); - } -#endif -#if (RTL8723B_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723B) - { - READ_AND_CONFIG(8723B,_MAC_REG); - } -#endif -#if (RTL8192E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8192E) - { - READ_AND_CONFIG_MP(8192E,_MAC_REG); - } -#endif - - return result; -} - -HAL_STATUS -ODM_ConfigFWWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_FW_Config_Type ConfigType, - OUT u1Byte *pFirmware, - OUT u4Byte *pSize - ) -{ - -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE_MP(8188E,_FW_NIC_T); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE_MP(8188E,_FW_WoWLAN_T); - } - else if(ConfigType == CONFIG_FW_NIC_2) - { - READ_FIRMWARE_MP(8188E,_FW_NIC_S); - } - else if (ConfigType == CONFIG_FW_WoWLAN_2) - { - READ_FIRMWARE_MP(8188E,_FW_WoWLAN_S); - } - } -#endif -#if (RTL8723B_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723B) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE(8723B,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE(8723B,_FW_WoWLAN); - } -#ifdef CONFIG_AP_WOWLAN - else if (ConfigType == CONFIG_FW_AP_WoWLAN) - { - READ_FIRMWARE(8723B,_FW_AP_WoWLAN); - } -#endif - else if (ConfigType == CONFIG_FW_BT) - { - READ_FIRMWARE_MP(8723B,_FW_BT); - } - else if (ConfigType == CONFIG_FW_MP) - { - READ_FIRMWARE_MP(8723B,_FW_MP); - } - } -#endif -#if (RTL8812A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8812) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE(8812A,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE(8812A,_FW_WoWLAN); - } - else if (ConfigType == CONFIG_FW_BT) - { - READ_FIRMWARE(8812A,_FW_NIC_BT); - } - - } -#endif -#if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE_MP(8821A,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE_MP(8821A,_FW_WoWLAN); - } - else if (ConfigType == CONFIG_FW_BT) - { - READ_FIRMWARE_MP(8821A,_FW_NIC_BT); - } - } -#endif -#if (RTL8192E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8192E) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE_MP(8192E,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE_MP(8192E,_FW_WoWLAN); - } -#ifdef CONFIG_AP_WOWLAN - else if (ConfigType == CONFIG_FW_AP_WoWLAN) - { - READ_FIRMWARE_MP(8192E,_FW_AP_WoWLAN); - } -#endif - - } -#endif - return HAL_STATUS_SUCCESS; -} - - -u4Byte -ODM_GetHWImgVersion( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte Version=0; - -#if (RTL8723A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723A) - Version = GET_VERSION_MP(8723A,_MAC_REG); -#endif - -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - Version = GET_VERSION_MP(8188E,_MAC_REG); -#endif - -#if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - Version = GET_VERSION_MP(8821A,_MAC_REG); -#endif - -#if (RTL8192E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8192E) - Version = GET_VERSION_MP(8192E,_MAC_REG); -#endif - -#if (RTL8812A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8812) - Version = GET_VERSION_MP(8812A,_MAC_REG); -#endif - - return Version; -} - - - - - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_HWConfig.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_HWConfig.h deleted file mode 100755 index da0e5fc1cfce..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_HWConfig.h +++ /dev/null @@ -1,237 +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 __HALHWOUTSRC_H__ -#define __HALHWOUTSRC_H__ - - -/*--------------------------Define -------------------------------------------*/ -//#define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) -#define AGC_DIFF_CONFIG_MP(ic, band) (ODM_ReadAndConfig_MP_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_MP_##ic##_AGC_TAB_DIFF_##band, \ - sizeof(Array_MP_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte))) -#define AGC_DIFF_CONFIG_TC(ic, band) (ODM_ReadAndConfig_TC_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_TC_##ic##_AGC_TAB_DIFF_##band, \ - sizeof(Array_TC_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte))) - -#define AGC_DIFF_CONFIG(ic, band) do {\ - if (pDM_Odm->bIsMPChip)\ - AGC_DIFF_CONFIG_MP(ic,band);\ - else\ - AGC_DIFF_CONFIG_TC(ic,band);\ - } while(0) - - -//============================================================ -// structure and define -//============================================================ - -typedef struct _Phy_Rx_AGC_Info -{ - #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u1Byte gain:7,trsw:1; - #else - u1Byte trsw:1,gain:7; - #endif -} PHY_RX_AGC_INFO_T,*pPHY_RX_AGC_INFO_T; - -typedef struct _Phy_Status_Rpt_8192cd -{ - PHY_RX_AGC_INFO_T path_agc[2]; - u1Byte ch_corr[2]; - u1Byte cck_sig_qual_ofdm_pwdb_all; - u1Byte cck_agc_rpt_ofdm_cfosho_a; - u1Byte cck_rpt_b_ofdm_cfosho_b; - u1Byte rsvd_1;//ch_corr_msb; - u1Byte noise_power_db_msb; - s1Byte path_cfotail[2]; - u1Byte pcts_mask[2]; - s1Byte stream_rxevm[2]; - u1Byte path_rxsnr[2]; - u1Byte noise_power_db_lsb; - u1Byte rsvd_2[3]; - u1Byte stream_csi[2]; - u1Byte stream_target_csi[2]; - s1Byte sig_evm; - u1Byte rsvd_3; - -#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; - u1Byte sgi_en:1; - u1Byte rxsc:2; - u1Byte idle_long:1; - u1Byte r_ant_train_en:1; - u1Byte ant_sel_b:1; - u1Byte ant_sel:1; -#else // _BIG_ENDIAN_ - u1Byte ant_sel:1; - u1Byte ant_sel_b:1; - u1Byte r_ant_train_en:1; - u1Byte idle_long:1; - u1Byte rxsc:2; - u1Byte sgi_en:1; - u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; -#endif -} PHY_STATUS_RPT_8192CD_T,*PPHY_STATUS_RPT_8192CD_T; - - -typedef struct _Phy_Status_Rpt_8812 -{ -#if 0 - PHY_RX_AGC_INFO_T path_agc[2]; - u1Byte ch_num[2]; - u1Byte cck_sig_qual_ofdm_pwdb_all; - u1Byte cck_agc_rpt_ofdm_cfosho_a; - u1Byte cck_bb_pwr_ofdm_cfosho_b; - u1Byte cck_rx_path; //CCK_RX_PATH [3:0] (with regA07[3:0] definition) - u1Byte rsvd_1; - u1Byte path_cfotail[2]; - u1Byte pcts_mask[2]; - s1Byte stream_rxevm[2]; - u1Byte path_rxsnr[2]; - u1Byte rsvd_2[2]; - u1Byte stream_snr[2]; - u1Byte stream_csi[2]; - u1Byte rsvd_3[2]; - s1Byte sig_evm; - u1Byte rsvd_4; -#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u1Byte antidx_anta:3; - u1Byte antidx_antb:3; - u1Byte rsvd_5:2; -#else // _BIG_ENDIAN_ - u1Byte rsvd_5:2; - u1Byte antidx_antb:3; - u1Byte antidx_anta:3; -#endif -#endif - - //2012.05.24 LukeLee: This structure should take big/little endian in consideration later..... - - //DWORD 0 - u1Byte gain_trsw[2]; -#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u2Byte chl_num:10; - u2Byte sub_chnl:4; - u2Byte r_RFMOD:2; -#else // _BIG_ENDIAN_ - u2Byte r_RFMOD:2; - u2Byte sub_chnl:4; - u2Byte chl_num:10; -#endif - - //DWORD 1 - u1Byte pwdb_all; - u1Byte cfosho[4]; // DW 1 byte 1 DW 2 byte 0 - - //DWORD 2 - s1Byte cfotail[4]; // DW 2 byte 1 DW 3 byte 0 - - //DWORD 3 - s1Byte rxevm[2]; // DW 3 byte 1 DW 3 byte 2 - s1Byte rxsnr[2]; // DW 3 byte 3 DW 4 byte 0 - - //DWORD 4 - u1Byte PCTS_MSK_RPT[2]; - u1Byte pdsnr[2]; // DW 4 byte 3 DW 5 Byte 0 - - //DWORD 5 - u1Byte csi_current[2]; - u1Byte rx_gain_c; - - //DWORD 6 - u1Byte rx_gain_d; - s1Byte sigevm; - u1Byte resvd_0; - u1Byte antidx_anta:3; - u1Byte antidx_antb:3; - u1Byte resvd_1:2; -} PHY_STATUS_RPT_8812_T,*PPHY_STATUS_RPT_8812_T; - - -VOID -odm_Init_RSSIForDM( - IN OUT PDM_ODM_T pDM_Odm - ); - -VOID -ODM_PhyStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ); - -VOID -ODM_MacStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - IN pu1Byte pMacStatus, - IN u1Byte MacID, - IN BOOLEAN bPacketMatchBSSID, - IN BOOLEAN bPacketToSelf, - IN BOOLEAN bPacketBeacon - ); -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP)) - -HAL_STATUS -ODM_ConfigRFWithTxPwrTrackHeaderFile( - IN PDM_ODM_T pDM_Odm - ); - -HAL_STATUS -ODM_ConfigRFWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_Config_Type ConfigType, - IN ODM_RF_RADIO_PATH_E eRFPath - ); - -HAL_STATUS -ODM_ConfigBBWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_BB_Config_Type ConfigType - ); - -HAL_STATUS -ODM_ConfigMACWithHeaderFile( - IN PDM_ODM_T pDM_Odm - ); - -HAL_STATUS -ODM_ConfigFWWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_FW_Config_Type ConfigType, - OUT u1Byte *pFirmware, - OUT u4Byte *pSize - ); - -u4Byte -ODM_GetHWImgVersion( - IN PDM_ODM_T pDM_Odm - ); - -s4Byte -odm_SignalScaleMapping( - IN OUT PDM_ODM_T pDM_Odm, - IN s4Byte CurrSig - ); - -#endif - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.c deleted file mode 100755 index cda06bdaac84..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.c +++ /dev/null @@ -1,197 +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 "Mp_Precomp.h" -#include "odm_precomp.h" - -//================================================= -// This function is for inband noise test utility only -// To obtain the inband noise level(dbm), do the following. -// 1. disable DIG and Power Saving -// 2. Set initial gain = 0x1a -// 3. Stop updating idle time pwer report (for driver read) -// - 0x80c[25] -// -//================================================= - -#define Valid_Min -35 -#define Valid_Max 10 -#define ValidCnt 5 - -s2Byte odm_InbandNoise_Monitor_NSeries(PDM_ODM_T pDM_Odm,u8 bPauseDIG,u8 IGIValue,u32 max_time) -{ - u4Byte tmp4b; - u1Byte max_rf_path=0,rf_path; - u1Byte reg_c50, reg_c58,valid_done=0; - struct noise_level noise_data; - u32 start = 0, func_start=0, func_end = 0; - - func_start = ODM_GetCurrentTime(pDM_Odm); - pDM_Odm->noise_level.noise_all = 0; - - if((pDM_Odm->RFType == ODM_1T2R) ||(pDM_Odm->RFType == ODM_2T2R)) - max_rf_path = 2; - else - max_rf_path = 1; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("odm_DebugControlInbandNoise_Nseries() ==> \n")); - - ODM_Memory_Set(pDM_Odm,&noise_data,0,sizeof(struct noise_level)); - - // - // Step 1. Disable DIG && Set initial gain. - // - - if(bPauseDIG) - { - odm_PauseDIG(pDM_Odm,ODM_PAUSE_DIG,IGIValue); - } - // - // Step 2. Disable all power save for read registers - // - //dcmd_DebugControlPowerSave(pAdapter, PSDisable); - - // - // Step 3. Get noise power level - // - start = ODM_GetCurrentTime(pDM_Odm); - while(1) - { - - //Stop updating idle time pwer report (for driver read) - ODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 1); - - //Read Noise Floor Report - tmp4b = ODM_GetBBReg(pDM_Odm, 0x8f8,bMaskDWord ); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("Noise Floor Report (0x8f8) = 0x%08x\n", tmp4b)); - - //ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, TestInitialGain); - //if(max_rf_path == 2) - // ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, TestInitialGain); - - //update idle time pwer report per 5us - ODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 0); - - noise_data.value[ODM_RF_PATH_A] = (u1Byte)(tmp4b&0xff); - noise_data.value[ODM_RF_PATH_B] = (u1Byte)((tmp4b&0xff00)>>8); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("value_a = 0x%x(%d), value_b = 0x%x(%d)\n", - 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])); - - for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++) - { - noise_data.sval[rf_path] = (s1Byte)noise_data.value[rf_path]; - noise_data.sval[rf_path] /= 2; - } - - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("sval_a = %d, sval_b = %d\n", - noise_data.sval[ODM_RF_PATH_A], noise_data.sval[ODM_RF_PATH_B])); - //ODM_delay_ms(10); - //ODM_sleep_ms(10); - - for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++) - { - if( (noise_data.valid_cnt[rf_path] < ValidCnt) && (noise_data.sval[rf_path] < Valid_Max && noise_data.sval[rf_path] >= Valid_Min)) - { - noise_data.valid_cnt[rf_path]++; - noise_data.sum[rf_path] += noise_data.sval[rf_path]; - 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])); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("Sum of sval = %d, \n", noise_data.sum[rf_path])); - if(noise_data.valid_cnt[rf_path] == ValidCnt) - { - valid_done++; - 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])); - } - - } - - } - - //printk("####### valid_done:%d #############\n",valid_done); - if ((valid_done==max_rf_path) || (ODM_GetProgressingTime(pDM_Odm,start) > max_time)) - { - for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++) - { - //printk("%s PATH_%d - sum = %d, valid_cnt = %d \n",__FUNCTION__,rf_path,noise_data.sum[rf_path], noise_data.valid_cnt[rf_path]); - if(noise_data.valid_cnt[rf_path]) - noise_data.sum[rf_path] /= noise_data.valid_cnt[rf_path]; - else - noise_data.sum[rf_path] = 0; - } - break; - } - } - reg_c50 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XAAGCCore1,bMaskByte0); - reg_c50 &= ~BIT7; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("0x%x = 0x%02x(%d)\n", rOFDM0_XAAGCCore1, reg_c50, reg_c50)); - pDM_Odm->noise_level.noise[ODM_RF_PATH_A] = -110 + reg_c50 + noise_data.sum[ODM_RF_PATH_A]; - pDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_A]; - - if(max_rf_path == 2){ - reg_c58 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XBAGCCore1,bMaskByte0); - reg_c58 &= ~BIT7; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("0x%x = 0x%02x(%d)\n", rOFDM0_XBAGCCore1, reg_c58, reg_c58)); - pDM_Odm->noise_level.noise[ODM_RF_PATH_B] = -110 + reg_c58 + noise_data.sum[ODM_RF_PATH_B]; - pDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_B]; - } - pDM_Odm->noise_level.noise_all /= max_rf_path; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("noise_a = %d, noise_b = %d\n", - pDM_Odm->noise_level.noise[ODM_RF_PATH_A], - pDM_Odm->noise_level.noise[ODM_RF_PATH_B])); - - // - // Step 4. Recover the Dig - // - if(bPauseDIG) - { - odm_PauseDIG(pDM_Odm,ODM_RESUME_DIG,IGIValue); - } - func_end = ODM_GetProgressingTime(pDM_Odm,func_start) ; - //printk("%s noise_a = %d, noise_b = %d noise_all:%d (%d ms)\n",__FUNCTION__, - // pDM_Odm->noise_level.noise[ODM_RF_PATH_A], - // pDM_Odm->noise_level.noise[ODM_RF_PATH_B], - // pDM_Odm->noise_level.noise_all,func_end); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("odm_DebugControlInbandNoise_Nseries() <== \n")); - return pDM_Odm->noise_level.noise_all; - -} -s2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time) -{ - - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES ) - { - //odm_InbandNoise_Monitor_JaguarSeries(pDM_Odm,bPauseDIG,IGIValue,max_time); - return 0; - } - else - { - return odm_InbandNoise_Monitor_NSeries(pDM_VOID,bPauseDIG,IGIValue,max_time); - } -} - - - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.h deleted file mode 100755 index 6625be61633a..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_NoiseMonitor.h +++ /dev/null @@ -1,49 +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 __ODMNOISEMONITOR_H__ -#define __ODMNOISEMONITOR_H__ - -#define ODM_MAX_CHANNEL_NUM 38//14+24 -struct noise_level -{ - //u1Byte value_a, value_b; - u1Byte value[MAX_RF_PATH]; - //s1Byte sval_a, sval_b; - s1Byte sval[MAX_RF_PATH]; - - //s4Byte noise_a=0, noise_b=0,sum_a=0, sum_b=0; - //s4Byte noise[ODM_RF_PATH_MAX]; - s4Byte sum[MAX_RF_PATH]; - //u1Byte valid_cnt_a=0, valid_cnt_b=0, - u1Byte valid[MAX_RF_PATH]; - u1Byte valid_cnt[MAX_RF_PATH]; - -}; - - -typedef struct _ODM_NOISE_MONITOR_ -{ - s1Byte noise[MAX_RF_PATH]; - s2Byte noise_all; -}ODM_NOISE_MONITOR; - -s2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time); - -#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_PathDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_PathDiv.c deleted file mode 100755 index f24e3c465c07..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_PathDiv.c +++ /dev/null @@ -1,1580 +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" - - - -VOID -odm_PathDiversityInit( - IN PVOID pDM_VOID -) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 -} - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -VOID -odm_PathDiversity( - IN PVOID pDM_VOID -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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)) - - - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -// -// 2011/12/02 MH Copy from MP oursrc for temporarily test. -// - -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; -} - -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_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; indexMgntInfo.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((!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")); - 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")); - 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")); - } - -} - -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; -} - -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)); - } - //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; -} - - -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] 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; -} - - -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); -} - - - //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; indexbAssociated) - 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(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 - } -} - - - -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++; - - } - } -} - - -// -// 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; -} - - -//================================================== -//3 PathDiv End -//================================================== - - -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; - -} - - -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. - - 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); - } - -} - - -#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_PathDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_PathDiv.h deleted file mode 100755 index 85791d07da33..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_PathDiv.h +++ /dev/null @@ -1,196 +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 __ODMPATHDIV_H__ -#define __ODMPATHDIV_H__ - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - -VOID -odm_PathDiversityInit( - IN PVOID pDM_VOID - ); - -VOID -odm_PathDiversity( - IN PVOID pDM_VOID - ); - -#endif //(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - -//#define PATHDIV_ENABLE 1 -#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi -#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C - -typedef struct _PathDiv_Parameter_define_ -{ - u4Byte org_5g_RegE30; - u4Byte org_5g_RegC14; - u4Byte org_5g_RegCA0; - u4Byte swt_5g_RegE30; - u4Byte swt_5g_RegC14; - u4Byte swt_5g_RegCA0; - //for 2G IQK information - u4Byte org_2g_RegC80; - u4Byte org_2g_RegC4C; - u4Byte org_2g_RegC94; - u4Byte org_2g_RegC14; - u4Byte org_2g_RegCA0; - - u4Byte swt_2g_RegC80; - u4Byte swt_2g_RegC4C; - u4Byte swt_2g_RegC94; - u4Byte swt_2g_RegC14; - u4Byte swt_2g_RegCA0; -}PATHDIV_PARA,*pPATHDIV_PARA; - -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 - ); - -BOOLEAN -ODM_PathDiversityBeforeLink92C( - //IN PADAPTER Adapter - IN PDM_ODM_T pDM_Odm - ); - -VOID -odm_PathDiversityAfterLink_92C( - IN PADAPTER Adapter - ); - -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 - ); - -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_PathDivChkAntSwitch( - PDM_ODM_T pDM_Odm - ); - -VOID -ODM_CCKPathDiversityChkPerPktRssi( - PADAPTER Adapter, - BOOLEAN bIsDefPort, - BOOLEAN bMatchBSSID, - PRT_WLAN_STA pEntry, - PRT_RFD pRfd, - pu1Byte pDesc - ); - -VOID -ODM_PathDivChkPerPktRssi( - PADAPTER Adapter, - BOOLEAN bIsDefPort, - BOOLEAN bMatchBSSID, - PRT_WLAN_STA pEntry, - PRT_RFD pRfd - ); - -VOID -ODM_PathDivRestAfterLink( - IN PDM_ODM_T pDM_Odm - ); - -VOID -ODM_FillTXPathInTXDESC( - IN PADAPTER Adapter, - IN PRT_TCB pTcb, - IN pu1Byte pDesc - ); - -VOID -odm_PathDivInit_92D( - IN PDM_ODM_T pDM_Odm - ); - -u1Byte -odm_SwAntDivSelectScanChnl( - IN PADAPTER Adapter - ); - -VOID -odm_SwAntDivConstructScanChnl( - IN PADAPTER Adapter, - IN u1Byte ScanChnl - ); - - #endif //#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - - - #endif //#ifndef __ODMPATHDIV_H__ - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RaInfo.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RaInfo.c deleted file mode 100755 index e6dfd55d39eb..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RaInfo.c +++ /dev/null @@ -1,1583 +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" - - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -VOID -odm_RSSIMonitorInit( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; - pRA_Table->firstconnect = FALSE; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - pRA_Table->PT_collision_pre = TRUE; //be used in ODM_DynamicARFBSelect(WIN only) -#endif - -} -#endif - -VOID -odm_RSSIMonitorCheck( - IN PVOID pDM_VOID - ) -{ - // - // For AP/ADSL use prtl8192cd_priv - // For CE/NIC use PADAPTER - // -PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID -odm_RSSIDumpToRegister( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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_RSSIMonitorCheckMP( - IN PVOID pDM_VOID - ) -{ -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PRT_WLAN_STA pEntry = NULL; - u1Byte i; - s4Byte tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff; - u1Byte H2C_Parameter[4] ={0}; - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - PMGNT_INFO pDefaultMgntInfo = &Adapter->MgntInfo; - u8Byte curTxOkCnt = 0, curRxOkCnt = 0; - u1Byte STBC_TX = 0; - BOOLEAN FirstConnect; - pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; - pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; - -#if (BEAMFORMING_SUPPORT == 1) - BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE; - u1Byte TxBF_EN = 0; -#endif - - PADAPTER pLoopAdapter = GetDefaultAdapter(Adapter); - - BOOLEAN bExtRAInfo = FALSE; - - if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821) - bExtRAInfo = TRUE; - - FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE); - pRA_Table->firstconnect = pHalData->bLinked; - H2C_Parameter[3] |= FirstConnect << 5; - - if(pDM_Odm->SupportICType == ODM_RTL8188E && (pDefaultMgntInfo->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; - } - - while(pLoopAdapter) - { - - if(pLoopAdapter != NULL){ - pMgntInfo = &pLoopAdapter->MgntInfo; - curTxOkCnt = pLoopAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt; - curRxOkCnt = pLoopAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt; - pMgntInfo->lastTxOkCnt = curTxOkCnt; - pMgntInfo->lastRxOkCnt = curRxOkCnt; - } - - for(i = 0; i < ASSOCIATE_ENTRY_NUM; i++) - { - - if(IsAPModeExist(pLoopAdapter)) - { - if(GetFirstExtAdapter(pLoopAdapter) != NULL && - GetFirstExtAdapter(pLoopAdapter) == pLoopAdapter){ - pEntry = AsocEntry_EnumStation(pLoopAdapter, i); - } - else if(GetFirstGOPort(pLoopAdapter) != NULL && - IsFirstGoAdapter(pLoopAdapter)){ - pEntry = AsocEntry_EnumStation(pLoopAdapter, i); - } - } - else - { - if(GetDefaultAdapter(pLoopAdapter) == pLoopAdapter){ - pEntry = AsocEntry_EnumStation(pLoopAdapter, 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(bExtRAInfo) - { - -#if (BEAMFORMING_SUPPORT == 1) - Beamform_cap = Beamforming_GetEntryBeamCapByMacId(Adapter, 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(bExtRAInfo) - ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter); - else - ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter); - } - } - else - { - break; - } - } - - pLoopAdapter = GetNextExtAdapter(pLoopAdapter); - } - - 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(bExtRAInfo) - { - PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pDefaultMgntInfo); - PRT_VERY_HIGH_THROUGHPUT pVHTInfo = GET_VHT_INFO(pDefaultMgntInfo); - -#if (BEAMFORMING_SUPPORT == 1) - - Beamform_cap = Beamforming_GetEntryBeamCapByMacId(Adapter, pDefaultMgntInfo->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(bExtRAInfo) - 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); - - { - PADAPTER pLoopAdapter = GetDefaultAdapter(Adapter); - s4Byte GlobalRSSI_min = 0xFF, LocalRSSI_Min; - BOOLEAN bLink= FALSE; - - while(pLoopAdapter) - { - LocalRSSI_Min = odm_FindMinimumRSSI(pLoopAdapter); - //DbgPrint("pHalData->bLinked=%d, LocalRSSI_Min=%d\n", pHalData->bLinked, LocalRSSI_Min); - if((LocalRSSI_Min < GlobalRSSI_min) && (LocalRSSI_Min != 0)) - GlobalRSSI_min = LocalRSSI_Min; - - if(pHalData->bLinked) - bLink = TRUE; - - pLoopAdapter = GetNextExtAdapter(pLoopAdapter); - } - - pHalData->bLinked = bLink; - ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_LINK, (u8Byte)bLink); - ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_RSSI_MIN, (u8Byte)GlobalRSSI_min); - - } - -#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 PVOID pDM_VOID - ) -{ -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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; ipODM_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 - - #if(RTL8188E_SUPPORT==1) - if(pDM_Odm->SupportICType == ODM_RTL8188E){ - rtl8188e_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 PVOID pDM_VOID - ) -{ -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#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) - { - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - prtl8192cd_priv priv = pDM_Odm->priv; - u4Byte i; - PSTA_INFO_T pstat; - static u1Byte H2C_Parameter[5]; - u1Byte TxBF_EN = 0; - pBDC_T pDM_BdcTable = &pDM_Odm->DM_BdcTable; - - if( priv->up_time % 2 ) - return; - - pDM_BdcTable->num_Txbfee_Client=0; - pDM_BdcTable->num_Txbfer_Client=0; - //pDM_BdcTable->num_Client=0; - - for(i=0; ipODM_StaInfo[i]; - if(IS_STA_VALID(pstat) ) - { -#ifdef BEAMFORMING_SUPPORT - BEAMFORMING_CAP Beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, pstat->aid); - if(Beamform_cap == BEAMFORMER_CAP_HT_EXPLICIT || Beamform_cap == BEAMFORMER_CAP_VHT_SU || - Beamform_cap == (BEAMFORMER_CAP_HT_EXPLICIT|BEAMFORMEE_CAP_HT_EXPLICIT) || - Beamform_cap == (BEAMFORMER_CAP_VHT_SU|BEAMFORMEE_CAP_VHT_SU)) - { - TxBF_EN = (1<< 6); - pDM_BdcTable->w_BFee_Client[i]=1; //AP act as BFer - pDM_BdcTable->num_Txbfee_Client++; - } - else - { - pDM_BdcTable->w_BFee_Client[i]=0; //AP act as BFer - } - - if((Beamform_cap & BEAMFORMEE_CAP_HT_EXPLICIT) || (Beamform_cap & BEAMFORMEE_CAP_VHT_SU) ) - { - pDM_BdcTable->w_BFer_Client[i]=1; //AP act as BFee - pDM_BdcTable->num_Txbfer_Client++; - } - else - { - pDM_BdcTable->w_BFer_Client[i]=0; //AP act as BFer - } - - - //pDM_BdcTable->num_Client++; - - - -#endif -//#ifdef STA_EXT -// if (GET_CHIP_VER(priv)==VERSION_8812E && REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1)) -//#endif - { -#ifdef CONFIG_RTL_8812_SUPPORT -#ifdef STA_EXT - if(REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1)) -#endif - - if(pDM_Odm->SupportICType == ODM_RTL8812) { - memset(H2C_Parameter,0,5); - H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0x7F); - H2C_Parameter[0] = REMAP_AID(pstat); - if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) && ( - (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_) -#ifdef RTK_AC_SUPPORT - || (pstat->vht_cap_buf.vht_cap_info & cpu_to_le32(_VHTCAP_RX_STBC_CAP_)) -#endif - ))) - H2C_Parameter[3] |= 2; - H2C_Parameter[3] |= TxBF_EN ; - FillH2CCmd8812(pDM_Odm->priv, H2C_8812_RSSI_REPORT, 4, H2C_Parameter); - } -#endif - } -//#ifdef STA_EXT -// else if (GET_CHIP_VER(priv)!=VERSION_8812E && REMAP_AID(pstat) < (FW_NUM_STAT - 1)) -//#endif - { -#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE) -#ifdef STA_EXT - if(REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1)) -#endif - if(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E) { -// u1Byte H2C_Parameter[5] ={0}; - u1Byte cmdlen = 3; - memset(H2C_Parameter, 0, 5); - H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0xFF); - H2C_Parameter[0] = REMAP_AID(pstat); - if(pDM_Odm->SupportICType == ODM_RTL8192E) { - cmdlen = 4; - if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) && (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_))) - H2C_Parameter[3] |= 2; - H2C_Parameter[3] |= TxBF_EN; - - } - GET_HAL_INTERFACE(pDM_Odm->priv)->FillH2CCmdHandler(pDM_Odm->priv, H2C_88XX_RSSI_REPORT, cmdlen, H2C_Parameter); - } -#endif - -#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) -#ifdef STA_EXT - if(REMAP_AID(pstat) < (FW_NUM_STAT - 1)) -#endif - if(pDM_Odm->SupportICType == ODM_RTL8192C || pDM_Odm->SupportICType == ODM_RTL8192D) - add_update_rssi(pDM_Odm->priv, pstat); -#endif - } - - } - } - } -#endif -#endif - -} - - - - - -VOID -odm_RateAdaptiveMaskInit( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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; - -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - if(pDM_Odm->SupportICType == ODM_RTL8812) - pOdmRA->LdpcThres = 50; - else - pOdmRA->LdpcThres = 35; - - pOdmRA->RtsThres = 35; - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - pOdmRA->LdpcThres = 35; - pOdmRA->bUseLdpc = FALSE; - -#else - pOdmRA->UltraLowRSSIThresh = 9; - -#endif - - pOdmRA->HighRSSIThresh = 50; - pOdmRA->LowRSSIThresh = 20; -} -/*----------------------------------------------------------------------------- - * 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 PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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; - } - -} - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID -odm_RefreshLdpcRtsMP( - IN PADAPTER pAdapter, - IN PDM_ODM_T pDM_Odm, - IN u1Byte mMacId, - IN u1Byte IOTPeer, - IN s4Byte UndecoratedSmoothedPWDB - ) -{ - BOOLEAN bCtlLdpc = FALSE; - PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(pAdapter); - PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive; - - if(pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8812) - return; - - if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A)) - bCtlLdpc = TRUE; - else if( pDM_Odm->SupportICType == ODM_RTL8812 && - IOTPeer == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP) - bCtlLdpc = TRUE; - - if(bCtlLdpc) - { - if(UndecoratedSmoothedPWDB < (pRA->LdpcThres-5)) - MgntSet_TX_LDPC(pAdapter, mMacId, TRUE); - else if(UndecoratedSmoothedPWDB > pRA->LdpcThres) - MgntSet_TX_LDPC(pAdapter, mMacId, FALSE); - } - - if(UndecoratedSmoothedPWDB < (pRA->RtsThres-5)) - pRA->bLowerRtsRate = TRUE; - else if(UndecoratedSmoothedPWDB > pRA->RtsThres) - pRA->bLowerRtsRate = FALSE; -} -#endif - - -VOID -odm_RefreshRateAdaptiveMaskMP( - IN PVOID pDM_VOID - ) -{ -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - PADAPTER pAdapter = pDM_Odm->Adapter; - PADAPTER pTargetAdapter = NULL; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(pAdapter); - - 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))) - { - odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pMgntInfo->mMacId, pMgntInfo->IOTPeer, 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); - } - else if(pDM_Odm->bChangeState) - { - 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, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining)); - 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) - { - odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pEntry->AssociatedMacId, pEntry->IOTPeer, pEntry->rssi_stat.UndecoratedSmoothedPWDB); - - 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); - } - else if(pDM_Odm->bChangeState) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining)); - pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State); - } - } - } - } - } - - if(pMgntInfo->bSetTXPowerTrainingByOid) - pMgntInfo->bSetTXPowerTrainingByOid = FALSE; -#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -} - - - -VOID -odm_RefreshRateAdaptiveMaskCE( - IN PVOID pDM_VOID - ) -{ -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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; ipODM_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 PVOID pDM_VOID - ) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - struct rtl8192cd_priv *priv = pDM_Odm->priv; - struct aid_obj *aidarray; - u4Byte i; - PSTA_INFO_T pstat; - - if(priv->up_time % 2) - return; - - for(i=0; ipODM_StaInfo[i]; - - if(IS_STA_VALID(pstat) ) - { -#if defined(UNIVERSAL_REPEATER) || defined(MBSSID) - aidarray = container_of(pstat, struct aid_obj, station); - priv = aidarray->priv; -#endif - - if (!priv->pmib->dot11StationConfigEntry.autoRate) - continue; - - 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)); - -#if defined(CONFIG_PCI_HCI) -#ifdef CONFIG_WLAN_HAL - if (IS_HAL_CHIP(priv)) { -#ifdef WDS - if(!(pstat->state & WIFI_WDS))//if WDS donot setting -#endif - GET_HAL_INTERFACE(priv)->UpdateHalRAMaskHandler(priv, pstat, pstat->rssi_level); - } else -#endif -#ifdef CONFIG_RTL_8812_SUPPORT - if(GET_CHIP_VER(priv)== VERSION_8812E) { - UpdateHalRAMask8812(priv, pstat, 3); - } else -#endif -#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 - } -#elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - update_STA_RATid(priv, pstat); -#endif - } - } - } -#endif -} - - - -// Return Value: BOOLEAN -// - TRUE: RATRState is changed. -BOOLEAN -ODM_RAStateCheck( - IN PVOID pDM_VOID, - IN s4Byte RSSI, - IN BOOLEAN bForceUpdate, - OUT pu1Byte pRATRState - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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. -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - u1Byte UltraLowRSSIThreshForRA = pRA->UltraLowRSSIThresh; - if(pDM_Odm->SupportICType == ODM_RTL8881A) - LowRSSIThreshForRA = 30; // for LDPC / BCC switch -#endif - - 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; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - case DM_RATR_STA_ULTRA_LOW: - HighRSSIThreshForRA += GoUpGap; - LowRSSIThreshForRA += GoUpGap; - UltraLowRSSIThreshForRA += GoUpGap; - break; -#endif - - 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; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - else if(RSSI > UltraLowRSSIThreshForRA) - RATRState = DM_RATR_STA_LOW; - else - RATRState = DM_RATR_STA_ULTRA_LOW; -#else - else - RATRState = DM_RATR_STA_LOW; -#endif - //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; -} - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -VOID -odm_RefreshBasicRateMask( - IN PVOID pDM_VOID - ) -{ -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 -} -#endif //#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID -ODM_DynamicARFBSelect( - IN PVOID pDM_VOID, - IN u1Byte rate, - IN BOOLEAN Collision_State -) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; - - if(pDM_Odm->SupportICType != ODM_RTL8192E) - return; - - if(Collision_State == pRA_Table->PT_collision_pre) - 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); - } - - - } - - } - pRA_Table->PT_collision_pre = Collision_State; -} - -VOID -ODM_RateAdaptiveStateApInit( - IN PVOID PADAPTER_VOID, - IN PRT_WLAN_STA pEntry - ) -{ - PADAPTER Adapter = (PADAPTER)PADAPTER_VOID; - pEntry->Ratr_State = DM_RATR_STA_INIT; -} -#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - - -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -u4Byte -ODM_Get_Rate_Bitmap( - IN PVOID pDM_VOID, - IN u4Byte macid, - IN u4Byte ra_mask, - IN u1Byte rssi_level - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 //#if (DM_ODM_SUPPORT_TYPE == ODM_CE) \ No newline at end of file diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RaInfo.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RaInfo.h deleted file mode 100755 index 778780780492..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RaInfo.h +++ /dev/null @@ -1,169 +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 __ODMRAINFO_H__ -#define __ODMRAINFO_H__ - -#define AP_InitRateAdaptiveState ODM_RateAdaptiveStateApInit - -#define DM_RATR_STA_INIT 0 -#define DM_RATR_STA_HIGH 1 -#define DM_RATR_STA_MIDDLE 2 -#define DM_RATR_STA_LOW 3 -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#define DM_RATR_STA_ULTRA_LOW 4 -#endif - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -typedef struct _Rate_Adaptive_Table_{ - u1Byte firstconnect; - #if(DM_ODM_SUPPORT_TYPE==ODM_WIN) - BOOLEAN PT_collision_pre; - #endif -}RA_T, *pRA_T; -#endif - - -typedef struct _ODM_RATE_ADAPTIVE -{ - u1Byte Type; // DM_Type_ByFW/DM_Type_ByDriver - u1Byte HighRSSIThresh; // if RSSI > HighRSSIThresh => RATRState is DM_RATR_STA_HIGH - u1Byte LowRSSIThresh; // if RSSI <= LowRSSIThresh => RATRState is DM_RATR_STA_LOW - u1Byte RATRState; // Current RSSI level, DM_RATR_STA_HIGH/DM_RATR_STA_MIDDLE/DM_RATR_STA_LOW - - #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - u1Byte LdpcThres; // if RSSI > LdpcThres => switch from LPDC to BCC - BOOLEAN bLowerRtsRate; - #endif - - #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - u1Byte RtsThres; - #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - BOOLEAN bUseLdpc; - #else - u1Byte UltraLowRSSIThresh; - u4Byte LastRATR; // RATR Register Content - #endif - -} ODM_RATE_ADAPTIVE, *PODM_RATE_ADAPTIVE; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -VOID -odm_RSSIMonitorInit( - IN PVOID pDM_VOID - ); -#endif - -VOID -odm_RSSIMonitorCheck( - IN PVOID pDM_VOID - ); - -#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) -VOID -odm_RSSIDumpToRegister( - IN PVOID pDM_VOID - ); -#endif - -VOID -odm_RSSIMonitorCheckMP( - IN PVOID pDM_VOID - ); - -VOID -odm_RSSIMonitorCheckCE( - IN PVOID pDM_VOID - ); - -VOID -odm_RSSIMonitorCheckAP( - IN PVOID pDM_VOID - ); - - -VOID -odm_RateAdaptiveMaskInit( - IN PVOID pDM_VOID - ); - -VOID -odm_RefreshRateAdaptiveMask( - IN PVOID pDM_VOID - ); - -VOID -odm_RefreshRateAdaptiveMaskMP( - IN PVOID pDM_VOID - ); - -VOID -odm_RefreshRateAdaptiveMaskCE( - IN PVOID pDM_VOID - ); - -VOID -odm_RefreshRateAdaptiveMaskAPADSL( - IN PVOID pDM_VOID - ); - -BOOLEAN -ODM_RAStateCheck( - IN PVOID pDM_VOID, - IN s4Byte RSSI, - IN BOOLEAN bForceUpdate, - OUT pu1Byte pRATRState - ); - -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -VOID -odm_RefreshBasicRateMask( - IN PVOID pDM_VOID - ); -#endif - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID -ODM_DynamicARFBSelect( - IN PVOID pDM_VOID, - IN u1Byte rate, - IN BOOLEAN Collision_State - ); - -VOID -ODM_RateAdaptiveStateApInit( - IN PVOID PADAPTER_VOID, - IN PRT_WLAN_STA pEntry - ); -#endif - -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -u4Byte -ODM_Get_Rate_Bitmap( - IN PVOID pDM_VOID, - IN u4Byte macid, - IN u4Byte ra_mask, - IN u1Byte rssi_level - ); -#endif - -#endif //#ifndef __ODMRAINFO_H__ - - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RegDefine11AC.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RegDefine11AC.h deleted file mode 100755 index 855aa161b8ed..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RegDefine11AC.h +++ /dev/null @@ -1,75 +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_REGDEFINE11AC_H__ -#define __ODM_REGDEFINE11AC_H__ - -//2 RF REG LIST - - - -//2 BB REG LIST -//PAGE 8 -#define ODM_REG_CCK_RPT_FORMAT_11AC 0x804 -#define ODM_REG_BB_RX_PATH_11AC 0x808 -#define ODM_REG_BB_ATC_11AC 0x860 -#define ODM_REG_DBG_RPT_11AC 0x8fc -//PAGE 9 -#define ODM_REG_OFDM_FA_RST_11AC 0x9A4 -#define ODM_REG_NHM_TIMER_11AC 0x990 -#define ODM_REG_NHM_TH9_TH10_11AC 0x994 -#define ODM_REG_NHM_TH3_TO_TH0_11AC 0x998 -#define ODM_REG_NHM_TH7_TO_TH4_11AC 0x99c -#define ODM_REG_NHM_TH8_11AC 0x9a0 -#define ODM_REG_NHM_9E8_11AC 0x9e8 -//PAGE A -#define ODM_REG_CCK_CCA_11AC 0xA0A -#define ODM_REG_CCK_FA_RST_11AC 0xA2C -#define ODM_REG_CCK_FA_11AC 0xA5C -//PAGE B -#define ODM_REG_RST_RPT_11AC 0xB58 -//PAGE C -#define ODM_REG_TRMUX_11AC 0xC08 -#define ODM_REG_IGI_A_11AC 0xC50 -//PAGE E -#define ODM_REG_IGI_B_11AC 0xE50 -//PAGE F -#define ODM_REG_CCK_CCA_CNT_11AC 0xF08 -#define ODM_REG_OFDM_FA_11AC 0xF48 -#define ODM_REG_RPT_11AC 0xfa0 -#define ODM_REG_NHM_CNT_11AC 0xfa8 -//PAGE 18 -#define ODM_REG_IGI_C_11AC 0x1850 -//PAGE 1A -#define ODM_REG_IGI_D_11AC 0x1A50 - -//2 MAC REG LIST -#define ODM_REG_RESP_TX_11AC 0x6D8 - - - -//DIG Related -#define ODM_BIT_IGI_11AC 0xFFFFFFFF -#define ODM_BIT_CCK_RPT_FORMAT_11AC BIT16 -#define ODM_BIT_BB_RX_PATH_11AC 0xF -#define ODM_BIT_BB_ATC_11AC BIT14 - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RegDefine11N.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RegDefine11N.h deleted file mode 100755 index c6e4b186f27b..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_RegDefine11N.h +++ /dev/null @@ -1,180 +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_REGDEFINE11N_H__ -#define __ODM_REGDEFINE11N_H__ - - -//2 RF REG LIST -#define ODM_REG_RF_MODE_11N 0x00 -#define ODM_REG_RF_0B_11N 0x0B -#define ODM_REG_CHNBW_11N 0x18 -#define ODM_REG_T_METER_11N 0x24 -#define ODM_REG_RF_25_11N 0x25 -#define ODM_REG_RF_26_11N 0x26 -#define ODM_REG_RF_27_11N 0x27 -#define ODM_REG_RF_2B_11N 0x2B -#define ODM_REG_RF_2C_11N 0x2C -#define ODM_REG_RXRF_A3_11N 0x3C -#define ODM_REG_T_METER_92D_11N 0x42 -#define ODM_REG_T_METER_88E_11N 0x42 - - - -//2 BB REG LIST -//PAGE 8 -#define ODM_REG_BB_CTRL_11N 0x800 -#define ODM_REG_RF_PIN_11N 0x804 -#define ODM_REG_PSD_CTRL_11N 0x808 -#define ODM_REG_TX_ANT_CTRL_11N 0x80C -#define ODM_REG_BB_PWR_SAV5_11N 0x818 -#define ODM_REG_CCK_RPT_FORMAT_11N 0x824 -#define ODM_REG_RX_DEFUALT_A_11N 0x858 -#define ODM_REG_RX_DEFUALT_B_11N 0x85A -#define ODM_REG_BB_PWR_SAV3_11N 0x85C -#define ODM_REG_ANTSEL_CTRL_11N 0x860 -#define ODM_REG_RX_ANT_CTRL_11N 0x864 -#define ODM_REG_PIN_CTRL_11N 0x870 -#define ODM_REG_BB_PWR_SAV1_11N 0x874 -#define ODM_REG_ANTSEL_PATH_11N 0x878 -#define ODM_REG_BB_3WIRE_11N 0x88C -#define ODM_REG_SC_CNT_11N 0x8C4 -#define ODM_REG_PSD_DATA_11N 0x8B4 -#define ODM_REG_PSD_DATA_11N 0x8B4 -#define ODM_REG_NHM_TIMER_11N 0x894 -#define ODM_REG_NHM_TH9_TH10_11N 0x890 -#define ODM_REG_NHM_TH3_TO_TH0_11N 0x898 -#define ODM_REG_NHM_TH7_TO_TH4_11N 0x89c -#define ODM_REG_NHM_CNT_11N 0x8d8 -//PAGE 9 -#define ODM_REG_DBG_RPT_11N 0x908 -#define ODM_REG_ANT_MAPPING1_11N 0x914 -#define ODM_REG_ANT_MAPPING2_11N 0x918 -//PAGE A -#define ODM_REG_CCK_ANTDIV_PARA1_11N 0xA00 -#define ODM_REG_CCK_CCA_11N 0xA0A -#define ODM_REG_CCK_ANTDIV_PARA2_11N 0xA0C -#define ODM_REG_CCK_ANTDIV_PARA3_11N 0xA10 -#define ODM_REG_CCK_ANTDIV_PARA4_11N 0xA14 -#define ODM_REG_CCK_FILTER_PARA1_11N 0xA22 -#define ODM_REG_CCK_FILTER_PARA2_11N 0xA23 -#define ODM_REG_CCK_FILTER_PARA3_11N 0xA24 -#define ODM_REG_CCK_FILTER_PARA4_11N 0xA25 -#define ODM_REG_CCK_FILTER_PARA5_11N 0xA26 -#define ODM_REG_CCK_FILTER_PARA6_11N 0xA27 -#define ODM_REG_CCK_FILTER_PARA7_11N 0xA28 -#define ODM_REG_CCK_FILTER_PARA8_11N 0xA29 -#define ODM_REG_CCK_FA_RST_11N 0xA2C -#define ODM_REG_CCK_FA_MSB_11N 0xA58 -#define ODM_REG_CCK_FA_LSB_11N 0xA5C -#define ODM_REG_CCK_CCA_CNT_11N 0xA60 -#define ODM_REG_BB_PWR_SAV4_11N 0xA74 -//PAGE B -#define ODM_REG_LNA_SWITCH_11N 0xB2C -#define ODM_REG_PATH_SWITCH_11N 0xB30 -#define ODM_REG_RSSI_CTRL_11N 0xB38 -#define ODM_REG_CONFIG_ANTA_11N 0xB68 -#define ODM_REG_RSSI_BT_11N 0xB9C -//PAGE C -#define ODM_REG_OFDM_FA_HOLDC_11N 0xC00 -#define ODM_REG_BB_RX_PATH_11N 0xC04 -#define ODM_REG_TRMUX_11N 0xC08 -#define ODM_REG_OFDM_FA_RSTC_11N 0xC0C -#define ODM_REG_RXIQI_MATRIX_11N 0xC14 -#define ODM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C -#define ODM_REG_IGI_A_11N 0xC50 -#define ODM_REG_ANTDIV_PARA2_11N 0xC54 -#define ODM_REG_IGI_B_11N 0xC58 -#define ODM_REG_ANTDIV_PARA3_11N 0xC5C -#define ODM_REG_L1SBD_PD_CH_11N 0XC6C -#define ODM_REG_BB_PWR_SAV2_11N 0xC70 -#define ODM_REG_RX_OFF_11N 0xC7C -#define ODM_REG_TXIQK_MATRIXA_11N 0xC80 -#define ODM_REG_TXIQK_MATRIXB_11N 0xC88 -#define ODM_REG_TXIQK_MATRIXA_LSB2_11N 0xC94 -#define ODM_REG_TXIQK_MATRIXB_LSB2_11N 0xC9C -#define ODM_REG_RXIQK_MATRIX_LSB_11N 0xCA0 -#define ODM_REG_ANTDIV_PARA1_11N 0xCA4 -#define ODM_REG_OFDM_FA_TYPE1_11N 0xCF0 -//PAGE D -#define ODM_REG_OFDM_FA_RSTD_11N 0xD00 -#define ODM_REG_BB_ATC_11N 0xD2C -#define ODM_REG_OFDM_FA_TYPE2_11N 0xDA0 -#define ODM_REG_OFDM_FA_TYPE3_11N 0xDA4 -#define ODM_REG_OFDM_FA_TYPE4_11N 0xDA8 -#define ODM_REG_RPT_11N 0xDF4 -//PAGE E -#define ODM_REG_TXAGC_A_6_18_11N 0xE00 -#define ODM_REG_TXAGC_A_24_54_11N 0xE04 -#define ODM_REG_TXAGC_A_1_MCS32_11N 0xE08 -#define ODM_REG_TXAGC_A_MCS0_3_11N 0xE10 -#define ODM_REG_TXAGC_A_MCS4_7_11N 0xE14 -#define ODM_REG_TXAGC_A_MCS8_11_11N 0xE18 -#define ODM_REG_TXAGC_A_MCS12_15_11N 0xE1C -#define ODM_REG_FPGA0_IQK_11N 0xE28 -#define ODM_REG_TXIQK_TONE_A_11N 0xE30 -#define ODM_REG_RXIQK_TONE_A_11N 0xE34 -#define ODM_REG_TXIQK_PI_A_11N 0xE38 -#define ODM_REG_RXIQK_PI_A_11N 0xE3C -#define ODM_REG_TXIQK_11N 0xE40 -#define ODM_REG_RXIQK_11N 0xE44 -#define ODM_REG_IQK_AGC_PTS_11N 0xE48 -#define ODM_REG_IQK_AGC_RSP_11N 0xE4C -#define ODM_REG_BLUETOOTH_11N 0xE6C -#define ODM_REG_RX_WAIT_CCA_11N 0xE70 -#define ODM_REG_TX_CCK_RFON_11N 0xE74 -#define ODM_REG_TX_CCK_BBON_11N 0xE78 -#define ODM_REG_OFDM_RFON_11N 0xE7C -#define ODM_REG_OFDM_BBON_11N 0xE80 -#define ODM_REG_TX2RX_11N 0xE84 -#define ODM_REG_TX2TX_11N 0xE88 -#define ODM_REG_RX_CCK_11N 0xE8C -#define ODM_REG_RX_OFDM_11N 0xED0 -#define ODM_REG_RX_WAIT_RIFS_11N 0xED4 -#define ODM_REG_RX2RX_11N 0xED8 -#define ODM_REG_STANDBY_11N 0xEDC -#define ODM_REG_SLEEP_11N 0xEE0 -#define ODM_REG_PMPD_ANAEN_11N 0xEEC -#define ODM_REG_IGI_C_11N 0xF84 -#define ODM_REG_IGI_D_11N 0xF88 - -//2 MAC REG LIST -#define ODM_REG_BB_RST_11N 0x02 -#define ODM_REG_ANTSEL_PIN_11N 0x4C -#define ODM_REG_EARLY_MODE_11N 0x4D0 -#define ODM_REG_RSSI_MONITOR_11N 0x4FE -#define ODM_REG_EDCA_VO_11N 0x500 -#define ODM_REG_EDCA_VI_11N 0x504 -#define ODM_REG_EDCA_BE_11N 0x508 -#define ODM_REG_EDCA_BK_11N 0x50C -#define ODM_REG_TXPAUSE_11N 0x522 -#define ODM_REG_RESP_TX_11N 0x6D8 -#define ODM_REG_ANT_TRAIN_PARA1_11N 0x7b0 -#define ODM_REG_ANT_TRAIN_PARA2_11N 0x7b4 - - -//DIG Related -#define ODM_BIT_IGI_11N 0x0000007F -#define ODM_BIT_CCK_RPT_FORMAT_11N BIT9 -#define ODM_BIT_BB_RX_PATH_11N 0xF -#define ODM_BIT_BB_ATC_11N BIT11 - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_debug.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_debug.c deleted file mode 100755 index 6dc171a2ad27..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_debug.c +++ /dev/null @@ -1,629 +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" - - -VOID -ODM_InitDebugSetting( - IN PDM_ODM_T pDM_Odm - ) -{ -pDM_Odm->DebugLevel = ODM_DBG_LOUD; - -pDM_Odm->DebugComponents = -\ -#if DBG -//BB Functions -// ODM_COMP_DIG | -// ODM_COMP_RA_MASK | -// ODM_COMP_DYNAMIC_TXPWR | -// ODM_COMP_FA_CNT | -// ODM_COMP_RSSI_MONITOR | -// ODM_COMP_CCK_PD | -// ODM_COMP_ANT_DIV | -// ODM_COMP_PWR_SAVE | -// ODM_COMP_PWR_TRAIN | -// ODM_COMP_RATE_ADAPTIVE | -// ODM_COMP_PATH_DIV | -// ODM_COMP_DYNAMIC_PRICCA | -// ODM_COMP_RXHP | -// ODM_COMP_MP | -// ODM_COMP_CFO_TRACKING | - -//MAC Functions -// ODM_COMP_EDCA_TURBO | -// ODM_COMP_EARLY_MODE | -//RF Functions -// ODM_COMP_TX_PWR_TRACK | -// ODM_COMP_RX_GAIN_TRACK | -// ODM_COMP_CALIBRATION | -//Common -// ODM_COMP_COMMON | -// ODM_COMP_INIT | -// ODM_COMP_PSD | -#endif - 0; -} - -#if 0 -/*------------------Declare variable----------------------- -// Define debug flag array for common debug print macro. */ -u4Byte ODM_DBGP_Type[ODM_DBGP_TYPE_MAX]; - -/* Define debug print header for every service module. */ -ODM_DBGP_HEAD_T ODM_DBGP_Head; - - -/*----------------------------------------------------------------------------- - * Function: DBGP_Flag_Init - * - * Overview: Refresh all debug print control flag content to zero. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 10/20/2006 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void ODM_DBGP_Flag_Init(void) -{ - u1Byte i; - - for (i = 0; i < ODM_DBGP_TYPE_MAX; i++) - { - ODM_DBGP_Type[i] = 0; - } - -#ifndef ADSL_AP_BUILD_WORKAROUND -#if DBG - // 2010/06/02 MH Free build driver can not out any debug message!!! - // Init Debug flag enable condition - - ODM_DBGP_Type[FINIT] = \ -// INIT_EEPROM | -// INIT_TxPower | -// INIT_IQK | -// INIT_RF | - 0; - - ODM_DBGP_Type[FDM] = \ -// WA_IOT | -// DM_PWDB | -// DM_Monitor | -// DM_DIG | -// DM_EDCA_Turbo | -// DM_BT30 | - 0; - - ODM_DBGP_Type[FIOCTL] = \ -// IOCTL_IRP | -// IOCTL_IRP_DETAIL | -// IOCTL_IRP_STATISTICS | -// IOCTL_IRP_HANDLE | -// IOCTL_BT_HCICMD | -// IOCTL_BT_HCICMD_DETAIL | -// IOCTL_BT_HCICMD_EXT | -// IOCTL_BT_EVENT | -// IOCTL_BT_EVENT_DETAIL | -// IOCTL_BT_EVENT_PERIODICAL | -// IOCTL_BT_TX_ACLDATA | -// IOCTL_BT_TX_ACLDATA_DETAIL | -// IOCTL_BT_RX_ACLDATA | -// IOCTL_BT_RX_ACLDATA_DETAIL | -// IOCTL_BT_TP | -// IOCTL_STATE | -// IOCTL_BT_LOGO | -// IOCTL_CALLBACK_FUN | -// IOCTL_PARSE_BT_PKT | - 0; - - ODM_DBGP_Type[FBT] = \ -// BT_TRACE | - 0; - - ODM_DBGP_Type[FEEPROM] = \ -// EEPROM_W | -// EFUSE_PG | -// EFUSE_READ_ALL | -// EFUSE_ANALYSIS | -// EFUSE_PG_DETAIL | - 0; - - ODM_DBGP_Type[FDBG_CTRL] = \ -// DBG_CTRL_TRACE | -// DBG_CTRL_INBAND_NOISE | - 0; - - // 2011/07/20 MH Add for short cut - ODM_DBGP_Type[FSHORT_CUT] = \ -// SHCUT_TX | -// SHCUT_RX | - 0; - -#endif -#endif - /* Define debug header of every service module. */ - //ODM_DBGP_Head.pMANS = "\n\r[MANS] "; - //ODM_DBGP_Head.pRTOS = "\n\r[RTOS] "; - //ODM_DBGP_Head.pALM = "\n\r[ALM] "; - //ODM_DBGP_Head.pPEM = "\n\r[PEM] "; - //ODM_DBGP_Head.pCMPK = "\n\r[CMPK] "; - //ODM_DBGP_Head.pRAPD = "\n\r[RAPD] "; - //ODM_DBGP_Head.pTXPB = "\n\r[TXPB] "; - //ODM_DBGP_Head.pQUMG = "\n\r[QUMG] "; - -} /* DBGP_Flag_Init */ - -#endif - - -#if 0 -u4Byte GlobalDebugLevel = DBG_LOUD; -// -// 2009/06/22 MH Allow Fre build to print none debug info at init time. -// -#if DBG -u8Byte GlobalDebugComponents = \ -// COMP_TRACE | -// COMP_DBG | -// COMP_INIT | -// COMP_OID_QUERY | -// COMP_OID_SET | -// COMP_RECV | -// COMP_SEND | -// COMP_IO | -// COMP_POWER | -// COMP_MLME | -// COMP_SCAN | -// COMP_SYSTEM | -// COMP_SEC | -// COMP_AP | -// COMP_TURBO | -// COMP_QOS | -// COMP_AUTHENTICATOR | -// COMP_BEACON | -// COMP_ANTENNA | -// COMP_RATE | -// COMP_EVENTS | -// COMP_FPGA | -// COMP_RM | -// COMP_MP | -// COMP_RXDESC | -// COMP_CKIP | -// COMP_DIG | -// COMP_TXAGC | -// COMP_HIPWR | -// COMP_HALDM | -// COMP_RSNA | -// COMP_INDIC | -// COMP_LED | -// COMP_RF | -// COMP_DUALMACSWITCH | -// COMP_EASY_CONCURRENT | - -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! -//1//1Attention Please!!!<11n or 8190 specific code should be put below this line> -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! - -// COMP_HT | -// COMP_POWER_TRACKING | -// COMP_RX_REORDER | -// COMP_AMSDU | -// COMP_WPS | -// COMP_RATR | -// COMP_RESET | -// COMP_CMD | -// COMP_EFUSE | -// COMP_MESH_INTERWORKING | -// COMP_CCX | -// COMP_IOCTL | -// COMP_GP | -// COMP_TXAGG | -// COMP_BB_POWERSAVING | -// COMP_SWAS | -// COMP_P2P | -// COMP_MUX | -// COMP_FUNC | -// COMP_TDLS | -// COMP_OMNIPEEK | -// COMP_PSD | - 0; - - -#else -u8Byte GlobalDebugComponents = 0; -#endif - -#if (RT_PLATFORM==PLATFORM_LINUX) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) -EXPORT_SYMBOL(GlobalDebugComponents); -EXPORT_SYMBOL(GlobalDebugLevel); -#endif -#endif - -/*------------------Declare variable----------------------- -// Define debug flag array for common debug print macro. */ -u4Byte DBGP_Type[DBGP_TYPE_MAX]; - -/* Define debug print header for every service module. */ -DBGP_HEAD_T DBGP_Head; - - -/*----------------------------------------------------------------------------- - * Function: DBGP_Flag_Init - * - * Overview: Refresh all debug print control flag content to zero. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 10/20/2006 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void DBGP_Flag_Init(void) -{ - u1Byte i; - - for (i = 0; i < DBGP_TYPE_MAX; i++) - { - DBGP_Type[i] = 0; - } - -#if DBG - // 2010/06/02 MH Free build driver can not out any debug message!!! - // Init Debug flag enable condition - - DBGP_Type[FINIT] = \ -// INIT_EEPROM | -// INIT_TxPower | -// INIT_IQK | -// INIT_RF | - 0; - - DBGP_Type[FDM] = \ -// WA_IOT | -// DM_PWDB | -// DM_Monitor | -// DM_DIG | -// DM_EDCA_Turbo | -// DM_BT30 | - 0; - - DBGP_Type[FIOCTL] = \ -// IOCTL_IRP | -// IOCTL_IRP_DETAIL | -// IOCTL_IRP_STATISTICS | -// IOCTL_IRP_HANDLE | -// IOCTL_BT_HCICMD | -// IOCTL_BT_HCICMD_DETAIL | -// IOCTL_BT_HCICMD_EXT | -// IOCTL_BT_EVENT | -// IOCTL_BT_EVENT_DETAIL | -// IOCTL_BT_EVENT_PERIODICAL | -// IOCTL_BT_TX_ACLDATA | -// IOCTL_BT_TX_ACLDATA_DETAIL | -// IOCTL_BT_RX_ACLDATA | -// IOCTL_BT_RX_ACLDATA_DETAIL | -// IOCTL_BT_TP | -// IOCTL_STATE | -// IOCTL_BT_LOGO | -// IOCTL_CALLBACK_FUN | -// IOCTL_PARSE_BT_PKT | - 0; - - DBGP_Type[FBT] = \ -// BT_TRACE | - 0; - - DBGP_Type[FEEPROM] = \ -// EEPROM_W | -// EFUSE_PG | -// EFUSE_READ_ALL | -// EFUSE_ANALYSIS | -// EFUSE_PG_DETAIL | - 0; - - DBGP_Type[FDBG_CTRL] = \ -// DBG_CTRL_TRACE | -// DBG_CTRL_INBAND_NOISE | - 0; - - // 2011/07/20 MH Add for short cut - DBGP_Type[FSHORT_CUT] = \ -// SHCUT_TX | -// SHCUT_RX | - 0; - -#endif - /* Define debug header of every service module. */ - DBGP_Head.pMANS = "\n\r[MANS] "; - DBGP_Head.pRTOS = "\n\r[RTOS] "; - DBGP_Head.pALM = "\n\r[ALM] "; - DBGP_Head.pPEM = "\n\r[PEM] "; - DBGP_Head.pCMPK = "\n\r[CMPK] "; - DBGP_Head.pRAPD = "\n\r[RAPD] "; - DBGP_Head.pTXPB = "\n\r[TXPB] "; - DBGP_Head.pQUMG = "\n\r[QUMG] "; - -} /* DBGP_Flag_Init */ - - -/*----------------------------------------------------------------------------- - * Function: DBG_PrintAllFlag - * - * Overview: Print All debug flag - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void DBG_PrintAllFlag(void) -{ - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 0 FQoS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 1 FTX\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 2 FRX\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 3 FSEC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 4 FMGNT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 5 FMLME\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 6 FRESOURCE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 7 FBEACON\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 8 FISR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 9 FPHY\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 11 FMP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 12 FPWR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 13 FDM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 14 FDBG_CTRL\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 15 FC2H\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 16 FBT\n")); -} // DBG_PrintAllFlag - - -extern void DBG_PrintAllComp(void) -{ - u1Byte i; - - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents Definition\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT0 COMP_TRACE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT1 COMP_DBG\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT2 COMP_INIT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT3 COMP_OID_QUERY\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT4 COMP_OID_SET\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT5 COMP_RECV\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT6 COMP_SEND\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT7 COMP_IO\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT8 COMP_POWER\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT9 COMP_MLME\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT10 COMP_SCAN\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT11 COMP_SYSTEM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT12 COMP_SEC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT13 COMP_AP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT14 COMP_TURBO\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT15 COMP_QOS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT16 COMP_AUTHENTICATOR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT17 COMP_BEACON\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT18 COMP_BEACON\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT19 COMP_RATE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT20 COMP_EVENTS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT21 COMP_FPGA\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT22 COMP_RM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT23 COMP_MP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT24 COMP_RXDESC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT25 COMP_CKIP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT26 COMP_DIG\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT27 COMP_TXAGC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT28 COMP_HIPWR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT29 COMP_HALDM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT30 COMP_RSNA\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT31 COMP_INDIC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT32 COMP_LED\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT33 COMP_RF\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT34 COMP_HT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT35 COMP_POWER_TRACKING\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT36 COMP_POWER_TRACKING\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT37 COMP_AMSDU\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT38 COMP_WPS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT39 COMP_RATR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT40 COMP_RESET\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT41 COMP_CMD\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT42 COMP_EFUSE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_MESH_INTERWORKING\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_CCX\n")); - - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents = %"i64fmt"x\n", GlobalDebugComponents)); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("Enable DBG COMP =")); - for (i = 0; i < 64; i++) - { - if (GlobalDebugComponents & ((u8Byte)0x1 << i) ) - { - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT%02d |\n", i)); - } - } - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("\n")); - -} // DBG_PrintAllComp - - -/*----------------------------------------------------------------------------- - * Function: DBG_PrintFlagEvent - * - * Overview: Print dedicated debug flag event - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void DBG_PrintFlagEvent(u1Byte DbgFlag) -{ - switch(DbgFlag) - { - case FQoS: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 QoS_INIT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 QoS_VISTA\n")); - break; - - case FTX: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 TX_DESC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 TX_DESC_TID\n")); - break; - - case FRX: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 RX_DATA\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 RX_PHY_STS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 RX_PHY_SS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 RX_PHY_SQ\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 RX_PHY_ASTS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 RX_ERR_LEN\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 RX_DEFRAG\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 RX_ERR_RATE\n")); - break; - - case FSEC: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); - break; - - case FMGNT: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); - break; - - case FMLME: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MEDIA_STS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 LINK_STS\n")); - break; - - case FRESOURCE: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 OS_CHK\n")); - break; - - case FBEACON: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BCN_SHOW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BCN_PEER\n")); - break; - - case FISR: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 ISR_CHK\n")); - break; - - case FPHY: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 PHY_BBR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 PHY_BBW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PHY_RFR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PHY_RFW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PHY_MACR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 PHY_MACW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 PHY_ALLR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 PHY_ALLW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 8 PHY_TXPWR\n")); - break; - - case FMP: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MP_RX\n")); - break; - - case FEEPROM: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 EEPROM_W\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 EFUSE_PG\n")); - break; - - case FPWR: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 LPS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 IPS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PWRSW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PWRHW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PWRHAL\n")); - break; - - case FDM: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 WA_IOT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DM_PWDB\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 DM_Monitor\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 DM_DIG\n")); - break; - - case FDBG_CTRL: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 DBG_CTRL_TRACE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DBG_CTRL_INBAND_NOISE\n")); - break; - - case FC2H: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 C2H_Summary\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 C2H_PacketData\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 C2H_ContentData\n")); - break; - - case FBT: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BT_TRACE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BT_RFPoll\n")); - break; - - default: - break; - } - -} // DBG_PrintFlagEvent - - -extern void DBG_DumpMem(const u1Byte DbgComp, - const u1Byte DbgLevel, - pu1Byte pMem, - u2Byte Len) -{ - u2Byte i; - - for (i=0;i<((Len>>3) + 1);i++) - { - ODM_RT_TRACE(pDM_Odm,DbgComp, DbgLevel, ("%02X %02X %02X %02X %02X %02X %02X %02X\n", - *(pMem+(i*8)), *(pMem+(i*8+1)), *(pMem+(i*8+2)), *(pMem+(i*8+3)), - *(pMem+(i*8+4)), *(pMem+(i*8+5)), *(pMem+(i*8+6)), *(pMem+(i*8+7)))); - - } -} - - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_debug.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_debug.h deleted file mode 100755 index 802d0dfc42f3..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_debug.h +++ /dev/null @@ -1,892 +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_DBG_H__ -#define __ODM_DBG_H__ - - -//----------------------------------------------------------------------------- -// Define the debug levels -// -// 1. DBG_TRACE and DBG_LOUD are used for normal cases. -// So that, they can help SW engineer to develope or trace states changed -// and also help HW enginner to trace every operation to and from HW, -// e.g IO, Tx, Rx. -// -// 2. DBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, -// which help us to debug SW or HW. -// -//----------------------------------------------------------------------------- -// -// Never used in a call to ODM_RT_TRACE()! -// -#define ODM_DBG_OFF 1 - -// -// Fatal bug. -// For example, Tx/Rx/IO locked up, OS hangs, memory access violation, -// resource allocation failed, unexpected HW behavior, HW BUG and so on. -// -#define ODM_DBG_SERIOUS 2 - -// -// Abnormal, rare, or unexpeted cases. -// For example, IRP/Packet/OID canceled, device suprisely unremoved and so on. -// -#define ODM_DBG_WARNING 3 - -// -// Normal case with useful information about current SW or HW state. -// For example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, -// SW protocol state change, dynamic mechanism state change and so on. -// -#define ODM_DBG_LOUD 4 - -// -// Normal case with detail execution flow or information. -// -#define ODM_DBG_TRACE 5 - -//----------------------------------------------------------------------------- -// Define the tracing components -// -//----------------------------------------------------------------------------- -//BB Functions -#define ODM_COMP_DIG BIT0 -#define ODM_COMP_RA_MASK BIT1 -#define ODM_COMP_DYNAMIC_TXPWR BIT2 -#define ODM_COMP_FA_CNT BIT3 -#define ODM_COMP_RSSI_MONITOR BIT4 -#define ODM_COMP_CCK_PD BIT5 -#define ODM_COMP_ANT_DIV BIT6 -#define ODM_COMP_PWR_SAVE BIT7 -#define ODM_COMP_PWR_TRAIN BIT8 -#define ODM_COMP_RATE_ADAPTIVE BIT9 -#define ODM_COMP_PATH_DIV BIT10 -#define ODM_COMP_PSD BIT11 -#define ODM_COMP_DYNAMIC_PRICCA BIT12 -#define ODM_COMP_RXHP BIT13 -#define ODM_COMP_MP BIT14 -#define ODM_COMP_CFO_TRACKING BIT15 -//MAC Functions -#define ODM_COMP_EDCA_TURBO BIT16 -#define ODM_COMP_EARLY_MODE BIT17 -//RF Functions -#define ODM_COMP_TX_PWR_TRACK BIT24 -#define ODM_COMP_RX_GAIN_TRACK BIT25 -#define ODM_COMP_CALIBRATION BIT26 -//Common Functions -#define ODM_COMP_COMMON BIT30 -#define ODM_COMP_INIT BIT31 - -/*------------------------Export Marco Definition---------------------------*/ -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - #define RT_PRINTK DbgPrint -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - #define DbgPrint printk - #define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args); - #define RT_DISP(dbgtype, dbgflag, printstr) -#else - #define DbgPrint panic_printk - #define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args); -#endif - -#ifndef ASSERT - #define ASSERT(expr) -#endif - -#if DBG -#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt) \ - if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel || level == ODM_DBG_SERIOUS)) \ - { \ - RT_PRINTK fmt; \ - } - -#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt) \ - if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel)) \ - { \ - RT_PRINTK fmt; \ - } - -#define ODM_RT_ASSERT(pDM_Odm, expr, fmt) \ - if(!(expr)) { \ - DbgPrint( "Assertion failed! %s at ......\n", #expr); \ - DbgPrint( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ - RT_PRINTK fmt; \ - ASSERT(FALSE); \ - } -#define ODM_dbg_enter() { DbgPrint("==> %s\n", __FUNCTION__); } -#define ODM_dbg_exit() { DbgPrint("<== %s\n", __FUNCTION__); } -#define ODM_dbg_trace(str) { DbgPrint("%s:%s\n", __FUNCTION__, str); } - -#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr) \ - if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel)) \ - { \ - int __i; \ - pu1Byte __ptr = (pu1Byte)ptr; \ - DbgPrint("[ODM] "); \ - DbgPrint(title_str); \ - DbgPrint(" "); \ - for( __i=0; __i<6; __i++ ) \ - DbgPrint("%02X%s", __ptr[__i], (__i==5)?"":"-"); \ - DbgPrint("\n"); \ - } -#else -#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt) -#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt) -#define ODM_RT_ASSERT(pDM_Odm, expr, fmt) -#define ODM_dbg_enter() -#define ODM_dbg_exit() -#define ODM_dbg_trace(str) -#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr) -#endif - - -VOID -ODM_InitDebugSetting( - IN PDM_ODM_T pDM_Odm - ); - - - -#if 0 -#if DBG -#define DbgPrint printk - -#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) \ - { \ - char *szTitle = _TitleString; \ - pu1Byte pbtHexData = _HexData; \ - u4Byte u4bHexDataLen = _HexDataLen; \ - u4Byte __i; \ - DbgPrint("%s", szTitle); \ - for (__i=0;__i=' ' &&_ch<='~' ) // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22. - -#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) \ - if(((_Comp) & ODM_GlobalDebugComponents) && (_Level <= ODM_GlobalDebugLevel)) \ - { \ - int __i; \ - u1Byte buffer[MAX_STR_LEN]; \ - int length = (_Len\n", _Len, buffer); \ - } - -#else // of #if DBG -#define DbgPrint(...) -#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) -#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) -#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr) -#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum) -#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) -#endif // of #if DBG - -#endif - - -#if 0 -/* Define debug print header for every service module.*/ -typedef struct tag_ODM_DBGP_Service_Module_Header_Name_Structure -{ - const char *pMANS; - const char *pRTOS; - const char *pALM; - const char *pPEM; - const char *pCMPK; - const char *pRAPD; - const char *pTXPB; - const char *pQUMG; -}ODM_DBGP_HEAD_T; - - -/* Define different debug flag for dedicated service modules in debug flag array. */ -// Each module has independt 32 bit debug flag you cnn define the flag as yout require. -typedef enum tag_ODM_DBGP_Flag_Type_Definition -{ - ODM_FTX = 0, - ODM_FRX , - ODM_FPHY , - ODM_FPWR , - ODM_FDM , - ODM_FC2H , - ODM_FBT , - ODM_DBGP_TYPE_MAX -}ODM_DBGP_FLAG_E; - - -// Define TX relative debug bit --> FTX -#define ODM_TX_DESC BIT0 -#define ODM_TX_DESC_TID BIT1 -#define ODM_TX_PATH BIT2 - -// Define RX relative debug bit --> FRX -#define ODM_RX_DATA BIT0 -#define ODM_RX_PHY_STS BIT1 -#define ODM_RX_PHY_SS BIT2 -#define ODM_RX_PHY_SQ BIT3 -#define ODM_RX_PHY_ASTS BIT4 -#define ODM_RX_ERR_LEN BIT5 -#define ODM_RX_DEFRAG BIT6 -#define ODM_RX_ERR_RATE BIT7 -#define ODM_RX_PATH BIT8 -#define ODM_RX_BEACON BIT9 - -// Define PHY-BB/RF/MAC check module bit --> FPHY -#define ODM_PHY_BBR BIT0 -#define ODM_PHY_BBW BIT1 -#define ODM_PHY_RFR BIT2 -#define ODM_PHY_RFW BIT3 -#define ODM_PHY_MACR BIT4 -#define ODM_PHY_MACW BIT5 -#define ODM_PHY_ALLR BIT6 -#define ODM_PHY_ALLW BIT7 -#define ODM_PHY_TXPWR BIT8 -#define ODM_PHY_PWRDIFF BIT9 -#define ODM_PHY_SICR BIT10 -#define ODM_PHY_SICW BIT11 - - - - -extern u4Byte ODM_GlobalDebugLevel; - - -#if DBG -extern u8Byte ODM_GlobalDebugComponents; -#endif -#endif -#if 0 - -//----------------------------------------------------------------------------- -// Define the debug levels -// -// 1. DBG_TRACE and DBG_LOUD are used for normal cases. -// So that, they can help SW engineer to develope or trace states changed -// and also help HW enginner to trace every operation to and from HW, -// e.g IO, Tx, Rx. -// -// 2. DBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, -// which help us to debug SW or HW. -// -//----------------------------------------------------------------------------- -// -// Never used in a call to ODM_RT_TRACE(pDM_Odm,)! -// -#define DBG_OFF 0 - -// -// Deprecated! Don't use it! -// TODO: fix related debug message! -// -//#define DBG_SEC 1 - -// -// Fatal bug. -// For example, Tx/Rx/IO locked up, OS hangs, memory access violation, -// resource allocation failed, unexpected HW behavior, HW BUG and so on. -// -#define DBG_SERIOUS 2 - -// -// Abnormal, rare, or unexpeted cases. -// For example, IRP/Packet/OID canceled, device suprisely unremoved and so on. -// -#define DBG_WARNING 3 - -// -// Normal case with useful information about current SW or HW state. -// For example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, -// SW protocol state change, dynamic mechanism state change and so on. -// -#define DBG_LOUD 4 - -// -// Normal case with detail execution flow or information. -// -#define DBG_TRACE 5 - - - -//----------------------------------------------------------------------------- -// Define the tracing components -// -//----------------------------------------------------------------------------- -#define COMP_TRACE BIT0 // For function call tracing. -#define COMP_DBG BIT1 // Only for temporary debug message. -#define COMP_INIT BIT2 // during driver initialization / halt / reset. -#define COMP_OID_QUERY BIT3 // Query OID. -#define COMP_OID_SET BIT4 // Set OID. -#define COMP_RECV BIT5 // Reveive part data path. -#define COMP_SEND BIT6 // Send part path. -#define COMP_IO BIT7 // I/O Related. Added by Annie, 2006-03-02. -#define COMP_POWER BIT8 // 802.11 Power Save mode or System/Device Power state related. -#define COMP_MLME BIT9 // 802.11 link related: join/start BSS, leave BSS. -#define COMP_SCAN BIT10 // For site survey. -#define COMP_SYSTEM BIT11 // For general platform function. -#define COMP_SEC BIT12 // For Security. -#define COMP_AP BIT13 // For AP mode related. -#define COMP_TURBO BIT14 // For Turbo Mode related. By Annie, 2005-10-21. -#define COMP_QOS BIT15 // For QoS. -#define COMP_AUTHENTICATOR BIT16 // For AP mode Authenticator. Added by Annie, 2006-01-30. -#define COMP_BEACON BIT17 // For Beacon related, by rcnjko. -#define COMP_ANTENNA BIT18 // For Antenna diversity related, by rcnjko. -#define COMP_RATE BIT19 // For Rate Adaptive mechanism, 2006.07.02, by rcnjko. #define COMP_EVENTS 0x00000080 // Event handling -#define COMP_EVENTS BIT20 // Event handling -#define COMP_FPGA BIT21 // For FPGA verfication -#define COMP_RM BIT22 // For Radio Measurement. -#define COMP_MP BIT23 // For mass production test, by shien chang, 2006.07.13 -#define COMP_RXDESC BIT24 // Show Rx desc information for SD3 debug. Added by Annie, 2006-07-15. -#define COMP_CKIP BIT25 // For CCX 1 S13: CKIP. Added by Annie, 2006-08-14. -#define COMP_DIG BIT26 // For DIG, 2006.09.25, by rcnjko. -#define COMP_TXAGC BIT27 // For Tx power, 060928, by rcnjko. -#define COMP_HIPWR BIT28 // For High Power Mechanism, 060928, by rcnjko. -#define COMP_HALDM BIT29 // For HW Dynamic Mechanism, 061010, by rcnjko. -#define COMP_RSNA BIT30 // For RSNA IBSS , 061201, by CCW. -#define COMP_INDIC BIT31 // For link indication -#define COMP_LED BIT32 // For LED. -#define COMP_RF BIT33 // For RF. -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! -//1//1Attention Please!!!<11n or 8190 specific code should be put below this line> -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! - -#define COMP_HT BIT34 // For 802.11n HT related information. by Emily 2006-8-11 -#define COMP_POWER_TRACKING BIT35 //FOR 8190 TX POWER TRACKING -#define COMP_RX_REORDER BIT36 // 8190 Rx Reorder -#define COMP_AMSDU BIT37 // For A-MSDU Debugging -#define COMP_WPS BIT38 //WPS Debug Message -#define COMP_RATR BIT39 -#define COMP_RESET BIT40 -// For debug command to print on dbgview!! -#define COMP_CMD BIT41 -#define COMP_EFUSE BIT42 -#define COMP_MESH_INTERWORKING BIT43 -#define COMP_CCX BIT44 //CCX Debug Flag -#define COMP_IOCTL BIT45 // IO Control -#define COMP_GP BIT46 // For generic parser. -#define COMP_TXAGG BIT47 -#define COMP_HVL BIT48 // For Ndis 6.2 Context Swirch and Hardware Virtualiztion Layer -#define COMP_TEST BIT49 -#define COMP_BB_POWERSAVING BIT50 -#define COMP_SWAS BIT51 // For SW Antenna Switch -#define COMP_P2P BIT52 -#define COMP_MUX BIT53 -#define COMP_FUNC BIT54 -#define COMP_TDLS BIT55 -#define COMP_OMNIPEEK BIT56 -#define COMP_DUALMACSWITCH BIT60 // 2010/12/27 Add for Dual mac mode debug -#define COMP_EASY_CONCURRENT BIT61 // 2010/12/27 Add for easy cncurrent mode debug -#define COMP_PSD BIT63 //2011/3/9 Add for WLAN PSD for BT AFH - -#define COMP_DFS BIT62 - -#define COMP_ALL UINT64_C(0xFFFFFFFFFFFFFFFF) // All components -// For debug print flag to use -/*------------------------------Define structure----------------------------*/ -/* 2007/07/13 MH *//*------For DeBuG Print modeue------*/ - -/* Defnie structure to store different debug flag variable. Every debug flag - is a UINT32 integer and you can assign 32 different events. */ -typedef struct tag_DBGP_Debug_Flag_Structure -{ - u4Byte Mans; /* Main Scheduler module. */ - u4Byte Rtos; /* RTOS module. */ - u4Byte Alarm; /* Alarm module. */ - u4Byte Pm; /* Performance monitor module. */ -}DBGP_FLAG_T; - -/* Define debug print header for every service module.*/ -typedef struct tag_DBGP_Service_Module_Header_Name_Structure -{ - const char *pMANS; - const char *pRTOS; - const char *pALM; - const char *pPEM; - const char *pCMPK; - const char *pRAPD; - const char *pTXPB; - const char *pQUMG; -}DBGP_HEAD_T; - - -/* Define different debug flag for dedicated service modules in debug flag array. */ -// Each module has independt 32 bit debug flag you cnn define the flag as yout require. -typedef enum tag_DBGP_Flag_Type_Definition -{ - FQoS = 0, - FTX = 1, - FRX = 2, - FSEC = 3, - FMGNT = 4, - FMLME = 5, - FRESOURCE = 6, - FBEACON = 7, - FISR = 8, - FPHY = 9, - FMP = 10, - FEEPROM = 11, - FPWR = 12, - FDM = 13, - FDBG_CTRL = 14, - FC2H = 15, - FBT = 16, - FINIT = 17, - FIOCTL = 18, - FSHORT_CUT = 19, - DBGP_TYPE_MAX -}DBGP_FLAG_E; - - -// Define Qos Relative debug flag bit --> FQoS -#define QoS_INIT BIT0 -#define QoS_VISTA BIT1 - -// Define TX relative debug bit --> FTX -#define TX_DESC BIT0 -#define TX_DESC_TID BIT1 -#define TX_PATH BIT2 - -// Define RX relative debug bit --> FRX -#define RX_DATA BIT0 -#define RX_PHY_STS BIT1 -#define RX_PHY_SS BIT2 -#define RX_PHY_SQ BIT3 -#define RX_PHY_ASTS BIT4 -#define RX_ERR_LEN BIT5 -#define RX_DEFRAG BIT6 -#define RX_ERR_RATE BIT7 -#define RX_PATH BIT8 -#define RX_BEACON BIT9 - -// Define Security relative debug bit --> FSEC - -// Define MGNT relative debug bit --> FMGNT - -// Define MLME relative debug bit --> FMLME -#define MEDIA_STS BIT0 -#define LINK_STS BIT1 - -// Define OS resource check module bit --> FRESOURCE -#define OS_CHK BIT0 - -// Define beacon content check module bit --> FBEACON -#define BCN_SHOW BIT0 -#define BCN_PEER BIT1 - -// Define ISR/IMR check module bit --> FISR -#define ISR_CHK BIT0 - -// Define PHY-BB/RF/MAC check module bit --> FPHY -#define PHY_BBR BIT0 -#define PHY_BBW BIT1 -#define PHY_RFR BIT2 -#define PHY_RFW BIT3 -#define PHY_MACR BIT4 -#define PHY_MACW BIT5 -#define PHY_ALLR BIT6 -#define PHY_ALLW BIT7 -#define PHY_TXPWR BIT8 -#define PHY_PWRDIFF BIT9 -#define PHY_SICR BIT10 -#define PHY_SICW BIT11 - -// Define MPT driver check module bit --> FMP -#define MP_RX BIT0 -#define MP_SWICH_CH BIT1 - -// Define EEPROM and EFUSE check module bit --> FEEPROM -#define EEPROM_W BIT0 -#define EFUSE_PG BIT1 -#define EFUSE_READ_ALL BIT2 -#define EFUSE_ANALYSIS BIT3 -#define EFUSE_PG_DETAIL BIT4 - -// Define power save check module bit --> FPWR -#define LPS BIT0 -#define IPS BIT1 -#define PWRSW BIT2 -#define PWRHW BIT3 -#define PWRHAL BIT4 - -// Define Dynamic Mechanism check module bit --> FDM -#define WA_IOT BIT0 -#define DM_PWDB BIT1 -#define DM_Monitor BIT2 -#define DM_DIG BIT3 -#define DM_EDCA_Turbo BIT4 -#define DM_BT30 BIT5 - -// Define Dbg Control module bit --> FDBG_CTRL -#define DBG_CTRL_TRACE BIT0 -#define DBG_CTRL_INBAND_NOISE BIT1 - -// Define FW C2H Cmd check module bit --> FC2H -#define C2H_Summary BIT0 -#define C2H_PacketData BIT1 -#define C2H_ContentData BIT2 -// Define BT Cmd check module bit --> FBT -#define BT_TRACE BIT0 -#define BT_RFPoll BIT1 - -// Define init check for module bit --> FINIT -#define INIT_EEPROM BIT0 -#define INIT_TxPower BIT1 -#define INIT_IQK BIT2 -#define INIT_RF BIT3 - -// Define IOCTL Cmd check module bit --> FIOCTL -// section 1 : IRP related -#define IOCTL_IRP BIT0 -#define IOCTL_IRP_DETAIL BIT1 -#define IOCTL_IRP_STATISTICS BIT2 -#define IOCTL_IRP_HANDLE BIT3 -// section 2 : HCI command/event -#define IOCTL_BT_HCICMD BIT8 -#define IOCTL_BT_HCICMD_DETAIL BIT9 -#define IOCTL_BT_HCICMD_EXT BIT10 -#define IOCTL_BT_EVENT BIT11 -#define IOCTL_BT_EVENT_DETAIL BIT12 -#define IOCTL_BT_EVENT_PERIODICAL BIT13 -// section 3 : BT tx/rx data and throughput -#define IOCTL_BT_TX_ACLDATA BIT16 -#define IOCTL_BT_TX_ACLDATA_DETAIL BIT17 -#define IOCTL_BT_RX_ACLDATA BIT18 -#define IOCTL_BT_RX_ACLDATA_DETAIL BIT19 -#define IOCTL_BT_TP BIT20 -// section 4 : BT connection state machine. -#define IOCTL_STATE BIT21 -#define IOCTL_BT_LOGO BIT22 -// section 5 : BT function trace -#define IOCTL_CALLBACK_FUN BIT24 -#define IOCTL_PARSE_BT_PKT BIT25 -#define IOCTL_BT_TX_PKT BIT26 -#define IOCTL_BT_FLAG_MON BIT27 - -// -// Define init check for module bit --> FSHORT_CUT -// 2011/07/20 MH Add for short but definition. -// -#define SHCUT_TX BIT0 -#define SHCUT_RX BIT1 - - -/* 2007/07/13 MH *//*------For DeBuG Print modeue------*/ -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export Marco Definition---------------------------*/ -#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) -#define RT_PRINTK(fmt, args...) printk( "%s(): " fmt, __FUNCTION__, ## args); - -#if DBG -#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt) \ - if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel)) \ - { \ - RT_PRINTK fmt; \ - } - -#define RT_TRACE_F(comp, level, fmt) \ - if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel)) \ - { \ - RT_PRINTK fmt; \ - } - -#define RT_ASSERT(expr,fmt) \ - if(!(expr)) { \ - printk( "Assertion failed! %s at ......\n", #expr); \ - printk( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ - } -#define dbg_enter() { printk("==> %s\n", __FUNCTION__); } -#define dbg_exit() { printk("<== %s\n", __FUNCTION__); } -#define dbg_trace(str) { printk("%s:%s\n", __FUNCTION__, str); } -#else -#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt) -#define RT_TRACE_F(comp, level, fmt) -#define RT_ASSERT(expr, fmt) -#define dbg_enter() -#define dbg_exit() -#define dbg_trace(str) -#endif - -#if DBG -#define DbgPrint printk - -#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) \ - { \ - char *szTitle = _TitleString; \ - pu1Byte pbtHexData = _HexData; \ - u4Byte u4bHexDataLen = _HexDataLen; \ - u4Byte __i; \ - DbgPrint("%s", szTitle); \ - for (__i=0;__i=' ' &&_ch<='~' ) // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22. - -#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) \ - if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) \ - { \ - int __i; \ - u1Byte buffer[MAX_STR_LEN]; \ - int length = (_Len\n", _Len, buffer); \ - } - -#else // of #if DBG -#define DbgPrint(...) -#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) -#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) -#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr) -#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum) -#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) -#endif // of #if DBG - - - -#endif // #if (DM_ODM_SUPPORT_TYPE != ODM_WIN) - -#define DEBUG_PRINT 1 - -// Please add new OS's print API by yourself - -//#if (RT_PLATFORM==PLATFORM_WINDOWS) -#if (DEBUG_PRINT == 1) && DBG -#define RT_DISP(dbgtype, dbgflag, printstr)\ -{\ - if (DBGP_Type[dbgtype] & dbgflag)\ - {\ - DbgPrint printstr;\ - }\ -} - -#define RT_DISP_ADDR(dbgtype, dbgflag, printstr, _Ptr)\ -{\ - if (DBGP_Type[dbgtype] & dbgflag)\ - {\ - int __i; \ - pu1Byte ptr = (pu1Byte)_Ptr; \ - DbgPrint printstr; \ - DbgPrint(" "); \ - for( __i=0; __i<6; __i++ ) \ - DbgPrint("%02X%s", ptr[__i], (__i==5)?"":"-"); \ - DbgPrint("\n"); \ - }\ -} - -#define RT_DISP_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\ -{\ - if (DBGP_Type[dbgtype] & dbgflag)\ - {\ - int __i; \ - pu1Byte ptr = (pu1Byte)_HexData; \ - DbgPrint(_TitleString); \ - for( __i=0; __i<(int)_HexDataLen; __i++ ) \ - { \ - DbgPrint("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" ");\ - if (((__i + 1) % 16) == 0) DbgPrint("\n");\ - } \ - DbgPrint("\n"); \ - }\ -} - -#define FunctionIn(_comp) ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("==========> %s\n", __FUNCTION__)) -#define FunctionOut(_comp) ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("<========== %s\n", __FUNCTION__)) - - -#else - -#define RT_DISP(dbgtype, dbgflag, printstr) -#define RT_DISP_ADDR(dbgtype, dbgflag, printstr, _Ptr) -#define RT_DISP_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen) - -#define FunctionIn(_comp) -#define FunctionOut(_comp) -#endif -/*------------------------Export Marco Definition---------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -extern u4Byte DBGP_Type[DBGP_TYPE_MAX]; -extern DBGP_HEAD_T DBGP_Head; - -/*------------------------Export global variable----------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ -extern void DBGP_Flag_Init(void); -extern void DBG_PrintAllFlag(void); -extern void DBG_PrintAllComp(void); -extern void DBG_PrintFlagEvent(u1Byte DbgFlag); -extern void DBG_DumpMem(const u1Byte DbgComp, - const u1Byte DbgLevel, - pu1Byte pMem, - u2Byte Len); - -/*--------------------------Exported Function prototype---------------------*/ - - - - - - - - - -extern u4Byte GlobalDebugLevel; -extern u8Byte GlobalDebugComponents; - - -#endif - - -#endif // __ODM_DBG_H__ - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_interface.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_interface.c deleted file mode 100755 index 36908dc02580..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_interface.c +++ /dev/null @@ -1,764 +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" - -// -// ODM IO Relative API. -// - -u1Byte -ODM_Read1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - return RTL_R8(RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - return rtw_read8(Adapter,RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - return PlatformEFIORead1Byte(Adapter, RegAddr); -#endif - -} - - -u2Byte -ODM_Read2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - return RTL_R16(RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - return rtw_read16(Adapter,RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - return PlatformEFIORead2Byte(Adapter, RegAddr); -#endif - -} - - -u4Byte -ODM_Read4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - return RTL_R32(RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - return rtw_read32(Adapter,RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - return PlatformEFIORead4Byte(Adapter, RegAddr); -#endif - -} - - -VOID -ODM_Write1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u1Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - RTL_W8(RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - rtw_write8(Adapter,RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformEFIOWrite1Byte(Adapter, RegAddr, Data); -#endif - -} - - -VOID -ODM_Write2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u2Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - RTL_W16(RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - rtw_write16(Adapter,RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformEFIOWrite2Byte(Adapter, RegAddr, Data); -#endif - -} - - -VOID -ODM_Write4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - RTL_W32(RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - rtw_write32(Adapter,RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformEFIOWrite4Byte(Adapter, RegAddr, Data); -#endif - -} - - -VOID -ODM_SetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); -#endif -} - - -u4Byte -ODM_GetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return PHY_QueryMacReg(pDM_Odm->priv, RegAddr, BitMask); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - return PHY_QueryMacReg(Adapter, RegAddr, BitMask); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE)) - return PHY_QueryBBReg(pDM_Odm->Adapter, RegAddr, BitMask); -#endif -} - - -VOID -ODM_SetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); -#endif -} - - -u4Byte -ODM_GetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - return PHY_QueryBBReg(Adapter, RegAddr, BitMask); -#endif -} - - -VOID -ODM_SetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data); -#endif -} - - -u4Byte -ODM_GetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask); -#endif -} - - - - -// -// ODM Memory relative API. -// -VOID -ODM_AllocateMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID *pPtr, - IN u4Byte length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - *pPtr = kmalloc(length, GFP_ATOMIC); -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - *pPtr = rtw_zvmalloc(length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformAllocateMemory(Adapter, pPtr, length); -#endif -} - -// length could be ignored, used to detect memory leakage. -VOID -ODM_FreeMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID pPtr, - IN u4Byte length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - kfree(pPtr); -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - rtw_vmfree(pPtr, length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - //PADAPTER Adapter = pDM_Odm->Adapter; - PlatformFreeMemory(pPtr, length); -#endif -} - -VOID -ODM_MoveMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID pDest, - IN PVOID pSrc, - IN u4Byte Length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - _rtw_memcpy(pDest, pSrc, Length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformMoveMemory(pDest, pSrc, Length); -#endif -} - -void ODM_Memory_Set - (IN PDM_ODM_T pDM_Odm, - IN PVOID pbuf, - IN s1Byte value, - IN u4Byte length) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - _rtw_memset(pbuf,value, length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformFillMemory(pbuf,length,value); -#endif -} -s4Byte ODM_CompareMemory( - IN PDM_ODM_T pDM_Odm, - IN PVOID pBuf1, - IN PVOID pBuf2, - IN u4Byte length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return memcmp(pBuf1,pBuf2,length); -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - return _rtw_memcmp(pBuf1,pBuf2,length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - return PlatformCompareMemory(pBuf1,pBuf2,length); -#endif -} - - - -// -// ODM MISC relative API. -// -VOID -ODM_AcquireSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformAcquireSpinLock(Adapter, type); -#endif -} -VOID -ODM_ReleaseSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformReleaseSpinLock(Adapter, type); -#endif -} - -// -// Work item relative API. FOr MP driver only~! -// -VOID -ODM_InitializeWorkItem( - IN PDM_ODM_T pDM_Odm, - IN PRT_WORK_ITEM pRtWorkItem, - IN RT_WORKITEM_CALL_BACK RtWorkItemCallback, - IN PVOID pContext, - IN const char* szID - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID); -#endif -} - - -VOID -ODM_StartWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformStartWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_StopWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformStopWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_FreeWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformFreeWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_ScheduleWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformScheduleWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_IsWorkItemScheduled( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformIsWorkItemScheduled(pRtWorkItem); -#endif -} - - - -// -// ODM Timer relative API. -// -VOID -ODM_StallExecution( - IN u4Byte usDelay - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_udelay_os(usDelay); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformStallExecution(usDelay); -#endif -} - -VOID -ODM_delay_ms(IN u4Byte ms) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - delay_ms(ms); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_mdelay_os(ms); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - delay_ms(ms); -#endif -} - -VOID -ODM_delay_us(IN u4Byte us) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - delay_us(us); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_udelay_os(us); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformStallExecution(us); -#endif -} - -VOID -ODM_sleep_ms(IN u4Byte ms) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_msleep_os(ms); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) -#endif -} - -VOID -ODM_sleep_us(IN u4Byte us) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_usleep_os(us); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) -#endif -} - -VOID -ODM_SetTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN u4Byte msDelay - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - mod_timer(pTimer, jiffies + (msDelay+9)/10); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - _set_timer(pTimer,msDelay ); //ms -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformSetTimer(Adapter, pTimer, msDelay); -#endif - -} - -VOID -ODM_InitializeTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN RT_TIMER_CALL_BACK CallBackFunc, - IN PVOID pContext, - IN const char* szID - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pTimer->function = CallBackFunc; - pTimer->data = (unsigned long)pDM_Odm; - init_timer(pTimer); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID); -#endif -} - - -VOID -ODM_CancelTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - del_timer_sync(pTimer); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - _cancel_timer_ex(pTimer); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformCancelTimer(Adapter, pTimer); -#endif -} - - -VOID -ODM_ReleaseTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - - PADAPTER Adapter = pDM_Odm->Adapter; - - // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm. - // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail. - if (pTimer == 0) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n")); - return; - } - - PlatformReleaseTimer(Adapter, pTimer); -#endif -} - - -// -// ODM FW relative API. -// -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) -VOID -ODM_FillH2CCmd( - IN PADAPTER Adapter, - IN u1Byte ElementID, - IN u4Byte CmdLen, - IN pu1Byte pCmdBuffer -) -{ - if(IS_HARDWARE_TYPE_JAGUAR(Adapter)) - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - default: - break; - } - - } - else if(IS_HARDWARE_TYPE_8192E(Adapter)) - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - default: - break; - } - } - else if(IS_HARDWARE_TYPE_8723B(Adapter)) - { - // - // We should take RTL8723B into consideration, 2012.10.08 - // - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd8723B(Adapter, H2C_8723B_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - - default: - break; - } - - } - else if(IS_HARDWARE_TYPE_8188E(Adapter)) - { - switch(ElementID) - { - case ODM_H2C_PSD_RESULT: - FillH2CCmd88E(Adapter, H2C_88E_PSD_RESULT, CmdLen, pCmdBuffer); - break; - case ODM_H2C_RSSI_REPORT: - if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter)) - FillH2CCmd88E(Adapter, H2C_88E_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - default: - break; - } - } - else - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - case ODM_H2C_PSD_RESULT: - FillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, CmdLen, pCmdBuffer); - break; - default: - break; - } - } -} -#else -u4Byte -ODM_FillH2CCmd( - IN pu1Byte pH2CBuffer, - IN u4Byte H2CBufferLen, - IN u4Byte CmdNum, - IN pu4Byte pElementID, - IN pu4Byte pCmdLen, - IN pu1Byte* pCmbBuffer, - IN pu1Byte CmdStartSeq - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - //FillH2CCmd(pH2CBuffer, H2CBufferLen, CmdNum, pElementID, pCmdLen, pCmbBuffer, CmdStartSeq); - return FALSE; -#endif - - return TRUE; -} -#endif - - -u4Byte -ODM_GetCurrentTime( - IN PDM_ODM_T pDM_Odm - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return 0; -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - return rtw_get_current_time(); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - return 0; -#endif -} - -s4Byte -ODM_GetProgressingTime( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Start_Time - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return 0; -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - return rtw_get_passing_time_ms(Start_Time); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - return 0; -#endif -} - - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_interface.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_interface.h deleted file mode 100755 index 689318aad4f8..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_interface.h +++ /dev/null @@ -1,400 +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_INTERFACE_H__ -#define __ODM_INTERFACE_H__ - - - -// -// =========== Constant/Structure/Enum/... Define -// - - - -// -// =========== Macro Define -// - -#define _reg_all(_name) ODM_##_name -#define _reg_ic(_name, _ic) ODM_##_name##_ic -#define _bit_all(_name) BIT_##_name -#define _bit_ic(_name, _ic) BIT_##_name##_ic - -// _cat: implemented by Token-Pasting Operator. -#if 0 -#define _cat(_name, _ic_type, _func) \ - ( \ - _func##_all(_name) \ - ) -#endif - -/*=================================== - -#define ODM_REG_DIG_11N 0xC50 -#define ODM_REG_DIG_11AC 0xDDD - -ODM_REG(DIG,_pDM_Odm) -=====================================*/ - -#define _reg_11N(_name) ODM_REG_##_name##_11N -#define _reg_11AC(_name) ODM_REG_##_name##_11AC -#define _bit_11N(_name) ODM_BIT_##_name##_11N -#define _bit_11AC(_name) ODM_BIT_##_name##_11AC - -#if 1 //TODO: enable it if we need to support run-time to differentiate between 92C_SERIES and JAGUAR_SERIES. -#define _cat(_name, _ic_type, _func) \ - ( \ - ((_ic_type) & ODM_IC_11N_SERIES)? _func##_11N(_name): \ - _func##_11AC(_name) \ - ) -#endif -#if 0 // only sample code -#define _cat(_name, _ic_type, _func) \ - ( \ - ((_ic_type) & ODM_RTL8192C)? _func##_ic(_name, _8192C): \ - ((_ic_type) & ODM_RTL8192D)? _func##_ic(_name, _8192D): \ - ((_ic_type) & ODM_RTL8192S)? _func##_ic(_name, _8192S): \ - ((_ic_type) & ODM_RTL8723A)? _func##_ic(_name, _8723A): \ - ((_ic_type) & ODM_RTL8188E)? _func##_ic(_name, _8188E): \ - _func##_ic(_name, _8195) \ - ) -#endif - -// _name: name of register or bit. -// Example: "ODM_REG(R_A_AGC_CORE1, pDM_Odm)" -// gets "ODM_R_A_AGC_CORE1" or "ODM_R_A_AGC_CORE1_8192C", depends on SupportICType. -#define ODM_REG(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _reg) -#define ODM_BIT(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _bit) - -typedef enum _ODM_H2C_CMD -{ - ODM_H2C_RSSI_REPORT = 0, - ODM_H2C_PSD_RESULT=1, - ODM_H2C_PathDiv = 2, - ODM_MAX_H2CCMD -}ODM_H2C_CMD; - - -// -// 2012/02/17 MH For non-MP compile pass only. Linux does not support workitem. -// Suggest HW team to use thread instead of workitem. Windows also support the feature. -// -#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) -typedef void *PRT_WORK_ITEM ; -typedef void RT_WORKITEM_HANDLE,*PRT_WORKITEM_HANDLE; -typedef VOID (*RT_WORKITEM_CALL_BACK)(PVOID pContext); - -#if 0 -typedef struct tasklet_struct RT_WORKITEM_HANDLE, *PRT_WORKITEM_HANDLE; - -typedef struct _RT_WORK_ITEM -{ - - RT_WORKITEM_HANDLE Handle; // Platform-dependent handle for this workitem, e.g. Ndis Workitem object. - PVOID Adapter; // Pointer to Adapter object. - PVOID pContext; // Parameter to passed to CallBackFunc(). - RT_WORKITEM_CALL_BACK CallbackFunc; // Callback function of the workitem. - u1Byte RefCount; // 0: driver is going to unload, 1: No such workitem scheduled, 2: one workitem is schedueled. - PVOID pPlatformExt; // Pointer to platform-dependent extension. - BOOLEAN bFree; - char szID[36]; // An identity string of this workitem. -}RT_WORK_ITEM, *PRT_WORK_ITEM; - -#endif - - -#endif - -// -// =========== Extern Variable ??? It should be forbidden. -// - - -// -// =========== EXtern Function Prototype -// - - -u1Byte -ODM_Read1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ); - -u2Byte -ODM_Read2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ); - -u4Byte -ODM_Read4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ); - -VOID -ODM_Write1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u1Byte Data - ); - -VOID -ODM_Write2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u2Byte Data - ); - -VOID -ODM_Write4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte Data - ); - -VOID -ODM_SetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ); - -u4Byte -ODM_GetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ); - -VOID -ODM_SetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ); - -u4Byte -ODM_GetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ); - -VOID -ODM_SetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ); - -u4Byte -ODM_GetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask - ); - - -// -// Memory Relative Function. -// -VOID -ODM_AllocateMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID *pPtr, - IN u4Byte length - ); -VOID -ODM_FreeMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID pPtr, - IN u4Byte length - ); - -VOID -ODM_MoveMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID pDest, - IN PVOID pSrc, - IN u4Byte Length - ); - -s4Byte ODM_CompareMemory( - IN PDM_ODM_T pDM_Odm, - IN PVOID pBuf1, - IN PVOID pBuf2, - IN u4Byte length - ); - -void ODM_Memory_Set - (IN PDM_ODM_T pDM_Odm, - IN PVOID pbuf, - IN s1Byte value, - IN u4Byte length); - -// -// ODM MISC-spin lock relative API. -// -VOID -ODM_AcquireSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ); - -VOID -ODM_ReleaseSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ); - - -// -// ODM MISC-workitem relative API. -// -VOID -ODM_InitializeWorkItem( - IN PDM_ODM_T pDM_Odm, - IN PRT_WORK_ITEM pRtWorkItem, - IN RT_WORKITEM_CALL_BACK RtWorkItemCallback, - IN PVOID pContext, - IN const char* szID - ); - -VOID -ODM_StartWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ); - -VOID -ODM_StopWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ); - -VOID -ODM_FreeWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ); - -VOID -ODM_ScheduleWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ); - -VOID -ODM_IsWorkItemScheduled( - IN PRT_WORK_ITEM pRtWorkItem - ); - -// -// ODM Timer relative API. -// -VOID -ODM_StallExecution( - IN u4Byte usDelay - ); - -VOID -ODM_delay_ms(IN u4Byte ms); - - - -VOID -ODM_delay_us(IN u4Byte us); - -VOID -ODM_sleep_ms(IN u4Byte ms); - -VOID -ODM_sleep_us(IN u4Byte us); - -VOID -ODM_SetTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN u4Byte msDelay - ); - -VOID -ODM_InitializeTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN RT_TIMER_CALL_BACK CallBackFunc, - IN PVOID pContext, - IN const char* szID - ); - -VOID -ODM_CancelTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ); - -VOID -ODM_ReleaseTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ); - - -// -// ODM FW relative API. -// -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) -VOID -ODM_FillH2CCmd( - IN PADAPTER Adapter, - IN u1Byte ElementID, - IN u4Byte CmdLen, - IN pu1Byte pCmdBuffer -); -#else -u4Byte -ODM_FillH2CCmd( - IN pu1Byte pH2CBuffer, - IN u4Byte H2CBufferLen, - IN u4Byte CmdNum, - IN pu4Byte pElementID, - IN pu4Byte pCmdLen, - IN pu1Byte* pCmbBuffer, - IN pu1Byte CmdStartSeq - ); -#endif - -u4Byte -ODM_GetCurrentTime( - IN PDM_ODM_T pDM_Odm - ); -s4Byte -ODM_GetProgressingTime( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Start_Time - ); - -#endif // __ODM_INTERFACE_H__ - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_precomp.h deleted file mode 100755 index 56264ce63452..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_precomp.h +++ /dev/null @@ -1,315 +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_PRECOMP_H__ -#define __ODM_PRECOMP_H__ - -#include "odm_types.h" - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -#include "Precomp.h" // We need to include mp_precomp.h due to batch file setting. - -#else - -#define TEST_FALG___ 1 - -#endif - -//2 Config Flags and Structs - defined by each ODM Type - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - #include "../8192cd_cfg.h" - #include "../odm_inc.h" - - #include "../8192cd.h" - #include "../8192cd_util.h" - #ifdef _BIG_ENDIAN_ - #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG - #else - #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE - #endif - - #ifdef AP_BUILD_WORKAROUND - #include "../8192cd_headers.h" - #include "../8192cd_debug.h" - #endif - -#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) - // Flags - #include "../8192cd_cfg.h" // OUTSRC needs ADSL config flags. - #include "../odm_inc.h" // OUTSRC needs some extra flags. - // Data Structure - #include "../common_types.h" // OUTSRC and rtl8192cd both needs basic type such as UINT8 and BIT0. - #include "../8192cd.h" // OUTSRC needs basic ADSL struct definition. - #include "../8192cd_util.h" // OUTSRC needs basic I/O function. - #ifdef _BIG_ENDIAN_ - #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG - #else - #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE - #endif - - #ifdef ADSL_AP_BUILD_WORKAROUND - // NESTED_INC: Functions defined outside should not be included!! Marked by Annie, 2011-10-14. - #include "../8192cd_headers.h" - #include "../8192cd_debug.h" - #endif - -#elif (DM_ODM_SUPPORT_TYPE ==ODM_CE) - //#include - //#include - //#include - //#include - //#include - //#include -#define BEAMFORMING_SUPPORT 0 -#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) - #include "Mp_Precomp.h" - #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE -#endif - - -//2 Hardware Parameter Files - - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#if (RTL8192C_SUPPORT==1) - #include "rtl8192c/Hal8192CEFWImg_AP.h" - #include "rtl8192c/Hal8192CEPHYImg_AP.h" - #include "rtl8192c/Hal8192CEMACImg_AP.h" -#endif -#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) - #include "rtl8192c/Hal8192CEFWImg_ADSL.h" - #include "rtl8192c/Hal8192CEPHYImg_ADSL.h" - #include "rtl8192c/Hal8192CEMACImg_ADSL.h" - -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - #if(RTL8192CE_SUPPORT ==1) - #include "rtl8192c/Hal8192CEFWImg_CE.h" - #include "rtl8192c/Hal8192CEPHYImg_CE.h" - #include "rtl8192c/Hal8192CEMACImg_CE.h" - #endif - - #if(RTL8192CU_SUPPORT ==1) - #include "rtl8192c/Hal8192CUFWImg_CE.h" - #include "rtl8192c/Hal8192CUPHYImg_CE.h" - #include "rtl8192c/Hal8192CUMACImg_CE.h" - #endif - - #if(RTL8192DE_SUPPORT ==1) - #include "rtl8192d/Hal8192DEFWImg_CE.h" - #include "rtl8192d/Hal8192DEPHYImg_CE.h" - #include "rtl8192d/Hal8192DEMACImg_CE.h" - #endif - - #if(RTL8192DU_SUPPORT ==1) - #include "rtl8192d/Hal8192DUFWImg_CE.h" - #include "rtl8192d/Hal8192DUPHYImg_CE.h" - #include "rtl8192d/Hal8192DUMACImg_CE.h" - #endif - - #if(RTL8723AS_SUPPORT==1) - #include "rtl8723a/Hal8723SHWImg_CE.h" - #endif - - #if(RTL8723AU_SUPPORT==1) - #include "rtl8723a/Hal8723UHWImg_CE.h" - #endif - -#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) - -#endif - - -//2 OutSrc Header Files - -#include "odm.h" -#include "odm_HWConfig.h" -#include "odm_debug.h" -#include "odm_RegDefine11AC.h" -#include "odm_RegDefine11N.h" -#include "odm_AntDiv.h" -#include "odm_EdcaTurboCheck.h" -#include "odm_DIG.h" -#include "odm_PathDiv.h" -#include "odm_RaInfo.h" -#include "odm_DynamicBBPowerSaving.h" -#include "odm_DynamicTxPower.h" -#include "odm_CfoTracking.h" -#include "odm_NoiseMonitor.h" - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#if (RTL8192C_SUPPORT==1) - #include "rtl8192c/HalDMOutSrc8192C_AP.h" -#endif -#if (RTL8188E_SUPPORT==1) - #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training -#endif - -#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) - #include "rtl8192c/HalDMOutSrc8192C_ADSL.h" - -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - //#include "hal_com.h" - #include "HalPhyRf.h" - #if (RTL8192C_SUPPORT==1) - #ifdef CONFIG_INTEL_PROXIM - #include "../proxim/intel_proxim.h" - #endif - #include "rtl8192c/HalDMOutSrc8192C_CE.h" - #include - #endif - - #if (RTL8192D_SUPPORT==1) - #include "rtl8192d/HalDMOutSrc8192D_CE.h" - #include "rtl8192d_hal.h" - #endif - - #if (RTL8723A_SUPPORT==1) - #include "rtl8192c/HalDMOutSrc8192C_CE.h" //for IQK,LCK,Power-tracking - #include "rtl8723a_hal.h" - #endif - - #if (RTL8188E_SUPPORT==1) - #include "rtl8188e/HalPhyRf_8188e.h"//for IQK,LCK,Power-tracking - #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training - #include "rtl8188e_hal.h" - #endif - - #if (RTL8192E_SUPPORT==1) - #include "rtl8192e/HalPhyRf_8192e.h"//for IQK,LCK,Power-tracking - #include "rtl8192e_hal.h" - #endif - - #if (RTL8812A_SUPPORT==1) - #include "rtl8812a/HalPhyRf_8812A.h"//for IQK,LCK,Power-tracking - #include "rtl8812a_hal.h" - #endif - - #if (RTL8821A_SUPPORT==1) - #include "rtl8821a/HalPhyRf_8821A.h"//for IQK,LCK,Power-tracking - #include "rtl8812a/HalPhyRf_8812A.h"//for IQK,LCK,Power-tracking - #include "rtl8812a_hal.h" - #endif - - #if (RTL8723B_SUPPORT==1) - #include "rtl8723b/HalPhyRf_8723B.h"//for IQK,LCK,Power-tracking - #include "rtl8723b_hal.h" - #endif -#endif - -#include "odm_interface.h" -#include "odm_reg.h" - -#if (RTL8192C_SUPPORT==1) -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#include "rtl8192c/Hal8192CHWImg_MAC.h" -#include "rtl8192c/Hal8192CHWImg_RF.h" -#include "rtl8192c/Hal8192CHWImg_BB.h" -#include "rtl8192c/Hal8192CHWImg_FW.h" -#endif -#include "rtl8192c/odm_RTL8192C.h" -#endif -#if (RTL8192D_SUPPORT==1) -#include "rtl8192d/odm_RTL8192D.h" -#endif - -#if (RTL8723A_SUPPORT==1) -#include "rtl8723a/HalHWImg8723A_MAC.h" -#include "rtl8723a/HalHWImg8723A_RF.h" -#include "rtl8723a/HalHWImg8723A_BB.h" -#include "rtl8723a/HalHWImg8723A_FW.h" -#include "rtl8723a/odm_RegConfig8723A.h" -#endif - -#if (RTL8188E_SUPPORT==1) -#include "rtl8188e/HalHWImg8188E_MAC.h" -#include "rtl8188e/HalHWImg8188E_RF.h" -#include "rtl8188e/HalHWImg8188E_BB.h" -#include "rtl8188e/HalHWImg8188E_FW.h" -#include "rtl8188e/Hal8188EReg.h" - -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) -#include "rtl8188e/HalPhyRf_8188e.h" -#endif - -#if (TESTCHIP_SUPPORT == 1) -#include "rtl8188e/HalHWImg8188E_TestChip_MAC.h" -#include "rtl8188e/HalHWImg8188E_TestChip_RF.h" -#include "rtl8188e/HalHWImg8188E_TestChip_BB.h" -#endif - - -#include "rtl8188e/odm_RegConfig8188E.h" -#include "rtl8188e/odm_RTL8188E.h" -#endif - -#if (RTL8192E_SUPPORT==1) -#include "rtl8192e/HalHWImg8192E_MAC.h" -#include "rtl8192e/HalHWImg8192E_RF.h" -#include "rtl8192e/HalHWImg8192E_BB.h" -#include "rtl8192e/HalHWImg8192E_FW.h" -#include "rtl8192e/Hal8192EReg.h" -#include "rtl8192e/odm_RegConfig8192E.h" -#include "rtl8192e/odm_RTL8192E.h" -#endif - -#if (RTL8723B_SUPPORT==1) -#include "rtl8723b/HalHWImg8723B_MAC.h" -#include "rtl8723b/HalHWImg8723B_RF.h" -#include "rtl8723b/HalHWImg8723B_BB.h" -#include "rtl8723b/HalHWImg8723B_FW.h" -#include "rtl8723b/HalHWImg8723B_MP.h" -#include "rtl8723b/Hal8723BReg.h" -#include "rtl8723b/odm_RTL8723B.h" -#include "rtl8723b/odm_RegConfig8723B.h" -#endif - -#if (RTL8812A_SUPPORT==1) -#include "rtl8812a/HalHWImg8812A_MAC.h" -#include "rtl8812a/HalHWImg8812A_RF.h" -#include "rtl8812a/HalHWImg8812A_BB.h" -#include "rtl8812a/HalHWImg8812A_FW.h" -#include "rtl8812a/odm_RegConfig8812A.h" -#include "rtl8812a/odm_RTL8812A.h" -#if (TESTCHIP_SUPPORT == 1) -#include "rtl8812a/HalHWImg8812A_TestChip_MAC.h" -#include "rtl8812a/HalHWImg8812A_TestChip_RF.h" -#include "rtl8812a/HalHWImg8812A_TestChip_BB.h" -#endif -#endif - - -#if (RTL8821A_SUPPORT==1) -#include "rtl8821a/HalHWImg8821A_MAC.h" -#include "rtl8821a/HalHWImg8821A_RF.h" -#include "rtl8821a/HalHWImg8821A_BB.h" -#include "rtl8821a/HalHWImg8821A_FW.h" -#include "rtl8821a/odm_RegConfig8821A.h" -#include "rtl8821a/odm_RTL8821A.h" -#if (TESTCHIP_SUPPORT == 1) -#include "rtl8821a/HalHWImg8821A_TestChip_MAC.h" -#include "rtl8821a/HalHWImg8821A_TestChip_RF.h" -#include "rtl8821a/HalHWImg8821A_TestChip_BB.h" -#include "rtl8821a/HalHWImg8821A_TestChip_FW.h" -#endif -#endif - -#endif // __ODM_PRECOMP_H__ - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_reg.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_reg.h deleted file mode 100755 index 16999a105193..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_reg.h +++ /dev/null @@ -1,122 +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 - * - * - ******************************************************************************/ -//============================================================ -// File Name: odm_reg.h -// -// Description: -// -// This file is for general register definition. -// -// -//============================================================ -#ifndef __HAL_ODM_REG_H__ -#define __HAL_ODM_REG_H__ - -// -// Register Definition -// - -//MAC REG -#define ODM_BB_RESET 0x002 -#define ODM_DUMMY 0x4fe -#define RF_T_METER_OLD 0x24 -#define RF_T_METER_NEW 0x42 - -#define ODM_EDCA_VO_PARAM 0x500 -#define ODM_EDCA_VI_PARAM 0x504 -#define ODM_EDCA_BE_PARAM 0x508 -#define ODM_EDCA_BK_PARAM 0x50C -#define ODM_TXPAUSE 0x522 - -//BB REG -#define ODM_FPGA_PHY0_PAGE8 0x800 -#define ODM_PSD_SETTING 0x808 -#define ODM_AFE_SETTING 0x818 -#define ODM_TXAGC_B_24_54 0x834 -#define ODM_TXAGC_B_MCS32_5 0x838 -#define ODM_TXAGC_B_MCS0_MCS3 0x83c -#define ODM_TXAGC_B_MCS4_MCS7 0x848 -#define ODM_TXAGC_B_MCS8_MCS11 0x84c -#define ODM_ANALOG_REGISTER 0x85c -#define ODM_RF_INTERFACE_OUTPUT 0x860 -#define ODM_TXAGC_B_MCS12_MCS15 0x868 -#define ODM_TXAGC_B_11_A_2_11 0x86c -#define ODM_AD_DA_LSB_MASK 0x874 -#define ODM_ENABLE_3_WIRE 0x88c -#define ODM_PSD_REPORT 0x8b4 -#define ODM_R_ANT_SELECT 0x90c -#define ODM_CCK_ANT_SELECT 0xa07 -#define ODM_CCK_PD_THRESH 0xa0a -#define ODM_CCK_RF_REG1 0xa11 -#define ODM_CCK_MATCH_FILTER 0xa20 -#define ODM_CCK_RAKE_MAC 0xa2e -#define ODM_CCK_CNT_RESET 0xa2d -#define ODM_CCK_TX_DIVERSITY 0xa2f -#define ODM_CCK_FA_CNT_MSB 0xa5b -#define ODM_CCK_FA_CNT_LSB 0xa5c -#define ODM_CCK_NEW_FUNCTION 0xa75 -#define ODM_OFDM_PHY0_PAGE_C 0xc00 -#define ODM_OFDM_RX_ANT 0xc04 -#define ODM_R_A_RXIQI 0xc14 -#define ODM_R_A_AGC_CORE1 0xc50 -#define ODM_R_A_AGC_CORE2 0xc54 -#define ODM_R_B_AGC_CORE1 0xc58 -#define ODM_R_AGC_PAR 0xc70 -#define ODM_R_HTSTF_AGC_PAR 0xc7c -#define ODM_TX_PWR_TRAINING_A 0xc90 -#define ODM_TX_PWR_TRAINING_B 0xc98 -#define ODM_OFDM_FA_CNT1 0xcf0 -#define ODM_OFDM_PHY0_PAGE_D 0xd00 -#define ODM_OFDM_FA_CNT2 0xda0 -#define ODM_OFDM_FA_CNT3 0xda4 -#define ODM_OFDM_FA_CNT4 0xda8 -#define ODM_TXAGC_A_6_18 0xe00 -#define ODM_TXAGC_A_24_54 0xe04 -#define ODM_TXAGC_A_1_MCS32 0xe08 -#define ODM_TXAGC_A_MCS0_MCS3 0xe10 -#define ODM_TXAGC_A_MCS4_MCS7 0xe14 -#define ODM_TXAGC_A_MCS8_MCS11 0xe18 -#define ODM_TXAGC_A_MCS12_MCS15 0xe1c - -//RF REG -#define ODM_GAIN_SETTING 0x00 -#define ODM_CHANNEL 0x18 - -//Ant Detect Reg -#define ODM_DPDT 0x300 - -//PSD Init -#define ODM_PSDREG 0x808 - -//92D Path Div -#define PATHDIV_REG 0xB30 -#define PATHDIV_TRI 0xBA0 - - -// -// Bitmap Definition -// - -#define BIT_FA_RESET BIT0 - - - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_types.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_types.h deleted file mode 100755 index 4ebbe720b84f..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/odm_types.h +++ /dev/null @@ -1,274 +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 GET_ODM(__pAdapter) ((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->DM_OutSrc))) -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) -#define GET_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) ||(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 - -#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__ - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.c index 13e5e28ec647..e89ce1ed69cf 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.c @@ -26,39 +26,27 @@ #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}}; +const u2Byte dB_Invert_Table[12][8] = { + { 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 -); +/* START------------COMMON INFO RELATED--------------- */ #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) VOID @@ -67,24 +55,13 @@ ODM_UpdateInitRateWorkItemCallback( ); #endif - VOID odm_GlobalAdapterCheck( IN VOID ); -//Remove RAMask by RS_James - - +//move to odm_PowerTacking.h by YuChen -VOID -odm_IQCalibrate( - IN PDM_ODM_T pDM_Odm - ); - -//remove PT by Yuchen - -//Remove Edca by Yu Chen VOID @@ -92,15 +69,51 @@ odm_UpdatePowerTrainingState( IN PDM_ODM_T pDM_Odm ); -VOID -ODM_AsocEntry_Init( - IN PDM_ODM_T pDM_Odm - ); - //============================================================ //3 Export Interface //============================================================ +/*Y = 10*log(X)*/ +s4Byte +ODM_PWdB_Conversion( + IN s4Byte X, + IN u4Byte TotalBit, + IN u4Byte DecimalBit + ) +{ + s4Byte Y, integer = 0, decimal = 0; + u4Byte i; + + if(X == 0) + X = 1; // log2(x), x can't be 0 + + for(i = (TotalBit-1); i > 0; i--) + { + if(X & BIT(i)) + { + integer = i; + if(i > 0) + decimal = (X & BIT(i-1))?2:0; //decimal is 0.5dB*3=1.5dB~=2dB + break; + } + } + + Y = 3*(integer-DecimalBit)+decimal; //10*log(x)=3*log2(x), + + return Y; +} + +s4Byte +ODM_SignConversion( + IN s4Byte value, + IN u4Byte TotalBit + ) +{ + if(value&BIT(TotalBit-1)) + value -= BIT(TotalBit); + return value; +} + VOID ODM_InitMpDriverStatus( IN PDM_ODM_T pDM_Odm @@ -152,13 +165,52 @@ ODM_UpdateMpDriverStatus( #endif } +VOID +PHYDM_InitTRXAntennaSetting( + IN PDM_ODM_T pDM_Odm +) +{ +#if RTL8814A_SUPPORT + u1Byte RxAnt = 0, TxAnt = 0; + + RxAnt = (u1Byte)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_RX_PATH,pDM_Odm), ODM_BIT(BB_RX_PATH,pDM_Odm)); + TxAnt = (u1Byte)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_TX_PATH,pDM_Odm), ODM_BIT(BB_TX_PATH,pDM_Odm)); + pDM_Odm->TRXAntStatus = (RxAnt << 4) + TxAnt; +#endif +} + +VOID +phydm_Init_cck_setting( + IN PDM_ODM_T pDM_Odm +) +{ + u4Byte value_824,value_82c; + + pDM_Odm->bCckHighPower = (BOOLEAN) ODM_GetBBReg(pDM_Odm, ODM_REG(CCK_RPT_FORMAT,pDM_Odm), ODM_BIT(CCK_RPT_FORMAT,pDM_Odm)); + + #if (RTL8192E_SUPPORT == 1) + if(pDM_Odm->SupportICType & (ODM_RTL8192E)) + { + /* 0x824[9] = 0x82C[9] = 0xA80[7] these regiaters settinh should be equal or CCK RSSI report may inaccurate */ + value_824 = ODM_GetBBReg(pDM_Odm, 0x824, BIT9); + value_82c = ODM_GetBBReg(pDM_Odm, 0x82c, BIT9); + + if(value_824 != value_82c) + { + ODM_SetBBReg(pDM_Odm, 0x82c , BIT9, value_824); + } + ODM_SetBBReg(pDM_Odm, 0xa80 , BIT7, value_824); + pDM_Odm->cck_agc_report_type = (BOOLEAN)value_824; + } + #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)); + phydm_Init_cck_setting(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; @@ -166,9 +218,15 @@ odm_CommonInfoSelfInit( PHYDM_InitDebugSetting(pDM_Odm); ODM_InitMpDriverStatus(pDM_Odm); + PHYDM_InitTRXAntennaSetting(pDM_Odm); pDM_Odm->TxRate = 0xFF; + pDM_Odm->number_linked_client = 0; + pDM_Odm->pre_number_linked_client = 0; + pDM_Odm->number_active_client = 0; + pDM_Odm->pre_number_active_client = 0; + } VOID @@ -176,8 +234,8 @@ odm_CommonInfoSelfUpdate( IN PDM_ODM_T pDM_Odm ) { - u1Byte EntryCnt=0; - u1Byte i; + u1Byte EntryCnt = 0, num_active_client = 0; + u4Byte i, OneEntry_MACID = 0, ma_rx_tp = 0; PSTA_INFO_T pEntry; #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) @@ -206,30 +264,68 @@ odm_CommonInfoSelfUpdate( pDM_Odm->bsta_state = FALSE; #endif - - if(*(pDM_Odm->pBandWidth) == ODM_BW40M) +/* THis variable cannot be used because it is wrong*/ +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + 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 + 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 if (*(pDM_Odm->pBandWidth) == ODM_BW80M) { + if (*(pDM_Odm->pSecChOffset) == 1) + pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) + 6; + else if (*(pDM_Odm->pSecChOffset) == 2) + pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) - 6; + } else + pDM_Odm->ControlChannel = *(pDM_Odm->pChannel); +#else + 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); +#endif for (i=0; ipODM_StaInfo[i]; if(IS_STA_VALID(pEntry)) + { EntryCnt++; + if(EntryCnt==1) + { + OneEntry_MACID=i; + } + + #if (DM_ODM_SUPPORT_TYPE == ODM_AP) + ma_rx_tp = (pEntry->rx_byte_cnt_LowMAW)<<3; /* low moving average RX TP ( bit /sec)*/ + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("ClientTP[%d]: ((%d )) bit/sec\n", i, ma_rx_tp)); + + if (ma_rx_tp > ACTIVE_TP_THRESHOLD) + num_active_client++; + #endif + } } if(EntryCnt == 1) + { pDM_Odm->bOneEntryOnly = TRUE; + pDM_Odm->OneEntry_MACID=OneEntry_MACID; + } else pDM_Odm->bOneEntryOnly = FALSE; - // Update MP driver status + pDM_Odm->pre_number_linked_client = pDM_Odm->number_linked_client; + pDM_Odm->pre_number_active_client = pDM_Odm->number_active_client; + + pDM_Odm->number_linked_client = EntryCnt; + pDM_Odm->number_active_client = num_active_client; + + /* Update MP driver status*/ ODM_UpdateMpDriverStatus(pDM_Odm); } @@ -260,6 +356,10 @@ PhyDM_Get_Structure( case PHYDM_CFOTRACK: pStruct = &DM_CfoTrack; break; + + case PHYDM_ADAPTIVITY: + pStruct = &(pDM_Odm->Adaptivity); + break; default: break; @@ -274,6 +374,10 @@ PhyDM_Get_Structure( case PHYDM_CFOTRACK: pStruct = &(pDM_Odm->DM_CfoTrack); break; + + case PHYDM_ADAPTIVITY: + pStruct = &(pDM_Odm->Adaptivity); + break; default: break; @@ -303,23 +407,23 @@ ODM_DMInit( IN PDM_ODM_T pDM_Odm ) { - odm_CommonInfoSelfInit(pDM_Odm); odm_DIGInit(pDM_Odm); Phydm_NHMCounterStatisticsInit(pDM_Odm); Phydm_AdaptivityInit(pDM_Odm); + phydm_ra_info_init(pDM_Odm); odm_RateAdaptiveMaskInit(pDM_Odm); + odm_RA_ParaAdjust_init(pDM_Odm); ODM_CfoTrackingInit(pDM_Odm); ODM_EdcaTurboInit(pDM_Odm); odm_RSSIMonitorInit(pDM_Odm); - odm_TXPowerTrackingInit(pDM_Odm); + phydm_rf_init(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 (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) + phydm_Beamforming_Init(pDM_Odm); +#endif if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES) { @@ -346,22 +450,6 @@ ODM_DMInit( 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 } @@ -373,11 +461,108 @@ ODM_DMReset( IN PDM_ODM_T pDM_Odm ) { - #if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) ODM_AntDivReset(pDM_Odm); - #endif } + +VOID +phydm_support_ablity_debug( + IN PVOID pDM_VOID, + IN u4Byte *const dm_value, + IN u4Byte *_used, + OUT char *output, + IN u4Byte *_out_len + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u4Byte pre_support_ability; + u4Byte used = *_used; + u4Byte out_len = *_out_len; + + pre_support_ability = pDM_Odm->SupportAbility ; + PHYDM_SNPRINTF((output+used, out_len-used,"\n%s\n", "================================")); + if(dm_value[0] == 100) + { + PHYDM_SNPRINTF((output+used, out_len-used, "[Supportablity] PhyDM Selection\n")); + PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "================================")); + PHYDM_SNPRINTF((output+used, out_len-used, "00. (( %s ))DIG \n", ((pDM_Odm->SupportAbility & ODM_BB_DIG)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "01. (( %s ))RA_MASK \n", ((pDM_Odm->SupportAbility & ODM_BB_RA_MASK)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "02. (( %s ))DYNAMIC_TXPWR \n", ((pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "03. (( %s ))FA_CNT \n", ((pDM_Odm->SupportAbility & ODM_BB_FA_CNT)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "04. (( %s ))RSSI_MONITOR \n", ((pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "05. (( %s ))CCK_PD \n", ((pDM_Odm->SupportAbility & ODM_BB_CCK_PD)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "06. (( %s ))ANT_DIV \n", ((pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "07. (( %s ))PWR_SAVE \n", ((pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "08. (( %s ))PWR_TRAIN \n", ((pDM_Odm->SupportAbility & ODM_BB_PWR_TRAIN)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "09. (( %s ))RATE_ADAPTIVE \n", ((pDM_Odm->SupportAbility & ODM_BB_RATE_ADAPTIVE)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "10. (( %s ))PATH_DIV \n", ((pDM_Odm->SupportAbility & ODM_BB_PATH_DIV)?("V"):(".")))); + PHYDM_SNPRINTF((output+used, out_len-used, "11. (( %s ))PSD \n", ((pDM_Odm->SupportAbility & ODM_BB_PSD)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "12. (( %s ))RXHP \n", ((pDM_Odm->SupportAbility & ODM_BB_RXHP)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "13. (( %s ))ADAPTIVITY \n", ((pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "14. (( %s ))CFO_TRACKING \n", ((pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "15. (( %s ))NHM_CNT \n", ((pDM_Odm->SupportAbility & ODM_BB_NHM_CNT)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "16. (( %s ))PRIMARY_CCA \n", ((pDM_Odm->SupportAbility & ODM_BB_PRIMARY_CCA)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "20. (( %s ))EDCA_TURBO \n", ((pDM_Odm->SupportAbility & ODM_MAC_EDCA_TURBO)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "21. (( %s ))EARLY_MODE \n", ((pDM_Odm->SupportAbility & ODM_MAC_EARLY_MODE)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "24. (( %s ))TX_PWR_TRACK \n", ((pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "25. (( %s ))RX_GAIN_TRACK \n", ((pDM_Odm->SupportAbility & ODM_RF_RX_GAIN_TRACK)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used, "26. (( %s ))RF_CALIBRATION \n", ((pDM_Odm->SupportAbility & ODM_RF_CALIBRATION)?("V"):(".")) )); + PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "================================")); + } + /* + else if(dm_value[0] == 101) + { + pDM_Odm->SupportAbility = 0 ; + DbgPrint("Disable all SupportAbility components \n"); + PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "Disable all SupportAbility components")); + } + */ + else + { + + if(dm_value[1] == 1) //enable + { + pDM_Odm->SupportAbility |= BIT(dm_value[0]) ; + if(BIT(dm_value[0]) & ODM_BB_PATH_DIV) + { + odm_PathDiversityInit(pDM_Odm); + } + } + else if(dm_value[1] == 2) //disable + { + pDM_Odm->SupportAbility &= ~(BIT(dm_value[0])) ; + } + else + { + //DbgPrint("\n[Warning!!!] 1:enable, 2:disable \n\n"); + PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "[Warning!!!] 1:enable, 2:disable")); + } + } + PHYDM_SNPRINTF((output+used, out_len-used,"pre-SupportAbility = 0x%x\n", pre_support_ability )); + PHYDM_SNPRINTF((output+used, out_len-used,"Curr-SupportAbility = 0x%x\n", pDM_Odm->SupportAbility )); + PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "================================")); +} + +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +// +//tmp modify for LC Only +// +VOID +ODM_DMWatchdog_LPS( + IN PDM_ODM_T pDM_Odm + ) +{ + odm_CommonInfoSelfUpdate(pDM_Odm); + odm_FalseAlarmCounterStatistics(pDM_Odm); + odm_RSSIMonitorCheck(pDM_Odm); + odm_DIGbyRSSI_LPS(pDM_Odm); + odm_CCKPacketDetectionThresh(pDM_Odm); + odm_CommonInfoSelfReset(pDM_Odm); + + if(*(pDM_Odm->pbPowerSaving)==TRUE) + return; +} +#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 @@ -392,12 +577,24 @@ ODM_DMWatchdog( odm_CommonInfoSelfUpdate(pDM_Odm); phydm_BasicDbgMessage(pDM_Odm); odm_HWSetting(pDM_Odm); + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + { + prtl8192cd_priv priv = pDM_Odm->priv; + if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )//if ACS running, do not do FA/CCA counter read + return; + } +#endif odm_FalseAlarmCounterStatistics(pDM_Odm); odm_RSSIMonitorCheck(pDM_Odm); if(*(pDM_Odm->pbPowerSaving) == TRUE) { odm_DIGbyRSSI_LPS(pDM_Odm); + { + pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; + Phydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue); + } ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("DMWatchdog in power saving mode\n")); return; } @@ -407,9 +604,10 @@ ODM_DMWatchdog( odm_DIG(pDM_Odm); { pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; - pDM_Odm->bAdaOn = Phydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue); + Phydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue); } odm_CCKPacketDetectionThresh(pDM_Odm); + phydm_ra_dynamic_retry_limit(pDM_Odm); odm_RefreshRateAdaptiveMask(pDM_Odm); odm_RefreshBasicRateMask(pDM_Odm); odm_DynamicBBPowerSaving(pDM_Odm); @@ -418,21 +616,14 @@ ODM_DMWatchdog( ODM_CfoTracking(pDM_Odm); odm_DynamicTxPower(pDM_Odm); odm_AntennaDiversity(pDM_Odm); +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) + phydm_Beamforming_Watchdog(pDM_Odm); +#endif -#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - - ODM_TXPowerTrackingCheck(pDM_Odm); + phydm_rf_watchdog(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) @@ -445,13 +636,6 @@ ODM_DMWatchdog( 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 } @@ -562,6 +746,9 @@ ODM_CmnInfoInit( case ODM_CMNINFO_EXT_TRSW: pDM_Odm->ExtTRSW = (u1Byte)Value; break; + case ODM_CMNINFO_EXT_LNA_GAIN: + pDM_Odm->ExtLNAGain = (u1Byte)Value; + break; case ODM_CMNINFO_PATCH_ID: pDM_Odm->PatchID = (u1Byte)Value; break; @@ -580,6 +767,9 @@ ODM_CmnInfoInit( case ODM_CMNINFO_DOMAIN_CODE_5G: pDM_Odm->odm_Regulation5G = (u1Byte)Value; break; + case ODM_CMNINFO_CONFIG_BB_RF: + pDM_Odm->ConfigBBRF = (BOOLEAN)Value; + break; case ODM_CMNINFO_IQKFWOFFLOAD: pDM_Odm->IQKFWOffload = (u1Byte)Value; break; @@ -700,10 +890,17 @@ ODM_CmnInfoHook( pDM_Odm->DM_DigTable.pbP2pLinkInProgress = (u1Byte *)pValue; break; - case ODM_CMNINFO_FCS_MODE: + case ODM_CMNINFO_IS1ANTENNA: + pDM_Odm->pIs1Antenna = (BOOLEAN *)pValue; + break; + + case ODM_CMNINFO_RFDEFAULTPATH: + pDM_Odm->pRFDefaultPath= (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; @@ -751,6 +948,16 @@ ODM_CmnInfoPtrArrayHook( // case ODM_CMNINFO_STA_STATUS: pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue; + + if (IS_STA_VALID(pDM_Odm->pODM_StaInfo[Index])) + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + pDM_Odm->platform2phydm_macid_table[((PSTA_INFO_T)pValue)->AssociatedMacId] = Index; /*AssociatedMacId are unique bttween different Adapter*/ + #elif (DM_ODM_SUPPORT_TYPE == ODM_AP) + pDM_Odm->platform2phydm_macid_table[((PSTA_INFO_T)pValue)->aid] = Index; + #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + pDM_Odm->platform2phydm_macid_table[((PSTA_INFO_T)pValue)->mac_id] = Index; + #endif + break; //To remove the compiler warning, must add an empty default statement to handle the other values. default: @@ -799,7 +1006,7 @@ ODM_CmnInfoUpdate( case ODM_CMNINFO_LINK: pDM_Odm->bLinked = (BOOLEAN)Value; break; - + case ODM_CMNINFO_STATION_STATE: pDM_Odm->bsta_state = (BOOLEAN)Value; break; @@ -822,6 +1029,7 @@ ODM_CmnInfoUpdate( case ODM_CMNINFO_RA_THRESHOLD_LOW: pDM_Odm->RateAdaptive.LowRSSIThresh = (u1Byte)Value; break; +#if defined(BT_30_SUPPORT) && (BT_30_SUPPORT == 1) // The following is for BT HS mode and BT coexist mechanism. case ODM_CMNINFO_BT_ENABLED: pDM_Odm->bBtEnabled = (BOOLEAN)Value; @@ -843,10 +1051,18 @@ ODM_CmnInfoUpdate( pDM_Odm->bBtLimitedDig = (BOOLEAN)Value; break; + case ODM_CMNINFO_BT_DIG: + pDM_Odm->btHsDigVal = (u1Byte)Value; + break; + + case ODM_CMNINFO_BT_BUSY: + pDM_Odm->bBtBusy = (BOOLEAN)Value; + break; + case ODM_CMNINFO_BT_DISABLE_EDCA: pDM_Odm->bBtDisableEdcaTurbo = (BOOLEAN)Value; break; - +#endif #if(DM_ODM_SUPPORT_TYPE & ODM_AP) // for repeater mode add by YuChen 2014.06.23 #ifdef UNIVERSAL_REPEATER @@ -855,6 +1071,11 @@ ODM_CmnInfoUpdate( break; #endif #endif + + case ODM_CMNINFO_AP_TOTAL_NUM: + pDM_Odm->APTotalNum = (u1Byte)Value; + break; + /* case ODM_CMNINFO_OP_MODE: pDM_Odm->OPMode = (u1Byte)Value; @@ -897,21 +1118,23 @@ ODM_CmnInfoUpdate( VOID ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm ) { -#if USE_WORKITEM - PADAPTER pAdapter = pDM_Odm->Adapter; + PADAPTER pAdapter = pDM_Odm->Adapter; +#if USE_WORKITEM +#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) ODM_InitializeWorkItem( pDM_Odm, &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B, (RT_WORKITEM_CALL_BACK)ODM_SW_AntDiv_WorkitemCallback, (PVOID)pAdapter, "AntennaSwitchWorkitem"); - +#endif + #if ((RTL8192C_SUPPORT == 1) && (defined(CONFIG_SW_ANTENNA_DIVERSITY))) ODM_InitializeWorkItem( pDM_Odm, &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem, (RT_WORKITEM_CALL_BACK)odm_SwAntDivChkAntSwitchWorkitemCallback, (PVOID)pAdapter, "AntennaSwitchWorkitem"); - + #endif ODM_InitializeWorkItem( pDM_Odm, @@ -940,16 +1163,14 @@ ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm ) (RT_WORKITEM_CALL_BACK)ODM_UpdateInitRateWorkItemCallback, (PVOID)pAdapter, "RaRptWorkitem"); - -#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) -#if (RTL8188E_SUPPORT == 1) + +#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) ODM_InitializeWorkItem( pDM_Odm, &(pDM_Odm->FastAntTrainingWorkitem), (RT_WORKITEM_CALL_BACK)odm_FastAntTrainingWorkItemCallback, (PVOID)pAdapter, "FastAntTrainingWorkitem"); -#endif #endif ODM_InitializeWorkItem( pDM_Odm, @@ -957,32 +1178,86 @@ ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm ) (RT_WORKITEM_CALL_BACK)odm_PSD_RXHPWorkitemCallback, (PVOID)pAdapter, "PSDRXHP_WorkItem"); -#endif +#endif /*#if USE_WORKITEM*/ + ODM_InitializeWorkItem( + pDM_Odm, + &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_EnterWorkItem), + (RT_WORKITEM_CALL_BACK)halComTxbf_EnterWorkItemCallback, + (PVOID)pAdapter, + "Txbf_EnterWorkIterm"); + + ODM_InitializeWorkItem( + pDM_Odm, + &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_LeaveWorkItem), + (RT_WORKITEM_CALL_BACK)halComTxbf_LeaveWorkItemCallback, + (PVOID)pAdapter, + "Txbf_LeaveWorkIterm"); + + ODM_InitializeWorkItem( + pDM_Odm, + &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaWorkItem), + (RT_WORKITEM_CALL_BACK)halComTxbf_FwNdpaWorkItemCallback, + (PVOID)pAdapter, + "Txbf_FwNdpaWorkIterm"); + + ODM_InitializeWorkItem( + pDM_Odm, + &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ClkWorkItem), + (RT_WORKITEM_CALL_BACK)halComTxbf_ClkWorkItemCallback, + (PVOID)pAdapter, + "Txbf_ClkWorkIterm"); + + ODM_InitializeWorkItem( + pDM_Odm, + &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_RateWorkItem), + (RT_WORKITEM_CALL_BACK)halComTxbf_RateWorkItemCallback, + (PVOID)pAdapter, + "Txbf_ClkWorkIterm"); + + ODM_InitializeWorkItem( + pDM_Odm, + &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_StatusWorkItem), + (RT_WORKITEM_CALL_BACK)halComTxbf_StatusWorkItemCallback, + (PVOID)pAdapter, + "Txbf_StatusWorkItem"); + + ODM_InitializeWorkItem( + pDM_Odm, + &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ResetTxPathWorkItem), + (RT_WORKITEM_CALL_BACK)halComTxbf_ResetTxPathWorkItemCallback, + (PVOID)pAdapter, + "Txbf_ResetTxPathWorkItem"); + + } 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)); - +#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) + ODM_FreeWorkItem(&(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B)); +#endif + 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)); + ODM_FreeWorkItem((&pDM_Odm->sbdcnt_workitem)); #endif + ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_EnterWorkItem)); + ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_LeaveWorkItem)); + ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaWorkItem)); + ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ClkWorkItem)); + ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_RateWorkItem)); + ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_StatusWorkItem)); + ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ResetTxPathWorkItem)); + } -#endif +#endif /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/ /* VOID @@ -1031,55 +1306,6 @@ odm_IsLinked( } */ - -//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 @@ -1091,25 +1317,34 @@ ODM_InitAllTimers( 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, + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) +#ifdef MP_TEST + if (pDM_Odm->priv->pshare->rf_ft_var.mp_specific) + ODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, + (RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, "MPT_DIGTimer"); +#endif +#elif(DM_ODM_SUPPORT_TYPE == ODM_WIN) + ODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, + (RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, "MPT_DIGTimer"); +#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"); + (RT_TIMER_CALL_BACK)odm_PSD_RXHPCallback, NULL, "PSDRXHPTimer"); + ODM_InitializeTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer, + (RT_TIMER_CALL_BACK)phydm_sbd_callback, NULL, "SbdTimer"); + ODM_InitializeTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaTimer, + (RT_TIMER_CALL_BACK)halComTxbf_FwNdpaTimerCallback, NULL, "Txbf_FwNdpaTimer"); + + ODM_InitializeTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.BeamformingTimer, + (RT_TIMER_CALL_BACK)Beamforming_SWTimerCallback, NULL, "BeamformingTimer"); #endif } @@ -1132,20 +1367,27 @@ ODM_CancelAllTimers( ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer); #endif +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) +#ifdef MP_TEST + if (pDM_Odm->priv->pshare->rf_ft_var.mp_specific) + ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer); +#endif +#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) + ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer); +#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); + ODM_CancelTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer); + ODM_CancelTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaTimer); + ODM_CancelTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.BeamformingTimer); #endif + + } @@ -1160,20 +1402,24 @@ ODM_ReleaseAllTimers( ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer); #endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + #ifdef MP_TEST + if (pDM_Odm->priv->pshare->rf_ft_var.mp_specific) + ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer); + #endif +#elif(DM_ODM_SUPPORT_TYPE == ODM_WIN) +ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer); +#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); + ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer); + ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer); + ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaTimer); + ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.BeamformingTimer); #endif } @@ -1182,157 +1428,30 @@ ODM_ReleaseAllTimers( //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============================================================ +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) VOID -odm_AntennaDiversityInit( - IN PDM_ODM_T pDM_Odm -) +ODM_InitAllThreads( + 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 - } + #ifdef TPT_THREAD + kTPT_task_init(pDM_Odm->priv); + #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 +ODM_StopAllThreads( + 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; + #ifdef TPT_THREAD + kTPT_task_stop(pDM_Odm->priv); + #endif } - - -//============================================================ -//EDCA Turbo -//============================================================ - -//Remove Edca by Yuchen +#endif #if( DM_ODM_SUPPORT_TYPE == ODM_WIN) @@ -1352,7 +1471,7 @@ ODM_CheckPowerStatus( // 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")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter\n")); return TRUE; } @@ -1368,6 +1487,37 @@ ODM_CheckPowerStatus( } return TRUE; } +#elif( DM_ODM_SUPPORT_TYPE == ODM_AP) +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,COMP_INIT, 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,COMP_INIT, 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 @@ -1406,7 +1556,7 @@ GetPSDData( 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); + psd_report = (u4Byte) (odm_ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c); #else psd_report = (int) (20*log10((double)psd_report))+(int)(initial_gain_psd-0x1c); #endif @@ -1414,9 +1564,10 @@ GetPSDData( return psd_report; } +#endif u4Byte -ConvertTo_dB( +odm_ConvertTo_dB( u4Byte Value) { u1Byte i; @@ -1424,21 +1575,21 @@ ConvertTo_dB( u4Byte dB; Value = Value & 0xFFFF; - - for (i=0;i<8;i++) + + for (i = 0; i < 12; i++) { - if (Value <= dB_Invert_Table[i][11]) + if (Value <= dB_Invert_Table[i][7]) { break; } } - if (i >= 8) + if (i >= 12) { return (96); // maximum 96 dB } - for (j=0;j<12;j++) + for (j = 0; j < 8; j++) { if (Value <= dB_Invert_Table[i][j]) { @@ -1446,673 +1597,27 @@ ConvertTo_dB( } } - dB = i*12 + j + 1; + dB = (i << 3) + 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 +odm_ConvertTo_linear( + u4Byte Value) { - 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; - -} + u1Byte i; + u1Byte j; + u4Byte linear; + Value = Value & 0xFF; + i = (u1Byte)((Value - 1) >> 3); + j = (u1Byte)(Value-1) - (i << 3); -VOID -ODM_UpdateInitRate( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Rate - ) -{ - u1Byte p = 0; + linear = dB_Invert_Table[i][j]; - 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; + return (linear); } #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) @@ -2155,7 +1660,6 @@ ODM_UpdateInitRateWorkItemCallback( } } #endif -#endif // // ODM multi-port consideration, added by Roger, 2013.10.01. @@ -2395,3 +1899,46 @@ odm_UpdatePowerTrainingState( #endif } + + +/*===========================================================*/ +/* The following is for compile only*/ +/*===========================================================*/ +/*#define TARGET_CHNL_NUM_2G_5G 59*/ +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + +u1Byte GetRightChnlPlaceforIQK(u1Byte chnl) +{ + u1Byte channel_all[TARGET_CHNL_NUM_2G_5G] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 100, + 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 149, 151, 153, 155, 157, 159, 161, 163, 165}; + u1Byte place = chnl; + + + if (chnl > 14) { + for (place = 14; place < sizeof(channel_all); place++) { + if (channel_all[place] == chnl) + return place-13; + } + } + + return 0; +} + +VOID +FillH2CCmd92C( + IN PADAPTER Adapter, + IN u1Byte ElementID, + IN u4Byte CmdLen, + IN pu1Byte pCmdBuffer +) +{} +VOID +PHY_SetTxPowerLevel8192C( + IN PADAPTER Adapter, + IN u1Byte channel + ) +{ +} +#endif +/*===========================================================*/ + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.h index 3a50704ce852..d6aa4b4d2d84 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.h @@ -25,9 +25,12 @@ //============================================================ // include files //============================================================ +#include "phydm_pre_define.h" #include "phydm_DIG.h" #include "phydm_EdcaTurboCheck.h" #include "phydm_PathDiv.h" +#include "phydm_AntDiv.h" +#include "phydm_AntDect.h" #include "phydm_DynamicBBPowerSaving.h" #include "phydm_RaInfo.h" #include "phydm_DynamicTxPower.h" @@ -35,8 +38,18 @@ #include "phydm_ACS.h" #include "phydm_PowerTracking.h" #include "PhyDM_Adaptivity.h" + +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) +#if (RTL8814A_SUPPORT == 1) +#include "rtl8814a/PhyDM_IQK_8814A.h" +#endif +#endif + +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) #include "phydm_NoiseMonitor.h" +#endif #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) +#include "phydm_beamforming.h" #include "phydm_RXHP.h" #endif @@ -60,55 +73,17 @@ // - -// -// Antenna Switch Relative Definition. -// - -// -// 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. -// +//For SW AntDiv, PathDiv, 8192C AntDiv joint use #define TP_MODE 0 #define RSSI_MODE 1 + #define TRAFFIC_LOW 0 #define TRAFFIC_HIGH 1 +#define TRAFFIC_UltraLOW 2 + #define NONE 0 -//============================================================ -//3 Tx Power Tracking -//3============================================================ - - -//============================================================ -//3 PSD Handler -//3============================================================ - -#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 PSD_SCAN_INTERVAL 700 //ms - //8723A High Power IGI Setting @@ -117,20 +92,7 @@ #define DM_DIG_HIGH_PWR_THRESHOLD 0x3a #define DM_DIG_LOW_PWR_THRESHOLD 0x14 -//ANT Test -#define ANTTESTALL 0x00 //Ant A or B will be Testing -#define ANTTESTA 0x01 //Ant A will be Testing -#define ANTTESTB 0x02 //Ant B will be testing - -//for 8723A Ant Definition--2012--06--07 due to different IC may be different ANT define -#define MAIN_ANT 1 //Ant A or Ant Main -#define AUX_ANT 2 //AntB or Ant Aux -#define MAX_ANT 3 // 3 for AP using - -//Antenna Diversity Type -#define SW_ANTDIV 0 -#define HW_ANTDIV 1 //============================================================ // structure and define //============================================================ @@ -165,12 +127,6 @@ typedef struct _WLAN_STA{ #endif -//Remove DIG by Yuchen - -//Remoce BB power saving by Yuchn - -//Remove DIG by yuchen - typedef struct _Dynamic_Primary_CCA{ u1Byte PriCCA_flag; u1Byte intf_flag; @@ -178,168 +134,18 @@ typedef struct _Dynamic_Primary_CCA{ u1Byte DupRTS_flag; u1Byte Monitor_flag; u1Byte CH_offset; - u1Byte MF_state; + u1Byte MF_state; }Pri_CCA_T, *pPri_CCA_T; -//Remove RA_T,*pRA_T by RS_James - -typedef struct _RX_High_Power_ -{ - u1Byte RXHP_flag; - u1Byte PSD_func_trigger; - u1Byte PSD_bitmap_RXHP[80]; - u1Byte Pre_IGI; - u1Byte Cur_IGI; - u1Byte Pre_pw_th; - u1Byte Cur_pw_th; - BOOLEAN First_time_enter; - BOOLEAN RXHP_enable; - u1Byte TP_Mode; - RT_TIMER PSDTimer; -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - #if USE_WORKITEM - RT_WORK_ITEM PSDTimeWorkitem; - #endif -#endif - -}RXHP_T, *pRXHP_T; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_CE)) -#define ASSOCIATE_ENTRY_NUM 32 // Max size of AsocEntry[]. -#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM - -#elif(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#define ASSOCIATE_ENTRY_NUM NUM_STAT -#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1 - -#else -// -// 2012/01/12 MH Revise for compatiable with other SW team. -// 0 is for STA 1-n is for AP clients. -// -#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1// Default port only one -#endif -//#ifdef CONFIG_ANTENNA_DIVERSITY -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 - -#define TP_MODE 0 -#define RSSI_MODE 1 -#define TRAFFIC_LOW 0 -#define TRAFFIC_HIGH 1 -#define TRAFFIC_UltraLOW 2 - -typedef struct _SW_Antenna_Switch_ -{ - u1Byte Double_chk_flag; - u1Byte try_flag; - s4Byte PreRSSI; - u1Byte CurAntenna; - u1Byte PreAntenna; - u1Byte RSSI_Trying; - u1Byte TestMode; - u1Byte bTriggerAntennaSwitch; - u1Byte SelectAntennaMap; - u1Byte RSSI_target; - u1Byte reset_idx; - u2Byte Single_Ant_Counter; - u2Byte Dual_Ant_Counter; - u2Byte Aux_FailDetec_Counter; - u2Byte Retry_Counter; - - // Before link Antenna Switch check - u1Byte SWAS_NoLink_State; - u4Byte SWAS_NoLink_BK_Reg860; - u4Byte SWAS_NoLink_BK_Reg92c; - u4Byte SWAS_NoLink_BK_Reg948; - BOOLEAN ANTA_ON; //To indicate Ant A is or not - BOOLEAN ANTB_ON; //To indicate Ant B is on or not - BOOLEAN Pre_Aux_FailDetec; - BOOLEAN RSSI_AntDect_bResult; - u1Byte Ant5G; - u1Byte Ant2G; - - s4Byte RSSI_sum_A; - s4Byte RSSI_sum_B; - s4Byte RSSI_cnt_A; - s4Byte RSSI_cnt_B; - - u8Byte lastTxOkCnt; - u8Byte lastRxOkCnt; - u8Byte TXByteCnt_A; - u8Byte TXByteCnt_B; - u8Byte RXByteCnt_A; - u8Byte RXByteCnt_B; - u1Byte TrafficLoad; - u1Byte Train_time; - u1Byte Train_time_flag; - RT_TIMER SwAntennaSwitchTimer; -#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) - RT_TIMER SwAntennaSwitchTimer_8723B; - u4Byte PktCnt_SWAntDivByCtrlFrame; - BOOLEAN bSWAntDivByCtrlFrame; -#endif - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - #if USE_WORKITEM - RT_WORK_ITEM SwAntennaSwitchWorkitem; -#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) - RT_WORK_ITEM SwAntennaSwitchWorkitem_8723B; - #endif -#endif -#endif -/* CE Platform use -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - _timer SwAntennaSwitchTimer; - u8Byte lastTxOkCnt; - u8Byte lastRxOkCnt; - u8Byte TXByteCnt_A; - u8Byte TXByteCnt_B; - u8Byte RXByteCnt_A; - u8Byte RXByteCnt_B; - u1Byte DoubleComfirm; - u1Byte TrafficLoad; - //SW Antenna Switch - - -#endif -*/ -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - //Hybrid Antenna Diversity - u4Byte CCK_Ant1_Cnt[ASSOCIATE_ENTRY_NUM+1]; - u4Byte CCK_Ant2_Cnt[ASSOCIATE_ENTRY_NUM+1]; - u4Byte OFDM_Ant1_Cnt[ASSOCIATE_ENTRY_NUM+1]; - u4Byte OFDM_Ant2_Cnt[ASSOCIATE_ENTRY_NUM+1]; - u4Byte RSSI_Ant1_Sum[ASSOCIATE_ENTRY_NUM+1]; - u4Byte RSSI_Ant2_Sum[ASSOCIATE_ENTRY_NUM+1]; - u1Byte TxAnt[ASSOCIATE_ENTRY_NUM+1]; - u1Byte TargetSTA; - u1Byte antsel; - u1Byte RxIdleAnt; - -#endif - -}SWAT_T, *pSWAT_T; -//#endif - -// Edca Remove by YuChen - -//ODM_RATE_ADAPTIVE Remove by RS_James - - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) #ifdef ADSL_AP_BUILD_WORKAROUND #define MAX_TOLERANCE 5 #define IQK_DELAY_TIME 1 //ms #endif - +#if 0//defined in 8192cd.h // // Indicate different AP vendor for IOT issue. // @@ -363,6 +169,7 @@ typedef enum _HT_IOT_PEER HT_IOT_PEER_REALTEK_WOW = 15, HT_IOT_PEER_MAX = 16 }HT_IOT_PEER_E, *PHTIOT_PEER_E; +#endif #endif//#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) #define DM_Type_ByFW 0 @@ -371,19 +178,31 @@ typedef enum _HT_IOT_PEER // // Declare for common info // -#define MAX_PATH_NUM_92CS 2 -#define MAX_PATH_NUM_8188E 1 -#define MAX_PATH_NUM_8192E 2 -#define MAX_PATH_NUM_8723B 1 -#define MAX_PATH_NUM_8812A 2 -#define MAX_PATH_NUM_8821A 1 -#define MAX_PATH_NUM_8814A 4 -#define MAX_PATH_NUM_8822B 2 - #define IQK_THRESHOLD 8 #define DPK_THRESHOLD 4 + +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) +__PACK typedef struct _ODM_Phy_Status_Info_ +{ + u1Byte RxPWDBAll; + u1Byte SignalQuality; // in 0-100 index. + u1Byte RxMIMOSignalStrength[4];// in 0~100 index + s1Byte RxMIMOSignalQuality[4]; //EVM + u1Byte RxSNR[4];//per-path's SNR + u1Byte BandWidth; + +} __WLAN_ATTRIB_PACK__ ODM_PHY_INFO_T, *PODM_PHY_INFO_T; + +typedef struct _ODM_Phy_Status_Info_Append_ +{ + u1Byte MAC_CRC32; + +}ODM_PHY_INFO_Append_T,*PODM_PHY_INFO_Append_T; + +#else + typedef struct _ODM_Phy_Status_Info_ { // @@ -395,7 +214,6 @@ typedef struct _ODM_Phy_Status_Info_ #else u1Byte RxPWDBAll; #endif - u1Byte SignalQuality; // in 0-100 index. s1Byte RxMIMOSignalQuality[4]; //per-path's EVM u1Byte RxMIMOEVMdbm[4]; //per-path's EVM dbm @@ -417,7 +235,7 @@ typedef struct _ODM_Phy_Status_Info_ u1Byte BandWidth; u1Byte btCoexPwrAdjust; }ODM_PHY_INFO_T,*PODM_PHY_INFO_T; - +#endif typedef struct _ODM_Per_Pkt_Info_ { @@ -451,24 +269,6 @@ typedef struct _ODM_Mac_Status_Info_ }ODM_MAC_INFO; - -typedef enum tag_Dynamic_ODM_Support_Ability_Type -{ - // BB Team - ODM_DIG = 0x00000001, - ODM_HIGH_POWER = 0x00000002, - ODM_CCK_CCA_TH = 0x00000004, - ODM_FA_STATISTICS = 0x00000008, - ODM_RAMASK = 0x00000010, - ODM_RSSI_MONITOR = 0x00000020, - ODM_SW_ANTDIV = 0x00000040, - ODM_HW_ANTDIV = 0x00000080, - ODM_BB_PWRSV = 0x00000100, - ODM_2TPATHDIV = 0x00000200, - ODM_1TPATHDIV = 0x00000400, - ODM_PSD2AFH = 0x00000800 -}ODM_Ability_E; - // // 2011/20/20 MH For MP driver RT_WLAN_STA = STA_INFO_T // Please declare below ODM relative info in your STA info structure. @@ -514,8 +314,7 @@ typedef struct _ODM_STA_INFO{ //1 For 88E RA (don't redefine the naming) u1Byte rate_id; u1Byte rate_SGI; - u1Byte rssi_sta_ra; - + u1Byte rssi_sta_ra; u1Byte SGI_enable; u1Byte Decision_rate; u1Byte Pre_rate; @@ -571,10 +370,12 @@ typedef enum _ODM_Common_Info_Definition ODM_CMNINFO_GLNA, ODM_CMNINFO_ALNA, ODM_CMNINFO_EXT_TRSW, + ODM_CMNINFO_EXT_LNA_GAIN, ODM_CMNINFO_PATCH_ID, //CUSTOMER ID ODM_CMNINFO_BINHCT_TEST, ODM_CMNINFO_BWIFI_TEST, ODM_CMNINFO_SMART_CONCURRENT, + ODM_CMNINFO_CONFIG_BB_RF, ODM_CMNINFO_DOMAIN_CODE_2G, ODM_CMNINFO_DOMAIN_CODE_5G, ODM_CMNINFO_IQKFWOFFLOAD, @@ -632,13 +433,15 @@ typedef enum _ODM_Common_Info_Definition ODM_CMNINFO_BT_HS_RSSI, ODM_CMNINFO_BT_OPERATION, ODM_CMNINFO_BT_LIMITED_DIG, //Need to Limited Dig or not + ODM_CMNINFO_BT_DIG, + ODM_CMNINFO_BT_BUSY, //Check Bt is using or not//neil ODM_CMNINFO_BT_DISABLE_EDCA, -#if(DM_ODM_SUPPORT_TYPE & ODM_AP) // for repeater mode add by YuChen 2014.06. +#if(DM_ODM_SUPPORT_TYPE & ODM_AP) // for repeater mode add by YuChen 2014.06.23 #ifdef UNIVERSAL_REPEATER ODM_CMNINFO_VXD_LINK, #endif #endif - + ODM_CMNINFO_AP_TOTAL_NUM, //------------CALL BY VALUE-------------// // @@ -666,7 +469,7 @@ typedef enum _ODM_Support_Ability_Definition ODM_BB_DYNAMIC_TXPWR = BIT2, ODM_BB_FA_CNT = BIT3, ODM_BB_RSSI_MONITOR = BIT4, - ODM_BB_CCK_PD = BIT5, + ODM_BB_CCK_PD = BIT5, ODM_BB_ANT_DIV = BIT6, ODM_BB_PWR_SAVE = BIT7, ODM_BB_PWR_TRAIN = BIT8, @@ -678,6 +481,7 @@ typedef enum _ODM_Support_Ability_Definition ODM_BB_CFO_TRACKING = BIT14, ODM_BB_NHM_CNT = BIT15, ODM_BB_PRIMARY_CCA = BIT16, + ODM_BB_TXBF = BIT17, // // MAC DM section BIT 20-23 @@ -690,294 +494,11 @@ typedef enum _ODM_Support_Ability_Definition // ODM_RF_TX_PWR_TRACK = BIT24, ODM_RF_RX_GAIN_TRACK = BIT25, - ODM_RF_CALIBRATION = BIT26, + ODM_RF_CALIBRATION = BIT26, }ODM_ABILITY_E; -// ODM_CMNINFO_INTERFACE -typedef enum tag_ODM_Support_Interface_Definition -{ - ODM_ITRF_PCIE = 0x1, - ODM_ITRF_USB = 0x2, - ODM_ITRF_SDIO = 0x4, - ODM_ITRF_ALL = 0x7, -}ODM_INTERFACE_E; - -// ODM_CMNINFO_IC_TYPE -typedef enum tag_ODM_Support_IC_Type_Definition -{ - ODM_RTL8192S = BIT0, - ODM_RTL8192C = BIT1, - ODM_RTL8192D = BIT2, - ODM_RTL8723A = BIT3, - ODM_RTL8188E = BIT4, - ODM_RTL8812 = BIT5, - ODM_RTL8821 = BIT6, - ODM_RTL8192E = BIT7, - ODM_RTL8723B = BIT8, - ODM_RTL8814A = BIT9, - ODM_RTL8881A = BIT10, - ODM_RTL8821B = BIT11, - ODM_RTL8822B = BIT12, - ODM_RTL8703B = BIT13 -}ODM_IC_TYPE_E; - -#define ODM_IC_11N_SERIES (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8703B) -#define ODM_IC_11AC_SERIES (ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A|ODM_RTL8821B|ODM_RTL8822B) - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - -#ifdef RTK_AC_SUPPORT -#define ODM_IC_11AC_SERIES_SUPPORT 1 -#else -#define ODM_IC_11AC_SERIES_SUPPORT 0 -#endif - -#define ODM_IC_11N_SERIES_SUPPORT 1 -#define ODM_CONFIG_BT_COEXIST 0 - -#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) - -#define ODM_IC_11AC_SERIES_SUPPORT 1 -#define ODM_IC_11N_SERIES_SUPPORT 1 -#define ODM_CONFIG_BT_COEXIST 1 - -#else - -#if((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1) || (RTL8723A_SUPPORT == 1) || (RTL8188E_SUPPORT == 1) ||\ -(RTL8723B_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8195A_SUPPORT == 1)) -#define ODM_IC_11N_SERIES_SUPPORT 1 -#define ODM_IC_11AC_SERIES_SUPPORT 0 -#else -#define ODM_IC_11N_SERIES_SUPPORT 0 -#define ODM_IC_11AC_SERIES_SUPPORT 1 -#endif - -#ifdef CONFIG_BT_COEXIST -#define ODM_CONFIG_BT_COEXIST 1 -#else -#define ODM_CONFIG_BT_COEXIST 0 -#endif - -#endif - - -//ODM_CMNINFO_CUT_VER -typedef enum tag_ODM_Cut_Version_Definition -{ - ODM_CUT_A = 0, - ODM_CUT_B = 1, - ODM_CUT_C = 2, - ODM_CUT_D = 3, - ODM_CUT_E = 4, - ODM_CUT_F = 5, - - ODM_CUT_I = 8, - ODM_CUT_J = 9, - ODM_CUT_K = 10, - ODM_CUT_TEST = 15, -}ODM_CUT_VERSION_E; - -// ODM_CMNINFO_FAB_VER -typedef enum tag_ODM_Fab_Version_Definition -{ - ODM_TSMC = 0, - ODM_UMC = 1, -}ODM_FAB_E; - -// ODM_CMNINFO_RF_TYPE -// -// For example 1T2R (A+AB = BIT0|BIT4|BIT5) -// -typedef enum tag_ODM_RF_Path_Bit_Definition -{ - ODM_RF_TX_A = BIT0, - ODM_RF_TX_B = BIT1, - ODM_RF_TX_C = BIT2, - ODM_RF_TX_D = BIT3, - ODM_RF_RX_A = BIT4, - ODM_RF_RX_B = BIT5, - ODM_RF_RX_C = BIT6, - ODM_RF_RX_D = BIT7, -}ODM_RF_PATH_E; - - -typedef enum tag_ODM_RF_Type_Definition -{ - ODM_1T1R = 0, - ODM_1T2R = 1, - ODM_2T2R = 2, - ODM_2T3R = 3, - ODM_2T4R = 4, - ODM_3T3R = 5, - ODM_3T4R = 6, - ODM_4T4R = 7, -}ODM_RF_TYPE_E; - - -// -// ODM Dynamic common info value definition -// - -//typedef enum _MACPHY_MODE_8192D{ -// SINGLEMAC_SINGLEPHY, -// DUALMAC_DUALPHY, -// DUALMAC_SINGLEPHY, -//}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D; -// Above is the original define in MP driver. Please use the same define. THX. -typedef enum tag_ODM_MAC_PHY_Mode_Definition -{ - ODM_SMSP = 0, - ODM_DMSP = 1, - ODM_DMDP = 2, -}ODM_MAC_PHY_MODE_E; - - -typedef enum tag_BT_Coexist_Definition -{ - ODM_BT_BUSY = 1, - ODM_BT_ON = 2, - ODM_BT_OFF = 3, - ODM_BT_NONE = 4, -}ODM_BT_COEXIST_E; - -// ODM_CMNINFO_OP_MODE -typedef enum tag_Operation_Mode_Definition -{ - ODM_NO_LINK = BIT0, - ODM_LINK = BIT1, - ODM_SCAN = BIT2, - ODM_POWERSAVE = BIT3, - ODM_AP_MODE = BIT4, - ODM_CLIENT_MODE = BIT5, - ODM_AD_HOC = BIT6, - ODM_WIFI_DIRECT = BIT7, - ODM_WIFI_DISPLAY = BIT8, -}ODM_OPERATION_MODE_E; - -// ODM_CMNINFO_WM_MODE -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE)) -typedef enum tag_Wireless_Mode_Definition -{ - ODM_WM_UNKNOW = 0x0, - ODM_WM_B = BIT0, - ODM_WM_G = BIT1, - ODM_WM_A = BIT2, - ODM_WM_N24G = BIT3, - ODM_WM_N5G = BIT4, - ODM_WM_AUTO = BIT5, - ODM_WM_AC = BIT6, -}ODM_WIRELESS_MODE_E; -#else -typedef enum tag_Wireless_Mode_Definition -{ - ODM_WM_UNKNOWN = 0x00, - ODM_WM_A = BIT0, - ODM_WM_B = BIT1, - ODM_WM_G = BIT2, - ODM_WM_AUTO = BIT3, - ODM_WM_N24G = BIT4, - ODM_WM_N5G = BIT5, - ODM_WM_AC_5G = BIT6, - ODM_WM_AC_24G = BIT7, - ODM_WM_AC_ONLY = BIT8, - ODM_WM_MAX = BIT9 -}ODM_WIRELESS_MODE_E; -#endif - -// ODM_CMNINFO_BAND -typedef enum tag_Band_Type_Definition -{ - ODM_BAND_2_4G = 0, - ODM_BAND_5G, - ODM_BAND_ON_BOTH, - ODM_BANDMAX - -}ODM_BAND_TYPE_E; - -// ODM_CMNINFO_SEC_CHNL_OFFSET -typedef enum tag_Secondary_Channel_Offset_Definition -{ - ODM_DONT_CARE = 0, - ODM_BELOW = 1, - ODM_ABOVE = 2 -}ODM_SEC_CHNL_OFFSET_E; - -// ODM_CMNINFO_SEC_MODE -typedef enum tag_Security_Definition -{ - ODM_SEC_OPEN = 0, - ODM_SEC_WEP40 = 1, - ODM_SEC_TKIP = 2, - ODM_SEC_RESERVE = 3, - ODM_SEC_AESCCMP = 4, - ODM_SEC_WEP104 = 5, - ODM_WEP_WPA_MIXED = 6, // WEP + WPA - ODM_SEC_SMS4 = 7, -}ODM_SECURITY_E; - -// ODM_CMNINFO_BW -typedef enum tag_Bandwidth_Definition -{ - ODM_BW20M = 0, - ODM_BW40M = 1, - ODM_BW80M = 2, - ODM_BW160M = 3, - ODM_BW10M = 4, -}ODM_BW_E; - - -// ODM_CMNINFO_BOARD_TYPE -// For non-AC-series IC , ODM_BOARD_5G_EXT_PA and ODM_BOARD_5G_EXT_LNA are ignored -// For AC-series IC, external PA & LNA can be indivisuallly added on 2.4G and/or 5G -typedef enum tag_Board_Definition -{ - ODM_BOARD_DEFAULT = 0, // The DEFAULT case. - ODM_BOARD_MINICARD = BIT(0), // 0 = non-mini card, 1= mini card. - ODM_BOARD_SLIM = BIT(1), // 0 = non-slim card, 1 = slim card - ODM_BOARD_BT = BIT(2), // 0 = without BT card, 1 = with BT - ODM_BOARD_EXT_PA = BIT(3), // 0 = no 2G ext-PA, 1 = existing 2G ext-PA - ODM_BOARD_EXT_LNA = BIT(4), // 0 = no 2G ext-LNA, 1 = existing 2G ext-LNA - ODM_BOARD_EXT_TRSW = BIT(5), // 0 = no ext-TRSW, 1 = existing ext-TRSW - ODM_BOARD_EXT_PA_5G = BIT(6), // 0 = no 5G ext-PA, 1 = existing 5G ext-PA - ODM_BOARD_EXT_LNA_5G= BIT(7), // 0 = no 5G ext-LNA, 1 = existing 5G ext-LNA -}ODM_BOARD_TYPE_E; - -typedef enum tag_ODM_Package_Definition -{ - ODM_PACKAGE_DEFAULT = 0, - ODM_PACKAGE_QFN68 = BIT(0), - ODM_PACKAGE_TFBGA90 = BIT(1), - ODM_PACKAGE_TFBGA79 = BIT(2), -}ODM_Package_TYPE_E; - -typedef enum tag_ODM_TYPE_GPA_Definition -{ - TYPE_GPA0 = 0, - TYPE_GPA1 = BIT(1)|BIT(0) -}ODM_TYPE_GPA_E; - -typedef enum tag_ODM_TYPE_APA_Definition -{ - TYPE_APA0 = 0, - TYPE_APA1 = BIT(1)|BIT(0) -}ODM_TYPE_APA_E; - -typedef enum tag_ODM_TYPE_GLNA_Definition -{ - TYPE_GLNA0 = 0, - TYPE_GLNA1 = BIT(2)|BIT(0), - TYPE_GLNA2 = BIT(3)|BIT(1), - TYPE_GLNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0) -}ODM_TYPE_GLNA_E; - -typedef enum tag_ODM_TYPE_ALNA_Definition -{ - TYPE_ALNA0 = 0, - TYPE_ALNA1 = BIT(2)|BIT(0), - TYPE_ALNA2 = BIT(3)|BIT(1), - TYPE_ALNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0) -}ODM_TYPE_ALNA_E; +//Move some non-DM enum,define, struc. form phydm.h to phydm_types.h by Dino // ODM_CMNINFO_ONE_PATH_CCA typedef enum tag_CCA_Path @@ -987,137 +508,23 @@ typedef enum tag_CCA_Path ODM_CCA_1R_B = 2, }ODM_CCA_PATH_E; - -typedef struct _ODM_RA_Info_ -{ - u1Byte RateID; - u4Byte RateMask; - u4Byte RAUseRate; - u1Byte RateSGI; - u1Byte RssiStaRA; - u1Byte PreRssiStaRA; - u1Byte SGIEnable; - u1Byte DecisionRate; - u1Byte PreRate; - u1Byte HighestRate; - u1Byte LowestRate; - u4Byte NscUp; - u4Byte NscDown; - u2Byte RTY[5]; - u4Byte TOTAL; - u2Byte DROP; - u1Byte Active; - u2Byte RptTime; - u1Byte RAWaitingCounter; - u1Byte RAPendingCounter; -#if 1 //POWER_TRAINING_ACTIVE == 1 // For compile pass only~! - u1Byte PTActive; // on or off - u1Byte PTTryState; // 0 trying state, 1 for decision state - u1Byte PTStage; // 0~6 - u1Byte PTStopCount; //Stop PT counter - u1Byte PTPreRate; // if rate change do PT - u1Byte PTPreRssi; // if RSSI change 5% do PT - u1Byte PTModeSS; // decide whitch rate should do PT - u1Byte RAstage; // StageRA, decide how many times RA will be done between PT - u1Byte PTSmoothFactor; -#endif -} ODM_RA_INFO_T,*PODM_RA_INFO_T; +//move RAInfo to Phydm_RaInfo.h //Remove struct PATHDIV_PARA to odm_PathDiv.h -//move to PowerTracking.h by YuChen - +//Remove struct to odm_PowerTracking.h by YuChen // // ODM Dynamic common info value definition // +//Move AntDiv form phydm.h to Phydm_AntDiv.h by Dino -typedef struct _FAST_ANTENNA_TRAINNING_ -{ - u1Byte Bssid[6]; - u1Byte antsel_rx_keep_0; - u1Byte antsel_rx_keep_1; - u1Byte antsel_rx_keep_2; - u1Byte antsel_rx_keep_3; - u4Byte antSumRSSI[7]; - u4Byte antRSSIcnt[7]; - u4Byte antAveRSSI[7]; - u1Byte FAT_State; - u4Byte TrainIdx; - u1Byte antsel_a[ODM_ASSOCIATE_ENTRY_NUM]; - u1Byte antsel_b[ODM_ASSOCIATE_ENTRY_NUM]; - u1Byte antsel_c[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte MainAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte AuxAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte MainAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte AuxAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; - u1Byte RxIdleAnt; - BOOLEAN bBecomeLinked; - u4Byte MinMaxRSSI; - u1Byte idx_AntDiv_counter_2G; - u1Byte idx_AntDiv_counter_5G; - u4Byte AntDiv_2G_5G; - u4Byte CCK_counter_main; - u4Byte CCK_counter_aux; - u4Byte OFDM_counter_main; - u4Byte OFDM_counter_aux; - - - u4Byte CCK_CtrlFrame_Cnt_main; - u4Byte CCK_CtrlFrame_Cnt_aux; - u4Byte OFDM_CtrlFrame_Cnt_main; - u4Byte OFDM_CtrlFrame_Cnt_aux; - u4Byte MainAnt_CtrlFrame_Sum; - u4Byte AuxAnt_CtrlFrame_Sum; - u4Byte MainAnt_CtrlFrame_Cnt; - u4Byte AuxAnt_CtrlFrame_Cnt; - -}FAT_T,*pFAT_T; - -typedef enum _FAT_STATE -{ - FAT_NORMAL_STATE = 0, - FAT_TRAINING_STATE = 1, -}FAT_STATE_E, *PFAT_STATE_E; - -typedef enum _ANT_DIV_TYPE -{ - NO_ANTDIV = 0xFF, - CG_TRX_HW_ANTDIV = 0x01, - CGCS_RX_HW_ANTDIV = 0x02, - FIXED_HW_ANTDIV = 0x03, - CG_TRX_SMART_ANTDIV = 0x04, - CGCS_RX_SW_ANTDIV = 0x05, - S0S1_SW_ANTDIV = 0x06 //8723B intrnal switch S0 S1 -}ANT_DIV_TYPE_E, *PANT_DIV_TYPE_E; - - -typedef struct _ODM_PATH_DIVERSITY_ -{ - u1Byte RespTxPath; - u1Byte PathSel[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte PathA_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte PathB_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte PathA_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte PathB_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; -}PATHDIV_T, *pPATHDIV_T; - +//move PathDiv to Phydm_PathDiv.h typedef enum _BASEBAND_CONFIG_PHY_REG_PG_VALUE_TYPE{ PHY_REG_PG_RELATIVE_VALUE = 0, PHY_REG_PG_EXACT_VALUE = 1 } PHY_REG_PG_TYPE; - -// -// Antenna detection information from single tone mechanism, added by Roger, 2012.11.27. -// -typedef struct _ANT_DETECTED_INFO{ - BOOLEAN bAntDetected; - u4Byte dBForAntA; - u4Byte dBForAntB; - u4Byte dBForAntO; -}ANT_DETECTED_INFO, *PANT_DETECTED_INFO; - // // 2011/09/22 MH Copy from SD4 defined structure. We use to support PHY DM integration. // @@ -1125,6 +532,7 @@ typedef struct _ANT_DETECTED_INFO{ #if (RT_PLATFORM != PLATFORM_LINUX) typedef #endif + struct DM_Out_Source_Dynamic_Mechanism_Structure #else// for AP,ADSL,CE Team typedef struct DM_Out_Source_Dynamic_Mechanism_Structure @@ -1206,13 +614,14 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure u1Byte TypeALNA; u1Byte TypeAPA; // with external LNA NO/Yes = 0/1 - u1Byte ExtLNA; - u1Byte ExtLNA5G; + u1Byte ExtLNA; // 2G + u1Byte ExtLNA5G; //5G // with external PA NO/Yes = 0/1 - u1Byte ExtPA; - u1Byte ExtPA5G; + u1Byte ExtPA; // 2G + u1Byte ExtPA5G; //5G // with external TRSW NO/Yes = 0/1 u1Byte ExtTRSW; + u1Byte ExtLNAGain; // 2G u1Byte PatchID; //Customer ID BOOLEAN bInHctTest; BOOLEAN bWIFITest; @@ -1220,7 +629,7 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure BOOLEAN bDualMacSmartConcurrent; u4Byte BK_SupportAbility; u1Byte AntDivType; - + BOOLEAN ConfigBBRF; u1Byte odm_Regulation2_4G; u1Byte odm_Regulation5G; u1Byte IQKFWOffload; @@ -1270,7 +679,7 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure //u1Byte *pAidMap; u1Byte *pu1ForcedIgiLb; BOOLEAN *pIsFcsModeEnable; -//--------- For 8723B IQK-----------// +/*--------- For 8723B IQK-----------*/ BOOLEAN *pIs1Antenna; u1Byte *pRFDefaultPath; // 0:S1, 1:S0 @@ -1283,17 +692,29 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure BOOLEAN bWIFI_Display; BOOLEAN bLinked; BOOLEAN bsta_state; +#if(DM_ODM_SUPPORT_TYPE & ODM_AP) // for repeater mode add by YuChen 2014.06.23 +#ifdef UNIVERSAL_REPEATER + BOOLEAN VXD_bLinked; +#endif +#endif // for repeater mode add by YuChen 2014.06.23 u1Byte RSSI_Min; - u1Byte InterfaceIndex; // Add for 92D dual MAC: 0--Mac0 1--Mac1 - BOOLEAN bIsMPChip; + u1Byte InterfaceIndex; /*Add for 92D dual MAC: 0--Mac0 1--Mac1*/ + BOOLEAN bIsMPChip; BOOLEAN bOneEntryOnly; BOOLEAN mp_mode; + u4Byte OneEntry_MACID; + u1Byte pre_number_linked_client; + u1Byte number_linked_client; + u1Byte pre_number_active_client; + u1Byte number_active_client; // Common info for BTDM BOOLEAN bBtEnabled; // BT is enabled BOOLEAN bBtConnectProcess; // BT HS is under connection progress. u1Byte btHsRssi; // BT HS mode wifi rssi value. BOOLEAN bBtHsOperation; // BT HS mode is under progress + u1Byte btHsDigVal; // use BT rssi to decide the DIG value BOOLEAN bBtDisableEdcaTurbo; // Under some condition, don't enable the EDCA Turbo + BOOLEAN bBtBusy; // BT is busy. BOOLEAN bBtLimitedDig; // BT is busy. //------------CALL BY VALUE-------------// u1Byte RSSI_A; @@ -1304,6 +725,7 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure u8Byte RSSI_TRSW_H; u8Byte RSSI_TRSW_L; u8Byte RSSI_TRSW_iso; + u1Byte TRXAntStatus; u1Byte RxRate; BOOLEAN bNoisyState; @@ -1320,54 +742,59 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure BOOLEAN IsBbSwingOffsetPositiveA; u4Byte BbSwingOffsetB; BOOLEAN IsBbSwingOffsetPositiveB; - s1Byte TH_L2H_ini; - s1Byte TH_EDCCA_HL_diff; - s1Byte IGI_Base; - u1Byte IGI_target; - BOOLEAN ForceEDCCA; - u1Byte AdapEn_RSSI; - s1Byte Force_TH_H; - s1Byte Force_TH_L; - u1Byte IGI_LowerBound; - u1Byte antdiv_rssi; + u1Byte antdiv_rssi; + u1Byte fat_comb_a; + u1Byte fat_comb_b; + u1Byte antdiv_intvl; u1Byte AntType; u1Byte pre_AntType; - u1Byte antdiv_period; - u1Byte antdiv_select; + u1Byte antdiv_period; + u1Byte antdiv_select; + u1Byte path_select; + u1Byte antdiv_evm_en; + u1Byte bdc_holdstate; u1Byte NdpaPeriod; BOOLEAN H2C_RARpt_connect; + BOOLEAN cck_agc_report_type; + + u1Byte dm_dig_max_TH; + u1Byte dm_dig_min_TH; + u1Byte print_agc; - // add by Yu Cehn for adaptivtiy - BOOLEAN adaptivity_flag; - u1Byte tolerance_cnt; - u8Byte NHMCurTxOkcnt; - u8Byte NHMCurRxOkcnt; - u8Byte NHMLastTxOkcnt; - u8Byte NHMLastRxOkcnt; - u1Byte NHMWait; - s1Byte H2L_lb; - s1Byte L2H_lb; - u1Byte Adaptivity_IGI_upper; + //For Adaptivtiy u2Byte NHM_cnt_0; u2Byte NHM_cnt_1; + s1Byte TH_L2H_ini; + s1Byte TH_EDCCA_HL_diff; + s1Byte TH_L2H_ini_backup; BOOLEAN Carrier_Sense_enable; - BOOLEAN bFirstLink; - BOOLEAN bCheck; - BOOLEAN EDCCA_enable_state; - BOOLEAN NHM_enable; - BOOLEAN DynamicLinkAdaptivity; - BOOLEAN bAdaOn; + u1Byte Adaptivity_IGI_upper; + BOOLEAN adaptivity_flag; + u1Byte DCbackoff; + BOOLEAN Adaptivity_enable; + u1Byte APTotalNum; + ADAPTIVITY_STATISTICS Adaptivity; + //For Adaptivtiy + u1Byte LastUSBHub; + + u1Byte c2h_cmd_start; + u1Byte fw_debug_trace[60]; + u1Byte pre_c2h_seq; + BOOLEAN fw_buff_is_enpty; +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) ODM_NOISE_MONITOR noise_level;//[ODM_MAX_CHANNEL_NUM]; +#endif // //2 Define STA info. // _ODM_STA_INFO // 2012/01/12 MH For MP, we need to reduce one array pointer for default port.?? PSTA_INFO_T pODM_StaInfo[ODM_ASSOCIATE_ENTRY_NUM]; + u2Byte platform2phydm_macid_table[ODM_ASSOCIATE_ENTRY_NUM]; /* platform_macid_table[platform_macid] = phydm_macid */ #if (RATE_ADAPTIVE_SUPPORT == 1) u2Byte CurrminRptTime; - ODM_RA_INFO_T RAInfo[ODM_ASSOCIATE_ENTRY_NUM]; //See HalMacID support + ODM_RA_INFO_T RAInfo[ODM_ASSOCIATE_ENTRY_NUM]; //Use MacID as array index. STA MacID=0, VWiFi Client MacID={1, ODM_ASSOCIATE_ENTRY_NUM-1} //YJ,add,120119 #endif // // 2012/02/14 MH Add to share 88E ra with other SW team. @@ -1395,6 +822,11 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure // //ODM Structure // + #if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) + #if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) + BDC_T DM_BdcTable; + #endif + #endif FAT_T DM_FatTable; DIG_T DM_DigTable; PS_T DM_PSTable; @@ -1405,21 +837,28 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure RA_T DM_RA_Table; FALSE_ALARM_STATISTICS FalseAlmCnt; FALSE_ALARM_STATISTICS FlaseAlmCntBuddyAdapter; - //#ifdef CONFIG_ANTENNA_DIVERSITY SWAT_T DM_SWAT_Table; BOOLEAN RSSI_test; CFO_TRACKING DM_CfoTrack; ACS DM_ACS; - //#endif - + +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) +#if (RTL8814A_SUPPORT == 1) + IQK_INFO IQK_info; +#endif /* (RTL8814A_SUPPORT==1) */ +#endif + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) //Path Div Struct PATHDIV_PARA pathIQK; +#endif +#if(defined(CONFIG_PATH_DIVERSITY)) + PATHDIV_T DM_PathDiv; #endif EDCA_T DM_EDCA_Table; u4Byte WMMEDCA_BE; - PATHDIV_T DM_PathDiv; + // Copy from SD4 structure // // ================================================== @@ -1455,37 +894,13 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure u1Byte bUseRAMask; ODM_RATE_ADAPTIVE RateAdaptive; - +//#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) +#if(defined(CONFIG_ANT_DETECTION)) ANT_DETECTED_INFO AntDetectedInfo; // Antenna detected information for RSSI tool - +#endif ODM_RF_CAL_T RFCalibrateInfo; - - // - // TX power tracking - // - u1Byte BbSwingIdxOfdm[MAX_RF_PATH]; - u1Byte BbSwingIdxOfdmCurrent; - u1Byte BbSwingIdxOfdmBase[MAX_RF_PATH]; - BOOLEAN BbSwingFlagOfdm; - u1Byte BbSwingIdxCck; - u1Byte BbSwingIdxCckCurrent; - u1Byte BbSwingIdxCckBase; - u1Byte DefaultOfdmIndex; - u1Byte DefaultCckIndex; - BOOLEAN BbSwingFlagCck; - - s1Byte Absolute_OFDMSwingIdx[MAX_RF_PATH]; - s1Byte Remnant_OFDMSwingIdx[MAX_RF_PATH]; - s1Byte Remnant_CCKSwingIdx; - s1Byte Modify_TxAGC_Value; //Remnat compensate value at TxAGC - BOOLEAN Modify_TxAGC_Flag_PathA; - BOOLEAN Modify_TxAGC_Flag_PathB; - BOOLEAN Modify_TxAGC_Flag_PathC; - BOOLEAN Modify_TxAGC_Flag_PathD; - BOOLEAN Modify_TxAGC_Flag_PathA_CCK; - - s1Byte KfreeOffset[MAX_RF_PATH]; + // // Dynamic ATC switch // @@ -1511,21 +926,26 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure //2011.09.27 add for Path Diversity RT_TIMER CCKPathDiversityTimer; RT_TIMER FastAntTrainingTimer; - +#ifdef ODM_EVM_ENHANCE_ANTDIV + RT_TIMER EVM_FastAntTrainingTimer; +#endif + RT_TIMER sbdcnt_timer; + // ODM relative workitem. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - #if USE_WORKITEM +#if USE_WORKITEM RT_WORK_ITEM PathDivSwitchWorkitem; RT_WORK_ITEM CCKPathDiversityWorkitem; RT_WORK_ITEM FastAntTrainingWorkitem; RT_WORK_ITEM MPT_DIGWorkitem; RT_WORK_ITEM RaRptWorkitem; - #endif + RT_WORK_ITEM sbdcnt_workitem; #endif - #if (BEAMFORMING_SUPPORT == 1) +#if (BEAMFORMING_SUPPORT == 1) RT_BEAMFORMING_INFO BeamformingInfo; - #endif +#endif +#endif #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) @@ -1540,37 +960,15 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure #endif - -#if 1 //92c-series -#define ODM_RF_PATH_MAX 2 -#else //jaguar - series -#define ODM_RF_PATH_MAX 4 -#endif - -typedef enum _PhyDM_Structure_Type{ +typedef enum _PHYDM_STRUCTURE_TYPE{ PHYDM_FALSEALMCNT, PHYDM_CFOTRACK, + PHYDM_ADAPTIVITY, PHYDM_ROMINFO, -}PhyDM_Structure_Type; - -typedef enum _ODM_RF_RADIO_PATH { - ODM_RF_PATH_A = 0, //Radio Path A - ODM_RF_PATH_B = 1, //Radio Path B - ODM_RF_PATH_C = 2, //Radio Path C - ODM_RF_PATH_D = 3, //Radio Path D - ODM_RF_PATH_AB, - ODM_RF_PATH_AC, - ODM_RF_PATH_AD, - ODM_RF_PATH_BC, - ODM_RF_PATH_BD, - ODM_RF_PATH_CD, - ODM_RF_PATH_ABC, - ODM_RF_PATH_ACD, - ODM_RF_PATH_BCD, - ODM_RF_PATH_ABCD, - // ODM_RF_PATH_MAX, //Max RF number 90 support -} ODM_RF_RADIO_PATH_E, *PODM_RF_RADIO_PATH_E; +}PHYDM_STRUCTURE_TYPE; + + typedef enum _ODM_RF_CONTENT{ odm_radioa_txt = 0x1000, @@ -1580,13 +978,13 @@ typedef enum _ODM_RF_RADIO_PATH { } ODM_RF_CONTENT; typedef enum _ODM_BB_Config_Type{ - CONFIG_BB_PHY_REG, - CONFIG_BB_AGC_TAB, - CONFIG_BB_AGC_TAB_2G, - CONFIG_BB_AGC_TAB_5G, - CONFIG_BB_PHY_REG_PG, - CONFIG_BB_PHY_REG_MP, - CONFIG_BB_AGC_TAB_DIFF, + CONFIG_BB_PHY_REG, + CONFIG_BB_AGC_TAB, + CONFIG_BB_AGC_TAB_2G, + CONFIG_BB_AGC_TAB_5G, + CONFIG_BB_PHY_REG_PG, + CONFIG_BB_PHY_REG_MP, + CONFIG_BB_AGC_TAB_DIFF, } ODM_BB_Config_Type, *PODM_BB_Config_Type; typedef enum _ODM_RF_Config_Type{ @@ -1658,10 +1056,7 @@ typedef enum _RT_STATUS{ //3=========================================================== //3 Tx Power Tracking //3=========================================================== -#if 0 //mask this, since these have been defined in typdef.h, vivi -#define OFDM_TABLE_SIZE 43 -#define CCK_TABLE_SIZE 33 -#endif + //3=========================================================== @@ -1687,24 +1082,11 @@ typedef enum tag_RF_Type_Definition RF_MAX = 2, }DM_RF_E; -//3=========================================================== -//3 Antenna Diversity -//3=========================================================== -typedef enum tag_SW_Antenna_Switch_Definition -{ - Antenna_A = 1, - Antenna_B = 2, - Antenna_MAX = 3, -}DM_SWAS_E; - - -// Maximal number of antenna detection mechanism needs to perform, added by Roger, 2011.12.28. -#define MAX_ANTENNA_DETECTION_CNT 10 // // Extern Global Variables. // -//remove PT by YuChen +//PowerTracking move to odm_powerTrakcing.h by YuChen // // check Sta pointer valid or not // @@ -1715,25 +1097,13 @@ typedef enum tag_SW_Antenna_Switch_Definition #else #define IS_STA_VALID(pSta) (pSta) #endif -// 20100514 Joseph: Add definition for antenna switching test after link. -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 //Remove DIG by yuchen - - - //Remove BB power saving by Yuchen +//remove PT by yuchen - - - //ODM_RAStateCheck() Remove by RS_James #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_AP|ODM_ADSL)) @@ -1760,9 +1130,13 @@ ODM_CheckPowerStatus( #endif -#if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) -u4Byte ConvertTo_dB(u4Byte Value); + +u4Byte odm_ConvertTo_dB(u4Byte Value); + +u4Byte odm_ConvertTo_linear(u4Byte Value); + +#if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) u4Byte GetPSDData( @@ -1772,16 +1146,26 @@ GetPSDData( #endif -//Remove ODM_Get_Rate_Bitmap() by RS_James +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +VOID +ODM_DMWatchdog_LPS( + IN PDM_ODM_T pDM_Odm +); +#endif -#if (BEAMFORMING_SUPPORT == 1) -BEAMFORMING_CAP -Beamforming_GetEntryBeamCapByMacId( - IN PMGNT_INFO pMgntInfo, - IN u1Byte MacId - ); -#endif +s4Byte +ODM_PWdB_Conversion( + IN s4Byte X, + IN u4Byte TotalBit, + IN u4Byte DecimalBit + ); + +s4Byte +ODM_SignConversion( + IN s4Byte value, + IN u4Byte TotalBit + ); VOID ODM_DMInit( @@ -1793,6 +1177,15 @@ ODM_DMReset( IN PDM_ODM_T pDM_Odm ); +VOID +phydm_support_ablity_debug( + IN PVOID pDM_VOID, + IN u4Byte *const dm_value, + IN u4Byte *_used, + OUT char *output, + IN u4Byte *_out_len + ); + VOID ODM_DMWatchdog( IN PDM_ODM_T pDM_Odm // For common use in the future @@ -1827,6 +1220,18 @@ ODM_CmnInfoUpdate( IN u8Byte Value ); +#if(DM_ODM_SUPPORT_TYPE==ODM_AP) +VOID +ODM_InitAllThreads( + IN PDM_ODM_T pDM_Odm + ); + +VOID +ODM_StopAllThreads( + IN PDM_ODM_T pDM_Odm + ); +#endif + VOID ODM_InitAllTimers( IN PDM_ODM_T pDM_Odm @@ -1853,20 +1258,6 @@ VOID ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm ); VOID ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm ); -//===========================================// -// Neil Chen----2011--06--15-- - -//3 Path Diversity -//=========================================================== - -#define TP_MODE 0 -#define RSSI_MODE 1 -#define TRAFFIC_LOW 0 -#define TRAFFIC_HIGH 1 - -//#define PATHDIV_ENABLE 1 - -//#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi u8Byte PlatformDivision64( @@ -1874,26 +1265,17 @@ PlatformDivision64( IN u8Byte y ); - -// 20100514 Joseph: Add definition for antenna switching test after link. -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 - //==================================================== //3 PathDiV End //==================================================== -//#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C #define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh //void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter, // IN INT32 DM_Type, // IN INT32 DM_Value); // +// PathDiveristy Remove by RS_James typedef enum tag_DIG_Connect_Definition { @@ -1919,78 +1301,80 @@ typedef enum tag_DIG_Connect_Definition // // For new definition in MP temporarily fro power tracking, // +/* #define odm_TXPowerTrackingDirectCall(_Adapter) \ IS_HARDWARE_TYPE_8192D(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92D(_Adapter) : \ IS_HARDWARE_TYPE_8192C(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92C(_Adapter) : \ IS_HARDWARE_TYPE_8723A(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_8723A(_Adapter) :\ ODM_TXPowerTrackingCallback_ThermalMeter(_Adapter) - +*/ #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - -#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE)) - VOID -ODM_SingleDualAntennaDefaultSetting( +ODM_AsocEntry_Init( IN PDM_ODM_T pDM_Odm ); -BOOLEAN -ODM_SingleDualAntennaDetection( - IN PDM_ODM_T pDM_Odm, - IN u1Byte mode - ); +//Remove ODM_DynamicARFBSelect() by RS_James -#endif // #if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) -VOID -ODM_UpdateNoisyState( - IN PDM_ODM_T pDM_Odm, - IN BOOLEAN bNoisyStateFromC2H +PVOID +PhyDM_Get_Structure( + IN PDM_ODM_T pDM_Odm, + IN u1Byte Structure_Type ); -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 -); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) ||(DM_ODM_SUPPORT_TYPE == ODM_CE) +/*===========================================================*/ +/* The following is for compile only*/ +/*===========================================================*/ -VOID -ODM_UpdateInitRate( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Rate - ); +#define IS_HARDWARE_TYPE_8723A(_Adapter) FALSE +#define IS_HARDWARE_TYPE_8723AE(_Adapter) FALSE +#define IS_HARDWARE_TYPE_8192C(_Adapter) FALSE +#define IS_HARDWARE_TYPE_8192D(_Adapter) FALSE +#define RF_T_METER_92D 0x42 -VOID -ODM_InitializeTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN RT_TIMER_CALL_BACK CallBackFunc, - IN PVOID pContext, - IN const char* szID -); -VOID -ODM_CancelAllTimers( - IN PDM_ODM_T pDM_Odm -); +#define SET_TX_DESC_ANTSEL_A_92C(__pTxDesc, __Value) SET_BITS_TO_LE_1BYTE(__pTxDesc+8+3, 0, 1, __Value) +#define SET_TX_DESC_TX_ANTL_92C(__pTxDesc, __Value) SET_BITS_TO_LE_1BYTE(__pTxDesc+8+3, 4, 2, __Value) +#define SET_TX_DESC_TX_ANT_HT_92C(__pTxDesc, __Value) SET_BITS_TO_LE_1BYTE(__pTxDesc+8+3, 6, 2, __Value) +#define SET_TX_DESC_TX_ANT_CCK_92C(__pTxDesc, __Value) SET_BITS_TO_LE_1BYTE(__pTxDesc+8+3, 2, 2, __Value) -VOID -ODM_ReleaseAllTimers( - IN PDM_ODM_T pDM_Odm -); +#define GET_RX_STATUS_DESC_RX_MCS(__pRxStatusDesc) LE_BITS_TO_1BYTE( __pRxStatusDesc+12, 0, 6) -//Remove ODM_DynamicARFBSelect() by RS_James +#define RX_HAL_IS_CCK_RATE_92C(pDesc)\ + (GET_RX_STATUS_DESC_RX_MCS(pDesc) == DESC_RATE1M ||\ + GET_RX_STATUS_DESC_RX_MCS(pDesc) == DESC_RATE2M ||\ + GET_RX_STATUS_DESC_RX_MCS(pDesc) == DESC_RATE5_5M ||\ + GET_RX_STATUS_DESC_RX_MCS(pDesc) == DESC_RATE11M) -PVOID -PhyDM_Get_Structure( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Structure_Type +#define H2C_92C_PSD_RESULT 16 + +#define rConfig_ram64x16 0xb2c + +#define TARGET_CHNL_NUM_2G_5G 59 +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + +VOID +FillH2CCmd92C( + IN PADAPTER Adapter, + IN u1Byte ElementID, + IN u4Byte CmdLen, + IN pu1Byte pCmdBuffer ); +VOID +PHY_SetTxPowerLevel8192C( + IN PADAPTER Adapter, + IN u1Byte channel + ); +u1Byte GetRightChnlPlaceforIQK(u1Byte chnl); + +#endif +//=========================================================== +#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) #if (DM_ODM_SUPPORT_TYPE == ODM_CE) void odm_dtc(PDM_ODM_T pDM_Odm); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.h index d24c4c63bbde..0651fbe03468 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.h @@ -58,4 +58,4 @@ ODM_GetAutoChannelSelectResult( IN u1Byte Band ); -#endif \ No newline at end of file +#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.c index d6a1c5d86faf..baa1fc4a06f3 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.c @@ -25,7 +25,8 @@ #include "Mp_Precomp.h" #include "phydm_precomp.h" -#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE)) +//#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE)) +#if(defined(CONFIG_ANT_DETECTION)) //IS_ANT_DETECT_SUPPORT_SINGLE_TONE(Adapter) //IS_ANT_DETECT_SUPPORT_RSSI(Adapter) @@ -36,12 +37,13 @@ VOID odm_PHY_SaveAFERegisters( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN pu4Byte AFEReg, IN pu4Byte AFEBackup, IN u4Byte RegisterNum ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u4Byte i; //RT_DISP(FINIT, INIT_IQK, ("Save ADDA parameters.\n")); @@ -52,12 +54,13 @@ odm_PHY_SaveAFERegisters( VOID odm_PHY_ReloadAFERegisters( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN pu4Byte AFEReg, IN pu4Byte AFEBackup, IN u4Byte RegiesterNum ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u4Byte i; //RT_DISP(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n")); @@ -76,9 +79,10 @@ odm_PHY_ReloadAFERegisters( // VOID ODM_SingleDualAntennaDefaultSetting( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; PADAPTER pAdapter = pDM_Odm->Adapter; @@ -113,10 +117,11 @@ ODM_SingleDualAntennaDefaultSetting( // BOOLEAN ODM_SingleDualAntennaDetection( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte mode ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PADAPTER pAdapter = pDM_Odm->Adapter; pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; u4Byte CurrentChannel,RfLoopReg; @@ -492,30 +497,17 @@ ODM_SingleDualAntennaDetection( //1 [2. Scan AP RSSI Method] ================================================== -void -odm_SwAntDetectInit( - IN PDM_ODM_T pDM_Odm - ) -{ - pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - - //pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control); - //pDM_SWAT_Table->PreAntenna = MAIN_ANT; - //pDM_SWAT_Table->CurAntenna = MAIN_ANT; - pDM_SWAT_Table->SWAS_NoLink_State = 0; - pDM_SWAT_Table->Pre_Aux_FailDetec = FALSE; - pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = 0xff; -} BOOLEAN ODM_SwAntDivCheckBeforeLink( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PADAPTER Adapter = pDM_Odm->Adapter; HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter); PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; @@ -971,10 +963,11 @@ return FALSE; u4Byte odm_GetPSDData( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u2Byte point, IN u1Byte initial_gain) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u4Byte psd_report; ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point); @@ -983,7 +976,7 @@ odm_GetPSDData( ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);//Stop PSD calculation, Reg808[22]=1->0 psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;//Read PSD report, Reg8B4[15:0] - psd_report = (u4Byte) (ConvertTo_dB(psd_report));//+(u4Byte)(initial_gain); + psd_report = (u4Byte) (odm_ConvertTo_dB(psd_report));//+(u4Byte)(initial_gain); return psd_report; } @@ -991,9 +984,10 @@ odm_GetPSDData( VOID ODM_SingleDualAntennaDetection_PSD( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PADAPTER pAdapter = pDM_Odm->Adapter; pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; u4Byte Channel_ori; @@ -1200,7 +1194,22 @@ ODM_SingleDualAntennaDetection_PSD( } +#endif +void +odm_SwAntDetectInit( + IN PVOID pDM_VOID + ) +{ +#if(defined(CONFIG_ANT_DETECTION)) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - - + //pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control); + //pDM_SWAT_Table->PreAntenna = MAIN_ANT; + //pDM_SWAT_Table->CurAntenna = MAIN_ANT; + pDM_SWAT_Table->SWAS_NoLink_State = 0; + pDM_SWAT_Table->Pre_Aux_FailDetec = FALSE; + pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = 0xff; #endif +} + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.h index 9e18c2ebfeee..19b2561f4a66 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.h @@ -21,37 +21,57 @@ #ifndef __PHYDMANTDECT_H__ #define __PHYDMANTDECT_H__ -#define ANTDECT_VERSION "1.0" +#define ANTDECT_VERSION "2.0" //2014.11.04 + +#if(defined(CONFIG_ANT_DETECTION)) +//#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE)) +//ANT Test +#define ANTTESTALL 0x00 /*Ant A or B will be Testing*/ +#define ANTTESTA 0x01 /*Ant A will be Testing*/ +#define ANTTESTB 0x02 /*Ant B will be testing*/ + +#define MAX_ANTENNA_DETECTION_CNT 10 + + +typedef struct _ANT_DETECTED_INFO{ + BOOLEAN bAntDetected; + u4Byte dBForAntA; + u4Byte dBForAntB; + u4Byte dBForAntO; +}ANT_DETECTED_INFO, *PANT_DETECTED_INFO; + + +typedef enum tag_SW_Antenna_Switch_Definition +{ + Antenna_A = 1, + Antenna_B = 2, + Antenna_MAX = 3, +}DM_SWAS_E; + + -#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE)) //1 [1. Single Tone Method] =================================================== VOID ODM_SingleDualAntennaDefaultSetting( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ); BOOLEAN ODM_SingleDualAntennaDetection( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte mode ); //1 [2. Scan AP RSSI Method] ================================================== -VOID -odm_SwAntDetectInit( - IN PDM_ODM_T pDM_Odm - ); - - #define SwAntDivCheckBeforeLink ODM_SwAntDivCheckBeforeLink BOOLEAN ODM_SwAntDivCheckBeforeLink( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ); @@ -62,15 +82,17 @@ ODM_SwAntDivCheckBeforeLink( VOID ODM_SingleDualAntennaDetection_PSD( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ); +#endif +VOID +odm_SwAntDetectInit( + IN PVOID pDM_VOID + ); - - -#endif #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.c index 4898e9ce7db2..f9349b047651 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.c @@ -31,9 +31,10 @@ //====================================================== VOID ODM_StopAntennaSwitchDm( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; // disable ODM antenna diversity pDM_Odm->SupportAbility &= ~ODM_BB_ANT_DIV; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("STOP Antenna Diversity \n")); @@ -41,10 +42,11 @@ ODM_StopAntennaSwitchDm( VOID ODM_SetAntConfig( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte antSetting // 0=A, 1=B, 2=C, .... ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; if(pDM_Odm->SupportICType == ODM_RTL8723B) { if(antSetting == 0) // ant A @@ -57,88 +59,156 @@ ODM_SetAntConfig( //====================================================== -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; iMainAnt_Sum[i] = 0; - pDM_FatTable->AuxAnt_Sum[i] = 0; - pDM_FatTable->MainAnt_Cnt[i] = 0; - pDM_FatTable->AuxAnt_Cnt[i] = 0; - } - - } -} - - -#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) VOID -odm_AntDiv_on_off( IN PDM_ODM_T pDM_Odm ,IN u1Byte swch) +ODM_SwAntDivRestAfterLink( + IN PVOID pDM_VOID + ) { - if(pDM_Odm->AntDivType==S0S1_SW_ANTDIV || pDM_Odm->AntDivType==CGCS_RX_SW_ANTDIV) - return; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + 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_N_ANTDIV_SUPPORT) + if(pDM_Odm->SupportICType == ODM_RTL8723A) { - 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")); - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable - if( pDM_Odm->AntDivType != S0S1_SW_ANTDIV) - ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable + 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; iMainAnt_Sum[i] = 0; + pDM_FatTable->AuxAnt_Sum[i] = 0; + pDM_FatTable->MainAnt_Cnt[i] = 0; + pDM_FatTable->AuxAnt_Cnt[i] = 0; + } + } - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) +} + + +#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) +VOID +odm_AntDiv_on_off( + IN PVOID pDM_VOID , + IN u1Byte swch + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + + if(pDM_FatTable->AntDiv_OnOff != swch) { - 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")); - if(pDM_Odm->SupportICType == ODM_RTL8812) + if(pDM_Odm->AntDivType==S0S1_SW_ANTDIV || pDM_Odm->AntDivType==CGCS_RX_SW_ANTDIV) + return; + + if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) { + 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")); ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable - //ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable + ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable } - else + else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) { - ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, swch); //OFDM AntDiv function block enable - - if( (pDM_Odm->CutVersion >= ODM_CUT_C) && (pDM_Odm->SupportICType == ODM_RTL8821) && ( pDM_Odm->AntDivType != S0S1_SW_ANTDIV)) + 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")); + if(pDM_Odm->SupportICType == ODM_RTL8812) { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) CCK HW-AntDiv block\n",(swch==ANTDIV_ON)?"ON" : "OFF")); - ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, swch); - ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, swch); //CCK AntDiv function block enable + ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable + ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable } - } - } + else + { + ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, swch); //OFDM AntDiv function block enable + + if( (pDM_Odm->CutVersion >= ODM_CUT_C) && (pDM_Odm->SupportICType == ODM_RTL8821) && ( pDM_Odm->AntDivType != S0S1_SW_ANTDIV)) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) CCK HW-AntDiv block\n",(swch==ANTDIV_ON)?"ON" : "OFF")); + ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, swch); + ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, swch); //CCK AntDiv function block enable + } + } + } + } + pDM_FatTable->AntDiv_OnOff =swch; + +} + +VOID +odm_FastTraining_enable( + IN PVOID pDM_VOID, + IN u1Byte swch + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte enable; + + if( swch== FAT_ON) + enable=1; + else + enable=0; + + if(pDM_Odm->SupportICType == ODM_RTL8188E) + { + + ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, enable); //enable fast training + } + else if(pDM_Odm->SupportICType == ODM_RTL8192E) + { + ODM_SetBBReg(pDM_Odm, 0xB34 , BIT28, enable); //enable fast training (path-A) + //ODM_SetBBReg(pDM_Odm, 0xB34 , BIT29, enable); //enable fast training (path-B) + } +} + +VOID +odm_Tx_By_TxDesc_or_Reg( + IN PVOID pDM_VOID, + IN u1Byte swch + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte enable; + + if( swch== TX_BY_DESC) + enable=1; + else + enable=0; + + if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) + { + if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) + { + ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, enable); + } + else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) + { + ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, enable); + } + } } VOID -ODM_UpdateRxIdleAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant) +ODM_UpdateRxIdleAnt( + IN PVOID pDM_VOID, + IN u1Byte Ant + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; u4Byte DefaultAnt, OptionalAnt,value32; - + //#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) //PADAPTER pAdapter = pDM_Odm->Adapter; //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); @@ -149,7 +219,7 @@ ODM_UpdateRxIdleAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant) 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")); if(!(pDM_Odm->SupportICType & ODM_RTL8723B)) - pDM_FatTable->RxIdleAnt = Ant; + pDM_FatTable->RxIdleAnt = Ant; if(Ant == MAIN_ANT) { @@ -170,21 +240,23 @@ ODM_UpdateRxIdleAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant) ODM_SetBBReg(pDM_Odm, 0xB38 , BIT8|BIT7|BIT6, OptionalAnt);//Optional RX ODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt);//Default TX } + #if (RTL8723B_SUPPORT == 1) else if(pDM_Odm->SupportICType==ODM_RTL8723B) { value32 = ODM_GetBBReg(pDM_Odm, 0x948, 0xFFF); - - if (value32 !=0x280) - ODM_UpdateRxIdleAnt_8723B(pDM_Odm, Ant, DefaultAnt, OptionalAnt); - else - 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")); + + if(value32 !=0x280) + ODM_UpdateRxIdleAnt_8723B(pDM_Odm, Ant, DefaultAnt, OptionalAnt); + else + 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")); } - else + #endif + else //88E { ODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, DefaultAnt); //Default RX ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, OptionalAnt); //Optional RX - ODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt); //Default TX - } + ODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt); //Default TX + } } else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) { @@ -204,7 +276,7 @@ ODM_UpdateRxIdleAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant) ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC , BIT27|BIT26|BIT25, DefaultAnt); //Default TX */ } - + if(pDM_Odm->SupportICType==ODM_RTL8188E) { ODM_SetMACReg(pDM_Odm, 0x6D8 , BIT7|BIT6, DefaultAnt); //PathA Resp Tx @@ -213,10 +285,10 @@ ODM_UpdateRxIdleAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant) { ODM_SetMACReg(pDM_Odm, 0x6D8 , BIT10|BIT9|BIT8, DefaultAnt); //PathA Resp Tx } - + } else// pDM_FatTable->RxIdleAnt == Ant - { + { 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")); pDM_FatTable->RxIdleAnt = Ant; } @@ -224,33 +296,508 @@ ODM_UpdateRxIdleAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant) VOID -odm_UpdateTxAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant, IN u4Byte MacId) +odm_UpdateTxAnt( + IN PVOID pDM_VOID, + IN u1Byte Ant, + IN u4Byte MacId + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; u1Byte TxAnt; - if(Ant == MAIN_ANT) - TxAnt = ANT1_2G; + if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV) + { + TxAnt=Ant; + } else - TxAnt = ANT2_2G; + { + if(Ant == MAIN_ANT) + TxAnt = ANT1_2G; + else + TxAnt = ANT2_2G; + } pDM_FatTable->antsel_a[MacId] = TxAnt&BIT0; pDM_FatTable->antsel_b[MacId] = (TxAnt&BIT1)>>1; pDM_FatTable->antsel_c[MacId] = (TxAnt&BIT2)>>2; - #if (DM_ODM_SUPPORT_TYPE == ODM_AP) - if (pDM_Odm->antdiv_rssi) - { - //panic_printk("[Tx from TxInfo]: MacID:(( %d )), TxAnt = (( %s ))\n",MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"); - //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] ); + + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tx from TxInfo]: MacID:(( %d )), TxAnt = (( %s ))\n", MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=(( 3'b%d%d%d ))\n",pDM_FatTable->antsel_c[MacId] , pDM_FatTable->antsel_b[MacId] , pDM_FatTable->antsel_a[MacId] )); + +} + +#ifdef BEAMFORMING_SUPPORT +#if(DM_ODM_SUPPORT_TYPE == ODM_AP) + +VOID +odm_BDC_Init( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pBDC_T pDM_BdcTable=&pDM_Odm->DM_BdcTable; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n[ BDC Initialization......] \n")); + pDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE; + pDM_BdcTable->BDC_Mode=BDC_MODE_NULL; + pDM_BdcTable->BDC_Try_flag=0; + pDM_BdcTable->BDCcoexType_wBfer=0; + pDM_Odm->bdc_holdstate=0xff; + + if(pDM_Odm->SupportICType == ODM_RTL8192E) + { + ODM_SetBBReg(pDM_Odm, 0xd7c , 0x0FFFFFFF, 0x1081008); + ODM_SetBBReg(pDM_Odm, 0xd80 , 0x0FFFFFFF, 0); + } + else if(pDM_Odm->SupportICType == ODM_RTL8812) + { + ODM_SetBBReg(pDM_Odm, 0x9b0 , 0x0FFFFFFF, 0x1081008); //0x9b0[30:0] = 01081008 + ODM_SetBBReg(pDM_Odm, 0x9b4 , 0x0FFFFFFF, 0); //0x9b4[31:0] = 00000000 + } + +} + + +VOID +odm_CSI_on_off( + IN PVOID pDM_VOID, + IN u1Byte CSI_en + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + if(CSI_en==CSI_ON) + { + if(pDM_Odm->SupportICType == ODM_RTL8192E) + { + ODM_SetMACReg(pDM_Odm, 0xd84 , BIT11, 1); //0xd84[11]=1 + } + else if(pDM_Odm->SupportICType == ODM_RTL8812) + { + ODM_SetMACReg(pDM_Odm, 0x9b0 , BIT31, 1); //0x9b0[31]=1 + } + + } + else if(CSI_en==CSI_OFF) + { + if(pDM_Odm->SupportICType == ODM_RTL8192E) + { + ODM_SetMACReg(pDM_Odm, 0xd84 , BIT11, 0); //0xd84[11]=0 + } + else if(pDM_Odm->SupportICType == ODM_RTL8812) + { + ODM_SetMACReg(pDM_Odm, 0x9b0 , BIT31, 0); //0x9b0[31]=0 + } + } +} + +VOID +odm_BDCcoexType_withBferClient( + IN PVOID pDM_VOID, + IN u1Byte swch + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pBDC_T pDM_BdcTable = &pDM_Odm->DM_BdcTable; + u1Byte BDCcoexType_wBfer; + + if(swch==DIVON_CSIOFF) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[BDCcoexType: 1] {DIV,CSI} ={1,0} \n")); + BDCcoexType_wBfer=1; + + if(BDCcoexType_wBfer != pDM_BdcTable->BDCcoexType_wBfer) + { + odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON); + odm_CSI_on_off(pDM_Odm,CSI_OFF); + pDM_BdcTable->BDCcoexType_wBfer=1; + } } - #endif - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tx from TxInfo]: MacID:(( %d )), TxAnt = (( %s ))\n", - // MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=(( 3'b%d%d%d ))\n", - //pDM_FatTable->antsel_c[MacId] , pDM_FatTable->antsel_b[MacId] , pDM_FatTable->antsel_a[MacId] )); + else if(swch==DIVOFF_CSION) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[BDCcoexType: 2] {DIV,CSI} ={0,1}\n")); + BDCcoexType_wBfer=2; + + if(BDCcoexType_wBfer != pDM_BdcTable->BDCcoexType_wBfer) + { + odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); + odm_CSI_on_off(pDM_Odm,CSI_ON); + pDM_BdcTable->BDCcoexType_wBfer=2; + } + } +} + +VOID +odm_BF_AntDiv_ModeArbitration( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pBDC_T pDM_BdcTable = &pDM_Odm->DM_BdcTable; + u1Byte current_BDC_Mode; + + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n")); + + //2 Mode 1 + if((pDM_BdcTable->num_Txbfee_Client !=0) && (pDM_BdcTable->num_Txbfer_Client == 0)) + { + current_BDC_Mode=BDC_MODE_1; + + if(current_BDC_Mode != pDM_BdcTable->BDC_Mode) + { + pDM_BdcTable->BDC_Mode=BDC_MODE_1; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); + pDM_BdcTable->BDC_RxIdleUpdate_counter=1; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to (( Mode1 ))\n")); + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Antdiv + BF coextance Mode] : (( Mode1 ))\n")); + } + //2 Mode 2 + else if((pDM_BdcTable->num_Txbfee_Client ==0) && (pDM_BdcTable->num_Txbfer_Client != 0)) + { + current_BDC_Mode=BDC_MODE_2; + + if(current_BDC_Mode != pDM_BdcTable->BDC_Mode) + { + pDM_BdcTable->BDC_Mode=BDC_MODE_2; + pDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE; + pDM_BdcTable->BDC_Try_flag=0; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to (( Mode2 ))\n")); + + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Antdiv + BF coextance Mode] : (( Mode2 ))\n")); + } + //2 Mode 3 + else if((pDM_BdcTable->num_Txbfee_Client !=0) && (pDM_BdcTable->num_Txbfer_Client != 0)) + { + current_BDC_Mode=BDC_MODE_3; + + if(current_BDC_Mode != pDM_BdcTable->BDC_Mode) + { + pDM_BdcTable->BDC_Mode=BDC_MODE_3; + pDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE; + pDM_BdcTable->BDC_Try_flag=0; + pDM_BdcTable->BDC_RxIdleUpdate_counter=1; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to (( Mode3 ))\n")); + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Antdiv + BF coextance Mode] : (( Mode3 ))\n")); + } + //2 Mode 4 + else if((pDM_BdcTable->num_Txbfee_Client ==0) && (pDM_BdcTable->num_Txbfer_Client == 0)) + { + current_BDC_Mode=BDC_MODE_4; + + if(current_BDC_Mode != pDM_BdcTable->BDC_Mode) + { + pDM_BdcTable->BDC_Mode=BDC_MODE_4; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to (( Mode4 ))\n")); + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Antdiv + BF coextance Mode] : (( Mode4 ))\n")); + } + #endif + +} + +VOID +odm_DivTrainState_setting( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pBDC_T pDM_BdcTable=&pDM_Odm->DM_BdcTable; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n*****[S T A R T ]***** [2-0. DIV_TRAIN_STATE] \n")); + pDM_BdcTable->BDC_Try_counter =2; + pDM_BdcTable->BDC_Try_flag=1; + pDM_BdcTable->BDC_state=BDC_BFer_TRAIN_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); +} + +VOID +odm_BDCcoex_BFeeRxDiv_Arbitration( + IN PVOID pDM_VOID +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pBDC_T pDM_BdcTable = &pDM_Odm->DM_BdcTable; + BOOLEAN StopBF_flag; + u1Byte BDC_active_Mode; + + + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***{ num_BFee, num_BFer , num_Client} = (( %d , %d , %d)) \n",pDM_BdcTable->num_Txbfee_Client,pDM_BdcTable->num_Txbfer_Client,pDM_BdcTable->num_Client)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***{ num_BF_tars, num_DIV_tars } = (( %d , %d )) \n",pDM_BdcTable->num_BfTar , pDM_BdcTable->num_DivTar )); + + //2 [ MIB control ] + if (pDM_Odm->bdc_holdstate==2) + { + odm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); + pDM_BdcTable->BDC_state=BDC_BF_HOLD_STATE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Force in [ BF STATE] \n")); + return; + } + else if (pDM_Odm->bdc_holdstate==1) + { + pDM_BdcTable->BDC_state=BDC_DIV_HOLD_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Force in [ DIV STATE] \n")); + return; + } + + //------------------------------------------------------------ + + + + //2 Mode 2 & 3 + if(pDM_BdcTable->BDC_Mode==BDC_MODE_2 ||pDM_BdcTable->BDC_Mode==BDC_MODE_3) + { + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n{ Try_flag , Try_counter } = { %d , %d } \n",pDM_BdcTable->BDC_Try_flag,pDM_BdcTable->BDC_Try_counter)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BDCcoexType = (( %d )) \n\n", pDM_BdcTable->BDCcoexType_wBfer)); + + // All Client have Bfer-Cap------------------------------- + if(pDM_BdcTable->num_Txbfer_Client == pDM_BdcTable->num_Client) //BFer STA Only?: yes + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BFer STA only? (( Yes ))\n")); + pDM_BdcTable->BDC_Try_flag=0; + pDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); + return; + } + else + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BFer STA only? (( No ))\n")); + } + // + if(pDM_BdcTable->bAll_BFSta_Idle==FALSE && pDM_BdcTable->bAll_DivSta_Idle==TRUE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("All DIV-STA are idle, but BF-STA not\n")); + pDM_BdcTable->BDC_Try_flag=0; + pDM_BdcTable->BDC_state=BDC_BFer_TRAIN_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); + return; + } + else if(pDM_BdcTable->bAll_BFSta_Idle==TRUE && pDM_BdcTable->bAll_DivSta_Idle==FALSE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("All BF-STA are idle, but DIV-STA not\n")); + pDM_BdcTable->BDC_Try_flag=0; + pDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); + return; + } + + //Select active mode-------------------------------------- + if(pDM_BdcTable->num_BfTar ==0) // Selsect_1, Selsect_2 + { + if(pDM_BdcTable->num_DivTar ==0) // Selsect_3 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Select active mode (( 1 )) \n")); + pDM_BdcTable->BDC_active_Mode=1; + } + else + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Select active mode (( 2 ))\n")); + pDM_BdcTable->BDC_active_Mode=2; + } + pDM_BdcTable->BDC_Try_flag=0; + pDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); + return; + } + else // num_BfTar > 0 + { + if(pDM_BdcTable->num_DivTar ==0) // Selsect_3 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Select active mode (( 3 ))\n")); + pDM_BdcTable->BDC_active_Mode=3; + pDM_BdcTable->BDC_Try_flag=0; + pDM_BdcTable->BDC_state=BDC_BFer_TRAIN_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); + return; + } + else // Selsect_4 + { + BDC_active_Mode=4; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Select active mode (( 4 ))\n")); + + if(BDC_active_Mode!=pDM_BdcTable->BDC_active_Mode) + { + pDM_BdcTable->BDC_active_Mode=4; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to active mode (( 4 )) & return!!! \n")); + return; + } + } + } + +#if 1 + if (pDM_Odm->bdc_holdstate==0xff) + { + pDM_BdcTable->BDC_state=BDC_DIV_HOLD_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Force in [ DIV STATE] \n")); + return; + } +#endif + + // Does Client number changed ? ------------------------------- + if(pDM_BdcTable->num_Client !=pDM_BdcTable->pre_num_Client) + { + pDM_BdcTable->BDC_Try_flag=0; + pDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ The number of client has been changed !!!] return to (( BDC_DIV_TRAIN_STATE )) \n")); + } + pDM_BdcTable->pre_num_Client=pDM_BdcTable->num_Client; + + if( pDM_BdcTable->BDC_Try_flag==0) + { + //2 DIV_TRAIN_STATE (Mode 2-0) + if(pDM_BdcTable->BDC_state==BDC_DIV_TRAIN_STATE) + { + odm_DivTrainState_setting( pDM_Odm); + } + //2 BFer_TRAIN_STATE (Mode 2-1) + else if(pDM_BdcTable->BDC_state==BDC_BFer_TRAIN_STATE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*****[2-1. BFer_TRAIN_STATE ]***** \n")); + + //if(pDM_BdcTable->num_BfTar==0) + //{ + // ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( No )), [ BDC_BFer_TRAIN_STATE ] >> [BDC_DIV_TRAIN_STATE] \n")); + // odm_DivTrainState_setting( pDM_Odm); + //} + //else //num_BfTar != 0 + //{ + pDM_BdcTable->BDC_Try_counter=2; + pDM_BdcTable->BDC_Try_flag=1; + pDM_BdcTable->BDC_state=BDC_DECISION_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( Yes )), [ BDC_BFer_TRAIN_STATE ] >> [BDC_DECISION_STATE] \n")); + //} + } + //2 DECISION_STATE (Mode 2-2) + else if(pDM_BdcTable->BDC_state==BDC_DECISION_STATE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*****[2-2. DECISION_STATE]***** \n")); + //if(pDM_BdcTable->num_BfTar==0) + //{ + // ODM_AntDiv_Printk(("BF_tars exist? : (( No )), [ DECISION_STATE ] >> [BDC_DIV_TRAIN_STATE] \n")); + // odm_DivTrainState_setting( pDM_Odm); + //} + //else //num_BfTar != 0 + //{ + if(pDM_BdcTable->BF_pass==FALSE || pDM_BdcTable->DIV_pass == FALSE) + StopBF_flag=TRUE; + else + StopBF_flag=FALSE; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( Yes )), {BF_pass, DIV_pass, StopBF_flag } = { %d, %d, %d } \n" ,pDM_BdcTable->BF_pass,pDM_BdcTable->DIV_pass,StopBF_flag)); + + if(StopBF_flag==TRUE) //DIV_en + { + pDM_BdcTable->BDC_Hold_counter=10; //20 + odm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); + pDM_BdcTable->BDC_state=BDC_DIV_HOLD_STATE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ StopBF_flag= ((TRUE)), BDC_DECISION_STATE ] >> [BDC_DIV_HOLD_STATE] \n")); + } + else //BF_en + { + pDM_BdcTable->BDC_Hold_counter=10; //20 + odm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); + pDM_BdcTable->BDC_state=BDC_BF_HOLD_STATE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[StopBF_flag= ((FALSE)), BDC_DECISION_STATE ] >> [BDC_BF_HOLD_STATE] \n")); + } + //} + } + //2 BF-HOLD_STATE (Mode 2-3) + else if(pDM_BdcTable->BDC_state==BDC_BF_HOLD_STATE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*****[2-3. BF_HOLD_STATE ]*****\n")); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BDC_Hold_counter = (( %d )) \n",pDM_BdcTable->BDC_Hold_counter )); + + if(pDM_BdcTable->BDC_Hold_counter==1) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE] \n")); + odm_DivTrainState_setting( pDM_Odm); + } + else + { + pDM_BdcTable->BDC_Hold_counter--; + + //if(pDM_BdcTable->num_BfTar==0) + //{ + // ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( No )), [ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE] \n")); + // odm_DivTrainState_setting( pDM_Odm); + //} + //else //num_BfTar != 0 + //{ + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( Yes ))\n")); + pDM_BdcTable->BDC_state=BDC_BF_HOLD_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ BDC_BF_HOLD_STATE ] >> [BDC_BF_HOLD_STATE] \n")); + //} + } + + } + //2 DIV-HOLD_STATE (Mode 2-4) + else if(pDM_BdcTable->BDC_state==BDC_DIV_HOLD_STATE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*****[2-4. DIV_HOLD_STATE ]*****\n")); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BDC_Hold_counter = (( %d )) \n",pDM_BdcTable->BDC_Hold_counter )); + + if(pDM_BdcTable->BDC_Hold_counter==1) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE] \n")); + odm_DivTrainState_setting( pDM_Odm); + } + else + { + pDM_BdcTable->BDC_Hold_counter--; + pDM_BdcTable->BDC_state=BDC_DIV_HOLD_STATE; + odm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_HOLD_STATE] \n")); + } + + } + + } + else if( pDM_BdcTable->BDC_Try_flag==1) + { + //2 Set Training Counter + if(pDM_BdcTable->BDC_Try_counter >1) + { + pDM_BdcTable->BDC_Try_counter--; + if(pDM_BdcTable->BDC_Try_counter ==1) + pDM_BdcTable->BDC_Try_flag=0; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training !!\n")); + //return ; + } + + } + + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n[end]\n")); + + #endif //#if(DM_ODM_SUPPORT_TYPE == ODM_AP) + + + + + } +#endif +#endif //#ifdef BEAMFORMING_SUPPORT #if (RTL8188E_SUPPORT == 1) @@ -258,18 +805,17 @@ odm_UpdateTxAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant, IN u4Byte MacId) VOID odm_RX_HWAntDiv_Init_88E( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u4Byte value32; - pDM_Odm->AntType = ODM_AUTO_ANT; - if(pDM_Odm->mp_mode == TRUE) { - pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; - ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv - ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1); // 1:CG, 0:CS + pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; + ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv + ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1); // 1:CG, 0:CS return; } @@ -294,17 +840,18 @@ odm_RX_HWAntDiv_Init_88E( VOID odm_TRX_HWAntDiv_Init_88E( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u4Byte value32; if(pDM_Odm->mp_mode == TRUE) { - pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; - ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv - ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT5|BIT4|BIT3, 0); //Default RX (0/1) - return; + pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; + ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv + ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT5|BIT4|BIT3, 0); //Default RX (0/1) + return; } ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV (SPDT)]\n")); @@ -330,35 +877,44 @@ odm_TRX_HWAntDiv_Init_88E( ODM_SetBBReg(pDM_Odm, ODM_REG_RX_DEFUALT_A_11N , BIT13|BIT12|BIT11, 2); //Reg858[13:11]=3'b010 } else //MPchip - ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , bMaskDWord, 0x0001); //Reg914=3'b010, Reg915=3'b001 + ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , bMaskDWord, 0x0201); /*Reg914=3'b010, Reg915=3'b001*/ } + +#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) VOID odm_Smart_HWAntDiv_Init_88E( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u4Byte value32, i; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - u4Byte AntCombination = 2; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_SMART_ANTDIV]\n")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_SMART_ANTDIV]\n")); if(pDM_Odm->mp_mode == TRUE) { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->AntDivType: %d\n", pDM_Odm->AntDivType)); - return; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->AntDivType: %d\n", pDM_Odm->AntDivType)); + return; } + pDM_FatTable->TrainIdx = 0; + pDM_FatTable->FAT_State = FAT_NORMAL_STATE; + + pDM_Odm->fat_comb_a=5; + pDM_Odm->antdiv_intvl = 0x64; // 100ms + for(i=0; i<6; i++) { pDM_FatTable->Bssid[i] = 0; + } + for(i=0; i< (pDM_Odm->fat_comb_a) ; i++) + { pDM_FatTable->antSumRSSI[i] = 0; pDM_FatTable->antRSSIcnt[i] = 0; pDM_FatTable->antAveRSSI[i] = 0; } - pDM_FatTable->TrainIdx = 0; - pDM_FatTable->FAT_State = FAT_NORMAL_STATE; //MAC Setting value32 = ODM_GetMACReg(pDM_Odm, 0x4c, bMaskDWord); @@ -375,11 +931,11 @@ odm_Smart_HWAntDiv_Init_88E( ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 //antsel antselb by HW ODM_SetBBReg(pDM_Odm, 0x864 , BIT10, 0); //Reg864[10]=1'b0 //antsel2 by HW ODM_SetBBReg(pDM_Odm, 0xb2c , BIT22, 0); //Regb2c[22]=1'b0 //disable CS/CG switch - ODM_SetBBReg(pDM_Odm, 0xb2c , BIT31, 1); //Regb2c[31]=1'b1 //output at CG only + ODM_SetBBReg(pDM_Odm, 0xb2c , BIT31, 0); //Regb2c[31]=1'b1 //output at CS only ODM_SetBBReg(pDM_Odm, 0xca4 , bMaskDWord, 0x000000a0); //antenna mapping table - if(AntCombination == 2) + if(pDM_Odm->fat_comb_a == 2) { if(!pDM_Odm->bIsMPChip) //testchip { @@ -392,7 +948,7 @@ odm_Smart_HWAntDiv_Init_88E( ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 2); } } - else if(AntCombination == 7) + else { if(!pDM_Odm->bIsMPChip) //testchip { @@ -408,29 +964,24 @@ odm_Smart_HWAntDiv_Init_88E( } else //MPchip { - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0); - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1); - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte2, 2); - ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte3, 3); - ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte0, 4); - ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte1, 5); - ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte2, 6); - ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte3, 7); + ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 4); // 0: 3b'000 + ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 2); // 1: 3b'001 + ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte2, 0); // 2: 3b'010 + ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte3, 1); // 3: 3b'011 + ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte0, 3); // 4: 3b'100 + ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte1, 5); // 5: 3b'101 + ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte2, 6); // 6: 3b'110 + ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte3, 255); // 7: 3b'111 } } //Default Ant Setting when no fast training - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1 //from TX Info ODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, 0); //Default RX ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, 1); //Optional RX - //ODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, 1); //Default TX + ODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, 0);//Default TX //Enter Traing state - ODM_SetBBReg(pDM_Odm, 0x864 , BIT2|BIT1|BIT0, (AntCombination-1)); //Reg864[2:0]=3'd6 //ant combination=reg864[2:0]+1 - //ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv - //ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0); //RegE08[16]=1'b0 //disable fast training - //ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 1); //RegE08[16]=1'b1 //enable fast training - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 1); //RegC50[7]=1'b1 //enable HW AntDiv + ODM_SetBBReg(pDM_Odm, 0x864 , BIT2|BIT1|BIT0, (pDM_Odm->fat_comb_a-1)); //Reg864[2:0]=3'd6 //ant combination=reg864[2:0]+1 //SW Control //PHY_SetBBReg(Adapter, 0x864 , BIT10, 1); @@ -440,23 +991,27 @@ odm_Smart_HWAntDiv_Init_88E( //PHY_SetBBReg(Adapter, 0x860 , BIT9, 0); //PHY_SetBBReg(Adapter, 0x860 , BIT8, 0); } +#endif + #endif //#if (RTL8188E_SUPPORT == 1) #if (RTL8192E_SUPPORT == 1) VOID odm_RX_HWAntDiv_Init_92E( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; if(pDM_Odm->mp_mode == TRUE) { - //pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta Regc50[8]=1'b0 0: control by c50[9] - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1); // 1:CG, 0:CS - return; + //pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; + odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); + ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta Regc50[8]=1'b0 0: control by c50[9] + ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1); // 1:CG, 0:CS + return; } ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => AntDivType=[CGCS_RX_HW_ANTDIV]\n")); @@ -474,49 +1029,69 @@ odm_RX_HWAntDiv_Init_92E( //CCK Settings ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2 - ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 1); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 + ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 0); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples + + #ifdef ODM_EVM_ENHANCE_ANTDIV + //EVM enhance AntDiv method init---------------------------------------------------------------------- + pDM_FatTable->EVM_method_enable=0; + pDM_FatTable->FAT_State = NORMAL_STATE_MIAN; + pDM_Odm->antdiv_intvl = 0x64; + ODM_SetBBReg(pDM_Odm, 0x910 , 0x3f, 0xf ); + pDM_Odm->antdiv_evm_en=1; + //pDM_Odm->antdiv_period=1; + + #endif + } VOID odm_TRX_HWAntDiv_Init_92E( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; if(pDM_Odm->mp_mode == TRUE) { - //pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta Regc50[8]=1'b0 0: control by c50[9] - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1); // 1:CG, 0:CS - return; + //pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV; + odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); + ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta Regc50[8]=1'b0 0: control by c50[9] + ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1); // 1:CG, 0:CS + return; } -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - pDM_Odm->antdiv_rssi=0; -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV]\n")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => AntDivType=[ Only for DIR605, CG_TRX_HW_ANTDIV]\n")); //3 --RFE pin setting--------- //[MAC] ODM_SetMACReg(pDM_Odm, 0x38, BIT11, 1); //DBG PAD Driving control (GPIO 8) - ODM_SetMACReg(pDM_Odm, 0x4c, BIT23, 0); //path-A , RFE_CTRL_3 & RFE_CTRL_4 + ODM_SetMACReg(pDM_Odm, 0x4c, BIT23, 0); //path-A , RFE_CTRL_3 + ODM_SetMACReg(pDM_Odm, 0x4c, BIT29, 1); //path-A , RFE_CTRL_8 //[BB] - ODM_SetBBReg(pDM_Odm, 0x944 , BIT4|BIT3, 0x3); //RFE_buffer + ODM_SetBBReg(pDM_Odm, 0x944 , BIT3, 1); //RFE_buffer + ODM_SetBBReg(pDM_Odm, 0x944 , BIT8, 1); ODM_SetBBReg(pDM_Odm, 0x940 , BIT7|BIT6, 0x0); // r_rfe_path_sel_ (RFE_CTRL_3) - ODM_SetBBReg(pDM_Odm, 0x940 , BIT9|BIT8, 0x0); // r_rfe_path_sel_ (RFE_CTRL_4) + ODM_SetBBReg(pDM_Odm, 0x940 , BIT17|BIT16, 0x0); // r_rfe_path_sel_ (RFE_CTRL_8) ODM_SetBBReg(pDM_Odm, 0x944 , BIT31, 0); //RFE_buffer ODM_SetBBReg(pDM_Odm, 0x92C , BIT3, 0); //rfe_inv (RFE_CTRL_3) - ODM_SetBBReg(pDM_Odm, 0x92C , BIT4, 1); //rfe_inv (RFE_CTRL_4) - ODM_SetBBReg(pDM_Odm, 0x930 , 0xFF000, 0x88); //path-A , RFE_CTRL_3 & 4=> ANTSEL[0] + ODM_SetBBReg(pDM_Odm, 0x92C , BIT8, 1); //rfe_inv (RFE_CTRL_8) + ODM_SetBBReg(pDM_Odm, 0x930 , 0xF000, 0x8); //path-A , RFE_CTRL_3 + ODM_SetBBReg(pDM_Odm, 0x934 , 0xF, 0x8); //path-A , RFE_CTRL_8 //3 ------------------------- //Pin Settings ODM_SetBBReg(pDM_Odm, 0xC50 , BIT8, 0); //path-A //disable CS/CG switch - ODM_SetBBReg(pDM_Odm, 0xC50 , BIT9, 1); //path-A //output at CG only + +/* Let it follows PHY_REG for bit9 setting + if(pDM_Odm->priv->pshare->rf_ft_var.use_ext_pa || pDM_Odm->priv->pshare->rf_ft_var.use_ext_lna) + ODM_SetBBReg(pDM_Odm, 0xC50 , BIT9, 1);//path-A //output at CS + else + ODM_SetBBReg(pDM_Odm, 0xC50 , BIT9, 0); //path-A //output at CG ->normal power +*/ + ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0); //path-A //antsel antselb by HW ODM_SetBBReg(pDM_Odm, 0xB38 , BIT10, 0); //path-A //antsel2 by HW @@ -529,30 +1104,45 @@ odm_TRX_HWAntDiv_Init_92E( //CCK Settings ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2 - ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 1); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 + ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 0); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples //Timming issue ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec) + + #ifdef ODM_EVM_ENHANCE_ANTDIV + //EVM enhance AntDiv method init---------------------------------------------------------------------- + pDM_FatTable->EVM_method_enable=0; + pDM_FatTable->FAT_State = NORMAL_STATE_MIAN; + pDM_Odm->antdiv_intvl = 0x64; + ODM_SetBBReg(pDM_Odm, 0x910 , 0x3f, 0xf ); + pDM_Odm->antdiv_evm_en=1; + //pDM_Odm->antdiv_period=1; + #endif } +#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) VOID odm_Smart_HWAntDiv_Init_92E( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_SMART_ANTDIV]\n")); + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_SMART_ANTDIV]\n")); } +#endif + #endif //#if (RTL8192E_SUPPORT == 1) #if (RTL8723B_SUPPORT == 1) VOID odm_TRX_HWAntDiv_Init_8723B( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8723B AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV(DPDT)]\n")); //Mapping Table @@ -597,18 +1187,16 @@ odm_TRX_HWAntDiv_Init_8723B( if(pDM_Odm->AntType == ODM_AUTO_ANT) ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function block enable - //ODM_SetBBReg(pDM_Odm, 0x80C , BIT21, 0); //TX Ant by Reg - - } VOID odm_S0S1_SWAntDiv_Init_8723B( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; @@ -637,11 +1225,12 @@ odm_S0S1_SWAntDiv_Init_8723B( VOID odm_S0S1_SWAntDiv_Reset_8723B( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { - pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; pDM_FatTable->bBecomeLinked =FALSE; pDM_SWAT_Table->try_flag = 0xff; @@ -653,12 +1242,13 @@ odm_S0S1_SWAntDiv_Reset_8723B( VOID ODM_UpdateRxIdleAnt_8723B( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte Ant, IN u4Byte DefaultAnt, IN u4Byte OptionalAnt ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; PADAPTER pAdapter = pDM_Odm->Adapter; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); @@ -740,19 +1330,11 @@ ODM_UpdateRxIdleAnt_8723B( #if (RTL8821A_SUPPORT == 1) VOID odm_TRX_HWAntDiv_Init_8821A( - IN PDM_ODM_T pDM_Odm -) + 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; - pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType)); -#else - pDM_Odm->AntType = ODM_AUTO_ANT; -#endif - pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (DPDT)] \n")); //Output Pin Settings @@ -775,12 +1357,6 @@ odm_TRX_HWAntDiv_Init_8821A( ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0); ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1); - //Set ANT1_8821A as MAIN_ANT - if((pDM_Odm->AntType == ODM_FIX_MAIN_ANT) || (pDM_Odm->AntType == ODM_AUTO_ANT)) - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - else - ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); - //OFDM HW AntDiv Parameters ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias @@ -802,29 +1378,18 @@ odm_TRX_HWAntDiv_Init_8821A( //response TX ant by RX ant ODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1); - - } VOID odm_S0S1_SWAntDiv_Init_8821A( - IN PDM_ODM_T pDM_Odm -) + IN PVOID pDM_VOID + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - - PADAPTER pAdapter = pDM_Odm->Adapter; - pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType)); -#else - pDM_Odm->AntType = ODM_AUTO_ANT; -#endif - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => AntDivType=[ S0S1_SW_AntDiv] \n")); //Output Pin Settings @@ -847,12 +1412,6 @@ odm_S0S1_SWAntDiv_Init_8821A( ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0); ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1); - //Set ANT1_8821A as MAIN_ANT - if((pDM_Odm->AntType == ODM_FIX_MAIN_ANT) || (pDM_Odm->AntType == ODM_AUTO_ANT)) - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - else - ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); - //OFDM HW AntDiv Parameters ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias @@ -874,8 +1433,8 @@ odm_S0S1_SWAntDiv_Init_8821A( //response TX ant by RX ant ODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1); - - + + ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); pDM_SWAT_Table->try_flag = 0xff; @@ -891,18 +1450,20 @@ odm_S0S1_SWAntDiv_Init_8821A( #if (RTL8881A_SUPPORT == 1) VOID odm_RX_HWAntDiv_Init_8881A( - IN PDM_ODM_T pDM_Odm -) + IN PVOID pDM_VOID + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8881A AntDiv_Init => AntDivType=[ CGCS_RX_HW_ANTDIV] \n")); } VOID odm_TRX_HWAntDiv_Init_8881A( - IN PDM_ODM_T pDM_Odm -) + IN PVOID pDM_VOID + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8881A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \n")); @@ -943,10 +1504,11 @@ odm_TRX_HWAntDiv_Init_8881A( #if (RTL8812A_SUPPORT == 1) VOID odm_TRX_HWAntDiv_Init_8812A( - IN PDM_ODM_T pDM_Odm -) + IN PVOID pDM_VOID + ) { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8812A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \n")); + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8812A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \n")); //3 //3 --RFE pin setting--------- //[BB] @@ -981,34 +1543,342 @@ odm_TRX_HWAntDiv_Init_8812A( ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); //TX Ant by Reg // A-cut bug } - -#endif //#if (RTL8812A_SUPPORT == 1) + +#endif //#if (RTL8812A_SUPPORT == 1) + + + + +#ifdef ODM_EVM_ENHANCE_ANTDIV + + + +VOID +odm_EVM_FastAnt_Reset( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + + pDM_FatTable->EVM_method_enable=0; + odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON); + pDM_FatTable->FAT_State = NORMAL_STATE_MIAN; + pDM_Odm->antdiv_period=0; + ODM_SetMACReg(pDM_Odm, 0x608, BIT8, 0); +} + + +VOID +odm_EVM_Enhance_AntDiv( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u4Byte Main_RSSI, Aux_RSSI ; + u4Byte Main_CRC_utility=0,Aux_CRC_utility=0,utility_ratio=1; + u4Byte Main_EVM, Aux_EVM,Diff_RSSI=0,diff_EVM=0; + u1Byte score_EVM=0,score_CRC=0; + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + u4Byte value32, i; + BOOLEAN Main_above1=FALSE,Aux_above1=FALSE; + BOOLEAN Force_antenna=FALSE; + PSTA_INFO_T pEntry; + pDM_FatTable->TargetAnt_enhance=0xFF; + + + if((pDM_Odm->SupportICType & ODM_EVM_ENHANCE_ANTDIV_SUPPORT_IC)) + { + if(pDM_Odm->bOneEntryOnly) + { + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[One Client only] \n")); + i = pDM_Odm->OneEntry_MACID; + + Main_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0; + Aux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0; + + if((Main_RSSI==0 && Aux_RSSI !=0 && Aux_RSSI>=FORCE_RSSI_DIFF) || (Main_RSSI!=0 && Aux_RSSI==0 && Main_RSSI>=FORCE_RSSI_DIFF)) + { + Diff_RSSI=FORCE_RSSI_DIFF; + } + else if(Main_RSSI!=0 && Aux_RSSI !=0) + { + Diff_RSSI = (Main_RSSI>=Aux_RSSI)?(Main_RSSI-Aux_RSSI):(Aux_RSSI-Main_RSSI); + } + + + 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)); + 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)); + + if( ((Main_RSSI>=Evm_RSSI_TH_High||Aux_RSSI>=Evm_RSSI_TH_High )|| (pDM_FatTable->EVM_method_enable==1) ) + //&& (Diff_RSSI <= FORCE_RSSI_DIFF + 1) + ) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[> TH_H || EVM_method_enable==1] && ")); + + if(((Main_RSSI>=Evm_RSSI_TH_Low)||(Aux_RSSI>=Evm_RSSI_TH_Low) )) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[> TH_L ] \n")); + + //2 [ Normal state Main] + if(pDM_FatTable->FAT_State == NORMAL_STATE_MIAN) + { + + pDM_FatTable->EVM_method_enable=1; + odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); + pDM_Odm->antdiv_period=3; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ start training: MIAN] \n")); + pDM_FatTable->MainAntEVM_Sum[i] = 0; + pDM_FatTable->AuxAntEVM_Sum[i] = 0; + pDM_FatTable->MainAntEVM_Cnt[i] = 0; + pDM_FatTable->AuxAntEVM_Cnt[i] = 0; + + pDM_FatTable->FAT_State = NORMAL_STATE_AUX; + ODM_SetMACReg(pDM_Odm, 0x608, BIT8, 1); //Accept CRC32 Error packets. + ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); + + pDM_FatTable->CRC32_Ok_Cnt=0; + pDM_FatTable->CRC32_Fail_Cnt=0; + ODM_SetTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer, pDM_Odm->antdiv_intvl ); //m + } + //2 [ Normal state Aux ] + else if(pDM_FatTable->FAT_State == NORMAL_STATE_AUX) + { + pDM_FatTable->MainCRC32_Ok_Cnt=pDM_FatTable->CRC32_Ok_Cnt; + pDM_FatTable->MainCRC32_Fail_Cnt=pDM_FatTable->CRC32_Fail_Cnt; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ start training: AUX] \n")); + pDM_FatTable->FAT_State = TRAINING_STATE; + ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); + + pDM_FatTable->CRC32_Ok_Cnt=0; + pDM_FatTable->CRC32_Fail_Cnt=0; + ODM_SetTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer, pDM_Odm->antdiv_intvl ); //ms + } + else if(pDM_FatTable->FAT_State == TRAINING_STATE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Training state ] \n")); + pDM_FatTable->FAT_State = NORMAL_STATE_MIAN; + + //3 [CRC32 statistic] + pDM_FatTable->AuxCRC32_Ok_Cnt=pDM_FatTable->CRC32_Ok_Cnt; + pDM_FatTable->AuxCRC32_Fail_Cnt=pDM_FatTable->CRC32_Fail_Cnt; + + if( (pDM_FatTable->MainCRC32_Ok_Cnt >= ((pDM_FatTable->AuxCRC32_Ok_Cnt)<<1)) || (Diff_RSSI>=18)) + { + pDM_FatTable->TargetAnt_CRC32=MAIN_ANT; + Force_antenna=TRUE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("CRC32 Force Main \n")); + } + else if((pDM_FatTable->AuxCRC32_Ok_Cnt >= ((pDM_FatTable->MainCRC32_Ok_Cnt)<<1)) || (Diff_RSSI>=18)) + { + pDM_FatTable->TargetAnt_CRC32=AUX_ANT; + Force_antenna=TRUE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("CRC32 Force Aux \n")); + } + else + { + if(pDM_FatTable->MainCRC32_Fail_Cnt<=5) + pDM_FatTable->MainCRC32_Fail_Cnt=5; + + if(pDM_FatTable->AuxCRC32_Fail_Cnt<=5) + pDM_FatTable->AuxCRC32_Fail_Cnt=5; + + if(pDM_FatTable->MainCRC32_Ok_Cnt >pDM_FatTable->MainCRC32_Fail_Cnt ) + Main_above1=TRUE; + + if(pDM_FatTable->AuxCRC32_Ok_Cnt >pDM_FatTable->AuxCRC32_Fail_Cnt ) + Aux_above1=TRUE; + + if(Main_above1==TRUE && Aux_above1==FALSE) + { + Force_antenna=TRUE; + pDM_FatTable->TargetAnt_CRC32=MAIN_ANT; + } + else if(Main_above1==FALSE && Aux_above1==TRUE) + { + Force_antenna=TRUE; + pDM_FatTable->TargetAnt_CRC32=AUX_ANT; + } + else if(Main_above1==TRUE && Aux_above1==TRUE) + { + Main_CRC_utility=((pDM_FatTable->MainCRC32_Ok_Cnt)<<7)/pDM_FatTable->MainCRC32_Fail_Cnt; + Aux_CRC_utility=((pDM_FatTable->AuxCRC32_Ok_Cnt)<<7)/pDM_FatTable->AuxCRC32_Fail_Cnt; + pDM_FatTable->TargetAnt_CRC32 = (Main_CRC_utility==Aux_CRC_utility)?(pDM_FatTable->pre_TargetAnt_enhance):((Main_CRC_utility>=Aux_CRC_utility)?MAIN_ANT:AUX_ANT); + + if(Main_CRC_utility!=0 && Aux_CRC_utility!=0) + { + if(Main_CRC_utility>=Aux_CRC_utility) + utility_ratio=(Main_CRC_utility<<1)/Aux_CRC_utility; + else + utility_ratio=(Aux_CRC_utility<<1)/Main_CRC_utility; + } + } + else if(Main_above1==FALSE && Aux_above1==FALSE) + { + if(pDM_FatTable->MainCRC32_Ok_Cnt==0) + pDM_FatTable->MainCRC32_Ok_Cnt=1; + if(pDM_FatTable->AuxCRC32_Ok_Cnt==0) + pDM_FatTable->AuxCRC32_Ok_Cnt=1; + + Main_CRC_utility=((pDM_FatTable->MainCRC32_Fail_Cnt)<<7)/pDM_FatTable->MainCRC32_Ok_Cnt; + Aux_CRC_utility=((pDM_FatTable->AuxCRC32_Fail_Cnt)<<7)/pDM_FatTable->AuxCRC32_Ok_Cnt; + pDM_FatTable->TargetAnt_CRC32 = (Main_CRC_utility==Aux_CRC_utility)?(pDM_FatTable->pre_TargetAnt_enhance):((Main_CRC_utility<=Aux_CRC_utility)?MAIN_ANT:AUX_ANT); + + if(Main_CRC_utility!=0 && Aux_CRC_utility!=0) + { + if(Main_CRC_utility>=Aux_CRC_utility) + utility_ratio=(Main_CRC_utility<<1)/(Aux_CRC_utility); + else + utility_ratio=(Aux_CRC_utility<<1)/(Main_CRC_utility); + } + } + } + ODM_SetMACReg(pDM_Odm, 0x608, BIT8, 0);//NOT Accept CRC32 Error packets. + + //3 [EVM statistic] + Main_EVM = (pDM_FatTable->MainAntEVM_Cnt[i]!=0)?(pDM_FatTable->MainAntEVM_Sum[i]/pDM_FatTable->MainAntEVM_Cnt[i]):0; + Aux_EVM = (pDM_FatTable->AuxAntEVM_Cnt[i]!=0)?(pDM_FatTable->AuxAntEVM_Sum[i]/pDM_FatTable->AuxAntEVM_Cnt[i]):0; + pDM_FatTable->TargetAnt_EVM = (Main_EVM==Aux_EVM)?(pDM_FatTable->pre_TargetAnt_enhance):((Main_EVM>=Aux_EVM)?MAIN_ANT:AUX_ANT); + + if((Main_EVM==0 || Aux_EVM==0)) + diff_EVM=0; + else if(Main_EVM>=Aux_EVM) + diff_EVM=Main_EVM-Aux_EVM; + else + diff_EVM=Aux_EVM-Main_EVM; + + //2 [ Decision state ] + if(pDM_FatTable->TargetAnt_EVM ==pDM_FatTable->TargetAnt_CRC32 ) + { + if( (utility_ratio<2 && Force_antenna==FALSE) && diff_EVM<=2) + pDM_FatTable->TargetAnt_enhance=pDM_FatTable->pre_TargetAnt_enhance; + else + pDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_EVM; + } + else if(diff_EVM<=2 && (utility_ratio > 4 && Force_antenna==FALSE)) + { + pDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_CRC32; + } + else if(diff_EVM>=20) // + { + pDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_EVM; + } + else if(utility_ratio>=6 && Force_antenna==FALSE) // utility_ratio>3 + { + pDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_CRC32; + } + else + { + if(Force_antenna==TRUE) + score_CRC=3; + else if(utility_ratio>=4) //>2 + score_CRC=2; + else if(utility_ratio>=3) //>1.5 + score_CRC=1; + else + score_CRC=0; + + if(diff_EVM>=10) + score_EVM=2; + else if(diff_EVM>=5) + score_EVM=1; + else + score_EVM=0; + + if(score_CRC>score_EVM) + pDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_CRC32; + else if(score_CRCTargetAnt_enhance=pDM_FatTable->TargetAnt_EVM; + else + pDM_FatTable->TargetAnt_enhance=pDM_FatTable->pre_TargetAnt_enhance; + } + pDM_FatTable->pre_TargetAnt_enhance=pDM_FatTable->TargetAnt_enhance; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : MainEVM_Cnt = (( %d )) , Main_EVM= (( %d )) \n",i, pDM_FatTable->MainAntEVM_Cnt[i], Main_EVM)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : AuxEVM_Cnt = (( %d )) , Aux_EVM = (( %d )) \n" ,i, pDM_FatTable->AuxAntEVM_Cnt[i] , Aux_EVM)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** TargetAnt_EVM = (( %s ))\n", ( pDM_FatTable->TargetAnt_EVM ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("M_CRC_Ok = (( %d )) , M_CRC_Fail = (( %d )), Main_CRC_utility = (( %d )) \n" , pDM_FatTable->MainCRC32_Ok_Cnt, pDM_FatTable->MainCRC32_Fail_Cnt,Main_CRC_utility)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("A_CRC_Ok = (( %d )) , A_CRC_Fail = (( %d )), Aux_CRC_utility = (( %d )) \n" , pDM_FatTable->AuxCRC32_Ok_Cnt, pDM_FatTable->AuxCRC32_Fail_Cnt,Aux_CRC_utility)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** TargetAnt_CRC32 = (( %s ))\n", ( pDM_FatTable->TargetAnt_CRC32 ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("****** TargetAnt_enhance = (( %s ))******\n", ( pDM_FatTable->TargetAnt_enhance ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); + + + } + } + else // RSSI< = Evm_RSSI_TH_Low + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ TH_L ] \n")); + odm_EVM_FastAnt_Reset(pDM_Odm); + } + } + else + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[escape from> TH_H || EVM_method_enable==1] \n")); + odm_EVM_FastAnt_Reset(pDM_Odm); + } + } + else + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[multi-Client] \n")); + odm_EVM_FastAnt_Reset(pDM_Odm); + } + } +} + +VOID +odm_EVM_FastAntTrainingCallback( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("******odm_EVM_FastAntTrainingCallback****** \n")); + odm_HW_AntDiv(pDM_Odm); +} +#endif VOID odm_HW_AntDiv( - IN PDM_ODM_T pDM_Odm -) + IN PVOID pDM_VOID + ) { - u4Byte i,MinMaxRSSI=0xFF, AntDivMaxRSSI=0, MaxRSSI=0, LocalMaxRSSI; - u4Byte Main_RSSI, Aux_RSSI, pkt_ratio_m=0, pkt_ratio_a=0,pkt_threshold=10; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u4Byte i,MinMaxRSSI=0xFF, AntDivMaxRSSI=0, MaxRSSI=0, LocalMaxRSSI; + u4Byte Main_RSSI, Aux_RSSI; u1Byte RxIdleAnt=0, TargetAnt=7; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; PSTA_INFO_T pEntry; + #ifdef BEAMFORMING_SUPPORT + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + pBDC_T pDM_BdcTable = &pDM_Odm->DM_BdcTable; + u4Byte TH1=500000; + u4Byte TH2=10000000; + u4Byte MA_rx_Temp, degrade_TP_temp, improve_TP_temp; + u1Byte Monitor_RSSI_threshold=30; + + pDM_BdcTable->BF_pass=TRUE; + pDM_BdcTable->DIV_pass=TRUE; + pDM_BdcTable->bAll_DivSta_Idle=TRUE; + pDM_BdcTable->bAll_BFSta_Idle=TRUE; + pDM_BdcTable->num_BfTar=0 ; + pDM_BdcTable->num_DivTar=0; + pDM_BdcTable->num_Client=0; + #endif + #endif + if(!pDM_Odm->bLinked) //bLinked==False { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n")); - - #if(DM_ODM_SUPPORT_TYPE == ODM_AP) - if (pDM_Odm->antdiv_rssi) - panic_printk("[No Link!!!]\n"); - #endif - + if(pDM_FatTable->bBecomeLinked == TRUE) { odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); + odm_Tx_By_TxDesc_or_Reg(pDM_Odm , REG); + pDM_Odm->antdiv_period=0; pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked; } @@ -1020,11 +1890,13 @@ odm_HW_AntDiv( { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n")); odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON); + odm_Tx_By_TxDesc_or_Reg(pDM_Odm , TX_BY_DESC); + //if(pDM_Odm->SupportICType == ODM_RTL8821 ) //ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable //#if(DM_ODM_SUPPORT_TYPE == ODM_AP) - //else if(pDM_Odm->SupportICType == ODM_RTL8881 ) + //else if(pDM_Odm->SupportICType == ODM_RTL8881A) // ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable //#endif @@ -1038,11 +1910,45 @@ odm_HW_AntDiv( ODM_SetBBReg(pDM_Odm, 0x930 , 0xF0, 8); // DPDT_P = ANTSEL[0] // for 8723B AntDiv function patch. BB Dino 130412 ODM_SetBBReg(pDM_Odm, 0x930 , 0xF, 8); // DPDT_N = ANTSEL[0] } + + //2 BDC Init + #ifdef BEAMFORMING_SUPPORT + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + odm_BDC_Init(pDM_Odm); + #endif + #endif + + #ifdef ODM_EVM_ENHANCE_ANTDIV + odm_EVM_FastAnt_Reset(pDM_Odm); + #endif } } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n[HW AntDiv] Start =>\n")); - + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n AntDiv Start =>\n")); + + #ifdef ODM_EVM_ENHANCE_ANTDIV + if(pDM_Odm->antdiv_evm_en==1) + { + odm_EVM_Enhance_AntDiv(pDM_Odm); + if(pDM_FatTable->FAT_State !=NORMAL_STATE_MIAN) + return; + } + else + { + odm_EVM_FastAnt_Reset(pDM_Odm); + } + #endif + + //2 BDC Mode Arbitration + #ifdef BEAMFORMING_SUPPORT + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + if(pDM_Odm->antdiv_evm_en == 0 ||pDM_FatTable->EVM_method_enable==0) + { + odm_BF_AntDiv_ModeArbitration(pDM_Odm); + } + #endif + #endif + for (i=0; ipODM_StaInfo[i]; @@ -1052,39 +1958,13 @@ odm_HW_AntDiv( Main_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0; Aux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0; TargetAnt = (Main_RSSI==Aux_RSSI)?pDM_FatTable->RxIdleAnt:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT); - /* - if( pDM_FatTable->MainAnt_Cnt[i]!=0 && pDM_FatTable->AuxAnt_Cnt[i]!=0 ) - { - pkt_ratio_m=( pDM_FatTable->MainAnt_Cnt[i] / pDM_FatTable->AuxAnt_Cnt[i] ); - pkt_ratio_a=( pDM_FatTable->AuxAnt_Cnt[i] / pDM_FatTable->MainAnt_Cnt[i] ); - - if (pkt_ratio_m >= pkt_threshold) - TargetAnt=MAIN_ANT; - - else if(pkt_ratio_a >= pkt_threshold) - TargetAnt=AUX_ANT; - } - */ - //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** SupportICType=[%lu] \n",pDM_Odm->SupportICType)); - 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)); - 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 )); - 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")); - - 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, - ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0))); - #if(DM_ODM_SUPPORT_TYPE == ODM_AP) - if (pDM_Odm->antdiv_rssi) - { - panic_printk("*** SupportICType=[%lu] \n",pDM_Odm->SupportICType); - //panic_printk("*** Phy_AntSel_A=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT2)>>2, - // ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0)); - //panic_printk("*** Phy_AntSel_B=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT2)>>2, - // ((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT0)) - panic_printk("*** Client[ %lu ] , Main_Cnt = (( %lu )) , Main_RSSI= (( %lu )) \n",i, pDM_FatTable->MainAnt_Cnt[i], Main_RSSI); - panic_printk("*** Client[ %lu ] , Aux_Cnt = (( %lu )) , Aux_RSSI = (( %lu )) \n" ,i, pDM_FatTable->AuxAnt_Cnt[i] , Aux_RSSI); - } - #endif - + + //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** SupportICType=[%d] \n",pDM_Odm->SupportICType)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : Main_Cnt = (( %d )) , Main_RSSI= (( %d )) \n",i, pDM_FatTable->MainAnt_Cnt[i], Main_RSSI)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : Aux_Cnt = (( %d )) , Aux_RSSI = (( %d )) \n" ,i, pDM_FatTable->AuxAnt_Cnt[i] , Aux_RSSI)); + //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")); + //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, + // ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0))); LocalMaxRSSI = (Main_RSSI>Aux_RSSI)?Main_RSSI:Aux_RSSI; //2 Select MaxRSSI for DIG @@ -1099,47 +1979,173 @@ odm_HW_AntDiv( RxIdleAnt = TargetAnt; MinMaxRSSI = LocalMaxRSSI; } - /* - if((pDM_FatTable->RxIdleAnt == MAIN_ANT) && (Main_RSSI == 0)) - Main_RSSI = Aux_RSSI; - else if((pDM_FatTable->RxIdleAnt == AUX_ANT) && (Aux_RSSI == 0)) - Aux_RSSI = Main_RSSI; - - LocalMinRSSI = (Main_RSSI>Aux_RSSI)?Aux_RSSI:Main_RSSI; - if(LocalMinRSSI < MinRSSI) + + #ifdef ODM_EVM_ENHANCE_ANTDIV + if(pDM_Odm->antdiv_evm_en==1) { - MinRSSI = LocalMinRSSI; - RxIdleAnt = TargetAnt; - } - */ + if(pDM_FatTable->TargetAnt_enhance!=0xFF) + { + TargetAnt=pDM_FatTable->TargetAnt_enhance; + RxIdleAnt = pDM_FatTable->TargetAnt_enhance; + } + } + #endif + //2 Select TX Antenna + if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) + { + #ifdef BEAMFORMING_SUPPORT + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + if(pDM_BdcTable->w_BFee_Client[i]==0) + #endif + #endif + { + odm_UpdateTxAnt(pDM_Odm, TargetAnt, i); + } + } + + //------------------------------------------------------------ + + #ifdef BEAMFORMING_SUPPORT + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + + pDM_BdcTable->num_Client++; + + if(pDM_BdcTable->BDC_Mode==BDC_MODE_2 ||pDM_BdcTable->BDC_Mode==BDC_MODE_3) + { + //2 Byte Counter + + MA_rx_Temp= (pEntry->rx_byte_cnt_LowMAW)<<3 ; // RX TP ( bit /sec) + + if(pDM_BdcTable->BDC_state==BDC_BFer_TRAIN_STATE) + { + pDM_BdcTable->MA_rx_TP_DIV[i]= MA_rx_Temp ; + } + else + { + pDM_BdcTable->MA_rx_TP[i] =MA_rx_Temp ; + } + + if( (MA_rx_Temp < TH2) && (MA_rx_Temp > TH1) && (LocalMaxRSSI<=Monitor_RSSI_threshold)) + { + if(pDM_BdcTable->w_BFer_Client[i]==1) // Bfer_Target + { + pDM_BdcTable->num_BfTar++; + + if(pDM_BdcTable->BDC_state==BDC_DECISION_STATE && pDM_BdcTable->BDC_Try_flag==0) + { + improve_TP_temp = (pDM_BdcTable->MA_rx_TP_DIV[i] * 9)>>3 ; //* 1.125 + pDM_BdcTable->BF_pass = (pDM_BdcTable->MA_rx_TP[i] > improve_TP_temp)?TRUE:FALSE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : { MA_rx_TP,improve_TP_temp , MA_rx_TP_DIV, BF_pass}={ %d, %d, %d , %d } \n" ,i,pDM_BdcTable->MA_rx_TP[i],improve_TP_temp,pDM_BdcTable->MA_rx_TP_DIV[i], pDM_BdcTable->BF_pass )); + } + } + else// DIV_Target + { + pDM_BdcTable->num_DivTar++; + + if(pDM_BdcTable->BDC_state==BDC_DECISION_STATE && pDM_BdcTable->BDC_Try_flag==0) + { + degrade_TP_temp=(pDM_BdcTable->MA_rx_TP_DIV[i]*5)>>3;//* 0.625 + pDM_BdcTable->DIV_pass = (pDM_BdcTable->MA_rx_TP[i] >degrade_TP_temp)?TRUE:FALSE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : { MA_rx_TP, degrade_TP_temp , MA_rx_TP_DIV, DIV_pass}=\n{ %d, %d, %d , %d } \n" ,i,pDM_BdcTable->MA_rx_TP[i],degrade_TP_temp,pDM_BdcTable->MA_rx_TP_DIV[i], pDM_BdcTable->DIV_pass )); + } + } + } - #if TX_BY_REG + if(MA_rx_Temp > TH1) + { + if(pDM_BdcTable->w_BFer_Client[i]==1) // Bfer_Target + { + pDM_BdcTable->bAll_BFSta_Idle=FALSE; + } + else// DIV_Target + { + pDM_BdcTable->bAll_DivSta_Idle=FALSE; + } + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : { BFmeeCap , BFmerCap} = { %d , %d } \n" ,i, pDM_BdcTable->w_BFee_Client[i] , pDM_BdcTable->w_BFer_Client[i])); + + if(pDM_BdcTable->BDC_state==BDC_BFer_TRAIN_STATE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : MA_rx_TP_DIV = (( %d )) \n",i,pDM_BdcTable->MA_rx_TP_DIV[i] )); + + } + else + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : MA_rx_TP = (( %d )) \n",i,pDM_BdcTable->MA_rx_TP[i] )); + } - #else - if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) - odm_UpdateTxAnt(pDM_Odm, TargetAnt, i); + } + #endif #endif } - pDM_FatTable->MainAnt_Sum[i] = 0; - pDM_FatTable->AuxAnt_Sum[i] = 0; - pDM_FatTable->MainAnt_Cnt[i] = 0; - pDM_FatTable->AuxAnt_Cnt[i] = 0; + + #ifdef BEAMFORMING_SUPPORT + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + if(pDM_BdcTable->BDC_Try_flag==0) + #endif + #endif + { + pDM_FatTable->MainAnt_Sum[i] = 0; + pDM_FatTable->AuxAnt_Sum[i] = 0; + pDM_FatTable->MainAnt_Cnt[i] = 0; + pDM_FatTable->AuxAnt_Cnt[i] = 0; + } } - //2 Set RX Idle Antenna - ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt); - #if(DM_ODM_SUPPORT_TYPE == ODM_AP) - if (pDM_Odm->antdiv_rssi) - panic_printk("*** RxIdleAnt = (( %s )) \n \n", ( RxIdleAnt ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"); - #endif + //2 Set RX Idle Antenna & TX Antenna(Because of HW Bug ) + #if(DM_ODM_SUPPORT_TYPE == ODM_AP ) + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** RxIdleAnt = (( %s ))\n\n", ( RxIdleAnt ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); + + #ifdef BEAMFORMING_SUPPORT + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + if(pDM_BdcTable->BDC_Mode==BDC_MODE_1 ||pDM_BdcTable->BDC_Mode==BDC_MODE_3) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** BDC_RxIdleUpdate_counter = (( %d ))\n", pDM_BdcTable->BDC_RxIdleUpdate_counter)); + + if(pDM_BdcTable->BDC_RxIdleUpdate_counter==1) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***Update RxIdle Antenna!!! \n")); + pDM_BdcTable->BDC_RxIdleUpdate_counter=30; + ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt); + } + else + { + pDM_BdcTable->BDC_RxIdleUpdate_counter--; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***NOT update RxIdle Antenna because of BF ( need to fix TX-ant)\n")); + } + } + else + #endif + #endif + ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt); + #else + + ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt); + + #endif//#if(DM_ODM_SUPPORT_TYPE == ODM_AP) + + + + //2 BDC Main Algorithm + #ifdef BEAMFORMING_SUPPORT + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + if(pDM_Odm->antdiv_evm_en ==0 ||pDM_FatTable->EVM_method_enable==0) + { + odm_BDCcoex_BFeeRxDiv_Arbitration(pDM_Odm); + } + #endif + #endif + if(AntDivMaxRSSI == 0) pDM_DigTable->AntDiv_RSSI_max = pDM_Odm->RSSI_Min; else - pDM_DigTable->AntDiv_RSSI_max = AntDivMaxRSSI; + pDM_DigTable->AntDiv_RSSI_max = AntDivMaxRSSI; + pDM_DigTable->RSSI_max = MaxRSSI; } @@ -1148,16 +2154,17 @@ odm_HW_AntDiv( #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) VOID odm_S0S1_SwAntDiv( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte Step ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u4Byte i,MinMaxRSSI=0xFF, LocalMaxRSSI,LocalMinRSSI; u4Byte Main_RSSI, Aux_RSSI; u1Byte reset_period=10, SWAntDiv_threshold=35; u1Byte HighTraffic_TrainTime_U=0x32,HighTraffic_TrainTime_L=0,Train_time_temp; u1Byte LowTraffic_TrainTime_U=200,LowTraffic_TrainTime_L=0; - pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; + pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; u1Byte RxIdleAnt = pDM_SWAT_Table->PreAntenna, TargetAnt, nextAnt=0; PSTA_INFO_T pEntry=NULL; @@ -1199,8 +2206,8 @@ odm_S0S1_SwAntDiv( pDM_SWAT_Table->lastTxOkCnt = 0; pDM_SWAT_Table->lastRxOkCnt =0; - TxCntOffset = *(pDM_Odm->pNumTxBytesUnicast); - RxCntOffset = *(pDM_Odm->pNumRxBytesUnicast); + TxCntOffset = *(pDM_Odm->pNumTxBytesUnicast); + RxCntOffset = *(pDM_Odm->pNumRxBytesUnicast); pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked; } @@ -1236,15 +2243,15 @@ odm_S0S1_SwAntDiv( { //---trafic decision--- - curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt - TxCntOffset; - curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt - RxCntOffset; + curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt - TxCntOffset; + curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt - RxCntOffset; pDM_SWAT_Table->lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast); pDM_SWAT_Table->lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast); if (curTxOkCnt > 1875000 || curRxOkCnt > 1875000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000) ( 1.875M * 8bit ) / 2= 7.5M bits /sec ) { pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH; - Train_time_temp=pDM_SWAT_Table->Train_time ; + Train_time_temp = pDM_SWAT_Table->Train_time ; if(pDM_SWAT_Table->Train_time_flag==3) { @@ -1291,7 +2298,7 @@ odm_S0S1_SwAntDiv( { pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW; Train_time_temp=pDM_SWAT_Table->Train_time ; - + if(pDM_SWAT_Table->Train_time_flag==3) { LowTraffic_TrainTime_L=10; @@ -1312,7 +2319,7 @@ odm_S0S1_SwAntDiv( } else Train_time_temp+=10; - + //-- if(Train_time_temp >= LowTraffic_TrainTime_U) Train_time_temp=LowTraffic_TrainTime_U; @@ -1321,7 +2328,7 @@ odm_S0S1_SwAntDiv( Train_time_temp=LowTraffic_TrainTime_L; pDM_SWAT_Table->Train_time = Train_time_temp; //50ms~20ms - + 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)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [Low Traffic] \n" )); } @@ -1356,10 +2363,10 @@ odm_S0S1_SwAntDiv( pDM_SWAT_Table->Double_chk_flag =1; pDM_SWAT_Table->try_flag = 1; - pDM_SWAT_Table->RSSI_Trying = 0; + pDM_SWAT_Table->RSSI_Trying = 0; 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)); - ODM_UpdateRxIdleAnt(pDM_Odm, pDM_FatTable->RxIdleAnt); + ODM_UpdateRxIdleAnt(pDM_Odm, pDM_FatTable->RxIdleAnt); ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer_8723B, pDM_SWAT_Table->Train_time ); //ms return; } @@ -1372,9 +2379,9 @@ odm_S0S1_SwAntDiv( pDM_SWAT_Table->RSSI_Trying = 2; else pDM_SWAT_Table->RSSI_Trying = 1; - + odm_S0S1_SwAntDivByCtrlFrame(pDM_Odm, SWAW_STEP_PEAK); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag=1] Normal State: Begin Trying!! \n")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag=1] Normal State: Begin Trying!! \n")); } else if(pDM_SWAT_Table->try_flag == 1 && pDM_SWAT_Table->Double_chk_flag== 0) @@ -1388,7 +2395,7 @@ odm_S0S1_SwAntDiv( { BOOLEAN bByCtrlFrame = FALSE; u8Byte pkt_cnt_total = 0; - + for (i=0; ipODM_StaInfo[i]; @@ -1403,7 +2410,7 @@ odm_S0S1_SwAntDiv( if(pDM_FatTable->AuxAnt_Cnt[i]<=1 && pDM_FatTable->CCK_counter_aux>=1) Aux_RSSI=0; - + TargetAnt = (Main_RSSI==Aux_RSSI)?pDM_SWAT_Table->PreAntenna:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT); LocalMaxRSSI = (Main_RSSI>=Aux_RSSI) ? Main_RSSI : Aux_RSSI; LocalMinRSSI = (Main_RSSI>=Aux_RSSI) ? Aux_RSSI : Main_RSSI; @@ -1418,28 +2425,28 @@ odm_S0S1_SwAntDiv( if (LocalMaxRSSI != 0 && LocalMaxRSSI < MinMaxRSSI) { - RxIdleAnt = TargetAnt; - MinMaxRSSI = LocalMaxRSSI; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** LocalMaxRSSI-LocalMinRSSI = ((%d))\n",(LocalMaxRSSI-LocalMinRSSI))); - - if((LocalMaxRSSI-LocalMinRSSI)>8) + RxIdleAnt = TargetAnt; + MinMaxRSSI = LocalMaxRSSI; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** LocalMaxRSSI-LocalMinRSSI = ((%d))\n",(LocalMaxRSSI-LocalMinRSSI))); + + if((LocalMaxRSSI-LocalMinRSSI)>8) + { + if(LocalMinRSSI != 0) + pDM_SWAT_Table->Train_time_flag=3; + else { - if(LocalMinRSSI != 0) - pDM_SWAT_Table->Train_time_flag=3; + if(MinMaxRSSI > SWAntDiv_threshold) + pDM_SWAT_Table->Train_time_flag=0; else - { - if(MinMaxRSSI > SWAntDiv_threshold) - pDM_SWAT_Table->Train_time_flag=0; - else - pDM_SWAT_Table->Train_time_flag=3; - } + pDM_SWAT_Table->Train_time_flag=3; } - else if((LocalMaxRSSI-LocalMinRSSI)>5) - pDM_SWAT_Table->Train_time_flag=2; - else if((LocalMaxRSSI-LocalMinRSSI)>2) - pDM_SWAT_Table->Train_time_flag=1; - else - pDM_SWAT_Table->Train_time_flag=0; + } + else if((LocalMaxRSSI-LocalMinRSSI)>5) + pDM_SWAT_Table->Train_time_flag=2; + else if((LocalMaxRSSI-LocalMinRSSI)>2) + pDM_SWAT_Table->Train_time_flag=1; + else + pDM_SWAT_Table->Train_time_flag=0; } @@ -1450,10 +2457,10 @@ odm_S0S1_SwAntDiv( pDM_FatTable->antsel_a[i] = ANT2_2G; } - pDM_FatTable->MainAnt_Sum[i] = 0; - pDM_FatTable->AuxAnt_Sum[i] = 0; - pDM_FatTable->MainAnt_Cnt[i] = 0; - pDM_FatTable->AuxAnt_Cnt[i] = 0; + pDM_FatTable->MainAnt_Sum[i] = 0; + pDM_FatTable->AuxAnt_Sum[i] = 0; + pDM_FatTable->MainAnt_Cnt[i] = 0; + pDM_FatTable->AuxAnt_Cnt[i] = 0; } if(pDM_SWAT_Table->bSWAntDivByCtrlFrame) @@ -1470,7 +2477,7 @@ odm_S0S1_SwAntDiv( pDM_FatTable->OFDM_counter_aux=0; ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Control frame packet counter = %d, Data frame packet counter = %llu\n", pDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame, pkt_cnt_total)); - + if(MinMaxRSSI == 0xff || ((pkt_cnt_total < (pDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame >> 1)) && pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2)) { MinMaxRSSI = 0; @@ -1493,7 +2500,7 @@ odm_S0S1_SwAntDiv( RxIdleAnt = (Main_RSSI==Aux_RSSI)?pDM_SWAT_Table->PreAntenna:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT); LocalMaxRSSI = (Main_RSSI>=Aux_RSSI) ? Main_RSSI : Aux_RSSI; LocalMinRSSI = (Main_RSSI>=Aux_RSSI) ? Aux_RSSI : Main_RSSI; - + if((LocalMaxRSSI-LocalMinRSSI)>8) pDM_SWAT_Table->Train_time_flag=3; else if((LocalMaxRSSI-LocalMinRSSI)>5) @@ -1508,8 +2515,8 @@ odm_S0S1_SwAntDiv( } } } - - pDM_FatTable->MinMaxRSSI=MinMaxRSSI; + + pDM_FatTable->MinMaxRSSI = MinMaxRSSI; pDM_SWAT_Table->try_flag = 0; if( pDM_SWAT_Table->Double_chk_flag==1) @@ -1545,7 +2552,7 @@ odm_S0S1_SwAntDiv( pDM_SWAT_Table->PreAntenna =RxIdleAnt; ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt ); ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[reset try_flag = 0] Training accomplished !!!] \n\n\n")); - return; + return; } } @@ -1607,45 +2614,27 @@ ODM_SW_AntDiv_WorkitemCallback( #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) -VOID -ODM_SW_AntDiv_WorkitemCallback( - IN PVOID pContext - ) -{ - PADAPTER pAdapter = (PADAPTER)pContext; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - //DbgPrint("SW_antdiv_Workitem_Callback"); - odm_S0S1_SwAntDiv(&pHalData->odmpriv, SWAW_STEP_DETERMINE); -} - VOID ODM_SW_AntDiv_Callback(void *FunctionContext) { PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext; PADAPTER padapter = pDM_Odm->Adapter; - - if(padapter->net_closed == _TRUE) return; - -#if 0 // Can't do I/O in timer callback odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_DETERMINE); -#else - rtw_run_in_thread_cmd(padapter, ODM_SW_AntDiv_WorkitemCallback, padapter); -#endif } -#endif +#endif #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) VOID odm_S0S1_SwAntDivByCtrlFrame( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte Step ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; @@ -1676,11 +2665,13 @@ odm_S0S1_SwAntDivByCtrlFrame( VOID odm_AntselStatisticsOfCtrlFrame( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte antsel_tr_mux, IN u4Byte RxPWDBAll -) + + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; if(antsel_tr_mux == ANT1_2G) @@ -1697,11 +2688,16 @@ odm_AntselStatisticsOfCtrlFrame( VOID odm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI( - IN PDM_ODM_T pDM_Odm, - IN PODM_PHY_INFO_T pPhyInfo, - IN PODM_PACKET_INFO_T pPktinfo + IN PVOID pDM_VOID, + IN PVOID p_phy_info_void, + IN PVOID p_pkt_info_void + //IN PODM_PHY_INFO_T pPhyInfo, + //IN PODM_PACKET_INFO_T pPktinfo ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PODM_PHY_INFO_T pPhyInfo=(PODM_PHY_INFO_T)p_phy_info_void; + PODM_PACKET_INFO_T pPktinfo=(PODM_PACKET_INFO_T)p_pkt_info_void; pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; BOOLEAN isCCKrate; @@ -1747,17 +2743,17 @@ odm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI( #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#endif //#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) -#endif //#if (RTL8723B_SUPPORT == 1) +#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) -#if(RTL8188E_SUPPORT == 1 || RTL8192E_SUPPORT == 1) -#if (!(DM_ODM_SUPPORT_TYPE == ODM_CE)) VOID odm_SetNextMACAddrTarget( - IN PDM_ODM_T pDM_Odm -) + IN PVOID pDM_VOID + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; PSTA_INFO_T pEntry; //u1Byte Bssid[6]; @@ -1785,15 +2781,18 @@ odm_SetNextMACAddrTarget( #else value32 = (pEntry->MacAddr[5]<<8)|pEntry->MacAddr[4]; #endif - ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32); + + ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32);//0x7b4~0x7b5 + #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) value32 = (pEntry->hwaddr[3]<<24)|(pEntry->hwaddr[2]<<16) |(pEntry->hwaddr[1]<<8) |pEntry->hwaddr[0]; #else value32 = (pEntry->MacAddr[3]<<24)|(pEntry->MacAddr[2]<<16) |(pEntry->MacAddr[1]<<8) |pEntry->MacAddr[0]; #endif - ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32); + ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32);//0x7b0~0x7b3 - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_FatTable->TrainIdx=%lu\n",pDM_FatTable->TrainIdx)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_FatTable->TrainIdx=%d\n",pDM_FatTable->TrainIdx)); + #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training MAC Addr = %x:%x:%x:%x:%x:%x\n", pEntry->hwaddr[5],pEntry->hwaddr[4],pEntry->hwaddr[3],pEntry->hwaddr[2],pEntry->hwaddr[1],pEntry->hwaddr[0])); @@ -1852,85 +2851,203 @@ odm_SetNextMACAddrTarget( VOID odm_FastAntTraining( - IN PDM_ODM_T pDM_Odm -) + IN PVOID pDM_VOID + ) { - u4Byte i, MaxRSSI=0; - u1Byte TargetAnt=2; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - BOOLEAN bPktFilterMacth = FALSE; + + u4Byte MaxRSSI_pathA=0, Pckcnt_pathA=0; + u1Byte i,TargetAnt_pathA=0; + BOOLEAN bPktFilterMacth_pathA = FALSE; + #if(RTL8192E_SUPPORT == 1) + u4Byte MaxRSSI_pathB=0, Pckcnt_pathB=0; + u1Byte TargetAnt_pathB=0; + BOOLEAN bPktFilterMacth_pathB = FALSE; + #endif + + + if(!pDM_Odm->bLinked) //bLinked==False + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n")); + + if(pDM_FatTable->bBecomeLinked == TRUE) + { + odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); + odm_FastTraining_enable(pDM_Odm , FAT_OFF); + odm_Tx_By_TxDesc_or_Reg(pDM_Odm , REG); + pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked; + } + return; + } + else + { + if(pDM_FatTable->bBecomeLinked ==FALSE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked!!!]\n")); + odm_Tx_By_TxDesc_or_Reg(pDM_Odm , TX_BY_DESC); + pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked; + } + } + + + if(pDM_Odm->SupportICType == ODM_RTL8188E) + { + ODM_SetBBReg(pDM_Odm, 0x864 , BIT2|BIT1|BIT0, ((pDM_Odm->fat_comb_a)-1)); + } + #if(RTL8192E_SUPPORT == 1) + else if(pDM_Odm->SupportICType == ODM_RTL8192E) + { + ODM_SetBBReg(pDM_Odm, 0xB38 , BIT2|BIT1|BIT0, ((pDM_Odm->fat_comb_a)-1) ); //path-A // ant combination=regB38[2:0]+1 + ODM_SetBBReg(pDM_Odm, 0xB38 , BIT18|BIT17|BIT16, ((pDM_Odm->fat_comb_b)-1) ); //path-B // ant combination=regB38[18:16]+1 + } + #endif ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("==>odm_FastAntTraining()\n")); //1 TRAINING STATE if(pDM_FatTable->FAT_State == FAT_TRAINING_STATE) { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Enter FAT_TRAINING_STATE\n")); //2 Caculate RSSI per Antenna - for (i=0; i<7; i++) + + //3 [path-A]--------------------------- + for (i=0; i<(pDM_Odm->fat_comb_a); i++) // i : antenna index { if(pDM_FatTable->antRSSIcnt[i] == 0) pDM_FatTable->antAveRSSI[i] = 0; else { pDM_FatTable->antAveRSSI[i] = pDM_FatTable->antSumRSSI[i] /pDM_FatTable->antRSSIcnt[i]; - bPktFilterMacth = TRUE; + bPktFilterMacth_pathA = TRUE; } - if(pDM_FatTable->antAveRSSI[i] > MaxRSSI) + + if(pDM_FatTable->antAveRSSI[i] > MaxRSSI_pathA) + { + MaxRSSI_pathA = pDM_FatTable->antAveRSSI[i]; + Pckcnt_pathA = pDM_FatTable ->antRSSIcnt[i]; + TargetAnt_pathA = i ; + } + else if(pDM_FatTable->antAveRSSI[i] == MaxRSSI_pathA) + { + if( (pDM_FatTable->antRSSIcnt[i] ) > Pckcnt_pathA) { - MaxRSSI = pDM_FatTable->antAveRSSI[i]; - TargetAnt = (u1Byte) i; + MaxRSSI_pathA = pDM_FatTable->antAveRSSI[i]; + Pckcnt_pathA = pDM_FatTable ->antRSSIcnt[i]; + TargetAnt_pathA = i ; + } } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_FatTable->antAveRSSI[%lu] = %lu, pDM_FatTable->antRSSIcnt[%lu] = %lu\n", - i, pDM_FatTable->antAveRSSI[i], i, pDM_FatTable->antRSSIcnt[i])); + ODM_RT_TRACE("*** Ant-Index : [ %d ], Counter = (( %d )), Avg RSSI = (( %d )) \n", i, pDM_FatTable->antRSSIcnt[i], pDM_FatTable->antAveRSSI[i] ); } - //2 Select TRX Antenna - if(bPktFilterMacth == FALSE) + + /* + #if(RTL8192E_SUPPORT == 1) + //3 [path-B]--------------------------- + for (i=0; i<(pDM_Odm->fat_comb_b); i++) + { + if(pDM_FatTable->antRSSIcnt_pathB[i] == 0) + pDM_FatTable->antAveRSSI_pathB[i] = 0; + else // (antRSSIcnt[i] != 0) + { + pDM_FatTable->antAveRSSI_pathB[i] = pDM_FatTable->antSumRSSI_pathB[i] /pDM_FatTable->antRSSIcnt_pathB[i]; + bPktFilterMacth_pathB = TRUE; + } + if(pDM_FatTable->antAveRSSI_pathB[i] > MaxRSSI_pathB) + { + MaxRSSI_pathB = pDM_FatTable->antAveRSSI_pathB[i]; + Pckcnt_pathB = pDM_FatTable ->antRSSIcnt_pathB[i]; + TargetAnt_pathB = (u1Byte) i; + } + if(pDM_FatTable->antAveRSSI_pathB[i] == MaxRSSI_pathB) + { + if(pDM_FatTable ->antRSSIcnt_pathB > Pckcnt_pathB) { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("None Packet is matched\n")); + MaxRSSI_pathB = pDM_FatTable->antAveRSSI_pathB[i]; + TargetAnt_pathB = (u1Byte) i; + } + } + if (pDM_Odm->fat_print_rssi==1) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***{Path-B}: Sum RSSI[%d] = (( %d )), cnt RSSI [%d] = (( %d )), Avg RSSI[%d] = (( %d )) \n", + i, pDM_FatTable->antSumRSSI_pathB[i], i, pDM_FatTable->antRSSIcnt_pathB[i], i, pDM_FatTable->antAveRSSI_pathB[i])); + } + } + #endif + */ + + //1 DECISION STATE + + //2 Select TRX Antenna - ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0); //RegE08[16]=1'b0 //disable fast training - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv + odm_FastTraining_enable(pDM_Odm , FAT_OFF); + + //3 [path-A]--------------------------- + if(bPktFilterMacth_pathA == FALSE) + { + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("{Path-A}: None Packet is matched\n")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("{Path-A}: None Packet is matched\n")); + odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); } else { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TargetAnt=%d, MaxRSSI=%lu\n",TargetAnt,MaxRSSI)); - - ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0); //RegE08[16]=1'b0 //disable fast training - //ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv - ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, TargetAnt); //Default RX is Omni, Optional RX is the best decision by FAT - //ODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, TargetAnt); //Default TX - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1 //from TX Info + ODM_RT_TRACE("TargetAnt_pathA = (( %d )) , MaxRSSI_pathA = (( %d )) \n",TargetAnt_pathA,MaxRSSI_pathA); -#if 0 - pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx]; + //3 [ update RX-optional ant ] Default RX is Omni, Optional RX is the best decision by FAT + if(pDM_Odm->SupportICType == ODM_RTL8188E) + { + ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, TargetAnt_pathA); + } + else if(pDM_Odm->SupportICType == ODM_RTL8192E) + { + ODM_SetBBReg(pDM_Odm, 0xB38 , BIT8|BIT7|BIT6, TargetAnt_pathA);//Optional RX [pth-A] + } + //3 [ update TX ant ] + odm_UpdateTxAnt(pDM_Odm, TargetAnt_pathA, (pDM_FatTable->TrainIdx)); - if(IS_STA_VALID(pEntry)) + if(TargetAnt_pathA == 0) + odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); + } + /* + #if(RTL8192E_SUPPORT == 1) + //3 [path-B]--------------------------- + if(bPktFilterMacth_pathB == FALSE) + { + if (pDM_Odm->fat_print_rssi==1) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***[%d]{Path-B}: None Packet is matched\n\n\n",__LINE__)); + } + } + else + { + if (pDM_Odm->fat_print_rssi==1) { - pEntry->antsel_a = TargetAnt&BIT0; - pEntry->antsel_b = (TargetAnt&BIT1)>>1; - pEntry->antsel_c = (TargetAnt&BIT2)>>2; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, + (" ***TargetAnt_pathB = (( %d )) *** MaxRSSI = (( %d ))***\n\n\n",TargetAnt_pathB,MaxRSSI_pathB)); } -#else - pDM_FatTable->antsel_a[pDM_FatTable->TrainIdx] = TargetAnt&BIT0; - pDM_FatTable->antsel_b[pDM_FatTable->TrainIdx] = (TargetAnt&BIT1)>>1; - pDM_FatTable->antsel_c[pDM_FatTable->TrainIdx] = (TargetAnt&BIT2)>>2; -#endif - - - if(TargetAnt == 0) - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv + ODM_SetBBReg(pDM_Odm, 0xB38 , BIT21|BIT20|BIT19, TargetAnt_pathB); //Default RX is Omni, Optional RX is the best decision by FAT + ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1 //from TX Info + pDM_FatTable->antsel_pathB[pDM_FatTable->TrainIdx] = TargetAnt_pathB; } + #endif + */ //2 Reset Counter - for(i=0; i<7; i++) + for(i=0; i<(pDM_Odm->fat_comb_a); i++) { pDM_FatTable->antSumRSSI[i] = 0; pDM_FatTable->antRSSIcnt[i] = 0; } + /* + #if(RTL8192E_SUPPORT == 1) + for(i=0; i<=(pDM_Odm->fat_comb_b); i++) + { + pDM_FatTable->antSumRSSI_pathB[i] = 0; + pDM_FatTable->antRSSIcnt_pathB[i] = 0; + } + #endif + */ pDM_FatTable->FAT_State = FAT_NORMAL_STATE; return; @@ -1939,36 +3056,27 @@ odm_FastAntTraining( //1 NORMAL STATE if(pDM_FatTable->FAT_State == FAT_NORMAL_STATE) { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Enter FAT_NORMAL_STATE\n")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Start Normal State]\n")); odm_SetNextMACAddrTarget(pDM_Odm); -#if 0 - pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx]; - if(IS_STA_VALID(pEntry)) - { - pEntry->antsel_a = TargetAnt&BIT0; - pEntry->antsel_b = (TargetAnt&BIT1)>>1; - pEntry->antsel_c = (TargetAnt&BIT2)>>2; - } -#endif - //2 Prepare Training pDM_FatTable->FAT_State = FAT_TRAINING_STATE; - ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 1); //RegE08[16]=1'b1 //enable fast training - ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 1); //RegC50[7]=1'b1 //enable HW AntDiv - ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Start FAT_TRAINING_STATE\n")); - ODM_SetTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer, 500 ); //ms - + odm_FastTraining_enable(pDM_Odm , FAT_ON); + odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON); //enable HW AntDiv + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Start Training State]\n")); + + ODM_SetTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer, pDM_Odm->antdiv_intvl ); //ms } } VOID odm_FastAntTrainingCallback( - IN PDM_ODM_T pDM_Odm -) + IN PVOID pDM_VOID + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; #if (DM_ODM_SUPPORT_TYPE == ODM_CE) PADAPTER padapter = pDM_Odm->Adapter; @@ -1981,38 +3089,29 @@ odm_FastAntTrainingCallback( #if USE_WORKITEM ODM_ScheduleWorkItem(&pDM_Odm->FastAntTrainingWorkitem); #else + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("******odm_FastAntTrainingCallback****** \n")); odm_FastAntTraining(pDM_Odm); #endif } VOID odm_FastAntTrainingWorkItemCallback( - IN PDM_ODM_T pDM_Odm -) + IN PVOID pDM_VOID + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("******odm_FastAntTrainingWorkItemCallback****** \n")); odm_FastAntTraining(pDM_Odm); } -#endif - -#endif -VOID -ODM_AntDivReset( - IN PDM_ODM_T pDM_Odm - ) -{ - //2 [--8723B---] -#if (RTL8723B_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8723B) - odm_S0S1_SWAntDiv_Reset_8723B(pDM_Odm); #endif -} VOID ODM_AntDivInit( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; @@ -2041,69 +3140,45 @@ ODM_AntDivInit( ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[2G & 5G AntDiv Init]:Support Both 2G & 5G Antenna Diversity Function\n")); } - pDM_Odm->antdiv_rssi=0; - #endif //--- - + //2 [--General---] pDM_Odm->antdiv_period=0; - pDM_Odm->antdiv_select=0; - pDM_SWAT_Table->Ant5G = MAIN_ANT; - pDM_SWAT_Table->Ant2G = MAIN_ANT; - pDM_FatTable->CCK_counter_main=0; - pDM_FatTable->CCK_counter_aux=0; - pDM_FatTable->OFDM_counter_main=0; - pDM_FatTable->OFDM_counter_aux=0; - - //3 [Set MAIN_ANT as default antenna if Auto-Ant enable] - if (pDM_Odm->antdiv_select==1) - pDM_Odm->AntType = ODM_FIX_MAIN_ANT; - else if (pDM_Odm->antdiv_select==2) - pDM_Odm->AntType = ODM_FIX_AUX_ANT; - else if(pDM_Odm->antdiv_select==0) - pDM_Odm->AntType = ODM_AUTO_ANT; + + pDM_FatTable->bBecomeLinked =FALSE; + pDM_FatTable->AntDiv_OnOff =0xff; + + //3 - AP - + #if (DM_ODM_SUPPORT_TYPE == ODM_AP) - if(pDM_Odm->AntType == ODM_AUTO_ANT) - { - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - } - else - { - odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); + #ifdef BEAMFORMING_SUPPORT + #if(DM_ODM_SUPPORT_TYPE == ODM_AP) + odm_BDC_Init(pDM_Odm); + #endif + #endif - if(pDM_Odm->AntType == ODM_FIX_MAIN_ANT) - { - ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); - return; - } - else if(pDM_Odm->AntType == ODM_FIX_AUX_ANT) - { - ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); - return; - } - } - //--- - if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) - { - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - { - #if TX_BY_REG - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 0); //Reg80c[21]=1'b0 //from Reg - #else - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); - #endif - } - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - { - #if TX_BY_REG - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); - #else - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 1); - #endif - } - } + //3 - WIN - + #elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) + pDM_SWAT_Table->Ant5G = MAIN_ANT; + pDM_SWAT_Table->Ant2G = MAIN_ANT; + pDM_FatTable->CCK_counter_main=0; + pDM_FatTable->CCK_counter_aux=0; + pDM_FatTable->OFDM_counter_main=0; + pDM_FatTable->OFDM_counter_aux=0; + #endif + + //2 [---Set MAIN_ANT as default antenna if Auto-Ant enable---] + odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); + + pDM_Odm->AntType = ODM_AUTO_ANT; + + pDM_FatTable->RxIdleAnt = ANTDIV_INIT; + ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); + + //2 [---Set TX Antenna---] + odm_Tx_By_TxDesc_or_Reg(pDM_Odm , REG); + //2 [--88E---] if(pDM_Odm->SupportICType == ODM_RTL8188E) @@ -2124,9 +3199,11 @@ ODM_AntDivInit( odm_RX_HWAntDiv_Init_88E(pDM_Odm); else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) odm_TRX_HWAntDiv_Init_88E(pDM_Odm); + #if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) else if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) odm_Smart_HWAntDiv_Init_88E(pDM_Odm); - #endif + #endif + #endif } //2 [--92E---] @@ -2148,8 +3225,10 @@ ODM_AntDivInit( odm_RX_HWAntDiv_Init_92E(pDM_Odm); else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) odm_TRX_HWAntDiv_Init_92E(pDM_Odm); + #if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) else if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) odm_Smart_HWAntDiv_Init_92E(pDM_Odm); + #endif } #endif @@ -2238,13 +3317,13 @@ ODM_AntDivInit( VOID ODM_AntDiv( - IN PDM_ODM_T pDM_Odm -) -{ + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PADAPTER pAdapter = pDM_Odm->Adapter; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; -//#if (DM_ODM_SUPPORT_TYPE == ODM_AP) if(*pDM_Odm->pBandType == ODM_BAND_5G ) { if(pDM_FatTable->idx_AntDiv_counter_5G < pDM_Odm->antdiv_period ) @@ -2265,7 +3344,7 @@ ODM_AntDiv( else pDM_FatTable->idx_AntDiv_counter_2G=0; } -//#endif + //---------- if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) { @@ -2285,46 +3364,50 @@ ODM_AntDiv( if( BeamformCap & BEAMFORMEE_CAP ) // BFmee On && Div On -> Div Off { ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ AntDiv : OFF ] BFmee ==1 \n")); - if(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) + if(pDM_FatTable->fix_ant_bfee == 0) { odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV); - return; + pDM_FatTable->fix_ant_bfee = 1; } + return; } else // BFmee Off && Div Off -> Div On - #endif { - if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) && pDM_Odm->bLinked) + if((pDM_FatTable->fix_ant_bfee == 1) && pDM_Odm->bLinked) { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ AntDiv : ON ] BFmee ==0 \n")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ AntDiv : ON ] BFmee ==0\n")); if((pDM_Odm->AntDivType!=S0S1_SW_ANTDIV) ) odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON); - - pDM_Odm->SupportAbility |= (ODM_BB_ANT_DIV); + + pDM_FatTable->fix_ant_bfee = 0; } } - } -#endif + } + #endif +#elif (DM_ODM_SUPPORT_TYPE == ODM_AP) + //----------just for fool proof + + if(pDM_Odm->antdiv_rssi) + pDM_Odm->DebugComponents |= ODM_COMP_ANT_DIV; + else + pDM_Odm->DebugComponents &= ~ODM_COMP_ANT_DIV; - //---------- -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_2G) { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G AntDiv Running ]\n")); + //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G AntDiv Running ]\n")); if(!(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC)) return; } else if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_5G) { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 5G AntDiv Running ]\n")); + //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 5G AntDiv Running ]\n")); if(!(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC)) - return; - } - else if(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G)) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G & 5G AntDiv Running ]\n")); + return; } + //else if(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G)) + //{ + //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G & 5G AntDiv Running ]\n")); + //} #endif //---------- @@ -2333,7 +3416,7 @@ ODM_AntDiv( pDM_Odm->AntType = ODM_FIX_MAIN_ANT; else if (pDM_Odm->antdiv_select==2) pDM_Odm->AntType = ODM_FIX_AUX_ANT; - else if (pDM_Odm->antdiv_select==0) + else //if (pDM_Odm->antdiv_select==0) pDM_Odm->AntType = ODM_AUTO_ANT; //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)); @@ -2345,11 +3428,7 @@ ODM_AntDiv( if(pDM_Odm->AntType != pDM_Odm->pre_AntType) { odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); - - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 0); - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); + odm_Tx_By_TxDesc_or_Reg(pDM_Odm , REG); if(pDM_Odm->AntType == ODM_FIX_MAIN_ANT) ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); @@ -2364,10 +3443,7 @@ ODM_AntDiv( if(pDM_Odm->AntType != pDM_Odm->pre_AntType) { odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON); - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 1); + odm_Tx_By_TxDesc_or_Reg(pDM_Odm , TX_BY_DESC); } pDM_Odm->pre_AntType=pDM_Odm->AntType; } @@ -2380,22 +3456,27 @@ ODM_AntDiv( #if (RTL8188E_SUPPORT == 1) if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV ||pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV) odm_HW_AntDiv(pDM_Odm); - #if (!(DM_ODM_SUPPORT_TYPE == ODM_CE)) + + #if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) else if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV) odm_FastAntTraining(pDM_Odm); #endif + #endif + } //2 [--92E---] #if (RTL8192E_SUPPORT == 1) else if(pDM_Odm->SupportICType == ODM_RTL8192E) { - if(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV) + if(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV || pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV) odm_HW_AntDiv(pDM_Odm); - #if (!(DM_ODM_SUPPORT_TYPE == ODM_CE)) + + #if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) else if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV) odm_FastAntTraining(pDM_Odm); #endif + } #endif @@ -2418,7 +3499,7 @@ ODM_AntDiv( { if(pDM_Odm->AntDivType == S0S1_SW_ANTDIV) { - pDM_Odm->AntDivType=CG_TRX_HW_ANTDIV; + pDM_Odm->AntDivType=CG_TRX_HW_ANTDIV; ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(" [S0S1_SW_ANTDIV] -> [CG_TRX_HW_ANTDIV]\n")); //ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 1); if(pDM_FatTable->bBecomeLinked ==TRUE) @@ -2429,7 +3510,7 @@ ODM_AntDiv( { if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) { - pDM_Odm->AntDivType=S0S1_SW_ANTDIV; + pDM_Odm->AntDivType=S0S1_SW_ANTDIV; ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(" [CG_TRX_HW_ANTDIV] -> [S0S1_SW_ANTDIV]\n")); //ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 0); odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF); @@ -2439,14 +3520,16 @@ ODM_AntDiv( if (pDM_Odm->AntDivType==S0S1_SW_ANTDIV) odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_PEAK); else if (pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV) - odm_HW_AntDiv(pDM_Odm); + odm_HW_AntDiv(pDM_Odm); } #endif + //2 [--8881A---] #if (RTL8881A_SUPPORT == 1) else if(pDM_Odm->SupportICType == ODM_RTL8881A) odm_HW_AntDiv(pDM_Odm); #endif + //2 [--8812A---] #if (RTL8812A_SUPPORT == 1) else if(pDM_Odm->SupportICType == ODM_RTL8812) @@ -2457,47 +3540,78 @@ ODM_AntDiv( VOID odm_AntselStatistics( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte antsel_tr_mux, IN u4Byte MacId, - IN u4Byte RxPWDBAll -) + IN u4Byte utility, + IN u1Byte method + + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - - if(antsel_tr_mux == ANT1_2G) + if(method==RSSI_METHOD) + { + if(antsel_tr_mux == ANT1_2G) + { + pDM_FatTable->MainAnt_Sum[MacId]+=utility; + pDM_FatTable->MainAnt_Cnt[MacId]++; + } + else + { + pDM_FatTable->AuxAnt_Sum[MacId]+=utility; + pDM_FatTable->AuxAnt_Cnt[MacId]++; + } + } + #ifdef ODM_EVM_ENHANCE_ANTDIV + else if(method==EVM_METHOD) { - pDM_FatTable->MainAnt_Sum[MacId]+=RxPWDBAll; - pDM_FatTable->MainAnt_Cnt[MacId]++; + if(antsel_tr_mux == ANT1_2G) + { + pDM_FatTable->MainAntEVM_Sum[MacId]+=(utility<<5); + pDM_FatTable->MainAntEVM_Cnt[MacId]++; + } + else + { + pDM_FatTable->AuxAntEVM_Sum[MacId]+=(utility<<5); + pDM_FatTable->AuxAntEVM_Cnt[MacId]++; + } } - else + else if(method==CRC32_METHOD) { - pDM_FatTable->AuxAnt_Sum[MacId]+=RxPWDBAll; - pDM_FatTable->AuxAnt_Cnt[MacId]++; + if(utility==0) + pDM_FatTable->CRC32_Fail_Cnt++; + else + pDM_FatTable->CRC32_Ok_Cnt+=utility; } + #endif } VOID ODM_Process_RSSIForAntDiv( - IN OUT PDM_ODM_T pDM_Odm, - IN PODM_PHY_INFO_T pPhyInfo, - IN PODM_PACKET_INFO_T pPktinfo + IN OUT PVOID pDM_VOID, + IN PVOID p_phy_info_void, + IN PVOID p_pkt_info_void + //IN PODM_PHY_INFO_T pPhyInfo, + //IN PODM_PACKET_INFO_T pPktinfo ) { -u1Byte isCCKrate=0,CCKMaxRate=DESC_RATE11M; -pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PODM_PHY_INFO_T pPhyInfo=(PODM_PHY_INFO_T)p_phy_info_void; + PODM_PACKET_INFO_T pPktinfo=(PODM_PACKET_INFO_T)p_pkt_info_void; + u1Byte isCCKrate=0,CCKMaxRate=ODM_RATE11M; + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) u4Byte RxPower_Ant0, RxPower_Ant1; + u4Byte RxEVM_Ant0, RxEVM_Ant1; #else u1Byte RxPower_Ant0, RxPower_Ant1; + u1Byte RxEVM_Ant0, RxEVM_Ant1; #endif - if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT) - CCKMaxRate=DESC_RATE11M; - else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT) - CCKMaxRate=DESC_RATE11M; + CCKMaxRate=ODM_RATE11M; isCCKrate = (pPktinfo->DataRate <= CCKMaxRate)?TRUE:FALSE; #if ((RTL8192C_SUPPORT == 1) ||(RTL8192D_SUPPORT == 1)) @@ -2505,10 +3619,6 @@ pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; { if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) { - //if(pPktinfo->bPacketBeacon) - //{ - // DbgPrint("This is beacon, isCCKrate=%d\n", isCCKrate); - //} ODM_AntselStatistics_88C(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxPWDBAll, isCCKrate); } } @@ -2518,13 +3628,16 @@ pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; { RxPower_Ant0 = pPhyInfo->RxMIMOSignalStrength[0]; RxPower_Ant1= pPhyInfo->RxMIMOSignalStrength[1]; + + RxEVM_Ant0 =pPhyInfo->RxMIMOSignalQuality[0]; + RxEVM_Ant1 =pPhyInfo->RxMIMOSignalQuality[1]; } else RxPower_Ant0=pPhyInfo->RxPWDBAll; if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) { - if( (pDM_Odm->SupportICType & ODM_SMART_ANT_SUPPORT) && pPktinfo->bPacketToSelf && pDM_FatTable->FAT_State == FAT_TRAINING_STATE )//(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon)) + if( (pDM_Odm->SupportICType & ODM_SMART_ANT_SUPPORT) && (pPktinfo->bPacketToSelf) && (pDM_FatTable->FAT_State == FAT_TRAINING_STATE) )//(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon)) { u1Byte antsel_tr_mux; antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; @@ -2536,8 +3649,17 @@ pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; { if( ( pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT ) && (pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) ) { - if(pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E) - odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID,RxPower_Ant0); + if(pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E) + { + odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID,RxPower_Ant0,RSSI_METHOD); + + #ifdef ODM_EVM_ENHANCE_ANTDIV + if(!isCCKrate) + { + odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID,RxEVM_Ant0,EVM_METHOD); + } + #endif + } else// SupportICType == ODM_RTL8821 and ODM_RTL8723B and ODM_RTL8812) { if(isCCKrate && (pDM_Odm->AntDivType == S0S1_SW_ANTDIV)) @@ -2545,12 +3667,12 @@ pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; pDM_FatTable->antsel_rx_keep_0 = (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ANT1_2G : ANT2_2G; - if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G) - pDM_FatTable->CCK_counter_main++; - else// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G) - pDM_FatTable->CCK_counter_aux++; + if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G) + pDM_FatTable->CCK_counter_main++; + else// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G) + pDM_FatTable->CCK_counter_aux++; - odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0); + odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0,RSSI_METHOD); } else { @@ -2558,11 +3680,11 @@ pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; pDM_FatTable->OFDM_counter_main++; else// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G) pDM_FatTable->OFDM_counter_aux++; - odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0); + odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0,RSSI_METHOD); + } } } } - } //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("isCCKrate=%d, PWDB_ALL=%d\n",isCCKrate, pPhyInfo->RxPWDBAll)); //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)); } @@ -2570,92 +3692,87 @@ pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) VOID ODM_SetTxAntByTxInfo( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN pu1Byte pDesc, IN u1Byte macId -) + + ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) + if (!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) return; - if(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV) + if (pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV) return; - if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - #if (RTL8723B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8723B) { +#if (RTL8723B_SUPPORT == 1) SET_TX_DESC_ANTSEL_A_8723B(pDesc, pDM_FatTable->antsel_a[macId]); - //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", - //macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId])); - #endif - } - else if(pDM_Odm->SupportICType == ODM_RTL8821) - { - #if (RTL8821A_SUPPORT == 1) + /*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", + macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));*/ +#endif + } else if (pDM_Odm->SupportICType == ODM_RTL8821) { +#if (RTL8821A_SUPPORT == 1) SET_TX_DESC_ANTSEL_A_8812(pDesc, pDM_FatTable->antsel_a[macId]); - //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", - //macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId])); - #endif - } - else if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - #if (RTL8188E_SUPPORT == 1) + /*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", + macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));*/ +#endif + } else if (pDM_Odm->SupportICType == ODM_RTL8188E) { +#if (RTL8188E_SUPPORT == 1) SET_TX_DESC_ANTSEL_A_88E(pDesc, pDM_FatTable->antsel_a[macId]); SET_TX_DESC_ANTSEL_B_88E(pDesc, pDM_FatTable->antsel_b[macId]); SET_TX_DESC_ANTSEL_C_88E(pDesc, pDM_FatTable->antsel_c[macId]); - //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", - //macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId])); - #endif - } - else if(pDM_Odm->SupportICType == ODM_RTL8192E) - { - - + /*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", + macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));*/ +#endif } } -#else// (DM_ODM_SUPPORT_TYPE == ODM_AP) +#elif(DM_ODM_SUPPORT_TYPE == ODM_AP) VOID ODM_SetTxAntByTxInfo( - //IN PDM_ODM_T pDM_Odm, struct rtl8192cd_priv *priv, - struct tx_desc *pdesc, - struct tx_insn *txcfg, + struct tx_desc *pdesc, unsigned short aid ) { pFAT_T pDM_FatTable = &priv->pshare->_dmODM.DM_FatTable; - u4Byte SupportICType=priv->pshare->_dmODM.SupportICType; + u4Byte SupportICType = priv->pshare->_dmODM.SupportICType; - if(SupportICType == ODM_RTL8881A) - { - //panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E****** \n",__FUNCTION__,__LINE__); - pdesc->Dword6 &= set_desc(~ (BIT(18)|BIT(17)|BIT(16))); + if (SupportICType == ODM_RTL8881A) { + /*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E******\n",__FUNCTION__,__LINE__); */ + pdesc->Dword6 &= set_desc(~(BIT(18)|BIT(17)|BIT(16))); pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16); - } - else if(SupportICType == ODM_RTL8192E) - { - //panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8192E****** \n",__FUNCTION__,__LINE__); - pdesc->Dword6 &= set_desc(~ (BIT(18)|BIT(17)|BIT(16))); + } else if (SupportICType == ODM_RTL8192E) { + /*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8192E******\n",__FUNCTION__,__LINE__); */ + pdesc->Dword6 &= set_desc(~(BIT(18)|BIT(17)|BIT(16))); pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16); - } - else if(SupportICType == ODM_RTL8812) - { - //3 [path-A] - //panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E****** \n",__FUNCTION__,__LINE__); + } else if (SupportICType == ODM_RTL8188E) { + /*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8188E******\n",__FUNCTION__,__LINE__);*/ + pdesc->Dword2 &= set_desc(~BIT(24)); + pdesc->Dword2 &= set_desc(~BIT(25)); + pdesc->Dword7 &= set_desc(~BIT(29)); + + pdesc->Dword2 |= set_desc(pDM_FatTable->antsel_a[aid]<<24); + pdesc->Dword2 |= set_desc(pDM_FatTable->antsel_b[aid]<<25); + pdesc->Dword7 |= set_desc(pDM_FatTable->antsel_c[aid]<<29); + + + } else if (SupportICType == ODM_RTL8812) { + /*[path-A]*/ + /*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E******\n",__FUNCTION__,__LINE__);*/ + + pdesc->Dword6 &= set_desc(~BIT(16)); + pdesc->Dword6 &= set_desc(~BIT(17)); + pdesc->Dword6 &= set_desc(~BIT(18)); + + pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16); + pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_b[aid]<<17); + pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_c[aid]<<18); - pdesc->Dword6 &= set_desc(~ BIT(16)); - pdesc->Dword6 &= set_desc(~ BIT(17)); - pdesc->Dword6 &= set_desc(~ BIT(18)); - if(txcfg->pstat) - { - pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16); - pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_b[aid]<<17); - pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_c[aid]<<18); - } } } #endif @@ -2663,9 +3780,10 @@ ODM_SetTxAntByTxInfo( VOID ODM_AntDiv_Config( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("WIN Config Antenna Diversity\n")); @@ -2677,15 +3795,15 @@ ODM_AntDiv_Config( #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE)) ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("CE Config Antenna Diversity\n")); - //if(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) - //{ - //pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; - //} + if(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) + { + pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; + } if(pDM_Odm->SupportICType==ODM_RTL8723B) { pDM_Odm->AntDivType = S0S1_SW_ANTDIV; - } + } #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP)) @@ -2709,7 +3827,7 @@ ODM_AntDiv_Config( 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")); panic_printk("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"); - #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) ) + #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY)||defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A)) 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")); panic_printk("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"); @@ -2726,7 +3844,7 @@ ODM_AntDiv_Config( #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) ) + #elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) || defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A)) 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) ) @@ -2796,8 +3914,8 @@ ODM_AntDiv_Config( 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 + #endif +#endif ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SupportAbility = (( %x ))\n", pDM_Odm->SupportAbility )); @@ -2806,40 +3924,48 @@ ODM_AntDiv_Config( VOID ODM_AntDivTimers( - IN PDM_ODM_T pDM_Odm, - IN u1Byte state + IN PVOID pDM_VOID, + IN u1Byte state ) { + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; if(state==INIT_ANTDIV_TIMMER) { #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"); - #elif (RTL8188E_SUPPORT == 1) - #if (DM_ODM_SUPPORT_TYPE == ODM_AP) + #elif ( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) ODM_InitializeTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer, (RT_TIMER_CALL_BACK)odm_FastAntTrainingCallback, NULL, "FastAntTrainingTimer"); - #endif + #endif + + #ifdef ODM_EVM_ENHANCE_ANTDIV + ODM_InitializeTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer, + (RT_TIMER_CALL_BACK)odm_EVM_FastAntTrainingCallback, NULL, "EVM_FastAntTrainingTimer"); #endif } else if(state==CANCEL_ANTDIV_TIMMER) { #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B); - #elif (RTL8188E_SUPPORT == 1) - #if (DM_ODM_SUPPORT_TYPE == ODM_AP) + #elif ( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) ODM_CancelTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer); - #endif + #endif + + #ifdef ODM_EVM_ENHANCE_ANTDIV + ODM_CancelTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer); #endif } else if(state==RELEASE_ANTDIV_TIMMER) { #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B); - #elif (RTL8188E_SUPPORT == 1) - #if (DM_ODM_SUPPORT_TYPE == ODM_AP) + #elif ( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer); - #endif + #endif + + #ifdef ODM_EVM_ENHANCE_ANTDIV + ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer); #endif } @@ -2847,4 +3973,72 @@ ODM_AntDivTimers( #endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) +VOID +ODM_AntDivReset( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + //2 [--8723B---] +#if (RTL8723B_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8723B) + { + #if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) + odm_S0S1_SWAntDiv_Reset_8723B(pDM_Odm); + #endif + } +#endif +} + +VOID +odm_AntennaDiversityInit( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + if(pDM_Odm->mp_mode == TRUE) + return; + + if(pDM_Odm->SupportICType & (ODM_OLD_IC_ANTDIV_SUPPORT)) + { + #if (RTL8192C_SUPPORT==1) + #if (!(DM_ODM_SUPPORT_TYPE & (ODM_AP))) + ODM_OldIC_AntDiv_Init(pDM_Odm); + #endif + #endif + } + else + { + #if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) + ODM_AntDiv_Config(pDM_Odm); + ODM_AntDivInit(pDM_Odm); + #endif + } +} + +VOID +odm_AntennaDiversity( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + if(pDM_Odm->mp_mode == TRUE) + return; + + if(pDM_Odm->SupportICType & (ODM_OLD_IC_ANTDIV_SUPPORT)) + { + #if (RTL8192C_SUPPORT==1) + #if (!(DM_ODM_SUPPORT_TYPE & (ODM_AP))) + ODM_OldIC_AntDiv(pDM_Odm); + #endif + #endif + } + else + { + #if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) + ODM_AntDiv(pDM_Odm); + #endif + } +} + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.h index 1e88e11fef8e..21f75c8f4888 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.h @@ -17,11 +17,22 @@ * * ******************************************************************************/ - + #ifndef __PHYDMANTDIV_H__ #define __PHYDMANTDIV_H__ -#define ANTDIV_VERSION "1.0" +/*#define ANTDIV_VERSION "2.0" //2014.11.04*/ +/*#define ANTDIV_VERSION "2.1" //2015.01.13 Dino*/ +#define ANTDIV_VERSION "2.2" /*2015.01.16 Dino*/ + +//1 ============================================================ +//1 Definition +//1 ============================================================ + +#define ANTDIV_INIT 0xff +#define MAIN_ANT 1 //Ant A or Ant Main +#define AUX_ANT 2 //AntB or Ant Aux +#define MAX_ANT 3 // 3 for AP using #define ANT1_2G 0 // = ANT2_5G #define ANT2_2G 1 // = ANT1_5G @@ -31,12 +42,6 @@ #define ODM_FIX_MAIN_ANT 1 #define ODM_FIX_AUX_ANT 2 -#define TX_BY_REG 0 - -#if (DM_ODM_SUPPORT_TYPE != ODM_AP) -#define ODM_RTL8881A 0 //Just for windows driver to jointly use ODM-driver -#endif - #define ODM_ANTDIV_SUPPORT (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812) #define ODM_N_ANTDIV_SUPPORT (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B) #define ODM_AC_ANTDIV_SUPPORT (ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812) @@ -46,147 +51,448 @@ #define ODM_ANTDIV_2G_SUPPORT_IC (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8881A) #define ODM_ANTDIV_5G_SUPPORT_IC (ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812) + +#define ODM_EVM_ENHANCE_ANTDIV_SUPPORT_IC (ODM_RTL8192E) + #define ODM_ANTDIV_2G BIT0 #define ODM_ANTDIV_5G BIT1 #define ANTDIV_ON 1 #define ANTDIV_OFF 0 +#define FAT_ON 1 +#define FAT_OFF 0 + +#define TX_BY_DESC 1 +#define REG 0 + +#define RSSI_METHOD 0 +#define EVM_METHOD 1 +#define CRC32_METHOD 2 + #define INIT_ANTDIV_TIMMER 0 #define CANCEL_ANTDIV_TIMMER 1 #define RELEASE_ANTDIV_TIMMER 2 +#define CRC32_FAIL 1 +#define CRC32_OK 0 + +#define Evm_RSSI_TH_High 25 +#define Evm_RSSI_TH_Low 20 + +#define NORMAL_STATE_MIAN 1 +#define NORMAL_STATE_AUX 2 +#define TRAINING_STATE 3 + +#define FORCE_RSSI_DIFF 10 + +#define CSI_ON 1 +#define CSI_OFF 0 + +#define DIVON_CSIOFF 1 +#define DIVOFF_CSION 2 + +#define BDC_DIV_TRAIN_STATE 0 +#define BDC_BFer_TRAIN_STATE 1 +#define BDC_DECISION_STATE 2 +#define BDC_BF_HOLD_STATE 3 +#define BDC_DIV_HOLD_STATE 4 + +#define BDC_MODE_1 1 +#define BDC_MODE_2 2 +#define BDC_MODE_3 3 +#define BDC_MODE_4 4 +#define BDC_MODE_NULL 0xff + +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +//1 ============================================================ +//1 structure +//1 ============================================================ + + +typedef struct _SW_Antenna_Switch_ +{ + u1Byte Double_chk_flag; + u1Byte try_flag; + s4Byte PreRSSI; + u1Byte CurAntenna; + u1Byte PreAntenna; + u1Byte RSSI_Trying; + u1Byte TestMode; + u1Byte bTriggerAntennaSwitch; + u1Byte SelectAntennaMap; + u1Byte RSSI_target; + u1Byte reset_idx; + u2Byte Single_Ant_Counter; + u2Byte Dual_Ant_Counter; + u2Byte Aux_FailDetec_Counter; + u2Byte Retry_Counter; + + // Before link Antenna Switch check + u1Byte SWAS_NoLink_State; + u4Byte SWAS_NoLink_BK_Reg860; + u4Byte SWAS_NoLink_BK_Reg92c; + u4Byte SWAS_NoLink_BK_Reg948; + BOOLEAN ANTA_ON; //To indicate Ant A is or not + BOOLEAN ANTB_ON; //To indicate Ant B is on or not + BOOLEAN Pre_Aux_FailDetec; + BOOLEAN RSSI_AntDect_bResult; + u1Byte Ant5G; + u1Byte Ant2G; + + s4Byte RSSI_sum_A; + s4Byte RSSI_sum_B; + s4Byte RSSI_cnt_A; + s4Byte RSSI_cnt_B; + + u8Byte lastTxOkCnt; + u8Byte lastRxOkCnt; + u8Byte TXByteCnt_A; + u8Byte TXByteCnt_B; + u8Byte RXByteCnt_A; + u8Byte RXByteCnt_B; + u1Byte TrafficLoad; + u1Byte Train_time; + u1Byte Train_time_flag; + RT_TIMER SwAntennaSwitchTimer; +#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) + RT_TIMER SwAntennaSwitchTimer_8723B; + u4Byte PktCnt_SWAntDivByCtrlFrame; + BOOLEAN bSWAntDivByCtrlFrame; +#endif + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #if USE_WORKITEM + RT_WORK_ITEM SwAntennaSwitchWorkitem; +#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) + RT_WORK_ITEM SwAntennaSwitchWorkitem_8723B; + #endif +#endif +#endif +/* CE Platform use +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + _timer SwAntennaSwitchTimer; + u8Byte lastTxOkCnt; + u8Byte lastRxOkCnt; + u8Byte TXByteCnt_A; + u8Byte TXByteCnt_B; + u8Byte RXByteCnt_A; + u8Byte RXByteCnt_B; + u1Byte DoubleComfirm; + u1Byte TrafficLoad; + //SW Antenna Switch + + +#endif +*/ +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + //Hybrid Antenna Diversity + u4Byte CCK_Ant1_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte CCK_Ant2_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte OFDM_Ant1_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte OFDM_Ant2_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte RSSI_Ant1_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte RSSI_Ant2_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte TxAnt[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte TargetSTA; + u1Byte antsel; + u1Byte RxIdleAnt; + +#endif + +}SWAT_T, *pSWAT_T; + + +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) +#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) +typedef struct _BF_DIV_COEX_ +{ + BOOLEAN w_BFer_Client[ODM_ASSOCIATE_ENTRY_NUM]; + BOOLEAN w_BFee_Client[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte MA_rx_TP[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte MA_rx_TP_DIV[ODM_ASSOCIATE_ENTRY_NUM]; + + u1Byte BDCcoexType_wBfer; + u1Byte num_Txbfee_Client; + u1Byte num_Txbfer_Client; + u1Byte BDC_Try_counter; + u1Byte BDC_Hold_counter; + u1Byte BDC_Mode; + u1Byte BDC_active_Mode; + u1Byte BDC_state; + u1Byte BDC_RxIdleUpdate_counter; + u1Byte num_Client; + u1Byte pre_num_Client; + u1Byte num_BfTar; + u1Byte num_DivTar; + + BOOLEAN bAll_DivSta_Idle; + BOOLEAN bAll_BFSta_Idle; + BOOLEAN BDC_Try_flag; + BOOLEAN BF_pass; + BOOLEAN DIV_pass; +}BDC_T,*pBDC_T; +#endif +#endif + + +typedef struct _FAST_ANTENNA_TRAINNING_ +{ + u1Byte Bssid[6]; + u1Byte antsel_rx_keep_0; + u1Byte antsel_rx_keep_1; + u1Byte antsel_rx_keep_2; + u1Byte antsel_rx_keep_3; + u4Byte antSumRSSI[7]; + u4Byte antRSSIcnt[7]; + u4Byte antAveRSSI[7]; + u1Byte FAT_State; + u4Byte TrainIdx; + u1Byte antsel_a[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte antsel_b[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte antsel_c[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte MainAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte AuxAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte MainAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte AuxAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte RxIdleAnt; + u1Byte AntDiv_OnOff; + BOOLEAN bBecomeLinked; + u4Byte MinMaxRSSI; + u1Byte idx_AntDiv_counter_2G; + u1Byte idx_AntDiv_counter_5G; + u1Byte AntDiv_2G_5G; + u4Byte CCK_counter_main; + u4Byte CCK_counter_aux; + u4Byte OFDM_counter_main; + u4Byte OFDM_counter_aux; + + #ifdef ODM_EVM_ENHANCE_ANTDIV + u4Byte MainAntEVM_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte AuxAntEVM_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte MainAntEVM_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte AuxAntEVM_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + BOOLEAN EVM_method_enable; + u1Byte TargetAnt_EVM; + u1Byte TargetAnt_CRC32; + u1Byte TargetAnt_enhance; + u1Byte pre_TargetAnt_enhance; + u2Byte Main_MPDU_OK_cnt; + u2Byte Aux_MPDU_OK_cnt; + + u4Byte CRC32_Ok_Cnt; + u4Byte CRC32_Fail_Cnt; + u4Byte MainCRC32_Ok_Cnt; + u4Byte AuxCRC32_Ok_Cnt; + u4Byte MainCRC32_Fail_Cnt; + u4Byte AuxCRC32_Fail_Cnt; + #endif + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + u4Byte CCK_CtrlFrame_Cnt_main; + u4Byte CCK_CtrlFrame_Cnt_aux; + u4Byte OFDM_CtrlFrame_Cnt_main; + u4Byte OFDM_CtrlFrame_Cnt_aux; + u4Byte MainAnt_CtrlFrame_Sum; + u4Byte AuxAnt_CtrlFrame_Sum; + u4Byte MainAnt_CtrlFrame_Cnt; + u4Byte AuxAnt_CtrlFrame_Cnt; + #endif + BOOLEAN fix_ant_bfee; +}FAT_T,*pFAT_T; + + +//1 ============================================================ +//1 enumeration +//1 ============================================================ + + + +typedef enum _FAT_STATE +{ + FAT_NORMAL_STATE = 0, + FAT_TRAINING_STATE = 1, +}FAT_STATE_E, *PFAT_STATE_E; + + +typedef enum _ANT_DIV_TYPE +{ + NO_ANTDIV = 0xFF, + CG_TRX_HW_ANTDIV = 0x01, + CGCS_RX_HW_ANTDIV = 0x02, + FIXED_HW_ANTDIV = 0x03, + CG_TRX_SMART_ANTDIV = 0x04, + CGCS_RX_SW_ANTDIV = 0x05, + S0S1_SW_ANTDIV = 0x06 //8723B intrnal switch S0 S1 +}ANT_DIV_TYPE_E, *PANT_DIV_TYPE_E; + + +//1 ============================================================ +//1 function prototype +//1 ============================================================ + + VOID ODM_StopAntennaSwitchDm( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ); VOID ODM_SetAntConfig( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte antSetting // 0=A, 1=B, 2=C, .... ); - #define SwAntDivRestAfterLink ODM_SwAntDivRestAfterLink -VOID ODM_SwAntDivRestAfterLink( IN PDM_ODM_T pDM_Odm); +VOID ODM_SwAntDivRestAfterLink( + IN PVOID pDM_VOID + ); #if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) VOID ODM_UpdateRxIdleAnt( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Ant -); - -VOID -odm_AntselStatistics( - IN PDM_ODM_T pDM_Odm, - IN u1Byte antsel_tr_mux, - IN u4Byte MacId, - IN u4Byte RxPWDBAll + IN PVOID pDM_VOID, + IN u1Byte Ant ); #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) VOID ODM_SW_AntDiv_Callback( - IN PRT_TIMER pTimer -); + IN PRT_TIMER pTimer + ); VOID ODM_SW_AntDiv_WorkitemCallback( - IN PVOID pContext - ); + IN PVOID pContext + ); #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) VOID -ODM_SW_AntDiv_Callback(void *FunctionContext); +ODM_SW_AntDiv_Callback( + void *FunctionContext + ); #endif #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) VOID odm_S0S1_SwAntDivByCtrlFrame( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte Step - ); +); VOID odm_AntselStatisticsOfCtrlFrame( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte antsel_tr_mux, IN u4Byte RxPWDBAll ); VOID odm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI( - IN PDM_ODM_T pDM_Odm, - IN PODM_PHY_INFO_T pPhyInfo, - IN PODM_PACKET_INFO_T pPktinfo - ); + IN PVOID pDM_VOID, + IN PVOID p_phy_info_void, + IN PVOID p_pkt_info_void +); -#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +/* +VOID +odm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI( + IN PVOID pDM_VOID, + IN PVOID p_phy_info_void, + IN PVOID p_pkt_info_void +); +*/ + +#endif #endif -#if(RTL8188E_SUPPORT == 1 || RTL8192E_SUPPORT == 1) -#if ( !(DM_ODM_SUPPORT_TYPE == ODM_CE)) +#ifdef ODM_EVM_ENHANCE_ANTDIV +VOID +odm_EVM_FastAntTrainingCallback( + IN PVOID pDM_VOID +); +#endif + +VOID +odm_HW_AntDiv( + IN PVOID pDM_VOID +); + +#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) ) VOID odm_FastAntTraining( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ); VOID odm_FastAntTrainingCallback( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ); VOID odm_FastAntTrainingWorkItemCallback( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ); #endif -#endif + VOID ODM_AntDivInit( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ); VOID -ODM_AntDivReset( - IN PDM_ODM_T pDM_Odm +ODM_AntDiv( + IN PVOID pDM_VOID ); VOID -ODM_AntDiv( - IN PDM_ODM_T pDM_Odm +odm_AntselStatistics( + IN PVOID pDM_VOID, + IN u1Byte antsel_tr_mux, + IN u4Byte MacId, + IN u4Byte utility, + IN u1Byte method +); +/* +VOID +ODM_Process_RSSIForAntDiv( + IN OUT PVOID pDM_VOID, + IN PVOID p_phy_info_void, + IN PVOID p_pkt_info_void ); +*/ + VOID ODM_Process_RSSIForAntDiv( - IN OUT PDM_ODM_T pDM_Odm, - IN PODM_PHY_INFO_T pPhyInfo, - IN PODM_PACKET_INFO_T pPktinfo + IN OUT PVOID pDM_VOID, + IN PVOID p_phy_info_void, + IN PVOID p_pkt_info_void ); + + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) VOID ODM_SetTxAntByTxInfo( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN pu1Byte pDesc, IN u1Byte macId ); -#else// (DM_ODM_SUPPORT_TYPE == ODM_AP) +#elif(DM_ODM_SUPPORT_TYPE == ODM_AP) + VOID ODM_SetTxAntByTxInfo( - //IN PDM_ODM_T pDM_Odm, struct rtl8192cd_priv *priv, struct tx_desc *pdesc, - struct tx_insn *txcfg, unsigned short aid ); @@ -195,13 +501,13 @@ ODM_SetTxAntByTxInfo( VOID ODM_AntDiv_Config( - IN PDM_ODM_T pDM_Odm + IN PVOID pDM_VOID ); VOID ODM_UpdateRxIdleAnt_8723B( - IN PDM_ODM_T pDM_Odm, + IN PVOID pDM_VOID, IN u1Byte Ant, IN u4Byte DefaultAnt, IN u4Byte OptionalAnt @@ -209,9 +515,26 @@ ODM_UpdateRxIdleAnt_8723B( VOID ODM_AntDivTimers( - IN PDM_ODM_T pDM_Odm, - IN u1Byte state + IN PVOID pDM_VOID, + IN u1Byte state ); #endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) + +VOID +ODM_AntDivReset( + IN PVOID pDM_VOID +); + +VOID +odm_AntennaDiversityInit( + IN PVOID pDM_VOID +); + +VOID +odm_AntennaDiversity( + IN PVOID pDM_VOID +); + + #endif //#ifndef __ODMANTDIV_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.c index 489bc49806fe..c857727e98de 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.c @@ -26,6 +26,7 @@ odm_SetCrystalCap( IN u1Byte CrystalCap ) { +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PCFO_TRACKING pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK); BOOLEAN bEEPROMCheck; @@ -75,7 +76,7 @@ odm_SetCrystalCap( 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) + else if(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B)) { // write 0x2C[26:21] = 0x2C[20:15] = CrystalCap CrystalCap = CrystalCap & 0x3F; @@ -88,6 +89,7 @@ odm_SetCrystalCap( } ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("odm_SetCrystalCap(): CrystalCap = 0x%x\n", CrystalCap)); +#endif } u1Byte @@ -237,6 +239,7 @@ ODM_CfoTracking( 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)); +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) //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) @@ -281,7 +284,7 @@ ODM_CfoTracking( 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) { @@ -297,6 +300,7 @@ ODM_CfoTracking( odm_SetCrystalCap(pDM_Odm, (u1Byte)CrystalCap); } +#endif 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)); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.h index 77e0a4baa3f1..92a63750f45a 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.h @@ -65,4 +65,4 @@ ODM_ParsingCFO( IN s1Byte* pcfotail ); -#endif \ No newline at end of file +#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.c index 4e6304fe50e7..69653067f28a 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.c @@ -413,19 +413,25 @@ ODM_Write_DIG( 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) { - //1 Check initial gain by upper bound - if(!pDM_DigTable->bPSDInProgress) + if(CurrentIGI > pDM_DigTable->rx_gain_range_max) { - 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; - } - + 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; } + if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE) + { + if(CurrentIGI > pDM_Odm->Adaptivity_IGI_upper) + CurrentIGI = pDM_Odm->Adaptivity_IGI_upper; + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_write_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", CurrentIGI)); + } + } + if(pDM_DigTable->CurIGValue != CurrentIGI) + { //1 Set IGI value if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)) { @@ -643,7 +649,7 @@ odm_DIGInit( { 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)) +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT); #endif @@ -670,7 +676,7 @@ odm_DIGInit( //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error pDM_Odm->bDMInitialGainEnable = TRUE; -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) pDM_DigTable->DIG_Dynamic_MIN_0 = 0x25; pDM_DigTable->DIG_Dynamic_MIN_1 = 0x25; @@ -738,7 +744,6 @@ odm_DIG( 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; @@ -752,9 +757,6 @@ odm_DIG( 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 @@ -947,7 +949,12 @@ odm_DIG( ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140))) { bDFSBand = TRUE; - dm_dig_min = DM_DIG_MIN_AP_DFS; + if (*pDM_Odm->pBandWidth == ODM_BW20M){ + dm_dig_min = DM_DIG_MIN_AP_DFS+2; + } + else{ + 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")); } @@ -1100,8 +1107,8 @@ odm_DIG( { pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; - if(FirstDisConnect) - pDM_DigTable->ForbiddenIGI = 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); @@ -1224,23 +1231,7 @@ odm_DIG( 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)); - } - + 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 High power RSSI threshold #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) @@ -1347,14 +1338,6 @@ odm_DIGbyRSSI_LPS( 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; @@ -1389,7 +1372,6 @@ odm_DIGbyRSSI_LPS( 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)); @@ -1420,16 +1402,6 @@ odm_FalseAlarmCounterStatistics( #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; @@ -1617,7 +1589,7 @@ odm_FalseAlarmCounterStatistics( 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)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n\n", FalseAlmCnt->Cnt_all)); } //3============================================================ @@ -1932,8 +1904,8 @@ ODM_MPT_DIG( 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 +#if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & ODM_AP)) + if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))) // for 5G or 8814 #else if (1) // for both 2G/5G #endif @@ -1992,7 +1964,7 @@ ODM_MPT_DIG( { if(pDM_Odm->MPDIG_2G == FALSE) { - if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & ODM_RTL8814A)) + if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))) { 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); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.h index 54e74d781dad..9c21fc7c8b64 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.h @@ -21,7 +21,7 @@ #ifndef __PHYDMDIG_H__ #define __PHYDMDIG_H__ -#define DIG_VERSION "1.1" +#define DIG_VERSION "1.4" /*2015.01.13*/ typedef struct _Dynamic_Initial_Gain_Threshold_ { diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.h index ef045098afbf..724a89162505 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.h @@ -42,8 +42,8 @@ typedef struct _Dynamic_Power_Saving_ void ODM_RF_Saving( IN PVOID pDM_VOID, - IN u1Byte bForceInNormal - ); + IN u1Byte bForceInNormal +); VOID odm_DynamicBBPowerSavingInit( @@ -60,4 +60,4 @@ odm_1R_CCA( IN PVOID pDM_VOID ); -#endif \ No newline at end of file +#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.c index 5a6d2a94f805..a9d70d911b01 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.c @@ -53,35 +53,8 @@ odm_DynamicTxPowerInit( 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 } @@ -101,12 +74,8 @@ odm_DynamicTxPowerSavePowerIndex( 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 } @@ -125,10 +94,8 @@ odm_DynamicTxPowerRestorePowerIndex( #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 } @@ -249,8 +216,8 @@ odm_DynamicTxPowerAP( 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)) +#if ((RTL8812E_SUPPORT==1) || (RTL8881A_SUPPORT==1) || (RTL8814A_SUPPORT==1)) + if (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8881A | ODM_RTL8814A)) pwr_thd = TX_POWER_NEAR_FIELD_THRESH_8812; #endif @@ -294,6 +261,20 @@ odm_DynamicTxPowerAP( } } #endif + +#ifdef CONFIG_WLAN_HAL_8814AE + if (GET_CHIP_VER(priv) == VERSION_8814A) { + if (!disable_pwr_ctrl && (pDM_Odm->RSSI_Min != 0xff)) { + if (pDM_Odm->RSSI_Min > pwr_thd) + RRSR_power_control_14(priv, 1); + else if (pDM_Odm->RSSI_Min < (pwr_thd-8)) + RRSR_power_control_14(priv, 0); + } else { + RRSR_power_control_14(priv, 0); + } + } +#endif + } //#endif @@ -424,129 +405,9 @@ odm_DynamicTxPower_92C( 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) +#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) } @@ -556,6 +417,7 @@ odm_DynamicTxPower_92D( IN PVOID pDM_VOID ) { +#if (RTL8192D_SUPPORT==1) PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) PADAPTER Adapter = pDM_Odm->Adapter; @@ -716,167 +578,9 @@ odm_DynamicTxPower_92D( } 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 // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) #endif - } - pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl; -#endif -#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.h index 508cd31277d3..041372d47903 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.h @@ -21,7 +21,8 @@ #ifndef __PHYDMDYNAMICTXPOWER_H__ #define __PHYDMDYNAMICTXPOWER_H__ -#define DYNAMIC_TXPWR_VERSION "1.0" +/*#define DYNAMIC_TXPWR_VERSION "1.0"*/ +#define DYNAMIC_TXPWR_VERSION "1.1" /*2015.01.13*/ #define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 #define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.c index 479300050b4d..ab7fc9f1308c 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.c @@ -29,9 +29,8 @@ ODM_EdcaTurboInit( IN PVOID pDM_VOID) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL)) - odm_EdcaParaInit(pDM_Odm); -#elif (DM_ODM_SUPPORT_TYPE==ODM_WIN) + +#if (DM_ODM_SUPPORT_TYPE==ODM_WIN) PADAPTER Adapter = NULL; HAL_DATA_TYPE *pHalData = NULL; @@ -79,7 +78,7 @@ odm_EdcaTurboCheck( // PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n")); - + if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO )) return; @@ -97,14 +96,6 @@ odm_EdcaTurboCheck( 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")); @@ -202,19 +193,15 @@ odm_EdcaTurboCheckCE( //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)) { - if(ICType==ODM_RTL8192D) - { + if (ICType == ODM_RTL8192D) { // Single PHY - if(pDM_Odm->RFType==ODM_2T2R) - { + if (pDM_Odm->RFType == ODM_2T2R) { EDCA_BE_UL = 0x60a42b; //0x5ea42b; EDCA_BE_DL = 0x60a42b; //0x5ea42b; - } - else - { + } else { EDCA_BE_UL = 0x6ea42b; EDCA_BE_DL = 0x6ea42b; - } + } } else { @@ -222,9 +209,7 @@ odm_EdcaTurboCheckCE( if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) { EDCA_BE_UL = 0x60a42b; EDCA_BE_DL = 0x60a42b; - } - else - { + } else { EDCA_BE_UL = 0x6ea42b; EDCA_BE_DL = 0x6ea42b; } @@ -424,8 +409,8 @@ odm_EdcaTurboCheckMP( 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) + /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/ + /*if(pRFCalibrateInfo->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 @@ -499,8 +484,8 @@ odm_EdcaTurboCheckMP( 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) + /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/ + /*if(pRFCalibrateInfo->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 @@ -653,7 +638,7 @@ ODM_EdcaParaSelByIot( u4Byte ICType=pDM_Odm->SupportICType; u1Byte WirelessMode=0xFF; //invalid value u4Byte RFType=pDM_Odm->RFType; - u4Byte IOTPeerSubType=0; + u4Byte IOTPeerSubType = 0; PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE; @@ -754,8 +739,8 @@ ODM_EdcaParaSelByIot( if(WirelessMode==ODM_WM_G) (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer]; else - (*EDCA_BE_DL) = edca_setting_DL[IOTPeer]; - + (*EDCA_BE_DL) = edca_setting_DL[IOTPeer]; + if(ICType == ODM_RTL8821) (*EDCA_BE_DL) = 0x5ea630; @@ -775,9 +760,19 @@ ODM_EdcaParaSelByIot( (*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))); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx\n",(*EDCA_BE_UL),(*EDCA_BE_DL))); } + if((ICType==ODM_RTL8814A) && (IOTPeer == HT_IOT_PEER_REALTEK)) /*8814AU and 8814AR*/ + { + (*EDCA_BE_UL) = 0x5ea42b; + (*EDCA_BE_DL) = 0xa42b; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8814A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx\n",(*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)) @@ -785,7 +780,7 @@ ODM_EdcaParaSelByIot( (*EDCA_BE_DL) = 0xa92b; } - 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))); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Special: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx, IOTPeer = %d\n",(*EDCA_BE_UL),(*EDCA_BE_DL), IOTPeer)); } @@ -837,1079 +832,4 @@ odm_EdcaChooseTrafficIdx( #endif -#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL)) - -void odm_EdcaParaInit( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - prtl8192cd_priv priv = pDM_Odm->priv; - int mode=priv->pmib->dot11BssType.net_work_type; - - static unsigned int slot_time, 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; - - -#ifdef RTK_AC_SUPPORT //for 11ac logo, edit aifs time for cca test cases - if(AC_SIGMA_MODE != AC_SIGMA_NONE) - sifs_time = 10; -#endif - - -#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)); - -#if defined(RTK_AC_SUPPORT) && defined(RTL_MANUAL_EDCA) //for 11ac logo, make BK worse to seperate with BE. - if((AC_SIGMA_MODE != AC_SIGMA_NONE) && (priv->pmib->dot11QosEntry.ManualEDCA)) - { - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | 0xa4 ); - } -#endif - -// 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 WMM_BEBK_PRI - priv->pshare->iot_mode_BK_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 PVOID pDM_VOID, - IN PSTA_INFO_T pstat - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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); - int assoc_num = GET_ROOT(priv)->assoc_num; -#ifdef MBSSID - if (GET_ROOT(priv)->pmib->miscEntry.vap_enable){ - for (i=0; ipvap_priv[i]-> assoc_num; - } -#endif -#ifdef UNIVERSAL_REPEATER - if (IS_DRV_OPEN(GET_VXD_PRIV(GET_ROOT(priv)))) - assoc_num += GET_VXD_PRIV(GET_ROOT(priv))-> assoc_num; -#endif -#ifdef WDS - if(GET_ROOT(priv)->pmib->dot11WdsInfo.wdsEnabled) - assoc_num ++; -#endif - - - pstat->current_tx_bytes += pstat->tx_byte_cnt; - pstat->current_rx_bytes += pstat->rx_byte_cnt; - - if (total_sum != 0) { - if (total_sum <= 1000000) { - 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 && ( -#ifdef SUPPORT_TX_AMSDU - AMSDU_ENABLE || -#endif - aggReady)) || (pstat->IOTPeer==HT_IOT_PEER_INTEL)) - { - if ((assoc_num==1) || (tx_2s_avg + rx_2s_avg >= 25)) { - priv->pshare->highTP_found_pstat = pstat; - } - - #ifdef CLIENT_MODE - if (OPMODE & WIFI_STATION_STATE) { - if ((tx_2s_avg + rx_2s_avg) >= 20) - 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 PVOID pDM_VOID, - IN unsigned char enable - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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 defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - u32 be_edca, vi_edca; - u16 disable_cfe; -#endif - -#if (DM_ODM_SUPPORT_TYPE==ODM_AP) - if (!(!priv->pmib->dot11OperationEntry.wifi_specific || - ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific)) - #ifdef CLIENT_MODE - || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific)) - #endif - )) - return; -#endif - -#ifdef RTK_AC_SUPPORT //for 11ac logo, do not dynamic switch edca - if(AC_SIGMA_MODE != AC_SIGMA_NONE) - 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 defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - vi_edca = -1; - disable_cfe = -1; -#endif - -#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); - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs; -#else - 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 - -#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); - } - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16) - | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs; -#else - 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 - - #ifdef WMM_BEBK_PRI - #ifdef CONFIG_RTL_88E_SUPPORT - if ((GET_CHIP_VER(priv) == VERSION_8188E) && priv->pshare->iot_mode_BK_exist) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (10 << 12) | (6 << 8) | 0x4f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (10 << 12) | (6 << 8) | 0x4f); -#endif - } - #endif - #endif -#if defined(CONFIG_WLAN_HAL_8881A) - if (GET_CHIP_VER(priv) == VERSION_8881A) - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, 0xa64f); -#endif - } -#endif - - - -#if (DM_ODM_SUPPORT_TYPE==ODM_AP) - if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist) { -#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) - if (GET_CHIP_VER(priv) == VERSION_8188E || GET_CHIP_VER(priv) == VERSION_8812E) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (10 << 12) | (6 << 8) | 0x4f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (6 << 8) | 0x4f); -#endif - } - else -#endif - { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (10 << 12) | (4 << 8) | 0x4f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f); -#endif - } - } else if(!enable) -#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL) - if(!enable) //if iot is disable ,maintain original BEQ PARAM -#endif - { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8) - | (sifs_time + 3 * slot_time); - disable_cfe = 1; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8) - | (sifs_time + 3 * slot_time)); -#endif -#ifdef CONFIG_PCI_HCI -// ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE)); -#endif - } - else - { - int txop; - unsigned int cw_max; -#ifdef LOW_TP_TXOP - unsigned int txop_close; -#endif - - #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); - if (pDM_Odm->RFType==ODM_1T1R) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (5 << 12) | (3 << 8) | 0x1f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (5 << 12) | (3 << 8) | 0x1f); -#endif - } - else { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (8 << 12) | (5 << 8) | 0x1f; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (8 << 12) | (5 << 8) | 0x1f); -#endif - } - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - disable_cfe = 0; -#endif -#ifdef CONFIG_PCI_HCI -// ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE)); -#endif - 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 -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (6 << 12) | (5 << 8) | 0x2b; -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (6 << 12) | (5 << 8) | 0x2b); -#endif - priv->pshare->txop_enlarge = 2; - } - #endif -#endif - else - { -// if (txop == 0) { -//#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) -// disable_cfe = 1; -//#endif -//#ifdef CONFIG_PCI_HCI -// ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE)); -//#endif -// } - - if (pDM_Odm->RFType==ODM_2T2R) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time); -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | - (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time)); -#endif - } - else - #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP) - { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (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) | - (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time)); -#endif - } - #else - { - PSTA_INFO_T pstat = priv->pshare->highTP_found_pstat; - if ((GET_CHIP_VER(priv)==VERSION_8881A) && pstat && (pstat->IOTPeer == HT_IOT_PEER_HTC)) - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, 0x642b); - else { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (txop << 16) | (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 - } - } - #endif - } - } - else - { - #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)) -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time); -#else - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time)); -#endif - #else - #if defined(CONFIG_RTL_8196D) || defined(CONFIG_RTL_8197DL) || defined(CONFIG_RTL_8196E) || (defined(CONFIG_RTL_8197D) && !defined(CONFIG_PORT0_EXT_GIGA)) -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (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) | (5 << 8) | (sifs_time + 3 * slot_time)); -#endif - #else -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - be_edca = (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 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 -/* - if (priv->pshare->txop_enlarge == 0xe) { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - disable_cfe = 0; -#endif - #ifdef CONFIG_PCI_HCI - ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE)); - #endif - } else { -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - disable_cfe = 1; -#endif - #ifdef CONFIG_PCI_HCI - ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE)); - #endif - } -*/ - #endif - } - - } - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - notify_IOT_EDCA_switch(priv, be_edca, vi_edca, disable_cfe); -#endif -} -#endif - -VOID -odm_IotEngine( - IN PVOID pDM_VOID - ) -{ - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - struct rtl8192cd_priv *priv=pDM_Odm->priv; - PSTA_INFO_T pstat = NULL; - u4Byte i; - -#ifdef WIFI_WMM - unsigned int switch_turbo = 0, avg_tp; -#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; ipODM_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; - if(pstat) { - if((pstat->tx_avarage + pstat->rx_avarage) < (1<<17)) // 1M bps - pstat = NULL; - } - -#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)) - #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++; -#ifdef CONFIG_WLAN_HAL_8881A - if (GET_CHIP_VER(priv) == VERSION_8881A) { - RTL_W32(0x460, 0x03086666); - } -#endif //CONFIG_WLAN_HAL_8881A - } 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++; -//#ifdef CONFIG_WLAN_HAL_8881A -#if 0 - if (GET_CHIP_VER(priv) == VERSION_8881A) { - if (get_bonding_type_8881A()==BOND_8881AB) { - RTL_W32(0x460, 0x03086666); - } - else { - RTL_W32(0x460, 0x0320ffff); - } - } -#endif //CONFIG_WLAN_HAL_8881A - } - } - - - #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_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_BEBK_PRI))) - if (priv->pshare->phw->BE_pkt_count) { - //printk("[%s %d] BK_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BK_pkt_count); - if (!priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count > 250)) { - priv->pshare->iot_mode_BK_exist++; - switch_turbo++; - } else if (priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count < 250)) { - priv->pshare->iot_mode_BK_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)) - { - 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 (pstat->IOTPeer==HT_IOT_PEER_INTEL) - { - 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 (pstat->IOTPeer==HT_IOT_PEER_INTEL) - priv->pshare->txop_enlarge = 0xe; - else if (pstat->IOTPeer==HT_IOT_PEER_RALINK) - priv->pshare->txop_enlarge = 0xd; - else if (pstat->IOTPeer==HT_IOT_PEER_HTC) - priv->pshare->txop_enlarge = 0; - 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->IOTPeer==HT_IOT_PEER_INTEL && (((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; - }else { - if ((GET_CHIP_VER(priv) == VERSION_8881A)||(GET_CHIP_VER(priv) == VERSION_8192E)|| (GET_CHIP_VER(priv) == VERSION_8188E) ){ - unsigned int uldl_tp = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes)>>17; - if((uldl_tp > 40) && (priv->pshare->agg_to!= 1)) { - RTL_W8(0x462, 0x08); - priv->pshare->agg_to = 1; - } else if((uldl_tp < 35) && (priv->pshare->agg_to !=0)) { - RTL_W8(0x462, 0x02); - priv->pshare->agg_to = 0; - } - } - } - -#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE)) - if(AMPDU_ENABLE) { -#ifdef TX_EARLY_MODE - if (GET_TX_EARLY_MODE) { - if (!GET_EM_SWQ_ENABLE && - ((priv->assoc_num > 1) || - (pstat && pstat->IOTPeer != HT_IOT_PEER_UNKNOWN))) { - if ((priv->pshare->em_tx_byte_cnt >> 17) > EM_TP_UP_BOUND) - priv->pshare->reach_tx_limit_cnt++; - else - priv->pshare->reach_tx_limit_cnt = 0; - - if (priv->pshare->txop_enlarge && priv->pshare->reach_tx_limit_cnt) { //>= WAIT_TP_TIME// - GET_EM_SWQ_ENABLE = 1; - priv->pshare->reach_tx_limit_cnt = 0; - - if (pstat->IOTPeer == HT_IOT_PEER_INTEL) - MAX_EM_QUE_NUM = 12; - else if (pstat->IOTPeer == HT_IOT_PEER_RALINK) - MAX_EM_QUE_NUM = 10; - - enable_em(priv); - } - } - else if (GET_EM_SWQ_ENABLE) { - if ((priv->pshare->em_tx_byte_cnt >> 17) < EM_TP_LOW_BOUND) - priv->pshare->reach_tx_limit_cnt++; - else - priv->pshare->reach_tx_limit_cnt = 0; - - if (!priv->pshare->txop_enlarge || priv->pshare->reach_tx_limit_cnt >= WAIT_TP_TIME) { - GET_EM_SWQ_ENABLE = 0; - priv->pshare->reach_tx_limit_cnt = 0; - disable_em(priv); - } - } - } -#endif - -#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8814AE) - if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8814A) { - if (priv->assoc_num > 9) - { - if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){ - if ((priv->swq_decision == 0)){ - switch_turbo++; - if (priv->pshare->txop_enlarge == 0) - priv->pshare->txop_enlarge = 2; - priv->swq_decision = 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_decision = 0; - } - else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) { - priv->pshare->txop_enlarge = 2; - switch_turbo--; - } - } else { - priv->swq_decision = 0; - } - } else if(CONFIG_WLAN_NOT_HAL_EXIST) -#endif - { - if (priv->assoc_num > 1) - { - if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){ - if ((priv->swq_decision == 0)){ - switch_turbo++; - if (priv->pshare->txop_enlarge == 0) - priv->pshare->txop_enlarge = 2; - priv->swq_decision = 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_decision = 0; - } - else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) { - priv->pshare->txop_enlarge = 2; - switch_turbo--; - } - } - //#if (defined CONFIG_RTL_819XD)) - else if (priv->assoc_num == 1 && (priv->up_time % 2 == 0) -#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE) - && (!GET_TX_EARLY_MODE || !GET_EM_SWQ_ENABLE) -#endif - ) { - if ((pstat) && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3])) { - //int en_thd = 14417920>>(priv->up_time % 2); - avg_tp = (pstat->current_tx_bytes >> 17); - - //if ((priv->swq_decision == 0) && (pstat->current_tx_bytes > en_thd) && (pstat->current_rx_bytes > en_thd) ) { //50Mbps - if ((priv->swq_decision == 0) && (avg_tp > TP_HIGH_WATER_MARK)) { //55Mbps - //printk("[%s:%d] swq_decision=1 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp); - priv->swq_decision = 1; - } - //else if ((priv->swq_decision == 1) && ((pstat->tx_avarage < 4587520) || (pstat->rx_avarage < 4587520))) { //35Mbps - else if ((priv->swq_decision == 1) && (avg_tp < TP_LOW_WATER_MARK)) { //35Mbps - //printk("[%s:%d] swq_decision=0 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp); - priv->swq_decision = 0; - } - } else { - priv->swq_decision = 0; - } - } - } - if( (priv->swq_decision == 1) -#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE) - || (GET_EM_SWQ_ENABLE == 1) -#endif - ) { - priv->swq_en = 1; - priv->swqen_keeptime = priv->up_time; - } else { - priv->swq_en = 0; - priv->swqen_keeptime = 0; - } - } -#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. -#if defined(UNIVERSAL_REPEATER) || defined(MBSSID) - if(IS_STA_VALID(pstat)) - { - struct rtl8192cd_priv *tmppriv; - struct aid_obj *aidarray; - aidarray = container_of(pstat, struct aid_obj, station); - tmppriv = aidarray->priv; - - curr_tp = (unsigned int)(tmppriv->ext_stats.tx_avarage>>17) + (unsigned int)(tmppriv->ext_stats.rx_avarage>>17); - } - else -#endif - 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 - -#ifdef WMM_DSCP_C42 - if (switch_turbo) { - if (!priv->pshare->iot_mode_enable && !priv->pshare->aggrmax_change) { - RTL_W16(0x4ca, 0x0404); - priv->pshare->aggrmax_change = 1; - } - else if (priv->pshare->iot_mode_enable && priv->pshare->aggrmax_change) { - RTL_W16(0x4ca, priv->pshare->aggrmax_bak); - priv->pshare->aggrmax_change = 0; - } - } -#endif -#ifdef TX_EARLY_MODE - unsigned int em_tp = ((priv->ext_stats.tx_avarage>>17) + (priv->ext_stats.rx_avarage>>17)); - if (em_tp > 80) - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (4 << 12) | (3 << 8) | 0x19); - else //if (em_tp < 75) - ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (6 << 12) | (5 << 8) | 0x2b); -#endif - if (switch_turbo) - ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable ); -#endif -} -#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.h index 4557d158ce99..982df9249a19 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.h @@ -21,7 +21,8 @@ #ifndef __PHYDMEDCATURBOCHECK_H__ #define __PHYDMEDCATURBOCHECK_H__ -#define EDCATURBO_VERSION "1.0" +/*#define EDCATURBO_VERSION "2.1"*/ +#define EDCATURBO_VERSION "2.2" /*2015.01.13*/ typedef struct _EDCA_TURBO_ { @@ -48,52 +49,9 @@ 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 -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#ifdef WIFI_WMM -VOID -ODM_IotEdcaSwitch( - IN PVOID pDM_VOID, - IN unsigned char enable - ); -#endif - -BOOLEAN -ODM_ChooseIotMainSTA( - IN PVOID pDM_VOID, - IN PSTA_INFO_T pstat - ); -#endif VOID odm_EdcaTurboCheck( @@ -137,16 +95,6 @@ VOID odm_EdcaTurboCheckCE( IN PVOID pDM_VOID ); -#else -VOID -odm_IotEngine( - IN PVOID pDM_VOID - ); - -VOID -odm_EdcaParaInit( - IN PVOID pDM_VOID - ); #endif #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.c index e8dc0a60b356..d7da773522c4 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.c @@ -59,7 +59,6 @@ #define GET_VERSION_TC(ic, txt) (ODM_GetVersion_TC_##ic##txt()) #define GET_VERSION(ic, txt) (pDM_Odm->bIsMPChip?GET_VERSION_MP(ic,txt):GET_VERSION_TC(ic,txt)) - u1Byte odm_QueryRxPwrPercentage( IN s1Byte AntPower @@ -302,6 +301,7 @@ odm_SignalScaleMapping( IN s4Byte CurrSig ) { +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) if( (pDM_Odm->SupportPlatform == ODM_WIN) && (pDM_Odm->SupportInterface != ODM_ITRF_PCIE) && //USB & SDIO (pDM_Odm->PatchID==10))//pMgntInfo->CustomerID == RT_CID_819x_Netcore @@ -313,8 +313,9 @@ odm_SignalScaleMapping( (pDM_Odm->PatchID==19))//pMgntInfo->CustomerID == RT_CID_819x_Lenovo) { return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(pDM_Odm, CurrSig); - } - else{ + }else +#endif + { return odm_SignalScaleMapping_92CSeries(pDM_Odm,CurrSig); } @@ -571,9 +572,19 @@ odm_EVMdbToPercentage( //DbgPrint("Value=%d\n", Value); //ODM_RT_DISP(FRX, RX_PHY_SQ, ("EVMdbToPercentage92C Value=%d / %x \n", ret_val, ret_val)); + #ifdef ODM_EVM_ENHANCE_ANTDIV if(ret_val >= 0) ret_val = 0; + if(ret_val <= -40) + ret_val = -40; + + ret_val = 0 - ret_val; + ret_val*=3; + + #else + if(ret_val >= 0) + ret_val = 0; if(ret_val <= -33) ret_val = -33; @@ -582,6 +593,7 @@ odm_EVMdbToPercentage( if(ret_val == 99) ret_val = 100; + #endif return(ret_val); } @@ -644,7 +656,7 @@ odm_RxPhyStatus92CSeries_Parsing( u1Byte LNA_idx, VGA_idx; PPHY_STATUS_RPT_8192CD_T pPhyStaRpt = (PPHY_STATUS_RPT_8192CD_T)pPhyStatus; - isCCKrate = (pPktinfo->DataRate <= DESC_RATE11M)?TRUE :FALSE; + isCCKrate = (pPktinfo->DataRate <= ODM_RATE11M) ? TRUE : FALSE; pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; @@ -676,58 +688,101 @@ odm_RxPhyStatus92CSeries_Parsing( VGA_idx = (cck_agc_rpt & 0x1F); if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E)) { - switch(LNA_idx) + if(pDM_Odm->cck_agc_report_type == 0 && (pDM_Odm->SupportICType & ODM_RTL8192E) ) { - case 7: - if(VGA_idx <= 27) - rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 - else + switch(LNA_idx) + { + case 7: + rx_pwr_all = -45 - 2*(VGA_idx); + break; + case 6: + rx_pwr_all = -43 -2*(VGA_idx); + break; + case 5: + rx_pwr_all = -27 - 2*(VGA_idx); + break; + case 4: + rx_pwr_all = -21 - 2*(VGA_idx); + break; + case 3: + rx_pwr_all = -18 - 2*(VGA_idx); + break; + case 2: + rx_pwr_all = -6 - 2*(VGA_idx); + break; + case 1: + rx_pwr_all = 9 -2*(VGA_idx); + break; + case 0: + rx_pwr_all = 15 -2*(VGA_idx); + break; + default: + + break; + } + + if(pDM_Odm->BoardType & ODM_BOARD_EXT_LNA) + { + rx_pwr_all -= pDM_Odm->ExtLNAGain; + } + + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + } + else + { + switch(LNA_idx) + { + case 7: + if(VGA_idx <= 27) + rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 + else rx_pwr_all = -100; - break; - case 6: + break; + case 6: rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 - break; - case 5: + break; + case 5: rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 - break; - case 4: + break; + case 4: rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 - break; - case 3: + break; + case 3: //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 - break; - case 2: - if(cck_highpwr) - rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 - else - rx_pwr_all = -6+ 2*(5-VGA_idx); - break; - case 1: - rx_pwr_all = 8-2*VGA_idx; - break; - case 0: + break; + case 2: + if(cck_highpwr) + rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 + else + rx_pwr_all = -6+ 2*(5-VGA_idx); + break; + case 1: + rx_pwr_all = 8-2*VGA_idx; + break; + case 0: rx_pwr_all = 14-2*VGA_idx; - break; - default: - //DbgPrint("CCK Exception default\n"); - break; - } - rx_pwr_all += 6; + break; + default: + //DbgPrint("CCK Exception default\n"); + break; + } + rx_pwr_all += 8; - //2012.10.08 LukeLee: Modify for 92E CCK RSSI - if(pDM_Odm->SupportICType == ODM_RTL8192E) - rx_pwr_all += 10; + //2012.10.08 LukeLee: Modify for 92E CCK RSSI + if(pDM_Odm->SupportICType == ODM_RTL8192E) + rx_pwr_all += 8; - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - if(cck_highpwr == FALSE) - { - if(PWDB_ALL >= 80) - PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; - else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) - PWDB_ALL += 3; - if(PWDB_ALL>100) - PWDB_ALL = 100; + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + if(cck_highpwr == FALSE) + { + if(PWDB_ALL >= 80) + PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; + else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) + PWDB_ALL += 3; + if(PWDB_ALL>100) + PWDB_ALL = 100; + } } } else if(pDM_Odm->SupportICType & (ODM_RTL8723B)) @@ -830,16 +885,17 @@ odm_RxPhyStatus92CSeries_Parsing( { u1Byte SQ,SQ_rpt; +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) if((pDM_Odm->SupportPlatform == ODM_WIN) && (pDM_Odm->PatchID==RT_CID_819x_Lenovo)){ SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); - } - else if((pDM_Odm->SupportPlatform == ODM_WIN) && + }else if((pDM_Odm->SupportPlatform == ODM_WIN) && (pDM_Odm->PatchID==RT_CID_819x_Acer)) { SQ = odm_SQ_process_patch_RT_CID_819x_Acer(pDM_Odm,isCCKrate,PWDB_ALL,0,0); - } - else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ + }else +#endif + if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ SQ = 100; } else{ @@ -860,7 +916,7 @@ odm_RxPhyStatus92CSeries_Parsing( pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; } } - else //is OFDM rate + else //2 is OFDM rate { pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; @@ -878,7 +934,6 @@ odm_RxPhyStatus92CSeries_Parsing( rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain& 0x3F)*2) - 110; - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) pPhyInfo->RxPwr[i] = rx_pwr[i]; #endif @@ -888,9 +943,10 @@ odm_RxPhyStatus92CSeries_Parsing( total_rssi += RSSI; //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); - //Modification for ext-LNA board + if(pDM_Odm->SupportICType&ODM_RTL8192C) { + //Modification for ext-LNA board if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) { if((pPhyStaRpt->path_agc[i].trsw) == 1) @@ -905,7 +961,7 @@ odm_RxPhyStatus92CSeries_Parsing( pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; - #if (DM_ODM_SUPPORT_TYPE & (/*ODM_WIN|*/ODM_CE|ODM_AP|ODM_ADSL)) + #if (DM_ODM_SUPPORT_TYPE & (/*ODM_WIN|*/ODM_CE|ODM_AP)) //Get Rx snr value in DB pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s4Byte)(pPhyStaRpt->path_rxsnr[i]/2); #endif @@ -913,6 +969,7 @@ odm_RxPhyStatus92CSeries_Parsing( /* Record Signal Strength for next packet */ //if(pPktinfo->bPacketMatchBSSID) { +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) if((pDM_Odm->SupportPlatform == ODM_WIN) && (pDM_Odm->PatchID==RT_CID_819x_Lenovo)) { @@ -925,7 +982,7 @@ odm_RxPhyStatus92CSeries_Parsing( { pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Acer(pDM_Odm,isCCKrate,PWDB_ALL,0,RSSI); } - +#endif } } @@ -936,7 +993,7 @@ odm_RxPhyStatus92CSeries_Parsing( rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1 )& 0x7f) -110; PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - //RT_DISP(FRX, RX_PHY_SS, ("PWDB_ALL=%d\n",PWDB_ALL)); + pPhyInfo->RxPWDBAll = PWDB_ALL; //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); @@ -955,7 +1012,7 @@ odm_RxPhyStatus92CSeries_Parsing( // // (3)EVM of HT rate // - if(pPktinfo->DataRate >=DESC_RATEMCS8 && pPktinfo->DataRate <=DESC_RATEMCS15) + if(pPktinfo->DataRate >=ODM_RATEMCS8 && pPktinfo->DataRate <=ODM_RATEMCS15) Max_spatial_stream = 2; //both spatial stream make sense else Max_spatial_stream = 1; //only spatial stream 1 makes sense @@ -967,7 +1024,6 @@ odm_RxPhyStatus92CSeries_Parsing( // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. EVM = odm_EVMdbToPercentage( (pPhyStaRpt->stream_rxevm[i] )); //dbm - //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", //GET_RX_STATUS_DESC_RX_MCS(pDesc), pDrvInfo->rxevm[i], "%", EVM)); //if(pPktinfo->bPacketMatchBSSID) @@ -991,33 +1047,46 @@ odm_RxPhyStatus92CSeries_Parsing( { #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ + if(pDM_Odm->PatchID == RT_CID_819x_Acer) + { + if(IS_HARDWARE_TYPE_8723BE(pDM_Odm->Adapter)) + pPhyInfo->SignalStrength = (u1Byte) (PWDB_ALL - 4); + else if(IS_HARDWARE_TYPE_8188EE(pDM_Odm->Adapter)) + pPhyInfo->SignalStrength = (u1Byte) (PWDB_ALL + 6); + else + pPhyInfo->SignalStrength = (u1Byte) (PWDB_ALL - 4); + } + else pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; #else -#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING + #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING pPhyInfo->SignalStrength = (u1Byte)PWDB_ALL; -#else + #else pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; -#endif -#endif + #endif +#endif /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/ } else { if (rf_rx_num != 0) { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; -#else -#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING + if(pDM_Odm->PatchID == RT_CID_819x_Acer) + pPhyInfo->SignalStrength = (u1Byte) (total_rssi/=rf_rx_num); + else + pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));/*PWDB*/ + #else + #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING total_rssi/=rf_rx_num; pPhyInfo->SignalStrength = (u1Byte)total_rssi; -#else + #else pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); -#endif -#endif + #endif + #endif } } -#endif +#endif /*#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))*/ //DbgPrint("isCCKrate = %d, pPhyInfo->RxPWDBAll = %d, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a = 0x%x\n", //isCCKrate, pPhyInfo->RxPWDBAll, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a); @@ -1033,351 +1102,370 @@ odm_RxPhyStatus92CSeries_Parsing( } #endif - #if ODM_IC_11AC_SERIES_SUPPORT VOID -odm_RxPhyStatusJaguarSeries_Parsing( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - u1Byte i, Max_spatial_stream; - s1Byte rx_pwr[4], rx_pwr_all=0; - u1Byte EVM = 0, EVMdbm, PWDB_ALL = 0, PWDB_ALL_BT; - u1Byte RSSI, total_rssi=0; - u1Byte isCCKrate=0; - u1Byte rf_rx_num = 0; - u1Byte cck_highpwr = 0; - u1Byte LNA_idx, VGA_idx; - - - PPHY_STATUS_RPT_8812_T pPhyStaRpt = (PPHY_STATUS_RPT_8812_T)pPhyStatus; - - if(pPktinfo->DataRate <= DESC_RATE54M) - { - switch(pPhyStaRpt->r_RFMOD){ - case 1: - if(pPhyStaRpt->sub_chnl == 0) - pPhyInfo->BandWidth = 1; - else - pPhyInfo->BandWidth = 0; - break; +odm_RxPhyBWJaguarSeries_Parsing( + OUT PODM_PHY_INFO_T pPhyInfo, + IN PODM_PACKET_INFO_T pPktinfo, + IN PPHY_STATUS_RPT_8812_T pPhyStaRpt +) +{ - case 2: - if(pPhyStaRpt->sub_chnl == 0) - pPhyInfo->BandWidth = 2; - else if(pPhyStaRpt->sub_chnl == 9 || pPhyStaRpt->sub_chnl == 10) - pPhyInfo->BandWidth = 1; - else - pPhyInfo->BandWidth = 0; - break; + if(pPktinfo->DataRate <= ODM_RATE54M) { + switch (pPhyStaRpt->r_RFMOD) { + case 1: + if (pPhyStaRpt->sub_chnl == 0) + pPhyInfo->BandWidth = 1; + else + pPhyInfo->BandWidth = 0; + break; - default: case 0: + case 2: + if (pPhyStaRpt->sub_chnl == 0) + pPhyInfo->BandWidth = 2; + else if (pPhyStaRpt->sub_chnl == 9 || pPhyStaRpt->sub_chnl == 10) + pPhyInfo->BandWidth = 1; + else pPhyInfo->BandWidth = 0; - break; - } + break; + + default: + case 0: + pPhyInfo->BandWidth = 0; + break; + } } - if(pPktinfo->DataRate <= DESC_RATE11M) +} + +VOID +odm_RxPhyStatusJaguarSeries_Parsing( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo +) +{ + u1Byte i, Max_spatial_stream; + s1Byte rx_pwr[4], rx_pwr_all = 0; + u1Byte EVM, EVMdbm, PWDB_ALL = 0, PWDB_ALL_BT; + u1Byte RSSI, total_rssi = 0; + u1Byte isCCKrate = 0; + u1Byte rf_rx_num = 0; + u1Byte cck_highpwr = 0; + u1Byte LNA_idx, VGA_idx; + PPHY_STATUS_RPT_8812_T pPhyStaRpt = (PPHY_STATUS_RPT_8812_T)pPhyStatus; + + if (pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821) + odm_RxPhyBWJaguarSeries_Parsing(pPhyInfo, pPktinfo, pPhyStaRpt); + + if (pPktinfo->DataRate <= ODM_RATE11M) isCCKrate = TRUE; else isCCKrate = FALSE; - + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_C] = -1; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_D] = -1; - - if(isCCKrate) - { + if (isCCKrate) { u1Byte cck_agc_rpt; pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; - // - // (1)Hardware does not provide RSSI for CCK - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - //if(pHalData->eRFPowerState == eRfOn) - cck_highpwr = pDM_Odm->bCckHighPower; - //else - // cck_highpwr = FALSE; + /*(1)Hardware does not provide RSSI for CCK*/ + /*(2)PWDB, Average PWDB calculated by hardware (for rate adaptive)*/ + + /*if(pHalData->eRFPowerState == eRfOn)*/ + cck_highpwr = pDM_Odm->bCckHighPower; + /*else*/ + /*cck_highpwr = FALSE;*/ cck_agc_rpt = pPhyStaRpt->cfosho[0] ; - LNA_idx = ((cck_agc_rpt & 0xE0) >>5); - VGA_idx = (cck_agc_rpt & 0x1F); - - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - switch(LNA_idx) - { - case 7: - if(VGA_idx <= 27) - rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 - else - rx_pwr_all = -100; - break; - case 6: - rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 - break; - case 5: - rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 - break; - case 4: - rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 - break; - case 3: - //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 - rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 - break; - case 2: - if(cck_highpwr) - rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 - else - rx_pwr_all = -6+ 2*(5-VGA_idx); - break; - case 1: - rx_pwr_all = 8-2*VGA_idx; - break; - case 0: - rx_pwr_all = 14-2*VGA_idx; - break; - default: - //DbgPrint("CCK Exception default\n"); - break; + LNA_idx = ((cck_agc_rpt & 0xE0) >> 5); + VGA_idx = (cck_agc_rpt & 0x1F); + + if (pDM_Odm->SupportICType == ODM_RTL8812) { + switch (LNA_idx) { + case 7: + if (VGA_idx <= 27) + rx_pwr_all = -100 + 2 * (27 - VGA_idx); /*VGA_idx = 27~2*/ + else + rx_pwr_all = -100; + break; + case 6: + rx_pwr_all = -48 + 2 * (2 - VGA_idx); /*VGA_idx = 2~0*/ + break; + case 5: + rx_pwr_all = -42 + 2 * (7 - VGA_idx); /*VGA_idx = 7~5*/ + break; + case 4: + rx_pwr_all = -36 + 2 * (7 - VGA_idx); /*VGA_idx = 7~4*/ + break; + case 3: + /*rx_pwr_all = -28 + 2*(7-VGA_idx); VGA_idx = 7~0*/ + rx_pwr_all = -24 + 2 * (7 - VGA_idx); /*VGA_idx = 7~0*/ + break; + case 2: + if (cck_highpwr) + rx_pwr_all = -12 + 2 * (5 - VGA_idx); /*VGA_idx = 5~0*/ + else + rx_pwr_all = -6 + 2 * (5 - VGA_idx); + break; + case 1: + rx_pwr_all = 8 - 2 * VGA_idx; + break; + case 0: + rx_pwr_all = 14 - 2 * VGA_idx; + break; + default: + /*DbgPrint("CCK Exception default\n");*/ + break; } rx_pwr_all += 6; PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - - if(cck_highpwr == FALSE) - { - if(PWDB_ALL >= 80) - PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; - else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) + + if (cck_highpwr == FALSE) { + if (PWDB_ALL >= 80) + PWDB_ALL = ((PWDB_ALL - 80) << 1) + ((PWDB_ALL - 80) >> 1) + 80; + else if ((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) PWDB_ALL += 3; - if(PWDB_ALL>100) + if (PWDB_ALL > 100) PWDB_ALL = 100; } - } - else if(pDM_Odm->SupportICType == ODM_RTL8821) - { + } else if (pDM_Odm->SupportICType & (ODM_RTL8821 | ODM_RTL8881A)) { s1Byte Pout = -6; - - switch(LNA_idx) - { - case 5: - rx_pwr_all = Pout -32 -(2*VGA_idx); - break; - case 4: - rx_pwr_all = Pout -24 -(2*VGA_idx); - break; - case 2: - rx_pwr_all = Pout -11 -(2*VGA_idx); - break; - case 1: - rx_pwr_all = Pout + 5 -(2*VGA_idx); - break; - case 0: - rx_pwr_all = Pout + 21 -(2*VGA_idx); - break; - } + + switch (LNA_idx) { + case 5: + rx_pwr_all = Pout - 32 - (2 * VGA_idx); + break; + case 4: + rx_pwr_all = Pout - 24 - (2 * VGA_idx); + break; + case 2: + rx_pwr_all = Pout - 11 - (2 * VGA_idx); + break; + case 1: + rx_pwr_all = Pout + 5 - (2 * VGA_idx); + break; + case 0: + rx_pwr_all = Pout + 21 - (2 * VGA_idx); + break; + } + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + } else if (pDM_Odm->SupportICType == ODM_RTL8814A || pDM_Odm->SupportICType == ODM_RTL8822B) { + s1Byte Pout = -6; + + switch (LNA_idx) { + /*CCK only use LNA: 2, 3, 5, 7*/ + case 7: + rx_pwr_all = Pout - 32 - (2 * VGA_idx); + break; + case 5: + rx_pwr_all = Pout - 22 - (2 * VGA_idx); + break; + case 3: + rx_pwr_all = Pout - 2 - (2 * VGA_idx); + break; + case 2: + rx_pwr_all = Pout + 5 - (2 * VGA_idx); + break; + /*case 6:*/ + /*rx_pwr_all = Pout -26 - (2*VGA_idx);*/ + /*break;*/ + /*case 4:*/ + /*rx_pwr_all = Pout - 8 - (2*VGA_idx);*/ + /*break;*/ + /*case 1:*/ + /*rx_pwr_all = Pout + 21 - (2*VGA_idx);*/ + /*break;*/ + /*case 0:*/ + /*rx_pwr_all = Pout + 10 - (2*VGA_idx);*/ +/* // break;*/ + default: +/* //DbgPrint("CCK Exception default\n");*/ + break; + } PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); } - + pPhyInfo->RxPWDBAll = PWDB_ALL; - //if(pPktinfo->StationID == 0) - //{ - // DbgPrint("CCK: LNA_idx = %d, VGA_idx = %d, pPhyInfo->RxPWDBAll = %d\n", - // LNA_idx, VGA_idx, pPhyInfo->RxPWDBAll); - //} +/* //if(pPktinfo->StationID == 0)*/ +/* //{*/ +/* // DbgPrint("CCK: LNA_idx = %d, VGA_idx = %d, pPhyInfo->RxPWDBAll = %d\n",*/ +/* // LNA_idx, VGA_idx, pPhyInfo->RxPWDBAll);*/ +/* //}*/ #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; pPhyInfo->RecvSignalPower = rx_pwr_all; -#endif - // - // (3) Get Signal Quality (EVM) - // - //if(pPktinfo->bPacketMatchBSSID) - { - u1Byte SQ,SQ_rpt; - - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)) - { - SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); - } - else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest) - { +#endif + /*(3) Get Signal Quality (EVM)*/ + if (pPktinfo->bPacketMatchBSSID) { + u1Byte SQ, SQ_rpt; + + if ((pDM_Odm->SupportPlatform == ODM_WIN) && + (pDM_Odm->PatchID == RT_CID_819x_Lenovo)) { + SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm, isCCKrate, PWDB_ALL, 0, 0); + } else if (pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest) { SQ = 100; - } - else - { + } else { SQ_rpt = pPhyStaRpt->pwdb_all; - - if(SQ_rpt > 64) + + if (SQ_rpt > 64) SQ = 0; else if (SQ_rpt < 20) SQ = 100; else - SQ = ((64-SQ_rpt) * 100) / 44; - + SQ = ((64 - SQ_rpt) * 100) / 44; } - - //DbgPrint("cck SQ = %d\n", SQ); + +/* //DbgPrint("cck SQ = %d\n", SQ);*/ pPhyInfo->SignalQuality = SQ; pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; } - } - else //is OFDM rate - { + } else { + /*is OFDM rate*/ pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; - // - // (1)Get RSSI for OFDM rate - // - - for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) - { - // 2008/01/30 MH we will judge RF RX path now. - //DbgPrint("pDM_Odm->RFPathRxEnable = %x\n", pDM_Odm->RFPathRxEnable); + /*(1)Get RSSI for OFDM rate*/ + + for (i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX_JAGUAR; i++) { + /*2008/01/30 MH we will judge RF RX path now.*/ +/* //DbgPrint("pDM_Odm->RFPathRxEnable = %x\n", pDM_Odm->RFPathRxEnable);*/ if (pDM_Odm->RFPathRxEnable & BIT(i)) - { rf_rx_num++; - } - //else - //continue; - //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip - //if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip)) - rx_pwr[i] = (pPhyStaRpt->gain_trsw[i]&0x7F) - 110; - //else - // rx_pwr[i] = ((pPhyStaRpt->gain_trsw[i]& 0x3F)*2) - 110; //OLD FORMULA +/* //else*/ +/* //continue;*/ + /*2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip*/ +/* //if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip))*/ + if (i < ODM_RF_PATH_C) + rx_pwr[i] = (pPhyStaRpt->gain_trsw[i] & 0x7F) - 110; + else + rx_pwr[i] = (pPhyStaRpt->gain_trsw_cd[i - 2] & 0x7F) - 110; +/* //else*/ + /*rx_pwr[i] = ((pPhyStaRpt->gain_trsw[i]& 0x3F)*2) - 110; OLD FORMULA*/ - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) pPhyInfo->RxPwr[i] = rx_pwr[i]; - #endif +#endif /* Translate DBM to percentage. */ - RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); - + RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); + total_rssi += RSSI; - //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); +/* //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI));*/ + pPhyInfo->RxMIMOSignalStrength[i] = (u1Byte) RSSI; - - pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) - //Get Rx snr value in DB - pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = pPhyStaRpt->rxsnr[i]/2; - #endif + /*Get Rx snr value in DB*/ + if (i < ODM_RF_PATH_C) + pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = pPhyStaRpt->rxsnr[i] / 2; + else if (pDM_Odm->SupportICType & (ODM_RTL8814A | ODM_RTL8822B)) + pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = pPhyStaRpt->csi_current[i - 2] / 2; - // - // (2) CFO_short & CFO_tail - // - pPhyInfo->Cfo_short[i] = odm_Cfo( (pPhyStaRpt->cfosho[i]) ); - pPhyInfo->Cfo_tail[i] = odm_Cfo( (pPhyStaRpt->cfotail[i]) ); + + /*(2) CFO_short & CFO_tail*/ + if (i < ODM_RF_PATH_C) { + pPhyInfo->Cfo_short[i] = odm_Cfo((pPhyStaRpt->cfosho[i])); + pPhyInfo->Cfo_tail[i] = odm_Cfo((pPhyStaRpt->cfotail[i])); + } /* Record Signal Strength for next packet */ - //if(pPktinfo->bPacketMatchBSSID) - { - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)) - { - if(i==ODM_RF_PATH_A) - pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI); - + if (pPktinfo->bPacketMatchBSSID) { +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + if ((pDM_Odm->SupportPlatform == ODM_WIN) && + (pDM_Odm->PatchID == RT_CID_819x_Lenovo)) { + if (i == ODM_RF_PATH_A) + pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm, isCCKrate, PWDB_ALL, i, RSSI); + } +#endif } } - - - // - // (3)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip - if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip)) - rx_pwr_all = (pPhyStaRpt->pwdb_all& 0x7f) -110; + + /*(3)PWDB, Average PWDB calculated by hardware (for rate adaptive)*/ + + /*2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip*/ + if ((pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8881A)) && (!pDM_Odm->bIsMPChip)) + rx_pwr_all = (pPhyStaRpt->pwdb_all & 0x7f) - 110; else - rx_pwr_all = (((pPhyStaRpt->pwdb_all) >> 1 )& 0x7f) -110; //OLD FORMULA + rx_pwr_all = (((pPhyStaRpt->pwdb_all) >> 1) & 0x7f) - 110; /*OLD FORMULA*/ + + PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - pPhyInfo->RxPWDBAll = PWDB_ALL; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + /*ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll));*/ +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; pPhyInfo->RxPower = rx_pwr_all; pPhyInfo->RecvSignalPower = rx_pwr_all; - #endif +#endif - //DbgPrint("OFDM: pPhyInfo->RxPWDBAll = %d, pPhyInfo->RxMIMOSignalStrength[0] = %d, pPhyInfo->RxMIMOSignalStrength[1] = %d\n", - // pPhyInfo->RxPWDBAll, pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1]); - - - if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19)) - { - //do nothing - } - else - { //pMgntInfo->CustomerID != RT_CID_819x_Lenovo - // - // (4)EVM of OFDM rate - // - if( (pPktinfo->DataRate>=DESC_RATEMCS8) && - (pPktinfo->DataRate <=DESC_RATEMCS15)) - Max_spatial_stream = 2; - else if( (pPktinfo->DataRate>=DESC_RATEVHTSS2MCS0) && - (pPktinfo->DataRate <=DESC_RATEVHTSS2MCS9)) - Max_spatial_stream = 2; + if ((pDM_Odm->SupportPlatform == ODM_WIN) && (pDM_Odm->PatchID == 19)) { + /*do nothing*/ + } else { + /*pMgntInfo->CustomerID != RT_CID_819x_Lenovo*/ + + /*(4)EVM of OFDM rate*/ + + if ((pPktinfo->DataRate >= ODM_RATEMCS8) && + (pPktinfo->DataRate <= ODM_RATEMCS15)) + Max_spatial_stream = 2; + else if ((pPktinfo->DataRate >= ODM_RATEVHTSS2MCS0) && + (pPktinfo->DataRate <= ODM_RATEVHTSS2MCS9)) + Max_spatial_stream = 2; + else if ((pPktinfo->DataRate >= ODM_RATEMCS16) && + (pPktinfo->DataRate <= ODM_RATEMCS23)) + Max_spatial_stream = 3; + else if ((pPktinfo->DataRate >= ODM_RATEVHTSS3MCS0) && + (pPktinfo->DataRate <= ODM_RATEVHTSS3MCS9)) + Max_spatial_stream = 3; else - Max_spatial_stream = 1; + Max_spatial_stream = 1; - //if(pPktinfo->bPacketMatchBSSID) - { - //DbgPrint("pPktinfo->DataRate = %d\n", pPktinfo->DataRate); + if (pPktinfo->bPacketMatchBSSID) { + /*DbgPrint("pPktinfo->DataRate = %d\n", pPktinfo->DataRate);*/ - for(i=0; i>= 1" because the compilor of free build environment - // fill most significant bit to "zero" when doing shifting operation which may change a negative - // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. - // - // 2013/09/02 MH According to 8812AU test, when use RX evm the value sometimes - // will be incorrect and 1SS-MCS-0-7 always incorrect. Only use LSIG the evm value - // seems ok. This seems BB bug, we need use another way to display better SQ. - // - //if (pPktinfo->DataRate>=DESC8812_RATE6M && pPktinfo->DataRate<=DESC8812_RATE54M) - { - - if(i==ODM_RF_PATH_A ) - { - EVM = odm_EVMdbToPercentage( (pPhyStaRpt->sigevm )); //dbm + for (i = 0; i < Max_spatial_stream; i++) { + /*Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment*/ + /*fill most significant bit to "zero" when doing shifting operation which may change a negative*/ + /*value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore.*/ + + if (pPktinfo->DataRate >= DESC_RATE6M && pPktinfo->DataRate <= DESC_RATE54M) { + if (i == ODM_RF_PATH_A) { + EVM = odm_EVMdbToPercentage((pPhyStaRpt->sigevm)); /*dbm*/ EVM += 20; if (EVM > 100) EVM = 100; } - } -#if 0 - else - { - if (pPhyStaRpt->rxevm[i] == -128) - { - pPhyStaRpt->rxevm[i] = -25; + } else { + if (i < ODM_RF_PATH_C) { + if (pPhyStaRpt->rxevm[i] == -128) + pPhyStaRpt->rxevm[i] = -25; + EVM = odm_EVMdbToPercentage((pPhyStaRpt->rxevm[i])); /*dbm*/ + } else { + if (pPhyStaRpt->rxevm_cd[i - 2] == -128){ + pPhyStaRpt->rxevm_cd[i - 2] = -25; + } + EVM = odm_EVMdbToPercentage((pPhyStaRpt->rxevm_cd[i - 2])); /*dbm*/ } - EVM = odm_EVMdbToPercentage( (pPhyStaRpt->rxevm[i] )); //dbm } -#endif - EVMdbm = odm_EVMdbm_JaguarSeries(pPhyStaRpt->rxevm[i]); - //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", - //pPktinfo->DataRate, pPhyStaRpt->rxevm[i], "%", EVM)); - + + if (i < ODM_RF_PATH_C) + EVMdbm = odm_EVMdbm_JaguarSeries(pPhyStaRpt->rxevm[i]); + else + EVMdbm = odm_EVMdbm_JaguarSeries(pPhyStaRpt->rxevm_cd[i - 2]); + /*RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n",*/ + /*pPktinfo->DataRate, pPhyStaRpt->rxevm[i], "%", EVM));*/ + { - if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only - { + if (i == ODM_RF_PATH_A) { + /*Fill value in RFD, Get the first spatial stream only*/ pPhyInfo->SignalQuality = EVM; - } + } pPhyInfo->RxMIMOSignalQuality[i] = EVM; pPhyInfo->RxMIMOEVMdbm[i] = EVMdbm; } @@ -1386,49 +1474,60 @@ odm_RxPhyStatusJaguarSeries_Parsing( } ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->cfotail); - + } - //DbgPrint("isCCKrate= %d, pPhyInfo->SignalStrength=%d % PWDB_AL=%d rf_rx_num=%d\n", isCCKrate, pPhyInfo->SignalStrength, PWDB_ALL, rf_rx_num); - +/* //DbgPrint("isCCKrate= %d, pPhyInfo->SignalStrength=%d % PWDB_AL=%d rf_rx_num=%d\n", isCCKrate, pPhyInfo->SignalStrength, PWDB_ALL, rf_rx_num);*/ + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - //UI BSS List signal strength(in percentage), make it good looking, from 0~100. - //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). - if(isCCKrate) - { + /*UI BSS List signal strength(in percentage), make it good looking, from 0~100.*/ + /*It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().*/ + if (isCCKrate) { #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; + /*2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/*/ + pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));/*PWDB_ALL;*/ #else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; + pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));/*PWDB_ALL;*/ #endif - } - else - { - if (rf_rx_num != 0) - { + } else { + if (rf_rx_num != 0) { #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; + /*2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/*/ + pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi /= rf_rx_num)); /*PWDB_ALL;*/ #else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); + pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi /= rf_rx_num)); #endif } } #endif pDM_Odm->RxPWDBAve = pDM_Odm->RxPWDBAve + pPhyInfo->RxPWDBAll; - + pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->antidx_anta; pDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->antidx_antb; - - //DbgPrint("pPhyStaRpt->antidx_anta = %d, pPhyStaRpt->antidx_antb = %d, pPhyStaRpt->resvd_1 = %d", - // pPhyStaRpt->antidx_anta, pPhyStaRpt->antidx_antb, pPhyStaRpt->resvd_1); - - //DbgPrint("----------------------------\n"); - //DbgPrint("pPktinfo->StationID=%d, pPktinfo->DataRate=0x%x\n",pPktinfo->StationID, pPktinfo->DataRate); - //DbgPrint("pPhyStaRpt->gain_trsw[0]=0x%x, pPhyStaRpt->gain_trsw[1]=0x%x, pPhyStaRpt->pwdb_all=0x%x\n", - // pPhyStaRpt->gain_trsw[0],pPhyStaRpt->gain_trsw[1], pPhyStaRpt->pwdb_all); - //DbgPrint("pPhyInfo->RxMIMOSignalStrength[0]=%d, pPhyInfo->RxMIMOSignalStrength[1]=%d, RxPWDBAll=%d\n", - // pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1], pPhyInfo->RxPWDBAll); + pDM_Odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antidx_antc; + pDM_Odm->DM_FatTable.antsel_rx_keep_3 = pPhyStaRpt->antidx_antd; + + +/* DbgPrint("pPhyStaRpt->antidx_anta = %d, pPhyStaRpt->antidx_antb = %d\n",*/ +/* pPhyStaRpt->antidx_anta, pPhyStaRpt->antidx_antb);*/ +/* DbgPrint("----------------------------\n");*/ +/* DbgPrint("pPktinfo->StationID=%d, pPktinfo->DataRate=0x%x\n",pPktinfo->StationID, pPktinfo->DataRate);*/ +/* DbgPrint("pPhyStaRpt->r_RFMOD = %d\n", pPhyStaRpt->r_RFMOD);*/ +/* DbgPrint("pPhyStaRpt->gain_trsw[0]=0x%x, pPhyStaRpt->gain_trsw[1]=0x%x\n",*/ +/* pPhyStaRpt->gain_trsw[0],pPhyStaRpt->gain_trsw[1]);*/ +/* DbgPrint("pPhyStaRpt->gain_trsw[2]=0x%x, pPhyStaRpt->gain_trsw[3]=0x%x\n",*/ +/* pPhyStaRpt->gain_trsw_cd[0],pPhyStaRpt->gain_trsw_cd[1]);*/ +/* DbgPrint("pPhyStaRpt->pwdb_all = 0x%x, pPhyInfo->RxPWDBAll = %d\n", pPhyStaRpt->pwdb_all, pPhyInfo->RxPWDBAll);*/ +/* DbgPrint("pPhyStaRpt->cfotail[i] = 0x%x, pPhyStaRpt->CFO_tail[i] = 0x%x\n", pPhyStaRpt->cfotail[0], pPhyStaRpt->cfotail[1]);*/ +/* DbgPrint("pPhyStaRpt->rxevm[0] = %d, pPhyStaRpt->rxevm[1] = %d\n", pPhyStaRpt->rxevm[0], pPhyStaRpt->rxevm[1]);*/ +/* DbgPrint("pPhyStaRpt->rxevm[2] = %d, pPhyStaRpt->rxevm[3] = %d\n", pPhyStaRpt->rxevm_cd[0], pPhyStaRpt->rxevm_cd[1]);*/ +/* DbgPrint("pPhyInfo->RxMIMOSignalStrength[0]=%d, pPhyInfo->RxMIMOSignalStrength[1]=%d, RxPWDBAll=%d\n",*/ +/* pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1], pPhyInfo->RxPWDBAll);*/ +/* DbgPrint("pPhyInfo->RxMIMOSignalStrength[2]=%d, pPhyInfo->RxMIMOSignalStrength[3]=%d\n",*/ +/* pPhyInfo->RxMIMOSignalStrength[2], pPhyInfo->RxMIMOSignalStrength[3]);*/ +/* DbgPrint("ppPhyInfo->RxMIMOSignalQuality[0]=%d, pPhyInfo->RxMIMOSignalQuality[1]=%d\n",*/ +/* pPhyInfo->RxMIMOSignalQuality[0], pPhyInfo->RxMIMOSignalQuality[1]);*/ +/* DbgPrint("ppPhyInfo->RxMIMOSignalQuality[2]=%d, pPhyInfo->RxMIMOSignalQuality[3]=%d\n",*/ +/* pPhyInfo->RxMIMOSignalQuality[2], pPhyInfo->RxMIMOSignalQuality[3]);*/ } @@ -1457,7 +1556,7 @@ odm_Process_RSSIForDM( u4Byte Weighting=0; PSTA_INFO_T pEntry; - if(pPktinfo->StationID == 0xFF) + if (pPktinfo->StationID >= ODM_ASSOCIATE_ENTRY_NUM) return; #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1) @@ -1490,15 +1589,8 @@ odm_Process_RSSIForDM( if(pPktinfo->bPacketBeacon) pDM_Odm->PhyDbgInfo.NumQryBeaconPkt++; - isCCKrate = (pPktinfo->DataRate <= DESC_RATE11M)?TRUE :FALSE; + isCCKrate = (pPktinfo->DataRate <= ODM_RATE11M )?TRUE :FALSE; pDM_Odm->RxRate = pPktinfo->DataRate; - /* - if(!isCCKrate) - { - DbgPrint("OFDM: pPktinfo->StationID=%d, isCCKrate=%d, pPhyInfo->RxPWDBAll=%d\n", - pPktinfo->StationID, isCCKrate, pPhyInfo->RxPWDBAll); - } - */ //--------------Statistic for antenna/path diversity------------------ if(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) @@ -1507,22 +1599,12 @@ odm_Process_RSSIForDM( ODM_Process_RSSIForAntDiv(pDM_Odm,pPhyInfo,pPktinfo); #endif } + #if(defined(CONFIG_PATH_DIVERSITY)) else if(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV) { - #if (RTL8812A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv; - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) - { - if(pPktinfo->DataRate > DESC_RATE11M) - ODM_PathStatistics_8812A(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A], - pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]); - } - } - #endif + phydm_process_rssi_for_path_div(pDM_Odm,pPhyInfo,pPktinfo); } - + #endif //-----------------Smart Antenna Debug Message------------------// UndecoratedSmoothedCCK = pEntry->rssi_stat.UndecoratedSmoothedCCK; @@ -1710,10 +1792,12 @@ ODM_PhyStatusQuery_92CSeries( } #endif -#if(ODM_IC_11AC_SERIES_SUPPORT == 1) + // // Endianness before calling this API // +#if ODM_IC_11AC_SERIES_SUPPORT + VOID ODM_PhyStatusQuery_JaguarSeries( IN OUT PDM_ODM_T pDM_Odm, @@ -1722,7 +1806,6 @@ ODM_PhyStatusQuery_JaguarSeries( IN PODM_PACKET_INFO_T pPktinfo ) { - odm_RxPhyStatusJaguarSeries_Parsing( pDM_Odm, pPhyInfo, @@ -1730,11 +1813,12 @@ ODM_PhyStatusQuery_JaguarSeries( pPktinfo); odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo); - +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + //phydm_sbd_check(pDM_Odm); +#endif } #endif - VOID ODM_PhyStatusQuery( IN OUT PDM_ODM_T pDM_Odm, @@ -1743,12 +1827,13 @@ ODM_PhyStatusQuery( IN PODM_PACKET_INFO_T pPktinfo ) { -#if(ODM_IC_11AC_SERIES_SUPPORT == 1) + +#if ODM_IC_11AC_SERIES_SUPPORT if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES ) ODM_PhyStatusQuery_JaguarSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); #endif -#if(ODM_IC_11N_SERIES_SUPPORT ==1) +#if ODM_IC_11N_SERIES_SUPPORT if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES ) ODM_PhyStatusQuery_92CSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); #endif @@ -1782,7 +1867,10 @@ ODM_ConfigRFWithHeaderFile( IN ODM_RF_RADIO_PATH_E eRFPath ) { +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) PADAPTER Adapter = pDM_Odm->Adapter; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); +#endif ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===>ODM_ConfigRFWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); @@ -1790,6 +1878,8 @@ ODM_ConfigRFWithHeaderFile( ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); +//1 AP doesn't use PHYDM power tracking table in these ICs +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) #if (RTL8723A_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8723A) { @@ -1799,57 +1889,58 @@ ODM_ConfigRFWithHeaderFile( } } #endif - -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG_MP(8188E,_RadioA); - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG_MP(8188E,_TXPWR_LMT); - } - } -#endif - #if (RTL8812A_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8812) { if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - { + if(eRFPath == ODM_RF_PATH_A){ READ_AND_CONFIG_MP(8812A,_RadioA); } - else if(eRFPath == ODM_RF_PATH_B) - { + else if(eRFPath == ODM_RF_PATH_B){ READ_AND_CONFIG_MP(8812A,_RadioB); } } else if(ConfigType == CONFIG_RF_TXPWR_LMT) { + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) && (DEV_BUS_TYPE == RT_PCI_INTERFACE) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + if ((pHalData->EEPROMSVID == 0x17AA && pHalData->EEPROMSMID == 0xA811) || + (pHalData->EEPROMSVID == 0x10EC && pHalData->EEPROMSMID == 0xA812) || + (pHalData->EEPROMSVID == 0x10EC && pHalData->EEPROMSMID == 0x8812)) + READ_AND_CONFIG_MP(8812A,_TXPWR_LMT_HM812A03); + #endif READ_AND_CONFIG_MP(8812A,_TXPWR_LMT); } } #endif - #if (RTL8821A_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8821) { if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - { + if(eRFPath == ODM_RF_PATH_A){ READ_AND_CONFIG_MP(8821A,_RadioA); } } else if(ConfigType == CONFIG_RF_TXPWR_LMT) { + + if (pDM_Odm->SupportInterface == ODM_ITRF_USB) { if (pDM_Odm->ExtPA5G || pDM_Odm->ExtLNA5G) READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_FEM); else READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_IPA); - } else { - READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A); + } + else { + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + if (pMgntInfo->CustomerID == RT_CID_8821AE_ASUS_MB) + READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A_SAR_8mm); + else if (pMgntInfo->CustomerID == RT_CID_8821AE_ASUS_NB) + READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A_SAR_5mm); + else + #endif + READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A); } } ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigRFWithHeaderFile\n")); @@ -1859,12 +1950,10 @@ ODM_ConfigRFWithHeaderFile( #if (RTL8723B_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8723B) { - if(ConfigType == CONFIG_RF_RADIO) { + if(ConfigType == CONFIG_RF_RADIO) READ_AND_CONFIG_MP(8723B,_RadioA); - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { + else if(ConfigType == CONFIG_RF_TXPWR_LMT) READ_AND_CONFIG_MP(8723B,_TXPWR_LMT); - } } #endif @@ -1877,23 +1966,87 @@ ODM_ConfigRFWithHeaderFile( else if(eRFPath == ODM_RF_PATH_B) READ_AND_CONFIG_MP(8192E,_RadioB); } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { + else if(ConfigType == CONFIG_RF_TXPWR_LMT) READ_AND_CONFIG_MP(8192E,_TXPWR_LMT); - } } #endif +#endif//(DM_ODM_SUPPORT_TYPE != ODM_AP) +//1 All platforms support +#if (RTL8188E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188E) + { + if(ConfigType == CONFIG_RF_RADIO) { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG_MP(8188E,_RadioA); + } + else if(ConfigType == CONFIG_RF_TXPWR_LMT) + READ_AND_CONFIG_MP(8188E,_TXPWR_LMT); + } +#endif #if (RTL8814A_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8814A) { - /* - if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG(8813A,_TXPWR_LMT); - } - */ + if(ConfigType == CONFIG_RF_RADIO) { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG_MP(8814A,_RadioA); + else if(eRFPath == ODM_RF_PATH_B) + READ_AND_CONFIG_MP(8814A,_RadioB); + else if(eRFPath == ODM_RF_PATH_C) + READ_AND_CONFIG_MP(8814A,_RadioC); + else if(eRFPath == ODM_RF_PATH_D) + READ_AND_CONFIG_MP(8814A,_RadioD); + } + else if(ConfigType == CONFIG_RF_TXPWR_LMT) + READ_AND_CONFIG_MP(8814A,_TXPWR_LMT); } #endif - + +//1 New ICs (WIN only) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (RTL8821B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8821B) + { + if (ConfigType == CONFIG_RF_RADIO) { + if (eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG(8821B, _RadioA); + } else if (ConfigType == CONFIG_RF_TXPWR_LMT) + READ_AND_CONFIG(8821B, _TXPWR_LMT); + } +#endif +#if (RTL8822B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8822B) + { + if(ConfigType == CONFIG_RF_RADIO) { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG_TC(8822B,_RadioA); + else if(eRFPath == ODM_RF_PATH_B) + READ_AND_CONFIG_TC(8822B,_RadioB); + } + } +#endif +#if (RTL8703B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8703B) + { + if(ConfigType == CONFIG_RF_RADIO) { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG_TC(8703B,_RadioA); + } + } +#endif +#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) +#if (RTL8188F_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188F) + { + if(ConfigType == CONFIG_RF_RADIO) { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG_TC(8188F,_RadioA); + } + } +#endif +#endif +#endif//(DM_ODM_SUPPORT_TYPE & ODM_WIN) + return HAL_STATUS_SUCCESS; } @@ -1907,22 +2060,23 @@ ODM_ConfigRFWithTxPwrTrackHeaderFile( ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); - if(0) - { - } -#if (RTL8821A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8821) + + +//1 AP doesn't use PHYDM power tracking table in these ICs +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) +#if RTL8821A_SUPPORT + if(pDM_Odm->SupportICType == ODM_RTL8821) { if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE); else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) - READ_AND_CONFIG_MP(8821A,_TxPowerTrack_USB); - else - READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE); + READ_AND_CONFIG_MP(8821A,_TxPowerTrack_USB); + else if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO) + READ_AND_CONFIG_MP(8821A,_TxPowerTrack_SDIO); } -#endif -#if (RTL8812A_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8812) +#endif +#if RTL8812A_SUPPORT + if(pDM_Odm->SupportICType == ODM_RTL8812) { if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) READ_AND_CONFIG_MP(8812A,_TxPowerTrack_PCIE); @@ -1934,18 +2088,20 @@ ODM_ConfigRFWithTxPwrTrackHeaderFile( } } -#endif -#if (RTL8192E_SUPPORT == 1) - else if(pDM_Odm->SupportICType == ODM_RTL8192E) +#endif +#if RTL8192E_SUPPORT + if(pDM_Odm->SupportICType == ODM_RTL8192E) { if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) READ_AND_CONFIG_MP(8192E,_TxPowerTrack_PCIE); else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) READ_AND_CONFIG_MP(8192E,_TxPowerTrack_USB); + else if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO) + READ_AND_CONFIG_MP(8192E,_TxPowerTrack_SDIO); } #endif #if RTL8723B_SUPPORT - else if(pDM_Odm->SupportICType == ODM_RTL8723B) + if(pDM_Odm->SupportICType == ODM_RTL8723B) { if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) READ_AND_CONFIG_MP(8723B,_TxPowerTrack_PCIE); @@ -1956,16 +2112,54 @@ ODM_ConfigRFWithTxPwrTrackHeaderFile( } #endif #if RTL8188E_SUPPORT - else if(pDM_Odm->SupportICType == ODM_RTL8188E) + if(pDM_Odm->SupportICType == ODM_RTL8188E) { if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE); else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) READ_AND_CONFIG_MP(8188E,_TxPowerTrack_USB); + else if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO) + READ_AND_CONFIG_MP(8188E,_TxPowerTrack_SDIO); + } +#endif +#endif//(DM_ODM_SUPPORT_TYPE != ODM_AP) + +//1 All platforms support +#if RTL8814A_SUPPORT + if(pDM_Odm->SupportICType == ODM_RTL8814A) + { + if(pDM_Odm->RFEType == 0) + READ_AND_CONFIG_MP(8814A,_TxPowerTrack_Type0); + else if(pDM_Odm->RFEType == 2) + READ_AND_CONFIG_MP(8814A,_TxPowerTrack_Type2); else - READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE); + READ_AND_CONFIG_MP(8814A,_TxPowerTrack); } +#endif + +//1 New ICs (WIN only) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if RTL8821B_SUPPORT + if(pDM_Odm->SupportICType == ODM_RTL8821B) + READ_AND_CONFIG(8821B,_TxPowerTrack); +#endif +#if RTL8822B_SUPPORT + if(pDM_Odm->SupportICType == ODM_RTL8822B) + READ_AND_CONFIG_TC(8822B,_TxPowerTrack); +#endif +#if RTL8703B_SUPPORT + if(pDM_Odm->SupportICType == ODM_RTL8703B) + READ_AND_CONFIG_TC(8703B,_TxPowerTrack_PCIE); +#endif + +#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) +#if RTL8188F_SUPPORT + if(pDM_Odm->SupportICType == ODM_RTL8188F) + READ_AND_CONFIG_TC(8188F,_TxPowerTrack_PCIE); +#endif #endif +#endif//(DM_ODM_SUPPORT_TYPE & ODM_WIN) + return HAL_STATUS_SUCCESS; } @@ -1976,75 +2170,43 @@ ODM_ConfigBBWithHeaderFile( IN ODM_BB_Config_Type ConfigType ) { -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) PADAPTER Adapter = pDM_Odm->Adapter; -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); #endif -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("===>ODM_ConfigBBWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", - pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); +//1 AP doesn't use PHYDM initialization in these ICs +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) #if (RTL8723A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8723A) + if(pDM_Odm->SupportICType == ODM_RTL8723A) { - if(ConfigType == CONFIG_BB_PHY_REG) - { + if(ConfigType == CONFIG_BB_PHY_REG){ READ_AND_CONFIG_MP(8723A,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { + }else if(ConfigType == CONFIG_BB_AGC_TAB){ READ_AND_CONFIG_MP(8723A,_AGC_TAB); - } + } } #endif - -#if (RTL8188E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG_MP(8188E,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG_MP(8188E,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - READ_AND_CONFIG_MP(8188E,_PHY_REG_PG); - } - } -#endif - #if (RTL8812A_SUPPORT == 1) if(pDM_Odm->SupportICType == ODM_RTL8812) { - if(ConfigType == CONFIG_BB_PHY_REG) - { + if(ConfigType == CONFIG_BB_PHY_REG){ READ_AND_CONFIG_MP(8812A,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { + }else if(ConfigType == CONFIG_BB_AGC_TAB){ READ_AND_CONFIG_MP(8812A,_AGC_TAB); } else if(ConfigType == CONFIG_BB_PHY_REG_PG) { if (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_ASUS); -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) else if (pMgntInfo->CustomerID == RT_CID_WNC_NEC && pDM_Odm->bIsMPChip) READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_NEC); -#endif + #endif else READ_AND_CONFIG_MP(8812A,_PHY_REG_PG); } - else if(ConfigType == CONFIG_BB_PHY_REG_MP) - { + else if(ConfigType == CONFIG_BB_PHY_REG_MP){ READ_AND_CONFIG_MP(8812A,_PHY_REG_MP); } else if(ConfigType == CONFIG_BB_AGC_TAB_DIFF) @@ -2054,80 +2216,142 @@ ODM_ConfigBBWithHeaderFile( else if (100 <= *pDM_Odm->pChannel) AGC_DIFF_CONFIG_MP(8812A,HB); } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8812AGCTABArray\n")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8812PHY_REGArray\n")); } #endif - #if (RTL8821A_SUPPORT == 1) if(pDM_Odm->SupportICType == ODM_RTL8821) { - if(ConfigType == CONFIG_BB_PHY_REG) - { + if(ConfigType == CONFIG_BB_PHY_REG){ READ_AND_CONFIG_MP(8821A,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { + }else if(ConfigType == CONFIG_BB_AGC_TAB){ READ_AND_CONFIG_MP(8821A,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { + }else if(ConfigType == CONFIG_BB_PHY_REG_PG){ READ_AND_CONFIG_MP(8821A,_PHY_REG_PG); - } - } + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8821AGCTABArray\n")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8821PHY_REGArray\n")); + } #endif #if (RTL8723B_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8723B) + if(pDM_Odm->SupportICType == ODM_RTL8723B) { - - if(ConfigType == CONFIG_BB_PHY_REG) - { + if(ConfigType == CONFIG_BB_PHY_REG){ READ_AND_CONFIG_MP(8723B,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { + }else if(ConfigType == CONFIG_BB_AGC_TAB){ READ_AND_CONFIG_MP(8723B,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { + }else if(ConfigType == CONFIG_BB_PHY_REG_PG){ READ_AND_CONFIG_MP(8723B,_PHY_REG_PG); } } #endif #if (RTL8192E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8192E) + if(pDM_Odm->SupportICType == ODM_RTL8192E) { - - if(ConfigType == CONFIG_BB_PHY_REG) - { + if(ConfigType == CONFIG_BB_PHY_REG){ READ_AND_CONFIG_MP(8192E,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { + }else if(ConfigType == CONFIG_BB_AGC_TAB){ READ_AND_CONFIG_MP(8192E,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { + }else if(ConfigType == CONFIG_BB_PHY_REG_PG){ READ_AND_CONFIG_MP(8192E,_PHY_REG_PG); } } #endif +#endif//(DM_ODM_SUPPORT_TYPE != ODM_AP) + + +//1 All platforms support +#if (RTL8188E_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8188E) + { + if(ConfigType == CONFIG_BB_PHY_REG) + READ_AND_CONFIG_MP(8188E,_PHY_REG); + else if(ConfigType == CONFIG_BB_AGC_TAB) + READ_AND_CONFIG_MP(8188E,_AGC_TAB); + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + READ_AND_CONFIG_MP(8188E,_PHY_REG_PG); + } +#endif #if (RTL8814A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8814A) + if(pDM_Odm->SupportICType == ODM_RTL8814A) { + if(ConfigType == CONFIG_BB_PHY_REG){ + READ_AND_CONFIG_MP(8814A,_PHY_REG); + }else if(ConfigType == CONFIG_BB_AGC_TAB){ + READ_AND_CONFIG_MP(8814A,_AGC_TAB); + }else if(ConfigType == CONFIG_BB_PHY_REG_PG){ + READ_AND_CONFIG_MP(8814A,_PHY_REG_PG); + }else if(ConfigType == CONFIG_BB_PHY_REG_MP){ + READ_AND_CONFIG_MP(8814A,_PHY_REG_MP); + } + } +#endif - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8813A,_PHY_REG); +//1 New ICs (WIN only) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (RTL8821B_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8821B) + { + if (ConfigType == CONFIG_BB_PHY_REG) { + READ_AND_CONFIG(8821B,_PHY_REG); + } else if (ConfigType == CONFIG_BB_AGC_TAB) { + READ_AND_CONFIG(8821B,_AGC_TAB); + } else if (ConfigType == CONFIG_BB_PHY_REG_PG) { + READ_AND_CONFIG(8821B,_PHY_REG_PG); } + } +#endif +#if (RTL8822B_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8822B) + { + if(ConfigType == CONFIG_BB_PHY_REG) + READ_AND_CONFIG_TC(8822B,_PHY_REG); else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8813A,_AGC_TAB); - } + READ_AND_CONFIG_TC(8822B,_AGC_TAB); else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - //READ_AND_CONFIG(8813A,_PHY_REG_PG); - } + READ_AND_CONFIG_TC(8822B,_PHY_REG_PG); + else if(ConfigType == CONFIG_BB_PHY_REG_MP) + READ_AND_CONFIG_TC(8822B,_PHY_REG_MP); } #endif +#if (RTL8703B_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8703B) + { + if(ConfigType == CONFIG_BB_PHY_REG) + READ_AND_CONFIG_TC(8703B,_PHY_REG); + else if(ConfigType == CONFIG_BB_AGC_TAB) + READ_AND_CONFIG_TC(8703B,_AGC_TAB); + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + READ_AND_CONFIG_TC(8703B,_PHY_REG_PG); + } +#endif +#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) +#if (RTL8188F_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8188F) + { + if(ConfigType == CONFIG_BB_PHY_REG) + READ_AND_CONFIG_TC(8188F,_PHY_REG); + else if(ConfigType == CONFIG_BB_AGC_TAB) + READ_AND_CONFIG_TC(8188F,_AGC_TAB); + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + READ_AND_CONFIG_TC(8188F,_PHY_REG_PG); + } +#endif +#endif +#if (RTL8195A_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8195A) + { + if(ConfigType == CONFIG_BB_PHY_REG) + READ_AND_CONFIG(8195A,_PHY_REG); + else if(ConfigType == CONFIG_BB_AGC_TAB) + READ_AND_CONFIG(8195A,_AGC_TAB); + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + READ_AND_CONFIG(8195A,_PHY_REG_PG); + } +#endif +#endif//(DM_ODM_SUPPORT_TYPE & ODM_WIN) + return HAL_STATUS_SUCCESS; } @@ -2136,57 +2360,89 @@ ODM_ConfigMACWithHeaderFile( IN PDM_ODM_T pDM_Odm ) { -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) PADAPTER Adapter = pDM_Odm->Adapter; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); #endif - u1Byte result = HAL_STATUS_SUCCESS; ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===>ODM_ConfigMACWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); - + +//1 AP doesn't use PHYDM initialization in these ICs +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) #if (RTL8723A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723A) - { + if (pDM_Odm->SupportICType == ODM_RTL8723A){ READ_AND_CONFIG_MP(8723A,_MAC_REG); } #endif -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - READ_AND_CONFIG_MP(8188E,_MAC_REG); - } -#endif #if (RTL8812A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8812) - { + if (pDM_Odm->SupportICType == ODM_RTL8812){ READ_AND_CONFIG_MP(8812A,_MAC_REG); } #endif #if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - { + if (pDM_Odm->SupportICType == ODM_RTL8821){ READ_AND_CONFIG_MP(8821A,_MAC_REG); ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigMACwithHeaderFile\n")); } #endif #if (RTL8723B_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723B) - { + if (pDM_Odm->SupportICType == ODM_RTL8723B){ READ_AND_CONFIG_MP(8723B,_MAC_REG); } #endif #if (RTL8192E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8192E) - { + if (pDM_Odm->SupportICType == ODM_RTL8192E){ READ_AND_CONFIG_MP(8192E,_MAC_REG); } #endif +#endif//(DM_ODM_SUPPORT_TYPE != ODM_AP) + +//1 All platforms support +#if (RTL8188E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188E){ + READ_AND_CONFIG_MP(8188E,_MAC_REG); + } +#endif +#if (RTL8814A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8814A){ + READ_AND_CONFIG_MP(8814A,_MAC_REG); + } +#endif + +//1 New ICs (WIN only) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (RTL8821B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8821B){ + READ_AND_CONFIG(8821B,_MAC_REG); + } +#endif +#if (RTL8822B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8822B) + READ_AND_CONFIG_TC(8822B,_MAC_REG); +#endif +#if (RTL8703B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8703B) + READ_AND_CONFIG_TC(8703B,_MAC_REG); +#endif - return result; +#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) +#if (RTL8188F_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188F) + READ_AND_CONFIG_TC(8188F,_MAC_REG); +#endif +#endif +#if (RTL8195A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8195A) + READ_AND_CONFIG_MP(8195A,_MAC_REG); +#endif +#endif /*#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)*/ + + return HAL_STATUS_SUCCESS; } HAL_STATUS @@ -2197,97 +2453,72 @@ ODM_ConfigFWWithHeaderFile( OUT u4Byte *pSize ) { +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) #if (RTL8188E_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8188E) { #ifdef CONFIG_SFW_SUPPORTED - if (ConfigType == CONFIG_FW_NIC) - { + if (ConfigType == CONFIG_FW_NIC){ READ_FIRMWARE_MP(8188E,_FW_NIC_T); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { + }else if (ConfigType == CONFIG_FW_WoWLAN){ READ_FIRMWARE_MP(8188E,_FW_WoWLAN_T); - } - else if(ConfigType == CONFIG_FW_NIC_2) - { + }else if(ConfigType == CONFIG_FW_NIC_2){ READ_FIRMWARE_MP(8188E,_FW_NIC_S); - } - else if (ConfigType == CONFIG_FW_WoWLAN_2) - { + }else if (ConfigType == CONFIG_FW_WoWLAN_2){ READ_FIRMWARE_MP(8188E,_FW_WoWLAN_S); } #else if (ConfigType == CONFIG_FW_NIC) - { READ_FIRMWARE_MP(8188E,_FW_NIC); - } else if (ConfigType == CONFIG_FW_WoWLAN) - { READ_FIRMWARE_MP(8188E,_FW_WoWLAN); - } #endif } #endif #if (RTL8723B_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8723B) { - if (ConfigType == CONFIG_FW_NIC) - { + if (ConfigType == CONFIG_FW_NIC){ READ_FIRMWARE_MP(8723B,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { + }else if (ConfigType == CONFIG_FW_WoWLAN){ READ_FIRMWARE_MP(8723B,_FW_WoWLAN); - } -#ifdef CONFIG_AP_WOWLAN - else if (ConfigType == CONFIG_FW_AP_WoWLAN) - { + #ifdef CONFIG_AP_WOWLAN + }else if (ConfigType == CONFIG_FW_AP_WoWLAN){ READ_FIRMWARE(8723B,_FW_AP_WoWLAN); - } -#endif - else if (ConfigType == CONFIG_FW_BT) - { + #endif + }else if (ConfigType == CONFIG_FW_BT){ READ_FIRMWARE_MP(8723B,_FW_BT); - } - else if (ConfigType == CONFIG_FW_MP) - { + #if (DM_ODM_SUPPORT_TYPE == ODM_CE) + }else if (ConfigType == CONFIG_FW_MP){ READ_FIRMWARE_MP(8723B,_FW_MP); + #endif } } -#endif +#endif //#if (RTL8723B_SUPPORT == 1) #if (RTL8812A_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8812) { - if (ConfigType == CONFIG_FW_NIC) - { + if (ConfigType == CONFIG_FW_NIC){ READ_FIRMWARE_MP(8812A,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { + }else if (ConfigType == CONFIG_FW_WoWLAN){ READ_FIRMWARE_MP(8812A,_FW_WoWLAN); - } - else if (ConfigType == CONFIG_FW_BT) - { + }else if (ConfigType == CONFIG_FW_BT){ READ_FIRMWARE_MP(8812A,_FW_NIC_BT); } - } #endif #if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - { - if (ConfigType == CONFIG_FW_NIC) - { + if (pDM_Odm->SupportICType == ODM_RTL8821){ + if (ConfigType == CONFIG_FW_NIC){ READ_FIRMWARE_MP(8821A,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { + }else if (ConfigType == CONFIG_FW_WoWLAN){ READ_FIRMWARE_MP(8821A,_FW_WoWLAN); - } - else if (ConfigType == CONFIG_FW_BT) - { +#ifdef CONFIG_AP_WOWLAN + } else if (ConfigType == CONFIG_FW_AP_WoWLAN) { + READ_FIRMWARE_MP(8821A , _FW_AP); +#endif /*CONFIG_AP_WOWLAN*/ + }else if (ConfigType == CONFIG_FW_BT){ READ_FIRMWARE_MP(8821A,_FW_NIC_BT); } } @@ -2295,27 +2526,63 @@ ODM_ConfigFWWithHeaderFile( #if (RTL8192E_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8192E) { - if (ConfigType == CONFIG_FW_NIC) - { + if (ConfigType == CONFIG_FW_NIC){ READ_FIRMWARE_MP(8192E,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { + }else if (ConfigType == CONFIG_FW_WoWLAN){ READ_FIRMWARE_MP(8192E,_FW_WoWLAN); - } -#ifdef CONFIG_AP_WOWLAN + #ifdef CONFIG_AP_WOWLAN else if (ConfigType == CONFIG_FW_AP_WoWLAN) - { READ_FIRMWARE_MP(8192E,_FW_AP_WoWLAN); + #endif } + } +#endif +#if (RTL8814A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8814A) + { + if (ConfigType == CONFIG_FW_NIC) + READ_FIRMWARE_MP(8814A,_FW_NIC); + } #endif +//1 New ICs (WIN only) +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#if (RTL8821B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8821B) + { + } +#endif +#if (RTL8822B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8822B) + { + if (ConfigType == CONFIG_FW_NIC) + READ_FIRMWARE_MP(8822B,_FW_NIC); + else if (ConfigType == CONFIG_FW_WoWLAN) + READ_FIRMWARE(8822B,_FW_WoWLAN); } #endif +#if (RTL8703B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8703B) + { + if (ConfigType == CONFIG_FW_NIC) + READ_FIRMWARE_MP(8703B,_FW_NIC); + } +#endif +#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) +#if (RTL8188F_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188F) + { + if (ConfigType == CONFIG_FW_NIC) + READ_FIRMWARE_MP(8188F,_FW_NIC); + } +#endif +#endif +#endif//(DM_ODM_SUPPORT_TYPE == ODM_WIN) + +#endif//(DM_ODM_SUPPORT_TYPE != ODM_AP) return HAL_STATUS_SUCCESS; } - u4Byte ODM_GetHWImgVersion( IN PDM_ODM_T pDM_Odm @@ -2323,40 +2590,63 @@ ODM_GetHWImgVersion( { u4Byte Version=0; +//1 AP doesn't use PHYDM initialization in these ICs +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) #if (RTL8723A_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8723A) Version = GET_VERSION_MP(8723A,_MAC_REG); #endif - #if (RTL8723B_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8723B) Version = GET_VERSION_MP(8723B,_MAC_REG); #endif - -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - Version = GET_VERSION_MP(8188E,_MAC_REG); -#endif - #if (RTL8821A_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8821) Version = GET_VERSION_MP(8821A,_MAC_REG); #endif - #if (RTL8192E_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8192E) Version = GET_VERSION_MP(8192E,_MAC_REG); #endif - #if (RTL8812A_SUPPORT == 1) if (pDM_Odm->SupportICType == ODM_RTL8812) Version = GET_VERSION_MP(8812A,_MAC_REG); #endif +#endif //(DM_ODM_SUPPORT_TYPE != ODM_AP) - return Version; -} - +/*1 All platforms support*/ +#if (RTL8188E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188E) + Version = GET_VERSION_MP(8188E,_MAC_REG); +#endif +#if (RTL8814A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8814A) + Version = GET_VERSION_MP(8814A,_MAC_REG); +#endif +//1 New ICs (WIN only) +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#if (RTL8821B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8821B) + Version = GET_VERSION(8821B,_MAC_REG); +#endif +#if (RTL8822B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8822B) + Version = GET_VERSION(8822B, _MAC_REG); +#endif +#if (RTL8703B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8703B) + Version = GET_VERSION_TC(8703B, _MAC_REG); +#endif +#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) +#if (RTL8188F_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188F) + Version = GET_VERSION_TC(8188F, _MAC_REG); +#endif +#endif +#endif //(DM_ODM_SUPPORT_TYPE == ODM_WIN) + return Version; +} diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.h index da0e5fc1cfce..11d2d3862e25 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.h @@ -51,119 +51,131 @@ typedef struct _Phy_Rx_AGC_Info #endif } PHY_RX_AGC_INFO_T,*pPHY_RX_AGC_INFO_T; -typedef struct _Phy_Status_Rpt_8192cd -{ +typedef struct _Phy_Status_Rpt_8192cd { PHY_RX_AGC_INFO_T path_agc[2]; - u1Byte ch_corr[2]; + u1Byte ch_corr[2]; u1Byte cck_sig_qual_ofdm_pwdb_all; u1Byte cck_agc_rpt_ofdm_cfosho_a; u1Byte cck_rpt_b_ofdm_cfosho_b; - u1Byte rsvd_1;//ch_corr_msb; - u1Byte noise_power_db_msb; - s1Byte path_cfotail[2]; - u1Byte pcts_mask[2]; - s1Byte stream_rxevm[2]; + u1Byte rsvd_1;/*ch_corr_msb;*/ + u1Byte noise_power_db_msb; + s1Byte path_cfotail[2]; + u1Byte pcts_mask[2]; + s1Byte stream_rxevm[2]; u1Byte path_rxsnr[2]; - u1Byte noise_power_db_lsb; + u1Byte noise_power_db_lsb; u1Byte rsvd_2[3]; - u1Byte stream_csi[2]; - u1Byte stream_target_csi[2]; - s1Byte sig_evm; - u1Byte rsvd_3; - -#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; - u1Byte sgi_en:1; - u1Byte rxsc:2; - u1Byte idle_long:1; - u1Byte r_ant_train_en:1; - u1Byte ant_sel_b:1; - u1Byte ant_sel:1; -#else // _BIG_ENDIAN_ - u1Byte ant_sel:1; - u1Byte ant_sel_b:1; - u1Byte r_ant_train_en:1; - u1Byte idle_long:1; - u1Byte rxsc:2; - u1Byte sgi_en:1; - u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; + u1Byte stream_csi[2]; + u1Byte stream_target_csi[2]; + s1Byte sig_evm; + u1Byte rsvd_3; + +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte antsel_rx_keep_2: 1; /*ex_intf_flg:1;*/ + u1Byte sgi_en: 1; + u1Byte rxsc: 2; + u1Byte idle_long: 1; + u1Byte r_ant_train_en: 1; + u1Byte ant_sel_b: 1; + u1Byte ant_sel: 1; +#else /*_BIG_ENDIAN_ */ + u1Byte ant_sel: 1; + u1Byte ant_sel_b: 1; + u1Byte r_ant_train_en: 1; + u1Byte idle_long: 1; + u1Byte rxsc: 2; + u1Byte sgi_en: 1; + u1Byte antsel_rx_keep_2: 1;/*ex_intf_flg:1;*/ +#endif +} PHY_STATUS_RPT_8192CD_T, *PPHY_STATUS_RPT_8192CD_T; + + +typedef struct _Phy_Status_Rpt_8812 { +/* DWORD 0*/ + u1Byte gain_trsw[2]; /*path-A and path-B {TRSW, gain[6:0] }*/ + u1Byte chl_num_LSB; /*channel number[7:0]*/ +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte chl_num_MSB: 2; /*channel number[9:8]*/ + u1Byte sub_chnl: 4; /*sub-channel location[3:0]*/ + u1Byte r_RFMOD: 2; /*RF mode[1:0]*/ +#else /*_BIG_ENDIAN_ */ + u1Byte r_RFMOD: 2; + u1Byte sub_chnl: 4; + u1Byte chl_num_MSB: 2; #endif -} PHY_STATUS_RPT_8192CD_T,*PPHY_STATUS_RPT_8192CD_T; +/* DWORD 1*/ + u1Byte pwdb_all; /*CCK signal quality / OFDM pwdb all*/ + s1Byte cfosho[2]; /*DW1 byte 1 DW1 byte2 CCK AGC report and CCK_BB_Power / OFDM Path-A and Path-B short CFO*/ +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + /*this should be checked again because the definition of 8812 and 8814 is different*/ +/* u1Byte r_cck_rx_enable_pathc:2; cck rx enable pathc[1:0]*/ +/* u1Byte cck_rx_path:4; cck rx path[3:0]*/ + u1Byte resvd_0: 6; + u1Byte bt_RF_ch_MSB: 2; /*8812A:2'b0 8814A: bt rf channel keep[7:6]*/ +#else /*_BIG_ENDIAN_*/ + u1Byte bt_RF_ch_MSB: 2; + u1Byte resvd_0: 6; +#endif -typedef struct _Phy_Status_Rpt_8812 -{ -#if 0 - PHY_RX_AGC_INFO_T path_agc[2]; - u1Byte ch_num[2]; - u1Byte cck_sig_qual_ofdm_pwdb_all; - u1Byte cck_agc_rpt_ofdm_cfosho_a; - u1Byte cck_bb_pwr_ofdm_cfosho_b; - u1Byte cck_rx_path; //CCK_RX_PATH [3:0] (with regA07[3:0] definition) - u1Byte rsvd_1; - u1Byte path_cfotail[2]; - u1Byte pcts_mask[2]; - s1Byte stream_rxevm[2]; - u1Byte path_rxsnr[2]; - u1Byte rsvd_2[2]; - u1Byte stream_snr[2]; - u1Byte stream_csi[2]; - u1Byte rsvd_3[2]; - s1Byte sig_evm; - u1Byte rsvd_4; -#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u1Byte antidx_anta:3; - u1Byte antidx_antb:3; - u1Byte rsvd_5:2; -#else // _BIG_ENDIAN_ - u1Byte rsvd_5:2; - u1Byte antidx_antb:3; - u1Byte antidx_anta:3; +/* DWORD 2*/ +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte ant_div_sw_a: 1; /*8812A: ant_div_sw_a 8814A: 1'b0*/ + u1Byte ant_div_sw_b: 1; /*8812A: ant_div_sw_b 8814A: 1'b0*/ + u1Byte bt_RF_ch_LSB: 6; /*8812A: 6'b0 8814A: bt rf channel keep[5:0]*/ +#else /*_BIG_ENDIAN_ */ + u1Byte bt_RF_ch_LSB: 6; + u1Byte ant_div_sw_b: 1; + u1Byte ant_div_sw_a: 1; #endif + s1Byte cfotail[2]; /*DW2 byte 1 DW2 byte 2 path-A and path-B CFO tail*/ + u1Byte PCTS_MSK_RPT_0; /*PCTS mask report[7:0]*/ + u1Byte PCTS_MSK_RPT_1; /*PCTS mask report[15:8]*/ + +/* DWORD 3*/ + s1Byte rxevm[2]; /*DW3 byte 1 DW3 byte 2 stream 1 and stream 2 RX EVM*/ + s1Byte rxsnr[2]; /*DW3 byte 3 DW4 byte 0 path-A and path-B RX SNR*/ + +/* DWORD 4*/ + u1Byte PCTS_MSK_RPT_2; /*PCTS mask report[23:16]*/ +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte PCTS_MSK_RPT_3: 6; /*PCTS mask report[29:24]*/ + u1Byte pcts_rpt_valid: 1; /*pcts_rpt_valid*/ + u1Byte resvd_1: 1; /*1'b0*/ +#else /*_BIG_ENDIAN_*/ + u1Byte resvd_1: 1; + u1Byte pcts_rpt_valid: 1; + u1Byte PCTS_MSK_RPT_3: 6; #endif - - //2012.05.24 LukeLee: This structure should take big/little endian in consideration later..... - - //DWORD 0 - u1Byte gain_trsw[2]; -#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u2Byte chl_num:10; - u2Byte sub_chnl:4; - u2Byte r_RFMOD:2; -#else // _BIG_ENDIAN_ - u2Byte r_RFMOD:2; - u2Byte sub_chnl:4; - u2Byte chl_num:10; + s1Byte rxevm_cd[2]; /*DW 4 byte 3 DW5 byte 0 8812A: 16'b0 8814A: stream 3 and stream 4 RX EVM*/ + +/* DWORD 5*/ + u1Byte csi_current[2]; /*DW5 byte 1 DW5 byte 2 8812A: stream 1 and 2 CSI 8814A: path-C and path-D RX SNR*/ + u1Byte gain_trsw_cd[2]; /*DW5 byte 3 DW6 byte 0 path-C and path-D {TRSW, gain[6:0] }*/ + +/* DWORD 6*/ + s1Byte sigevm; /*signal field EVM*/ +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte antidx_antc: 3; /*8812A: 3'b0 8814A: antidx_antc[2:0]*/ + u1Byte antidx_antd: 3; /*8812A: 3'b0 8814A: antidx_antd[2:0]*/ + u1Byte dpdt_ctrl_keep: 1; /*8812A: 1'b0 8814A: dpdt_ctrl_keep*/ + u1Byte GNT_BT_keep: 1; /*8812A: 1'b0 8814A: GNT_BT_keep*/ +#else /*_BIG_ENDIAN_*/ + u1Byte GNT_BT_keep: 1; + u1Byte dpdt_ctrl_keep: 1; + u1Byte antidx_antd: 3; + u1Byte antidx_antc: 3; #endif - - //DWORD 1 - u1Byte pwdb_all; - u1Byte cfosho[4]; // DW 1 byte 1 DW 2 byte 0 - - //DWORD 2 - s1Byte cfotail[4]; // DW 2 byte 1 DW 3 byte 0 - - //DWORD 3 - s1Byte rxevm[2]; // DW 3 byte 1 DW 3 byte 2 - s1Byte rxsnr[2]; // DW 3 byte 3 DW 4 byte 0 - - //DWORD 4 - u1Byte PCTS_MSK_RPT[2]; - u1Byte pdsnr[2]; // DW 4 byte 3 DW 5 Byte 0 - - //DWORD 5 - u1Byte csi_current[2]; - u1Byte rx_gain_c; - - //DWORD 6 - u1Byte rx_gain_d; - s1Byte sigevm; - u1Byte resvd_0; - u1Byte antidx_anta:3; - u1Byte antidx_antb:3; - u1Byte resvd_1:2; -} PHY_STATUS_RPT_8812_T,*PPHY_STATUS_RPT_8812_T; - +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte antidx_anta: 3; /*antidx_anta[2:0]*/ + u1Byte antidx_antb: 3; /*antidx_antb[2:0]*/ + u1Byte resvd_2: 2; /*1'b0*/ +#else /*_BIG_ENDIAN_*/ + u1Byte resvd_2: 2; + u1Byte antidx_antb: 3; + u1Byte antidx_anta: 3; +#endif +} PHY_STATUS_RPT_8812_T, *PPHY_STATUS_RPT_8812_T; VOID odm_Init_RSSIForDM( @@ -187,7 +199,6 @@ ODM_MacStatusQuery( IN BOOLEAN bPacketToSelf, IN BOOLEAN bPacketBeacon ); -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP)) HAL_STATUS ODM_ConfigRFWithTxPwrTrackHeaderFile( @@ -231,7 +242,6 @@ odm_SignalScaleMapping( IN s4Byte CurrSig ); -#endif #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.c index 3bbea923f5af..72f8907059d1 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.c @@ -1,42 +1,706 @@ -/****************************************************************************** - * - * 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 -//============================================================ +/****************************************************************************** + * + * 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" - +#include "phydm_precomp.h" + +#if(defined(CONFIG_PATH_DIVERSITY)) +#if RTL8814A_SUPPORT - VOID -odm_PathDiversityInit( - IN PVOID pDM_VOID +phydm_dtp_fix_tx_path( + IN PVOID pDM_VOID, + IN u1Byte path + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv; + u1Byte i,num_enable_path=0; + + if(path==pDM_PathDiv->pre_tx_path) + { + return; + } + else + { + pDM_PathDiv->pre_tx_path=path; + } + + ODM_SetBBReg( pDM_Odm, 0x93c, BIT18|BIT19, 3); + + for(i=0; i<4; i++) + { + if(path&BIT(i)) + num_enable_path++; + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Number of trun-on path : (( %d ))\n", num_enable_path)); + + if(num_enable_path == 1) + { + ODM_SetBBReg( pDM_Odm, 0x93c, 0xf00000, path); + + if(path==PHYDM_A)//1-1 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A ))\n")); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0); + } + else if(path==PHYDM_B)//1-2 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( B ))\n")); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0); + } + else if(path==PHYDM_C)//1-3 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( C ))\n")); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 0); + + } + else if(path==PHYDM_D)//1-4 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( D ))\n")); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 0); + } + + } + else if(num_enable_path == 2) + { + ODM_SetBBReg( pDM_Odm, 0x93c, 0xf00000, path); + ODM_SetBBReg( pDM_Odm, 0x940, 0xf0, path); + + if(path==PHYDM_AB)//2-1 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A B ))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 1); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 1); + } + else if(path==PHYDM_AC)//2-2 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A C ))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1); + } + else if(path==PHYDM_AD)//2-3 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A D ))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 1); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 1); + } + else if(path==PHYDM_BC)//2-4 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( B C ))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1); + } + else if(path==PHYDM_BD)//2-5 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( B D ))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 1); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 1); + } + else if(path==PHYDM_CD)//2-6 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( C D ))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 1); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 1); + } + + } + else if(num_enable_path == 3) + { + ODM_SetBBReg( pDM_Odm, 0x93c, 0xf00000, path); + ODM_SetBBReg( pDM_Odm, 0x940, 0xf0, path); + ODM_SetBBReg( pDM_Odm, 0x940, 0xf0000, path); + + if(path==PHYDM_ABC)//3-1 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A B C))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 1); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 2); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 1); + ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 2); + //set for 3ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT21|BIT20, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT23|BIT22, 1); + ODM_SetBBReg( pDM_Odm, 0x940, BIT25|BIT24, 2); + } + else if(path==PHYDM_ABD)//3-2 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A B D ))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 1); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 2); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 1); + ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 2); + //set for 3ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT21|BIT20, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT23|BIT22, 1); + ODM_SetBBReg( pDM_Odm, 0x940, BIT27|BIT26, 2); + + } + else if(path==PHYDM_ACD)//3-3 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A C D ))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 2); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1); + ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 2); + //set for 3ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT21|BIT20, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT25|BIT24, 1); + ODM_SetBBReg( pDM_Odm, 0x940, BIT27|BIT26, 2); + } + else if(path==PHYDM_BCD)//3-4 + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( B C D))\n")); + //set for 1ss + ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1); + ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 2); + //set for 2ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1); + ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 2); + //set for 3ss + ODM_SetBBReg( pDM_Odm, 0x940, BIT23|BIT22, 0); + ODM_SetBBReg( pDM_Odm, 0x940, BIT25|BIT24, 1); + ODM_SetBBReg( pDM_Odm, 0x940, BIT27|BIT26, 2); + } + } + else if(num_enable_path == 4) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path ((A B C D))\n")); + } + +} + +VOID +phydm_find_default_path( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv; + u4Byte rssi_avg_a=0, rssi_avg_b=0, rssi_avg_c=0, rssi_avg_d=0, rssi_avg_bcd=0; + u4Byte rssi_total_a=0, rssi_total_b=0, rssi_total_c=0, rssi_total_d=0; + + //2 Default Path Selection By RSSI + + rssi_avg_a = (pDM_PathDiv->path_a_cnt_all > 0)? (pDM_PathDiv->path_a_sum_all / pDM_PathDiv->path_a_cnt_all) :0 ; + rssi_avg_b = (pDM_PathDiv->path_b_cnt_all > 0)? (pDM_PathDiv->path_b_sum_all / pDM_PathDiv->path_b_cnt_all) :0 ; + rssi_avg_c = (pDM_PathDiv->path_c_cnt_all > 0)? (pDM_PathDiv->path_c_sum_all / pDM_PathDiv->path_c_cnt_all) :0 ; + rssi_avg_d = (pDM_PathDiv->path_d_cnt_all > 0)? (pDM_PathDiv->path_d_sum_all / pDM_PathDiv->path_d_cnt_all) :0 ; + + + pDM_PathDiv->path_a_sum_all = 0; + pDM_PathDiv->path_a_cnt_all = 0; + pDM_PathDiv->path_b_sum_all = 0; + pDM_PathDiv->path_b_cnt_all = 0; + pDM_PathDiv->path_c_sum_all = 0; + pDM_PathDiv->path_c_cnt_all = 0; + pDM_PathDiv->path_d_sum_all = 0; + pDM_PathDiv->path_d_cnt_all = 0; + + if(pDM_PathDiv->use_path_a_as_default_ant == 1) + { + rssi_avg_bcd=(rssi_avg_b+rssi_avg_c+rssi_avg_d)/3; + + if( (rssi_avg_a + ANT_DECT_RSSI_TH) > rssi_avg_bcd ) + { + pDM_PathDiv->is_pathA_exist=TRUE; + pDM_PathDiv->default_path=PATH_A; + } + else + { + pDM_PathDiv->is_pathA_exist=FALSE; + } + } + else + { + if( (rssi_avg_a >=rssi_avg_b) && (rssi_avg_a >=rssi_avg_c)&&(rssi_avg_a >=rssi_avg_d)) + pDM_PathDiv->default_path=PATH_A; + else if( (rssi_avg_b >=rssi_avg_c)&&(rssi_avg_b >=rssi_avg_d)) + pDM_PathDiv->default_path=PATH_B; + else if( rssi_avg_c >=rssi_avg_d) + pDM_PathDiv->default_path=PATH_C; + else + pDM_PathDiv->default_path=PATH_D; + } + + +} + + +VOID +phydm_candidate_dtp_update( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv; + + pDM_PathDiv->num_candidate=3; + + if(pDM_PathDiv->use_path_a_as_default_ant == 1) + { + if(pDM_PathDiv->num_tx_path==3) + { + if(pDM_PathDiv->is_pathA_exist) + { + pDM_PathDiv->ant_candidate_1 = PHYDM_ABC; + pDM_PathDiv->ant_candidate_2 = PHYDM_ABD; + pDM_PathDiv->ant_candidate_3 = PHYDM_ACD; + } + else // use path BCD + { + pDM_PathDiv->num_candidate=1; + phydm_dtp_fix_tx_path(pDM_Odm, PHYDM_BCD); + return; + } + } + else if(pDM_PathDiv->num_tx_path==2) + { + if(pDM_PathDiv->is_pathA_exist) + { + pDM_PathDiv->ant_candidate_1 = PHYDM_AB; + pDM_PathDiv->ant_candidate_2 = PHYDM_AC; + pDM_PathDiv->ant_candidate_3 = PHYDM_AD; + } + else + { + pDM_PathDiv->ant_candidate_1 = PHYDM_BC; + pDM_PathDiv->ant_candidate_2 = PHYDM_BD; + pDM_PathDiv->ant_candidate_3 = PHYDM_CD; + } + } + } + else + { + //2 3 TX Mode + if(pDM_PathDiv->num_tx_path==3)//choose 3 ant form 4 + { + if(pDM_PathDiv->default_path == PATH_A) //choose 2 ant form 3 + { + pDM_PathDiv->ant_candidate_1 = PHYDM_ABC; + pDM_PathDiv->ant_candidate_2 = PHYDM_ABD; + pDM_PathDiv->ant_candidate_3 = PHYDM_ACD; + } + else if(pDM_PathDiv->default_path==PATH_B) + { + pDM_PathDiv->ant_candidate_1 = PHYDM_ABC; + pDM_PathDiv->ant_candidate_2 = PHYDM_ABD; + pDM_PathDiv->ant_candidate_3 = PHYDM_BCD; + } + else if(pDM_PathDiv->default_path == PATH_C) + { + pDM_PathDiv->ant_candidate_1 = PHYDM_ABC; + pDM_PathDiv->ant_candidate_2 = PHYDM_ACD; + pDM_PathDiv->ant_candidate_3 = PHYDM_BCD; + } + else if(pDM_PathDiv->default_path == PATH_D) + { + pDM_PathDiv->ant_candidate_1 = PHYDM_ABD; + pDM_PathDiv->ant_candidate_2 = PHYDM_ACD; + pDM_PathDiv->ant_candidate_3 = PHYDM_BCD; + } + } + + //2 2 TX Mode + else if(pDM_PathDiv->num_tx_path==2)//choose 2 ant form 4 + { + if(pDM_PathDiv->default_path == PATH_A) //choose 2 ant form 3 + { + pDM_PathDiv->ant_candidate_1 = PHYDM_AB; + pDM_PathDiv->ant_candidate_2 = PHYDM_AC; + pDM_PathDiv->ant_candidate_3 = PHYDM_AD; + } + else if(pDM_PathDiv->default_path==PATH_B) + { + pDM_PathDiv->ant_candidate_1 = PHYDM_AB; + pDM_PathDiv->ant_candidate_2 = PHYDM_BC; + pDM_PathDiv->ant_candidate_3 = PHYDM_BD; + } + else if(pDM_PathDiv->default_path == PATH_C) + { + pDM_PathDiv->ant_candidate_1 = PHYDM_AC; + pDM_PathDiv->ant_candidate_2 = PHYDM_BC; + pDM_PathDiv->ant_candidate_3 = PHYDM_CD; + } + else if(pDM_PathDiv->default_path == PATH_D) + { + pDM_PathDiv->ant_candidate_1= PHYDM_AD; + pDM_PathDiv->ant_candidate_2 = PHYDM_BD; + pDM_PathDiv->ant_candidate_3= PHYDM_CD; + } + } + } +} + + +VOID +phydm_dynamic_tx_path( + IN PVOID pDM_VOID ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv; + + PSTA_INFO_T pEntry; + u4Byte i; + u1Byte num_client=0; + u1Byte H2C_Parameter[6] ={0}; - if(pDM_Odm->mp_mode == TRUE) + + if(!pDM_Odm->bLinked) //bLinked==False + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("DTP_8814 [No Link!!!]\n")); + + if(pDM_PathDiv->bBecomeLinked == TRUE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" [Be disconnected]----->\n")); + pDM_PathDiv->bBecomeLinked = pDM_Odm->bLinked; + } + return; + } + else + { + if(pDM_PathDiv->bBecomeLinked ==FALSE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" [Be Linked !!!]----->\n")); + pDM_PathDiv->bBecomeLinked = pDM_Odm->bLinked; + } + } + + //2 [Period CTRL] + if(pDM_PathDiv->dtp_period >=2) + { + pDM_PathDiv->dtp_period=0; + } + else + { + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("Phydm_Dynamic_Tx_Path_8814A() Stay = (( %d ))\n",pDM_PathDiv->dtp_period)); + pDM_PathDiv->dtp_period++; + return; + } + + + //2 [Fix Path] + if (pDM_Odm->path_select != PHYDM_AUTO_PATH) + { return; + } + + //2 [Check Bfer] + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #if (BEAMFORMING_SUPPORT == 1) + { + BEAMFORMING_CAP BeamformCap = (pDM_Odm->BeamformingInfo.BeamformCap); + if( BeamformCap & BEAMFORMER_CAP ) // BFmer On && Div On -> Div Off + { + if( pDM_PathDiv->fix_path_bfer == 0) + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("[ PathDiv : OFF ] BFmer ==1 \n")); + pDM_PathDiv->fix_path_bfer = 1 ; + } + return; + } + else // BFmer Off && Div Off -> Div On + { + if( pDM_PathDiv->fix_path_bfer == 1 ) + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("[ PathDiv : ON ] BFmer ==0 \n")); + pDM_PathDiv->fix_path_bfer = 0; + } + } + } + #endif + #endif + + if(pDM_PathDiv->use_path_a_as_default_ant ==1) + { + phydm_find_default_path(pDM_Odm); + phydm_candidate_dtp_update(pDM_Odm); + } + else + { + if( pDM_PathDiv->dtp_state == PHYDM_DTP_INIT) + { + phydm_find_default_path(pDM_Odm); + phydm_candidate_dtp_update(pDM_Odm); + pDM_PathDiv->dtp_state = PHYDM_DTP_RUNNING_1; + } + + else if( pDM_PathDiv->dtp_state == PHYDM_DTP_RUNNING_1) + { + pDM_PathDiv->dtp_check_patha_counter++; + + if(pDM_PathDiv->dtp_check_patha_counter>=NUM_RESET_DTP_PERIOD) + { + pDM_PathDiv->dtp_check_patha_counter=0; + pDM_PathDiv->dtp_state = PHYDM_DTP_INIT; + } + //2 Search space update + else + { + // 1. find the worst candidate + + + // 2. repalce the worst candidate + } + } + } + + //2 Dynamic Path Selection H2C + + if(pDM_PathDiv->num_candidate == 1) + { + return; + } + else + { + H2C_Parameter[0] = pDM_PathDiv->num_candidate; + H2C_Parameter[1] = pDM_PathDiv->num_tx_path; + H2C_Parameter[2] = pDM_PathDiv->ant_candidate_1; + H2C_Parameter[3] = pDM_PathDiv->ant_candidate_2; + H2C_Parameter[4] = pDM_PathDiv->ant_candidate_3; + + ODM_FillH2CCmd(pDM_Odm, PHYDM_H2C_DYNAMIC_TX_PATH, 6, H2C_Parameter); + } + +} + + + +VOID +phydm_dynamic_tx_path_init( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pPATHDIV_T pDM_PathDiv = &(pDM_Odm->DM_PathDiv); + PADAPTER pAdapter = pDM_Odm->Adapter; + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + USB_MODE_MECH *pUsbModeMech = &pAdapter->UsbModeMechanism; + #endif + u1Byte search_space_2[NUM_CHOOSE2_FROM4]= {PHYDM_AB, PHYDM_AC, PHYDM_AD, PHYDM_BC, PHYDM_BD, PHYDM_CD }; + u1Byte search_space_3[NUM_CHOOSE3_FROM4]= {PHYDM_BCD, PHYDM_ACD, PHYDM_ABD, PHYDM_ABC}; + + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + pDM_PathDiv->is_u3_mode = (pUsbModeMech->CurUsbMode==USB_MODE_U3)? 1 : 0 ; + #else + pDM_PathDiv->is_u3_mode = 1; + #endif + ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("Dynamic TX Path Init 8814\n")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("is_u3_mode = (( %d ))\n", pDM_PathDiv->is_u3_mode)); + + memcpy(&(pDM_PathDiv->search_space_2[0]), &(search_space_2[0]), NUM_CHOOSE2_FROM4); + memcpy(&(pDM_PathDiv->search_space_3[0]), &(search_space_3[0]), NUM_CHOOSE3_FROM4); + + pDM_PathDiv->use_path_a_as_default_ant= 1; + pDM_PathDiv->dtp_state = PHYDM_DTP_INIT; + pDM_Odm->path_select = PHYDM_AUTO_PATH; + pDM_PathDiv->path_div_type = PHYDM_4R_PATH_DIV; + + + if(pDM_PathDiv->is_u3_mode ) + { + pDM_PathDiv->num_tx_path=3; + phydm_dtp_fix_tx_path(pDM_Odm, PHYDM_BCD);/* 3TX Set Init TX Path*/ + + } + else + { + pDM_PathDiv->num_tx_path=2; + phydm_dtp_fix_tx_path(pDM_Odm, PHYDM_BC);/* 2TX // Set Init TX Path*/ + } + +} + + +VOID +phydm_process_rssi_for_path_div( + IN OUT PVOID pDM_VOID, + IN PVOID p_phy_info_void, + IN PVOID p_pkt_info_void + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PODM_PHY_INFO_T pPhyInfo=(PODM_PHY_INFO_T)p_phy_info_void; + PODM_PACKET_INFO_T pPktinfo=(PODM_PACKET_INFO_T)p_pkt_info_void; + pPATHDIV_T pDM_PathDiv = &(pDM_Odm->DM_PathDiv); + + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) + { + if(pPktinfo->DataRate > ODM_RATE11M) + { + if(pDM_PathDiv->path_div_type == PHYDM_4R_PATH_DIV) + { + #if RTL8814A_SUPPORT + if(pDM_Odm->SupportICType & ODM_RTL8814A) + { + pDM_PathDiv->path_a_sum_all+=pPhyInfo->RxMIMOSignalStrength[0]; + pDM_PathDiv->path_a_cnt_all++; + + pDM_PathDiv->path_b_sum_all+=pPhyInfo->RxMIMOSignalStrength[1]; + pDM_PathDiv->path_b_cnt_all++; + + pDM_PathDiv->path_c_sum_all+=pPhyInfo->RxMIMOSignalStrength[2]; + pDM_PathDiv->path_c_cnt_all++; + + pDM_PathDiv->path_d_sum_all+=pPhyInfo->RxMIMOSignalStrength[3]; + pDM_PathDiv->path_d_cnt_all++; + } + #endif + } + else + { + pDM_PathDiv->PathA_Sum[pPktinfo->StationID]+=pPhyInfo->RxMIMOSignalStrength[0]; + pDM_PathDiv->PathA_Cnt[pPktinfo->StationID]++; + + pDM_PathDiv->PathB_Sum[pPktinfo->StationID]+=pPhyInfo->RxMIMOSignalStrength[1]; + pDM_PathDiv->PathB_Cnt[pPktinfo->StationID]++; + } + } + } + + +} + +#endif //#if RTL8814A_SUPPORT + +VOID +odm_pathdiv_debug( + IN PVOID pDM_VOID, + IN u4Byte *const dm_value, + IN u4Byte *_used, + OUT char *output, + IN u4Byte *_out_len + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pPATHDIV_T pDM_PathDiv = &(pDM_Odm->DM_PathDiv); + u4Byte used = *_used; + u4Byte out_len = *_out_len; + + pDM_Odm->path_select = (dm_value[0] & 0xf); + PHYDM_SNPRINTF((output+used, out_len-used,"Path_select = (( 0x%x ))\n",pDM_Odm->path_select )); + + //2 [Fix Path] + if (pDM_Odm->path_select != PHYDM_AUTO_PATH) + { + PHYDM_SNPRINTF((output+used, out_len-used,"Trun on path [%s%s%s%s]\n", + ((pDM_Odm->path_select) & 0x1)?"A":"", + ((pDM_Odm->path_select) & 0x2)?"B":"", + ((pDM_Odm->path_select) & 0x4)?"C":"", + ((pDM_Odm->path_select) & 0x8)?"D":"" )); + + phydm_dtp_fix_tx_path( pDM_Odm, pDM_Odm->path_select ); + } + else + { + PHYDM_SNPRINTF((output+used, out_len-used,"%s\n","Auto Path")); + } +} + +#endif // #if(defined(CONFIG_PATH_DIVERSITY)) + +VOID +phydm_c2h_dtp_handler( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen +) +{ +#if(defined(CONFIG_PATH_DIVERSITY)) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pPATHDIV_T pDM_PathDiv = &(pDM_Odm->DM_PathDiv); + + u1Byte macid = CmdBuf[0]; + u1Byte target = CmdBuf[1]; + u1Byte nsc_1 = CmdBuf[2]; + u1Byte nsc_2 = CmdBuf[3]; + u1Byte nsc_3 = CmdBuf[4]; + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Target_candidate = (( %d ))\n", target)); + /* + if( (nsc_1 >= nsc_2) && (nsc_1 >= nsc_3)) + { + phydm_dtp_fix_tx_path(pDM_Odm, pDM_PathDiv->ant_candidate_1); + } + else if( nsc_2 >= nsc_3) + { + phydm_dtp_fix_tx_path(pDM_Odm, pDM_PathDiv->ant_candidate_2); + } + else + { + phydm_dtp_fix_tx_path(pDM_Odm, pDM_PathDiv->ant_candidate_3); + } + */ +#endif +} + +VOID +odm_PathDiversity( + IN PVOID pDM_VOID +) +{ +#if(defined(CONFIG_PATH_DIVERSITY)) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 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")); @@ -44,19 +708,34 @@ odm_PathDiversityInit( } #if RTL8812A_SUPPORT + if(pDM_Odm->SupportICType & ODM_RTL8812) - ODM_PathDiversityInit_8812A(pDM_Odm); + ODM_PathDiversity_8812A(pDM_Odm); + else + #endif + + #if RTL8814A_SUPPORT + if(pDM_Odm->SupportICType & ODM_RTL8814A) + phydm_dynamic_tx_path(pDM_Odm); + else #endif + {} #endif } - + VOID -odm_PathDiversity( - IN PVOID pDM_VOID +odm_PathDiversityInit( + IN PVOID pDM_VOID ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; +{ +#if(defined(CONFIG_PATH_DIVERSITY)) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + /*pDM_Odm->SupportAbility |= ODM_BB_PATH_DIV;*/ + + 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")); @@ -64,21 +743,28 @@ odm_PathDiversity( } #if RTL8812A_SUPPORT + if(pDM_Odm->SupportICType & ODM_RTL8812) + ODM_PathDiversityInit_8812A(pDM_Odm); + else + #endif + + #if RTL8814A_SUPPORT + if(pDM_Odm->SupportICType & ODM_RTL8814A) + phydm_dynamic_tx_path_init(pDM_Odm); + else + #endif + {} +#endif +} + - if(pDM_Odm->SupportICType & ODM_RTL8812) - ODM_PathDiversity_8812A(pDM_Odm); -#endif -#endif //(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -} - - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -// +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +// // 2011/12/02 MH Copy from MP oursrc for temporarily test. -// - -BOOLEAN +// +#if RTL8192C_SUPPORT +BOOLEAN odm_IsConnected_92C( IN PADAPTER Adapter ) @@ -117,7 +803,7 @@ odm_IsConnected_92C( } return bConnected; } - + BOOLEAN ODM_PathDiversityBeforeLink92C( //IN PADAPTER Adapter @@ -371,14 +1057,14 @@ odm_PathDiversityAfterLink_92C( } else if(pDM_PDTable->TrainingState == 1) { - //RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=1\n")); + //RT_TRACE( COMP_INIT, 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_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n")); + //RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n")); pDM_PDTable->TrainingState = 0; odm_CCKTXPathDiversity_92C(Adapter); if(pDM_PDTable->OFDM_Pkt_Cnt != 0) @@ -397,7 +1083,7 @@ odm_PathDiversityAfterLink_92C( } } - + VOID odm_SetRespPath_92C( IN PADAPTER Adapter, @@ -419,8 +1105,8 @@ odm_SetRespPath_92C( } } pDM_PDTable->DefaultRespPath = DefaultRespPath; -} - +} + VOID odm_OFDMTXPathDiversity_92C( IN PADAPTER Adapter) @@ -452,7 +1138,7 @@ odm_OFDMTXPathDiversity_92C( 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)); + //RT_TRACE( COMP_INIT, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath)); } //1 Extension Port for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) @@ -501,8 +1187,8 @@ odm_OFDMTXPathDiversity_92C( pDM_PDTable->OFDMDefaultRespPath = DefaultRespPath; } - - + + VOID odm_CCKTXPathDiversity_92C( IN PADAPTER Adapter @@ -650,8 +1336,8 @@ odm_CCKTXPathDiversity_92C( pDM_PDTable->CCKDefaultRespPath = DefaultRespPath; } - - + + VOID odm_ResetPathDiversity_92C( IN PADAPTER Adapter @@ -777,9 +1463,9 @@ odm_PathDivChkAntSwitchWorkitemCallback( PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; odm_PathDivChkAntSwitch(pDM_Odm); -} - - +} + + //MAC0_ACCESS_PHY1 // 2011-06-22 Neil Chen & Gary Hsin @@ -1151,7 +1837,7 @@ odm_PathDivChkAntSwitch( #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)); + ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value)); #endif } else if(nextAntenna==AUX_ANT) @@ -1166,7 +1852,7 @@ odm_PathDivChkAntSwitch( #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)); + ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value)); //for(u1Byte n=0; n<80,n++) //{ //delay_us(500); @@ -1174,7 +1860,7 @@ odm_PathDivChkAntSwitch( 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)); + ODM_FillH2CCmd(pDM_Odm, 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 ")); } @@ -1185,7 +1871,7 @@ odm_PathDivChkAntSwitch( #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)); + ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value)); #endif } } @@ -1247,9 +1933,9 @@ odm_PathDivChkAntSwitch( ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms } } - - - + + + VOID ODM_CCKPathDiversityChkPerPktRssi( PADAPTER Adapter, @@ -1385,8 +2071,8 @@ ODM_PathDivChkPerPktRssi( } } } - - + + // // 20100514 Luke/Joseph: // Add new function to reset antenna diversity state after link. @@ -1407,14 +2093,14 @@ ODM_PathDivRestAfterLink( pDM_SWAT_Table->RSSI_Trying = 0; pDM_SWAT_Table->SelectAntennaMap=0xAA; pDM_SWAT_Table->CurAntenna = MAIN_ANT; -} - - +} + + //================================================== //3 PathDiv End -//================================================== - - +//================================================== + + VOID ODM_FillTXPathInTXDESC( IN PADAPTER Adapter, @@ -1478,9 +2164,9 @@ IN PDM_ODM_T pDM_Odm) pathIQK->swt_5g_RegCA0=0x0; pathIQK->swt_5g_RegE30=0x0; -} - - +} + + u1Byte odm_SwAntDivSelectScanChnl( IN PADAPTER Adapter @@ -1579,7 +2265,52 @@ odm_SwAntDivConstructScanChnl( } } - - +#else + +VOID +odm_PathDivChkAntSwitchCallback( + PRT_TIMER pTimer +) +{ +} + +VOID +odm_PathDivChkAntSwitchWorkitemCallback( + IN PVOID pContext + ) +{ +} + +VOID +odm_CCKTXPathDiversityCallback( + PRT_TIMER pTimer +) +{ +} + +VOID +odm_CCKTXPathDiversityWorkItemCallback( + IN PVOID pContext + ) +{ +} +u1Byte +odm_SwAntDivSelectScanChnl( + IN PADAPTER Adapter + ) +{ + return 0; +} +VOID +odm_SwAntDivConstructScanChnl( + IN PADAPTER Adapter, + IN u1Byte ScanChnl + ) +{ +} + + +#endif + #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.h index e72e937a7bf5..ca2116f43bdd 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.h @@ -20,25 +20,156 @@ #ifndef __PHYDMPATHDIV_H__ #define __PHYDMPATHDIV_H__ +/*#define PATHDIV_VERSION "2.0" //2014.11.04*/ +#define PATHDIV_VERSION "3.0" /*2015.01.13 Dino*/ -#define PATHDIV_VERSION "1.0" +#if(defined(CONFIG_PATH_DIVERSITY)) +#define USE_PATH_A_AS_DEFAULT_ANT //for 8814 dynamic TX path selection -VOID +#define NUM_RESET_DTP_PERIOD 5 +#define ANT_DECT_RSSI_TH 3 + +#define PATH_A 1 +#define PATH_B 2 +#define PATH_C 3 +#define PATH_D 4 + +#define PHYDM_AUTO_PATH 0 +#define PHYDM_FIX_PATH 1 + +#define NUM_CHOOSE2_FROM4 6 +#define NUM_CHOOSE3_FROM4 4 + + +#define PHYDM_A BIT0 +#define PHYDM_B BIT1 +#define PHYDM_C BIT2 +#define PHYDM_D BIT3 +#define PHYDM_AB (BIT0 | BIT1) // 0 +#define PHYDM_AC (BIT0 | BIT2) // 1 +#define PHYDM_AD (BIT0 | BIT3) // 2 +#define PHYDM_BC (BIT1 | BIT2) // 3 +#define PHYDM_BD (BIT1 | BIT3) // 4 +#define PHYDM_CD (BIT2 | BIT3) // 5 + +#define PHYDM_ABC (BIT0 | BIT1 | BIT2) /* 0*/ +#define PHYDM_ABD (BIT0 | BIT1 | BIT3) /* 1*/ +#define PHYDM_ACD (BIT0 | BIT2 | BIT3) /* 2*/ +#define PHYDM_BCD (BIT1 | BIT2 | BIT3) /* 3*/ + +#define PHYDM_ABCD (BIT0 | BIT1 | BIT2 | BIT3) + + +typedef enum dtp_state +{ + PHYDM_DTP_INIT=1, + PHYDM_DTP_RUNNING_1 + +}PHYDM_DTP_STATE; + +typedef enum path_div_type +{ + PHYDM_2R_PATH_DIV = 1, + PHYDM_4R_PATH_DIV = 2 +}PHYDM_PATH_DIV_TYPE; + +VOID +phydm_process_rssi_for_path_div( + IN OUT PVOID pDM_VOID, + IN PVOID p_phy_info_void, + IN PVOID p_pkt_info_void + ); + +typedef struct _ODM_PATH_DIVERSITY_ +{ + u1Byte RespTxPath; + u1Byte PathSel[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte PathA_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte PathB_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u2Byte PathA_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u2Byte PathB_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte path_div_type; + #if RTL8814A_SUPPORT + + u4Byte path_a_sum_all; + u4Byte path_b_sum_all; + u4Byte path_c_sum_all; + u4Byte path_d_sum_all; + + u4Byte path_a_cnt_all; + u4Byte path_b_cnt_all; + u4Byte path_c_cnt_all; + u4Byte path_d_cnt_all; + + u1Byte dtp_period; + BOOLEAN bBecomeLinked; + BOOLEAN is_u3_mode; + u1Byte num_tx_path; + u1Byte default_path; + u1Byte num_candidate; + u1Byte ant_candidate_1; + u1Byte ant_candidate_2; + u1Byte ant_candidate_3; + u1Byte dtp_state; + u1Byte dtp_check_patha_counter; + BOOLEAN fix_path_bfer; + u1Byte search_space_2[NUM_CHOOSE2_FROM4]; + u1Byte search_space_3[NUM_CHOOSE3_FROM4]; + + u1Byte pre_tx_path; + u1Byte use_path_a_as_default_ant; + BOOLEAN is_pathA_exist; + + #endif +}PATHDIV_T, *pPATHDIV_T; + + +#endif //#if(defined(CONFIG_PATH_DIVERSITY)) + +VOID +phydm_c2h_dtp_handler( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen + ); + +VOID odm_PathDiversityInit( IN PVOID pDM_VOID ); -VOID +VOID odm_PathDiversity( IN PVOID pDM_VOID ); +VOID +odm_pathdiv_debug( + IN PVOID pDM_VOID, + IN u4Byte *const dm_value, + IN u4Byte *_used, + OUT char *output, + IN u4Byte *_out_len + ); + + + +//1 [OLD IC]-------------------------------------------------------------------------------- + + + + + + #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) //#define PATHDIV_ENABLE 1 #define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi #define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C + + + typedef struct _PathDiv_Parameter_define_ { u4Byte org_5g_RegE30; @@ -158,32 +289,32 @@ ODM_PathDivChkPerPktRssi( PRT_RFD pRfd ); -VOID -ODM_PathDivRestAfterLink( - IN PDM_ODM_T pDM_Odm +VOID +ODM_PathDivRestAfterLink( + IN PDM_ODM_T pDM_Odm ); -VOID -ODM_FillTXPathInTXDESC( - IN PADAPTER Adapter, - IN PRT_TCB pTcb, - IN pu1Byte pDesc +VOID +ODM_FillTXPathInTXDESC( + IN PADAPTER Adapter, + IN PRT_TCB pTcb, + IN pu1Byte pDesc ); -VOID -odm_PathDivInit_92D( +VOID +odm_PathDivInit_92D( IN PDM_ODM_T pDM_Odm ); u1Byte -odm_SwAntDivSelectScanChnl( - IN PADAPTER Adapter +odm_SwAntDivSelectScanChnl( + IN PADAPTER Adapter ); -VOID -odm_SwAntDivConstructScanChnl( - IN PADAPTER Adapter, - IN u1Byte ScanChnl +VOID +odm_SwAntDivConstructScanChnl( + IN PADAPTER Adapter, + IN u1Byte ScanChnl ); #endif //#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.c index 507b250ec174..827f636dd92d 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.c @@ -1,29 +1,29 @@ -/****************************************************************************** - * - * 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" - +/****************************************************************************** + * + * 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" + //============================================================ // Global var //============================================================ @@ -302,7 +302,7 @@ u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] = 0x3C4, // 35, +5.5dB 0x3FE // 36, +6.0dB }; - + #ifdef AP_BUILD_WORKAROUND unsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = { @@ -345,16 +345,16 @@ unsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = { /* -12.0dB */ 0x10000040 }; #endif - + VOID odm_TXPowerTrackingInit( - IN PVOID pDM_VOID + IN PVOID pDM_VOID ) { - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) if(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES))) return; #endif @@ -364,11 +364,11 @@ odm_TXPowerTrackingInit( u1Byte getSwingIndex( - IN PVOID pDM_VOID + IN PVOID pDM_VOID ) { - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - PADAPTER Adapter = pDM_Odm->Adapter; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PADAPTER Adapter = pDM_Odm->Adapter; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); u1Byte i = 0; u4Byte bbSwing; @@ -412,12 +412,13 @@ getSwingIndex( VOID odm_TXPowerTrackingThermalMeterInit( - IN PVOID pDM_VOID + IN PVOID pDM_VOID ) { - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - u1Byte defaultSwingIndex = getSwingIndex(pDM_Odm); + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte defaultSwingIndex = getSwingIndex(pDM_Odm); u1Byte p = 0; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) PADAPTER Adapter = pDM_Odm->Adapter; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); @@ -425,80 +426,63 @@ odm_TXPowerTrackingThermalMeterInit( 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); + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + pRFCalibrateInfo->bTXPowerTracking = _TRUE; + pRFCalibrateInfo->TXPowercount = 0; + pRFCalibrateInfo->bTXPowerTrackingInit = _FALSE; - 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); - } + if(pDM_Odm->mp_mode == FALSE) + pRFCalibrateInfo->TxPowerTrackControl = _TRUE; else - { - struct dm_priv *pdmpriv = &pHalData->dmpriv; + pRFCalibrateInfo->TxPowerTrackControl = _FALSE; - 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; + if(pDM_Odm->mp_mode == FALSE) + pRFCalibrateInfo->TxPowerTrackControl = _TRUE; - //MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl); - } + MSG_8192C("pDM_Odm TxPowerTrackControl = %d\n", pRFCalibrateInfo->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; + pRFCalibrateInfo->bTXPowerTracking = _TRUE; + pRFCalibrateInfo->TXPowercount = 0; + pRFCalibrateInfo->bTXPowerTrackingInit = _FALSE; + pRFCalibrateInfo->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; + pRFCalibrateInfo->ThermalValue = pHalData->EEPROMThermalMeter; + pRFCalibrateInfo->ThermalValue_IQK = pHalData->EEPROMThermalMeter; + pRFCalibrateInfo->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; + pRFCalibrateInfo->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex; + pRFCalibrateInfo->DefaultCckIndex = 20; } else { - pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex; - pDM_Odm->DefaultCckIndex = 24; + pRFCalibrateInfo->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex; + pRFCalibrateInfo->DefaultCckIndex = 24; } - pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex; - pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex; + pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex; + pRFCalibrateInfo->CCK_index = pRFCalibrateInfo->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; + pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex; + pRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex; + pRFCalibrateInfo->DeltaPowerIndex[p] = 0; + pRFCalibrateInfo->DeltaPowerIndexLast[p] = 0; + pRFCalibrateInfo->PowerIndexOffset[p] = 0; } } @@ -506,15 +490,13 @@ odm_TXPowerTrackingThermalMeterInit( VOID ODM_TXPowerTrackingCheck( - IN PVOID pDM_VOID + IN PVOID pDM_VOID ) { - // - // 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. - // - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + /* 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. */ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; switch (pDM_Odm->SupportPlatform) { case ODM_WIN: @@ -538,11 +520,11 @@ ODM_TXPowerTrackingCheck( VOID odm_TXPowerTrackingCheckCE( - IN PVOID pDM_VOID + IN PVOID pDM_VOID ) { - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; +#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)){ @@ -561,16 +543,14 @@ odm_TXPowerTrackingCheckCE( } #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)) - { + #if (((RTL8188E_SUPPORT == 1) || (RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8723B_SUPPORT == 1) || (RTL8814A_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)) + if (IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter) || IS_HARDWARE_TYPE_8723B(Adapter) || IS_HARDWARE_TYPE_8814A(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); @@ -592,11 +572,11 @@ odm_TXPowerTrackingCheckCE( VOID odm_TXPowerTrackingCheckMP( - IN PVOID pDM_VOID + IN PVOID pDM_VOID ) { - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) PADAPTER Adapter = pDM_Odm->Adapter; if (ODM_CheckPowerStatus(Adapter) == FALSE) @@ -620,11 +600,11 @@ odm_TXPowerTrackingCheckMP( VOID odm_TXPowerTrackingCheckAP( - IN PVOID pDM_VOID + IN PVOID pDM_VOID ) { - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; +#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)){ @@ -642,8 +622,8 @@ odm_TXPowerTrackingCheckAP( #endif } - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) VOID odm_TXPowerTrackingThermalMeterCheck( IN PADAPTER Adapter @@ -682,6 +662,6 @@ odm_TXPowerTrackingThermalMeterCheck( } #endif } -#endif - - +#endif + + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.h index 727cdb14a816..4594a5e6608b 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.h @@ -118,21 +118,59 @@ typedef struct ODM_RF_Calibration_Structure IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; u1Byte Delta_LCK; s1Byte BBSwingDiff2G, BBSwingDiff5G; // Unit: dB - u1Byte DeltaSwingTableIdx_2GCCKA_P[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GCCKA_N[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GCCKB_P[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GCCKB_N[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GA_P[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GA_N[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GB_P[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GB_N[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_5GA_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_5GA_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_5GB_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_5GB_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GA_P_8188E[DELTA_SWINGIDX_SIZE]; - u1Byte DeltaSwingTableIdx_2GA_N_8188E[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GCCKA_P[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GCCKA_N[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GCCKB_P[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GCCKB_N[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GCCKC_P[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GCCKC_N[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GCCKD_P[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GCCKD_N[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GA_P[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GA_N[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GB_P[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GB_N[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GC_P[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GC_N[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GD_P[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GD_N[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_5GA_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_5GA_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_5GB_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_5GB_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_5GC_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_5GC_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_5GD_P[BAND_NUM][DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_5GD_N[BAND_NUM][DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GA_P_8188E[DELTA_SWINGIDX_SIZE]; + u1Byte DeltaSwingTableIdx_2GA_N_8188E[DELTA_SWINGIDX_SIZE]; + u1Byte BbSwingIdxOfdm[MAX_RF_PATH]; + u1Byte BbSwingIdxOfdmCurrent; +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + u1Byte BbSwingIdxOfdmBase[MAX_RF_PATH]; +#else + u1Byte BbSwingIdxOfdmBase; +#endif + BOOLEAN BbSwingFlagOfdm; + u1Byte BbSwingIdxCck; + u1Byte BbSwingIdxCckCurrent; + u1Byte BbSwingIdxCckBase; + u1Byte DefaultOfdmIndex; + u1Byte DefaultCckIndex; + BOOLEAN BbSwingFlagCck; + + s1Byte Absolute_OFDMSwingIdx[MAX_RF_PATH]; + s1Byte Remnant_OFDMSwingIdx[MAX_RF_PATH]; + s1Byte Remnant_CCKSwingIdx; + s1Byte Modify_TxAGC_Value; /*Remnat compensate value at TxAGC */ + BOOLEAN Modify_TxAGC_Flag_PathA; + BOOLEAN Modify_TxAGC_Flag_PathB; + BOOLEAN Modify_TxAGC_Flag_PathC; + BOOLEAN Modify_TxAGC_Flag_PathD; + BOOLEAN Modify_TxAGC_Flag_PathA_CCK; + + s1Byte KfreeOffset[MAX_RF_PATH]; //--------------------------------------------------------------------// @@ -175,7 +213,9 @@ typedef struct ODM_RF_Calibration_Structure u1Byte bDPPathBOK; u4Byte TxLOK[2]; - + u4Byte DpkTxAGC; + s4Byte DpkGain; + u4Byte DpkThermal[4]; }ODM_RF_CAL_T,*PODM_RF_CAL_T; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.c index fcdcb0eca354..f05f50b2140c 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.c @@ -812,7 +812,7 @@ odm_PSD_Monitor( { if(H2C_PSD_DATA[i] !=H2C_PSD_DATA_last[i]) { - FW_FillH2CCmd(Adapter, H2C_92C_PSD_RESULT, 5, H2C_PSD_DATA); + FillH2CCmd92C(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; } @@ -1305,7 +1305,7 @@ void odm_RXHP( 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); + PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_FALSEALMCNT); u1Byte i, j, sum; u1Byte Is40MHz; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.c index 0e7873745a3a..1b4f42e095dd 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -24,673 +24,1055 @@ #include "Mp_Precomp.h" #include "phydm_precomp.h" +#if (defined(CONFIG_RA_DBG_CMD)) +VOID +ODM_C2HRaParaReportHandler( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + + u1Byte para_idx = CmdBuf[0]; //Retry Penalty, NH, NL + u1Byte RateTypeStart = CmdBuf[1]; + u1Byte RateTypeLength = CmdLen - 2; + u1Byte i; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[ From FW C2H RA Para ] CmdBuf[0]= (( %d ))\n", CmdBuf[0])); + + if (para_idx == RADBG_RTY_PENALTY) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index| |RTY Penality Index| \n")); + + for (i = 0 ; i < (RateTypeLength) ; i++) { + if (pRA_Table->is_ra_dbg_init) + pRA_Table->RTY_P_default[RateTypeStart + i] = CmdBuf[2 + i]; + + pRA_Table->RTY_P[RateTypeStart + i] = CmdBuf[2 + i]; + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("%8d %15d \n", (RateTypeStart + i), pRA_Table->RTY_P[RateTypeStart + i])); + } + + } else if (para_idx == RADBG_N_HIGH) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index| |N-High| \n")); + + + } else if (para_idx == RADBG_N_LOW){ + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index| |N-Low| \n")); + + } + else if (para_idx == RADBG_RATE_UP_RTY_RATIO) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index| |Rate Up RTY Ratio| \n")); + + for (i = 0 ; i < (RateTypeLength) ; i++) { + if (pRA_Table->is_ra_dbg_init) + pRA_Table->RATE_UP_RTY_RATIO_default[RateTypeStart + i] = CmdBuf[2 + i]; + + pRA_Table->RATE_UP_RTY_RATIO[RateTypeStart + i] = CmdBuf[2 + i]; + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("%8d %15d \n", (RateTypeStart + i), pRA_Table->RATE_UP_RTY_RATIO[RateTypeStart + i])); + } + } else if (para_idx == RADBG_RATE_DOWN_RTY_RATIO) { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index| |Rate Down RTY Ratio| \n")); + + for (i = 0 ; i < (RateTypeLength) ; i++) { + if (pRA_Table->is_ra_dbg_init) + pRA_Table->RATE_DOWN_RTY_RATIO_default[RateTypeStart + i] = CmdBuf[2 + i]; + + pRA_Table->RATE_DOWN_RTY_RATIO[RateTypeStart + i] = CmdBuf[2 + i]; + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("%8d %15d \n", (RateTypeStart + i), pRA_Table->RATE_DOWN_RTY_RATIO[RateTypeStart + i])); + } + } else if (para_idx == RADBG_DEBUG_MONITOR1) { + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n")); + if (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES) { + + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "RSSI =", CmdBuf[1])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s 0x%x \n", "Rate =", CmdBuf[2] & 0x7f)); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "SGI =", (CmdBuf[2] & 0x80) >> 7)); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "BW =", CmdBuf[3])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "BW_max =", CmdBuf[4])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s 0x%x \n", "multi_rate0 =", CmdBuf[5])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s 0x%x \n", "multi_rate1 =", CmdBuf[6])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "DISRA =", CmdBuf[7])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "VHT_EN =", CmdBuf[8])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "SGI_support =", CmdBuf[9])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "try_ness =", CmdBuf[10])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s 0x%x \n", "pre_rate =", CmdBuf[11])); + } else { + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "RSSI =", CmdBuf[1])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %x \n", "BW =", CmdBuf[2])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "DISRA =", CmdBuf[3])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "VHT_EN =", CmdBuf[4])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "Hightest Rate =", CmdBuf[5])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s 0x%x \n", "Lowest Rate =", CmdBuf[6])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s 0x%x \n", "SGI_support =", CmdBuf[7])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "Rate_ID =", CmdBuf[8]));; + } + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n")); + } else if (para_idx == RADBG_DEBUG_MONITOR2) { + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n")); + if (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES) { + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %d \n", "RateID =", CmdBuf[1])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s 0x%x \n", "highest_rate =", CmdBuf[2])); + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s 0x%x \n", "lowest_rate =", CmdBuf[3])); + + for (i = 4 ; i <= 11 ; i++) + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("RAMASK = 0x%x \n", CmdBuf[i])); + } else { + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s %x%x %x%x %x%x %x%x \n", "RA Mask:", + CmdBuf[8], CmdBuf[7], CmdBuf[6], CmdBuf[5], CmdBuf[4], CmdBuf[3], CmdBuf[2], CmdBuf[1])); + } + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n")); + } else if (para_idx == RADBG_DEBUG_MONITOR3) { + + for (i = 0 ; i < (CmdLen - 1) ; i++) + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("content[%d] = %d \n", i, CmdBuf[1 + i])); + } else if (para_idx == RADBG_DEBUG_MONITOR4) + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s {%d.%d} \n", "RA Version =", CmdBuf[1], CmdBuf[2])); + +} VOID -odm_RSSIMonitorInit( +odm_RA_ParaAdjust_Send_H2C( + IN PVOID pDM_VOID +) +{ + + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u1Byte H2C_Parameter[6] = {0}; + + H2C_Parameter[0] = RA_FIRST_MACID; + + //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("RA_Para_feedback_req= (( %d )) \n",pRA_Table->RA_Para_feedback_req )); + if (pRA_Table->RA_Para_feedback_req) { //H2C_Parameter[5]=1 ; ask FW for all RA parameters + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] Ask FW for RA parameter \n")); + H2C_Parameter[5] |= BIT1; //ask FW to report RA parameters + H2C_Parameter[1] = pRA_Table->para_idx; //pRA_Table->para_idx; + pRA_Table->RA_Para_feedback_req = 0; + } else { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] Send H2C to FW for modifying RA parameter \n")); + + H2C_Parameter[1] = pRA_Table->para_idx; + H2C_Parameter[2] = pRA_Table->rate_idx; + //1 [8 bit] + if (pRA_Table->para_idx == RADBG_RTY_PENALTY || pRA_Table->para_idx == RADBG_RATE_UP_RTY_RATIO || pRA_Table->para_idx == RADBG_RATE_DOWN_RTY_RATIO) { + H2C_Parameter[3] = pRA_Table->value; + H2C_Parameter[4] = 0; + } + //1 [16 bit] + else { //if ((pRA_Table->rate_idx==RADBG_N_HIGH)||(pRA_Table->rate_idx==RADBG_N_LOW)) + H2C_Parameter[3] = (u1Byte)(((pRA_Table->value_16) & 0xf0) >> 4); //byte1 + H2C_Parameter[4] = (u1Byte)((pRA_Table->value_16) & 0x0f); //byte0 + } + } + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[1] = 0x%x \n", H2C_Parameter[1])); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[2] = 0x%x \n", H2C_Parameter[2])); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[3] = 0x%x \n", H2C_Parameter[3])); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[4] = 0x%x \n", H2C_Parameter[4])); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[5] = 0x%x \n", H2C_Parameter[5])); + + ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RA_PARA_ADJUST, 6, H2C_Parameter); + +} + + +VOID +odm_RA_ParaAdjust( IN PVOID pDM_VOID - ) +) { -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; - pRA_Table->firstconnect = FALSE; - + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u1Byte para_idx = pRA_Table->para_idx; + u1Byte rate_idx = pRA_Table->rate_idx; + u1Byte value = pRA_Table->value; + u1Byte Pre_value = 0xff; + + u1Byte temp_idx; + BOOLEAN sign = 0; + + if (pRA_Table->para_idx == RADBG_RTY_PENALTY) { + Pre_value = pRA_Table->RTY_P[rate_idx]; + pRA_Table->RTY_P[rate_idx] = value; + pRA_Table->RTY_P_modify_note[rate_idx] = 1; + } else if (pRA_Table->para_idx == RADBG_N_HIGH) { + + } else if (pRA_Table->para_idx == RADBG_N_LOW) { + + } else if (pRA_Table->para_idx == RADBG_RATE_UP_RTY_RATIO) { + Pre_value = pRA_Table->RATE_UP_RTY_RATIO[rate_idx]; + pRA_Table->RATE_UP_RTY_RATIO[rate_idx] = value; + pRA_Table->RATE_UP_RTY_RATIO_modify_note[rate_idx] = 1; + } else if (pRA_Table->para_idx == RADBG_RATE_DOWN_RTY_RATIO) { + Pre_value = pRA_Table->RATE_DOWN_RTY_RATIO[rate_idx]; + pRA_Table->RATE_DOWN_RTY_RATIO[rate_idx] = value; + pRA_Table->RATE_DOWN_RTY_RATIO_modify_note[rate_idx] = 1; + } + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" Change RA Papa[%d], Rate[ %d ], ((%d)) -> ((%d)) \n", pRA_Table->para_idx, rate_idx, Pre_value, value)); + odm_RA_ParaAdjust_Send_H2C(pDM_Odm); +} + + +VOID +phydm_ra_print_msg( + IN PVOID pDM_VOID, + IN u1Byte *value, + IN u1Byte *value_default, + IN u1Byte *modify_note +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u4Byte i; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate index| |Current-value| |Default-value| |Modify?| \n")); + for (i = 0 ; i <= (pRA_Table->rate_length); i++) { #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - pRA_Table->PT_collision_pre = TRUE; //used in ODM_DynamicARFBSelect(WIN only) -#endif + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [ %d ] %20d %25d %20s \n", i, value[i], value_default[i], ((modify_note[i] == 1) ? "V" : " . "))); +#else + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [ %d ] %10d %14d %14s \n", i, value[i], value_default[i], ((modify_note[i] == 1) ? "V" : " . "))); #endif + } + } +VOID +odm_RA_debug( + IN PVOID pDM_VOID, + IN u4Byte *const dm_value +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u4Byte i; + + pRA_Table->is_ra_dbg_init = FALSE; + + if (dm_value[0] == 100) { /*1 Print RA Parameters*/ + u1Byte default_pointer_value; + u1Byte *pvalue; + u1Byte *pvalue_default; + u1Byte *pmodify_note; + + pvalue = pvalue_default = pmodify_note = &default_pointer_value; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("\n------------------------------------------------------------------------------------\n")); + + if (dm_value[1] == RADBG_RTY_PENALTY) { /* [1]*/ + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [1] RTY_PENALTY \n")); + pvalue = &(pRA_Table->RTY_P[0]); + pvalue_default = &(pRA_Table->RTY_P_default[0]); + pmodify_note = &(pRA_Table->RTY_P_modify_note[0]); + } else if (dm_value[1] == RADBG_N_HIGH) { /* [2]*/ + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [2] N_HIGH \n")); + + } else if (dm_value[1] == RADBG_N_LOW) { /*[3]*/ + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [3] N_LOW \n")); + + } else if (dm_value[1] == RADBG_RATE_UP_RTY_RATIO) { /* [8]*/ + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [8] RATE_UP_RTY_RATIO \n")); + pvalue = &(pRA_Table->RATE_UP_RTY_RATIO[0]); + pvalue_default = &(pRA_Table->RATE_UP_RTY_RATIO_default[0]); + pmodify_note = &(pRA_Table->RATE_UP_RTY_RATIO_modify_note[0]); + } else if (dm_value[1] == RADBG_RATE_DOWN_RTY_RATIO) { /* [9]*/ + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [9] RATE_DOWN_RTY_RATIO \n")); + pvalue = &(pRA_Table->RATE_DOWN_RTY_RATIO[0]); + pvalue_default = &(pRA_Table->RATE_DOWN_RTY_RATIO_default[0]); + pmodify_note = &(pRA_Table->RATE_DOWN_RTY_RATIO_modify_note[0]); + } + + phydm_ra_print_msg(pDM_Odm, pvalue, pvalue_default, pmodify_note); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("\n------------------------------------------------------------------------------------\n\n")); + + } else if (dm_value[0] == 101) { + pRA_Table->para_idx = (u1Byte)dm_value[1]; + + pRA_Table->RA_Para_feedback_req = 1; + odm_RA_ParaAdjust_Send_H2C(pDM_Odm); + } else { + pRA_Table->para_idx = (u1Byte)dm_value[0]; + pRA_Table->rate_idx = (u1Byte)dm_value[1]; + pRA_Table->value = (u1Byte)dm_value[2]; + + odm_RA_ParaAdjust(pDM_Odm); + } + +} VOID -odm_RSSIMonitorCheck( +odm_RA_ParaAdjust_init( IN PVOID pDM_VOID - ) +) { - // - // For AP/ADSL use prtl8192cd_priv - // For CE/NIC use PADAPTER - // -PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u1Byte i; + u1Byte ra_para_pool_u8[3] = { RADBG_RTY_PENALTY, RADBG_RATE_UP_RTY_RATIO, RADBG_RATE_DOWN_RTY_RATIO}; + /* + RTY_PENALTY = 1, //u8 + N_HIGH = 2, + N_LOW = 3, + RATE_UP_TABLE = 4, + RATE_DOWN_TABLE = 5, + TRYING_NECESSARY = 6, + DROPING_NECESSARY = 7, + RATE_UP_RTY_RATIO = 8, //u8 + RATE_DOWN_RTY_RATIO= 9, //u8 + ALL_PARA = 0xff + + */ + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("odm_RA_ParaAdjust_init \n")); + + pRA_Table->is_ra_dbg_init = TRUE; + for (i = 0; i < 3; i++) { + pRA_Table->RA_Para_feedback_req = 1; + pRA_Table->para_idx = ra_para_pool_u8[i]; + odm_RA_ParaAdjust_Send_H2C(pDM_Odm); + } - case ODM_CE: - odm_RSSIMonitorCheckCE(pDM_Odm); - break; + if (pDM_Odm->SupportICType == ODM_RTL8192E) + pRA_Table->rate_length = ODM_RATEMCS15; + else if ((pDM_Odm->SupportICType == ODM_RTL8723B) || (pDM_Odm->SupportICType == ODM_RTL8188E)) + pRA_Table->rate_length = ODM_RATEMCS7; + else if ((pDM_Odm->SupportICType == ODM_RTL8821) || (pDM_Odm->SupportICType == ODM_RTL8881A)) + pRA_Table->rate_length = ODM_RATEVHTSS1MCS9; + else if (pDM_Odm->SupportICType == ODM_RTL8812) + pRA_Table->rate_length = ODM_RATEVHTSS2MCS9; + else if (pDM_Odm->SupportICType == ODM_RTL8814A) + pRA_Table->rate_length = ODM_RATEVHTSS3MCS9; + else + pRA_Table->rate_length = ODM_RATEVHTSS4MCS9; - case ODM_AP: - odm_RSSIMonitorCheckAP(pDM_Odm); - break; +} + +#else - case ODM_ADSL: - //odm_DIGAP(pDM_Odm); - break; +VOID +ODM_C2HRaParaReportHandler( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen +) +{ +} + +VOID +odm_RA_debug( + IN PVOID pDM_VOID, + IN u4Byte *const dm_value +) +{ +} + +VOID +odm_RA_ParaAdjust_init( + IN PVOID pDM_VOID +) + +{ +} + +#endif //#if (defined(CONFIG_RA_DBG_CMD)) + +#if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT)) + +VOID +phydm_retry_limit_table_bound( + IN PVOID pDM_VOID, + IN u1Byte *retry_limit, + IN u1Byte offset +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + + if (*retry_limit > offset) { + + *retry_limit -= offset; + + if (*retry_limit < pRA_Table->retrylimit_low) + *retry_limit = pRA_Table->retrylimit_low; + else if (*retry_limit > pRA_Table->retrylimit_high) + *retry_limit = pRA_Table->retrylimit_high; + } else + *retry_limit = pRA_Table->retrylimit_low; +} + +VOID +phydm_reset_retry_limit_table( + IN PVOID pDM_VOID +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u1Byte i; + + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) /*support all IC platform*/ + + #else + #if ((RTL8192E_SUPPORT == 1) || (RTL8723B_SUPPORT == 1) || (RTL8188E_SUPPORT == 1)) + u1Byte per_rate_retrylimit_table_20M[ODM_RATEMCS15+1] = { + 1, 1, 2, 4, /*CCK*/ + 2, 2, 4, 6, 8, 12, 16, 18, /*OFDM*/ + 2, 4, 6, 8, 12, 18, 20, 22, /*20M HT-1SS*/ + 2, 4, 6, 8, 12, 18, 20, 22 /*20M HT-2SS*/ + }; + u1Byte per_rate_retrylimit_table_40M[ODM_RATEMCS15+1] = { + 1, 1, 2, 4, /*CCK*/ + 2, 2, 4, 6, 8, 12, 16, 18, /*OFDM*/ + 4, 8, 12, 16, 24, 32, 32, 32, /*40M HT-1SS*/ + 4, 8, 12, 16, 24, 32, 32, 32 /*40M HT-2SS*/ + }; + + #elif (RTL8821A_SUPPORT == 1) || (RTL8881A_SUPPORT == 1) + + #elif (RTL8812A_SUPPORT == 1) + + #elif(RTL8814A_SUPPORT == 1) + + #else + + #endif + #endif + + memcpy(&(pRA_Table->per_rate_retrylimit_20M[0]), &(per_rate_retrylimit_table_20M[0]), ODM_NUM_RATE_IDX); + memcpy(&(pRA_Table->per_rate_retrylimit_40M[0]), &(per_rate_retrylimit_table_40M[0]), ODM_NUM_RATE_IDX); + + for (i = 0; i < ODM_NUM_RATE_IDX; i++) { + phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_20M[i]), 0); + phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_40M[i]), 0); + } +} + +VOID +phydm_ra_dynamic_retry_limit( + IN PVOID pDM_VOID +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + PSTA_INFO_T pEntry; + u1Byte i, retry_offset; + u4Byte ma_rx_tp; + + + if (pDM_Odm->pre_number_active_client == pDM_Odm->number_active_client) { + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" pre_number_active_client == number_active_client\n")); + return; + + } else { + if (pDM_Odm->number_active_client == 1) { + phydm_reset_retry_limit_table(pDM_Odm); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("one client only->reset to default value\n")); + } else { + + retry_offset = pDM_Odm->number_active_client * pRA_Table->retry_descend_num; + + for (i = 0; i < ODM_NUM_RATE_IDX; i++) { + + phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_20M[i]), retry_offset); + phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_40M[i]), retry_offset); + } + } } - -} // odm_RSSIMonitorCheck +} -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) VOID -odm_RSSIDumpToRegister( +phydm_ra_dynamic_retry_limit_init( IN PVOID pDM_VOID - ) +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - PADAPTER Adapter = pDM_Odm->Adapter; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]); - PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]); + pRA_Table->retry_descend_num = RA_RETRY_DESCEND_NUM; + pRA_Table->retrylimit_low = RA_RETRY_LIMIT_LOW; + pRA_Table->retrylimit_high = RA_RETRY_LIMIT_HIGH; + + phydm_reset_retry_limit_table(pDM_Odm); + +} +#else +VOID +phydm_ra_dynamic_retry_limit( + IN PVOID pDM_VOID +) +{ +} +#endif - // Rx EVM - PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]); - PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]); +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) +VOID +phydm_ra_dynamic_rate_id_on_assoc( + IN PVOID pDM_VOID, + IN u1Byte wireless_mode, + IN u1Byte init_rate_id +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("[ON ASSOC] rf_mode = ((0x%x)), wireless_mode = ((0x%x)), init_rate_id = ((0x%x))\n", pDM_Odm->RFType, wireless_mode, init_rate_id)); + + if ((pDM_Odm->RFType == ODM_2T2R) | (pDM_Odm->RFType == ODM_2T2R_GREEN) | (pDM_Odm->RFType == ODM_2T3R) | (pDM_Odm->RFType == ODM_2T4R)) { + + if ((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E)) && + (wireless_mode & (ODM_WM_N24G | ODM_WM_N5G)) + ){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("[ON ASSOC] set N-2SS ARFR5 table\n")); + ODM_SetMACReg(pDM_Odm, 0x4a4, bMaskDWord, 0xfc1ffff); /*N-2SS, ARFR5, rate_id = 0xe*/ + ODM_SetMACReg(pDM_Odm, 0x4a8, bMaskDWord, 0x0); /*N-2SS, ARFR5, rate_id = 0xe*/ + } else if ((pDM_Odm->SupportICType & (ODM_RTL8812)) && + (wireless_mode & (ODM_WM_AC_5G | ODM_WM_AC_24G | ODM_WM_AC_ONLY)) + ){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("[ON ASSOC] set AC-2SS ARFR0 table\n")); + ODM_SetMACReg(pDM_Odm, 0x444, bMaskDWord, 0x0fff); /*AC-2SS, ARFR0, rate_id = 0x9*/ + ODM_SetMACReg(pDM_Odm, 0x448, bMaskDWord, 0xff01f000); /*AC-2SS, ARFR0, rate_id = 0x9*/ + } + } - // 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]); +VOID +phydm_ra_dynamic_rate_id_init( + IN PVOID pDM_VOID +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E)) { + + ODM_SetMACReg(pDM_Odm, 0x4a4, bMaskDWord, 0xfc1ffff); /*N-2SS, ARFR5, rate_id = 0xe*/ + ODM_SetMACReg(pDM_Odm, 0x4a8, bMaskDWord, 0x0); /*N-2SS, ARFR5, rate_id = 0xe*/ + + ODM_SetMACReg(pDM_Odm, 0x444, bMaskDWord, 0x0fff); /*AC-2SS, ARFR0, rate_id = 0x9*/ + ODM_SetMACReg(pDM_Odm, 0x448, bMaskDWord, 0xff01f000); /*AC-2SS, ARFR0, rate_id = 0x9*/ + } +} - // Rx Cfo_Tail - PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]); - PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]); +VOID +phydm_update_rate_id( + IN PVOID pDM_VOID, + IN u1Byte rate, + IN u1Byte platform_macid +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u1Byte current_tx_ss; + u1Byte rate_idx = rate & 0x7f; /*remove bit7 SGI*/ + u1Byte wireless_mode; + u1Byte phydm_macid; + PSTA_INFO_T pEntry; + + if (rate_idx >= ODM_RATEVHTSS2MCS0) { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate[%d]: (( VHT2SS-MCS%d ))\n", platform_macid, (rate_idx-ODM_RATEVHTSS2MCS0))); + /*dummy for SD4 check patch*/ + } else if (rate_idx >= ODM_RATEVHTSS1MCS0) { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate[%d]: (( VHT1SS-MCS%d ))\n", platform_macid, (rate_idx-ODM_RATEVHTSS1MCS0))); + /*dummy for SD4 check patch*/ + } else if (rate_idx >= ODM_RATEMCS0) { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate[%d]: (( HT-MCS%d ))\n", platform_macid, (rate_idx-ODM_RATEMCS0))); + /*dummy for SD4 check patch*/ + } else { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate[%d]: (( HT-MCS%d ))\n", platform_macid, rate_idx)); + /*dummy for SD4 check patch*/ } - 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]); - } + + phydm_macid = pDM_Odm->platform2phydm_macid_table[platform_macid]; + pEntry = pDM_Odm->pODM_StaInfo[phydm_macid]; + + if (IS_STA_VALID(pEntry)) { + wireless_mode = pEntry->WirelessMode; + + if ((pDM_Odm->RFType == ODM_2T2R) | (pDM_Odm->RFType == ODM_2T2R_GREEN) | (pDM_Odm->RFType == ODM_2T3R) | (pDM_Odm->RFType == ODM_2T4R)) { + + pEntry->ratr_idx = pEntry->ratr_idx_init; + if (wireless_mode & (ODM_WM_N24G | ODM_WM_N5G)) { /*N mode*/ + if (rate_idx >= ODM_RATEMCS8 && rate_idx <= ODM_RATEMCS15) { /*2SS mode*/ + + pEntry->ratr_idx = ARFR_5_RATE_ID; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("ARFR_5\n")); + } + } else if (wireless_mode & (ODM_WM_AC_5G | ODM_WM_AC_24G | ODM_WM_AC_ONLY)) {/*AC mode*/ + if (rate_idx >= ODM_RATEVHTSS2MCS0 && rate_idx <= ODM_RATEVHTSS2MCS9) {/*2SS mode*/ + + pEntry->ratr_idx = ARFR_0_RATE_ID; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("ARFR_0\n")); + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("UPdate_RateID[%d]: (( 0x%x ))\n", platform_macid, pEntry->ratr_idx)); + } + } + } #endif +VOID +phydm_c2h_ra_report_handler( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u1Byte rate = CmdBuf[0]; + u1Byte macid = CmdBuf[1]; + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + + GET_HAL_DATA(Adapter)->CurrentRARate = HwRateToMRate(rate); + ODM_UpdateInitRate(pDM_Odm, rate); + #endif + + #if (DM_ODM_SUPPORT_TYPE == ODM_AP) + if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E)) + phydm_update_rate_id(pDM_Odm, rate, macid); + #endif + +} + +VOID +odm_RSSIMonitorInit( + IN PVOID pDM_VOID +) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + pRA_Table->firstconnect = FALSE; + +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) + pRA_Table->PT_collision_pre = TRUE; //used in ODM_DynamicARFBSelect(WIN only) +#endif +#endif +} + +VOID +ODM_RAPostActionOnAssoc( + IN PVOID pDM_VOID +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + pDM_Odm->H2C_RARpt_connect = 1; + odm_RSSIMonitorCheck(pDM_Odm); + pDM_Odm->H2C_RARpt_connect = 0; +} + +VOID +odm_RSSIMonitorCheck( + IN PVOID pDM_VOID +) +{ + // + // For AP/ADSL use prtl8192cd_priv + // For CE/NIC use PADAPTER + // + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + 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 PVOID pDM_VOID - ) +) { #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte H2C_Parameter[4] = {0}; + u4Byte i; + BOOLEAN bExtRAInfo = FALSE; + u1Byte cmdlen = 3; + u1Byte TxBF_EN = 0, stbc_en = 0; + PADAPTER Adapter = pDM_Odm->Adapter; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); PRT_WLAN_STA pEntry = NULL; - u1Byte i; - s4Byte tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff; - u1Byte H2C_Parameter[4] ={0}; + s4Byte tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff; PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; PMGNT_INFO pDefaultMgntInfo = &Adapter->MgntInfo; - u8Byte curTxOkCnt = 0, curRxOkCnt = 0; - u1Byte STBC_TX = 0; - BOOLEAN FirstConnect; - pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u8Byte curTxOkCnt = 0, curRxOkCnt = 0; + //BOOLEAN FirstConnect = 0; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; -#if (BEAMFORMING_SUPPORT == 1) +#if (BEAMFORMING_SUPPORT ) BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE; - u1Byte TxBF_EN = 0; #endif PADAPTER pLoopAdapter = GetDefaultAdapter(Adapter); - BOOLEAN bExtRAInfo = FALSE; - - if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8723B) + if (pDM_Odm->SupportICType & EXT_RA_INFO_SUPPORT_IC) { bExtRAInfo = TRUE; + cmdlen = 4; + } - FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE); - pRA_Table->firstconnect = pHalData->bLinked; - H2C_Parameter[3] |= FirstConnect << 5; + //FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE); + //pRA_Table->firstconnect = pHalData->bLinked; - if(pDM_Odm->SupportICType == ODM_RTL8188E && (pDefaultMgntInfo->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; - } + /* + if(pDM_Odm->SupportICType == ODM_RTL8188E && (pDefaultMgntInfo->CustomerID==RT_CID_819x_HP)) + { + if(curRxOkCnt >(curTxOkCnt*6)) + PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0x8f015); + else + PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0xff015); + } - while(pLoopAdapter) - { - - if(pLoopAdapter != NULL){ - pMgntInfo = &pLoopAdapter->MgntInfo; + + if(pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821 || + pDM_Odm->SupportICType == ODM_RTL8814A|| pDM_Odm->SupportICType == ODM_RTL8822B) + { + if(curRxOkCnt >(curTxOkCnt*6)) + H2C_Parameter[3]|=RAINFO_BE_RX_STATE; + } + */ + + while (pLoopAdapter) { + + if (pLoopAdapter != NULL) { + pMgntInfo = &pLoopAdapter->MgntInfo; curTxOkCnt = pLoopAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt; curRxOkCnt = pLoopAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt; pMgntInfo->lastTxOkCnt = curTxOkCnt; - pMgntInfo->lastRxOkCnt = curRxOkCnt; + pMgntInfo->lastRxOkCnt = curRxOkCnt; } - for(i = 0; i < ASSOCIATE_ENTRY_NUM; i++) - { - - if(IsAPModeExist(pLoopAdapter)) - { - if(GetFirstExtAdapter(pLoopAdapter) != NULL && - GetFirstExtAdapter(pLoopAdapter) == pLoopAdapter){ - pEntry = AsocEntry_EnumStation(pLoopAdapter, i); - } - else if(GetFirstGOPort(pLoopAdapter) != NULL && - IsFirstGoAdapter(pLoopAdapter)){ - pEntry = AsocEntry_EnumStation(pLoopAdapter, i); - } - } - else - { - if(GetDefaultAdapter(pLoopAdapter) == pLoopAdapter){ - pEntry = AsocEntry_EnumStation(pLoopAdapter, i); - } + for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) { + + if (IsAPModeExist(pLoopAdapter)) { + if (GetFirstExtAdapter(pLoopAdapter) != NULL && + GetFirstExtAdapter(pLoopAdapter) == pLoopAdapter) + pEntry = AsocEntry_EnumStation(pLoopAdapter, i); + else if (GetFirstGOPort(pLoopAdapter) != NULL && + IsFirstGoAdapter(pLoopAdapter)) + pEntry = AsocEntry_EnumStation(pLoopAdapter, i); + } else { + if (GetDefaultAdapter(pLoopAdapter) == pLoopAdapter) + pEntry = AsocEntry_EnumStation(pLoopAdapter, 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 (pEntry != NULL) { + if (pEntry->bAssociated) { - if(bExtRAInfo) - { + 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 (BEAMFORMING_SUPPORT == 1) - Beamform_cap = Beamforming_GetEntryBeamCapByMacId(Adapter, pEntry->AssociatedMacId); - if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU)) + //2 BF_en +#if (BEAMFORMING_SUPPORT) + Beamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, 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); - } + //2 STBC_en + if ((IS_WIRELESS_MODE_AC(Adapter) && TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX)) || + TEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX)) + stbc_en = 1; + + if (pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) + tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB; + if (pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) + tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB; + + if (bExtRAInfo) { + if (curRxOkCnt > (curTxOkCnt * 6)) + H2C_Parameter[3] |= RAINFO_BE_RX_STATE; + + if (TxBF_EN) + H2C_Parameter[3] |= RAINFO_BF_STATE; + else { + if (stbc_en) + H2C_Parameter[3] |= RAINFO_STBC_STATE; + } - H2C_Parameter[3] |= STBC_TX << 1; - } + if (pDM_Odm->H2C_RARpt_connect) + H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE; + } - 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); - 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(bExtRAInfo) - ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter); - else - ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter); - } - } - else - { - break; + ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter); + } + } else + break; } - } pLoopAdapter = GetNextExtAdapter(pLoopAdapter); } - if(tmpEntryMaxPWDB != 0) // If associated entry is found - { + if (tmpEntryMaxPWDB != 0) { // If associated entry is found pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; RT_DISP(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n", tmpEntryMaxPWDB, tmpEntryMaxPWDB)); - } - else - { + } else pHalData->EntryMaxUndecoratedSmoothedPWDB = 0; - } - - if(tmpEntryMinPWDB != 0xff) // If associated entry is found - { + + if (tmpEntryMinPWDB != 0xff) { // If associated entry is found pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; RT_DISP(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n", tmpEntryMinPWDB, tmpEntryMinPWDB)); - } - else - { + } else pHalData->EntryMinUndecoratedSmoothedPWDB = 0; - } // Indicate Rx signal strength to FW. - if(pHalData->bUseRAMask) - { - if(bExtRAInfo) - { - PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pDefaultMgntInfo); - PRT_VERY_HIGH_THROUGHPUT pVHTInfo = GET_VHT_INFO(pDefaultMgntInfo); + if (pHalData->bUseRAMask) { + PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pDefaultMgntInfo); + PRT_VERY_HIGH_THROUGHPUT pVHTInfo = GET_VHT_INFO(pDefaultMgntInfo); + //2 BF_en #if (BEAMFORMING_SUPPORT == 1) - - Beamform_cap = Beamforming_GetEntryBeamCapByMacId(Adapter, pDefaultMgntInfo->mMacId); - - if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU)) - TxBF_EN = 1; - else - TxBF_EN = 0; + Beamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, pDefaultMgntInfo->mMacId); - H2C_Parameter[3] |= TxBF_EN << 6; - - if(TxBF_EN) - STBC_TX = 0; - else + if (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU)) + TxBF_EN = 1; #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); + + //2 STBC_en + if ((IS_WIRELESS_MODE_AC(Adapter) && TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX)) || + TEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX)) + stbc_en = 1; + + if (bExtRAInfo) { + if (TxBF_EN) + H2C_Parameter[3] |= RAINFO_BF_STATE; + else { + if (stbc_en) + H2C_Parameter[3] |= RAINFO_STBC_STATE; } - H2C_Parameter[3] |= STBC_TX << 1; + if (pDM_Odm->H2C_RARpt_connect) + H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE; } - + 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[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(bExtRAInfo) - ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter); - else - ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter); - + + ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter); + // BT 3.0 HS mode Rssi - if(pDM_Odm->bBtHsOperation) - { + if (pDM_Odm->bBtHsOperation) { H2C_Parameter[2] = pDM_Odm->btHsRssi; - H2C_Parameter[1] = 0x0; + //H2C_Parameter[1] = 0x0; H2C_Parameter[0] = 2; - if(bExtRAInfo) - ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter); - else - ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter); + + ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter); } - } - else - { + } else PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB); - } - if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8192E)) + if ((pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8192E)) odm_RSSIDumpToRegister(pDM_Odm); - + { PADAPTER pLoopAdapter = GetDefaultAdapter(Adapter); s4Byte GlobalRSSI_min = 0xFF, LocalRSSI_Min; - BOOLEAN bLink= FALSE; - - while(pLoopAdapter) - { + BOOLEAN bLink = FALSE; + + while (pLoopAdapter) { LocalRSSI_Min = odm_FindMinimumRSSI(pLoopAdapter); //DbgPrint("pHalData->bLinked=%d, LocalRSSI_Min=%d\n", pHalData->bLinked, LocalRSSI_Min); - if((LocalRSSI_Min < GlobalRSSI_min) && (LocalRSSI_Min != 0)) - GlobalRSSI_min = LocalRSSI_Min; - - if(pHalData->bLinked) + if ((LocalRSSI_Min < GlobalRSSI_min) && (LocalRSSI_Min != 0)) + GlobalRSSI_min = LocalRSSI_Min; + + if (pHalData->bLinked) bLink = TRUE; - + pLoopAdapter = GetNextExtAdapter(pLoopAdapter); } pHalData->bLinked = bLink; - ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_LINK, (u8Byte)bLink); - ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_RSSI_MIN, (u8Byte)GlobalRSSI_min); - - } - -#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 + ODM_CmnInfoUpdate(&pHalData->DM_OutSrc , ODM_CMNINFO_LINK, (u8Byte)bLink); + ODM_CmnInfoUpdate(&pHalData->DM_OutSrc , ODM_CMNINFO_RSSI_MIN, (u8Byte)GlobalRSSI_min); - 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 // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) } -#endif VOID odm_RSSIMonitorCheckCE( IN PVOID pDM_VOID - ) +) { #if (DM_ODM_SUPPORT_TYPE == ODM_CE) PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter); int i; - int tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff; - u8 sta_cnt=0; + 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 + 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) + if (pDM_Odm->bLinked != _TRUE) return; - #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1)) - if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821)) - { +#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)) + if (curRxOkCnt > (curTxOkCnt * 6)) UL_DL_STATE = 1; else UL_DL_STATE = 0; } - #endif +#endif - FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == FALSE); + 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; ipODM_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)) { + + 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) - { + 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); + 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 (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU)) + TxBF_EN = 1; + else + TxBF_EN = 0; - if (TxBF_EN) { - STBC_TX = 0; - } - else + 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 + 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); - } + 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; +#endif - 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 - } + 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)); } - } - } - - _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)){ + 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((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){ +#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){ +#endif +#if(RTL8723B_SUPPORT==1) + if (pDM_Odm->SupportICType == ODM_RTL8723B) rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i])); - } - #endif +#endif - #if(RTL8188E_SUPPORT==1) - if(pDM_Odm->SupportICType == ODM_RTL8188E){ +#if(RTL8188E_SUPPORT==1) + if (pDM_Odm->SupportICType == ODM_RTL8188E) rtl8188e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i])); - } - #endif - - } - else{ - #if((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1)) - if(pDM_Odm->SupportICType == ODM_RTL8188E){ +#endif + +#if (RTL8814A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8814A) + rtl8814_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)); + &(pHalData->odmpriv), (PWDB_rssi[i] & 0xFF), (u8)((PWDB_rssi[i] >> 16) & 0xFF)); } - #endif +#endif } } - } + } } - if(tmpEntryMaxPWDB != 0) // If associated entry is found - { - pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; - } + if (tmpEntryMaxPWDB != 0) // If associated entry is found + pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; else - { - pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; - } + pHalData->EntryMaxUndecoratedSmoothedPWDB = 0; - if(tmpEntryMinPWDB != 0xff) // If associated entry is found - { - pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; - } + if (tmpEntryMinPWDB != 0xff) // If associated entry is found + pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; else - { - pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; - } + pHalData->EntryMinUndecoratedSmoothedPWDB = 0; FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM - #if(RTL8192D_SUPPORT==1) - FindMinimumRSSI_Dmsp(Adapter); - #endif - pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM; + pDM_Odm->RSSI_Min = pHalData->MinUndecoratedPWDBForDM; //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); #endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE) } @@ -699,124 +1081,114 @@ odm_RSSIMonitorCheckCE( VOID odm_RSSIMonitorCheckAP( IN PVOID pDM_VOID - ) +) { #if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#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) - { - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - prtl8192cd_priv priv = pDM_Odm->priv; - u4Byte i; - PSTA_INFO_T pstat; - static u1Byte H2C_Parameter[5]; - u1Byte TxBF_EN = 0; - pBDC_T pDM_BdcTable = &pDM_Odm->DM_BdcTable; - - if( priv->up_time % 2 ) - return; - - pDM_BdcTable->num_Txbfee_Client=0; - pDM_BdcTable->num_Txbfer_Client=0; - //pDM_BdcTable->num_Client=0; - - for(i=0; ipODM_StaInfo[i]; - if(IS_STA_VALID(pstat) ) - { -#ifdef BEAMFORMING_SUPPORT - BEAMFORMING_CAP Beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, pstat->aid); - if(Beamform_cap == BEAMFORMER_CAP_HT_EXPLICIT || Beamform_cap == BEAMFORMER_CAP_VHT_SU || - Beamform_cap == (BEAMFORMER_CAP_HT_EXPLICIT|BEAMFORMEE_CAP_HT_EXPLICIT) || - Beamform_cap == (BEAMFORMER_CAP_VHT_SU|BEAMFORMEE_CAP_VHT_SU)) - { - TxBF_EN = (1<< 6); - pDM_BdcTable->w_BFee_Client[i]=1; //AP act as BFer - pDM_BdcTable->num_Txbfee_Client++; - } - else - { - pDM_BdcTable->w_BFee_Client[i]=0; //AP act as BFer - } - - if((Beamform_cap & BEAMFORMEE_CAP_HT_EXPLICIT) || (Beamform_cap & BEAMFORMEE_CAP_VHT_SU) ) - { - pDM_BdcTable->w_BFer_Client[i]=1; //AP act as BFee - pDM_BdcTable->num_Txbfer_Client++; - } - else - { - pDM_BdcTable->w_BFer_Client[i]=0; //AP act as BFer - } +#if (RTL8812A_SUPPORT||RTL8881A_SUPPORT||RTL8192E_SUPPORT||RTL8814A_SUPPORT) - - //pDM_BdcTable->num_Client++; - - - -#endif -//#ifdef STA_EXT -// if (GET_CHIP_VER(priv)==VERSION_8812E && REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1)) -//#endif - { -#ifdef CONFIG_RTL_8812_SUPPORT -#ifdef STA_EXT - if(REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1)) -#endif - - if(pDM_Odm->SupportICType == ODM_RTL8812) { - memset(H2C_Parameter,0,5); - H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0x7F); - H2C_Parameter[0] = REMAP_AID(pstat); - if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) && ( - (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_) -#ifdef RTK_AC_SUPPORT - || (pstat->vht_cap_buf.vht_cap_info & cpu_to_le32(_VHTCAP_RX_STBC_CAP_)) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte H2C_Parameter[4] = {0}; + u4Byte i; + BOOLEAN bExtRAInfo = FALSE; + u1Byte cmdlen = 3 ; + u1Byte TxBF_EN = 0, stbc_en = 0; + + prtl8192cd_priv priv = pDM_Odm->priv; + PSTA_INFO_T pstat; + BOOLEAN act_bfer = FALSE; + +#ifdef BEAMFORMING_SUPPORT +#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) + pBDC_T pDM_BdcTable = &pDM_Odm->DM_BdcTable; + pDM_BdcTable->num_Txbfee_Client = 0; + pDM_BdcTable->num_Txbfer_Client = 0; #endif - ))) - H2C_Parameter[3] |= 2; - H2C_Parameter[3] |= TxBF_EN ; - FillH2CCmd8812(pDM_Odm->priv, H2C_8812_RSSI_REPORT, 4, H2C_Parameter); - } #endif - } -//#ifdef STA_EXT -// else if (GET_CHIP_VER(priv)!=VERSION_8812E && REMAP_AID(pstat) < (FW_NUM_STAT - 1)) -//#endif - { -#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE) -#ifdef STA_EXT - if(REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1)) -#endif - if(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E) { -// u1Byte H2C_Parameter[5] ={0}; - u1Byte cmdlen = 3; - memset(H2C_Parameter, 0, 5); - H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0xFF); - H2C_Parameter[0] = REMAP_AID(pstat); - if(pDM_Odm->SupportICType == ODM_RTL8192E) { - cmdlen = 4; - if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) && (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_))) - H2C_Parameter[3] |= 2; - H2C_Parameter[3] |= TxBF_EN; - - } - GET_HAL_INTERFACE(pDM_Odm->priv)->FillH2CCmdHandler(pDM_Odm->priv, H2C_88XX_RSSI_REPORT, cmdlen, H2C_Parameter); - } + + + if (priv->up_time % 2) + return; + + if (pDM_Odm->SupportICType & EXT_RA_INFO_SUPPORT_IC) { + bExtRAInfo = TRUE; + cmdlen = 4; + } + + for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { + pstat = pDM_Odm->pODM_StaInfo[i]; + + if (IS_STA_VALID(pstat)) { + if (pstat->sta_in_firmware != 1) + continue; + + //2 BF_en +#ifdef BEAMFORMING_SUPPORT + BEAMFORMING_CAP Beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, pstat->aid); + + if (Beamform_cap == BEAMFORMER_CAP_HT_EXPLICIT || Beamform_cap == BEAMFORMER_CAP_VHT_SU || + Beamform_cap == (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMEE_CAP_HT_EXPLICIT) || + Beamform_cap == (BEAMFORMER_CAP_VHT_SU | BEAMFORMEE_CAP_VHT_SU)) { + TxBF_EN = 1; + act_bfer = TRUE; + } + +#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) //BDC + + if (act_bfer == TRUE) { + pDM_BdcTable->w_BFee_Client[i] = 1; //AP act as BFer + pDM_BdcTable->num_Txbfee_Client++; + } else { + pDM_BdcTable->w_BFee_Client[i] = 0; //AP act as BFer + } + + if ((Beamform_cap & BEAMFORMEE_CAP_HT_EXPLICIT) || (Beamform_cap & BEAMFORMEE_CAP_VHT_SU)) { + pDM_BdcTable->w_BFer_Client[i] = 1; //AP act as BFee + pDM_BdcTable->num_Txbfer_Client++; + } else { + pDM_BdcTable->w_BFer_Client[i] = 0; //AP act as BFer + } #endif - -#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) -#ifdef STA_EXT - if(REMAP_AID(pstat) < (FW_NUM_STAT - 1)) #endif - if(pDM_Odm->SupportICType == ODM_RTL8192C || pDM_Odm->SupportICType == ODM_RTL8192D) - add_update_rssi(pDM_Odm->priv, pstat); + + //2 STBC_en + if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) && + ((pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_)) +#ifdef RTK_AC_SUPPORT + || (pstat->vht_cap_buf.vht_cap_info & cpu_to_le32(_VHTCAP_RX_STBC_CAP_)) #endif + )) + stbc_en = 1; + + //2 RAINFO + + if (bExtRAInfo) { + if ((pstat->rx_avarage) > ((pstat->tx_avarage) * 6)) + H2C_Parameter[3] |= RAINFO_BE_RX_STATE; + + if (TxBF_EN) + H2C_Parameter[3] |= RAINFO_BF_STATE; + else { + if (stbc_en) + H2C_Parameter[3] |= RAINFO_STBC_STATE; } - } + if (pDM_Odm->H2C_RARpt_connect) + H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE; + + //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[RAINFO] H2C_Para[3] = %x, \n",H2C_Parameter[3])); + } + + H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0xFF); + H2C_Parameter[0] = REMAP_AID(pstat); + + //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[RSSI] H2C_Para[2] = %x, \n",H2C_Parameter[2])); + //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[MACID] H2C_Para[0] = %x, \n",H2C_Parameter[0])); + + ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter); + } } + #endif #endif @@ -825,8 +1197,8 @@ odm_RSSIMonitorCheckAP( VOID odm_RateAdaptiveMaskInit( - IN PVOID pDM_VOID - ) + IN PVOID pDM_VOID +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PODM_RATE_ADAPTIVE pOdmRA = &pDM_Odm->RateAdaptive; @@ -840,33 +1212,33 @@ odm_RateAdaptiveMaskInit( if (pMgntInfo->DM_Type == DM_Type_ByDriver) pHalData->bUseRAMask = TRUE; else - pHalData->bUseRAMask = FALSE; + 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; + pDM_Odm->bUseRAMask = _FALSE; #endif pOdmRA->RATRState = DM_RATR_STA_INIT; - + #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - if(pDM_Odm->SupportICType == ODM_RTL8812) - pOdmRA->LdpcThres = 50; + if (pDM_Odm->SupportICType == ODM_RTL8812) + pOdmRA->LdpcThres = 50; else pOdmRA->LdpcThres = 35; - + pOdmRA->RtsThres = 35; - + #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) pOdmRA->LdpcThres = 35; pOdmRA->bUseLdpc = FALSE; - + #else - pOdmRA->UltraLowRSSIThresh = 9; - + pOdmRA->UltraLowRSSIThresh = 9; + #endif pOdmRA->HighRSSIThresh = 50; @@ -885,87 +1257,46 @@ odm_RateAdaptiveMaskInit( * * Revised History: * When Who Remark - * 05/27/2009 hpfan Create Version 0. + * 05/27/2009 hpfan Create Version 0. * *---------------------------------------------------------------------------*/ VOID odm_RefreshRateAdaptiveMask( IN PVOID pDM_VOID - ) +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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()---------->\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; + 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; + 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; } - -} - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID -odm_RefreshLdpcRtsMP( - IN PADAPTER pAdapter, - IN PDM_ODM_T pDM_Odm, - IN u1Byte mMacId, - IN u1Byte IOTPeer, - IN s4Byte UndecoratedSmoothedPWDB - ) -{ - BOOLEAN bCtlLdpc = FALSE; - PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(pAdapter); - PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive; - - if(pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8812) - return; - - if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A)) - bCtlLdpc = TRUE; - else if( pDM_Odm->SupportICType == ODM_RTL8812 && - IOTPeer == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP) - bCtlLdpc = TRUE; - - if(bCtlLdpc) - { - if(UndecoratedSmoothedPWDB < (pRA->LdpcThres-5)) - MgntSet_TX_LDPC(pAdapter, mMacId, TRUE); - else if(UndecoratedSmoothedPWDB > pRA->LdpcThres) - MgntSet_TX_LDPC(pAdapter, mMacId, FALSE); - } - if(UndecoratedSmoothedPWDB < (pRA->RtsThres-5)) - pRA->bLowerRtsRate = TRUE; - else if(UndecoratedSmoothedPWDB > pRA->RtsThres) - pRA->bLowerRtsRate = FALSE; } -#endif - VOID odm_RefreshRateAdaptiveMaskMP( IN PVOID pDM_VOID - ) +) { #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; @@ -974,31 +1305,25 @@ odm_RefreshRateAdaptiveMaskMP( HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(pAdapter); - if(pAdapter->bDriverStopped) - { + 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) - { + 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 (pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter))) { odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pMgntInfo->mMacId, pMgntInfo->IOTPeer, 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) ) - { + 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); - } - else if(pDM_Odm->bChangeState) - { + } else if (pDM_Odm->bChangeState) { 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, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining)); pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State); @@ -1009,34 +1334,27 @@ odm_RefreshRateAdaptiveMaskMP( // The following part configure AP/VWifi/IBSS rate adaptive mask. // - if(pMgntInfo->mIbss) // Target: AP/IBSS peer. + 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) - { + if (pTargetAdapter != NULL) { int i; PRT_WLAN_STA pEntry; - for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) - { + for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { pEntry = AsocEntry_EnumStation(pTargetAdapter, i); - if(NULL != pEntry) - { - if(pEntry->bAssociated) - { + if (NULL != pEntry) { + if (pEntry->bAssociated) { odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pEntry->AssociatedMacId, pEntry->IOTPeer, pEntry->rssi_stat.UndecoratedSmoothedPWDB); - if(ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State) ) - { + 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); - } - else if(pDM_Odm->bChangeState) - { + } else if (pDM_Odm->bChangeState) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining)); pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State); } @@ -1045,16 +1363,16 @@ odm_RefreshRateAdaptiveMaskMP( } } - if(pMgntInfo->bSetTXPowerTrainingByOid) - pMgntInfo->bSetTXPowerTrainingByOid = FALSE; + if (pMgntInfo->bSetTXPowerTrainingByOid) + pMgntInfo->bSetTXPowerTrainingByOid = FALSE; #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) } VOID odm_RefreshRateAdaptiveMaskCE( - IN PVOID pDM_VOID - ) + IN PVOID pDM_VOID +) { #if (DM_ODM_SUPPORT_TYPE == ODM_CE) PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; @@ -1062,97 +1380,87 @@ odm_RefreshRateAdaptiveMaskCE( PADAPTER pAdapter = pDM_Odm->Adapter; PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive; - if(pAdapter->bDriverStopped) - { + 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) - { + 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; ipODM_StaInfo[i]; - if(IS_STA_VALID(pstat) ) { - if(IS_MCAST( pstat->hwaddr)) //if(psta->mac_id ==1) - continue; - if(IS_MCAST( pstat->hwaddr)) + 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) - { +#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)) + 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)) - { + } 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)) + 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 +#endif - if( TRUE == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pstat->rssi_level) ) - { + 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); - } - else if(pDM_Odm->bChangeState) - { + } else if (pDM_Odm->bChangeState) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining)); rtw_hal_update_ra_mask(pstat, pstat->rssi_level); } - + } - } - + } + #endif } VOID odm_RefreshRateAdaptiveMaskAPADSL( IN PVOID pDM_VOID - ) +) { -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; struct rtl8192cd_priv *priv = pDM_Odm->priv; struct aid_obj *aidarray; u4Byte i; PSTA_INFO_T pstat; - if(priv->up_time % 2) - return; + if (priv->up_time % 2) + return; - for(i=0; ipODM_StaInfo[i]; - if(IS_STA_VALID(pstat) ) - { + if (IS_STA_VALID(pstat)) { #if defined(UNIVERSAL_REPEATER) || defined(MBSSID) aidarray = container_of(pstat, struct aid_obj, station); priv = aidarray->priv; #endif - if (!priv->pmib->dot11StationConfigEntry.autoRate) + if (!priv->pmib->dot11StationConfigEntry.autoRate) continue; - if(ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, FALSE, &pstat->rssi_level) ) { + 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)); @@ -1160,436 +1468,900 @@ odm_RefreshRateAdaptiveMaskAPADSL( #ifdef CONFIG_WLAN_HAL if (IS_HAL_CHIP(priv)) { #ifdef WDS - if(!(pstat->state & WIFI_WDS))//if WDS donot setting +// if(!(pstat->state & WIFI_WDS))//if WDS donot setting +#endif + GET_HAL_INTERFACE(priv)->UpdateHalRAMaskHandler(priv, pstat, pstat->rssi_level); + } else +#endif +#ifdef CONFIG_RTL_8812_SUPPORT + if (GET_CHIP_VER(priv) == VERSION_8812E) + UpdateHalRAMask8812(priv, pstat, 3); + else +#endif +#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 + } +#elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + update_STA_RATid(priv, pstat); +#endif + } + } + } +#endif +} + + +// Return Value: BOOLEAN +// - TRUE: RATRState is changed. +BOOLEAN +ODM_RAStateCheck( + IN PVOID pDM_VOID, + IN s4Byte RSSI, + IN BOOLEAN bForceUpdate, + OUT pu1Byte pRATRState +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + 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. +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + u1Byte UltraLowRSSIThreshForRA = pRA->UltraLowRSSIThresh; + if (pDM_Odm->SupportICType == ODM_RTL8881A) + LowRSSIThreshForRA = 30; // for LDPC / BCC switch +#endif + + 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; + +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + case DM_RATR_STA_ULTRA_LOW: + HighRSSIThreshForRA += GoUpGap; + LowRSSIThreshForRA += GoUpGap; + UltraLowRSSIThreshForRA += GoUpGap; + break; +#endif + + 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; + +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + else if (RSSI > UltraLowRSSIThreshForRA) + RATRState = DM_RATR_STA_LOW; + else + RATRState = DM_RATR_STA_ULTRA_LOW; +#else + else + RATRState = DM_RATR_STA_LOW; +#endif + //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; +} + +VOID +odm_RefreshBasicRateMask( + IN PVOID pDM_VOID +) +{ +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + 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 +} + + +VOID +phydm_ra_info_init( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + #if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT)) + phydm_ra_dynamic_retry_limit_init(pDM_Odm); + #endif + #if (DM_ODM_SUPPORT_TYPE == ODM_AP) + phydm_ra_dynamic_rate_id_init(pDM_Odm); + #endif +} + + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) +u1Byte +odm_Find_RTS_Rate( + IN PVOID pDM_VOID, + IN u1Byte Tx_Rate, + IN BOOLEAN bErpProtect +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte RTS_Ini_Rate = ODM_RATE6M; + + if (bErpProtect) /* use CCK rate as RTS*/ + RTS_Ini_Rate = ODM_RATE1M; + else { + switch (Tx_Rate) { + case ODM_RATEVHTSS3MCS9: + case ODM_RATEVHTSS3MCS8: + case ODM_RATEVHTSS3MCS7: + case ODM_RATEVHTSS3MCS6: + case ODM_RATEVHTSS3MCS5: + case ODM_RATEVHTSS3MCS4: + case ODM_RATEVHTSS3MCS3: + case ODM_RATEVHTSS2MCS9: + case ODM_RATEVHTSS2MCS8: + case ODM_RATEVHTSS2MCS7: + case ODM_RATEVHTSS2MCS6: + case ODM_RATEVHTSS2MCS5: + case ODM_RATEVHTSS2MCS4: + case ODM_RATEVHTSS2MCS3: + case ODM_RATEVHTSS1MCS9: + case ODM_RATEVHTSS1MCS8: + case ODM_RATEVHTSS1MCS7: + case ODM_RATEVHTSS1MCS6: + case ODM_RATEVHTSS1MCS5: + case ODM_RATEVHTSS1MCS4: + case ODM_RATEVHTSS1MCS3: + case ODM_RATEMCS15: + case ODM_RATEMCS14: + case ODM_RATEMCS13: + case ODM_RATEMCS12: + case ODM_RATEMCS11: + case ODM_RATEMCS7: + case ODM_RATEMCS6: + case ODM_RATEMCS5: + case ODM_RATEMCS4: + case ODM_RATEMCS3: + case ODM_RATE54M: + case ODM_RATE48M: + case ODM_RATE36M: + case ODM_RATE24M: + RTS_Ini_Rate = ODM_RATE24M; + break; + case ODM_RATEVHTSS3MCS2: + case ODM_RATEVHTSS3MCS1: + case ODM_RATEVHTSS2MCS2: + case ODM_RATEVHTSS2MCS1: + case ODM_RATEVHTSS1MCS2: + case ODM_RATEVHTSS1MCS1: + case ODM_RATEMCS10: + case ODM_RATEMCS9: + case ODM_RATEMCS2: + case ODM_RATEMCS1: + case ODM_RATE18M: + case ODM_RATE12M: + RTS_Ini_Rate = ODM_RATE12M; + break; + case ODM_RATEVHTSS3MCS0: + case ODM_RATEVHTSS2MCS0: + case ODM_RATEVHTSS1MCS0: + case ODM_RATEMCS8: + case ODM_RATEMCS0: + case ODM_RATE9M: + case ODM_RATE6M: + RTS_Ini_Rate = ODM_RATE6M; + break; + case ODM_RATE11M: + case ODM_RATE5_5M: + case ODM_RATE2M: + case ODM_RATE1M: + RTS_Ini_Rate = ODM_RATE1M; + break; + default: + RTS_Ini_Rate = ODM_RATE6M; + break; + } + } + + if (*pDM_Odm->pBandType == 1) { + if (RTS_Ini_Rate < ODM_RATE6M) + RTS_Ini_Rate = ODM_RATE6M; + } + return RTS_Ini_Rate; + +} + +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 PVOID pDM_VOID, + IN BOOLEAN bNoisyStateFromC2H +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + /*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 PVOID pDM_VOID, + IN WIRELESS_MODE WirelessMode, + IN u4Byte ratr_bitmap, + IN u1Byte rssi_level +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + 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 &= 0xffffffff; + 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 &= 0xffffffff; + else + ret_bitmap &= 0xffffffff; + } + 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 &= 0xffffffff; + 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 &= 0xffffffff; + else + ret_bitmap &= 0xffffffff; + } + break; + default: + break; + } + /*DbgPrint("DM_RAMask ====> rssi_LV = %d, BITMAP = %x\n", rssi_level, ret_bitmap);*/ + return ret_bitmap; + +} + +VOID +ODM_UpdateInitRate( + IN PVOID pDM_VOID, + IN u1Byte Rate +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + 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) { +#if (RTL8821A_SUPPORT == 1) + ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0); #endif - GET_HAL_INTERFACE(priv)->UpdateHalRAMaskHandler(priv, pstat, pstat->rssi_level); - } else + } else if (pDM_Odm->SupportICType == ODM_RTL8812) { + for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++) { +#if (RTL8812A_SUPPORT == 1) + ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0); #endif -#ifdef CONFIG_RTL_8812_SUPPORT - if(GET_CHIP_VER(priv)== VERSION_8812E) { - UpdateHalRAMask8812(priv, pstat, 3); - } else + } + } else if (pDM_Odm->SupportICType == ODM_RTL8723B) { +#if (RTL8723B_SUPPORT == 1) + ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0); #endif -#ifdef CONFIG_RTL_88E_SUPPORT - if (GET_CHIP_VER(priv)==VERSION_8188E) { -#ifdef TXREPORT - add_RATid(priv, pstat); + } else if (pDM_Odm->SupportICType == ODM_RTL8192E) { + for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++) { +#if (RTL8192E_SUPPORT == 1) + ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0); #endif - } else + } + } else if (pDM_Odm->SupportICType == ODM_RTL8188E) { +#if (RTL8188E_SUPPORT == 1) + ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0); #endif - { -#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT) - add_update_RATid(priv, pstat); + } #endif - } -#elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - update_STA_RATid(priv, pstat); +#else + PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem); #endif - } - } - } #endif + } else + return; } +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -// Return Value: BOOLEAN -// - TRUE: RATRState is changed. -BOOLEAN -ODM_RAStateCheck( - IN PVOID pDM_VOID, - IN s4Byte RSSI, - IN BOOLEAN bForceUpdate, - OUT pu1Byte pRATRState - ) +VOID +odm_RSSIDumpToRegister( + IN PVOID pDM_VOID +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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. -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - u1Byte UltraLowRSSIThreshForRA = pRA->UltraLowRSSIThresh; - if(pDM_Odm->SupportICType == ODM_RTL8881A) - LowRSSIThreshForRA = 30; // for LDPC / BCC switch -#endif - - switch (*pRATRState) - { - case DM_RATR_STA_INIT: - case DM_RATR_STA_HIGH: - break; - - case DM_RATR_STA_MIDDLE: - HighRSSIThreshForRA += GoUpGap; - break; + PADAPTER Adapter = pDM_Odm->Adapter; - case DM_RATR_STA_LOW: - HighRSSIThreshForRA += GoUpGap; - LowRSSIThreshForRA += GoUpGap; - break; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - case DM_RATR_STA_ULTRA_LOW: - HighRSSIThreshForRA += GoUpGap; - LowRSSIThreshForRA += GoUpGap; - UltraLowRSSIThreshForRA += GoUpGap; - break; -#endif + if (pDM_Odm->SupportICType == ODM_RTL8812) { + PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]); + PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]); - default: - ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState) ); - break; - } + /* Rx EVM*/ + PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]); + PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]); - // Decide RATRState by RSSI. - if(RSSI > HighRSSIThreshForRA) - RATRState = DM_RATR_STA_HIGH; - else if(RSSI > LowRSSIThreshForRA) - RATRState = DM_RATR_STA_MIDDLE; + /* Rx SNR*/ + PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0])); + PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1])); -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - else if(RSSI > UltraLowRSSIThreshForRA) - RATRState = DM_RATR_STA_LOW; - else - RATRState = DM_RATR_STA_ULTRA_LOW; -#else - else - RATRState = DM_RATR_STA_LOW; -#endif - //printk("==>%s,RATRState:0x%02x ,RSSI:%d \n",__FUNCTION__,RATRState,RSSI); + /* Rx Cfo_Short*/ + PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]); + PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]); - 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; + /* 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]); } - - return FALSE; } VOID -odm_RefreshBasicRateMask( - IN PVOID pDM_VOID - ) +odm_RefreshLdpcRtsMP( + IN PADAPTER pAdapter, + IN PDM_ODM_T pDM_Odm, + IN u1Byte mMacId, + IN u1Byte IOTPeer, + IN s4Byte UndecoratedSmoothedPWDB +) { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - 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}; + BOOLEAN bCtlLdpc = FALSE; + PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(pAdapter); + PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive; - if(pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821 ) + if (pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8812) 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 ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A)) + bCtlLdpc = TRUE; + else if (pDM_Odm->SupportICType == ODM_RTL8812 && + IOTPeer == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP) + bCtlLdpc = TRUE; - 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) ); - } + if (bCtlLdpc) { + if (UndecoratedSmoothedPWDB < (pRA->LdpcThres - 5)) + MgntSet_TX_LDPC(pAdapter, mMacId, TRUE); + else if (UndecoratedSmoothedPWDB > pRA->LdpcThres) + MgntSet_TX_LDPC(pAdapter, mMacId, FALSE); } - - Stage = CurStage; -#endif + + if (UndecoratedSmoothedPWDB < (pRA->RtsThres - 5)) + pRA->bLowerRtsRate = TRUE; + else if (UndecoratedSmoothedPWDB > pRA->RtsThres) + pRA->bLowerRtsRate = FALSE; } -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) VOID ODM_DynamicARFBSelect( IN PVOID pDM_VOID, IN u1Byte rate, - IN BOOLEAN Collision_State + IN BOOLEAN Collision_State ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; - if(pDM_Odm->SupportICType != ODM_RTL8192E) + if (pDM_Odm->SupportICType != ODM_RTL8192E) return; - if(Collision_State == pRA_Table->PT_collision_pre) + if (Collision_State == pRA_Table->PT_collision_pre) return; - if (rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS12){ - if (Collision_State == 1){ - if(rate == DESC_RATEMCS12){ + 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+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+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+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+4, 0x08080707); + } else { ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0); - ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808); + ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808); } - } - else{ // Collision_State == 0 - if(rate == DESC_RATEMCS12){ + } 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+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+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+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+4, 0x0a090808); + } else { ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000); - ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909); + ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909); } } - } - else{ // MCS13~MCS15, 1SS, G-mode - if (Collision_State == 1){ - if(rate == DESC_RATEMCS15){ + } 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+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+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+4, 0x07060502); + } else { ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000); - ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402); + ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402); } - } - else{ // Collision_State == 0 - if(rate == DESC_RATEMCS15){ + } 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+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+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+4, 0x09080706); + } else { ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000); - ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605); + ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605); } } - } - pRA_Table->PT_collision_pre = Collision_State; + } + pRA_Table->PT_collision_pre = Collision_State; } VOID -ODM_RateAdaptiveStateApInit( +ODM_RateAdaptiveStateApInit( IN PVOID PADAPTER_VOID, IN PRT_WLAN_STA pEntry - ) +) { PADAPTER Adapter = (PADAPTER)PADAPTER_VOID; pEntry->Ratr_State = DM_RATR_STA_INIT; } -#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/ + +static void +FindMinimumRSSI( + IN PADAPTER pAdapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + + /*Determine the minimum RSSI*/ + + if ((pDM_Odm->bLinked != _TRUE) && + (pHalData->EntryMinUndecoratedSmoothedPWDB == 0)) { + pHalData->MinUndecoratedPWDBForDM = 0; + /*ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any\n"));*/ + } else + pHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB; + + /*DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);*/ + /*ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));*/ +} +u8Byte +PhyDM_Get_Rate_Bitmap_Ex( + IN PVOID pDM_VOID, + IN u4Byte macid, + IN u8Byte ra_mask, + IN u1Byte rssi_level, + OUT u8Byte *dm_RA_Mask, + OUT u1Byte *dm_RteID +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PSTA_INFO_T pEntry; + u8Byte rate_bitmap = 0; + u1Byte WirelessMode; -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -u4Byte + 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 & 0x000000000000000c) /* 11M or 5.5M enable */ + rate_bitmap = 0x000000000000000d; + else + rate_bitmap = 0x000000000000000f; + break; + + case (ODM_WM_G): + case (ODM_WM_A): + if (rssi_level == DM_RATR_STA_HIGH) + rate_bitmap = 0x0000000000000f00; + else + rate_bitmap = 0x0000000000000ff0; + break; + + case (ODM_WM_B|ODM_WM_G): + if (rssi_level == DM_RATR_STA_HIGH) + rate_bitmap = 0x0000000000000f00; + else if (rssi_level == DM_RATR_STA_MIDDLE) + rate_bitmap = 0x0000000000000ff0; + else + rate_bitmap = 0x0000000000000ff5; + 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 = 0x00000000000f0000; + else if (rssi_level == DM_RATR_STA_MIDDLE) + rate_bitmap = 0x00000000000ff000; + else { + if (*(pDM_Odm->pBandWidth) == ODM_BW40M) + rate_bitmap = 0x00000000000ff015; + else + rate_bitmap = 0x00000000000ff005; + } + } else if (pDM_Odm->RFType == ODM_2T2R || pDM_Odm->RFType == ODM_2T3R || pDM_Odm->RFType == ODM_2T4R) { + if (rssi_level == DM_RATR_STA_HIGH) + rate_bitmap = 0x000000000f8f0000; + else if (rssi_level == DM_RATR_STA_MIDDLE) + rate_bitmap = 0x000000000f8ff000; + else { + if (*(pDM_Odm->pBandWidth) == ODM_BW40M) + rate_bitmap = 0x000000000f8ff015; + else + rate_bitmap = 0x000000000f8ff005; + } + } else { + if (rssi_level == DM_RATR_STA_HIGH) + rate_bitmap = 0x0000000f0f0f0000; + else if (rssi_level == DM_RATR_STA_MIDDLE) + rate_bitmap = 0x0000000fcfcfe000; + else { + if (*(pDM_Odm->pBandWidth) == ODM_BW40M) + rate_bitmap = 0x0000000ffffff015; + else + rate_bitmap = 0x0000000ffffff005; + } + } + } + break; + + case (ODM_WM_AC|ODM_WM_G): + if (rssi_level == 1) + rate_bitmap = 0x00000000fc3f0000; + else if (rssi_level == 2) + rate_bitmap = 0x00000000fffff000; + else + rate_bitmap = 0x00000000ffffffff; + break; + + case (ODM_WM_AC|ODM_WM_A): + + if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) { + if (rssi_level == 1) /* add by Gary for ac-series */ + rate_bitmap = 0x00000000003f8000; + else if (rssi_level == 2) + rate_bitmap = 0x00000000003fe000; + else + rate_bitmap = 0x00000000003ff010; + } else if (pDM_Odm->RFType == ODM_2T2R || pDM_Odm->RFType == ODM_2T3R || pDM_Odm->RFType == ODM_2T4R) { + if (rssi_level == 1) /* add by Gary for ac-series */ + rate_bitmap = 0x00000000fe3f8000; /* VHT 2SS MCS3~9 */ + else if (rssi_level == 2) + rate_bitmap = 0x00000000fffff000; /* VHT 2SS MCS0~9 */ + else + rate_bitmap = 0x00000000fffff010; /* All */ + } else { + if (rssi_level == 1) /* add by Gary for ac-series */ + rate_bitmap = 0x000003f8fe3f8000ULL; /* VHT 3SS MCS3~9 */ + else if (rssi_level == 2) + rate_bitmap = 0x000003fffffff000ULL; /* VHT3SS MCS0~9 */ + else + rate_bitmap = 0x000003fffffff010ULL; /* All */ + } + break; + + default: + if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) + rate_bitmap = 0x00000000000fffff; + else if (pDM_Odm->RFType == ODM_2T2R || pDM_Odm->RFType == ODM_2T3R || pDM_Odm->RFType == ODM_2T4R) + rate_bitmap = 0x000000000fffffff; + else + rate_bitmap = 0x0000003fffffffffULL; + break; + + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%016llx\n", rssi_level, WirelessMode, rate_bitmap)); + + return (ra_mask & rate_bitmap); +} + + +u4Byte ODM_Get_Rate_Bitmap( - IN PVOID pDM_VOID, + IN PVOID pDM_VOID, IN u4Byte macid, - IN u4Byte ra_mask, + IN u4Byte ra_mask, IN u1Byte rssi_level - ) +) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 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)) + 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): + switch (WirelessMode) { + case ODM_WM_B: + if (ra_mask & 0x0000000c) //11M or 5.5M enable + rate_bitmap = 0x0000000d; + else + rate_bitmap = 0x0000000f; + break; - 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; + 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 = 0x003ff010; + rate_bitmap = 0x000ff005; } - 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 { + 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 = 0xfffff010; // All + rate_bitmap = 0x0f8ff005; } - break; - - default: - if(pDM_Odm->RFType == RF_1T2R) - rate_bitmap = 0x000fffff; + } + } + 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 = 0x0fffffff; - break; + 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)); + DBG_871X("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\n", __func__, 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); - -} + return (ra_mask & rate_bitmap); + +} + +#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + +#endif /*#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))*/ -#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE) \ No newline at end of file diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.h index b9625de98dd0..34bb79c7b9b9 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.h @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -17,11 +17,52 @@ * * ******************************************************************************/ - + #ifndef __PHYDMRAINFO_H__ #define __PHYDMRAINFO_H__ -#define RAINFO_VERSION "1.0" +/*#define RAINFO_VERSION "2.0" //2014.11.04*/ +/*#define RAINFO_VERSION "3.0" //2015.01.13 Dino*/ +/*#define RAINFO_VERSION "3.1" //2015.01.14 Dino*/ +#define RAINFO_VERSION "3.2" /*2015.01.14 Dino*/ + +#define ACTIVE_TP_THRESHOLD 150 +#define RA_RETRY_DESCEND_NUM 2 +#define RA_RETRY_LIMIT_LOW 4 +#define RA_RETRY_LIMIT_HIGH 32 + +#define PHYDM_IC_8051_SERIES (ODM_RTL8881A|ODM_RTL8812|ODM_RTL8821|ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8703B|ODM_RTL8188F) +#define PHYDM_IC_3081_SERIES (ODM_RTL8814A|ODM_RTL8821B|ODM_RTL8822B) + +#define RAINFO_BE_RX_STATE BIT0 // 1:RX //ULDL +#define RAINFO_STBC_STATE BIT1 +#define RAINFO_LDPC_STATE BIT2 +#define RAINFO_SHURTCUT_STATE BIT3 +#define RAINFO_SHURTCUT_FLAG BIT4 +#define RAINFO_INIT_RSSI_RATE_STATE BIT5 +#define RAINFO_BF_STATE BIT6 +#define RAINFO_BE_TX_STATE BIT7 // 1:TX + +#define RA_MASK_CCK 0xf +#define RA_MASK_OFDM 0xff0 +#define RA_MASK_HT1SS 0xff000 +#define RA_MASK_HT2SS 0xff00000 +/*#define RA_MASK_MCS3SS */ +#define RA_MASK_HT4SS 0xff0 +#define RA_MASK_VHT1SS 0x3ff000 +#define RA_MASK_VHT2SS 0xffc00000 + +#if(DM_ODM_SUPPORT_TYPE == ODM_AP) +#define EXT_RA_INFO_SUPPORT_IC (ODM_RTL8881A |ODM_RTL8192E |ODM_RTL8812 |ODM_RTL8814A|ODM_RTL8822B) +#define RA_FIRST_MACID 1 +#elif(DM_ODM_SUPPORT_TYPE == ODM_WIN) +#define EXT_RA_INFO_SUPPORT_IC (ODM_RTL8192E|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723B|ODM_RTL8814A|ODM_RTL8822B) +#define RA_FIRST_MACID 0 +#elif(DM_ODM_SUPPORT_TYPE == ODM_CE) +//#define EXT_RA_INFO_SUPPORT_IC (ODM_RTL8192E|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723B|ODM_RTL8814A|ODM_RTL8822B) +#define RA_FIRST_MACID 0 +#endif + #define AP_InitRateAdaptiveState ODM_RateAdaptiveStateApInit @@ -29,139 +70,342 @@ #define DM_RATR_STA_HIGH 1 #define DM_RATR_STA_MIDDLE 2 #define DM_RATR_STA_LOW 3 -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if(DM_ODM_SUPPORT_TYPE & ODM_AP) #define DM_RATR_STA_ULTRA_LOW 4 #endif -#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) -typedef struct _Rate_Adaptive_Table_{ +typedef enum _phydm_arfr_num { + ARFR_0_RATE_ID = 0x9, + ARFR_1_RATE_ID = 0xa, + ARFR_2_RATE_ID = 0xb, + ARFR_3_RATE_ID = 0xc, + ARFR_4_RATE_ID = 0xd, + ARFR_5_RATE_ID = 0xe +} PHYDM_RA_ARFR_NUM_E; + +typedef enum _Phydm_ra_dbg_para { + RADBG_RTY_PENALTY = 1, //u8 + RADBG_N_HIGH = 2, + RADBG_N_LOW = 3, + RADBG_TRATE_UP_TABLE = 4, + RADBG_TRATE_DOWN_TABLE = 5, + RADBG_TRYING_NECESSARY = 6, + RADBG_TDROPING_NECESSARY = 7, + RADBG_RATE_UP_RTY_RATIO = 8, //u8 + RADBG_RATE_DOWN_RTY_RATIO = 9, //u8 + + RADBG_DEBUG_MONITOR1 = 0xc, + RADBG_DEBUG_MONITOR2 = 0xd, + RADBG_DEBUG_MONITOR3 = 0xe, + RADBG_DEBUG_MONITOR4 = 0xf, + NUM_RA_PARA +} PHYDM_RA_DBG_PARA_E; + + +#if (RATE_ADAPTIVE_SUPPORT == 1)//88E RA +typedef struct _ODM_RA_Info_ { + u1Byte RateID; + u4Byte RateMask; + u4Byte RAUseRate; + u1Byte RateSGI; + u1Byte RssiStaRA; + u1Byte PreRssiStaRA; + u1Byte SGIEnable; + u1Byte DecisionRate; + u1Byte PreRate; + u1Byte HighestRate; + u1Byte LowestRate; + u4Byte NscUp; + u4Byte NscDown; + u2Byte RTY[5]; + u4Byte TOTAL; + u2Byte DROP; + u1Byte Active; + u2Byte RptTime; + u1Byte RAWaitingCounter; + u1Byte RAPendingCounter; +#if 1 //POWER_TRAINING_ACTIVE == 1 // For compile pass only~! + u1Byte PTActive; // on or off + u1Byte PTTryState; // 0 trying state, 1 for decision state + u1Byte PTStage; // 0~6 + u1Byte PTStopCount; //Stop PT counter + u1Byte PTPreRate; // if rate change do PT + u1Byte PTPreRssi; // if RSSI change 5% do PT + u1Byte PTModeSS; // decide whitch rate should do PT + u1Byte RAstage; // StageRA, decide how many times RA will be done between PT + u1Byte PTSmoothFactor; +#endif +} ODM_RA_INFO_T, *PODM_RA_INFO_T; +#endif + + +typedef struct _Rate_Adaptive_Table_ { u1Byte firstconnect; - #if(DM_ODM_SUPPORT_TYPE==ODM_WIN) +#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) BOOLEAN PT_collision_pre; - #endif -}RA_T, *pRA_T; #endif -typedef struct _ODM_RATE_ADAPTIVE -{ +#if (defined(CONFIG_RA_DBG_CMD)) + BOOLEAN is_ra_dbg_init; + + u1Byte RTY_P[ODM_NUM_RATE_IDX]; + u1Byte RTY_P_default[ODM_NUM_RATE_IDX]; + BOOLEAN RTY_P_modify_note[ODM_NUM_RATE_IDX]; + + u1Byte RATE_UP_RTY_RATIO[ODM_NUM_RATE_IDX]; + u1Byte RATE_UP_RTY_RATIO_default[ODM_NUM_RATE_IDX]; + BOOLEAN RATE_UP_RTY_RATIO_modify_note[ODM_NUM_RATE_IDX]; + + u1Byte RATE_DOWN_RTY_RATIO[ODM_NUM_RATE_IDX]; + u1Byte RATE_DOWN_RTY_RATIO_default[ODM_NUM_RATE_IDX]; + BOOLEAN RATE_DOWN_RTY_RATIO_modify_note[ODM_NUM_RATE_IDX]; + + BOOLEAN RA_Para_feedback_req; + + u1Byte para_idx; + u1Byte rate_idx; + u1Byte value; + u2Byte value_16; + u1Byte rate_length; +#endif + + #if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT)) + u1Byte per_rate_retrylimit_20M[ODM_NUM_RATE_IDX]; + u1Byte per_rate_retrylimit_40M[ODM_NUM_RATE_IDX]; + u1Byte retry_descend_num; + u1Byte retrylimit_low; + u1Byte retrylimit_high; + #endif + + +} RA_T, *pRA_T; + +typedef struct _ODM_RATE_ADAPTIVE { u1Byte Type; // DM_Type_ByFW/DM_Type_ByDriver u1Byte HighRSSIThresh; // if RSSI > HighRSSIThresh => RATRState is DM_RATR_STA_HIGH u1Byte LowRSSIThresh; // if RSSI <= LowRSSIThresh => RATRState is DM_RATR_STA_LOW u1Byte RATRState; // Current RSSI level, DM_RATR_STA_HIGH/DM_RATR_STA_MIDDLE/DM_RATR_STA_LOW - #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) +#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) u1Byte LdpcThres; // if RSSI > LdpcThres => switch from LPDC to BCC BOOLEAN bLowerRtsRate; - #endif +#endif - #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) u1Byte RtsThres; - #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) BOOLEAN bUseLdpc; - #else +#else u1Byte UltraLowRSSIThresh; u4Byte LastRATR; // RATR Register Content - #endif +#endif } ODM_RATE_ADAPTIVE, *PODM_RATE_ADAPTIVE; -VOID -odm_RSSIMonitorInit( +VOID +ODM_C2HRaParaReportHandler( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen +); + +VOID +odm_RA_ParaAdjust_Send_H2C( + IN PVOID pDM_VOID +); + +VOID +odm_RA_debug( + IN PVOID pDM_VOID, + IN u4Byte *const dm_value +); + +VOID +odm_RA_ParaAdjust_init( IN PVOID pDM_VOID - ); +); VOID -odm_RSSIMonitorCheck( - IN PVOID pDM_VOID - ); +odm_RA_ParaAdjust( + IN PVOID pDM_VOID +); -#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) VOID -odm_RSSIDumpToRegister( +phydm_ra_dynamic_retry_limit( IN PVOID pDM_VOID - ); -#endif +); -VOID -odm_RSSIMonitorCheckMP( - IN PVOID pDM_VOID - ); - -VOID -odm_RSSIMonitorCheckCE( - IN PVOID pDM_VOID - ); +VOID +phydm_ra_dynamic_rate_id_on_assoc( + IN PVOID pDM_VOID, + IN u1Byte wireless_mode, + IN u1Byte init_rate_id +); -VOID -odm_RSSIMonitorCheckAP( - IN PVOID pDM_VOID - ); - +VOID +phydm_c2h_ra_report_handler( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen +); VOID -odm_RateAdaptiveMaskInit( - IN PVOID pDM_VOID - ); +phydm_ra_info_init( + IN PVOID pDM_VOID +); -VOID -odm_RefreshRateAdaptiveMask( +VOID +odm_RSSIMonitorInit( IN PVOID pDM_VOID - ); +); -VOID -odm_RefreshRateAdaptiveMaskMP( +VOID +odm_RSSIMonitorCheck( IN PVOID pDM_VOID - ); +); -VOID -odm_RefreshRateAdaptiveMaskCE( - IN PVOID pDM_VOID - ); +VOID +odm_RSSIMonitorCheckMP( + IN PVOID pDM_VOID +); -VOID -odm_RefreshRateAdaptiveMaskAPADSL( +VOID +odm_RSSIMonitorCheckCE( IN PVOID pDM_VOID - ); - -BOOLEAN -ODM_RAStateCheck( - IN PVOID pDM_VOID, - IN s4Byte RSSI, - IN BOOLEAN bForceUpdate, - OUT pu1Byte pRATRState - ); - -VOID -odm_RefreshBasicRateMask( +); + +VOID +odm_RSSIMonitorCheckAP( IN PVOID pDM_VOID - ); +); + + +VOID +odm_RateAdaptiveMaskInit( + IN PVOID pDM_VOID +); +VOID +odm_RefreshRateAdaptiveMask( + IN PVOID pDM_VOID +); + +VOID +odm_RefreshRateAdaptiveMaskMP( + IN PVOID pDM_VOID +); + +VOID +odm_RefreshRateAdaptiveMaskCE( + IN PVOID pDM_VOID +); + +VOID +odm_RefreshRateAdaptiveMaskAPADSL( + IN PVOID pDM_VOID +); + +BOOLEAN +ODM_RAStateCheck( + IN PVOID pDM_VOID, + IN s4Byte RSSI, + IN BOOLEAN bForceUpdate, + OUT pu1Byte pRATRState +); + +VOID +odm_RefreshBasicRateMask( + IN PVOID pDM_VOID +); +VOID +ODM_RAPostActionOnAssoc( + IN PVOID pDM_VOID +); + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) + +u1Byte +odm_Find_RTS_Rate( + IN PVOID pDM_VOID, + IN u1Byte Tx_Rate, + IN BOOLEAN bErpProtect +); + +VOID +ODM_UpdateNoisyState( + IN PVOID pDM_VOID, + IN BOOLEAN bNoisyStateFromC2H +); + +u4Byte +Set_RA_DM_Ratrbitmap_by_Noisy( + IN PVOID pDM_VOID, + IN WIRELESS_MODE WirelessMode, + IN u4Byte ratr_bitmap, + IN u1Byte rssi_level +); + +VOID +ODM_UpdateInitRate( + IN PVOID pDM_VOID, + IN u1Byte Rate +); #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -VOID -ODM_DynamicARFBSelect( - IN PVOID pDM_VOID, - IN u1Byte rate, - IN BOOLEAN Collision_State - ); - -VOID -ODM_RateAdaptiveStateApInit( - IN PVOID PADAPTER_VOID, + +VOID +odm_RSSIDumpToRegister( + IN PVOID pDM_VOID +); + +VOID +odm_RefreshLdpcRtsMP( + IN PADAPTER pAdapter, + IN PDM_ODM_T pDM_Odm, + IN u1Byte mMacId, + IN u1Byte IOTPeer, + IN s4Byte UndecoratedSmoothedPWDB +); + +VOID +ODM_DynamicARFBSelect( + IN PVOID pDM_VOID, + IN u1Byte rate, + IN BOOLEAN Collision_State +); + +VOID +ODM_RateAdaptiveStateApInit( + IN PVOID PADAPTER_VOID, IN PRT_WLAN_STA pEntry - ); -#endif +); +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + +static void +FindMinimumRSSI( + IN PADAPTER pAdapter +); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -u4Byte +u8Byte +PhyDM_Get_Rate_Bitmap_Ex( + IN PVOID pDM_VOID, + IN u4Byte macid, + IN u8Byte ra_mask, + IN u1Byte rssi_level, + OUT u8Byte *dm_RA_Mask, + OUT u1Byte *dm_RteID +); +u4Byte ODM_Get_Rate_Bitmap( - IN PVOID pDM_VOID, + IN PVOID pDM_VOID, IN u4Byte macid, - IN u4Byte ra_mask, + IN u4Byte ra_mask, IN u1Byte rssi_level - ); -#endif +); +#endif/*#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)*/ + +#endif/*#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))*/ -#endif //#ifndef __ODMRAINFO_H__ +#endif /*#ifndef __ODMRAINFO_H__*/ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11AC.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11AC.h index e7e54184f099..ad680c88457e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11AC.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11AC.h @@ -29,9 +29,13 @@ //PAGE 8 #define ODM_REG_CCK_RPT_FORMAT_11AC 0x804 #define ODM_REG_BB_RX_PATH_11AC 0x808 +#define ODM_REG_BB_TX_PATH_11AC 0x80c #define ODM_REG_BB_ATC_11AC 0x860 -#define ODM_REG_DBG_RPT_11AC 0x8fc +#define ODM_REG_EDCCA_POWER_CAL 0x8dc +#define ODM_REG_DBG_RPT_11AC 0x8fc //PAGE 9 +#define ODM_REG_EDCCA_DOWN_OPT 0x900 +#define ODM_REG_ACBB_EDCCA_ENHANCE 0x944 #define ODM_REG_OFDM_FA_RST_11AC 0x9A4 #define ODM_REG_NHM_TIMER_11AC 0x990 #define ODM_REG_NHM_TH9_TH10_11AC 0x994 @@ -70,6 +74,7 @@ #define ODM_BIT_IGI_11AC 0xFFFFFFFF #define ODM_BIT_CCK_RPT_FORMAT_11AC BIT16 #define ODM_BIT_BB_RX_PATH_11AC 0xF +#define ODM_BIT_BB_TX_PATH_11AC 0xF #define ODM_BIT_BB_ATC_11AC BIT14 #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11N.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11N.h index 9d07509f6feb..374943d3ad78 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11N.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11N.h @@ -44,16 +44,16 @@ #define ODM_REG_RF_PIN_11N 0x804 #define ODM_REG_PSD_CTRL_11N 0x808 #define ODM_REG_TX_ANT_CTRL_11N 0x80C -#define ODM_REG_BB_PWR_SAV5_11N 0x818 +#define ODM_REG_BB_PWR_SAV5_11N 0x818 #define ODM_REG_CCK_RPT_FORMAT_11N 0x824 #define ODM_REG_CCK_RPT_FORMAT_11N_B 0x82C #define ODM_REG_RX_DEFUALT_A_11N 0x858 #define ODM_REG_RX_DEFUALT_B_11N 0x85A -#define ODM_REG_BB_PWR_SAV3_11N 0x85C +#define ODM_REG_BB_PWR_SAV3_11N 0x85C #define ODM_REG_ANTSEL_CTRL_11N 0x860 #define ODM_REG_RX_ANT_CTRL_11N 0x864 #define ODM_REG_PIN_CTRL_11N 0x870 -#define ODM_REG_BB_PWR_SAV1_11N 0x874 +#define ODM_REG_BB_PWR_SAV1_11N 0x874 #define ODM_REG_ANTSEL_PATH_11N 0x878 #define ODM_REG_BB_3WIRE_11N 0x88C #define ODM_REG_SC_CNT_11N 0x8C4 @@ -66,8 +66,11 @@ #define ODM_REG_NHM_CNT_11N 0x8d8 //PAGE 9 #define ODM_REG_DBG_RPT_11N 0x908 +#define ODM_REG_BB_TX_PATH_11N 0x90c #define ODM_REG_ANT_MAPPING1_11N 0x914 #define ODM_REG_ANT_MAPPING2_11N 0x918 +#define ODM_REG_EDCCA_DOWN_OPT_11N 0x948 + //PAGE A #define ODM_REG_CCK_ANTDIV_PARA1_11N 0xA00 #define ODM_REG_CCK_CCA_11N 0xA0A @@ -86,7 +89,7 @@ #define ODM_REG_CCK_FA_MSB_11N 0xA58 #define ODM_REG_CCK_FA_LSB_11N 0xA5C #define ODM_REG_CCK_CCA_CNT_11N 0xA60 -#define ODM_REG_BB_PWR_SAV4_11N 0xA74 +#define ODM_REG_BB_PWR_SAV4_11N 0xA74 //PAGE B #define ODM_REG_LNA_SWITCH_11N 0xB2C #define ODM_REG_PATH_SWITCH_11N 0xB30 @@ -98,9 +101,9 @@ #define ODM_REG_BB_RX_PATH_11N 0xC04 #define ODM_REG_TRMUX_11N 0xC08 #define ODM_REG_OFDM_FA_RSTC_11N 0xC0C -#define ODM_REG_RXIQI_MATRIX_11N 0xC14 +#define ODM_REG_RXIQI_MATRIX_11N 0xC14 #define ODM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C -#define ODM_REG_IGI_A_11N 0xC50 +#define ODM_REG_IGI_A_11N 0xC50 #define ODM_REG_ANTDIV_PARA2_11N 0xC54 #define ODM_REG_IGI_B_11N 0xC58 #define ODM_REG_ANTDIV_PARA3_11N 0xC5C @@ -129,6 +132,7 @@ #define ODM_REG_TXAGC_A_MCS4_7_11N 0xE14 #define ODM_REG_TXAGC_A_MCS8_11_11N 0xE18 #define ODM_REG_TXAGC_A_MCS12_15_11N 0xE1C +#define DOM_REG_EDCCA_DCNF_11N 0xE24 #define ODM_REG_FPGA0_IQK_11N 0xE28 #define ODM_REG_TXIQK_TONE_A_11N 0xE30 #define ODM_REG_RXIQK_TONE_A_11N 0xE34 @@ -167,14 +171,15 @@ #define ODM_REG_EDCA_BK_11N 0x50C #define ODM_REG_TXPAUSE_11N 0x522 #define ODM_REG_RESP_TX_11N 0x6D8 -#define ODM_REG_ANT_TRAIN_PARA1_11N 0x7b0 -#define ODM_REG_ANT_TRAIN_PARA2_11N 0x7b4 +#define ODM_REG_ANT_TRAIN_PARA1_11N 0x7b0 +#define ODM_REG_ANT_TRAIN_PARA2_11N 0x7b4 //DIG Related #define ODM_BIT_IGI_11N 0x0000007F #define ODM_BIT_CCK_RPT_FORMAT_11N BIT9 #define ODM_BIT_BB_RX_PATH_11N 0xF +#define ODM_BIT_BB_TX_PATH_11N 0xF #define ODM_BIT_BB_ATC_11N BIT11 #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_beamforming.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_beamforming.c new file mode 100755 index 000000000000..815cd35d57d1 --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_beamforming.c @@ -0,0 +1,2552 @@ +#include "Mp_Precomp.h" + +#if WPP_SOFTWARE_TRACE +#include "phydm_beamforming.tmh" +#endif + +#if (BEAMFORMING_SUPPORT == 1) + + +u1Byte +Beamforming_GetHTNDPTxRate( + IN PADAPTER Adapter, + u1Byte CompSteeringNumofBFer +) +{ + u1Byte Nr_index = 0; + u1Byte NDPTxRate; + /*Find Nr*/ + + if(IS_HARDWARE_TYPE_8814A(Adapter)) + Nr_index = TxBF_Nr(halTxbf8814A_GetNtx(Adapter), CompSteeringNumofBFer); + else + Nr_index = TxBF_Nr(1, CompSteeringNumofBFer); + + switch(Nr_index) + { + case 1: + NDPTxRate = MGN_MCS8; + break; + + case 2: + NDPTxRate = MGN_MCS16; + break; + + case 3: + NDPTxRate = MGN_MCS24; + break; + + default: + NDPTxRate = MGN_MCS8; + break; + + } + +return NDPTxRate; + +} + +u1Byte +Beamforming_GetVHTNDPTxRate( + IN PADAPTER Adapter, + u1Byte CompSteeringNumofBFer +) +{ + u1Byte Nr_index = 0; + u1Byte NDPTxRate; + /*Find Nr*/ + if(IS_HARDWARE_TYPE_8814A(Adapter)) + Nr_index = TxBF_Nr(halTxbf8814A_GetNtx(Adapter), CompSteeringNumofBFer); + else + Nr_index = TxBF_Nr(1, CompSteeringNumofBFer); + + switch(Nr_index) + { + case 1: + NDPTxRate = MGN_VHT2SS_MCS0; + break; + + case 2: + NDPTxRate = MGN_VHT3SS_MCS0; + break; + + case 3: + NDPTxRate = MGN_VHT4SS_MCS0; + break; + + default: + NDPTxRate = MGN_VHT2SS_MCS0; + break; + + } + +return NDPTxRate; + +} + + +PRT_BEAMFORMING_ENTRY +phydm_Beamforming_GetBFeeEntryByAddr( + IN PVOID pDM_VOID, + IN pu1Byte RA, + OUT pu1Byte Idx + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte i = 0; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s ===>\n", __FUNCTION__)); + + for(i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) + { + if( pBeamInfo->BeamformeeEntry[i].bUsed && + (eqMacAddr(RA,pBeamInfo->BeamformeeEntry[i].MacAddr) )) + { + *Idx = i; + return &(pBeamInfo->BeamformeeEntry[i]); + } + } + + return NULL; +} + +PRT_BEAMFORMER_ENTRY +phydm_Beamforming_GetBFerEntryByAddr( + IN PVOID pDM_VOID, + IN pu1Byte TA, + OUT pu1Byte Idx + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte i = 0; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s ===>\n", __FUNCTION__)); + + for(i = 0; i < BEAMFORMER_ENTRY_NUM; i++) + { + if( pBeamInfo->BeamformerEntry[i].bUsed && + (eqMacAddr(TA,pBeamInfo->BeamformerEntry[i].MacAddr) )) + { + *Idx = i; + return &(pBeamInfo->BeamformerEntry[i]); + } + } + + return NULL; +} + + +PRT_BEAMFORMING_ENTRY +phydm_Beamforming_GetEntryByMacId( + IN PVOID pDM_VOID, + IN u1Byte MacId, + OUT pu1Byte Idx + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte i = 0; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s ===>\n", __FUNCTION__)); + + for(i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) + { + if( pBeamInfo->BeamformeeEntry[i].bUsed && + (MacId == pBeamInfo->BeamformeeEntry[i].MacId)) + { + *Idx = i; + return &(pBeamInfo->BeamformeeEntry[i]); + } + } + + return NULL; +} + + +BEAMFORMING_CAP +phydm_Beamforming_GetEntryBeamCapByMacId( + IN PVOID pDM_VOID, + IN u1Byte MacId + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte i = 0; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + BEAMFORMING_CAP BeamformEntryCap = BEAMFORMING_CAP_NONE; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s ===>\n", __FUNCTION__)); + + for(i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) + { + if( pBeamInfo->BeamformeeEntry[i].bUsed && + (MacId == pBeamInfo->BeamformeeEntry[i].MacId)) + { + BeamformEntryCap = pBeamInfo->BeamformeeEntry[i].BeamformEntryCap; + i = BEAMFORMEE_ENTRY_NUM; + } + } + + return BeamformEntryCap; +} + + +PRT_BEAMFORMING_ENTRY +phydm_Beamforming_GetFreeBFeeEntry( + IN PVOID pDM_VOID, + OUT pu1Byte Idx + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte i = 0; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s ===>\n", __FUNCTION__)); + + for(i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) + { + if(pBeamInfo->BeamformeeEntry[i].bUsed == FALSE) + { + *Idx = i; + return &(pBeamInfo->BeamformeeEntry[i]); + } + } + return NULL; +} + +PRT_BEAMFORMER_ENTRY +phydm_Beamforming_GetFreeBFerEntry( + IN PVOID pDM_VOID, + OUT pu1Byte Idx + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte i = 0; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s ===>\n", __FUNCTION__)); + + for(i = 0; i < BEAMFORMER_ENTRY_NUM; i++) + { + if(pBeamInfo->BeamformerEntry[i].bUsed == FALSE) + { + *Idx = i; + return &(pBeamInfo->BeamformerEntry[i]); + } + } + return NULL; +} + + +PRT_BEAMFORMING_ENTRY +Beamforming_AddBFeeEntry( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN u2Byte AID, + IN u2Byte MacID, + IN CHANNEL_WIDTH BW, + IN BEAMFORMING_CAP BeamformCap, + IN u1Byte NumofSoundingDim, + IN u1Byte CompSteeringNumofBFer, + OUT pu1Byte Idx + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_BEAMFORMING_ENTRY pEntry = phydm_Beamforming_GetFreeBFeeEntry(pDM_Odm, Idx); + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__)); + + if(pEntry != NULL) + { + pEntry->bUsed = TRUE; + pEntry->AID = AID; + pEntry->MacId = MacID; + pEntry->SoundBW = BW; + if(ACTING_AS_AP(Adapter)) + { + u2Byte BSSID = ((Adapter->CurrentAddress[5] & 0xf0) >> 4) ^ + (Adapter->CurrentAddress[5] & 0xf); // BSSID[44:47] xor BSSID[40:43] + pEntry->P_AID = (AID + BSSID * 32) & 0x1ff; // (dec(A) + dec(B)*32) mod 512 + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: BFee P_AID addressed to STA=%d\n", __FUNCTION__,pEntry->P_AID)); + } + else if(ACTING_AS_IBSS(Adapter)) // Ad hoc mode + { + pEntry->P_AID = 0; + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: BFee P_AID as IBSS=%d\n", __FUNCTION__,pEntry->P_AID)); + } + else // client mode + { + pEntry->P_AID = RA[5]; // BSSID[39:47] + pEntry->P_AID = (pEntry->P_AID << 1) | (RA[4] >> 7 ); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: BFee P_AID addressed to AP=0x%X\n", __FUNCTION__,pEntry->P_AID)); + } + cpMacAddr(pEntry->MacAddr, RA); + pEntry->bTxBF = FALSE; + pEntry->bSound = FALSE; + + //3 TODO SW/FW sound period + pEntry->SoundPeriod = 200; + pEntry->BeamformEntryCap = BeamformCap; + pEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; + +/* pEntry->LogSeq = 0xff; // Move to Beamforming_AddBFerEntry*/ +/* pEntry->LogRetryCnt = 0; // Move to Beamforming_AddBFerEntry*/ +/* pEntry->LogSuccessCnt = 0; // Move to Beamforming_AddBFerEntry*/ + + pEntry->LogStatusFailCnt = 0; + + pEntry->NumofSoundingDim = NumofSoundingDim; + pEntry->CompSteeringNumofBFer = CompSteeringNumofBFer; + + return pEntry; + } + else + return NULL; +} + +PRT_BEAMFORMER_ENTRY +Beamforming_AddBFerEntry( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN u2Byte AID, + IN BEAMFORMING_CAP BeamformCap, + IN u1Byte NumofSoundingDim, + OUT pu1Byte Idx + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_BEAMFORMER_ENTRY pEntry = phydm_Beamforming_GetFreeBFerEntry(pDM_Odm, Idx); + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__)); + + if(pEntry != NULL) + { + pEntry->bUsed = TRUE; + if(ACTING_AS_AP(Adapter)) + { + u2Byte BSSID = ((Adapter->CurrentAddress[5] & 0xf0) >> 4) ^ + (Adapter->CurrentAddress[5] & 0xf); // BSSID[44:47] xor BSSID[40:43] + pEntry->P_AID = (AID + BSSID * 32) & 0x1ff; // (dec(A) + dec(B)*32) mod 512 + } + else if(ACTING_AS_IBSS(Adapter)) + { + pEntry->P_AID = 0; + } + else + { + pEntry->P_AID = RA[5]; // BSSID[39:47] + pEntry->P_AID = (pEntry->P_AID << 1) | (RA[4] >> 7 ); + } + + cpMacAddr(pEntry->MacAddr, RA); + pEntry->BeamformEntryCap = BeamformCap; + + pEntry->LogSeq = 0xff; // Modified by Jeffery @2014-10-29 + pEntry->LogRetryCnt = 0; // Modified by Jeffery @2014-10-29 + pEntry->LogSuccessCnt = 0; // Modified by Jeffery @2014-10-29 + + pEntry->NumofSoundingDim = NumofSoundingDim; + + return pEntry; + } + else + return NULL; +} + + +BOOLEAN +Beamforming_RemoveEntry( + IN PADAPTER Adapter, + IN pu1Byte RA, + OUT pu1Byte Idx + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + PRT_BEAMFORMER_ENTRY pBFerEntry = phydm_Beamforming_GetBFerEntryByAddr(pDM_Odm, RA, Idx); + PRT_BEAMFORMING_ENTRY pEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, Idx); + BOOLEAN ret = FALSE; + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + if (pEntry != NULL) { + pEntry->bUsed = FALSE; + pEntry->BeamformEntryCap = BEAMFORMING_CAP_NONE; + /*pEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;*/ + pEntry->bBeamformingInProgress = FALSE; + ret = TRUE; + } + if (pBFerEntry != NULL) { + pBFerEntry->bUsed = FALSE; + pBFerEntry->BeamformEntryCap = BEAMFORMING_CAP_NONE; + ret = TRUE; + } + return ret; + +} + +/* Used for BeamformingStart_V1 */ +VOID +phydm_Beamforming_NDPARate( + IN PVOID pDM_VOID, + CHANNEL_WIDTH BW, + u1Byte Rate +) +{ + u2Byte NDPARate = Rate; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(NDPARate == 0) + { + if(pDM_Odm->RSSI_Min > 30) // link RSSI > 30% + NDPARate = ODM_RATE24M; + else + NDPARate = ODM_RATE6M; + } + + if(NDPARate < ODM_RATEMCS0) + BW = ODM_BW20M; + + NDPARate = (NDPARate << 8) | BW; + HalComTxbf_Set(pDM_Odm->Adapter, TXBF_SET_SOUNDING_RATE, (pu1Byte)&NDPARate); + +} + + +/* Used for BeamformingStart_SW and BeamformingStart_FW */ +VOID +phydm_Beamforming_DymNDPARate( + IN PVOID pDM_VOID +) +{ + u2Byte NDPARate = ODM_RATE6M, BW; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(pDM_Odm->RSSI_Min > 30) // link RSSI > 30% + NDPARate = ODM_RATE24M; + else + NDPARate = ODM_RATE6M; + + BW = ODM_BW20M; + NDPARate = NDPARate << 8 | BW; + HalComTxbf_Set(pDM_Odm->Adapter, TXBF_SET_SOUNDING_RATE, (pu1Byte)&NDPARate); + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s End, NDPA Rate = 0x%X \n", __FUNCTION__, NDPARate)); +} + +/* +* SW Sounding : SW Timer unit 1ms +* HW Timer unit (1/32000) s 32k is clock. +* FW Sounding : FW Timer unit 10ms +*/ +VOID +Beamforming_DymPeriod( + IN PVOID pDM_VOID +) +{ + u1Byte Idx; + BOOLEAN bChangePeriod = FALSE; + u2Byte SoundPeriod_SW, SoundPeriod_FW; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PADAPTER Adapter = pDM_Odm->Adapter; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + PRT_BEAMFORMING_ENTRY pBeamformEntry; + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO((Adapter)); + PRT_SOUNDING_INFO pSoundInfo = &(pBeamInfo->SoundingInfo); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + //3 TODO per-client throughput caculation. + + if(Adapter->TxStats.CurrentTxTP + Adapter->RxStats.CurrentRxTP > 2) + { + //-@ Modified by David + SoundPeriod_SW = 20; //32*20? + SoundPeriod_FW = 20; // From H2C cmd, unit = 10ms + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s, current TRX TP>2, SoundPeriod_SW=%d, SoundPeriod_FW=%d \n", + __FUNCTION__, + SoundPeriod_SW, + SoundPeriod_FW) ); + } + else + { + //-@ Modified by David + SoundPeriod_SW = 2000;//32*2000? + SoundPeriod_FW = 200; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s, current TRX TP<2, SoundPeriod_SW=%d, SoundPeriod_FW=%d \n", + __FUNCTION__, + SoundPeriod_SW, + SoundPeriod_FW) ); + } + + for(Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) + { + pBeamformEntry = pBeamInfo->BeamformeeEntry+Idx; + + if(pBeamformEntry->DefaultCSICnt > 20) + { + //-@ Modified by David + SoundPeriod_SW = 2000; + SoundPeriod_FW = 200; + } + + RT_DISP(FBEAM, FBEAM_FUN, ("@%s Period = %d\n", __FUNCTION__, SoundPeriod_SW)); + if(pBeamformEntry->BeamformEntryCap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU)) + { + if(pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER) + { + if(pBeamformEntry->SoundPeriod != SoundPeriod_FW) + { + pBeamformEntry->SoundPeriod = SoundPeriod_FW; + bChangePeriod = TRUE; // Only FW sounding need to send H2C packet to change sound period. + } + } + else if(pBeamformEntry->SoundPeriod != SoundPeriod_SW) + { + pBeamformEntry->SoundPeriod = SoundPeriod_SW; + } + } + } + + if(bChangePeriod) + HalComTxbf_Set(Adapter, TXBF_SET_SOUNDING_FW_NDPA, (pu1Byte)&Idx); +} + + +VOID +Beamforming_GidPAid( + PADAPTER Adapter, + PRT_TCB pTcb +) +{ + u1Byte Idx = 0; + u1Byte RA[6] ={0}; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + pu1Byte pHeader = GET_FRAME_OF_FIRST_FRAG(Adapter, pTcb); + + if(Adapter->HardwareType < HARDWARE_TYPE_RTL8192EE) + return; + else if(IS_WIRELESS_MODE_N(Adapter) == FALSE) + return; + + GET_80211_HDR_ADDRESS1(pHeader, &RA); + + // VHT SU PPDU carrying one or more group addressed MPDUs or + // Transmitting a VHT NDP intended for multiple recipients + if( MacAddr_isBcst(RA) || MacAddr_isMulticast(RA) || + pTcb->macId == MAC_ID_STATIC_FOR_BROADCAST_MULTICAST) + { + pTcb->G_ID = 63; + pTcb->P_AID = 0; + } + else if(ACTING_AS_AP(Adapter)) + { + u2Byte AID = (u2Byte) (MacIdGetOwnerAssociatedClientAID(Adapter, pTcb->macId) & 0x1ff); //AID[0:8] + + pTcb->G_ID = 63; + + if(AID == 0) //A PPDU sent by an AP to a non associated STA + pTcb->P_AID = 0; + else + { //Sent by an AP and addressed to a STA associated with that AP + u2Byte BSSID = 0; + GET_80211_HDR_ADDRESS2(pHeader, &RA); + BSSID = ((RA[5] & 0xf0) >> 4) ^ (RA[5] & 0xf); // BSSID[44:47] xor BSSID[40:43] + pTcb->P_AID = (AID + BSSID * 32) & 0x1ff; // (dec(A) + dec(B)*32) mod 512 + } + } + else if(ACTING_AS_IBSS(Adapter)) + { + pTcb->G_ID = 63; + // P_AID for infrasturcture mode; MACID for ad-hoc mode. + pTcb->P_AID = pTcb->macId; + } + else if(MgntLinkStatusQuery(Adapter)) + { // Addressed to AP + pTcb->G_ID = 0; + GET_80211_HDR_ADDRESS1(pHeader, &RA); + pTcb->P_AID = RA[5]; // RA[39:47] + pTcb->P_AID = (pTcb->P_AID << 1) | (RA[4] >> 7 ); + } + else + { + pTcb->G_ID = 63; + pTcb->P_AID = 0; + } + + //RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s End, G_ID=0x%X, P_AID=0x%X \n", __FUNCTION__, pTcb->G_ID, pTcb->P_AID) ); + +} + + +RT_STATUS +Beamforming_GetReportFrame( + IN PADAPTER Adapter, + IN PRT_RFD pRfd, + IN POCTET_STRING pPduOS + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + PRT_BEAMFORMING_ENTRY pBeamformEntry = NULL; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + pu1Byte pMIMOCtrlField, pCSIReport, pCSIMatrix; + u1Byte Idx, Nc, Nr, CH_W; + u2Byte CSIMatrixLen = 0; + + ACT_PKT_TYPE pktType = ACT_PKT_TYPE_UNKNOWN; + + //Memory comparison to see if CSI report is the same with previous one + pBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, Frame_Addr2(*pPduOS), &Idx); + + if( pBeamformEntry == NULL ) + { + RT_DISP(FBEAM, FBEAM_DATA, ("Beamforming_GetReportFrame: Cannot find entry by addr\n")); + return RT_STATUS_FAILURE; + } + + pktType = PacketGetActionFrameType(pPduOS); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + //-@ Modified by David + if(pktType == ACT_PKT_VHT_COMPRESSED_BEAMFORMING) + { + pMIMOCtrlField = pPduOS->Octet + 26; + Nc = ((*pMIMOCtrlField) & 0x7) + 1; + Nr = (((*pMIMOCtrlField) & 0x38) >> 3) + 1; + CH_W = (((*pMIMOCtrlField) & 0xC0) >> 6); + pCSIMatrix = pMIMOCtrlField + 3 + Nc; //24+(1+1+3)+2 MAC header+(Category+ActionCode+MIMOControlField) +SNR(Nc=2) + CSIMatrixLen = pPduOS->Length - 26 -3 -Nc; + } + else if(pktType == ACT_PKT_HT_COMPRESSED_BEAMFORMING) + { + pMIMOCtrlField = pPduOS->Octet + 26; + Nc = ((*pMIMOCtrlField) & 0x3) + 1; + Nr = (((*pMIMOCtrlField) & 0xC) >> 2) + 1; + CH_W = (((*pMIMOCtrlField) & 0x10) >> 4); + pCSIMatrix = pMIMOCtrlField + 6 + Nr; //24+(1+1+6)+2 MAC header+(Category+ActionCode+MIMOControlField) +SNR(Nc=2) + CSIMatrixLen = pPduOS->Length - 26 -6 -Nr; + } + else + return RT_STATUS_SUCCESS; + + if(pktType == ACT_PKT_VHT_COMPRESSED_BEAMFORMING) + { + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@BF_GetReportFrame: idx=%d, pkt type=VHT_Cprssed_BF, Nc=%d, Nr=%d, CH_W=%d\n", Idx, Nc, Nr, CH_W)); + } + else if(pktType == ACT_PKT_HT_COMPRESSED_BEAMFORMING) + { + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@BF_GetReportFrame: idx=%d, pkt type=HT_Cprssed_BF, Nc=%d, Nr=%d, CH_W=%d\n", Idx, Nc, Nr, CH_W)); + } + + +// RT_DISP_DATA(FBEAM, FBEAM_DATA, "Beamforming_GetReportFrame \n", pMIMOCtrlField, pPduOS->Length - 26); + + //-@ Modified by David - CSI buffer is not big enough, and comparison would result in blue screen + /* + if(pBeamformEntry->CSIMatrixLen != CSIMatrixLen) + pBeamformEntry->DefaultCSICnt = 0; + else if(PlatformCompareMemory(pBeamformEntry->CSIMatrix, pCSIMatrix, CSIMatrixLen)) + { + pBeamformEntry->DefaultCSICnt = 0; + RT_DISP(FBEAM, FBEAM_FUN, ("%s CSI report is NOT the same with previos one\n", __FUNCTION__)); + } + else if(pBeamformEntry->DefaultCSICnt <= 20) + { + pBeamformEntry->DefaultCSICnt ++; + RT_DISP(FBEAM, FBEAM_FUN, ("%s CSI report is the SAME with previos one\n", __FUNCTION__)); + } + + pBeamformEntry->CSIMatrixLen = CSIMatrixLen; + PlatformMoveMemory(&pBeamformEntry->CSIMatrix, pCSIMatrix, CSIMatrixLen); + */ + + return RT_STATUS_SUCCESS; +} + + +VOID +Beamforming_GetNDPAFrame( + IN PADAPTER Adapter, + IN OCTET_STRING pduOS +) +{ + pu1Byte TA ; + u1Byte Idx, Sequence; + pu1Byte pNDPAFrame = pduOS.Octet; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); +// PRT_BEAMFORMING_ENTRY pBeamformEntry = NULL; + PRT_BEAMFORMER_ENTRY pBeamformerEntry = NULL; // Modified By Jeffery @2014-10-29 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + RT_DISP_DATA(FBEAM, FBEAM_DATA, "Beamforming_GetNDPAFrame\n", pduOS.Octet, pduOS.Length); + + if(IsCtrlNDPA(pNDPAFrame) == FALSE) + return; + else if( (IS_HARDWARE_TYPE_8812(Adapter) == FALSE)||(IS_HARDWARE_TYPE_8821(Adapter) == FALSE) ) + return; + + TA = Frame_Addr2(pduOS); + // Remove signaling TA. + TA[0] = TA[0] & 0xFE; + +// pBeamformEntry = Beamforming_GetBFeeEntryByAddr(Adapter, TA, &Idx); + pBeamformerEntry = phydm_Beamforming_GetBFerEntryByAddr(pDM_Odm, TA, &Idx); // Modified By Jeffery @2014-10-29 + + if(pBeamformerEntry == NULL) + return; + else if(!(pBeamformerEntry->BeamformEntryCap & BEAMFORMEE_CAP_VHT_SU)) + return; +// else if(pBeamformerEntry->LogSuccessCnt > 1) //¼È®É²¾°£,ÁקK¥Ã»·¥d¦º¦b³o­Óª¬ºA +// return; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s begin, LogSeq=%d, LogRetryCnt=%d, LogSuccessCnt=%d\n", + __FUNCTION__, + pBeamformerEntry->LogSeq, + pBeamformerEntry->LogRetryCnt, + pBeamformerEntry->LogSuccessCnt) ); + + Sequence = (pNDPAFrame[16]) >> 2; + + if(pBeamformerEntry->LogSeq != Sequence) + { + /* Previous frame doesn't retry when meet new sequence number */ + if(pBeamformerEntry->LogSeq != 0xff && pBeamformerEntry->LogRetryCnt == 0) + pBeamformerEntry->LogSuccessCnt++; + + pBeamformerEntry->LogSeq = Sequence; + pBeamformerEntry->LogRetryCnt = 0; + } + else + { + if(pBeamformerEntry->LogRetryCnt == 3) + HalComTxbf_Set(Adapter, TXBF_SET_SOUNDING_CLK, NULL); + else if(pBeamformerEntry->LogRetryCnt <= 3) + pBeamformerEntry->LogRetryCnt++; + } + +/* RT_DISP(FBEAM, FBEAM_FUN, ("%s End, LogSeq=%d, LogRetryCnt=%d, LogSuccessCnt=%d\n", + __FUNCTION__, + pBeamformerEntry->LogSeq, + pBeamformerEntry->LogRetryCnt, + pBeamformerEntry->LogSuccessCnt));*/ + +} + + +VOID +ConstructHTNDPAPacket( + PADAPTER Adapter, + pu1Byte RA, + pu1Byte Buffer, + pu4Byte pLength, + CHANNEL_WIDTH BW + ) +{ + u2Byte Duration= 0; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo); + OCTET_STRING pNDPAFrame,ActionContent; + u1Byte ActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c}; + + PlatformZeroMemory(Buffer, 32); + + SET_80211_HDR_FRAME_CONTROL(Buffer,0); + + SET_80211_HDR_ORDER(Buffer, 1); + SET_80211_HDR_TYPE_AND_SUBTYPE(Buffer,Type_Action_No_Ack); + + SET_80211_HDR_ADDRESS1(Buffer, RA); + SET_80211_HDR_ADDRESS2(Buffer, Adapter->CurrentAddress); + SET_80211_HDR_ADDRESS3(Buffer, pMgntInfo->Bssid); + + Duration = 2*aSifsTime + 40; + + if(BW== CHANNEL_WIDTH_40) + Duration+= 87; + else + Duration+= 180; + + SET_80211_HDR_DURATION(Buffer, Duration); + + //HT control field + SET_HT_CTRL_CSI_STEERING(Buffer+sMacHdrLng, 3); + SET_HT_CTRL_NDP_ANNOUNCEMENT(Buffer+sMacHdrLng, 1); + + FillOctetString(pNDPAFrame, Buffer, sMacHdrLng+sHTCLng); + + FillOctetString(ActionContent, ActionHdr, 4); + PacketAppendData(&pNDPAFrame, ActionContent); + + *pLength = 32; +} + + +BOOLEAN +SendFWHTNDPAPacket( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN CHANNEL_WIDTH BW + ) +{ + PRT_TCB pTcb; + PRT_TX_LOCAL_BUFFER pBuf; + BOOLEAN ret = TRUE; + u4Byte BufLen; + pu1Byte BufAddr; + u1Byte DescLen = 0, Idx = 0, NDPTxRate; + PADAPTER pDefAdapter = GetDefaultAdapter(Adapter); + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + PRT_BEAMFORMING_ENTRY pBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + if(pBeamformEntry == NULL) + return FALSE; + + NDPTxRate = Beamforming_GetHTNDPTxRate(Adapter, pBeamformEntry->CompSteeringNumofBFer); + RT_DISP(FBEAM, FBEAM_FUN, ("%s, NDPTxRate =%d\n", __FUNCTION__, NDPTxRate)); + PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); + + if(MgntGetFWBuffer(pDefAdapter, &pTcb, &pBuf)) + { +#if(DEV_BUS_TYPE != RT_PCI_INTERFACE) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + DescLen = Adapter->HWDescHeadLength - pHalData->USBALLDummyLength; +#endif + BufAddr = pBuf->Buffer.VirtualAddress + DescLen; + + ConstructHTNDPAPacket( + Adapter, + RA, + BufAddr, + &BufLen, + BW + ); + + pTcb->PacketLength = BufLen + DescLen; + + pTcb->bTxEnableSwCalcDur = TRUE; + + pTcb->BWOfPacket = BW; + + if(ACTING_AS_IBSS(Adapter) || ACTING_AS_AP(Adapter)) + pTcb->G_ID = 63; + + pTcb->P_AID = pBeamformEntry->P_AID; + pTcb->DataRate = NDPTxRate; /*rate of NDP decide by Nr*/ + + Adapter->HalFunc.CmdSendPacketHandler(Adapter, pTcb, pBuf, pTcb->PacketLength, DESC_PACKET_TYPE_NORMAL, FALSE); + } + else + ret = FALSE; + + PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); + + if(ret) + RT_DISP_DATA(FBEAM, FBEAM_DATA, "", pBuf->Buffer.VirtualAddress, pTcb->PacketLength); + + return ret; +} + + +BOOLEAN +SendSWHTNDPAPacket( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN CHANNEL_WIDTH BW + ) +{ + PRT_TCB pTcb; + PRT_TX_LOCAL_BUFFER pBuf; + BOOLEAN ret = TRUE; + u1Byte Idx = 0, NDPTxRate = 0; + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + PRT_BEAMFORMING_ENTRY pBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + NDPTxRate = Beamforming_GetHTNDPTxRate(Adapter, pBeamformEntry->CompSteeringNumofBFer); + RT_DISP(FBEAM, FBEAM_FUN, ("%s, NDPTxRate =%d\n", __FUNCTION__, NDPTxRate)); + + PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); + + if(MgntGetBuffer(Adapter, &pTcb, &pBuf)) + { + ConstructHTNDPAPacket( + Adapter, + RA, + pBuf->Buffer.VirtualAddress, + &pTcb->PacketLength, + BW + ); + + pTcb->bTxEnableSwCalcDur = TRUE; + + pTcb->BWOfPacket = BW; + + MgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, NDPTxRate); + } + else + ret = FALSE; + + PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); + + if(ret) + RT_DISP_DATA(FBEAM, FBEAM_DATA, "", pBuf->Buffer.VirtualAddress, pTcb->PacketLength); + + return ret; +} + + + + +BOOLEAN +Beamforming_SendHTNDPAPacket( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN CHANNEL_WIDTH BW, + IN u1Byte QIdx + ) +{ + BOOLEAN ret = TRUE; + + if(QIdx == BEACON_QUEUE) + ret = SendFWHTNDPAPacket(Adapter, RA, BW); + else + ret = SendSWHTNDPAPacket(Adapter, RA, BW); + + return ret; +} + + +VOID +ConstructVHTNDPAPacket( + PADAPTER Adapter, + pu1Byte RA, + u2Byte AID, + pu1Byte Buffer, + pu4Byte pLength, + CHANNEL_WIDTH BW + ) +{ + u2Byte Duration= 0; + u1Byte Sequence = 0; + pu1Byte pNDPAFrame = Buffer; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo); + RT_NDPA_STA_INFO STAInfo; + + // Frame control. + SET_80211_HDR_FRAME_CONTROL(pNDPAFrame, 0); + SET_80211_HDR_TYPE_AND_SUBTYPE(pNDPAFrame, Type_NDPA); + + SET_80211_HDR_ADDRESS1(pNDPAFrame, RA); + SET_80211_HDR_ADDRESS2(pNDPAFrame, Adapter->CurrentAddress); + + Duration = 2*aSifsTime + 44; + + if(BW == CHANNEL_WIDTH_80) + Duration += 40; + else if(BW == CHANNEL_WIDTH_40) + Duration+= 87; + else + Duration+= 180; + + SET_80211_HDR_DURATION(pNDPAFrame, Duration); + + Sequence = pMgntInfo->SoundingSequence << 2; + PlatformMoveMemory(pNDPAFrame+16, &Sequence,1); + + if( ACTING_AS_IBSS(Adapter) || + (ACTING_AS_AP(Adapter) == FALSE)) + AID = 0; + + STAInfo.AID = AID; + STAInfo.FeedbackType = 0; + STAInfo.NcIndex = 0; + + PlatformMoveMemory(pNDPAFrame+17, (pu1Byte)&STAInfo, 2); + + *pLength = 19; +} + +BOOLEAN +SendFWVHTNDPAPacket( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN u2Byte AID, + IN CHANNEL_WIDTH BW + ) +{ + PRT_TCB pTcb; + PRT_TX_LOCAL_BUFFER pBuf; + BOOLEAN ret = TRUE; + u4Byte BufLen; + pu1Byte BufAddr; + u1Byte DescLen = 0, Idx = 0, NDPTxRate = 0; + PADAPTER pDefAdapter = GetDefaultAdapter(Adapter); + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + PRT_BEAMFORMING_ENTRY pBeamformEntry =phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + if(pBeamformEntry == NULL) + return FALSE; + + NDPTxRate = Beamforming_GetVHTNDPTxRate(Adapter, pBeamformEntry->CompSteeringNumofBFer); + RT_DISP(FBEAM, FBEAM_FUN, ("%s, NDPTxRate =%d\n", __FUNCTION__, NDPTxRate)); + + PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); + + if(MgntGetFWBuffer(pDefAdapter, &pTcb, &pBuf)) + { +#if(DEV_BUS_TYPE != RT_PCI_INTERFACE) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + DescLen = Adapter->HWDescHeadLength - pHalData->USBALLDummyLength; +#endif + BufAddr = pBuf->Buffer.VirtualAddress + DescLen; + + ConstructVHTNDPAPacket( + Adapter, + RA, + AID, + BufAddr, + &BufLen, + BW + ); + + pTcb->PacketLength = BufLen + DescLen; + + pTcb->bTxEnableSwCalcDur = TRUE; + + pTcb->BWOfPacket = BW; + + if(ACTING_AS_IBSS(Adapter) || ACTING_AS_AP(Adapter)) + pTcb->G_ID = 63; + + pTcb->P_AID = pBeamformEntry->P_AID; + pTcb->DataRate = NDPTxRate; /*decide by Nr*/ + + Adapter->HalFunc.CmdSendPacketHandler(Adapter, pTcb, pBuf, pTcb->PacketLength, DESC_PACKET_TYPE_NORMAL, FALSE); + } + else + ret = FALSE; + + PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); + + RT_DISP(FBEAM, FBEAM_FUN, ("@%s End, ret=%d \n", __FUNCTION__,ret)); + + if(ret) + RT_DISP_DATA(FBEAM, FBEAM_DATA, "", pBuf->Buffer.VirtualAddress, pTcb->PacketLength); + + return ret; +} + + +BOOLEAN +SendSWVHTNDPAPacket( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN u2Byte AID, + IN CHANNEL_WIDTH BW + ) +{ + PRT_TCB pTcb; + PRT_TX_LOCAL_BUFFER pBuf; + BOOLEAN ret = TRUE; + u1Byte Idx = 0, NDPTxRate = 0; + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + PRT_BEAMFORMING_ENTRY pBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + NDPTxRate = Beamforming_GetVHTNDPTxRate(Adapter, pBeamformEntry->CompSteeringNumofBFer); + RT_DISP(FBEAM, FBEAM_FUN, ("%s, NDPTxRate =%d\n", __FUNCTION__, NDPTxRate)); + + PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); + + if(MgntGetBuffer(Adapter, &pTcb, &pBuf)) + { + ConstructVHTNDPAPacket( + Adapter, + RA, + AID, + pBuf->Buffer.VirtualAddress, + &pTcb->PacketLength, + BW + ); + + pTcb->bTxEnableSwCalcDur = TRUE; + pTcb->BWOfPacket = BW; + + /*rate of NDP decide by Nr*/ + MgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, NDPTxRate); + } + else + ret = FALSE; + + PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); + + RT_DISP(FBEAM, FBEAM_FUN, ("%s\n", __FUNCTION__)); + + if(ret) + RT_DISP_DATA(FBEAM, FBEAM_DATA, "", pBuf->Buffer.VirtualAddress, pTcb->PacketLength); + + return ret; +} + + + +BOOLEAN +Beamforming_SendVHTNDPAPacket( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN u2Byte AID, + IN CHANNEL_WIDTH BW, + IN u1Byte QIdx + ) +{ + BOOLEAN ret = TRUE; + + if(QIdx == BEACON_QUEUE) + ret = SendFWVHTNDPAPacket(Adapter, RA, AID, BW); + else + ret = SendSWVHTNDPAPacket(Adapter, RA, AID, BW); + + return ret; +} + + +BEAMFORMING_NOTIFY_STATE +phydm_beamfomring_bSounding( + IN PVOID pDM_VOID, + PRT_BEAMFORMING_INFO pBeamInfo, + pu1Byte Idx + ) +{ + BEAMFORMING_NOTIFY_STATE bSounding = BEAMFORMING_NOTIFY_NONE; + RT_BEAMFORMING_OID_INFO BeamOidInfo = pBeamInfo->BeamformingOidInfo; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + +// if(( Beamforming_GetBeamCap(pBeamInfo) & BEAMFORMER_CAP) == 0) +// bSounding = BEAMFORMING_NOTIFY_RESET; + if(BeamOidInfo.SoundOidMode == SOUNDING_STOP_All_TIMER) + bSounding = BEAMFORMING_NOTIFY_RESET; + else + { + u1Byte i; + + for(i=0;iBeamformeeEntry[i].bUsed, pBeamInfo->BeamformeeEntry[i].bSound)); + if(pBeamInfo->BeamformeeEntry[i].bUsed && (!pBeamInfo->BeamformeeEntry[i].bSound)) + { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: Add BFee entry %d\n", __FUNCTION__, i)); + *Idx = i; + bSounding = BEAMFORMING_NOTIFY_ADD; + } + + if((!pBeamInfo->BeamformeeEntry[i].bUsed) && pBeamInfo->BeamformeeEntry[i].bSound) + { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: Delete BFee entry %d\n", __FUNCTION__, i)); + *Idx = i; + bSounding = BEAMFORMING_NOTIFY_DELETE; + } + } + } + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s End, bSounding = %d\n", __FUNCTION__, bSounding) ); + return bSounding; +} + + +//This function is unused +u1Byte +phydm_beamforming_SoundingIdx( + IN PVOID pDM_VOID, + PRT_BEAMFORMING_INFO pBeamInfo + ) +{ + u1Byte Idx = 0; + RT_BEAMFORMING_ENTRY BeamEntry; + RT_BEAMFORMING_OID_INFO BeamOidInfo = pBeamInfo->BeamformingOidInfo; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if( BeamOidInfo.SoundOidMode == SOUNDING_SW_HT_TIMER || BeamOidInfo.SoundOidMode == SOUNDING_SW_VHT_TIMER || + BeamOidInfo.SoundOidMode == SOUNDING_HW_HT_TIMER || BeamOidInfo.SoundOidMode == SOUNDING_HW_VHT_TIMER) + Idx = BeamOidInfo.SoundOidIdx; + else + { + u1Byte i; + for(i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) + { + if( pBeamInfo->BeamformeeEntry[i].bUsed && + (FALSE == pBeamInfo->BeamformeeEntry[i].bSound)) + { + Idx = i; + break; + } + } + } + + return Idx; +} + + +SOUNDING_MODE +phydm_beamforming_SoundingMode( + IN PVOID pDM_VOID, + PRT_BEAMFORMING_INFO pBeamInfo, + u1Byte Idx + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte SupportInterface = pDM_Odm->SupportInterface; + + RT_BEAMFORMING_ENTRY BeamEntry = pBeamInfo->BeamformeeEntry[Idx]; + RT_BEAMFORMING_OID_INFO BeamOidInfo = pBeamInfo->BeamformingOidInfo; + SOUNDING_MODE Mode = BeamOidInfo.SoundOidMode; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); +// RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s: OID mode is %d\n", __FUNCTION__, BeamOidInfo.SoundOidMode)); + + if(BeamOidInfo.SoundOidMode == SOUNDING_SW_VHT_TIMER || BeamOidInfo.SoundOidMode == SOUNDING_HW_VHT_TIMER) + { + if(BeamEntry.BeamformEntryCap & BEAMFORMER_CAP_VHT_SU) + Mode = BeamOidInfo.SoundOidMode; + else + Mode = SOUNDING_STOP_All_TIMER; + } + else if(BeamOidInfo.SoundOidMode == SOUNDING_SW_HT_TIMER || BeamOidInfo.SoundOidMode == SOUNDING_HW_HT_TIMER) + { + if(BeamEntry.BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT) + Mode = BeamOidInfo.SoundOidMode; + else + Mode = SOUNDING_STOP_All_TIMER; + } + else if(BeamEntry.BeamformEntryCap & BEAMFORMER_CAP_VHT_SU) + { + if((SupportInterface == ODM_ITRF_USB) && (pDM_Odm->SupportICType!= ODM_RTL8814A)) + Mode = SOUNDING_FW_VHT_TIMER; + else + Mode = SOUNDING_SW_VHT_TIMER; + } + else if(BeamEntry.BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT) + { + if((SupportInterface == ODM_ITRF_USB) && (pDM_Odm->SupportICType != ODM_RTL8814A)) + Mode = SOUNDING_FW_HT_TIMER; + else + Mode = SOUNDING_SW_HT_TIMER; + } + else + Mode = SOUNDING_STOP_All_TIMER; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s End, SupportInterface=%d, Mode=%d \n", __FUNCTION__, SupportInterface, Mode)); + + return Mode; +} + + +u2Byte +phydm_beamforming_SoundingTime( + IN PVOID pDM_VOID, + PRT_BEAMFORMING_INFO pBeamInfo, + SOUNDING_MODE Mode, + u1Byte Idx + ) +{ + u2Byte SoundingTime = 0xffff; + RT_BEAMFORMING_ENTRY BeamEntry = pBeamInfo->BeamformeeEntry[Idx]; + RT_BEAMFORMING_OID_INFO BeamOidInfo = pBeamInfo->BeamformingOidInfo; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(Mode == SOUNDING_HW_HT_TIMER || Mode == SOUNDING_HW_VHT_TIMER) + SoundingTime = BeamOidInfo.SoundOidPeriod * 32; + else if(Mode == SOUNDING_SW_HT_TIMER || Mode == SOUNDING_SW_VHT_TIMER) + //-@ Modified by David + SoundingTime = BeamEntry.SoundPeriod; //100*32; //BeamOidInfo.SoundOidPeriod; + else + SoundingTime = BeamEntry.SoundPeriod; + + return SoundingTime; +} + + +CHANNEL_WIDTH +phydm_beamforming_SoundingBW( + IN PVOID pDM_VOID, + PRT_BEAMFORMING_INFO pBeamInfo, + SOUNDING_MODE Mode, + u1Byte Idx + ) +{ + CHANNEL_WIDTH SoundingBW = CHANNEL_WIDTH_20; + RT_BEAMFORMING_ENTRY BeamEntry = pBeamInfo->BeamformeeEntry[Idx]; + RT_BEAMFORMING_OID_INFO BeamOidInfo = pBeamInfo->BeamformingOidInfo; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(Mode == SOUNDING_HW_HT_TIMER || Mode == SOUNDING_HW_VHT_TIMER) + SoundingBW = BeamOidInfo.SoundOidBW; + else if(Mode == SOUNDING_SW_HT_TIMER || Mode == SOUNDING_SW_VHT_TIMER) + //-@ Modified by David + SoundingBW = BeamEntry.SoundBW; //BeamOidInfo.SoundOidBW; + else + SoundingBW = BeamEntry.SoundBW; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s, SoundingBW=0x%X \n", __FUNCTION__, SoundingBW) ); + + return SoundingBW; +} + + +BOOLEAN +phydm_Beamforming_SelectBeamEntry( + IN PVOID pDM_VOID, + PRT_BEAMFORMING_INFO pBeamInfo + ) +{ + PRT_SOUNDING_INFO pSoundInfo = &(pBeamInfo->SoundingInfo); + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + // pEntry.bSound is different between first and latter NDPA, and should not be used as BFee entry selection + // BTW, latter modification should sync to the selection mechanism of AP/ADSL instead of the fixed SoundIdx. + //pSoundInfo->SoundIdx = phydm_beamforming_SoundingIdx(pDM_Odm, pBeamInfo); + pSoundInfo->SoundIdx = 0; + + if(pSoundInfo->SoundIdx < BEAMFORMEE_ENTRY_NUM) + pSoundInfo->SoundMode = phydm_beamforming_SoundingMode(pDM_Odm, pBeamInfo, pSoundInfo->SoundIdx); + else + pSoundInfo->SoundMode = SOUNDING_STOP_All_TIMER; + + if(SOUNDING_STOP_All_TIMER == pSoundInfo->SoundMode) + return FALSE; + else + { + pSoundInfo->SoundBW = phydm_beamforming_SoundingBW(pDM_Odm, pBeamInfo, pSoundInfo->SoundMode, pSoundInfo->SoundIdx ); + pSoundInfo->SoundPeriod = phydm_beamforming_SoundingTime(pDM_Odm, pBeamInfo, pSoundInfo->SoundMode, pSoundInfo->SoundIdx ); + return TRUE; + } +} + + +BOOLEAN +phydm_beamforming_StartPeriod( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PADAPTER Adapter = pDM_Odm->Adapter; + BOOLEAN Ret = TRUE; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + PRT_SOUNDING_INFO pSoundInfo = &(pBeamInfo->SoundingInfo); + + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + phydm_Beamforming_DymNDPARate(pDM_Odm); + + phydm_Beamforming_SelectBeamEntry(pDM_Odm, pBeamInfo); // Modified + + + if(pSoundInfo->SoundMode == SOUNDING_SW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_SW_HT_TIMER) + ODM_SetTimer(pDM_Odm, &pBeamInfo->BeamformingTimer, pSoundInfo->SoundPeriod); + else if(pSoundInfo->SoundMode == SOUNDING_HW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_HW_HT_TIMER || + pSoundInfo->SoundMode == SOUNDING_AUTO_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_AUTO_HT_TIMER) + { + HAL_HW_TIMER_TYPE TimerType = HAL_TIMER_TXBF; + u4Byte val = (pSoundInfo->SoundPeriod | (TimerType<<16)); + + //HW timer stop: All IC has the same setting + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_STOP, (pu1Byte)(&TimerType)); + //ODM_Write1Byte(pDM_Odm, 0x15F, 0); + //HW timer init: All IC has the same setting, but 92E & 8812A only write 2 bytes + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_INIT, (pu1Byte)(&val)); + //ODM_Write1Byte(pDM_Odm, 0x164, 1); + //ODM_Write4Byte(pDM_Odm, 0x15C, val); + //HW timer start: All IC has the same setting + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_START, (pu1Byte)(&TimerType)); + //ODM_Write1Byte(pDM_Odm, 0x15F, 0x5); + } + else if(pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER) + { + Ret = BeamformingStart_FW(Adapter, pSoundInfo->SoundIdx); + } + else + Ret = FALSE; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: SoundIdx=%d, SoundMode=%d, SoundBW=%d, SoundPeriod=%d\n", __FUNCTION__, + pSoundInfo->SoundIdx, pSoundInfo->SoundMode, pSoundInfo->SoundBW, pSoundInfo->SoundPeriod)); + + return Ret; +} + +// Used after Beamforming_Leave, and will clear the setting of the "already deleted" entry +VOID +phydm_beamforming_EndPeriod_SW( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PADAPTER Adapter = pDM_Odm->Adapter; + u1Byte Idx = 0; + PRT_BEAMFORMING_ENTRY pBeamformEntry; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + PRT_SOUNDING_INFO pSoundInfo = &(pBeamInfo->SoundingInfo); + + HAL_HW_TIMER_TYPE TimerType = HAL_TIMER_TXBF; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(pSoundInfo->SoundMode == SOUNDING_SW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_SW_HT_TIMER) + ODM_CancelTimer(pDM_Odm, &pBeamInfo->BeamformingTimer); + else if( pSoundInfo->SoundMode == SOUNDING_HW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_HW_HT_TIMER || + pSoundInfo->SoundMode == SOUNDING_AUTO_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_AUTO_HT_TIMER) + //HW timer stop: All IC has the same setting + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_STOP, (pu1Byte)(&TimerType)); + //ODM_Write1Byte(pDM_Odm, 0x15F, 0); +} + +VOID +phydm_beamforming_EndPeriod_FW( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + phydm_Beamforming_End_FW(pDM_Odm); +} + + + +VOID +phydm_beamforming_ClearEntry_SW( + IN PVOID pDM_VOID, + BOOLEAN IsDelete, + u1Byte DeleteIdx + ) +{ + u1Byte Idx = 0; + PRT_BEAMFORMING_ENTRY pBeamformEntry = NULL; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(IsDelete) + { + if(DeleteIdxBeamformeeEntry + DeleteIdx; + + if(!((!pBeamformEntry->bUsed) && pBeamformEntry->bSound)) + { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: SW DeleteIdx is wrong!!!!! \n",__FUNCTION__)); + return; + } + } + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: SW delete BFee entry %d \n", __FUNCTION__, DeleteIdx)); + if(pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING) + { + pBeamformEntry->bBeamformingInProgress = FALSE; + pBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; + } + else if(pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) + { + pBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; + HalComTxbf_Set(pDM_Odm->Adapter, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&DeleteIdx); + } + + pBeamformEntry->bSound = FALSE; + } + else + { + for(Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) + { + pBeamformEntry = pBeamInfo->BeamformeeEntry+Idx; + + // Used after bSounding=RESET, and will clear the setting of "ever sounded" entry, which is not necessarily be deleted. + // This function is mainly used in case "BeamOidInfo.SoundOidMode == SOUNDING_STOP_All_TIMER". + // However, setting oid doesn't delete entries (bUsed is still TRUE), new entries may fail to be added in. + + if(pBeamformEntry->bSound) + { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: SW reset BFee entry %d \n", __FUNCTION__, Idx)); + /* + * If End procedure is + * 1. Between (Send NDPA, C2H packet return), reset state to initialized. + * After C2H packet return , status bit will be set to zero. + * + * 2. After C2H packet, then reset state to initialized and clear status bit. + */ + + if(pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING) + phydm_Beamforming_End_SW(pDM_Odm, 0); + else if(pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) + { + pBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZED; + HalComTxbf_Set(pDM_Odm->Adapter, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&Idx); + } + + pBeamformEntry->bSound = FALSE; + } + } + } +} + +VOID +phydm_beamforming_ClearEntry_FW( + IN PVOID pDM_VOID, + BOOLEAN IsDelete, + u1Byte DeleteIdx + ) +{ + u1Byte Idx = 0; + PRT_BEAMFORMING_ENTRY pBeamformEntry = NULL; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(IsDelete) + { + if(DeleteIdxBeamformeeEntry + DeleteIdx; + + if(!((!pBeamformEntry->bUsed) && pBeamformEntry->bSound)) + { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: FW DeleteIdx is wrong!!!!! \n",__FUNCTION__)); + return; + } + } + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: FW delete BFee entry %d \n", __FUNCTION__, DeleteIdx)); + pBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; + pBeamformEntry->bSound = FALSE; + } + else + { + for(Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) + { + pBeamformEntry = pBeamInfo->BeamformeeEntry+Idx; + + // Used after bSounding=RESET, and will clear the setting of "ever sounded" entry, which is not necessarily be deleted. + // This function is mainly used in case "BeamOidInfo.SoundOidMode == SOUNDING_STOP_All_TIMER". + // However, setting oid doesn't delete entries (bUsed is still TRUE), new entries may fail to be added in. + + if(pBeamformEntry->bSound) + { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: FW reset BFee entry %d \n", __FUNCTION__, Idx)); + /* + * If End procedure is + * 1. Between (Send NDPA, C2H packet return), reset state to initialized. + * After C2H packet return , status bit will be set to zero. + * + * 2. After C2H packet, then reset state to initialized and clear status bit. + */ + + pBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZED; + pBeamformEntry->bSound = FALSE; + } + } + } +} + +/* +* Called : +* 1. Add and delete entry : Beamforming_Enter/Beamforming_Leave +* 2. FW trigger : Beamforming_SetTxBFen +* 3. Set OID_RT_BEAMFORMING_PERIOD : BeamformingControl_V2 +*/ +VOID +phydm_Beamforming_Notify( + IN PVOID pDM_VOID + ) +{ + u1Byte Idx=BEAMFORMEE_ENTRY_NUM; + BEAMFORMING_NOTIFY_STATE bSounding = BEAMFORMING_NOTIFY_NONE; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + PRT_SOUNDING_INFO pSoundInfo = &(pBeamInfo->SoundingInfo); + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + bSounding = phydm_beamfomring_bSounding(pDM_Odm, pBeamInfo, &Idx); + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s, Before notify, BeamformState=%d, bSounding=%d, Idx=%d\n", __FUNCTION__, pBeamInfo->BeamformState, bSounding, Idx)); + + if(pBeamInfo->BeamformState == BEAMFORMING_STATE_END) + { + if(bSounding==BEAMFORMING_NOTIFY_ADD) + { + if(phydm_beamforming_StartPeriod(pDM_Odm) == TRUE) + pBeamInfo->BeamformState = BEAMFORMING_STATE_START_1BFee; + } + } + else if(pBeamInfo->BeamformState == BEAMFORMING_STATE_START_1BFee) + { + if(bSounding==BEAMFORMING_NOTIFY_ADD) + { + if(phydm_beamforming_StartPeriod(pDM_Odm) == TRUE) + pBeamInfo->BeamformState = BEAMFORMING_STATE_START_2BFee; + else + pBeamInfo->BeamformState = BEAMFORMING_STATE_START_1BFee; + } + else if(bSounding==BEAMFORMING_NOTIFY_DELETE) + { + if(pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER) + { + phydm_beamforming_ClearEntry_FW(pDM_Odm, TRUE, Idx); // Modified by Jeffery @ 2014-11-04 + phydm_beamforming_EndPeriod_FW(pDM_Odm); + } + else + { + phydm_beamforming_ClearEntry_SW(pDM_Odm, TRUE, Idx); // Modified by Jeffery @ 2014-11-04 + phydm_beamforming_EndPeriod_SW(pDM_Odm); + } + + pBeamInfo->BeamformState = BEAMFORMING_STATE_END; + } + else if(bSounding==BEAMFORMING_NOTIFY_RESET) + { + if(pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER) + { + phydm_beamforming_ClearEntry_FW(pDM_Odm, FALSE, Idx); // Modified by Jeffery @ 2014-11-04 + phydm_beamforming_EndPeriod_FW(pDM_Odm); + } + else + { + phydm_beamforming_ClearEntry_SW(pDM_Odm, FALSE, Idx); // Modified by Jeffery @ 2014-11-04 + phydm_beamforming_EndPeriod_SW(pDM_Odm); + } + + pBeamInfo->BeamformState = BEAMFORMING_STATE_END; + } + } + else if(pBeamInfo->BeamformState == BEAMFORMING_STATE_START_2BFee) + { + if(bSounding==BEAMFORMING_NOTIFY_ADD) + { + RT_ASSERT(FALSE, ("[David]@%s: Should be blocked at InitEntry!!!!! \n", __FUNCTION__)); + } + else if(bSounding==BEAMFORMING_NOTIFY_DELETE) + { + if(pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER) + { + phydm_beamforming_ClearEntry_FW(pDM_Odm, TRUE, Idx); // Modified by Jeffery @ 2014-11-04 + phydm_beamforming_EndPeriod_FW(pDM_Odm); + } + else + { + // For 2->1 entry, we should not cancel SW timer + phydm_beamforming_ClearEntry_SW(pDM_Odm, TRUE, Idx); + } + + pBeamInfo->BeamformState = BEAMFORMING_STATE_START_1BFee; + } + else if(bSounding==BEAMFORMING_NOTIFY_RESET) + { + if(pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER) + { + phydm_beamforming_ClearEntry_FW(pDM_Odm, FALSE, Idx); // Modified by Jeffery @ 2014-11-04 + phydm_beamforming_EndPeriod_FW(pDM_Odm); + } + else + { + phydm_beamforming_ClearEntry_SW(pDM_Odm, FALSE, Idx); // Modified by Jeffery @ 2014-11-04 + phydm_beamforming_EndPeriod_SW(pDM_Odm); + } + + pBeamInfo->BeamformState = BEAMFORMING_STATE_END; + } + } + else + RT_ASSERT(FALSE, ("%s BeamformState %d\n", __FUNCTION__, pBeamInfo->BeamformState)); + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s End, after Notify, BeamformState =%d\n", __FUNCTION__, pBeamInfo->BeamformState)); +} + + + +BOOLEAN +Beamforming_InitEntry( + PADAPTER Adapter, + PRT_WLAN_STA pSTA, + pu1Byte BFerBFeeIdx + ) +{ + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo); + PRT_VERY_HIGH_THROUGHPUT pVHTInfo = GET_VHT_INFO(pMgntInfo); + PRT_BEAMFORMING_ENTRY pBeamformEntry = NULL; + PRT_BEAMFORMER_ENTRY pBeamformerEntry = NULL; + pu1Byte RA; + u2Byte AID, MacID; + WIRELESS_MODE WirelessMode; + CHANNEL_WIDTH BW = CHANNEL_WIDTH_20; + BEAMFORMING_CAP BeamformCap = BEAMFORMING_CAP_NONE; + u1Byte BFerIdx=0xF, BFeeIdx=0xF; + u1Byte NumofSoundingDim = 0, CompSteeringNumofBFer = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__)); + + // The current setting does not support Beaforming + if(BEAMFORMING_CAP_NONE == pHTInfo->HtBeamformCap && BEAMFORMING_CAP_NONE == pVHTInfo->VhtBeamformCap) + { + RT_DISP(FBEAM, FBEAM_ERROR, ("The configuration disabled Beamforming! Skip...\n")); + return FALSE; + } + + // IBSS, AP mode + if(pSTA != NULL) + { + AID = pSTA->AID; + RA = pSTA->MacAddr; + MacID = pSTA->AssociatedMacId; + WirelessMode = pSTA->WirelessMode; + BW = pSTA->BandWidth; + } + else // Client mode + { + AID = pMgntInfo->mAId; + RA = pMgntInfo->Bssid; + MacID = pMgntInfo->mMacId; + WirelessMode = pMgntInfo->dot11CurrentWirelessMode; + BW = pMgntInfo->dot11CurrentChannelBandWidth; + } + + if(WirelessMode < WIRELESS_MODE_N_24G) + return FALSE; + else + { + //3 // HT + u1Byte CurBeamform; + u2Byte CurBeamformVHT; + + if(pSTA != NULL) + CurBeamform = pSTA->HTInfo.HtCurBeamform; + else + CurBeamform = pHTInfo->HtCurBeamform; + + // We are Beamformee because the STA is Beamformer + if(TEST_FLAG(CurBeamform, BEAMFORMING_HT_BEAMFORMER_ENABLE)) + { + BeamformCap =(BEAMFORMING_CAP)(BeamformCap |BEAMFORMEE_CAP_HT_EXPLICIT); + NumofSoundingDim = (CurBeamform&BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP)>>6; + } + + // We are Beamformer because the STA is Beamformee + if( TEST_FLAG(CurBeamform, BEAMFORMING_HT_BEAMFORMEE_ENABLE) || + TEST_FLAG(pHTInfo->HtBeamformCap, BEAMFORMING_HT_BEAMFORMER_TEST)) + { + BeamformCap =(BEAMFORMING_CAP)(BeamformCap | BEAMFORMER_CAP_HT_EXPLICIT); + CompSteeringNumofBFer = (CurBeamform & BEAMFORMING_HT_BEAMFORMER_STEER_NUM)>>4; + } + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s, CurBeamform=0x%X, BeamformCap=0x%X\n", __FUNCTION__, CurBeamform, BeamformCap)); + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s, NumofSoundingDim=%d, CompSteeringNumofBFer=%d\n", __FUNCTION__, NumofSoundingDim, CompSteeringNumofBFer)); + + + if(WirelessMode == WIRELESS_MODE_AC_5G || WirelessMode == WIRELESS_MODE_AC_24G) + { + //3 // VHT + if(pSTA != NULL) + CurBeamformVHT = pSTA->VHTInfo.VhtCurBeamform; + else + CurBeamformVHT = pVHTInfo->VhtCurBeamform; + + // We are Beamformee because the STA is Beamformer + if(TEST_FLAG(CurBeamformVHT, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) + { + BeamformCap =(BEAMFORMING_CAP)(BeamformCap |BEAMFORMEE_CAP_VHT_SU); + NumofSoundingDim = (CurBeamformVHT & BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM)>>12; + } + // We are Beamformer because the STA is Beamformee + if( TEST_FLAG(CurBeamformVHT, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) || + TEST_FLAG(pVHTInfo->VhtBeamformCap, BEAMFORMING_VHT_BEAMFORMER_TEST)) + { + BeamformCap =(BEAMFORMING_CAP)(BeamformCap |BEAMFORMER_CAP_VHT_SU); + CompSteeringNumofBFer = (CurBeamformVHT & BEAMFORMING_VHT_BEAMFORMER_STS_CAP)>>8; + } + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s, CurBeamformVHT=0x%X, BeamformCap=0x%X\n", __FUNCTION__, CurBeamformVHT, BeamformCap)); + RT_DISP(FBEAM, FBEAM_FUN, ("%s, NumofSoundingDim=0x%X, CompSteeringNumofBFer=0x%X\n", __FUNCTION__, NumofSoundingDim, CompSteeringNumofBFer)); + + } + } + + + if(BeamformCap == BEAMFORMING_CAP_NONE) + return FALSE; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s, Self BF Entry Cap = 0x%02X\n", __FUNCTION__, BeamformCap)); + + // We are BFee, so the entry is BFer + if((BeamformCap & BEAMFORMEE_CAP_VHT_SU) || (BeamformCap & BEAMFORMEE_CAP_HT_EXPLICIT)) + { + pBeamformerEntry = phydm_Beamforming_GetBFerEntryByAddr(pDM_Odm, RA, &BFerIdx); + + if(pBeamformerEntry == NULL) + { + pBeamformerEntry = Beamforming_AddBFerEntry(Adapter, RA, AID, BeamformCap, NumofSoundingDim ,&BFerIdx); + + if(pBeamformerEntry == NULL) + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s: Not enough BFer entry!!!!! \n", __FUNCTION__)); + } + } + + // We are BFer, so the entry is BFee + if((BeamformCap & BEAMFORMER_CAP_VHT_SU) || (BeamformCap & BEAMFORMER_CAP_HT_EXPLICIT)) + { + pBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &BFeeIdx); + + // ¦pªGBFeeIdx = 0xF «h¥Nªí¥Ø«eentry·í¤¤¨S¦³¬Û¦PªºMACID¦b¤º + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s: Get BFee entry 0x%X by address \n", __FUNCTION__, BFeeIdx)); + if(pBeamformEntry == NULL) + { + pBeamformEntry = Beamforming_AddBFeeEntry(Adapter, RA, AID, MacID, BW, BeamformCap, NumofSoundingDim, CompSteeringNumofBFer, &BFeeIdx); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s: Add BFee entry %d \n", __FUNCTION__, BFeeIdx)); + + if(pBeamformEntry == NULL) + return FALSE; + else + pBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZEING; + } + else + { + // Entry has been created. If entry is initialing or progressing then errors occur. + if( pBeamformEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_INITIALIZED && + pBeamformEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_PROGRESSED) + { + RT_ASSERT(TRUE, ("Error State of Beamforming")); + return FALSE; + } + else + pBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZEING; + } + + pBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZED; + + } + + *BFerBFeeIdx = (BFerIdx<<4) | BFeeIdx; + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s End: BFerIdx=0x%X, BFeeIdx=0x%X, BFerBFeeIdx=0x%X \n", __FUNCTION__, BFerIdx, BFeeIdx, *BFerBFeeIdx)); + + return TRUE; +} + + +VOID +Beamforming_DeInitEntry( + PADAPTER Adapter, + pu1Byte RA + ) +{ + u1Byte Idx = 0; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + + if(Beamforming_RemoveEntry(Adapter, RA, &Idx) == TRUE) + { + HalComTxbf_Set(Adapter, TXBF_SET_SOUNDING_LEAVE, (pu1Byte)&Idx); + } + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s End, Idx = 0x%X\n", __FUNCTION__, Idx)); +} + + +VOID +Beamforming_Reset( + PADAPTER Adapter + ) +{ + u1Byte Idx = 0; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_BEAMFORMING_INFO pBeamformingInfo = GET_BEAMFORM_INFO(Adapter); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + for(Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) + { + if(pBeamformingInfo->BeamformeeEntry[Idx].bUsed == TRUE) + { + pBeamformingInfo->BeamformeeEntry[Idx].bUsed = FALSE; + pBeamformingInfo->BeamformeeEntry[Idx].BeamformEntryCap = BEAMFORMING_CAP_NONE; + //pBeamformingInfo->BeamformeeEntry[Idx].BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; + //-@ Modified by David + pBeamformingInfo->BeamformeeEntry[Idx].bBeamformingInProgress = FALSE; + HalComTxbf_Set(Adapter, TXBF_SET_SOUNDING_LEAVE, (pu1Byte)&Idx); + } + } + + for(Idx = 0; Idx < BEAMFORMER_ENTRY_NUM; Idx++) + { + pBeamformingInfo->BeamformerEntry[Idx].bUsed = FALSE; + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s, Idx=%d, bUsed=%d \n", __FUNCTION__, Idx, pBeamformingInfo->BeamformerEntry[Idx].bUsed)); + } + +} + + +BOOLEAN +BeamformingStart_V1( + PADAPTER Adapter, + pu1Byte RA, + BOOLEAN Mode, + CHANNEL_WIDTH BW, + u1Byte Rate + ) +{ + u1Byte Idx = 0; + PRT_BEAMFORMING_ENTRY pEntry; + BOOLEAN ret = TRUE; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + pEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx); + + if(pEntry->bUsed == FALSE) + { + RT_DISP_ADDR(FBEAM, FBEAM_ERROR, ("Skip Beamforming, no entry for addr = "), RA); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + else + { + if(pEntry->bBeamformingInProgress) + { + RT_DISP(FBEAM, FBEAM_ERROR, ("bBeamformingInProgress, skip...\n")); + return FALSE; + } + + pEntry->bBeamformingInProgress = TRUE; + + if(Mode == 1) + { + if(!(pEntry->BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT)) + { + RT_DISP_ADDR(FBEAM, FBEAM_ERROR, ("Skip Beamforming, entry without BEAMFORMEE_CAP_HT_EXPLICIT for addr = "), RA); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + } + else if(Mode == 0) + { + if(!(pEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)) + { + RT_DISP_ADDR(FBEAM, FBEAM_ERROR, ("Skip Beamforming, entry without BEAMFORMEE_CAP_VHT_SU for addr = "), RA); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + + } + if( pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_INITIALIZED && + pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_PROGRESSED) + { + RT_DISP_ADDR(FBEAM, FBEAM_ERROR, ("Skip Beamforming, state without (BEAMFORMING_STATE_INITIALIZED | BEAMFORMING_STATE_PROGRESSED) for addr = "), RA); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + else + { + pEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSING; + pEntry->bSound = TRUE; + } + } + + pEntry->SoundBW = BW; + pBeamInfo->BeamformeeCurIdx = Idx; + phydm_Beamforming_NDPARate(pDM_Odm, BW, Rate); + HalComTxbf_Set(Adapter, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&Idx); + + if(Mode == 1) + ret = Beamforming_SendHTNDPAPacket(Adapter,RA, BW, NORMAL_QUEUE); + else + ret = Beamforming_SendVHTNDPAPacket(Adapter,RA, pEntry->AID, BW, NORMAL_QUEUE); + + if(ret == FALSE) + { + RT_DISP_ADDR(FBEAM, FBEAM_ERROR, ("Beamforming_RemoveEntry because of failure sending NDPA for addr = "), RA); +/* Beamforming_RemoveEntry(Adapter, RA, &Idx);*/ + Beamforming_Leave(Adapter, RA); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + + RT_DISP(FBEAM, FBEAM_FUN, ("%s Idx %d\n", __FUNCTION__, Idx)); + return TRUE; +} + + +BOOLEAN +BeamformingStart_SW( + PADAPTER Adapter, + u1Byte Idx, + u1Byte Mode, + CHANNEL_WIDTH BW + ) +{ + pu1Byte RA = NULL; + PRT_BEAMFORMING_ENTRY pEntry; + BOOLEAN ret = TRUE; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO(Adapter); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + pEntry = &(pBeamInfo->BeamformeeEntry[Idx]); + + if(pEntry->bUsed == FALSE) + { + RT_DISP(FBEAM, FBEAM_ERROR, ("Skip Beamforming, no entry for Idx =%d\n", Idx)); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + else + { + if(pEntry->bBeamformingInProgress) + { + RT_DISP(FBEAM, FBEAM_ERROR, ("bBeamformingInProgress, skip...\n")); + return FALSE; + } + + pEntry->bBeamformingInProgress = TRUE; + + RA = pEntry->MacAddr; + + if(Mode == SOUNDING_SW_HT_TIMER || Mode == SOUNDING_HW_HT_TIMER || Mode == SOUNDING_AUTO_HT_TIMER) + { + if(!(pEntry->BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT)) + { + RT_DISP_ADDR(FBEAM, FBEAM_ERROR, ("Skip Beamforming, entry without BEAMFORMEE_CAP_HT_EXPLICIT for addr = "), RA); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + } + else if(Mode == SOUNDING_SW_VHT_TIMER || Mode == SOUNDING_HW_VHT_TIMER || Mode == SOUNDING_AUTO_VHT_TIMER) + { + if(!(pEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)) + { + RT_DISP_ADDR(FBEAM, FBEAM_ERROR, ("Skip Beamforming, entry without BEAMFORMEE_CAP_VHT_SU for addr = "), RA); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + + } + if( pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_INITIALIZED && + pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_PROGRESSED) + { + RT_DISP_ADDR(FBEAM, FBEAM_ERROR, ("Skip Beamforming, state without (BEAMFORMING_STATE_INITIALIZED | BEAMFORMING_STATE_PROGRESSED) for addr = "), RA); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + else + { + pEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSING; + pEntry->bSound = TRUE; + } + } + + pBeamInfo->BeamformeeCurIdx = Idx; +//2014.12.22 Luke: Need to be checked + /*GET_TXBF_INFO(Adapter)->fTxbfSet(Adapter, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&Idx);*/ + + if(Mode == SOUNDING_SW_HT_TIMER || Mode == SOUNDING_HW_HT_TIMER || Mode == SOUNDING_AUTO_HT_TIMER) + ret = Beamforming_SendHTNDPAPacket(Adapter,RA, BW, NORMAL_QUEUE); + else + ret = Beamforming_SendVHTNDPAPacket(Adapter,RA, pEntry->AID, BW, NORMAL_QUEUE); + + if(ret == FALSE) + { + RT_DISP_ADDR(FBEAM, FBEAM_ERROR, ("Beamforming_RemoveEntry because of failure sending NDPA for addr = "), RA); + Beamforming_Leave(Adapter, RA); + pEntry->bBeamformingInProgress = FALSE; + return FALSE; + } + + if(Mode == SOUNDING_SW_HT_TIMER || Mode == SOUNDING_HW_HT_TIMER || Mode == SOUNDING_AUTO_HT_TIMER) + { + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s: Send HT NDPA for current idx=%d\n", __FUNCTION__, Idx)); + } + else + { + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s: Send VHT NDPA for current idx=%d\n", __FUNCTION__, Idx)); + } + + return TRUE; +} + + +BOOLEAN +BeamformingStart_FW( + PADAPTER Adapter, + u1Byte Idx + ) +{ + pu1Byte RA = NULL; + PRT_BEAMFORMING_ENTRY pEntry; + BOOLEAN ret = TRUE; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO(Adapter); + + pEntry = &(pBeamInfo->BeamformeeEntry[Idx]); + if(pEntry->bUsed == FALSE) + { + RT_DISP(FBEAM, FBEAM_ERROR, ("Skip Beamforming, no entry for Idx =%d\n", Idx)); + return FALSE; + } + + pEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSING; + pEntry->bSound = TRUE; + HalComTxbf_Set(Adapter, TXBF_SET_SOUNDING_FW_NDPA, (pu1Byte)&Idx); + + RT_DISP(FBEAM, FBEAM_FUN, ("@%s End, Idx=0x%X \n", __FUNCTION__, Idx)); + return TRUE; +} + +VOID +Beamforming_CheckSoundingSuccess( + PADAPTER Adapter, + BOOLEAN Status +) +{ + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO(Adapter); + PRT_BEAMFORMING_ENTRY pEntry = &(pBeamInfo->BeamformeeEntry[pBeamInfo->BeamformeeCurIdx]); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + if(Status == 1) + { + pEntry->LogStatusFailCnt = 0; + } + else if(pEntry->LogStatusFailCnt <= 20) + { + pEntry->LogStatusFailCnt++; + RT_DISP(FBEAM, FBEAM_ERROR, ("%s LogStatusFailCnt %d\n", __FUNCTION__, pEntry->LogStatusFailCnt)); + } + if(pEntry->LogStatusFailCnt > 20) + { + RT_DISP(FBEAM, FBEAM_ERROR, ("%s LogStatusFailCnt > 20, Stop SOUNDING\n", __FUNCTION__)); + pEntry->bSound = FALSE; + HalComTxbf_Set(Adapter, TXBF_SET_SOUNDING_FW_NDPA, (pu1Byte)&pBeamInfo->BeamformeeCurIdx); + Beamforming_DeInitEntry(Adapter, pEntry->MacAddr); + + //-@ Modified by David - Every action of deleting entry should follow by Notify + phydm_Beamforming_Notify(pDM_Odm); + } +} + +VOID +phydm_Beamforming_End_SW( + IN PVOID pDM_VOID, + BOOLEAN Status + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + PRT_BEAMFORMING_ENTRY pEntry = &(pBeamInfo->BeamformeeEntry[pBeamInfo->BeamformeeCurIdx]); + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_PROGRESSING) + { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s BeamformStatus %d\n", __FUNCTION__, pEntry->BeamformEntryState)); + return; + } + + if(Status == 1) + { + pEntry->LogStatusFailCnt = 0; + pEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSED; + HalComTxbf_Set(pDM_Odm->Adapter, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&(pBeamInfo->BeamformeeCurIdx)); + } + else + { + pEntry->LogStatusFailCnt++; + pEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZED; + HalComTxbf_Set(pDM_Odm->Adapter, TXBF_SET_TX_PATH_RESET, (pu1Byte)&(pBeamInfo->BeamformeeCurIdx)); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s LogStatusFailCnt %d\n", __FUNCTION__, pEntry->LogStatusFailCnt)); + } + if(pEntry->LogStatusFailCnt > 50) + { + RT_DISP(FBEAM, FBEAM_ERROR, ("%s LogStatusFailCnt > 50, Stop SOUNDING\n", __FUNCTION__)); + pEntry->bSound = FALSE; + Beamforming_DeInitEntry(pDM_Odm->Adapter, pEntry->MacAddr); + + /*Modified by David - Every action of deleting entry should follow by Notify*/ + phydm_Beamforming_Notify(pDM_Odm); + } + pEntry->bBeamformingInProgress = FALSE; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: Status=%d\n", __FUNCTION__, Status)); +} + + +VOID +phydm_Beamforming_End_FW( + IN PVOID pDM_VOID + ) +{ + u1Byte Idx = 0; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PADAPTER Adapter = pDM_Odm->Adapter; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start! \n", __FUNCTION__) ); + HalComTxbf_Set(Adapter, TXBF_SET_SOUNDING_FW_NDPA, (pu1Byte)&Idx); + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s End! \n", __FUNCTION__)); +} + + +VOID +Beamforming_TimerCallback( + PADAPTER Adapter + ) +{ + BOOLEAN ret = FALSE; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_BEAMFORMING_INFO pBeamInfo = GET_BEAMFORM_INFO(Adapter); + PRT_BEAMFORMING_ENTRY pEntry = &(pBeamInfo->BeamformeeEntry[pBeamInfo->BeamformeeCurIdx]); + PRT_SOUNDING_INFO pSoundInfo = &(pBeamInfo->SoundingInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(pEntry->bBeamformingInProgress) + { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("bBeamformingInProgress, reset it\n")); + phydm_Beamforming_End_SW(pDM_Odm, 0); + } + + ret = phydm_Beamforming_SelectBeamEntry(pDM_Odm, pBeamInfo); + + if(ret) + ret = BeamformingStart_SW(Adapter,pSoundInfo->SoundIdx, pSoundInfo->SoundMode, pSoundInfo->SoundBW); + + if(ret) + ; + else + { + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s, Error value return from BeamformingStart_V2 \n", __FUNCTION__)); + } + + if(pBeamInfo->BeamformState >= BEAMFORMING_STATE_START_1BFee) + { + if(pSoundInfo->SoundMode == SOUNDING_SW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_SW_HT_TIMER) + ODM_SetTimer(pDM_Odm, &pBeamInfo->BeamformingTimer, pSoundInfo->SoundPeriod); + else + { + u4Byte val = (pSoundInfo->SoundPeriod << 16) | HAL_TIMER_TXBF; + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_RESTART, (pu1Byte)(&val)); + } + } +} + + +VOID +Beamforming_SWTimerCallback( + PRT_TIMER pTimer + ) +{ + PADAPTER Adapter=(PADAPTER)pTimer->Adapter; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start!\n", __FUNCTION__) ); + + Beamforming_TimerCallback(Adapter); +} + + +VOID +phydm_Beamforming_Init( + IN PVOID pDM_VOID + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + PHAL_TXBF_INFO pTxbfInfo = &pBeamInfo->TxbfInfo; + PRT_BEAMFORMING_OID_INFO pBeamOidInfo = &(pBeamInfo->BeamformingOidInfo); + + RT_DISP(FBEAM, FBEAM_FUN, ("%s Start!\n", __FUNCTION__) ); + + pBeamOidInfo->SoundOidMode = SOUNDING_STOP_OID_TIMER; + RT_DISP(FBEAM, FBEAM_FUN, ("%s Mode (%d)\n", __FUNCTION__, pBeamOidInfo->SoundOidMode)); +} + + +VOID +Beamforming_Enter( + PADAPTER Adapter, + PRT_WLAN_STA pSTA +) +{ + u1Byte BFerBFeeIdx = 0xff; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start! \n", __FUNCTION__) ); + + if(Beamforming_InitEntry(Adapter, pSTA, &BFerBFeeIdx)) + HalComTxbf_Set(Adapter, TXBF_SET_SOUNDING_ENTER, (pu1Byte)&BFerBFeeIdx); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s End! \n", __FUNCTION__) ); +} + + +VOID +Beamforming_Leave( + PADAPTER Adapter, + pu1Byte RA + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s Start! \n", __FUNCTION__) ); + + if(RA == NULL) + Beamforming_Reset(Adapter); + else + Beamforming_DeInitEntry(Adapter, RA); + + phydm_Beamforming_Notify(pDM_Odm); + + RT_DISP(FBEAM, FBEAM_FUN, ("[David]@%s End!! \n", __FUNCTION__)); +} + +//Nobody calls this function +VOID +phydm_Beamforming_SetTxBFen( + IN PVOID pDM_VOID, + u1Byte MacId, + BOOLEAN bTxBF + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte Idx = 0; + PRT_BEAMFORMING_ENTRY pEntry; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + pEntry = phydm_Beamforming_GetEntryByMacId(pDM_Odm, MacId, &Idx); + + if(pEntry == NULL) + return; + else + pEntry->bTxBF = bTxBF; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s MacId %d TxBF %d\n", __FUNCTION__, pEntry->MacId, pEntry->bTxBF)); + + phydm_Beamforming_Notify(pDM_Odm); +} + + +BEAMFORMING_CAP +phydm_Beamforming_GetBeamCap( + IN PVOID pDM_VOID, + IN PRT_BEAMFORMING_INFO pBeamInfo + ) +{ + u1Byte i; + BOOLEAN bSelfBeamformer = FALSE; + BOOLEAN bSelfBeamformee = FALSE; + RT_BEAMFORMING_ENTRY BeamformeeEntry; + RT_BEAMFORMER_ENTRY BeamformerEntry; + BEAMFORMING_CAP BeamformCap = BEAMFORMING_CAP_NONE; + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + /* + for(i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) + { + BeamformEntry = pBeamInfo->BeamformeeEntry[i]; + + if(BeamformEntry.bUsed) + { + if( (BeamformEntry.BeamformEntryCap & BEAMFORMEE_CAP_VHT_SU) || + (BeamformEntry.BeamformEntryCap & BEAMFORMEE_CAP_HT_EXPLICIT)) + bSelfBeamformee = TRUE; + if( (BeamformEntry.BeamformEntryCap & BEAMFORMER_CAP_VHT_SU) || + (BeamformEntry.BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT)) + bSelfBeamformer = TRUE; + } + + if(bSelfBeamformer && bSelfBeamformee) + i = BEAMFORMEE_ENTRY_NUM; + } + */ + + for(i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) + { + BeamformeeEntry = pBeamInfo->BeamformeeEntry[i]; + + if(BeamformeeEntry.bUsed) + { + bSelfBeamformer = TRUE; + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: BFee entry %d bUsed=TRUE \n", __FUNCTION__, i)); + break; + } + + } + + for(i = 0; i < BEAMFORMER_ENTRY_NUM; i++) + { + BeamformerEntry = pBeamInfo->BeamformerEntry[i]; + + if(BeamformerEntry.bUsed) + { + bSelfBeamformee = TRUE; + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s: BFer entry %d bUsed=TRUE \n", __FUNCTION__, i)); + break; + } + } + + if(bSelfBeamformer) + BeamformCap |= BEAMFORMER_CAP; + if(bSelfBeamformee) + BeamformCap |= BEAMFORMEE_CAP; + + return BeamformCap; +} + + +BOOLEAN +BeamformingControl_V1( + PADAPTER Adapter, + pu1Byte RA, + u1Byte AID, + u1Byte Mode, + CHANNEL_WIDTH BW, + u1Byte Rate + ) +{ + BOOLEAN ret = TRUE; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("AID (%d), Mode (%d), BW (%d)\n", AID, Mode, BW)); + + RT_DISP_ADDR(FBEAM, FBEAM_FUN, ("Addr = "), RA); + + switch(Mode){ + case 0: + ret = BeamformingStart_V1(Adapter, RA, 0, BW, Rate); + break; + case 1: + ret = BeamformingStart_V1(Adapter, RA, 1, BW, Rate); + break; + case 2: + phydm_Beamforming_NDPARate(pDM_Odm, BW, Rate); + ret = Beamforming_SendVHTNDPAPacket(Adapter,RA, AID, BW, NORMAL_QUEUE); + break; + case 3: + phydm_Beamforming_NDPARate(pDM_Odm, BW, Rate); + ret = Beamforming_SendHTNDPAPacket(Adapter, RA, BW, NORMAL_QUEUE); + break; + } + return ret; +} + +//Only OID uses this function +BOOLEAN +phydm_BeamformingControl_V2( + IN PVOID pDM_VOID, + u1Byte Idx, + u1Byte Mode, + CHANNEL_WIDTH BW, + u2Byte Period + ) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + PRT_BEAMFORMING_OID_INFO pBeamOidInfo = &(pBeamInfo->BeamformingOidInfo); + + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("Idx (%d), Mode (%d), BW (%d), Period (%d)\n", Idx, Mode, BW, Period)); + + pBeamOidInfo->SoundOidIdx = Idx; + pBeamOidInfo->SoundOidMode = Mode; + pBeamOidInfo->SoundOidBW = BW; + pBeamOidInfo->SoundOidPeriod = Period; + + phydm_Beamforming_Notify(pDM_Odm); + + return TRUE; +} + + +VOID +phydm_Beamforming_Watchdog( + IN PVOID pDM_VOID +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo; + PADAPTER Adapter = pDM_Odm->Adapter; + + ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Start!\n", __FUNCTION__) ); + + if(pBeamInfo->BeamformState < BEAMFORMING_STATE_START_1BFee) + return; + + Beamforming_DymPeriod(pDM_Odm); + phydm_Beamforming_DymNDPARate(pDM_Odm); + +} + +#else + +RT_STATUS Beamforming_GetReportFrame( IN PADAPTER Adapter, IN PRT_RFD pRfd, IN POCTET_STRING pPduOS){return RT_STATUS_SUCCESS;} +VOID Beamforming_GetNDPAFrame( IN PADAPTER Adapter, IN OCTET_STRING PduOS){} + +#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_beamforming.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_beamforming.h new file mode 100755 index 000000000000..5e1b1e11b0db --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_beamforming.h @@ -0,0 +1,305 @@ +#ifndef __INC_BEAMFORMING_H +#define __INC_BEAMFORMING_H + +#ifndef BEAMFORMING_SUPPORT +#define BEAMFORMING_SUPPORT 0 +#endif + +#if (BEAMFORMING_SUPPORT == 1) + +/*Beamforming Related*/ +#include "TXBF/HalComTxbf.h" +#include "TXBF/HalTxbfJaguar.h" +#include "TXBF/HalTxbf8192E.h" +#include "TXBF/HalTxbf8814A.h" +#include "TXBF/HalTxbf8821B.h" + +#define BEAMFORMEE_ENTRY_NUM 2 +#define BEAMFORMER_ENTRY_NUM 2 +#define GET_BEAMFORM_INFO(_pAdapter) ((PRT_BEAMFORMING_INFO)(&(((HAL_DATA_TYPE *)((_pAdapter)->HalData))->DM_OutSrc.BeamformingInfo))) + +typedef enum _BEAMFORMING_ENTRY_STATE +{ + BEAMFORMING_ENTRY_STATE_UNINITIALIZE, + BEAMFORMING_ENTRY_STATE_INITIALIZEING, + BEAMFORMING_ENTRY_STATE_INITIALIZED, + BEAMFORMING_ENTRY_STATE_PROGRESSING, + BEAMFORMING_ENTRY_STATE_PROGRESSED, +}BEAMFORMING_ENTRY_STATE, *PBEAMFORMING_ENTRY_STATE; + + +typedef enum _BEAMFORMING_STATE +{ + BEAMFORMING_STATE_END, + BEAMFORMING_STATE_START_1BFee, + BEAMFORMING_STATE_START_2BFee +}BEAMFORMING_STATE, *PBEAMFORMING_STATE; + +typedef enum _BEAMFORMING_NOTIFY_STATE +{ + BEAMFORMING_NOTIFY_NONE, + BEAMFORMING_NOTIFY_ADD, + BEAMFORMING_NOTIFY_DELETE, + BEAMFORMING_NOTIFY_RESET +} BEAMFORMING_NOTIFY_STATE, *PBEAMFORMING_NOTIFY_STATE; + +typedef enum _BEAMFORMING_CAP +{ + BEAMFORMING_CAP_NONE = 0x0, + BEAMFORMER_CAP_HT_EXPLICIT = 0x1, + BEAMFORMEE_CAP_HT_EXPLICIT = 0x2, + BEAMFORMER_CAP_VHT_SU = 0x4, // Self has er Cap, because Reg er & peer ee + BEAMFORMEE_CAP_VHT_SU = 0x8, // Self has ee Cap, because Reg ee & peer er + BEAMFORMER_CAP = 0x10, + BEAMFORMEE_CAP = 0x20, +}BEAMFORMING_CAP, *PBEAMFORMING_CAP; + + +typedef enum _SOUNDING_MODE +{ + SOUNDING_SW_VHT_TIMER = 0x0, + SOUNDING_SW_HT_TIMER = 0x1, + SOUNDING_STOP_All_TIMER = 0x2, + SOUNDING_HW_VHT_TIMER = 0x3, + SOUNDING_HW_HT_TIMER = 0x4, + SOUNDING_STOP_OID_TIMER = 0x5, + SOUNDING_AUTO_VHT_TIMER = 0x6, + SOUNDING_AUTO_HT_TIMER = 0x7, + SOUNDING_FW_VHT_TIMER = 0x8, + SOUNDING_FW_HT_TIMER = 0x9, +}SOUNDING_MODE, *PSOUNDING_MODE; + + +typedef struct _RT_BEAMFORMING_ENTRY { + BOOLEAN bUsed; + BOOLEAN bTxBF; + BOOLEAN bSound; + u2Byte AID; // Used to construct AID field of NDPA packet. + u2Byte MacId; // Used to Set Reg42C in IBSS mode. + u2Byte P_AID; // Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. + u1Byte MacAddr[6]; // Used to fill Reg6E4 to fill Mac address of CSI report frame. + CHANNEL_WIDTH SoundBW; // Sounding BandWidth + u2Byte SoundPeriod; + BEAMFORMING_CAP BeamformEntryCap; + BEAMFORMING_ENTRY_STATE BeamformEntryState; + BOOLEAN bBeamformingInProgress; +// u1Byte LogSeq; // Move to _RT_BEAMFORMER_ENTRY +// u2Byte LogRetryCnt:3; // 0~4 // Move to _RT_BEAMFORMER_ENTRY +// u2Byte LogSuccessCnt:2; // 0~2 // Move to _RT_BEAMFORMER_ENTRY + u2Byte LogStatusFailCnt:5; // 0~21 + u2Byte DefaultCSICnt:5; // 0~21 + u1Byte CSIMatrix[327]; + u2Byte CSIMatrixLen; + u1Byte NumofSoundingDim; + u1Byte CompSteeringNumofBFer; +} RT_BEAMFORMING_ENTRY, *PRT_BEAMFORMING_ENTRY; + +typedef struct _RT_BEAMFORMER_ENTRY { + BOOLEAN bUsed; + // P_AID of BFer entry is probably not used + u2Byte P_AID; // Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. + u1Byte MacAddr[6]; + BEAMFORMING_CAP BeamformEntryCap; + u1Byte NumofSoundingDim; + u1Byte LogSeq; // Modified by Jeffery @2014-10-29 + u2Byte LogRetryCnt:3; // 0~4 // Modified by Jeffery @2014-10-29 + u2Byte LogSuccessCnt:2; // 0~2 // Modified by Jeffery @2014-10-29 +} RT_BEAMFORMER_ENTRY, *PRT_BEAMFORMER_ENTRY; + +typedef struct _RT_SOUNDING_INFO { + u1Byte SoundIdx; + CHANNEL_WIDTH SoundBW; + SOUNDING_MODE SoundMode; + u2Byte SoundPeriod; +} RT_SOUNDING_INFO, *PRT_SOUNDING_INFO; + + + +typedef struct _RT_BEAMFORMING_OID_INFO { + u1Byte SoundOidIdx; + CHANNEL_WIDTH SoundOidBW; + SOUNDING_MODE SoundOidMode; + u2Byte SoundOidPeriod; +} RT_BEAMFORMING_OID_INFO, *PRT_BEAMFORMING_OID_INFO; + + +typedef struct _RT_BEAMFORMING_INFO { + BEAMFORMING_CAP BeamformCap; + BEAMFORMING_STATE BeamformState; + RT_BEAMFORMING_ENTRY BeamformeeEntry[BEAMFORMEE_ENTRY_NUM]; + RT_BEAMFORMER_ENTRY BeamformerEntry[BEAMFORMER_ENTRY_NUM]; + u1Byte BeamformeeCurIdx; + RT_TIMER BeamformingTimer; + RT_SOUNDING_INFO SoundingInfo; + RT_BEAMFORMING_OID_INFO BeamformingOidInfo; + HAL_TXBF_INFO TxbfInfo; +} RT_BEAMFORMING_INFO, *PRT_BEAMFORMING_INFO; + + +typedef struct _RT_NDPA_STA_INFO { + u2Byte AID:12; + u2Byte FeedbackType:1; + u2Byte NcIndex:3; +} RT_NDPA_STA_INFO, *PRT_NDPA_STA_INFO; + + +BEAMFORMING_CAP +phydm_Beamforming_GetEntryBeamCapByMacId( + IN PVOID pDM_VOID, + IN u1Byte MacId + ); + + +VOID +Beamforming_GidPAid( + PADAPTER Adapter, + PRT_TCB pTcb + ); + + +BOOLEAN +Beamforming_SendHTNDPAPacket( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN CHANNEL_WIDTH BW, + IN u1Byte QIdx + ); + + +BOOLEAN +Beamforming_SendVHTNDPAPacket( + IN PADAPTER Adapter, + IN pu1Byte RA, + IN u2Byte AID, + IN CHANNEL_WIDTH BW, + IN u1Byte QIdx + ); + + +VOID +phydm_Beamforming_Notify( + IN PVOID pDM_VOID + ); + + +VOID +Beamforming_Enter( + PADAPTER Adapter, + PRT_WLAN_STA pSTA + ); + +VOID +Beamforming_Leave( + PADAPTER Adapter, + pu1Byte RA + ); + +BOOLEAN +BeamformingStart_FW( + PADAPTER Adapter, + u1Byte Idx + ); + +VOID +Beamforming_CheckSoundingSuccess( + PADAPTER Adapter, + BOOLEAN Status +); + +VOID +phydm_Beamforming_End_SW( + IN PVOID pDM_VOID, + BOOLEAN Status + ); + +VOID +phydm_Beamforming_End_FW( + IN PVOID pDM_VOID + ); + +VOID +Beamforming_TimerCallback( + PADAPTER Adapter + ); + +VOID +phydm_Beamforming_Init( + IN PVOID pDM_VOID + ); + + + +BEAMFORMING_CAP +phydm_Beamforming_GetBeamCap( + IN PVOID pDM_VOID, + IN PRT_BEAMFORMING_INFO pBeamInfo + ); + + +BOOLEAN +BeamformingControl_V1( + PADAPTER Adapter, + pu1Byte RA, + u1Byte AID, + u1Byte Mode, + CHANNEL_WIDTH BW, + u1Byte Rate + ); + + +BOOLEAN +phydm_BeamformingControl_V2( + IN PVOID pDM_VOID, + u1Byte Idx, + u1Byte Mode, + CHANNEL_WIDTH BW, + u2Byte Period + ); + + +BOOLEAN +BeamformingControl_V3( + PADAPTER Adapter, + u1Byte Threshold, + u2Byte Period + ); + +VOID +phydm_Beamforming_Watchdog( + IN PVOID pDM_VOID + ); + +VOID +Beamforming_SWTimerCallback( + PRT_TIMER pTimer + ); + +#else +#define Beamforming_GidPAid(Adapter, pTcb) +#define Beamforming_Enter(Adapter, pSTA) +#define Beamforming_Leave(Adapter, RA) +#define Beamforming_End_SW(Adapter, Status) +#define Beamforming_End_FW(Adapter) +#define Beamforming_Init(Adapter) +#define Beamforming_Release(Adapter) +#define BeamformingControl_V1(Adapter, RA, AID, Mode, BW, Rate) (TRUE) +#define BeamformingControl_V2(Adapter, Idx, Mode, BW, Period) (TRUE) +#define Beamforming_TimerCallback(Adapter) +#define Beamforming_Watchdog(Adapter) +#endif + + +RT_STATUS +Beamforming_GetReportFrame( + IN PADAPTER Adapter, + IN PRT_RFD pRfd, + IN POCTET_STRING pPduOS + ); + +VOID +Beamforming_GetNDPAFrame( + IN PADAPTER Adapter, + IN OCTET_STRING pduOS + ); + +#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.c index 7e514db3b609..0612602d145e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -26,15 +26,15 @@ #include "phydm_precomp.h" -VOID +VOID PHYDM_InitDebugSetting( IN PDM_ODM_T pDM_Odm - ) +) { -pDM_Odm->DebugLevel = ODM_DBG_TRACE; + pDM_Odm->DebugLevel = ODM_DBG_TRACE; -pDM_Odm->DebugComponents = -\ + pDM_Odm->DebugComponents = + \ #if DBG //BB Functions // ODM_COMP_DIG | @@ -54,10 +54,12 @@ pDM_Odm->DebugComponents = // ODM_COMP_CFO_TRACKING | // ODM_COMP_ACS | // PHYDM_COMP_ADAPTIVITY | - +// PHYDM_COMP_RA_DBG | +/* PHYDM_COMP_TXBF |*/ //MAC Functions // ODM_COMP_EDCA_TURBO | // ODM_COMP_EARLY_MODE | +/* ODM_FW_DEBUG_TRACE |*/ //RF Functions // ODM_COMP_TX_PWR_TRACK | // ODM_COMP_RX_GAIN_TRACK | @@ -67,12 +69,203 @@ pDM_Odm->DebugComponents = // ODM_COMP_INIT | // ODM_COMP_PSD | #endif - 0; + 0; + + pDM_Odm->fw_buff_is_enpty = TRUE; + pDM_Odm->pre_c2h_seq = 0; } #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - static u1Byte BbDbgBuf[BB_TMP_BUF_SIZE]; + +VOID +phydm_BB_RxHang_Info(IN PDM_ODM_T pDM_Odm) +{ + u4Byte value32 = 0; + + + if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) + return; + + value32 = ODM_GetBBReg(pDM_Odm, 0xF80 , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "rptreg of sc/bw/ht/...", value32); + DCMD_Printf(BbDbgBuf); + + /* dbg_port = state machine */ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x007); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "state machine", (value32)); + DCMD_Printf(BbDbgBuf); + } + + /* dbg_port = CCA-related*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x204); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "CCA-related", (value32)); + DCMD_Printf(BbDbgBuf); + } + + + /* dbg_port = edcca/rxd*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x278); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "edcca/rxd", (value32)); + DCMD_Printf(BbDbgBuf); + } + + /* dbg_port = rx_state/mux_state/ADC_MASK_OFDM*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x290); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "rx_state/mux_state/ADC_MASK_OFDM", (value32)); + DCMD_Printf(BbDbgBuf); + } + + /* dbg_port = bf-related*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x2B2); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "bf-related", (value32)); + DCMD_Printf(BbDbgBuf); + } + + /* dbg_port = bf-related*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x2B8); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "bf-related", (value32)); + DCMD_Printf(BbDbgBuf); + } + + /* dbg_port = txon/rxd*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xA03); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "txon/rxd", (value32)); + DCMD_Printf(BbDbgBuf); + } + + /* dbg_port = l_rate/l_length*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xA0B); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "l_rate/l_length", (value32)); + DCMD_Printf(BbDbgBuf); + } + + /* dbg_port = rxd/rxd_hit*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xA0D); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "rxd/rxd_hit", (value32)); + DCMD_Printf(BbDbgBuf); + } + + /* dbg_port = dis_cca*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAA0); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "dis_cca", (value32)); + DCMD_Printf(BbDbgBuf); + } + + + /* dbg_port = tx*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAB0); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "tx", (value32)); + DCMD_Printf(BbDbgBuf); + } + + /* dbg_port = rx plcp*/ + { + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD0); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "rx plcp", (value32)); + DCMD_Printf(BbDbgBuf); + + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD1); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "rx plcp", (value32)); + DCMD_Printf(BbDbgBuf); + + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD2); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "rx plcp", (value32)); + DCMD_Printf(BbDbgBuf); + + ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD3); + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x8fc", value32); + DCMD_Printf(BbDbgBuf); + + value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "rx plcp", (value32)); + DCMD_Printf(BbDbgBuf); + } + +} + VOID phydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm) { @@ -82,48 +275,48 @@ phydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm) u4Byte value32, value32_1, value32_2, value32_3; s4Byte SFO_A, SFO_B, SFO_C, SFO_D; s4Byte LFO_A, LFO_B, LFO_C, LFO_D; - 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; - static u2Byte HLength,htcrc8,Length; + 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; + static u2Byte HLength, htcrc8, Length; static u2Byte vpaid; - static u2Byte vLength,vhtcrc8,vMCSS,vTail,vbTail; - static u1Byte HMCSS,HRX_BW; + static u2Byte vLength, vhtcrc8, vMCSS, vTail, vbTail; + static u1Byte HMCSS, HRX_BW; + - u1Byte pwDB; s1Byte RXEVM_0, RXEVM_1, RXEVM_2 ; u1Byte RF_gain_pathA, RF_gain_pathB, RF_gain_pathC, RF_gain_pathD; u1Byte RX_SNR_pathA, RX_SNR_pathB, RX_SNR_pathC, RX_SNR_pathD; - s4Byte sig_power; - const char *RXHT_table[] = {"legacy", "HT", "VHT"}; - const char *BW_table[] = {"20M", "40M", "80M"}; - const char *RXSC_table[] = {"duplicate/full bw", "usc20-1", "lsc20-1", "usc20-2", "lsc20-2", "usc40", "lsc40"}; + s4Byte sig_power; + const char *RXHT_table[3] = {"legacy", "HT", "VHT"}; + const char *BW_table[3] = {"20M", "40M", "80M"}; + const char *RXSC_table[7] = {"duplicate/full bw", "usc20-1", "lsc20-1", "usc20-2", "lsc20-2", "usc40", "lsc40"}; + + const char *L_rate[8] = {"6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M"}; - const char *L_rate[]={"6M","9M","12M","18M","24M","36M","48M","54M"}; - /* const double evm_comp_20M = 0.579919469776867; //10*log10(64.0/56.0) const double evm_comp_40M = 0.503051183113957; //10*log10(128.0/114.0) const double evm_comp_80M = 0.244245993314183; //10*log10(256.0/242.0) const double evm_comp_160M = 0.244245993314183; //10*log10(512.0/484.0) - */ + */ - if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES) + if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) return; - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s \n", "BB Report Info"); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s\n", "BB Report Info"); DCMD_Printf(BbDbgBuf); - //BW & Mode Detection - /////////////////////////////////////////////////////// - value32 = ODM_GetBBReg(pDM_Odm, 0xf80 ,bMaskDWord); - value32_2 =value32; - RX_HT_BW = (u1Byte)(value32&0x1) ; - RX_VHT_BW = (u1Byte)((value32>>1)&0x3); - RXSC = (u1Byte)(value32&0x78); - value32_1= (value32&0x180)>>7; + /*BW & Mode Detection*/ + + value32 = ODM_GetBBReg(pDM_Odm, 0xf80 , bMaskDWord); + value32_2 = value32; + RX_HT_BW = (u1Byte)(value32 & 0x1); + RX_VHT_BW = (u1Byte)((value32 >> 1) & 0x3); + RXSC = (u1Byte)(value32 & 0x78); + value32_1 = (value32 & 0x180) >> 7; RX_HT = (u1Byte)(value32_1); - /* + /* rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "F80", value32_2); DCMD_Printf(BbDbgBuf); @@ -139,69 +332,55 @@ phydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm) rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "RX_HT", RX_HT); DCMD_Printf(BbDbgBuf); */ - + //rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n RX_HT:%s ", RXHT_table[RX_HT]); //DCMD_Printf(BbDbgBuf); RX_BW = 0; - if(RX_HT == 2) - { + if (RX_HT == 2) { rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n Mode: VHT Mode"); DCMD_Printf(BbDbgBuf); - if(RX_VHT_BW==0) - { + if (RX_VHT_BW == 0) { rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, " BW=20M"); DCMD_Printf(BbDbgBuf); - } - else if(RX_VHT_BW==1) - { + } else if (RX_VHT_BW == 1) { rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, " BW=40M"); DCMD_Printf(BbDbgBuf); - } - else - { + } else { rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, " BW=80M"); DCMD_Printf(BbDbgBuf); } RX_BW = RX_VHT_BW; - } - else if(RX_HT == 1) - { + } else if (RX_HT == 1) { rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n Mode: HT Mode"); DCMD_Printf(BbDbgBuf); - if(RX_HT_BW==0) - { + if (RX_HT_BW == 0) { rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, " BW=20M"); DCMD_Printf(BbDbgBuf); - } - else if(RX_HT_BW==1) - { + } else if (RX_HT_BW == 1) { rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, " BW=40M"); DCMD_Printf(BbDbgBuf); } RX_BW = RX_HT_BW; - } - else - { + } else { rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n Mode: Legeacy Mode"); DCMD_Printf(BbDbgBuf); } - if(RX_HT !=0) - { - if(RXSC==0) + if (RX_HT != 0) { + if (RXSC == 0) rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n duplicate/full bw"); - else if(RXSC==1) + else if (RXSC == 1) rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n usc20-1"); - else if(RXSC==2) + else if (RXSC == 2) rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n lsc20-1"); - else if(RXSC==3) + else if (RXSC == 3) rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n usc20-2"); - else if(RXSC==4) + else if (RXSC == 4) rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n lsc20-2"); - else if(RXSC==9) + else if (RXSC == 9) rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n usc40"); - else if(RXSC==10) + else if (RXSC == 10) rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n lsc40"); DCMD_Printf(BbDbgBuf); } @@ -210,116 +389,116 @@ phydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm) rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, " BW:%s", BW_table[RX_VHT_BW]); RX_BW = RX_VHT_BW; } - else if(RX_HT == 1){ + else if(RX_HT == 1){ rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, " BW:%s", BW_table[RX_HT_BW]); RX_BW = RX_HT_BW; } else rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, ""); - - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, " RXSC:%s", RXSC_table[RXSC]); + + DCMD_Printf(BbDbgBuf); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, " RXSC:%s", RXSC_table[RXSC]); DCMD_Printf(BbDbgBuf); */ - /////////////////////////////////////////////////////// - + + // rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "dB Conversion: 10log(65)", ODM_PWdB_Conversion(65,10,0)); // DCMD_Printf(BbDbgBuf); - // RX signal power and AGC related info - /////////////////////////////////////////////////////// - value32 = ODM_GetBBReg(pDM_Odm, 0xF90 ,bMaskDWord); - pwDB = (u1Byte) ((value32 & bMaskByte1) >> 8); - pwDB=pwDB>>1; - sig_power = -110+pwDB; + /* RX signal power and AGC related info*/ + + value32 = ODM_GetBBReg(pDM_Odm, 0xF90 , bMaskDWord); + pwDB = (u1Byte)((value32 & bMaskByte1) >> 8); + pwDB = pwDB >> 1; + sig_power = -110 + pwDB; rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "OFDM RX Signal Power(dB)", sig_power); DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xd14 ,bMaskDWord); - RX_SNR_pathA = (u1Byte)(value32&0xFF)>>1; - RF_gain_pathA = (s1Byte) ((value32 & bMaskByte1) >> 8); - RF_gain_pathA *=2; - value32 = ODM_GetBBReg(pDM_Odm, 0xd54 ,bMaskDWord); - RX_SNR_pathB = (u1Byte)(value32&0xFF)>>1; - RF_gain_pathB = (s1Byte) ((value32 & bMaskByte1) >> 8); - RF_gain_pathB *=2; - value32 = ODM_GetBBReg(pDM_Odm, 0xd94 ,bMaskDWord); - RX_SNR_pathC = (u1Byte)(value32&0xFF)>>1; - RF_gain_pathC = (s1Byte) ((value32 & bMaskByte1) >> 8); - RF_gain_pathC *=2; - value32 = ODM_GetBBReg(pDM_Odm, 0xdd4 ,bMaskDWord); - RX_SNR_pathD = (u1Byte)(value32&0xFF)>>1; - RF_gain_pathD = (s1Byte) ((value32 & bMaskByte1) >> 8); - RF_gain_pathD *=2; + value32 = ODM_GetBBReg(pDM_Odm, 0xd14 , bMaskDWord); + RX_SNR_pathA = (u1Byte)(value32 & 0xFF) >> 1; + RF_gain_pathA = (s1Byte)((value32 & bMaskByte1) >> 8); + RF_gain_pathA *= 2; + value32 = ODM_GetBBReg(pDM_Odm, 0xd54 , bMaskDWord); + RX_SNR_pathB = (u1Byte)(value32 & 0xFF) >> 1; + RF_gain_pathB = (s1Byte)((value32 & bMaskByte1) >> 8); + RF_gain_pathB *= 2; + value32 = ODM_GetBBReg(pDM_Odm, 0xd94 , bMaskDWord); + RX_SNR_pathC = (u1Byte)(value32 & 0xFF) >> 1; + RF_gain_pathC = (s1Byte)((value32 & bMaskByte1) >> 8); + RF_gain_pathC *= 2; + value32 = ODM_GetBBReg(pDM_Odm, 0xdd4 , bMaskDWord); + RX_SNR_pathD = (u1Byte)(value32 & 0xFF) >> 1; + RF_gain_pathD = (s1Byte)((value32 & bMaskByte1) >> 8); + RF_gain_pathD *= 2; 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); - DCMD_Printf(BbDbgBuf); - /////////////////////////////////////////////////////// + DCMD_Printf(BbDbgBuf); - // RX Counter related info - /////////////////////////////////////////////////////// - value32 = ODM_GetBBReg(pDM_Odm, 0xF08 ,bMaskDWord); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "OFDM CCA Counter", ((value32&0xFFFF0000)>>16)); + + /* RX Counter related info*/ + + value32 = ODM_GetBBReg(pDM_Odm, 0xF08 , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "OFDM CCA Counter", ((value32 & 0xFFFF0000) >> 16)); DCMD_Printf(BbDbgBuf); - - value32 = ODM_GetBBReg(pDM_Odm, 0xFD0 ,bMaskDWord); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "OFDM SBD Fail Counter", value32&0xFFFF); + + value32 = ODM_GetBBReg(pDM_Odm, 0xFD0 , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "OFDM SBD Fail Counter", value32 & 0xFFFF); DCMD_Printf(BbDbgBuf); - - value32 = ODM_GetBBReg(pDM_Odm, 0xFC4 ,bMaskDWord); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "VHT SIGA/SIGB CRC8 Fail Counter", value32&0xFFFF, ((value32&0xFFFF0000)>>16)); + + value32 = ODM_GetBBReg(pDM_Odm, 0xFC4 , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "VHT SIGA/SIGB CRC8 Fail Counter", value32 & 0xFFFF, ((value32 & 0xFFFF0000) >> 16)); DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xFCC ,bMaskDWord); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "CCK CCA Counter", value32&0xFFFF); + value32 = ODM_GetBBReg(pDM_Odm, 0xFCC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "CCK CCA Counter", value32 & 0xFFFF); DCMD_Printf(BbDbgBuf); - - value32 = ODM_GetBBReg(pDM_Odm, 0xFBC ,bMaskDWord); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "LSIG (\"Parity Fail\"/\"Rate Illegal\") Counter", value32&0xFFFF, ((value32&0xFFFF0000)>>16)); + + value32 = ODM_GetBBReg(pDM_Odm, 0xFBC , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "LSIG (\"Parity Fail\"/\"Rate Illegal\") Counter", value32 & 0xFFFF, ((value32 & 0xFFFF0000) >> 16)); DCMD_Printf(BbDbgBuf); - value32_1 = ODM_GetBBReg(pDM_Odm, 0xFC8 ,bMaskDWord); - value32_2 = ODM_GetBBReg(pDM_Odm, 0xFC0 ,bMaskDWord); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "HT/VHT MCS NOT SUPPORT counter", ((value32_2&0xFFFF0000)>>16), value32_1&0xFFFF); + value32_1 = ODM_GetBBReg(pDM_Odm, 0xFC8 , bMaskDWord); + value32_2 = ODM_GetBBReg(pDM_Odm, 0xFC0 , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "HT/VHT MCS NOT SUPPORT counter", ((value32_2 & 0xFFFF0000) >> 16), value32_1 & 0xFFFF); DCMD_Printf(BbDbgBuf); - /////////////////////////////////////////////////////// - - // PostFFT related info - /////////////////////////////////////////////////////// - - value32 = ODM_GetBBReg(pDM_Odm, 0xF8c ,bMaskDWord); - RXEVM_0 = (s1Byte) ((value32 & bMaskByte2) >> 16); - RXEVM_0 /=2; - if(RXEVM_0 < -63) - RXEVM_0=0; - + + + /* PostFFT related info*/ + + + value32 = ODM_GetBBReg(pDM_Odm, 0xF8c , bMaskDWord); + RXEVM_0 = (s1Byte)((value32 & bMaskByte2) >> 16); + RXEVM_0 /= 2; + if (RXEVM_0 < -63) + RXEVM_0 = 0; + DCMD_Printf(BbDbgBuf); - RXEVM_1 = (s1Byte) ((value32 & bMaskByte3) >> 24); - RXEVM_1 /=2; - value32 = ODM_GetBBReg(pDM_Odm, 0xF88 ,bMaskDWord); - RXEVM_2 = (s1Byte) ((value32 & bMaskByte2) >> 16); - RXEVM_2 /=2; + RXEVM_1 = (s1Byte)((value32 & bMaskByte3) >> 24); + RXEVM_1 /= 2; + value32 = ODM_GetBBReg(pDM_Odm, 0xF88 , bMaskDWord); + RXEVM_2 = (s1Byte)((value32 & bMaskByte2) >> 16); + RXEVM_2 /= 2; + + if (RXEVM_1 < -63) + RXEVM_1 = 0; + if (RXEVM_2 < -63) + RXEVM_2 = 0; - if(RXEVM_1 < -63) - RXEVM_1=0; - if(RXEVM_2 < -63) - RXEVM_2=0; - /* if(RX_BW == 0){ RXEVM_0 -= evm_comp_20M; RXEVM_1 -= evm_comp_20M; - RXEVM_2 -= evm_comp_20M; + RXEVM_2 -= evm_comp_20M; } else if(RX_BW == 1){ RXEVM_0 -= evm_comp_40M; RXEVM_1 -= evm_comp_40M; - RXEVM_2 -= evm_comp_40M; + RXEVM_2 -= evm_comp_40M; } else if (RX_BW == 2){ RXEVM_0 -= evm_comp_80M; RXEVM_1 -= evm_comp_80M; - RXEVM_2 -= evm_comp_80M; + RXEVM_2 -= evm_comp_80M; } */ rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d", "RXEVM (1ss/2ss/3ss)", RXEVM_0, RXEVM_1, RXEVM_2); @@ -331,543 +510,912 @@ phydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm) // rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "B_RXSNR", (value32&0xFF00)>>9); // DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xF8C ,bMaskDWord); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "CSI_1st /CSI_2nd", value32&0xFFFF, ((value32&0xFFFF0000)>>16)); + value32 = ODM_GetBBReg(pDM_Odm, 0xF8C , bMaskDWord); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "CSI_1st /CSI_2nd", value32 & 0xFFFF, ((value32 & 0xFFFF0000) >> 16)); DCMD_Printf(BbDbgBuf); - /////////////////////////////////////////////////////// - + + //BW & Mode Detection //Reset Page F Counter - ODM_SetBBReg(pDM_Odm, 0xB58 ,BIT0, 1); - ODM_SetBBReg(pDM_Odm, 0xB58 ,BIT0, 0); - + ODM_SetBBReg(pDM_Odm, 0xB58 , BIT0, 1); + ODM_SetBBReg(pDM_Odm, 0xB58 , BIT0, 0); + //CFO Report Info //Short CFO - value32 = ODM_GetBBReg(pDM_Odm, 0xd0c ,bMaskDWord); - value32_1 = ODM_GetBBReg(pDM_Odm, 0xd4c ,bMaskDWord); - value32_2 = ODM_GetBBReg(pDM_Odm, 0xd8c ,bMaskDWord); - value32_3 = ODM_GetBBReg(pDM_Odm, 0xdcc ,bMaskDWord); + value32 = ODM_GetBBReg(pDM_Odm, 0xd0c , bMaskDWord); + value32_1 = ODM_GetBBReg(pDM_Odm, 0xd4c , bMaskDWord); + value32_2 = ODM_GetBBReg(pDM_Odm, 0xd8c , bMaskDWord); + value32_3 = ODM_GetBBReg(pDM_Odm, 0xdcc , bMaskDWord); - SFO_A=(s4Byte)(value32&bMask12Bits); - SFO_B=(s4Byte)(value32_1&bMask12Bits); - SFO_C=(s4Byte)(value32_2&bMask12Bits); - SFO_D=(s4Byte)(value32_3&bMask12Bits); + SFO_A = (s4Byte)(value32 & bMask12Bits); + SFO_B = (s4Byte)(value32_1 & bMask12Bits); + SFO_C = (s4Byte)(value32_2 & bMask12Bits); + SFO_D = (s4Byte)(value32_3 & bMask12Bits); - LFO_A=(s4Byte)(value32>>16); - LFO_B=(s4Byte)(value32_1>>16); - LFO_C=(s4Byte)(value32_2>>16); - LFO_D=(s4Byte)(value32_3>>16); + LFO_A = (s4Byte)(value32 >> 16); + LFO_B = (s4Byte)(value32_1 >> 16); + LFO_C = (s4Byte)(value32_2 >> 16); + LFO_D = (s4Byte)(value32_3 >> 16); //SFO 2's to dec - if(SFO_A >2047) - { - SFO_A=SFO_A-4096; - } - SFO_A=(SFO_A*312500)/2048; - - if(SFO_B >2047) - { - SFO_B=SFO_B-4096; - } - SFO_B=(SFO_B*312500)/2048; - if(SFO_C >2047) - { - SFO_C=SFO_C-4096; - } - SFO_C=(SFO_C*312500)/2048; - if(SFO_D >2047) - { - SFO_D=SFO_D-4096; - } - SFO_D=(SFO_D*312500)/2048; + if (SFO_A > 2047) + SFO_A = SFO_A - 4096; + SFO_A = (SFO_A * 312500) / 2048; + + if (SFO_B > 2047) + SFO_B = SFO_B - 4096; + SFO_B = (SFO_B * 312500) / 2048; + if (SFO_C > 2047) + SFO_C = SFO_C - 4096; + SFO_C = (SFO_C * 312500) / 2048; + if (SFO_D > 2047) + SFO_D = SFO_D - 4096; + SFO_D = (SFO_D * 312500) / 2048; //LFO 2's to dec - - if(LFO_A >4095) - { - LFO_A=LFO_A-8192; - } - - if(LFO_B >4095) - { - LFO_B=LFO_B-8192; - } - if(LFO_C>4095) - { - LFO_C=LFO_C-8192; - } + if (LFO_A > 4095) + LFO_A = LFO_A - 8192; - if(LFO_D >4095) - { - LFO_D=LFO_D-8192; - } - LFO_A=LFO_A*312500/4096; - LFO_B=LFO_B*312500/4096; - LFO_C=LFO_C*312500/4096; - LFO_D=LFO_D*312500/4096; + if (LFO_B > 4095) + LFO_B = LFO_B - 8192; + + if (LFO_C > 4095) + LFO_C = LFO_C - 8192; + + if (LFO_D > 4095) + LFO_D = LFO_D - 8192; + LFO_A = LFO_A * 312500 / 4096; + LFO_B = LFO_B * 312500 / 4096; + LFO_C = LFO_C * 312500 / 4096; + LFO_D = LFO_D * 312500 / 4096; rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "CFO Report Info"); DCMD_Printf(BbDbgBuf); - - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " Short CFO(Hz) ", SFO_A,SFO_B,SFO_C,SFO_D); + + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " Short CFO(Hz) ", SFO_A, SFO_B, SFO_C, SFO_D); DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " Long CFO(Hz) ", LFO_A,LFO_B,LFO_C,LFO_D); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " Long CFO(Hz) ", LFO_A, LFO_B, LFO_C, LFO_D); DCMD_Printf(BbDbgBuf); //SCFO - value32 = ODM_GetBBReg(pDM_Odm, 0xd10 ,bMaskDWord); - value32_1 = ODM_GetBBReg(pDM_Odm, 0xd50 ,bMaskDWord); - value32_2 = ODM_GetBBReg(pDM_Odm, 0xd90 ,bMaskDWord); - value32_3 = ODM_GetBBReg(pDM_Odm, 0xdd0 ,bMaskDWord); + value32 = ODM_GetBBReg(pDM_Odm, 0xd10 , bMaskDWord); + value32_1 = ODM_GetBBReg(pDM_Odm, 0xd50 , bMaskDWord); + value32_2 = ODM_GetBBReg(pDM_Odm, 0xd90 , bMaskDWord); + value32_3 = ODM_GetBBReg(pDM_Odm, 0xdd0 , bMaskDWord); - SFO_A=(s4Byte)(value32&0x7ff); - SFO_B=(s4Byte)(value32_1&0x7ff); - SFO_C=(s4Byte)(value32_2&0x7ff); - SFO_D=(s4Byte)(value32_3&0x7ff); + SFO_A = (s4Byte)(value32 & 0x7ff); + SFO_B = (s4Byte)(value32_1 & 0x7ff); + SFO_C = (s4Byte)(value32_2 & 0x7ff); + SFO_D = (s4Byte)(value32_3 & 0x7ff); - if(SFO_A >1023) - { - SFO_A=SFO_A-2048; - } - - if(SFO_B >2047) - { - SFO_B=SFO_B-4096; -} + if (SFO_A > 1023) + SFO_A = SFO_A - 2048; - if(SFO_C >2047) - { - SFO_C=SFO_C-4096; - } + if (SFO_B > 2047) + SFO_B = SFO_B - 4096; - if(SFO_D >2047) - { - SFO_D=SFO_D-4096; - } - - SFO_A=SFO_A*312500/1024; - SFO_B=SFO_B*312500/1024; - SFO_C=SFO_C*312500/1024; - SFO_D=SFO_D*312500/1024; + if (SFO_C > 2047) + SFO_C = SFO_C - 4096; - LFO_A=(s4Byte)(value32>>16); - LFO_B=(s4Byte)(value32_1>>16); - LFO_C=(s4Byte)(value32_2>>16); - LFO_D=(s4Byte)(value32_3>>16); + if (SFO_D > 2047) + SFO_D = SFO_D - 4096; - if(LFO_A >4095) - { - LFO_A=LFO_A-8192; - } - - if(LFO_B >4095) - { - LFO_B=LFO_B-8192; - } + SFO_A = SFO_A * 312500 / 1024; + SFO_B = SFO_B * 312500 / 1024; + SFO_C = SFO_C * 312500 / 1024; + SFO_D = SFO_D * 312500 / 1024; - if(LFO_C>4095) - { - LFO_C=LFO_C-8192; - } + LFO_A = (s4Byte)(value32 >> 16); + LFO_B = (s4Byte)(value32_1 >> 16); + LFO_C = (s4Byte)(value32_2 >> 16); + LFO_D = (s4Byte)(value32_3 >> 16); - if(LFO_D >4095) - { - LFO_D=LFO_D-8192; - } - LFO_A=LFO_A*312500/4096; - LFO_B=LFO_B*312500/4096; - LFO_C=LFO_C*312500/4096; - LFO_D=LFO_D*312500/4096; - - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " Value SCFO(Hz) ", SFO_A,SFO_B,SFO_C,SFO_D); + if (LFO_A > 4095) + LFO_A = LFO_A - 8192; + + if (LFO_B > 4095) + LFO_B = LFO_B - 8192; + + if (LFO_C > 4095) + LFO_C = LFO_C - 8192; + + if (LFO_D > 4095) + LFO_D = LFO_D - 8192; + LFO_A = LFO_A * 312500 / 4096; + LFO_B = LFO_B * 312500 / 4096; + LFO_C = LFO_C * 312500 / 4096; + LFO_D = LFO_D * 312500 / 4096; + + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " Value SCFO(Hz) ", SFO_A, SFO_B, SFO_C, SFO_D); DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " ACQ CFO(Hz) ", LFO_A,LFO_B,LFO_C,LFO_D); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " ACQ CFO(Hz) ", LFO_A, LFO_B, LFO_C, LFO_D); DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xd14 ,bMaskDWord); - value32_1 = ODM_GetBBReg(pDM_Odm, 0xd54 ,bMaskDWord); - value32_2 = ODM_GetBBReg(pDM_Odm, 0xd94 ,bMaskDWord); - value32_3 = ODM_GetBBReg(pDM_Odm, 0xdd4 ,bMaskDWord); + value32 = ODM_GetBBReg(pDM_Odm, 0xd14 , bMaskDWord); + value32_1 = ODM_GetBBReg(pDM_Odm, 0xd54 , bMaskDWord); + value32_2 = ODM_GetBBReg(pDM_Odm, 0xd94 , bMaskDWord); + value32_3 = ODM_GetBBReg(pDM_Odm, 0xdd4 , bMaskDWord); - LFO_A=(s4Byte)(value32>>16); - LFO_B=(s4Byte)(value32_1>>16); - LFO_C=(s4Byte)(value32_2>>16); - LFO_D=(s4Byte)(value32_3>>16); + LFO_A = (s4Byte)(value32 >> 16); + LFO_B = (s4Byte)(value32_1 >> 16); + LFO_C = (s4Byte)(value32_2 >> 16); + LFO_D = (s4Byte)(value32_3 >> 16); - if(LFO_A >4095) - { - LFO_A=LFO_A-8192; - } - - if(LFO_B >4095) - { - LFO_B=LFO_B-8192; - } + if (LFO_A > 4095) + LFO_A = LFO_A - 8192; - if(LFO_C>4095) - { - LFO_C=LFO_C-8192; - } + if (LFO_B > 4095) + LFO_B = LFO_B - 8192; - if(LFO_D >4095) - { - LFO_D=LFO_D-8192; - } - LFO_A=LFO_A*312500/4096; - LFO_B=LFO_B*312500/4096; - LFO_C=LFO_C*312500/4096; - LFO_D=LFO_D*312500/4096; - - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " End CFO(Hz) ", LFO_A,LFO_B,LFO_C,LFO_D); + if (LFO_C > 4095) + LFO_C = LFO_C - 8192; + + if (LFO_D > 4095) + LFO_D = LFO_D - 8192; + + LFO_A = LFO_A * 312500 / 4096; + LFO_B = LFO_B * 312500 / 4096; + LFO_C = LFO_C * 312500 / 4096; + LFO_D = LFO_D * 312500 / 4096; + + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", " End CFO(Hz) ", LFO_A, LFO_B, LFO_C, LFO_D); DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xf20 ,bMaskDWord); //L SIG - - Tail=(u1Byte)((value32&0xfc0000)>>16); - Parity = (u1Byte)((value32&0x20000)>>16); - Length =(u2Byte)((value32&0x1ffe00)>>8); - rsv = (u1Byte)(value32&0x10); - MCSS=(u1Byte)(value32&0x0f); + value32 = ODM_GetBBReg(pDM_Odm, 0xf20 , bMaskDWord); /*L SIG*/ - switch(MCSS) - { - case 0x0b: - idx=0; + Tail = (u1Byte)((value32 & 0xfc0000) >> 16); + Parity = (u1Byte)((value32 & 0x20000) >> 16); + Length = (u2Byte)((value32 & 0x1ffe00) >> 8); + rsv = (u1Byte)(value32 & 0x10); + MCSS = (u1Byte)(value32 & 0x0f); + + switch (MCSS) { + case 0x0b: + idx = 0; break; - case 0x0f: - idx=1; + case 0x0f: + idx = 1; break; - case 0x0a: - idx=2; + case 0x0a: + idx = 2; break; - case 0x0e: - idx=3; + case 0x0e: + idx = 3; break; - case 0x09: - idx=4; + case 0x09: + idx = 4; break; - case 0x08: - idx=5; + case 0x08: + idx = 5; break; - case 0x0c: - idx=6; + case 0x0c: + idx = 6; break; - default: - idx=6; + default: + idx = 6; break; - + } rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "L-SIG"); DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n Rate:%s", L_rate[idx]); - DCMD_Printf(BbDbgBuf); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n Rate:%s", L_rate[idx]); + DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x/ %x /%x", " Rsv/Length/Parity",rsv,RX_BW,Length); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x/ %x /%x", " Rsv/Length/Parity", rsv, RX_BW, Length); DCMD_Printf(BbDbgBuf); rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "HT-SIG1"); DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xf2c ,bMaskDWord); //HT SIG - if(RX_HT == 1) - { - - HMCSS=(u1Byte)(value32&0x7F); - HRX_BW = (u1Byte)(value32&0x80); - HLength =(u2Byte)((value32>>8)&0xffff); + value32 = ODM_GetBBReg(pDM_Odm, 0xf2c , bMaskDWord); /*HT SIG*/ + if (RX_HT == 1) { + + HMCSS = (u1Byte)(value32 & 0x7F); + HRX_BW = (u1Byte)(value32 & 0x80); + HLength = (u2Byte)((value32 >> 8) & 0xffff); } - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x", " MCS/BW/Length",HMCSS,HRX_BW,HLength); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x", " MCS/BW/Length", HMCSS, HRX_BW, HLength); DCMD_Printf(BbDbgBuf); rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "HT-SIG2"); DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xf30 ,bMaskDWord); //HT SIG + value32 = ODM_GetBBReg(pDM_Odm, 0xf30 , bMaskDWord); /*HT SIG*/ + + if (RX_HT == 1) { + smooth = (u1Byte)(value32 & 0x01); + htsound = (u1Byte)(value32 & 0x02); + rsv = (u1Byte)(value32 & 0x04); + agg = (u1Byte)(value32 & 0x08); + stbc = (u1Byte)(value32 & 0x30); + fec = (u1Byte)(value32 & 0x40); + sgi = (u1Byte)(value32 & 0x80); + htltf = (u1Byte)((value32 & 0x300) >> 8); + htcrc8 = (u2Byte)((value32 & 0x3fc00) >> 8); + Tail = (u1Byte)((value32 & 0xfc0000) >> 16); - if(RX_HT == 1) - { - smooth = (u1Byte)(value32&0x01); - htsound = (u1Byte)(value32&0x02); - rsv=(u1Byte)(value32&0x04); - agg =(u1Byte)(value32&0x08); - stbc =(u1Byte)(value32&0x30); - fec=(u1Byte)(value32&0x40); - sgi=(u1Byte)(value32&0x80); - htltf=(u1Byte)((value32&0x300)>>8); - htcrc8=(u2Byte)((value32&0x3fc00)>>8); - Tail=(u1Byte)((value32&0xfc0000)>>16); - } - 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); + 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); DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x/ %x", " SGI/E-HT-LTFs/CRC/Tail",sgi,htltf,htcrc8,Tail); + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x/ %x", " SGI/E-HT-LTFs/CRC/Tail", sgi, htltf, htcrc8, Tail); DCMD_Printf(BbDbgBuf); - + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "VHT-SIG-A1"); DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xf2c ,bMaskDWord); //VHT SIG A1 - if(RX_HT == 2) - { - //value32 = ODM_GetBBReg(pDM_Odm, 0xf2c ,bMaskDWord); //VHT SIG A1 - vRX_BW=(u1Byte)(value32&0x03); - vrsv=(u1Byte)(value32&0x04); - vstbc =(u1Byte)(value32&0x08); - vgid = (u1Byte)((value32&0x3f0)>>4); - vNsts = (u1Byte)(((value32&0x1c00)>>8)+1); - vpaid = (u2Byte)(value32&0x3fe); - vtxops =(u1Byte)((value32&0x400000)>>20); - vrsv2 = (u1Byte)((value32&0x800000)>>20); + value32 = ODM_GetBBReg(pDM_Odm, 0xf2c , bMaskDWord); /*VHT SIG A1*/ + if (RX_HT == 2) { + /* value32 = ODM_GetBBReg(pDM_Odm, 0xf2c ,bMaskDWord);*/ + vRX_BW = (u1Byte)(value32 & 0x03); + vrsv = (u1Byte)(value32 & 0x04); + vstbc = (u1Byte)(value32 & 0x08); + vgid = (u1Byte)((value32 & 0x3f0) >> 4); + vNsts = (u1Byte)(((value32 & 0x1c00) >> 8) + 1); + vpaid = (u2Byte)(value32 & 0x3fe); + vtxops = (u1Byte)((value32 & 0x400000) >> 20); + vrsv2 = (u1Byte)((value32 & 0x800000) >> 20); } //rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x", "F2C", value32); //DCMD_Printf(BbDbgBuf); - - 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); + + 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); DCMD_Printf(BbDbgBuf); - + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "VHT-SIG-A2"); DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xf30 ,bMaskDWord); //VHT SIG + value32 = ODM_GetBBReg(pDM_Odm, 0xf30 , bMaskDWord); /*VHT SIG*/ - if(RX_HT == 2) - { - //value32 = ODM_GetBBReg(pDM_Odm, 0xf30 ,bMaskDWord); //VHT SIG + if (RX_HT == 2) { + /*value32 = ODM_GetBBReg(pDM_Odm, 0xf30 ,bMaskDWord); */ /*VHT SIG*/ //sgi=(u1Byte)(value32&0x01); - sgiext =(u1Byte)(value32&0x03); + sgiext = (u1Byte)(value32 & 0x03); //fec = (u1Byte)(value32&0x04); - fecext = (u1Byte)(value32&0x0C); + fecext = (u1Byte)(value32 & 0x0C); - vMCSS =(u1Byte)(value32&0xf0); - bf = (u1Byte)((value32&0x100)>>8); - vrsv =(u1Byte)((value32&0x200)>>8); - vhtcrc8=(u2Byte)((value32&0x3fc00)>>8); - vTail=(u1Byte)((value32&0xfc0000)>>16); + vMCSS = (u1Byte)(value32 & 0xf0); + bf = (u1Byte)((value32 & 0x100) >> 8); + vrsv = (u1Byte)((value32 & 0x200) >> 8); + vhtcrc8 = (u2Byte)((value32 & 0x3fc00) >> 8); + vTail = (u1Byte)((value32 & 0xfc0000) >> 16); } - //rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x", "F30", value32); - //DCMD_Printf(BbDbgBuf); - - 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); + /*rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x", "F30", value32);*/ + /*DCMD_Printf(BbDbgBuf);*/ + + 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); DCMD_Printf(BbDbgBuf); rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "VHT-SIG-B"); DCMD_Printf(BbDbgBuf); - value32 = ODM_GetBBReg(pDM_Odm, 0xf34 ,bMaskDWord); //VHT SIG + value32 = ODM_GetBBReg(pDM_Odm, 0xf34 , bMaskDWord); /*VHT SIG*/ { - vLength=(u2Byte)(value32&0x1fffff); - vbrsv = (u1Byte)((value32&0x600000)>>20); - vbTail =(u2Byte)((value32&0x1f800000)>>20); - vbcrc = (u1Byte)((value32&0x80000000)>>28); - + vLength = (u2Byte)(value32 & 0x1fffff); + vbrsv = (u1Byte)((value32 & 0x600000) >> 20); + vbTail = (u2Byte)((value32 & 0x1f800000) >> 20); + vbcrc = (u1Byte)((value32 & 0x80000000) >> 28); + } - //rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x", "F34", value32); - //DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x/ %x/", " Length/Rsv/Tail/CRC",vLength,vbrsv,vbTail,vbcrc); + /*rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x", "F34", value32);*/ + /*DCMD_Printf(BbDbgBuf);*/ + rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x/ %x/", " Length/Rsv/Tail/CRC", vLength, vbrsv, vbTail, vbcrc); DCMD_Printf(BbDbgBuf); - - + + } +void phydm_sbd_check( + IN PDM_ODM_T pDM_Odm +) +{ + static u4Byte pkt_cnt = 0; + static BOOLEAN sbd_state = 0; + u4Byte sym_count, count, value32; + + if (sbd_state == 0) { + pkt_cnt++; + if (pkt_cnt % 5 == 0) { /*read SBD conter once every 5 packets*/ + ODM_SetTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer, 0); /*ms*/ + sbd_state = 1; + } + } else { /*read counter*/ + value32 = ODM_GetBBReg(pDM_Odm, 0xF98, bMaskDWord); + sym_count = (value32 & 0x7C000000) >> 26; + count = (value32 & 0x3F00000) >> 20; + DbgPrint("#SBD# sym_count %d count %d\n", sym_count, count); + sbd_state = 0; + } +} -VOID phydm_BasicProfile( +void phydm_sbd_callback( + 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 USE_WORKITEM + ODM_ScheduleWorkItem(&pDM_Odm->sbdcnt_workitem); +#else + phydm_sbd_check(pDM_Odm); +#endif +} + +void phydm_sbd_workitem_callback( + IN PVOID pContext +) +{ + PADAPTER pAdapter = (PADAPTER)pContext; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + phydm_sbd_check(pDM_Odm); +} +#endif +VOID +phydm_BasicDbgMessage +( IN PVOID pDM_VOID - ) +) { - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - PADAPTER Adapter = pDM_Odm->Adapter; - char* Cut = NULL; - char* ICType = NULL; +#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure(pDM_Odm , PHYDM_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)); +#endif +} - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n%-35s", "% Basic Profile %"); - DCMD_Printf(BbDbgBuf); - if(pDM_Odm->SupportICType == ODM_RTL8192C) +VOID phydm_BasicProfile( + IN PVOID pDM_VOID, + IN u4Byte *_used, + OUT char *output, + IN u4Byte *_out_len +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + char *Cut = NULL; + char *ICType = NULL; + u4Byte used = *_used; + u4Byte out_len = *_out_len; + + PHYDM_SNPRINTF((output + used, out_len - used, "%-35s\n", "% Basic Profile %")); + + if (pDM_Odm->SupportICType == ODM_RTL8192C) ICType = "RTL8192C"; - else if(pDM_Odm->SupportICType == ODM_RTL8192D) + else if (pDM_Odm->SupportICType == ODM_RTL8192D) ICType = "RTL8192D"; - else if(pDM_Odm->SupportICType == ODM_RTL8723A) + else if (pDM_Odm->SupportICType == ODM_RTL8723A) ICType = "RTL8723A"; - else if(pDM_Odm->SupportICType == ODM_RTL8188E) + else if (pDM_Odm->SupportICType == ODM_RTL8188E) ICType = "RTL8188E"; - else if(pDM_Odm->SupportICType == ODM_RTL8812) + else if (pDM_Odm->SupportICType == ODM_RTL8812) ICType = "RTL8812A"; - else if(pDM_Odm->SupportICType == ODM_RTL8821) + else if (pDM_Odm->SupportICType == ODM_RTL8821) ICType = "RTL8821A"; - else if(pDM_Odm->SupportICType == ODM_RTL8192E) + else if (pDM_Odm->SupportICType == ODM_RTL8192E) ICType = "RTL8192E"; - else if(pDM_Odm->SupportICType == ODM_RTL8723B) + else if (pDM_Odm->SupportICType == ODM_RTL8723B) ICType = "RTL8723B"; - else if(pDM_Odm->SupportICType == ODM_RTL8814A) + else if (pDM_Odm->SupportICType == ODM_RTL8814A) ICType = "RTL8814A"; - else if(pDM_Odm->SupportICType == ODM_RTL8881A) + else if (pDM_Odm->SupportICType == ODM_RTL8881A) ICType = "RTL8881A"; - else if(pDM_Odm->SupportICType == ODM_RTL8821B) + else if (pDM_Odm->SupportICType == ODM_RTL8821B) ICType = "RTL8821B"; - else if(pDM_Odm->SupportICType == ODM_RTL8822B) + else if (pDM_Odm->SupportICType == ODM_RTL8822B) ICType = "RTL8822B"; - else if(pDM_Odm->SupportICType == ODM_RTL8703B) + else if (pDM_Odm->SupportICType == ODM_RTL8703B) ICType = "RTL8703B"; - else if(pDM_Odm->SupportICType == ODM_RTL8195A) + else if (pDM_Odm->SupportICType == ODM_RTL8195A) ICType = "RTL8195A"; - else if(pDM_Odm->SupportICType == ODM_RTL8188F) + else if (pDM_Odm->SupportICType == ODM_RTL8188F) ICType = "RTL8188F"; - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s (MP Chip: %s)","IC Type", ICType, pDM_Odm->bIsMPChip?"Yes":"No"); - DCMD_Printf(BbDbgBuf); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s (MP Chip: %s)\n", "IC Type", ICType, pDM_Odm->bIsMPChip ? "Yes" : "No")); + + if (pDM_Odm->CutVersion == ODM_CUT_A) + Cut = "A"; + else if (pDM_Odm->CutVersion == ODM_CUT_B) + Cut = "B"; + else if (pDM_Odm->CutVersion == ODM_CUT_C) + Cut = "C"; + else if (pDM_Odm->CutVersion == ODM_CUT_D) + Cut = "D"; + else if (pDM_Odm->CutVersion == ODM_CUT_E) + Cut = "E"; + else if (pDM_Odm->CutVersion == ODM_CUT_F) + Cut = "F"; + else if (pDM_Odm->CutVersion == ODM_CUT_I) + Cut = "I"; + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "Cut Version", Cut)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %d\n", "PHY Parameter Version", ODM_GetHWImgVersion(pDM_Odm))); +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + { + PADAPTER Adapter = pDM_Odm->Adapter; + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %d (Subversion: %d)\n", "FW Version", Adapter->MgntInfo.FirmwareVersion, Adapter->MgntInfo.FirmwareSubVersion)); + } +#elif (DM_ODM_SUPPORT_TYPE & ODM_AP) + { + struct rtl8192cd_priv *priv = pDM_Odm->priv; + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %d (Subversion: %d)\n", "FW Version", priv->pshare->fw_version, priv->pshare->fw_sub_version)); + } +#else + { + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %d (Subversion: %d)\n", "FW Version", pHalData->FirmwareVersion, pHalData->FirmwareSubVersion)); + } +#endif + //1 PHY DM Version List + PHYDM_SNPRINTF((output + used, out_len - used, "%-35s\n", "% PHYDM Version %")); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "Adaptivity", ADAPTIVITY_VERSION)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "DIG", DIG_VERSION)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "Dynamic BB PowerSaving", DYNAMIC_BBPWRSAV_VERSION)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "CFO Tracking", CFO_TRACKING_VERSION)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "Antenna Diversity", ANTDIV_VERSION)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "Power Tracking", POWRTRACKING_VERSION)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "Dynamic TxPower", DYNAMIC_TXPWR_VERSION)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "RA Info", RAINFO_VERSION)); +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "Antenna Detection", ANTDECT_VERSION)); +#endif + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "Auto Channel Selection", ACS_VERSION)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "EDCA Turbo", EDCATURBO_VERSION)); + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "Path Diversity", PATHDIV_VERSION)); +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PHYDM_SNPRINTF((output + used, out_len - used, " %-35s: %s\n", "RxHP", RXHP_VERSION)); +#endif + *_used = used; + *_out_len = out_len; - if(pDM_Odm->CutVersion==ODM_CUT_A) - Cut = "A"; - else if(pDM_Odm->CutVersion==ODM_CUT_B) - Cut = "B"; - else if(pDM_Odm->CutVersion==ODM_CUT_C) - Cut = "C"; - else if(pDM_Odm->CutVersion==ODM_CUT_D) - Cut = "D"; - else if(pDM_Odm->CutVersion==ODM_CUT_E) - Cut = "E"; - else if(pDM_Odm->CutVersion==ODM_CUT_F) - Cut = "F"; - else if(pDM_Odm->CutVersion==ODM_CUT_I) - Cut = "I"; - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","Cut Version", Cut); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %d","PHY Parameter Version", ODM_GetHWImgVersion(pDM_Odm)); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %d (Subversion: %d)","FW Version", Adapter->MgntInfo.FirmwareVersion, Adapter->MgntInfo.FirmwareSubVersion); - DCMD_Printf(BbDbgBuf); +} - //1 PHY DM Version List - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n%-35s","% PHYDM Version %"); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","Adaptivity", ADAPTIVITY_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","DIG", DIG_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","Dynamic BB PowerSaving", DYNAMIC_BBPWRSAV_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","CFO Tracking", CFO_TRACKING_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","Antenna Diversity", ANTDIV_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","Power Tracking", POWRTRACKING_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","Dynamic TxPower", DYNAMIC_TXPWR_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","RA Info", RAINFO_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","Antenna Detection", ANTDECT_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","Auto Channel Selection", ACS_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","EDCA Turbo", EDCATURBO_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","Path Diversity", PATHDIV_VERSION); - DCMD_Printf(BbDbgBuf); - rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s: %s","RxHP", RXHP_VERSION); - DCMD_Printf(BbDbgBuf); +VOID +phydm_fw_trace_en_h2c( + IN PVOID pDM_VOID, + IN BOOLEAN enable, + IN u4Byte monitor_mode, + IN u4Byte macid +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u1Byte H2C_Parameter[3] = {0}; + + H2C_Parameter[0] = enable; + H2C_Parameter[1] = (u1Byte)monitor_mode; + H2C_Parameter[2] = (u1Byte)macid; + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("---->\n")); + if (monitor_mode == 0){ + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[H2C] FW_debug_en: (( %d ))\n", enable)); + } else { + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[H2C] FW_debug_en: (( %d )), mode: (( %d )), macid: (( %d ))\n", enable, monitor_mode, macid)); + } + ODM_FillH2CCmd(pDM_Odm, PHYDM_H2C_FW_TRACE_EN, 3, H2C_Parameter); +} +VOID +odm_debug_trace( + IN PVOID pDM_VOID, + IN u4Byte *const dm_value, + IN u4Byte *_used, + OUT char *output, + IN u4Byte *_out_len +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u8Byte pre_debug_components, one = 1; + u4Byte used = *_used; + u4Byte out_len = *_out_len; + + pre_debug_components = pDM_Odm->DebugComponents; + + PHYDM_SNPRINTF((output + used, out_len - used, "\n%s\n", "================================")); + if (dm_value[0] == 100) { + PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "[Debug Message] PhyDM Selection")); + PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "================================")); + PHYDM_SNPRINTF((output + used, out_len - used, "00. (( %s ))DIG\n", ((pDM_Odm->DebugComponents & ODM_COMP_DIG) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "01. (( %s ))RA_MASK\n", ((pDM_Odm->DebugComponents & ODM_COMP_RA_MASK) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "02. (( %s ))DYNAMIC_TXPWR\n", ((pDM_Odm->DebugComponents & ODM_COMP_DYNAMIC_TXPWR) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "03. (( %s ))FA_CNT\n", ((pDM_Odm->DebugComponents & ODM_COMP_FA_CNT) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "04. (( %s ))RSSI_MONITOR\n", ((pDM_Odm->DebugComponents & ODM_COMP_RSSI_MONITOR) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "05. (( %s ))CCK_PD\n", ((pDM_Odm->DebugComponents & ODM_COMP_CCK_PD) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "06. (( %s ))ANT_DIV\n", ((pDM_Odm->DebugComponents & ODM_COMP_ANT_DIV) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "07. (( %s ))PWR_SAVE\n", ((pDM_Odm->DebugComponents & ODM_COMP_PWR_SAVE) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "08. (( %s ))PWR_TRAIN\n", ((pDM_Odm->DebugComponents & ODM_COMP_PWR_TRAIN) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "09. (( %s ))RATE_ADAPTIVE\n", ((pDM_Odm->DebugComponents & ODM_COMP_RATE_ADAPTIVE) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "10. (( %s ))PATH_DIV\n", ((pDM_Odm->DebugComponents & ODM_COMP_PATH_DIV) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "11. (( %s ))PSD\n", ((pDM_Odm->DebugComponents & ODM_COMP_PSD) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "12. (( %s ))DYNAMIC_PRICCA\n", ((pDM_Odm->DebugComponents & ODM_COMP_DYNAMIC_PRICCA) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "13. (( %s ))RXHP\n", ((pDM_Odm->DebugComponents & ODM_COMP_RXHP) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "14. (( %s ))MP\n", ((pDM_Odm->DebugComponents & ODM_COMP_MP) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "15. (( %s ))CFO_TRACKING\n", ((pDM_Odm->DebugComponents & ODM_COMP_CFO_TRACKING) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "16. (( %s ))ACS\n", ((pDM_Odm->DebugComponents & ODM_COMP_ACS) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "17. (( %s ))ADAPTIVITY\n", ((pDM_Odm->DebugComponents & PHYDM_COMP_ADAPTIVITY) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "18. (( %s ))RA_DBG\n", ((pDM_Odm->DebugComponents & PHYDM_COMP_RA_DBG) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "20. (( %s ))EDCA_TURBO\n", ((pDM_Odm->DebugComponents & ODM_COMP_EDCA_TURBO) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "21. (( %s ))EARLY_MODE\n", ((pDM_Odm->DebugComponents & ODM_COMP_EARLY_MODE) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "22. (( %s ))FW_DEBUG_TRACE\n", ((pDM_Odm->DebugComponents & ODM_FW_DEBUG_TRACE) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "24. (( %s ))TX_PWR_TRACK\n", ((pDM_Odm->DebugComponents & ODM_COMP_TX_PWR_TRACK) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "25. (( %s ))RX_GAIN_TRACK\n", ((pDM_Odm->DebugComponents & ODM_COMP_RX_GAIN_TRACK) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "26. (( %s ))CALIBRATION\n", ((pDM_Odm->DebugComponents & ODM_COMP_CALIBRATION) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "29. (( %s ))BEAMFORMING_DEBUG\n", ((pDM_Odm->DebugComponents & BEAMFORMING_DEBUG) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "30. (( %s ))COMMON\n", ((pDM_Odm->DebugComponents & ODM_COMP_COMMON) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "31. (( %s ))INIT\n", ((pDM_Odm->DebugComponents & ODM_COMP_INIT) ? ("V") : (".")))); + PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "================================")); + + } else if (dm_value[0] == 101) { + pDM_Odm->DebugComponents = 0; + PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "Disable all debug components")); + } else { + if (dm_value[1] == 1) { /*enable*/ + pDM_Odm->DebugComponents |= (one << dm_value[0]); + + if (dm_value[0] == 22) { /*FW trace function*/ + phydm_fw_trace_en_h2c(pDM_Odm, 1, dm_value[2], dm_value[3]); /*H2C to enable C2H Msg*/ + } + } else if (dm_value[1] == 2) { /*disable*/ + pDM_Odm->DebugComponents &= ~(one << dm_value[0]); + + if (dm_value[0] == 22) { /*FW trace function*/ + phydm_fw_trace_en_h2c(pDM_Odm, 0, dm_value[2], dm_value[3]); /*H2C to disable C2H Msg*/ + } + } else + PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "[Warning!!!] 1:enable, 2:disable")); + } + PHYDM_SNPRINTF((output + used, out_len - used, "pre-DbgComponents = 0x%x\n", (u4Byte)pre_debug_components)); + PHYDM_SNPRINTF((output + used, out_len - used, "Curr-DbgComponents = 0x%x\n", ((u4Byte)pDM_Odm->DebugComponents))); + PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "================================")); } -#endif + + +struct _PHYDM_COMMAND { + char name[16]; + u1Byte id; +}; + +enum PHYDM_CMD_ID { + PHYDM_DEMO, + PHYDM_RA, + PHYDM_PROFILE, + PHYDM_PATHDIV, + PHYDM_DEBUG, + PHYDM_SUPPORT_ABLITY +}; + +struct _PHYDM_COMMAND phy_dm_ary[] = { + {"demo", PHYDM_DEMO}, + {"ra", PHYDM_RA}, + {"profile", PHYDM_PROFILE}, + {"pathdiv", PHYDM_PATHDIV}, + {"dbg", PHYDM_DEBUG}, + {"ablity", PHYDM_SUPPORT_ABLITY} +}; + VOID -phydm_BasicDbgMessage -( - IN PVOID pDM_VOID - ) +phydm_cmd_parser( + IN PDM_ODM_T pDM_Odm, + IN char input[][MAX_ARGV], + IN u4Byte input_num, + IN u1Byte flag, + OUT char *output, + IN u4Byte out_len +) { -#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; - PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm , PHYDM_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)); + u4Byte used = 0; + u1Byte id = 0; + int var1[5] = {0}; + int i, input_idx = 0; + + if (flag == 0) { + PHYDM_SNPRINTF((output + used, out_len - used, "GET, nothing to print\n")); + return; + } + + PHYDM_SNPRINTF((output + used, out_len - used, "\n")); + + //Parsing Cmd ID + if (input_num) { + 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, input[0]) == 0) { + id = phy_dm_ary[i].id; + break; + } + } + if (i == n) { + PHYDM_SNPRINTF((output + used, out_len - used, "SET, command not found!\n")); + return; + } + } + + switch (id) { + case PHYDM_DEMO: { /*echo demo 10 0x3a z abcde >cmd*/ + u4Byte directory; +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) + char char_temp; +#else + u4Byte char_temp; +#endif + PHYDM_SSCANF(input[1], DCMD_DECIMAL, &directory); + PHYDM_SNPRINTF((output + used, out_len - used, "Decimal Value = %d\n", directory)); + PHYDM_SSCANF(input[2], DCMD_HEX, &directory); + PHYDM_SNPRINTF((output + used, out_len - used, "Hex Value = 0x%x\n", directory)); + PHYDM_SSCANF(input[3], DCMD_CHAR, &char_temp); + PHYDM_SNPRINTF((output + used, out_len - used, "Char = %c\n", char_temp)); + PHYDM_SNPRINTF((output + used, out_len - used, "String = %s\n", input[4])); + } + break; + + case PHYDM_RA: + + for (i = 0; i < 5; i++) { + if (input[i + 1]) { + PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]); + + PHYDM_SNPRINTF((output + used, out_len - used, "new SET, RA_var[%d]= (( %d ))\n", i , var1[i])); + input_idx++; + } + } + + if (input_idx >= 1) { + /*PHYDM_SNPRINTF((output+used, out_len-used, "odm_RA_debug\n"));*/ +#if (defined(CONFIG_RA_DBG_CMD)) + odm_RA_debug(pDM_Odm, var1); +#endif + } + + + break; + + case PHYDM_PATHDIV: + + for (i = 0; i < 5; i++) { + if (input[i + 1]) { + PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]); + + /*PHYDM_SNPRINTF((output+used, out_len-used, "new SET, PATHDIV_var[%d]= (( %d ))\n", i , var1[i]));*/ + input_idx++; + } + } + + if (input_idx >= 1) { + /*PHYDM_SNPRINTF((output+used, out_len-used, "odm_PATHDIV_debug\n"));*/ +#if (defined(CONFIG_PATH_DIVERSITY)) + odm_pathdiv_debug(pDM_Odm, var1, &used, output, &out_len); #endif + } + + break; + + case PHYDM_DEBUG: + + for (i = 0; i < 5; i++) { + if (input[i + 1]) { + PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]); + + /*PHYDM_SNPRINTF((output+used, out_len-used, "new SET, Debug_var[%d]= (( %d ))\n", i , var1[i]));*/ + input_idx++; + } + } + + if (input_idx >= 1) { + /*PHYDM_SNPRINTF((output+used, out_len-used, "odm_debug_comp\n"));*/ + odm_debug_trace(pDM_Odm, var1, &used, output, &out_len); + } + + + break; + + case PHYDM_SUPPORT_ABLITY: + + for (i = 0; i < 5; i++) { + if (input[i + 1]) { + PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]); + + /*PHYDM_SNPRINTF((output+used, out_len-used, "new SET, support ablity_var[%d]= (( %d ))\n", i , var1[i]));*/ + input_idx++; + } + } + + if (input_idx >= 1) { + /*PHYDM_SNPRINTF((output+used, out_len-used, "support ablity\n"));*/ + phydm_support_ablity_debug(pDM_Odm, var1, &used, output, &out_len); + } + + break; + + case PHYDM_PROFILE: /*echo profile, >cmd*/ + phydm_BasicProfile(pDM_Odm, &used, output, &out_len); + break; + + default: + PHYDM_SNPRINTF((output + used, out_len - used, "SET, unknown command!\n")); + break; + + } } -#if( DM_ODM_SUPPORT_TYPE & ODM_CE) -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; +#ifdef __ECOS +char *strsep(char **s, const char *ct) +{ + char *sbegin = *s; + char *end; + + if (sbegin == NULL) + return NULL; + + end = strpbrk(sbegin, ct); + if (end) + *end++ = '\0'; + *s = end; + return sbegin; +} +#endif + +#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) +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 +) +{ + char *token; + u4Byte Argc = 0; + char Argv[MAX_ARGC][MAX_ARGV]; + + do { + token = strsep(&input, ", "); + if (token) { + strcpy(Argv[Argc], token); + Argc++; + } else + break; + } while (Argc < MAX_ARGC); + + if (Argc == 1) + Argv[0][strlen(Argv[0]) - 1] = '\0'; + + phydm_cmd_parser(pDM_Odm, Argv, Argc, flag, output, out_len); + + return 0; } #endif + + +VOID +phydm_fw_trace_handler( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; + u1Byte temp_char_start; + + /*u1Byte debug_trace_11byte[60];*/ + u1Byte freg_num, c2h_seq, buf_0 = 0; + + if (CmdLen > 12) + return; + + buf_0 = CmdBuf[0]; + freg_num = (buf_0 & 0xf); + c2h_seq = (buf_0 & 0xf0) >> 4; + /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW debug message] freg_num = (( %d )), c2h_seq = (( %d ))\n", freg_num,c2h_seq ));*/ + + /*strncpy(debug_trace_11byte,&CmdBuf[1],(CmdLen-1));*/ + /*debug_trace_11byte[CmdLen-1] = '\0';*/ + /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW debug message] %s\n", debug_trace_11byte));*/ + /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW debug message] CmdLen = (( %d ))\n", CmdLen));*/ + /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW debug message] c2h_cmd_start = (( %d ))\n", pDM_Odm->c2h_cmd_start));*/ + + + + /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("pre_seq = (( %d )), current_seq = (( %d ))\n", pDM_Odm->pre_c2h_seq, c2h_seq));*/ + /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("fw_buff_is_enpty = (( %d ))\n", pDM_Odm->fw_buff_is_enpty));*/ + + if ((c2h_seq != pDM_Odm->pre_c2h_seq) && pDM_Odm->fw_buff_is_enpty == FALSE) { + pDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start] = '\0'; + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW Dbg Queue Overflow] %s\n", pDM_Odm->fw_debug_trace)); + pDM_Odm->c2h_cmd_start = 0; + } + + if ((CmdLen - 1) > (60 - pDM_Odm->c2h_cmd_start)) { + pDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start] = '\0'; + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW Dbg Queue error: wrong C2H length] %s\n", pDM_Odm->fw_debug_trace)); + pDM_Odm->c2h_cmd_start = 0; + return; + } + + strncpy(&(pDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start]), &CmdBuf[1], (CmdLen - 1)); + pDM_Odm->c2h_cmd_start += (CmdLen - 1); + pDM_Odm->fw_buff_is_enpty = FALSE; + + if (freg_num == 0 || pDM_Odm->c2h_cmd_start >= 60) { + if (pDM_Odm->c2h_cmd_start < 60) + pDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start] = '\0'; + else + pDM_Odm->fw_debug_trace[59] = '\0'; + + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW DBG Msg] %s\n", pDM_Odm->fw_debug_trace)); + /*DbgPrint("[FW DBG Msg] %s\n", pDM_Odm->fw_debug_trace);*/ + pDM_Odm->c2h_cmd_start = 0; + pDM_Odm->fw_buff_is_enpty = TRUE; + } + + pDM_Odm->pre_c2h_seq = c2h_seq; +} + + +VOID +phydm_fw_trace_handler_8051( + IN PVOID pDM_VOID, + IN pu1Byte Buffer, + IN u1Byte CmdLen +) +{ + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; +#if 0 + if (CmdLen >= 3) + CmdBuf[CmdLen - 1] = '\0'; + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW DBG Msg] %s\n", &(CmdBuf[3]))); +#else + + int i = 0; + u1Byte Extend_c2hSubID = 0, Extend_c2hDbgLen = 0, Extend_c2hDbgSeq = 0; + u1Byte fw_debug_trace[100]; + pu1Byte Extend_c2hDbgContent = 0; + + Extend_c2hSubID = Buffer[0]; + Extend_c2hDbgLen = Buffer[1]; + Extend_c2hDbgContent = Buffer + 2; /*DbgSeq+DbgContent for show HEX*/ + +GoBackforAggreDbgPkt: + i = 0; + Extend_c2hDbgSeq = Buffer[2]; + Extend_c2hDbgContent = Buffer + 3; + + for (; ; i++) { + fw_debug_trace[i] = Extend_c2hDbgContent[i]; + if (Extend_c2hDbgContent[i + 1] == '\0') { + fw_debug_trace[i + 1] = '\0'; + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW DBG Msg] %s", &(fw_debug_trace[0]))); + break; + } else if (Extend_c2hDbgContent[i] == '\n') { + fw_debug_trace[i + 1] = '\0'; + ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW DBG Msg] %s", &(fw_debug_trace[0]))); + Buffer = Extend_c2hDbgContent + i + 3; + goto GoBackforAggreDbgPkt; + } + } + + +#endif +} + + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.h index 93574f2a0d90..686f5153f2f5 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.h @@ -22,7 +22,7 @@ #ifndef __ODM_DBG_H__ #define __ODM_DBG_H__ - +#define DEBUG_VERSION "1.0" /*2015.01.13 Dino*/ //----------------------------------------------------------------------------- // Define the debug levels // @@ -88,14 +88,18 @@ #define ODM_COMP_CFO_TRACKING BIT15 #define ODM_COMP_ACS BIT16 #define PHYDM_COMP_ADAPTIVITY BIT17 +#define PHYDM_COMP_RA_DBG BIT18 +#define PHYDM_COMP_TXBF BIT19 //MAC Functions #define ODM_COMP_EDCA_TURBO BIT20 #define ODM_COMP_EARLY_MODE BIT21 +#define ODM_FW_DEBUG_TRACE BIT22 //RF Functions #define ODM_COMP_TX_PWR_TRACK BIT24 #define ODM_COMP_RX_GAIN_TRACK BIT25 #define ODM_COMP_CALIBRATION BIT26 //Common Functions +#define BEAMFORMING_DEBUG BIT29 #define ODM_COMP_COMMON BIT30 #define ODM_COMP_INIT BIT31 @@ -135,6 +139,8 @@ DbgPrint("[ODM-8821] "); \ else if(pDM_Odm->SupportICType == ODM_RTL8814A) \ DbgPrint("[ODM-8814] "); \ + else if(pDM_Odm->SupportICType == ODM_RTL8822B) \ + DbgPrint("[ODM-8822] "); \ RT_PRINTK fmt; \ } @@ -181,14 +187,68 @@ VOID PHYDM_InitDebugSetting(IN PDM_ODM_T pDM_Odm); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +VOID phydm_BB_RxHang_Info(IN PDM_ODM_T pDM_Odm); +#endif + #define BB_TMP_BUF_SIZE 100 VOID phydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm); -VOID phydm_BasicProfile(IN PVOID pDM_VOID); VOID phydm_BasicDbgMessage( IN PVOID pDM_VOID); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#define PHYDM_DBGPRINT 0 +#define PHYDM_SSCANF(x, y, z) DCMD_Scanf(x, y, z) +#if (PHYDM_DBGPRINT == 1) +#define PHYDM_SNPRINTF(msg) \ + {\ + rsprintf msg;\ + DbgPrint(output);\ + } +#else +#define PHYDM_SNPRINTF(msg) \ + {\ + rsprintf msg;\ + DCMD_Printf(output);\ + } +#endif +#else #if (DM_ODM_SUPPORT_TYPE == ODM_CE) +#define PHYDM_DBGPRINT 0 +#else +#define PHYDM_DBGPRINT 1 +#endif +#define MAX_ARGC 20 +#define MAX_ARGV 16 +#define DCMD_DECIMAL "%d" +#define DCMD_CHAR "%c" +#define DCMD_HEX "%x" + +#define PHYDM_SSCANF(x, y, z) sscanf(x, y, z) +#if (PHYDM_DBGPRINT == 1) +#define PHYDM_SNPRINTF(msg)\ + {\ + snprintf msg;\ + DbgPrint(output);\ + } +#else +#define PHYDM_SNPRINTF(msg)\ + {\ + if(out_len > used)\ + used+=snprintf msg;\ + } +#endif +#endif + + +VOID phydm_BasicProfile( + IN PVOID pDM_VOID, + IN u4Byte *_used, + OUT char *output, + IN u4Byte *_out_len + ); +#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) s4Byte -PhyDM_Cmd( +phydm_cmd( IN PDM_ODM_T pDM_Odm, IN char *input, IN u4Byte in_len, @@ -197,6 +257,43 @@ PhyDM_Cmd( IN u4Byte out_len ); #endif +VOID +phydm_cmd_parser( + IN PDM_ODM_T pDM_Odm, + IN char input[][16], + IN u4Byte input_num, + IN u1Byte flag, + OUT char *output, + IN u4Byte out_len +); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +void phydm_sbd_check( + IN PDM_ODM_T pDM_Odm + ); + +void phydm_sbd_callback( + PRT_TIMER pTimer + ); + +void phydm_sbd_workitem_callback( + IN PVOID pContext + ); +#endif + +VOID +phydm_fw_trace_handler( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen +); + +VOID +phydm_fw_trace_handler_8051( + IN PVOID pDM_VOID, + IN pu1Byte CmdBuf, + IN u1Byte CmdLen +); #endif // __ODM_DBG_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.c index 16caf370b73c..aea4dd9a68fb 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.c @@ -300,7 +300,7 @@ ODM_MoveMemory( IN u4Byte Length ) { -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) memcpy(pDest, pSrc, Length); #elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) _rtw_memcpy(pDest, pSrc, Length); @@ -315,7 +315,7 @@ void ODM_Memory_Set IN s1Byte value, IN u4Byte length) { -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) #elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) _rtw_memset(pbuf,value, length); @@ -546,7 +546,7 @@ ODM_SetTimer( IN u4Byte msDelay ) { -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) mod_timer(pTimer, jiffies + RTL_MILISECONDS_TO_JIFFIES(msDelay)); #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) _set_timer(pTimer,msDelay ); //ms @@ -566,7 +566,7 @@ ODM_InitializeTimer( IN const char* szID ) { -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) init_timer(pTimer); pTimer->function = CallBackFunc; pTimer->data = (unsigned long)pDM_Odm; @@ -625,183 +625,272 @@ ODM_ReleaseTimer( } +u1Byte +phydm_trans_h2c_id( + IN PDM_ODM_T pDM_Odm, + IN u1Byte phydm_h2c_id +) +{ + u1Byte platform_h2c_id=0xff; + + + switch(phydm_h2c_id) + { + //1 [0] + case ODM_H2C_RSSI_REPORT: + + #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + if(pDM_Odm->SupportICType == ODM_RTL8188E) + { + platform_h2c_id = H2C_88E_RSSI_REPORT; + } + else if(pDM_Odm->SupportICType == ODM_RTL8814A) + { + platform_h2c_id =H2C_8814A_RSSI_REPORT; + } + else + { + platform_h2c_id = H2C_RSSI_REPORT; + } + + #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1)) + platform_h2c_id = H2C_8812_RSSI_REPORT; + #elif(RTL8814A_SUPPORT == 1) + platform_h2c_id = H2C_RSSI_SETTING; + #elif(RTL8192E_SUPPORT==1) + platform_h2c_id =H2C_8192E_RSSI_REPORT; + #elif(RTL8723B_SUPPORT==1) + platform_h2c_id =H2C_8723B_RSSI_SETTING; + #elif(RTL8188E_SUPPORT==1) + platform_h2c_id =H2C_RSSI_REPORT; + #elif(RTL8723A_SUPPORT==1) + platform_h2c_id =RSSI_SETTING_EID; + #elif(RTL8192D_SUPPORT==1) + platform_h2c_id =H2C_RSSI_REPORT; + #elif(RTL8192C_SUPPORT==1) + platform_h2c_id =RSSI_SETTING_EID; + #endif + + #elif(DM_ODM_SUPPORT_TYPE & ODM_AP) + #if((RTL8881A_SUPPORT==1)||(RTL8192E_SUPPORT==1)||(RTL8814A_SUPPORT==1) ) + if(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E|| pDM_Odm->SupportICType == ODM_RTL8814A) + { + platform_h2c_id =H2C_88XX_RSSI_REPORT; + //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] H2C_88XX_RSSI_REPORT CMD_ID = (( %d )) \n", platform_h2c_id)); + } else + #endif + #if(RTL8812A_SUPPORT==1) + if(pDM_Odm->SupportICType == ODM_RTL8812) + { + platform_h2c_id = H2C_8812_RSSI_REPORT; + } else + #endif + {} + #endif + + break; + + //1 [3] + case ODM_H2C_WIFI_CALIBRATION: + #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + platform_h2c_id =H2C_WIFI_CALIBRATION; + + #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + #if(RTL8723B_SUPPORT==1) + platform_h2c_id = H2C_8723B_BT_WLAN_CALIBRATION; + #endif + + #elif(DM_ODM_SUPPORT_TYPE & ODM_AP) + + + #endif + + break; + + + //1 [4] + case ODM_H2C_IQ_CALIBRATION: + #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + platform_h2c_id =H2C_IQ_CALIBRATION; + + #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1)) + platform_h2c_id = H2C_8812_IQ_CALIBRATION; + #endif + #elif(DM_ODM_SUPPORT_TYPE & ODM_AP) + + + #endif + + break; + //1 [5] + case ODM_H2C_RA_PARA_ADJUST: + + #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + if(pDM_Odm->SupportICType == ODM_RTL8814A) + { + platform_h2c_id =H2C_8814A_RA_PARA_ADJUST; + } + else + { + platform_h2c_id = H2C_RA_PARA_ADJUST; + } + #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1)) + platform_h2c_id = H2C_8812_RA_PARA_ADJUST; + #elif(RTL8814A_SUPPORT == 1) + platform_h2c_id = H2C_RA_PARA_ADJUST; + #elif(RTL8192E_SUPPORT==1) + platform_h2c_id =H2C_8192E_RA_PARA_ADJUST; + #elif(RTL8723B_SUPPORT==1) + platform_h2c_id =H2C_8723B_RA_PARA_ADJUST; + #endif + + #elif(DM_ODM_SUPPORT_TYPE & ODM_AP) + #if((RTL8881A_SUPPORT==1)||(RTL8192E_SUPPORT==1)||(RTL8814A_SUPPORT==1)) + if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A) + { + platform_h2c_id =H2C_88XX_RA_PARA_ADJUST; + /*ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] H2C_88XX_RA_PARA_ADJUST CMD_ID = (( %d ))\n", platform_h2c_id));*/ + } else + #endif + #if(RTL8812A_SUPPORT==1) + if(pDM_Odm->SupportICType == ODM_RTL8812) + { + platform_h2c_id = H2C_8812_RA_PARA_ADJUST; + } else + #endif + {} + #endif + + break; + + + //1 [6] + case PHYDM_H2C_DYNAMIC_TX_PATH: + + #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + if(pDM_Odm->SupportICType == ODM_RTL8814A) + { + platform_h2c_id =H2C_8814A_DYNAMIC_TX_PATH; + } + #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + #if (RTL8814A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8814A) + platform_h2c_id = H2C_DYNAMIC_TX_PATH; + #endif + #elif(DM_ODM_SUPPORT_TYPE & ODM_AP) + #if(RTL8814A_SUPPORT==1) + if( pDM_Odm->SupportICType == ODM_RTL8814A) + { + platform_h2c_id = H2C_88XX_DYNAMIC_TX_PATH; + } + #endif + + #endif + + break; + + /* [7]*/ + case PHYDM_H2C_FW_TRACE_EN: + + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + if (pDM_Odm->SupportICType == ODM_RTL8814A) + platform_h2c_id = H2C_8814A_FW_TRACE_EN; + else + platform_h2c_id = H2C_FW_TRACE_EN; + + #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + + + #elif(DM_ODM_SUPPORT_TYPE & ODM_AP) + #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1)) + if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A) { + platform_h2c_id = H2C_88XX_FW_TRACE_EN; + } else + #endif + #if (RTL8812A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8812) { + platform_h2c_id = H2C_8812_FW_TRACE_EN; + } else + #endif + {} + + #endif + + break; + + default: + platform_h2c_id=0xff; + break; + } + + return platform_h2c_id; + +} + // // ODM FW relative API. // -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + VOID ODM_FillH2CCmd( IN PDM_ODM_T pDM_Odm, - IN u1Byte ElementID, + IN u1Byte phydm_h2c_id, IN u4Byte CmdLen, IN pu1Byte pCmdBuffer ) { - PADAPTER Adapter = pDM_Odm->Adapter; + PADAPTER Adapter = pDM_Odm->Adapter; + u1Byte platform_h2c_id; - if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: + platform_h2c_id=phydm_trans_h2c_id(pDM_Odm, phydm_h2c_id); -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - FillH2CCmd(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); -#else - #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1)) - FillH2CCmd_8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); - #endif -#endif - break; - case ODM_H2C_IQ_CALIBRATION: -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - FillH2CCmd(Adapter, H2C_IQ_CALIBRATION, CmdLen, pCmdBuffer); -#else - #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1)) - FillH2CCmd_8812(Adapter, H2C_8812_IQ_CALIBRATION, CmdLen, pCmdBuffer); - #endif -#endif - break; - default: - break; - } - - } - else if(pDM_Odm->SupportICType == ODM_RTL8192E) + if(platform_h2c_id==0xff) { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - FillH2CCmd(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); -#else - #if(RTL8192E_SUPPORT==1) - FillH2CCmd_8192E(Adapter, H2C_8192E_RSSI_REPORT, CmdLen, pCmdBuffer); - #endif -#endif - break; - default: - break; - } + ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] Wrong H2C CMD-ID !! platform_h2c_id==0xff , PHYDM_ElementID=((%d )) \n",phydm_h2c_id)); + return; } - else if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - FillH2CCmd(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); -#else - #if(RTL8723B_SUPPORT==1) - FillH2CCmd8723B(Adapter, H2C_8723B_RSSI_SETTING, CmdLen, pCmdBuffer); - #endif -#endif - break; - case ODM_H2C_WIFI_CALIBRATION: -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - FillH2CCmd(Adapter, H2C_WIFI_CALIBRATION, CmdLen, pCmdBuffer); -#else - #if(RTL8723B_SUPPORT==1) - FillH2CCmd8723B(Adapter, H2C_8723B_BT_WLAN_CALIBRATION, CmdLen, pCmdBuffer); - #endif -#endif - break; - default: - break; - } - } - else if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - switch(ElementID) + #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) + if(pDM_Odm->SupportICType == ODM_RTL8188E) { - case ODM_H2C_RSSI_REPORT: - //if((pDM_Odm->CutVersion == ODM_CUT_I) && (!pDM_Odm->RaSupport88E)){ - if(!pDM_Odm->RaSupport88E){ -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - FillH2CCmd88E(Adapter, H2C_88E_RSSI_REPORT, CmdLen, pCmdBuffer); -#else - #if(RTL8188E_SUPPORT==1) - FillH2CCmd_88E(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); - #endif -#endif - } - break; - default: - break; + if(!pDM_Odm->RaSupport88E) + FillH2CCmd88E(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); } - } -#if(DM_ODM_SUPPORT_TYPE & ODM_CE) - else if(pDM_Odm->SupportICType == ODM_RTL8723A) - { - switch(ElementID) + else if(pDM_Odm->SupportICType == ODM_RTL8192C) { - case ODM_H2C_RSSI_REPORT: - #if(RTL8723A_SUPPORT==1) - FillH2CCmd(Adapter, RSSI_SETTING_EID, CmdLen, pCmdBuffer); - #endif - break; - default: - break; + FillH2CCmd92C(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); } - } - else if(pDM_Odm->SupportICType == ODM_RTL8192D) - { - switch(ElementID) + else if(pDM_Odm->SupportICType == ODM_RTL8814A) { - case ODM_H2C_RSSI_REPORT: - #if(RTL8192D_SUPPORT==1) - FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); - #endif - break; - default: - break; + FillH2CCmd8814A(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); } - } -#endif - else - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) - FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); -#else - #if(RTL8192C_SUPPORT==1) - rtl8192c_FillH2CCmd(Adapter, RSSI_SETTING_EID, CmdLen, pCmdBuffer); - #endif -#endif - break; - default: - break; + else + { + FillH2CCmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); } - } -} -#else -u4Byte -ODM_FillH2CCmd( - IN pu1Byte pH2CBuffer, - IN u4Byte H2CBufferLen, - IN u4Byte CmdNum, - IN pu4Byte pElementID, - IN pu4Byte pCmdLen, - IN pu1Byte* pCmbBuffer, - IN pu1Byte CmdStartSeq - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - //FillH2CCmd(pH2CBuffer, H2CBufferLen, CmdNum, pElementID, pCmdLen, pCmbBuffer, CmdStartSeq); - return FALSE; -#endif - - return TRUE; + #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_hal_fill_h2c_cmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); + + #elif(DM_ODM_SUPPORT_TYPE & ODM_AP) + #if((RTL8881A_SUPPORT==1)||(RTL8192E_SUPPORT==1)||(RTL8814A_SUPPORT==1)) + if(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E|| pDM_Odm->SupportICType == ODM_RTL8814A) + { + GET_HAL_INTERFACE(pDM_Odm->priv)->FillH2CCmdHandler(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer); + //FillH2CCmd88XX(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer); + } else + #endif + #if(RTL8812A_SUPPORT==1) + if(pDM_Odm->SupportICType == ODM_RTL8812) + { + FillH2CCmd8812(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer); + } else + #endif + {} + #endif } -#endif - u8Byte ODM_GetCurrentTime( @@ -827,7 +916,7 @@ ODM_GetProgressingTime( return 0; #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) return rtw_get_passing_time_ms((u4Byte)Start_Time); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) return ((PlatformGetCurrentTime() - Start_Time)>>10); #endif } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.h index 6a6d50ce6953..b17437ec970d 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.h @@ -22,7 +22,7 @@ #ifndef __ODM_INTERFACE_H__ #define __ODM_INTERFACE_H__ - +#define INTERFACE_VERSION "1.0" /*2015.01.13 Dino*/ // // =========== Constant/Structure/Enum/... Define @@ -100,10 +100,13 @@ ODM_REG(DIG,_pDM_Odm) typedef enum _ODM_H2C_CMD { ODM_H2C_RSSI_REPORT = 0, - ODM_H2C_PSD_RESULT=1, + ODM_H2C_PSD_RESULT = 1, ODM_H2C_PathDiv = 2, ODM_H2C_WIFI_CALIBRATION = 3, ODM_H2C_IQ_CALIBRATION = 4, + ODM_H2C_RA_PARA_ADJUST = 5, + PHYDM_H2C_DYNAMIC_TX_PATH = 6, + PHYDM_H2C_FW_TRACE_EN = 7, ODM_MAX_H2CCMD }ODM_H2C_CMD; @@ -379,7 +382,6 @@ ODM_ReleaseTimer( // // ODM FW relative API. // -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) VOID ODM_FillH2CCmd( IN PDM_ODM_T pDM_Odm, @@ -387,18 +389,6 @@ ODM_FillH2CCmd( IN u4Byte CmdLen, IN pu1Byte pCmdBuffer ); -#else -u4Byte -ODM_FillH2CCmd( - IN pu1Byte pH2CBuffer, - IN u4Byte H2CBufferLen, - IN u4Byte CmdNum, - IN pu4Byte pElementID, - IN pu4Byte pCmdLen, - IN pu1Byte* pCmbBuffer, - IN pu1Byte CmdStartSeq - ); -#endif u8Byte ODM_GetCurrentTime( diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_pre_define.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_pre_define.h new file mode 100755 index 000000000000..6efe3e4a6e1b --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_pre_define.h @@ -0,0 +1,564 @@ +/****************************************************************************** + * + * 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 __PHYDMPREDEFINE_H__ +#define __PHYDMPREDEFINE_H__ + +//1 ============================================================ +//1 Definition +//1 ============================================================ + +//Max path of IC +#define MAX_PATH_NUM_92CS 2 +#define MAX_PATH_NUM_8188E 1 +#define MAX_PATH_NUM_8192E 2 +#define MAX_PATH_NUM_8723B 1 +#define MAX_PATH_NUM_8812A 2 +#define MAX_PATH_NUM_8821A 1 +#define MAX_PATH_NUM_8814A 4 +#define MAX_PATH_NUM_8822B 2 +#define MAX_PATH_NUM_8821B 2 + +//Max RF path +#define ODM_RF_PATH_MAX 2 +#define ODM_RF_PATH_MAX_JAGUAR 4 + +//number of entry +#if(DM_ODM_SUPPORT_TYPE & (ODM_CE)) + #define ASSOCIATE_ENTRY_NUM MACID_NUM_SW_LIMIT /* Max size of AsocEntry[].*/ + #define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM +#elif(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + #define ASSOCIATE_ENTRY_NUM NUM_STAT + #define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1 +#else + #define ODM_ASSOCIATE_ENTRY_NUM (ASSOCIATE_ENTRY_NUM*3)+1// Default port only one // 0 is for STA 1-n is for AP clients. +#endif + +/* -----MGN rate--------------------------------- */ + +#define ODM_MGN_1M 0x02 +#define ODM_MGN_2M 0x04 +#define ODM_MGN_5_5M 0x0b +#define ODM_MGN_11M 0x16 + +#define ODM_MGN_6M 0x0c +#define ODM_MGN_9M 0x12 +#define ODM_MGN_12M 0x18 +#define ODM_MGN_18M 0x24 +#define ODM_MGN_24M 0x30 +#define ODM_MGN_36M 0x48 +#define ODM_MGN_48M 0x60 +#define ODM_MGN_54M 0x6c + +/*TxHT = 1*/ +#define ODM_MGN_MCS0 0x80 +#define ODM_MGN_MCS1 0x81 +#define ODM_MGN_MCS2 0x82 +#define ODM_MGN_MCS3 0x83 +#define ODM_MGN_MCS4 0x84 +#define ODM_MGN_MCS5 0x85 +#define ODM_MGN_MCS6 0x86 +#define ODM_MGN_MCS7 0x87 +#define ODM_MGN_MCS8 0x88 +#define ODM_MGN_MCS9 0x89 +#define ODM_MGN_MCS10 0x8a +#define ODM_MGN_MCS11 0x8b +#define ODM_MGN_MCS12 0x8c +#define ODM_MGN_MCS13 0x8d +#define ODM_MGN_MCS14 0x8e +#define ODM_MGN_MCS15 0x8f +#define ODM_MGN_VHT1SS_MCS0 0x90 +#define ODM_MGN_VHT1SS_MCS1 0x91 +#define ODM_MGN_VHT1SS_MCS2 0x92 +#define ODM_MGN_VHT1SS_MCS3 0x93 +#define ODM_MGN_VHT1SS_MCS4 0x94 +#define ODM_MGN_VHT1SS_MCS5 0x95 +#define ODM_MGN_VHT1SS_MCS6 0x96 +#define ODM_MGN_VHT1SS_MCS7 0x97 +#define ODM_MGN_VHT1SS_MCS8 0x98 +#define ODM_MGN_VHT1SS_MCS9 0x99 +#define ODM_MGN_VHT2SS_MCS0 0x9a +#define ODM_MGN_VHT2SS_MCS1 0x9b +#define ODM_MGN_VHT2SS_MCS2 0x9c +#define ODM_MGN_VHT2SS_MCS3 0x9d +#define ODM_MGN_VHT2SS_MCS4 0x9e +#define ODM_MGN_VHT2SS_MCS5 0x9f +#define ODM_MGN_VHT2SS_MCS6 0xa0 +#define ODM_MGN_VHT2SS_MCS7 0xa1 +#define ODM_MGN_VHT2SS_MCS8 0xa2 +#define ODM_MGN_VHT2SS_MCS9 0xa3 + +#define ODM_MGN_MCS0_SG 0xc0 +#define ODM_MGN_MCS1_SG 0xc1 +#define ODM_MGN_MCS2_SG 0xc2 +#define ODM_MGN_MCS3_SG 0xc3 +#define ODM_MGN_MCS4_SG 0xc4 +#define ODM_MGN_MCS5_SG 0xc5 +#define ODM_MGN_MCS6_SG 0xc6 +#define ODM_MGN_MCS7_SG 0xc7 +#define ODM_MGN_MCS8_SG 0xc8 +#define ODM_MGN_MCS9_SG 0xc9 +#define ODM_MGN_MCS10_SG 0xca +#define ODM_MGN_MCS11_SG 0xcb +#define ODM_MGN_MCS12_SG 0xcc +#define ODM_MGN_MCS13_SG 0xcd +#define ODM_MGN_MCS14_SG 0xce +#define ODM_MGN_MCS15_SG 0xcf + +/* -----DESC rate--------------------------------- */ + +#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 + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #define ODM_NUM_RATE_IDX (ODM_RATEVHTSS4MCS9+1) +#else + #if (RTL8192E_SUPPORT == 1) + #define ODM_NUM_RATE_IDX (ODM_RATEMCS15+1) + #elif (RTL8723B_SUPPORT == 1)|| (RTL8188E_SUPPORT == 1) + #define ODM_NUM_RATE_IDX (ODM_RATEMCS7+1) + #elif (RTL8821A_SUPPORT == 1) || (RTL8881A_SUPPORT == 1) + #define ODM_NUM_RATE_IDX (ODM_RATEVHTSS1MCS9+1) + #elif (RTL8812A_SUPPORT == 1) + #define ODM_NUM_RATE_IDX (ODM_RATEVHTSS2MCS9+1) + #elif(RTL8814A_SUPPORT == 1) + #define ODM_NUM_RATE_IDX (ODM_RATEVHTSS3MCS9+1) + #else + #define ODM_NUM_RATE_IDX (ODM_RATEVHTSS4MCS9+1) + #endif +#endif + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#define CONFIG_SFW_SUPPORTED +#endif + +//1 ============================================================ +//1 enumeration +//1 ============================================================ + + +// ODM_CMNINFO_INTERFACE +typedef enum tag_ODM_Support_Interface_Definition +{ + ODM_ITRF_PCIE = 0x1, + ODM_ITRF_USB = 0x2, + ODM_ITRF_SDIO = 0x4, + ODM_ITRF_ALL = 0x7, +}ODM_INTERFACE_E; + +// ODM_CMNINFO_IC_TYPE +typedef enum tag_ODM_Support_IC_Type_Definition +{ + ODM_RTL8192S = BIT0, + ODM_RTL8192C = BIT1, + ODM_RTL8192D = BIT2, + ODM_RTL8723A = BIT3, + ODM_RTL8188E = BIT4, + ODM_RTL8812 = BIT5, + ODM_RTL8821 = BIT6, + ODM_RTL8192E = BIT7, + ODM_RTL8723B = BIT8, + ODM_RTL8814A = BIT9, + ODM_RTL8881A = BIT10, + ODM_RTL8821B = BIT11, + ODM_RTL8822B = BIT12, + ODM_RTL8703B = BIT13, + ODM_RTL8195A = BIT14, + ODM_RTL8188F = BIT15 +}ODM_IC_TYPE_E; + + + + +#define ODM_IC_11N_SERIES (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8703B|ODM_RTL8188F) +#define ODM_IC_11AC_SERIES (ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A|ODM_RTL8821B|ODM_RTL8822B) +#define ODM_IC_TXBF_SUPPORT (ODM_RTL8192E|ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A|ODM_RTL8822B) + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + +#ifdef RTK_AC_SUPPORT +#define ODM_IC_11AC_SERIES_SUPPORT 1 +#else +#define ODM_IC_11AC_SERIES_SUPPORT 0 +#endif + +#define ODM_IC_11N_SERIES_SUPPORT 1 +#define ODM_CONFIG_BT_COEXIST 0 + +#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) + +#define ODM_IC_11AC_SERIES_SUPPORT 1 +#define ODM_IC_11N_SERIES_SUPPORT 1 +#define ODM_CONFIG_BT_COEXIST 1 + +#else + +#if((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1) || (RTL8723A_SUPPORT == 1) || (RTL8188E_SUPPORT == 1) ||\ +(RTL8723B_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8195A_SUPPORT == 1)) +#define ODM_IC_11N_SERIES_SUPPORT 1 +#define ODM_IC_11AC_SERIES_SUPPORT 0 +#else +#define ODM_IC_11N_SERIES_SUPPORT 0 +#define ODM_IC_11AC_SERIES_SUPPORT 1 +#endif + +#ifdef CONFIG_BT_COEXIST +#define ODM_CONFIG_BT_COEXIST 1 +#else +#define ODM_CONFIG_BT_COEXIST 0 +#endif + +#endif + + +//ODM_CMNINFO_CUT_VER +typedef enum tag_ODM_Cut_Version_Definition +{ + ODM_CUT_A = 0, + ODM_CUT_B = 1, + ODM_CUT_C = 2, + ODM_CUT_D = 3, + ODM_CUT_E = 4, + ODM_CUT_F = 5, + + ODM_CUT_I = 8, + ODM_CUT_J = 9, + ODM_CUT_K = 10, + ODM_CUT_TEST = 15, +}ODM_CUT_VERSION_E; + +// ODM_CMNINFO_FAB_VER +typedef enum tag_ODM_Fab_Version_Definition +{ + ODM_TSMC = 0, + ODM_UMC = 1, +}ODM_FAB_E; + +// ODM_CMNINFO_RF_TYPE +// +// For example 1T2R (A+AB = BIT0|BIT4|BIT5) +// +typedef enum tag_ODM_RF_Path_Bit_Definition +{ + ODM_RF_TX_A = BIT0, + ODM_RF_TX_B = BIT1, + ODM_RF_TX_C = BIT2, + ODM_RF_TX_D = BIT3, + ODM_RF_RX_A = BIT4, + ODM_RF_RX_B = BIT5, + ODM_RF_RX_C = BIT6, + ODM_RF_RX_D = BIT7, +}ODM_RF_PATH_E; + +typedef enum tag_PHYDM_RF_TX_NUM { + ODM_1T = 1, + ODM_2T = 2, + ODM_3T = 3, + ODM_4T = 4, +} ODM_RF_TX_NUM_E; + +typedef enum tag_ODM_RF_Type_Definition { + ODM_1T1R, + ODM_1T2R, + ODM_2T2R, + ODM_2T2R_GREEN, + ODM_2T3R, + ODM_2T4R, + ODM_3T3R, + ODM_3T4R, + ODM_4T4R, + ODM_XTXR +}ODM_RF_TYPE_E; + + +typedef enum tag_ODM_MAC_PHY_Mode_Definition +{ + ODM_SMSP = 0, + ODM_DMSP = 1, + ODM_DMDP = 2, +}ODM_MAC_PHY_MODE_E; + + +typedef enum tag_BT_Coexist_Definition +{ + ODM_BT_BUSY = 1, + ODM_BT_ON = 2, + ODM_BT_OFF = 3, + ODM_BT_NONE = 4, +}ODM_BT_COEXIST_E; + +// ODM_CMNINFO_OP_MODE +typedef enum tag_Operation_Mode_Definition +{ + ODM_NO_LINK = BIT0, + ODM_LINK = BIT1, + ODM_SCAN = BIT2, + ODM_POWERSAVE = BIT3, + ODM_AP_MODE = BIT4, + ODM_CLIENT_MODE = BIT5, + ODM_AD_HOC = BIT6, + ODM_WIFI_DIRECT = BIT7, + ODM_WIFI_DISPLAY = BIT8, +}ODM_OPERATION_MODE_E; + +// ODM_CMNINFO_WM_MODE +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) +typedef enum tag_Wireless_Mode_Definition +{ + ODM_WM_UNKNOW = 0x0, + ODM_WM_B = BIT0, + ODM_WM_G = BIT1, + ODM_WM_A = BIT2, + ODM_WM_N24G = BIT3, + ODM_WM_N5G = BIT4, + ODM_WM_AUTO = BIT5, + ODM_WM_AC = BIT6, +}ODM_WIRELESS_MODE_E; +#else +typedef enum tag_Wireless_Mode_Definition +{ + ODM_WM_UNKNOWN = 0x00,/*0x0*/ + ODM_WM_A = BIT0, /* 0x1*/ + ODM_WM_B = BIT1, /* 0x2*/ + ODM_WM_G = BIT2,/* 0x4*/ + ODM_WM_AUTO = BIT3,/* 0x8*/ + ODM_WM_N24G = BIT4,/* 0x10*/ + ODM_WM_N5G = BIT5,/* 0x20*/ + ODM_WM_AC_5G = BIT6,/* 0x40*/ + ODM_WM_AC_24G = BIT7,/* 0x80*/ + ODM_WM_AC_ONLY = BIT8,/* 0x100*/ + ODM_WM_MAX = BIT11/* 0x800*/ + +}ODM_WIRELESS_MODE_E; +#endif + +// ODM_CMNINFO_BAND +typedef enum tag_Band_Type_Definition +{ +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) + ODM_BAND_2_4G = BIT0, + ODM_BAND_5G = BIT1, +#else + ODM_BAND_2_4G = 0, + ODM_BAND_5G, + ODM_BAND_ON_BOTH, + ODM_BANDMAX +#endif +}ODM_BAND_TYPE_E; + + +// ODM_CMNINFO_SEC_CHNL_OFFSET +typedef enum tag_Secondary_Channel_Offset_Definition +{ + ODM_DONT_CARE = 0, + ODM_BELOW = 1, + ODM_ABOVE = 2 +}ODM_SEC_CHNL_OFFSET_E; + +// ODM_CMNINFO_SEC_MODE +typedef enum tag_Security_Definition +{ + ODM_SEC_OPEN = 0, + ODM_SEC_WEP40 = 1, + ODM_SEC_TKIP = 2, + ODM_SEC_RESERVE = 3, + ODM_SEC_AESCCMP = 4, + ODM_SEC_WEP104 = 5, + ODM_WEP_WPA_MIXED = 6, // WEP + WPA + ODM_SEC_SMS4 = 7, +}ODM_SECURITY_E; + +// ODM_CMNINFO_BW +typedef enum tag_Bandwidth_Definition +{ + ODM_BW20M = 0, + ODM_BW40M = 1, + ODM_BW80M = 2, + ODM_BW160M = 3, + ODM_BW10M = 4, +}ODM_BW_E; + +// ODM_CMNINFO_CHNL + +// ODM_CMNINFO_BOARD_TYPE +typedef enum tag_Board_Definition +{ + ODM_BOARD_DEFAULT = 0, // The DEFAULT case. + ODM_BOARD_MINICARD = BIT(0), // 0 = non-mini card, 1= mini card. + ODM_BOARD_SLIM = BIT(1), // 0 = non-slim card, 1 = slim card + ODM_BOARD_BT = BIT(2), // 0 = without BT card, 1 = with BT + ODM_BOARD_EXT_PA = BIT(3), // 0 = no 2G ext-PA, 1 = existing 2G ext-PA + ODM_BOARD_EXT_LNA = BIT(4), // 0 = no 2G ext-LNA, 1 = existing 2G ext-LNA + ODM_BOARD_EXT_TRSW = BIT(5), // 0 = no ext-TRSW, 1 = existing ext-TRSW + ODM_BOARD_EXT_PA_5G = BIT(6), // 0 = no 5G ext-PA, 1 = existing 5G ext-PA + ODM_BOARD_EXT_LNA_5G= BIT(7), // 0 = no 5G ext-LNA, 1 = existing 5G ext-LNA +}ODM_BOARD_TYPE_E; + +typedef enum tag_ODM_Package_Definition +{ + ODM_PACKAGE_DEFAULT = 0, + ODM_PACKAGE_QFN68 = BIT(0), + ODM_PACKAGE_TFBGA90 = BIT(1), + ODM_PACKAGE_TFBGA79 = BIT(2), +}ODM_Package_TYPE_E; + +typedef enum tag_ODM_TYPE_GPA_Definition +{ + TYPE_GPA0 = 0, + TYPE_GPA1 = BIT(1)|BIT(0) +}ODM_TYPE_GPA_E; + +typedef enum tag_ODM_TYPE_APA_Definition +{ + TYPE_APA0 = 0, + TYPE_APA1 = BIT(1)|BIT(0) +}ODM_TYPE_APA_E; + +typedef enum tag_ODM_TYPE_GLNA_Definition +{ + TYPE_GLNA0 = 0, + TYPE_GLNA1 = BIT(2)|BIT(0), + TYPE_GLNA2 = BIT(3)|BIT(1), + TYPE_GLNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0) +}ODM_TYPE_GLNA_E; + +typedef enum tag_ODM_TYPE_ALNA_Definition +{ + TYPE_ALNA0 = 0, + TYPE_ALNA1 = BIT(2)|BIT(0), + TYPE_ALNA2 = BIT(3)|BIT(1), + TYPE_ALNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0) +}ODM_TYPE_ALNA_E; + + +typedef enum _ODM_RF_RADIO_PATH { + ODM_RF_PATH_A = 0, //Radio Path A + ODM_RF_PATH_B = 1, //Radio Path B + ODM_RF_PATH_C = 2, //Radio Path C + ODM_RF_PATH_D = 3, //Radio Path D + ODM_RF_PATH_AB, + ODM_RF_PATH_AC, + ODM_RF_PATH_AD, + ODM_RF_PATH_BC, + ODM_RF_PATH_BD, + ODM_RF_PATH_CD, + ODM_RF_PATH_ABC, + ODM_RF_PATH_ACD, + ODM_RF_PATH_BCD, + ODM_RF_PATH_ABCD, + // ODM_RF_PATH_MAX, //Max RF number 90 support +} ODM_RF_RADIO_PATH_E, *PODM_RF_RADIO_PATH_E; + + + + + + +#endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_precomp.h index 5651d7eaa190..e832755fd639 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_precomp.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_precomp.h @@ -25,11 +25,24 @@ #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) #include "Precomp.h" // We need to include mp_precomp.h due to batch file setting. - #else - #define TEST_FALG___ 1 +#endif +#if (DM_ODM_SUPPORT_TYPE ==ODM_CE) +#define RTL8192CE_SUPPORT 0 +#define RTL8192CU_SUPPORT 0 +#define RTL8192C_SUPPORT 0 + +#define RTL8192DE_SUPPORT 0 +#define RTL8192DU_SUPPORT 0 +#define RTL8192D_SUPPORT 0 + +#define RTL8723AU_SUPPORT 0 +#define RTL8723AS_SUPPORT 0 +#define RTL8723AE_SUPPORT 0 +#define RTL8723A_SUPPORT 0 +#define RTL8723_FPGA_VERIFICATION 0 #endif //2 Config Flags and Structs - defined by each ODM Type @@ -50,216 +63,110 @@ #include "../8192cd_headers.h" #include "../8192cd_debug.h" #endif - -#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) - // Flags - #include "../8192cd_cfg.h" // OUTSRC needs ADSL config flags. - #include "../odm_inc.h" // OUTSRC needs some extra flags. - // Data Structure - #include "../common_types.h" // OUTSRC and rtl8192cd both needs basic type such as UINT8 and BIT0. - #include "../8192cd.h" // OUTSRC needs basic ADSL struct definition. - #include "../8192cd_util.h" // OUTSRC needs basic I/O function. - #ifdef _BIG_ENDIAN_ - #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG - #else - #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE - #endif - #ifdef ADSL_AP_BUILD_WORKAROUND - // NESTED_INC: Functions defined outside should not be included!! Marked by Annie, 2011-10-14. - #include "../8192cd_headers.h" - #include "../8192cd_debug.h" - #endif - #elif (DM_ODM_SUPPORT_TYPE ==ODM_CE) - //#include - //#include - //#include - //#include - //#include - //#include -#define BEAMFORMING_SUPPORT 0 + #define BEAMFORMING_SUPPORT 0 + #define __PACK + #define __WLAN_ATTRIB_PACK__ #elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) #include "Mp_Precomp.h" #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE + #define __PACK + #define __WLAN_ATTRIB_PACK__ #endif - -//2 Hardware Parameter Files - - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#if (RTL8192C_SUPPORT==1) - #include "rtl8192c/Hal8192CEFWImg_AP.h" - #include "rtl8192c/Hal8192CEPHYImg_AP.h" - #include "rtl8192c/Hal8192CEMACImg_AP.h" -#endif -#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) - #include "rtl8192c/Hal8192CEFWImg_ADSL.h" - #include "rtl8192c/Hal8192CEPHYImg_ADSL.h" - #include "rtl8192c/Hal8192CEMACImg_ADSL.h" - -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - #if(RTL8192CE_SUPPORT ==1) - #include "rtl8192c/Hal8192CEFWImg_CE.h" - #include "rtl8192c/Hal8192CEPHYImg_CE.h" - #include "rtl8192c/Hal8192CEMACImg_CE.h" - #endif - - #if(RTL8192CU_SUPPORT ==1) - #include "rtl8192c/Hal8192CUFWImg_CE.h" - #include "rtl8192c/Hal8192CUPHYImg_CE.h" - #include "rtl8192c/Hal8192CUMACImg_CE.h" - #endif - - #if(RTL8192DE_SUPPORT ==1) - #include "rtl8192d/Hal8192DEFWImg_CE.h" - #include "rtl8192d/Hal8192DEPHYImg_CE.h" - #include "rtl8192d/Hal8192DEMACImg_CE.h" - #endif - - #if(RTL8192DU_SUPPORT ==1) - #include "rtl8192d/Hal8192DUFWImg_CE.h" - #include "rtl8192d/Hal8192DUPHYImg_CE.h" - #include "rtl8192d/Hal8192DUMACImg_CE.h" - #endif - - #if(RTL8723AS_SUPPORT==1) - #include "rtl8723a/Hal8723SHWImg_CE.h" - #endif - - #if(RTL8723AU_SUPPORT==1) - #include "rtl8723a/Hal8723UHWImg_CE.h" - #endif - -#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) - -#endif - - //2 OutSrc Header Files -#include "phydm.h" + +#include "phydm.h" #include "phydm_HWConfig.h" #include "phydm_debug.h" #include "phydm_RegDefine11AC.h" #include "phydm_RegDefine11N.h" -#include "phydm_AntDiv.h" #include "phydm_interface.h" #include "phydm_reg.h" +#include "HalPhyRf.h" -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#if (RTL8192C_SUPPORT==1) - #include "rtl8192c/HalDMOutSrc8192C_AP.h" -#endif -#if (RTL8188E_SUPPORT==1) - #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training -#endif - -#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) - #include "rtl8192c/HalDMOutSrc8192C_ADSL.h" - -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - //#include "hal_com.h" - #include "HalPhyRf.h" - #if (RTL8192C_SUPPORT==1) - #ifdef CONFIG_INTEL_PROXIM - #include "../proxim/intel_proxim.h" - #endif - #include "rtl8192c/HalDMOutSrc8192C_CE.h" - #include - #endif - - #if (RTL8192D_SUPPORT==1) - #include "rtl8192d/HalDMOutSrc8192D_CE.h" - #include "rtl8192d_hal.h" - #endif - - #if (RTL8723A_SUPPORT==1) - #include "rtl8192c/HalDMOutSrc8192C_CE.h" //for IQK,LCK,Power-tracking - #include "rtl8723a_hal.h" - #endif - - #if (RTL8188E_SUPPORT==1) - #include "rtl8188e/HalPhyRf_8188e.h"//for IQK,LCK,Power-tracking - #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training - #include "rtl8188e_hal.h" - #endif - - #if (RTL8192E_SUPPORT==1) - #include "rtl8192e/HalPhyRf_8192e.h"//for IQK,LCK,Power-tracking - #include "rtl8192e_hal.h" - #endif - - #if (RTL8812A_SUPPORT==1) - #include "rtl8812a/HalPhyRf_8812A.h"//for IQK,LCK,Power-tracking - #include "rtl8812a_hal.h" - #endif - - #if (RTL8821A_SUPPORT==1) - #include "rtl8821a/HalPhyRf_8821A.h"//for IQK,LCK,Power-tracking - #include "rtl8812a/HalPhyRf_8812A.h"//for IQK,LCK,Power-tracking - #include "rtl8812a_hal.h" - #include "rtl8821a/PhyDM_IQK_8821A.h" - #endif - - #if (RTL8723B_SUPPORT==1) - #include "rtl8723b/HalPhyRf_8723B.h"//for IQK,LCK,Power-tracking - #include "rtl8723b_hal.h" - #endif -#endif - - -#if (RTL8192C_SUPPORT==1) -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#include "rtl8192c/Hal8192CHWImg_MAC.h" -#include "rtl8192c/Hal8192CHWImg_RF.h" -#include "rtl8192c/Hal8192CHWImg_BB.h" -#include "rtl8192c/Hal8192CHWImg_FW.h" -#endif -#include "rtl8192c/phydm_RTL8192C.h" -#endif -#if (RTL8192D_SUPPORT==1) -#include "rtl8192d/phydm_RTL8192D.h" -#endif - -#if (RTL8723A_SUPPORT==1) -#include "rtl8723a/HalHWImg8723A_MAC.h" -#include "rtl8723a/HalHWImg8723A_RF.h" -#include "rtl8723a/HalHWImg8723A_BB.h" -#include "rtl8723a/HalHWImg8723A_FW.h" -#include "rtl8723a/phydm_RegConfig8723A.h" +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) +#define RTL8821B_SUPPORT 0 +#define RTL8822B_SUPPORT 0 +#define RTL8703B_SUPPORT 0 +#define RTL8188F_SUPPORT 0 #endif #if (RTL8188E_SUPPORT==1) +#include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training #include "rtl8188e/HalHWImg8188E_MAC.h" #include "rtl8188e/HalHWImg8188E_RF.h" #include "rtl8188e/HalHWImg8188E_BB.h" #include "rtl8188e/HalHWImg8188E_FW.h" -#include "rtl8188e/Hal8188EReg.h" - -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) +#include "rtl8188e/phydm_RegConfig8188E.h" +#include "rtl8188e/phydm_RTL8188E.h" #include "rtl8188e/HalPhyRf_8188e.h" +#include "rtl8188e/Hal8188EReg.h" +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + #include "rtl8188e_hal.h" #endif +#endif //88E END -#if (TESTCHIP_SUPPORT == 1) -#include "rtl8188e/HalHWImg8188E_TestChip_MAC.h" -#include "rtl8188e/HalHWImg8188E_TestChip_RF.h" -#include "rtl8188e/HalHWImg8188E_TestChip_BB.h" +#if (RTL8192E_SUPPORT==1) +#include "rtl8192e/HalPhyRf_8192e.h" //FOR_8192E_IQK +#include "rtl8192e/phydm_RTL8192E.h" //FOR_8192E_IQK +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) + #include "rtl8192e/HalHWImg8192E_BB.h" + #include "rtl8192e/HalHWImg8192E_MAC.h" + #include "rtl8192e/HalHWImg8192E_RF.h" + #include "rtl8192e/phydm_RegConfig8192E.h" + #include "rtl8192e/HalHWImg8192E_FW.h" + #include "rtl8192e/Hal8192EReg.h" #endif - - -#include "rtl8188e/phydm_RegConfig8188E.h" -#include "rtl8188e/phydm_RTL8188E.h" +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + #include "rtl8192e_hal.h" #endif +#endif //92E END -#if (RTL8192E_SUPPORT==1) -#include "rtl8192e/HalHWImg8192E_MAC.h" -#include "rtl8192e/HalHWImg8192E_RF.h" -#include "rtl8192e/HalHWImg8192E_BB.h" -#include "rtl8192e/HalHWImg8192E_FW.h" -#include "rtl8192e/Hal8192EReg.h" -#include "rtl8192e/phydm_RegConfig8192E.h" -#include "rtl8192e/phydm_RTL8192E.h" +#if (RTL8812A_SUPPORT==1) +#include "rtl8812a/HalPhyRf_8812A.h" //FOR_8812_IQK +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) + #include "rtl8812a/HalHWImg8812A_BB.h" + #include "rtl8812a/HalHWImg8812A_MAC.h" + #include "rtl8812a/HalHWImg8812A_RF.h" + #include "rtl8812a/phydm_RegConfig8812A.h" + #include "rtl8812a/HalHWImg8812A_FW.h" + #include "rtl8812a/phydm_RTL8812A.h" +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + #include "rtl8812a_hal.h" +#endif +#endif //8812 END + +#if (RTL8814A_SUPPORT==1) +#include "rtl8814a/HalPhyRf_8814A.h" +#include "rtl8814a/HalHWImg8814A_MAC.h" +#include "rtl8814a/HalHWImg8814A_RF.h" +#include "rtl8814a/HalHWImg8814A_BB.h" +#if (DM_ODM_SUPPORT_TYPE != ODM_AP) + #include "rtl8814a/HalHWImg8814A_FW.h" + #include "rtl8814a/phydm_RTL8814A.h" +#endif + #include "rtl8814a/phydm_RegConfig8814A.h" +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + #include "rtl8814a_hal.h" + #include "rtl8814a/PhyDM_IQK_8814A.h" +#endif +#endif //8814 END + +#if (RTL8881A_SUPPORT==1)//FOR_8881_IQK +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +#include "rtl8821a/PhyDM_IQK_8821A_WIN.h" +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) +#include "rtl8821a/PhyDM_IQK_8821A_CE.h" +#else +#include "rtl8821a/PhyDM_IQK_8821A_AP.h" +#endif +//#include "rtl8881a/HalHWImg8881A_BB.h" +//#include "rtl8881a/HalHWImg8881A_MAC.h" +//#include "rtl8881a/HalHWImg8881A_RF.h" +//#include "rtl8881a/odm_RegConfig8881A.h" #endif #if (RTL8723B_SUPPORT==1) @@ -267,22 +174,16 @@ #include "rtl8723b/HalHWImg8723B_RF.h" #include "rtl8723b/HalHWImg8723B_BB.h" #include "rtl8723b/HalHWImg8723B_FW.h" -#include "rtl8723b/HalHWImg8723B_MP.h" -#include "rtl8723b/Hal8723BReg.h" -#include "rtl8723b/phydm_RTL8723B.h" #include "rtl8723b/phydm_RegConfig8723B.h" +#include "rtl8723b/phydm_RTL8723B.h" +#include "rtl8723b/HalPhyRf_8723B.h" +#include "rtl8723b/Hal8723BReg.h" +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + #include "rtl8723b/HalHWImg8723B_MP.h" + #include "rtl8723b_hal.h" #endif - -#if (RTL8812A_SUPPORT==1) -#include "rtl8812a/HalHWImg8812A_MAC.h" -#include "rtl8812a/HalHWImg8812A_RF.h" -#include "rtl8812a/HalHWImg8812A_BB.h" -#include "rtl8812a/HalHWImg8812A_FW.h" -#include "rtl8812a/phydm_RegConfig8812A.h" -#include "rtl8812a/phydm_RTL8812A.h" #endif - #if (RTL8821A_SUPPORT==1) #include "rtl8821a/HalHWImg8821A_MAC.h" #include "rtl8821a/HalHWImg8821A_RF.h" @@ -290,6 +191,57 @@ #include "rtl8821a/HalHWImg8821A_FW.h" #include "rtl8821a/phydm_RegConfig8821A.h" #include "rtl8821a/phydm_RTL8821A.h" +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + #include "rtl8821a/HalPhyRf_8821A_WIN.h" +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + #include "rtl8821a/HalPhyRf_8821A_CE.h" + #include "rtl8821a/PhyDM_IQK_8821A_CE.h"/*for IQK*/ + #include "rtl8812a/HalPhyRf_8812A.h"/*for IQK,LCK,Power-tracking*/ + #include "rtl8812a_hal.h" +#else +#endif +#endif + +#if (RTL8821B_SUPPORT==1) +#include "rtl8821b/HalHWImg8821B_MAC.h" +#include "rtl8821b/HalHWImg8821B_RF.h" +#include "rtl8821b/HalHWImg8821B_BB.h" +#include "rtl8821b/HalHWImg8821B_FW.h" +#include "rtl8821b/phydm_RegConfig8821B.h" +#include "rtl8821b/HalHWImg8821B_TestChip_MAC.h" +#include "rtl8821b/HalHWImg8821B_TestChip_RF.h" +#include "rtl8821b/HalHWImg8821B_TestChip_BB.h" +#include "rtl8821b/HalHWImg8821B_TestChip_FW.h" +#include "rtl8821b/HalPhyRf_8821B.h" +#endif + +#if (RTL8822B_SUPPORT==1) +#include "rtl8822B/HalHWImg8822B_MAC.h" +#include "rtl8822B/HalHWImg8822B_RF.h" +#include "rtl8822B/HalHWImg8822B_BB.h" +#include "rtl8822B/HalHWImg8822B_FW.h" +#include "rtl8822B/phydm_RegConfig8822B.h" +#include "rtl8822B/HalHWImg8822B_TestChip_MAC.h" +#include "rtl8822B/HalHWImg8822B_TestChip_RF.h" +#include "rtl8822B/HalHWImg8822B_TestChip_BB.h" +#include "rtl8822B/HalHWImg8822B_TestChip_FW.h" +#include "rtl8822b/HalPhyRf_8822B.h" +#endif + +#if (RTL8703B_SUPPORT==1) +#include "rtl8703b/phydm_RegConfig8703B.h" +#include "rtl8703b/HalHWImg8703B_TestChip_MAC.h" +#include "rtl8703b/HalHWImg8703B_TestChip_RF.h" +#include "rtl8703b/HalHWImg8703B_TestChip_BB.h" +#include "rtl8703b/HalHWImg8703B_FW.h" +#endif + +#if (RTL8188F_SUPPORT==1) +#include "rtl8188f/phydm_RegConfig8188F.h" +#include "rtl8188f/HalHWImg8188F_TestChip_MAC.h" +#include "rtl8188f/HalHWImg8188F_TestChip_RF.h" +#include "rtl8188f/HalHWImg8188F_TestChip_BB.h" +#include "rtl8188f/HalHWImg8188F_FW.h" #endif #endif // __ODM_PRECOMP_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_types.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_types.h index ddeb1a8a8a1f..c1b93eaa7f4c 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_types.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_types.h @@ -20,101 +20,6 @@ #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 // @@ -123,7 +28,7 @@ #define ODM_CE 0x04 //BIT2 #define ODM_WIN 0x08 //BIT3 -#define DM_ODM_SUPPORT_TYPE ODM_CE +#define DM_ODM_SUPPORT_TYPE ODM_CE // Deifne HW endian support #define ODM_ENDIAN_BIG 0 @@ -205,6 +110,7 @@ typedef enum _RT_SPINLOCK_TYPE{ RT_CHNLLIST_SPINLOCK = 40, RT_INDIC_SPINLOCK = 41, //protect indication RT_RFD_SPINLOCK = 42, + RT_SYNC_IO_CNT_SPINLOCK = 43, RT_LAST_SPINLOCK, }RT_SPINLOCK_TYPE; @@ -215,9 +121,12 @@ typedef enum _RT_SPINLOCK_TYPE{ #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 + #define CONFIG_HW_ANTENNA_DIVERSITY + #define CONFIG_SW_ANTENNA_DIVERSITY + /*#define CONFIG_PATH_DIVERSITY*/ + /*#define CONFIG_RA_DYNAMIC_RTY_LIMIT*/ + #define CONFIG_ANT_DETECTION + #define CONFIG_RA_DBG_CMD #elif (DM_ODM_SUPPORT_TYPE == ODM_AP) @@ -225,13 +134,19 @@ typedef enum _RT_SPINLOCK_TYPE{ #define ADSL_AP_BUILD_WORKAROUND #define AP_BUILD_WORKAROUND + //2 [ Configure RA Debug H2C CMD ] + #define CONFIG_RA_DBG_CMD + + /*#define CONFIG_PATH_DIVERSITY*/ + /*#define CONFIG_RA_DYNAMIC_RTY_LIMIT*/ + //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)) + #if(!defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A) && !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 @@ -241,9 +156,10 @@ typedef enum _RT_SPINLOCK_TYPE{ #define CONFIG_5G_CGCS_RX_DIVERSITY #elif defined(CONFIG_5G_CG_TRX_DIVERSITY_8881A) #define CONFIG_5G_CG_TRX_DIVERSITY + #elif defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A) + #define CONFIG_2G5G_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)) + #if(!defined(CONFIG_NO_5G_DIVERSITY) && !defined(CONFIG_5G_CGCS_RX_DIVERSITY) && !defined(CONFIG_5G_CG_TRX_DIVERSITY) && !defined(CONFIG_2G5G_CG_TRX_DIVERSITY) && !defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) #define CONFIG_NO_5G_DIVERSITY #endif //---------- @@ -253,7 +169,7 @@ typedef enum _RT_SPINLOCK_TYPE{ #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) ) + #elif( (!defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_NO_5G_DIVERSITY)) || defined(CONFIG_2G5G_CG_TRX_DIVERSITY) ) #define CONFIG_2G5G_SUPPORT_ANTDIV #endif //---------- @@ -291,42 +207,14 @@ typedef enum _RT_SPINLOCK_TYPE{ #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 + /*#define CONFIG_RA_DBG_CMD*/ + /*#define CONFIG_ANT_DETECTION*/ + /*#define CONFIG_PATH_DIVERSITY*/ + /*#define CONFIG_RA_DYNAMIC_RTY_LIMIT*/ + #if 0 typedef u8 u1Byte, *pu1Byte; typedef u16 u2Byte,*pu2Byte; @@ -396,8 +284,9 @@ typedef enum _RT_SPINLOCK_TYPE{ //define useless flag to avoid compile warning #define USE_WORKITEM 0 - #define FOR_BRAZIL_PRETEST 0 - #define FPGA_TWO_MAC_VERIFICATION 0 + #define FOR_BRAZIL_PRETEST 0 + /*#define BT_30_SUPPORT 0*/ + #define FPGA_TWO_MAC_VERIFICATION 0 #define RTL8881A_SUPPORT 0 #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c index e528518746c1..8faf1c1f703e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c @@ -18,6 +18,7 @@ * ******************************************************************************/ +/*Image2HeaderVersion: 2.9*/ #include "Mp_Precomp.h" #include "../phydm_precomp.h" @@ -36,11 +37,12 @@ CheckPositive( ((pDM_Odm->BoardType & BIT2) >> 2) << 4; // _BT u4Byte cond1 = Condition1, cond2 = Condition2; - u4Byte driver1 = pDM_Odm->CutVersion << 24 | - pDM_Odm->SupportPlatform << 16 | - pDM_Odm->PackageType << 12 | - pDM_Odm->SupportInterface << 8 | - _BoardType; + u4Byte driver1 = pDM_Odm->CutVersion << 24 | + (pDM_Odm->SupportInterface & 0xF0) << 16 | + pDM_Odm->SupportPlatform << 16 | + pDM_Odm->PackageType << 12 | + (pDM_Odm->SupportInterface & 0x0F) << 8 | + _BoardType; u4Byte driver2 = pDM_Odm->TypeGLNA << 0 | pDM_Odm->TypeGPA << 8 | @@ -58,44 +60,41 @@ CheckPositive( (" (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType)); - //============== Value Defined Check ===============// - //QFN Type [15:12] and Cut Version [27:24] need to do value check + /*============== Value Defined Check ===============*/ + /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ - if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) + if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) return FALSE; - if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) - return FALSE; - - //=============== Bit Defined Check ================// - // We don't care [31:28] and [23:20] - // - cond1 &= 0x000F0FFF; - driver1 &= 0x000F0FFF; - - if ((cond1 & driver1) == cond1) - { - u4Byte bitMask = 0; - if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE + if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) + return FALSE; + + /*=============== Bit Defined Check ================*/ + /* We don't care [31:28] */ + + cond1 &= 0x00FF0FFF; + driver1 &= 0x00FF0FFF; + + if ((cond1 & driver1) == cond1) { + u4Byte bitMask = 0; + + if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ return TRUE; - if ((cond1 & BIT0) != 0) //GLNA + if ((cond1 & BIT0) != 0) /*GLNA*/ bitMask |= 0x000000FF; - if ((cond1 & BIT1) != 0) //GPA + if ((cond1 & BIT1) != 0) /*GPA*/ bitMask |= 0x0000FF00; - if ((cond1 & BIT2) != 0) //ALNA + if ((cond1 & BIT2) != 0) /*ALNA*/ bitMask |= 0x00FF0000; - if ((cond1 & BIT3) != 0) //APA + if ((cond1 & BIT3) != 0) /*APA*/ bitMask |= 0xFF000000; - if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched + if ((cond2 & bitMask) == (driver2 & bitMask)) /* BoardType of each RF path is matched*/ return TRUE; - else + else return FALSE; - } - else - { + } else return FALSE; - } } static BOOLEAN CheckNegative( @@ -254,58 +253,42 @@ ODM_ReadAndConfig_MP_8723B_AGC_TAB( u4Byte i = 0; u1Byte cCond; BOOLEAN bMatched = TRUE, bSkipped = FALSE; -//ask by Luke.Lee u4Byte ArrayLen = sizeof(Array_MP_8723B_AGC_TAB)/sizeof(u4Byte); pu4Byte Array = Array_MP_8723B_AGC_TAB; ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_AGC_TAB\n")); - while(( i+1) < ArrayLen) - { + while ((i + 1) < ArrayLen) { u4Byte v1 = Array[i]; u4Byte v2 = Array[i+1]; - if(v1 & (BIT31|BIT30)) //positive & negative condition - { - if(v1 & BIT31) // positive condition - { + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if(cCond == COND_ENDIF) //end - { + if (cCond == COND_ENDIF) {/*end*/ bMatched = TRUE; bSkipped = FALSE; - } - else if(cCond == COND_ELSE) //else - { + } else if (cCond == COND_ELSE) /*else*/ bMatched = bSkipped?FALSE:TRUE; - } - else //if , else if - { - if(bSkipped) + else {/*if , else if*/ + if (bSkipped) bMatched = FALSE; - else - { - if(CheckPositive(pDM_Odm, v1, v2)) - { + else { + if (CheckPositive(pDM_Odm, v1, v2)) { bMatched = TRUE; bSkipped = TRUE; - } - else - { + } else { bMatched = FALSE; bSkipped = FALSE; } } } + } else if (v1 & BIT30) { /*negative condition*/ + /*do nothing*/ } - else if(v1 & BIT30){ //negative condition - //do nothing - } - } - else - { - if(bMatched) - odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2); + } else { + if (bMatched) + odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2); } i = i + 2; } @@ -314,7 +297,7 @@ ODM_ReadAndConfig_MP_8723B_AGC_TAB( u4Byte ODM_GetVersion_MP_8723B_AGC_TAB(void) { - return 12; + return 18; } /****************************************************************************** @@ -408,7 +391,7 @@ u4Byte Array_MP_8723B_PHY_REG[] = { 0xC4C, 0x007F037F, 0xC50, 0x69553420, 0xC54, 0x43BC0094, - 0xC58, 0x00013149, + 0xC58, 0x00013147, 0xC5C, 0x00250492, 0xC60, 0x00000000, 0xC64, 0x7112848B, @@ -419,7 +402,7 @@ u4Byte Array_MP_8723B_PHY_REG[] = { 0xC78, 0x0000001F, 0xC7C, 0x00B91612, 0xC80, 0x390000E4, - 0xC84, 0x20F60000, + 0xC84, 0x21F60000, 0xC88, 0x40000100, 0xC8C, 0x20200000, 0xC90, 0x00020E1A, @@ -526,58 +509,42 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG( u4Byte i = 0; u1Byte cCond; BOOLEAN bMatched = TRUE, bSkipped = FALSE; -//ask by Luke.Lee u4Byte ArrayLen = sizeof(Array_MP_8723B_PHY_REG)/sizeof(u4Byte); pu4Byte Array = Array_MP_8723B_PHY_REG; ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG\n")); - while(( i+1) < ArrayLen) - { + while ((i + 1) < ArrayLen) { u4Byte v1 = Array[i]; u4Byte v2 = Array[i+1]; - if(v1 & (BIT31|BIT30)) //positive & negative condition - { - if(v1 & BIT31) // positive condition - { + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if(cCond == COND_ENDIF) //end - { + if (cCond == COND_ENDIF) {/*end*/ bMatched = TRUE; bSkipped = FALSE; - } - else if(cCond == COND_ELSE) //else - { + } else if (cCond == COND_ELSE) /*else*/ bMatched = bSkipped?FALSE:TRUE; - } - else //if , else if - { - if(bSkipped) + else {/*if , else if*/ + if (bSkipped) bMatched = FALSE; - else - { - if(CheckPositive(pDM_Odm, v1, v2)) - { + else { + if (CheckPositive(pDM_Odm, v1, v2)) { bMatched = TRUE; bSkipped = TRUE; - } - else - { + } else { bMatched = FALSE; bSkipped = FALSE; } } } + } else if (v1 & BIT30) { /*negative condition*/ + /*do nothing*/ } - else if(v1 & BIT30){ //negative condition - //do nothing - } - } - else - { - if(bMatched) - odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2); + } else { + if (bMatched) + odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2); } i = i + 2; } @@ -586,7 +553,7 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG( u4Byte ODM_GetVersion_MP_8723B_PHY_REG(void) { - return 12; + return 18; } /****************************************************************************** @@ -616,14 +583,13 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG_PG( pDM_Odm->PhyRegPgVersion = 1; pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE; - for (i = 0; i < ArrayLen; i += 6 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - u4Byte v3 = Array[i+2]; - u4Byte v4 = Array[i+3]; - u4Byte v5 = Array[i+4]; - u4Byte v6 = Array[i+5]; + for (i = 0; i < ArrayLen; i += 6) { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + u4Byte v3 = Array[i+2]; + u4Byte v4 = Array[i+3]; + u4Byte v5 = Array[i+4]; + u4Byte v6 = Array[i+5]; odm_ConfigBB_PHY_REG_PG_8723B(pDM_Odm, v1, v2, v3, v4, v5, v6); } @@ -631,5 +597,5 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG_PG( -#endif // end of HWIMG_SUPPORT +#endif /* end of HWIMG_SUPPORT*/ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h index f5b9036249c4..167e60d6ff27 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h @@ -18,6 +18,7 @@ * ******************************************************************************/ +/*Image2HeaderVersion: 2.9*/ #if (RTL8723B_SUPPORT == 1) #ifndef __INC_MP_BB_HW_IMG_8723B_H #define __INC_MP_BB_HW_IMG_8723B_H @@ -28,7 +29,7 @@ ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_AGC_TAB( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_AGC_TAB(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_AGC_TAB(void); @@ -38,7 +39,7 @@ u4Byte ODM_GetVersion_MP_8723B_AGC_TAB(void); ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_PHY_REG( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_PHY_REG(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_PHY_REG(void); @@ -48,11 +49,11 @@ u4Byte ODM_GetVersion_MP_8723B_PHY_REG(void); ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_PHY_REG_PG( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_PHY_REG_PG(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_PHY_REG_PG(void); #endif -#endif // end of HWIMG_SUPPORT +#endif /* end of HWIMG_SUPPORT*/ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c index d362242109a4..76d7958bb778 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c @@ -24,44 +24,50 @@ #if (RTL8723B_SUPPORT == 1) #ifdef CONFIG_AP_WOWLAN u1Byte Array_MP_8723B_FW_AP_WoWLAN[] = { -0x01, 0x53, 0x20, 0x00, 0x12, 0x00, 0x02, 0x00, 0x12, 0x02, 0x11, 0x28, 0x4A, 0x3C, 0x00, 0x00, -0x9E, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x45, 0x8D, 0x02, 0x53, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x53, 0xD2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x58, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x53, 0x20, 0x00, 0x23, 0x00, 0x00, 0x00, 0x03, 0x26, 0x14, 0x35, 0x76, 0x51, 0x00, 0x00, +0xE5, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x45, 0xDB, 0x02, 0x6F, 0xEB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x53, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0xE1, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x58, 0x6A, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, -0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, -0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, -0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, -0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, -0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, -0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, -0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, -0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, -0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, -0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, -0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, -0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, -0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, -0x07, 0x08, 0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, 0x13, 0x14, 0x15, 0x04, 0x04, 0x04, 0x05, 0x07, -0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, -0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, -0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, -0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, -0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, -0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, -0x00, 0x01, 0xE0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, -0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, -0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x02, 0x04, 0x06, 0x08, 0x0A, -0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, 0x04, -0x04, 0x05, 0x05, 0x02, 0x04, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, -0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x19, -0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x34, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, +0x00, 0x00, 0x00, 0x02, 0x70, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE6, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x7F, 0xE5, 0x00, 0x04, 0x0C, 0x04, 0x08, 0x08, 0x0A, 0x08, 0x03, 0x03, +0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, +0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, +0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, +0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, +0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, +0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, +0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, +0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, +0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, +0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x15, 0xF0, +0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, +0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, +0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, +0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, +0x28, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, +0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x3C, 0x00, 0x64, 0x00, 0x78, 0x00, +0xA0, 0x00, 0xF0, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, +0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, +0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, +0xF0, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x01, 0x01, 0x01, +0x02, 0x01, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x02, 0x04, 0x06, 0x07, 0x07, 0x08, 0x08, +0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, +0x04, 0x05, 0x06, 0x07, 0x08, 0x19, 0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x04, 0x0C, 0x04, 0x08, +0x08, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x07, 0x0A, +0x0E, 0x11, 0x13, 0x14, 0x15, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, +0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x94, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, @@ -76,7 +82,7 @@ u1Byte Array_MP_8723B_FW_AP_WoWLAN[] = { 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, -0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x2B, 0x74, 0x01, 0x93, +0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x7D, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, @@ -86,10 +92,10 @@ u1Byte Array_MP_8723B_FW_AP_WoWLAN[] = { 0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, -0x04, 0x90, 0x46, 0x2B, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, +0x04, 0x90, 0x46, 0x7D, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, -0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0x7D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, +0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0xDD, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, @@ -97,902 +103,1235 @@ u1Byte Array_MP_8723B_FW_AP_WoWLAN[] = { 0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, -0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0x7C, 0x8F, 0xF0, +0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0xDC, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, 0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, -0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0x7D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, +0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0xDD, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, -0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, -0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, -0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0, -0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE4, 0x93, 0xFC, -0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, -0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF9, -0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, -0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, -0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, -0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, -0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x45, 0xCB, -0x02, 0x43, 0x0D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, -0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, -0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, -0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x10, 0xE4, 0x7E, -0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, -0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, -0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, -0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, -0x00, 0x41, 0xA2, 0xE5, 0x00, 0x41, 0xA2, 0xE6, 0x00, 0x41, 0xA2, 0xF5, 0x00, 0x44, 0xA2, 0xBD, -0x41, 0x4E, 0x59, 0x00, 0x44, 0xA2, 0xB9, 0x61, 0x6E, 0x79, 0x00, 0x50, 0x3F, 0x4A, 0xC2, 0x4B, -0xF5, 0xE4, 0xFD, 0x7F, 0x8D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, -0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xEE, 0xED, 0xF0, 0x90, 0xA2, 0xED, 0xEF, 0xF0, -0xD3, 0x94, 0x07, 0x50, 0x6D, 0x7F, 0x47, 0xF1, 0x4E, 0x90, 0xA2, 0xED, 0xE0, 0xFE, 0x74, 0x01, -0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0xD1, 0x35, -0x7F, 0x46, 0xF1, 0x4E, 0x90, 0xA2, 0xED, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, -0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0xD1, 0x35, 0x90, 0xA2, 0xEE, 0xE0, 0x60, 0x17, -0x7F, 0x45, 0xF1, 0x4E, 0x90, 0xA2, 0xED, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, -0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x16, 0x7F, 0x45, 0xF1, 0x4E, 0x90, 0xA2, 0xED, 0xE0, 0xFE, -0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, -0x80, 0x75, 0x90, 0xA2, 0xED, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0xF1, 0x4E, 0x90, 0xA2, 0xED, -0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, -0x7F, 0x63, 0xD1, 0x35, 0x7F, 0x62, 0xF1, 0x4E, 0x90, 0xA2, 0xED, 0xE0, 0xFE, 0x74, 0x01, 0xA8, -0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0xD1, 0x35, 0x90, 0xA2, -0xEE, 0xE0, 0x60, 0x1A, 0x7F, 0x61, 0xF1, 0x4E, 0x90, 0xA2, 0xED, 0xE0, 0xFE, 0x74, 0x01, 0xA8, -0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x19, 0x7F, 0x61, -0xF1, 0x4E, 0x90, 0xA2, 0xED, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, -0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x61, 0xD1, 0x35, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0xA2, 0xF1, 0xF0, 0x7F, -0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2, 0xF1, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x7F, 0x54, 0xF1, 0x4E, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0xF1, 0x4E, 0xE5, 0x0E, 0x5F, -0xF5, 0x12, 0x7F, 0x56, 0xF1, 0x4E, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0xF1, 0x4E, 0xE5, -0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0xD1, 0x35, 0xAD, 0x12, 0x7F, 0x55, 0xD1, 0x35, -0xAD, 0x13, 0x7F, 0x56, 0xD1, 0x35, 0xAD, 0x14, 0x7F, 0x57, 0xD1, 0x35, 0x53, 0x91, 0xEF, 0x22, -0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0xD1, 0x35, -0xAD, 0x0E, 0x7F, 0x51, 0xD1, 0x35, 0xAD, 0x0F, 0x7F, 0x52, 0xD1, 0x35, 0xAD, 0x10, 0x7F, 0x53, -0xC1, 0x35, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0xF1, 0x4E, 0xEF, 0x20, 0xE6, -0x0C, 0x7F, 0x05, 0xF1, 0x4E, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x05, 0xD1, 0x35, 0x22, 0x12, 0x5D, -0x16, 0x12, 0x5D, 0x81, 0x12, 0x5D, 0xB2, 0x12, 0x5D, 0xD1, 0x80, 0xB4, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xC1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0xC5, 0xE0, 0xF5, -0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0xA2, 0xC1, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, -0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x11, 0x80, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA2, 0x94, 0xF0, 0x90, 0x01, 0xC7, -0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, 0x90, 0xA2, 0xA1, 0x74, 0x0F, 0xF0, 0x90, 0xA2, 0x93, 0x74, -0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x94, 0xE0, 0x2F, 0xFE, 0x74, 0x95, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, 0x90, 0x01, 0x3F, -0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x93, 0x51, 0x4E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0x12, 0x47, 0x4E, 0xEF, 0x20, 0xE6, 0x02, -0x21, 0xB9, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x26, 0x7F, 0x8D, 0x12, 0x47, 0x4E, 0x90, 0x00, 0x8E, -0xE0, 0xF5, 0x27, 0xEF, 0x24, 0xFC, 0x60, 0x0C, 0x24, 0x03, 0x60, 0x02, 0x21, 0xAD, 0xAF, 0x26, -0x31, 0xEC, 0x21, 0xAD, 0x74, 0x96, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, -0xFB, 0xE4, 0xFD, 0xFF, 0x31, 0xC4, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x96, 0x19, 0x12, 0x45, -0x49, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0xC4, 0x75, 0xF0, 0x04, 0xE5, -0x26, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, -0xE4, 0xFF, 0x31, 0xC4, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, -0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0xC4, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x96, -0x16, 0x12, 0x45, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0xC4, 0x75, 0xF0, 0x04, 0xE5, 0x26, -0x90, 0x96, 0x17, 0x31, 0xBE, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, -0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x31, 0xC4, 0x75, 0xF0, 0x04, 0xE5, 0x26, -0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0x31, 0xC4, 0x75, 0xF0, 0x08, -0xE5, 0x26, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0xC4, 0x75, -0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x01, 0x31, 0xBE, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, -0x02, 0x31, 0xBE, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x03, 0x31, 0xBE, 0x75, 0xF0, 0x08, -0xE5, 0x26, 0x90, 0x89, 0x04, 0x12, 0x45, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0xC4, 0x75, -0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x05, 0x31, 0xBE, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, -0x06, 0x31, 0xBE, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x07, 0x31, 0xBE, 0x7F, 0x8F, 0x12, -0x47, 0x4E, 0xEF, 0x30, 0xE0, 0x03, 0x12, 0x46, 0x31, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, -0x49, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, -0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, -0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0x7F, 0x8F, 0x12, 0x47, 0x4E, 0xEF, 0x30, 0xE6, -0x48, 0x7F, 0x8D, 0x12, 0x47, 0x4E, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x90, 0xA2, 0xEC, 0xF0, 0x90, -0xA2, 0xEC, 0xE0, 0xFD, 0x90, 0xA2, 0xEB, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x45, -0x49, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x31, -0xC4, 0x90, 0xA2, 0xEC, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD2, 0x7F, 0x8F, 0x12, -0x47, 0x4E, 0xEF, 0x30, 0xE0, 0x03, 0x12, 0x46, 0x31, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xD4, 0x12, 0x45, 0x5E, 0x7F, 0x96, 0x7E, 0x02, 0x71, -0x44, 0xEF, 0x60, 0x59, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, -0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA2, 0xD7, 0xEF, -0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA2, 0xD7, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, -0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0xD4, 0x12, 0x45, 0x55, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, -0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x71, 0x9A, 0x90, 0xA2, 0xD7, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA2, -0xD4, 0x12, 0x45, 0x55, 0x12, 0x5C, 0x74, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xE4, 0x90, 0xA1, 0x36, 0xF0, 0x90, 0xA1, 0x36, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xC2, -0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4A, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, -0xFC, 0x90, 0xA1, 0x2E, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0x74, 0x14, 0x11, 0x2E, 0x12, 0x42, 0x7D, -0x80, 0xD5, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xFE, -0x90, 0xA0, 0x8B, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, -0x01, 0x60, 0x2C, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, -0x7B, 0x01, 0x51, 0x4E, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0xA0, 0x8B, 0xE0, 0x04, 0xF0, 0xE0, -0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xCC, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xCC, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, -0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA2, 0xCF, 0xE0, 0x94, 0xE8, 0x90, 0xA2, 0xCE, -0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, -0x90, 0xA2, 0xCE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, -0x50, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, -0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, -0xE0, 0x44, 0x10, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0x7E, 0x90, 0xA1, -0x3F, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9F, 0x97, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x0B, -0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x55, 0xE9, 0x12, 0x60, 0x8E, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, -0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE1, 0x05, 0x54, 0xFD, 0xF0, 0x91, 0x59, 0xD2, 0xAF, 0xC2, 0xAF, -0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x51, 0xF2, 0xD2, 0xAF, 0xC2, -0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE5, 0x0C, 0x54, 0xDF, 0xF0, 0x12, 0x74, 0xB2, 0xBF, -0x01, 0x03, 0x12, 0x76, 0x62, 0xD2, 0xAF, 0x80, 0xAC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x9F, 0xF4, 0xE0, 0xFF, 0x90, 0x9F, 0xF3, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, -0x7F, 0x00, 0xEF, 0x70, 0x43, 0x90, 0x9F, 0xF3, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA3, -0x12, 0x45, 0x49, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA4, 0xF9, 0x74, 0x9F, 0x35, -0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x91, 0xBD, 0x90, 0x9F, 0xF3, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, -0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0xF3, 0xF0, 0x12, 0x5B, -0x24, 0x90, 0x9F, 0x97, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x41, -0x12, 0x45, 0x5E, 0x90, 0xA1, 0x40, 0xEF, 0xF0, 0x12, 0x45, 0x67, 0x4C, 0xF0, 0x00, 0x4C, 0xF9, -0x01, 0x4D, 0x01, 0x08, 0x4D, 0x0A, 0x09, 0x4D, 0x13, 0x0A, 0x4D, 0x1C, 0x12, 0x4D, 0x24, 0x13, -0x4D, 0x2D, 0x40, 0x4D, 0x36, 0x42, 0x4D, 0x3F, 0x43, 0x4D, 0x48, 0x44, 0x00, 0x00, 0x4D, 0x50, -0x90, 0xA1, 0x41, 0x12, 0x45, 0x55, 0x02, 0x5A, 0x0A, 0x90, 0xA1, 0x41, 0x12, 0x45, 0x55, 0x80, -0x72, 0x90, 0xA1, 0x41, 0x12, 0x45, 0x55, 0x02, 0x58, 0xF3, 0x90, 0xA1, 0x41, 0x12, 0x45, 0x55, -0x02, 0x5A, 0x56, 0x90, 0xA1, 0x41, 0x12, 0x45, 0x55, 0x02, 0x5A, 0x86, 0x90, 0xA1, 0x41, 0x12, -0x45, 0x55, 0x80, 0x3C, 0x90, 0xA1, 0x41, 0x12, 0x45, 0x55, 0x02, 0x5A, 0xB6, 0x90, 0xA1, 0x41, -0x12, 0x45, 0x55, 0x02, 0x6F, 0x30, 0x90, 0xA1, 0x41, 0x12, 0x45, 0x55, 0x02, 0x69, 0xB2, 0x90, -0xA1, 0x41, 0x12, 0x45, 0x55, 0x02, 0x70, 0x9C, 0x90, 0xA1, 0x41, 0x12, 0x45, 0x55, 0xC1, 0xB0, -0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x40, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, -0x12, 0x06, 0x89, 0xFF, 0x90, 0xA0, 0xAD, 0xF0, 0xBF, 0x01, 0x07, 0xB1, 0xD5, 0xE4, 0x90, 0xA0, -0xAD, 0xF0, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, -0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, -0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, -0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x74, 0xAE, 0x25, -0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xAE, 0x25, 0x54, 0xF5, 0x82, -0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xAF, 0x54, 0x70, 0x04, 0xF1, 0xDB, 0x80, 0x02, 0xF1, 0xCA, -0x05, 0x54, 0x80, 0xC6, 0x22, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x44, 0x7F, 0xF5, 0x7E, 0x01, 0x12, -0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA1, 0x44, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, -0x44, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA1, 0x44, 0xE0, 0x90, -0xA1, 0x46, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x44, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, -0xBF, 0x01, 0x08, 0x90, 0xA1, 0x44, 0xE0, 0x90, 0xA1, 0x47, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, -0x44, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA1, 0x44, 0xE0, 0x90, -0xA1, 0x48, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x44, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, -0xBF, 0x01, 0x08, 0x90, 0xA1, 0x44, 0xE0, 0x90, 0xA1, 0x49, 0xF0, 0x90, 0xA1, 0x45, 0xE0, 0xFF, -0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA1, 0x4D, 0xF0, 0x90, 0xA1, 0x49, 0xE0, -0x90, 0xA1, 0x4E, 0xF0, 0x90, 0xA1, 0x4F, 0x74, 0x12, 0xF0, 0x90, 0xA1, 0x5D, 0x74, 0x05, 0xF0, -0x90, 0xA1, 0x51, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA1, 0x4D, 0xE0, 0x90, -0xA1, 0x54, 0xF0, 0x90, 0xA1, 0x4E, 0xE0, 0x90, 0xA1, 0x55, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, -0x4F, 0xF1, 0x60, 0x7F, 0x04, 0x90, 0xA2, 0xF2, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0x57, 0x90, -0x9F, 0x97, 0xE0, 0xFF, 0x90, 0xA2, 0xF2, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x97, 0xF0, 0x22, -0x90, 0xA1, 0x44, 0x12, 0x45, 0x5E, 0xE4, 0x90, 0xA1, 0x49, 0xF0, 0xFD, 0x90, 0xA1, 0x44, 0x12, -0x45, 0x55, 0x8D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xF4, 0x60, 0x4D, 0x90, 0xA1, 0x49, -0xE0, 0xFF, 0x90, 0xA1, 0x44, 0x12, 0x45, 0x55, 0x8D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, -0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, -0x01, 0xFC, 0xA8, 0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x90, 0xA1, 0x49, 0xF0, -0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x74, 0x4A, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0D, 0x74, 0x4A, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xA1, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x0D, 0xED, 0xB4, 0x07, 0x90, 0x90, 0xA1, 0x47, 0x74, -0x05, 0xF0, 0x90, 0xA1, 0x55, 0x74, 0x08, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x47, 0xF1, 0x60, -0x7F, 0x04, 0xC1, 0x95, 0xE4, 0x90, 0xA2, 0xA4, 0xF0, 0x90, 0xA2, 0xA2, 0x74, 0x14, 0xF0, 0x90, -0xA2, 0xB0, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0xA2, 0x79, 0xA2, 0xF1, 0x60, 0x7F, 0x04, 0xC1, 0x95, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x8B, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, -0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, -0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, -0xC0, 0x01, 0x90, 0xA0, 0x8C, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, -0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, -0xA0, 0x8C, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, -0xE4, 0x90, 0xA0, 0x8C, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, -0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, -0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x7F, 0xF4, 0x12, 0x47, -0x4E, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x47, 0x4E, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, -0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x12, 0x4F, 0xEC, 0x90, 0x9F, 0x9C, 0xEF, 0xF0, 0x12, 0x47, -0xEE, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, -0x12, 0x47, 0x4E, 0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x46, 0x35, 0x7F, 0x38, -0x12, 0x47, 0x4E, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x38, 0x12, 0x46, 0x35, 0x02, 0x37, 0x99, 0x7F, -0x81, 0x12, 0x47, 0x4E, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0x35, 0x7F, 0x80, 0x12, -0x47, 0x4E, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0x35, 0x31, 0x2C, 0x12, 0x3E, 0x11, -0x31, 0x85, 0x31, 0x47, 0x7F, 0x01, 0x12, 0x43, 0x45, 0x7F, 0x02, 0x12, 0x43, 0x45, 0x11, 0x06, -0x11, 0x9E, 0x7F, 0x80, 0x12, 0x47, 0x4E, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0x35, -0x75, 0x28, 0xFF, 0x31, 0x1A, 0x11, 0xBA, 0x7F, 0x81, 0x12, 0x47, 0x4E, 0xEF, 0x44, 0x04, 0xFD, -0x7F, 0x81, 0x12, 0x46, 0x35, 0x31, 0x21, 0x31, 0xA8, 0xE4, 0xFF, 0x02, 0x43, 0xCE, 0x31, 0x14, -0x31, 0x39, 0x31, 0xCF, 0x31, 0x55, 0x90, 0xA1, 0x2F, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, -0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0x34, 0xF0, 0xA3, -0xF0, 0x31, 0x67, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0xA1, 0x35, 0xE0, 0x94, 0x88, 0x90, -0xA1, 0x34, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, -0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x27, 0x90, 0xA1, 0x34, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, -0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA1, 0x35, 0xE0, 0x94, 0x32, 0x90, 0xA1, -0x34, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, -0x74, 0xFE, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0xAE, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x85, -0x22, 0x90, 0x01, 0xE4, 0x74, 0x12, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, -0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xA3, 0xF0, -0x90, 0x9F, 0xF3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0x9F, 0x97, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x8F, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, -0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, -0x40, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, -0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, -0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x34, 0x7F, 0xFB, -0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0xA1, 0x34, 0xE0, 0x54, 0x30, 0xFF, 0xBF, -0x20, 0x07, 0x90, 0xA1, 0x2E, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0x2E, 0xF0, 0x22, 0xE4, -0xFF, 0xE4, 0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFE, -0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0xBE, 0x03, 0x12, 0x12, 0x45, 0x49, 0xE5, 0x82, -0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x80, 0xF0, 0x80, 0x0F, 0x12, 0x45, 0x49, -0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, -0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, -0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xAD, 0x0F, 0xBF, 0x80, 0xA7, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, +0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xC3, 0xEF, 0x9B, 0xFF, 0xEE, 0x9A, 0xFE, 0xED, 0x99, 0xFD, +0xEC, 0x98, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, +0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, +0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, +0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, +0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, +0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, +0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, +0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, +0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x46, 0x19, 0x02, 0x43, +0x6D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, +0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, +0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, +0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x5E, 0xE4, 0x7E, 0x01, 0x93, +0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, +0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, +0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, +0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x41, 0xA6, +0x13, 0x00, 0x41, 0xA6, 0x14, 0x00, 0x41, 0xA6, 0x29, 0x00, 0x41, 0xA6, 0x2B, 0x00, 0x44, 0xA5, +0xD7, 0x41, 0x4E, 0x59, 0x00, 0x44, 0xA5, 0xD3, 0x61, 0x6E, 0x79, 0x00, 0x00, 0x60, 0x07, 0x67, +0xEF, 0x64, 0xAE, 0x7F, 0x67, 0xF1, 0xAA, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF1, 0xFB, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xEC, 0xEF, 0xF0, 0x90, 0xA5, 0xEE, +0xEB, 0xF0, 0xED, 0x60, 0x02, 0xE1, 0x53, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, +0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90, 0xA5, 0xEE, 0xE0, 0x70, 0x3E, 0xD1, 0x83, 0x90, 0xA5, 0xEC, +0xE0, 0x70, 0x30, 0x12, 0x91, 0x53, 0x70, 0x13, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0x12, +0x90, 0x73, 0x7F, 0x64, 0xF1, 0xAA, 0xEF, 0x54, 0xFE, 0x80, 0x13, 0x12, 0x37, 0x4E, 0xE4, 0xFE, +0x74, 0x80, 0xFF, 0xE4, 0x12, 0x90, 0x74, 0x7F, 0x64, 0xF1, 0xAA, 0xEF, 0x44, 0x01, 0xFD, 0x7F, +0x64, 0xD1, 0x8D, 0x7F, 0x4E, 0xF1, 0xF5, 0xE1, 0x9C, 0xD1, 0x83, 0x90, 0xA5, 0xEC, 0xE0, 0x70, +0x07, 0x12, 0x91, 0x01, 0xFF, 0x12, 0x90, 0x73, 0x12, 0x91, 0x4A, 0xF1, 0xEA, 0x44, 0x01, 0xFD, +0x7F, 0x4F, 0xD1, 0x8D, 0x7F, 0x30, 0x12, 0x91, 0x03, 0x74, 0x66, 0xFF, 0xEC, 0x12, 0x68, 0xA9, +0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, +0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x12, 0x68, 0xA9, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, +0x45, 0x80, 0x52, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, +0xF0, 0x90, 0xA5, 0xEC, 0xE0, 0x70, 0x32, 0x90, 0xA5, 0xEE, 0xE0, 0x60, 0x08, 0xD1, 0x83, 0x12, +0x91, 0x01, 0xFF, 0x80, 0x21, 0x7F, 0x67, 0xF1, 0xAA, 0xEF, 0x54, 0xDF, 0xFD, 0x7F, 0x67, 0xD1, +0x8D, 0x12, 0x91, 0x53, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x80, 0xFF, 0x74, 0x02, 0x80, +0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x12, 0x90, 0x73, 0x12, 0x91, 0x4A, 0xF1, 0xEA, 0x54, 0xFE, +0xFD, 0x7F, 0x4F, 0xD1, 0x8D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0xA6, 0x21, 0xF1, 0xFB, 0x90, 0xA6, 0x21, 0xE0, +0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x30, 0xE4, 0x12, 0x58, 0xFA, 0x90, 0x01, 0x38, +0x12, 0x58, 0xFA, 0xFD, 0x7F, 0x50, 0xD1, 0x8D, 0xE4, 0xFD, 0x7F, 0x51, 0xD1, 0x8D, 0xE4, 0xFD, +0x7F, 0x52, 0xD1, 0x8D, 0xE4, 0xFD, 0x7F, 0x53, 0xC1, 0x8D, 0xFD, 0x7F, 0x4E, 0xD1, 0x8D, 0x7F, +0x4F, 0xF1, 0xAA, 0xEF, 0x22, 0xF1, 0xAA, 0xEF, 0x44, 0x80, 0x22, 0xF0, 0x7F, 0x10, 0x7E, 0x00, +0x02, 0x3E, 0x50, 0xF0, 0xE4, 0x90, 0xA5, 0xDF, 0xF0, 0x90, 0xA4, 0x57, 0xE0, 0x90, 0xA5, 0xE0, +0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0xA5, 0xDB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA5, 0xDF, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, +0x3C, 0x12, 0x36, 0x3E, 0x90, 0xA5, 0xDB, 0x12, 0x91, 0x41, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x61, 0x90, 0xA3, 0xF9, 0xE0, 0x70, 0x02, 0x21, 0x07, +0xD1, 0x5C, 0x60, 0x02, 0x21, 0x07, 0xD1, 0xFB, 0x12, 0x45, 0x61, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0xF1, 0x14, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, +0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x61, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, +0xA3, 0xF1, 0x14, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, +0x12, 0x90, 0xA7, 0x44, 0x80, 0xF0, 0x12, 0x77, 0xD6, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, +0x70, 0x1E, 0x90, 0xA4, 0x00, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0xA4, 0x02, 0xE0, +0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0xA3, 0xFF, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x61, 0x01, +0xE5, 0x61, 0x60, 0x43, 0xF1, 0xED, 0x90, 0xA4, 0x02, 0xE0, 0x60, 0x04, 0x64, 0x01, 0x70, 0x14, +0xE4, 0x90, 0xA5, 0xDF, 0xF0, 0x90, 0xA4, 0x02, 0xE0, 0x12, 0x90, 0x8D, 0x11, 0x0D, 0x90, 0xA4, +0x02, 0xE0, 0x80, 0x13, 0xE4, 0x90, 0xA5, 0xDF, 0x12, 0x90, 0x82, 0x11, 0x0D, 0x90, 0xA4, 0x02, +0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0x12, 0x90, 0x8D, 0x90, 0xA4, 0x12, 0xF0, 0x90, 0xA3, +0xFC, 0xE0, 0x20, 0xE2, 0x02, 0x31, 0x08, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x28, 0xED, 0xF0, 0x90, 0xA3, 0xF4, 0xE0, 0xFE, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x02, 0x41, 0x4C, 0xEE, 0x12, 0x56, 0xF4, 0x30, 0xE0, 0x02, 0x41, 0x4C, +0x90, 0xA3, 0xFC, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x41, 0x4C, 0xEF, 0x70, 0x02, 0x21, 0xC8, 0x24, +0xFE, 0x70, 0x02, 0x41, 0x01, 0x24, 0xFE, 0x60, 0x47, 0x24, 0xFC, 0x70, 0x02, 0x41, 0x3B, 0x24, +0xFC, 0x60, 0x02, 0x41, 0x4C, 0xEE, 0xB4, 0x0E, 0x02, 0x51, 0x88, 0x90, 0xA3, 0xFC, 0xE0, 0x70, +0x04, 0x7F, 0x01, 0x51, 0xC4, 0x90, 0xA3, 0xFC, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xA3, 0x90, 0xA3, +0xFC, 0xE0, 0xB4, 0x04, 0x0D, 0x90, 0xA6, 0x28, 0xE0, 0xFF, 0x60, 0x04, 0xB1, 0xCD, 0x80, 0x02, +0xF1, 0x24, 0x90, 0xA3, 0xFC, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x41, 0x4C, 0x91, 0x6D, 0x41, 0x4C, +0x90, 0xA3, 0xFC, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xC4, 0x90, 0xA3, 0xFC, 0xE0, 0xB4, 0x06, +0x02, 0x51, 0xA3, 0x90, 0xA3, 0xFC, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x51, 0xBF, 0x01, 0x02, 0x51, +0x88, 0x90, 0xA3, 0xFC, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x41, 0x4C, 0x51, 0x51, 0xEF, 0x64, 0x01, +0x60, 0x02, 0x41, 0x4C, 0x71, 0x3E, 0x41, 0x4C, 0x90, 0xA3, 0xFC, 0xE0, 0xB4, 0x0E, 0x07, 0x51, +0x51, 0xBF, 0x01, 0x02, 0x51, 0x88, 0x90, 0xA3, 0xFC, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xA3, 0x90, +0xA3, 0xFC, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x51, 0xBF, 0x01, 0x02, 0x71, 0x3E, 0x90, 0xA3, 0xFC, +0xE0, 0x64, 0x04, 0x70, 0x57, 0x12, 0x8F, 0x1F, 0xEF, 0x64, 0x01, 0x70, 0x4F, 0x91, 0xF0, 0x80, +0x4B, 0x90, 0xA3, 0xFC, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x51, 0xBF, 0x01, 0x02, 0x51, 0x88, 0x90, +0xA3, 0xFC, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xA3, 0x90, 0xA3, 0xFC, 0xE0, 0xB4, 0x0C, 0x07, 0x51, +0x51, 0xBF, 0x01, 0x02, 0x71, 0x3E, 0x90, 0xA3, 0xFC, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xC4, +0x90, 0xA3, 0xFC, 0xE0, 0xB4, 0x04, 0x15, 0xF1, 0xD9, 0x80, 0x11, 0x90, 0xA3, 0xFC, 0xE0, 0xB4, +0x0C, 0x0A, 0x12, 0x75, 0x29, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x91, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x8F, 0x06, 0xEF, 0x64, 0x01, 0x70, 0x21, +0x12, 0x90, 0xDF, 0x20, 0xE0, 0x1B, 0x90, 0xA3, 0xFB, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x12, 0x90, +0xA4, 0x5D, 0xE0, 0x30, 0xE0, 0x07, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x04, 0x7F, 0x01, 0x80, +0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0xF5, 0xE0, 0xC3, 0x13, 0x20, 0xE0, +0x04, 0x7D, 0x0C, 0x80, 0x05, 0x12, 0x90, 0xE9, 0x7D, 0x04, 0x7F, 0x01, 0x51, 0xD7, 0xE4, 0xFD, +0xFF, 0x61, 0x6F, 0x90, 0xA3, 0xF5, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, +0xF0, 0x7D, 0x04, 0x80, 0x06, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x51, 0xD7, 0xE4, +0xFD, 0xFF, 0x61, 0x6F, 0x90, 0xA6, 0x27, 0xEF, 0xF0, 0x91, 0x75, 0x90, 0xA6, 0x27, 0xE0, 0x60, +0x02, 0x71, 0xC8, 0x7D, 0x04, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, +0x26, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, +0xFF, 0x90, 0xA3, 0xF4, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0xA3, 0xFC, 0xED, 0xF0, +0x80, 0x05, 0x90, 0xA3, 0xFB, 0xED, 0xF0, 0x12, 0x57, 0xE9, 0x30, 0xE4, 0x2C, 0x90, 0xA6, 0x26, +0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x18, 0x24, 0x02, 0x70, 0x1E, 0x90, 0xA3, 0xF4, 0xE0, 0x12, +0x91, 0x26, 0xFF, 0x90, 0xA3, 0xFC, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, +0xA3, 0xFB, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x46, 0x8D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x5C, +0x70, 0x23, 0x90, 0xA3, 0xF5, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x71, 0x6F, 0x7D, +0x08, 0x7F, 0x01, 0xB1, 0x82, 0xBF, 0x01, 0x0D, 0x90, 0xA3, 0xF4, 0xE0, 0x44, 0x80, 0xF0, 0x7D, +0x0E, 0x7F, 0x01, 0x51, 0xD7, 0x22, 0xE4, 0xFD, 0x7F, 0x0C, 0x31, 0x0C, 0xE4, 0xFD, 0xFF, 0x90, +0x05, 0x22, 0xEF, 0xF0, 0x90, 0xA2, 0x9A, 0xED, 0xF0, 0x22, 0x90, 0xA4, 0x5D, 0xE0, 0x30, 0xE0, +0x44, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x15, 0x12, 0x91, 0x1D, 0x11, 0x0C, 0x71, 0xC8, 0xF1, +0xF5, 0x30, 0xE0, 0x06, 0x7D, 0x0C, 0x7F, 0x01, 0x51, 0xD7, 0x02, 0x77, 0xC6, 0x90, 0xA4, 0x5D, +0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1D, 0xE4, 0x90, 0xA5, 0xDF, 0xF0, 0x90, 0xA4, 0x60, +0x11, 0x0C, 0x12, 0x91, 0x5C, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x06, 0x7D, 0x04, 0x7F, 0x01, 0x41, +0xD7, 0x7D, 0x31, 0x91, 0xB6, 0x22, 0x91, 0x75, 0xE4, 0xFD, 0xFF, 0x80, 0xA2, 0x7E, 0x00, 0x7F, +0x62, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0xF4, 0x12, 0x08, 0xAA, 0x90, 0xA3, 0xF8, 0x74, +0x02, 0xF0, 0x90, 0xA3, 0xFF, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x90, 0xA4, 0x05, +0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x12, 0x90, 0xB5, 0x12, 0x8F, 0xAF, 0xE4, 0xFD, 0xFF, 0x51, +0xD7, 0x7D, 0x0C, 0x7F, 0x02, 0x51, 0xD7, 0x7D, 0x0C, 0x7F, 0x01, 0x51, 0xD7, 0x90, 0xA2, 0x9C, +0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA4, 0x04, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0xA4, +0x04, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12, 0x47, +0xAA, 0xEF, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x47, 0xAA, 0xEF, 0x30, 0xE2, +0x06, 0x90, 0xA4, 0x16, 0x74, 0x02, 0xF0, 0x12, 0x81, 0xCD, 0x12, 0x90, 0xB5, 0x7F, 0x01, 0x12, +0x7E, 0xFB, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x5A, 0x12, 0x08, +0xAA, 0xF1, 0xD1, 0xF1, 0xE5, 0x71, 0xC8, 0xE4, 0x90, 0xA4, 0x5C, 0xF0, 0x22, 0x71, 0xC6, 0x7D, +0x0C, 0x7F, 0x01, 0x41, 0xD7, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, +0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, +0x06, 0xB4, 0x74, 0x86, 0xF0, 0x12, 0x90, 0x94, 0xE4, 0xFD, 0x12, 0x46, 0xA1, 0xB1, 0x1D, 0x44, +0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0x8D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x2F, 0x91, 0xB6, +0x7D, 0x08, 0x7F, 0x01, 0x41, 0xD7, 0x7F, 0xFF, 0x71, 0x6F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x12, 0x90, 0x94, 0x7D, 0x01, 0x12, 0x46, 0xA1, 0xB1, 0x28, 0xB1, 0x1D, 0xB1, 0x07, 0xB1, +0x07, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0x8D, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, +0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x7D, 0x2D, 0xB1, 0x24, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0xF1, 0xC4, 0x91, +0xBA, 0xE4, 0xFD, 0x7F, 0x01, 0x41, 0xD7, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0x8D, 0x7F, +0x02, 0x12, 0x47, 0xAA, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0x8D, 0x7F, 0x02, 0x12, +0x47, 0xAA, 0xEF, 0x22, 0x7F, 0xFF, 0x71, 0x6F, 0xE4, 0x90, 0xA6, 0x0D, 0xF0, 0xA3, 0xF0, 0x90, +0x05, 0x22, 0xE0, 0x90, 0xA6, 0x0F, 0xF0, 0x7D, 0x47, 0x7F, 0xFF, 0x71, 0x6F, 0x90, 0x05, 0xF8, +0xE0, 0x70, 0x11, 0xA3, 0xE0, 0x70, 0x0D, 0xA3, 0xE0, 0x70, 0x09, 0xA3, 0xE0, 0x70, 0x05, 0xF1, +0x1B, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0xA6, 0x0E, 0xE0, 0x94, 0xE8, 0x90, 0xA6, 0x0D, 0xE0, 0x94, +0x03, 0x40, 0x0C, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0xF1, 0x1B, 0x7F, 0x00, 0x22, 0x7F, +0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA6, 0x0D, 0x12, 0x62, 0xCC, 0x80, 0xBF, 0x7D, 0x08, +0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xE7, 0xEF, 0xF0, 0xA3, 0xED, +0xF0, 0x90, 0xA2, 0x98, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x21, 0x90, 0x05, 0x22, +0xE0, 0x90, 0xA5, 0xEB, 0xF0, 0x7D, 0x26, 0xB1, 0x24, 0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x5E, +0xDE, 0x90, 0xA5, 0xEB, 0xE0, 0xFF, 0x7D, 0x27, 0x71, 0x6F, 0xB1, 0xFB, 0x80, 0x05, 0xB1, 0xFB, +0x12, 0x5E, 0xDE, 0x12, 0x84, 0x61, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x2A, +0xD1, 0x5C, 0x70, 0x26, 0x90, 0xA3, 0xF5, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x71, +0x6F, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xB1, 0x7E, 0xBF, 0x01, 0x0D, 0x90, 0xA3, 0xF4, +0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x51, 0xD7, 0x22, 0x90, 0xA5, 0xE7, 0xE0, 0xFF, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x2A, 0xEF, 0xF0, 0x90, 0xA2, 0xCF, 0xE0, +0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x3F, 0x90, 0xA3, 0xFC, 0xE0, 0x64, 0x0E, 0x70, 0x17, +0x90, 0xA6, 0x2A, 0xE0, 0x70, 0x31, 0x90, 0xA3, 0xF4, 0xE0, 0x54, 0x7F, 0xF0, 0xF1, 0xD1, 0x7D, +0x0C, 0x7F, 0x01, 0x51, 0xD7, 0x80, 0x1E, 0x90, 0xA3, 0xFC, 0xE0, 0x64, 0x06, 0x70, 0x18, 0x90, +0xA6, 0x2A, 0xE0, 0x60, 0x12, 0x90, 0xA3, 0xF4, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0x90, 0xE9, 0x90, +0xA3, 0xFC, 0x74, 0x04, 0xF0, 0x71, 0xC8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xD1, 0x64, +0xEF, 0x64, 0x01, 0x22, 0x12, 0x90, 0xF5, 0x12, 0x61, 0x84, 0xE0, 0xFD, 0x7C, 0x00, 0x12, 0x6F, +0xE3, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0x8D, 0x4E, 0x7F, 0x00, 0x60, +0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0xA5, 0x10, 0xF0, 0x90, 0xA3, 0xF9, 0xE0, 0x60, 0x6A, 0xD1, +0x5C, 0x70, 0x66, 0x12, 0x77, 0xDE, 0xD1, 0xFA, 0x12, 0x45, 0x61, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0xF1, 0x14, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, +0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x61, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, +0xA3, 0xF1, 0x14, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, +0x12, 0x90, 0xA7, 0x44, 0x80, 0xF0, 0x90, 0xA5, 0x10, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0xA4, 0x00, +0xF0, 0x04, 0x60, 0x15, 0xF1, 0xED, 0xE4, 0x90, 0xA5, 0xDF, 0xF0, 0x90, 0xA4, 0x01, 0x11, 0x0C, +0x90, 0xA3, 0xFC, 0xE0, 0x20, 0xE2, 0x02, 0x31, 0x08, 0x22, 0xF0, 0x90, 0x05, 0x61, 0xE0, 0xFF, +0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, +0x07, 0x90, 0x05, 0x60, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0x90, 0xA6, 0x0F, 0xE0, 0xFF, +0x7D, 0x48, 0x61, 0x6F, 0xF1, 0xD1, 0x71, 0xC8, 0x7D, 0x0C, 0x7F, 0x01, 0x41, 0xD7, 0xEF, 0x70, +0x34, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x74, 0x58, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x74, 0x58, 0x7D, +0xC8, 0x7F, 0x02, 0x12, 0x76, 0xC6, 0x12, 0x77, 0x43, 0xF0, 0xE4, 0xFF, 0xD1, 0x64, 0xEF, 0x70, +0x0A, 0xF1, 0x9E, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x31, +0x0C, 0xF1, 0xA2, 0xE1, 0xE5, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, +0x78, 0xFF, 0xF1, 0xC4, 0x7D, 0x02, 0x7F, 0x03, 0xF1, 0xC4, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, +0x12, 0x77, 0x11, 0xE4, 0xFF, 0xD1, 0x64, 0xBF, 0x01, 0x10, 0x12, 0x75, 0xB8, 0x90, 0xA3, 0xFC, +0xE0, 0x20, 0xE2, 0x09, 0x7D, 0x01, 0x7F, 0x04, 0x21, 0x0C, 0x12, 0x77, 0xCE, 0x22, 0x91, 0x75, +0xF1, 0x24, 0x90, 0xA3, 0xF4, 0xE0, 0x54, 0xF7, 0xF0, 0x22, 0x12, 0x6F, 0x0E, 0x90, 0xA3, 0xFC, +0xE0, 0x64, 0x0C, 0x60, 0x04, 0x71, 0x66, 0xB1, 0x7E, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0xF1, 0xC4, +0x7D, 0x02, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x02, 0x76, +0xCE, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x71, 0x6F, 0x7D, +0x02, 0x7F, 0x01, 0x41, 0xD7, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0xA3, 0xFD, +0xE0, 0x44, 0x10, 0xF0, 0x22, 0x91, 0x75, 0x90, 0xA4, 0x5D, 0xE0, 0xC3, 0x13, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xE9, 0x20, 0xE6, 0x02, 0x01, 0xF2, 0x90, 0x00, 0x8C, 0xE0, +0x90, 0xA6, 0x07, 0xF0, 0x7F, 0x8D, 0x12, 0x47, 0xAA, 0x90, 0xA6, 0x08, 0xEF, 0xF0, 0x90, 0x00, +0x8E, 0xE0, 0x90, 0xA6, 0x09, 0xF0, 0x90, 0xA6, 0x08, 0xE0, 0x24, 0xFC, 0x60, 0x10, 0x24, 0x03, +0x60, 0x02, 0x01, 0xEA, 0x90, 0xA6, 0x07, 0xE0, 0xFF, 0x12, 0x8D, 0xAE, 0x01, 0xEA, 0x90, 0xA6, +0x07, 0xE0, 0x24, 0x15, 0xF1, 0xCC, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x31, 0x21, 0x75, 0xF0, 0x04, +0x31, 0x2E, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0x21, 0x75, 0xF0, 0x04, 0x31, +0x2E, 0xD1, 0xF4, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0x21, 0x75, 0xF0, 0x04, 0x31, 0x2E, 0xC4, 0x54, +0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0x21, 0x75, 0xF0, 0x04, 0xF1, 0xC1, 0xE0, 0xFB, 0xE4, 0xFD, +0x0F, 0x31, 0x21, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x16, 0x31, 0x1B, 0x75, 0xF0, 0x04, 0xB1, 0xE0, +0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x31, 0x21, 0x75, 0xF0, 0x04, 0xB1, 0xE0, 0x54, +0x1F, 0x31, 0x1F, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x91, 0x14, 0x31, 0x21, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x01, 0x31, 0x1B, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x31, 0x1B, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x03, 0x31, 0x1B, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x04, 0x12, 0x91, 0x14, 0x31, +0x21, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x05, 0x31, 0x1B, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x06, 0x31, +0x1B, 0x75, 0xF0, 0x08, 0xF1, 0xF6, 0xFB, 0x0D, 0x11, 0xF7, 0xF1, 0xE9, 0x30, 0xE0, 0x03, 0x12, +0x8E, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, +0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, +0x03, 0x08, 0x74, 0xFC, 0x2D, 0x12, 0x82, 0xEE, 0xEB, 0xF0, 0x22, 0x12, 0x45, 0x97, 0xE0, 0xFB, +0x0D, 0x11, 0xF7, 0x90, 0xA6, 0x07, 0xE0, 0x22, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, +0x18, 0x12, 0x45, 0x97, 0xE0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x12, 0x6F, 0xC1, +0xFF, 0x54, 0x1F, 0xF5, 0x53, 0xD1, 0xF1, 0xF5, 0x52, 0xF1, 0xB7, 0xFF, 0x54, 0x03, 0xF5, 0x54, +0xEF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0xF1, 0xB7, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13, +0x54, 0x03, 0xF5, 0x55, 0xD1, 0xF1, 0xF5, 0x56, 0xF1, 0xB7, 0xFF, 0x54, 0x08, 0xFE, 0x13, 0x13, +0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, +0x12, 0x91, 0x26, 0x31, 0x28, 0x54, 0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x54, 0x01, 0xC4, 0x33, 0x33, +0x54, 0xC0, 0x31, 0x28, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x70, 0x62, 0xE5, 0x53, 0x54, 0x1F, +0xB1, 0xDA, 0x54, 0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0x31, 0x28, 0x54, 0xFC, 0x4F, 0xF0, +0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x31, 0x28, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, +0x33, 0x54, 0xE0, 0xB1, 0xDA, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, +0x31, 0x28, 0x54, 0xCF, 0x4F, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, +0xA3, 0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0xB1, 0xEF, 0x25, 0x58, 0x91, +0x89, 0xEF, 0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, 0x04, 0xDF, 0xAF, 0x51, 0x51, 0xBD, 0x22, 0x90, +0xA4, 0x79, 0x12, 0x45, 0xAC, 0x90, 0xA4, 0x78, 0xEF, 0xF0, 0x12, 0x45, 0xB5, 0x52, 0x4A, 0x00, +0x52, 0x4F, 0x01, 0x52, 0x54, 0x08, 0x52, 0x59, 0x09, 0x52, 0x5E, 0x0A, 0x52, 0x63, 0x12, 0x52, +0x68, 0x13, 0x52, 0x6D, 0x14, 0x52, 0x72, 0x20, 0x52, 0x77, 0x21, 0x52, 0x7C, 0x23, 0x52, 0x81, +0x25, 0x52, 0x86, 0x26, 0x52, 0x8B, 0x40, 0x52, 0x8F, 0x42, 0x52, 0x93, 0x43, 0x52, 0x98, 0x44, +0x52, 0x9D, 0x47, 0x52, 0xA2, 0x49, 0x00, 0x00, 0x52, 0xA7, 0x51, 0xB7, 0x02, 0x7F, 0xE6, 0x51, +0xB7, 0x02, 0x80, 0x30, 0x51, 0xB7, 0x02, 0x7C, 0x9F, 0x51, 0xB7, 0x02, 0x80, 0xDB, 0x51, 0xB7, +0x02, 0x81, 0x00, 0x51, 0xB7, 0x02, 0x7F, 0x56, 0x51, 0xB7, 0x02, 0x81, 0x25, 0x51, 0xB7, 0x02, +0x81, 0x98, 0x51, 0xB7, 0x02, 0x79, 0x4C, 0x51, 0xB7, 0x02, 0x81, 0xA7, 0x51, 0xB7, 0x02, 0x81, +0xE3, 0x51, 0xB7, 0x02, 0x81, 0xEB, 0x51, 0xB7, 0x02, 0x7A, 0x1D, 0x51, 0xB7, 0x21, 0x36, 0x51, +0xB7, 0xE1, 0x13, 0x51, 0xB7, 0x02, 0x6D, 0x0D, 0x51, 0xB7, 0x02, 0x79, 0xA7, 0x51, 0xB7, 0x02, +0x7A, 0xCE, 0x51, 0xB7, 0x02, 0x8D, 0x90, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA4, +0x78, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x90, 0xA4, 0x79, 0x02, 0x45, 0xA3, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x10, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xB1, 0xE0, 0x54, 0x1F, +0xFB, 0x60, 0x12, 0x64, 0x02, 0x60, 0x0E, 0xEB, 0x64, 0x04, 0x60, 0x09, 0xEB, 0x64, 0x09, 0x60, +0x04, 0xEB, 0xB4, 0x0C, 0x07, 0xF1, 0xDB, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xF1, 0xDB, 0x74, 0x01, +0xF0, 0xE4, 0xF5, 0x69, 0x90, 0xA6, 0x10, 0xE0, 0xFD, 0xB1, 0xEC, 0x25, 0x69, 0x91, 0x89, 0xE0, +0xFE, 0xEB, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0xFE, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, +0x82, 0x25, 0x69, 0x91, 0x89, 0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, 0xA6, 0x12, 0xF0, 0x75, 0xF0, +0x04, 0xED, 0x31, 0x2E, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x69, 0x70, 0x07, 0x90, 0xA6, +0x12, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0xA6, 0x12, 0xE0, 0xFF, 0xB1, 0xE8, 0x25, 0x69, 0x91, 0x89, +0xEF, 0xF0, 0x05, 0x69, 0xE5, 0x69, 0x64, 0x07, 0x70, 0xAA, 0x90, 0xA6, 0x10, 0xE0, 0x75, 0xF0, +0x04, 0x31, 0x2E, 0xFF, 0xC4, 0x54, 0x03, 0xF9, 0xE4, 0xFD, 0x75, 0x6A, 0x06, 0xE5, 0x6A, 0xB4, +0x06, 0x07, 0x91, 0x78, 0xE0, 0x54, 0x0F, 0x80, 0x07, 0xB1, 0xE8, 0x25, 0x6A, 0x91, 0x89, 0xE0, +0x90, 0xA6, 0x11, 0xF0, 0x90, 0xA6, 0x11, 0xE0, 0x60, 0x30, 0x75, 0x69, 0x07, 0x12, 0x91, 0x64, +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0x91, 0x38, 0x60, 0x13, 0x12, 0x91, +0x2F, 0xFD, 0xE9, 0x60, 0x22, 0xED, 0xD3, 0x94, 0x0B, 0x40, 0x1C, 0x74, 0x20, 0x2D, 0xFD, 0x80, +0x16, 0x15, 0x69, 0xE5, 0x69, 0xC3, 0x94, 0x00, 0x50, 0xD3, 0xE5, 0x6A, 0x60, 0x09, 0x15, 0x6A, +0xE5, 0x6A, 0xC3, 0x94, 0x00, 0x50, 0xA6, 0xE4, 0xFC, 0xF5, 0x6A, 0xE5, 0x6A, 0xB4, 0x06, 0x07, +0x91, 0x78, 0xE0, 0x54, 0x0F, 0x80, 0x07, 0xB1, 0xE8, 0x25, 0x6A, 0x91, 0x89, 0xE0, 0x90, 0xA6, +0x11, 0xF0, 0x90, 0xA6, 0x11, 0xE0, 0x60, 0x2E, 0xE4, 0xF5, 0x69, 0x12, 0x91, 0x64, 0x80, 0x05, +0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0x91, 0x38, 0x60, 0x13, 0x12, 0x91, 0x2F, 0xFC, +0xE9, 0x60, 0x1B, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x15, 0x74, 0x20, 0x2C, 0xFC, 0x80, 0x0F, 0x05, +0x69, 0xE5, 0x69, 0xB4, 0x08, 0xD5, 0x05, 0x6A, 0xE5, 0x6A, 0x64, 0x07, 0x70, 0xAD, 0x90, 0xA6, +0x10, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xF1, 0xC1, 0xED, 0xD1, 0xFB, 0xEC, 0xF0, 0x75, 0xF0, 0x10, +0xEF, 0x12, 0x6D, 0x07, 0xE0, 0xFF, 0x54, 0x7F, 0xF5, 0x6B, 0xEF, 0x54, 0x80, 0xFF, 0xE5, 0x6B, +0xD3, 0x9D, 0x40, 0x03, 0xED, 0x80, 0x07, 0xE5, 0x6B, 0xC3, 0x9C, 0x50, 0x04, 0xEC, 0x4F, 0xF5, +0x6B, 0x90, 0xA6, 0x10, 0xE0, 0xFF, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE5, +0x6B, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x2E, 0x12, 0x6E, 0xB1, 0x90, 0xA6, 0x10, 0xE0, 0xFF, +0xE4, 0xFB, 0xAD, 0x6B, 0x12, 0x6A, 0xE4, 0x90, 0xA6, 0x10, 0xE0, 0x75, 0xF0, 0x10, 0x12, 0x66, +0x86, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFF, 0x90, 0xA6, 0x10, 0xE0, 0x75, 0xF0, 0x08, +0x90, 0x89, 0x00, 0x12, 0x45, 0x97, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, +0x22, 0x75, 0x40, 0xFF, 0x75, 0x41, 0x41, 0x75, 0x42, 0xDB, 0x75, 0x43, 0x03, 0x7B, 0x01, 0x7A, +0xA2, 0x79, 0x9F, 0xF1, 0xD4, 0x75, 0x41, 0x41, 0x75, 0x42, 0xDE, 0x75, 0x43, 0x03, 0x7B, 0x01, +0x7A, 0xA2, 0x79, 0xA2, 0xF1, 0xD4, 0x75, 0x41, 0x41, 0x75, 0x42, 0xE1, 0x75, 0x43, 0x14, 0x7B, +0x01, 0x7A, 0xA2, 0x79, 0xA5, 0xF1, 0xD4, 0x75, 0x41, 0x41, 0x75, 0x42, 0xF5, 0x75, 0x43, 0x14, +0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xB9, 0x12, 0x35, 0x26, 0xE4, 0xFF, 0xE4, 0xFE, 0x74, 0x95, 0x2F, +0xF1, 0x0B, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0xBE, 0x03, 0x0D, +0x12, 0x45, 0x97, 0xE5, 0x82, 0x2E, 0x91, 0x89, 0x74, 0x80, 0xF0, 0x80, 0x0A, 0x12, 0x45, 0x97, +0xE5, 0x82, 0x2E, 0x91, 0x89, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0xB1, 0xEF, 0x2E, 0x91, 0x89, +0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xC7, 0x0F, 0xBF, 0x80, 0xC1, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, 0x94, 0x91, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, -0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0x75, 0xF0, 0x02, 0xEE, 0x12, 0x45, 0x49, 0xE4, 0xF0, -0xA3, 0xF0, 0x0E, 0xBE, 0x05, 0xE7, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, -0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0x74, 0x13, 0xF0, 0x75, -0xF0, 0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, -0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, -0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, -0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12, 0x45, -0x49, 0xE0, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, -0x54, 0xCF, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x40, -0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x7F, 0xF0, 0x75, -0xF0, 0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, -0x81, 0x00, 0x12, 0x45, 0x49, 0xEE, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, -0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0x41, 0x3B, 0x74, 0x96, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, -0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x49, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, -0x53, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, -0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, -0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, -0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x7A, 0xF0, 0x74, 0x53, 0xA3, -0xF0, 0x12, 0x47, 0x70, 0xE5, 0x14, 0x30, 0xE7, 0x03, 0x12, 0x47, 0xD2, 0x74, 0x7A, 0x04, 0x90, -0x01, 0xC4, 0xF0, 0x74, 0x53, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, -0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, -0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, -0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, -0x01, 0xC4, 0x74, 0xD2, 0xF0, 0x74, 0x53, 0xA3, 0xF0, 0x12, 0x5D, 0xF0, 0xE5, 0x19, 0x30, 0xE1, -0x02, 0xB1, 0x62, 0xE5, 0x19, 0x30, 0xE3, 0x02, 0xF1, 0x5F, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0xF1, -0x42, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x5D, 0x46, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0xF1, 0x56, -0xE5, 0x1B, 0x30, 0xE1, 0x02, 0xF1, 0x6A, 0xE5, 0x1B, 0x30, 0xE7, 0x03, 0x12, 0x5E, 0x1D, 0xE5, -0x1C, 0x30, 0xE0, 0x03, 0x12, 0x5E, 0x2F, 0xE5, 0x1C, 0x30, 0xE4, 0x02, 0xB1, 0xE7, 0xE5, 0x1C, -0x30, 0xE5, 0x02, 0x91, 0x6B, 0x74, 0xD2, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x53, 0xA3, 0xF0, -0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, -0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x60, 0x74, 0xAE, -0x25, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0xA1, 0x56, 0xE5, 0x60, -0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x60, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xA1, 0x56, -0x75, 0xF0, 0x10, 0xE5, 0x60, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x20, 0xE7, 0x02, 0x80, -0x10, 0x75, 0xF0, 0x10, 0xE5, 0x60, 0x90, 0x81, 0x02, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x20, 0xE7, -0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x7C, 0xEF, 0x30, 0xE6, 0x21, 0x75, 0xF0, -0x10, 0xE5, 0x60, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x60, -0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x67, 0xE4, 0xFB, 0x80, 0x52, 0x74, -0x96, 0x25, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x96, 0x25, -0x60, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x14, 0xAF, 0x60, -0x12, 0x6C, 0x58, 0x74, 0x96, 0x25, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, -0x80, 0x24, 0x75, 0xF0, 0x10, 0xE5, 0x60, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, -0xF0, 0x10, 0xE5, 0x60, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x67, 0x7B, -0x01, 0xAF, 0x60, 0x12, 0x66, 0xD1, 0x05, 0x60, 0xE5, 0x60, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x81, -0x6E, 0x22, 0xE4, 0xFF, 0x90, 0xA1, 0xC8, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x61, 0xA3, -0xE0, 0xF5, 0x62, 0x65, 0x61, 0x60, 0x6F, 0x90, 0xA1, 0xC9, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0xD7, -0x74, 0x08, 0xF0, 0xE5, 0x62, 0x04, 0x54, 0x0F, 0xF5, 0x63, 0xE4, 0xF5, 0x60, 0xE5, 0x63, 0x75, -0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x60, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0xCB, 0x25, 0x60, 0xF5, 0x82, 0xE4, -0x34, 0xA1, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x60, 0xE5, 0x60, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, -0xA1, 0x79, 0xC9, 0x12, 0x4F, 0x60, 0xE5, 0x62, 0x04, 0x54, 0x0F, 0xF5, 0x62, 0xB4, 0x0F, 0x03, -0xE4, 0xF5, 0x62, 0x90, 0x04, 0x7F, 0xE5, 0x62, 0xF0, 0x90, 0xA1, 0xC8, 0xE0, 0x7F, 0x04, 0x70, -0x02, 0xE1, 0x47, 0x12, 0x4E, 0x95, 0x22, 0xE4, 0xFF, 0x90, 0xA1, 0xD8, 0xEF, 0xF0, 0xE4, 0xA3, -0xF0, 0x90, 0xA1, 0xD9, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x50, 0x48, 0x74, 0xDA, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, -0x49, 0xE0, 0x90, 0xA1, 0xD9, 0x30, 0xE7, 0x0E, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, -0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x15, 0xE0, 0xFF, 0x12, 0x72, 0x39, 0x90, 0xA1, 0xD9, 0xE0, 0x24, -0xDA, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xD9, 0xE0, 0x04, -0xF0, 0x80, 0xAE, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA1, 0xD9, 0xF0, 0x90, -0xA1, 0xD9, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0xE1, 0x41, 0x74, 0xDA, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0xE1, 0x39, 0x90, 0xA1, 0xD9, 0xE0, 0xFF, 0x75, -0xF0, 0x10, 0x90, 0x81, 0x06, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, -0x07, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA1, 0xD9, 0xE0, 0xFC, 0x25, 0xE0, 0x24, -0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, -0xEC, 0x90, 0x81, 0x0A, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0B, -0x12, 0x45, 0x49, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, -0x01, 0x12, 0x45, 0x49, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, 0x01, 0x90, 0xA1, 0xD9, 0xE0, 0xFE, -0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, -0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0x75, -0xF0, 0x02, 0xEF, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xED, 0xF0, 0x0F, 0xEF, 0xB4, 0x05, 0xCB, -0x90, 0xA1, 0xD9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x09, 0x12, 0x45, 0x49, 0xE0, 0xFE, -0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA1, 0xD9, 0xE0, -0xFF, 0x90, 0xA1, 0xD8, 0xE0, 0xFD, 0x12, 0x68, 0x89, 0x90, 0xA1, 0xD9, 0xE0, 0x24, 0x81, 0xF5, -0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xD9, 0xE0, 0x04, 0xF0, 0xC1, -0x4F, 0x22, 0x12, 0x5B, 0x24, 0x7F, 0x02, 0x8F, 0x6B, 0x7F, 0x02, 0x12, 0x44, 0x57, 0x90, 0x9F, -0x97, 0xE0, 0x45, 0x6B, 0xF0, 0x22, 0x90, 0xA0, 0x8F, 0xE0, 0x60, 0x02, 0xF1, 0x85, 0x22, 0x90, -0xA0, 0x8F, 0xE0, 0x60, 0x04, 0x7F, 0x20, 0xF1, 0x47, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, -0xFF, 0xBF, 0x03, 0x0D, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x21, 0xE0, 0x44, 0x80, -0xF0, 0x7F, 0x01, 0x80, 0xC2, 0x90, 0xA0, 0x96, 0xE0, 0xFD, 0x7C, 0x00, 0xA3, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0x12, 0x07, 0x15, 0xED, 0x4C, 0x70, 0x05, 0x90, 0xA0, 0xA3, 0x80, 0x2A, 0xED, 0x64, -0x01, 0x4C, 0x70, 0x05, 0x90, 0xA0, 0xA4, 0x80, 0x1F, 0xED, 0x64, 0x02, 0x4C, 0x70, 0x05, 0x90, -0xA0, 0xA5, 0x80, 0x14, 0xED, 0x64, 0x03, 0x4C, 0x70, 0x05, 0x90, 0xA0, 0xA6, 0x80, 0x09, 0xED, -0x64, 0x04, 0x4C, 0x70, 0x11, 0x90, 0xA0, 0xA7, 0xE0, 0xFF, 0xF1, 0xD7, 0x90, 0xA0, 0x97, 0xE4, -0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x22, 0x90, 0x04, 0x24, 0xEF, 0xF0, 0x90, 0x04, 0x57, 0xF0, -0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, -0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, -0xC4, 0x74, 0xE1, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x11, 0x3A, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, -0x04, 0x12, 0x57, 0x47, 0x74, 0xE1, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0xD0, -0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, -0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, -0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, -0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, -0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x6B, 0x90, 0x01, 0xC4, 0xED, -0xF0, 0x74, 0x58, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, -0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x74, 0x15, 0x2F, 0xF8, -0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, -0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, -0x3E, 0x90, 0xA0, 0x8D, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x90, -0xA0, 0x8F, 0x74, 0x01, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x11, 0x9C, 0x90, 0x05, 0x52, 0xE0, 0x54, -0x07, 0x04, 0x90, 0xA0, 0x96, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0x22, 0xE0, 0x54, -0xEF, 0xF0, 0x22, 0x90, 0xA1, 0x44, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, 0xB4, 0x01, 0x04, 0x11, -0xB1, 0x80, 0x02, 0x31, 0x84, 0x90, 0xA1, 0x44, 0x12, 0x45, 0x55, 0x90, 0x00, 0x01, 0x12, 0x06, -0xA2, 0x90, 0xA0, 0x90, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0x91, 0xF0, 0x90, -0xA0, 0x90, 0xE0, 0x54, 0x01, 0x90, 0xA0, 0x99, 0xF0, 0x90, 0xA0, 0x90, 0xE0, 0x54, 0x02, 0x90, -0xA0, 0x9A, 0xF0, 0x90, 0xA0, 0x90, 0xE0, 0x54, 0x04, 0x90, 0xA0, 0x9B, 0xF0, 0x90, 0xA0, 0x90, -0xE0, 0x54, 0x08, 0x90, 0xA0, 0x9C, 0xF0, 0x90, 0xA0, 0x90, 0xE0, 0x54, 0x10, 0x90, 0xA0, 0x9D, -0xF0, 0x90, 0xA0, 0x91, 0xE0, 0x54, 0x01, 0x90, 0xA0, 0x9E, 0xF0, 0x90, 0xA0, 0x91, 0xE0, 0x54, -0x02, 0x90, 0xA0, 0x9F, 0xF0, 0x90, 0xA0, 0x91, 0xE0, 0x54, 0x04, 0x90, 0xA0, 0xA0, 0xF0, 0x90, -0xA0, 0x91, 0xE0, 0x54, 0x08, 0x90, 0xA0, 0xA1, 0xF0, 0x90, 0xA0, 0x91, 0xE0, 0x54, 0x10, 0x90, -0xA0, 0xA2, 0xF0, 0x22, 0xC2, 0xAF, 0xE4, 0x90, 0xA0, 0x8F, 0xF0, 0x7D, 0x08, 0xFF, 0x31, 0xAA, -0x90, 0x02, 0x09, 0xE0, 0x90, 0x04, 0x24, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x04, 0x25, 0xF0, -0xE4, 0x90, 0xA0, 0x97, 0xF0, 0xA3, 0xF0, 0xD2, 0xAF, 0x22, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, -0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, -0xF0, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, -0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, -0xA2, 0xF3, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0x57, 0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x90, 0xA2, -0xF3, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x98, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, -0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x9F, 0x9D, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, -0x51, 0x90, 0x9F, 0x9E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9F, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA0, 0xF0, 0x90, 0x00, 0x04, -0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA1, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, -0x51, 0x90, 0x9F, 0xA2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xA3, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x06, 0xA2, 0x90, 0xA0, 0xA4, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xA5, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xA6, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, -0xA2, 0x90, 0xA0, 0xA7, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xA8, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x06, 0xA2, 0x90, 0xA0, 0xA9, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xAA, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xAB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, -0xA2, 0x90, 0xA0, 0xAC, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0xA1, 0x2F, -0xE0, 0x54, 0x7F, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F, 0xFF, 0xF0, -0x12, 0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x2F, 0xF0, -0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFE, -0xEF, 0x54, 0xF0, 0x4E, 0x90, 0xA1, 0x2F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, -0x30, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x31, 0xF0, 0x90, 0xA1, 0x2F, 0xE0, -0xFE, 0x54, 0x0F, 0xFF, 0xEE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, -0x01, 0x02, 0x46, 0x4F, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA2, 0xE7, 0xF0, 0x90, 0xA2, -0xE7, 0xE0, 0xFD, 0x70, 0x02, 0x81, 0x73, 0x90, 0x9F, 0xF3, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, -0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, -0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, -0xA2, 0xE5, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, -0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x81, 0x50, 0xE4, 0x90, 0xA2, 0xE8, 0xF0, -0x90, 0xA2, 0xE8, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0xA2, 0xE5, 0xE0, 0x75, 0xF0, -0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x2F, -0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75, 0xF0, 0x08, -0x90, 0x9F, 0xA3, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, -0xEF, 0xF0, 0x90, 0xA2, 0xE5, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, -0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, -0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA7, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, -0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA2, 0xE8, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90, 0xA2, 0xE7, -0xE0, 0xFF, 0x90, 0xA2, 0xE5, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, -0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA2, 0xE7, 0xF0, 0x90, 0xA2, 0xE5, 0xE0, 0xFF, 0x74, 0x01, 0xA8, -0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA2, 0xE5, 0xE0, -0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xF4, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, -0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x61, 0x2E, 0xE4, 0x90, 0x9F, 0xF4, 0xF0, 0x61, 0x2E, -0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA2, 0xE5, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, -0xF0, 0x90, 0xA2, 0xE5, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x45, 0x49, 0xE0, 0x90, -0x01, 0xC3, 0xF0, 0x22, 0x90, 0xA2, 0xD0, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0x5E, 0x90, 0xA2, 0xE6, -0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, -0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA2, 0xD1, 0x12, 0x45, -0x55, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, -0x12, 0x35, 0x26, 0x90, 0xA2, 0xD0, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, -0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0x55, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, -0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA2, 0xD1, 0x12, 0x45, 0x55, 0x90, 0x00, 0x0E, 0x12, -0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x90, 0xA2, 0xDC, -0x12, 0x45, 0x5E, 0xE4, 0xFF, 0x90, 0xA2, 0xDC, 0x12, 0x45, 0x55, 0x8F, 0x82, 0x75, 0x83, 0x00, -0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEE, 0xF0, -0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x46, -0x35, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x46, 0x35, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x46, 0x35, 0xE4, -0xFD, 0x7F, 0x53, 0x02, 0x46, 0x35, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA1, 0xC8, 0xF0, 0xE0, 0xFF, -0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x22, 0x90, 0x01, -0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, -0xB1, 0x16, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x46, 0x35, 0x80, 0xFE, -0x22, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x46, 0x35, 0x7D, 0xFF, 0x7F, -0x55, 0x12, 0x46, 0x35, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46, 0x35, 0x7D, 0xFF, 0x7F, 0x57, 0x02, -0x46, 0x35, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x87, 0x75, 0x18, 0x33, 0x90, 0x01, -0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, -0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x90, 0x01, 0x38, -0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, -0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, -0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, -0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0x02, -0xE0, 0x54, 0x03, 0xFF, 0xBF, 0x03, 0x07, 0x90, 0x05, 0x21, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0x90, -0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xBF, 0x03, 0x07, 0x90, 0x05, 0x21, 0xE0, 0x54, 0x7F, 0xF0, -0x22, 0x90, 0xA1, 0x2F, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0A, 0xEF, -0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x4F, 0x44, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, -0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, -0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0xA2, 0xE0, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0xDF, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, -0x75, 0xD1, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA2, 0xDF, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA2, -0xE0, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, +0xEF, 0x12, 0x66, 0x12, 0x75, 0xF0, 0x02, 0xEE, 0x12, 0x66, 0x8C, 0xF0, 0x0E, 0xBE, 0x05, 0xED, +0x74, 0x15, 0x2F, 0xF1, 0xE1, 0xE4, 0x12, 0x66, 0xA5, 0xD1, 0x13, 0x12, 0x66, 0x9A, 0xE4, 0xF0, +0xEF, 0x12, 0x6E, 0xA7, 0xD1, 0x13, 0xEF, 0x12, 0x6E, 0x98, 0xD1, 0x03, 0xEF, 0x12, 0x6F, 0x92, +0xD1, 0x13, 0xF1, 0xBD, 0x74, 0x13, 0xD1, 0xFB, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0xB1, 0xE0, +0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x2E, 0x54, 0xF3, 0xF0, 0x75, 0xF0, +0x04, 0xEF, 0x31, 0x2E, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0xB1, 0xE0, 0x44, 0x20, 0xF0, +0x75, 0xF0, 0x04, 0xEF, 0x31, 0x2E, 0x54, 0xCF, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x2E, 0x44, +0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x2E, 0x54, 0x7F, 0xD1, 0xFB, 0xE0, 0xFE, 0x75, 0xF0, +0x10, 0xEF, 0x12, 0x6D, 0x07, 0xEE, 0xF0, 0x74, 0x95, 0x2F, 0xF1, 0x0B, 0xE4, 0xF0, 0x0F, 0xEF, +0x64, 0x80, 0x60, 0x02, 0xA1, 0x2B, 0x74, 0x15, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, +0x74, 0xFF, 0xF0, 0x90, 0x04, 0x21, 0x74, 0x0F, 0xF0, 0x22, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, +0x90, 0x96, 0x17, 0x12, 0x45, 0x97, 0xE0, 0x22, 0x90, 0xA6, 0x10, 0xE0, 0x75, 0xF0, 0x08, 0x90, +0x89, 0x00, 0x12, 0x45, 0x97, 0xE5, 0x82, 0x22, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, +0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x15, 0xF5, 0x82, +0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x22, 0x8F, 0x54, 0x90, 0xA4, 0x7C, 0x74, +0x0E, 0xF0, 0xED, 0x24, 0xFE, 0x60, 0x54, 0x04, 0x60, 0x02, 0xC1, 0xE2, 0x12, 0x91, 0x0A, 0x74, +0x0C, 0xF0, 0x74, 0x15, 0x25, 0x54, 0xF1, 0xCC, 0xE0, 0x90, 0xA4, 0x7F, 0xD1, 0xEA, 0x31, 0x2E, +0xFD, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA4, 0x80, 0xF0, 0xED, 0xD1, 0xF4, 0xA3, 0xD1, 0xEA, 0x31, +0x2E, 0xFF, 0xC4, 0x54, 0x03, 0x90, 0xA4, 0x82, 0xD1, 0xEA, 0xF1, 0xC1, 0xE0, 0x90, 0xA4, 0x83, +0xD1, 0xEA, 0xF1, 0x00, 0xE0, 0x90, 0xA4, 0x84, 0xD1, 0xEA, 0xB1, 0xE0, 0xFD, 0xC4, 0x13, 0x54, +0x01, 0x90, 0xA4, 0x85, 0xF0, 0xED, 0x54, 0x1F, 0xA3, 0x80, 0x60, 0x12, 0x91, 0x0A, 0x74, 0x0D, +0xD1, 0xE3, 0x90, 0x89, 0x00, 0x12, 0x45, 0x97, 0xE0, 0x90, 0xA4, 0x7F, 0xD1, 0xE3, 0x90, 0x89, +0x01, 0x12, 0x45, 0x97, 0xE0, 0x90, 0xA4, 0x80, 0xD1, 0xE3, 0x90, 0x89, 0x02, 0x12, 0x45, 0x97, +0xE0, 0x90, 0xA4, 0x81, 0xD1, 0xE3, 0x90, 0x89, 0x03, 0x12, 0x45, 0x97, 0xE0, 0x90, 0xA4, 0x82, +0xD1, 0xE3, 0x90, 0x89, 0x04, 0x12, 0x45, 0x97, 0xE0, 0x90, 0xA4, 0x83, 0xD1, 0xE3, 0x90, 0x89, +0x05, 0x12, 0x45, 0x97, 0xE0, 0x90, 0xA4, 0x84, 0xD1, 0xE3, 0x90, 0x89, 0x06, 0x12, 0x45, 0x97, +0xE0, 0x90, 0xA4, 0x85, 0xD1, 0xE3, 0xF1, 0xF6, 0x90, 0xA4, 0x86, 0xF0, 0x12, 0x7C, 0x98, 0x12, +0x77, 0x82, 0x22, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x54, 0x22, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x54, +0x22, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0xF0, 0x75, 0xF0, 0x04, 0xEF, +0x90, 0x96, 0x16, 0x02, 0x45, 0x97, 0xF0, 0x74, 0x95, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, +0xF5, 0x83, 0x22, 0xF1, 0xF0, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x95, 0xF1, 0x0B, 0xE0, 0x54, +0x9C, 0xF1, 0x06, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0xA7, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, +0xD0, 0x83, 0xF1, 0x06, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0xA7, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, +0x82, 0xD0, 0x83, 0xF1, 0x06, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0xA7, 0x54, 0x04, 0xFE, 0xEF, 0x4E, +0xD0, 0x82, 0xD0, 0x83, 0xF1, 0x06, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0xA7, 0x54, 0x40, 0xFE, 0xEF, +0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF1, 0x06, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0xA7, 0x54, 0x20, 0xFE, +0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x51, 0x70, 0x08, 0xF1, 0xAF, 0x54, 0x04, 0x90, +0x04, 0xAB, 0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x06, 0xF1, 0xB7, 0xF1, 0xC7, 0xEF, 0xF0, +0xF1, 0x07, 0xE0, 0x30, 0xE5, 0x10, 0x31, 0x29, 0x13, 0x13, 0x54, 0x03, 0xFB, 0xF1, 0xC8, 0xE0, +0xFD, 0xAF, 0x51, 0x12, 0x84, 0xE4, 0x22, 0xE0, 0xFF, 0x90, 0xA4, 0x7C, 0x12, 0x45, 0xA3, 0x90, +0x00, 0x03, 0x02, 0x06, 0xA2, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x06, 0xA2, 0x75, 0xF0, 0x04, +0xEF, 0x90, 0x96, 0x15, 0x02, 0x45, 0x97, 0xFF, 0x74, 0x15, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, +0x9A, 0xF5, 0x83, 0x22, 0x12, 0x35, 0x26, 0x75, 0x40, 0xFF, 0x22, 0x90, 0xA6, 0x10, 0xE0, 0x24, +0x15, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0x22, 0x7F, 0x8F, 0x12, 0x47, 0xAA, 0xEF, 0x22, +0x90, 0xA4, 0x7C, 0x02, 0x45, 0xAC, 0x90, 0x89, 0x07, 0x12, 0x45, 0x97, 0xE0, 0x22, 0x7F, 0xF4, +0x12, 0x47, 0xAA, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x47, 0xAA, 0xEF, 0x7F, 0x01, 0x20, +0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x12, 0x57, 0xFE, 0x90, 0xA2, 0x9C, 0xEF, 0xF0, +0x11, 0x98, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x11, +0x86, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x46, 0x8D, 0x11, 0x8F, 0x44, 0x40, 0xFD, 0x7F, 0x16, +0x12, 0x46, 0x8D, 0x12, 0x90, 0xD2, 0xEF, 0x64, 0x01, 0x70, 0x2E, 0x90, 0xA4, 0x6C, 0xE0, 0x54, +0x07, 0xF0, 0xE0, 0xFF, 0x64, 0x07, 0x60, 0x05, 0xEF, 0x64, 0x04, 0x70, 0x1C, 0x12, 0x82, 0xF6, +0xEF, 0x64, 0x01, 0x70, 0x14, 0x11, 0x8F, 0x44, 0x60, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0x8D, 0x11, +0x86, 0x44, 0x05, 0xFD, 0x7F, 0x17, 0x12, 0x46, 0x8D, 0x7F, 0x38, 0x12, 0x91, 0x6C, 0x7F, 0x38, +0x12, 0x46, 0x8D, 0x02, 0x37, 0x99, 0x7F, 0x17, 0x12, 0x47, 0xAA, 0xEF, 0x54, 0xFC, 0x22, 0x7F, +0x16, 0x12, 0x47, 0xAA, 0xEF, 0x54, 0x0F, 0x22, 0x12, 0x47, 0xC6, 0x11, 0xC9, 0x12, 0x83, 0x01, +0x12, 0x83, 0x20, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, +0x50, 0x12, 0x46, 0x8D, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x46, 0x8D, 0xAD, 0x0F, 0x7F, 0x52, 0x12, +0x46, 0x8D, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x46, 0x8D, 0x90, 0x01, 0x34, 0x74, 0xFF, 0x11, 0xFA, +0x90, 0x01, 0x3C, 0x11, 0xFA, 0xFD, 0x7F, 0x54, 0x12, 0x46, 0x8D, 0x7D, 0xFF, 0x7F, 0x55, 0x12, +0x46, 0x8D, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46, 0x8D, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x46, 0x8D, +0xE4, 0x90, 0xA4, 0x84, 0xF0, 0x90, 0xA4, 0xEF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x22, 0x90, 0xA3, 0xDD, 0xE0, 0x90, 0xA4, 0xDB, 0xF0, 0x90, 0xA3, 0xDE, 0xE0, 0x90, 0xA4, +0xDC, 0xF0, 0x90, 0xA3, 0xDF, 0xE0, 0x90, 0xA4, 0xDD, 0xF0, 0x90, 0xA3, 0xE0, 0xE0, 0x90, 0xA4, +0xDE, 0xF0, 0x90, 0xA3, 0xE1, 0xE0, 0x90, 0xA4, 0xDF, 0xF0, 0x90, 0xA3, 0xCE, 0xE0, 0x90, 0xA4, +0xE0, 0xF0, 0x90, 0xA3, 0xCF, 0xE0, 0x90, 0xA4, 0xE1, 0xF0, 0x90, 0xA3, 0xD0, 0xE0, 0x90, 0xA4, +0xE2, 0xF0, 0x90, 0xA3, 0xD1, 0xE0, 0x90, 0xA4, 0xE3, 0xF0, 0x90, 0xA3, 0xD2, 0xE0, 0x90, 0xA4, +0xE4, 0xF0, 0x90, 0xA3, 0xD3, 0xE0, 0x90, 0xA4, 0xE5, 0xF0, 0x90, 0xA3, 0xD4, 0xE0, 0x90, 0xA4, +0xE6, 0xF0, 0x90, 0xA3, 0xD5, 0xE0, 0x90, 0xA4, 0xE7, 0xF0, 0x90, 0xA3, 0xD6, 0xE0, 0x90, 0xA4, +0xE8, 0xF0, 0x90, 0xA3, 0xD7, 0xE0, 0x90, 0xA4, 0xE9, 0xF0, 0x11, 0xF0, 0x90, 0xA4, 0x83, 0xF0, +0xB1, 0x7B, 0x50, 0x04, 0xB1, 0x88, 0x80, 0xF8, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, +0x12, 0x67, 0x7C, 0x90, 0xA4, 0x78, 0xF0, 0xA3, 0xF1, 0xC2, 0xB1, 0x7B, 0x50, 0x4B, 0xB1, 0xE2, +0x90, 0xA4, 0x83, 0xE0, 0xFE, 0x24, 0xEA, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF1, 0xA3, 0xE0, 0x24, +0x4D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, +0x34, 0xA4, 0xF1, 0xA3, 0xE0, 0x24, 0x4E, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xEE, 0x12, +0x90, 0xC4, 0x12, 0x45, 0xAC, 0xF1, 0xA7, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0xEE, +0xF1, 0x95, 0x12, 0x45, 0xAC, 0xB1, 0x95, 0x80, 0xB1, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x02, 0xA1, +0x6D, 0x90, 0xA3, 0xC0, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0x6D, 0xE4, 0x90, 0xA4, 0xF4, 0x11, 0xF8, +0x90, 0xA4, 0x78, 0xE0, 0xFF, 0xA3, 0xE0, 0xA3, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA4, 0x7A, +0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0x90, 0xFD, 0x11, 0xF0, 0x12, 0x82, 0x3E, 0xE0, 0xFE, 0xD1, +0xC8, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0xA4, 0x7C, 0xF0, 0xA3, +0x12, 0x82, 0x49, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x90, 0xA4, 0x7F, 0xF0, 0xFC, 0x74, +0x07, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x90, 0xA4, 0x81, 0xF0, +0xEC, 0x24, 0x18, 0x90, 0xA4, 0x7E, 0xF0, 0xFD, 0x90, 0xA4, 0x7A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, +0xB1, 0xA5, 0xEF, 0x54, 0xFC, 0x90, 0xA4, 0x80, 0xF0, 0x90, 0xA4, 0x7F, 0xE0, 0x24, 0x18, 0xFF, +0xE4, 0x33, 0x90, 0xA4, 0x7C, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0xA4, 0x7C, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0x12, 0x8E, 0xE4, 0x90, 0xA4, 0x78, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0xA3, +0xBE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0xA4, 0x78, 0x12, 0x8B, 0xD0, 0x40, 0x11, 0x90, 0xA3, +0xBF, 0xF1, 0xF3, 0xED, 0x9F, 0xFF, 0xEC, 0x9E, 0x90, 0xA4, 0x78, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, +0xA4, 0x5D, 0xE0, 0x30, 0xE0, 0x09, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x02, 0xA1, 0x68, 0x90, +0xA4, 0x80, 0xE0, 0x24, 0xC0, 0x60, 0x02, 0x81, 0x93, 0xB1, 0x6E, 0x24, 0x18, 0xFD, 0xB1, 0xA5, +0xEF, 0x60, 0x02, 0x81, 0x88, 0xB1, 0x6E, 0x24, 0x19, 0xFD, 0xB1, 0xA5, 0x90, 0xA4, 0x99, 0xF1, +0xCA, 0x90, 0xA4, 0x99, 0xE0, 0xFF, 0x90, 0xA4, 0x82, 0xE0, 0xFD, 0xC3, 0x9F, 0x50, 0x15, 0xB1, +0x6E, 0x24, 0x1A, 0xD1, 0x8E, 0x90, 0xA4, 0x82, 0xE0, 0x24, 0x9A, 0xF5, 0x82, 0xE4, 0x34, 0xA4, +0xF1, 0x72, 0x80, 0xDD, 0x90, 0xA4, 0x99, 0xE0, 0x70, 0x02, 0x61, 0xCC, 0xE4, 0x90, 0xA4, 0x83, +0xF0, 0xB1, 0x7B, 0x40, 0x02, 0x61, 0xB4, 0xB1, 0xE2, 0x90, 0xA4, 0x83, 0xE0, 0xFF, 0x24, 0x85, +0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA4, 0x99, 0xE0, 0xFD, 0xEE, 0x6D, +0x70, 0x1E, 0xEF, 0x12, 0x90, 0xC4, 0x12, 0x45, 0xA3, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xF1, +0xB2, 0xED, 0xF0, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1, 0x9F, 0xEF, 0x60, 0x02, 0x80, 0x47, +0x90, 0xA4, 0x99, 0xE0, 0x64, 0x03, 0x70, 0x4E, 0xF1, 0xB2, 0x74, 0x03, 0xF0, 0x7A, 0xA5, 0x79, +0xD7, 0xD1, 0x9F, 0xEF, 0x70, 0x0E, 0xF1, 0xB2, 0x74, 0x03, 0xF0, 0x7A, 0xA5, 0x79, 0xD3, 0xD1, +0x9F, 0xEF, 0x60, 0x2A, 0x90, 0xA4, 0x83, 0xE0, 0xFF, 0x24, 0xE5, 0xF5, 0x82, 0xE4, 0x34, 0xA4, +0xF5, 0x83, 0xE0, 0x60, 0x02, 0x80, 0x0B, 0x90, 0xA4, 0x83, 0xE0, 0xFF, 0x24, 0xE0, 0xF1, 0xDA, +0x60, 0x05, 0x74, 0xF4, 0x2F, 0x80, 0x15, 0xB1, 0xD4, 0x74, 0x01, 0xF0, 0x80, 0x12, 0x90, 0xA4, +0x83, 0xE0, 0x24, 0xF4, 0x80, 0x06, 0x90, 0xA4, 0x83, 0xE0, 0x24, 0xF4, 0xB1, 0xDA, 0xE4, 0xF0, +0xB1, 0x95, 0x61, 0x11, 0x90, 0xA4, 0xF4, 0xE0, 0x70, 0x4F, 0xA3, 0xE0, 0x70, 0x4B, 0xA3, 0xE0, +0x70, 0x47, 0xA3, 0xE0, 0x70, 0x43, 0xA3, 0xE0, 0x70, 0x3F, 0x81, 0x88, 0xE4, 0x90, 0xA4, 0x83, +0xF0, 0xB1, 0x7B, 0x50, 0x1C, 0x74, 0xE0, 0x2E, 0xF1, 0xDA, 0x60, 0x09, 0x74, 0xF4, 0x2E, 0xB1, +0xDA, 0xE4, 0xF0, 0x80, 0x08, 0x74, 0xF4, 0x2E, 0xB1, 0xDA, 0x74, 0x01, 0xF0, 0xB1, 0x95, 0x80, +0xE0, 0x90, 0xA4, 0xF4, 0xE0, 0x70, 0x12, 0xA3, 0xE0, 0x70, 0x0E, 0xA3, 0xE0, 0x70, 0x0A, 0xA3, +0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x70, 0x02, 0x81, 0x88, 0xE4, 0x90, 0xA4, 0x83, 0xF0, 0xB1, 0x7B, +0x50, 0x76, 0xB1, 0xE2, 0xB1, 0xD4, 0xE0, 0x60, 0x6B, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x1D, 0xE0, +0x60, 0x0C, 0x12, 0x8D, 0x46, 0x50, 0x07, 0x0F, 0xBF, 0x00, 0x01, 0x0E, 0x80, 0xEE, 0x90, 0x04, +0x1D, 0xE0, 0x70, 0x50, 0x90, 0xA4, 0x83, 0xE0, 0x24, 0xDB, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, +0x83, 0xE0, 0xFF, 0x90, 0xA5, 0xFF, 0x74, 0x06, 0xF0, 0x7B, 0x08, 0x7D, 0x01, 0xD1, 0x02, 0x90, +0xA4, 0x7C, 0xEE, 0xF0, 0xA3, 0xF1, 0xCA, 0x90, 0xA4, 0x82, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, +0x1C, 0xB1, 0x6E, 0x24, 0x0A, 0xD1, 0x8E, 0x90, 0xA4, 0x7C, 0xA3, 0xE0, 0xFE, 0x90, 0xA4, 0x82, +0xE0, 0x2E, 0x24, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF1, 0x72, 0x80, 0xDA, 0x12, 0x84, 0x61, +0x90, 0x06, 0x35, 0xF0, 0xB1, 0x95, 0x80, 0x86, 0x12, 0x8E, 0xCE, 0x90, 0x06, 0x36, 0x74, 0xDD, +0xF0, 0x21, 0xE9, 0x90, 0xA4, 0x81, 0xE0, 0x60, 0x02, 0xA1, 0x68, 0xB1, 0x6E, 0x24, 0x16, 0xFD, +0xB1, 0xA5, 0x90, 0x06, 0x34, 0xEF, 0xF0, 0xB1, 0x6E, 0x24, 0x17, 0xFD, 0xB1, 0xA5, 0x90, 0x06, +0x37, 0xF1, 0xC2, 0xB1, 0x7B, 0x50, 0x67, 0xB1, 0xE2, 0xE4, 0x90, 0xA4, 0x82, 0xF0, 0x90, 0xA4, +0x82, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x52, 0xEF, 0x60, 0x04, 0x64, 0x01, 0x70, 0x20, 0xB1, +0x6E, 0xB1, 0x9C, 0x90, 0xA4, 0x82, 0xE0, 0xFE, 0x24, 0xA0, 0xF1, 0xE3, 0x90, 0xA4, 0x83, 0xE0, +0xF1, 0x95, 0x12, 0x45, 0xA3, 0x8E, 0x82, 0xD1, 0x99, 0xFF, 0x74, 0xA2, 0x2E, 0xF1, 0xE3, 0xB1, +0x6E, 0xB1, 0x9C, 0x90, 0xA4, 0x83, 0xE0, 0xFE, 0xF1, 0x95, 0x12, 0x45, 0xA3, 0x90, 0xA4, 0x82, +0xE0, 0xF5, 0x82, 0xD1, 0x99, 0x6F, 0x60, 0x0E, 0x74, 0xEF, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA4, +0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x04, 0xF1, 0x76, 0x80, 0xA4, 0xB1, 0x95, 0x80, 0x95, 0x90, 0xA4, +0xEF, 0xE0, 0x64, 0x01, 0x60, 0x17, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x11, 0xA3, 0xE0, 0x64, 0x01, +0x60, 0x0B, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x05, 0xA3, 0xE0, 0xB4, 0x01, 0x06, 0x90, 0xA4, 0x84, +0x74, 0x01, 0xF0, 0x90, 0xA4, 0x84, 0xE0, 0xB4, 0x01, 0x10, 0x12, 0x90, 0x37, 0x90, 0x01, 0xC7, +0x74, 0x66, 0xF0, 0xE4, 0xFF, 0x12, 0x8E, 0x93, 0x21, 0xE9, 0x11, 0xF0, 0x90, 0xA4, 0x83, 0xF0, +0xB1, 0x7B, 0x50, 0x04, 0xB1, 0x88, 0x80, 0xF8, 0x12, 0x8E, 0xCE, 0x21, 0xE9, 0x22, 0x90, 0xA4, +0x7A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0xA4, 0x7E, 0xE0, 0x22, 0x90, 0xA3, 0xCB, 0xE0, 0xFF, +0x90, 0xA4, 0x83, 0xE0, 0xFE, 0xC3, 0x9F, 0x22, 0x74, 0xEF, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA4, +0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0x24, 0x04, 0xFD, 0x90, +0xA4, 0x82, 0xE0, 0x2D, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, +0x90, 0xA3, 0xBF, 0xE0, 0x9B, 0x90, 0xA3, 0xBE, 0xE0, 0x9A, 0x50, 0x09, 0xA3, 0xF1, 0xF3, 0xEB, +0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xD1, +0xCB, 0xE0, 0xFF, 0x22, 0x90, 0xA4, 0x83, 0xE0, 0x24, 0xF4, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, +0x83, 0x22, 0x74, 0xDB, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFE, +0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, +0x06, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xFD, 0xED, 0xF0, 0xA3, 0xEB, +0xF0, 0x90, 0xA5, 0xFC, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0xB1, 0xEE, 0x7C, 0x00, 0xAD, 0x07, 0x90, +0xA5, 0xFC, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA5, 0xFD, 0xE0, 0x60, 0x05, 0xF1, 0x89, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, -0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, -0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, -0x90, 0xA2, 0xE1, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xC7, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x9F, 0x99, -0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x23, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0xCB, -0xF0, 0x7D, 0x26, 0x7F, 0xFF, 0xF1, 0x7C, 0xF1, 0xD2, 0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x75, -0x18, 0x90, 0xA2, 0xCB, 0xE0, 0xFF, 0x7D, 0x27, 0xF1, 0x7C, 0x80, 0x03, 0x12, 0x75, 0x18, 0x90, -0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x22, 0xEF, -0xF0, 0x90, 0x9F, 0x9B, 0xED, 0xF0, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, -0xF0, 0x22, 0xE4, 0x90, 0xA2, 0xE9, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, -0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, -0xA2, 0xEA, 0xE0, 0x94, 0xE8, 0x90, 0xA2, 0xE9, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, -0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2, -0xE9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBF, 0x90, 0xA2, 0x5C, 0xEB, 0xF0, 0x70, -0x6C, 0x90, 0xA2, 0x5C, 0xE0, 0xFE, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, -0xFC, 0x90, 0xA2, 0x5D, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x53, 0x90, 0xA2, 0x61, 0xEB, 0xF0, 0xA3, -0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, 0x90, 0x9F, 0x96, 0xE0, 0xFE, 0x25, 0xE0, -0x25, 0xE0, 0x4F, 0x90, 0xA2, 0x63, 0xF0, 0x90, 0xA2, 0x5E, 0xE0, 0x90, 0xA2, 0x65, 0xF0, 0x90, -0xA2, 0x5F, 0x74, 0x0C, 0xF0, 0x90, 0xA2, 0x6D, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, -0x5F, 0x12, 0x4F, 0x60, 0x7F, 0x04, 0x12, 0x4E, 0x95, 0x90, 0xA2, 0x5D, 0xE0, 0xFF, 0x90, 0xA2, -0x5C, 0xE0, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE4, 0xF5, -0x51, 0x74, 0xAE, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0xA1, -0x44, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x13, -0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xA1, 0x44, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x01, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, -0x50, 0x02, 0xA1, 0x44, 0xE5, 0x51, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, -0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA1, 0x43, 0x12, 0x45, 0x5E, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x01, -0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xF5, 0x56, 0xA3, 0xE0, 0xF5, 0x57, 0x74, 0x16, -0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA1, 0x46, 0xE4, 0xF0, -0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, -0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, -0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x08, -0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0xA1, 0x48, 0xF0, 0xA3, 0xEF, 0xF0, -0x12, 0x07, 0x80, 0xFD, 0xC3, 0xEF, 0x9D, 0xFF, 0xEE, 0x95, 0xF0, 0x90, 0xA1, 0x4A, 0xF0, 0xA3, -0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x52, -0x54, 0x7F, 0xF5, 0x53, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, -0x90, 0xA1, 0x4C, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, -0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0x4D, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, -0x9D, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x81, 0x47, 0x90, 0xA1, 0x4C, 0xE0, 0xFF, -0xE5, 0x53, 0x9F, 0x40, 0x08, 0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52, 0xE5, 0x53, 0x90, -0x41, 0x5F, 0x93, 0xFF, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, -0xC3, 0x9F, 0xE5, 0x53, 0x40, 0x05, 0x90, 0x41, 0x37, 0x80, 0x03, 0x90, 0x41, 0x4B, 0x93, 0xF5, -0x58, 0xE5, 0x58, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x95, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, -0xFF, 0x90, 0xA1, 0x40, 0x12, 0x45, 0x5E, 0xE5, 0x52, 0x90, 0x42, 0x0B, 0x93, 0xFF, 0xD3, 0x90, -0xA1, 0x47, 0xE0, 0x9F, 0x90, 0xA1, 0x46, 0xE0, 0x94, 0x00, 0x40, 0x08, 0x7D, 0x01, 0xAF, 0x51, -0xB1, 0x50, 0x81, 0x47, 0xC3, 0xE5, 0x57, 0x94, 0x0F, 0xE5, 0x56, 0x94, 0x00, 0x50, 0x5E, 0x90, -0xA1, 0x43, 0x12, 0x45, 0x55, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0x00, -0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, -0x57, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x02, 0x81, 0x1C, 0xE5, 0x57, 0xAE, 0x56, -0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0xE5, 0x56, 0xC3, 0x13, -0xFE, 0xE5, 0x57, 0x13, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0x90, 0xA1, 0x43, 0x12, 0x45, 0x55, 0x12, -0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x50, 0x02, 0x81, 0x22, 0x61, 0xFC, 0x90, 0xA1, 0x43, -0x12, 0x45, 0x55, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0xE5, 0x57, 0xAE, 0x56, -0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, 0xE5, 0x56, 0xC3, 0x13, -0xFE, 0xE5, 0x57, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x04, -0x7D, 0x04, 0x81, 0x1E, 0xE5, 0x51, 0x64, 0x01, 0x70, 0x50, 0x90, 0xA1, 0x43, 0x12, 0x45, 0x55, -0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, -0x13, 0xFF, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0x9F, 0x96, 0x74, 0x01, 0xF0, 0x80, -0x29, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, -0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, -0x9F, 0xEC, 0x9E, 0x40, 0x05, 0xE4, 0x90, 0x9F, 0x96, 0xF0, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, -0x56, 0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, -0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0x25, -0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, -0x55, 0xE4, 0xF5, 0x5A, 0x90, 0xA1, 0x43, 0x12, 0x45, 0x55, 0x75, 0xF0, 0x02, 0xE5, 0x5A, 0xA4, -0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, -0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x40, 0x12, 0x45, 0x55, 0x85, 0x5A, 0x82, -0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, -0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0x05, 0x5A, 0xE5, 0x5A, 0xB4, 0x05, 0xB7, 0x90, 0xA1, 0x40, -0x12, 0x45, 0x55, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0xE5, 0x57, 0xAE, 0x56, -0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, -0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54, 0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54, -0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, -0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xAE, 0x54, -0xFF, 0xE4, 0xFC, 0xFD, 0xE5, 0x53, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, -0x41, 0xF5, 0x83, 0x12, 0x45, 0x39, 0xC3, 0x12, 0x45, 0x00, 0x50, 0x07, 0xAF, 0x51, 0x12, 0x6A, -0xC4, 0x80, 0x1F, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, -0xD3, 0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x40, 0x06, 0x7D, 0x01, 0xAF, 0x51, -0xB1, 0x50, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xA3, -0xE0, 0x90, 0xA2, 0x5E, 0xF0, 0x90, 0xA2, 0x5D, 0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD, 0xFF, -0x11, 0x1A, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0x74, 0x81, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, -0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x3D, 0x90, 0xA1, 0x46, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16, -0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, -0x51, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEE, 0x8F, -0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, -0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x48, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, -0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, -0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x51, 0x50, 0x13, -0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, -0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, -0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x4A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFB, 0xC3, 0x74, 0xFF, 0x9B, 0xFF, -0x74, 0xFF, 0x9E, 0xFE, 0x74, 0xFF, 0x94, 0x00, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0xFC, 0x90, 0x94, -0x91, 0x12, 0x45, 0x2D, 0xD3, 0x12, 0x45, 0x00, 0x90, 0x94, 0x91, 0x50, 0x19, 0x12, 0x45, 0x2D, -0x90, 0xA1, 0x4A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x12, 0x44, 0xD9, 0x90, 0x94, -0x91, 0x12, 0x08, 0x6D, 0x80, 0x07, 0x12, 0x08, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xFD, 0xAF, -0x51, 0x12, 0x68, 0x89, 0x05, 0x51, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x01, 0x91, 0x22, -0xAA, 0x07, 0xAB, 0x05, 0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xF5, -0x5B, 0x54, 0x7F, 0xF5, 0x5D, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, -0x90, 0xA1, 0x51, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xFF, -0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x5C, 0xE5, -0x5D, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, -0x01, 0x93, 0xFD, 0xEA, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEC, -0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFE, -0xC4, 0x54, 0x03, 0x90, 0xA1, 0x4F, 0xF0, 0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, -0x83, 0xE5, 0x5D, 0xF0, 0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5C, -0xF0, 0xE5, 0x5D, 0xD3, 0x9F, 0x40, 0x04, 0x8F, 0x5D, 0x8F, 0x5B, 0xEB, 0x70, 0x02, 0xC1, 0xC8, -0xAF, 0x03, 0x8F, 0x5E, 0xE5, 0x5B, 0x30, 0xE7, 0x05, 0x85, 0x5D, 0x5B, 0x15, 0x5E, 0xE5, 0x5E, -0x70, 0x02, 0xC1, 0xC8, 0xE5, 0x5D, 0x64, 0x2C, 0x70, 0x2A, 0xE5, 0x5C, 0xD3, 0x94, 0x00, 0x40, -0x23, 0xE5, 0x5C, 0xD3, 0x94, 0x02, 0x50, 0x1C, 0x15, 0x5C, 0xE5, 0x5C, 0x54, 0x03, 0x25, 0xE0, -0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF3, -0x4F, 0xF0, 0x15, 0x5E, 0xE5, 0x5E, 0x70, 0x02, 0xC1, 0xC8, 0x90, 0xA1, 0x51, 0xE0, 0xFF, 0xE5, -0x5D, 0xD3, 0x9F, 0x40, 0x7D, 0xE4, 0x90, 0xA1, 0x50, 0xF0, 0x85, 0x5D, 0x5B, 0xAD, 0x5B, 0xE5, -0x5D, 0x14, 0xFC, 0x90, 0xA1, 0x51, 0xE0, 0xFF, 0xEC, 0xC3, 0x9F, 0x40, 0x5F, 0xEC, 0x13, 0x13, -0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEA, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, -0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xEC, 0x54, -0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x5D, 0xAD, -0x04, 0xB4, 0x14, 0x02, 0x7D, 0x0C, 0x90, 0xA1, 0x50, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x5E, 0x60, -0x0B, 0xA3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40, 0x03, 0x1C, 0x80, 0x97, 0xAF, 0x05, 0x8F, 0x5B, -0x80, 0x06, 0x90, 0xA1, 0x51, 0xE0, 0xF5, 0x5B, 0xAF, 0x02, 0x85, 0x5C, 0x67, 0xE4, 0xFB, 0xAD, -0x5B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x64, 0x8D, 0x65, 0x8B, 0x66, 0xE4, 0x90, -0xA2, 0xB6, 0xF0, 0xE5, 0x64, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0xA2, 0xB1, 0xF0, 0xE5, 0x64, -0x54, 0x07, 0x90, 0xA2, 0xB3, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, -0xE0, 0x90, 0xA2, 0xB4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, -0x54, 0x7F, 0x90, 0xA2, 0xB7, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x64, 0x90, 0x96, 0x17, 0x12, 0x45, -0x49, 0xE0, 0x90, 0xA2, 0xB8, 0xF0, 0xE5, 0x65, 0x54, 0x7F, 0x90, 0xA2, 0xB2, 0xF0, 0xE5, 0x66, -0x70, 0x42, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, -0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0xEB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, -0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x39, 0x12, 0x44, 0xD9, 0x78, 0x01, 0x12, -0x08, 0x47, 0xE5, 0x64, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, -0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0xB7, 0xE0, 0xFF, 0x90, 0xA2, 0xB2, 0xE0, 0xFE, 0xD3, 0x9F, -0x40, 0x0B, 0xE5, 0x65, 0x54, 0x80, 0xFD, 0xEF, 0x4D, 0xF5, 0x65, 0x80, 0x0C, 0x90, 0xA2, 0xB8, -0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, 0x65, 0xE5, 0x65, 0x54, 0x7F, 0x90, 0xA2, 0xB2, -0xF0, 0xE5, 0x65, 0x54, 0x80, 0x90, 0xA2, 0xB5, 0xF0, 0xE5, 0x66, 0x70, 0x33, 0x90, 0xA2, 0xB1, -0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, -0x90, 0xA2, 0xB3, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, -0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA2, 0xB4, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x52, -0x90, 0xA2, 0xB1, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, -0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xB3, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x64, 0x90, 0x81, -0x01, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA2, 0xB4, 0xF0, 0x90, 0xA2, 0xB2, 0xE0, -0x90, 0x41, 0xF7, 0x93, 0xFE, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA2, 0xB4, 0xF0, 0x44, -0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x64, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x65, 0xF0, -0xE5, 0x64, 0x70, 0x06, 0x90, 0x01, 0xC8, 0xE5, 0x65, 0xF0, 0x90, 0xA2, 0xB4, 0xE0, 0xFF, 0x75, -0xF0, 0x10, 0xE5, 0x64, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x64, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x67, 0x54, 0x03, 0x4F, -0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x64, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x7D, 0x01, -0xAF, 0x64, 0x11, 0x89, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, -0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, -0xEF, 0x90, 0x8D, 0x07, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, -0x8D, 0x09, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, -0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x98, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xE0, -0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xEE, -0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x6C, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x95, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3, 0x94, 0x11, 0x40, 0x29, 0x80, 0x1F, -0xEE, 0xB4, 0x01, 0x08, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x1D, 0x80, 0x13, 0x74, 0x96, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0x70, 0x0B, 0xED, 0xC3, 0x94, 0x03, 0x40, 0x08, 0x75, -0x6C, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x6C, 0xAF, 0x6C, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0x8B, 0x54, -0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, -0x52, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x2F, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, -0xEF, 0x13, 0x90, 0xA1, 0x47, 0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40, 0x02, 0x80, 0x19, 0xE5, -0x53, 0xD3, 0x94, 0x19, 0x40, 0x05, 0x90, 0xA1, 0x47, 0x80, 0x0B, 0x75, 0xF0, 0x04, 0xE5, 0x52, -0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x85, 0x54, 0x67, 0xE4, 0xFB, 0xAF, 0x52, 0x02, -0x66, 0xD1, 0x90, 0xA1, 0x44, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x16, 0xF5, -0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0x9C, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, -0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0x44, 0x12, 0x45, -0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, -0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, -0xE0, 0xFF, 0x90, 0xA1, 0x44, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, -0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, -0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0x44, 0x12, 0x45, 0x55, 0x90, -0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, -0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, -0x90, 0xA1, 0x44, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x20, 0xFE, 0xEF, -0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x16, 0x90, 0x00, 0x02, -0x12, 0x06, 0xA2, 0xFF, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, -0xF0, 0x80, 0x0F, 0xE5, 0x51, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, -0x95, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE5, -0x22, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x13, 0x13, 0x54, -0x03, 0xFB, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, -0x51, 0x31, 0x5A, 0x22, 0xAB, 0x07, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, -0xE0, 0xF5, 0x5B, 0xE4, 0xF5, 0x5F, 0xE5, 0x5B, 0x54, 0x7F, 0xF9, 0xE5, 0x5B, 0x54, 0x80, 0xFA, -0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x5D, 0x75, 0xF0, 0x04, -0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xF5, 0x5E, 0xE9, 0x25, -0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x1D, 0xEB, -0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0xE5, 0x5B, 0x4A, 0xFF, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, -0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x5C, 0x74, -0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5C, 0xF0, 0xE9, 0x64, 0x2C, 0x70, -0x33, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x54, 0x03, 0xFE, -0xE5, 0x5C, 0xC3, 0x9E, 0x50, 0x1E, 0x05, 0x5C, 0xE5, 0x5C, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, -0xFE, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, -0x89, 0x5B, 0x81, 0x4C, 0xE9, 0xC3, 0x95, 0x5D, 0x50, 0x6B, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, -0x5D, 0x40, 0x02, 0x81, 0x4C, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEB, -0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, -0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, -0x55, 0x82, 0x4E, 0x60, 0x1D, 0xB9, 0x13, 0x14, 0x79, 0x18, 0x89, 0x5B, 0x74, 0x16, 0x2B, 0xF5, -0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x60, 0xA9, 0x05, 0x89, 0x5B, -0x80, 0x5A, 0x0D, 0x80, 0x98, 0xE9, 0x65, 0x5D, 0x70, 0x43, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, -0x18, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x5B, 0x20, -0xE7, 0x07, 0xE9, 0x44, 0x80, 0xF5, 0x5B, 0x80, 0x33, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, -0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x1D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, -0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x74, 0x16, 0x2B, -0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x5D, 0xF0, 0xF5, 0x5B, 0xAF, 0x03, 0x85, 0x5C, -0x67, 0x7B, 0x01, 0xAD, 0x5B, 0x02, 0x66, 0xD1, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, -0x45, 0x49, 0xE0, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, -0xE0, 0xFC, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xFD, -0x64, 0x2C, 0x70, 0x2F, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xF9, -0x54, 0x03, 0xFB, 0xEE, 0xD3, 0x9B, 0x50, 0x1B, 0xEE, 0x60, 0x18, 0x1E, 0xEE, 0x54, 0x03, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE9, 0x54, -0xF3, 0x4B, 0xF0, 0xED, 0xD3, 0x9C, 0x40, 0x02, 0xAD, 0x04, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x05, 0x8E, 0x67, 0xE4, 0xFB, 0x02, 0x66, 0xD1, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xE2, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0x90, -0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x1F, 0xFB, 0x24, 0xF1, 0x50, 0x02, 0xA1, 0x72, 0xE4, -0xF5, 0x68, 0x90, 0xA2, 0xE2, 0xE0, 0xFD, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, -0xE5, 0x82, 0x25, 0x68, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFE, 0xEB, 0x75, 0xF0, -0x07, 0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x68, 0xF5, -0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, 0xA2, 0xE4, 0xF0, 0x75, -0xF0, 0x04, 0xED, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0B, -0xE5, 0x68, 0x70, 0x07, 0x90, 0xA2, 0xE4, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0xA2, 0xE4, 0xE0, 0xFF, -0x90, 0xA2, 0xE2, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, -0x68, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x68, 0xE5, 0x68, 0x64, 0x07, -0x70, 0x80, 0x90, 0xA2, 0xE2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, -0xFF, 0xC4, 0x54, 0x03, 0xF9, 0xE4, 0xFD, 0x75, 0x69, 0x06, 0xE5, 0x69, 0xB4, 0x06, 0x1D, 0xFF, -0x90, 0xA2, 0xE2, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA2, 0xE2, 0xE0, -0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, 0x69, 0xF5, 0x82, 0xE4, -0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xE3, 0xF0, 0x90, 0xA2, 0xE3, 0xE0, 0x60, 0x3E, 0x75, -0x68, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x68, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0xE3, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x18, 0xE5, 0x69, 0x75, 0xF0, -0x08, 0xA4, 0x25, 0x68, 0xFD, 0xE9, 0x60, 0x24, 0xED, 0xD3, 0x94, 0x0B, 0x40, 0x1E, 0x74, 0x20, -0x2D, 0xFD, 0x80, 0x18, 0x15, 0x68, 0xE5, 0x68, 0xC3, 0x94, 0x00, 0x50, 0xC5, 0xE5, 0x69, 0x60, -0x0B, 0x15, 0x69, 0xE5, 0x69, 0xC3, 0x94, 0x00, 0x40, 0x02, 0xA1, 0x8A, 0xE4, 0xFC, 0xF5, 0x69, -0xE5, 0x69, 0xB4, 0x06, 0x1D, 0xFF, 0x90, 0xA2, 0xE2, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, -0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, -0x80, 0x19, 0x90, 0xA2, 0xE2, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, -0x82, 0x25, 0x69, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xE3, 0xF0, 0x90, -0xA2, 0xE3, 0xE0, 0x60, 0x3C, 0xE4, 0xF5, 0x68, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x68, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0xE3, 0xE0, 0xFB, 0xEF, 0x5B, -0x60, 0x18, 0xE5, 0x69, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x68, 0xFC, 0xE9, 0x60, 0x1D, 0xEC, 0xD3, -0x94, 0x0B, 0x40, 0x17, 0x74, 0x20, 0x2C, 0xFC, 0x80, 0x11, 0x05, 0x68, 0xE5, 0x68, 0xB4, 0x08, -0xC7, 0x05, 0x69, 0xE5, 0x69, 0x64, 0x07, 0x60, 0x02, 0xC1, 0x20, 0x90, 0xA2, 0xE2, 0xE0, 0xFF, -0x75, 0xF0, 0x04, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, -0x96, 0x17, 0x12, 0x45, 0x49, 0xEC, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x45, -0x49, 0xE0, 0xFF, 0x54, 0x7F, 0xF5, 0x6A, 0xEF, 0x54, 0x80, 0xFF, 0xE5, 0x6A, 0xD3, 0x9D, 0x40, -0x03, 0xED, 0x80, 0x07, 0xE5, 0x6A, 0xC3, 0x9C, 0x50, 0x04, 0xEC, 0x4F, 0xF5, 0x6A, 0x90, 0xA2, -0xE2, 0xE0, 0xFF, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x6A, 0xF0, 0x75, -0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x67, -0x90, 0xA2, 0xE2, 0xE0, 0xFF, 0xE4, 0xFB, 0xAD, 0x6A, 0x12, 0x66, 0xD1, 0x90, 0xA2, 0xE2, 0xE0, -0x75, 0xF0, 0x10, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x1F, -0xF5, 0x53, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x52, 0x90, 0x00, 0x02, -0x12, 0x06, 0xA2, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, -0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x55, -0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x56, 0x90, 0x00, 0x02, 0x12, 0x06, -0xA2, 0xFF, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, 0x54, 0x04, 0x13, 0x13, -0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x75, -0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xE5, -0x55, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, -0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x60, 0x03, 0x02, 0x70, 0x9B, -0xE5, 0x53, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, -0xE0, 0x54, 0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, -0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, -0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, -0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, -0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, -0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xCF, 0x4F, -0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, -0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xE5, 0x5A, 0x25, -0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82, 0x75, 0x83, 0x00, -0xA3, 0xA3, 0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0x90, 0x89, 0x00, 0x12, -0x45, 0x49, 0xE5, 0x82, 0x25, 0x58, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, -0x58, 0xE5, 0x58, 0xB4, 0x04, 0xD4, 0xAF, 0x51, 0x12, 0x6C, 0xD0, 0x22, 0x12, 0x06, 0x89, 0x90, -0xA1, 0x44, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x45, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x06, 0xA2, 0x54, 0x01, 0xFF, 0x60, 0x68, 0x90, 0xA1, 0x44, 0xE0, 0xD3, 0x94, 0x80, 0x40, -0x5F, 0xA3, 0xE0, 0xD3, 0x94, 0x80, 0x40, 0x58, 0x90, 0xA1, 0x48, 0xEF, 0xF0, 0x90, 0x94, 0x91, -0x12, 0x45, 0x11, 0x90, 0xA1, 0x49, 0xEF, 0xF0, 0x90, 0x94, 0x91, 0x12, 0x45, 0x11, 0x78, 0x08, -0x12, 0x08, 0x47, 0x90, 0xA1, 0x4A, 0xEF, 0xF0, 0x90, 0x94, 0x91, 0x12, 0x45, 0x11, 0x78, 0x10, -0x12, 0x08, 0x47, 0x90, 0xA1, 0x4B, 0xEF, 0xF0, 0x90, 0x94, 0x91, 0x12, 0x45, 0x11, 0x78, 0x18, -0x12, 0x08, 0x47, 0x90, 0xA1, 0x4C, 0xEF, 0xF0, 0x90, 0xA1, 0x46, 0x74, 0x0D, 0xF0, 0x90, 0xA1, -0x54, 0x74, 0x05, 0xF0, 0x90, 0x94, 0x91, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x41, 0x2B, -0xEF, 0x60, 0x02, 0x41, 0x2B, 0x90, 0xA1, 0x44, 0xE0, 0xFF, 0xD3, 0x94, 0x80, 0x50, 0x47, 0x90, -0xA1, 0x48, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, -0xFE, 0xA3, 0xE0, 0x90, 0xA1, 0x49, 0xF0, 0xEE, 0xA3, 0xF0, 0x90, 0xA1, 0x44, 0xE0, 0xFD, 0x25, -0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA1, -0x4B, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, -0x90, 0xA1, 0x4D, 0xF0, 0x80, 0x08, 0x90, 0xA1, 0x44, 0xE0, 0x90, 0xA1, 0x48, 0xF0, 0x90, 0xA1, -0x45, 0xE0, 0xFF, 0xD3, 0x94, 0x80, 0x50, 0x47, 0x90, 0xA1, 0x4E, 0xEF, 0xF0, 0x25, 0xE0, 0x24, -0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA1, 0x4F, 0xF0, -0xEE, 0xA3, 0xF0, 0x90, 0xA1, 0x45, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, -0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA1, 0x51, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, -0x10, 0xED, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA1, 0x53, 0xF0, 0x80, 0x08, 0x90, -0xA1, 0x45, 0xE0, 0x90, 0xA1, 0x4E, 0xF0, 0x90, 0xA1, 0x46, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0x54, -0x74, 0x0C, 0xF0, 0x90, 0xA1, 0x44, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, -0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x45, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x16, -0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x16, -0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEE, 0x25, 0xE0, 0x24, 0x16, -0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, -0x46, 0x12, 0x4F, 0x60, 0x7F, 0x04, 0x02, 0x4E, 0x95, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, -0x12, 0x45, 0x49, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0xA2, 0x81, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA2, 0x8B, 0x12, 0x08, 0x6D, -0x90, 0xA2, 0x83, 0x12, 0x45, 0x11, 0x12, 0x08, 0x3A, 0x90, 0xA2, 0x8B, 0x12, 0x45, 0x2D, 0x12, -0x44, 0xE6, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA2, 0x83, 0x12, 0x45, 0x11, -0x90, 0xA2, 0x87, 0x12, 0x45, 0x2D, 0x12, 0x44, 0xE6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, -0x00, 0x12, 0x44, 0xF3, 0x90, 0xA2, 0x8F, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x8F, 0x12, 0x45, 0x11, -0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x81, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, -0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x6F, -0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA2, 0x6E, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, -0x02, 0x90, 0xA2, 0x79, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x71, 0x12, 0x45, 0x11, 0x12, 0x08, 0x3A, -0x90, 0xA2, 0x79, 0x12, 0x45, 0x2D, 0x12, 0x44, 0xE6, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, -0x07, 0x90, 0xA2, 0x71, 0x12, 0x45, 0x11, 0x90, 0xA2, 0x75, 0x12, 0x45, 0x2D, 0x12, 0x44, 0xE6, -0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xF3, 0x90, 0xA2, 0x7D, 0x12, 0x08, -0x6D, 0x90, 0xA2, 0x6F, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA2, 0x7D, 0x12, 0x45, 0x11, 0x90, -0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x6E, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0x90, 0xA1, 0x30, 0xE0, 0x75, 0xF0, 0x20, 0xA4, 0xFF, 0x90, -0xA2, 0xD8, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0x31, 0xE0, 0x75, 0xF0, 0x08, 0xA4, -0xAE, 0xF0, 0x90, 0xA2, 0xDA, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x02, 0x61, 0xE6, -0x90, 0xA1, 0x2F, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x78, 0xEE, 0x54, -0x0F, 0xFF, 0xEE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, -0x46, 0x4F, 0x90, 0xA1, 0x2F, 0xE0, 0xFE, 0x54, 0x0F, 0xFF, 0xEE, 0xC4, 0x13, 0x13, 0x54, 0x01, -0xFD, 0x12, 0x46, 0x4F, 0x90, 0xA1, 0x2F, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x23, 0x90, -0xA2, 0xD8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E, 0x50, 0x90, 0xA1, 0x2F, 0xE0, 0xFE, 0x54, -0x0F, 0xFF, 0xEE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, -0x46, 0x4F, 0x90, 0xA1, 0x2F, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0xA2, 0xDB, 0xE0, -0x90, 0xA2, 0xC5, 0xF0, 0x90, 0xA2, 0xDA, 0xE0, 0x90, 0xA2, 0xC6, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, -0x58, 0x7E, 0x01, 0x12, 0x47, 0xFC, 0x22, 0x90, 0xA2, 0xF4, 0xEF, 0xF0, 0x90, 0x9F, 0x9C, 0xE0, -0xB4, 0x02, 0x12, 0x90, 0xA2, 0xF4, 0xE0, 0xFF, 0x64, 0x01, 0x60, 0x17, 0x90, 0x01, 0x4D, 0xE0, -0x64, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA2, 0xF4, 0xE0, -0xFF, 0x71, 0x34, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, -0x37, 0x4E, 0x90, 0xA1, 0x37, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, -0xA1, 0x3B, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x37, 0x12, 0x45, 0x11, 0xEF, 0x54, 0x01, 0xFF, 0xE4, -0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA1, 0x37, 0x12, 0x45, 0x11, 0xEF, 0x54, 0xFE, 0xFF, -0xEC, 0x90, 0xA1, 0x37, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x37, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, -0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0xA1, 0x3B, 0x12, 0x45, 0x11, -0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA1, 0x3B, 0x12, 0x45, -0x11, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA1, 0x3B, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x3B, 0x12, -0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, -0xF0, 0x22, 0xE4, 0x90, 0xA2, 0xEF, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x2C, -0xC3, 0x90, 0xA2, 0xF0, 0xE0, 0x94, 0xD0, 0x90, 0xA2, 0xEF, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, -0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0xA2, 0xEF, 0xE4, 0x75, 0xF0, 0x01, -0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0x7D, -0x07, 0xEF, 0x5D, 0xC3, 0x60, 0x14, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, -0xED, 0x5F, 0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x0D, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, -0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0xFF, 0x22, 0x90, 0x9F, 0x9F, 0xE0, 0xFF, 0x90, 0xA2, 0xC8, -0xE0, 0xFB, 0x7D, 0x01, 0x12, 0x5E, 0x88, 0x90, 0xA2, 0xC9, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, -0xFD, 0x90, 0xA2, 0xC7, 0xE0, 0xFF, 0x12, 0x5F, 0x87, 0x90, 0xA2, 0xC9, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, -0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xED, 0xF0, 0x22, 0x74, 0xA3, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, -0xFF, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, -0xED, 0xF0, 0xAF, 0x06, 0x22, 0xFC, 0xED, 0x2C, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, -0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0xA0, 0x8E, 0xE0, 0x9B, 0x90, 0xA0, 0x8D, 0xE0, 0x9A, 0x50, 0x13, -0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0xA0, 0x8D, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, -0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, 0x90, 0xA1, 0xC1, 0x12, 0x45, 0x5E, 0xE4, 0xFF, 0x90, -0xA1, 0xC7, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x26, 0x90, 0xA1, 0xC4, 0x12, 0x45, 0x55, 0x8F, -0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x90, 0xA1, 0xC1, 0x12, 0x45, 0x55, 0x8F, 0x82, -0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0x6E, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xD0, 0x7F, -0x01, 0x22, 0x90, 0xA0, 0xA8, 0xE0, 0x90, 0xA1, 0xA3, 0xF0, 0x90, 0xA0, 0xA9, 0xE0, 0x90, 0xA1, -0xA4, 0xF0, 0x90, 0xA0, 0xAA, 0xE0, 0x90, 0xA1, 0xA5, 0xF0, 0x90, 0xA0, 0xAB, 0xE0, 0x90, 0xA1, -0xA6, 0xF0, 0x90, 0xA0, 0xAC, 0xE0, 0x90, 0xA1, 0xA7, 0xF0, 0x90, 0xA0, 0x99, 0xE0, 0x90, 0xA1, -0xA8, 0xF0, 0x90, 0xA0, 0x9A, 0xE0, 0x90, 0xA1, 0xA9, 0xF0, 0x90, 0xA0, 0x9B, 0xE0, 0x90, 0xA1, -0xAA, 0xF0, 0x90, 0xA0, 0x9C, 0xE0, 0x90, 0xA1, 0xAB, 0xF0, 0x90, 0xA0, 0x9D, 0xE0, 0x90, 0xA1, -0xAC, 0xF0, 0x90, 0xA0, 0x9E, 0xE0, 0x90, 0xA1, 0xAD, 0xF0, 0x90, 0xA0, 0x9F, 0xE0, 0x90, 0xA1, -0xAE, 0xF0, 0x90, 0xA0, 0xA0, 0xE0, 0x90, 0xA1, 0xAF, 0xF0, 0x90, 0xA0, 0xA1, 0xE0, 0x90, 0xA1, -0xB0, 0xF0, 0x90, 0xA0, 0xA2, 0xE0, 0x90, 0xA1, 0xB1, 0xF0, 0xE4, 0x90, 0xA1, 0x4C, 0xF0, 0x90, -0xA1, 0xB7, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x4B, 0xF0, 0x90, -0xA0, 0x96, 0xE0, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x15, 0x74, 0xB7, 0x2E, -0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x4B, 0xE0, 0x04, 0xF0, -0x80, 0xDD, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, -0xEC, 0x3E, 0x90, 0xA1, 0x40, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0xA1, 0x4B, 0xF0, 0x90, 0xA0, -0x96, 0xE0, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0xE1, 0xC2, 0xB1, 0xC5, -0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0x24, 0xB2, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xEF, 0xF0, -0x74, 0xB2, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x24, 0x4D, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x4D, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, -0xEF, 0xF0, 0x74, 0xB2, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x24, 0x4E, 0xF9, -0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x52, 0xF5, 0x82, 0xE4, -0x34, 0xA1, 0xF5, 0x83, 0x12, 0x45, 0x5E, 0x74, 0xB2, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, -0x83, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x94, -0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x12, 0x45, 0x5E, 0x90, 0xA1, 0x4B, 0xE0, 0x04, 0xF0, -0xE1, 0x2E, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x03, 0x02, 0x7C, 0x47, 0x90, 0xA0, 0x8F, 0xE0, 0x64, -0x01, 0x60, 0x03, 0x02, 0x7C, 0x47, 0x90, 0xA1, 0xBC, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0xA1, 0x40, 0xE0, 0xFF, 0xA3, 0xE0, 0xA3, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, -0xA1, 0x42, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0x90, 0xFD, 0x11, 0xF0, 0x74, 0x01, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0xA1, 0x44, 0xF0, -0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, -0x33, 0x33, 0x33, 0x54, 0xF8, 0x90, 0xA1, 0x47, 0xF0, 0xFC, 0x74, 0x07, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x90, 0xA1, 0x49, 0xF0, 0xEC, 0x24, 0x18, 0x90, 0xA1, -0x46, 0xF0, 0xFD, 0x90, 0xA1, 0x42, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x75, 0xE9, 0xEF, 0x54, -0xFC, 0x90, 0xA1, 0x48, 0xF0, 0x90, 0xA1, 0x47, 0xE0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0x90, 0xA1, -0x44, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0xA1, 0x44, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x74, -0xEF, 0x90, 0xA1, 0x40, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0xA0, 0x8D, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0x90, 0xA1, 0x40, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x9E, 0x40, 0x1B, -0x90, 0xA0, 0x8E, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0xA0, 0x8D, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xED, -0x9F, 0xFF, 0xEC, 0x9E, 0x90, 0xA1, 0x40, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0x48, 0xE0, 0x24, -0xC0, 0x60, 0x02, 0x61, 0x44, 0x90, 0xA1, 0x42, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0xA1, 0x46, -0xE0, 0x24, 0x18, 0xFD, 0x12, 0x75, 0xE9, 0xEF, 0x60, 0x02, 0x81, 0x39, 0x90, 0xA1, 0x42, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0xA1, 0x46, 0xE0, 0x24, 0x19, 0xFD, 0x12, 0x75, 0xE9, 0x90, 0xA1, -0x61, 0xEF, 0xF0, 0xE4, 0x90, 0xA1, 0x4A, 0xF0, 0x90, 0xA1, 0x61, 0xE0, 0xFF, 0x90, 0xA1, 0x4A, -0xE0, 0xFD, 0xC3, 0x9F, 0x50, 0x28, 0x90, 0xA1, 0x42, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0xA1, -0x46, 0xE0, 0x24, 0x1A, 0x12, 0x75, 0xE5, 0x90, 0xA1, 0x4A, 0xE0, 0x24, 0x62, 0xF5, 0x82, 0xE4, -0x34, 0xA1, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA1, 0x4A, 0xE0, 0x04, 0xF0, 0x80, 0xCA, 0x90, 0xA1, -0x61, 0xE0, 0x70, 0x02, 0x41, 0x4F, 0xE4, 0x90, 0xA1, 0x4B, 0xF0, 0x90, 0xA0, 0x96, 0xE0, 0xFF, -0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x37, 0x12, 0x75, 0xC5, 0x90, 0xA1, -0x4B, 0xE0, 0xFF, 0x24, 0x4D, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA1, -0x61, 0xE0, 0xFD, 0xEE, 0x6D, 0x70, 0x36, 0xEF, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x52, 0xF5, 0x82, -0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x12, 0x45, 0x55, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x7B, 0x01, -0x7A, 0xA1, 0x79, 0x62, 0x90, 0xA1, 0xC4, 0x12, 0x45, 0x5E, 0x90, 0xA1, 0xC7, 0xED, 0xF0, 0xD0, -0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x76, 0x27, 0xEF, 0x60, 0x02, 0x80, 0x69, 0x90, 0xA1, 0x61, -0xE0, 0x64, 0x03, 0x70, 0x7B, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x62, 0x90, 0xA1, 0xC4, 0x12, 0x45, -0x5E, 0x90, 0xA1, 0xC7, 0x74, 0x03, 0xF0, 0x7A, 0xA2, 0x79, 0xBD, 0x12, 0x76, 0x27, 0xEF, 0x70, -0x1C, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x62, 0x90, 0xA1, 0xC4, 0x12, 0x45, 0x5E, 0x90, 0xA1, 0xC7, -0x74, 0x03, 0xF0, 0x7A, 0xA2, 0x79, 0xB9, 0x12, 0x76, 0x27, 0xEF, 0x60, 0x3B, 0x90, 0xA1, 0x4B, -0xE0, 0xFF, 0x24, 0xAD, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x60, 0x02, 0x80, 0x11, -0x90, 0xA1, 0x4B, 0xE0, 0xFF, 0x24, 0xA8, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x60, -0x05, 0x74, 0xBC, 0x2F, 0x80, 0x20, 0x90, 0xA1, 0x4B, 0xE0, 0x24, 0xBC, 0xF5, 0x82, 0xE4, 0x34, -0xA1, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x17, 0x90, 0xA1, 0x4B, 0xE0, 0x24, 0xBC, 0x80, 0x06, -0x90, 0xA1, 0x4B, 0xE0, 0x24, 0xBC, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x90, -0xA1, 0x4B, 0xE0, 0x04, 0xF0, 0x21, 0x3B, 0x90, 0xA1, 0xBC, 0xE0, 0x70, 0x6D, 0xA3, 0xE0, 0x70, -0x69, 0xA3, 0xE0, 0x70, 0x65, 0xA3, 0xE0, 0x70, 0x61, 0xA3, 0xE0, 0x70, 0x5D, 0x81, 0x39, 0xE4, -0x90, 0xA1, 0x4B, 0xF0, 0x90, 0xA0, 0x96, 0xE0, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0xC3, 0x9F, -0x50, 0x30, 0x74, 0xA8, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x60, 0x0E, 0x74, -0xBC, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0D, 0x74, 0xBC, 0x2E, -0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x4B, 0xE0, 0x04, 0xF0, -0x80, 0xC2, 0x90, 0xA1, 0xBC, 0xE0, 0x70, 0x12, 0xA3, 0xE0, 0x70, 0x0E, 0xA3, 0xE0, 0x70, 0x0A, -0xA3, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x70, 0x02, 0x81, 0x39, 0xE4, 0x90, 0xA1, 0x4B, 0xF0, 0x90, -0xA0, 0x96, 0xE0, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x81, 0x39, 0x12, -0x75, 0xC5, 0x90, 0xA1, 0x4B, 0xE0, 0x24, 0xBC, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, -0x60, 0x6A, 0x12, 0x5E, 0x5A, 0xEF, 0x64, 0x01, 0x70, 0x62, 0x90, 0xA1, 0x4B, 0xE0, 0x24, 0xA3, -0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x12, 0x5E, 0x88, -0x90, 0xA1, 0x44, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0xA1, 0x4A, 0xF0, 0x90, 0xA1, 0x4A, -0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x2F, 0x90, 0xA1, 0x42, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, -0xA1, 0x46, 0xE0, 0x24, 0x0A, 0x12, 0x75, 0xE5, 0x90, 0xA1, 0x44, 0xA3, 0xE0, 0xFE, 0x90, 0xA1, -0x4A, 0xE0, 0x2E, 0x24, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA1, -0x4A, 0xE0, 0x04, 0xF0, 0x80, 0xC7, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x90, 0xA1, 0x4B, 0xE0, -0x04, 0xF0, 0x41, 0xAF, 0x90, 0xA1, 0x49, 0xE0, 0x60, 0x02, 0x81, 0x39, 0xE4, 0x90, 0xA1, 0x4B, -0xF0, 0x90, 0xA0, 0x96, 0xE0, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x65, 0x12, -0x75, 0xC5, 0xE4, 0x90, 0xA1, 0x4A, 0xF0, 0x90, 0xA1, 0x4A, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, -0x4B, 0x90, 0xA1, 0x42, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0xA1, 0x46, 0xE0, 0x24, 0x04, 0x12, -0x75, 0xE5, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x94, 0xF5, 0x82, 0xE4, -0x34, 0xA1, 0xF5, 0x83, 0x12, 0x45, 0x55, 0x90, 0xA1, 0x4A, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, -0x12, 0x06, 0xA2, 0x6F, 0x60, 0x0E, 0x74, 0xB7, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, -0xE4, 0xF0, 0x80, 0x08, 0x90, 0xA1, 0x4A, 0xE0, 0x04, 0xF0, 0x80, 0xAB, 0x90, 0xA1, 0x4B, 0xE0, -0x04, 0xF0, 0x80, 0x8D, 0x90, 0xA1, 0xB7, 0xE0, 0x64, 0x01, 0x60, 0x17, 0xA3, 0xE0, 0x64, 0x01, -0x60, 0x11, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x0B, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x05, 0xA3, 0xE0, -0xB4, 0x01, 0x06, 0x90, 0xA1, 0x4C, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x4C, 0xE0, 0xB4, 0x01, 0x11, -0x12, 0x59, 0x84, 0x90, 0x01, 0xC7, 0x74, 0x66, 0xF0, 0xE4, 0xFF, 0x12, 0x73, 0xE7, 0x02, 0x77, -0xC2, 0xE4, 0x90, 0xA1, 0x4C, 0xF0, 0x90, 0xA1, 0xB7, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0xA1, 0x4B, 0xF0, 0x90, 0xA0, 0x96, 0xE0, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, -0xC3, 0x9F, 0x50, 0x15, 0x74, 0xB7, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x74, 0x01, -0xF0, 0x90, 0xA1, 0x4B, 0xE0, 0x04, 0xF0, 0x80, 0xDD, 0x90, 0xA1, 0x40, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0x12, 0x74, 0xA4, 0x02, 0x77, 0xC2, 0x22, 0x12, 0xEC, +0xC0, 0xF0, 0xF1, 0x89, 0x54, 0xC0, 0xF0, 0x90, 0xA5, 0xFF, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x18, +0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0xD1, 0xD3, 0xE0, 0x54, 0x01, 0xFF, +0x90, 0xA5, 0xFE, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x44, 0x02, 0x4E, 0xFF, 0xAE, 0x05, +0xD1, 0xD3, 0xEF, 0xF0, 0x74, 0x11, 0x2E, 0xF1, 0xD2, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2E, 0x12, +0x90, 0x2E, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFC, 0xED, +0x2C, 0xFD, 0xA1, 0xA5, 0x12, 0x45, 0xA3, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x02, 0x06, 0xA2, 0x90, +0xA4, 0xF9, 0x12, 0x45, 0xAC, 0xE4, 0xFF, 0x90, 0xA4, 0xFF, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, +0x14, 0x90, 0xA4, 0xFC, 0xD1, 0x94, 0xFE, 0x90, 0xA4, 0xF9, 0xD1, 0x94, 0x6E, 0x60, 0x03, 0x7F, +0x00, 0x22, 0x0F, 0x80, 0xE2, 0x7F, 0x01, 0x22, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, +0xF5, 0x83, 0x22, 0x74, 0x12, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0xA2, +0xCF, 0xE0, 0xFF, 0x90, 0xA5, 0xE8, 0xE0, 0xFB, 0x90, 0xA5, 0xFF, 0x74, 0x0A, 0xF0, 0x7D, 0x01, +0xD1, 0x02, 0x90, 0xA5, 0xE9, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA5, 0xE7, 0xE0, +0xFF, 0x12, 0x90, 0x02, 0x90, 0xA5, 0xE9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, +0x54, 0x0F, 0xFD, 0xAC, 0x07, 0xF1, 0x7D, 0x44, 0x01, 0xF0, 0xF1, 0x7D, 0x54, 0xFB, 0xF0, 0xAC, +0x07, 0x74, 0x12, 0x2C, 0xD1, 0xD6, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF1, 0xD2, 0xE0, +0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, +0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF1, 0x6A, 0xE0, 0x54, 0xC0, +0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF1, 0x6A, 0xED, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA4, 0x82, 0xE0, 0x04, 0xF0, 0x22, 0x74, 0x0D, 0x2C, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xCC, 0xF5, 0x82, 0xE4, 0x34, 0xA4, +0xF5, 0x83, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xEA, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, +0x83, 0x22, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x9A, 0x90, 0xA4, 0xFC, 0x12, 0x45, 0xAC, 0x90, 0xA4, +0xFF, 0x22, 0xEF, 0xF0, 0xE4, 0x90, 0xA4, 0x83, 0xF0, 0x22, 0xEF, 0xF0, 0xE4, 0x90, 0xA4, 0x82, +0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, +0x83, 0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE4, 0x90, 0xA2, +0x96, 0x01, 0xF8, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0xA3, 0xBE, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0x22, +0x75, 0xE8, 0x03, 0x75, 0xA8, 0x85, 0x22, 0x7F, 0x81, 0x12, 0x47, 0xAA, 0xEF, 0x54, 0xFE, 0xFD, +0x7F, 0x81, 0x12, 0x46, 0x8D, 0x7F, 0x80, 0x12, 0x47, 0xF5, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0x8D, +0x12, 0x83, 0x3F, 0x12, 0x3E, 0x11, 0x51, 0x0C, 0x12, 0x5F, 0xED, 0x7F, 0x01, 0x12, 0x43, 0xA5, +0x90, 0xA4, 0x64, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0xA5, 0x90, 0xA4, 0x64, 0xE0, 0x04, 0xF0, +0x12, 0x58, 0x18, 0x11, 0x6E, 0x7F, 0x80, 0x12, 0x91, 0x6C, 0x7F, 0x80, 0x12, 0x46, 0x8D, 0x75, +0x28, 0xFF, 0x11, 0x00, 0x51, 0x29, 0x7F, 0x81, 0x12, 0x47, 0xAA, 0xEF, 0x44, 0x04, 0xFD, 0x7F, +0x81, 0x12, 0x46, 0x8D, 0x12, 0x83, 0x80, 0x31, 0xEF, 0xE4, 0xFF, 0x02, 0x44, 0x2E, 0x31, 0x45, +0x12, 0x81, 0xF3, 0x12, 0x54, 0x91, 0x12, 0x4B, 0xCD, 0x11, 0x9A, 0x31, 0xE1, 0x90, 0xA4, 0x66, +0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0xA4, +0x68, 0xF0, 0x90, 0xA4, 0x66, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0xA4, 0x5D, 0xE0, 0x54, 0xFE, +0xF0, 0x54, 0xFD, 0xF0, 0xE4, 0xA3, 0xF0, 0x12, 0x91, 0x5C, 0x44, 0x10, 0xF0, 0x90, 0xA2, 0x9C, +0xE0, 0xFF, 0x64, 0x02, 0x70, 0x29, 0x31, 0x3E, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0xA4, 0x63, +0x31, 0x3C, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0xA4, 0x61, 0x31, 0x3C, 0x30, 0xE2, 0x02, 0x7E, +0x01, 0x90, 0xA4, 0x62, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x22, 0xEF, +0x64, 0x01, 0x70, 0x1D, 0x31, 0x35, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA4, 0x63, 0x31, 0x33, +0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0xA4, 0x61, 0x31, 0x33, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, +0x23, 0x90, 0xA2, 0x9C, 0xE0, 0x64, 0x03, 0x70, 0x20, 0x31, 0x2C, 0x30, 0xE0, 0x02, 0x7F, 0x01, +0x90, 0xA4, 0x63, 0x31, 0x2A, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0xA4, 0x61, 0x31, 0x2A, 0x30, +0xE2, 0x02, 0x7F, 0x01, 0x90, 0xA4, 0x62, 0xEF, 0xF0, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0, +0x7F, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0xEE, 0xF0, 0x90, 0xFD, +0x80, 0xE0, 0x7E, 0x00, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x90, 0xF5, 0xED, 0x70, 0x12, 0x31, 0x84, +0xC0, 0x83, 0xC0, 0x82, 0x31, 0x7C, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0x80, 0x0F, +0x31, 0x84, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0x7C, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4E, 0xD0, +0x82, 0xD0, 0x83, 0xF0, 0x31, 0x8F, 0x90, 0xA3, 0xF3, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0x74, 0x01, +0xA8, 0x07, 0x08, 0x22, 0x74, 0xE3, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7D, 0x10, 0xED, 0x14, 0xF9, 0x24, 0xE3, 0x31, 0x87, 0xE0, +0x60, 0x36, 0x7C, 0x08, 0xEC, 0x14, 0x90, 0xA6, 0x23, 0xF0, 0x74, 0xE3, 0x29, 0x31, 0x87, 0xE0, +0xFB, 0x7A, 0x00, 0x90, 0xA6, 0x23, 0x12, 0x6F, 0xE1, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0x12, 0x86, 0x46, 0x60, 0x0F, 0xE9, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0xA6, 0x23, +0xE0, 0x2F, 0x04, 0xFF, 0x80, 0x06, 0xDC, 0xCC, 0xDD, 0xBE, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0xA3, 0xC0, 0xE0, 0x54, 0xFE, 0x71, 0x16, 0x90, 0xA3, 0xC7, 0x02, 0x58, 0xFA, 0x12, +0x90, 0xD2, 0xBF, 0x01, 0x16, 0x90, 0xA4, 0x6C, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, +0xA4, 0x65, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA4, 0x65, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, +0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x51, 0x91, 0x90, 0x01, 0x99, 0xE0, 0x44, +0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0xE4, 0x90, 0xA4, 0x6C, 0xF0, 0xA3, 0xF0, +0x51, 0x79, 0xEF, 0x64, 0x01, 0x60, 0x3B, 0xC3, 0x90, 0xA4, 0x6D, 0xE0, 0x94, 0x88, 0x90, 0xA4, +0x6C, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, +0x74, 0xFD, 0xF0, 0x80, 0x1D, 0x90, 0xA4, 0x6C, 0x51, 0xCC, 0x71, 0x69, 0xD3, 0x90, 0xA4, 0x6D, +0xE0, 0x94, 0x32, 0x90, 0xA4, 0x6C, 0xE0, 0x94, 0x00, 0x40, 0xC5, 0x90, 0x01, 0xC6, 0xE0, 0x30, +0xE3, 0xBE, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, +0x0B, 0x51, 0x91, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, +0x22, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xE4, 0x90, 0xA6, 0x1D, 0xF0, 0xA3, 0xF0, +0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x22, 0xC3, 0x90, 0xA6, 0x1E, 0xE0, 0x94, 0xD0, 0x90, 0xA6, +0x1D, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, +0x90, 0xA6, 0x1D, 0x51, 0xCC, 0x51, 0x92, 0x80, 0xD7, 0x7F, 0x01, 0x22, 0xE4, 0x75, 0xF0, 0x01, +0x02, 0x08, 0xD6, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xF0, 0xEE, 0xF0, 0xA3, +0x71, 0x15, 0x90, 0xA5, 0xF0, 0x12, 0x91, 0x41, 0xE0, 0x60, 0x23, 0xC3, 0x90, 0xA5, 0xF3, 0xE0, +0x94, 0xE8, 0x90, 0xA5, 0xF2, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, +0xF0, 0x7F, 0x00, 0x80, 0x0B, 0x90, 0xA5, 0xF2, 0x51, 0xCC, 0x51, 0x92, 0x80, 0xD4, 0x7F, 0x01, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA6, 0x0A, +0x71, 0x15, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0xA6, 0x0A, +0xE0, 0x6F, 0x60, 0x34, 0xC3, 0x90, 0xA6, 0x0C, 0xE0, 0x94, 0x88, 0x90, 0xA6, 0x0B, 0xE0, 0x94, +0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA6, 0x0B, 0x51, 0xCC, +0x71, 0x69, 0xD3, 0x90, 0xA6, 0x0C, 0xE0, 0x94, 0x32, 0x90, 0xA6, 0x0B, 0xE0, 0x94, 0x00, 0x40, +0xC1, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xBA, 0x22, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, +0x12, 0x84, 0xC5, 0x7F, 0x08, 0x12, 0x47, 0xAA, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, +0x8D, 0xE4, 0xFF, 0x71, 0x1D, 0x90, 0xA3, 0xF5, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x91, 0x5E, 0x71, 0x70, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0xFC, +0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x08, 0x12, 0x8F, 0x7C, 0xBF, 0x01, 0x02, 0x71, 0x8D, 0x22, +0xF1, 0x74, 0x90, 0xA3, 0xBE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, +0x90, 0xA3, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x4F, 0xC4, 0x90, 0x05, +0x52, 0xE0, 0x54, 0x07, 0x04, 0x90, 0xA3, 0xCB, 0x71, 0x16, 0x90, 0x04, 0x22, 0xE0, 0x54, 0xEF, +0xF0, 0x22, 0x90, 0xA3, 0xCB, 0xE0, 0xFD, 0x7C, 0x00, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, +0x07, 0x15, 0xED, 0x4C, 0x70, 0x05, 0x90, 0xA3, 0xD8, 0x80, 0x2A, 0xED, 0x64, 0x01, 0x4C, 0x70, +0x05, 0x90, 0xA3, 0xD9, 0x80, 0x1F, 0xED, 0x64, 0x02, 0x4C, 0x70, 0x05, 0x90, 0xA3, 0xDA, 0x80, +0x14, 0xED, 0x64, 0x03, 0x4C, 0x70, 0x05, 0x90, 0xA3, 0xDB, 0x80, 0x09, 0xED, 0x64, 0x04, 0x4C, +0x70, 0x0D, 0x90, 0xA3, 0xDC, 0xE0, 0xFF, 0x12, 0x90, 0x69, 0x90, 0xA3, 0xCC, 0x51, 0xCC, 0x22, +0x12, 0x48, 0x45, 0x90, 0xA3, 0xC0, 0xE0, 0x30, 0xE0, 0x02, 0x71, 0xE2, 0x90, 0xA4, 0x5D, 0xE0, +0x30, 0xE0, 0x1A, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0xFD, 0xFF, 0x12, 0x4B, 0x6F, 0x12, 0x4F, 0xF5, +0x30, 0xE0, 0x07, 0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x4A, 0xD7, 0x12, 0x77, 0xC6, 0x22, 0x90, 0xA3, +0xF5, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA4, 0x04, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0x8D, 0x90, +0xA3, 0xFA, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, +0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x47, 0xAA, 0xEF, 0x44, 0x10, 0xFD, +0x7F, 0x08, 0x12, 0x46, 0x8D, 0x7F, 0x01, 0x71, 0x1D, 0x7F, 0x90, 0x12, 0x47, 0xAA, 0xEF, 0x44, +0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0x8D, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xE4, 0xFB, +0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0xDE, 0x90, 0xA4, 0x77, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0xA2, +0x96, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE0, 0x0E, 0x90, +0xA2, 0x96, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0xB1, 0x0F, 0x12, 0x87, 0xD8, 0xB1, 0x05, 0x30, +0xE1, 0x05, 0x54, 0xFD, 0xF0, 0xD1, 0xB1, 0xB1, 0x05, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0xF1, +0x85, 0xB1, 0x05, 0x30, 0xE5, 0x0B, 0x54, 0xDF, 0xF0, 0x51, 0x99, 0xBF, 0x01, 0x03, 0x12, 0x59, +0x02, 0xD2, 0xAF, 0x80, 0xB9, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0xA2, 0x96, 0xE0, 0xFF, 0x22, 0x90, +0xA5, 0x1F, 0xEF, 0xF0, 0x90, 0xA3, 0xF3, 0xE0, 0x90, 0xA5, 0xA1, 0xF0, 0xE4, 0x90, 0xA5, 0x20, +0xF0, 0x90, 0xA5, 0xA1, 0xE0, 0xFE, 0x90, 0xA5, 0x20, 0xE0, 0xFF, 0xC3, 0x9E, 0x50, 0x2C, 0xE0, +0xFE, 0xD1, 0x08, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0xD1, 0x86, 0xE0, 0x30, 0xE7, 0x09, 0x74, +0x81, 0x2F, 0xD1, 0x18, 0xE4, 0xF0, 0x80, 0x0B, 0xD1, 0x93, 0x90, 0xA5, 0x20, 0xE0, 0xD1, 0x08, +0x74, 0x01, 0xF0, 0x90, 0xA5, 0x20, 0xE0, 0x04, 0xF0, 0x80, 0xC6, 0x7F, 0x0C, 0x7E, 0x00, 0x12, +0x3E, 0x50, 0xE4, 0x90, 0xA5, 0x20, 0xF0, 0x90, 0xA5, 0xA1, 0xE0, 0xFF, 0x90, 0xA5, 0x20, 0xE0, +0xFE, 0xC3, 0x9F, 0x40, 0x02, 0xC1, 0x07, 0x74, 0x21, 0x2E, 0xD1, 0x0A, 0xE0, 0x70, 0x02, 0xA1, +0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x06, 0xD1, 0x20, 0xEE, 0x90, 0x81, 0x07, 0xD1, 0x29, +0xFC, 0xD1, 0xA7, 0x12, 0x87, 0xD0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0xD1, 0x20, 0xEC, +0x90, 0x81, 0x0B, 0xD1, 0x29, 0x75, 0xF0, 0x0A, 0xD1, 0x12, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, +0x01, 0x90, 0xA5, 0x20, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x54, 0x83, 0xE0, +0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0xD1, 0x12, 0x75, 0xF0, 0x02, 0xEF, 0xD1, 0x8C, 0xED, 0xF0, 0x0F, +0xEF, 0xB4, 0x05, 0xDD, 0x90, 0xA5, 0x20, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x09, 0x12, +0x45, 0x97, 0xE0, 0xFE, 0xD1, 0x9A, 0xEE, 0xF0, 0x90, 0xA5, 0x20, 0xE0, 0xFF, 0x90, 0xA5, 0x1F, +0xE0, 0xFD, 0xD1, 0x35, 0x90, 0xA5, 0x20, 0xE0, 0x24, 0x81, 0xD1, 0x18, 0x74, 0x01, 0xF0, 0x90, +0xA5, 0x20, 0xE0, 0x04, 0xF0, 0xA1, 0x67, 0x22, 0x24, 0x21, 0xF5, 0x82, 0xE4, 0x34, 0xA5, 0xF5, +0x83, 0x22, 0x90, 0x8D, 0x01, 0x02, 0x45, 0x97, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22, +0x12, 0x45, 0x97, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0x22, 0x12, 0x45, 0x97, 0xE0, 0xFE, 0xED, 0xFF, +0x90, 0xA5, 0x20, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x26, 0x75, +0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0xD1, 0x76, 0x90, 0x8D, 0x03, 0xD1, 0x76, 0x90, 0x8D, 0x05, +0xD1, 0x76, 0x90, 0x8D, 0x07, 0xD1, 0x76, 0x90, 0x8D, 0x09, 0xD1, 0x8C, 0xD1, 0xA5, 0x12, 0x56, +0x13, 0xD1, 0x9A, 0xE4, 0xF0, 0xD1, 0x82, 0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0xD1, 0x82, 0xEE, +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, 0x97, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, +0xEF, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x02, 0x45, 0x97, 0x12, 0x45, 0x97, 0xE4, +0xF0, 0xA3, 0x22, 0xD1, 0x82, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x74, 0x95, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x98, 0xF5, 0x83, 0x22, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x25, 0xE0, 0xFF, 0x90, 0xA3, 0x24, +0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x41, 0x90, 0xA3, 0x24, +0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0xA2, 0xD4, 0x12, 0x45, 0x97, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, +0x08, 0xA4, 0x24, 0xD5, 0xF9, 0x74, 0xA2, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x51, +0xFF, 0x90, 0xA3, 0x24, 0x12, 0x77, 0xBF, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, +0x90, 0xA3, 0x24, 0xF0, 0x12, 0x73, 0x28, 0x90, 0xA2, 0x96, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xF8, 0x12, 0x45, 0xAC, +0x7F, 0x96, 0x7E, 0x02, 0x51, 0xD3, 0xEF, 0x60, 0x46, 0xF1, 0x74, 0xFE, 0xEF, 0x24, 0x01, 0xFF, +0xE4, 0x3E, 0xFE, 0x90, 0xA5, 0xFB, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA5, +0xFB, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA5, 0xF8, 0x12, 0x82, 0xC9, +0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x82, 0x01, 0x90, 0xA5, 0xFB, 0xE0, 0x24, 0x18, 0xFF, +0x90, 0xA5, 0xF8, 0x12, 0x45, 0xA3, 0x12, 0x82, 0x57, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, +0x00, 0xFF, 0xEC, 0x3E, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA3, +0xBD, 0xE0, 0xFE, 0x90, 0xA3, 0xBC, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, +0x00, 0xEE, 0x64, 0x01, 0x60, 0x40, 0xED, 0x12, 0x7F, 0x4A, 0xFA, 0x7B, 0x01, 0xF1, 0x13, 0x7F, +0x01, 0xEF, 0x60, 0x32, 0x90, 0xA3, 0xBC, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, +0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA3, 0xBC, 0xF0, 0x90, 0xA3, 0xBD, 0xE0, 0xFF, 0x90, +0xA3, 0xBC, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x07, 0x90, +0xA2, 0x96, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xA1, 0x0F, 0xE4, +0x90, 0xA4, 0x6E, 0xF0, 0x90, 0xA4, 0x6E, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xEF, 0x90, 0x01, 0xC4, +0xF0, 0x74, 0x67, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0xC2, 0xAF, +0x90, 0xA3, 0xF9, 0xE0, 0x60, 0x0E, 0x90, 0xA3, 0xFC, 0xE0, 0xFF, 0x90, 0xA3, 0xFB, 0xE0, 0x6F, +0x60, 0x02, 0x11, 0xC5, 0xC2, 0xAF, 0x12, 0x83, 0x4C, 0xBF, 0x01, 0x03, 0x12, 0x8F, 0xA4, 0xD2, +0xAF, 0xD2, 0xAF, 0x90, 0xA4, 0x65, 0xE0, 0xB4, 0x01, 0x02, 0x11, 0x44, 0x12, 0x4F, 0xFE, 0x12, +0x42, 0xDD, 0x80, 0xB0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, +0x37, 0x4E, 0x90, 0xA4, 0x6F, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, +0xA4, 0x73, 0x12, 0x08, 0x6D, 0x90, 0xA4, 0x6F, 0x11, 0xB8, 0x60, 0x17, 0x90, 0xA4, 0x6F, 0x11, +0xAF, 0x90, 0xA4, 0x6F, 0x12, 0x08, 0x6D, 0x90, 0xA4, 0x6F, 0x11, 0xA6, 0x7F, 0x00, 0x7E, 0x08, +0x12, 0x38, 0x45, 0x90, 0xA4, 0x73, 0x11, 0xB8, 0x60, 0x17, 0x90, 0xA4, 0x73, 0x11, 0xAF, 0x90, +0xA4, 0x73, 0x12, 0x08, 0x6D, 0x90, 0xA4, 0x73, 0x11, 0xA6, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, +0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, 0x7F, 0x90, 0xAA, 0xB9, 0x02, 0x08, 0x6D, 0x12, +0x45, 0x7F, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x22, 0x12, 0x45, 0x7F, 0xEF, 0x54, 0x01, 0xFF, 0xE4, +0xFE, 0xFD, 0xFC, 0xEF, 0x22, 0x90, 0xA3, 0xFB, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x49, 0x0C, 0xE4, +0xFF, 0x12, 0x4E, 0x64, 0xBF, 0x01, 0x0E, 0x90, 0xA3, 0xF9, 0xE0, 0x60, 0x08, 0x11, 0xE6, 0x54, +0x07, 0x70, 0x02, 0x11, 0xC5, 0x22, 0x90, 0xA3, 0xFD, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xE4, 0xF5, +0x61, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x61, 0x54, 0xC0, 0x70, 0x07, 0x11, 0xE6, 0x54, 0xFD, 0xF0, +0x80, 0xC3, 0xE5, 0x61, 0x30, 0xE6, 0x1F, 0x90, 0xA3, 0xF9, 0xE0, 0x64, 0x01, 0x70, 0x19, 0x90, +0xA3, 0xFD, 0xE0, 0x44, 0x01, 0xF0, 0xF1, 0xB7, 0x64, 0x02, 0x60, 0x05, 0x12, 0x84, 0x3E, 0x80, +0x07, 0x12, 0x4F, 0xAA, 0x80, 0x02, 0x11, 0xE6, 0xE5, 0x61, 0x90, 0xA3, 0xFD, 0x30, 0xE7, 0x0E, +0xE0, 0x44, 0x02, 0x12, 0x48, 0x03, 0x90, 0xA3, 0xF4, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, +0xFD, 0xF0, 0x22, 0x90, 0xA3, 0xF9, 0xE0, 0x60, 0x10, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x04, +0xF1, 0x0E, 0x80, 0x05, 0x12, 0x4F, 0xA2, 0x11, 0xC5, 0x90, 0xA4, 0x66, 0xE0, 0xFF, 0x12, 0x56, +0xF4, 0x30, 0xE0, 0x1A, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x77, 0xA2, 0x90, 0xA4, +0x67, 0xE0, 0x30, 0xE0, 0x09, 0x51, 0xD3, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x31, 0x7F, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x1C, 0xED, 0xF0, 0x90, 0xA6, 0x1B, 0xEF, 0xF0, +0xD3, 0x94, 0x07, 0x50, 0x42, 0x7F, 0x47, 0x51, 0x27, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, +0x5F, 0xFD, 0x7F, 0x47, 0x12, 0x46, 0x8D, 0x7F, 0x46, 0x51, 0x27, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0xD1, 0xC8, 0x60, 0x0D, 0x7F, 0x45, 0x51, 0x27, 0x80, 0x02, 0xC3, +0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x0C, 0x7F, 0x45, 0x51, 0x27, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, +0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x46, 0x90, 0xA6, 0x1B, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, +0x51, 0x27, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x12, 0x46, 0x8D, +0x7F, 0x62, 0x51, 0x27, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0xD1, 0xC8, +0x60, 0x0E, 0x51, 0x25, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x0D, +0x51, 0x25, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x61, 0x12, 0x46, 0x8D, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x61, 0x12, 0x47, 0xAA, 0x90, 0xA6, 0x1B, 0xE0, 0xFE, 0x74, +0x01, 0xA8, 0x06, 0x08, 0x22, 0xAD, 0x07, 0x90, 0xA4, 0x68, 0xE0, 0x75, 0xF0, 0x20, 0xA4, 0xFF, +0x90, 0xA5, 0xE1, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA4, 0x69, 0xE0, 0x75, 0xF0, 0x08, +0xA4, 0xAE, 0xF0, 0x90, 0xA5, 0xE3, 0xF0, 0xEE, 0xA3, 0xF0, 0xD1, 0xC0, 0x90, 0xA5, 0xE5, 0xF0, +0xEE, 0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x63, 0x90, 0xA4, 0x66, 0xE0, 0xFE, 0x12, 0x56, 0xF4, +0x30, 0xE0, 0x58, 0xEE, 0x51, 0xD8, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0xCC, 0xFE, 0x54, 0x0F, +0xFF, 0xEE, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFD, 0x51, 0xCC, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, +0x23, 0xA3, 0xE0, 0x30, 0xE0, 0x0F, 0x90, 0xA5, 0xE6, 0xE0, 0x90, 0xA5, 0xDF, 0xF0, 0x90, 0xA5, +0xE5, 0xD1, 0xFF, 0x80, 0x0F, 0xD1, 0xC0, 0xFF, 0x12, 0x3E, 0x50, 0x51, 0xD3, 0x20, 0xE0, 0x02, +0x7D, 0x01, 0x31, 0x7F, 0x90, 0xA4, 0x66, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0x90, 0xA5, +0xE4, 0xE0, 0x90, 0xA5, 0xDF, 0xF0, 0x90, 0xA5, 0xE3, 0xD1, 0xFF, 0x22, 0x31, 0x7F, 0x90, 0xA4, +0x66, 0xE0, 0x22, 0x90, 0xA4, 0x66, 0xE0, 0xFE, 0x54, 0x0F, 0xFF, 0xEE, 0xC4, 0x13, 0x13, 0x54, +0x03, 0x7D, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x65, 0x8D, 0x66, 0x8B, +0x67, 0xE4, 0x90, 0xA5, 0xD0, 0xF0, 0xE5, 0x65, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0xA5, 0xCB, +0xF0, 0xE5, 0x65, 0x54, 0x07, 0x90, 0xA5, 0xCD, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x91, 0x2E, 0xE0, +0x90, 0xA5, 0xCE, 0xF0, 0x12, 0x57, 0xBD, 0xE0, 0x54, 0x7F, 0x90, 0xA5, 0xD1, 0xF0, 0x75, 0xF0, +0x04, 0xE5, 0x65, 0x12, 0x57, 0x00, 0xE0, 0x90, 0xA5, 0xD2, 0xF0, 0xD1, 0xE1, 0xE5, 0x67, 0x70, +0x26, 0xAF, 0x65, 0x12, 0x7F, 0x8F, 0x90, 0xA5, 0xCC, 0xE0, 0xFF, 0x12, 0x87, 0xBB, 0xF1, 0xC7, +0xEF, 0x12, 0x87, 0xAD, 0x74, 0x01, 0x93, 0x2D, 0xFF, 0xE4, 0x93, 0x3C, 0xC3, 0x13, 0xFE, 0xEF, +0x13, 0xFF, 0xE5, 0x65, 0x12, 0x87, 0xC7, 0x90, 0xA5, 0xD1, 0xE0, 0xFF, 0x90, 0xA5, 0xCC, 0xE0, +0xFE, 0xD3, 0x9F, 0x40, 0x0B, 0xE5, 0x66, 0x54, 0x80, 0xFD, 0xEF, 0x4D, 0xF5, 0x66, 0x80, 0x0C, +0x90, 0xA5, 0xD2, 0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, 0x66, 0xD1, 0xE1, 0xE5, 0x66, +0x54, 0x80, 0x90, 0xA5, 0xCF, 0xF0, 0xE5, 0x67, 0x70, 0x23, 0x91, 0xF0, 0xC0, 0x83, 0xC0, 0x82, +0xE0, 0xFF, 0x90, 0xA5, 0xCD, 0x51, 0x2D, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xD0, +0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA5, 0xCE, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x39, 0x91, 0xF0, 0xC0, +0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA5, 0xCD, 0x51, 0x2D, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, +0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x91, 0x29, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA5, 0xCE, 0xF0, +0x90, 0xA5, 0xCC, 0xE0, 0x90, 0x41, 0xAD, 0x93, 0xFE, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, +0xA5, 0xCE, 0xF0, 0x44, 0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x65, 0xB1, 0x07, 0xE5, 0x66, 0xF0, +0xE5, 0x65, 0x70, 0x06, 0x90, 0x01, 0xC8, 0xE5, 0x66, 0xF0, 0x90, 0xA5, 0xCE, 0xE0, 0xFF, 0x91, +0x29, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x65, 0xD1, 0xF9, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x68, +0x54, 0x03, 0x4F, 0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x65, 0xD1, 0xF9, 0xEF, 0xF0, 0x7D, 0x01, 0xAF, +0x65, 0x12, 0x66, 0x35, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x10, 0xE5, 0x65, 0x90, 0x81, +0x01, 0x02, 0x45, 0x97, 0xE4, 0xF5, 0x61, 0x90, 0xA3, 0xF3, 0xE0, 0xFF, 0xE5, 0x61, 0xC3, 0x9F, +0x40, 0x02, 0x81, 0xE5, 0xAF, 0x61, 0x12, 0x4E, 0x64, 0xEF, 0x70, 0x02, 0x81, 0xE1, 0xE5, 0x61, +0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x61, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0x91, 0xF6, +0xE0, 0xFD, 0xAF, 0x06, 0xF1, 0xE3, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, +0xEF, 0x5D, 0x60, 0x6D, 0x75, 0xF0, 0x10, 0xE5, 0x61, 0x91, 0x2E, 0xE0, 0x20, 0xE7, 0x02, 0x80, +0x10, 0x75, 0xF0, 0x10, 0xE5, 0x61, 0x90, 0x81, 0x02, 0x12, 0x45, 0x97, 0xE0, 0xFF, 0x20, 0xE7, +0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x47, 0xEF, 0x30, 0xE6, 0x12, 0x75, 0xF0, +0x10, 0xE5, 0x61, 0xB1, 0x07, 0xD1, 0xB8, 0x12, 0x51, 0x2E, 0xD1, 0xB1, 0xE4, 0xFB, 0x80, 0x2D, +0x91, 0xE6, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x91, 0xE6, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x01, 0x40, +0x0C, 0xAF, 0x61, 0xF1, 0x3C, 0x91, 0xE6, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x14, 0x75, 0xF0, 0x10, +0xE5, 0x61, 0xB1, 0x07, 0xD1, 0xB8, 0x12, 0x51, 0x2E, 0xD1, 0xB1, 0x7B, 0x01, 0xAF, 0x61, 0x51, +0xE4, 0x05, 0x61, 0x81, 0x37, 0x22, 0x74, 0x15, 0x25, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0x22, +0x90, 0xA5, 0xCB, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x90, 0xA4, +0x87, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x00, 0x02, 0x45, 0x97, 0x12, 0x06, 0x89, +0x90, 0xA4, 0x7C, 0xF1, 0xC0, 0x90, 0xA4, 0x7D, 0x12, 0x57, 0xB6, 0xFD, 0xE4, 0xFF, 0x74, 0x80, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x0C, 0xEF, 0xED, +0x30, 0xE0, 0x46, 0xD1, 0xD0, 0x40, 0x42, 0xA3, 0xE0, 0xD3, 0x94, 0x80, 0x40, 0x3B, 0x90, 0xA4, +0x80, 0x74, 0x01, 0xD1, 0x8F, 0x90, 0xA4, 0x81, 0xD1, 0x8E, 0x78, 0x08, 0x12, 0x08, 0x47, 0x90, +0xA4, 0x82, 0xD1, 0x8E, 0x78, 0x10, 0x12, 0x08, 0x47, 0x90, 0xA4, 0x83, 0xD1, 0x8E, 0x78, 0x18, +0x12, 0x08, 0x47, 0x90, 0xA4, 0x84, 0xEF, 0xF0, 0xD1, 0xEA, 0x74, 0x05, 0xF0, 0x90, 0x94, 0x91, +0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x6B, 0xED, 0x30, 0xE1, 0x5A, 0x90, 0xA4, 0x80, +0x74, 0x02, 0xF0, 0xD1, 0xD0, 0x50, 0x1A, 0xE0, 0xFC, 0xF1, 0x92, 0xD1, 0x87, 0x90, 0xA4, 0x81, +0xD1, 0x79, 0x90, 0xA4, 0x83, 0xF0, 0xEE, 0xA3, 0xF0, 0x90, 0xA4, 0x7C, 0x12, 0x55, 0xF8, 0x80, +0x06, 0x90, 0xA4, 0x81, 0x74, 0xEA, 0xF0, 0x90, 0xA4, 0x7D, 0xE0, 0xD3, 0x94, 0x80, 0x50, 0x1A, +0xE0, 0xFC, 0xF1, 0x92, 0xD1, 0x87, 0x90, 0xA4, 0x85, 0xD1, 0x79, 0x90, 0xA4, 0x87, 0xF0, 0xEE, +0xA3, 0xF0, 0x90, 0xA4, 0x7D, 0x12, 0x55, 0xF8, 0x80, 0x06, 0x90, 0xA4, 0x85, 0x74, 0xEA, 0xF0, +0xD1, 0xEA, 0x74, 0x09, 0xF0, 0xC1, 0x6B, 0xED, 0x60, 0x02, 0xC1, 0x60, 0x90, 0xA4, 0x7C, 0xE0, +0xFD, 0xD3, 0x94, 0x80, 0x50, 0x2C, 0xE0, 0x90, 0xA4, 0x80, 0xF0, 0xD1, 0x98, 0xD1, 0x87, 0x90, +0xA4, 0x81, 0xD1, 0xA2, 0xD1, 0x87, 0x90, 0xA4, 0x83, 0xD1, 0xD8, 0xB1, 0x07, 0xE0, 0x90, 0xA4, +0x85, 0xF0, 0x90, 0xA4, 0x7C, 0xD1, 0x96, 0x12, 0x56, 0x13, 0xEF, 0xD1, 0xA7, 0x12, 0x56, 0x13, +0x80, 0x02, 0xF1, 0xCF, 0x90, 0xA4, 0x7D, 0xE0, 0xFD, 0xD3, 0x94, 0x80, 0x50, 0x2C, 0xE0, 0x90, +0xA4, 0x86, 0xF0, 0xD1, 0x98, 0xD1, 0x87, 0x90, 0xA4, 0x87, 0xD1, 0xA2, 0xD1, 0x87, 0x90, 0xA4, +0x89, 0xD1, 0xD8, 0xB1, 0x07, 0xE0, 0x90, 0xA4, 0x8B, 0xF0, 0x90, 0xA4, 0x7D, 0xD1, 0x96, 0x12, +0x56, 0x13, 0xEF, 0xD1, 0xA7, 0x12, 0x56, 0x13, 0x80, 0x08, 0x90, 0xA4, 0x7D, 0xE0, 0x90, 0xA4, +0x86, 0xF0, 0x90, 0xA4, 0x7E, 0x74, 0x04, 0xF0, 0x90, 0xA4, 0x8C, 0x74, 0x0C, 0xF0, 0x80, 0x0B, +0x90, 0xA4, 0x7E, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA4, 0x8C, 0xF0, 0x7B, 0x01, 0x7A, 0xA4, 0x79, +0x7E, 0x12, 0x7B, 0x0D, 0x7F, 0x04, 0x02, 0x77, 0x87, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, +0x24, 0x15, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x22, 0xEF, 0xF0, +0x90, 0x94, 0x91, 0x02, 0x45, 0x7F, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, +0x9C, 0x22, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x9B, +0x22, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x68, 0x22, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x61, 0x22, +0x90, 0xA5, 0xE1, 0xE0, 0xFE, 0xA3, 0xE0, 0x22, 0x12, 0x46, 0x8D, 0x90, 0xA6, 0x1C, 0xE0, 0x22, +0x90, 0xA4, 0x7C, 0xE0, 0xD3, 0x94, 0x80, 0x22, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, +0x22, 0xE5, 0x66, 0x54, 0x7F, 0x90, 0xA5, 0xCC, 0xF0, 0x22, 0x90, 0xA4, 0x7E, 0x74, 0x0D, 0xF0, +0x90, 0xA4, 0x8C, 0x22, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x05, 0x02, 0x45, 0x97, 0xE0, +0x90, 0xA5, 0xE0, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x02, 0x48, 0x18, 0x12, 0x90, +0xDF, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, +0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA5, 0xDF, 0xF0, 0x90, 0xA4, 0x58, 0xE0, 0xC3, 0x13, +0x54, 0x7F, 0xF1, 0x00, 0x90, 0xA3, 0xF4, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x75, 0xF0, 0x04, 0xEF, +0x12, 0x51, 0x2E, 0xFE, 0x13, 0x13, 0x54, 0x03, 0xFC, 0x12, 0x57, 0xBD, 0xE0, 0xFB, 0xF1, 0x85, +0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x19, 0xEE, 0x54, 0x03, 0xFE, 0xEC, 0xD3, 0x9E, 0x50, +0x10, 0xEC, 0x60, 0x0D, 0x1C, 0xEC, 0x12, 0x87, 0x93, 0xEF, 0x12, 0x51, 0x2E, 0x54, 0xF3, 0x4E, +0xF0, 0xED, 0xD3, 0x9B, 0x40, 0x02, 0xAD, 0x03, 0xF1, 0x85, 0xE0, 0x54, 0x80, 0x42, 0x05, 0x8C, +0x68, 0xE4, 0xFB, 0x41, 0xE4, 0x74, 0x95, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x22, +0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0x22, 0x90, 0xA3, 0xF9, 0xE0, +0x64, 0x01, 0x70, 0x12, 0xF1, 0xB7, 0x60, 0x05, 0x12, 0x4B, 0x66, 0xE1, 0x0E, 0x90, 0xA3, 0xFC, +0xE0, 0x70, 0x03, 0x12, 0x49, 0x08, 0x22, 0x90, 0xA3, 0xF7, 0xE0, 0x54, 0x0F, 0x22, 0x81, 0x34, +0xF0, 0x90, 0x00, 0x01, 0x02, 0x06, 0xA2, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0x22, 0x90, +0xA4, 0x7C, 0xE0, 0x90, 0xA4, 0x80, 0xF0, 0x22, 0x90, 0xA3, 0xF9, 0xE0, 0x60, 0x02, 0xF1, 0x9C, +0x22, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xEB, 0x90, 0x01, 0xC4, 0xED, +0xF0, 0x74, 0x6F, 0x11, 0x12, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xE0, 0x32, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xC0, +0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x1F, +0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, 0x11, 0x12, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, +0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, +0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x46, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x11, 0xB8, 0xE5, +0x14, 0x30, 0xE7, 0x02, 0x11, 0x9C, 0x74, 0x46, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, 0xA3, +0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, +0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x7F, 0x01, 0x7E, 0x00, +0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x47, 0xAA, 0xEF, 0x20, 0xE6, 0x0B, 0x7F, 0x05, 0x12, 0x47, +0xF5, 0xFD, 0x7F, 0x05, 0x12, 0x46, 0x8D, 0x22, 0x7F, 0x54, 0x12, 0x47, 0xAA, 0xE5, 0x0D, 0x5F, +0xF5, 0x11, 0x7F, 0x55, 0x12, 0x47, 0xAA, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x12, 0x47, +0xAA, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x12, 0x47, 0xAA, 0xE5, 0x10, 0x5F, 0xF5, 0x14, +0xAD, 0x11, 0x7F, 0x54, 0x12, 0x46, 0x8D, 0xAD, 0x12, 0x7F, 0x55, 0x12, 0x46, 0x8D, 0xAD, 0x13, +0x7F, 0x56, 0x12, 0x46, 0x8D, 0xAD, 0x14, 0x7F, 0x57, 0x12, 0x46, 0x8D, 0x53, 0x91, 0xEF, 0x22, +0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, +0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, +0x74, 0x00, 0xF0, 0x74, 0x71, 0xA3, 0xF0, 0x12, 0x83, 0x8A, 0xE5, 0x19, 0x30, 0xE1, 0x02, 0x31, +0xC7, 0xE5, 0x19, 0x30, 0xE3, 0x02, 0xF1, 0x65, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x51, 0x47, 0xE5, +0x19, 0x30, 0xE5, 0x03, 0x12, 0x83, 0xE7, 0xE5, 0x1B, 0x30, 0xE0, 0x03, 0x12, 0x64, 0x30, 0xE5, +0x1B, 0x30, 0xE1, 0x02, 0x51, 0x5A, 0xE5, 0x1B, 0x30, 0xE2, 0x02, 0xF1, 0x4E, 0xE5, 0x1B, 0x30, +0xE3, 0x02, 0xF1, 0x71, 0xE5, 0x1B, 0x30, 0xE4, 0x02, 0xF1, 0x27, 0xE5, 0x1B, 0x30, 0xE5, 0x03, +0x12, 0x84, 0x23, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x68, 0xCF, 0xE5, 0x1B, 0x30, 0xE7, 0x02, +0xD1, 0xF1, 0xE5, 0x1C, 0x30, 0xE0, 0x02, 0xF1, 0x01, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0x6F, +0xD8, 0xE5, 0x1C, 0x30, 0xE4, 0x03, 0x12, 0x67, 0xEB, 0xE5, 0x1C, 0x30, 0xE5, 0x03, 0x12, 0x6F, +0xBE, 0x74, 0x00, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x71, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, +0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, +0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xFF, 0x90, 0xA5, 0x00, 0xEF, 0xF0, 0x90, 0x04, +0x7E, 0xE0, 0xF5, 0x62, 0xA3, 0xE0, 0xF5, 0x63, 0x65, 0x62, 0x60, 0x6A, 0x90, 0xA5, 0x01, 0x74, +0x03, 0xF0, 0x90, 0xA5, 0x0F, 0x74, 0x08, 0xF0, 0xE5, 0x63, 0x04, 0x54, 0x0F, 0xF5, 0x64, 0xE4, +0xF5, 0x61, 0xE5, 0x64, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, +0x83, 0xE5, 0x82, 0x25, 0x61, 0x12, 0x54, 0x89, 0xE0, 0xFF, 0x74, 0x03, 0x25, 0x61, 0xF5, 0x82, +0xE4, 0x34, 0xA5, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x61, 0xE5, 0x61, 0xB4, 0x08, 0xD4, 0x7B, 0x01, +0x7A, 0xA5, 0x79, 0x01, 0x12, 0x7B, 0x0D, 0xE5, 0x63, 0x04, 0x54, 0x0F, 0xF5, 0x63, 0xB4, 0x0F, +0x03, 0xE4, 0xF5, 0x63, 0x90, 0x04, 0x7F, 0xE5, 0x63, 0xF0, 0x90, 0xA5, 0x00, 0xE0, 0x7F, 0x04, +0x70, 0x02, 0x80, 0x07, 0xF1, 0x87, 0x22, 0x71, 0x28, 0x7F, 0x02, 0x8F, 0x6C, 0x7F, 0x02, 0x12, +0x44, 0xB7, 0x90, 0xA2, 0x96, 0xE0, 0x45, 0x6C, 0xF0, 0x22, 0x90, 0xA3, 0xF9, 0xE0, 0x70, 0x02, +0x41, 0xEA, 0x90, 0xA4, 0x10, 0xE0, 0x04, 0x12, 0x4E, 0xFA, 0x12, 0x45, 0x61, 0xC0, 0x04, 0xC0, +0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x12, 0x4F, 0x14, 0x78, 0x10, 0x12, 0x08, 0x5A, +0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x61, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0xA3, 0x12, 0x4F, 0x14, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x61, 0x90, 0xA4, 0x44, 0x12, 0x90, 0xAD, 0x54, 0x7F, 0xF0, +0xA3, 0xE0, 0x30, 0xE0, 0x0A, 0x12, 0x79, 0x0A, 0x74, 0x05, 0xF0, 0xB1, 0xF5, 0xD1, 0xD9, 0x90, +0xA3, 0xF5, 0x12, 0x90, 0xE2, 0x30, 0xE0, 0x0B, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x04, 0x91, +0x54, 0x91, 0x4E, 0x90, 0xA6, 0x24, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, +0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xD1, 0xF9, 0xBF, 0x03, 0x0D, 0x90, +0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x21, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x01, 0x51, 0x4B, +0x90, 0xA4, 0x5D, 0xE0, 0x30, 0xE0, 0x08, 0x12, 0x91, 0x1D, 0x12, 0x48, 0x0C, 0xF1, 0xC6, 0x90, +0xA2, 0x9C, 0xE0, 0xB4, 0x01, 0x11, 0x12, 0x7F, 0x41, 0x20, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x54, +0x07, 0x20, 0xE0, 0x03, 0x12, 0x8F, 0xC6, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA6, +0x17, 0xF0, 0x90, 0xA6, 0x17, 0xE0, 0xFD, 0x70, 0x02, 0x81, 0x32, 0x90, 0xA3, 0x24, 0xE0, 0xFF, +0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA3, 0x25, 0xE0, 0xB5, +0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, +0x01, 0xF0, 0x22, 0x90, 0xA6, 0x13, 0x12, 0x6F, 0xE1, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x81, 0x15, 0xE4, 0x90, 0xA6, 0x18, 0xF0, 0x90, 0xA6, +0x18, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x42, 0x91, 0x34, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, +0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x91, 0x3C, 0x90, 0xA2, 0xD4, 0x12, 0x45, 0x97, +0xE5, 0x82, 0x29, 0x12, 0x54, 0x89, 0xEF, 0x91, 0x33, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, +0x74, 0xF0, 0x91, 0x3C, 0x90, 0xA2, 0xD8, 0x12, 0x45, 0x97, 0xE5, 0x82, 0x29, 0x12, 0x54, 0x89, +0xEF, 0xF0, 0x90, 0xA6, 0x18, 0xE0, 0x04, 0xF0, 0x80, 0xB4, 0x90, 0xA6, 0x17, 0xE0, 0xFF, 0x90, +0xA6, 0x13, 0x12, 0x6A, 0x2D, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA6, 0x17, +0xF0, 0x90, 0xA6, 0x13, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA6, 0x13, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, +0xA3, 0x25, 0xF1, 0xBF, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x61, 0x32, 0xE4, 0x90, +0xA3, 0x25, 0xF0, 0x61, 0x32, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA6, 0x13, 0xE0, +0x44, 0x80, 0x90, 0x00, 0x8A, 0x91, 0x33, 0x90, 0x01, 0xD0, 0x12, 0x45, 0x97, 0xE0, 0x90, 0x01, +0xC3, 0xF0, 0x22, 0xF0, 0x90, 0xA6, 0x13, 0xE0, 0x75, 0xF0, 0x04, 0x22, 0x2F, 0xF5, 0x82, 0x74, +0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA3, 0x25, 0xE0, 0x75, 0xF0, 0x08, 0x22, 0x7D, 0x01, +0x7F, 0x02, 0x80, 0x04, 0x7D, 0x02, 0x7F, 0x02, 0x74, 0x15, 0xD1, 0xE1, 0xFE, 0xF6, 0x74, 0x30, +0xC1, 0xCE, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, +0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA5, 0x00, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, +0x4E, 0x5C, 0x60, 0x02, 0xA1, 0x28, 0x90, 0xA3, 0xF9, 0xE0, 0x70, 0x02, 0xA1, 0x28, 0xB1, 0x39, +0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA4, 0x00, 0xF0, 0x90, 0x06, 0xAA, 0xE0, +0x90, 0xA3, 0xFF, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0xA3, 0xFF, 0xE0, 0xFE, 0xFF, 0x80, +0x00, 0x90, 0xA4, 0x00, 0xEF, 0xF0, 0x12, 0x7D, 0x32, 0xE4, 0x90, 0xA4, 0x02, 0xF1, 0x11, 0xF1, +0x43, 0xF1, 0x1E, 0x54, 0xEF, 0xF0, 0xB1, 0x39, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x68, +0xEE, 0xB1, 0x29, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x4D, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, +0xE0, 0x1E, 0xB1, 0x31, 0x6F, 0x70, 0x3F, 0x90, 0xA3, 0xF5, 0xE0, 0x44, 0x40, 0xF0, 0xF1, 0xDE, +0xB1, 0x42, 0xD1, 0xE9, 0x91, 0x4E, 0x91, 0x54, 0x90, 0xA4, 0x00, 0xE0, 0x14, 0xF0, 0x80, 0x26, +0xF1, 0xD6, 0x64, 0x01, 0x70, 0x20, 0xB1, 0x31, 0xFE, 0x6F, 0x60, 0x1A, 0x90, 0x05, 0x73, 0xE0, +0xFF, 0xEE, 0x6F, 0x60, 0x11, 0xB1, 0x29, 0x54, 0x3F, 0x30, 0xE0, 0x0A, 0xEF, 0x54, 0xBF, 0xB1, +0x42, 0xD1, 0xC6, 0x12, 0x4F, 0xBA, 0xF1, 0xCE, 0x22, 0x90, 0xA3, 0xF5, 0xE0, 0xFF, 0x13, 0x13, +0x22, 0x90, 0xA3, 0xFF, 0xE0, 0xFF, 0xA3, 0xE0, 0x22, 0x90, 0xA3, 0xF7, 0xE0, 0xFF, 0xC4, 0x54, +0x0F, 0x22, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x22, 0xB1, 0x29, 0x13, +0x54, 0x1F, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x91, 0x54, +0x90, 0xA3, 0xF4, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x09, 0xEF, 0xF1, 0x1C, 0x54, +0x07, 0x70, 0x44, 0x80, 0x3F, 0x90, 0xA4, 0x02, 0xE0, 0x04, 0xF0, 0x90, 0xA3, 0xFD, 0xE0, 0x54, +0xEF, 0xF0, 0xF1, 0x59, 0x40, 0x2E, 0x12, 0x4E, 0x5C, 0x70, 0x2C, 0x12, 0x6F, 0xB7, 0x70, 0x04, +0xB1, 0xC0, 0x80, 0x24, 0xB1, 0xC0, 0x90, 0xA4, 0x03, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, +0x40, 0x09, 0xB1, 0xB8, 0xE4, 0x90, 0xA4, 0x03, 0xF0, 0x80, 0x03, 0x12, 0x4F, 0xAA, 0xE4, 0x90, +0xA4, 0x02, 0xF0, 0x22, 0x12, 0x68, 0xC5, 0x22, 0x90, 0xA3, 0xF5, 0xE0, 0x54, 0xFB, 0xF0, 0x22, +0xF1, 0x59, 0x40, 0x30, 0x90, 0xA4, 0x13, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x55, 0xE0, 0xFF, 0x90, +0xA4, 0x13, 0xE0, 0xD3, 0x9F, 0x50, 0x1D, 0x90, 0xA4, 0x0B, 0xE0, 0x04, 0x12, 0x90, 0x82, 0x90, +0xA4, 0x12, 0xF0, 0xFB, 0x90, 0xA4, 0x0B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA6, 0x03, 0x74, +0x04, 0xF0, 0xB1, 0xF5, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0x90, 0xA3, +0xF5, 0xE0, 0x12, 0x56, 0xF4, 0x30, 0xE0, 0x02, 0xC1, 0xAF, 0x90, 0xA3, 0xF4, 0xE0, 0x30, 0xE0, +0x16, 0x90, 0xA4, 0x16, 0xE0, 0x24, 0x04, 0x90, 0xA4, 0x0E, 0xF0, 0x90, 0xA4, 0x16, 0xE0, 0x24, +0x03, 0x90, 0xA4, 0x0D, 0xF0, 0x80, 0x0D, 0x90, 0xA4, 0x0E, 0x74, 0x02, 0xF0, 0x90, 0xA4, 0x0D, +0x14, 0xF0, 0x0B, 0x0B, 0x90, 0xA4, 0x0D, 0xE0, 0xFA, 0x90, 0xA4, 0x0C, 0xE0, 0xD3, 0x9A, 0x50, +0x0E, 0x90, 0xA4, 0x01, 0xEB, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0xC3, 0x9D, 0x2C, 0x80, 0x11, 0xC3, +0xED, 0x9A, 0x2B, 0x90, 0xA4, 0x01, 0xF0, 0x90, 0xA4, 0x0D, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, +0x90, 0xA4, 0x11, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0xFF, 0x24, 0x0A, 0xFD, 0xE4, 0x33, 0xFC, 0x90, +0xA4, 0x11, 0xD1, 0xBB, 0x40, 0x04, 0xEF, 0x24, 0x0A, 0xF0, 0x90, 0xA4, 0x11, 0xE0, 0xFF, 0x24, +0x23, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0xA4, 0x01, 0xD1, 0xBB, 0x40, 0x04, 0xEF, 0x24, 0x23, 0xF0, +0x90, 0xA4, 0x11, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0xA4, 0x05, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, +0x05, 0x58, 0xE0, 0x6F, 0x70, 0x01, 0xE4, 0x60, 0x02, 0xF1, 0x12, 0xD1, 0xD9, 0x80, 0x07, 0x90, +0xA3, 0xF6, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, +0x80, 0xF8, 0x74, 0x80, 0x98, 0x22, 0x74, 0x1D, 0xD1, 0xE1, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA3, 0xF6, 0xE0, 0x54, 0xFE, 0xF0, +0x22, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0x80, +0xD9, 0xD1, 0xF9, 0xBF, 0x03, 0x02, 0xF1, 0x09, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, +0x22, 0xD1, 0xF9, 0xBF, 0x03, 0x02, 0xF1, 0x09, 0x22, 0x90, 0x05, 0x21, 0xE0, 0x54, 0x7F, 0xF0, +0x22, 0xF0, 0x90, 0xA4, 0x05, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x54, 0xFB, 0xF0, 0x90, +0xA3, 0xFD, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x12, 0x4E, 0x5C, 0x70, 0x16, 0x90, 0xA3, 0xF9, 0xE0, +0x60, 0x10, 0xF1, 0x43, 0xF0, 0x90, 0xA3, 0xF4, 0xE0, 0xF1, 0x1C, 0x54, 0x07, 0x70, 0x03, 0x12, +0x68, 0xC5, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x22, 0x90, 0xA3, +0xFC, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x91, 0x62, 0x22, 0x90, 0xA4, 0x56, 0xE0, 0xFF, 0x90, 0xA4, +0x02, 0xE0, 0xD3, 0x9F, 0x22, 0x90, 0xA3, 0xC0, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x20, 0x51, 0x4B, +0x22, 0x12, 0x4E, 0x5C, 0x70, 0x0B, 0x90, 0xA3, 0xF9, 0xE0, 0x60, 0x05, 0xF1, 0x43, 0x12, 0x48, +0x03, 0x22, 0x12, 0x7B, 0x0D, 0x7F, 0x04, 0x90, 0xA6, 0x22, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, +0xB7, 0x90, 0xA2, 0x96, 0xE0, 0xFF, 0x90, 0xA6, 0x22, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0xA2, 0x96, +0xF0, 0x22, 0xE4, 0x90, 0xA5, 0x12, 0xF0, 0x90, 0xA5, 0x10, 0x74, 0x14, 0xF0, 0x90, 0xA5, 0x1E, +0x74, 0x01, 0xF0, 0xFB, 0x7A, 0xA5, 0x79, 0x10, 0x12, 0x7B, 0x0D, 0x7F, 0x04, 0x80, 0xC8, 0xE0, +0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0x90, 0xA4, 0x5D, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0xA3, +0xF5, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0xA3, 0xF7, 0xE0, 0xC4, 0x54, 0x0F, 0x22, 0x90, 0xA3, +0xFF, 0xE0, 0x90, 0x05, 0x73, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, +0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xE6, 0xF0, 0x74, 0x77, 0xA3, 0xF0, 0x12, 0x83, 0xB7, +0xE5, 0x21, 0x30, 0xE1, 0x02, 0x11, 0xFE, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0x69, 0x43, 0xE5, +0x22, 0x30, 0xE0, 0x02, 0x11, 0xBE, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, 0x72, 0x4B, +0xE5, 0x24, 0x30, 0xE4, 0x02, 0x11, 0xF4, 0xE5, 0x24, 0x30, 0xE5, 0x02, 0x11, 0x6B, 0xE5, 0x24, +0x30, 0xE6, 0x02, 0x11, 0x8E, 0x74, 0xE6, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x77, 0xA3, 0xF0, +0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, +0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xA3, 0xF4, 0xE0, 0xFF, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x15, 0xEF, 0x54, 0xBF, 0x11, 0xB5, 0x30, 0xE0, 0x06, +0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x68, 0xC5, 0x22, 0x90, 0xA3, +0xF4, 0xE0, 0xFF, 0x12, 0x56, 0xF4, 0x30, 0xE0, 0x1B, 0xEF, 0x54, 0x7F, 0x11, 0xB5, 0x30, 0xE1, +0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0xA3, 0xF9, 0xE0, 0x60, +0x03, 0x12, 0x68, 0xC5, 0x22, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA3, 0xF5, 0x22, 0x12, 0x84, +0x7E, 0x90, 0xA5, 0x10, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, +0xFF, 0x12, 0x4A, 0xD7, 0x90, 0xA5, 0x10, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, +0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x31, 0x0A, 0x74, 0x02, +0xF0, 0x02, 0x75, 0xF5, 0x12, 0x4E, 0x84, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x4F, 0xC4, 0x90, 0xA3, +0xF9, 0xE0, 0x60, 0x03, 0x12, 0x75, 0x4D, 0x02, 0x4B, 0x7A, 0x90, 0xA4, 0x0B, 0xE0, 0xFF, 0xA3, +0xE0, 0xFD, 0x90, 0xA4, 0x12, 0xE0, 0xFB, 0x90, 0xA6, 0x03, 0x22, 0x90, 0xA4, 0x7F, 0x12, 0x45, +0xAC, 0xF1, 0x69, 0x90, 0xA3, 0xF9, 0xE0, 0xFF, 0x12, 0x4F, 0x2E, 0x90, 0xA3, 0xF9, 0xE0, 0x60, +0x1A, 0x90, 0xA4, 0x7F, 0x12, 0x45, 0xA3, 0x12, 0x6F, 0xC1, 0x54, 0x0F, 0xFF, 0x12, 0x57, 0xB7, +0xFD, 0xF1, 0xB8, 0x31, 0x0A, 0x74, 0x01, 0xF0, 0x12, 0x75, 0xF5, 0x22, 0x12, 0x57, 0xF0, 0x12, +0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0xA3, 0xF9, 0xF0, 0xEF, 0x12, 0x56, 0xF4, 0xA3, 0x12, 0x6F, +0xC0, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA3, 0xF7, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, +0x12, 0x57, 0xAF, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0xA3, 0xF4, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, +0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x12, 0x6F, 0xB7, 0x12, 0x57, 0xB5, 0x90, 0xA3, 0xF8, +0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12, 0x4A, 0xD7, 0x31, 0xA1, 0x21, +0x1B, 0x90, 0xA4, 0x7C, 0x02, 0x45, 0xA3, 0x12, 0x57, 0xF0, 0xE4, 0x90, 0xA4, 0x81, 0xF0, 0xFD, +0x31, 0xA1, 0x8D, 0x82, 0x12, 0x5E, 0x99, 0xF4, 0x60, 0x35, 0x90, 0xA4, 0x81, 0xE0, 0xFF, 0x31, +0xA1, 0x8D, 0x82, 0x12, 0x5E, 0x99, 0xFE, 0x75, 0xF0, 0x10, 0x12, 0x6C, 0x2E, 0xE0, 0x12, 0x56, +0xF4, 0xFC, 0xA8, 0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x90, 0xA4, 0x81, 0xF0, +0x75, 0xF0, 0x10, 0xEE, 0x12, 0x6D, 0x07, 0xE0, 0xFF, 0x51, 0x12, 0xEF, 0xF0, 0x80, 0x05, 0x51, +0x12, 0x74, 0xFF, 0xF0, 0x0D, 0xED, 0xB4, 0x07, 0xB7, 0x90, 0xA4, 0x7F, 0x74, 0x05, 0xF0, 0x90, +0xA4, 0x8D, 0x74, 0x08, 0xF0, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x7F, 0x71, 0x0D, 0x7F, 0x04, 0x02, +0x77, 0x87, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0x22, 0x12, 0x57, 0xF0, +0x31, 0xA1, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA4, 0x5D, 0xE0, 0x54, 0xFE, 0x4E, +0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0xF1, 0x30, 0x54, 0x04, 0x25, 0xE0, 0xFD, +0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA4, 0x5D, 0xF0, 0xEE, 0x54, 0x08, 0x25, 0xE0, 0xFE, 0xEF, +0x54, 0xEF, 0x4E, 0x12, 0x6F, 0xC0, 0xFB, 0xFF, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, +0x94, 0x00, 0xFE, 0x7C, 0x00, 0x7D, 0x05, 0x12, 0x07, 0x15, 0x90, 0xA4, 0x5F, 0xEF, 0xF0, 0xEB, +0x75, 0xF0, 0x05, 0x84, 0xA3, 0xF0, 0x31, 0xA1, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x0A, 0x12, 0x4B, +0xC6, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x80, 0x0A, 0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x4A, 0xD7, 0x12, +0x77, 0xC6, 0xF1, 0x41, 0x20, 0xE0, 0x04, 0xEF, 0x54, 0xDF, 0xF0, 0x12, 0x4F, 0xF7, 0x30, 0xE0, +0x15, 0x90, 0xA3, 0xF9, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0xA3, 0xFB, 0xF0, 0x12, 0x77, 0xCE, 0x90, +0x05, 0x58, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0xF9, 0xF0, 0x90, 0xA3, 0xFB, 0x74, 0x0C, +0xF0, 0x90, 0xA3, 0xF4, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x57, +0xF0, 0xF1, 0x2A, 0x30, 0xE1, 0x02, 0x61, 0x6B, 0x31, 0xA1, 0x12, 0x06, 0x89, 0x90, 0xA4, 0x7F, +0x12, 0x6F, 0xC0, 0x90, 0xA4, 0x80, 0x12, 0x57, 0xB6, 0x90, 0xA4, 0x81, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x06, 0xA2, 0x75, 0xF0, 0x10, 0xA4, 0xFF, 0x12, 0x57, 0xAF, 0xFD, 0xEF, 0x4D, 0xFF, 0x90, +0xA4, 0x80, 0xE0, 0xB4, 0x01, 0x06, 0xA3, 0xE0, 0x71, 0xE8, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xBC, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, +0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA3, 0xBD, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, +0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x29, 0xC0, 0x01, 0x90, +0xA3, 0xBD, 0xE0, 0xF1, 0x4A, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, +0x12, 0x06, 0x63, 0x90, 0xA3, 0xBD, 0x12, 0x77, 0xBF, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, +0x05, 0xE4, 0x90, 0xA3, 0xBD, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA4, 0x91, 0xF0, +0x90, 0xA4, 0x91, 0xE0, 0xFF, 0xC3, 0x94, 0x03, 0x50, 0x5E, 0x74, 0xA2, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xA2, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x0A, 0x50, 0x02, 0x80, 0x02, 0x7F, 0x0A, 0xAE, +0x07, 0xEF, 0x24, 0x02, 0x90, 0xA4, 0x90, 0xF0, 0x90, 0xA4, 0x82, 0x74, 0x0E, 0xF0, 0x90, 0xA4, +0x84, 0x74, 0x01, 0xF0, 0x71, 0xD9, 0x90, 0xA4, 0x85, 0xF0, 0xE4, 0xFF, 0xEF, 0xC3, 0x9E, 0x50, +0x16, 0x71, 0xD9, 0x2F, 0x71, 0xE8, 0xE0, 0xFD, 0x74, 0x86, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA4, +0xF5, 0x83, 0xED, 0xF0, 0x0F, 0x80, 0xE5, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x82, 0x12, 0x77, 0x82, +0x90, 0xA4, 0x91, 0xE0, 0x04, 0xF0, 0x80, 0x98, 0x22, 0x90, 0xA4, 0x91, 0xE0, 0x24, 0x9F, 0xF5, +0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x22, 0x24, 0xB9, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, +0x83, 0x22, 0x90, 0xA4, 0x87, 0x74, 0x12, 0xF0, 0x90, 0xA4, 0x95, 0x74, 0x05, 0xF0, 0x90, 0xA4, +0x89, 0xF1, 0x38, 0x90, 0xA4, 0x85, 0xE0, 0x90, 0xA4, 0x8C, 0xF0, 0x90, 0xA4, 0x86, 0xE0, 0x90, +0xA4, 0x8D, 0xF0, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x87, 0x71, 0x0D, 0x7F, 0x04, 0x02, 0x77, 0x87, +0x91, 0x98, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA4, 0x7C, 0xE0, +0xA3, 0xF0, 0x91, 0x98, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA4, +0x7C, 0xE0, 0x90, 0xA4, 0x7E, 0xF0, 0x91, 0x98, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, +0x01, 0x08, 0x90, 0xA4, 0x7C, 0xE0, 0x90, 0xA4, 0x7F, 0xF0, 0x91, 0x98, 0x7F, 0xF3, 0x7E, 0x01, +0x12, 0x34, 0xC1, 0xBF, 0x01, 0x03, 0x12, 0x6F, 0xCF, 0x91, 0x98, 0x7F, 0xF2, 0x7E, 0x01, 0x12, +0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA4, 0x7C, 0xE0, 0x90, 0xA4, 0x81, 0xF0, 0x90, 0xA4, 0x7D, +0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA4, 0x85, 0xF0, 0x90, 0xA4, +0x81, 0xE0, 0x90, 0xA4, 0x86, 0xF0, 0x61, 0xF2, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x7C, 0x22, 0x12, +0x57, 0xF0, 0x12, 0x06, 0x89, 0x30, 0xE0, 0x13, 0x12, 0x63, 0xB0, 0x90, 0xA2, 0x9C, 0xE0, 0xB4, +0x01, 0x0C, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x03, 0x12, 0x90, 0x37, 0x31, 0xA1, +0x12, 0x6F, 0xC1, 0x90, 0xA3, 0xC1, 0x12, 0x57, 0xB6, 0x90, 0xA3, 0xC2, 0xF0, 0x90, 0xA3, 0xC1, +0xE0, 0x54, 0x01, 0x90, 0xA3, 0xCE, 0xF0, 0x90, 0xA3, 0xC1, 0xE0, 0x54, 0x02, 0x90, 0xA3, 0xCF, +0xF0, 0x90, 0xA3, 0xC1, 0xE0, 0x54, 0x04, 0x90, 0xA3, 0xD0, 0xF0, 0x90, 0xA3, 0xC1, 0xE0, 0x54, +0x08, 0x90, 0xA3, 0xD1, 0xF0, 0x90, 0xA3, 0xC1, 0xE0, 0x54, 0x10, 0x90, 0xA3, 0xD2, 0xF0, 0x90, +0xA3, 0xC2, 0xE0, 0x54, 0x01, 0x90, 0xA3, 0xD3, 0xF0, 0x90, 0xA3, 0xC2, 0xE0, 0x54, 0x02, 0x90, +0xA3, 0xD4, 0xF0, 0x90, 0xA3, 0xC2, 0xE0, 0x54, 0x04, 0x90, 0xA3, 0xD5, 0xF0, 0x90, 0xA3, 0xC2, +0xE0, 0x54, 0x08, 0x90, 0xA3, 0xD6, 0xF0, 0x90, 0xA3, 0xC2, 0xE0, 0x54, 0x10, 0x90, 0xA3, 0xD7, +0xF0, 0x22, 0xE4, 0x90, 0xA5, 0x02, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, 0x4E, 0xFA, 0x12, 0x45, 0x61, +0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x12, 0x4F, 0x14, 0x78, 0x10, +0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x61, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0x12, 0x4F, 0x14, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, +0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x61, 0x90, 0xA4, 0x48, 0x12, 0x08, 0x6D, +0x90, 0xA4, 0x4C, 0x12, 0x45, 0x7F, 0x90, 0xA4, 0x48, 0x12, 0x45, 0x8B, 0xC3, 0x12, 0x45, 0x6E, +0x40, 0x3F, 0x90, 0xA3, 0xF4, 0xE0, 0x90, 0xA4, 0x4C, 0x30, 0xE0, 0x0F, 0xD1, 0xDE, 0x90, 0xA4, +0x16, 0xE0, 0x24, 0x04, 0x2F, 0xFF, 0x90, 0xA4, 0x50, 0x80, 0x05, 0xD1, 0xDE, 0x90, 0xA4, 0x51, +0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0x90, 0xA5, 0x03, 0xF0, 0x90, 0xA5, 0x03, 0xE0, 0xFF, 0xC3, 0x94, +0x2D, 0x50, 0x0E, 0x74, 0x17, 0x2F, 0xF1, 0x22, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x0F, 0xE0, 0x04, +0xF0, 0x90, 0xA4, 0x0F, 0xE0, 0xFF, 0xD3, 0x90, 0xA4, 0x53, 0xE0, 0x9F, 0x90, 0xA4, 0x52, 0xE0, +0x94, 0x00, 0x40, 0x02, 0xC1, 0xAA, 0xD1, 0xBC, 0xD1, 0xB3, 0x50, 0x1C, 0xD1, 0xC6, 0x90, 0xA5, +0x04, 0xE0, 0xD3, 0x9F, 0x40, 0x0A, 0x90, 0xA5, 0x02, 0xE0, 0x90, 0xA5, 0x05, 0xF0, 0x80, 0x08, +0x90, 0xA5, 0x02, 0xE0, 0x04, 0xF0, 0x80, 0xE0, 0xD1, 0xBC, 0xD1, 0xB3, 0x50, 0x2C, 0xD1, 0xC6, +0xC3, 0x90, 0xA4, 0x53, 0xE0, 0x9F, 0xFF, 0x90, 0xA4, 0x52, 0xE0, 0x94, 0x00, 0xFE, 0x90, 0xA5, +0x04, 0xE0, 0xD3, 0x9F, 0xE4, 0x9E, 0x40, 0x0A, 0x90, 0xA5, 0x02, 0xE0, 0x90, 0xA5, 0x06, 0xF0, +0x80, 0x08, 0x90, 0xA5, 0x02, 0xE0, 0x04, 0xF0, 0x80, 0xD0, 0x90, 0xA5, 0x05, 0xE0, 0x90, 0xA4, +0x14, 0xF0, 0x90, 0xA5, 0x06, 0xE0, 0x90, 0xA4, 0x15, 0xD1, 0xAB, 0x94, 0x0A, 0x40, 0x0A, 0xEF, +0x24, 0xF6, 0x90, 0xA4, 0x0C, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0xA4, 0x0C, 0xD1, 0xAB, 0x74, +0x0A, 0x9F, 0x90, 0xA4, 0x0B, 0xF0, 0x90, 0xA4, 0x14, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, +0xA4, 0x12, 0xF0, 0x90, 0xA3, 0xF4, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0xA4, 0x50, 0x80, 0x03, 0x90, +0xA4, 0x51, 0xE0, 0xFF, 0x90, 0xA4, 0x12, 0xE0, 0x2F, 0x04, 0xF0, 0x90, 0xA4, 0x12, 0xE0, 0xC3, +0x94, 0x0A, 0x50, 0x03, 0x74, 0x0A, 0xF0, 0x90, 0xA4, 0x12, 0xE0, 0x24, 0x02, 0xF0, 0x31, 0x0A, +0x74, 0x03, 0xF0, 0x12, 0x75, 0xF5, 0xE4, 0xFF, 0xD1, 0xFB, 0x22, 0xF0, 0x90, 0xA4, 0x14, 0xE0, +0xFF, 0xC3, 0x22, 0x90, 0xA5, 0x02, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x22, 0xE4, 0x90, 0xA5, 0x04, +0xF0, 0x90, 0xA5, 0x02, 0xF0, 0x22, 0x74, 0x17, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, +0xE0, 0xFF, 0x90, 0xA5, 0x04, 0xE0, 0x2F, 0xF0, 0x90, 0xA4, 0x54, 0xE0, 0xFF, 0x22, 0x12, 0x45, +0x8B, 0x90, 0xA4, 0x48, 0x12, 0x45, 0x7F, 0x12, 0x45, 0x46, 0x78, 0x0A, 0x12, 0x08, 0x47, 0x90, +0xA4, 0x11, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFF, 0x22, 0xE4, 0xFE, 0x74, 0x17, 0x2E, +0xF1, 0x22, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x2D, 0xF4, 0xE4, 0x90, 0xA4, 0x10, 0xF0, 0x90, 0xA4, +0x0F, 0xF0, 0x90, 0xA4, 0x13, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0xA3, 0x74, 0x2D, 0xF0, 0xE4, 0xA3, +0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0x22, 0x90, 0x00, 0x05, 0x02, 0x06, 0xA2, +0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x22, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, +0x22, 0x90, 0xA4, 0x5D, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x26, +0xF9, 0x74, 0xA3, 0x35, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0xA3, 0xE2, 0xF0, 0xBF, 0x01, +0x07, 0x91, 0x20, 0xE4, 0x90, 0xA3, 0xE2, 0xF0, 0x22, 0x90, 0xA3, 0xF4, 0xE0, 0x54, 0xFB, 0xF0, +0xE4, 0x90, 0xA4, 0x02, 0xF0, 0xA3, 0xF0, 0x90, 0xA3, 0xFD, 0xF0, 0x90, 0xA3, 0xF5, 0xE0, 0x54, +0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x12, 0x4F, 0xBA, 0x7D, 0x10, 0x7F, 0x03, 0x02, 0x76, 0xC6, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xB6, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA5, +0xB4, 0x74, 0x0C, 0xF0, 0x90, 0xA5, 0xC2, 0x74, 0x02, 0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0xB4, +0x12, 0x77, 0x82, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x24, +0x90, 0xA3, 0xFF, 0x74, 0x02, 0xF0, 0x80, 0x13, 0xED, 0x70, 0x06, 0x90, 0xA4, 0x59, 0xE0, 0x80, +0x02, 0xED, 0x14, 0x90, 0xA3, 0xFF, 0xF0, 0x90, 0xA3, 0xFF, 0xE0, 0xA3, 0xF0, 0x90, 0xA3, 0xF5, +0xE0, 0x44, 0x08, 0xF0, 0x22, 0x32, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, +0x51, 0x90, 0xA2, 0xCD, 0x12, 0x6F, 0xC0, 0x25, 0x51, 0x90, 0xA2, 0xCE, 0x12, 0x57, 0xB6, 0x25, +0x51, 0x90, 0xA2, 0xCF, 0xF0, 0x12, 0x57, 0xAF, 0x25, 0x51, 0x90, 0xA2, 0xD0, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0xA2, 0xD1, 0xF0, 0x12, 0x7F, 0x2A, 0x25, 0x51, 0x90, +0xA2, 0xD2, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0xA2, 0xD3, 0xF0, 0x22, +0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x6F, 0xC1, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, +0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x57, 0xB7, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, +0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x25, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, +0x89, 0x54, 0x01, 0xFD, 0xAF, 0x54, 0x12, 0x61, 0x48, 0xAF, 0x54, 0x12, 0x4E, 0x64, 0xEF, 0xAF, +0x54, 0x70, 0x04, 0x11, 0xD7, 0x80, 0x02, 0x11, 0x92, 0x05, 0x54, 0x80, 0xD4, 0xE5, 0x55, 0x70, +0x10, 0xFF, 0x12, 0x4E, 0x64, 0xEF, 0x70, 0x09, 0x12, 0x4F, 0x9E, 0x54, 0xBF, 0xF0, 0x54, 0x7F, +0xF0, 0x22, 0xE4, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x15, 0xEF, 0xF0, +0xA3, 0xED, 0xF0, 0x7D, 0x44, 0x7F, 0x6F, 0x12, 0x4B, 0x6F, 0x12, 0x4D, 0x28, 0x90, 0xA6, 0x16, +0xE0, 0x90, 0xA6, 0x15, 0xB4, 0x01, 0x0D, 0xE0, 0x75, 0xF0, 0x10, 0x12, 0x6E, 0xF9, 0xE0, 0x44, +0x04, 0xF0, 0x80, 0x0B, 0xE0, 0x75, 0xF0, 0x10, 0x12, 0x6E, 0xF9, 0xE0, 0x54, 0xFB, 0xF0, 0x12, +0x4B, 0xC8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x01, 0x80, 0xB9, 0x12, 0x06, 0x89, 0x90, 0xA3, +0xD8, 0x12, 0x6F, 0xC0, 0x90, 0xA3, 0xD9, 0x12, 0x57, 0xB6, 0x90, 0xA3, 0xDA, 0xF0, 0x12, 0x57, +0xAF, 0x90, 0xA3, 0xDB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA3, 0xDC, 0xF0, 0x22, +0x12, 0x06, 0x89, 0x90, 0xA3, 0xDD, 0x12, 0x6F, 0xC0, 0x90, 0xA3, 0xDE, 0x12, 0x57, 0xB6, 0x90, +0xA3, 0xDF, 0xF0, 0x12, 0x57, 0xAF, 0x90, 0xA3, 0xE0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, +0x90, 0xA3, 0xE1, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0xA4, 0x66, 0xE0, +0x54, 0x7F, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x12, 0x7F, 0x30, 0x54, +0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA4, 0x66, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, +0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xF0, 0x4E, 0x90, +0xA4, 0x66, 0x12, 0x6F, 0xC0, 0xFF, 0x54, 0x7F, 0x90, 0xA4, 0x68, 0xF0, 0x12, 0x56, 0xF1, 0xFF, +0x90, 0xA4, 0x67, 0xE0, 0x54, 0xFE, 0x12, 0x57, 0xB5, 0x90, 0xA4, 0x69, 0xF0, 0x12, 0x57, 0xAF, +0x54, 0x01, 0x25, 0xE0, 0xFF, 0x90, 0xA4, 0x67, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x6A, 0xD3, +0x20, 0xE0, 0x02, 0x7D, 0x01, 0x02, 0x69, 0x7F, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA4, +0x6B, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x57, 0xB7, 0xFF, 0x30, 0xE0, 0x1F, 0x12, 0x06, +0x89, 0x90, 0xA4, 0x56, 0x12, 0x6F, 0xC0, 0x90, 0xA4, 0x57, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, +0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x12, 0x57, 0xAF, 0x90, 0xA4, 0x59, 0xF0, 0x22, 0x90, 0xA4, 0x56, +0x74, 0x02, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, +0x07, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA4, 0x04, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA4, +0x5C, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0xBC, 0xF0, 0xA3, 0xF0, 0x90, 0xA3, 0x24, 0xF0, 0xA3, 0xF0, +0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0x12, 0x5E, 0xCB, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, +0xF2, 0x12, 0x5E, 0xC8, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x51, 0x3E, 0x51, 0x49, 0x54, 0xF0, +0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, +0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x74, 0x01, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0xA5, 0xF4, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0xAC, +0x90, 0xA6, 0x14, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, +0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA5, +0xF5, 0x12, 0x45, 0xA3, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, +0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0xA5, 0xF4, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, +0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0xA3, 0xE9, 0x24, 0x02, +0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA5, 0xF5, 0x51, 0xC9, 0xF5, 0x43, +0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x12, 0x45, 0xA3, 0x90, 0x00, 0x0E, 0x02, +0x06, 0xA2, 0x90, 0xA6, 0x04, 0x12, 0x45, 0xAC, 0xE4, 0xFF, 0x90, 0xA6, 0x04, 0x12, 0x5E, 0x94, +0xFE, 0x74, 0xF0, 0x2F, 0x51, 0xEE, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xED, 0x22, 0xF5, 0x82, +0xE4, 0x34, 0x02, 0xF5, 0x83, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, +0x22, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x87, 0x75, 0x18, 0x33, 0x90, 0x01, 0x30, +0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, +0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, +0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, +0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, +0xC4, 0x74, 0x4C, 0xF0, 0x74, 0x83, 0xA3, 0xF0, 0x90, 0xA4, 0x64, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, +0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, +0x80, 0xE6, 0x74, 0x4C, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x83, 0xA3, 0xF0, 0x7F, 0x01, 0x22, +0x90, 0x01, 0xE4, 0x74, 0x23, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, +0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, +0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, +0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, +0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, +0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, +0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA5, 0x00, 0xF0, 0xE0, +0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, +0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, +0xE8, 0x12, 0x47, 0xC6, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x46, 0x8D, +0x80, 0xFE, 0x22, 0xE4, 0xFF, 0x12, 0x4E, 0x64, 0xBF, 0x01, 0x12, 0x90, 0xA3, 0xF9, 0xE0, 0x60, +0x0C, 0x12, 0x6F, 0xB7, 0x64, 0x02, 0x60, 0x02, 0x80, 0x04, 0x12, 0x4F, 0xAA, 0x22, 0x90, 0x04, +0x1D, 0xE0, 0x70, 0x1C, 0x90, 0xA2, 0xCE, 0xE0, 0xFF, 0x90, 0xA5, 0xFF, 0x74, 0x09, 0xF0, 0x7B, +0x18, 0xE4, 0xFD, 0x12, 0x5E, 0x02, 0x90, 0xA6, 0x1F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x91, 0x61, +0x22, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xEF, 0x90, 0x02, 0x86, 0x60, 0x06, 0xE0, 0x44, +0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA2, 0x9B, 0xED, 0xF0, 0x22, 0xE4, 0x90, +0xA5, 0x11, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x47, 0xAA, 0x90, 0xA5, 0x11, 0xEF, +0xF0, 0x7F, 0x83, 0x12, 0x47, 0xAA, 0xAE, 0x07, 0x90, 0xA5, 0x11, 0xE0, 0xFF, 0xB5, 0x06, 0x01, +0x22, 0xC3, 0x90, 0xA5, 0x13, 0xE0, 0x94, 0x64, 0x90, 0xA5, 0x12, 0xE0, 0x94, 0x00, 0x40, 0x0D, +0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA5, 0x11, 0xE0, 0xFF, 0x22, 0x90, 0xA5, 0x12, +0x12, 0x62, 0xCC, 0x80, 0xC2, 0x90, 0x01, 0xC4, 0x74, 0xC5, 0xF0, 0x74, 0x84, 0xA3, 0xF0, 0x7F, +0x90, 0x12, 0x47, 0xAA, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0xC5, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, +0x84, 0xA3, 0xF0, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, 0xEF, 0x12, 0x51, +0x2E, 0xC4, 0x54, 0x03, 0x90, 0xA4, 0x81, 0xF0, 0x90, 0xA4, 0x7F, 0x60, 0x09, 0x74, 0x32, 0xF0, +0xA3, 0x74, 0x2F, 0xF0, 0x80, 0x07, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xE5, 0x53, 0xD3, +0x94, 0x2D, 0x40, 0x0A, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x12, 0x57, 0xC1, 0x80, 0x20, 0xE5, 0x53, +0xD3, 0x94, 0x1E, 0x40, 0x05, 0x90, 0xA4, 0x7F, 0x80, 0x14, 0xE5, 0x53, 0xD3, 0x94, 0x14, 0x40, +0x05, 0x90, 0xA4, 0x80, 0x80, 0x08, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x12, 0x57, 0x00, 0xE0, 0xFD, +0x85, 0x54, 0x68, 0xE4, 0xFB, 0xAF, 0x52, 0x02, 0x6A, 0xE4, 0x8D, 0x5B, 0xAC, 0x07, 0x75, 0xF0, +0x10, 0xEC, 0x12, 0x6D, 0x07, 0xE0, 0xF5, 0x5C, 0x54, 0x7F, 0xF9, 0xE5, 0x5C, 0x54, 0x80, 0xF5, +0x5D, 0x75, 0xF0, 0x04, 0xEC, 0x12, 0x57, 0xC1, 0xE0, 0xF5, 0x5F, 0x75, 0xF0, 0x04, 0xEC, 0x12, +0x51, 0x2E, 0xC4, 0x54, 0x03, 0xF5, 0x60, 0xE9, 0xF1, 0xAD, 0xD1, 0x36, 0xEC, 0xF1, 0xC7, 0x74, +0x95, 0x2C, 0x12, 0x6F, 0x88, 0xE5, 0x5C, 0xF0, 0x75, 0xF0, 0x04, 0xEC, 0x12, 0x51, 0x2E, 0x13, +0x13, 0x54, 0x03, 0xF5, 0x5E, 0x74, 0x95, 0x2C, 0xD1, 0x3E, 0xE5, 0x5E, 0xF0, 0xE9, 0x64, 0x2C, +0x70, 0x27, 0x75, 0xF0, 0x04, 0xEC, 0x12, 0x51, 0x2E, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5E, 0xC3, +0x9E, 0x50, 0x16, 0x05, 0x5E, 0xE5, 0x5E, 0xF1, 0x93, 0xEC, 0x90, 0x96, 0x18, 0x12, 0x45, 0x97, +0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5C, 0x80, 0x60, 0xE9, 0xC3, 0x95, 0x5F, 0x50, 0x30, 0xE9, +0x04, 0xFD, 0xED, 0xD3, 0x95, 0x5F, 0x50, 0x51, 0xED, 0xD1, 0x4E, 0xEC, 0x12, 0x54, 0x80, 0xE0, +0xFB, 0x7A, 0x00, 0xED, 0x54, 0x07, 0x12, 0x6F, 0xE2, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xD1, 0x46, 0x60, 0x06, 0xA9, 0x05, 0x89, 0x5C, 0x80, 0x2D, 0x0D, 0x80, 0xD3, 0xE9, +0x65, 0x5F, 0x70, 0x1A, 0x75, 0xF0, 0x04, 0xEC, 0x12, 0x55, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x23, 0xE5, 0x5C, 0x20, 0xE7, 0x1E, 0xE9, 0x44, 0x80, 0xF5, 0x5C, 0x80, 0x0B, 0x74, 0x95, +0x2C, 0x12, 0x6F, 0x88, 0xE5, 0x5F, 0xF0, 0xF5, 0x5C, 0xAF, 0x04, 0x85, 0x5E, 0x68, 0xAB, 0x5B, +0xAD, 0x5C, 0x12, 0x6A, 0xE4, 0x22, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x22, 0xF5, 0x82, +0xE4, 0x34, 0x9D, 0xF5, 0x83, 0x22, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x22, 0x13, 0x13, +0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0x22, 0x7D, 0x01, 0xAF, 0x51, 0xAA, 0x07, 0xAB, 0x05, +0x75, 0xF0, 0x10, 0xEA, 0x12, 0x6D, 0x07, 0xE0, 0xF5, 0x5B, 0x54, 0x7F, 0xF5, 0x5D, 0x75, 0xF0, +0x04, 0xEA, 0x12, 0x57, 0x00, 0xE0, 0x90, 0xA4, 0x8C, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x57, +0xC1, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x51, 0x2E, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x5C, +0xE5, 0x5D, 0xF1, 0xBB, 0x12, 0x6F, 0xC7, 0xEA, 0xF1, 0x9F, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x75, +0xF0, 0x04, 0xEA, 0x12, 0x51, 0x2E, 0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA4, 0x8A, 0xF0, 0x74, 0x95, +0x2A, 0x12, 0x6F, 0x88, 0xE5, 0x5D, 0xF0, 0x74, 0x95, 0x2A, 0xD1, 0x3E, 0xE5, 0x5C, 0xF0, 0xE5, +0x5D, 0xD3, 0x9F, 0x40, 0x04, 0x8F, 0x5D, 0x8F, 0x5B, 0xEB, 0x70, 0x02, 0xE1, 0x87, 0xAF, 0x03, +0x8F, 0x5E, 0xE5, 0x5B, 0x30, 0xE7, 0x05, 0x85, 0x5D, 0x5B, 0x15, 0x5E, 0xE5, 0x5E, 0x70, 0x02, +0xE1, 0x87, 0xE5, 0x5D, 0x64, 0x2C, 0x70, 0x26, 0xE5, 0x5C, 0xD3, 0x94, 0x00, 0x40, 0x1F, 0xE5, +0x5C, 0xD3, 0x94, 0x02, 0x50, 0x18, 0x15, 0x5C, 0xE5, 0x5C, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, +0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x51, 0x2E, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x5E, 0xE5, 0x5E, +0x60, 0x75, 0x90, 0xA4, 0x8C, 0xE0, 0xFF, 0xE5, 0x5D, 0xD3, 0x9F, 0x40, 0x64, 0xE4, 0x90, 0xA4, +0x8B, 0xF0, 0x85, 0x5D, 0x5B, 0xAD, 0x5B, 0xE5, 0x5D, 0x14, 0xFC, 0x90, 0xA4, 0x8C, 0xE0, 0xFF, +0xEC, 0xC3, 0x9F, 0x40, 0x46, 0xEC, 0xD1, 0x4E, 0xEA, 0x12, 0x54, 0x80, 0xE0, 0xF5, 0x82, 0x75, +0x83, 0x00, 0xEC, 0x54, 0x07, 0x12, 0x6F, 0xE2, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, +0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x5D, 0xAD, 0x04, +0xB4, 0x14, 0x02, 0x7D, 0x0C, 0x90, 0xA4, 0x8B, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x5E, 0x60, 0x0B, +0xA3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40, 0x03, 0x1C, 0x80, 0xB0, 0xAF, 0x05, 0x8F, 0x5B, 0x80, +0x06, 0x90, 0xA4, 0x8C, 0xE0, 0xF5, 0x5B, 0xAF, 0x02, 0x85, 0x5C, 0x68, 0xE4, 0xFB, 0xAD, 0x5B, +0x02, 0x6A, 0xE4, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x22, 0xE0, 0x25, +0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xE5, 0x53, 0x25, 0xE0, 0x24, +0x51, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x22, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x79, 0xF5, +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x22, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, +0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xE4, 0xF5, 0x51, 0x90, 0xA3, 0xF3, 0xE0, 0xFF, +0xE5, 0x51, 0xC3, 0x9F, 0x40, 0x03, 0x02, 0x8B, 0xC1, 0xE5, 0x51, 0x13, 0x13, 0x13, 0x54, 0x1F, +0x90, 0xA4, 0x88, 0xF0, 0xE5, 0x51, 0x54, 0x07, 0xA3, 0xF0, 0x90, 0x04, 0xA0, 0xE0, 0xFF, 0xA3, +0xE0, 0xFE, 0xEF, 0x64, 0x01, 0x70, 0x27, 0xE5, 0x51, 0x6E, 0x70, 0x22, 0xA3, 0xE0, 0xF5, 0x52, +0xA3, 0xE0, 0x12, 0x6C, 0xFE, 0xE5, 0x52, 0xF0, 0x12, 0x6E, 0xF4, 0xE0, 0x54, 0xFC, 0xFF, 0x90, +0xA4, 0x87, 0xE0, 0x54, 0x03, 0x4F, 0xFF, 0x12, 0x6E, 0xF4, 0xEF, 0xF0, 0x61, 0xBC, 0xAF, 0x51, +0x12, 0x4E, 0x64, 0xEF, 0x70, 0x02, 0x61, 0xBC, 0x12, 0x51, 0x29, 0x12, 0x56, 0xF4, 0x30, 0xE0, +0x02, 0x61, 0xBC, 0x90, 0xA4, 0x88, 0x12, 0x6C, 0xF3, 0xE0, 0xFD, 0x7C, 0x00, 0x90, 0xA4, 0x89, +0x12, 0x6F, 0xE1, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xB1, 0x4E, 0x60, 0x02, +0x61, 0xBC, 0xE5, 0x51, 0x12, 0x66, 0xA7, 0x12, 0x6E, 0x87, 0x4E, 0x70, 0x0C, 0x74, 0x95, 0x25, +0x51, 0x12, 0x66, 0x9D, 0xE0, 0x70, 0x02, 0x61, 0xBC, 0xE5, 0x51, 0xB1, 0x22, 0x90, 0xA4, 0x7B, +0x12, 0x45, 0xAC, 0xE5, 0x51, 0x12, 0x66, 0xA7, 0xF5, 0x83, 0xE0, 0xF5, 0x56, 0xA3, 0xE0, 0xF5, +0x57, 0x74, 0x95, 0x25, 0x51, 0x12, 0x66, 0x9D, 0xE0, 0xFF, 0x90, 0xA4, 0x7E, 0xE4, 0xF0, 0xA3, +0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x12, 0x57, 0xC1, 0xE0, 0x90, 0xA4, 0x86, 0xF0, 0xFD, +0x12, 0x51, 0x29, 0xFE, 0x13, 0x13, 0x54, 0x03, 0x12, 0x6C, 0xFE, 0xE0, 0xF5, 0x52, 0x54, 0x7F, +0xF5, 0x53, 0xD3, 0x9D, 0x40, 0x16, 0x90, 0xA4, 0x86, 0xE0, 0xF5, 0x53, 0xE5, 0x52, 0x30, 0xE7, +0x07, 0xE5, 0x53, 0x44, 0x80, 0xFF, 0x80, 0x02, 0xAF, 0x53, 0x8F, 0x52, 0xE5, 0x53, 0x90, 0x41, +0x3D, 0x93, 0x12, 0x57, 0xC7, 0xE0, 0xC3, 0x9F, 0x40, 0x0B, 0x74, 0xA5, 0x25, 0x53, 0xF5, 0x82, +0xE4, 0x34, 0xA2, 0x80, 0x09, 0x74, 0xB9, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, +0xE0, 0xFF, 0x91, 0x3F, 0x90, 0xA4, 0x78, 0x12, 0x45, 0xAC, 0x74, 0x15, 0x25, 0x51, 0xF5, 0x82, +0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x41, 0x5B, 0xE5, 0x52, 0x30, +0xE7, 0x04, 0x05, 0x58, 0x05, 0x58, 0xE5, 0x58, 0xD3, 0x94, 0x1A, 0xAF, 0x58, 0x40, 0x02, 0x7F, +0x1A, 0x91, 0x3F, 0x90, 0xA4, 0x78, 0x12, 0x45, 0xAC, 0xC3, 0xE5, 0x57, 0x94, 0x0F, 0xE5, 0x56, +0x94, 0x00, 0x50, 0x68, 0x71, 0xC2, 0xFF, 0x90, 0xA4, 0x7F, 0xE0, 0x2F, 0xFF, 0x90, 0xA4, 0x7E, +0xE0, 0x71, 0xF8, 0x71, 0xE6, 0x2F, 0xFD, 0xEE, 0x35, 0xF0, 0x91, 0x34, 0xD3, 0xED, 0x9F, 0xEC, +0x9E, 0x40, 0x05, 0x12, 0x86, 0x58, 0x41, 0x56, 0x90, 0xA4, 0x7B, 0x12, 0x45, 0xA3, 0x12, 0x07, +0x80, 0x65, 0x57, 0x70, 0x04, 0xE5, 0xF0, 0x65, 0x56, 0x75, 0xF0, 0x04, 0x70, 0x26, 0x12, 0x55, +0xDE, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0xFE, 0xEF, 0x54, 0x3F, 0xFF, 0xEE, 0x04, 0x54, 0x03, +0xFE, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x4F, 0xF0, 0xE4, 0xFD, 0xAF, 0x51, 0x12, 0x85, 0x4A, 0x75, +0xF0, 0x04, 0x80, 0x00, 0x12, 0x55, 0xDE, 0x54, 0x3F, 0xF0, 0x41, 0x56, 0xE5, 0x51, 0x64, 0x01, +0x70, 0x47, 0x71, 0xC2, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, +0xF0, 0x3E, 0x91, 0x34, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0xA2, 0x95, 0x74, 0x01, +0xF0, 0x80, 0x26, 0x71, 0xC2, 0xFB, 0xAA, 0xF0, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, +0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x7C, 0x00, 0x7D, 0x05, 0x12, 0x07, 0x03, 0xD3, 0xEB, 0x9F, +0xEA, 0x9E, 0x40, 0x05, 0xE4, 0x90, 0xA2, 0x95, 0xF0, 0xAB, 0x58, 0xAD, 0x51, 0xAF, 0x57, 0xAE, +0x56, 0x91, 0x51, 0x8E, 0x54, 0x8F, 0x55, 0x12, 0x87, 0xAB, 0xC3, 0x91, 0x2A, 0x50, 0x09, 0x7D, +0x01, 0xAF, 0x51, 0x12, 0x85, 0x4A, 0x80, 0x0B, 0x12, 0x87, 0xB9, 0xD3, 0x91, 0x2A, 0x40, 0x09, +0x12, 0x86, 0x58, 0x71, 0xDA, 0xE4, 0xF0, 0x80, 0x2D, 0x71, 0xDA, 0xE0, 0x04, 0xF0, 0x71, 0xDA, +0xE0, 0xC3, 0x94, 0x05, 0x40, 0x20, 0x71, 0xDA, 0xE4, 0xF0, 0x12, 0x87, 0xB9, 0x12, 0x86, 0x36, +0x12, 0x87, 0xAB, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, +0xFF, 0xE5, 0x51, 0x12, 0x87, 0xC7, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0x75, 0x5A, 0x01, 0x74, 0x81, +0x25, 0x51, 0x12, 0x66, 0x18, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0xB5, 0x90, 0xA4, 0x7B, 0x12, +0x45, 0xA3, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, +0xE5, 0xF0, 0x3E, 0x71, 0xE6, 0x2F, 0xFF, 0xEE, 0x71, 0xF8, 0xFE, 0x71, 0xC8, 0x2F, 0xFF, 0xEE, +0x35, 0xF0, 0x90, 0xA4, 0x80, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFF, 0xC3, 0x90, 0xA4, +0x81, 0xE0, 0x9F, 0xFE, 0x90, 0xA4, 0x80, 0xE0, 0x95, 0xF0, 0x90, 0xA4, 0x82, 0xF0, 0xA3, 0xCE, +0xF0, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0x25, 0xE0, 0xFF, 0xEC, 0x33, 0xFE, +0xEF, 0x2D, 0xFD, 0xEE, 0x3C, 0xFC, 0x71, 0xE7, 0x25, 0xE0, 0xFF, 0xE5, 0xF0, 0x33, 0xFE, 0x90, +0x00, 0x02, 0x71, 0xFE, 0xCF, 0x2D, 0xFD, 0xEF, 0x3C, 0xFC, 0x71, 0xC2, 0xAE, 0xF0, 0x78, 0x02, +0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x2D, 0xFF, 0xEC, 0x3E, 0x90, 0xA4, 0x84, 0xF0, 0xA3, +0xEF, 0xF0, 0x90, 0xA4, 0x7E, 0x91, 0x07, 0x12, 0x6E, 0xA7, 0x71, 0xCE, 0x50, 0x08, 0x90, 0xA4, +0x7E, 0x71, 0xED, 0xFE, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, 0xE5, 0x51, 0x12, 0x6E, 0xA7, 0x12, +0x87, 0xD0, 0x90, 0xA4, 0x80, 0x91, 0x07, 0x12, 0x6E, 0x98, 0x71, 0xCE, 0x50, 0x08, 0x90, 0xA4, +0x80, 0x71, 0xED, 0xFE, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, 0xE5, 0x51, 0x12, 0x6E, 0x98, 0x12, +0x87, 0xD0, 0x90, 0xA4, 0x84, 0x91, 0x07, 0x91, 0x20, 0x71, 0xCE, 0x50, 0x08, 0x90, 0xA4, 0x84, +0x71, 0xED, 0xFE, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, 0xE5, 0x51, 0x91, 0x20, 0x12, 0x87, 0xD0, +0xC3, 0x74, 0xFF, 0x95, 0x57, 0xFF, 0x74, 0xFF, 0x95, 0x56, 0xFE, 0x12, 0x6F, 0x90, 0x71, 0xCE, +0x50, 0x0A, 0xE5, 0x57, 0x2D, 0xFF, 0xE5, 0x56, 0x3C, 0xFE, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, +0x12, 0x6F, 0x90, 0x12, 0x87, 0xD0, 0x91, 0x18, 0xFB, 0xC3, 0x74, 0xFF, 0x9B, 0xFF, 0x74, 0xFF, +0x9E, 0xFE, 0x74, 0xFF, 0x94, 0x00, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0xFC, 0x90, 0x94, 0x91, 0x12, +0x45, 0x8B, 0xD3, 0x12, 0x45, 0x6E, 0x50, 0x11, 0x91, 0x18, 0xFF, 0xE4, 0xFC, 0xFD, 0x90, 0x94, +0x91, 0x12, 0x45, 0x8B, 0x12, 0x45, 0x39, 0x80, 0x06, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, +0x94, 0x91, 0x12, 0x08, 0x6D, 0x7D, 0x01, 0xAF, 0x51, 0x12, 0x66, 0x35, 0x05, 0x51, 0x02, 0x87, +0xDB, 0x22, 0x90, 0xA4, 0x7B, 0x12, 0x45, 0xA3, 0x90, 0x00, 0x08, 0x02, 0x07, 0xAB, 0xF5, 0x83, +0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x9E, 0x22, 0x74, 0x15, 0x25, 0x51, 0xF5, 0x82, +0xE4, 0x34, 0x98, 0xF5, 0x83, 0x22, 0xFE, 0x90, 0x00, 0x04, 0x02, 0x07, 0xAB, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0xED, 0x2F, 0xFF, 0xEC, 0x3E, 0x22, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, +0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, +0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0xE5, 0x51, 0x22, 0x90, 0xA4, 0x82, 0xE0, 0xFE, 0xA3, 0xE0, 0x22, +0x25, 0xE0, 0x24, 0x15, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0x22, 0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, +0x93, 0x95, 0x54, 0x22, 0xFC, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0x22, 0x8F, +0x58, 0xEF, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, +0x22, 0x90, 0xA4, 0x8A, 0xEE, 0xF0, 0xA3, 0x12, 0x7F, 0x38, 0x90, 0xA4, 0x8C, 0xE0, 0xB1, 0x22, +0x90, 0xA4, 0x91, 0x12, 0x45, 0xAC, 0x90, 0xA4, 0x8D, 0xE0, 0x91, 0x42, 0xA3, 0x12, 0x45, 0xAC, +0xB1, 0x1A, 0xFF, 0xB1, 0x31, 0x8F, 0x5F, 0xA3, 0x12, 0x87, 0x9E, 0xE0, 0xF5, 0x5B, 0xA3, 0xE0, +0xF5, 0x5C, 0xE4, 0xF5, 0x60, 0x90, 0xA4, 0x91, 0x12, 0x45, 0xA3, 0x75, 0xF0, 0x02, 0xE5, 0x60, +0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x5F, 0x08, 0x80, 0x05, +0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA4, 0x8E, 0x12, 0x45, 0xA3, 0x85, 0x60, +0x82, 0x12, 0x5E, 0x99, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5C, 0xF5, 0x5C, 0xEE, +0x35, 0x5B, 0xF5, 0x5B, 0x05, 0x60, 0xE5, 0x60, 0xB4, 0x05, 0xBA, 0x90, 0xA4, 0x8E, 0x12, 0x45, +0xA3, 0x12, 0x7F, 0x2A, 0xFD, 0x7C, 0x00, 0xB1, 0x1A, 0xA8, 0x5F, 0x08, 0x80, 0x05, 0xCE, 0xC3, +0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0x8E, 0x5D, 0x8F, 0x5E, 0xD3, 0xE5, 0x5C, +0x95, 0x5E, 0xE5, 0x5B, 0x95, 0x5D, 0x40, 0x0C, 0xE5, 0x5C, 0x95, 0x5E, 0xFF, 0xE5, 0x5B, 0x95, +0x5D, 0xFE, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x00, 0x8E, 0x5B, 0x8F, 0x5C, 0x90, 0xA4, 0x8C, 0x12, +0x87, 0x9E, 0xE5, 0x5B, 0xF0, 0xA3, 0xE5, 0x5C, 0xF0, 0x22, 0x90, 0xA4, 0x8A, 0xE0, 0xFE, 0xA3, +0xE0, 0x22, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, +0x22, 0xB1, 0x46, 0x40, 0x03, 0x7F, 0x05, 0x22, 0xD3, 0xEF, 0x94, 0xC8, 0xEE, 0x94, 0x00, 0x7F, +0x00, 0x40, 0x02, 0x7F, 0x02, 0x22, 0xD3, 0xEF, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x22, 0xFF, 0xEE, +0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x30, +0x12, 0x7F, 0x38, 0x90, 0xA5, 0xC6, 0xE0, 0x90, 0x04, 0x33, 0xF0, 0x90, 0xA5, 0xC7, 0xE0, 0x90, +0x04, 0x34, 0xF0, 0x90, 0xA5, 0xC8, 0xE0, 0x90, 0x04, 0x35, 0xF0, 0x90, 0xA5, 0xC9, 0xE0, 0x90, +0x04, 0x36, 0xF0, 0x90, 0xA5, 0xCA, 0xE0, 0x90, 0x04, 0x37, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x12, 0x6F, 0xC1, 0xF5, 0x51, 0x12, 0x57, 0xB7, 0xF5, 0x52, 0x12, 0x06, 0x89, 0xF5, 0x53, 0x90, +0xA2, 0x9D, 0xF0, 0xE5, 0x51, 0x60, 0x06, 0xFD, 0xAF, 0x52, 0x12, 0x56, 0x1A, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x19, 0xEF, 0xF0, 0x12, 0x57, 0xE9, 0x30, 0xE6, 0x3E, +0x7F, 0x8D, 0x12, 0x47, 0xAA, 0xEF, 0x64, 0x01, 0x70, 0x34, 0x90, 0xA6, 0x1A, 0xF0, 0x90, 0xA6, +0x1A, 0xE0, 0xFD, 0x90, 0xA6, 0x19, 0xE0, 0x75, 0xF0, 0x10, 0x12, 0x6D, 0x07, 0xE5, 0x82, 0x2D, +0x12, 0x54, 0x89, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x50, 0xF7, 0x90, 0xA6, 0x1A, 0xE0, 0x04, 0xF0, +0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD8, 0x12, 0x57, 0xE9, 0x30, 0xE0, 0x02, 0xD1, 0x03, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0xE4, 0xFD, 0x7F, 0x8D, 0x02, 0x46, 0x8D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0xA5, 0xA2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA5, 0xAC, 0x12, +0x08, 0x6D, 0x90, 0xA5, 0xA4, 0x12, 0x45, 0x7F, 0x12, 0x08, 0x3A, 0x90, 0xA5, 0xAC, 0x12, 0x45, +0x8B, 0x12, 0x45, 0x54, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA5, 0xA4, 0x12, +0x45, 0x7F, 0x90, 0xA5, 0xA8, 0x12, 0x45, 0x8B, 0x12, 0x45, 0x54, 0xD0, 0x03, 0xD0, 0x02, 0xD0, +0x01, 0xD0, 0x00, 0x12, 0x45, 0x61, 0x90, 0xA5, 0xB0, 0x12, 0x08, 0x6D, 0x90, 0xA5, 0xB0, 0x12, +0x68, 0xA6, 0x90, 0xA5, 0xA2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x8E, 0x26, 0x8F, 0x27, 0xBD, 0x01, 0x13, 0xE5, 0x27, 0x78, 0x03, 0xCE, 0xC3, 0x13, +0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xEE, 0x54, 0x1F, 0xFE, 0x02, 0x3D, 0xC2, 0xAF, 0x27, 0xAE, 0x26, +0x02, 0x3E, 0x50, 0x90, 0xA6, 0x25, 0xEF, 0xF0, 0x90, 0xA2, 0x9C, 0xE0, 0xB4, 0x02, 0x12, 0x90, +0xA6, 0x25, 0xE0, 0xFF, 0x64, 0x01, 0x60, 0x25, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, +0x19, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x06, +0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA6, 0x25, 0xE0, 0xFF, 0x12, 0x6A, 0x35, 0x22, 0x90, 0xA4, +0x78, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xE0, +0x44, 0x01, 0xF0, 0x22, 0x7D, 0x07, 0xEF, 0x5D, 0xC3, 0x60, 0x0A, 0xD1, 0xF9, 0x24, 0x08, 0xFF, +0xE4, 0x3E, 0xFE, 0x80, 0x03, 0xD1, 0xF9, 0xFF, 0x22, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, +0x00, 0x5E, 0xFE, 0xED, 0x5F, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, +0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x06, 0xEF, 0x64, 0x01, 0x70, 0x48, 0x90, 0xA3, 0xFD, +0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3F, 0x90, 0xA3, 0xFB, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x35, +0xEF, 0x20, 0xE2, 0x31, 0x90, 0xA3, 0xFD, 0xE0, 0x20, 0xE4, 0x2A, 0x90, 0xA3, 0xF5, 0xE0, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1F, 0x90, 0xA4, 0x5C, 0xE0, 0x70, 0x19, 0x90, 0x06, 0x62, 0xE0, +0x20, 0xE1, 0x12, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, +0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x02, 0x87, 0xE0, +0x70, 0x1F, 0x90, 0x01, 0x00, 0xE0, 0x64, 0x3F, 0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, +0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE3, 0x03, 0x7F, 0x01, +0x22, 0x7F, 0x00, 0x22, 0x90, 0xA3, 0xF4, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x63, 0x9D, 0x22, 0x90, +0xA4, 0x50, 0x74, 0x04, 0xF0, 0xA3, 0x14, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x64, 0xF0, 0xA3, +0x74, 0x05, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA4, 0x5D, 0xE0, 0x30, 0xE0, 0x34, 0xC4, 0x13, 0x54, +0x07, 0x20, 0xE0, 0x2D, 0x90, 0xA6, 0x29, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x21, +0x90, 0xA4, 0x5D, 0xE0, 0x44, 0x20, 0xF0, 0xE4, 0x90, 0xA6, 0x29, 0xF0, 0x90, 0xA4, 0x5D, 0xE0, +0x13, 0x30, 0xE0, 0x0D, 0x90, 0xA3, 0xF4, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA4, 0x04, 0x74, 0xD0, +0xF0, 0x22, 0x11, 0x1F, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x0A, 0x11, 0x2B, 0x44, 0x10, 0x11, 0x1E, +0x44, 0x80, 0xF0, 0x22, 0x11, 0x2B, 0x54, 0xEF, 0x11, 0x1E, 0x44, 0x40, 0xF0, 0x22, 0xF0, 0x74, +0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xC2, 0xAF, 0x90, 0xA3, 0xC0, 0xE0, 0x54, 0xFE, 0xF0, +0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x74, 0x58, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x04, 0x24, 0xF0, 0x90, +0x02, 0x09, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x02, 0x29, 0xE0, 0x90, 0x04, 0x57, 0xF0, 0xE4, +0x90, 0xA3, 0xCC, 0xF0, 0xA3, 0xF0, 0xD2, 0xAF, 0x22, 0x90, 0x04, 0x24, 0xEF, 0xF0, 0x90, 0x04, +0x57, 0xF0, 0x22, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x02, +0x38, 0x45, 0xF0, 0x90, 0xA4, 0x02, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0xA4, +0x01, 0xE0, 0x2F, 0x22, 0x90, 0xA4, 0x62, 0xE0, 0xFF, 0x90, 0xA4, 0x61, 0xE0, 0xFB, 0x90, 0xA4, +0x63, 0xE0, 0x90, 0xA5, 0xEF, 0xF0, 0x22, 0x12, 0x45, 0x61, 0x90, 0xA4, 0x4C, 0x12, 0x08, 0x6D, +0x90, 0xA3, 0xF5, 0xE0, 0x22, 0x90, 0xA4, 0x16, 0xE0, 0x24, 0x04, 0x90, 0xA4, 0x11, 0xF0, 0xA3, +0x74, 0x0A, 0xF0, 0x22, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, +0x83, 0x22, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x6C, 0x7F, 0xFB, 0x7E, 0x01, 0x02, 0x34, 0xC1, 0x90, +0xA3, 0xF4, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, +0xE0, 0x44, 0x80, 0xF0, 0x22, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x07, 0xFF, +0x22, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x22, 0x90, 0xA4, 0x8A, 0x74, 0x09, 0xF0, +0x90, 0xA4, 0x7E, 0x22, 0x12, 0x45, 0x97, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x22, 0xE4, 0x90, 0xA5, +0xDF, 0xF0, 0x90, 0xA4, 0x5F, 0x22, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x22, 0xE5, +0x6A, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x69, 0x22, 0xFF, 0x90, 0xA6, 0x11, 0xE0, 0xFB, 0xEF, 0x5B, +0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x22, 0x7F, 0x4E, 0x12, 0x47, 0xAA, 0xEF, +0x54, 0x7F, 0x22, 0x90, 0xA5, 0xEF, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x22, 0x90, 0xA4, 0x5D, 0xE0, +0x54, 0xFB, 0xF0, 0x22, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x69, 0x08, 0x22, 0x12, 0x47, 0xAA, 0xEF, +0x44, 0x40, 0xFD, 0x22, 0xBC, 0xFE, }; -u4Byte ArrayLength_MP_8723B_FW_AP_WoWLAN = 15466; +u4Byte ArrayLength_MP_8723B_FW_AP_WoWLAN = 20886; void ODM_ReadFirmware_MP_8723B_FW_AP_WoWLAN( @@ -1604,45 +1943,45 @@ ODM_ReadFirmware_MP_8723B_FW_BT( } -// v31.00 20140813 by Isaachsu +/* v35.00 20150326 by IsaacHsu */ u1Byte Array_MP_8723B_FW_NIC[] = { -0x01, 0x53, 0x10, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x08, 0x13, 0x23, 0x37, 0x44, 0x6D, 0x00, 0x00, -0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x45, 0xED, 0x02, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x80, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x80, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x53, 0x10, 0x00, 0x23, 0x00, 0x00, 0x00, 0x03, 0x26, 0x14, 0x35, 0x4C, 0x7D, 0x00, 0x00, +0xE5, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x45, 0xCE, 0x02, 0x77, 0xEB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x79, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x78, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7F, 0xE7, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x87, 0xDF, 0x00, 0x04, 0x0C, 0x04, 0x08, 0x08, 0x0A, 0x08, 0x03, 0x03, +0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, +0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, +0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, +0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, +0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, +0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, +0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, +0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, +0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, +0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x15, 0xF0, +0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, +0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, +0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, +0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, +0x28, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, +0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x3C, 0x00, 0x64, 0x00, 0x78, 0x00, +0xA0, 0x00, 0xF0, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, +0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, +0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, +0xF0, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x01, 0x01, 0x01, +0x02, 0x01, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x02, 0x04, 0x06, 0x07, 0x07, 0x08, 0x08, +0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, +0x04, 0x05, 0x06, 0x07, 0x08, 0x19, 0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x04, 0x0C, 0x04, 0x08, +0x08, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x07, 0x0A, +0x0E, 0x11, 0x13, 0x14, 0x15, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, +0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x87, 0xDE, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x8F, 0xD1, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, -0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, -0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, -0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, -0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, -0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, -0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, -0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, -0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, -0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, -0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, -0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, -0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, -0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, -0x07, 0x08, 0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, 0x13, 0x14, 0x15, 0x04, 0x04, 0x04, 0x05, 0x07, -0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, -0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, -0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, -0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, -0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, -0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, -0x00, 0x01, 0xE0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, -0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, -0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x02, 0x04, 0x06, 0x08, 0x0A, -0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, 0x04, -0x04, 0x05, 0x05, 0x02, 0x04, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, -0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x19, -0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1664,7 +2003,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = { 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, -0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x90, 0x74, 0x01, 0x93, +0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x71, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, @@ -1674,7 +2013,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = { 0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, -0x04, 0x90, 0x46, 0x90, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, +0x04, 0x90, 0x46, 0x71, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0xDD, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, @@ -1691,1675 +2030,1930 @@ u1Byte Array_MP_8723B_FW_NIC[] = { 0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0xDD, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, -0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, -0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, -0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, -0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0, -0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE4, 0x93, 0xFC, -0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, -0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF9, -0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, -0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, -0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, -0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, -0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x46, 0x2B, -0x02, 0x43, 0x6D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, -0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, -0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, -0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x70, 0xE4, 0x7E, -0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, -0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, -0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, -0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, -0x41, 0xA2, 0x14, 0x00, 0x41, 0xA2, 0x15, 0x00, 0x41, 0xA2, 0x16, 0x00, 0x41, 0xA2, 0x1A, 0x00, -0x01, 0x70, 0x00, 0x41, 0xA2, 0x1B, 0x00, 0x41, 0xA2, 0x1C, 0x00, 0x41, 0xA2, 0x3D, 0x00, 0x00, -0x5F, 0xFB, 0x67, 0xEE, 0x70, 0x07, 0x7F, 0x67, 0xF1, 0xAF, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF1, 0xFD, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF4, 0xEF, 0xF0, -0x90, 0xA1, 0xF6, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0xE1, 0x5A, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, -0xF0, 0x12, 0x9F, 0xA2, 0x90, 0xA1, 0xF6, 0xE0, 0x70, 0x43, 0xD1, 0x96, 0x90, 0xA1, 0xF4, 0xE0, -0x70, 0x35, 0x12, 0xAC, 0xE0, 0x70, 0x16, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, 0xEC, -0xF1, 0xD0, 0xF1, 0xD6, 0x7F, 0x64, 0xF1, 0xAF, 0xEF, 0x54, 0xFE, 0x80, 0x15, 0x12, 0x37, 0x4E, -0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0xEC, 0xF1, 0xD0, 0xF1, 0xD6, 0x7F, 0x64, 0xF1, 0xAF, 0xEF, -0x44, 0x01, 0xFD, 0x7F, 0x64, 0xD1, 0xA0, 0x7F, 0x4E, 0xF1, 0xF7, 0xE1, 0xA1, 0xD1, 0x96, 0x90, -0xA1, 0xF4, 0xE0, 0x70, 0x0A, 0xF1, 0xF0, 0xE4, 0xFF, 0xFE, 0xEC, 0xF1, 0xD0, 0xF1, 0xD6, 0xF1, -0xE8, 0xF1, 0xDD, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0xD1, 0xA0, 0x12, 0x97, 0x6E, 0xE4, 0x74, 0x66, -0xFF, 0xEC, 0xF1, 0xD0, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x12, 0xAB, 0x8D, 0xEF, 0x44, -0x01, 0xFF, 0xEC, 0xF1, 0xD0, 0x12, 0x67, 0xD1, 0x80, 0x50, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, -0xF0, 0x12, 0x9F, 0xAA, 0x90, 0xA1, 0xF4, 0xE0, 0x70, 0x35, 0x90, 0xA1, 0xF6, 0xE0, 0x60, 0x08, -0xD1, 0x96, 0xF1, 0xF0, 0xE4, 0xFF, 0x80, 0x21, 0x7F, 0x67, 0xF1, 0xAF, 0xEF, 0x54, 0xDF, 0xFD, -0x7F, 0x67, 0xD1, 0xA0, 0x12, 0xAC, 0xE0, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x80, 0xFF, -0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0xF1, 0xD0, 0xF1, 0xD6, 0xF1, -0xE8, 0xF1, 0xDD, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0xD1, 0xA0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0xA2, 0x32, 0xF1, -0xFD, 0x90, 0xA2, 0x32, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xC5, 0xB1, 0x71, -0x90, 0xAA, 0xB9, 0x02, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x02, 0x38, 0x45, 0xFD, 0x7F, 0x4E, -0xD1, 0xA0, 0x7F, 0x4F, 0xF1, 0xAF, 0xEF, 0x22, 0x7F, 0x4E, 0xF1, 0xAF, 0xEF, 0x54, 0x7F, 0x22, -0x7F, 0x48, 0x7E, 0x09, 0x02, 0x37, 0x4E, 0xF1, 0xAF, 0xEF, 0x44, 0x80, 0x22, 0xF0, 0x7F, 0x10, -0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0xA0, 0xC1, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, -0x0E, 0x90, 0xA0, 0xCE, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75, 0xF0, 0x0E, 0xEF, 0x90, 0xA0, 0xCD, -0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA1, 0xDA, 0xF0, 0x90, 0xA1, 0xD9, 0xEE, 0xF0, 0xE4, 0xFB, 0xFD, -0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xD5, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xD9, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, -0x90, 0xA1, 0xD5, 0x12, 0x97, 0x97, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x90, 0xA0, 0xC1, 0xE0, 0x30, 0xE0, 0x5D, 0x90, 0xA0, 0xC3, 0xE0, 0x70, 0x2A, 0x7D, 0x16, -0x7F, 0x6F, 0x31, 0x22, 0x91, 0x22, 0x51, 0x4C, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0x11, 0xC6, 0x51, -0x4C, 0x54, 0x07, 0x12, 0xA4, 0xFC, 0xE0, 0x44, 0x01, 0x12, 0xA9, 0x18, 0xA3, 0x74, 0x03, 0x11, -0x2C, 0x90, 0xA0, 0xC3, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0xC3, 0xE0, 0x64, 0x01, 0x70, 0x23, -0x90, 0xA0, 0xC1, 0xE0, 0x12, 0xA4, 0xF7, 0xE0, 0x30, 0xE0, 0x18, 0x75, 0xF0, 0x0E, 0xEF, 0x11, -0xC6, 0xE4, 0x90, 0xA1, 0xD9, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, -0x01, 0x01, 0x34, 0x31, 0x2D, 0x22, 0x90, 0xA0, 0xD0, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x7E, 0x00, -0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xDB, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1C, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, -0xE0, 0xF0, 0x7D, 0x13, 0x91, 0x1E, 0xBF, 0x01, 0x02, 0x91, 0xFF, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, -0x7D, 0x15, 0x31, 0x22, 0x80, 0x02, 0x91, 0xFF, 0xF1, 0x09, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x90, 0xA0, 0xD0, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x7E, 0x00, 0xE4, 0xFD, 0x11, 0xD2, 0xE4, -0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x9E, 0x96, 0xED, 0xF0, 0x22, 0x90, 0xA0, 0xC1, -0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54, 0x07, 0x25, 0xE0, 0x4F, -0xF0, 0xA3, 0xE0, 0xFF, 0x12, 0xAC, 0x6F, 0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x11, 0x05, -0xE4, 0x90, 0xA0, 0xC3, 0xF0, 0x91, 0x22, 0x12, 0xAC, 0x6F, 0x12, 0xAB, 0xD9, 0xE0, 0xFA, 0x75, -0xF0, 0x0E, 0xED, 0xF1, 0xB7, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, -0x12, 0xAC, 0xF1, 0xAF, 0x02, 0x12, 0xA6, 0x91, 0x51, 0x4C, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0xF1, -0xB7, 0x12, 0xAC, 0x65, 0xFD, 0x51, 0x53, 0x51, 0x4C, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, -0xA0, 0xCF, 0x12, 0x45, 0xA9, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0E, 0xEF, 0x31, 0x11, 0x51, 0x4C, -0x54, 0x07, 0xFD, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x0C, 0xEF, -0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0x0E, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, -0x02, 0x41, 0x47, 0x90, 0xA2, 0x0D, 0xE0, 0xFE, 0x12, 0xA8, 0x09, 0x75, 0xF0, 0x03, 0xEF, 0x12, -0xAC, 0x02, 0xE0, 0x90, 0xA2, 0x0F, 0xF0, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x24, 0x90, 0xA2, 0x0F, -0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x12, 0xA7, 0x8B, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, 0x0E, -0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0x78, 0xEE, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, -0x20, 0x12, 0xAC, 0x79, 0x75, 0xF0, 0x0E, 0x12, 0xA7, 0x8B, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, -0x0E, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0x78, 0xEE, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, -0x5F, 0x90, 0xA2, 0x0F, 0xF0, 0x12, 0xAC, 0x79, 0x12, 0xA8, 0x09, 0xC0, 0x83, 0xC0, 0x82, 0x90, -0xA2, 0x0E, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0xAC, 0x02, 0xEF, 0xF0, 0x90, -0xA2, 0x0E, 0xE0, 0x04, 0xF0, 0x21, 0xB7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0xC1, 0xE0, -0xC3, 0x13, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x36, 0xED, 0xF0, 0xEF, -0x14, 0x60, 0x02, 0x61, 0x10, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA2, 0x36, 0xE0, -0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA1, -0x88, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x8C, 0x12, 0x08, 0x79, 0x00, 0x00, -0x00, 0x01, 0x71, 0xD6, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x8C, 0x12, 0x08, -0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x71, 0xDA, 0x12, 0x08, 0x79, 0x00, 0x00, -0x00, 0x10, 0x12, 0xAB, 0x52, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0xF1, 0xC7, 0x7F, 0x00, -0x7E, 0x0A, 0x71, 0xDA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x12, 0xAB, 0x52, 0x78, 0x0A, -0xF1, 0xC7, 0x7F, 0x00, 0x7E, 0x0D, 0x71, 0xDA, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x12, -0xAB, 0x52, 0x78, 0x1A, 0xF1, 0xC7, 0x7F, 0x18, 0x71, 0xD8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, -0x00, 0x90, 0xA1, 0x8C, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xDA, 0x12, 0x08, 0x79, -0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x7A, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x58, -0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0x88, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, -0x01, 0x90, 0xA1, 0x8C, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x71, 0xD6, 0x12, 0x08, 0x79, -0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x8C, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, -0x7E, 0x09, 0x71, 0xDA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x8C, 0x12, 0x08, -0x79, 0x00, 0x00, 0x0C, 0x00, 0xF1, 0xDA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, -0x7A, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x12, 0xA6, -0x19, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x86, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA1, 0x90, 0x12, 0x08, 0x6D, 0x90, 0xA1, -0x88, 0x12, 0x45, 0x71, 0x12, 0x08, 0x3A, 0x90, 0xA1, 0x90, 0xF1, 0xF0, 0xC0, 0x04, 0xC0, 0x05, -0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA1, 0x88, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x8C, 0xF1, 0xF0, 0xD0, -0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA1, 0x94, 0x12, 0x08, 0x6D, -0x90, 0xA1, 0x94, 0x12, 0x47, 0xCE, 0x90, 0xA1, 0x86, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, -0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x00, 0x7E, 0x08, 0x71, 0x76, 0x90, 0xA1, 0x88, 0x22, -0x8F, 0x54, 0x7D, 0x17, 0x91, 0x1E, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x12, 0xAB, 0xDD, 0xE0, 0xFC, -0xF1, 0xB2, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFB, 0x90, 0xA0, 0xC1, 0xE0, -0xFE, 0x12, 0xAC, 0xF1, 0xAF, 0x04, 0x12, 0xA6, 0x91, 0xF1, 0xB2, 0x12, 0xAC, 0x65, 0xFD, 0x51, -0x53, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x31, 0x11, 0xAD, 0x54, 0xE4, 0xFF, 0x21, 0xA5, 0x7F, 0xFF, -0x31, 0x22, 0xE4, 0x90, 0xA2, 0x2C, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, -0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xF1, 0xD0, -0x30, 0xE0, 0x15, 0xD3, 0x90, 0xA2, 0x2D, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0x2C, 0xE0, 0x94, 0x00, -0x40, 0x02, 0x80, 0x13, 0x7F, 0x01, 0x80, 0x1B, 0xD3, 0x90, 0xA2, 0x2D, 0xE0, 0x94, 0xE8, 0x90, -0xA2, 0x2C, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, -0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2, 0x2C, 0x12, 0x96, 0x39, 0x80, 0xA9, -0x90, 0xA0, 0x66, 0xE0, 0x44, 0x02, 0xF0, 0x7D, 0x08, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x90, 0xA1, 0xE6, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x9E, 0x94, 0xE0, 0x04, 0xF0, -0x90, 0x04, 0x1D, 0xE0, 0x60, 0x33, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xEA, 0xF0, 0x7D, 0x26, -0x91, 0x1E, 0xEF, 0x64, 0x01, 0x70, 0x07, 0xD1, 0xB9, 0x20, 0xE0, 0x0F, 0x80, 0x0A, 0xF1, 0xD0, -0x30, 0xE0, 0x08, 0xD1, 0xB9, 0x20, 0xE0, 0x03, 0x12, 0xA9, 0xC1, 0x90, 0xA1, 0xEA, 0xE0, 0xFF, -0x7D, 0x27, 0x31, 0x22, 0x12, 0xAA, 0x45, 0x80, 0x0B, 0x12, 0xAA, 0x45, 0xD1, 0xB9, 0x20, 0xE0, -0x03, 0x12, 0xA9, 0xC1, 0x90, 0xA0, 0x5F, 0xE0, 0x30, 0xE0, 0x0B, 0xF1, 0xD0, 0x30, 0xE0, 0x06, -0xF1, 0xF6, 0x7D, 0x28, 0x31, 0x22, 0xF1, 0x09, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0xA1, 0xDB, 0xA3, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0xB1, 0x59, 0x90, 0xA1, 0xDE, 0xEE, 0xF0, -0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xDD, 0xE0, 0xFF, 0xF1, 0xA6, 0x54, 0x3F, 0xF0, 0xEF, -0x60, 0x2C, 0xF1, 0xE4, 0x44, 0x10, 0xF0, 0xF1, 0xA6, 0x44, 0x80, 0xF0, 0x12, 0x9B, 0xBB, 0x30, -0xE0, 0x26, 0x12, 0x86, 0xCA, 0x50, 0x0E, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x2B, 0x2D, -0xF1, 0x92, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF1, 0x92, 0x74, 0x7F, 0xF0, 0x22, 0xF1, 0xE4, -0x54, 0xEF, 0xF0, 0xF1, 0xA6, 0x44, 0x40, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0xA2, 0x21, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0x20, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, -0x12, 0xAA, 0xF9, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA2, 0x20, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, -0xA2, 0x21, 0xE0, 0x60, 0x06, 0x12, 0xAC, 0x32, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x12, 0xAC, 0x32, 0x54, 0xC0, -0xF0, 0xAF, 0x05, 0xF1, 0x9B, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0xA2, 0x22, 0xE0, 0x25, 0xE0, 0x25, -0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0xF1, 0x9B, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0x12, 0xAA, -0x3D, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2F, 0xF1, 0xE7, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x10, 0xEF, -0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1F, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0x13, 0xF0, 0x7D, -0x29, 0x91, 0x1E, 0xBF, 0x01, 0x05, 0x12, 0xAB, 0x1B, 0xB1, 0x1A, 0x90, 0xA2, 0x13, 0xE0, 0xFF, -0x7D, 0x2A, 0x31, 0x22, 0x80, 0x05, 0x12, 0xAB, 0x1B, 0xB1, 0x1A, 0xF1, 0x09, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xEB, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xEF, 0xF0, 0x7D, -0x36, 0x91, 0x1E, 0xBF, 0x01, 0x03, 0x12, 0xAA, 0xB0, 0x90, 0xA1, 0xEF, 0xE0, 0xFF, 0x7D, 0x37, -0x31, 0x22, 0x80, 0x03, 0x12, 0xAA, 0xB0, 0xF1, 0xF6, 0x7D, 0x38, 0x31, 0x22, 0xF1, 0x09, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x2B, 0xEF, 0xF1, 0xBF, 0x12, 0xAD, 0x19, 0x54, 0x1F, 0x20, -0xE0, 0x0D, 0x90, 0xA1, 0x2C, 0xE0, 0xB4, 0x01, 0x06, 0x7D, 0x36, 0x7F, 0x6F, 0x31, 0x22, 0x90, -0xA1, 0x2B, 0xE0, 0x70, 0x0B, 0x90, 0xA1, 0x2D, 0xE0, 0xFF, 0x7D, 0x05, 0x91, 0x8B, 0x80, 0x26, -0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x01, 0x09, 0x90, 0xA1, 0x2D, 0xE0, 0xFF, 0xB1, 0xD5, 0x80, 0x16, -0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA0, 0xBB, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0xD1, 0x12, 0x12, 0xAD, 0x19, 0x54, 0x1F, 0x20, 0xE0, 0x0A, 0x90, 0xA1, -0x2C, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x31, 0x22, 0x22, 0x90, 0x9E, 0x9A, 0xE0, 0xFF, 0x90, 0xA1, -0xE7, 0xE0, 0xFB, 0x7D, 0x01, 0xB1, 0x59, 0x90, 0xA1, 0xE8, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, -0xFD, 0x90, 0xA1, 0xE6, 0xE0, 0xFF, 0xB1, 0x1A, 0x90, 0xA0, 0xC1, 0xE0, 0x22, 0x90, 0xA1, 0x2C, -0xEF, 0xF1, 0xBF, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0x31, -0xF0, 0x7D, 0x01, 0x91, 0x1E, 0xEF, 0x64, 0x01, 0x70, 0x02, 0xF1, 0x10, 0x90, 0xA1, 0x31, 0xE0, -0xFF, 0x7D, 0x02, 0x31, 0x22, 0x80, 0x02, 0xF1, 0x10, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, -0x90, 0x9E, 0x9C, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0xB1, 0x59, 0x90, 0xA1, 0x2F, 0xEE, 0xF0, -0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, -0xA1, 0x36, 0xF0, 0x90, 0xA1, 0x33, 0xEC, 0xF1, 0xBF, 0x90, 0xA1, 0x33, 0xE0, 0xFC, 0xA3, 0xE0, -0xFD, 0xB1, 0x1A, 0x90, 0xA1, 0x33, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D, 0x12, 0xAA, 0x35, 0xE0, -0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, 0x12, 0xAA, 0x35, 0xE0, 0x54, 0xEF, 0xF1, 0x9A, 0xE0, 0x44, -0x02, 0xF1, 0x9A, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA1, 0x35, 0xE0, 0xFF, 0x90, 0xA1, 0x33, 0xA3, -0xE0, 0xFE, 0x24, 0x2A, 0x12, 0xAA, 0xEF, 0x90, 0xA1, 0x36, 0xE0, 0xFF, 0xF1, 0x8F, 0xEF, 0xF0, -0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x74, -0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x22, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x90, 0xA0, 0xC5, 0x12, 0x45, 0xA9, 0xE0, 0x22, 0xF0, -0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x22, 0x12, 0x08, 0x5A, 0x90, 0xA1, 0x8C, 0x02, 0x08, 0x6D, -0x90, 0xA0, 0x63, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0x71, 0x76, -0x90, 0xA1, 0x76, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, -0x12, 0x45, 0x8D, 0x02, 0x45, 0x46, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7E, 0xE8, 0x20, 0xE6, 0x02, 0x01, 0xDB, 0x90, 0x00, 0x8C, -0xE0, 0xF5, 0x6E, 0x7F, 0x8D, 0x12, 0x47, 0xAF, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x6F, 0xEF, 0x24, -0xFC, 0x60, 0x0D, 0x24, 0x03, 0x60, 0x02, 0x01, 0xD2, 0xAF, 0x6E, 0x12, 0x7E, 0x96, 0x01, 0xD2, -0x74, 0x11, 0x25, 0x6E, 0x12, 0x76, 0x3C, 0xE0, 0xFB, 0xE4, 0xFD, 0x31, 0x0A, 0x31, 0x19, 0x13, -0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0x31, 0x0A, 0x31, 0x19, 0xD1, 0xE5, 0xFB, 0x0D, 0xE4, 0x31, -0x0A, 0x31, 0x19, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0x31, 0x0A, 0xF1, 0xEF, 0xE0, 0xFB, 0xE4, -0xFD, 0x0F, 0x31, 0x0B, 0x90, 0x96, 0x12, 0x11, 0xE0, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0xD1, 0x3C, -0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x31, 0x0B, 0xD1, 0x3C, 0x54, 0x1F, 0xFB, 0x0D, -0x11, 0xE6, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x00, 0xD1, 0xF7, 0x75, 0xF0, 0x08, 0xE5, -0x6E, 0x90, 0x89, 0x01, 0x11, 0xE0, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x02, 0x11, 0xE0, -0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x03, 0x11, 0xE0, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, -0x89, 0x04, 0xD1, 0xF7, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x05, 0x11, 0xE0, 0x75, 0xF0, -0x08, 0xE5, 0x6E, 0x90, 0x89, 0x06, 0x11, 0xE0, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x07, -0x11, 0xE0, 0x12, 0x7E, 0xE8, 0x30, 0xE0, 0x03, 0x12, 0x7F, 0x58, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x12, 0x45, 0xA9, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, -0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, -0x08, 0x74, 0xFC, 0x2D, 0x12, 0xA1, 0x89, 0xEB, 0xF0, 0x22, 0xFF, 0x11, 0xE6, 0x75, 0xF0, 0x04, -0xE5, 0x6E, 0x22, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, -0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x12, 0x6A, 0x87, 0xFF, 0x54, 0x1F, 0xF5, 0x53, -0xEF, 0x54, 0x80, 0xD1, 0xE5, 0xF5, 0x52, 0xD1, 0xDE, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, -0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0xD1, 0xDE, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, -0xF5, 0x55, 0xEF, 0x54, 0x80, 0xD1, 0xE5, 0xF5, 0x56, 0xD1, 0xDE, 0xFF, 0x54, 0x08, 0x13, 0x13, -0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, -0x12, 0xAC, 0xB3, 0x31, 0x13, 0x54, 0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x12, 0x61, 0xC8, 0x31, 0x13, -0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x70, 0x74, 0xE5, 0x53, 0x54, 0x1F, 0xD1, 0x36, 0x54, 0xE0, -0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0x31, 0x13, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0, 0x25, -0xE0, 0x31, 0x13, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xD1, -0x36, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0x31, 0x13, 0x54, 0xCF, -0x4F, 0xD1, 0x54, 0xE0, 0x54, 0xFB, 0xD1, 0x54, 0xE0, 0xFF, 0xE5, 0x5A, 0x25, 0xE0, 0x25, 0xE0, -0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, -0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0xD1, 0x4B, 0x25, 0x58, 0xB1, 0x36, 0xEF, -0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, 0x04, 0xDF, 0xAF, 0x51, 0x71, 0x22, 0x22, 0x90, 0xA0, 0xFE, -0x12, 0x45, 0xBE, 0x90, 0xA0, 0xFD, 0xEF, 0xF0, 0x12, 0x45, 0xC7, 0x52, 0x6F, 0x00, 0x52, 0x74, -0x01, 0x52, 0x79, 0x02, 0x52, 0x7E, 0x10, 0x52, 0x83, 0x11, 0x52, 0x87, 0x12, 0x52, 0x8C, 0x14, -0x52, 0x91, 0x20, 0x52, 0x96, 0x21, 0x52, 0x9B, 0x23, 0x52, 0xA0, 0x24, 0x52, 0xA5, 0x25, 0x52, -0xAA, 0x27, 0x52, 0xAF, 0x28, 0x52, 0xB4, 0x40, 0x52, 0xB8, 0x42, 0x52, 0xBC, 0x60, 0x52, 0xC1, -0x61, 0x52, 0xC6, 0x62, 0x52, 0xCB, 0x63, 0x52, 0xD0, 0x64, 0x52, 0xD5, 0x65, 0x52, 0xDA, 0x66, -0x52, 0xDF, 0x67, 0x52, 0xE4, 0x68, 0x52, 0xE9, 0x69, 0x52, 0xEE, 0x6B, 0x52, 0xF3, 0x6C, 0x52, -0xF8, 0x6D, 0x52, 0xFD, 0x6E, 0x53, 0x02, 0x6F, 0x53, 0x07, 0x70, 0x00, 0x00, 0x53, 0x0C, 0x71, -0x1C, 0x02, 0x6D, 0x37, 0x71, 0x1C, 0x02, 0x7F, 0x6D, 0x71, 0x1C, 0x02, 0x9C, 0x55, 0x71, 0x1C, -0x02, 0x9C, 0x93, 0x71, 0x1C, 0xE1, 0x0F, 0x71, 0x1C, 0x02, 0x9A, 0x35, 0x71, 0x1C, 0x02, 0x9C, -0xB6, 0x71, 0x1C, 0x02, 0x69, 0x41, 0x71, 0x1C, 0x02, 0x9C, 0xC5, 0x71, 0x1C, 0x02, 0x9D, 0x04, -0x71, 0x1C, 0x02, 0x5C, 0xDE, 0x71, 0x1C, 0x02, 0x9D, 0x0C, 0x71, 0x1C, 0x02, 0x89, 0x61, 0x71, -0x1C, 0x02, 0x9D, 0x4F, 0x71, 0x1C, 0x21, 0x21, 0x71, 0x1C, 0xC1, 0x61, 0x71, 0x1C, 0x02, 0x6A, -0x8D, 0x71, 0x1C, 0x02, 0x93, 0x0A, 0x71, 0x1C, 0x02, 0x6F, 0xCB, 0x71, 0x1C, 0x02, 0x9D, 0xFC, -0x71, 0x1C, 0x02, 0x9E, 0x29, 0x71, 0x1C, 0x02, 0x9E, 0x87, 0x71, 0x1C, 0x02, 0x6E, 0x45, 0x71, -0x1C, 0x02, 0x98, 0x97, 0x71, 0x1C, 0x02, 0x9E, 0x10, 0x71, 0x1C, 0x02, 0x6D, 0x70, 0x71, 0x1C, -0x02, 0x9E, 0x95, 0x71, 0x1C, 0x02, 0x6F, 0x00, 0x71, 0x1C, 0x02, 0x92, 0xBB, 0x71, 0x1C, 0x02, -0x9F, 0x80, 0x71, 0x1C, 0x02, 0x9D, 0x78, 0x71, 0x1C, 0x02, 0x9F, 0xB2, 0x90, 0x01, 0xC0, 0xE0, -0x44, 0x01, 0xF0, 0x90, 0xA0, 0xFD, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x90, 0xA0, 0xFE, 0x02, -0x45, 0xB5, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x04, 0xEF, 0xF0, 0x75, 0xF0, -0x04, 0xD1, 0x3C, 0x54, 0x1F, 0xFB, 0x60, 0x12, 0x64, 0x02, 0x60, 0x0E, 0xEB, 0x64, 0x04, 0x60, -0x09, 0xEB, 0x64, 0x09, 0x60, 0x04, 0xEB, 0xB4, 0x0C, 0x0A, 0x12, 0xAC, 0x0E, 0xF5, 0x83, 0x74, -0x02, 0xF0, 0x80, 0x08, 0x12, 0xAC, 0x0E, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xE4, 0xF5, 0x6B, 0x90, -0xA2, 0x04, 0xE0, 0xFD, 0xD1, 0x48, 0x25, 0x6B, 0xB1, 0x36, 0xE0, 0xFE, 0xEB, 0x75, 0xF0, 0x07, -0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x6B, 0xB1, 0x36, -0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, 0xA2, 0x07, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x31, 0x19, 0x54, -0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x6B, 0x70, 0x07, 0x90, 0xA2, 0x07, 0xE0, 0x54, 0xF0, 0xF0, -0x90, 0xA2, 0x07, 0xE0, 0xFF, 0xD1, 0x44, 0x25, 0x6B, 0xB1, 0x36, 0xEF, 0xF0, 0x05, 0x6B, 0xE5, -0x6B, 0x64, 0x07, 0x70, 0xAA, 0x90, 0xA2, 0x04, 0xE0, 0x75, 0xF0, 0x04, 0x31, 0x19, 0xFF, 0xC4, -0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA2, 0x05, 0xF0, 0x75, 0x6C, 0x06, 0xE5, 0x6C, 0xB4, 0x06, 0x07, -0xB1, 0x25, 0xE0, 0x54, 0x0F, 0x80, 0x07, 0xD1, 0x44, 0x25, 0x6C, 0xB1, 0x36, 0xE0, 0x90, 0xA2, -0x06, 0xF0, 0x90, 0xA2, 0x06, 0xE0, 0x60, 0x33, 0x75, 0x6B, 0x07, 0x12, 0xAC, 0xF9, 0x80, 0x05, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0xAC, 0xC5, 0x60, 0x16, 0x12, 0xAC, 0xBC, 0x90, -0xA2, 0x05, 0xF0, 0xED, 0x60, 0x22, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x1C, 0xE0, 0x24, 0x20, 0xF0, -0x80, 0x16, 0x15, 0x6B, 0xE5, 0x6B, 0xC3, 0x94, 0x00, 0x50, 0xD0, 0xE5, 0x6C, 0x60, 0x09, 0x15, -0x6C, 0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x50, 0xA3, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, 0x06, -0x07, 0xB1, 0x25, 0xE0, 0x54, 0x0F, 0x80, 0x07, 0xD1, 0x44, 0x25, 0x6C, 0xB1, 0x36, 0xE0, 0x90, -0xA2, 0x06, 0xF0, 0x90, 0xA2, 0x06, 0xE0, 0x60, 0x2E, 0xE4, 0xF5, 0x6B, 0x12, 0xAC, 0xF9, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0xAC, 0xC5, 0x60, 0x13, 0x12, 0xAC, 0xBC, -0xFC, 0xED, 0x60, 0x1B, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x15, 0x74, 0x20, 0x2C, 0xFC, 0x80, 0x0F, -0x05, 0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xD5, 0x05, 0x6C, 0xE5, 0x6C, 0x64, 0x07, 0x70, 0xAD, 0x90, -0xA2, 0x05, 0xE0, 0xFF, 0x90, 0xA2, 0x04, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xF1, 0xEF, 0xEF, 0xF0, -0x75, 0xF0, 0x04, 0xEE, 0xD1, 0xF1, 0xEC, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x12, 0x7B, 0x91, 0xE0, -0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3, 0x9F, 0x40, 0x09, 0x90, -0xA2, 0x05, 0xE0, 0x4E, 0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C, 0x50, 0x06, 0xAF, 0x06, -0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA2, 0x04, 0xE0, 0xFF, 0x24, 0x91, 0x12, 0xAB, 0x85, 0xE5, 0x6D, -0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x19, 0x12, 0x7B, 0xA3, 0x90, 0xA2, 0x04, 0xE0, 0xFF, 0xE4, -0xFB, 0xAD, 0x6D, 0x12, 0x77, 0x89, 0x90, 0xA2, 0x04, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x12, 0x79, -0x4E, 0xE4, 0xF0, 0x90, 0xA2, 0x05, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x08, 0x12, 0xA5, 0xA8, -0x74, 0x02, 0xF0, 0x80, 0x1B, 0xEE, 0xC3, 0x94, 0x04, 0x90, 0xA2, 0x04, 0xE0, 0x40, 0x0A, 0x24, -0x91, 0x12, 0xA5, 0xAB, 0x74, 0x01, 0xF0, 0x80, 0x07, 0x24, 0x91, 0x12, 0xA5, 0xAB, 0xE4, 0xF0, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFF, 0x90, 0xA2, 0x04, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, -0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE4, 0xFF, -0xE4, 0xFE, 0x74, 0x91, 0x2F, 0xD1, 0x59, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, -0x81, 0x00, 0xBE, 0x03, 0x0D, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xB1, 0x36, 0x74, 0x80, 0xF0, -0x80, 0x0A, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xB1, 0x36, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, -0xD1, 0x4B, 0x2E, 0xB1, 0x36, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xC7, 0x0F, 0xBF, 0x80, 0xC1, 0xE4, -0x90, 0xAD, 0xE2, 0xF0, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x12, 0x7A, 0x8A, 0x75, 0xF0, -0x02, 0xEE, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x0E, 0xBE, 0x05, 0xEA, 0x74, 0x91, 0x2F, -0x12, 0xAB, 0x85, 0x74, 0x13, 0xF0, 0x74, 0x11, 0x2F, 0x12, 0xAB, 0x65, 0xE4, 0xF0, 0x74, 0x01, -0x2F, 0x12, 0x76, 0x14, 0x74, 0xC0, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, -0x83, 0xE4, 0x12, 0x7A, 0xC0, 0x12, 0xAB, 0xAA, 0xF1, 0xEA, 0x74, 0x13, 0xD1, 0xEC, 0xE4, 0xF0, -0x75, 0xF0, 0x04, 0xEF, 0xD1, 0x3C, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, -0x19, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x19, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, -0xEF, 0xD1, 0x3C, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x19, 0x54, 0xCF, 0xF0, 0x75, -0xF0, 0x04, 0xEF, 0x31, 0x19, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x19, 0x54, 0x7F, -0xD1, 0xEC, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x12, 0x7B, 0x91, 0xEE, 0xF0, 0x74, 0x91, 0x2F, -0xD1, 0x59, 0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0xA1, 0x85, 0x74, 0x11, 0x2F, 0x12, -0x98, 0x8F, 0x74, 0xFF, 0xF0, 0x22, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x13, 0x12, -0x45, 0xA9, 0xE0, 0x22, 0x90, 0xA2, 0x04, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, -0xA9, 0xE5, 0x82, 0x22, 0xF0, 0x74, 0x91, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, -0x22, 0x12, 0x6F, 0x66, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x91, 0xD1, 0x59, 0xE0, 0x54, 0x9C, -0xD1, 0x54, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0x01, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, -0x83, 0xD1, 0x54, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0x01, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, -0xD0, 0x83, 0xD1, 0x54, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0x01, 0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, -0x82, 0xD0, 0x83, 0xD1, 0x54, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0x01, 0x54, 0x20, 0xFE, 0xEF, 0x4E, -0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x08, 0xD1, 0xDE, 0xFF, 0x12, -0x76, 0x38, 0xEF, 0xF0, 0xD1, 0x55, 0xE0, 0x30, 0xE5, 0x11, 0x31, 0x14, 0x13, 0x13, 0x54, 0x03, -0xFB, 0x12, 0x76, 0x38, 0xE0, 0xFD, 0xAF, 0x51, 0x12, 0xA5, 0xB3, 0x22, 0x4F, 0xF0, 0x90, 0x00, -0x02, 0x02, 0x06, 0xA2, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0xF0, 0x75, 0xF0, 0x04, -0xEF, 0x90, 0x96, 0x12, 0x02, 0x45, 0xA9, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x01, -0xE6, 0xE0, 0xFF, 0x90, 0xA1, 0x01, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x02, 0x06, 0xA2, 0x12, -0x7F, 0xC2, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x18, 0x90, 0xA0, 0xC1, 0xE0, -0x54, 0xFE, 0xF0, 0x12, 0x88, 0xA9, 0xF1, 0xE3, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFF, 0x12, 0x4B, -0xE0, 0x02, 0xA7, 0x11, 0xF1, 0xE3, 0x12, 0x6A, 0x87, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, -0x12, 0xAB, 0xD9, 0xEF, 0xD1, 0xDD, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x0E, 0xED, 0x12, 0x4F, 0xB7, -0x54, 0xFC, 0xD1, 0xDC, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0x75, 0xF0, 0x0E, 0x12, 0x4F, -0xB7, 0x54, 0xE3, 0xD1, 0xDC, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x12, 0x4F, 0xB7, 0x54, -0x1F, 0x4F, 0x12, 0x6D, 0x27, 0x12, 0xAC, 0xE9, 0xE4, 0xFB, 0x12, 0xA7, 0x9B, 0xF1, 0xE3, 0x12, -0x6A, 0x7A, 0x12, 0xAC, 0xE9, 0x7B, 0x01, 0x12, 0xA7, 0x9B, 0xF1, 0xE3, 0xF1, 0x09, 0x12, 0x9D, -0x71, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xCD, 0x12, 0x45, -0xA9, 0xEF, 0xF0, 0xF1, 0x09, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0xED, 0x90, 0xA0, -0xCE, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70, 0x23, 0x90, -0xA0, 0xC2, 0xEF, 0xF0, 0x12, 0x6A, 0x80, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA0, 0xC1, -0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, 0x01, 0xF0, 0x7D, 0x20, 0xE4, 0xFF, 0x12, -0x88, 0xD0, 0x22, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x22, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, -0x96, 0x11, 0x02, 0x45, 0xA9, 0x7F, 0xF4, 0x12, 0x47, 0xAF, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, -0x12, 0x47, 0xAF, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x12, -0x57, 0xF5, 0x90, 0x9E, 0x97, 0xEF, 0xF0, 0x11, 0x4E, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, -0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0xFC, 0x44, 0x04, -0xFD, 0x7F, 0x17, 0x12, 0x46, 0xA0, 0x12, 0xAC, 0xA1, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x12, 0x46, -0xA0, 0x7F, 0x38, 0x12, 0xAD, 0x39, 0x7F, 0x38, 0x12, 0x46, 0xA0, 0x02, 0x37, 0x99, 0x11, 0x7E, -0x11, 0xAC, 0x12, 0xA1, 0x9C, 0x12, 0xA1, 0xBB, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, -0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0x12, 0x46, 0xA0, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x46, 0xA0, -0xAD, 0x0F, 0x7F, 0x52, 0x12, 0x46, 0xA0, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x46, 0xA0, 0x90, 0x01, -0x30, 0xE4, 0x11, 0xA4, 0x90, 0x01, 0x38, 0x11, 0xA4, 0xFD, 0x7F, 0x50, 0x12, 0x46, 0xA0, 0xE4, -0xFD, 0x7F, 0x51, 0x12, 0x46, 0xA0, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x46, 0xA0, 0xE4, 0xFD, 0x7F, -0x53, 0x02, 0x46, 0xA0, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x34, 0x74, -0xFF, 0x11, 0xA4, 0x90, 0x01, 0x3C, 0x11, 0xA4, 0xFD, 0x7F, 0x54, 0x12, 0x46, 0xA0, 0x7D, 0xFF, -0x7F, 0x55, 0x12, 0x46, 0xA0, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46, 0xA0, 0x7D, 0xFF, 0x7F, 0x57, -0x02, 0x46, 0xA0, 0xEF, 0x64, 0x01, 0x70, 0x20, 0x91, 0xA7, 0x90, 0x01, 0x38, 0xE4, 0x11, 0xA4, -0x90, 0x01, 0x30, 0x11, 0xA4, 0x90, 0x01, 0x30, 0x74, 0x10, 0xF0, 0x90, 0x01, 0x39, 0x74, 0x01, -0xF0, 0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0x12, 0x97, 0xAD, 0x90, 0xA0, 0x5C, 0xE0, 0x90, -0x01, 0x31, 0xF0, 0x90, 0xA0, 0x5D, 0xE0, 0x90, 0x01, 0x32, 0xF0, 0x90, 0xA0, 0x5E, 0xE0, 0x90, -0x01, 0x33, 0xF0, 0x90, 0xA0, 0x57, 0xE0, 0x90, 0x01, 0x38, 0xF0, 0x90, 0xA0, 0x5A, 0xE0, 0x90, -0x01, 0x3B, 0x91, 0xC6, 0x7F, 0x01, 0x51, 0x85, 0x7E, 0x00, 0x7F, 0xA8, 0x7D, 0x00, 0x7B, 0x01, -0x7A, 0x9F, 0x79, 0xA3, 0x12, 0x08, 0xAA, 0x12, 0xAB, 0xE3, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0xA6, -0x74, 0x02, 0xF0, 0x90, 0x9F, 0xAD, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9F, -0xB3, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0x12, 0xAB, 0xBA, 0xE4, 0xFD, 0xFF, 0x51, 0x1E, 0x7D, 0x0C, -0x7F, 0x02, 0x51, 0x1E, 0x51, 0x1A, 0x90, 0x9E, 0x97, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x9F, 0xB2, -0x74, 0xDD, 0xF0, 0x80, 0x12, 0x90, 0x9E, 0x97, 0xE0, 0x90, 0x9F, 0xB2, 0xB4, 0x03, 0x05, 0x74, -0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0x03, 0xFF, -0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x47, 0xAF, 0xEF, 0x30, 0xE2, 0x06, 0x90, 0x9F, 0xDD, 0x74, -0x02, 0xF0, 0x12, 0x9C, 0xF1, 0x74, 0x05, 0x12, 0xAB, 0xBA, 0x90, 0xA0, 0x56, 0xE0, 0x54, 0xFE, -0xF0, 0x90, 0x01, 0x38, 0xE0, 0x90, 0xA0, 0x57, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90, 0xA0, 0x58, -0xF0, 0x90, 0x01, 0x3A, 0xE0, 0x90, 0xA0, 0x59, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90, 0xA0, 0x5A, -0xF0, 0x90, 0x01, 0x30, 0xE0, 0x90, 0xA0, 0x5B, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90, 0xA0, 0x5C, -0xF0, 0x90, 0x01, 0x32, 0xE0, 0x90, 0xA0, 0x5D, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90, 0xA0, 0x5E, -0xF0, 0x7F, 0x01, 0x12, 0x8F, 0x8A, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, -0x79, 0x4F, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0x12, 0xAC, 0xAA, 0x91, 0x93, -0xE4, 0x90, 0xA0, 0x51, 0xF0, 0x22, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x38, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, -0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, -0x80, 0x0C, 0x90, 0x9F, 0xAA, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x9F, 0xA9, 0xED, 0xF0, 0x12, 0x7E, -0xE8, 0x30, 0xE4, 0x2C, 0x90, 0xA2, 0x38, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x18, 0x24, 0x02, -0x70, 0x1E, 0x90, 0x9F, 0xA3, 0xE0, 0x12, 0xAC, 0xB3, 0xFF, 0x90, 0x9F, 0xAA, 0xE0, 0x54, 0x7F, -0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x9F, 0xA9, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x46, 0xA0, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x39, 0xEF, 0xF0, 0x12, 0x64, 0xAA, 0x90, 0xA2, 0x39, -0xE0, 0x60, 0x02, 0x91, 0x93, 0x7D, 0x04, 0xD1, 0xE8, 0x74, 0x04, 0xF0, 0x22, 0x7D, 0x01, 0x7F, -0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x3A, 0xED, 0xF0, 0x90, 0x9F, 0xA3, -0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x61, 0xE3, 0xEE, 0x12, 0x56, 0xE5, -0x30, 0xE0, 0x02, 0x61, 0xE3, 0x90, 0x9F, 0xAA, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x61, 0xE3, 0xEF, -0x70, 0x02, 0x61, 0x5D, 0x24, 0xFE, 0x70, 0x02, 0x61, 0x96, 0x24, 0xFE, 0x60, 0x47, 0x24, 0xFC, -0x70, 0x02, 0x61, 0xD1, 0x24, 0xFC, 0x60, 0x02, 0x61, 0xE3, 0xEE, 0xB4, 0x0E, 0x02, 0x91, 0x19, -0x90, 0x9F, 0xAA, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x85, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x06, -0x02, 0x91, 0x3E, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x04, 0x0D, 0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x60, -0x04, 0xD1, 0xFD, 0x80, 0x02, 0xF1, 0x92, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, -0xE3, 0x91, 0x99, 0x61, 0xE3, 0x90, 0x9F, 0xAA, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x85, 0x90, -0x9F, 0xAA, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x3E, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x0E, 0x07, 0x71, -0xE8, 0xBF, 0x01, 0x02, 0x91, 0x19, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, 0xE3, -0x71, 0xE8, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, 0xE3, 0x91, 0x64, 0x61, 0xE3, 0x90, 0x9F, 0xAA, -0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xE8, 0xBF, 0x01, 0x02, 0x91, 0x19, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, -0x06, 0x02, 0x91, 0x3E, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0xE8, 0xBF, 0x01, 0x02, -0x91, 0x64, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x04, 0x70, 0x59, 0x12, 0xA3, 0x9E, 0xEF, 0x64, 0x01, -0x70, 0x51, 0x91, 0xA7, 0x80, 0x4D, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xE8, 0xBF, -0x01, 0x02, 0x91, 0x19, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x3E, 0x90, 0x9F, 0xAA, -0xE0, 0xB4, 0x0C, 0x07, 0x71, 0xE8, 0xBF, 0x01, 0x02, 0x91, 0x64, 0x90, 0x9F, 0xAA, 0xE0, 0x70, -0x04, 0x7F, 0x01, 0x51, 0x85, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x04, 0x17, 0x12, 0xA9, 0xA2, 0x80, -0x12, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x0C, 0x0B, 0x90, 0x9F, 0xA4, 0x12, 0x8D, 0x05, 0x30, 0xE0, -0x02, 0xD1, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x5F, 0xE0, 0x30, 0xE0, 0x0D, 0x90, -0xA0, 0x65, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x80, 0x1A, 0x12, 0xA3, 0x35, 0xBF, -0x01, 0x14, 0x12, 0xA9, 0x1F, 0x54, 0x1F, 0x20, 0xE0, 0x0C, 0x90, 0x9F, 0xA9, 0xE0, 0xD3, 0x94, -0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0xC3, 0x13, 0x20, -0xE0, 0x04, 0x51, 0x1A, 0x80, 0x12, 0x12, 0xAA, 0xA5, 0xD1, 0xD4, 0x90, 0x05, 0x27, 0xE0, 0x44, -0x80, 0xF0, 0x90, 0x9F, 0xA2, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x22, 0x90, 0x9F, -0xA4, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x07, 0xE0, 0x44, 0x40, 0xD1, 0xD4, 0x80, 0x0F, 0x51, -0x16, 0x90, 0x05, 0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x9F, 0xA2, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, -0xFF, 0x02, 0x49, 0x22, 0xF1, 0x8C, 0x64, 0x01, 0x70, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xFD, -0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x12, 0x4C, 0x80, 0xBF, 0x01, 0x0E, 0x90, 0x9F, -0xA3, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0xD1, 0xE8, 0x74, 0x0E, 0xF0, 0x22, 0xE4, 0xFD, 0x7F, -0x0C, 0x51, 0xA1, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x22, 0x12, 0x64, 0xAA, 0x91, 0x93, 0x51, 0x1A, -0x90, 0x9F, 0xA2, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x2D, 0x12, 0x4C, 0x1E, 0x90, 0x01, 0x37, 0x74, -0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x91, 0xD1, 0x12, 0x63, 0x05, 0xE4, 0xFD, 0x7F, 0x01, 0x51, 0x1E, -0xE4, 0x90, 0x9F, 0xA2, 0xF0, 0x22, 0xF0, 0x7D, 0x01, 0x7F, 0x02, 0x91, 0xD1, 0x7D, 0x02, 0x7F, -0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x02, 0x88, 0xB6, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7F, 0xC2, 0x90, 0x05, 0x27, 0xE0, 0xF5, 0x54, 0x12, 0x8F, -0xC9, 0x90, 0x9F, 0x9E, 0x12, 0x6F, 0x44, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x12, 0x6D, 0x2E, 0xFF, -0x90, 0x9F, 0x9E, 0x12, 0x6F, 0x7C, 0x12, 0x6F, 0xB4, 0x12, 0x6F, 0x8D, 0x90, 0x9F, 0x9E, 0x12, -0x9F, 0x77, 0x12, 0x6F, 0xB4, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0x9F, 0x9E, -0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xA1, 0xB3, 0xE0, 0x30, 0xE0, 0x74, 0x12, 0x88, 0xCC, -0x75, 0x54, 0x21, 0x12, 0xAC, 0xD7, 0x30, 0xE0, 0x04, 0xD1, 0x60, 0x80, 0x0C, 0xE4, 0x90, 0x9F, -0x9F, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0xF1, 0xAB, 0x90, 0x9F, 0x9E, 0xE0, 0xD1, 0xCD, 0x30, -0xE0, 0x03, 0x43, 0x54, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x14, 0x90, -0x9F, 0x9E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x80, 0x90, 0x9F, 0x9E, -0x12, 0x4F, 0xD3, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, 0xD1, 0x59, 0x90, 0x9F, 0xA1, 0xE0, 0x70, -0x05, 0x7F, 0x01, 0x12, 0x84, 0x59, 0x12, 0x6F, 0xA1, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x0C, -0x12, 0x82, 0xF0, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x84, 0x59, 0xC1, -0x22, 0xD1, 0x56, 0x90, 0x9F, 0xA1, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xC1, 0x51, 0xFF, 0x12, 0x84, -0x59, 0xC1, 0x51, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x70, 0x12, 0x88, 0xCC, 0x43, 0x54, 0x31, -0x12, 0xAC, 0xD7, 0x30, 0xE0, 0x04, 0xD1, 0x60, 0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0xF1, 0xAB, -0x90, 0x9F, 0x9E, 0xE0, 0xD1, 0xCD, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, -0x30, 0xE0, 0x03, 0x43, 0x54, 0x04, 0xD1, 0x59, 0x12, 0x6F, 0xA1, 0x30, 0xE0, 0x0B, 0x12, 0xA2, -0xFD, 0x60, 0x2F, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x1D, 0xF1, 0xD6, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, -0x02, 0x18, 0xD1, 0xDB, 0x12, 0x82, 0xF0, 0xBF, 0x01, 0x09, 0x90, 0x9F, 0xA9, 0xE0, 0xFF, 0x7D, -0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x51, 0xA1, 0x80, 0x08, 0x90, 0x9F, 0xAA, 0xE0, 0x90, 0x9F, -0xA2, 0xF0, 0x90, 0x05, 0x40, 0x74, 0x22, 0xF0, 0x80, 0x27, 0xD1, 0x56, 0x90, 0x9F, 0xA2, 0xE0, -0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x08, 0x06, -0x7D, 0x01, 0x7F, 0x0C, 0x51, 0xA1, 0x12, 0xA3, 0x4E, 0x90, 0x9F, 0xA9, 0xF1, 0xEE, 0x12, 0xA8, -0x8C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x22, -0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x91, 0xD1, 0x43, 0x54, 0x08, 0x22, 0x90, -0xA0, 0x5F, 0xE0, 0x20, 0xE0, 0x1D, 0x90, 0x9F, 0xA7, 0xE0, 0x64, 0x01, 0x70, 0x15, 0x12, 0x84, -0x33, 0x12, 0x69, 0x3A, 0x60, 0x05, 0x91, 0x8D, 0x02, 0xA8, 0xE1, 0x90, 0x9F, 0xAA, 0xE0, 0x70, -0x02, 0x51, 0x9D, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, -0xFF, 0x91, 0xD1, 0x7D, 0x02, 0x7F, 0x03, 0x91, 0xD1, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0x12, -0xAC, 0x3E, 0xE4, 0xFF, 0xF1, 0x2F, 0xBF, 0x01, 0x10, 0x12, 0x8C, 0xF1, 0x90, 0x9F, 0xAA, 0xE0, -0x20, 0xE2, 0x09, 0x7D, 0x01, 0x7F, 0x04, 0x41, 0xA1, 0x12, 0xAB, 0xFA, 0x22, 0xFF, 0x13, 0x13, -0x13, 0x54, 0x1F, 0x22, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x41, 0x1E, 0x91, 0x93, 0xD1, 0xD5, 0xF1, -0xD6, 0x90, 0x9F, 0xA2, 0x74, 0x04, 0xF0, 0x22, 0x7F, 0x01, 0x51, 0x1E, 0x90, 0x9F, 0xA2, 0x22, -0x7D, 0x2F, 0x12, 0x63, 0x00, 0x7D, 0x08, 0xD1, 0xE8, 0x74, 0x08, 0xF0, 0x22, 0xEF, 0x60, 0x2E, -0xF1, 0x8C, 0x64, 0x01, 0x70, 0x28, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, -0x0F, 0x12, 0x49, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xF1, 0xE5, 0xBF, 0x01, 0x0E, -0x90, 0x9F, 0xA3, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0xD1, 0xE8, 0x74, 0x06, 0xF0, 0x22, 0x12, -0x86, 0xD3, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0x12, 0x62, 0x14, 0xE0, 0xFD, 0x7C, 0x00, 0x12, 0x7C, -0xC7, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, -0x5D, 0x4E, 0x7F, 0x00, 0x60, 0x02, 0x7F, 0x01, 0x22, 0xEF, 0x70, 0x2E, 0x7D, 0x78, 0x7F, 0x02, -0xF1, 0xAB, 0x7D, 0x02, 0x7F, 0x03, 0xF1, 0xAB, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x88, 0xAD, 0x12, -0x82, 0xC4, 0xF1, 0x8C, 0x70, 0x05, 0x12, 0xAB, 0x6D, 0x80, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x51, -0xA1, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xF7, 0x02, 0xAC, 0xAA, 0xC1, 0x94, 0xE4, 0xFF, 0xF1, 0x2F, -0xEF, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x91, 0x93, 0x7D, 0x0C, 0x7F, 0x01, 0x41, -0x1E, 0x7D, 0x02, 0x7F, 0x02, 0xF1, 0xAB, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x12, 0xAD, 0x31, -0xFE, 0xF6, 0x74, 0x30, 0x02, 0x88, 0xB6, 0x12, 0xA8, 0xE1, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x0C, -0x60, 0x04, 0x91, 0x8D, 0xF1, 0xE5, 0x22, 0x91, 0x93, 0x90, 0x9F, 0xA1, 0x74, 0x01, 0xF0, 0x22, -0x91, 0x93, 0xF1, 0xD6, 0x80, 0xF3, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x12, 0x64, -0xAA, 0x91, 0x93, 0x80, 0xE4, 0x7D, 0x08, 0xE4, 0xFF, 0x02, 0x4C, 0x8B, 0x80, 0xDB, 0xE0, 0xFF, -0x7D, 0x01, 0x41, 0xA1, 0x75, 0xE8, 0x07, 0x75, 0xA8, 0x85, 0x22, 0x7F, 0x81, 0x12, 0x47, 0xAF, -0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0xA0, 0x7F, 0x80, 0x12, 0x47, 0xF7, 0xFD, 0x7F, -0x80, 0x12, 0x46, 0xA0, 0x12, 0xA1, 0xE0, 0x12, 0x3E, 0x11, 0x51, 0x7C, 0x12, 0xA2, 0x21, 0x7F, -0x01, 0x12, 0x43, 0xA5, 0x90, 0xA0, 0xC0, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0xA5, 0x90, 0xA0, -0xC0, 0xE0, 0x04, 0xF0, 0x12, 0x58, 0x0F, 0x11, 0x93, 0x7F, 0x80, 0x12, 0xAD, 0x39, 0x7F, 0x80, -0x12, 0x46, 0xA0, 0x75, 0x28, 0xFF, 0x12, 0x5F, 0xF4, 0x12, 0x96, 0x89, 0x7B, 0x01, 0x7A, 0xA0, -0x79, 0xF0, 0x51, 0xBC, 0xEF, 0x64, 0x01, 0x70, 0x22, 0x90, 0xA0, 0xF0, 0xE0, 0x54, 0x07, 0xF0, -0xE0, 0xFF, 0x64, 0x07, 0x60, 0x04, 0xEF, 0xB4, 0x04, 0x11, 0x12, 0xA1, 0x91, 0xBF, 0x01, 0x0B, -0x12, 0xAC, 0xA1, 0x44, 0x60, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0xA0, 0x7F, 0x81, 0x12, 0x47, 0xAF, -0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0xA0, 0x12, 0xA2, 0x2B, 0x51, 0x9A, 0xE4, 0xFF, -0x02, 0x44, 0x2E, 0x31, 0xD0, 0x12, 0xA0, 0x19, 0x12, 0x55, 0x3E, 0x12, 0xA8, 0x8C, 0x12, 0x59, -0x28, 0x51, 0x76, 0x12, 0xA7, 0x11, 0x7E, 0x00, 0x7F, 0x19, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, -0x79, 0x91, 0x12, 0x08, 0xAA, 0x12, 0x9E, 0x7A, 0x90, 0xA0, 0x98, 0x12, 0x45, 0x71, 0x90, 0xA0, -0x94, 0x12, 0x08, 0x6D, 0x90, 0x9E, 0x97, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x22, 0x31, 0xC1, 0x30, -0xE0, 0x02, 0x7E, 0x01, 0x90, 0xA0, 0xA0, 0xEE, 0xF0, 0x31, 0xC1, 0x30, 0xE1, 0x02, 0x7E, 0x01, -0x90, 0xA0, 0xA1, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x3A, 0xEF, -0x64, 0x01, 0x70, 0x15, 0x31, 0x5A, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0xA0, 0xEF, 0xF0, -0x31, 0x5A, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x80, 0x1B, 0x90, 0x9E, 0x97, 0xE0, 0x64, 0x03, 0x70, -0x18, 0x31, 0x53, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0xA0, 0xEF, 0xF0, 0x31, 0x53, 0x30, -0xE1, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0xA1, 0xEF, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, -0x7F, 0x01, 0x51, 0xC3, 0x31, 0x61, 0x12, 0x9B, 0xD6, 0x90, 0xA0, 0x78, 0x74, 0x01, 0xF0, 0x90, -0xA0, 0xAD, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x04, 0x8F, 0xE4, 0xF0, 0x90, 0xA0, 0xBF, 0xE0, 0x54, -0xFE, 0xF0, 0x22, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x22, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, -0x22, 0x7E, 0x00, 0x7F, 0x32, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x5F, 0x12, 0x08, 0xAA, -0x90, 0xA0, 0x60, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9E, 0x97, 0xE0, 0xFC, 0x64, -0x02, 0x70, 0x14, 0x31, 0xC1, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0xEE, 0x31, 0xC8, 0xFE, 0x90, 0xA0, -0x62, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0x22, 0xEC, 0x64, 0x01, 0x70, 0x09, 0x31, 0x5A, 0x30, 0xE2, -0x02, 0x7F, 0x01, 0x80, 0x0F, 0x90, 0x9E, 0x97, 0xE0, 0x64, 0x03, 0x70, 0x13, 0x31, 0x53, 0x30, -0xE2, 0x02, 0x7F, 0x01, 0xEF, 0x31, 0xC8, 0xFF, 0x90, 0xA0, 0x62, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, -0x22, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x22, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x22, -0xE4, 0xFD, 0xFF, 0x12, 0x86, 0xD3, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0xED, 0x70, 0x12, 0x51, 0x14, -0xC0, 0x83, 0xC0, 0x82, 0x51, 0x0C, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0x80, 0x0F, -0x51, 0x14, 0xC0, 0x83, 0xC0, 0x82, 0x51, 0x0C, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4E, 0xD0, -0x82, 0xD0, 0x83, 0xF0, 0x51, 0x1F, 0x90, 0x9F, 0x9C, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0x74, 0x01, -0xA8, 0x07, 0x08, 0x22, 0x74, 0x8C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7D, 0x10, 0xED, 0x14, 0xF9, 0x24, 0x8C, 0x51, 0x17, 0xE0, -0x60, 0x3B, 0x7C, 0x08, 0xEC, 0x14, 0x90, 0xA2, 0x34, 0xF0, 0x74, 0x8C, 0x29, 0x51, 0x17, 0xE0, -0xFB, 0x7A, 0x00, 0x90, 0xA2, 0x34, 0x12, 0x7C, 0xC5, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, -0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x0F, 0xE9, 0x75, 0xF0, 0x08, -0xA4, 0xFF, 0x90, 0xA2, 0x34, 0xE0, 0x2F, 0x04, 0xFF, 0x80, 0x06, 0xDC, 0xC7, 0xDD, 0xB9, 0x7F, -0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xAB, 0xE3, 0x02, 0x08, 0xAA, 0x90, 0x01, 0x01, 0xE0, -0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x12, 0x96, 0xF8, 0x90, 0x01, 0x99, 0xE0, -0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xF1, -0x51, 0xBC, 0xBF, 0x01, 0x16, 0x90, 0xA0, 0xF1, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, -0xA0, 0xEE, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0xEE, 0xF0, 0x22, 0x7F, 0xFB, 0x7E, 0x01, -0x02, 0x34, 0xC1, 0x90, 0xA0, 0x84, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, -0x07, 0x78, 0x74, 0x09, 0xF0, 0x22, 0x90, 0xA0, 0xBF, 0xE0, 0x30, 0xE0, 0x1D, 0xEF, 0x24, 0xFD, -0x60, 0x0E, 0x24, 0xFA, 0x60, 0x0E, 0x24, 0xFC, 0x60, 0x0E, 0x24, 0x0C, 0x7F, 0x02, 0x80, 0x0A, -0x7F, 0x03, 0x80, 0x06, 0x7F, 0x0B, 0x80, 0x02, 0x7F, 0x0E, 0x90, 0x07, 0x78, 0xEF, 0xF0, 0x22, -0x7F, 0xFF, 0x12, 0x49, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4C, 0x22, 0x91, -0xA3, 0x91, 0x8D, 0x91, 0x8D, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xA0, 0x90, 0x01, 0x00, -0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0x12, 0x9D, -0x47, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x51, 0xC3, 0x12, 0x9D, 0x3F, 0x30, 0xE0, -0x31, 0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x08, 0x90, 0xA2, 0x2A, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, -0x90, 0xA2, 0x2A, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0x2B, -0xF0, 0x80, 0x06, 0x90, 0xA2, 0x2B, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x2A, 0x71, 0x7F, 0x7F, 0x01, -0x51, 0xC3, 0x90, 0xA0, 0x4F, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, -0xFF, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, -0xA0, 0x62, 0x12, 0x4F, 0xD3, 0x30, 0xE0, 0x02, 0x81, 0x74, 0x90, 0xA0, 0xA1, 0xE0, 0x70, 0x57, -0xE5, 0x26, 0x64, 0x02, 0x60, 0x23, 0xE5, 0x27, 0x70, 0x1F, 0x91, 0x79, 0xE5, 0x26, 0x90, 0xA1, -0xC5, 0xB4, 0x01, 0x05, 0x12, 0x45, 0x71, 0x80, 0x08, 0x12, 0xAD, 0x29, 0xEE, 0x44, 0x02, 0xFE, -0xEC, 0x91, 0x87, 0x12, 0x47, 0xCB, 0x12, 0x47, 0xD6, 0xE5, 0x27, 0x64, 0x02, 0x70, 0x02, 0x81, -0x74, 0xE5, 0x27, 0x70, 0x02, 0x81, 0x74, 0x91, 0x79, 0x90, 0xA0, 0xA0, 0xE0, 0x90, 0xA1, 0xC5, -0x60, 0x05, 0x12, 0xAD, 0x29, 0x80, 0x07, 0x12, 0x45, 0x71, 0xEE, 0x44, 0x02, 0xFE, 0x91, 0x86, -0x12, 0x47, 0xCB, 0x7F, 0x48, 0x80, 0x78, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x23, 0x12, 0xAB, 0x8D, -0x91, 0x86, 0xE5, 0x26, 0x90, 0xA1, 0xC5, 0xB4, 0x01, 0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x01, -0x80, 0x06, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02, 0xFF, 0x91, 0x86, 0x12, 0x47, 0xCB, 0xF1, 0xD1, -0xE5, 0x27, 0x64, 0x02, 0x60, 0x4E, 0x12, 0x97, 0x6E, 0xE4, 0xFF, 0x91, 0x86, 0xE5, 0x27, 0x70, -0x0A, 0x12, 0xAD, 0x21, 0x44, 0x77, 0xFF, 0x91, 0x86, 0x80, 0x2F, 0x12, 0xAD, 0x21, 0x44, 0x66, -0xFF, 0x91, 0x86, 0x12, 0xAB, 0x8D, 0xF1, 0xD8, 0x90, 0xA0, 0xA0, 0xE0, 0x90, 0xA1, 0xC9, 0x60, -0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02, 0x80, 0x06, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x01, 0xFF, -0xF1, 0xD8, 0x90, 0xA1, 0xC9, 0x12, 0x47, 0xCE, 0xF1, 0xD1, 0x12, 0x47, 0xCB, 0x7F, 0x30, 0x7E, -0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, -0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA1, 0xC5, 0x02, 0x08, 0x6D, 0x54, 0xFE, 0xFD, -0x7F, 0x02, 0x12, 0x46, 0xA0, 0x7F, 0x02, 0x12, 0x47, 0xAF, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, -0x12, 0x46, 0xA0, 0x7F, 0x02, 0x12, 0x47, 0xAF, 0xEF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, -0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0x12, 0x9D, 0x47, 0x13, 0x54, 0x1F, 0x30, -0xE0, 0x04, 0x7F, 0x03, 0x51, 0xC3, 0x90, 0xA0, 0x7A, 0xE0, 0x20, 0xE0, 0x31, 0x12, 0x9D, 0x3F, -0x30, 0xE0, 0x2B, 0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA2, 0x28, 0xF0, 0x80, 0x06, -0x90, 0xA2, 0x28, 0x74, 0x01, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA2, 0x29, 0x30, 0xE0, -0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x28, 0x71, 0x7F, 0x91, 0xA3, -0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xA0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF0, 0xEF, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xFF, 0x12, -0x8A, 0x84, 0x90, 0xA0, 0x63, 0x12, 0x8D, 0x05, 0x30, 0xE0, 0x02, 0x91, 0xAA, 0x90, 0xA0, 0x63, -0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x80, 0x37, 0x90, 0xA0, 0x5F, 0x12, 0x4F, 0xD3, 0x30, 0xE0, -0x04, 0x7F, 0x0D, 0x80, 0x2A, 0x90, 0xA0, 0x62, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, -0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, 0x09, 0x80, 0x13, 0x7F, 0x03, 0x80, 0x0F, -0x90, 0xA0, 0x62, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x09, 0x51, -0xC3, 0x90, 0xA1, 0xF0, 0xE0, 0x64, 0x03, 0x70, 0x6B, 0x12, 0x4F, 0xD0, 0x30, 0xE0, 0x60, 0x90, -0xA0, 0x69, 0xE0, 0xFF, 0x90, 0xA0, 0x74, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x37, 0xEE, 0x75, 0xF0, -0x03, 0xA4, 0xFF, 0x90, 0xA0, 0x6B, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, -0x33, 0xFC, 0x90, 0xA0, 0x61, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x12, 0xAB, 0xF3, 0x40, 0x08, 0xEE, -0x9F, 0x90, 0xA1, 0xF3, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xF3, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0xF3, -0xF1, 0x98, 0x80, 0x14, 0x90, 0xA0, 0x6C, 0xE0, 0xFF, 0xD1, 0xEC, 0x90, 0xA0, 0x67, 0x74, 0x04, -0xF0, 0xE4, 0x90, 0xA0, 0x72, 0x12, 0x8E, 0xBF, 0xE4, 0x90, 0xA0, 0x74, 0xF0, 0x80, 0x05, 0x90, -0xA0, 0x61, 0xF1, 0x98, 0x90, 0xA0, 0x5F, 0x12, 0x56, 0xE4, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, -0xF2, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xF2, 0x74, 0x01, 0xF0, 0x12, 0x9B, 0xCD, 0x20, 0xE0, 0x13, -0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xF1, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xF1, -0x74, 0x01, 0xF0, 0x90, 0xA1, 0xF1, 0x71, 0x7F, 0x90, 0xA0, 0x71, 0x74, 0x01, 0xF0, 0x12, 0x9B, -0xC4, 0x30, 0xE0, 0x0D, 0x90, 0xA1, 0xF0, 0xE0, 0x70, 0x3B, 0xFD, 0xFF, 0x12, 0x49, 0x22, 0x80, -0x34, 0x12, 0x9B, 0xB3, 0x30, 0xE0, 0x1A, 0x90, 0xA0, 0x65, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA0, -0x51, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x18, 0x12, 0x5C, 0x93, 0x7D, 0x01, 0x7F, 0x0C, 0x80, -0x11, 0x90, 0xA1, 0xF0, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x07, 0xE4, 0xFD, -0x7F, 0x04, 0x12, 0x5A, 0xA1, 0x90, 0xA0, 0x51, 0xE0, 0x60, 0x18, 0x90, 0xA1, 0xF0, 0xE0, 0x70, -0x04, 0x7D, 0x04, 0x80, 0x0A, 0x90, 0xA1, 0xF0, 0xE0, 0x64, 0x03, 0x70, 0x31, 0x7D, 0x0B, 0x7F, -0x6F, 0x80, 0x28, 0x90, 0xA1, 0xF0, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, 0x1E, 0x90, 0xA1, 0xF0, -0xE0, 0xB4, 0x03, 0x1A, 0x90, 0xA0, 0x5F, 0x12, 0x8F, 0xB4, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, -0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x6F, 0xDF, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x22, 0x90, 0xA0, -0x62, 0x12, 0x56, 0xE4, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x97, 0xC6, 0x90, 0xA0, 0x63, 0xE0, -0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06, 0xCF, 0xE0, -0x44, 0x10, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x90, 0xA1, 0xD9, -0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x02, 0x48, 0x34, 0xAD, 0x07, -0xED, 0x70, 0x19, 0xF1, 0x87, 0x70, 0x02, 0x80, 0x17, 0xBC, 0x01, 0x02, 0x80, 0x19, 0xF1, 0x87, -0xBC, 0x02, 0x02, 0x80, 0x1B, 0xEC, 0x64, 0x03, 0x70, 0x21, 0x80, 0x1B, 0xF1, 0x8F, 0x70, 0x04, -0x7F, 0x01, 0x80, 0x15, 0xBC, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0xF1, 0x8F, 0xBC, 0x02, 0x04, -0x7F, 0x09, 0x80, 0x05, 0xBC, 0x03, 0x04, 0x7F, 0x0D, 0x51, 0xC3, 0x90, 0xA0, 0xAD, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x39, 0xED, 0x70, 0x1B, 0xA3, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, -0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x2B, 0xF0, 0x80, 0x02, 0xF1, 0x80, 0x90, 0xA1, 0x2B, 0xE0, 0xFD, -0xE4, 0xFF, 0x80, 0x19, 0x90, 0xA0, 0xAE, 0x12, 0x4F, 0xD3, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, -0x2B, 0xF0, 0x80, 0x02, 0xF1, 0x80, 0x90, 0xA1, 0x2B, 0xE0, 0xFD, 0x7F, 0x01, 0x71, 0x84, 0x22, -0x90, 0xA1, 0x2B, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0xAE, 0xE0, 0x54, 0x03, 0xFC, 0x22, 0x90, -0xA0, 0xAE, 0xE0, 0xC4, 0x54, 0x03, 0xFC, 0x22, 0xE0, 0xFF, 0xD1, 0xEC, 0x90, 0xA0, 0x72, 0xE0, -0x04, 0xF0, 0x22, 0x7D, 0x12, 0x7F, 0xFF, 0x12, 0x49, 0x22, 0x7F, 0x01, 0x51, 0xC3, 0x12, 0x97, -0x7D, 0x61, 0x84, 0x90, 0xA0, 0x7A, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0xA0, 0x7F, -0xE0, 0xFF, 0x51, 0xC3, 0x90, 0xA0, 0x80, 0x71, 0x7F, 0x91, 0xAA, 0xE4, 0xFD, 0xFF, 0x02, 0x49, -0x22, 0x7F, 0x2C, 0x7E, 0x09, 0x02, 0x38, 0x45, 0xEC, 0x90, 0xA1, 0xC9, 0x02, 0x08, 0x6D, 0x7D, -0x20, 0x71, 0x00, 0x90, 0x9F, 0xA1, 0x74, 0x02, 0xF0, 0x22, 0x71, 0x05, 0x80, 0xF5, 0xE4, 0x90, -0xA0, 0xF3, 0xF0, 0x90, 0xA0, 0xF3, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xEE, 0x90, 0x01, 0xC4, 0xF0, -0x74, 0x67, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0xC2, 0xAF, 0x90, -0x9F, 0xA7, 0xE0, 0x60, 0x0E, 0x90, 0x9F, 0xAA, 0xE0, 0xFF, 0x90, 0x9F, 0xA9, 0xE0, 0x6F, 0x60, -0x02, 0x11, 0x44, 0xC2, 0xAF, 0x12, 0xA1, 0xED, 0xBF, 0x01, 0x03, 0x12, 0x95, 0x3F, 0xD2, 0xAF, -0xD2, 0xAF, 0x90, 0xA0, 0xEE, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0xA8, 0x12, 0x12, 0x4F, 0xFE, 0x12, -0x42, 0xDD, 0x80, 0xAF, 0x90, 0x9F, 0x9E, 0xE0, 0x90, 0x9F, 0xA9, 0x30, 0xE0, 0x05, 0xE0, 0xFF, -0x02, 0xA8, 0xC3, 0x02, 0x5F, 0xEE, 0xE4, 0xFF, 0x12, 0x5F, 0x2F, 0xBF, 0x01, 0x0E, 0x90, 0x9F, -0xA7, 0xE0, 0x60, 0x08, 0x11, 0x6D, 0x54, 0x07, 0x70, 0x02, 0x11, 0x44, 0x22, 0x90, 0x9F, 0xAB, -0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x63, 0x54, 0xC0, -0x70, 0x07, 0x11, 0x6D, 0x54, 0xFD, 0xF0, 0x80, 0xBB, 0xE5, 0x63, 0x30, 0xE6, 0x17, 0x90, 0x9F, -0xA7, 0xE0, 0x64, 0x01, 0x70, 0x11, 0x31, 0x33, 0x64, 0x02, 0x60, 0x04, 0xF1, 0xDF, 0x80, 0x07, -0x12, 0x5F, 0xB7, 0x80, 0x02, 0x11, 0x6D, 0xE5, 0x63, 0x90, 0x9F, 0xAB, 0x30, 0xE7, 0x0D, 0xF1, -0xBA, 0x12, 0x48, 0x2C, 0x90, 0x9F, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, -0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA1, 0x1D, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x04, 0x11, -0x6D, 0x80, 0x5C, 0xED, 0x30, 0xE6, 0x3E, 0x90, 0x9F, 0xA7, 0xE0, 0x64, 0x02, 0x70, 0x27, 0x90, -0x9F, 0xA3, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x9F, 0xAB, 0xE0, 0x44, 0x01, 0xF0, -0x80, 0x1A, 0x31, 0x3A, 0x64, 0x01, 0x70, 0x1F, 0x90, 0x9F, 0xAB, 0xE0, 0x44, 0x04, 0xF0, 0x7F, -0x01, 0x12, 0x4D, 0xD5, 0x80, 0x11, 0x31, 0x33, 0x64, 0x02, 0x60, 0x04, 0xF1, 0xDF, 0x80, 0x07, -0x12, 0x5F, 0xB7, 0x80, 0x02, 0x11, 0x6D, 0x90, 0xA1, 0x1D, 0xE0, 0x90, 0x9F, 0xAB, 0x30, 0xE7, -0x0D, 0xF1, 0xBA, 0x12, 0x48, 0x2C, 0x90, 0x9F, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, -0xFD, 0xF0, 0x22, 0x90, 0x9F, 0xAB, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9F, 0xA5, 0xE0, 0x54, 0x0F, -0x22, 0xF1, 0x66, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0x9F, 0xA7, 0xF0, 0xEF, 0x12, 0x56, -0xE5, 0xA3, 0x51, 0x86, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x9F, 0xA5, 0xE0, 0x54, -0xF0, 0x4E, 0xF0, 0x12, 0x57, 0x09, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x9F, 0xA3, 0xE0, 0x54, -0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x31, 0x3A, 0x12, 0x56, 0xDC, 0x90, -0x9F, 0xA6, 0xF0, 0x51, 0x80, 0x30, 0xE0, 0x52, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, -0x90, 0x9F, 0xBA, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2A, 0x74, 0x03, 0xF0, 0x51, 0x73, 0xE9, 0x24, -0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, -0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, -0x12, 0x06, 0xCF, 0x51, 0x73, 0x51, 0x80, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x9F, -0xAF, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x51, 0x73, 0xB1, 0x28, 0xFD, 0x7F, -0x02, 0x12, 0x5A, 0x1E, 0x51, 0x73, 0x51, 0x7A, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA0, 0x50, 0xF1, -0x44, 0xFF, 0x51, 0x79, 0xB1, 0x2E, 0xFF, 0x90, 0xA0, 0x50, 0xF1, 0x7C, 0x4E, 0xFF, 0x51, 0x79, -0xF1, 0x8D, 0x90, 0xA0, 0x50, 0x12, 0x9F, 0x77, 0x4E, 0xFF, 0x51, 0x79, 0xF1, 0x3D, 0x4E, 0x90, -0xA0, 0x50, 0xF0, 0xF1, 0xA4, 0x20, 0xE0, 0x29, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, -0x01, 0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x0B, 0x80, 0x0E, 0xE4, 0xF5, 0x52, 0x90, 0xA0, 0xA0, 0xE0, -0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, 0x75, 0x51, 0x01, 0xAD, 0x52, 0xAF, 0x51, 0x12, 0x63, -0x84, 0x51, 0x73, 0x90, 0xA1, 0x04, 0x12, 0x45, 0xBE, 0x12, 0xA9, 0x27, 0x90, 0x9F, 0xA7, 0xE0, -0xFF, 0x12, 0x5F, 0x59, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x12, 0x90, 0xA1, 0x04, 0x12, 0x45, 0xB5, -0x51, 0x87, 0x54, 0x0F, 0xFF, 0x12, 0x56, 0xDE, 0xFD, 0x12, 0xA9, 0x4C, 0x22, 0x90, 0xA1, 0x01, -0x12, 0x45, 0xBE, 0x90, 0xA1, 0x01, 0x02, 0x45, 0xB5, 0xF0, 0x90, 0x00, 0x05, 0x02, 0x06, 0xA2, -0x90, 0x00, 0x06, 0x02, 0x06, 0xA2, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x06, 0xA2, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x66, 0x12, 0x8F, 0xC9, 0x90, 0xA0, 0x5F, 0xF1, 0x44, 0xFF, 0xF0, -0x12, 0x06, 0x89, 0xB1, 0x2E, 0xFF, 0x90, 0xA0, 0x5F, 0xF1, 0xAC, 0xF1, 0x97, 0x90, 0xA0, 0x5F, -0xF1, 0x3B, 0xF1, 0xB4, 0xF1, 0x74, 0x90, 0xA0, 0x5F, 0xF0, 0x12, 0x57, 0x09, 0xFF, 0x54, 0x01, -0xFE, 0x90, 0xA0, 0x62, 0xF1, 0x44, 0xFF, 0xF0, 0x12, 0x57, 0x09, 0xB1, 0x2E, 0xFF, 0x90, 0xA0, -0x62, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x57, 0x09, 0xF1, -0x97, 0x90, 0xA0, 0x62, 0xF1, 0x3B, 0x4E, 0xFF, 0xF0, 0x12, 0x57, 0x09, 0xF1, 0x74, 0x90, 0xA0, -0x62, 0xB1, 0x27, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0xA0, 0x63, 0xE0, 0x54, 0xDF, 0x4E, 0xFE, 0xF0, -0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F, 0xB1, 0x26, 0xFE, 0x54, 0x80, 0xFD, 0xEF, 0x54, -0x7F, 0x4D, 0xFF, 0x90, 0xA0, 0x63, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E, 0xB1, -0x26, 0xB1, 0x2E, 0xFF, 0x90, 0xA0, 0x63, 0xF0, 0xEE, 0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, -0xB1, 0x26, 0xF1, 0x8D, 0x90, 0xA0, 0x63, 0xF1, 0x7C, 0x4E, 0xF0, 0x12, 0x8D, 0x05, 0x20, 0xE0, -0x06, 0x12, 0x64, 0xAA, 0x12, 0x5C, 0x93, 0x51, 0x73, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x02, 0x81, -0x93, 0x90, 0x05, 0x54, 0xE0, 0x90, 0xA0, 0x70, 0xF0, 0xE0, 0xC3, 0x13, 0x90, 0xA0, 0x6F, 0x12, -0x85, 0xA7, 0x30, 0xE0, 0x0E, 0x51, 0x87, 0x90, 0xA0, 0x60, 0x12, 0x56, 0xDD, 0x90, 0xA0, 0x61, -0xF0, 0x80, 0x41, 0x51, 0x87, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, -0xA0, 0x60, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA0, 0x60, -0x74, 0x2A, 0xF0, 0x12, 0x56, 0xDE, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, -0x90, 0xA0, 0x61, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA0, -0x61, 0x74, 0x2A, 0xF0, 0x12, 0x4F, 0xD0, 0x30, 0xE0, 0x3D, 0x90, 0xA0, 0x60, 0xE0, 0x75, 0xF0, -0x03, 0x84, 0x90, 0xA0, 0x68, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA0, 0x61, 0xE0, 0x75, -0xF0, 0x03, 0x84, 0x90, 0xA0, 0x6A, 0xF0, 0x90, 0xA0, 0x60, 0xE0, 0xC3, 0x13, 0x90, 0xA0, 0x6B, -0xF0, 0x90, 0xA0, 0x61, 0xE0, 0xC3, 0x13, 0x90, 0xA0, 0x6C, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, -0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x88, 0xD0, 0xE4, 0x90, 0xA0, 0x9E, 0xF0, 0x12, 0x57, 0x03, 0xC4, -0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x39, 0x90, 0xA0, 0x5F, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, -0x07, 0xEF, 0x12, 0x56, 0xE5, 0x30, 0xE0, 0x28, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, -0x30, 0xE0, 0x08, 0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA0, 0xA0, 0xE0, 0x60, -0x05, 0x75, 0x51, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x12, 0x63, 0x84, -0x12, 0x9B, 0xB3, 0x30, 0xE0, 0x12, 0x12, 0x9B, 0xBB, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x02, -0x12, 0x5A, 0x1E, 0xF1, 0x6C, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA0, -0x67, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA0, 0x72, 0x74, 0x01, 0xF0, 0x80, 0x1E, 0xEF, 0xB4, -0x04, 0x08, 0x90, 0xA0, 0x72, 0x74, 0x04, 0xF0, 0x80, 0x12, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA0, -0x72, 0x74, 0x02, 0xF0, 0x80, 0x06, 0xEF, 0xB4, 0x07, 0x02, 0xF1, 0xD1, 0xE4, 0x90, 0xA0, 0x67, -0xF0, 0x80, 0x56, 0x12, 0x57, 0x03, 0xF1, 0xA5, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x11, -0x12, 0x06, 0x89, 0x12, 0x5E, 0xCD, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, -0x52, 0x12, 0x9B, 0xD6, 0x90, 0xA0, 0xBF, 0xE0, 0x30, 0xE0, 0x04, 0x7D, 0xAC, 0x80, 0x02, 0x7D, -0x2C, 0x7F, 0x40, 0x12, 0x46, 0xA0, 0x12, 0x57, 0x03, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, -0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x01, 0x12, 0x62, 0xC3, 0xAD, 0x52, 0x7F, 0x02, 0x12, 0x63, -0x84, 0x12, 0x5C, 0x93, 0xF1, 0x6C, 0x74, 0x43, 0xF0, 0x12, 0xAC, 0xCE, 0x90, 0xA0, 0x71, 0xF0, -0x90, 0xA0, 0x62, 0x12, 0x56, 0xE4, 0x30, 0xE0, 0x09, 0x90, 0xA0, 0x91, 0xE0, 0x44, 0x02, 0xF0, -0x80, 0x0C, 0x7F, 0x01, 0x12, 0x97, 0xC6, 0x90, 0xA0, 0x91, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, -0x12, 0x8A, 0x84, 0x90, 0xA0, 0x5F, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0xA0, 0x63, 0xE0, 0x54, 0xBF, -0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x02, 0x06, 0xA2, 0xFE, 0x54, -0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0x22, 0x90, 0x02, 0x09, 0x12, 0x9C, 0xAD, 0x90, 0x9E, 0x98, -0x51, 0x86, 0x25, 0x51, 0x90, 0x9E, 0x99, 0x12, 0x56, 0xDD, 0x25, 0x51, 0x90, 0x9E, 0x9A, 0xF0, -0x12, 0x57, 0x09, 0x25, 0x51, 0x90, 0x9E, 0x9B, 0xB1, 0x27, 0x25, 0x51, 0x90, 0x9E, 0x9C, 0x51, -0x79, 0x25, 0x51, 0x90, 0x9E, 0x9D, 0xF0, 0x51, 0x80, 0x25, 0x51, 0x90, 0x9E, 0x9E, 0xF0, 0x22, -0x12, 0x06, 0x89, 0xF5, 0x51, 0x51, 0x87, 0xF5, 0x54, 0x12, 0x56, 0xDE, 0xF5, 0x55, 0x12, 0x57, -0x09, 0xF5, 0x56, 0xB1, 0x28, 0xF5, 0x57, 0x51, 0x7A, 0xF5, 0x58, 0x51, 0x80, 0xF5, 0x59, 0xE5, -0x51, 0x12, 0x45, 0xC7, 0x6D, 0xAD, 0x00, 0x6D, 0xB5, 0x01, 0x6D, 0xBD, 0x02, 0x6D, 0xC5, 0x03, -0x6D, 0xCD, 0x04, 0x6D, 0xD5, 0x05, 0x6D, 0xDD, 0x06, 0x00, 0x00, 0x6D, 0xF0, 0x75, 0x52, 0x02, -0x75, 0x53, 0x29, 0x80, 0x41, 0x75, 0x52, 0x06, 0x75, 0x53, 0x2A, 0x80, 0x39, 0x75, 0x52, 0x01, -0x75, 0x53, 0x31, 0x80, 0x31, 0x75, 0x52, 0x01, 0x75, 0x53, 0x32, 0x80, 0x29, 0x75, 0x52, 0x06, -0x75, 0x53, 0x33, 0x80, 0x21, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0xC1, 0x6D, 0x90, 0xA0, 0xA2, -0x12, 0xAD, 0x09, 0xA3, 0xE5, 0x56, 0xF0, 0xA3, 0xE5, 0x57, 0xF0, 0xA3, 0xE5, 0x58, 0xF0, 0x22, -0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0xAD, 0x52, 0xAF, 0x53, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE1, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, -0x12, 0x45, 0xBE, 0x12, 0xAB, 0x37, 0x70, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x13, 0x90, -0xA1, 0xE1, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x45, 0xB5, 0x12, 0x9D, 0x9A, 0x7F, 0x01, -0x80, 0x0E, 0x7F, 0x01, 0xF1, 0x53, 0x7F, 0x02, 0x80, 0x06, 0x7F, 0x02, 0xF1, 0x53, 0x7F, 0x03, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x51, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xAA, 0x51, 0x86, 0x90, -0xA0, 0xAB, 0x12, 0x56, 0xDD, 0x90, 0xA0, 0xAC, 0xF0, 0x90, 0xA0, 0x87, 0xE0, 0x44, 0x01, 0xF0, -0x51, 0x73, 0xF1, 0x85, 0xB4, 0x02, 0x05, 0x7F, 0x40, 0x12, 0x98, 0x0D, 0x22, 0x90, 0xA1, 0x01, -0x74, 0x0A, 0xF0, 0x90, 0xA1, 0x0F, 0x74, 0x06, 0xF0, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x03, 0x51, -0x86, 0x90, 0xA1, 0x04, 0x12, 0x56, 0xDD, 0x90, 0xA1, 0x05, 0xF0, 0x12, 0x57, 0x09, 0x90, 0xA1, -0x06, 0xB1, 0x27, 0x90, 0xA1, 0x07, 0x51, 0x79, 0x90, 0xA1, 0x08, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, -0x79, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0x87, 0xE0, 0xFF, 0x70, 0x06, -0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0x88, 0xE0, 0xB5, 0x07, 0x04, -0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, -0x80, 0x29, 0xC0, 0x01, 0x90, 0x9F, 0x88, 0xE0, 0x12, 0xA1, 0x59, 0xA8, 0x01, 0xFC, 0x7D, 0x01, -0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x9F, 0x88, 0xF1, 0xD8, 0xB4, 0x0A, -0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0x88, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x51, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xBD, 0x51, 0x86, 0x90, 0xA0, 0xBE, 0xF0, 0x51, 0x73, -0x7D, 0x02, 0x7F, 0x38, 0xC1, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xB6, -0x74, 0x15, 0xF0, 0x90, 0xA1, 0xC4, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xB8, 0xEF, 0xF0, 0x7B, 0x01, -0x7A, 0xA1, 0x79, 0xB6, 0xD1, 0xA2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0xEE, 0x54, 0x40, 0xFE, -0xEF, 0x54, 0xBF, 0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, -0xFD, 0x4F, 0x22, 0xF1, 0x16, 0x7F, 0x04, 0x8F, 0x71, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9E, -0x92, 0xE0, 0x45, 0x71, 0xF0, 0x22, 0x90, 0xA1, 0x01, 0x02, 0x45, 0xBE, 0x90, 0x05, 0x00, 0x74, -0x1C, 0xF0, 0xA3, 0x22, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x22, 0xF0, 0xEE, 0x54, 0x08, -0xFE, 0xEF, 0x54, 0xF7, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD1, 0x00, 0xEF, 0x22, 0xFE, 0x54, 0x10, -0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x22, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, -0x22, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0xF0, 0xEE, 0x54, 0x10, -0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x02, 0x06, 0x89, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, -0xA1, 0xD9, 0xF0, 0x90, 0xA0, 0x4C, 0xE0, 0x90, 0xA1, 0xDA, 0x22, 0x7D, 0x01, 0x7F, 0x17, 0xC1, -0x00, 0x90, 0xA0, 0x72, 0x74, 0x05, 0xF0, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0x90, -0xA0, 0x50, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x1D, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x17, 0x90, -0x9E, 0x99, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x4D, 0x59, 0x90, 0xA2, 0x30, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x12, 0x4F, 0x09, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0xDE, -0x90, 0xA0, 0xFC, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9E, 0x92, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, -0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE0, 0x0E, 0x90, 0x9E, 0x92, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, -0xFF, 0x12, 0x79, 0x54, 0x11, 0x5B, 0xD1, 0x2E, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0x7E, -0xEF, 0xD1, 0x2E, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0xA0, 0xF3, 0xD1, 0x2E, 0x30, 0xE6, -0x06, 0x54, 0xBF, 0xF0, 0x12, 0x97, 0xE7, 0xD2, 0xAF, 0x80, 0xBC, 0xE4, 0xF5, 0x51, 0x90, 0x9F, -0x9C, 0xE0, 0xFF, 0xE5, 0x51, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0xFB, 0xAF, 0x51, 0x12, 0x5F, 0x2F, -0xEF, 0x70, 0x02, 0xA1, 0xF7, 0x12, 0x51, 0x14, 0x12, 0x56, 0xE5, 0x30, 0xE0, 0x02, 0xA1, 0xF7, -0x90, 0x04, 0xA0, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xE5, 0x51, 0x6E, -0x70, 0x28, 0xA3, 0xE0, 0xF5, 0x52, 0xA3, 0xE0, 0x90, 0xA1, 0x0C, 0x12, 0x7B, 0x8B, 0xE5, 0x52, -0xF0, 0x75, 0xF0, 0x10, 0x12, 0x78, 0xE8, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0xA1, 0x0C, 0xE0, 0x12, -0xAD, 0x11, 0xE5, 0x51, 0x12, 0x78, 0xE8, 0xEF, 0xF0, 0x22, 0xE5, 0x51, 0x12, 0x7A, 0xC2, 0xE0, -0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x02, 0xA1, 0xF7, 0xE5, 0x51, 0x75, -0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA1, 0x00, -0x12, 0x45, 0xBE, 0xE5, 0x51, 0x12, 0x7A, 0xC2, 0xE0, 0xF5, 0x56, 0xA3, 0xE0, 0xF5, 0x57, 0x74, -0x91, 0x25, 0x51, 0x12, 0x7F, 0xD8, 0xE0, 0xFF, 0x90, 0xA1, 0x03, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, -0x3E, 0xFE, 0x90, 0x00, 0x04, 0xD1, 0x25, 0xFE, 0x90, 0x00, 0x06, 0xD1, 0x25, 0xFE, 0x90, 0x00, -0x08, 0xD1, 0x25, 0x90, 0xA1, 0x05, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFF, 0xC3, 0x90, -0xA1, 0x06, 0xE0, 0x9F, 0xFE, 0x90, 0xA1, 0x05, 0xE0, 0x95, 0xF0, 0x90, 0xA1, 0x07, 0xF0, 0xA3, -0xCE, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0x25, 0xE0, 0xFF, 0xEC, 0x33, -0xFE, 0xEF, 0x2D, 0xFD, 0xEE, 0x3C, 0xFC, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x25, 0xE0, 0xFF, -0xE5, 0xF0, 0x33, 0xFE, 0x90, 0x00, 0x02, 0xD1, 0x25, 0xCF, 0x2D, 0xFD, 0xEF, 0x3C, 0xFC, 0xD1, -0x0A, 0x12, 0xAC, 0x5F, 0xAE, 0xF0, 0x78, 0x02, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x2D, -0xFF, 0xEC, 0x3E, 0x90, 0xA1, 0x09, 0xF0, 0xA3, 0xEF, 0x12, 0x7B, 0x8B, 0xE0, 0xF5, 0x52, 0x54, -0x7F, 0xF5, 0x53, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x12, 0x57, 0xEF, 0xE0, 0x90, 0xA1, 0x0B, 0xF0, -0x12, 0x51, 0x14, 0xFF, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0x0C, 0xF0, 0xB1, 0xFE, 0xE0, 0xC3, -0x94, 0x05, 0x40, 0x02, 0x81, 0x1C, 0x90, 0xA1, 0x0B, 0xE0, 0xFF, 0xE5, 0x53, 0x9F, 0x40, 0x08, -0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52, 0xE5, 0x53, 0x90, 0x41, 0x5F, 0x93, 0xFF, 0xD1, -0x38, 0xE0, 0xC3, 0x9F, 0xE5, 0x53, 0x40, 0x05, 0x90, 0x41, 0x37, 0x80, 0x03, 0x90, 0x41, 0x4B, -0x93, 0xF5, 0x58, 0x90, 0xA0, 0xA2, 0xE0, 0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05, 0xE5, -0x53, 0xB4, 0x0B, 0x05, 0x90, 0xA0, 0xA4, 0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05, 0xE5, -0x53, 0xB4, 0x0A, 0x05, 0x90, 0xA0, 0xA5, 0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05, 0xE5, -0x53, 0xB4, 0x09, 0x05, 0x90, 0xA0, 0xA6, 0x80, 0x03, 0x90, 0xA0, 0xA3, 0xE0, 0xF5, 0x5C, 0xE5, -0x5C, 0xC3, 0x94, 0x80, 0x50, 0x28, 0xE5, 0x5C, 0x94, 0x1B, 0x40, 0x02, 0x80, 0x13, 0xE5, 0x58, -0x25, 0x5C, 0xFF, 0xE4, 0x33, 0xFE, 0xD3, 0xEF, 0x94, 0x1B, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, -0x05, 0x75, 0x58, 0x1B, 0x80, 0x20, 0xE5, 0x5C, 0x25, 0x58, 0xF5, 0x58, 0x80, 0x18, 0xC3, 0xE4, -0x95, 0x5C, 0xF5, 0x5C, 0xE5, 0x58, 0xD3, 0x95, 0x5C, 0x40, 0x08, 0xE5, 0x58, 0x95, 0x5C, 0xF5, -0x58, 0x80, 0x03, 0xE4, 0xF5, 0x58, 0xE5, 0x58, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x95, 0xF9, 0x74, -0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x90, 0xA0, 0xFD, 0x12, 0x45, 0xBE, 0xC3, 0xE5, 0x57, 0x94, -0x0F, 0xE5, 0x56, 0x94, 0x00, 0x50, 0x4E, 0xD1, 0x0A, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, -0xAE, 0xF0, 0x12, 0xAC, 0x5F, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0xD1, 0x1C, 0xFF, 0xD3, 0xED, -0x9F, 0xEC, 0x9E, 0x40, 0x05, 0x12, 0x7D, 0x5B, 0x61, 0xFD, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x02, -0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0xD1, 0x1C, 0x2D, 0xFF, 0xEE, 0x3C, -0xFE, 0xD1, 0x0A, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x50, 0x02, 0x61, 0xFD, 0xAF, -0x51, 0xD1, 0x7A, 0x61, 0xFD, 0xE5, 0x51, 0x70, 0x3D, 0xD1, 0x0A, 0x12, 0xAC, 0x5F, 0xFD, 0xAC, -0xF0, 0xD1, 0x1C, 0xFF, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0x9E, 0x91, 0x74, 0x01, -0xF0, 0x80, 0x23, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, -0xFB, 0xAA, 0x06, 0xD1, 0x1C, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, -0x05, 0xE4, 0x90, 0x9E, 0x91, 0xF0, 0x12, 0xAC, 0x83, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, -0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, -0xE4, 0xF5, 0x59, 0xE5, 0x51, 0xD1, 0x6E, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, 0x55, 0xE4, 0xF5, -0x5D, 0xD1, 0x0A, 0x75, 0xF0, 0x02, 0xE5, 0x5D, 0x12, 0xAB, 0xCA, 0x80, 0x05, 0xCE, 0xC3, 0x13, -0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xFD, 0x12, 0x45, 0xB5, 0x85, 0x5D, 0x82, 0x75, 0x83, -0x00, 0x12, 0x06, 0xA2, 0x12, 0xAB, 0x99, 0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xD3, 0x90, 0xA0, -0xFD, 0x12, 0x45, 0xB5, 0x12, 0x6A, 0x7A, 0xFD, 0x7C, 0x00, 0x12, 0xAD, 0x01, 0x80, 0x05, 0xCE, -0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54, -0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54, 0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4, -0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0xD1, 0x6E, 0x12, 0xAD, 0x09, 0xAE, 0x54, 0x12, 0x7C, 0xED, -0xC3, 0x12, 0x45, 0x60, 0x50, 0x06, 0xAF, 0x51, 0xD1, 0x7A, 0x80, 0x12, 0x12, 0xAB, 0x0D, 0xD3, -0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x40, 0x09, 0x12, 0x7D, 0x5B, 0xD1, 0x50, -0xE4, 0xF0, 0x80, 0x29, 0xD1, 0x50, 0xE0, 0x04, 0xF0, 0xD1, 0x50, 0xE0, 0xC3, 0x94, 0x05, 0x40, -0x1C, 0xD1, 0x50, 0xE4, 0xF0, 0x12, 0xAB, 0x0D, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0x12, 0x7C, -0xED, 0x12, 0x7F, 0xD0, 0xE5, 0x51, 0xD1, 0x6E, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x51, 0xD1, -0x6E, 0xA3, 0xE0, 0x90, 0xA1, 0x63, 0xF0, 0x90, 0xA1, 0x62, 0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, -0xFD, 0xFF, 0x12, 0x98, 0x28, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xA1, 0xDB, 0xB1, 0xFE, 0xE0, 0xFC, -0x64, 0x05, 0x60, 0x02, 0x81, 0xE3, 0xAD, 0x53, 0xAF, 0x51, 0x12, 0xA5, 0x74, 0x12, 0xAC, 0x26, -0xEF, 0xD1, 0x44, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xD1, 0x38, 0xE0, 0xFF, 0xC3, 0x94, 0x30, 0x50, -0x06, 0xE4, 0xB1, 0xFC, 0xE4, 0x80, 0x56, 0x12, 0xAC, 0x26, 0xE0, 0x64, 0x01, 0x70, 0x66, 0x12, -0xAB, 0x61, 0xE0, 0x64, 0x0A, 0x60, 0x28, 0xEF, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0xAC, -0x1A, 0xE0, 0xFD, 0x12, 0xAB, 0xF0, 0x50, 0x17, 0xED, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0xD1, -0x38, 0xE0, 0x12, 0xAB, 0xF0, 0x50, 0x08, 0x12, 0xAB, 0x81, 0xE0, 0x65, 0x53, 0x60, 0x2A, 0xE5, -0x5B, 0x70, 0x05, 0x75, 0x5B, 0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4, 0x01, 0x05, 0x75, 0x5B, 0x03, -0x80, 0x03, 0x75, 0x5B, 0x05, 0xD1, 0x38, 0xE0, 0xFF, 0x12, 0xAC, 0x1A, 0xEF, 0xF0, 0x74, 0x11, -0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0x80, 0x18, 0xB1, 0xFE, 0xE4, 0xF0, 0x12, 0xAB, 0x61, -0xE0, 0x04, 0xF0, 0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, -0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0x12, 0xAB, 0x81, 0xE5, 0x53, 0xF0, 0x12, 0x51, 0x14, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xA1, 0xCB, 0x12, 0xAB, 0x61, 0xE4, 0xF0, 0xB1, 0xFC, 0xE4, -0xF0, 0xA1, 0xCB, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xA1, 0xDB, 0xF5, 0x54, 0xF5, 0x55, 0xD1, 0x45, -0xE0, 0x54, 0x07, 0xF5, 0x5B, 0x12, 0xAC, 0x83, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, -0xE5, 0x57, 0x94, 0xFA, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, -0xF5, 0x59, 0x12, 0xAD, 0x01, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, -0x42, 0x24, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA1, 0x0E, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0xE4, 0xF5, 0x5A, 0xD1, 0x0A, 0x75, 0xF0, 0x02, 0xE5, 0x5A, 0x12, 0xAB, 0xCA, 0x80, -0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42, 0x1F, 0x93, 0x12, -0xAB, 0x99, 0xC3, 0x90, 0xA1, 0x0F, 0xE0, 0x95, 0x55, 0x90, 0xA1, 0x0E, 0xE0, 0x95, 0x54, 0x40, -0x07, 0x05, 0x5A, 0xE5, 0x5A, 0xB4, 0x05, 0xCD, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, -0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06, -0xEF, 0x95, 0x5A, 0xFF, 0x80, 0x02, 0xE4, 0xFF, 0xD1, 0x10, 0xE0, 0xC3, 0x13, 0xFE, 0xEF, 0xC4, -0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0xD1, 0x10, 0xEE, 0xF0, 0xD1, 0x10, 0xE0, 0xC3, 0x94, 0xC0, -0x40, 0x05, 0xD1, 0x10, 0x74, 0xC0, 0xF0, 0xD1, 0x10, 0x12, 0x4F, 0xD3, 0x25, 0xE0, 0xFF, 0x70, -0x04, 0xF5, 0x5B, 0x80, 0x04, 0xEF, 0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA1, 0x04, 0xE0, 0x94, 0x03, -0x90, 0xA1, 0x03, 0xE0, 0x94, 0x00, 0x40, 0x03, 0xE4, 0xF5, 0x5B, 0xD1, 0x45, 0xE0, 0x54, 0xF8, -0x90, 0xA1, 0x10, 0xF0, 0x45, 0x5B, 0xFF, 0xD1, 0x44, 0xEF, 0xF0, 0xB1, 0xFE, 0xE0, 0xD3, 0x94, -0x05, 0x74, 0x11, 0x50, 0x07, 0xD1, 0x00, 0xE0, 0x04, 0xF0, 0x80, 0x04, 0xD1, 0x00, 0xE4, 0xF0, -0xE4, 0xFD, 0xAF, 0x51, 0x12, 0x78, 0xFC, 0x05, 0x51, 0x01, 0x5E, 0x22, 0xF5, 0x5B, 0x74, 0x11, -0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x22, 0x90, 0xA1, 0x00, 0x02, 0x45, 0xB5, -0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22, 0xE5, 0x56, 0xC3, 0x13, -0xFE, 0xE5, 0x57, 0x13, 0x22, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x22, 0xD2, 0xAF, -0xC2, 0xAF, 0x90, 0x9E, 0x92, 0xE0, 0xFF, 0x22, 0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, -0x9A, 0xF5, 0x83, 0x22, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x02, 0x45, 0xA9, -0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x22, 0xE9, 0x25, 0xE0, 0x25, -0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, -0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xAB, 0x07, 0x75, 0xF0, 0x10, 0xEB, -0x12, 0x7B, 0x91, 0xE0, 0xF5, 0x5E, 0xE4, 0xF5, 0x62, 0xE5, 0x5E, 0x54, 0x7F, 0xF9, 0xE5, 0x5E, -0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB, 0x12, 0x57, 0xEF, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, -0xEB, 0x12, 0x51, 0x19, 0xFF, 0xC4, 0x54, 0x03, 0xF5, 0x61, 0xD1, 0x5C, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0xE5, 0x5E, 0x4A, 0xFF, 0x74, 0x91, 0x2B, 0x12, 0x7D, 0x53, 0xEF, 0xF0, 0x75, 0xF0, 0x04, -0xEB, 0x12, 0x51, 0x19, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x5F, 0x74, 0x91, 0x2B, 0x12, 0xAC, 0x54, -0xE9, 0x64, 0x2C, 0x70, 0x2A, 0x75, 0xF0, 0x04, 0xEB, 0x12, 0x51, 0x19, 0xFF, 0x54, 0x03, 0xFE, -0xE5, 0x5F, 0xC3, 0x9E, 0x50, 0x19, 0x05, 0x5F, 0x12, 0x7E, 0x8D, 0xFE, 0x75, 0xF0, 0x04, 0xEB, -0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0xE1, 0x80, 0xE9, -0xC3, 0x95, 0x60, 0x50, 0x48, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x60, 0x50, 0x72, 0xED, 0x12, -0xAC, 0x97, 0xEB, 0x12, 0x55, 0x2D, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xED, 0x54, 0x07, 0x12, -0x7C, 0xC6, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0xAC, 0x8D, 0x60, -0x19, 0xB9, 0x13, 0x10, 0x79, 0x18, 0x89, 0x5E, 0x74, 0x91, 0x2B, 0x12, 0x56, 0x59, 0xE0, 0x44, -0x04, 0xF0, 0x80, 0x3C, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x36, 0x0D, 0x80, 0xBB, 0xE9, 0x65, 0x60, -0x70, 0x23, 0x75, 0xF0, 0x04, 0xEB, 0x12, 0x56, 0x3C, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44, 0x80, 0xF5, 0x5E, 0x80, 0x13, 0xD1, 0x5C, 0xEE, -0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x74, 0x91, 0x2B, 0x12, 0x7D, 0x53, 0xE5, 0x60, 0xF0, 0xF5, 0x5E, -0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD, 0x5E, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69, 0xE4, 0x90, 0xA1, 0xD2, 0xF0, 0xE5, 0x67, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x90, 0xA1, 0xCD, 0xF0, 0xE5, 0x67, 0x54, 0x07, 0x90, 0xA1, 0xCF, 0xF0, 0x75, 0xF0, -0x10, 0xEF, 0xD1, 0x4A, 0xE0, 0x90, 0xA1, 0xD0, 0x12, 0x57, 0xEA, 0xE0, 0x54, 0x7F, 0x90, 0xA1, -0xD3, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x67, 0x12, 0x56, 0xF1, 0xE0, 0x90, 0xA1, 0xD4, 0xF0, 0x12, -0x7C, 0xE4, 0xE5, 0x69, 0x70, 0x1F, 0xE0, 0xFB, 0x12, 0xAB, 0x0F, 0xE4, 0x93, 0xFE, 0x74, 0x01, -0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0xEB, 0x12, 0x7C, 0xF3, 0x12, 0x7F, 0xD0, 0xE5, 0x67, 0xD1, 0x6E, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xD3, 0xE0, 0xFF, 0x90, 0xA1, 0xCE, 0xE0, 0xFE, 0xD3, -0x9F, 0x40, 0x0B, 0xE5, 0x68, 0x54, 0x80, 0xFD, 0xEF, 0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90, 0xA1, -0xD4, 0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, 0x68, 0x91, 0xE4, 0xE5, 0x68, 0x54, 0x80, -0x90, 0xA1, 0xD1, 0xF0, 0xE5, 0x69, 0x70, 0x29, 0x90, 0xA1, 0xCD, 0xE0, 0x24, 0x81, 0x11, 0xDA, -0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0xCF, 0x11, 0xF4, 0x80, 0x02, 0xC3, 0x33, 0xD8, -0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0x54, 0x7F, 0xF0, 0x80, -0x45, 0x90, 0xA1, 0xCD, 0xE0, 0x24, 0x81, 0x11, 0xDA, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, -0xA1, 0xCF, 0x11, 0xF4, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, -0x75, 0xF0, 0x10, 0xE5, 0x67, 0x12, 0x76, 0x4A, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA1, 0xD0, 0xF0, -0x90, 0xA1, 0xCE, 0xE0, 0x90, 0x41, 0xF7, 0x93, 0xFE, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, -0xA1, 0xD0, 0xF0, 0x44, 0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x71, 0x91, 0xE5, 0x68, 0xF0, -0xE5, 0x67, 0x70, 0x06, 0x90, 0x01, 0xC8, 0xE5, 0x68, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xFF, 0x75, -0xF0, 0x10, 0xE5, 0x67, 0x12, 0x76, 0x4A, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x11, 0xE8, -0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x12, 0xAD, 0x11, 0xE5, 0x67, 0x11, 0xE8, 0xEF, 0xF0, 0x7D, -0x01, 0xAF, 0x67, 0x11, 0xFC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, -0x83, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x02, 0x45, 0xA9, 0x75, 0xF0, -0x03, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x27, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x31, 0x3E, 0x90, -0x8D, 0x03, 0x31, 0x3E, 0x90, 0x8D, 0x05, 0x31, 0x3E, 0x90, 0x8D, 0x07, 0x31, 0x3E, 0x90, 0x8D, -0x09, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0x51, 0xC0, 0x12, 0xAB, 0xAA, 0xF0, 0x31, 0x4A, 0xE0, -0x54, 0xBF, 0x44, 0x80, 0xFE, 0x31, 0x4A, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, -0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, -0x03, 0x02, 0x45, 0xA9, 0x90, 0xA1, 0x4A, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x10, 0x7D, 0x00, 0x7B, -0x01, 0x7A, 0xA1, 0x79, 0x4C, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0x9C, 0xE0, 0x90, 0xA1, 0x5E, 0xF0, -0xE4, 0x90, 0xA1, 0x4B, 0xF0, 0x90, 0xA1, 0x5E, 0xE0, 0xFE, 0x90, 0xA1, 0x4B, 0xE0, 0xFD, 0xC3, -0x9E, 0x50, 0x40, 0xED, 0x51, 0xAA, 0xED, 0x54, 0x07, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x31, -0x4E, 0xE0, 0x30, 0xE7, 0x09, 0x74, 0x81, 0x2D, 0x51, 0x90, 0xE4, 0xF0, 0x80, 0x1D, 0xAF, 0x05, -0x91, 0xDD, 0x51, 0xCE, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0x5D, 0x11, 0xF4, 0x80, -0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA1, 0x4B, 0xE0, 0x04, -0xF0, 0x80, 0xB2, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA1, 0x4B, 0xF0, 0x90, -0xA1, 0x5E, 0xE0, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x89, 0xEE, -0x51, 0xAA, 0xEE, 0x54, 0x07, 0xA3, 0xF0, 0x91, 0xC5, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, -0xCE, 0xD8, 0xF9, 0x4E, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x51, 0xCE, 0xE0, 0x5F, 0x60, 0x02, -0x41, 0x81, 0x51, 0x98, 0x90, 0x81, 0x06, 0x51, 0xA1, 0xEF, 0x90, 0x81, 0x07, 0x51, 0xB4, 0xFC, -0x51, 0xC2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0x51, 0xA1, -0xEC, 0x90, 0x81, 0x0B, 0x51, 0xB4, 0x75, 0xF0, 0x0A, 0x51, 0x8A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0x7F, 0x01, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x55, 0x30, -0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x51, 0x8A, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x45, 0xA9, 0xE4, -0xF0, 0xA3, 0xED, 0xF0, 0x0F, 0xEF, 0xB4, 0x05, 0xD9, 0x51, 0x98, 0x90, 0x81, 0x09, 0x12, 0x45, -0xA9, 0xE0, 0xFE, 0x74, 0x91, 0x2F, 0xF1, 0xD8, 0xEE, 0xF0, 0x90, 0xA1, 0x4B, 0xE0, 0xFF, 0x90, -0xA1, 0x4A, 0xE0, 0xFD, 0x11, 0xFC, 0x90, 0xA1, 0x4B, 0xE0, 0x24, 0x81, 0x51, 0x90, 0x74, 0x01, -0xF0, 0x90, 0xA1, 0x4B, 0xE0, 0x04, 0xF0, 0x21, 0xCF, 0x22, 0x90, 0x8D, 0x01, 0x02, 0x45, 0xA9, -0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22, 0x90, 0xA1, 0x4B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, -0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0x22, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, -0xA1, 0x5C, 0xF0, 0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0x22, -0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0x90, 0xA1, -0x5C, 0xE0, 0x24, 0x4C, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x22, 0xE4, 0xF5, 0x63, 0x90, -0x9F, 0x9C, 0xE0, 0xFF, 0xE5, 0x63, 0xC3, 0x9F, 0x40, 0x02, 0x61, 0x8A, 0xAF, 0x63, 0x12, 0x5F, -0x2F, 0xEF, 0x70, 0x02, 0x61, 0x86, 0xE5, 0x63, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x63, -0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0x11, 0xDA, 0xE0, 0xFD, 0xAF, 0x06, 0x91, 0xC7, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x60, 0x69, 0x75, 0xF0, 0x10, -0xE5, 0x63, 0x12, 0x76, 0x4A, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x63, -0x90, 0x81, 0x02, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, -0x20, 0xF0, 0x80, 0x42, 0xEF, 0x30, 0xE6, 0x12, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x71, 0x91, 0x71, -0xAA, 0x12, 0x51, 0x19, 0x71, 0xA3, 0xE4, 0xFB, 0x80, 0x27, 0x71, 0x97, 0xE0, 0x04, 0xF0, 0x71, -0x97, 0xE0, 0xD3, 0x94, 0x01, 0x40, 0x0A, 0xAF, 0x63, 0xB1, 0x03, 0x71, 0x97, 0xE4, 0xF0, 0x80, -0x15, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x71, 0x91, 0x71, 0xAA, 0x12, 0x51, 0x19, 0x71, 0xA3, 0x7B, -0x01, 0xAF, 0x63, 0x12, 0x77, 0x89, 0x05, 0x63, 0x41, 0xDF, 0x22, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x51, 0x90, 0x81, 0x00, 0x02, 0x45, 0xA9, 0x74, 0x11, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9D, -0xF5, 0x83, 0x22, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x6A, 0x22, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, -0x63, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA2, 0x26, 0xF0, 0x90, 0xA2, 0x26, 0xE0, -0xFD, 0x70, 0x02, 0x81, 0xBB, 0x90, 0x9E, 0xEF, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, -0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9E, 0xF0, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, -0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA2, 0x1B, -0x91, 0xC5, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, -0x02, 0x81, 0x9E, 0xE4, 0x90, 0xA2, 0x27, 0xF0, 0x90, 0xA2, 0x27, 0xE0, 0xF9, 0xC3, 0x94, 0x04, -0x50, 0x41, 0x91, 0xBD, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, -0x74, 0xD0, 0x91, 0xCE, 0xF1, 0x49, 0xE5, 0x82, 0x29, 0x12, 0x55, 0x36, 0xEF, 0x91, 0xBC, 0xA4, -0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x91, 0xCE, 0x75, 0xF0, 0x08, 0x90, 0x9E, 0xA3, -0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, 0x12, 0x55, 0x36, 0xEF, 0xF0, 0x90, 0xA2, 0x27, 0xE0, 0x04, -0xF0, 0x80, 0xB5, 0x90, 0xA2, 0x26, 0xE0, 0xFF, 0x90, 0xA2, 0x1B, 0x11, 0xF4, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA2, 0x26, 0xF0, 0x90, 0xA2, 0x1B, 0xE0, 0xFF, 0x74, 0x01, -0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA2, 0x1B, -0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9E, 0xF0, 0x12, 0x6F, 0xD8, 0xB4, 0x0A, 0x02, -0x7F, 0x01, 0xEF, 0x70, 0x02, 0x61, 0xBC, 0xE4, 0x90, 0x9E, 0xF0, 0xF0, 0x61, 0xBC, 0x90, 0x01, -0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA2, 0x1B, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0x91, 0xBC, -0x90, 0x01, 0xD0, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xF0, 0x90, 0xA2, 0x1B, -0xE0, 0x75, 0xF0, 0x04, 0x22, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x22, 0x2F, 0xF5, -0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9E, 0xF0, 0xE0, 0x22, 0x31, 0x4A, 0xE0, -0x44, 0x40, 0xF0, 0x22, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA1, 0xCE, 0xF0, 0x22, 0xFF, 0xE4, 0xFC, -0xFD, 0xE5, 0x53, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, -0x02, 0x45, 0x99, 0x75, 0xF0, 0x04, 0xEF, 0x12, 0x51, 0x19, 0xFE, 0x13, 0x13, 0x54, 0x03, 0xFC, -0x12, 0x57, 0xEB, 0xE0, 0xFB, 0xB1, 0x50, 0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x1C, 0xEE, -0x54, 0x03, 0xFE, 0xEC, 0xD3, 0x9E, 0x50, 0x13, 0xEC, 0x60, 0x10, 0x1C, 0xEC, 0xD1, 0x8F, 0xFE, -0x75, 0xF0, 0x04, 0xEF, 0x12, 0x51, 0x19, 0x54, 0xF3, 0x4E, 0xF0, 0xED, 0xD3, 0x9B, 0x40, 0x02, -0xAD, 0x03, 0xB1, 0x50, 0xE0, 0x54, 0x80, 0x42, 0x05, 0x8C, 0x6A, 0xE4, 0xFB, 0x02, 0x77, 0x89, -0x74, 0x91, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0x22, 0x7D, 0x01, 0xAF, 0x51, 0xAA, -0x07, 0xAB, 0x05, 0x75, 0xF0, 0x10, 0xEA, 0x71, 0x91, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF5, 0x60, -0x75, 0xF0, 0x04, 0xEA, 0x12, 0x56, 0xF1, 0xE0, 0x90, 0xA1, 0x13, 0xF0, 0x75, 0xF0, 0x04, 0xEA, -0x12, 0x57, 0xEF, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x51, 0x19, 0x13, 0x13, 0x54, 0x03, -0xF5, 0x5F, 0xE5, 0x60, 0x12, 0xAB, 0x0F, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA, 0x12, -0x76, 0x6E, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x51, 0x19, 0xFE, 0xC4, -0x54, 0x03, 0x90, 0xA1, 0x11, 0xF0, 0x74, 0x91, 0x2A, 0xB1, 0x53, 0xE5, 0x60, 0xF0, 0x74, 0x91, -0x2A, 0x12, 0xAC, 0x54, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x04, 0x8F, 0x60, 0x8F, 0x5E, 0xEB, 0x70, -0x02, 0xC1, 0x81, 0xAF, 0x03, 0x8F, 0x61, 0xE5, 0x5E, 0x30, 0xE7, 0x05, 0x85, 0x60, 0x5E, 0x15, -0x61, 0xE5, 0x61, 0x70, 0x02, 0xC1, 0x81, 0xE5, 0x60, 0x64, 0x2C, 0x70, 0x20, 0xE5, 0x5F, 0xD3, -0x94, 0x00, 0x40, 0x19, 0xE5, 0x5F, 0xD3, 0x94, 0x02, 0x50, 0x12, 0x15, 0x5F, 0xD1, 0x8D, 0xFF, -0x75, 0xF0, 0x04, 0xEA, 0x12, 0x51, 0x19, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61, 0xE5, 0x61, 0x60, -0x70, 0x90, 0xA1, 0x13, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x5F, 0xE4, 0x90, 0xA1, 0x12, -0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90, 0xA1, 0x13, 0xE0, 0xFF, 0xEC, -0xC3, 0x9F, 0x40, 0x41, 0xEC, 0x12, 0xAC, 0x97, 0xEA, 0x12, 0x55, 0x2D, 0xE0, 0xF5, 0x82, 0x75, -0x83, 0x00, 0xEC, 0x54, 0x07, 0x91, 0xC6, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, -0xF9, 0x12, 0xAC, 0x8D, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02, 0x7D, 0x0C, 0x90, -0xA1, 0x12, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, -0x40, 0x03, 0x1C, 0x80, 0xB5, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA1, 0x13, 0xE0, 0xF5, -0x5E, 0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x02, 0x77, 0x89, 0xE5, 0x5F, 0x54, -0x03, 0x25, 0xE0, 0x25, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x2E, -0xEF, 0xF0, 0xD1, 0xE8, 0x30, 0xE6, 0x3C, 0x7F, 0x8D, 0x12, 0x47, 0xAF, 0xEF, 0x64, 0x01, 0x70, -0x32, 0x90, 0xA2, 0x2F, 0xF0, 0x90, 0xA2, 0x2F, 0xE0, 0xFD, 0x90, 0xA2, 0x2E, 0xE0, 0x75, 0xF0, -0x10, 0x71, 0x91, 0xE5, 0x82, 0x2D, 0x12, 0x55, 0x36, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x50, 0xE6, -0x90, 0xA2, 0x2F, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD9, 0xD1, 0xE8, 0x30, 0xE0, -0x02, 0xF1, 0x58, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x8F, 0x12, 0x47, 0xAF, 0xEF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9E, 0xF0, 0xE0, 0xFF, 0x90, 0x9E, 0xEF, 0xE0, 0xB5, -0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x39, 0x90, 0x9E, 0xEF, 0xE0, 0xFE, -0xF1, 0x49, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA0, 0xF9, 0x74, 0x9E, 0x35, 0xF0, -0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x51, 0xFD, 0x90, 0x9E, 0xEF, 0x12, 0x6F, 0xD8, 0xB4, 0x0A, -0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9E, 0xEF, 0xF0, 0x71, 0xB2, 0x90, 0x9E, 0x92, -0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x08, 0x90, 0x9E, 0x9F, 0x02, -0x45, 0xA9, 0x41, 0xDC, 0xE4, 0xFF, 0x21, 0x54, 0xE4, 0xFD, 0x7F, 0x8D, 0x02, 0x46, 0xA0, 0x11, -0xE2, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x11, 0xE2, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xF1, 0xC2, 0x12, -0x6A, 0x87, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x56, -0xDE, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, -0x22, 0x12, 0x57, 0xE3, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFD, 0xAF, 0x54, 0x12, 0x61, 0xD3, 0xAF, -0x54, 0x12, 0x5F, 0x2F, 0xEF, 0xAF, 0x54, 0x70, 0x04, 0xF1, 0x66, 0x80, 0x02, 0xF1, 0x5F, 0x05, -0x54, 0x80, 0xD7, 0xE5, 0x55, 0x70, 0x0A, 0xFF, 0x12, 0x5F, 0x2F, 0xEF, 0x70, 0x03, 0x12, 0xAB, -0x6D, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x22, 0x71, 0xB2, 0x7F, 0x02, 0x02, 0x6F, 0x57, -0x12, 0x45, 0x39, 0x78, 0x01, 0x02, 0x08, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x22, -0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, -0xE0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x7F, 0x12, 0x80, 0x08, 0xD0, 0x07, 0xD0, 0x05, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, -0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, -0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x15, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x80, 0x11, 0x08, 0xD0, -0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, -0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, -0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x3C, 0xF0, 0x74, -0x80, 0xA3, 0xF0, 0x11, 0xAE, 0xE5, 0x14, 0x30, 0xE7, 0x02, 0x11, 0x92, 0x74, 0x3C, 0x04, 0x90, -0x01, 0xC4, 0xF0, 0x74, 0x80, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, -0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, -0xE0, 0x32, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x47, 0xAF, 0xEF, 0x20, -0xE6, 0x0B, 0x7F, 0x05, 0x12, 0x47, 0xF7, 0xFD, 0x7F, 0x05, 0x12, 0x46, 0xA0, 0x22, 0x7F, 0x54, -0x12, 0x47, 0xAF, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x12, 0x47, 0xAF, 0xE5, 0x0E, 0x5F, -0xF5, 0x12, 0x7F, 0x56, 0x12, 0x47, 0xAF, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x12, 0x47, -0xAF, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x12, 0x46, 0xA0, 0xAD, 0x12, 0x7F, -0x55, 0x12, 0x46, 0xA0, 0xAD, 0x13, 0x7F, 0x56, 0x12, 0x46, 0xA0, 0xAD, 0x14, 0x7F, 0x57, 0x12, -0x46, 0xA0, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, +0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xC3, 0xEF, 0x9B, 0xFF, 0xEE, 0x9A, 0xFE, +0xED, 0x99, 0xFD, 0xEC, 0x98, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, +0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, +0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, +0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE0, 0xF8, +0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, +0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, +0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, +0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, +0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x46, +0x0C, 0x02, 0x43, 0x6D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, +0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, +0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, +0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x51, 0xE4, +0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, +0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, +0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, +0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, +0xBE, 0x41, 0xA2, 0xEC, 0x00, 0x41, 0xA2, 0xED, 0x00, 0x41, 0xA2, 0xEE, 0x00, 0x41, 0xA2, 0xF2, +0x00, 0x01, 0x6E, 0x00, 0x41, 0xA2, 0xF3, 0x00, 0x41, 0xA2, 0xF4, 0x00, 0x41, 0xA3, 0x1A, 0x00, +0x00, 0x5F, 0xFE, 0x67, 0xF4, 0x6F, 0xF1, 0x7F, 0x02, 0xD1, 0xAB, 0xEF, 0x44, 0x01, 0xFD, 0x7F, +0x02, 0xD1, 0x8D, 0x7F, 0x02, 0xD1, 0xAB, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0x12, 0xBC, 0xBB, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0xA3, 0x0F, 0x12, 0xBC, 0xBB, 0x90, 0xA3, +0x0F, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0xA2, 0xC0, 0xEF, 0xF0, 0x90, 0xA2, 0xC2, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0xE1, 0x70, 0x90, 0x07, +0x6E, 0xE0, 0x44, 0x08, 0xF0, 0x12, 0xAE, 0xD3, 0x90, 0xA2, 0xC2, 0xE0, 0x70, 0x3C, 0xF1, 0xD4, +0x90, 0xA2, 0xC0, 0xE0, 0x70, 0x2D, 0x12, 0xBC, 0xA9, 0x70, 0x12, 0x12, 0x37, 0x4E, 0xE4, 0xFF, +0x74, 0x02, 0xFE, 0xEC, 0xF1, 0xCE, 0xD1, 0xA2, 0xEF, 0x54, 0xFE, 0x80, 0x11, 0x12, 0x37, 0x4E, +0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0xEC, 0xF1, 0xCE, 0xD1, 0xA2, 0xEF, 0x44, 0x01, 0xFD, 0x7F, +0x64, 0xD1, 0x8D, 0x7F, 0x4E, 0x12, 0x78, 0xB7, 0xE1, 0xBB, 0xF1, 0xD4, 0x90, 0xA2, 0xC0, 0xE0, +0x70, 0x10, 0x12, 0x5A, 0xE3, 0xE4, 0xFF, 0xFE, 0xEC, 0xF1, 0xCE, 0x7F, 0x48, 0x7E, 0x09, 0x12, +0x38, 0x45, 0x12, 0xBC, 0xA0, 0xF1, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0xD1, 0x8D, 0x12, 0xBC, +0x3D, 0x74, 0x66, 0xFF, 0xEC, 0xF1, 0xCE, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x12, 0xA8, +0xAB, 0x54, 0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0xF1, 0xCE, 0x12, 0x4F, 0xE7, 0x80, 0x54, +0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0xAE, 0xDB, 0x90, 0xA2, 0xC0, 0xE0, 0x70, 0x38, +0x90, 0xA2, 0xC2, 0xE0, 0x60, 0x09, 0xF1, 0xD4, 0x12, 0x5A, 0xE3, 0xE4, 0xFF, 0x80, 0x1E, 0x7F, +0x67, 0xD1, 0xAB, 0xEF, 0x54, 0xDF, 0xF1, 0xDB, 0x12, 0xBC, 0xA9, 0x70, 0x0B, 0x12, 0x37, 0x4E, +0xE4, 0x74, 0x80, 0xFF, 0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0xF1, +0xCE, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x12, 0xBC, 0xA0, 0xF1, 0xE0, 0x54, 0xFE, 0xFD, +0x7F, 0x4F, 0xD1, 0x8D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x88, 0xB1, 0x72, 0x90, 0xAA, +0xB9, 0x02, 0x08, 0x6D, 0x7F, 0x67, 0xD1, 0xAB, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0xC1, 0x8D, +0xFD, 0x7F, 0x4E, 0xD1, 0x8D, 0x7F, 0x4F, 0xD1, 0xAB, 0xEF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x12, 0x57, 0x55, 0xD1, 0x83, 0xD1, 0x77, 0xD1, 0x77, 0x90, 0x01, 0x00, 0x74, 0x3F, +0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0x12, 0x89, 0xD6, 0x30, +0xE0, 0x05, 0x7F, 0x01, 0x12, 0x88, 0x32, 0x12, 0x8F, 0xD6, 0x13, 0x30, 0xE0, 0x37, 0x90, 0xA0, +0x8C, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0x07, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0x07, +0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0x08, 0xF0, 0x80, 0x06, +0x90, 0xA3, 0x08, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0x07, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x11, 0x62, +0x7F, 0x01, 0x12, 0x88, 0x32, 0x90, 0xA0, 0x3A, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, 0xA0, 0x4D, +0x12, 0x5F, 0xDF, 0x30, 0xE0, 0x02, 0x21, 0x59, 0x90, 0xA0, 0x8D, 0xE0, 0x70, 0x5B, 0xE5, 0x26, +0x64, 0x02, 0x60, 0x27, 0xE5, 0x27, 0x70, 0x23, 0x31, 0x5E, 0xE5, 0x26, 0x90, 0xA2, 0x88, 0xB4, +0x01, 0x05, 0x12, 0x45, 0x72, 0x80, 0x08, 0x12, 0xBD, 0x32, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x31, +0x6C, 0x12, 0x47, 0xC9, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xE5, 0x27, 0x64, 0x02, 0x70, +0x02, 0x21, 0x59, 0xE5, 0x27, 0x70, 0x02, 0x21, 0x59, 0x31, 0x5E, 0x90, 0xA0, 0x8C, 0xE0, 0x90, +0xA2, 0x88, 0x60, 0x05, 0x12, 0xBD, 0x32, 0x80, 0x07, 0x12, 0x45, 0x72, 0xEE, 0x44, 0x02, 0xFE, +0x31, 0x6B, 0x12, 0x47, 0xC9, 0x7F, 0x48, 0x80, 0x7B, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x26, 0x12, +0xA8, 0xAB, 0x54, 0xFC, 0xFF, 0x31, 0x6B, 0xE5, 0x26, 0x90, 0xA2, 0x88, 0xB4, 0x01, 0x08, 0x12, +0x45, 0x72, 0xEF, 0x44, 0x01, 0x80, 0x06, 0x12, 0x45, 0x72, 0xEF, 0x44, 0x02, 0xFF, 0x31, 0x6B, +0x12, 0x47, 0xC9, 0xF1, 0xE7, 0xE5, 0x27, 0x64, 0x02, 0x60, 0x4E, 0x12, 0xBC, 0x3D, 0xFF, 0x31, +0x6B, 0xE5, 0x27, 0x70, 0x0A, 0x12, 0xBD, 0x2A, 0x44, 0x77, 0xFF, 0x31, 0x6B, 0x80, 0x30, 0x12, +0xBD, 0x2A, 0x44, 0x66, 0xFF, 0x31, 0x6B, 0x12, 0xA8, 0xAB, 0x54, 0xFC, 0xF1, 0xEE, 0x90, 0xA0, +0x8C, 0xE0, 0x90, 0xA2, 0x8C, 0x60, 0x08, 0x12, 0x45, 0x72, 0xEF, 0x44, 0x02, 0x80, 0x06, 0x12, +0x45, 0x72, 0xEF, 0x44, 0x01, 0xF1, 0xEE, 0x90, 0xA2, 0x8C, 0x12, 0x47, 0xCC, 0xF1, 0xE7, 0x12, +0x47, 0xC9, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x48, +0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA2, 0x88, 0x02, +0x08, 0x6D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xCF, 0x12, 0x45, 0x9F, 0x12, +0x9E, 0x4D, 0x90, 0xA0, 0x4A, 0x12, 0x6D, 0x6E, 0xF1, 0xD9, 0xFF, 0x90, 0xA0, 0x4A, 0x12, 0x6B, +0x35, 0x12, 0xBC, 0x2A, 0x90, 0xA0, 0x4A, 0x12, 0x9A, 0xD8, 0x12, 0x6B, 0x3D, 0x12, 0xBD, 0x22, +0x90, 0xA0, 0x4A, 0xF0, 0x91, 0x34, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA0, 0x4D, 0x12, 0x6D, 0x6E, +0xFF, 0xF0, 0x91, 0x34, 0xF1, 0xDE, 0xFF, 0x90, 0xA0, 0x4D, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, +0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x91, 0x34, 0x12, 0xBC, 0x2A, 0x90, 0xA0, 0x4D, 0x12, 0x9A, 0xD8, +0x4E, 0xFF, 0xF0, 0x91, 0x34, 0x12, 0xBD, 0x22, 0x90, 0xA0, 0x4D, 0x91, 0xE1, 0xFF, 0x54, 0x20, +0xFE, 0x90, 0xA0, 0x4E, 0xE0, 0x54, 0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, +0xBF, 0x4F, 0x91, 0xE0, 0xFE, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xFF, 0x90, 0xA0, 0x4E, +0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x91, 0xDF, 0xF1, 0xDE, 0xFF, 0x90, 0xA0, 0x4E, +0xF0, 0xEE, 0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x91, 0xDF, 0x12, 0x6F, 0xE8, 0xFF, 0x90, 0xA0, +0x4E, 0x12, 0xBB, 0x9A, 0x4E, 0xF0, 0x90, 0x9F, 0xD9, 0xE0, 0x70, 0x10, 0x90, 0xA0, 0x3D, 0xE0, +0x20, 0xE0, 0x09, 0x12, 0x84, 0xC6, 0x20, 0xE0, 0x03, 0x12, 0x66, 0x38, 0x12, 0x6D, 0x5A, 0x12, +0x06, 0x89, 0x20, 0xE0, 0x02, 0x61, 0x9E, 0x90, 0x05, 0x54, 0xE0, 0x90, 0xA0, 0x5B, 0xF0, 0xE0, +0xC3, 0x13, 0x90, 0xA0, 0x5A, 0xF0, 0x12, 0x87, 0xAE, 0x30, 0xE0, 0x13, 0xF1, 0x8F, 0x90, 0xA0, +0x4B, 0xF0, 0x24, 0x0A, 0x90, 0xA0, 0x7C, 0xF1, 0xA4, 0x90, 0xA0, 0x4C, 0xF0, 0x80, 0x48, 0xF1, +0x8F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x14, 0xEF, 0xC3, 0x94, 0x03, 0x50, 0x07, 0x90, 0xA0, 0x4B, +0x74, 0x03, 0x80, 0x0C, 0xF1, 0x8F, 0x90, 0xA0, 0x4B, 0x80, 0x05, 0x90, 0xA0, 0x4B, 0x74, 0x2A, +0xF0, 0x24, 0x0A, 0x90, 0xA0, 0x7C, 0xF0, 0xF1, 0xA5, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, +0xC3, 0x94, 0x03, 0x90, 0xA0, 0x4C, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, +0x06, 0x90, 0xA0, 0x4C, 0x74, 0x2A, 0xF0, 0x12, 0x5F, 0xDC, 0x30, 0xE0, 0x3D, 0x90, 0xA0, 0x4B, +0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA0, 0x53, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA0, +0x4C, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA0, 0x55, 0xF0, 0x90, 0xA0, 0x4B, 0xE0, 0xC3, 0x13, +0x90, 0xA0, 0x56, 0xF0, 0x90, 0xA0, 0x4C, 0xE0, 0xC3, 0x13, 0x90, 0xA0, 0x57, 0xF0, 0x90, 0x01, +0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x66, 0x25, 0xE4, 0x90, 0xA0, 0x8A, 0xF0, 0x91, +0x2E, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x35, 0x90, 0xA0, 0x4A, 0xE0, 0xC3, 0x13, 0x20, +0xE0, 0x05, 0xF1, 0xD1, 0x30, 0xE0, 0x27, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, +0xE0, 0x08, 0x90, 0xA0, 0x8C, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA0, 0x8C, 0xE0, 0x60, 0x05, +0x75, 0x51, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x11, 0x62, 0x90, 0xA0, +0x4A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x15, 0x12, 0x87, 0xD8, 0x54, 0x07, 0x30, 0xE0, 0x07, +0x7D, 0x04, 0x7F, 0x02, 0x12, 0x61, 0xC6, 0x12, 0xBD, 0x1A, 0x74, 0x11, 0xF0, 0x12, 0xBC, 0x0F, +0x90, 0xA0, 0x52, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0xA0, 0x5D, 0x74, 0x01, 0xF0, 0x80, 0x28, 0x90, +0xA0, 0x52, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0xA0, 0x5D, 0x74, 0x04, 0xF0, 0x80, 0x19, 0x90, 0xA0, +0x52, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0xA0, 0x5D, 0x74, 0x02, 0xF0, 0x80, 0x0A, 0x90, 0xA0, 0x52, +0xE0, 0xB4, 0x07, 0x03, 0x12, 0x84, 0xBC, 0xE4, 0x90, 0xA0, 0x52, 0xF0, 0x80, 0x55, 0x91, 0x2E, +0x12, 0x6B, 0x0B, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x11, 0x12, 0x06, 0x89, 0x12, 0x6B, +0x16, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x12, 0xA0, 0xB4, 0x90, +0xA0, 0xAB, 0xE0, 0x30, 0xE0, 0x04, 0x7D, 0xAC, 0x80, 0x02, 0x7D, 0x2C, 0x7F, 0x40, 0x12, 0x46, +0x8D, 0x91, 0x2E, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, +0x01, 0x12, 0x88, 0x32, 0xAD, 0x52, 0x7F, 0x02, 0x11, 0x62, 0x12, 0x66, 0x3A, 0x12, 0xBD, 0x1A, +0x74, 0x43, 0xF0, 0x12, 0xBC, 0x97, 0x90, 0xA0, 0x5C, 0xF0, 0xF1, 0xCE, 0x30, 0xE0, 0x09, 0x90, +0xA0, 0x7D, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x8F, 0xDD, 0x90, 0xA0, 0x7D, +0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x8A, 0x12, 0x90, 0xA0, 0x4A, 0xE0, 0x20, 0xE0, 0x07, +0x90, 0xA0, 0x4E, 0xE0, 0x54, 0xBF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xFF, 0x90, 0xA1, +0xCF, 0x12, 0x45, 0x96, 0x90, 0x00, 0x03, 0x02, 0x06, 0xA2, 0x90, 0xA1, 0xCF, 0x12, 0x45, 0x9F, +0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x91, 0x91, 0xD7, 0xE0, 0x54, 0x9C, 0x91, 0xD2, 0xC0, 0x83, +0xC0, 0x82, 0x91, 0x2C, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0x91, 0xD2, 0xC0, +0x83, 0xC0, 0x82, 0x91, 0x2C, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0x91, 0xD2, +0xC0, 0x83, 0xC0, 0x82, 0x91, 0x2C, 0x54, 0x04, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0x91, +0xD2, 0xC0, 0x83, 0xC0, 0x82, 0x91, 0x2C, 0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, +0x91, 0xD2, 0xC0, 0x83, 0xC0, 0x82, 0x91, 0x2C, 0x54, 0x20, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, +0x83, 0xF0, 0xE5, 0x51, 0x70, 0x08, 0x91, 0x34, 0x54, 0x04, 0x90, 0x04, 0xAB, 0xF0, 0xE5, 0x51, +0xC3, 0x94, 0x80, 0x50, 0x06, 0xF1, 0xA5, 0x91, 0xE8, 0xEF, 0xF0, 0x91, 0xD3, 0xE0, 0x30, 0xE5, +0x10, 0xD1, 0x29, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x91, 0xE9, 0xE0, 0xFD, 0xAF, 0x51, 0x12, 0xB2, +0x7F, 0x22, 0xF0, 0x74, 0x91, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x22, 0x4E, +0xFF, 0xF0, 0x90, 0x00, 0x04, 0x02, 0x06, 0xA2, 0xFF, 0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, +0x34, 0x9A, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0x12, 0x46, +0xAB, 0xEF, 0x20, 0xE6, 0x02, 0xA1, 0xF2, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0xA2, 0xD0, 0xF0, 0x7F, +0x8D, 0x12, 0x46, 0xAB, 0x90, 0xA2, 0xD1, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0xA2, 0xD2, +0xF0, 0x90, 0xA2, 0xD1, 0xE0, 0x24, 0xFC, 0x60, 0x10, 0x24, 0x03, 0x60, 0x02, 0xA1, 0xE6, 0x90, +0xA2, 0xD0, 0xE0, 0xFF, 0x12, 0xB4, 0xFC, 0xA1, 0xE6, 0x90, 0xA2, 0xD0, 0xE0, 0x24, 0x11, 0x91, +0xED, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x21, 0x75, 0xF0, 0x04, 0xD1, 0x2E, 0x13, 0x13, 0x54, +0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xD1, 0x21, 0x75, 0xF0, 0x04, 0xD1, 0x2E, 0xF1, 0xD2, 0xFB, 0x0D, +0xE4, 0xFF, 0xD1, 0x21, 0x75, 0xF0, 0x04, 0xD1, 0x2E, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, +0xD1, 0x21, 0x75, 0xF0, 0x04, 0xF1, 0xFD, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x21, 0x75, 0xF0, +0x04, 0x90, 0x96, 0x12, 0xD1, 0x1B, 0x75, 0xF0, 0x04, 0xF1, 0x86, 0xC4, 0x13, 0x54, 0x01, 0xFB, +0x0D, 0x7F, 0x01, 0xD1, 0x21, 0x75, 0xF0, 0x04, 0xF1, 0x86, 0x54, 0x1F, 0xD1, 0x1F, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x00, 0x12, 0xBC, 0x34, 0xD1, 0x21, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x01, 0xD1, +0x1B, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0xD1, 0x1B, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0xD1, +0x1B, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x04, 0x12, 0xBC, 0x34, 0xD1, 0x21, 0x75, 0xF0, 0x08, 0x90, +0x89, 0x05, 0xD1, 0x1B, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x06, 0xD1, 0x1B, 0x75, 0xF0, 0x08, 0x12, +0xBC, 0xFA, 0xFB, 0x0D, 0xB1, 0xF7, 0x7F, 0x8F, 0x12, 0x46, 0xAB, 0xEF, 0x30, 0xE0, 0x03, 0x12, +0xB5, 0x57, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, +0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, +0x03, 0x08, 0x74, 0xFC, 0x2D, 0x12, 0xB0, 0x2B, 0xEB, 0xF0, 0x22, 0x12, 0x45, 0x8A, 0xE0, 0xFB, +0x0D, 0xB1, 0xF7, 0x90, 0xA2, 0xD0, 0xE0, 0x22, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, +0x14, 0x12, 0x45, 0x8A, 0xE0, 0x22, 0x75, 0x40, 0xFF, 0x75, 0x41, 0x41, 0x75, 0x42, 0xDB, 0x75, +0x43, 0x03, 0x7B, 0x01, 0x7A, 0x9E, 0x79, 0x9B, 0xF1, 0x9C, 0x75, 0x41, 0x41, 0x75, 0x42, 0xDE, +0x75, 0x43, 0x03, 0x7B, 0x01, 0x7A, 0x9E, 0x79, 0x9E, 0xF1, 0x9C, 0x75, 0x41, 0x41, 0x75, 0x42, +0xE1, 0x75, 0x43, 0x14, 0x7B, 0x01, 0x7A, 0x9E, 0x79, 0xA1, 0xF1, 0x9C, 0x75, 0x41, 0x41, 0x75, +0x42, 0xF5, 0x75, 0x43, 0x14, 0x7B, 0x01, 0x7A, 0x9E, 0x79, 0xB5, 0x12, 0x35, 0x26, 0xE4, 0xFF, +0xE4, 0xFE, 0x74, 0x91, 0x2F, 0x91, 0xD7, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, +0x81, 0x00, 0xBE, 0x03, 0x0E, 0x12, 0x45, 0x8A, 0xE5, 0x82, 0x2E, 0x12, 0x7A, 0x55, 0x74, 0x80, +0xF0, 0x80, 0x0B, 0x12, 0x45, 0x8A, 0xE5, 0x82, 0x2E, 0x12, 0x7A, 0x55, 0xE4, 0xF0, 0x75, 0xF0, +0x08, 0xEF, 0x12, 0x7C, 0x60, 0x2E, 0x12, 0x7A, 0x55, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xC3, 0x0F, +0xBF, 0x80, 0xBD, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x12, +0x7F, 0xA8, 0x75, 0xF0, 0x02, 0xEE, 0xF1, 0x95, 0xF0, 0x0E, 0xBE, 0x05, 0xEE, 0x74, 0x91, 0x2F, +0x12, 0xBB, 0x51, 0x74, 0x13, 0xF0, 0x74, 0x11, 0x2F, 0x12, 0x75, 0x45, 0xE4, 0xF0, 0x74, 0x01, +0x2F, 0x12, 0x75, 0x2D, 0x74, 0xC0, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, +0x83, 0xE4, 0x12, 0xB4, 0xE0, 0xE4, 0xF1, 0xF8, 0x74, 0x13, 0x12, 0x95, 0x54, 0xE4, 0xF0, 0x75, +0xF0, 0x04, 0xEF, 0xF1, 0x86, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0xD1, 0x2E, +0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0xD1, 0x2E, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, +0xF1, 0x86, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0xD1, 0x2E, 0x54, 0xCF, 0xF0, 0x75, 0xF0, +0x04, 0xEF, 0xD1, 0x2E, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0xD1, 0x2E, 0x54, 0x7F, 0x12, +0x95, 0x54, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x12, 0x75, 0x8E, 0xEE, 0xF0, 0x74, 0x91, 0x2F, +0x91, 0xD7, 0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0xC1, 0xC9, 0x74, 0x11, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x21, 0x74, 0x0F, 0xF0, 0x22, +0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x13, 0x12, 0x45, 0x8A, 0xE0, 0x22, 0xF0, 0x90, +0x00, 0x01, 0x02, 0x06, 0xA2, 0x12, 0x45, 0x8A, 0xE4, 0xF0, 0xA3, 0x22, 0x12, 0x35, 0x26, 0x75, +0x40, 0xFF, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x06, 0xA2, 0x12, 0xA5, 0x19, 0x90, 0xA0, +0xE0, 0xF1, 0x8E, 0x90, 0xA0, 0xE1, 0xF1, 0xA4, 0x90, 0xA0, 0xEB, 0xF0, 0x91, 0x34, 0x90, 0xA0, +0xEC, 0x91, 0xE1, 0x90, 0xA0, 0xF6, 0x12, 0x6D, 0x4D, 0x90, 0xA0, 0xF7, 0xF0, 0x22, 0x90, 0xA0, +0x4D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, +0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0x22, 0x7F, 0x2C, 0x7E, 0x09, 0x02, 0x38, 0x45, 0xFF, 0xEC, +0x90, 0xA2, 0x8C, 0x02, 0x08, 0x6D, 0x81, 0xF5, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x11, +0x02, 0x45, 0x8A, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0xA2, 0xAB, 0xF0, 0x90, 0xA0, 0x37, 0xE0, +0x90, 0xA2, 0xAC, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x90, 0xA2, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0xAB, 0xE0, 0xF5, 0x3B, +0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0xA2, 0xA7, 0x12, 0x9E, 0xB8, 0xA3, 0xA3, 0xA3, +0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA1, 0xFC, 0xF0, 0x90, 0xA0, 0xAE, +0xE0, 0x20, 0xE0, 0x02, 0x21, 0x7B, 0x90, 0xA0, 0xB0, 0xE0, 0xB4, 0x14, 0x0B, 0x7F, 0x01, 0x51, +0x1A, 0xEF, 0x60, 0x02, 0x21, 0x7B, 0x21, 0x76, 0x31, 0x83, 0x12, 0x77, 0xD5, 0x90, 0xA1, 0xFA, +0xF0, 0x60, 0x07, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x21, 0x3D, 0x90, 0xA0, 0xB0, 0xE0, 0x70, 0x34, +0xF1, 0xE3, 0x54, 0x07, 0x30, 0xE0, 0x02, 0x21, 0x2D, 0x12, 0xBC, 0x61, 0x7D, 0x4E, 0x7F, 0x6F, +0x91, 0xC6, 0x31, 0x83, 0xF1, 0x1C, 0x7B, 0x04, 0x7D, 0x01, 0x91, 0x71, 0xBF, 0x01, 0x0E, 0x31, +0x83, 0x51, 0x0F, 0x44, 0x01, 0xF0, 0x90, 0xA0, 0xB0, 0x74, 0x01, 0xF0, 0x22, 0x12, 0xBB, 0xB0, +0x7D, 0x4F, 0x80, 0x6C, 0x90, 0xA0, 0xB0, 0xE0, 0x64, 0x01, 0x70, 0x71, 0x31, 0x83, 0x51, 0x0F, +0xFF, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0xFC, 0x74, 0x01, 0xF0, 0x80, 0x15, 0xEF, 0xC3, 0x13, 0x20, +0xE0, 0x0F, 0x90, 0xA1, 0xFC, 0x74, 0x01, 0xF0, 0x12, 0xBC, 0x61, 0x7D, 0x50, 0x7F, 0x6F, 0x91, +0xC6, 0x90, 0xA1, 0xFC, 0xE0, 0x60, 0x46, 0x90, 0xA1, 0x39, 0xE0, 0x64, 0x06, 0x60, 0x33, 0xE0, +0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x01, 0x40, 0x08, 0x90, 0xA1, 0xFD, 0x74, 0x04, 0xF0, 0x80, 0x05, +0xE4, 0x90, 0xA1, 0xFD, 0xF0, 0x31, 0x83, 0xF1, 0x1C, 0x90, 0xA1, 0xFD, 0xE0, 0x91, 0x6E, 0xBF, +0x01, 0x09, 0xF1, 0xD5, 0x74, 0x03, 0x12, 0xA3, 0x78, 0x01, 0x1B, 0x12, 0xBB, 0xB0, 0x7D, 0x51, +0x81, 0xC6, 0xE4, 0x90, 0xA1, 0x39, 0x31, 0x7C, 0x51, 0x0F, 0x54, 0xFB, 0xF0, 0x90, 0xA0, 0xB0, +0xE0, 0x64, 0x05, 0x70, 0x46, 0xFF, 0x51, 0x1A, 0xEF, 0x70, 0x40, 0x80, 0x39, 0x90, 0xA1, 0xFA, +0xE0, 0x64, 0x03, 0x70, 0x36, 0x90, 0xA0, 0xB0, 0xE0, 0x64, 0x05, 0x70, 0x2E, 0xF1, 0xE3, 0x54, +0x07, 0x20, 0xE0, 0x14, 0x31, 0x83, 0x04, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xFF, 0x75, +0xF0, 0x0B, 0xEF, 0xF1, 0xCB, 0xEF, 0x11, 0x13, 0x31, 0x83, 0xFD, 0x7F, 0x02, 0x91, 0xD1, 0xE4, +0xFF, 0x51, 0x1A, 0xEF, 0x70, 0x05, 0x7F, 0x06, 0x12, 0x9F, 0x71, 0x22, 0xF0, 0x90, 0xA0, 0xB0, +0x74, 0x05, 0xF0, 0x90, 0xA0, 0xAE, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0x22, 0xE4, 0x90, 0xA1, 0xF9, +0xF0, 0x90, 0xA0, 0xAE, 0xE0, 0xFF, 0x30, 0xE0, 0x75, 0xF1, 0xE3, 0x54, 0x07, 0x20, 0xE0, 0x6E, +0xEF, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x51, 0x0F, 0xFE, 0x30, 0xE0, 0x62, 0x75, 0xF0, 0x0B, 0xEF, +0x90, 0xA0, 0xE2, 0x12, 0x45, 0x8A, 0xEE, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x0B, 0xEF, 0x51, 0x12, +0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x02, 0xF1, 0xDC, 0x31, 0x83, 0x51, 0x0F, +0x54, 0xFB, 0xF0, 0x12, 0x88, 0xEE, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x22, 0x31, 0x7D, 0x51, +0x0F, 0x44, 0x02, 0xF0, 0x90, 0xA1, 0x39, 0x74, 0x01, 0x31, 0x82, 0xFD, 0x7F, 0x02, 0x91, 0xD1, +0x90, 0xA1, 0xF9, 0xE0, 0x60, 0x18, 0xE4, 0x90, 0xA1, 0x00, 0xF0, 0xA3, 0xF0, 0x01, 0x48, 0x90, +0xA1, 0x00, 0xF1, 0xDC, 0x31, 0x83, 0x51, 0x0F, 0x54, 0xFD, 0xF0, 0x12, 0x66, 0x3A, 0x22, 0x75, +0xF0, 0x0B, 0x90, 0xA0, 0xE2, 0x12, 0x45, 0x8A, 0xE0, 0x22, 0x90, 0xA1, 0xFE, 0xEF, 0xF0, 0xF1, +0x55, 0xEF, 0x70, 0x02, 0xFF, 0x22, 0x31, 0x83, 0x90, 0xA0, 0xFC, 0xF0, 0x12, 0xBA, 0xAB, 0xB5, +0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x31, 0x83, 0x90, 0xA1, 0xFF, 0xF0, 0x90, 0xA1, 0xFE, 0xE0, +0x90, 0xA0, 0xB0, 0x70, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x14, 0xF0, 0x12, 0xBC, 0x6A, 0x12, 0xBC, +0xF2, 0x30, 0xE0, 0x42, 0x12, 0xBB, 0x59, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, +0xE0, 0xFE, 0x75, 0xF0, 0x0B, 0xEF, 0x90, 0xA0, 0xDB, 0x12, 0x45, 0x8A, 0xEE, 0xF0, 0x90, 0xA1, +0xFF, 0xE0, 0xFF, 0x24, 0x28, 0x12, 0xBB, 0x5C, 0x04, 0xF0, 0x12, 0xBB, 0x59, 0xFF, 0x90, 0xA1, +0x04, 0xE0, 0xFE, 0xEF, 0xB5, 0x06, 0x0F, 0x90, 0xA1, 0xFF, 0xE0, 0x24, 0x28, 0xF5, 0x82, 0xE4, +0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA1, 0xFF, 0x12, 0x9F, 0xD1, 0xFC, 0x90, 0xA0, 0xFC, +0x12, 0x9F, 0xD1, 0x6C, 0x60, 0x13, 0x90, 0xA1, 0xFF, 0xE0, 0x75, 0xF0, 0x0B, 0x12, 0xB5, 0xD4, +0x90, 0xA1, 0xFF, 0xE0, 0x75, 0xF0, 0x0B, 0xB1, 0x49, 0x12, 0xBC, 0x6A, 0x90, 0xA0, 0xE3, 0x12, +0x45, 0x8A, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xFE, 0xE0, 0x70, 0x24, 0x90, 0xA0, 0xFE, 0xE0, 0xFE, +0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x18, 0x75, 0xF0, 0x0B, 0xEF, 0x12, 0x77, 0xD8, 0xFF, 0x60, +0x03, 0xBF, 0x02, 0x0B, 0x90, 0xA1, 0xFF, 0xE0, 0xF1, 0x1C, 0xE4, 0xFB, 0xFD, 0x91, 0x71, 0x90, +0xA1, 0xFF, 0xE0, 0xFD, 0x7F, 0x01, 0x91, 0xD1, 0x90, 0xA0, 0xFE, 0x12, 0x89, 0xE4, 0xBF, 0x02, +0x05, 0xE4, 0xFF, 0x12, 0x9F, 0x71, 0x7F, 0x01, 0x22, 0x12, 0xBA, 0xAB, 0xB5, 0x07, 0x04, 0xEE, +0x54, 0xF1, 0xF0, 0x31, 0x83, 0x12, 0xBA, 0xCC, 0x11, 0x13, 0xE4, 0x90, 0xA0, 0xB0, 0xF0, 0xF1, +0x55, 0x12, 0xBA, 0xC2, 0xF1, 0xF9, 0xE0, 0xFA, 0x12, 0xA6, 0xD9, 0xFC, 0x54, 0x03, 0xFD, 0xEC, +0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, 0xC4, 0x54, 0x0F, 0x90, 0xA2, 0xDF, 0xF0, 0xAF, 0x02, 0x12, +0xB5, 0xF3, 0x31, 0x83, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xB2, 0xB1, 0x4C, 0x31, 0x83, 0xFF, 0x75, +0xF0, 0x0E, 0x90, 0xA0, 0xBC, 0x12, 0x45, 0x8A, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0E, 0xEF, 0x91, +0xB4, 0x31, 0x83, 0xFD, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xE0, +0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0xE2, 0xE0, 0xFF, 0xC3, 0x94, 0x03, +0x40, 0x02, 0x81, 0x08, 0x90, 0xA2, 0xE1, 0xE0, 0xFE, 0x12, 0xA6, 0xF7, 0x75, 0xF0, 0x03, 0xEF, +0x12, 0xBB, 0xBD, 0xE0, 0x90, 0xA2, 0xE3, 0xF0, 0x90, 0xA2, 0xE0, 0xE0, 0x60, 0x24, 0x90, 0xA2, +0xE3, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x12, 0xA6, 0xF1, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, +0xE2, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0xBB, 0x31, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, +0x80, 0x20, 0x12, 0xBC, 0x16, 0x75, 0xF0, 0x0E, 0x12, 0xA6, 0xF1, 0xC0, 0x83, 0xC0, 0x82, 0x90, +0xA2, 0xE2, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0xBB, 0x31, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, +0xF4, 0x5F, 0x90, 0xA2, 0xE3, 0xF0, 0x12, 0xBC, 0x16, 0x12, 0xA6, 0xF7, 0xC0, 0x83, 0xC0, 0x82, +0x90, 0xA2, 0xE2, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0xBB, 0xBD, 0xEF, 0xF0, +0x90, 0xA2, 0xE2, 0xE0, 0x04, 0xF0, 0x61, 0x78, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0xAD, +0xE0, 0x30, 0xE0, 0x59, 0x90, 0xA0, 0xB0, 0xE0, 0x70, 0x29, 0x7D, 0x16, 0xF1, 0xC5, 0x31, 0x83, +0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xBD, 0xF1, 0x22, 0xE4, 0x91, 0x6E, 0x31, 0x83, 0x75, 0xF0, 0x0E, +0xF1, 0xF3, 0xE0, 0x44, 0x01, 0xF0, 0xF1, 0xD5, 0x74, 0x03, 0x11, 0x13, 0x90, 0xA0, 0xB0, 0x74, +0x01, 0xF0, 0x22, 0x90, 0xA0, 0xB0, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x31, 0x83, 0xFF, 0x75, 0xF0, +0x0E, 0xF1, 0xF3, 0xE0, 0x30, 0xE0, 0x14, 0x12, 0x97, 0xD4, 0xF1, 0x22, 0xE4, 0xFB, 0x7D, 0x01, +0x91, 0x71, 0xF1, 0xD5, 0x74, 0x03, 0x12, 0xA7, 0x0F, 0x01, 0x1B, 0x71, 0x09, 0x22, 0xFB, 0x7D, +0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xA0, 0x12, 0x97, 0xC0, 0x90, 0x04, +0x1D, 0xE0, 0x60, 0x25, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0xA6, 0xF0, 0x7D, 0x14, 0xF1, 0x51, +0xEF, 0x64, 0x01, 0x70, 0x05, 0x12, 0x84, 0xFC, 0x80, 0x04, 0x7F, 0x00, 0x80, 0x11, 0x90, 0xA2, +0xA6, 0xE0, 0xFF, 0x7D, 0x15, 0x91, 0xC6, 0x80, 0x03, 0x12, 0x84, 0xFC, 0x12, 0xBC, 0x46, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0xBD, 0x12, 0x45, 0x8A, 0xE0, 0xFF, 0x7E, 0x00, 0xE4, 0xFB, +0xFD, 0x91, 0x71, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x9E, 0x96, 0xED, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xFF, 0xED, 0xF0, 0x90, 0xA2, 0xFE, +0xEF, 0xF0, 0x64, 0x02, 0x70, 0x23, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0x00, 0xF0, 0x7D, 0x4A, +0xF1, 0xC5, 0xBF, 0x01, 0x07, 0x90, 0x04, 0xD4, 0x74, 0xFF, 0x80, 0x43, 0x90, 0xA3, 0x00, 0xE0, +0xFF, 0x7D, 0x46, 0x91, 0xC6, 0x7F, 0x00, 0x80, 0x3B, 0x90, 0xA2, 0xFE, 0xE0, 0x64, 0x01, 0x70, +0x2A, 0xFD, 0xFF, 0x91, 0xC6, 0x90, 0xA2, 0xFF, 0xE0, 0xFF, 0x75, 0xF0, 0x0B, 0x90, 0xA0, 0xE0, +0x12, 0x45, 0x8A, 0xE0, 0xF4, 0x90, 0x04, 0xD4, 0xF0, 0x75, 0xF0, 0x0B, 0xEF, 0x90, 0xA0, 0xE1, +0x12, 0x45, 0x8A, 0xE0, 0xF4, 0x90, 0x04, 0xD5, 0xF0, 0x80, 0x07, 0x90, 0x04, 0xD4, 0xE4, 0xF0, +0xA3, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0xDC, 0x12, 0x45, 0x8A, 0xE0, +0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0xA3, 0x0B, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0xEF, 0x14, 0x60, 0x02, 0xC1, 0x49, 0x90, +0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA3, 0x0B, 0xE0, 0xFB, 0xC4, 0x33, 0x54, 0xE0, 0xFE, +0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4E, 0xFE, 0xF0, 0xE4, 0xFD, 0x12, 0xB6, 0xDF, 0x90, 0xA3, +0x0C, 0xEF, 0xF0, 0x90, 0x04, 0x83, 0xF0, 0x90, 0xA2, 0x2D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, +0x01, 0x90, 0xA2, 0x31, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x08, 0xF1, +0x16, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA2, 0x31, 0x12, 0x08, 0x79, 0x00, 0x00, +0x00, 0x01, 0xF1, 0x12, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA3, 0x0B, 0x12, 0x5D, +0x41, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0x12, 0xBB, 0xC9, +0x7E, 0x0A, 0xF1, 0x16, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x0B, 0x12, 0x5D, +0x41, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0x12, 0xBB, 0xC9, 0x7E, 0x0D, 0xF1, 0x16, 0x12, +0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x0C, 0x12, 0x5D, 0x41, 0xEF, 0x54, 0x03, 0xFF, +0xE4, 0x78, 0x1A, 0x12, 0x08, 0x5A, 0x90, 0xA2, 0x31, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08, +0xF1, 0x16, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA2, 0x31, 0x12, 0x08, 0x79, 0x00, +0x00, 0x00, 0x00, 0x12, 0xBB, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA2, 0x1F, +0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x59, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, +0x90, 0xA2, 0x2D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA2, 0x31, 0x12, 0x08, 0x79, +0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0xF1, 0x16, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, +0x01, 0x90, 0xA2, 0x31, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xF1, 0x12, 0x12, 0x08, 0x79, +0x00, 0x00, 0x0C, 0x00, 0x90, 0xA2, 0x31, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x12, 0xBB, +0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA2, 0x1F, 0x12, 0x08, 0x79, 0x00, 0x00, +0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x12, 0xB5, 0x5E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x2B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, +0x37, 0x4E, 0x90, 0xA2, 0x35, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x2D, 0x12, 0x45, 0x72, 0x12, 0x08, +0x3A, 0x90, 0xA2, 0x35, 0x12, 0xB6, 0x74, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, +0xA2, 0x2D, 0x12, 0x45, 0x72, 0x90, 0xA2, 0x31, 0x12, 0xB6, 0x74, 0xD0, 0x03, 0xD0, 0x02, 0xD0, +0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0x90, 0xA2, 0x39, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x39, 0x12, +0x47, 0xCC, 0x90, 0xA2, 0x2B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x7F, 0x00, 0x7E, 0x09, 0xD1, 0xB0, 0x90, 0xA2, 0x2D, 0x22, 0x75, 0xF0, 0x0B, 0x90, +0xA0, 0xE4, 0x12, 0x45, 0x8A, 0xE0, 0xFF, 0x7E, 0x00, 0x22, 0x8F, 0x54, 0xF1, 0x4F, 0x75, 0xF0, +0x0E, 0xE5, 0x54, 0xF1, 0xFD, 0xE0, 0xFC, 0x12, 0xBC, 0x73, 0x12, 0xB5, 0xD7, 0x12, 0xBC, 0x73, +0xB1, 0x4C, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x91, 0xB4, 0xAD, 0x54, 0x7F, 0x01, 0x61, 0x66, 0x7D, +0x17, 0x7F, 0xFF, 0x91, 0xC6, 0xE4, 0x90, 0xA2, 0xFB, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0x22, 0xE0, +0x90, 0xA2, 0xFD, 0xF0, 0x7D, 0x47, 0x7F, 0xFF, 0x91, 0xC6, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x11, +0xA3, 0xE0, 0x70, 0x0D, 0xA3, 0xE0, 0x70, 0x09, 0xA3, 0xE0, 0x70, 0x05, 0xF1, 0xEA, 0x7F, 0x01, +0x22, 0x12, 0x5F, 0xDC, 0x30, 0xE0, 0x15, 0xD3, 0x90, 0xA2, 0xFC, 0xE0, 0x94, 0x03, 0x90, 0xA2, +0xFB, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x80, 0x13, 0x7F, 0x01, 0x80, 0x1D, 0xD3, 0x90, 0xA2, 0xFC, +0xE0, 0x94, 0xE8, 0x90, 0xA2, 0xFB, 0xE0, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x01, 0xC0, 0xE0, 0x44, +0x20, 0xF0, 0xF1, 0xEA, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2, +0xFB, 0xF1, 0xDC, 0x80, 0xA5, 0x7F, 0x6F, 0x91, 0xC6, 0x80, 0x8A, 0x90, 0xA0, 0xDD, 0x12, 0x45, +0x8A, 0xE0, 0x24, 0xF6, 0xFF, 0xE4, 0x90, 0xA2, 0xAB, 0xF0, 0xA3, 0x22, 0xE4, 0x75, 0xF0, 0x01, +0x02, 0x08, 0xD6, 0x90, 0xA0, 0xFE, 0xE0, 0xC4, 0x13, 0x22, 0x90, 0xA2, 0xFD, 0xE0, 0xFF, 0x7D, +0x48, 0x81, 0xC6, 0x90, 0xA0, 0xB9, 0x02, 0x45, 0x8A, 0xFD, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xB1, +0x02, 0x45, 0x8A, 0x7F, 0xF4, 0x12, 0x46, 0xAB, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x46, +0xAB, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x11, 0x03, 0x90, +0x9E, 0x98, 0xEF, 0xF0, 0x12, 0xB0, 0x65, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, +0xE0, 0x44, 0x80, 0xF0, 0x11, 0x8F, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x46, 0x8D, 0x7F, 0x16, +0x11, 0xAA, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0x8D, 0x12, 0xB7, 0x93, 0xEF, 0x64, 0x01, +0x70, 0x30, 0x90, 0xA1, 0xBF, 0xE0, 0x54, 0x07, 0xF0, 0xE0, 0xFF, 0x64, 0x07, 0x60, 0x05, 0xEF, +0x64, 0x04, 0x70, 0x1E, 0x12, 0xB0, 0x33, 0xEF, 0x64, 0x01, 0x70, 0x16, 0x7F, 0x16, 0x11, 0xAA, +0x44, 0x60, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0x8D, 0x11, 0x8F, 0x44, 0x05, 0xFD, 0x7F, 0x17, 0x12, +0x46, 0x8D, 0x7F, 0x38, 0x12, 0xBD, 0x42, 0x7F, 0x38, 0x12, 0x46, 0x8D, 0x02, 0x37, 0x99, 0x7F, +0x17, 0x12, 0x46, 0xAB, 0xEF, 0x54, 0xFC, 0x22, 0x7F, 0xA3, 0x12, 0x46, 0xAB, 0xEF, 0x54, 0xF8, +0x44, 0x05, 0xFD, 0x7F, 0xA3, 0x12, 0x46, 0x8D, 0x7F, 0xA0, 0x12, 0x46, 0xAB, 0xEF, 0x54, 0x0F, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xAD, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, +0xA3, 0x12, 0x45, 0x9F, 0x11, 0x98, 0x64, 0x04, 0x70, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, +0x13, 0x90, 0xA2, 0xAD, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x45, 0x96, 0x12, 0x95, 0x78, +0x7F, 0x01, 0x80, 0x0E, 0x7F, 0x01, 0x51, 0xD0, 0x7F, 0x02, 0x80, 0x06, 0x7F, 0x02, 0x51, 0xD0, +0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, 0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, +0x90, 0xA2, 0x08, 0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x41, 0xCF, 0x90, 0xA2, 0xEE, 0xE0, 0x70, 0x1A, +0x7F, 0x2E, 0x12, 0x46, 0xAB, 0x90, 0xA0, 0x88, 0xEF, 0xF0, 0x7F, 0x2D, 0x12, 0x46, 0xAB, 0x90, +0xA0, 0x89, 0xEF, 0xF0, 0x90, 0xA2, 0xEE, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x08, 0xE0, 0x64, 0x15, +0x70, 0x58, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x11, 0xF4, 0x54, 0x3F, 0x04, 0xFE, 0x91, +0x02, 0xC3, 0x9E, 0x71, 0xFA, 0x40, 0x12, 0xE4, 0xF0, 0x80, 0x0E, 0x91, 0x02, 0xFE, 0xEF, 0x54, +0x3F, 0x2E, 0x71, 0xFA, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA2, 0x07, 0xE0, 0xFF, 0x54, 0x30, +0xC4, 0x54, 0x0F, 0xFE, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA2, 0x05, 0xF0, 0xE0, 0xFD, +0x7F, 0x2E, 0x12, 0x46, 0x8D, 0x90, 0xA2, 0x07, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA0, 0x89, +0xE0, 0x54, 0x0F, 0x4F, 0xFD, 0x7F, 0x2D, 0x12, 0x46, 0x8D, 0x90, 0xA2, 0x08, 0xE0, 0xB4, 0x21, +0x0C, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x12, 0x98, 0x2B, 0x7F, 0x04, 0x51, 0xD4, 0x90, 0xA2, 0x08, +0xE0, 0xB4, 0x23, 0x04, 0x7F, 0x01, 0x51, 0xEA, 0x90, 0xA2, 0x08, 0xE0, 0xB4, 0x27, 0x04, 0x7F, +0x02, 0x51, 0xEA, 0x90, 0xA2, 0x08, 0xE0, 0xB4, 0x30, 0x0C, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x12, +0x99, 0x17, 0x7F, 0x04, 0x51, 0xD4, 0x90, 0xA2, 0x08, 0xE0, 0x64, 0x34, 0x60, 0x02, 0x41, 0x6E, +0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x5A, 0x90, 0xA0, 0x6F, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, +0x02, 0x41, 0x6E, 0x90, 0xA0, 0x4D, 0xF1, 0xDF, 0x30, 0xE0, 0x1A, 0x51, 0xE3, 0x90, 0xA0, 0x70, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x51, 0xE3, 0xE4, 0xFF, 0xFE, 0xEC, 0x12, 0x47, 0xCE, 0x7F, 0x48, +0x7E, 0x09, 0x12, 0x38, 0x45, 0x91, 0x0B, 0x7D, 0x01, 0x12, 0x46, 0xC8, 0x90, 0xA2, 0x05, 0x74, +0x01, 0xF0, 0xFB, 0x7A, 0xA2, 0x79, 0x05, 0xFD, 0x7F, 0x34, 0x11, 0xB1, 0x90, 0xA0, 0x93, 0xE0, +0x44, 0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0xAE, 0xA2, 0x80, +0x3D, 0x91, 0x0B, 0xE4, 0xFD, 0x12, 0x46, 0xC8, 0x90, 0xA0, 0x4D, 0x12, 0x6B, 0x0A, 0x30, 0xE0, +0x21, 0x51, 0xE3, 0xE4, 0xFB, 0xFA, 0xED, 0xF9, 0xEC, 0xF8, 0x90, 0xA0, 0x70, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x12, 0x45, 0x54, 0x12, 0x47, 0xCE, 0x7F, 0x48, 0x7E, 0x09, 0x12, +0x38, 0x45, 0xF1, 0xE6, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0xAE, 0xE3, 0x90, 0xA2, +0x08, 0xE0, 0xFD, 0xB4, 0x35, 0x07, 0x90, 0xA0, 0x51, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x36, +0x22, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA2, 0x05, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA2, 0x06, +0xF0, 0x90, 0xA2, 0x08, 0xE0, 0xFF, 0x90, 0xA2, 0x05, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA2, 0x79, +0x06, 0x11, 0xB1, 0x90, 0xA2, 0x08, 0xE0, 0xB4, 0x37, 0x03, 0x12, 0xAC, 0x33, 0x90, 0xA2, 0x08, +0xE0, 0xB4, 0x40, 0x14, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0xA0, 0x6D, 0x74, 0x01, +0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA0, 0x6D, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0x22, +0x51, 0xF0, 0x7F, 0x04, 0x8F, 0x6F, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9E, 0x92, 0xE0, 0x45, +0x6F, 0xF0, 0x22, 0x7F, 0x48, 0x7E, 0x09, 0x02, 0x37, 0x4E, 0x71, 0x15, 0x7F, 0x04, 0x80, 0xE4, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x5B, 0x74, 0x15, 0xF0, 0x90, 0xA2, 0x69, +0x74, 0x01, 0xF0, 0x90, 0xA2, 0x5D, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x5B, 0x71, 0x9B, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x3D, 0x74, 0x09, 0xF0, 0x90, 0xA2, 0x4B, 0x74, 0x07, +0xF0, 0x90, 0xA2, 0x3F, 0xEF, 0xF0, 0x70, 0x31, 0x90, 0xA0, 0x63, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, +0x60, 0x02, 0x80, 0x0C, 0x90, 0x07, 0x70, 0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, +0x90, 0xA2, 0x40, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x40, 0xF0, 0xE4, 0x90, 0xA2, +0x41, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA2, 0x40, +0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA2, 0x41, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA2, 0x42, +0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA2, 0x43, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA2, 0x44, +0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA2, 0x45, 0xF0, 0x90, 0xA2, 0x40, 0xE0, 0x54, 0x01, 0x90, +0xA0, 0x63, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x3D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x90, 0x9F, 0xB8, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, +0x14, 0xFF, 0x90, 0x9F, 0xB9, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, +0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x2A, 0xC0, 0x01, 0x90, 0x9F, 0xB9, +0xE0, 0x12, 0x9E, 0xCB, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, +0x06, 0x63, 0x90, 0x9F, 0xB9, 0x12, 0x7F, 0xE0, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, +0xE4, 0x90, 0x9F, 0xB9, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x07, 0xF0, 0xD3, 0x94, +0x3F, 0x22, 0x90, 0xA0, 0x88, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0xA0, 0x4D, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0x8D, 0xE0, 0xFB, 0x90, 0xA0, 0x8C, 0xE0, 0x90, 0xA2, +0xC3, 0xF0, 0x22, 0x90, 0xA0, 0x65, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0xAC, 0x89, 0x80, 0x03, 0x12, +0xA0, 0xCA, 0x90, 0xA0, 0x93, 0xE0, 0x30, 0xE0, 0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0x94, +0xE0, 0x64, 0x08, 0x70, 0x17, 0x90, 0xA0, 0x93, 0xE0, 0x30, 0xE0, 0x0B, 0x91, 0x0B, 0xE4, 0xFD, +0x12, 0x46, 0xC8, 0xF1, 0xE6, 0x80, 0x05, 0xE4, 0x90, 0xA0, 0x94, 0xF0, 0xF1, 0xDC, 0x30, 0xE0, +0x13, 0x90, 0xA0, 0x95, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90, 0x04, 0x9C, 0xE4, 0xF0, +0x90, 0xA0, 0x95, 0xF0, 0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x9F, 0xD1, 0x74, 0x01, +0xF0, 0x90, 0x9F, 0xD9, 0xE0, 0x70, 0x02, 0xA1, 0x12, 0x90, 0x9F, 0xF0, 0xE0, 0x04, 0xB1, 0x27, +0x12, 0x45, 0x54, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0xB1, 0x41, +0x78, 0x10, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, +0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0xB1, 0x41, 0x78, 0x18, 0x12, 0x08, 0x5A, +0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0x90, 0xA0, 0x24, 0x12, 0x08, +0x6D, 0x90, 0x9F, 0xD5, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x30, 0xE0, 0x0C, 0x12, 0xAB, 0xC0, +0x74, 0x05, 0xF0, 0x12, 0xAA, 0xBC, 0x12, 0xAB, 0xD1, 0x90, 0x9F, 0xD5, 0x12, 0x89, 0xDA, 0x30, +0xE0, 0x09, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x02, 0xF1, 0xAF, 0x90, 0xA3, 0x12, 0xE0, 0x04, +0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, +0x01, 0xF0, 0x7F, 0x01, 0x51, 0xD4, 0x90, 0xA0, 0x3D, 0xE0, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x3B, +0xE0, 0x30, 0xE4, 0x02, 0xF1, 0xAF, 0x22, 0xF0, 0x90, 0x05, 0x61, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, +0xFE, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x05, +0x60, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0x12, 0xA5, 0x19, 0xFF, 0x54, 0x0F, 0xF5, 0x54, +0xEF, 0xC4, 0x54, 0x0F, 0x64, 0x0F, 0x70, 0x39, 0x90, 0xA0, 0xAE, 0xE0, 0x54, 0xFE, 0xFF, 0xF0, +0xE5, 0x54, 0x54, 0x07, 0x25, 0xE0, 0xFE, 0xEF, 0x54, 0xF1, 0x4E, 0xF1, 0xD4, 0xFF, 0xBF, 0x03, +0x09, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xED, 0xF0, 0x80, 0x03, 0x12, 0x66, 0x09, 0xAF, 0x54, 0x12, +0xB6, 0x7A, 0xBF, 0x01, 0x08, 0xE4, 0xFD, 0xFF, 0x12, 0x54, 0xD1, 0x80, 0x00, 0x7F, 0x02, 0x80, +0x72, 0xE5, 0x54, 0x75, 0xF0, 0x0B, 0xA4, 0x24, 0xDB, 0xF9, 0x74, 0xA0, 0x35, 0xF0, 0xFA, 0x7B, +0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE5, 0x53, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x52, 0x85, 0x51, 0x40, +0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0xD0, 0x01, 0xD0, 0x02, 0x12, 0x35, 0x26, 0xAB, 0x51, +0xAA, 0x52, 0xA9, 0x53, 0xF1, 0xC6, 0x54, 0x80, 0x12, 0x4F, 0xD2, 0xFF, 0x75, 0xF0, 0x0B, 0xE5, +0x54, 0x12, 0xBC, 0xF2, 0x54, 0xFE, 0x4F, 0xF0, 0x75, 0xF0, 0x0B, 0xE5, 0x54, 0x90, 0xA0, 0xDE, +0x12, 0x45, 0x8A, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0x14, 0x65, 0x54, +0x60, 0x02, 0xE1, 0xAE, 0x90, 0x9F, 0xD9, 0xE0, 0x70, 0x07, 0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, +0x05, 0x7F, 0x05, 0x02, 0x9F, 0x71, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0xC4, +0x54, 0x0F, 0x90, 0xA0, 0xAF, 0xF1, 0xC5, 0xFF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFE, 0x90, 0xA0, +0xAE, 0xE0, 0x54, 0x0F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0x25, 0xE0, 0xFF, 0x90, 0xA0, 0xFE, 0xE0, +0x54, 0xDF, 0x4F, 0xFF, 0xF1, 0xC5, 0x54, 0x60, 0xC4, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xF9, 0x4E, +0x90, 0xA0, 0xFE, 0xF0, 0x90, 0xA0, 0xAE, 0xE0, 0x54, 0xF1, 0xF0, 0x12, 0xBC, 0x0F, 0x90, 0xA0, +0xAE, 0xE0, 0x44, 0x01, 0xF1, 0xD4, 0x64, 0x03, 0x70, 0x49, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x12, +0xF0, 0xE4, 0x90, 0xA1, 0xCF, 0xF0, 0x90, 0xA1, 0xCF, 0xE0, 0xFF, 0xFD, 0xC3, 0x74, 0xEB, 0x9D, +0xFD, 0x74, 0x05, 0x94, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xE0, 0xFE, 0xEF, 0xFD, 0x7C, 0x00, 0xC3, +0x74, 0x03, 0x9D, 0xFB, 0xE4, 0x9C, 0x12, 0xBB, 0x74, 0x74, 0x07, 0x9D, 0xFF, 0xE4, 0x9C, 0xFE, +0x74, 0xD0, 0x2F, 0xF5, 0x82, 0x74, 0xA1, 0x3E, 0xF5, 0x83, 0xE4, 0xF1, 0xCC, 0xE0, 0xB4, 0x04, +0xC5, 0x80, 0x58, 0x12, 0xA7, 0x00, 0xE4, 0x90, 0xA1, 0xCF, 0xF0, 0x90, 0xA1, 0xCF, 0xE0, 0xF9, +0xC3, 0x94, 0x04, 0x50, 0x46, 0xE0, 0xFF, 0xFD, 0x7C, 0x00, 0xC3, 0x74, 0x87, 0x9D, 0xFB, 0x74, +0x05, 0x9C, 0x8B, 0x82, 0xF5, 0x83, 0xE0, 0xFE, 0xEF, 0xFB, 0xC3, 0x74, 0x03, 0x9B, 0xFB, 0xE4, +0x94, 0x00, 0x12, 0xBB, 0x74, 0x74, 0x8B, 0x9D, 0xFF, 0x74, 0x05, 0x9C, 0x8F, 0x82, 0xF5, 0x83, +0xE0, 0xFF, 0xE9, 0xFD, 0xC3, 0x74, 0x07, 0x9D, 0xFD, 0xE4, 0x9C, 0xFC, 0x74, 0xD0, 0x2D, 0xF5, +0x82, 0x74, 0xA1, 0x3C, 0xF5, 0x83, 0xEF, 0xF1, 0xCC, 0x80, 0xB0, 0x7F, 0x03, 0x12, 0x9F, 0x71, +0x90, 0xA0, 0xDD, 0xE0, 0x90, 0xA1, 0x33, 0xB4, 0x64, 0x05, 0x74, 0xC8, 0xF0, 0x80, 0x03, 0x74, +0x64, 0xF0, 0x90, 0xA1, 0xD1, 0xB1, 0x41, 0x12, 0xBB, 0x8C, 0x90, 0xA1, 0xD0, 0xB1, 0x41, 0x12, +0x45, 0x54, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA1, 0xD2, 0xB1, 0x41, 0x78, +0x10, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0xC0, +0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0xB1, 0x41, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, +0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0x90, 0xA1, 0x2B, 0x12, 0x08, 0x6D, +0x90, 0xA1, 0xD5, 0xB1, 0x41, 0x12, 0xBB, 0x8C, 0x90, 0xA1, 0xD4, 0xB1, 0x41, 0x12, 0x45, 0x54, +0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA1, 0xD6, 0xB1, 0x41, 0x78, 0x10, 0x12, +0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0xC0, 0x04, 0xC0, +0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0xB1, 0x41, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, +0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0x90, 0xA1, 0x2F, 0x12, 0x08, 0x6D, 0x22, 0x7D, +0x02, 0x7F, 0x02, 0xF1, 0xB9, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x12, 0xBD, 0x3A, 0xFE, 0xF6, +0x74, 0x30, 0x02, 0x66, 0x16, 0xF0, 0x90, 0x00, 0x06, 0x02, 0x06, 0xA2, 0xF0, 0x90, 0xA1, 0xCF, +0xE0, 0x04, 0xF0, 0x22, 0xF0, 0x90, 0xA0, 0xDE, 0xE0, 0x54, 0x07, 0x22, 0x90, 0xA0, 0x4E, 0xE0, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0xA0, 0x93, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, +0x22, 0x7D, 0x01, 0x7F, 0x17, 0x01, 0xB1, 0x75, 0xE8, 0x07, 0x75, 0xA8, 0x85, 0x22, 0x7F, 0x81, +0x12, 0x46, 0xAB, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0x8D, 0x7F, 0x80, 0x12, 0x78, +0xB7, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0x8D, 0x12, 0xB1, 0x3B, 0x12, 0x3E, 0x11, 0x12, 0x9E, 0xFD, +0x11, 0x69, 0x7F, 0x01, 0x12, 0x43, 0xA5, 0x90, 0xA0, 0xAC, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, +0xA5, 0x90, 0xA0, 0xAC, 0xE0, 0x04, 0xF0, 0x12, 0x58, 0x1D, 0x12, 0x91, 0x29, 0x7F, 0x80, 0x12, +0xBD, 0x42, 0x7F, 0x80, 0x12, 0x46, 0x8D, 0x75, 0x28, 0xFF, 0x12, 0x5F, 0xF7, 0x12, 0x9D, 0xDC, +0x7F, 0x81, 0x12, 0x46, 0xAB, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0x8D, 0x12, 0xB1, +0x7C, 0x12, 0xB7, 0x77, 0xE4, 0xFF, 0x02, 0x44, 0x2E, 0xE4, 0x90, 0x9E, 0x92, 0x11, 0x73, 0xA3, +0xF0, 0x22, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x1F, +0x91, 0x5A, 0x90, 0x01, 0x38, 0x11, 0x72, 0x90, 0x01, 0x30, 0x11, 0x73, 0x90, 0x01, 0x30, 0x74, +0x10, 0xF0, 0x90, 0x01, 0x39, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0x12, +0x9E, 0xE4, 0x90, 0xA0, 0x47, 0xE0, 0x90, 0x01, 0x31, 0xF0, 0x90, 0xA0, 0x48, 0xE0, 0x90, 0x01, +0x32, 0xF0, 0x90, 0xA0, 0x49, 0xE0, 0x90, 0x01, 0x33, 0xF0, 0x90, 0xA0, 0x42, 0xE0, 0x90, 0x01, +0x38, 0xF0, 0x90, 0xA0, 0x45, 0xE0, 0x90, 0x01, 0x3B, 0x91, 0x79, 0x7F, 0x01, 0x51, 0x3E, 0x7E, +0x00, 0x7F, 0x62, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xD4, 0x12, 0x08, 0xAA, 0x12, 0xBB, +0xA3, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0xD8, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0xDF, 0x14, 0xF0, 0xA3, +0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x90, 0x9F, 0xE5, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x51, 0x30, +0xF0, 0x12, 0xB9, 0xBB, 0xE4, 0xFD, 0xFF, 0x31, 0xC6, 0x7D, 0x0C, 0x7F, 0x02, 0x31, 0xC6, 0x31, +0xC2, 0x90, 0x9E, 0x98, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x9F, 0xE4, 0x74, 0xDD, 0xF0, 0x80, 0x12, +0x90, 0x9E, 0x98, 0xE0, 0x90, 0x9F, 0xE4, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, +0x40, 0xF0, 0x7F, 0x79, 0x12, 0x46, 0xAB, 0xEF, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, +0x12, 0x46, 0xAB, 0xEF, 0x30, 0xE2, 0x06, 0x90, 0x9F, 0xF6, 0x74, 0x02, 0xF0, 0x12, 0xAD, 0x42, +0x51, 0x30, 0xF0, 0x90, 0xA0, 0x41, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0x38, 0xE0, 0x90, 0xA0, +0x42, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90, 0xA0, 0x43, 0xF0, 0x90, 0x01, 0x3A, 0xE0, 0x90, 0xA0, +0x44, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90, 0xA0, 0x45, 0xF0, 0x90, 0x01, 0x30, 0xE0, 0x90, 0xA0, +0x46, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90, 0xA0, 0x47, 0xF0, 0x90, 0x01, 0x32, 0xE0, 0x90, 0xA0, +0x48, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90, 0xA0, 0x49, 0xF0, 0x7F, 0x01, 0x12, 0xAA, 0x8D, 0x12, +0xBC, 0x0F, 0x7E, 0x00, 0xFF, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x3A, 0x12, 0x08, 0xAA, +0x12, 0xBC, 0xCB, 0x12, 0xBC, 0xC3, 0xD1, 0x3A, 0xE4, 0x90, 0xA0, 0x3C, 0xF0, 0x22, 0xE0, 0x54, +0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x15, +0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, +0x90, 0x9F, 0xD4, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x9F, 0xDC, 0xED, 0xF0, 0x80, +0x05, 0x90, 0x9F, 0xDB, 0xED, 0xF0, 0x7F, 0x8F, 0x12, 0x46, 0xAB, 0xEF, 0x30, 0xE4, 0x2C, 0x90, +0xA3, 0x15, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x18, 0x24, 0x02, 0x70, 0x1E, 0x90, 0x9F, 0xD4, +0xE0, 0x12, 0xBC, 0x58, 0xFF, 0x90, 0x9F, 0xDC, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, +0x07, 0x90, 0x9F, 0xDB, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x46, 0x8D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x90, 0x9F, 0xF6, 0xE0, 0x24, 0x04, 0x90, 0x9F, 0xF1, 0xF0, 0xA3, 0x74, 0x0A, 0x22, 0x90, 0xA3, +0x16, 0xEF, 0xF0, 0xD1, 0xB8, 0x90, 0xA3, 0x16, 0xE0, 0x60, 0x02, 0xD1, 0x3A, 0x91, 0x54, 0x90, +0x9F, 0xD3, 0x74, 0x04, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0xA3, 0x17, 0xED, 0xF0, 0x90, 0x9F, 0xD4, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x30, 0xE0, 0x02, 0x61, 0x9D, 0xEE, 0x12, 0x4F, 0xD2, 0x30, 0xE0, 0x02, 0x61, 0x9D, 0x90, 0x9F, +0xDC, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x61, 0x9D, 0xEF, 0x70, 0x02, 0x61, 0x16, 0x24, 0xFE, 0x70, +0x02, 0x61, 0x4F, 0x24, 0xFE, 0x60, 0x47, 0x24, 0xFC, 0x70, 0x02, 0x61, 0x8A, 0x24, 0xFC, 0x60, +0x02, 0x61, 0x9D, 0xEE, 0xB4, 0x0E, 0x02, 0x71, 0xE0, 0x90, 0x9F, 0xDC, 0xE0, 0x70, 0x04, 0x7F, +0x01, 0x51, 0x3E, 0x90, 0x9F, 0xDC, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x01, 0x90, 0x9F, 0xDC, 0xE0, +0xB4, 0x04, 0x0D, 0x90, 0xA3, 0x17, 0xE0, 0xFF, 0x60, 0x04, 0xF1, 0xB0, 0x80, 0x02, 0xD1, 0x48, +0x90, 0x9F, 0xDC, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, 0x9D, 0xD1, 0x2D, 0x61, 0x9D, 0x90, 0x9F, +0xDC, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x3E, 0x90, 0x9F, 0xDC, 0xE0, 0xB4, 0x06, 0x02, 0x91, +0x01, 0x90, 0x9F, 0xDC, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xA2, 0xBF, 0x01, 0x02, 0x71, 0xE0, 0x90, +0x9F, 0xDC, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, 0x9D, 0x71, 0xA2, 0xEF, 0x64, 0x01, 0x60, 0x02, +0x61, 0x9D, 0x91, 0x27, 0x61, 0x9D, 0x90, 0x9F, 0xDC, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xA2, 0xBF, +0x01, 0x02, 0x71, 0xE0, 0x90, 0x9F, 0xDC, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x01, 0x90, 0x9F, 0xDC, +0xE0, 0xB4, 0x0C, 0x07, 0x71, 0xA2, 0xBF, 0x01, 0x02, 0x91, 0x27, 0x90, 0x9F, 0xDC, 0xE0, 0x64, +0x04, 0x70, 0x5A, 0x12, 0xB9, 0x3F, 0xEF, 0x64, 0x01, 0x70, 0x52, 0x91, 0x5A, 0x80, 0x4E, 0x90, +0x9F, 0xDC, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xA2, 0xBF, 0x01, 0x02, 0x71, 0xE0, 0x90, 0x9F, 0xDC, +0xE0, 0xB4, 0x06, 0x02, 0x91, 0x01, 0x90, 0x9F, 0xDC, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0xA2, 0xBF, +0x01, 0x02, 0x91, 0x27, 0x90, 0x9F, 0xDC, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x3E, 0x90, 0x9F, +0xDC, 0xE0, 0xB4, 0x04, 0x18, 0x12, 0xB8, 0x5C, 0x80, 0x13, 0x90, 0x9F, 0xDC, 0xE0, 0xB4, 0x0C, +0x0C, 0x90, 0x9F, 0xD5, 0x12, 0x84, 0xC9, 0x30, 0xE0, 0x03, 0x12, 0xB9, 0xD2, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x4A, 0xE0, 0x30, 0xE0, 0x0D, +0x90, 0xA0, 0x50, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x80, 0x1C, 0x12, 0xA2, 0xB7, +0xBF, 0x01, 0x16, 0x90, 0x9F, 0xD4, 0x12, 0x89, 0xDA, 0x20, 0xE0, 0x0D, 0x90, 0x9F, 0xDB, 0xE0, +0xD3, 0x94, 0x04, 0x50, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x90, 0x9F, 0xD5, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x31, 0xC2, 0x80, 0x0E, 0x12, 0xBA, 0x4D, +0x91, 0x53, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x51, 0x4F, 0xE4, 0xFD, 0xFF, 0x02, 0x54, +0xC6, 0x90, 0x9F, 0xD5, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x07, 0xE0, 0x44, 0x40, 0x91, 0x53, +0x80, 0x0F, 0x31, 0xBE, 0x90, 0x05, 0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x9F, 0xD3, 0x74, 0x0C, +0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x54, 0xC6, 0xF1, 0xA8, 0x70, 0x27, 0x90, 0x9F, 0xD5, 0xE0, 0x54, +0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x54, 0xC6, 0x12, 0x85, 0x71, 0xBF, 0x01, 0x13, 0x90, +0x9F, 0xD4, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x31, 0xC6, 0x90, 0x9F, 0xD3, 0x74, +0x0E, 0xF0, 0x22, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x21, 0xC6, 0x7D, 0x2D, 0x12, 0x57, 0x51, 0x90, +0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x91, 0x84, 0x12, 0x47, 0xEB, 0xE4, 0xFD, 0x7F, +0x01, 0x31, 0xC6, 0xE4, 0x90, 0x9F, 0xD3, 0xF0, 0x22, 0xF0, 0x7D, 0x01, 0x7F, 0x02, 0x91, 0x84, +0x7D, 0x02, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0xC1, 0x16, +0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x91, 0x84, 0x7D, +0x02, 0x7F, 0x03, 0x91, 0x84, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0x12, 0xAB, 0xE1, 0xE4, 0xFF, +0xD1, 0x8C, 0xBF, 0x01, 0x11, 0x12, 0x6C, 0x2D, 0xF0, 0x90, 0x9F, 0xDC, 0xE0, 0x20, 0xE2, 0x08, +0x7D, 0x01, 0x7F, 0x04, 0x41, 0x5A, 0xD1, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0xEF, 0x64, 0x01, 0x70, 0x19, 0xF1, 0x9A, 0x60, 0x09, 0xB1, 0x0F, 0xD1, 0x25, 0x12, 0xBC, 0x4F, +0x80, 0x07, 0xB1, 0x0F, 0xD1, 0x0D, 0x12, 0x5F, 0xAF, 0x12, 0xB9, 0xD2, 0x80, 0x18, 0xF1, 0x9A, +0x60, 0x06, 0xB1, 0x0F, 0xD1, 0x25, 0x80, 0x04, 0xB1, 0x0F, 0xD1, 0x0D, 0x91, 0x80, 0x7D, 0x01, +0x7F, 0x02, 0x91, 0x84, 0xD1, 0x2D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x01, 0x3F, 0x74, +0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x22, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, +0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xE9, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0xF1, 0xA8, 0x60, 0x02, 0xA1, 0xF5, 0x90, 0x9F, 0xD9, 0xE0, 0x70, 0x02, 0xA1, +0xF5, 0x12, 0xBB, 0x83, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x9F, 0xE0, 0xF0, +0x90, 0x06, 0xAA, 0xE0, 0x90, 0x9F, 0xDF, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x9F, 0xDF, +0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x9F, 0xE0, 0xEF, 0xF0, 0x12, 0xA8, 0xCA, 0xE4, 0x90, 0x9F, +0xE2, 0x12, 0xAB, 0xE1, 0x12, 0xA7, 0x18, 0x12, 0xA7, 0x42, 0x54, 0xEF, 0xF0, 0x12, 0xBB, 0x83, +0x24, 0xFD, 0x50, 0x02, 0x80, 0x0F, 0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0xA1, 0xC1, +0x80, 0x03, 0x12, 0xA1, 0x74, 0x12, 0x6B, 0x12, 0x30, 0xE0, 0x58, 0xEF, 0xC4, 0x13, 0x13, 0x54, +0x03, 0x20, 0xE0, 0x22, 0x12, 0xBC, 0xE2, 0x6F, 0x70, 0x49, 0x90, 0x9F, 0xD5, 0xE0, 0x44, 0x40, +0xF0, 0x12, 0xBC, 0xEA, 0xB1, 0x0B, 0xD1, 0x25, 0x12, 0x5F, 0xB5, 0x12, 0xBC, 0xD3, 0x90, 0x9F, +0xE0, 0xE0, 0x14, 0xF0, 0x80, 0x2D, 0x90, 0x9F, 0xD7, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, +0x22, 0x12, 0xBC, 0xE2, 0xFE, 0x6F, 0x60, 0x1B, 0x90, 0x05, 0x73, 0xE0, 0xFF, 0xEE, 0x6F, 0x60, +0x12, 0x90, 0x9F, 0xD5, 0x12, 0x84, 0xC9, 0x30, 0xE0, 0x09, 0xEF, 0x54, 0xBF, 0xB1, 0x0B, 0xD1, +0x0D, 0x91, 0x7A, 0xD1, 0x01, 0x90, 0x9F, 0xCF, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xD1, 0x01, +0x22, 0x90, 0x9F, 0xD5, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x7D, 0x20, 0xE4, 0xFF, 0x74, 0x1D, 0x12, +0xBD, 0x3A, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, +0x22, 0x7D, 0x03, 0x7F, 0x02, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0x80, 0xE5, 0xD1, 0x38, 0x31, +0xC2, 0x90, 0x9F, 0xD3, 0x74, 0x0C, 0xF0, 0x22, 0xD1, 0xB8, 0xE4, 0xFD, 0xFF, 0x02, 0x54, 0xC6, +0xD1, 0x3A, 0x91, 0x54, 0xF1, 0xEC, 0x41, 0x4F, 0x12, 0xBC, 0xCB, 0xD1, 0x3A, 0x7D, 0x0C, 0x7F, +0x01, 0x21, 0xC6, 0xEF, 0x70, 0x34, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x5F, 0xB9, 0x7D, 0x02, 0x7F, +0x03, 0x12, 0x5F, 0xB9, 0x7D, 0xC8, 0x7F, 0x02, 0xD1, 0x0D, 0x12, 0xA7, 0x18, 0xF0, 0xE4, 0xFF, +0xD1, 0x8C, 0xEF, 0x70, 0x0A, 0xD1, 0xAC, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x06, 0x7D, +0x01, 0x7F, 0x0C, 0x51, 0x5A, 0xD1, 0xB0, 0x02, 0xBC, 0xC3, 0x81, 0x90, 0x12, 0xBB, 0xED, 0x12, +0x91, 0x7E, 0xE0, 0xFD, 0x7C, 0x00, 0x12, 0x93, 0x2B, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0x12, 0xBD, 0x12, 0x7F, 0x00, 0x60, 0x02, 0x7F, 0x01, 0x22, 0xD1, 0xB8, 0xD1, 0x48, +0x90, 0x9F, 0xD4, 0xE0, 0x54, 0xF7, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, +0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0x12, 0x89, 0xD6, 0x30, 0xE0, 0x05, 0x7F, 0x03, 0x12, +0x88, 0x32, 0x90, 0xA0, 0x65, 0xE0, 0x20, 0xE0, 0x38, 0x12, 0x8F, 0xD6, 0x13, 0x30, 0xE0, 0x31, +0x90, 0xA0, 0x8C, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA3, 0x05, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x05, +0x74, 0x01, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA3, 0x06, 0x30, 0xE0, 0x05, 0x74, 0x01, +0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0x05, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x48, +0x62, 0x7F, 0x02, 0x12, 0x9E, 0x9E, 0x7F, 0x02, 0x12, 0x46, 0x8D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x4F, 0x8F, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, +0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x4F, 0xA5, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, +0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x26, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, +0x89, 0x54, 0x01, 0xFD, 0xAF, 0x54, 0x12, 0x91, 0x42, 0xAF, 0x54, 0xD1, 0x8C, 0xEF, 0xAF, 0x54, +0x70, 0x05, 0x12, 0xB0, 0x06, 0x80, 0x03, 0x12, 0xB0, 0x02, 0x05, 0x54, 0x80, 0xD3, 0xE5, 0x55, +0x70, 0x0E, 0xFF, 0xD1, 0x8C, 0xEF, 0x70, 0x08, 0xD1, 0xAC, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, +0x22, 0xD1, 0x38, 0x90, 0x9F, 0xD2, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0x3F, 0xE0, 0x90, 0x01, +0x3F, 0x22, 0xD1, 0x3A, 0xF1, 0xEC, 0x80, 0xEB, 0xE4, 0xFF, 0xD1, 0x8C, 0xEF, 0x64, 0x01, 0x22, +0xEF, 0x60, 0x32, 0xF1, 0xA8, 0x70, 0x2E, 0x90, 0x9F, 0xD5, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, +0x7F, 0x0F, 0x12, 0x54, 0xC6, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0xA3, 0x71, 0xBF, +0x01, 0x13, 0x90, 0x9F, 0xD4, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x31, 0xC6, 0x90, +0x9F, 0xD3, 0x74, 0x06, 0xF0, 0x22, 0xD1, 0x3A, 0x80, 0xA9, 0x80, 0xA7, 0x90, 0x05, 0x27, 0xE0, +0x44, 0x40, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0xC1, 0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0x64, 0x01, 0xF0, +0x24, 0xF4, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, +0x12, 0x31, 0xFC, 0xC2, 0xAF, 0x90, 0x9F, 0xD9, 0xE0, 0x60, 0x0E, 0x90, 0x9F, 0xDC, 0xE0, 0xFF, +0x90, 0x9F, 0xDB, 0xE0, 0x6F, 0x60, 0x02, 0x11, 0x4A, 0xC2, 0xAF, 0x12, 0xB1, 0x48, 0xBF, 0x01, +0x03, 0x12, 0x9C, 0x16, 0xD2, 0xAF, 0xD2, 0xAF, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, 0x01, 0x03, 0x12, +0xB7, 0xA0, 0x12, 0x4F, 0xF6, 0x12, 0x42, 0xDD, 0x80, 0xAF, 0x90, 0x9F, 0xCF, 0xE0, 0x90, 0x9F, +0xDB, 0x30, 0xE0, 0x05, 0xE0, 0xFF, 0x02, 0xB8, 0xCF, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x62, 0x5A, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x05, 0x27, +0xE0, 0xF5, 0x54, 0x12, 0x9E, 0x4D, 0x90, 0x9F, 0xCF, 0xB1, 0x6E, 0x12, 0x4F, 0xD9, 0xFF, 0x90, +0x9F, 0xCF, 0x12, 0xBB, 0x9A, 0x71, 0x3D, 0xF1, 0xE8, 0xFF, 0x90, 0x9F, 0xCF, 0x12, 0x9E, 0xA6, +0x71, 0x3D, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0x9F, 0xCF, 0xF0, 0xEE, 0xC3, +0x13, 0x20, 0xE0, 0x02, 0x21, 0x30, 0xE0, 0x30, 0xE0, 0x72, 0x12, 0x66, 0x21, 0x75, 0x54, 0x21, +0x51, 0xFE, 0x30, 0xE0, 0x07, 0x71, 0x29, 0x43, 0x54, 0x08, 0x80, 0x0D, 0xE4, 0x90, 0x9F, 0xD0, +0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x5F, 0xB9, 0x90, 0x9F, 0xCF, 0x71, 0x15, 0x30, 0xE0, +0x03, 0x43, 0x54, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x14, 0x90, 0x9F, +0xCF, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x80, 0x90, 0x9F, 0xCF, 0x12, +0x5F, 0xDF, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, 0x31, 0xDA, 0x90, 0x9F, 0xD2, 0xE0, 0x70, 0x04, +0x7F, 0x01, 0x31, 0xE1, 0x71, 0x07, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x0B, 0x71, 0x1D, 0xEF, +0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x31, 0xE1, 0x21, 0xA2, 0x75, 0x54, 0x01, 0x31, +0xDA, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x21, 0xD5, 0xFF, 0x31, 0xE1, 0x21, 0xD5, +0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, 0x73, 0x12, 0x66, 0x21, 0x43, 0x54, 0x31, 0x51, 0xFE, 0x30, +0xE0, 0x07, 0x71, 0x29, 0x43, 0x54, 0x08, 0x80, 0x07, 0x7D, 0x40, 0xE4, 0xFF, 0x12, 0x5F, 0xB9, +0x90, 0x9F, 0xCF, 0x71, 0x15, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, +0xE0, 0x03, 0x43, 0x54, 0x04, 0x31, 0xDA, 0x71, 0x07, 0x30, 0xE0, 0x0B, 0x12, 0xA2, 0xE8, 0x60, +0x31, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x1E, 0x12, 0x67, 0xEC, 0x90, 0x9F, 0xD3, 0xE0, 0xB4, 0x02, +0x19, 0x12, 0x66, 0x40, 0x71, 0x1D, 0xBF, 0x01, 0x09, 0x90, 0x9F, 0xDB, 0xE0, 0xFF, 0x7D, 0x01, +0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, 0x62, 0x5A, 0x80, 0x08, 0x90, 0x9F, 0xDC, 0xE0, 0x90, 0x9F, +0xD3, 0xF0, 0x90, 0x05, 0x40, 0x74, 0x22, 0xF0, 0x80, 0x2B, 0x75, 0x54, 0x01, 0x31, 0xDA, 0x90, +0x9F, 0xD3, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x9F, 0xD3, 0xE0, +0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x62, 0x5A, 0x12, 0xA2, 0x9A, 0x90, 0x9F, 0xDB, +0x11, 0x59, 0x12, 0xB8, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xD2, 0xE0, 0x90, 0xA3, 0x14, 0xF0, +0x6F, 0x70, 0x02, 0x41, 0xF9, 0xEF, 0x14, 0x60, 0x46, 0x14, 0x60, 0x74, 0x14, 0x70, 0x02, 0x41, +0x9F, 0x14, 0x70, 0x02, 0x41, 0xCE, 0x24, 0x04, 0x60, 0x02, 0x41, 0xF9, 0x90, 0xA3, 0x14, 0xE0, +0xB4, 0x04, 0x05, 0x12, 0xB8, 0x45, 0x41, 0xF9, 0x90, 0xA3, 0x14, 0xE0, 0xB4, 0x02, 0x05, 0x12, +0xB8, 0x4A, 0x41, 0xF9, 0x90, 0xA3, 0x14, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0xB8, 0x4F, 0x41, 0xF9, +0x90, 0xA3, 0x14, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0xF9, 0x12, 0xB8, 0x3D, 0x41, 0xF9, 0x90, +0xA3, 0x14, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x67, 0xA2, 0x41, 0xF9, 0x90, 0xA3, 0x14, 0xE0, 0xB4, +0x02, 0x05, 0x12, 0x67, 0x91, 0x41, 0xF9, 0x90, 0xA3, 0x14, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0x67, +0xE6, 0x41, 0xF9, 0x90, 0xA3, 0x14, 0xE0, 0x60, 0x02, 0x41, 0xF9, 0x12, 0x67, 0xEA, 0x41, 0xF9, +0x90, 0xA3, 0x14, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0xB8, 0x92, 0x80, 0x7D, 0x90, 0xA3, 0x14, 0xE0, +0xB4, 0x01, 0x05, 0x12, 0xB8, 0x73, 0x80, 0x71, 0x90, 0xA3, 0x14, 0xE0, 0xB4, 0x03, 0x05, 0x12, +0xB8, 0x8C, 0x80, 0x65, 0x90, 0xA3, 0x14, 0xE0, 0x70, 0x5F, 0x12, 0xB8, 0x7B, 0x80, 0x5A, 0x90, +0xA3, 0x14, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0xB8, 0xB5, 0x80, 0x4E, 0x90, 0xA3, 0x14, 0xE0, 0xB4, +0x01, 0x05, 0x12, 0xB8, 0x9D, 0x80, 0x42, 0x90, 0xA3, 0x14, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0xB8, +0xB0, 0x80, 0x36, 0x90, 0xA3, 0x14, 0xE0, 0x70, 0x30, 0x12, 0xB8, 0xAB, 0x80, 0x2B, 0x90, 0xA3, +0x14, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0xE4, 0x80, 0x20, 0x90, 0xA3, 0x14, 0xE0, 0xB4, 0x01, 0x04, +0xF1, 0xCF, 0x80, 0x15, 0x90, 0xA3, 0x14, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0xB8, 0xC7, 0x80, 0x09, +0x90, 0xA3, 0x14, 0xE0, 0x70, 0x03, 0x12, 0xB8, 0xC1, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, +0xCF, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0x9F, 0xCF, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, +0x03, 0x22, 0x90, 0x9F, 0xD5, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x90, 0x05, 0x43, +0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, +0xE4, 0xFF, 0x02, 0x64, 0x84, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, +0x02, 0x06, 0x89, 0x90, 0x9F, 0xD4, 0x71, 0x0A, 0x30, 0xE0, 0x28, 0xEF, 0x54, 0xBF, 0x12, 0xBC, +0x8E, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA0, +0x50, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x02, 0x62, +0x5A, 0x11, 0x4A, 0x22, 0x90, 0x9F, 0xD4, 0xE0, 0xFF, 0x12, 0x4F, 0xD2, 0x30, 0xE0, 0x1B, 0xEF, +0x54, 0x7F, 0x12, 0xBC, 0x8E, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, +0xFD, 0xF0, 0x90, 0x9F, 0xD9, 0xE0, 0x60, 0x02, 0x11, 0x4A, 0x90, 0xA0, 0x4E, 0x71, 0x0A, 0x30, +0xE0, 0x22, 0x90, 0xA0, 0x51, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xFD, 0xF0, +0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA0, 0x51, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x04, +0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x06, 0x12, 0xA7, 0xA1, 0x12, 0x51, +0x8C, 0x22, 0x71, 0x12, 0x30, 0xE0, 0x0C, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x03, +0x12, 0xBC, 0xD3, 0x90, 0x9F, 0xD4, 0x12, 0x84, 0xC9, 0x30, 0xE0, 0x09, 0x12, 0xA7, 0x3F, 0x54, +0x07, 0x70, 0x39, 0x80, 0x35, 0x12, 0xA7, 0x6B, 0x40, 0x30, 0x12, 0x67, 0xA8, 0x70, 0x2D, 0xB1, +0x67, 0x70, 0x06, 0x91, 0x34, 0x91, 0x2D, 0xF0, 0x22, 0x91, 0x34, 0x90, 0x9F, 0xE3, 0xE0, 0x04, +0xF0, 0xE0, 0xD3, 0x94, 0x02, 0x40, 0x0A, 0x91, 0x2D, 0xF0, 0xE4, 0x90, 0x9F, 0xE3, 0xF0, 0x80, +0x03, 0x12, 0xA1, 0x62, 0xE4, 0x90, 0x9F, 0xE2, 0xF0, 0x22, 0x11, 0x4A, 0x22, 0x90, 0x9F, 0xD5, +0xE0, 0x54, 0xFB, 0x22, 0x12, 0xA7, 0x78, 0x40, 0x31, 0x90, 0x9F, 0xF3, 0xE0, 0x04, 0xF0, 0x90, +0xA0, 0x35, 0xE0, 0xFF, 0x90, 0x9F, 0xF3, 0xE0, 0xD3, 0x9F, 0x50, 0x1E, 0x90, 0x9F, 0xEB, 0xE0, +0x04, 0x12, 0x8F, 0xAB, 0x90, 0x9F, 0xF2, 0xF0, 0xFB, 0x90, 0x9F, 0xEB, 0xE0, 0xFF, 0xA3, 0xE0, +0xFD, 0x90, 0xA2, 0xE7, 0x74, 0x04, 0xF0, 0x12, 0xAA, 0xBC, 0x22, 0xB1, 0x54, 0x12, 0x06, 0x89, +0xFF, 0x54, 0x7F, 0x90, 0x9F, 0xD9, 0xF0, 0xEF, 0x12, 0x4F, 0xD2, 0xA3, 0x12, 0x4F, 0x8E, 0xFF, +0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x9F, 0xD7, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x12, 0x4C, +0x34, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x9F, 0xD4, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, +0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0xB1, 0x67, 0x12, 0x4F, 0xA3, 0x90, 0x9F, 0xD8, 0x12, 0x4C, 0xE1, +0xFD, 0x7F, 0x02, 0x12, 0x61, 0xC6, 0xB1, 0x5A, 0xB1, 0x4E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA0, +0x3B, 0xB1, 0x6E, 0xFF, 0xB1, 0x4D, 0x12, 0x4F, 0xDE, 0xFF, 0x90, 0xA0, 0x3B, 0x12, 0xBB, 0x9A, +0x4E, 0xFF, 0xB1, 0x4D, 0xF1, 0xE8, 0xFF, 0x90, 0xA0, 0x3B, 0x12, 0x9E, 0xA6, 0x4E, 0xFF, 0xB1, +0x4D, 0x12, 0x9A, 0xDA, 0x4E, 0x90, 0xA0, 0x3B, 0xF0, 0x71, 0x0A, 0x20, 0xE0, 0x29, 0xEF, 0xC3, +0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, 0x01, 0x90, 0xA0, 0x8C, 0xE0, 0x60, 0x0B, 0x80, 0x0E, 0xE4, +0xF5, 0x52, 0x90, 0xA0, 0x8C, 0xE0, 0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, 0x75, 0x51, 0x01, +0xAD, 0x52, 0xAF, 0x51, 0x12, 0x48, 0x62, 0xB1, 0x5A, 0x90, 0xA1, 0xD2, 0x12, 0x45, 0x9F, 0x12, +0xB8, 0xED, 0x90, 0x9F, 0xD9, 0xE0, 0xFF, 0x12, 0x66, 0x53, 0x90, 0x9F, 0xD9, 0xE0, 0x60, 0x1C, +0x90, 0xA1, 0xD2, 0x12, 0x45, 0x96, 0x12, 0x4F, 0x8F, 0x54, 0x0F, 0xFF, 0x12, 0x4F, 0xA5, 0xFD, +0x12, 0xB9, 0x12, 0x12, 0xAB, 0xC0, 0x74, 0x01, 0xF0, 0x12, 0xAA, 0xBC, 0x22, 0xF0, 0x90, 0x00, +0x05, 0x02, 0x06, 0xA2, 0x90, 0xA1, 0xCF, 0x12, 0x45, 0x9F, 0x90, 0xA1, 0xCF, 0x02, 0x45, 0x96, +0x90, 0x9F, 0xDD, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9F, 0xD7, 0xE0, 0x54, 0x0F, 0x22, 0xE0, 0x54, +0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0x22, 0xB1, 0x54, 0x12, +0x06, 0x89, 0x90, 0xA0, 0x96, 0x12, 0x4F, 0x8E, 0x90, 0xA0, 0x97, 0x12, 0x4F, 0xA4, 0x90, 0xA0, +0x98, 0xF0, 0x90, 0xA0, 0x72, 0xE0, 0x44, 0x01, 0xF0, 0xB1, 0x5A, 0x12, 0x98, 0x22, 0xB4, 0x02, +0x05, 0x7F, 0x40, 0x12, 0x97, 0xE1, 0x22, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x9F, 0x90, 0xA1, 0xCB, +0xEF, 0xF0, 0x12, 0x45, 0xA8, 0x6E, 0x28, 0x00, 0x6E, 0x31, 0x01, 0x6E, 0x3A, 0x02, 0x6E, 0x43, +0x10, 0x6E, 0x4C, 0x11, 0x6E, 0x55, 0x12, 0x6E, 0x5E, 0x14, 0x6F, 0x76, 0x15, 0x6E, 0x67, 0x16, +0x6E, 0x70, 0x18, 0x6E, 0x79, 0x20, 0x6E, 0x81, 0x21, 0x6E, 0x8A, 0x23, 0x6E, 0x93, 0x24, 0x6E, +0x9B, 0x25, 0x6E, 0xA4, 0x27, 0x6E, 0xAD, 0x28, 0x6E, 0xB6, 0x40, 0x6E, 0xBF, 0x42, 0x6E, 0xC8, +0x47, 0x6E, 0xD0, 0x49, 0x6E, 0xD9, 0x60, 0x6E, 0xE2, 0x61, 0x6E, 0xEB, 0x62, 0x6E, 0xF4, 0x63, +0x6E, 0xFD, 0x64, 0x6F, 0x06, 0x65, 0x6F, 0x0F, 0x66, 0x6F, 0x17, 0x67, 0x6F, 0x20, 0x68, 0x6F, +0x29, 0x69, 0x6F, 0x32, 0x6B, 0x6F, 0x3B, 0x6C, 0x6F, 0x43, 0x6D, 0x6F, 0x4C, 0x6E, 0x6F, 0x55, +0x6F, 0x6F, 0x5E, 0x70, 0x00, 0x00, 0x6F, 0x67, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0xAC, +0xB8, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x67, 0x30, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, +0x02, 0xA4, 0x22, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x95, 0xCE, 0x90, 0xA1, 0xCC, 0x12, +0x45, 0x96, 0x02, 0xA5, 0x22, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0xAC, 0xF9, 0x90, 0xA1, +0xCC, 0x12, 0x45, 0x96, 0x02, 0xAD, 0x0D, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x4F, 0xAB, +0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x5D, 0x48, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x81, +0x6B, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0xAD, 0x1C, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, +0x02, 0xAD, 0x58, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x01, 0x60, 0x90, 0xA1, 0xCC, 0x12, 0x45, +0x96, 0x02, 0xAD, 0x60, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x9E, 0x55, 0x90, 0xA1, 0xCC, +0x12, 0x45, 0x96, 0x02, 0x9E, 0x76, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x7C, 0x74, 0x90, +0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x4C, 0x3A, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0xE1, 0x8F, +0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0xB4, 0x42, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, +0x49, 0x72, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0xAD, 0x9F, 0x90, 0xA1, 0xCC, 0x12, 0x45, +0x96, 0x02, 0x5F, 0xF1, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0xAD, 0xBF, 0x90, 0xA1, 0xCC, +0x12, 0x45, 0x96, 0x02, 0xAD, 0xEC, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0xAE, 0x4D, 0x90, +0xA1, 0xCC, 0x12, 0x45, 0x96, 0xA1, 0x7D, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x99, 0x72, +0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0xAD, 0xD3, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, +0x98, 0x7C, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x99, 0xF9, 0x90, 0xA1, 0xCC, 0x12, 0x45, +0x96, 0x80, 0x34, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0xAE, 0x5B, 0x90, 0xA1, 0xCC, 0x12, +0x45, 0x96, 0x02, 0xAE, 0xB2, 0x90, 0xA1, 0xCC, 0x12, 0x45, 0x96, 0x02, 0x8D, 0xEC, 0x90, 0xA1, +0xCC, 0x12, 0x45, 0x96, 0x02, 0xAE, 0xEB, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, +0xCB, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0xB1, 0x54, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xA9, 0x12, +0x4F, 0x8E, 0x90, 0xA0, 0xAA, 0xF0, 0xB1, 0x5A, 0x7D, 0x02, 0x7F, 0x38, 0x02, 0x58, 0xB1, 0x90, +0xA1, 0xCF, 0x12, 0x45, 0x9F, 0xB1, 0x4E, 0x30, 0xE1, 0x03, 0x02, 0xB3, 0xBB, 0xB1, 0x5A, 0x12, +0x06, 0x89, 0x90, 0xA1, 0xD2, 0x12, 0x4F, 0x8E, 0x90, 0xA1, 0xD3, 0x12, 0x4F, 0xA4, 0x90, 0xA1, +0xD4, 0x12, 0x4C, 0xE1, 0x75, 0xF0, 0x10, 0xA4, 0xFF, 0x12, 0x4C, 0x34, 0xFD, 0xEF, 0x4D, 0xFF, +0x90, 0xA1, 0xD3, 0xE0, 0xB4, 0x01, 0x07, 0xA3, 0xE0, 0x12, 0xB4, 0x38, 0xEF, 0xF0, 0x22, 0x7D, +0x1F, 0x7F, 0x6F, 0x12, 0x54, 0xC6, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x9F, 0xD2, +0x74, 0x04, 0xF0, 0x22, 0x7D, 0x25, 0x80, 0xE9, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, +0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0xDE, 0x90, 0xA1, 0xCA, 0xEF, 0xF0, 0x60, +0xF0, 0x90, 0x9E, 0x92, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, +0xE0, 0x0E, 0x90, 0x9E, 0x92, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x7E, 0x92, 0x11, 0x48, +0xB1, 0x4D, 0xFF, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0xAF, 0x52, 0xB1, 0x4D, 0xFF, 0x30, +0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x9C, 0xF5, 0xB1, 0x4D, 0xFF, 0x30, 0xE6, 0x06, 0x54, 0xBF, +0xF0, 0x12, 0x97, 0xFC, 0xD2, 0xAF, 0x80, 0xB9, 0xE4, 0xF5, 0x51, 0x90, 0x9F, 0xCD, 0xE0, 0xFF, +0xE5, 0x51, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0x1C, 0xE5, 0x51, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, +0xA1, 0xD8, 0xF0, 0xE5, 0x51, 0x54, 0x07, 0xA3, 0xF0, 0x90, 0x04, 0xA0, 0xE0, 0xFF, 0xA3, 0xE0, +0xFE, 0xEF, 0x64, 0x01, 0x70, 0x24, 0xE5, 0x51, 0x6E, 0x70, 0x1F, 0xA3, 0xE0, 0xF5, 0x52, 0xA3, +0xE0, 0xB1, 0x85, 0xE5, 0x52, 0xF0, 0xB1, 0x62, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0xA1, 0xD4, 0xE0, +0x54, 0x03, 0x4F, 0xFF, 0xB1, 0x62, 0xEF, 0xF0, 0xA1, 0x18, 0xAF, 0x51, 0x12, 0x66, 0x8C, 0xEF, +0x70, 0x02, 0xA1, 0x18, 0x12, 0x4E, 0x29, 0x12, 0x4F, 0xD2, 0x30, 0xE0, 0x02, 0xA1, 0x18, 0x90, +0xA1, 0xD8, 0xF1, 0xC2, 0xE0, 0xFD, 0x7C, 0x00, 0x90, 0xA1, 0xD9, 0x12, 0x93, 0x29, 0x80, 0x05, +0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0xBD, 0x12, 0x60, 0x02, 0xA1, 0x18, 0x12, 0xBB, +0x3F, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x70, 0x0C, 0x74, 0x91, 0x25, 0x51, 0x12, 0xB4, 0xF4, 0xE0, +0x70, 0x02, 0xA1, 0x18, 0xE5, 0x51, 0x12, 0xBB, 0x65, 0x90, 0xA1, 0xCE, 0x12, 0x45, 0x9F, 0x12, +0xBB, 0x3F, 0xE0, 0xF5, 0x56, 0xA3, 0xE0, 0xF5, 0x57, 0x74, 0x91, 0x25, 0x51, 0x12, 0xB4, 0xF4, +0xE0, 0xFF, 0x90, 0xA1, 0xD1, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x12, +0x4F, 0xFD, 0xE0, 0x90, 0xA1, 0xD3, 0xF0, 0xFD, 0x12, 0x4E, 0x29, 0xFE, 0x13, 0x13, 0x54, 0x03, +0xB1, 0x85, 0xE0, 0xF5, 0x52, 0x54, 0x7F, 0xF5, 0x53, 0xD3, 0x9D, 0x40, 0x16, 0x90, 0xA1, 0xD3, +0xE0, 0xF5, 0x53, 0xE5, 0x52, 0x30, 0xE7, 0x07, 0xE5, 0x53, 0x44, 0x80, 0xFF, 0x80, 0x02, 0xAF, +0x53, 0x8F, 0x52, 0xE5, 0x53, 0x90, 0x41, 0x3D, 0x93, 0x12, 0x4C, 0xE8, 0xE0, 0xC3, 0x9F, 0x40, +0x0B, 0x74, 0xA1, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0x80, 0x09, 0x74, 0xB5, 0x25, 0x53, +0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xFF, 0x12, 0xBB, 0x1F, 0x90, 0xA1, 0xCB, 0x12, +0x45, 0x9F, 0xB1, 0x1D, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x41, 0xDA, 0xAD, 0x58, 0xAF, 0x53, +0x12, 0xB3, 0x18, 0x8F, 0x58, 0xE5, 0x52, 0x30, 0xE7, 0x04, 0x05, 0x58, 0x05, 0x58, 0xE5, 0x58, +0xD3, 0x94, 0x1A, 0xAF, 0x58, 0x40, 0x02, 0x7F, 0x1A, 0x12, 0xBB, 0x1F, 0x90, 0xA1, 0xCB, 0x12, +0x45, 0x9F, 0xC3, 0xE5, 0x57, 0x94, 0x0F, 0xE5, 0x56, 0x94, 0x00, 0x50, 0x73, 0xB1, 0x56, 0xFF, +0x90, 0xA1, 0xD2, 0xE0, 0x2F, 0xFF, 0x90, 0xA1, 0xD1, 0xE0, 0x35, 0xF0, 0xFE, 0x12, 0xBD, 0x0A, +0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xEE, 0x35, 0xF0, +0x12, 0xBC, 0x04, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0x12, 0x93, 0x33, 0x41, 0xD3, 0x90, +0xA1, 0xCE, 0x12, 0x45, 0x96, 0x12, 0x07, 0x80, 0x65, 0x57, 0x70, 0x04, 0xE5, 0xF0, 0x65, 0x56, +0x75, 0xF0, 0x04, 0x70, 0x23, 0x12, 0x4F, 0x84, 0x12, 0x6B, 0x0B, 0xFE, 0xEF, 0x54, 0x3F, 0xFF, +0xEE, 0x04, 0x54, 0x03, 0xFE, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x4F, 0xF0, 0xE4, 0xFD, 0xAF, 0x51, +0x12, 0x91, 0xE7, 0x75, 0xF0, 0x04, 0x80, 0x00, 0x12, 0x4F, 0x84, 0x54, 0x3F, 0xF0, 0x41, 0xD3, +0xE5, 0x51, 0x70, 0x44, 0xB1, 0x56, 0xFF, 0xAE, 0xF0, 0x12, 0xBD, 0x0A, 0xFD, 0xE5, 0xF0, 0x3E, +0x12, 0xBC, 0x04, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0x9E, 0x91, 0x74, 0x01, 0xF0, +0x80, 0x26, 0xB1, 0x56, 0xFB, 0xAA, 0xF0, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, 0x13, +0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x7C, 0x00, 0x7D, 0x05, 0x12, 0x07, 0x03, 0xD3, 0xEB, 0x9F, 0xEA, +0x9E, 0x40, 0x05, 0xE4, 0x90, 0x9E, 0x91, 0xF0, 0xAB, 0x58, 0xAD, 0x51, 0xAF, 0x57, 0xAE, 0x56, +0x12, 0x94, 0x7D, 0x8E, 0x54, 0x8F, 0x55, 0x12, 0xBB, 0x03, 0xC3, 0x12, 0xBC, 0x20, 0x50, 0x09, +0x7D, 0x01, 0xAF, 0x51, 0x12, 0x91, 0xE7, 0x80, 0x0C, 0x12, 0xBB, 0x11, 0xD3, 0x12, 0xBC, 0x20, +0x40, 0x0B, 0x12, 0x93, 0x33, 0xB1, 0x35, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x36, 0xB1, 0x35, 0xF5, +0x83, 0xE0, 0x04, 0xF0, 0xB1, 0x35, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x25, 0xB1, 0x35, +0xF5, 0x83, 0xE4, 0xF0, 0x12, 0xBB, 0x11, 0x12, 0x97, 0xCC, 0x12, 0xBB, 0x03, 0x74, 0x01, 0x93, +0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xE5, 0x51, 0x12, 0x94, 0x73, +0xF1, 0xE4, 0xF0, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0x81, 0xF9, 0xB1, 0x1D, 0xE0, 0xF9, 0x64, 0x05, +0x60, 0x02, 0x61, 0x9B, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0xF1, 0xDB, 0xF5, 0x5B, +0x12, 0x4C, 0xE9, 0xE0, 0xC3, 0x94, 0x30, 0x40, 0x12, 0x12, 0x4C, 0xD3, 0xE0, 0x20, 0xE2, 0x0B, +0x12, 0x4E, 0x29, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, 0xE4, 0xF5, 0x5B, 0xB1, 0x1D, +0xB1, 0x3F, 0xE4, 0xF0, 0xB1, 0x79, 0xE4, 0xF0, 0x80, 0x0B, 0xAD, 0x53, 0xAF, 0x51, 0x12, 0xB2, +0x49, 0xB1, 0x79, 0xEF, 0xF0, 0xB1, 0x79, 0xE0, 0x64, 0x01, 0x70, 0x67, 0xB1, 0x6D, 0xE0, 0xFF, +0x24, 0x05, 0xFD, 0xE4, 0x33, 0xFC, 0x12, 0x4C, 0xE9, 0xE0, 0xFE, 0xC3, 0x12, 0xAB, 0x83, 0x50, +0x0B, 0x12, 0xBB, 0x4D, 0xE0, 0xFD, 0xE5, 0x53, 0xC3, 0x9D, 0x40, 0x1B, 0xE5, 0x5B, 0x70, 0x05, +0x75, 0x5B, 0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4, 0x01, 0x05, 0x75, 0x5B, 0x03, 0x80, 0x03, 0x75, +0x5B, 0x05, 0xB1, 0x6D, 0xEE, 0x80, 0x1F, 0x12, 0x4C, 0xE9, 0xE0, 0x24, 0x05, 0xFD, 0xE4, 0x33, +0xFC, 0xC3, 0xEF, 0x12, 0xAB, 0x83, 0x50, 0x06, 0xB1, 0x41, 0xE0, 0xB4, 0x0A, 0x0E, 0x12, 0x4C, +0xE9, 0xE0, 0xFF, 0xB1, 0x6D, 0xEF, 0xB1, 0x40, 0xE4, 0xF0, 0x80, 0x07, 0xB1, 0x1D, 0xB1, 0x3F, +0xE0, 0x04, 0xF0, 0x12, 0xBB, 0x4D, 0xE5, 0x53, 0xF0, 0x81, 0xE0, 0xE9, 0x64, 0x06, 0x60, 0x02, +0x81, 0xF9, 0xF5, 0x54, 0xF5, 0x55, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0xF1, 0xDB, +0xF5, 0x5B, 0xAF, 0x57, 0xAE, 0x56, 0x12, 0xB3, 0xA1, 0x8F, 0x59, 0xE5, 0x58, 0xD3, 0x94, 0x13, +0x40, 0x1F, 0x90, 0xA1, 0xCB, 0x12, 0x45, 0x96, 0x12, 0x6D, 0x4E, 0xFD, 0x7C, 0x00, 0xE5, 0x57, +0xAE, 0x56, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x80, +0x19, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, +0xF9, 0xFF, 0x90, 0x41, 0xDA, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA1, 0xD5, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x5A, 0xE5, 0x58, 0xD3, 0x94, 0x13, 0x40, 0x1E, 0x12, +0xBA, 0xEC, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, +0xA1, 0xCB, 0x12, 0x45, 0x96, 0x85, 0x5A, 0x82, 0x12, 0x95, 0x72, 0x80, 0x16, 0x12, 0xBA, 0xEC, +0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, +0x41, 0xD5, 0x93, 0x12, 0xBD, 0x02, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0xC3, +0x90, 0xA1, 0xD6, 0xE0, 0x95, 0x55, 0x90, 0xA1, 0xD5, 0xE0, 0x95, 0x54, 0x40, 0x08, 0x05, 0x5A, +0xE5, 0x5A, 0x64, 0x05, 0x70, 0xA2, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, 0x24, 0x01, +0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06, 0xEF, 0x95, +0x5A, 0xFF, 0x80, 0x02, 0xE4, 0xFF, 0xB1, 0x29, 0xE0, 0xC3, 0x13, 0xFE, 0xEF, 0xC4, 0x33, 0x54, +0xE0, 0x2E, 0xFE, 0xB1, 0x29, 0xEE, 0xF0, 0xB1, 0x29, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x05, 0xB1, +0x29, 0x74, 0xC0, 0xF0, 0xB1, 0x29, 0xE0, 0x24, 0x1F, 0xFF, 0xE4, 0x33, 0xFE, 0xEF, 0x78, 0x06, +0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0x25, 0xE0, 0xFF, 0x70, 0x04, 0xF5, 0x5B, 0x80, +0x04, 0xEF, 0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA1, 0xD2, 0xE0, 0x94, 0x03, 0x90, 0xA1, 0xD1, 0xE0, +0x94, 0x00, 0x50, 0x09, 0x12, 0x4C, 0xE9, 0xE0, 0xC3, 0x94, 0x30, 0x50, 0x03, 0xE4, 0xF5, 0x5B, +0x75, 0xF0, 0x10, 0xE5, 0x51, 0xF1, 0xCD, 0x54, 0xF8, 0x90, 0xA1, 0xD7, 0xF0, 0x45, 0x5B, 0xFF, +0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x12, 0xBC, 0x7C, 0xB1, 0x1D, 0xE0, 0xD3, 0x94, 0x05, 0x74, +0x11, 0x50, 0x07, 0xB1, 0x1F, 0xE0, 0x04, 0xF0, 0x80, 0x04, 0xB1, 0x1F, 0xE4, 0xF0, 0x75, 0x5C, +0x01, 0x7D, 0x01, 0xAF, 0x51, 0x12, 0xB4, 0x89, 0x05, 0x51, 0x01, 0x4B, 0x22, 0x74, 0x11, 0x25, +0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x22, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, +0x34, 0x93, 0xF5, 0x83, 0x22, 0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0x22, 0xE4, +0xF0, 0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x22, 0xD2, 0xAF, 0xC2, +0xAF, 0x90, 0x9E, 0x92, 0xE0, 0x22, 0x90, 0xA1, 0xCE, 0x12, 0x45, 0x96, 0x90, 0x00, 0x08, 0x02, +0x07, 0xAB, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x05, 0x02, 0x45, 0x8A, 0x74, 0x01, 0x25, +0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x74, 0x91, 0x25, 0x51, 0xF5, 0x82, 0xE4, +0x34, 0x9A, 0xF5, 0x83, 0x22, 0x90, 0xA1, 0xD4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, +0x00, 0x02, 0x45, 0x8A, 0xE4, 0xF5, 0x63, 0x90, 0x9F, 0xCD, 0xE0, 0xFF, 0xE5, 0x63, 0xC3, 0x9F, +0x40, 0x02, 0xC1, 0x4C, 0xAF, 0x63, 0x12, 0x66, 0x8C, 0xEF, 0x70, 0x02, 0xC1, 0x48, 0xE5, 0x63, +0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x63, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0xF1, 0xC5, +0xE0, 0xFD, 0xAF, 0x06, 0x12, 0x93, 0x2B, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0xFF, 0xEF, 0x5D, 0x60, 0x73, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0xF1, 0xCD, 0x20, 0xE7, 0x02, 0x80, +0x10, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x02, 0x12, 0x45, 0x8A, 0xE0, 0xFF, 0x20, 0xE7, +0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x4E, 0xEF, 0x30, 0xE6, 0x18, 0x75, 0xF0, +0x10, 0xE5, 0x63, 0xB1, 0x8E, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x63, 0x12, 0x4E, 0x2E, 0x12, +0x7F, 0xD9, 0xE4, 0xFB, 0x80, 0x2E, 0xD1, 0x4D, 0xE0, 0x04, 0xF0, 0xD1, 0x4D, 0xE0, 0xD3, 0x94, +0x01, 0x40, 0x0B, 0xAF, 0x63, 0x12, 0x92, 0xE0, 0xD1, 0x4D, 0xE4, 0xF0, 0x80, 0x1A, 0x75, 0xF0, +0x10, 0xE5, 0x63, 0xB1, 0x8E, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x63, 0x12, 0x4E, 0x2E, 0x12, +0x7F, 0xD9, 0x7B, 0x01, 0xAF, 0x63, 0xD1, 0x59, 0x05, 0x63, 0xA1, 0x97, 0x22, 0x74, 0x11, 0x25, +0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69, 0xE4, 0x90, 0xA2, 0x9D, 0xF0, 0xE5, 0x67, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x90, 0xA2, 0x98, 0xF0, 0xE5, 0x67, 0x54, 0x07, 0x90, 0xA2, 0x9A, 0xF0, 0x75, 0xF0, +0x10, 0xEF, 0xF1, 0xCD, 0x90, 0xA2, 0x9B, 0x12, 0x4F, 0xF8, 0xE0, 0x54, 0x7F, 0x90, 0xA2, 0x9E, +0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x67, 0x12, 0x95, 0x59, 0xE0, 0x90, 0xA2, 0x9F, 0xF0, 0x12, 0xBC, +0x85, 0xE5, 0x69, 0x70, 0x39, 0xE5, 0x67, 0x60, 0x05, 0xC3, 0x94, 0x04, 0x40, 0x07, 0xAD, 0x68, +0xAF, 0x67, 0x12, 0xB4, 0x60, 0x90, 0xA2, 0x99, 0xE0, 0xFF, 0x12, 0xBB, 0x13, 0xE4, 0x93, 0xFC, +0x74, 0x01, 0x93, 0xFD, 0xEF, 0x12, 0xBB, 0x05, 0x74, 0x01, 0x93, 0x2D, 0xFF, 0xE4, 0x93, 0x3C, +0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xE5, 0x67, 0x12, 0x94, 0x73, 0xF1, 0xE4, 0xF0, 0x90, 0xA2, +0x9E, 0xE0, 0xFF, 0x90, 0xA2, 0x99, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x0B, 0xE5, 0x68, 0x54, 0x80, +0xFD, 0xEF, 0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90, 0xA2, 0x9F, 0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, +0x02, 0x8F, 0x68, 0x12, 0xBC, 0x85, 0xE5, 0x68, 0x54, 0x80, 0x90, 0xA2, 0x9C, 0xF0, 0xE5, 0x69, +0x70, 0x27, 0x90, 0xA2, 0x98, 0xF1, 0xC2, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x9A, +0x12, 0xBB, 0x37, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, +0x90, 0xA2, 0x9B, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x42, 0x90, 0xA2, 0x98, 0xF1, 0xC2, 0xC0, 0x83, +0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x9A, 0x12, 0xBB, 0x37, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, +0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x01, 0xF1, 0xDB, +0xFF, 0x90, 0xA2, 0x9B, 0xF0, 0x90, 0xA2, 0x99, 0xE0, 0x90, 0x41, 0xAD, 0x93, 0xFE, 0x33, 0x33, +0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA2, 0x9B, 0xF0, 0x44, 0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, +0xB1, 0x8E, 0xE5, 0x68, 0xF0, 0xE5, 0x67, 0x70, 0x06, 0x90, 0x01, 0xC8, 0xE5, 0x68, 0xF0, 0x90, +0xA2, 0x9B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x12, 0xBC, 0x7C, 0x75, 0xF0, 0x10, 0xE5, +0x67, 0xB1, 0x67, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x54, 0x03, 0x4F, 0xFF, 0x75, 0xF0, 0x10, +0xE5, 0x67, 0xB1, 0x67, 0xEF, 0xF0, 0x7D, 0x01, 0xAF, 0x67, 0x12, 0xB4, 0x89, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x90, 0x81, 0x01, +0x12, 0x45, 0x8A, 0xE0, 0x22, 0x75, 0xF0, 0x0B, 0x90, 0xA0, 0xDE, 0x12, 0x45, 0x8A, 0xE0, 0x54, +0x07, 0x22, 0xA1, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xEB, 0x90, 0x01, 0xC4, 0xED, +0xF0, 0x74, 0x77, 0x11, 0x12, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xE0, 0x32, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xC0, +0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x1F, +0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x78, 0x11, 0x12, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, +0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, -0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xF6, 0xF0, 0x74, 0x80, 0xA3, 0xF0, 0x12, 0xA2, 0x35, -0xE5, 0x19, 0x30, 0xE1, 0x02, 0x31, 0xB1, 0xE5, 0x19, 0x30, 0xE4, 0x03, 0x12, 0x7F, 0xC9, 0xE5, -0x19, 0x30, 0xE5, 0x03, 0x12, 0xA2, 0x92, 0xE5, 0x19, 0x30, 0xE6, 0x03, 0x12, 0xA2, 0xCE, 0xE5, -0x1B, 0x30, 0xE0, 0x02, 0x51, 0x49, 0xE5, 0x1B, 0x30, 0xE1, 0x03, 0x12, 0x95, 0x5F, 0xE5, 0x1B, -0x30, 0xE2, 0x03, 0x12, 0xA2, 0xDB, 0xE5, 0x1B, 0x30, 0xE3, 0x02, 0x51, 0x33, 0xE5, 0x1B, 0x30, -0xE4, 0x02, 0x51, 0xA6, 0xE5, 0x1B, 0x30, 0xE5, 0x03, 0x12, 0xA4, 0x0D, 0xE5, 0x1B, 0x30, 0xE6, -0x03, 0x12, 0x68, 0x56, 0xE5, 0x1C, 0x30, 0xE1, 0x02, 0x51, 0xD0, 0xE5, 0x1C, 0x30, 0xE4, 0x03, -0x12, 0x7F, 0x54, 0xE5, 0x1C, 0x30, 0xE5, 0x03, 0x12, 0x7F, 0x52, 0x74, 0xF6, 0x04, 0x90, 0x01, -0xC4, 0xF0, 0x74, 0x80, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, -0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, -0x32, 0xE4, 0xFF, 0x90, 0xA1, 0x1B, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x64, 0xA3, 0xE0, -0xF5, 0x65, 0x65, 0x64, 0x60, 0x6C, 0x90, 0xA1, 0x1C, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0x2A, 0x74, -0x08, 0xF0, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x66, 0xE4, 0xF5, 0x63, 0xE5, 0x66, 0x75, 0xF0, -0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x63, 0x12, -0x55, 0x36, 0xE0, 0xFF, 0x74, 0x1E, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xEF, -0xF0, 0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD4, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x1C, 0x12, 0x6E, -0xA2, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x65, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x65, 0x90, 0x04, -0x7F, 0xE5, 0x65, 0xF0, 0x90, 0xA1, 0x1B, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, 0x6F, 0x57, 0x12, -0x98, 0x0D, 0x22, 0x12, 0x5F, 0x8C, 0x64, 0x01, 0x70, 0x0E, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x08, -0x51, 0xC4, 0x12, 0x6F, 0xBE, 0x12, 0x48, 0x2C, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x10, -0xA3, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x51, 0xFC, -0x71, 0x8D, 0x90, 0xA0, 0x5F, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x65, 0x1D, 0x22, 0x71, -0x20, 0x12, 0x5C, 0xCD, 0x51, 0x62, 0x90, 0xA0, 0x52, 0xE0, 0x30, 0xE0, 0x28, 0x12, 0x97, 0x85, -0x90, 0xA0, 0x55, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x5E, 0xF0, 0x90, 0xA0, 0x53, 0xE0, 0x14, -0x90, 0xA0, 0x55, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x88, 0xD8, 0x12, -0x5C, 0xCD, 0x12, 0x8F, 0xC2, 0x22, 0x12, 0x5F, 0x8C, 0x64, 0x01, 0x70, 0x16, 0x90, 0x9F, 0xA7, -0xE0, 0x60, 0x10, 0x51, 0xC4, 0x90, 0x9F, 0xA3, 0xE0, 0x12, 0x8F, 0x7F, 0x54, 0x07, 0x70, 0x03, -0x12, 0x68, 0x44, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x22, -0x90, 0x9F, 0xA7, 0xE0, 0x70, 0x07, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x9F, 0x9E, -0xE0, 0x30, 0xE0, 0x08, 0x51, 0xF0, 0xBF, 0x01, 0x06, 0x02, 0xA3, 0x1C, 0x12, 0x5E, 0x6F, 0x22, -0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0x9D, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0B, 0x51, 0xF0, -0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x91, 0x59, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xE4, 0x90, 0xA1, 0x2B, 0xF0, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x61, 0x12, 0x5F, 0x8C, 0x64, 0x01, -0x70, 0x5A, 0xF1, 0xD6, 0xF1, 0xC3, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x12, -0xAC, 0x49, 0xF0, 0x12, 0x67, 0x80, 0xE4, 0x90, 0x9F, 0xAE, 0xF0, 0x90, 0x9F, 0x9E, 0xE0, 0x30, -0xE0, 0x15, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0xA1, 0x2B, 0xF0, 0x51, 0xF0, -0xEF, 0x70, 0x04, 0x90, 0xA1, 0x2B, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0x60, 0x1F, 0x90, 0x9F, 0xAB, -0xE0, 0x44, 0x10, 0x12, 0xA9, 0x18, 0x90, 0x9F, 0xAF, 0xE0, 0x90, 0xA1, 0xDA, 0x12, 0x48, 0x2C, -0x90, 0x9F, 0xAA, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x5A, 0x9D, 0x91, 0x33, 0x22, 0xE4, 0xF5, 0x63, -0x90, 0x9F, 0xA7, 0xE0, 0x70, 0x02, 0x81, 0x28, 0x12, 0x5F, 0x8C, 0x64, 0x01, 0x60, 0x02, 0x81, -0x28, 0xF1, 0xC4, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x12, 0xAC, 0x49, 0xD1, -0xF5, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x9F, 0xAE, 0xE0, 0x14, 0xF0, -0xE0, 0xFF, 0x60, 0x06, 0x90, 0x9F, 0xB0, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x9F, 0xAD, -0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x11, 0x90, -0x9F, 0xA2, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x51, 0xF0, 0xEF, 0x70, 0x02, 0xF5, 0x63, -0xE5, 0x63, 0x60, 0x34, 0x90, 0x9F, 0xAB, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x9F, 0xB0, 0xE0, 0x60, -0x03, 0xB4, 0x01, 0x04, 0x91, 0x29, 0x80, 0x08, 0x91, 0x29, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, -0xFF, 0x90, 0x9F, 0xAF, 0xE0, 0x2F, 0x90, 0xA1, 0xDA, 0x12, 0x48, 0x2C, 0x90, 0x9F, 0xAA, 0xE0, -0x20, 0xE2, 0x03, 0x12, 0x5A, 0x9D, 0x91, 0x33, 0x22, 0xE4, 0x90, 0xA1, 0xD9, 0xF0, 0x90, 0x9F, -0xB0, 0xE0, 0x22, 0x12, 0x9D, 0x3F, 0x30, 0xE0, 0x1F, 0xD1, 0xD3, 0x20, 0xE0, 0x1A, 0xB1, 0xA8, -0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0x12, 0x9D, 0x48, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, -0x0D, 0x80, 0x02, 0x7F, 0x09, 0x12, 0x62, 0xC3, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x9F, 0xA1, 0xE0, 0x90, 0xA2, 0x37, 0xF0, 0x6F, 0x70, 0x02, 0xA1, 0x67, 0xEF, 0x14, 0x60, -0x42, 0x14, 0x60, 0x70, 0x14, 0x70, 0x02, 0xA1, 0x12, 0x14, 0x70, 0x02, 0xA1, 0x3E, 0x24, 0x04, -0x60, 0x02, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x04, 0x04, 0xB1, 0x86, 0xA1, 0x67, 0x90, -0xA2, 0x37, 0xE0, 0xB4, 0x02, 0x04, 0xB1, 0x92, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x03, -0x04, 0xB1, 0x9C, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x67, 0xB1, -0x89, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x5F, 0xD0, 0xA1, 0x67, 0x90, -0xA2, 0x37, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x5F, 0xDE, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, -0x03, 0x05, 0x12, 0x5F, 0xC7, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0x60, 0x02, 0xA1, 0x67, 0x12, -0x5F, 0xEC, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0xA8, 0xB8, 0x80, 0x77, -0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x01, 0x05, 0x12, 0x67, 0xDF, 0x80, 0x6B, 0x90, 0xA2, 0x37, 0xE0, -0xB4, 0x03, 0x05, 0x12, 0x67, 0xEA, 0x80, 0x5F, 0x90, 0xA2, 0x37, 0xE0, 0x70, 0x59, 0xF1, 0xD0, -0x80, 0x55, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0xA8, 0xAB, 0x80, 0x49, 0x90, 0xA2, -0x37, 0xE0, 0xB4, 0x01, 0x04, 0xB1, 0x78, 0x80, 0x3E, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x02, 0x04, -0xB1, 0x97, 0x80, 0x33, 0x90, 0xA2, 0x37, 0xE0, 0x70, 0x2D, 0xB1, 0x75, 0x80, 0x29, 0x90, 0xA2, -0x37, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0xA1, 0x80, 0x1E, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x01, 0x04, -0xB1, 0x6F, 0x80, 0x13, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x02, 0x04, 0xD1, 0xDA, 0x80, 0x08, 0x90, -0xA2, 0x37, 0xE0, 0x70, 0x02, 0xB1, 0x6C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x5F, 0xEC, 0x7D, -0x1F, 0xD1, 0xE3, 0xF0, 0x22, 0x12, 0x5F, 0xEC, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x49, 0x22, 0x90, -0x9F, 0xA1, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x5F, 0xD0, 0x12, 0xA9, 0xB9, 0xE4, 0x90, 0x9F, 0xA1, -0xF0, 0x22, 0x12, 0x5F, 0xDE, 0x80, 0xF2, 0x12, 0x64, 0xAA, 0x80, 0xE3, 0x12, 0x5F, 0xC7, 0x80, -0xE8, 0x7D, 0x25, 0xD1, 0xE3, 0xF0, 0x22, 0xF0, 0x90, 0xA0, 0x62, 0xE0, 0xC4, 0x54, 0x0F, 0x22, -0x90, 0xA1, 0x2B, 0xEF, 0xF0, 0x7F, 0x03, 0x12, 0x66, 0xEC, 0xB1, 0xA8, 0x90, 0xA0, 0x72, 0x30, -0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0x63, 0x12, 0x8F, 0xB4, -0x20, 0xE0, 0x05, 0xD1, 0xD3, 0x30, 0xE0, 0x37, 0xB1, 0xA8, 0x30, 0xE0, 0x0A, 0x90, 0xA0, 0x60, -0xE0, 0xFF, 0x90, 0xA0, 0x70, 0x80, 0x21, 0x90, 0xA1, 0x2B, 0xE0, 0xFC, 0xB4, 0x01, 0x0D, 0x90, -0xA0, 0x60, 0xE0, 0xFE, 0x90, 0xA0, 0x6F, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, 0xB4, 0x04, 0x0F, -0x90, 0xA0, 0x61, 0xE0, 0xFF, 0x90, 0xA0, 0x6F, 0xE0, 0xC3, 0x9F, 0x90, 0xA0, 0x76, 0xF0, 0x12, -0x9B, 0xC4, 0x30, 0xE0, 0x21, 0x12, 0x9B, 0xBB, 0x20, 0xE0, 0x02, 0xC1, 0x9E, 0xD1, 0xCA, 0x50, -0x0A, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, -0xFF, 0x12, 0x4E, 0xDD, 0x80, 0x68, 0x12, 0x9B, 0xB3, 0x30, 0xE0, 0x49, 0x12, 0xAC, 0xCE, 0xFD, -0x7F, 0x04, 0x12, 0x5A, 0xA1, 0x12, 0x4F, 0xD0, 0x30, 0xE0, 0x3A, 0x90, 0xA0, 0x66, 0xE0, 0x44, -0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA0, 0x75, 0xF0, 0x90, 0xA0, 0x72, 0xF0, 0x90, 0xA1, -0x2B, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA0, 0x67, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, -0x04, 0x06, 0x90, 0xA0, 0x67, 0x74, 0x07, 0xF0, 0x90, 0xA0, 0x51, 0xE0, 0x60, 0x07, 0x90, 0xA0, -0x66, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, 0x09, -0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x90, 0xA0, -0x63, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0xD1, 0xCA, 0x50, 0x0A, 0xEF, 0x7F, -0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0x12, 0x4E, 0x12, 0x90, -0xA0, 0x62, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x5C, 0x93, 0x22, 0x90, 0xA0, 0x76, 0xE0, 0xFF, 0xC3, -0x94, 0x20, 0x22, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x12, 0x64, 0xAA, 0x7D, 0x24, 0xD1, -0xE3, 0xF0, 0x22, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, -0x9F, 0xA1, 0x74, 0x04, 0x22, 0xF0, 0x90, 0x9F, 0xA5, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0xF1, -0xC4, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x1B, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x12, 0x5F, 0x8C, 0x64, 0x01, 0x60, 0x02, 0xE1, 0xB6, 0x90, 0x9F, 0xA7, 0xE0, -0x70, 0x02, 0xE1, 0xB6, 0xD1, 0xF6, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x9F, -0xAE, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x9F, 0xAD, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, -0x9F, 0xAD, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x9F, 0xAE, 0xEF, 0xF0, 0x12, 0x8B, 0x78, 0x12, -0xAB, 0xFA, 0xE4, 0x90, 0x9F, 0xB0, 0x12, 0xAC, 0x3E, 0x51, 0xC4, 0x12, 0x8F, 0x82, 0x54, 0xEF, -0xD1, 0xF5, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0F, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x05, 0x12, -0x68, 0xC1, 0x80, 0x03, 0x12, 0x68, 0x75, 0x90, 0x9F, 0xA4, 0xE0, 0x12, 0x5E, 0xCD, 0x30, 0xE0, -0x35, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x2C, 0x90, 0x9F, 0xAD, 0xE0, 0xFF, 0xA3, -0xE0, 0x6F, 0x70, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x44, 0x40, 0xF0, 0xF1, 0xD6, 0xF0, 0x90, 0x01, -0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x88, 0xD0, 0x12, 0x5F, 0xA7, 0x12, 0x8F, 0xBB, -0x90, 0x9F, 0xAE, 0xE0, 0x14, 0xF0, 0x90, 0x9F, 0x9E, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x03, 0x12, -0xAB, 0xFA, 0x22, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x22, -0x12, 0x5F, 0xEC, 0x02, 0x67, 0xDF, 0x90, 0x9F, 0xAD, 0xE0, 0x90, 0x05, 0x73, 0x22, 0xC0, 0xE0, -0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, -0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xDE, -0xF0, 0x74, 0x87, 0xA3, 0xF0, 0x12, 0xA2, 0x62, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x11, 0xC1, 0xE5, -0x21, 0x30, 0xE2, 0x02, 0x31, 0x46, 0xE5, 0x21, 0x30, 0xE5, 0x02, 0x11, 0x97, 0xE5, 0x22, 0x30, -0xE0, 0x02, 0x51, 0xD8, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0xA4, 0x29, 0xE5, 0x23, 0x30, 0xE0, -0x03, 0x12, 0xA3, 0x57, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xB3, 0xE5, 0x23, 0x30, 0xE2, 0x09, -0x31, 0xB6, 0x90, 0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, -0x12, 0x6F, 0x57, 0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x82, 0x6F, 0xE5, 0x24, 0x30, 0xE5, 0x02, -0x31, 0x87, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0xA4, 0x72, 0xE5, 0x24, 0x30, 0xE7, 0x02, 0x31, -0x2E, 0x74, 0xDE, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x87, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, -0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, -0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xA0, 0xC1, 0xE0, 0x30, 0xE0, 0x0A, 0x11, 0xA9, -0xE4, 0x90, 0xA0, 0xC3, 0xF0, 0x12, 0x48, 0x05, 0x22, 0x7D, 0x20, 0xE4, 0xFF, 0x74, 0x1D, 0x12, -0xAD, 0x31, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, -0x22, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x02, 0x91, 0x97, 0x02, 0x48, 0x61, 0x7D, 0x03, 0x7F, 0x02, -0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0x80, 0xDA, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, -0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0xA0, 0x52, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x64, 0x01, -0x70, 0x21, 0x90, 0x01, 0x53, 0xF0, 0x90, 0xA0, 0x54, 0xE0, 0x60, 0x0B, 0x7D, 0x10, 0x7F, 0x03, -0x11, 0xD0, 0x12, 0x97, 0x85, 0x80, 0x18, 0x31, 0x24, 0x11, 0xAD, 0x12, 0x5F, 0xA1, 0x12, 0x5E, -0xF0, 0x80, 0x0C, 0x31, 0x24, 0x11, 0xD0, 0x12, 0x5C, 0xCD, 0xF1, 0xC2, 0x12, 0x5C, 0x99, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x22, 0x90, 0xA0, -0x7A, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x67, 0xA3, 0x80, 0x02, 0xF1, 0x3F, 0x90, 0xA0, 0xAD, 0xE0, -0x30, 0xE0, 0x02, 0x31, 0xE8, 0x22, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x14, 0x90, 0x06, 0x92, 0xE0, -0x30, 0xE1, 0x03, 0x02, 0xA8, 0xE1, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x68, 0x44, -0x22, 0xF1, 0xC9, 0x90, 0xA0, 0x52, 0x12, 0x6F, 0x44, 0x12, 0x6A, 0x86, 0x90, 0xA0, 0x53, 0x12, -0x56, 0xDD, 0x90, 0xA0, 0x54, 0xF0, 0x90, 0xA0, 0x53, 0xE0, 0x90, 0xA0, 0x55, 0xF0, 0x90, 0xA0, -0x52, 0xE0, 0x54, 0x01, 0xFF, 0x01, 0xD8, 0x90, 0x9F, 0xA3, 0x12, 0x6F, 0xA4, 0x30, 0xE0, 0x25, -0xEF, 0x54, 0xBF, 0x12, 0xA5, 0x05, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, -0x54, 0xFE, 0xF0, 0x90, 0xA0, 0x65, 0xF1, 0xB4, 0x30, 0xE0, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x02, -0x5A, 0xA1, 0x12, 0x68, 0x44, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0xAD, -0xE0, 0x30, 0xE0, 0x1F, 0x90, 0xA0, 0xB2, 0xE0, 0xB4, 0x01, 0x0C, 0xA3, 0xE0, 0xB4, 0x01, 0x13, -0x74, 0x02, 0xF0, 0x51, 0x53, 0x80, 0x0C, 0x90, 0xA0, 0xB2, 0xE0, 0xB4, 0x02, 0x05, 0x74, 0x03, -0xF0, 0x31, 0xE8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0xA0, 0xB4, 0xE0, 0xB4, 0x01, 0x02, 0x80, 0x43, 0x90, 0xA0, 0xB4, 0xE0, 0xB4, 0x02, 0x11, 0x51, -0x53, 0x7F, 0x01, 0x51, 0x84, 0x12, 0x66, 0xFE, 0x90, 0xA0, 0xB4, 0x74, 0x03, 0xF0, 0x80, 0x3E, -0x90, 0xA0, 0xB4, 0xE0, 0x64, 0x03, 0x70, 0x1C, 0x90, 0xA0, 0xB7, 0x51, 0x56, 0xE4, 0xFF, 0x51, -0x84, 0x12, 0x66, 0xFE, 0x51, 0x7A, 0xE4, 0xFB, 0xFD, 0x12, 0x4E, 0x54, 0x90, 0xA0, 0xB4, 0x74, -0x04, 0xF0, 0x80, 0x1A, 0x90, 0xA0, 0xB4, 0xE0, 0xB4, 0x04, 0x13, 0x51, 0x7A, 0x7B, 0x01, 0x7D, -0x01, 0x12, 0x4E, 0x54, 0x90, 0xA0, 0xB4, 0x74, 0x02, 0xF0, 0x90, 0xA0, 0xB2, 0xF0, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0x90, 0xA0, 0xB9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD, 0x07, 0xEE, 0xFF, 0x90, -0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, -0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA0, 0xAD, 0xE0, 0xC3, 0x13, -0x54, 0x03, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x10, 0x90, -0xA0, 0x62, 0x12, 0x4F, 0xD3, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4, 0xF0, 0x80, 0x34, 0x90, -0xA0, 0x63, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, -0x80, 0x03, 0x74, 0x03, 0xF0, 0x90, 0xA0, 0xAD, 0xE0, 0x30, 0xE0, 0x17, 0xC4, 0x54, 0x0F, 0x30, -0xE0, 0x0B, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80, 0x03, 0x90, 0x06, 0xCC, -0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xA5, 0x0E, 0x90, 0xA1, 0x2B, 0xEF, 0xF0, -0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x5A, 0x1E, 0x90, 0xA1, -0x2B, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, -0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x91, 0xF9, 0x90, 0x9F, 0xC0, 0xE0, 0xFB, 0xAC, 0x07, 0x90, -0x9F, 0xA3, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x9F, 0xDD, 0xE0, 0x24, 0x04, 0x90, 0x9F, 0xBC, 0xF0, -0x90, 0x9F, 0xDD, 0xE0, 0x24, 0x03, 0x90, 0x9F, 0xBB, 0xF0, 0x80, 0x0B, 0x90, 0x9F, 0xBC, 0x74, -0x02, 0xF0, 0x90, 0x9F, 0xBB, 0x14, 0xF0, 0x90, 0x9F, 0xBB, 0xE0, 0xFA, 0x90, 0x9F, 0xBA, 0xE0, -0xD3, 0x9A, 0x50, 0x09, 0x90, 0x9F, 0xAF, 0xEB, 0x71, 0x70, 0x2C, 0x80, 0x0B, 0xAD, 0x02, 0xC3, -0xED, 0x9D, 0x2B, 0x90, 0x9F, 0xAF, 0x71, 0x70, 0x90, 0x9F, 0xBF, 0xF0, 0x90, 0x9F, 0xBF, 0xE0, -0xFF, 0x7E, 0x00, 0x90, 0x9F, 0xB3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xF0, 0x22, -0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0xC3, 0x9D, 0x22, 0xE4, 0xFD, 0xF9, 0xFC, 0x90, 0x05, 0x62, 0xE0, -0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, -0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x9F, 0xE0, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0x90, 0x9F, 0xE0, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x21, 0xEB, -0x9F, 0xFF, 0x90, 0x9F, 0xBF, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xF9, 0xC3, 0x94, 0x19, -0x50, 0x0E, 0x74, 0xC4, 0x29, 0x91, 0x64, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xBD, 0xE0, 0x04, 0xF0, -0x90, 0x9F, 0xBD, 0xE0, 0xC3, 0x94, 0x64, 0x50, 0x02, 0x81, 0x60, 0xE4, 0xFC, 0xFD, 0x91, 0x61, -0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x05, 0x40, 0x07, 0x90, 0xA1, 0x1D, 0xED, 0xF0, 0x80, 0x05, 0x0D, -0xED, 0xB4, 0x19, 0xEA, 0xE4, 0xFC, 0xFD, 0x91, 0x61, 0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x5F, 0x40, -0x07, 0x90, 0xA1, 0x1E, 0xED, 0xF0, 0x80, 0x05, 0x0D, 0xED, 0xB4, 0x19, 0xEA, 0x90, 0xA1, 0x1D, -0xE0, 0x90, 0x9F, 0xC2, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x90, 0x9F, 0xC3, 0x91, 0x6C, 0x94, 0x0B, -0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x9F, 0xBA, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x9F, 0xBA, -0x91, 0x6C, 0x74, 0x0A, 0x9F, 0x90, 0x9F, 0xB9, 0xF0, 0x90, 0x9F, 0xC2, 0xE0, 0xFF, 0xA3, 0xE0, -0xC3, 0x9F, 0x90, 0x9F, 0xC0, 0xF0, 0xC3, 0x94, 0x08, 0x50, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x9F, -0xBA, 0xE0, 0xFD, 0x90, 0x9F, 0xC0, 0xE0, 0xFB, 0xE4, 0xFF, 0x71, 0x0D, 0xE4, 0xFF, 0xF1, 0x8A, -0x22, 0x74, 0xC4, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0x22, 0xF0, 0x90, 0x9F, 0xC2, -0xE0, 0xFF, 0xC3, 0x22, 0xF1, 0x0B, 0x40, 0x1E, 0x90, 0x9F, 0xC1, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, -0x94, 0x04, 0x50, 0x12, 0x90, 0x9F, 0xB9, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x9F, 0xC0, -0xF0, 0xFB, 0x91, 0xF9, 0x71, 0x0D, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x12, 0x5E, 0xCD, 0x30, 0xE0, -0x0B, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xF1, 0xBB, 0xB1, 0x02, 0x30, 0xE0, -0x08, 0xF1, 0x7E, 0x54, 0x07, 0x70, 0x39, 0x80, 0x34, 0xD1, 0xFE, 0x40, 0x30, 0x12, 0x5F, 0x8C, -0x64, 0x01, 0x70, 0x2C, 0x12, 0x69, 0x3A, 0x70, 0x04, 0x91, 0x74, 0x80, 0x24, 0x91, 0x74, 0x90, -0x9F, 0xB1, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, 0x40, 0x09, 0x91, 0xF1, 0xE4, 0x90, 0x9F, -0xB1, 0xF0, 0x80, 0x03, 0x12, 0x5F, 0xB7, 0xE4, 0x90, 0x9F, 0xB0, 0xF0, 0x22, 0x12, 0x68, 0x44, -0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x9F, 0xB9, 0xE0, 0xFF, 0xA3, 0xE0, -0xFD, 0x22, 0x90, 0x9F, 0xA3, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x12, 0x4F, 0xD0, 0x20, -0xE0, 0x02, 0xC1, 0xB9, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x01, 0x70, 0x2A, 0x90, 0x06, 0x92, 0xE0, -0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x18, 0xD1, 0xC0, 0xD1, 0xC7, 0x90, 0xA0, 0x6B, -0xE0, 0x75, 0xF0, 0x03, 0x84, 0xFF, 0x90, 0xA0, 0x74, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xC1, -0xA3, 0xD1, 0xD6, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x04, 0x70, 0x27, 0x90, 0x06, -0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x14, 0xD1, 0xC0, 0xD1, 0xC7, 0x90, -0xA0, 0x6A, 0xE0, 0xFF, 0x90, 0xA0, 0x74, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xC1, 0xA3, 0xD1, -0xD6, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0x22, 0xF1, -0x17, 0x50, 0x08, 0x90, 0xA0, 0x75, 0xE0, 0x94, 0x03, 0x40, 0x1B, 0x12, 0x85, 0xA8, 0x90, 0xA0, -0x72, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA0, 0x67, -0xF0, 0x90, 0xA0, 0x75, 0xF0, 0x22, 0x90, 0xA0, 0x66, 0xB1, 0x05, 0x30, 0xE0, 0x40, 0xEF, 0x54, -0xFB, 0xF0, 0xE4, 0xA3, 0x12, 0x85, 0xA7, 0x30, 0xE0, 0x0B, 0x90, 0xA0, 0x84, 0xE0, 0x20, 0xE0, -0x02, 0xC1, 0x59, 0xC1, 0x4C, 0xF1, 0x17, 0x40, 0x0B, 0x90, 0xA0, 0x84, 0xE0, 0x30, 0xE0, 0x02, -0x80, 0x7A, 0xC1, 0x59, 0x90, 0xA0, 0x84, 0xE0, 0x30, 0xE0, 0x0C, 0xD1, 0xBA, 0xE4, 0x90, 0xA0, -0x74, 0xF0, 0x90, 0xA2, 0x15, 0x80, 0x7D, 0x90, 0xA0, 0x72, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x4C, -0x80, 0x90, 0xA0, 0x75, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0x12, 0x66, 0xEC, 0xF1, 0x17, 0x50, 0x0A, -0x90, 0xA0, 0x75, 0xE0, 0x94, 0x03, 0x50, 0x02, 0xC1, 0xB9, 0x7F, 0x03, 0x12, 0x62, 0xC3, 0x90, -0x05, 0x22, 0xE0, 0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12, 0x49, 0x22, 0x90, 0x04, 0x9C, 0xE0, 0x04, -0xF0, 0x22, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x07, 0x70, 0x3D, 0x90, 0xA0, 0x75, 0xE0, 0xB4, 0x04, -0x05, 0x12, 0x6F, 0xD1, 0x80, 0x67, 0x90, 0xA0, 0x66, 0xB1, 0x05, 0x30, 0xE0, 0x1E, 0xEF, 0x54, -0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA0, 0x84, 0xE0, 0x30, 0xE0, 0x0D, 0xD1, 0xBA, 0xE4, 0x90, -0xA0, 0x74, 0xF0, 0x90, 0xA2, 0x15, 0x04, 0x80, 0x0B, 0x02, 0x6F, 0xD1, 0x12, 0x4C, 0x80, 0x90, -0xA0, 0x75, 0xE0, 0x04, 0xF0, 0x80, 0x3C, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x09, 0x70, 0x4A, 0x90, -0xA0, 0x66, 0xE0, 0x30, 0xE0, 0x0B, 0x12, 0x6F, 0xD1, 0x90, 0xA0, 0x66, 0xE0, 0x54, 0xFE, 0xF0, -0x22, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x20, 0x74, 0x04, 0xF0, 0xD1, 0xC7, 0xE0, 0xB4, 0x02, -0x12, 0xD1, 0xCE, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA0, -0x67, 0xF0, 0x22, 0x7F, 0x03, 0x02, 0x66, 0xEC, 0xD1, 0xCE, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, -0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA0, 0x67, 0xF0, 0x22, 0x90, 0xA0, 0x67, 0x74, 0x09, 0xF0, -0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x74, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA2, -0x15, 0xE0, 0x90, 0xA0, 0x72, 0x22, 0xE4, 0x90, 0xA0, 0x67, 0xF0, 0x90, 0xA0, 0x72, 0x22, 0x90, -0x01, 0x57, 0xE0, 0x60, 0x18, 0x12, 0x82, 0xC7, 0xB1, 0x02, 0x30, 0xE0, 0x02, 0xE1, 0x7E, 0xD1, -0xFE, 0x40, 0x0A, 0xE4, 0xFF, 0x12, 0x5F, 0x2F, 0xBF, 0x01, 0x02, 0x91, 0xF1, 0x22, 0x90, 0x9F, -0xB0, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xAB, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA0, 0x4B, 0xE0, 0xFF, -0x90, 0x9F, 0xB0, 0xE0, 0xD3, 0x9F, 0x22, 0x90, 0xA0, 0x75, 0xE0, 0xFF, 0x90, 0xA0, 0x74, 0xE0, -0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA0, 0x6B, 0xE0, -0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x22, 0x90, -0xA0, 0x5F, 0xE0, 0x30, 0xE0, 0x37, 0xB1, 0x0C, 0x90, 0xA0, 0x72, 0xE0, 0xFF, 0xB4, 0x01, 0x02, -0x80, 0x1D, 0x90, 0xA0, 0x72, 0xE0, 0xFF, 0xB4, 0x02, 0x02, 0x80, 0x1E, 0x90, 0xA0, 0x72, 0xE0, -0xFF, 0xB4, 0x03, 0x03, 0x02, 0x65, 0x1D, 0x90, 0xA0, 0x72, 0xE0, 0xFF, 0xB4, 0x04, 0x03, 0x02, -0x85, 0xB0, 0x90, 0xA0, 0x72, 0xE0, 0xFF, 0xB4, 0x05, 0x03, 0x12, 0x9A, 0x62, 0x22, 0xEF, 0x54, -0xFB, 0xF0, 0x90, 0x9F, 0xAB, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0xE4, 0xFE, 0x74, 0xC4, 0x2E, 0x91, -0x64, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x19, 0xF4, 0xE4, 0x90, 0x9F, 0xBD, 0xF0, 0x90, 0x9F, 0xC1, -0xF0, 0x90, 0x9F, 0xB9, 0xF0, 0xEF, 0xB4, 0x01, 0x09, 0x90, 0x9F, 0xC2, 0x74, 0x19, 0xF0, 0xE4, -0xA3, 0xF0, 0x22, 0x22, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x02, -0x5F, 0xAB, 0x7D, 0x01, 0x7F, 0x02, 0x02, 0x5C, 0xD1, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, -0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, -0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, -0xC4, 0x74, 0xD1, 0xF0, 0x74, 0x8F, 0xA3, 0xF0, 0x12, 0x90, 0x24, 0x53, 0x91, 0xBF, 0x74, 0xD1, -0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, -0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, -0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xFD, 0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA1, 0x3A, -0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x21, 0xF9, 0x90, 0xA2, 0x16, 0xE0, 0x70, 0x1A, 0x7F, 0x2E, 0x12, -0x47, 0xAF, 0x90, 0xA0, 0x9C, 0xEF, 0xF0, 0x7F, 0x2D, 0x12, 0x47, 0xAF, 0x90, 0xA0, 0x9D, 0xEF, -0xF0, 0x90, 0xA2, 0x16, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x15, 0x70, 0x58, 0x90, -0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x11, 0xF4, 0x54, 0x3F, 0x04, 0xFE, 0x51, 0x92, 0xC3, 0x9E, -0x51, 0x8A, 0x40, 0x12, 0xE4, 0xF0, 0x80, 0x0E, 0x51, 0x92, 0xFE, 0xEF, 0x54, 0x3F, 0x2E, 0x51, -0x8A, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA1, 0x39, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, -0xFE, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA1, 0x37, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, -0x46, 0xA0, 0x90, 0xA1, 0x39, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA0, 0x9D, 0xE0, 0x54, 0x0F, -0x4F, 0xFD, 0x7F, 0x2D, 0x12, 0x46, 0xA0, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, 0x21, 0x0D, 0x90, 0xFD, -0x62, 0xE0, 0xFF, 0x12, 0x9A, 0x48, 0x7F, 0x04, 0x12, 0x6F, 0x57, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, -0x23, 0x04, 0x7F, 0x01, 0x31, 0xFA, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, 0x27, 0x04, 0x7F, 0x02, 0x31, -0xFA, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, 0x30, 0x0D, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x12, 0x99, 0x49, -0x7F, 0x04, 0x12, 0x6F, 0x57, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x34, 0x60, 0x02, 0x21, 0x98, 0x90, -0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x59, 0x90, 0xA0, 0x84, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, -0x21, 0x98, 0x90, 0xA0, 0x62, 0x12, 0x4F, 0xD3, 0x30, 0xE0, 0x18, 0x12, 0x47, 0xF0, 0x90, 0xA0, -0x85, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x47, 0xF0, 0xE4, 0xFF, 0xFE, 0xEC, 0x12, 0x47, 0xD0, -0x12, 0x47, 0xD6, 0x51, 0x9B, 0x7D, 0x01, 0x12, 0x46, 0xB4, 0x90, 0xA1, 0x37, 0x74, 0x01, 0xF0, -0xFB, 0x7A, 0xA1, 0x79, 0x37, 0xFD, 0x7F, 0x34, 0x12, 0x6E, 0x00, 0x90, 0xA0, 0xA7, 0xE0, 0x44, -0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x51, 0xB3, 0x80, 0x39, 0x51, -0x9B, 0xE4, 0xFD, 0x12, 0x46, 0xB4, 0x90, 0xA0, 0x62, 0x12, 0x6F, 0xA4, 0x30, 0xE0, 0x1E, 0x12, -0x47, 0xF0, 0xE4, 0xFB, 0xFA, 0xED, 0xF9, 0xEC, 0xF8, 0x90, 0xA0, 0x85, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0xE4, 0xFC, 0xFD, 0x12, 0x45, 0x53, 0x12, 0x47, 0xD0, 0x12, 0x47, 0xD6, 0xD1, 0x2E, 0x90, -0x04, 0x9D, 0xE0, 0x54, 0xFE, 0xF0, 0x71, 0x02, 0x90, 0xA1, 0x3A, 0xE0, 0xFD, 0xB4, 0x35, 0x07, -0x90, 0xA0, 0x66, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x36, 0x23, 0x90, 0xFD, 0x61, 0xE0, 0x90, -0xA1, 0x37, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x38, 0xF0, 0x90, 0xA1, 0x3A, 0xE0, 0xFF, -0x90, 0xA1, 0x37, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x38, 0x12, 0x6E, 0x00, 0x90, 0xA1, -0x3A, 0xE0, 0xB4, 0x37, 0x02, 0x71, 0x29, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, 0x40, 0x14, 0x90, 0xFD, -0x62, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0xA0, 0x82, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA0, -0x82, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x51, 0x01, 0x7F, 0x04, 0x02, 0x6F, -0x57, 0x90, 0xA1, 0x98, 0x74, 0x09, 0xF0, 0x90, 0xA1, 0xA6, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x9A, -0xEF, 0xF0, 0x70, 0x31, 0x90, 0xA0, 0x78, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, 0x60, 0x02, 0x80, 0x0C, -0x90, 0x07, 0x70, 0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0x9B, 0x74, -0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0x9B, 0xF0, 0xE4, 0x90, 0xA1, 0x9C, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x9B, 0xF0, 0x90, 0xFD, 0x63, -0xE0, 0x90, 0xA1, 0x9C, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA1, 0x9D, 0xF0, 0x90, 0xFD, 0x65, -0xE0, 0x90, 0xA1, 0x9E, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA1, 0x9F, 0xF0, 0x90, 0xFD, 0x67, -0xE0, 0x90, 0xA1, 0xA0, 0xF0, 0x90, 0xA1, 0x9B, 0xE0, 0x54, 0x01, 0x90, 0xA0, 0x78, 0xF0, 0xA3, -0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x98, 0x02, 0x6E, 0xA2, 0x90, 0xA1, 0x39, 0xF0, 0xD3, 0x94, -0x3F, 0x22, 0x90, 0xA0, 0x9C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0xA0, 0x62, 0xE0, 0xC4, -0x13, 0x13, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0xA1, 0xE0, 0xFB, 0x90, 0xA0, 0xA0, 0xE0, 0x90, 0xA1, -0xF7, 0xF0, 0x22, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, -0xF1, 0x75, 0x54, 0xFD, 0x4F, 0xF0, 0xE0, 0xC3, 0x13, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xE6, 0xF0, -0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE0, 0x27, 0x12, 0xAB, 0x37, 0x70, 0x20, 0x90, 0xA0, -0xA7, 0xE0, 0x30, 0xE0, 0x02, 0x80, 0x19, 0x90, 0xFD, 0x62, 0xE0, 0xB4, 0xAD, 0x0E, 0xA3, 0xE0, -0xB4, 0x35, 0x09, 0x51, 0xB3, 0x90, 0x01, 0xE5, 0x74, 0xDF, 0xF0, 0x22, 0x80, 0x00, 0x80, 0x02, -0x80, 0xB1, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x44, 0x04, -0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x6E, 0x00, 0x8F, 0x51, 0xE5, 0x51, 0xB4, 0x03, 0x09, 0xE4, -0xFF, 0x51, 0x01, 0x7F, 0x04, 0x12, 0x98, 0x0D, 0x22, 0x90, 0xA0, 0x62, 0x12, 0x4F, 0xD3, 0x20, -0xE0, 0x1D, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x16, 0xE0, 0x90, 0xA1, 0x3B, 0x30, 0xE1, 0x05, -0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x3B, 0xE0, 0xFF, 0x71, 0x50, 0x22, -0x90, 0xA1, 0x3C, 0xEF, 0xF0, 0x90, 0xA0, 0xA1, 0xE0, 0x70, 0x4D, 0x12, 0x47, 0xF0, 0xEE, 0x54, -0x0F, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA1, 0x3D, 0x12, 0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x91, 0x1F, -0x70, 0x05, 0x90, 0xA0, 0x80, 0x80, 0x1B, 0xE4, 0xFF, 0xFE, 0x91, 0x21, 0x70, 0x0A, 0x90, 0xA0, -0x80, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0x80, 0x55, 0xE4, 0xFF, 0x91, 0x1F, 0x70, 0x09, 0x90, 0xA0, -0x80, 0x04, 0xF0, 0xA3, 0xF0, 0x80, 0x46, 0xE4, 0x7F, 0x80, 0xFE, 0x91, 0x21, 0x70, 0x3E, 0x90, -0xA0, 0x80, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x35, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, -0x54, 0x02, 0x91, 0x34, 0x4E, 0x4F, 0x60, 0x08, 0x90, 0xA0, 0x80, 0x74, 0x01, 0xF0, 0x80, 0x05, -0xE4, 0x90, 0xA0, 0x80, 0xF0, 0xF1, 0x6E, 0xEF, 0x54, 0x01, 0x91, 0x34, 0x4E, 0x4F, 0x60, 0x07, -0xE4, 0x90, 0xA0, 0x81, 0xF0, 0x80, 0x06, 0x90, 0xA0, 0x81, 0x74, 0x01, 0xF0, 0x90, 0xA0, 0x7A, -0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x11, 0x12, 0x63, 0x00, 0x90, 0x07, 0x78, 0xE0, 0x90, 0xA0, 0x7F, -0xF0, 0xF1, 0x7D, 0x12, 0x63, 0x84, 0x90, 0xA1, 0x3C, 0xE0, 0xFD, 0x70, 0x02, 0x80, 0x1C, 0xED, -0xB4, 0x01, 0x06, 0x91, 0x2D, 0x44, 0x20, 0xF0, 0x22, 0x90, 0xA1, 0x3C, 0xE0, 0xFD, 0xB4, 0x02, -0x06, 0x91, 0x2D, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4, 0x03, 0x03, 0x91, 0x2D, 0xF0, 0x22, 0x7E, -0x02, 0xFD, 0xFC, 0x90, 0xA1, 0x3D, 0x12, 0x45, 0x8D, 0xC3, 0x02, 0x45, 0x60, 0x90, 0xA0, 0x7A, -0xE0, 0x54, 0x1F, 0x22, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA1, 0x3D, 0x12, 0x08, 0x6D, 0x90, -0xA1, 0x3D, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x22, 0x12, 0xA5, 0x55, 0x7F, 0x08, 0x12, 0x47, 0xAF, -0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0xA0, 0xE4, 0xFF, 0x91, 0xE0, 0x51, 0x9B, 0xE4, -0xFD, 0x12, 0x46, 0xB4, 0x90, 0x9F, 0xA3, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xF1, -0xAD, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x91, 0x89, 0x91, 0x48, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x44, 0x10, 0xF0, -0x51, 0x9B, 0x7D, 0x01, 0x12, 0x46, 0xB4, 0x90, 0x9F, 0xB2, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, -0xA0, 0x90, 0x9F, 0xA8, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, -0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x47, 0xAF, 0xEF, 0x44, -0x10, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0xA0, 0x7F, 0x01, 0x91, 0xE0, 0x7F, 0x90, 0x12, 0x47, 0xAF, -0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0xA0, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, -0x90, 0xA2, 0x23, 0xD1, 0x81, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, -0x90, 0xA2, 0x23, 0xE0, 0x6F, 0x60, 0x34, 0xC3, 0x90, 0xA2, 0x25, 0xE0, 0x94, 0x88, 0x90, 0xA2, -0x24, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA2, -0x24, 0xD1, 0x39, 0xD1, 0xD9, 0xD3, 0x90, 0xA2, 0x25, 0xE0, 0x94, 0x32, 0x90, 0xA2, 0x24, 0xE0, -0x94, 0x00, 0x40, 0xC1, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xBA, 0x22, 0x90, 0x9F, 0xAA, 0xE0, -0xFF, 0x60, 0x03, 0xB4, 0x08, 0x08, 0x12, 0xA9, 0x79, 0xBF, 0x01, 0x02, 0x91, 0x79, 0x22, 0x90, -0x9F, 0xA3, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x30, 0xE0, 0x0E, 0xC3, 0x13, -0x30, 0xE0, 0x07, 0xF1, 0xA0, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xB1, 0x2C, 0x22, 0x90, -0xA0, 0x7A, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x9C, 0x28, 0x80, 0x03, 0x12, 0x9B, 0xEC, 0x90, 0xA0, -0xA7, 0xE0, 0x30, 0xE0, 0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0xA8, 0xE0, 0x64, 0x08, 0x70, -0x17, 0x90, 0xA0, 0xA7, 0xE0, 0x30, 0xE0, 0x0B, 0x51, 0x9B, 0xE4, 0xFD, 0x12, 0x46, 0xB4, 0xD1, -0x2E, 0x80, 0x05, 0xE4, 0x90, 0xA0, 0xA8, 0xF0, 0x90, 0xA0, 0x63, 0x12, 0x6F, 0xA4, 0x30, 0xE0, -0x13, 0x90, 0xA0, 0xA9, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90, 0x04, 0x9C, 0xE4, 0xF0, -0x90, 0xA0, 0xA9, 0xF0, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x9F, 0xA0, 0x74, 0x01, -0xF0, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x4E, 0x90, 0x9F, 0xA3, 0xE0, 0x30, 0xE0, 0x1A, 0x90, 0x9F, -0xBE, 0xE0, 0x04, 0x12, 0x87, 0xC3, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, -0x90, 0x9F, 0xDE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x9F, 0xA4, 0xE0, 0x13, 0x13, 0x13, 0x54, -0x1F, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x03, 0x12, 0x5F, 0xA1, 0x90, 0xA2, -0x35, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, -0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x01, 0x12, 0x6F, 0x57, 0x90, 0xA0, 0x52, 0xE0, 0x30, 0xE0, -0x0C, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x05, 0x12, 0x5F, 0xA1, 0xF1, 0x85, 0x22, 0x90, 0xA0, -0xA7, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF8, 0xEE, 0xF0, 0xA3, 0xD1, 0x81, 0x90, -0xA1, 0xF8, 0xF1, 0x97, 0xE0, 0x60, 0x23, 0xC3, 0x90, 0xA1, 0xFB, 0xE0, 0x94, 0xE8, 0x90, 0xA1, -0xFA, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, -0x0B, 0x90, 0xA1, 0xFA, 0xD1, 0x39, 0xD1, 0xF9, 0x80, 0xD5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0xF1, 0xF0, 0xA3, 0xF0, -0xD1, 0xE0, 0xEF, 0x64, 0x01, 0x60, 0x3B, 0xC3, 0x90, 0xA0, 0xF2, 0xE0, 0x94, 0x88, 0x90, 0xA0, -0xF1, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, -0x74, 0xFD, 0xF0, 0x80, 0x1D, 0x90, 0xA0, 0xF1, 0xD1, 0x39, 0xD1, 0xD9, 0xD3, 0x90, 0xA0, 0xF2, -0xE0, 0x94, 0x32, 0x90, 0xA0, 0xF1, 0xE0, 0x94, 0x00, 0x40, 0xC5, 0x90, 0x01, 0xC6, 0xE0, 0x30, -0xE3, 0xBE, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, -0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xD1, 0xF8, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, -0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x3E, 0x50, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x00, 0x12, 0x45, 0xBE, 0x7F, 0x96, 0x7E, -0x02, 0xD1, 0x40, 0xEF, 0x60, 0x53, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, -0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA2, -0x03, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA2, 0x03, 0xE0, 0xFD, 0x90, 0x02, -0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x00, 0xF1, 0x8E, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, -0x12, 0xA0, 0x27, 0x90, 0xA2, 0x03, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA2, 0x00, 0x12, 0x45, 0xB5, -0x12, 0xA0, 0x80, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x30, -0x7E, 0x09, 0x02, 0x37, 0x4E, 0x25, 0xE0, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0x22, 0x90, 0xA0, 0xA0, -0xE0, 0xFF, 0xE4, 0xFD, 0x22, 0x90, 0xA0, 0x54, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x12, 0x45, -0xB5, 0x90, 0x00, 0x0E, 0x02, 0x06, 0xA2, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x22, -0x90, 0x9F, 0xA1, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0xA0, 0x5B, -0xE0, 0x90, 0x01, 0x30, 0xF0, 0x90, 0xA0, 0x58, 0xE0, 0x90, 0x01, 0x39, 0xF0, 0x90, 0xA0, 0x59, -0xE0, 0x90, 0x01, 0x3A, 0xF0, 0x22, 0x90, 0xA0, 0x91, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x16, -0xEF, 0xB4, 0x01, 0x05, 0x90, 0xA0, 0x98, 0x80, 0x03, 0x90, 0xA0, 0x94, 0x12, 0x47, 0xCE, 0x7F, -0x80, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x22, 0xE4, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xAA, 0x12, 0x6F, -0x85, 0xB4, 0x02, 0x18, 0x90, 0xA2, 0x14, 0xE0, 0x64, 0x04, 0x60, 0x0B, 0x7F, 0x40, 0x11, 0x0D, -0x90, 0xA2, 0x14, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x14, 0xF0, 0x22, 0x90, 0xA2, 0x33, -0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9E, 0x92, 0xE0, 0xFF, 0x90, 0xA2, 0x33, 0xE0, -0xFE, 0xEF, 0x4E, 0x90, 0x9E, 0x92, 0xF0, 0x22, 0x90, 0xA1, 0x61, 0xEB, 0xF0, 0x70, 0x5D, 0x90, -0xA1, 0x61, 0xE0, 0xFE, 0x11, 0x8D, 0xE0, 0xFC, 0x90, 0xA1, 0x62, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, -0x4B, 0x90, 0xA1, 0x66, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, -0x90, 0x9E, 0x91, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, 0xA1, 0x68, 0xF0, 0x90, 0xA1, -0x63, 0xE0, 0x90, 0xA1, 0x6A, 0xF0, 0x90, 0xA1, 0x64, 0x74, 0x0C, 0xF0, 0x90, 0xA1, 0x72, 0x74, -0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x64, 0x12, 0x6E, 0xA2, 0x7F, 0x04, 0x11, 0x0D, 0x90, -0xA1, 0x62, 0xE0, 0xFF, 0x90, 0xA1, 0x61, 0xE0, 0x11, 0x8D, 0xEF, 0xF0, 0x22, 0x24, 0x11, 0xF5, -0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, -0x89, 0x90, 0xA1, 0x01, 0x12, 0x6A, 0x86, 0x90, 0xA1, 0x02, 0x12, 0x56, 0xDD, 0x90, 0xA1, 0x03, -0xF0, 0x12, 0x57, 0x09, 0x90, 0xA1, 0x04, 0x12, 0x6D, 0x27, 0x90, 0xA1, 0x05, 0x12, 0x96, 0x82, -0x90, 0xA0, 0x87, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x02, 0xE0, 0xB4, 0x0C, 0x06, 0xE5, 0x70, -0x70, 0x11, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, 0x7D, 0x07, 0x7F, 0x30, 0x12, 0x6E, -0x00, 0x8F, 0x51, 0x90, 0xA1, 0x02, 0xE0, 0xB4, 0x0D, 0x0E, 0xE5, 0x51, 0x64, 0x01, 0x60, 0x05, -0x75, 0x70, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x70, 0xE5, 0x51, 0xB4, 0x01, 0x05, 0x75, 0x52, 0x01, -0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, 0xA1, 0x01, 0xE0, 0xFB, 0xAD, 0x52, 0xE4, 0xFF, 0x31, 0x49, -0x7F, 0x04, 0x11, 0x0D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x0C, 0x74, 0x12, 0xF0, 0x90, -0xA1, 0x1A, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x0E, 0xEF, 0x12, 0x4F, 0xBF, 0x90, 0xA1, 0x0A, 0xE0, -0x90, 0xA1, 0x11, 0xF0, 0x90, 0xA1, 0x0B, 0xE0, 0x90, 0xA1, 0x12, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, -0x79, 0x0C, 0x12, 0x6E, 0xA2, 0x7F, 0x04, 0x01, 0x0D, 0x90, 0xA1, 0xA7, 0x74, 0x0B, 0xF0, 0x90, -0xA1, 0xB5, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0xA9, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, -0x90, 0xA1, 0xAA, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA1, 0xAB, 0xF0, 0x90, 0xFD, 0x64, 0xE0, -0x90, 0xA1, 0xAC, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA1, 0xAD, 0xF0, 0x90, 0xFD, 0x66, 0xE0, -0x90, 0xA1, 0xAE, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA1, 0xAF, 0xF0, 0x80, 0x0D, 0x90, 0xA1, -0xAA, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0x12, 0x58, 0xA4, 0x7B, 0x01, 0x7A, 0xA1, 0x79, -0xA7, 0x02, 0x6E, 0xA2, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, -0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA1, 0x01, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, -0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA1, 0x01, 0xE0, 0x90, 0xA1, -0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, -0x01, 0x08, 0x90, 0xA1, 0x01, 0xE0, 0x90, 0xA1, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, -0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA1, 0x01, 0xE0, 0x90, 0xA1, -0x05, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, -0x01, 0x08, 0x90, 0xA1, 0x01, 0xE0, 0x90, 0xA1, 0x06, 0xF0, 0x90, 0xA1, 0x02, 0xE0, 0xFF, 0xA3, -0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA1, 0x0A, 0xF0, 0x90, 0xA1, 0x06, 0xE0, 0x90, -0xA1, 0x0B, 0xF0, 0x21, 0x19, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x9F, 0x8B, 0xF0, 0xBF, 0x01, 0x07, -0x31, 0xA4, 0xE4, 0x90, 0x9F, 0x8B, 0xF0, 0x22, 0x90, 0xA1, 0x3B, 0x74, 0x08, 0xF0, 0x90, 0xA1, -0x49, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x3D, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x3B, 0x02, -0x6E, 0xA2, 0x90, 0xA1, 0x2B, 0xEF, 0xF0, 0x90, 0xA1, 0x2D, 0x74, 0x02, 0xF0, 0x7F, 0x01, 0x12, -0x8A, 0x84, 0x90, 0xA0, 0x63, 0x12, 0x8D, 0x05, 0x30, 0xE0, 0x22, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, -0x02, 0x04, 0x7D, 0x07, 0x80, 0x09, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x0D, 0x7F, -0xFF, 0x12, 0x49, 0x22, 0x12, 0x4C, 0x22, 0xBF, 0x01, 0x03, 0x12, 0x63, 0x05, 0x90, 0xA0, 0x63, -0x12, 0x56, 0xE4, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x01, 0x12, 0x62, 0xC3, 0x90, -0xA1, 0x2B, 0xE0, 0xB4, 0x02, 0x0D, 0x90, 0xA0, 0x60, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0xA0, 0x6F, -0x12, 0x66, 0xE8, 0x90, 0xA0, 0x5F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x2C, -0xF0, 0x80, 0x06, 0x90, 0xA1, 0x2C, 0x74, 0x01, 0xF0, 0x71, 0xCD, 0x20, 0xE0, 0x13, 0x90, 0xA0, -0xA0, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0x2D, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0x2D, -0xF0, 0x90, 0xA1, 0x2D, 0xE0, 0xFF, 0x90, 0xA1, 0x2C, 0xE0, 0xFD, 0x12, 0x63, 0x84, 0xE4, 0x90, -0xA0, 0x71, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xB4, 0x02, 0x05, 0x12, 0x67, 0x9C, 0x80, 0x09, -0xEF, 0xB4, 0x05, 0x05, 0xE4, 0x90, 0xA0, 0x72, 0xF0, 0x71, 0xC4, 0x30, 0xE0, 0x17, 0x90, 0xA1, -0x2B, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x08, 0x80, 0x4B, 0x90, 0xA1, 0x2B, 0xE0, 0x64, 0x05, 0x70, -0x48, 0x7D, 0x0E, 0x80, 0x3F, 0x71, 0xB3, 0x30, 0xE0, 0x1E, 0x71, 0xBB, 0x20, 0xE0, 0x02, 0x71, -0xA9, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x28, 0x90, 0xA1, 0x2B, 0xE0, -0x64, 0x05, 0x70, 0x25, 0x7D, 0x0F, 0x80, 0x1C, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x1B, 0x71, 0xA9, -0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x0A, 0x80, 0x09, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, -0x05, 0x07, 0x7D, 0x10, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x90, 0xA0, 0x62, 0xE0, 0x30, 0xE0, 0x03, -0x12, 0x5C, 0x93, 0x90, 0xA0, 0x62, 0x12, 0x56, 0xE4, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x97, -0xC6, 0x90, 0xA0, 0x63, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, -0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x9F, 0xA9, 0xE0, 0xFF, 0xE4, 0xFD, -0x02, 0x5A, 0xA1, 0x90, 0xA0, 0x5F, 0xE0, 0xC4, 0x54, 0x0F, 0x22, 0x90, 0xA0, 0x63, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x22, 0x90, 0xA0, 0x5F, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x90, 0xA0, 0x62, -0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x7E, 0x00, 0x7F, 0x0A, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, -0x79, 0x87, 0x12, 0x08, 0xAA, 0x90, 0xA0, 0x73, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFF, 0x90, 0xA0, -0x5F, 0xE0, 0x30, 0xE0, 0x32, 0xA3, 0x12, 0x66, 0xE8, 0x90, 0xA0, 0x72, 0x74, 0x01, 0xF0, 0x90, -0xA0, 0x71, 0xF0, 0x90, 0xA0, 0x51, 0xE0, 0x60, 0x07, 0x7D, 0x05, 0x7F, 0x6F, 0x02, 0x49, 0x22, -0x12, 0x5C, 0x93, 0x90, 0xA0, 0x5F, 0x12, 0x8F, 0xB4, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, -0x3F, 0x30, 0xE0, 0x03, 0x12, 0x6F, 0xDF, 0x22, 0x12, 0x67, 0xA3, 0x90, 0xA0, 0x7A, 0x12, 0x8F, -0xB4, 0xFE, 0xEF, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9E, 0x40, 0x03, 0x02, 0x67, 0xB3, 0x90, 0xA0, -0x7A, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, -0x25, 0xE0, 0x4F, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7F, 0xC2, 0x12, -0x06, 0x89, 0xFF, 0x90, 0x9F, 0x9D, 0xF0, 0xBF, 0x01, 0x09, 0x12, 0x6A, 0x87, 0x64, 0x01, 0x60, -0x1D, 0x80, 0x18, 0x12, 0x57, 0xE3, 0x12, 0x6A, 0x87, 0x64, 0x01, 0x60, 0x11, 0x90, 0x9F, 0x9E, -0xE0, 0x20, 0xE0, 0x07, 0xE4, 0xFF, 0x12, 0x84, 0x59, 0x80, 0x03, 0x12, 0x82, 0xFC, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0x90, 0x04, 0x24, 0x91, 0xAD, 0x90, 0xA0, 0xD0, 0x12, 0x6A, 0x86, 0x25, 0x51, -0x90, 0xA0, 0xDE, 0x12, 0x56, 0xDD, 0x25, 0x51, 0x90, 0xA0, 0xEC, 0xF0, 0x22, 0xE0, 0xF5, 0x51, -0x12, 0x06, 0x89, 0x25, 0x51, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0xEF, 0xE0, -0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x56, 0xDE, 0xFF, 0x30, 0xE0, 0x1F, 0x12, 0x06, 0x89, 0x90, -0xA0, 0x4B, 0x12, 0x6A, 0x86, 0x90, 0xA0, 0x4C, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, -0x01, 0x4F, 0xF0, 0x12, 0x57, 0x09, 0x90, 0xA0, 0x4E, 0xF0, 0x22, 0x91, 0xF1, 0x74, 0x05, 0xF0, -0x22, 0x90, 0xA0, 0x4B, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, -0x1E, 0xF0, 0xA3, 0x22, 0x12, 0x06, 0x89, 0x90, 0x9F, 0xB2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, -0xA0, 0x51, 0xF0, 0x60, 0x29, 0x90, 0xA0, 0x5F, 0xE0, 0x20, 0xE0, 0x22, 0xE4, 0xFD, 0x7F, 0x04, -0x12, 0x5A, 0xA1, 0xB1, 0x3F, 0x30, 0xE0, 0x16, 0x12, 0x86, 0xD3, 0x20, 0xE0, 0x10, 0xB1, 0x48, -0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x02, 0x7F, 0x09, 0x12, 0x62, 0xC3, 0x22, 0x90, -0xA0, 0x50, 0xE0, 0xFF, 0xC3, 0x13, 0x22, 0xF0, 0x90, 0xA0, 0x50, 0xE0, 0x13, 0x13, 0x22, 0x12, -0x8F, 0xC9, 0x90, 0xA0, 0x56, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xB1, 0x71, 0x90, -0x9F, 0xA3, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0xA0, 0x56, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x58, -0xD3, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xB1, 0x71, 0x90, -0xA0, 0x84, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x65, -0x30, 0xE0, 0x04, 0x74, 0x18, 0xF0, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA2, 0x17, 0x12, 0x45, 0xBE, -0xE4, 0xFE, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x1E, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, -0x9D, 0x50, 0x09, 0xB1, 0xEC, 0xB1, 0xE1, 0xEF, 0xF0, 0x0E, 0x80, 0xF2, 0xEE, 0xC3, 0x94, 0x06, -0x50, 0x18, 0xB1, 0xE1, 0xE4, 0xF0, 0x0E, 0x80, 0xF3, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0B, 0xB1, -0xEC, 0x74, 0x51, 0xB1, 0xE3, 0xEF, 0xF0, 0x0E, 0x80, 0xEF, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, -0x22, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0x22, 0x90, 0xA2, 0x17, 0x12, -0x45, 0xB5, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x22, 0x90, 0xA0, 0x87, 0xE0, -0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x6E, 0x00, 0x90, 0xA1, 0x01, 0xEF, 0xF0, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x88, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01, -0x7F, 0x28, 0xD1, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x6F, 0x66, 0x90, 0xA2, 0x1A, 0xE0, -0x70, 0x08, 0xD1, 0x7A, 0x90, 0xA2, 0x1A, 0x74, 0x01, 0xF0, 0x12, 0x6A, 0x73, 0x12, 0x06, 0x89, -0xFF, 0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, 0x90, 0xA0, 0x98, 0x12, 0x45, 0x71, -0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, -0xAD, 0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, -0x00, 0x12, 0x45, 0x53, 0x90, 0xA0, 0x94, 0x02, 0x08, 0x6D, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, -0x4E, 0x90, 0xA0, 0x98, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xA0, 0x12, 0x6A, 0x86, -0x90, 0xA0, 0xA1, 0xF0, 0x22, 0x12, 0x8F, 0xC9, 0x90, 0xA0, 0xAD, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, -0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, -0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA0, 0xAD, 0x12, 0x6F, 0xAC, 0xF1, 0x79, 0x4E, -0x90, 0xA0, 0xAD, 0x12, 0x6A, 0x86, 0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA0, 0xAE, 0xE0, 0x54, 0xFC, -0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0x12, 0x6A, 0x86, 0xFE, -0x54, 0x30, 0xFD, 0xEF, 0x54, 0xCF, 0x4D, 0xFF, 0x90, 0xA0, 0xAE, 0x12, 0x6F, 0x3B, 0x4E, 0x12, -0x56, 0xDD, 0x90, 0xA0, 0xAF, 0xF0, 0x12, 0x57, 0x09, 0x90, 0xA0, 0xB0, 0x12, 0x6D, 0x27, 0x90, -0xA0, 0xB1, 0xF0, 0x90, 0xA0, 0xAF, 0xF1, 0x6C, 0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, -0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0xB0, 0xF1, 0x6C, -0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xB9, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0xB1, 0xF1, 0x6C, 0x90, 0xA0, 0xBB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0xA0, 0xAD, 0xE0, 0x30, 0xE0, 0x14, 0x90, 0xA0, 0xB2, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, -0x12, 0x96, 0x82, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0xB2, 0x12, -0x58, 0xA4, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0xE0, 0xFF, 0x7E, 0x00, -0x7C, 0x01, 0x7D, 0x40, 0x02, 0x07, 0x03, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x22, -0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0x12, 0x97, 0x75, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, -0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x80, 0x12, 0x90, 0xA0, 0xA7, 0xE0, 0x20, 0xE0, 0x02, 0xF1, -0xA2, 0x22, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x22, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, -0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0xBF, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, -0x30, 0xE0, 0x55, 0x90, 0x00, 0x40, 0xE0, 0x54, 0xBF, 0x44, 0xA0, 0xFD, 0x7F, 0x40, 0x12, 0x46, -0xA0, 0x90, 0x00, 0x41, 0xE0, 0x44, 0x04, 0xFD, 0x7F, 0x41, 0x12, 0x46, 0xA0, 0x90, 0x00, 0x6A, -0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x6A, 0x12, 0x46, 0xA0, 0x90, 0x07, 0x6E, 0x74, 0x55, 0xF0, 0xA3, -0x74, 0x12, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xF2, 0x44, 0x02, 0xF0, 0x90, 0x06, 0xCC, 0xE0, -0x44, 0x03, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xF5, 0xF0, 0x90, 0x05, 0x23, 0xE0, 0x54, 0x7F, -0xF0, 0xE4, 0xFD, 0x7F, 0x66, 0x12, 0x46, 0xA0, 0x22, 0xE4, 0x90, 0x9F, 0x87, 0xF0, 0xA3, 0xF0, -0x90, 0x9E, 0xEF, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0x11, 0x78, 0xE4, -0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, 0x74, 0x00, 0x2D, 0x11, 0x78, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, -0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, -0x90, 0xA1, 0xFC, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0x1C, 0xE0, 0xFE, 0x04, 0xF0, -0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, -0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA1, 0xFD, 0x12, 0x45, 0xB5, 0x8B, 0x40, 0x8A, -0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, -0xA1, 0xFC, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, -0xC0, 0x01, 0xA3, 0x12, 0x45, 0xB5, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, -0x89, 0x42, 0x90, 0xA1, 0xFD, 0x12, 0x97, 0x8E, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, -0x02, 0x35, 0x26, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x9F, 0x88, 0xE0, -0xFE, 0x90, 0x9F, 0x87, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, -0x64, 0x01, 0x60, 0x40, 0xED, 0x31, 0x59, 0xFA, 0x7B, 0x01, 0x12, 0x97, 0x00, 0x7F, 0x01, 0xEF, -0x60, 0x32, 0x90, 0x9F, 0x87, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, -0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0x87, 0xF0, 0x90, 0x9F, 0x88, 0xE0, 0xFF, 0x90, 0x9F, 0x87, -0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x07, 0x90, 0x9E, 0x92, -0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF1, 0xF9, -0x74, 0x9E, 0x35, 0xF0, 0x22, 0x90, 0xA2, 0x1D, 0x12, 0x45, 0xBE, 0xE4, 0xFF, 0x90, 0xA2, 0x1D, -0x12, 0x45, 0xB5, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0x31, -0x89, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE5, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, -0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x75, 0x15, 0x12, 0xE4, -0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x32, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, -0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, -0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x43, 0x20, 0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, -0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, -0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x7D, 0x02, 0x90, -0x01, 0xC4, 0x74, 0xED, 0xF0, 0x74, 0xA1, 0xA3, 0xF0, 0x90, 0xA0, 0xC0, 0xE0, 0xFF, 0xED, 0xC3, -0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, -0x0D, 0x80, 0xE6, 0x74, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xA1, 0xA3, 0xF0, 0x7F, 0x01, -0x22, 0xE4, 0x90, 0x9E, 0x92, 0x12, 0x58, 0xA4, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, -0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, -0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, -0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, -0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, -0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, -0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, -0xDF, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA1, 0x1B, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, -0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, -0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x58, 0x7E, 0x90, -0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x46, 0xA0, 0x80, 0xFE, 0x22, 0x90, 0x9F, -0x9E, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, -0x30, 0xE0, 0x04, 0x51, 0xFD, 0x60, 0x15, 0x90, 0x9F, 0xA7, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, -0x0B, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x02, 0x60, 0x03, 0x12, 0x86, 0xFF, 0x22, 0x90, 0x9F, 0xA2, -0xE0, 0x64, 0x02, 0x22, 0x12, 0x6F, 0xA1, 0x30, 0xE0, 0x0B, 0x51, 0xFD, 0x60, 0x07, 0x7D, 0x01, -0x7F, 0x02, 0x12, 0x5A, 0xA1, 0x51, 0xFD, 0x60, 0x02, 0x71, 0x1C, 0x22, 0x90, 0x9F, 0xA7, 0xE0, -0x64, 0x02, 0x60, 0x10, 0x12, 0x69, 0x3A, 0x60, 0x0B, 0x71, 0x35, 0xEF, 0x70, 0x06, 0xFD, 0x7F, -0x0C, 0x12, 0x5A, 0xA1, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, -0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x71, 0x35, -0xEF, 0x70, 0x03, 0x12, 0x5E, 0x6F, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x30, 0xE0, 0x3E, 0x90, -0x9F, 0xA2, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x9F, 0xA1, 0xE0, 0x7D, 0x00, -0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x24, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, -0x82, 0xFC, 0x71, 0x04, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, -0x09, 0x90, 0x9F, 0xA2, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x5A, 0xA1, 0x22, 0x90, 0xA0, -0x5F, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA0, 0x71, 0xE0, 0x70, 0x5F, 0x90, 0x9F, 0xA9, 0xE0, 0xD3, -0x94, 0x00, 0x50, 0x56, 0x90, 0xA0, 0x51, 0xE0, 0x60, 0x4D, 0x80, 0x4E, 0x71, 0x35, 0xEF, 0x64, -0x01, 0x70, 0x47, 0x90, 0x9F, 0xAB, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x9F, 0xA9, 0xE0, -0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x9F, 0xAB, 0xE0, 0x20, 0xE4, -0x29, 0x90, 0x9F, 0xA4, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0xA0, 0x51, 0xE0, -0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, -0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xE4, 0xFF, 0x12, -0x5F, 0x2F, 0xBF, 0x01, 0x13, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x0D, 0x12, 0x69, 0x3A, 0x64, 0x02, -0x60, 0x03, 0x02, 0x6F, 0xDF, 0x12, 0x5F, 0xB7, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x30, 0xE0, -0x40, 0x90, 0x9F, 0xA2, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x9F, 0xA1, 0xE0, -0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x26, 0xEF, 0xC3, 0x13, 0x30, 0xE0, -0x03, 0x02, 0x82, 0xFC, 0x12, 0x8E, 0xDF, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, -0x7F, 0x08, 0x80, 0x0A, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x5A, -0xA1, 0x22, 0x90, 0x9F, 0xA3, 0xE0, 0xFF, 0x12, 0x56, 0xE5, 0x30, 0xE0, 0x1B, 0xEF, 0x54, 0x7F, -0xB1, 0x05, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, -0x9F, 0xA7, 0xE0, 0x60, 0x03, 0x12, 0x68, 0x44, 0x90, 0xA0, 0x63, 0x12, 0x6F, 0xA4, 0x30, 0xE0, -0x22, 0x90, 0xA0, 0x66, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xFD, 0xF0, 0x90, -0x04, 0xE0, 0xE0, 0x90, 0xA0, 0x66, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x04, 0xE0, -0x54, 0xFB, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x02, 0x91, 0xCD, 0x22, 0x90, 0xA0, 0xC1, -0xE0, 0x30, 0xE0, 0x22, 0x91, 0xF7, 0xE0, 0xFE, 0x30, 0xE0, 0x1B, 0x75, 0xF0, 0x0E, 0xEF, 0x91, -0xFF, 0xEE, 0x54, 0xFE, 0xF0, 0x90, 0xA0, 0xC3, 0x74, 0x05, 0xF0, 0x12, 0x4A, 0x4C, 0x54, 0x07, -0xFD, 0x7F, 0x01, 0x12, 0x49, 0xA5, 0x22, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, -0xA0, 0xCC, 0x02, 0x45, 0xA9, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x9F, 0xA4, 0x22, 0xE4, 0x90, -0xA1, 0x2C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x47, 0xAF, 0x90, 0xA1, 0x2C, 0xEF, -0xF0, 0x7F, 0x83, 0x12, 0x47, 0xAF, 0xAE, 0x07, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0xB5, 0x06, 0x01, -0x22, 0xC3, 0x90, 0xA1, 0x2E, 0xE0, 0x94, 0x64, 0x90, 0xA1, 0x2D, 0xE0, 0x94, 0x00, 0x40, 0x0D, -0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0x22, 0x90, 0xA1, 0x2D, -0x12, 0x96, 0x39, 0x80, 0xC2, 0x90, 0x01, 0xC4, 0x74, 0x55, 0xF0, 0x74, 0xA5, 0xA3, 0xF0, 0x7F, -0x90, 0x12, 0x47, 0xAF, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x55, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, -0xA5, 0xA3, 0xF0, 0x22, 0xE4, 0xF5, 0x5E, 0xB1, 0xA8, 0xE0, 0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3, -0x94, 0x11, 0x40, 0x21, 0x80, 0x17, 0xEE, 0xB4, 0x01, 0x08, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x15, -0x80, 0x0B, 0xB1, 0xA8, 0xE0, 0x70, 0x0B, 0xED, 0xC3, 0x94, 0x03, 0x40, 0x08, 0x75, 0x5E, 0x01, -0x80, 0x03, 0xE4, 0xF5, 0x5E, 0xAF, 0x5E, 0x22, 0x74, 0x91, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, -0xF5, 0x83, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, 0xEF, 0x12, 0x51, 0x19, -0xC4, 0x54, 0x03, 0x90, 0xA1, 0x06, 0xF0, 0x90, 0xA1, 0x04, 0x60, 0x09, 0x74, 0x32, 0xF0, 0xA3, -0x74, 0x2F, 0xF0, 0x80, 0x07, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xE5, 0x53, 0xD3, 0x94, -0x2D, 0x40, 0x0A, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x12, 0x57, 0xEF, 0x80, 0x20, 0xE5, 0x53, 0xD3, -0x94, 0x1E, 0x40, 0x05, 0x90, 0xA1, 0x04, 0x80, 0x14, 0xE5, 0x53, 0xD3, 0x94, 0x14, 0x40, 0x05, -0x90, 0xA1, 0x05, 0x80, 0x08, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x12, 0x56, 0xF1, 0xE0, 0xFD, 0x85, -0x54, 0x6A, 0xE4, 0xFB, 0xAF, 0x52, 0x02, 0x77, 0x89, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0xA1, 0x74, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA1, 0x73, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, -0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA1, 0x7E, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x76, 0x12, 0x45, 0x71, -0x12, 0x08, 0x3A, 0x90, 0xA1, 0x7E, 0x12, 0x4F, 0xF0, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, -0x07, 0x90, 0xA1, 0x76, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x7A, 0x12, 0x4F, 0xF0, 0xD0, 0x03, 0xD0, -0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA1, 0x82, 0x12, 0x08, 0x6D, 0x90, 0xA1, -0x74, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA1, 0x82, 0x12, 0x45, 0x71, 0x90, 0xAA, 0x96, 0x12, -0x08, 0x6D, 0x90, 0xA1, 0x73, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x08, 0xEF, 0xF0, 0xED, 0x64, 0x01, -0x70, 0x2E, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x72, 0x80, 0x08, 0x90, 0xA2, 0x08, -0xE0, 0x24, 0xFE, 0xF5, 0x72, 0x90, 0xA1, 0x76, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, -0x72, 0xF1, 0x02, 0xD1, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x80, 0x1F, -0x90, 0xA1, 0x76, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA2, 0x08, 0xE0, 0xFF, 0xF1, -0x02, 0xD1, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA2, 0x08, 0xE0, 0xFF, 0xF1, -0x02, 0x7F, 0x01, 0xD1, 0x19, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xD1, 0x19, 0x90, 0xA1, -0x76, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA1, 0x7A, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, -0x22, 0x7E, 0x00, 0x7F, 0x2D, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xC1, 0x02, 0x08, 0xAA, -0xC3, 0xEF, 0x9D, 0xF5, 0x56, 0xC3, 0x94, 0x08, 0x50, 0x1C, 0xE4, 0xF5, 0x57, 0xF1, 0x87, 0xC0, -0x83, 0xC0, 0x82, 0x90, 0xA1, 0x05, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, -0xA9, 0xE5, 0x56, 0xF0, 0x80, 0x3E, 0xE5, 0x56, 0xC3, 0x94, 0x10, 0x50, 0x09, 0x75, 0x57, 0x01, -0xE5, 0x56, 0x24, 0xF8, 0x80, 0x17, 0xE5, 0x56, 0xC3, 0x94, 0x18, 0x50, 0x09, 0x75, 0x57, 0x02, -0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8, 0xFF, 0xF1, 0x87, -0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0x05, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, -0x45, 0xA9, 0xEF, 0xF0, 0xAF, 0x57, 0x22, 0x75, 0xF0, 0x0E, 0xEB, 0x90, 0xA0, 0xC8, 0x02, 0x45, -0xA9, 0xAF, 0x54, 0xF1, 0x20, 0x90, 0xA1, 0x01, 0xEF, 0xF0, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, -0x03, 0x74, 0x1F, 0xC3, 0x95, 0x54, 0x40, 0x0B, 0x12, 0xA8, 0x01, 0xE4, 0xFD, 0xF1, 0x93, 0x24, -0xD4, 0x80, 0x34, 0x74, 0x3F, 0xC3, 0x95, 0x54, 0x40, 0x0B, 0x12, 0xA8, 0x01, 0x7D, 0x20, 0xF1, -0x91, 0x24, 0x88, 0x80, 0x22, 0x74, 0x5F, 0xC3, 0x95, 0x54, 0x40, 0x0B, 0x12, 0xA8, 0x01, 0x7D, -0x40, 0xF1, 0x91, 0x24, 0xD0, 0x80, 0x10, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x22, 0x12, 0xA8, -0x01, 0x7D, 0x60, 0xF1, 0x91, 0x24, 0x84, 0xFD, 0xE4, 0x34, 0x04, 0xFC, 0x75, 0xF0, 0x0E, 0xE5, -0x55, 0x12, 0xA8, 0x0C, 0x75, 0xF0, 0x03, 0xEE, 0x12, 0x45, 0xA9, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, -0x22, 0x90, 0xA1, 0x05, 0xEE, 0xF0, 0xAB, 0x55, 0x22, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xC6, 0x02, -0x45, 0xA9, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, -0x90, 0xA0, 0xF4, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0xF8, -0x12, 0x08, 0x6D, 0x90, 0xA0, 0xF4, 0x11, 0x7F, 0x60, 0x18, 0x90, 0xA0, 0xF4, 0x11, 0x76, 0x90, -0xA0, 0xF4, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0xF4, 0x12, 0x47, 0xCE, 0x7F, 0x00, 0x7E, 0x08, 0x12, -0x38, 0x45, 0x90, 0xA0, 0xF8, 0x11, 0x7F, 0x60, 0x18, 0x90, 0xA0, 0xF8, 0x11, 0x76, 0x90, 0xA0, -0xF8, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0xF8, 0x12, 0x47, 0xCE, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, -0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x22, 0x12, -0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x22, 0x7E, 0x00, 0x7F, 0x01, -0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0x9E, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0x9E, 0xE0, 0x54, -0xFD, 0xF0, 0xE4, 0x12, 0x58, 0xA5, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, -0x49, 0x22, 0x12, 0x5F, 0xD6, 0x02, 0x85, 0x7F, 0x12, 0x5F, 0xD6, 0x7D, 0x23, 0x12, 0x63, 0x00, -0x02, 0x67, 0xE3, 0xAE, 0x07, 0x12, 0x82, 0xF0, 0xBF, 0x01, 0x13, 0x90, 0x9F, 0x9E, 0x12, 0x4F, -0xD3, 0x20, 0xE0, 0x0A, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x5A, 0xA1, 0x7F, 0x01, 0x22, 0x7F, 0x00, -0x22, 0x31, 0x1F, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, -0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0x31, 0x18, 0x90, 0xA0, 0x4D, 0xE0, 0xC3, 0x13, -0x54, 0x7F, 0x90, 0xA1, 0xDA, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x48, 0x34, -0x90, 0x9F, 0xA3, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xF0, 0xE4, 0x90, 0xA1, 0xD9, 0xF0, 0x22, 0x90, -0x9F, 0xA3, 0xE0, 0x13, 0x13, 0x13, 0x22, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, -0x9F, 0xB0, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0xAB, 0xF0, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xF7, 0xF0, -0x54, 0xBF, 0x12, 0x5C, 0xC6, 0x7D, 0x10, 0x7F, 0x03, 0x02, 0x88, 0xAD, 0xEF, 0x24, 0xFE, 0x60, -0x0B, 0x04, 0x70, 0x24, 0x90, 0x9F, 0xAD, 0x74, 0x02, 0xF0, 0x80, 0x13, 0xED, 0x70, 0x06, 0x90, -0xA0, 0x4E, 0xE0, 0x80, 0x02, 0xED, 0x14, 0x90, 0x9F, 0xAD, 0xF0, 0x90, 0x9F, 0xAD, 0xE0, 0xA3, -0xF0, 0x90, 0x9F, 0xA4, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0xA0, 0x52, 0xE0, 0xC3, 0x13, 0x20, -0xE0, 0x13, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90, 0x02, -0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, 0xA0, 0xA7, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x7F, -0x00, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x5A, 0x1E, -0x31, 0xB9, 0x90, 0x9F, 0xA2, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, -0x22, 0x90, 0xA1, 0xE8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, -0xAC, 0x07, 0x51, 0x32, 0xE0, 0x44, 0x01, 0xF0, 0x51, 0x32, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, -0x74, 0x12, 0x2C, 0x12, 0x4F, 0x9E, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0x51, 0x3D, 0xE0, -0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, -0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0x51, 0x2A, 0xE0, 0x54, 0xC0, -0x4D, 0xFD, 0x74, 0x14, 0x2F, 0x51, 0x2A, 0xED, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0x22, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0xA1, 0xE6, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0xA2, 0x3B, 0xEF, 0xF0, 0x90, 0x9E, 0x9A, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, -0x70, 0x3E, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0xA2, 0x3B, 0xE0, 0x70, 0x30, -0x90, 0x9F, 0xA3, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x12, 0x5A, 0x16, 0x80, 0x1E, 0x90, -0x9F, 0xAA, 0xE0, 0x64, 0x06, 0x70, 0x19, 0x90, 0xA2, 0x3B, 0xE0, 0x60, 0x13, 0x90, 0x9F, 0xA3, -0xE0, 0x54, 0xBF, 0xF0, 0x51, 0xA5, 0xF0, 0x90, 0x9F, 0xAA, 0x74, 0x04, 0xF0, 0x12, 0x5C, 0x93, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0x22, -0x90, 0x9E, 0x9D, 0xE0, 0xFF, 0xE4, 0xFB, 0x7D, 0x01, 0x12, 0x4D, 0x59, 0x90, 0xA1, 0xED, 0xEE, -0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xEB, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0xAB, 0x07, 0x90, 0xA2, 0x3C, 0xED, 0xF0, 0xEC, 0xF9, 0xE0, 0xFF, 0xAE, 0x03, -0x74, 0x2A, 0x2E, 0x51, 0xEF, 0x12, 0x4F, 0x8F, 0xE9, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, -0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0xE5, 0x53, 0x25, -0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x22, 0x90, 0x9E, 0x9B, 0xE0, 0xFF, -0x7B, 0x08, 0x7D, 0x01, 0x12, 0x4D, 0x59, 0x90, 0xA2, 0x11, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, -0xFD, 0x90, 0xA2, 0x10, 0xE0, 0xFF, 0x22, 0x7F, 0xA3, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0xF8, 0x44, -0x05, 0xFD, 0x7F, 0xA3, 0x12, 0x46, 0xA0, 0x7F, 0xA0, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0x0F, 0x64, -0x04, 0x22, 0x90, 0xA2, 0x36, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, -0x22, 0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x22, 0x12, 0x64, 0xAA, -0x12, 0x5F, 0x92, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, -0x22, 0x74, 0x91, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x22, 0x7F, 0x2C, 0x7E, -0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0x22, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, -0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0x22, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x91, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, 0x22, 0xF0, 0x90, 0x9F, 0xDD, 0xE0, 0x24, -0x04, 0x90, 0x9F, 0xBF, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x22, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, -0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x22, 0xFD, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xC4, -0x02, 0x45, 0xA9, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x52, 0x22, -0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x44, 0x04, -0xF0, 0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, 0x83, 0x22, 0x90, 0xA2, -0x04, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0x22, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, -0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x74, 0x91, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, -0x83, 0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF0, 0x90, -0x9F, 0xB3, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x9F, 0xE2, -0xF0, 0xA3, 0xEF, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0x22, 0x90, -0x00, 0x08, 0x02, 0x07, 0xAB, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0x22, 0x90, -0xA0, 0xC1, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0x22, 0x90, 0xA2, 0x0F, 0xE0, 0xFF, 0x90, 0xA2, -0x0D, 0xE0, 0x22, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x22, 0xFF, 0xEE, 0x55, -0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x22, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, -0x22, 0x7F, 0x16, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0x0F, 0x22, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, -0xF8, 0xF0, 0x22, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x22, 0xE5, 0x6C, 0x75, 0xF0, -0x08, 0xA4, 0x25, 0x6B, 0x22, 0xFF, 0x90, 0xA2, 0x06, 0xE0, 0xFB, 0xEF, 0x5B, 0x22, 0x90, 0xA0, -0x65, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, -0x90, 0xA1, 0xF7, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x22, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, -0x22, 0xC4, 0x54, 0x0F, 0x90, 0xA2, 0x0B, 0xF0, 0x22, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, -0x22, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x22, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, -0x22, 0x54, 0x03, 0x4F, 0xFF, 0x75, 0xF0, 0x10, 0x22, 0x90, 0xA0, 0xAD, 0xE0, 0x13, 0x13, 0x13, -0x22, 0x90, 0xA1, 0xC5, 0x12, 0x45, 0x71, 0xEF, 0x22, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x80, 0xFF, -0x22, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, 0x12, 0x47, 0xAF, 0xEF, 0x44, 0x40, 0xFD, -0x22, 0x00, 0x36, 0x6E +0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x46, 0xF0, 0x74, 0x78, 0xA3, 0xF0, 0x11, 0xBE, 0xE5, +0x14, 0x30, 0xE7, 0x02, 0x11, 0x9C, 0x74, 0x46, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x78, 0xA3, +0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, +0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x7F, 0x01, 0x7E, 0x00, +0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x46, 0xAB, 0xEF, 0x20, 0xE6, 0x0A, 0x7F, 0x05, 0x11, 0xB7, +0xFD, 0x7F, 0x05, 0x12, 0x46, 0x8D, 0x22, 0x12, 0x46, 0xAB, 0xEF, 0x44, 0x80, 0x22, 0x7F, 0x54, +0x12, 0x46, 0xAB, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x12, 0x46, 0xAB, 0xE5, 0x0E, 0x5F, +0xF5, 0x12, 0x7F, 0x56, 0x12, 0x46, 0xAB, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x12, 0x46, +0xAB, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x12, 0x46, 0x8D, 0xAD, 0x12, 0x7F, +0x55, 0x12, 0x46, 0x8D, 0xAD, 0x13, 0x7F, 0x56, 0x12, 0x46, 0x8D, 0xAD, 0x14, 0x7F, 0x57, 0x12, +0x46, 0x8D, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, +0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x06, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 0x12, 0xB1, 0x86, +0xE5, 0x19, 0x30, 0xE1, 0x02, 0x31, 0xC3, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0xF1, 0xAE, 0xE5, 0x19, +0x30, 0xE5, 0x03, 0x12, 0xB1, 0x00, 0xE5, 0x19, 0x30, 0xE6, 0x03, 0x12, 0xB1, 0xE3, 0xE5, 0x1B, +0x30, 0xE0, 0x03, 0x12, 0xA7, 0x84, 0xE5, 0x1B, 0x30, 0xE1, 0x03, 0x12, 0x5C, 0x23, 0xE5, 0x1B, +0x30, 0xE2, 0x03, 0x12, 0xA3, 0xB8, 0xE5, 0x1B, 0x30, 0xE3, 0x03, 0x12, 0xA7, 0x5A, 0xE5, 0x1B, +0x30, 0xE4, 0x03, 0x12, 0xA7, 0x23, 0xE5, 0x1B, 0x30, 0xE5, 0x03, 0x12, 0xA1, 0x48, 0xE5, 0x1B, +0x30, 0xE6, 0x03, 0x12, 0xA3, 0x81, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0xA2, 0xEF, 0xE5, 0x1C, +0x30, 0xE4, 0x02, 0xF1, 0xA4, 0xE5, 0x1C, 0x30, 0xE5, 0x03, 0x12, 0x77, 0xE2, 0x74, 0x06, 0x04, +0x90, 0x01, 0xC4, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, +0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, +0xD0, 0xE0, 0x32, 0xE4, 0xFF, 0x90, 0xA1, 0xE9, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x64, +0xA3, 0xE0, 0xF5, 0x65, 0x65, 0x64, 0x60, 0x6B, 0x90, 0xA1, 0xEA, 0x74, 0x03, 0xF0, 0x90, 0xA1, +0xF8, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x66, 0xE4, 0xF5, 0x63, 0xE5, 0x66, +0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, +0x63, 0x51, 0x55, 0xE0, 0xFF, 0x74, 0xEC, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, +0xEF, 0xF0, 0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD5, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xEA, 0x12, +0x5B, 0x9B, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x65, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x65, 0x90, +0x04, 0x7F, 0xE5, 0x65, 0xF0, 0x90, 0xA1, 0xE9, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, 0x5A, 0xD4, +0x12, 0x97, 0xE1, 0x22, 0xFF, 0x90, 0xA2, 0xD8, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, +0x45, 0x8A, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xD8, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0x12, 0x4F, 0x86, 0x54, +0x1F, 0xFB, 0x60, 0x12, 0x64, 0x02, 0x60, 0x0E, 0xEB, 0x64, 0x04, 0x60, 0x09, 0xEB, 0x64, 0x09, +0x60, 0x04, 0xEB, 0xB4, 0x0C, 0x09, 0xD1, 0x77, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x07, 0xD1, +0x77, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xE4, 0xF5, 0x6B, 0x90, 0xA2, 0xD8, 0xE0, 0xFD, 0x91, 0x5D, +0x25, 0x6B, 0x51, 0x55, 0xE0, 0xFE, 0xEB, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0xFE, 0xF5, 0x82, 0xE4, +0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x6B, 0x51, 0x55, 0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, +0xA2, 0xDB, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x12, 0x4E, 0x2E, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0B, +0xE5, 0x6B, 0x70, 0x07, 0x90, 0xA2, 0xDB, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0xA2, 0xDB, 0xE0, 0xFF, +0x91, 0x59, 0x25, 0x6B, 0x51, 0x55, 0xEF, 0xF0, 0x05, 0x6B, 0xE5, 0x6B, 0x64, 0x07, 0x70, 0xA9, +0x90, 0xA2, 0xD8, 0xE0, 0x75, 0xF0, 0x04, 0x12, 0x4E, 0x2E, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, +0x90, 0xA2, 0xD9, 0xF0, 0x75, 0x6C, 0x06, 0xE5, 0x6C, 0xB4, 0x06, 0x07, 0x51, 0x44, 0xE0, 0x54, +0x0F, 0x80, 0x07, 0x91, 0x59, 0x25, 0x6C, 0x51, 0x55, 0xE0, 0x90, 0xA2, 0xDA, 0xF0, 0x90, 0xA2, +0xDA, 0xE0, 0x60, 0x30, 0x75, 0x6B, 0x07, 0xD1, 0x5D, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xD1, 0x6E, 0x60, 0x15, 0xD1, 0x65, 0x90, 0xA2, 0xD9, 0xF0, 0xED, 0x60, 0x22, 0xE0, +0xD3, 0x94, 0x0B, 0x40, 0x1C, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x16, 0x15, 0x6B, 0xE5, 0x6B, 0xC3, +0x94, 0x00, 0x50, 0xD3, 0xE5, 0x6C, 0x60, 0x09, 0x15, 0x6C, 0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x50, +0xA6, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, 0x06, 0x07, 0x51, 0x44, 0xE0, 0x54, 0x0F, 0x80, +0x07, 0x91, 0x59, 0x25, 0x6C, 0x51, 0x55, 0xE0, 0x90, 0xA2, 0xDA, 0xF0, 0x90, 0xA2, 0xDA, 0xE0, +0x60, 0x2B, 0xE4, 0xF5, 0x6B, 0xD1, 0x5D, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0xD1, 0x6E, 0x60, 0x12, 0xD1, 0x65, 0xFC, 0xED, 0x60, 0x1B, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x15, +0x74, 0x20, 0x2C, 0xFC, 0x80, 0x0F, 0x05, 0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xD8, 0x05, 0x6C, 0xE5, +0x6C, 0x64, 0x07, 0x70, 0xB0, 0x90, 0xA2, 0xD9, 0xE0, 0xFF, 0x90, 0xA2, 0xD8, 0xE0, 0xFE, 0x75, +0xF0, 0x04, 0x12, 0x4F, 0xFD, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x12, 0x95, 0x59, 0xEC, 0xF0, +0x75, 0xF0, 0x10, 0xEE, 0x12, 0x75, 0x8E, 0xE0, 0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, +0xFE, 0xE5, 0x6D, 0xD3, 0x9F, 0x40, 0x09, 0x90, 0xA2, 0xD9, 0xE0, 0x4E, 0xF5, 0x6D, 0x80, 0x0C, +0xE5, 0x6D, 0xC3, 0x9C, 0x50, 0x06, 0xAF, 0x06, 0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA2, 0xD8, 0xE0, +0xFF, 0x24, 0x91, 0x12, 0xBB, 0x51, 0xE5, 0x6D, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x12, 0x4E, 0x2E, +0xF1, 0xD9, 0x90, 0xA2, 0xD8, 0xE0, 0xFF, 0xE4, 0xFB, 0xAD, 0x6D, 0x12, 0x76, 0x59, 0x90, 0xA2, +0xD8, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xF1, 0x94, 0xE4, 0xF0, 0x90, 0xA2, 0xD9, 0xE0, 0xFE, 0xC3, +0x94, 0x0C, 0x40, 0x07, 0x91, 0x69, 0x74, 0x02, 0xF0, 0x80, 0x19, 0xEE, 0xC3, 0x94, 0x04, 0x90, +0xA2, 0xD8, 0xE0, 0x40, 0x09, 0x24, 0x91, 0x91, 0x6C, 0x74, 0x01, 0xF0, 0x80, 0x06, 0x24, 0x91, +0x91, 0x6C, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xD8, 0xE0, 0x75, 0xF0, 0x08, +0x90, 0x89, 0x00, 0x12, 0x45, 0x8A, 0xE5, 0x82, 0x22, 0x74, 0x91, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0x95, 0xF5, 0x83, 0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x12, 0x4F, 0x8F, 0xFF, 0x54, +0x1F, 0xF5, 0x53, 0xEF, 0x54, 0x80, 0x12, 0x4F, 0xD2, 0xF5, 0x52, 0x12, 0x4F, 0xA5, 0xFF, 0x54, +0x03, 0xF5, 0x54, 0xEF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0x12, 0x4F, 0xA5, 0xFF, 0x54, +0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x55, 0xEF, 0x54, 0x80, 0x12, 0x4F, 0xD2, 0xF5, 0x56, +0x12, 0x4F, 0xA5, 0xFF, 0x54, 0x08, 0xFE, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, 0x54, +0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x12, 0xBC, 0x58, 0x12, 0x4E, 0x28, 0x54, +0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x12, 0x91, 0x21, 0x12, 0x4E, 0x28, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, +0x59, 0x70, 0x67, 0xE5, 0x53, 0x54, 0x1F, 0x12, 0x4F, 0x80, 0x54, 0xE0, 0x4F, 0xF0, 0xE5, 0x54, +0x54, 0x03, 0x12, 0x4E, 0x28, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x12, 0x4E, +0x28, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0x12, 0x4F, 0x80, +0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0x12, 0x4E, 0x28, 0x54, 0xCF, +0x4F, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, 0x12, 0x06, +0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0x91, 0x60, 0x25, 0x58, 0x51, 0x55, 0xEF, 0xF0, 0x05, +0x58, 0xE5, 0x58, 0xB4, 0x04, 0xDF, 0xAF, 0x51, 0x51, 0x5D, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, +0x0F, 0x90, 0xA3, 0x03, 0xF0, 0x90, 0xA3, 0x03, 0xE0, 0xFD, 0x70, 0x02, 0xC1, 0x53, 0x90, 0x9F, +0x20, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, +0x21, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, +0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA2, 0xF3, 0x12, 0x93, 0x29, 0x80, 0x05, 0xC3, 0x33, +0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0x36, 0xE4, 0x90, 0xA3, 0x04, +0xF0, 0x90, 0xA3, 0x04, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x40, 0xD1, 0x55, 0xA4, 0xFF, 0xE9, +0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0xD1, 0x83, 0x12, 0xAF, 0xAD, +0xE5, 0x82, 0x29, 0x51, 0x55, 0xEF, 0xD1, 0x54, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, +0xF0, 0xD1, 0x83, 0x75, 0xF0, 0x08, 0x90, 0x9E, 0xD4, 0x12, 0x45, 0x8A, 0xE5, 0x82, 0x29, 0x51, +0x55, 0xEF, 0xF0, 0x90, 0xA3, 0x04, 0xE0, 0x04, 0xF0, 0x80, 0xB6, 0x90, 0xA3, 0x03, 0xE0, 0xFF, +0x90, 0xA2, 0xF3, 0x12, 0xBB, 0x37, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA3, +0x03, 0xF0, 0x90, 0xA2, 0xF3, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, +0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA2, 0xF3, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, +0x90, 0x9F, 0x21, 0xF1, 0xE0, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0xA1, 0x55, 0xE4, +0x90, 0x9F, 0x21, 0xF0, 0xA1, 0x55, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA2, 0xF3, +0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xD1, 0x54, 0x90, 0x01, 0xD0, 0x12, 0x45, 0x8A, 0xE0, 0x90, +0x01, 0xC3, 0xF0, 0x22, 0xF0, 0x90, 0xA2, 0xF3, 0xE0, 0x75, 0xF0, 0x04, 0x22, 0x74, 0x01, 0x7E, +0x00, 0xA8, 0x6B, 0x08, 0x22, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0x22, 0xFF, 0x90, +0xA2, 0xDA, 0xE0, 0xFB, 0xEF, 0x5B, 0x22, 0x90, 0xA2, 0xD8, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, +0x34, 0x9E, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0x21, +0xE0, 0x22, 0x90, 0xA1, 0x3C, 0xEF, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0x90, 0xA1, 0xBE, 0xF0, 0xE4, +0x90, 0xA1, 0x3D, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFE, 0x90, 0xA1, 0x3D, 0xE0, 0xFF, 0xC3, 0x9E, +0x50, 0x2C, 0xE0, 0xFE, 0xF1, 0x9A, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0xF1, 0x94, 0xE0, 0x30, +0xE7, 0x09, 0x74, 0x81, 0x2F, 0xF1, 0xBC, 0xE4, 0xF0, 0x80, 0x0B, 0xF1, 0xB5, 0x90, 0xA1, 0x3D, +0xE0, 0xF1, 0x9A, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x3D, 0xE0, 0x04, 0xF0, 0x80, 0xC6, 0x7F, 0x0C, +0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA1, 0x3D, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x90, +0xA1, 0x3D, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0xE1, 0x8F, 0x74, 0x3E, 0x2E, 0xF1, 0x9C, 0xE0, +0x70, 0x02, 0xE1, 0x87, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x06, 0xF1, 0xC4, 0xEE, 0x90, 0x81, +0x07, 0xF1, 0xCD, 0xFC, 0x12, 0xBB, 0x41, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, +0x90, 0x81, 0x0A, 0xF1, 0xC4, 0xEC, 0x90, 0x81, 0x0B, 0xF1, 0xCD, 0x75, 0xF0, 0x0A, 0xF1, 0xA8, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, 0x01, 0x90, 0xA1, 0x3D, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, +0x81, 0x0B, 0x51, 0x4F, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0xF1, 0xA8, 0x75, 0xF0, 0x02, 0xEF, +0x12, 0x4F, 0x95, 0xED, 0xF0, 0x0F, 0xEF, 0xB4, 0x05, 0xDD, 0x90, 0xA1, 0x3D, 0xE0, 0xFF, 0x75, +0xF0, 0x10, 0x90, 0x81, 0x09, 0x12, 0x45, 0x8A, 0xE0, 0xFE, 0x12, 0xB4, 0xF1, 0xEE, 0xF0, 0x90, +0xA1, 0x3D, 0xE0, 0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0xFD, 0x12, 0xB4, 0x89, 0x90, 0xA1, 0x3D, 0xE0, +0x24, 0x81, 0xF1, 0xBC, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x3D, 0xE0, 0x04, 0xF0, 0xC1, 0xEA, 0x22, +0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x02, 0x45, 0x8A, 0x24, 0x3E, 0xF5, 0x82, 0xE4, 0x34, +0xA1, 0xF5, 0x83, 0x22, 0xE4, 0xFF, 0xC1, 0x92, 0x90, 0x8D, 0x01, 0x02, 0x45, 0x8A, 0xB1, 0x4B, +0x7F, 0x02, 0x02, 0x5A, 0xD4, 0xF1, 0x90, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, +0x93, 0xF5, 0x83, 0x22, 0x12, 0x45, 0x8A, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0x22, 0x12, 0x45, 0x8A, +0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA1, 0x3D, 0xE0, 0x22, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x6A, 0x22, +0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, +0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, +0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xE7, 0xF0, 0x74, 0x7F, 0xA3, 0xF0, 0x12, 0xB1, +0xB3, 0xE5, 0x21, 0x30, 0xE1, 0x03, 0x12, 0xB1, 0xF0, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0xA3, +0xDA, 0xE5, 0x21, 0x30, 0xE5, 0x02, 0x11, 0xA5, 0xE5, 0x22, 0x30, 0xE0, 0x03, 0x12, 0xAB, 0x8C, +0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0xA4, 0x5E, 0xE5, 0x23, 0x30, 0xE0, 0x03, 0x12, 0xA3, 0x0E, +0xE5, 0x23, 0x30, 0xE4, 0x02, 0xF1, 0xD7, 0xE5, 0x23, 0x30, 0xE2, 0x0A, 0x12, 0xB1, 0xFF, 0x90, +0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, 0x5A, 0xD4, +0xE5, 0x24, 0x30, 0xE4, 0x02, 0x11, 0xBD, 0xE5, 0x24, 0x30, 0xE5, 0x03, 0x12, 0x6B, 0x43, 0xE5, +0x24, 0x30, 0xE6, 0x03, 0x12, 0x6B, 0x74, 0xE5, 0x24, 0x30, 0xE7, 0x03, 0x12, 0x8B, 0xCD, 0x74, +0xE7, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x7F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, +0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, +0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xA0, 0xAD, 0xE0, 0x30, 0xE0, 0x10, 0x12, 0x66, 0x09, 0xE4, +0x90, 0xA0, 0xB0, 0x12, 0x51, 0x82, 0x12, 0xBA, 0xCC, 0x12, 0x50, 0x13, 0x22, 0x12, 0x8E, 0x33, +0x12, 0x64, 0x80, 0x11, 0xE3, 0x90, 0xA0, 0x3D, 0xE0, 0x30, 0xE0, 0x16, 0x12, 0xBC, 0x4F, 0x90, +0xA0, 0x40, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0xB9, 0xD2, 0x12, 0x9E, 0xC1, 0xE4, 0xFF, 0x12, +0x64, 0xC9, 0x22, 0x90, 0xA0, 0x4A, 0xE0, 0x30, 0xE0, 0x04, 0xE4, 0xFF, 0x11, 0xEF, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xBC, 0xEF, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, +0xFF, 0x91, 0xC3, 0x30, 0xE0, 0x03, 0x12, 0x66, 0xB8, 0x90, 0xA0, 0x4E, 0xE0, 0x30, 0xE0, 0x04, +0x7F, 0x01, 0x80, 0x37, 0x90, 0xA0, 0x4A, 0x12, 0x5F, 0xDF, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, +0x2A, 0x90, 0xA0, 0x4D, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, 0xEF, 0x13, 0x13, 0x54, +0x3F, 0x30, 0xE0, 0x04, 0x7F, 0x09, 0x80, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0xA0, 0x4D, 0xE0, +0xC3, 0x13, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x09, 0x12, 0x88, 0x32, 0x90, 0xA2, +0xBC, 0xE0, 0x64, 0x03, 0x70, 0x67, 0x12, 0x5F, 0xDC, 0x30, 0xE0, 0x5C, 0x90, 0xA0, 0x54, 0xE0, +0xFF, 0x90, 0xA0, 0x5F, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x34, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0xFF, +0x90, 0xA0, 0x56, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, +0xA0, 0x4C, 0xE0, 0xFE, 0x12, 0xAB, 0x82, 0x40, 0x08, 0xEE, 0x9F, 0x90, 0xA2, 0xBF, 0xF0, 0x80, +0x06, 0x90, 0xA2, 0xBF, 0x74, 0x03, 0xF0, 0x90, 0xA2, 0xBF, 0x51, 0xCA, 0x80, 0x13, 0x90, 0xA0, +0x57, 0xE0, 0xFF, 0x51, 0xBB, 0x90, 0xA0, 0x52, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA0, 0x5D, 0x91, +0xB4, 0xE4, 0x90, 0xA0, 0x5F, 0xF0, 0x80, 0x05, 0x90, 0xA0, 0x4C, 0x51, 0xCA, 0x90, 0xA0, 0x4A, +0x12, 0x4F, 0xD1, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0xBE, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0xBE, +0x74, 0x01, 0xF0, 0x12, 0xBC, 0xB2, 0x20, 0xE0, 0x13, 0x90, 0xA0, 0x8C, 0xE0, 0x60, 0x07, 0xE4, +0x90, 0xA2, 0xBD, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0xBD, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xBD, 0xE0, +0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x48, 0x62, 0x90, 0xA0, 0x5C, 0x74, 0x01, 0xF0, 0x12, 0x8D, 0xE3, +0x30, 0xE0, 0x0D, 0x90, 0xA2, 0xBC, 0xE0, 0x70, 0x3F, 0xFD, 0xFF, 0x12, 0x54, 0xC6, 0x80, 0x38, +0x90, 0xA0, 0x4A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0xA0, 0x50, 0xE0, 0x44, 0x20, +0xF0, 0x90, 0xA0, 0x3C, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x18, 0x12, 0x66, 0x3A, 0x7D, 0x01, +0x7F, 0x0C, 0x80, 0x11, 0x90, 0xA2, 0xBC, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0x9F, 0xD9, 0xE0, 0x60, +0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x62, 0x5A, 0x90, 0xA0, 0x3C, 0xE0, 0x60, 0x18, 0x90, 0xA2, +0xBC, 0xE0, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x0A, 0x90, 0xA2, 0xBC, 0xE0, 0x64, 0x03, 0x70, 0x30, +0x7D, 0x0B, 0x7F, 0x6F, 0x80, 0x27, 0x90, 0xA2, 0xBC, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, 0x1D, +0x90, 0xA2, 0xBC, 0xE0, 0xB4, 0x03, 0x19, 0x12, 0xA1, 0x0F, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, +0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0xA1, 0x17, 0xE4, 0xFD, 0xFF, 0x12, 0x54, 0xC6, +0x12, 0x4F, 0xCE, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x8F, 0xDD, 0x90, 0xA0, 0x4E, 0xE0, 0xC3, +0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x44, +0x10, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xC3, 0x9F, 0xFF, 0x12, 0x57, 0xD5, 0xEF, 0xF0, +0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x02, 0x50, 0x1B, 0xE0, 0xFF, 0x51, 0xBB, 0x90, 0xA0, +0x5D, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x5F, 0xDC, 0x20, 0xE0, 0x02, 0x81, 0xAE, 0x90, 0xA0, 0x52, +0xE0, 0x64, 0x01, 0x70, 0x2E, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, +0x60, 0x1C, 0x91, 0xB5, 0x90, 0xA0, 0x5F, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0x56, 0xE0, 0x75, 0xF0, +0x03, 0x84, 0xFF, 0x90, 0xA0, 0x5F, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x81, 0x99, 0xF1, 0xCE, +0x04, 0xF0, 0x22, 0x90, 0xA0, 0x52, 0xE0, 0x64, 0x04, 0x70, 0x2B, 0x90, 0x06, 0x92, 0xE0, 0x20, +0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x18, 0x91, 0xB5, 0x90, 0xA0, 0x5F, 0xE0, 0x04, 0xF0, +0x90, 0xA0, 0x55, 0xE0, 0xFF, 0x90, 0xA0, 0x5F, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x81, 0x99, +0xF1, 0xCE, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x52, 0xE0, 0x64, 0x06, 0x60, 0x02, 0x81, 0x1D, +0x91, 0xD0, 0x50, 0x08, 0x90, 0xA0, 0x60, 0xE0, 0x94, 0x03, 0x40, 0x1A, 0xF1, 0xAE, 0x90, 0xA0, +0x5D, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA0, 0x52, +0xF0, 0x90, 0xA0, 0x60, 0xF0, 0x22, 0x90, 0xA0, 0x51, 0x91, 0xC9, 0x30, 0xE0, 0x3B, 0xF1, 0xC6, +0xF1, 0xAE, 0x30, 0xE0, 0x0B, 0x90, 0xA0, 0x6F, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x4E, 0x81, 0x41, +0x91, 0xD0, 0x40, 0x0B, 0x90, 0xA0, 0x6F, 0xE0, 0x30, 0xE0, 0x02, 0x81, 0x41, 0x81, 0x4E, 0x90, +0xA0, 0x6F, 0xE0, 0x30, 0xE0, 0x0C, 0x91, 0xAF, 0xE4, 0x90, 0xA0, 0x5F, 0xF0, 0x90, 0xA2, 0xED, +0x81, 0x57, 0x90, 0xA0, 0x5D, 0x74, 0x02, 0xF0, 0x22, 0x90, 0xA0, 0x51, 0xE0, 0x44, 0x02, 0xF0, +0x90, 0xA0, 0x60, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0x51, 0xBB, 0x91, 0xD0, 0x50, 0x0A, 0x90, 0xA0, +0x60, 0xE0, 0x94, 0x03, 0x50, 0x02, 0x81, 0xAE, 0x90, 0x9E, 0xCB, 0xE0, 0xFF, 0x90, 0xA2, 0xD7, +0x74, 0x0A, 0xF0, 0x7B, 0x01, 0x7D, 0x01, 0xD1, 0x16, 0xAD, 0x07, 0xAC, 0x06, 0xE4, 0xFF, 0xB1, +0x2E, 0x12, 0xBA, 0x45, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0xA0, 0x51, 0xE0, 0x54, 0xFD, 0xF0, +0x54, 0xFB, 0x12, 0x64, 0x53, 0x7F, 0x03, 0x12, 0x88, 0x32, 0x90, 0x05, 0x22, 0xE0, 0x44, 0x10, +0xFF, 0x7D, 0x03, 0x12, 0x54, 0xC6, 0x90, 0x04, 0x9C, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x52, +0xE0, 0x64, 0x07, 0x70, 0x35, 0x90, 0xA0, 0x60, 0xE0, 0xB4, 0x04, 0x04, 0x91, 0xBC, 0x80, 0x63, +0x90, 0xA0, 0x51, 0x91, 0xC9, 0x30, 0xE0, 0x18, 0xF1, 0xC6, 0x90, 0xA0, 0x6F, 0xE0, 0x30, 0xE0, +0x0D, 0x91, 0xAF, 0xE4, 0x90, 0xA0, 0x5F, 0xF0, 0x90, 0xA2, 0xED, 0x04, 0x80, 0x09, 0x80, 0x6C, +0xB1, 0x71, 0x90, 0xA0, 0x60, 0xE0, 0x04, 0xF0, 0x80, 0x3F, 0x90, 0xA0, 0x52, 0xE0, 0x64, 0x09, +0x70, 0x4C, 0x90, 0xA0, 0x51, 0xE0, 0x30, 0xE0, 0x0A, 0x91, 0xBC, 0x90, 0xA0, 0x51, 0xE0, 0x54, +0xFE, 0xF0, 0x22, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x23, 0x74, 0x04, 0xF0, 0x90, 0xA0, 0x5F, +0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x02, 0x12, 0xF1, 0xBE, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, +0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA0, 0x52, 0xF0, 0x22, 0x7F, 0x03, 0x41, 0xBB, 0xF1, 0xBE, 0x60, +0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA0, 0x52, 0xF0, 0x22, 0x90, +0xA0, 0x52, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x5D, 0x74, +0x05, 0xF0, 0x22, 0x12, 0x8A, 0x12, 0x90, 0xA0, 0x4E, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, +0x90, 0xA0, 0x60, 0xE0, 0xFF, 0x90, 0xA0, 0x5F, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, +0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA0, 0x4B, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0x90, 0xA0, +0x7C, 0xE0, 0xFD, 0xC3, 0xEF, 0x9D, 0x74, 0x80, 0xF8, 0x6E, 0x98, 0x22, 0x90, 0xA2, 0xA0, 0xA3, +0xE0, 0xFF, 0x90, 0xA2, 0xD7, 0x74, 0x03, 0xF0, 0x7B, 0x06, 0x7D, 0x01, 0xD1, 0x16, 0x90, 0xA2, +0xA4, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA2, 0xA3, 0xE0, 0xFF, 0x74, 0x10, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA2, 0xA2, 0xE0, 0xFF, 0xD1, 0xEE, +0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x30, 0xD1, 0xFA, 0x44, 0x10, 0xF0, 0xD1, 0xEE, 0x44, 0x80, 0xF0, +0xF1, 0xD8, 0x54, 0x07, 0x30, 0xE0, 0x29, 0x12, 0x8D, 0x45, 0x50, 0x0C, 0xEF, 0x25, 0xE0, 0x25, +0xE0, 0xFF, 0x74, 0x2B, 0x2D, 0x02, 0xA0, 0x45, 0x74, 0x2B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xD1, 0xFA, 0x54, 0xEF, 0xF0, 0xD1, 0xEE, 0x44, 0x40, 0xF0, +0x22, 0x90, 0xA0, 0x51, 0xE0, 0x44, 0x02, 0xF0, 0x7D, 0x08, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xB2, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x9E, 0x94, 0xE0, 0x04, +0xF0, 0x90, 0xA0, 0x4A, 0xE0, 0x30, 0xE0, 0x07, 0x90, 0x05, 0x10, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, +0x04, 0x1D, 0xE0, 0x60, 0x43, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0xB6, 0xF0, 0x7D, 0x26, 0x12, +0x57, 0x51, 0xEF, 0x64, 0x01, 0x70, 0x0E, 0xD1, 0xC4, 0x20, 0xE0, 0x1D, 0x90, 0xA0, 0xAD, 0xE0, +0x20, 0xE0, 0x16, 0x80, 0x12, 0x12, 0x5F, 0xDC, 0x30, 0xE0, 0x0E, 0xD1, 0xC4, 0x20, 0xE0, 0x09, +0x90, 0xA0, 0xAD, 0xE0, 0x20, 0xE0, 0x02, 0xF1, 0x06, 0x90, 0xA2, 0xB6, 0xE0, 0xFF, 0x7D, 0x27, +0x12, 0x54, 0xC6, 0x12, 0xB9, 0xEA, 0x80, 0x11, 0x12, 0xB9, 0xEA, 0xD1, 0xC4, 0x20, 0xE0, 0x09, +0x90, 0xA0, 0xAD, 0xE0, 0x20, 0xE0, 0x02, 0xF1, 0x06, 0x90, 0xA0, 0x4A, 0xE0, 0x30, 0xE0, 0x0E, +0x12, 0x5F, 0xDC, 0x30, 0xE0, 0x08, 0x12, 0xBC, 0xDA, 0x7D, 0x28, 0x12, 0x54, 0xC6, 0x12, 0xBC, +0x46, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xD5, +0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0xD4, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xBA, 0x97, +0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA2, 0xD4, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA2, 0xD5, 0xE0, +0x60, 0x06, 0x12, 0xBB, 0xE1, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x12, 0xBB, 0xE1, 0x54, 0xC0, 0xF0, 0x90, 0xA2, +0xD7, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x18, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, +0xF0, 0x74, 0x12, 0x2E, 0xF1, 0x70, 0xE0, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0xD6, 0xE0, 0x25, 0xE0, +0x25, 0xE0, 0xFE, 0xEF, 0x44, 0x02, 0x4E, 0xFF, 0xAE, 0x05, 0x74, 0x12, 0x2E, 0xF1, 0x70, 0xEF, +0xF0, 0x74, 0x11, 0x2E, 0xF1, 0xB6, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2E, 0xD1, 0xFD, 0x54, 0xF7, +0xF0, 0x90, 0xA0, 0x4A, 0xE0, 0x30, 0xE0, 0x0D, 0x12, 0xBB, 0xD5, 0x44, 0x80, 0xF0, 0x90, 0x05, +0x12, 0xE4, 0xF0, 0x80, 0x06, 0x12, 0xBB, 0xD5, 0x54, 0x7F, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9E, 0xCB, 0xE0, 0xFF, 0x90, 0xA2, 0xB3, 0xE0, 0xFB, 0x90, 0xA2, +0xD7, 0x74, 0x0A, 0xF0, 0x7D, 0x01, 0xD1, 0x16, 0x90, 0xA2, 0xB4, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, +0xF0, 0xFD, 0x90, 0xA2, 0xB2, 0xE0, 0xFF, 0xB1, 0x2E, 0x90, 0xA0, 0xAE, 0xE0, 0x22, 0x74, 0x09, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0xA2, 0xB4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, +0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0xF1, 0x80, 0x44, 0x01, 0xF0, 0xF1, 0x80, 0x54, 0xFB, +0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF1, 0x70, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF1, +0xB6, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, +0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF1, 0x78, 0xE0, +0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF1, 0x78, 0xED, 0xF0, 0x22, 0xF0, 0x74, 0x12, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, +0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x9E, 0xCC, 0xE0, +0xFF, 0x90, 0xA2, 0xD7, 0x74, 0x0B, 0xF0, 0x7B, 0x08, 0x7D, 0x01, 0xD1, 0x16, 0x90, 0xA2, 0xE9, +0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA2, 0xE8, 0xE0, 0xFF, 0xA1, 0x2E, 0x90, 0xA0, +0x4D, 0xE0, 0xC4, 0x54, 0x0F, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0xA2, +0xED, 0xE0, 0x90, 0xA0, 0x5D, 0x22, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xE4, 0x90, +0xA0, 0x52, 0xF0, 0x90, 0xA0, 0x5D, 0x22, 0x22, 0x90, 0xA0, 0x4E, 0xE0, 0xC4, 0x13, 0x22, 0xC0, +0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, +0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, +0xDF, 0xF0, 0x74, 0x87, 0xA3, 0xF0, 0x12, 0x58, 0xF7, 0x53, 0x91, 0xBF, 0x74, 0xDF, 0x04, 0x90, +0x01, 0xC4, 0xF0, 0x74, 0x87, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, +0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, +0xE0, 0x32, 0x90, 0xA0, 0x6F, 0x31, 0xDA, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x09, 0xF0, +0x22, 0x90, 0xA0, 0xAB, 0xE0, 0x30, 0xE0, 0x1D, 0xEF, 0x24, 0xFD, 0x60, 0x0E, 0x24, 0xFA, 0x60, +0x0E, 0x24, 0xFC, 0x60, 0x0E, 0x24, 0x0C, 0x7F, 0x02, 0x80, 0x0A, 0x7F, 0x03, 0x80, 0x06, 0x7F, +0x0B, 0x80, 0x02, 0x7F, 0x0E, 0x90, 0x07, 0x78, 0xEF, 0xF0, 0x22, 0xAD, 0x07, 0xED, 0x70, 0x19, +0x11, 0xF5, 0x70, 0x02, 0x80, 0x17, 0xBC, 0x01, 0x02, 0x80, 0x19, 0x11, 0xF5, 0xBC, 0x02, 0x02, +0x80, 0x1B, 0xEC, 0x64, 0x03, 0x70, 0x21, 0x80, 0x1B, 0x11, 0xFD, 0x70, 0x04, 0x7F, 0x01, 0x80, +0x15, 0xBC, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0x11, 0xFD, 0xBC, 0x02, 0x04, 0x7F, 0x09, 0x80, +0x05, 0xBC, 0x03, 0x04, 0x7F, 0x0D, 0x11, 0x32, 0x90, 0xA0, 0x99, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x30, 0xE0, 0x3A, 0xED, 0x70, 0x1B, 0xA3, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xE4, +0x90, 0xA1, 0xF9, 0xF0, 0x80, 0x02, 0x11, 0xEE, 0x90, 0xA1, 0xF9, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, +0x19, 0x90, 0xA0, 0x9A, 0x12, 0x5F, 0xDF, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0xF9, 0xF0, 0x80, +0x02, 0x11, 0xEE, 0x90, 0xA1, 0xF9, 0xE0, 0xFD, 0x7F, 0x01, 0x12, 0x48, 0x62, 0x22, 0x90, 0xA1, +0xF9, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0x9A, 0xE0, 0x54, 0x03, 0xFC, 0x22, 0x90, 0xA0, 0x9A, +0xE0, 0xC4, 0x54, 0x03, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0xA0, +0xE0, 0xB4, 0x01, 0x02, 0x80, 0x40, 0x90, 0xA0, 0xA0, 0xE0, 0xB4, 0x02, 0x10, 0x31, 0xEB, 0x7F, +0x01, 0x51, 0x12, 0x11, 0x6B, 0x90, 0xA0, 0xA0, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0x90, 0xA0, 0xA0, +0xE0, 0x64, 0x03, 0x70, 0x1A, 0x90, 0xA0, 0xA3, 0x31, 0xEE, 0xE4, 0xFF, 0x51, 0x12, 0x11, 0x6B, +0x31, 0xE1, 0xE4, 0xFB, 0xFD, 0x31, 0x6D, 0x90, 0xA0, 0xA0, 0x74, 0x04, 0xF0, 0x80, 0x19, 0x90, +0xA0, 0xA0, 0xE0, 0xB4, 0x04, 0x12, 0x31, 0xE1, 0x7B, 0x01, 0x7D, 0x01, 0x31, 0x6D, 0x90, 0xA0, +0xA0, 0x74, 0x02, 0xF0, 0x90, 0xA0, 0x9E, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xF9, +0x12, 0x97, 0xC3, 0x90, 0xA0, 0x99, 0x31, 0xDA, 0x20, 0xE0, 0x0E, 0x90, 0xA1, 0xFA, 0xE0, 0xB4, +0x01, 0x07, 0x7D, 0x36, 0x7F, 0x6F, 0x12, 0x54, 0xC6, 0x90, 0xA1, 0xF9, 0xE0, 0x70, 0x0C, 0x90, +0xA1, 0xFB, 0xE0, 0xFF, 0x7D, 0x05, 0x12, 0x85, 0x7C, 0x80, 0x27, 0x90, 0xA1, 0xF9, 0xE0, 0xB4, +0x01, 0x0A, 0x90, 0xA1, 0xFB, 0xE0, 0xFF, 0x12, 0xBA, 0x58, 0x80, 0x16, 0x90, 0xA1, 0xF9, 0xE0, +0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA0, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, +0xB1, 0x4E, 0x90, 0xA0, 0x99, 0x31, 0xDA, 0x20, 0xE0, 0x0B, 0x90, 0xA1, 0xFA, 0xE0, 0x70, 0x05, +0xFD, 0xFF, 0x12, 0x54, 0xC6, 0x22, 0xF0, 0x90, 0xA0, 0x3B, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, +0x22, 0x90, 0xA0, 0x99, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0x22, 0x90, 0xA0, 0xA5, 0xE0, 0xFE, +0xA3, 0xE0, 0xFF, 0xAD, 0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, +0x8F, 0x36, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x64, 0x03, 0x70, 0x0E, 0x90, 0xA0, +0x4D, 0x12, 0x5F, 0xDF, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x3A, 0x80, 0x2D, 0x90, 0xA0, 0x4E, 0xE0, +0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x06, 0xE0, 0x54, 0xFC, 0xF0, +0x80, 0x04, 0xE0, 0x44, 0x03, 0xF0, 0x90, 0xA0, 0x99, 0xE0, 0x30, 0xE0, 0x1B, 0xC4, 0x54, 0x0F, +0x30, 0xE0, 0x0E, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x06, 0xE0, 0x54, 0xFC, 0xF0, 0x80, 0x09, 0x80, +0x03, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xF9, +0xEF, 0xF0, 0x90, 0xA1, 0xFB, 0x74, 0x02, 0xF0, 0x7F, 0x01, 0x12, 0x84, 0xC3, 0x30, 0xE0, 0x22, +0x90, 0xA1, 0xF9, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x07, 0x80, 0x09, 0x90, 0xA1, 0xF9, 0xE0, 0xB4, +0x05, 0x07, 0x7D, 0x0D, 0x7F, 0xFF, 0x12, 0x54, 0xC6, 0x12, 0x57, 0x55, 0xBF, 0x01, 0x03, 0x12, +0x47, 0xEB, 0x90, 0xA0, 0x4E, 0x12, 0x4F, 0xD1, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, +0x01, 0x11, 0x32, 0x90, 0xA1, 0xF9, 0xE0, 0xB4, 0x02, 0x0D, 0x90, 0xA0, 0x4B, 0xE0, 0x24, 0x03, +0xFF, 0x90, 0xA0, 0x5A, 0x12, 0x82, 0xB7, 0x90, 0xA0, 0x4A, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, +0xE4, 0x90, 0xA1, 0xFA, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xFA, 0x74, 0x01, 0xF0, 0x12, 0xBC, 0xB2, +0x20, 0xE0, 0x13, 0x90, 0xA0, 0x8C, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0xFB, 0x74, 0x01, 0xF0, 0x80, +0x05, 0xE4, 0x90, 0xA1, 0xFB, 0xF0, 0x90, 0xA1, 0xFB, 0xE0, 0xFF, 0x90, 0xA1, 0xFA, 0xE0, 0xFD, +0x12, 0x48, 0x62, 0xE4, 0x90, 0xA0, 0x5C, 0xF0, 0x90, 0xA1, 0xF9, 0xE0, 0xFF, 0xB4, 0x02, 0x05, +0x12, 0x82, 0xCE, 0x80, 0x09, 0xEF, 0xB4, 0x05, 0x05, 0xE4, 0x90, 0xA0, 0x5D, 0xF0, 0xB1, 0xE3, +0x30, 0xE0, 0x17, 0x90, 0xA1, 0xF9, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x08, 0x80, 0x53, 0x90, 0xA1, +0xF9, 0xE0, 0x64, 0x05, 0x70, 0x50, 0x7D, 0x0E, 0x80, 0x47, 0x90, 0xA0, 0x4A, 0xE0, 0xC4, 0x54, +0x0F, 0x30, 0xE0, 0x21, 0x12, 0x87, 0xD8, 0x54, 0x07, 0x20, 0xE0, 0x02, 0x71, 0xB2, 0x90, 0xA1, +0xF9, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x28, 0x90, 0xA1, 0xF9, 0xE0, 0x64, 0x05, 0x70, +0x25, 0x7D, 0x0F, 0x80, 0x1C, 0x90, 0x9F, 0xD9, 0xE0, 0x60, 0x1B, 0x71, 0xB2, 0x90, 0xA1, 0xF9, +0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x0A, 0x80, 0x09, 0x90, 0xA1, 0xF9, 0xE0, 0xB4, 0x05, 0x07, 0x7D, +0x10, 0x7F, 0x6F, 0x12, 0x54, 0xC6, 0x90, 0xA0, 0x4D, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x66, 0x3A, +0x12, 0x4F, 0xCE, 0x30, 0xE0, 0x04, 0xE4, 0xFF, 0xF1, 0xDD, 0x90, 0xA0, 0x4E, 0xE0, 0xC3, 0x13, +0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, +0xF0, 0x22, 0x90, 0x9F, 0xDB, 0xE0, 0xFF, 0xE4, 0xFD, 0x02, 0x62, 0x5A, 0x7D, 0x12, 0x7F, 0xFF, +0x12, 0x54, 0xC6, 0x7F, 0x01, 0x11, 0x32, 0x12, 0xAB, 0xD9, 0x02, 0x48, 0x62, 0x90, 0xA0, 0x65, +0xE0, 0x30, 0xE0, 0x04, 0x71, 0xBC, 0x80, 0x02, 0x71, 0xE4, 0x90, 0xA0, 0x99, 0xE0, 0x30, 0xE0, +0x02, 0x31, 0x06, 0x22, 0x90, 0xA0, 0x4A, 0xE0, 0x30, 0xE0, 0x36, 0x12, 0x82, 0xD5, 0x90, 0xA0, +0x5D, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x1D, 0x90, 0xA0, 0x5D, 0xE0, 0xFF, 0xB4, 0x02, 0x02, +0x80, 0x1D, 0x90, 0xA0, 0x5D, 0xE0, 0xFF, 0xB4, 0x03, 0x03, 0x02, 0x80, 0xEF, 0x90, 0xA0, 0x5D, +0xE0, 0xFF, 0xB4, 0x04, 0x02, 0x80, 0x0B, 0x90, 0xA0, 0x5D, 0xE0, 0xFF, 0xB4, 0x05, 0x02, 0x51, +0x6D, 0x22, 0x90, 0xA1, 0xF9, 0xEF, 0xF0, 0x7F, 0x03, 0x12, 0x82, 0xBB, 0x12, 0x87, 0xAE, 0x90, +0xA0, 0x5D, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0x4E, +0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x09, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, +0xE0, 0x38, 0x12, 0x87, 0xAE, 0x30, 0xE0, 0x0A, 0x90, 0xA0, 0x4B, 0xE0, 0xFF, 0x90, 0xA0, 0x5B, +0x80, 0x21, 0x90, 0xA1, 0xF9, 0xE0, 0xFC, 0xB4, 0x01, 0x0D, 0x90, 0xA0, 0x4B, 0xE0, 0xFE, 0x90, +0xA0, 0x5A, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, 0xB4, 0x04, 0x0F, 0x90, 0xA0, 0x4C, 0xE0, 0xFF, +0x90, 0xA0, 0x5A, 0xE0, 0xC3, 0x9F, 0x90, 0xA0, 0x61, 0xF0, 0xB1, 0xE3, 0x30, 0xE0, 0x23, 0x12, +0x87, 0xD8, 0x54, 0x07, 0x20, 0xE0, 0x02, 0xA1, 0x1E, 0xB1, 0x45, 0x50, 0x0A, 0xEF, 0x25, 0xE0, +0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x12, 0xA0, 0x4F, +0x80, 0x6C, 0x90, 0xA0, 0x4A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x49, 0x12, 0xBC, 0x97, 0xFD, +0x7F, 0x04, 0x12, 0x62, 0x5A, 0x12, 0x5F, 0xDC, 0x30, 0xE0, 0x3A, 0x90, 0xA0, 0x51, 0xE0, 0x44, +0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA0, 0x60, 0xF0, 0x90, 0xA0, 0x5D, 0xF0, 0x90, 0xA1, +0xF9, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA0, 0x52, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, +0x04, 0x06, 0x90, 0xA0, 0x52, 0x74, 0x07, 0xF0, 0x90, 0xA0, 0x3C, 0xE0, 0x60, 0x07, 0x90, 0xA0, +0x51, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0xF9, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, 0x09, +0x90, 0xA1, 0xF9, 0xE0, 0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x54, 0xC6, 0x90, 0xA0, +0x4E, 0x31, 0xDA, 0x30, 0xE0, 0x14, 0xB1, 0x45, 0x50, 0x0A, 0xEF, 0x7F, 0x00, 0x25, 0xE0, 0x25, +0xE0, 0xFE, 0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0xB1, 0x4E, 0x90, 0xA0, 0x4D, 0xE0, 0x30, 0xE0, +0x03, 0x12, 0x66, 0x3A, 0x22, 0x90, 0xA0, 0x61, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1D, +0xE0, 0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0xBB, 0xF0, 0x7D, 0x36, 0x12, 0x57, 0x51, +0xBF, 0x01, 0x02, 0xB1, 0x96, 0x90, 0xA2, 0xBB, 0xE0, 0xFF, 0x7D, 0x37, 0x12, 0x54, 0xC6, 0x80, +0x02, 0xB1, 0x96, 0x12, 0xBC, 0xDA, 0x7D, 0x38, 0x12, 0x54, 0xC6, 0x90, 0x04, 0x1F, 0x74, 0x20, +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9E, 0xCE, 0xE0, 0xFF, 0x90, 0xA2, 0xD7, 0x74, 0x0C, +0xF0, 0xE4, 0xFB, 0x7D, 0x01, 0x12, 0x86, 0x16, 0x90, 0xA2, 0xB9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0xA2, 0xB7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAB, +0x07, 0x90, 0xA3, 0x19, 0xED, 0xF0, 0xEC, 0xF9, 0xE0, 0xFF, 0xAE, 0x03, 0x74, 0x2A, 0x2E, 0x12, +0xA0, 0x3B, 0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE9, 0xF0, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x90, 0xA0, 0x4A, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x12, 0x06, 0x89, 0x54, +0x01, 0x12, 0x9E, 0x97, 0x90, 0xA0, 0x6F, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x31, 0xDA, 0x90, 0x07, +0x65, 0x30, 0xE0, 0x04, 0x74, 0x18, 0xF0, 0x22, 0xE4, 0xF0, 0x22, 0xF1, 0xD6, 0x13, 0x30, 0xE0, +0x21, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x18, 0x12, 0x87, 0xAE, 0x30, 0xE0, 0x04, +0x7F, 0x03, 0x80, 0x0C, 0x12, 0xAD, 0x96, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x02, 0x7F, 0x09, +0x11, 0x32, 0x22, 0xE4, 0x90, 0xA1, 0xF9, 0xF0, 0x90, 0x9F, 0xD9, 0xE0, 0x70, 0x02, 0xC1, 0xCC, +0x12, 0x67, 0xA8, 0x60, 0x02, 0xC1, 0xCC, 0x12, 0xBC, 0xEA, 0x12, 0x5D, 0x27, 0x12, 0x45, 0x54, +0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x12, 0x5D, 0x41, 0x78, 0x10, +0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0x12, 0x5D, 0x41, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, +0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xF1, 0xC5, 0x11, 0xEE, 0xE4, 0x90, 0x9F, 0xE0, 0xF0, +0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x9F, 0xD3, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, +0xA1, 0xF9, 0xF0, 0x12, 0x6B, 0x1D, 0xEF, 0x70, 0x04, 0x90, 0xA1, 0xF9, 0xF0, 0x90, 0xA1, 0xF9, +0xE0, 0x60, 0x19, 0xF1, 0xBD, 0xE4, 0x90, 0xA2, 0xAB, 0xF0, 0x90, 0x9F, 0xE1, 0x12, 0x50, 0x0F, +0x90, 0x9F, 0xDC, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x62, 0x56, 0xD1, 0x0B, 0x22, 0xE4, 0xF5, 0x63, +0x90, 0x9F, 0xD9, 0xE0, 0x70, 0x02, 0xE1, 0xAA, 0x12, 0x67, 0xA8, 0x60, 0x02, 0xE1, 0xAA, 0x12, +0x5D, 0x28, 0x12, 0x45, 0x54, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, +0x12, 0x5D, 0x41, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, +0x12, 0x45, 0x54, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0x12, 0x5D, 0x41, 0x78, +0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xF1, 0xC5, 0x12, 0xBB, +0x83, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x9F, 0xE0, 0xE0, 0x14, 0xF0, +0xE0, 0xFF, 0x60, 0x06, 0x90, 0x9F, 0xE2, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x9F, 0xDF, +0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, 0x12, 0x90, +0x9F, 0xD3, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x12, 0x6B, 0x1D, 0xEF, 0x70, 0x02, 0xF5, +0x63, 0xE5, 0x63, 0x60, 0x45, 0xF1, 0xBD, 0x90, 0x9F, 0xE2, 0xE0, 0x60, 0x04, 0x64, 0x01, 0x70, +0x14, 0xE4, 0x90, 0xA2, 0xAB, 0xF0, 0x90, 0x9F, 0xE2, 0xE0, 0xF1, 0xB6, 0x12, 0x50, 0x10, 0x90, +0x9F, 0xE2, 0xE0, 0x80, 0x13, 0xE4, 0x90, 0xA2, 0xAB, 0xF1, 0xAB, 0x12, 0x50, 0x10, 0x90, 0x9F, +0xE2, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xF1, 0xB6, 0x90, 0x9F, 0xF2, 0xF0, 0x90, 0x9F, +0xDC, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x62, 0x56, 0xD1, 0x0B, 0x22, 0xF0, 0x90, 0x9F, 0xE2, 0xE0, +0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x9F, 0xE1, 0xE0, 0x2F, 0x22, 0x90, 0x9F, 0xDD, +0xE0, 0x44, 0x10, 0xF0, 0x22, 0x12, 0x45, 0x54, 0x90, 0xA0, 0x2C, 0x12, 0x08, 0x6D, 0x90, 0x9F, +0xD5, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0xA0, 0x3B, 0xE0, 0xFF, 0xC3, 0x22, 0x90, 0xA0, 0x7D, +0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x16, 0xEF, 0xB4, 0x01, 0x05, 0x90, 0xA0, 0x84, 0x80, 0x03, +0x90, 0xA0, 0x80, 0x12, 0x47, 0xCC, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x22, 0x7E, 0x00, +0x7F, 0x19, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x7D, 0x12, 0x08, 0xAA, 0x12, 0xAE, 0x40, +0x90, 0xA0, 0x84, 0x12, 0x45, 0x72, 0x90, 0xA0, 0x80, 0x12, 0x08, 0x6D, 0x90, 0x9E, 0x98, 0xE0, +0xFF, 0x64, 0x02, 0x70, 0x22, 0x31, 0x1A, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0xA0, 0x8C, 0xEE, +0xF0, 0x31, 0x1A, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0xA0, 0x8D, 0xEE, 0xF0, 0x90, 0xFD, 0x80, +0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x3A, 0xEF, 0x64, 0x01, 0x70, 0x15, 0x11, 0xB3, 0x30, 0xE0, +0x02, 0x7F, 0x01, 0x90, 0xA0, 0x8C, 0xEF, 0xF0, 0x11, 0xB3, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x80, +0x1B, 0x90, 0x9E, 0x98, 0xE0, 0x64, 0x03, 0x70, 0x18, 0x11, 0xAC, 0x30, 0xE0, 0x02, 0x7F, 0x01, +0x90, 0xA0, 0x8C, 0xEF, 0xF0, 0x11, 0xAC, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0x8D, 0xEF, +0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x7F, 0x01, 0x12, 0x88, 0x32, 0x11, 0xBA, 0x12, +0xA0, 0xB4, 0x90, 0xA0, 0x63, 0x74, 0x01, 0xF0, 0x90, 0xA0, 0x99, 0xE0, 0x54, 0xFE, 0xF0, 0x90, +0x04, 0x8F, 0xE4, 0xF0, 0x90, 0xA0, 0xAB, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0xFD, 0x78, 0xE0, +0x7F, 0x00, 0x22, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0x7E, 0x00, 0x7F, 0x33, 0x7D, 0x00, +0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x4A, 0x12, 0x08, 0xAA, 0x90, 0xA0, 0x4B, 0x74, 0x0B, 0xF0, 0xA3, +0x74, 0x08, 0xF0, 0x90, 0x9E, 0x98, 0xE0, 0xFC, 0x64, 0x02, 0x70, 0x14, 0x31, 0x1A, 0x30, 0xE2, +0x02, 0x7E, 0x01, 0xEE, 0x31, 0x21, 0xFE, 0x90, 0xA0, 0x4D, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0x22, +0xEC, 0x64, 0x01, 0x70, 0x09, 0x11, 0xB3, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x0F, 0x90, 0x9E, +0x98, 0xE0, 0x64, 0x03, 0x70, 0x13, 0x11, 0xAC, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0xEF, 0x31, 0x21, +0xFF, 0x90, 0xA0, 0x4D, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x22, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, +0x22, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x22, 0x31, 0x3F, 0x12, 0xAF, 0xB6, 0x12, 0x4E, +0x36, 0x12, 0xB8, 0x1E, 0x12, 0x60, 0xCF, 0x31, 0xD9, 0x12, 0xA7, 0x4B, 0x02, 0x8F, 0xFE, 0xE4, +0xFD, 0xFF, 0x12, 0xBB, 0xED, 0xED, 0x70, 0x12, 0x31, 0x7E, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0x76, +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0x80, 0x0F, 0x31, 0x7E, 0xC0, 0x83, 0xC0, 0x82, +0x31, 0x76, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x31, 0x89, +0x90, 0x9F, 0xCD, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x22, 0x74, 0xBD, +0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x7D, 0x10, 0xED, 0x14, 0xF9, 0x24, 0xBD, 0x31, 0x81, 0xE0, 0x60, 0x34, 0x7C, 0x08, 0xEC, 0x14, +0x90, 0xA3, 0x11, 0xF0, 0x74, 0xBD, 0x29, 0x31, 0x81, 0xE0, 0xFB, 0x7A, 0x00, 0x90, 0xA3, 0x11, +0x71, 0x29, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x31, 0xDF, 0x60, 0x0F, 0xE9, +0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0xA3, 0x11, 0xE0, 0x2F, 0x04, 0xFF, 0x80, 0x06, 0xDC, 0xCE, +0xDD, 0xC0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xBB, 0xA3, 0x02, 0x08, 0xAA, 0xFF, +0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x22, 0x8D, 0x5D, 0xAC, 0x07, 0x75, 0xF0, 0x10, 0xEC, 0x12, +0x75, 0x8E, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF9, 0xE5, 0x5E, 0x54, 0x80, 0xF5, 0x5F, 0x75, 0xF0, +0x04, 0xEC, 0x12, 0x4F, 0xFD, 0xE0, 0xF5, 0x61, 0x75, 0xF0, 0x04, 0xEC, 0x12, 0x4E, 0x2E, 0xC4, +0x54, 0x03, 0xF5, 0x62, 0xE9, 0x12, 0xBB, 0x05, 0xF1, 0xCC, 0xEC, 0x91, 0x73, 0x12, 0x77, 0xE4, +0xF0, 0x74, 0x91, 0x2C, 0x51, 0xD8, 0xE5, 0x5E, 0xF0, 0x75, 0xF0, 0x04, 0xEC, 0x12, 0x4E, 0x2E, +0x13, 0x13, 0x54, 0x03, 0xF5, 0x60, 0x74, 0x91, 0x2C, 0xB1, 0x42, 0xE5, 0x60, 0xF0, 0xE9, 0x64, +0x2C, 0x70, 0x27, 0x75, 0xF0, 0x04, 0xEC, 0x12, 0x4E, 0x2E, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x60, +0xC3, 0x9E, 0x50, 0x16, 0x05, 0x60, 0xE5, 0x60, 0xB1, 0x5F, 0xEC, 0x90, 0x96, 0x14, 0x12, 0x45, +0x8A, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0x80, 0x5E, 0xE9, 0xC3, 0x95, 0x61, 0x50, 0x2F, +0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x61, 0x50, 0x4F, 0xED, 0xB1, 0x4A, 0xEC, 0x12, 0x7A, 0x4C, +0xE0, 0xFB, 0x7A, 0x00, 0xED, 0x54, 0x07, 0x71, 0x2A, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0x31, 0xDF, 0x60, 0x06, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x2C, 0x0D, 0x80, 0xD4, 0xE9, +0x65, 0x61, 0x70, 0x1A, 0x75, 0xF0, 0x04, 0xEC, 0x12, 0x4F, 0x86, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x22, 0xE5, 0x5E, 0x20, 0xE7, 0x1D, 0xE9, 0x44, 0x80, 0xF5, 0x5E, 0x80, 0x0A, 0x74, 0x91, +0x2C, 0x51, 0xD8, 0xE5, 0x61, 0xF0, 0xF5, 0x5E, 0xAF, 0x04, 0x85, 0x60, 0x6A, 0xAB, 0x5D, 0xAD, +0x5E, 0x12, 0x76, 0x59, 0x22, 0x74, 0x91, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0x22, +0x75, 0xF0, 0x04, 0xEF, 0x12, 0x4E, 0x2E, 0xFE, 0x13, 0x13, 0x54, 0x03, 0xFC, 0x12, 0x4F, 0xF9, +0xE0, 0xFB, 0x51, 0xD5, 0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x18, 0xEE, 0x54, 0x03, 0xFE, +0xEC, 0xD3, 0x9E, 0x50, 0x0F, 0xEC, 0x60, 0x0C, 0x1C, 0xEC, 0xB1, 0x5F, 0xEF, 0x12, 0x4E, 0x2E, +0x54, 0xF3, 0x4E, 0xF0, 0xED, 0xD3, 0x9B, 0x40, 0x02, 0xAD, 0x03, 0x51, 0xD5, 0xE0, 0x54, 0x80, +0x42, 0x05, 0x8C, 0x6A, 0xE4, 0xFB, 0x02, 0x76, 0x59, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, +0x07, 0x08, 0x22, 0x7D, 0x01, 0xAF, 0x51, 0xAA, 0x07, 0xAB, 0x05, 0x75, 0xF0, 0x10, 0xEA, 0x12, +0x75, 0x8E, 0xE0, 0xF5, 0x5D, 0x54, 0x7F, 0xF5, 0x5F, 0x75, 0xF0, 0x04, 0xEA, 0xB1, 0x59, 0xE0, +0x90, 0xA1, 0xDC, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x4F, 0xFD, 0xE0, 0xFF, 0x75, 0xF0, 0x04, +0xEA, 0x12, 0x4E, 0x2E, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x5E, 0xE5, 0x5F, 0x12, 0xBB, 0x13, 0xE4, +0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA, 0x91, 0x73, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, +0x75, 0xF0, 0x04, 0xEA, 0x12, 0x4E, 0x2E, 0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA1, 0xDA, 0xF0, 0x74, +0x91, 0x2A, 0x51, 0xD8, 0xE5, 0x5F, 0xF0, 0x74, 0x91, 0x2A, 0xB1, 0x42, 0xE5, 0x5E, 0xF0, 0xE5, +0x5F, 0xD3, 0x9F, 0x40, 0x04, 0x8F, 0x5F, 0x8F, 0x5D, 0xEB, 0x70, 0x02, 0x81, 0x66, 0xAF, 0x03, +0x8F, 0x60, 0xE5, 0x5D, 0x30, 0xE7, 0x05, 0x85, 0x5F, 0x5D, 0x15, 0x60, 0xE5, 0x60, 0x70, 0x02, +0x81, 0x66, 0xE5, 0x5F, 0x64, 0x2C, 0x70, 0x26, 0xE5, 0x5E, 0xD3, 0x94, 0x00, 0x40, 0x1F, 0xE5, +0x5E, 0xD3, 0x94, 0x02, 0x50, 0x18, 0x15, 0x5E, 0xE5, 0x5E, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, +0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x4E, 0x2E, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x60, 0xE5, 0x60, +0x60, 0x74, 0x90, 0xA1, 0xDC, 0xE0, 0xFF, 0xE5, 0x5F, 0xD3, 0x9F, 0x40, 0x63, 0xE4, 0x90, 0xA1, +0xDB, 0xF0, 0x85, 0x5F, 0x5D, 0xAD, 0x5D, 0xE5, 0x5F, 0x14, 0xFC, 0x90, 0xA1, 0xDC, 0xE0, 0xFF, +0xEC, 0xC3, 0x9F, 0x40, 0x45, 0xEC, 0xB1, 0x4A, 0xEA, 0x12, 0x7A, 0x4C, 0xE0, 0xF5, 0x82, 0x75, +0x83, 0x00, 0xEC, 0x54, 0x07, 0x71, 0x2A, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x5F, 0xAD, 0x04, 0xB4, +0x14, 0x02, 0x7D, 0x0C, 0x90, 0xA1, 0xDB, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x60, 0x60, 0x0B, 0xA3, +0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40, 0x03, 0x1C, 0x80, 0xB1, 0xAF, 0x05, 0x8F, 0x5D, 0x80, 0x06, +0x90, 0xA1, 0xDC, 0xE0, 0xF5, 0x5D, 0xAF, 0x02, 0x85, 0x5E, 0x6A, 0xE4, 0xFB, 0xAD, 0x5D, 0x02, +0x76, 0x59, 0xE0, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0x22, 0x90, 0xA1, 0xDA, +0xF1, 0xC0, 0x90, 0xA1, 0xDC, 0xE0, 0x12, 0xBB, 0x65, 0x90, 0xA1, 0xE1, 0x12, 0x45, 0x9F, 0x90, +0xA1, 0xDD, 0xE0, 0x12, 0xBB, 0x22, 0xA3, 0x12, 0x45, 0x9F, 0xB1, 0x3A, 0xFF, 0x12, 0xB3, 0xA1, +0x8F, 0x61, 0xA3, 0x91, 0x72, 0xF5, 0x83, 0xE0, 0xF5, 0x5D, 0xA3, 0xE0, 0xF5, 0x5E, 0xE4, 0xF5, +0x62, 0x90, 0xA1, 0xE1, 0x12, 0x45, 0x96, 0x75, 0xF0, 0x02, 0xE5, 0x62, 0x12, 0xBA, 0xF7, 0xA8, +0x61, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xDE, 0x12, +0x45, 0x96, 0x85, 0x62, 0x82, 0xB1, 0x72, 0x12, 0xBD, 0x02, 0x25, 0x5E, 0xF5, 0x5E, 0xEE, 0x35, +0x5D, 0xF5, 0x5D, 0x05, 0x62, 0xE5, 0x62, 0xB4, 0x05, 0xC7, 0x90, 0xA1, 0xDE, 0x12, 0x45, 0x96, +0x12, 0x6D, 0x4E, 0xFD, 0x7C, 0x00, 0xB1, 0x3A, 0xA8, 0x61, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, +0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0x8E, 0x5F, 0x8F, 0x60, 0xD3, 0xE5, 0x5E, 0x95, +0x60, 0xE5, 0x5D, 0x95, 0x5F, 0x40, 0x0C, 0xE5, 0x5E, 0x95, 0x60, 0xFF, 0xE5, 0x5D, 0x95, 0x5F, +0xFE, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x00, 0x8E, 0x5D, 0x8F, 0x5E, 0x90, 0xA1, 0xDC, 0x91, 0x72, +0xF5, 0x83, 0xE5, 0x5D, 0xF0, 0xA3, 0xE5, 0x5E, 0xF0, 0x22, 0x90, 0xA1, 0xDA, 0xE0, 0xFE, 0xA3, +0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x22, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, +0x75, 0xF0, 0x08, 0x22, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x12, 0x02, 0x45, 0x8A, 0x54, +0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x22, 0x90, 0xA2, 0xEF, 0x12, 0x45, 0x96, +0x8E, 0x82, 0x75, 0x83, 0x00, 0x02, 0x06, 0xA2, 0x90, 0xA2, 0xEF, 0x12, 0x45, 0x9F, 0xE4, 0xFE, +0x90, 0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x23, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, +0x0C, 0xB1, 0x6A, 0xFF, 0x74, 0x52, 0xB1, 0xC5, 0xEF, 0xF0, 0x0E, 0x80, 0xEF, 0xEE, 0xC3, 0x94, +0x06, 0x50, 0x1B, 0x74, 0x52, 0xB1, 0xC5, 0xE4, 0xF0, 0x0E, 0x80, 0xF1, 0xEE, 0xC3, 0x94, 0x07, +0x50, 0x0C, 0xB1, 0x6A, 0xFF, 0x74, 0x51, 0xB1, 0xC5, 0xEF, 0xF0, 0x0E, 0x80, 0xEE, 0x90, 0xFD, +0x58, 0x74, 0x01, 0xF0, 0x22, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0x22, 0x90, 0xA1, +0xCF, 0x12, 0x45, 0x9F, 0x90, 0x04, 0x24, 0xE0, 0xF5, 0x51, 0xE4, 0xFF, 0x12, 0x6D, 0x5A, 0x8F, +0x82, 0xB1, 0x72, 0x25, 0x51, 0xFE, 0xF1, 0xD4, 0x12, 0x45, 0x8A, 0xEE, 0xF0, 0x8F, 0x82, 0xB1, +0x72, 0x25, 0x51, 0xFE, 0x75, 0xF0, 0x0B, 0xEF, 0x90, 0xA0, 0xE4, 0x12, 0x45, 0x8A, 0xEE, 0xF0, +0x0F, 0xEF, 0xB4, 0x03, 0xD7, 0x22, 0x8F, 0x54, 0x90, 0xA1, 0xCF, 0x74, 0x0E, 0xF0, 0xED, 0x24, +0xFE, 0x60, 0x6D, 0x04, 0x60, 0x02, 0xE1, 0x04, 0xF1, 0xB6, 0x74, 0x0C, 0xF0, 0x74, 0x11, 0x25, +0x54, 0x12, 0x4C, 0xED, 0xE0, 0x90, 0xA1, 0xD2, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x54, 0x12, 0x4E, +0x2E, 0xFD, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0xD3, 0xF0, 0xED, 0x12, 0x4F, 0xD2, 0xA3, 0xF0, +0x75, 0xF0, 0x04, 0xE5, 0x54, 0x12, 0x4E, 0x2E, 0xFF, 0xC4, 0x54, 0x03, 0x90, 0xA1, 0xD5, 0xF0, +0x75, 0xF0, 0x04, 0xE5, 0x54, 0x12, 0x4F, 0xFD, 0xE0, 0x90, 0xA1, 0xD6, 0xF0, 0x75, 0xF0, 0x04, +0xE5, 0x54, 0xB1, 0x59, 0xE0, 0x90, 0xA1, 0xD7, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x54, 0x12, 0x4F, +0x86, 0xFD, 0xC4, 0x13, 0x54, 0x01, 0x90, 0xA1, 0xD8, 0xF0, 0xED, 0x54, 0x1F, 0xA3, 0xE1, 0x00, +0xF1, 0xB6, 0x74, 0x0D, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x54, 0x90, 0x89, 0x00, 0x12, 0x45, 0x8A, +0xE0, 0x90, 0xA1, 0xD2, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x54, 0x90, 0x89, 0x01, 0x12, 0x45, 0x8A, +0xE0, 0x90, 0xA1, 0xD3, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x54, 0x90, 0x89, 0x02, 0x12, 0x45, 0x8A, +0xE0, 0x90, 0xA1, 0xD4, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x54, 0x90, 0x89, 0x03, 0x12, 0x45, 0x8A, +0xE0, 0x90, 0xA1, 0xD5, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x54, 0x90, 0x89, 0x04, 0x12, 0x45, 0x8A, +0xE0, 0x90, 0xA1, 0xD6, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x54, 0x90, 0x89, 0x05, 0x12, 0x45, 0x8A, +0xE0, 0x90, 0xA1, 0xD7, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x54, 0x90, 0x89, 0x06, 0x12, 0x45, 0x8A, +0xE0, 0x90, 0xA1, 0xD8, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x54, 0x12, 0xBC, 0xFA, 0x90, 0xA1, 0xD9, +0xF1, 0x05, 0xF1, 0xDC, 0x22, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xCF, 0x22, 0xF1, 0x06, 0x7F, +0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA1, 0xCF, 0xE0, 0xA3, 0xF0, 0xF1, +0x06, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA1, 0xCF, 0xE0, 0x90, +0xA1, 0xD1, 0xF0, 0xF1, 0x06, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, +0xA1, 0xCF, 0xE0, 0x90, 0xA1, 0xD2, 0xF0, 0xF1, 0x06, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, +0xBF, 0x01, 0x08, 0x90, 0xA1, 0xCF, 0xE0, 0x90, 0xA1, 0xD3, 0xF0, 0xF1, 0x06, 0x7F, 0xF2, 0x7E, +0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA1, 0xCF, 0xE0, 0x90, 0xA1, 0xD4, 0xF0, 0x90, +0xA1, 0xD0, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA1, 0xD8, 0xF0, +0x90, 0xA1, 0xD4, 0xE0, 0x90, 0xA1, 0xD9, 0xF0, 0x90, 0xA1, 0xDA, 0x74, 0x12, 0xF0, 0x90, 0xA1, +0xE8, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xDC, 0xF1, 0xC3, 0x90, 0xA1, 0xD8, 0xE0, 0x90, 0xA1, 0xDF, +0xF0, 0x90, 0xA1, 0xD9, 0xE0, 0x90, 0xA1, 0xE0, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xDA, 0x12, +0x5B, 0x9B, 0x7F, 0x04, 0x80, 0x2B, 0x90, 0xA1, 0xDD, 0x74, 0x09, 0xF0, 0x90, 0xA1, 0xD1, 0x22, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x22, 0xE4, 0x93, 0xFE, 0x74, +0x01, 0x93, 0xFF, 0x22, 0x75, 0xF0, 0x0E, 0xEF, 0x90, 0xA0, 0xBD, 0x22, 0x12, 0x5B, 0x9B, 0x7F, +0x04, 0x90, 0xA3, 0x10, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9E, 0x92, 0xE0, 0xFF, +0x90, 0xA3, 0x10, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9E, 0x92, 0xF0, 0x22, 0xE4, 0x7B, 0x01, 0x7A, +0xA0, 0x79, 0x96, 0x11, 0x22, 0xB4, 0x02, 0x19, 0x90, 0xA2, 0xEC, 0xE0, 0x64, 0x04, 0x60, 0x0C, +0x7F, 0x40, 0x12, 0x97, 0xE1, 0x90, 0xA2, 0xEC, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0xEC, +0xF0, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0x12, 0x58, 0xB1, 0xEF, 0x22, 0x90, 0xA2, 0x09, 0x74, 0x08, +0xF0, 0x90, 0xA2, 0x17, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x0B, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, +0x79, 0x09, 0x02, 0x5B, 0x9B, 0x90, 0xA1, 0xCF, 0x74, 0x0A, 0xF0, 0x90, 0xA1, 0xDD, 0x74, 0x06, +0xF0, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xD1, 0x12, 0x4F, 0x8E, 0x90, 0xA1, 0xD2, 0x12, 0x4F, 0xA4, +0x90, 0xA1, 0xD3, 0xF0, 0x12, 0x4C, 0x34, 0x90, 0xA1, 0xD4, 0x12, 0x4C, 0xE1, 0x90, 0xA1, 0xD5, +0x12, 0x6D, 0x4D, 0x90, 0xA1, 0xD6, 0x12, 0x97, 0x05, 0x02, 0x5B, 0x9B, 0x12, 0x06, 0x89, 0xF5, +0x51, 0x12, 0x4F, 0x8F, 0xF5, 0x54, 0x12, 0x4F, 0xA5, 0xF5, 0x55, 0x12, 0x4C, 0x34, 0xF5, 0x56, +0x12, 0x4C, 0xE2, 0xF5, 0x57, 0x12, 0x6D, 0x4E, 0xF5, 0x58, 0x12, 0x5F, 0xC6, 0xF5, 0x59, 0xE5, +0x51, 0x12, 0x45, 0xA8, 0x98, 0xBD, 0x00, 0x98, 0xC5, 0x01, 0x98, 0xCD, 0x02, 0x98, 0xD5, 0x03, +0x98, 0xDD, 0x04, 0x98, 0xE5, 0x05, 0x98, 0xED, 0x06, 0x00, 0x00, 0x99, 0x04, 0x75, 0x52, 0x02, +0x75, 0x53, 0x29, 0x80, 0x45, 0x75, 0x52, 0x06, 0x75, 0x53, 0x2A, 0x80, 0x3D, 0x75, 0x52, 0x01, +0x75, 0x53, 0x31, 0x80, 0x35, 0x75, 0x52, 0x01, 0x75, 0x53, 0x32, 0x80, 0x2D, 0x75, 0x52, 0x06, +0x75, 0x53, 0x33, 0x80, 0x25, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0x01, 0x45, 0x90, 0xA0, 0x8E, +0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xA3, 0xE5, 0x56, 0xF0, 0xA3, 0xE5, 0x57, 0xF0, 0xA3, +0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, +0xAD, 0x52, 0xAF, 0x53, 0x02, 0x58, 0xB1, 0x90, 0xA2, 0x4C, 0x74, 0x0B, 0xF0, 0x90, 0xA2, 0x5A, +0x74, 0x07, 0xF0, 0x90, 0xA2, 0x4E, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA2, +0x4F, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA2, 0x50, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA2, +0x51, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA2, 0x52, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA2, +0x53, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA2, 0x54, 0xF0, 0x80, 0x0D, 0x90, 0xA2, 0x4F, 0xED, +0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0x12, 0x60, 0x73, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x4C, 0x02, +0x5B, 0x9B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xCF, 0x12, +0x4F, 0x8E, 0x90, 0xA1, 0xD0, 0x12, 0x4F, 0xA4, 0x90, 0xA1, 0xD1, 0xF0, 0x12, 0x4C, 0x34, 0x90, +0xA1, 0xD2, 0x12, 0x4C, 0xE1, 0x90, 0xA1, 0xD3, 0x31, 0xF2, 0x90, 0xA0, 0x72, 0xE0, 0x44, 0x40, +0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xB4, 0x0C, 0x06, 0xE5, 0x6E, 0x70, 0x0E, 0x80, 0x00, 0x12, 0x97, +0x06, 0x7D, 0x07, 0x7F, 0x30, 0x12, 0x58, 0xB1, 0x8F, 0x51, 0x90, 0xA1, 0xD0, 0xE0, 0xB4, 0x0D, +0x0E, 0xE5, 0x51, 0x64, 0x01, 0x60, 0x05, 0x75, 0x6E, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x6E, 0xE5, +0x51, 0xB4, 0x01, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, 0xA1, 0xCF, 0xE0, +0xFB, 0xAD, 0x52, 0xE4, 0xFF, 0x31, 0x17, 0x7F, 0x04, 0x12, 0x97, 0xE1, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD1, 0x4D, 0x90, 0xA0, 0x99, 0xE0, 0x54, +0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F, 0xFF, 0xF0, 0x12, 0x06, +0x89, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA0, 0x99, 0x12, 0x6B, 0x35, +0xD1, 0xA8, 0x4E, 0x90, 0xA0, 0x99, 0x12, 0x4F, 0x8E, 0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA0, 0x9A, +0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0x12, +0x4F, 0x8E, 0xFE, 0x54, 0x30, 0xFD, 0xEF, 0x54, 0xCF, 0x4D, 0xFF, 0x90, 0xA0, 0x9A, 0x51, 0xD8, +0x4E, 0x12, 0x4F, 0xA4, 0x90, 0xA0, 0x9B, 0xF0, 0x12, 0x4C, 0x34, 0x90, 0xA0, 0x9C, 0x12, 0x4C, +0xE1, 0x90, 0xA0, 0x9D, 0xF0, 0x90, 0xA0, 0x9B, 0x51, 0xCD, 0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, +0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xA3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0x9C, +0x51, 0xCD, 0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xA5, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0x9D, 0x51, 0xCD, 0x90, 0xA0, 0xA7, 0xEE, 0xF0, 0xA3, +0xEF, 0xF0, 0x90, 0xA0, 0x99, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0xA0, 0x9E, 0x74, 0x01, 0xF0, 0xA3, +0xF0, 0xA3, 0x31, 0xF2, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x9E, +0x12, 0x60, 0x73, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0xE0, 0xFF, 0x7E, +0x00, 0x7C, 0x01, 0x7D, 0x40, 0x02, 0x07, 0x03, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xC4, 0xEE, 0xF0, 0xA3, 0x31, 0xF1, +0x90, 0xA2, 0xC4, 0xD1, 0xB8, 0xE0, 0x60, 0x24, 0xC3, 0x90, 0xA2, 0xC7, 0xE0, 0x94, 0xE8, 0x90, +0xA2, 0xC6, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, +0x80, 0x0C, 0x90, 0xA2, 0xC6, 0x12, 0x57, 0xDC, 0xD1, 0x46, 0x80, 0xD4, 0x7F, 0x01, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x90, 0xA2, 0xF8, 0x31, 0xF1, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, +0x02, 0x7F, 0x01, 0x90, 0xA2, 0xF8, 0xE0, 0x6F, 0x60, 0x35, 0xC3, 0x90, 0xA2, 0xFA, 0xE0, 0x94, +0x88, 0x90, 0xA2, 0xF9, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, +0x22, 0x90, 0xA2, 0xF9, 0x12, 0x57, 0xDC, 0xB1, 0xD5, 0xD3, 0x90, 0xA2, 0xFA, 0xE0, 0x94, 0x32, +0x90, 0xA2, 0xF9, 0xE0, 0x94, 0x00, 0x40, 0xC0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB9, 0x22, +0xF1, 0x1A, 0x7F, 0x08, 0x12, 0x46, 0xAB, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0x8D, +0xE4, 0xFF, 0x71, 0x23, 0x12, 0x5C, 0x0B, 0xE4, 0xFD, 0x12, 0x46, 0xC8, 0x90, 0x9F, 0xD4, 0xE0, +0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xD1, 0xE4, 0x90, 0x9F, 0xD5, 0xE0, 0x54, 0xEF, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x71, 0xB1, 0x71, 0x70, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0x9F, 0xD5, 0xE0, 0x44, 0x10, 0xF0, 0x12, 0x5C, 0x0B, 0x7D, 0x01, 0x12, 0x46, 0xC8, +0x90, 0x9F, 0xE4, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0x8D, 0x90, 0x9F, 0xDA, 0xE0, 0x60, 0x12, +0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, +0x90, 0xF0, 0x7F, 0x08, 0x12, 0x46, 0xAB, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0x8D, +0x7F, 0x01, 0x71, 0x23, 0x7F, 0x90, 0xD1, 0x9E, 0x7F, 0x90, 0x12, 0x46, 0x8D, 0x7F, 0x14, 0x7E, +0x00, 0x02, 0x3E, 0x50, 0x90, 0x9F, 0xDC, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0xF1, 0x39, +0xBF, 0x01, 0x02, 0x71, 0xA1, 0x22, 0x90, 0x9F, 0xD4, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x9F, 0xCF, +0xE0, 0xFF, 0x30, 0xE0, 0x0E, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xD1, 0xD7, 0xBF, 0x01, 0x06, 0x80, +0x02, 0x80, 0x00, 0x91, 0x04, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xCC, +0x12, 0x45, 0x9F, 0x7F, 0x96, 0x7E, 0x02, 0x51, 0xE1, 0xEF, 0x60, 0x4B, 0x90, 0x01, 0x17, 0xE0, +0xFE, 0x90, 0x01, 0x16, 0xD1, 0xAF, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA2, +0xCF, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA2, 0xCF, 0xE0, 0xFD, 0x90, 0x02, +0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0xCC, 0xB1, 0xCC, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, +0x91, 0x9C, 0x90, 0xA2, 0xCF, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA2, 0xCC, 0x12, 0x45, 0x96, 0xB1, +0x5A, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, +0x24, 0x00, 0x91, 0xED, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, 0x74, 0x00, 0x2D, 0x91, 0xED, +0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, +0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, +0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0xF5, 0x82, 0xE4, +0x34, 0xFB, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x9F, +0xB9, 0xE0, 0xFE, 0x90, 0x9F, 0xB8, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, +0x00, 0xEE, 0x64, 0x01, 0x60, 0x3F, 0xED, 0xD1, 0xCB, 0xFA, 0x7B, 0x01, 0x91, 0x36, 0x7F, 0x01, +0xEF, 0x60, 0x32, 0x90, 0x9F, 0xB8, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, +0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0xB8, 0xF0, 0x90, 0x9F, 0xB9, 0xE0, 0xFF, 0x90, 0x9F, +0xB8, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x07, 0x90, 0x9E, +0x92, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xC8, 0xEF, 0xF0, 0xA3, +0x12, 0x45, 0x9F, 0x90, 0xA2, 0xF4, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, +0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, +0x01, 0x90, 0xA2, 0xC9, 0x12, 0x45, 0x96, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, +0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0xA2, 0xC8, 0xE0, 0x24, 0x02, 0xF9, +0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0x96, +0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA2, 0xC9, 0xB1, +0xCC, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x12, 0x45, 0x96, 0x90, +0x00, 0x0E, 0x02, 0x06, 0xA2, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xE4, 0x90, 0xA1, 0xBF, +0xF0, 0xA3, 0xF0, 0xD1, 0x2D, 0xEF, 0x64, 0x01, 0x60, 0x3C, 0xC3, 0x90, 0xA1, 0xC0, 0xE0, 0x94, +0x88, 0x90, 0xA1, 0xBF, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, +0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x1E, 0x90, 0xA1, 0xBF, 0x12, 0x57, 0xDC, 0xB1, 0xD5, +0xD3, 0x90, 0xA1, 0xC0, 0xE0, 0x94, 0x32, 0x90, 0xA1, 0xBF, 0xE0, 0x94, 0x00, 0x40, 0xC4, 0x90, +0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xBD, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x90, 0x01, 0x9A, +0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xD1, 0x45, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, +0x40, 0x02, 0x7F, 0x01, 0x22, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x12, 0x06, 0x89, +0xFF, 0x54, 0x01, 0xFE, 0x22, 0xD1, 0x4D, 0x90, 0xA0, 0x3D, 0x12, 0x6D, 0x6E, 0x12, 0x4F, 0x8E, +0x90, 0xA0, 0x3E, 0x12, 0x4F, 0xA4, 0x90, 0xA0, 0x3F, 0xF0, 0xD1, 0xC1, 0x90, 0xA0, 0x3D, 0xE0, +0x54, 0x01, 0xFF, 0x02, 0x64, 0xC9, 0xD1, 0x4D, 0x90, 0xA0, 0x41, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, +0xEF, 0x54, 0x02, 0xD1, 0x97, 0x90, 0x9F, 0xD4, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0xA0, 0x41, +0xE0, 0x54, 0x01, 0xFF, 0x02, 0x60, 0x7B, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x22, 0x12, 0x46, +0xAB, 0xEF, 0x44, 0x01, 0xFD, 0x22, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x22, 0xE0, +0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, +0x22, 0x90, 0xA0, 0x3E, 0xE0, 0x14, 0x90, 0xA0, 0x40, 0xF0, 0x22, 0x75, 0xF0, 0x0F, 0xA4, 0x24, +0x22, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0x22, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, +0x02, 0x7F, 0x00, 0x22, 0x90, 0xA0, 0x46, 0xE0, 0x90, 0x01, 0x30, 0xF0, 0x90, 0xA0, 0x43, 0xE0, +0x90, 0x01, 0x39, 0xF0, 0x90, 0xA0, 0x44, 0xE0, 0x90, 0x01, 0x3A, 0xF0, 0x22, 0x90, 0x01, 0x01, +0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xD1, 0x45, 0x90, 0x01, 0x99, 0xE0, +0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x1A, 0xF0, +0x74, 0x9F, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x46, 0xAB, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x1A, 0x04, +0x90, 0x01, 0xC4, 0xF0, 0x74, 0x9F, 0xA3, 0xF0, 0x22, 0x90, 0xA0, 0x3D, 0xE0, 0xC3, 0x13, 0x20, +0xE0, 0x22, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x26, 0x90, 0x01, 0x00, 0xE0, 0x64, 0x3F, 0x70, 0x1E, +0x90, 0x02, 0x96, 0xE0, 0x70, 0x18, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x11, 0x90, 0x02, 0x86, +0xE0, 0x20, 0xE3, 0x0A, 0x90, 0xA0, 0x93, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xA9, 0x07, 0x90, 0x05, 0x63, 0xE0, 0xFE, 0x90, +0x05, 0x62, 0xD1, 0xAF, 0xAD, 0x07, 0xFC, 0x90, 0x05, 0x61, 0xE0, 0xFE, 0x90, 0x05, 0x60, 0xE0, +0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0xFE, 0x90, 0xA2, 0x79, 0x74, 0x17, 0xF0, 0x90, 0xA2, +0x87, 0x74, 0x06, 0xF0, 0x90, 0xA2, 0x7B, 0xE9, 0x12, 0x51, 0x82, 0xF1, 0xD2, 0x90, 0xA2, 0x7C, +0xF0, 0xAB, 0x07, 0xA3, 0xEB, 0xF0, 0xEE, 0xA3, 0xF0, 0xAF, 0x05, 0xA3, 0xEF, 0xF0, 0xAE, 0x04, +0xEE, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x79, 0x12, 0x5B, 0x9B, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xE0, 0x75, 0xF0, 0x0B, 0x90, 0xA0, 0xDB, 0x12, 0x45, 0x8A, 0xE0, 0x22, 0x90, 0xA2, 0x01, +0xEC, 0x12, 0x97, 0xC4, 0x90, 0xA2, 0x01, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x85, 0x2E, 0x90, +0xA2, 0x01, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D, 0x12, 0x87, 0x83, 0x44, 0x80, 0xF0, 0x74, 0x0D, +0x2D, 0x12, 0x87, 0x83, 0x54, 0xEF, 0x12, 0x87, 0x6C, 0xE0, 0x44, 0x02, 0x12, 0x87, 0x6C, 0xE0, +0x54, 0x03, 0xF0, 0x90, 0xA2, 0x03, 0xE0, 0xFF, 0x90, 0xA2, 0x01, 0xA3, 0xE0, 0xFE, 0x24, 0x2A, +0x11, 0x3B, 0x90, 0xA2, 0x04, 0xE0, 0xFF, 0x74, 0x2B, 0x2E, 0x11, 0x45, 0x74, 0x2C, 0x2E, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x90, +0xA1, 0xFA, 0x12, 0x97, 0xC3, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x23, 0x90, 0x05, 0x22, 0xE0, 0x90, +0xA1, 0xFF, 0xF0, 0x7D, 0x01, 0x12, 0x57, 0x51, 0xEF, 0x64, 0x01, 0x70, 0x05, 0x11, 0x8A, 0x12, +0x9F, 0xDD, 0x90, 0xA1, 0xFF, 0xE0, 0xFF, 0x7D, 0x02, 0x12, 0x54, 0xC6, 0x80, 0x05, 0x11, 0x8A, +0x12, 0x9F, 0xDD, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x9E, 0xCD, 0xE0, 0xFF, 0x90, +0xA2, 0xD7, 0x74, 0x01, 0xF0, 0x7B, 0x08, 0xFD, 0x12, 0x86, 0x16, 0x90, 0xA1, 0xFD, 0xEE, 0xF0, +0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xFA, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, +0xA2, 0x04, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x0A, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x72, +0x12, 0x08, 0xAA, 0x90, 0xA0, 0x5E, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFF, 0x90, 0xA0, 0x4A, 0xE0, +0x30, 0xE0, 0x3B, 0xA3, 0x12, 0x82, 0xB7, 0x90, 0xA0, 0x5D, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0xA0, +0x52, 0xF0, 0x90, 0xA0, 0x5F, 0xF0, 0xA3, 0xF0, 0x90, 0xA0, 0x5C, 0x04, 0xF0, 0x90, 0xA0, 0x3C, +0xE0, 0x60, 0x07, 0x7D, 0x05, 0x7F, 0x6F, 0x02, 0x54, 0xC6, 0x12, 0x66, 0x3A, 0x31, 0x0F, 0x54, +0x07, 0x20, 0xE0, 0x0A, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x31, 0x17, 0x22, 0x90, +0xA0, 0x4A, 0xE0, 0xFF, 0xC4, 0x13, 0x22, 0x90, 0xA0, 0x3B, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, +0x26, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x20, 0x90, 0x9E, 0xCA, 0xE0, 0xFF, 0x90, 0xA2, 0xD7, 0x74, +0x09, 0xF0, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x86, 0x16, 0x90, 0xA3, 0x0D, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xE4, 0xFF, 0x12, 0x66, 0x8C, 0xBF, 0x01, 0x11, +0x90, 0x9F, 0xD9, 0xE0, 0x60, 0x0B, 0x12, 0x6D, 0x67, 0x64, 0x02, 0x60, 0x02, 0x80, 0xB8, 0x31, +0x62, 0x22, 0x51, 0x34, 0x90, 0x9F, 0xDC, 0xE0, 0x64, 0x0C, 0x60, 0x07, 0x51, 0x93, 0x12, 0x66, +0x3A, 0x71, 0x71, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x63, 0x54, 0xC0, 0x70, +0x08, 0x31, 0xB9, 0x54, 0xFD, 0xF0, 0x02, 0x68, 0x4A, 0xE5, 0x63, 0x30, 0xE6, 0x17, 0x90, 0x9F, +0xD9, 0xE0, 0x64, 0x01, 0x70, 0x11, 0x12, 0x6D, 0x60, 0x64, 0x02, 0x60, 0x04, 0x31, 0x17, 0x80, +0x06, 0x31, 0x62, 0x80, 0x02, 0x31, 0xB9, 0xE5, 0x63, 0x90, 0x9F, 0xDD, 0x30, 0xE7, 0x05, 0x12, +0x50, 0x03, 0x80, 0x78, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x9F, 0xDD, 0xE0, 0x54, 0xFE, 0xF0, +0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA1, 0xEB, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x04, 0x31, +0xB9, 0x80, 0x55, 0xED, 0x30, 0xE6, 0x3F, 0x90, 0x9F, 0xD9, 0xE0, 0x64, 0x02, 0x70, 0x28, 0x90, +0x9F, 0xD4, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x9F, 0xDD, 0xE0, 0x44, 0x01, 0xF0, +0x80, 0x1C, 0x12, 0x6D, 0x67, 0x64, 0x01, 0x70, 0x1F, 0x90, 0x9F, 0xDD, 0xE0, 0x44, 0x04, 0xF0, +0x7F, 0x01, 0x12, 0xBA, 0x58, 0x80, 0x11, 0x12, 0x6D, 0x60, 0x64, 0x02, 0x60, 0x04, 0x31, 0x17, +0x80, 0x06, 0x31, 0x62, 0x80, 0x02, 0x31, 0xB9, 0x90, 0xA1, 0xEB, 0xE0, 0x90, 0x9F, 0xDD, 0x30, +0xE7, 0x05, 0x12, 0x50, 0x03, 0x80, 0x05, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x9F, 0xD4, 0xE0, +0x44, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xD4, 0x12, 0x89, 0xDA, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, +0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, +0xA2, 0xAB, 0xF0, 0x90, 0xA0, 0x38, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0xA2, 0xAC, 0x71, 0x78, +0x12, 0x50, 0x1B, 0x90, 0x9F, 0xD4, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0xA0, 0x4A, 0xE0, 0x20, +0xE0, 0x20, 0x90, 0x9F, 0xD9, 0xE0, 0x64, 0x01, 0x70, 0x18, 0x12, 0x8E, 0x0B, 0x12, 0x6D, 0x67, +0x60, 0x07, 0x51, 0x93, 0x12, 0x66, 0x3A, 0x80, 0xAB, 0x90, 0x9F, 0xDC, 0xE0, 0x70, 0x03, 0x12, +0x62, 0x56, 0x22, 0xE4, 0xFD, 0x7F, 0x0C, 0x02, 0x62, 0x5A, 0x51, 0xB7, 0xEF, 0x70, 0x02, 0x51, +0x6B, 0x22, 0x90, 0x9F, 0xD9, 0xE0, 0x64, 0x02, 0x60, 0x0C, 0x12, 0x6D, 0x67, 0x60, 0x07, 0x51, +0xB7, 0xEF, 0x70, 0x02, 0x51, 0x94, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, +0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, +0x12, 0x6B, 0x07, 0x30, 0xE0, 0x0B, 0x51, 0xE8, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x62, +0x5A, 0x51, 0xE8, 0x60, 0x02, 0x51, 0xA2, 0x22, 0x90, 0x9F, 0xD3, 0xE0, 0x64, 0x02, 0x22, 0x90, +0x9F, 0xD9, 0xE0, 0x70, 0x07, 0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, 0x11, 0x90, 0x9F, 0xCF, 0xE0, +0x30, 0xE0, 0x08, 0x12, 0x6B, 0x1D, 0xBF, 0x01, 0x04, 0x80, 0x97, 0x51, 0x6B, 0x22, 0x90, 0x9F, +0xCF, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, 0x9F, 0xD3, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, +0x01, 0x90, 0x9F, 0xD2, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, +0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x04, 0x71, 0xFC, 0x80, 0x1B, 0x51, 0xD0, 0x90, 0x9F, 0xD3, 0xE0, +0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0x9F, 0xD3, 0xE0, 0x70, 0x06, 0xFD, +0x7F, 0x04, 0x12, 0x62, 0x5A, 0x90, 0xA0, 0xAE, 0xE0, 0xFF, 0x30, 0xE0, 0x13, 0xC3, 0x13, 0x54, +0x07, 0x12, 0x77, 0xD5, 0xFE, 0x71, 0x99, 0xEE, 0x60, 0x03, 0xB4, 0x02, 0x03, 0x12, 0x50, 0x48, +0x22, 0x7D, 0x08, 0xE4, 0xFF, 0x02, 0x85, 0x7C, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, +0x22, 0xE4, 0xFF, 0x12, 0x66, 0x8C, 0xBF, 0x01, 0x0F, 0x90, 0x9F, 0xD9, 0xE0, 0x60, 0x09, 0x31, +0xB9, 0x54, 0x07, 0x70, 0x03, 0x12, 0x68, 0x4A, 0x22, 0x12, 0x51, 0x83, 0x12, 0x52, 0x0F, 0x20, +0xE0, 0x0C, 0xC3, 0x13, 0x30, 0xE0, 0x10, 0x90, 0xA0, 0xB0, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x51, +0x83, 0x12, 0x52, 0x0F, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xCF, 0xE0, 0xFF, 0x30, 0xE0, 0x04, +0x51, 0xE8, 0x60, 0x15, 0x90, 0x9F, 0xD9, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0x9F, +0xDC, 0xE0, 0x64, 0x02, 0x60, 0x03, 0x12, 0x65, 0x16, 0x22, 0x90, 0x9F, 0xD9, 0xE0, 0x60, 0x11, +0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x04, 0x51, 0x34, 0x80, 0x06, 0x12, 0x66, 0xB0, 0x12, 0x68, +0x4A, 0x90, 0xA0, 0xB0, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0x50, 0x48, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xCE, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0C, 0x12, 0x6B, +0x1D, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x69, 0xE1, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xB1, 0x19, 0xFF, 0x90, 0x9F, 0xCE, 0xF0, +0xBF, 0x01, 0x09, 0x12, 0x4F, 0x8F, 0x64, 0x01, 0x60, 0x1F, 0x80, 0x1B, 0xAB, 0x51, 0xAA, 0x52, +0xA9, 0x53, 0x12, 0x4F, 0x8F, 0x64, 0x01, 0x60, 0x10, 0x90, 0x9F, 0xCF, 0xE0, 0x20, 0xE0, 0x07, +0xE4, 0xFF, 0x12, 0x69, 0xE1, 0x80, 0x02, 0x71, 0xFC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, +0xCF, 0xE0, 0xFF, 0x30, 0xE0, 0x40, 0x90, 0x9F, 0xD3, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, +0x01, 0x90, 0x9F, 0xD2, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x26, +0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x04, 0x71, 0xFC, 0x80, 0x1C, 0x91, 0xF4, 0x90, 0x9F, 0xD3, 0xE0, +0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A, 0x90, 0x9F, 0xD3, 0xE0, 0xB4, 0x04, 0x06, +0xE4, 0xFD, 0xFF, 0x12, 0x62, 0x5A, 0x90, 0xA0, 0xAE, 0xE0, 0x30, 0xE0, 0x46, 0x90, 0xA1, 0x34, +0x12, 0x57, 0xDC, 0x12, 0x51, 0x83, 0x12, 0x77, 0xD5, 0x90, 0xA1, 0xF9, 0xF0, 0x90, 0xA0, 0xFE, +0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1B, 0xEF, 0x54, 0xEF, 0xF0, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x20, 0xE0, 0x1F, 0x12, 0x51, 0x83, 0x75, 0xF0, 0x0B, 0x12, 0x57, 0xCB, 0xEF, 0xF1, 0x0F, +0x02, 0x50, 0x1B, 0x90, 0xA1, 0xF9, 0xE0, 0xB4, 0x03, 0x09, 0x90, 0xA0, 0xB0, 0x74, 0x05, 0xF0, +0x12, 0x50, 0x48, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x1E, 0xF1, 0x1B, 0xF0, 0x90, 0x9F, 0xD4, +0x12, 0x84, 0xC9, 0x30, 0xE0, 0x02, 0xE1, 0x3F, 0xF1, 0x6B, 0x40, 0x0C, 0xE4, 0xFF, 0x12, 0x66, +0x8C, 0xBF, 0x01, 0x04, 0x12, 0x6C, 0x2D, 0xF0, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x02, +0x06, 0x89, 0xB1, 0x19, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x1B, 0x90, 0xA0, 0xAD, 0xE0, 0x54, +0xFE, 0xF0, 0x12, 0x66, 0x09, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x0F, +0xFF, 0x12, 0x57, 0x2A, 0xE1, 0x4B, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x4F, 0x8F, 0xFF, +0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0x12, 0x57, 0xF9, 0xEF, 0x12, 0x4F, 0xA4, 0x54, 0x03, 0xFF, +0xD1, 0xD9, 0x54, 0xFC, 0x12, 0x4F, 0xA3, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0x75, 0xF0, +0x0E, 0xD1, 0xDD, 0x54, 0xE3, 0x12, 0x4F, 0xA3, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0xD1, +0xDD, 0x54, 0x1F, 0x4F, 0x12, 0x4C, 0xE1, 0xD1, 0xE5, 0xE4, 0xFB, 0xD1, 0xD2, 0xA9, 0x53, 0x12, +0x6D, 0x4E, 0xD1, 0xE5, 0x7B, 0x01, 0xD1, 0xD2, 0xA9, 0x53, 0x12, 0x4C, 0x34, 0x12, 0x9E, 0x97, +0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xBA, 0x12, 0x45, 0x8A, +0xEF, 0xF0, 0x12, 0x4C, 0x34, 0xC4, 0xF1, 0x07, 0xED, 0x90, 0xA0, 0xBB, 0x12, 0x45, 0x8A, 0xEF, +0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70, 0x21, 0x90, 0xA0, 0xAF, 0xEF, 0x12, 0x5F, +0xC5, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA0, 0xAE, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, +0xF1, 0xF0, 0x90, 0xA0, 0xAD, 0xE0, 0x44, 0x01, 0xF0, 0xF1, 0x00, 0x22, 0x8F, 0x54, 0x8D, 0x55, +0xAE, 0x03, 0x74, 0x1F, 0xC3, 0x95, 0x54, 0x40, 0x0F, 0x90, 0xA1, 0xD3, 0xEE, 0xF0, 0xAB, 0x55, +0xE4, 0xFD, 0xD1, 0xCA, 0x24, 0xD4, 0x80, 0x40, 0x74, 0x3F, 0xC3, 0x95, 0x54, 0x40, 0x0F, 0x90, +0xA1, 0xD3, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x20, 0xD1, 0xC8, 0x24, 0x88, 0x80, 0x2A, 0x74, 0x5F, +0xC3, 0x95, 0x54, 0x40, 0x0F, 0x90, 0xA1, 0xD3, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x40, 0xD1, 0xC8, +0x24, 0xD0, 0x80, 0x14, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x25, 0x90, 0xA1, 0xD3, 0xEE, 0xF0, +0xAB, 0x55, 0x7D, 0x60, 0xD1, 0xC8, 0x24, 0x84, 0xFD, 0xE4, 0x34, 0x04, 0xFC, 0x75, 0xF0, 0x0E, +0xE5, 0x55, 0xD1, 0xFA, 0x75, 0xF0, 0x03, 0xEE, 0x12, 0x45, 0x8A, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, +0x22, 0xC3, 0xEF, 0x9D, 0xF5, 0x56, 0xC3, 0x94, 0x08, 0x50, 0x1C, 0xE4, 0xF5, 0x57, 0xD1, 0xED, +0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0xD3, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, +0x45, 0x8A, 0xE5, 0x56, 0xF0, 0x80, 0x3E, 0xE5, 0x56, 0xC3, 0x94, 0x10, 0x50, 0x09, 0x75, 0x57, +0x01, 0xE5, 0x56, 0x24, 0xF8, 0x80, 0x17, 0xE5, 0x56, 0xC3, 0x94, 0x18, 0x50, 0x09, 0x75, 0x57, +0x02, 0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8, 0xFF, 0xD1, +0xED, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0xD3, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, +0x12, 0x45, 0x8A, 0xEF, 0xF0, 0xAF, 0x57, 0x22, 0xAF, 0x54, 0xD1, 0x61, 0x90, 0xA1, 0xCF, 0xEF, +0xF0, 0x22, 0xB1, 0xEC, 0xAB, 0x51, 0xAA, 0x52, 0x22, 0x75, 0xF0, 0x0E, 0xED, 0x90, 0xA0, 0xB2, +0x12, 0x45, 0x8A, 0xE0, 0x22, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x22, 0x75, 0xF0, 0x0E, +0xEB, 0x90, 0xA0, 0xB5, 0x02, 0x45, 0x8A, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xB3, 0x02, 0x45, 0x8A, +0x7D, 0x20, 0xE4, 0xFF, 0x02, 0x66, 0x25, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x22, 0xF0, +0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, +0x74, 0x02, 0x22, 0x12, 0x67, 0xA8, 0x70, 0x16, 0x90, 0x9F, 0xD9, 0xE0, 0x60, 0x10, 0xF1, 0x18, +0xF0, 0x90, 0x9F, 0xD4, 0xE0, 0xF1, 0x40, 0x54, 0x07, 0x70, 0x03, 0x12, 0x68, 0x4A, 0x22, 0xEF, +0x54, 0xFB, 0xF0, 0x90, 0x9F, 0xDD, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x8D, 0x7D, +0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xAD, 0x02, 0x08, 0xAA, 0x12, 0x67, 0xA8, 0x70, 0x0B, 0x90, +0x9F, 0xD9, 0xE0, 0x60, 0x05, 0xF1, 0x18, 0x12, 0x50, 0x06, 0x22, 0x90, 0x9F, 0xE2, 0xE0, 0x04, +0xF0, 0x90, 0x9F, 0xDD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA0, 0x36, 0xE0, 0xFF, 0x90, 0x9F, 0xE2, +0xE0, 0xD3, 0x9F, 0x22, 0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, 0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, +0x9F, 0xCF, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x71, 0xFC, 0x12, 0x8E, 0xCD, 0x02, 0x80, +0xE3, 0x90, 0xA0, 0xAD, 0xE0, 0x30, 0xE0, 0x20, 0xA3, 0xE0, 0xC3, 0xF1, 0x07, 0x12, 0x57, 0xF3, +0xE0, 0xFE, 0x30, 0xE0, 0x13, 0x75, 0xF0, 0x0E, 0xEF, 0x12, 0x57, 0xF3, 0xEE, 0x54, 0xFE, 0x12, +0x51, 0x7C, 0xFD, 0x7F, 0x02, 0x12, 0x53, 0x66, 0x22, 0x90, 0xA2, 0x0A, 0xEF, 0xF0, 0x90, 0xA0, +0x8D, 0xE0, 0x70, 0x4F, 0x12, 0x5A, 0xE3, 0xEE, 0x54, 0x0F, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA2, +0x0B, 0x12, 0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x12, 0xA8, 0x96, 0x70, 0x05, 0x90, 0xA0, 0x6B, 0x80, +0x1C, 0xE4, 0xFF, 0xFE, 0x12, 0xA8, 0x98, 0x70, 0x0A, 0x90, 0xA0, 0x6B, 0x04, 0xF0, 0xE4, 0xA3, +0xF0, 0x80, 0x4C, 0xE4, 0xFF, 0x11, 0x96, 0x70, 0x09, 0x90, 0xA0, 0x6B, 0x04, 0xF0, 0xA3, 0xF0, +0x80, 0x3D, 0xE4, 0x7F, 0x80, 0xFE, 0x11, 0x98, 0x70, 0x35, 0x90, 0xA0, 0x6B, 0xF0, 0xA3, 0x04, +0xF0, 0x80, 0x2C, 0x11, 0xAB, 0x54, 0x02, 0x11, 0xB4, 0x60, 0x08, 0x90, 0xA0, 0x6B, 0x74, 0x01, +0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA0, 0x6B, 0xF0, 0x7F, 0x30, 0x11, 0xAD, 0x54, 0x01, 0x11, 0xB4, +0x60, 0x07, 0xE4, 0x90, 0xA0, 0x6C, 0xF0, 0x80, 0x06, 0x90, 0xA0, 0x6C, 0x74, 0x01, 0xF0, 0x90, +0xA0, 0x65, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x11, 0x7F, 0xFF, 0x12, 0x54, 0xC6, 0x12, 0x47, 0xEB, +0x90, 0x07, 0x78, 0xE0, 0x90, 0xA0, 0x6A, 0xF0, 0x71, 0xD9, 0x12, 0x48, 0x62, 0x90, 0xA2, 0x0A, +0xE0, 0xFD, 0x70, 0x02, 0x80, 0x1C, 0xED, 0xB4, 0x01, 0x06, 0x11, 0xA4, 0x44, 0x20, 0xF0, 0x22, +0x90, 0xA2, 0x0A, 0xE0, 0xFD, 0xB4, 0x02, 0x06, 0x11, 0xA4, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4, +0x03, 0x03, 0x11, 0xA4, 0xF0, 0x22, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA2, 0x0B, 0x12, 0x45, 0x7E, +0xC3, 0x02, 0x45, 0x61, 0x90, 0xA0, 0x65, 0xE0, 0x54, 0x1F, 0x22, 0x7F, 0x2C, 0x7E, 0x09, 0x12, +0x37, 0x4E, 0xEF, 0x22, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA2, 0x0B, 0x12, 0x08, 0x6D, 0x90, +0xA2, 0x0B, 0x12, 0x45, 0x72, 0xEC, 0x4D, 0x4E, 0x4F, 0x22, 0xE4, 0x90, 0xA1, 0xEB, 0xF0, 0xA3, +0xF0, 0xA3, 0x12, 0x5D, 0x27, 0x12, 0x45, 0x54, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, +0x90, 0x05, 0x62, 0x12, 0x5D, 0x41, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, +0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0x12, +0x5D, 0x41, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, +0x45, 0x54, 0x90, 0xA0, 0x28, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0x2C, 0x12, 0x45, 0x72, 0x90, 0xA0, +0x28, 0x11, 0x9D, 0x40, 0x3F, 0x90, 0x9F, 0xD4, 0xE0, 0x90, 0xA0, 0x2C, 0x30, 0xE0, 0x0F, 0x51, +0x70, 0x90, 0x9F, 0xF6, 0xE0, 0x24, 0x04, 0x2F, 0xFF, 0x90, 0xA0, 0x30, 0x80, 0x05, 0x51, 0x70, +0x90, 0xA0, 0x31, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0x90, 0xA1, 0xEC, 0xF0, 0x90, 0xA1, 0xEC, 0xE0, +0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x0E, 0x74, 0xF7, 0x2F, 0x51, 0xB4, 0xE0, 0x04, 0xF0, 0x90, 0x9F, +0xEF, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xEF, 0xE0, 0xFF, 0xD3, 0x90, 0xA0, 0x33, 0xE0, 0x9F, 0x90, +0xA0, 0x32, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x41, 0x3C, 0x51, 0x4E, 0x51, 0x45, 0x50, 0x1C, 0x51, +0x58, 0x90, 0xA1, 0xED, 0xE0, 0xD3, 0x9F, 0x40, 0x0A, 0x90, 0xA1, 0xEB, 0xE0, 0x90, 0xA1, 0xEE, +0xF0, 0x80, 0x08, 0x90, 0xA1, 0xEB, 0xE0, 0x04, 0xF0, 0x80, 0xE0, 0x51, 0x4E, 0x51, 0x45, 0x50, +0x2C, 0x51, 0x58, 0xC3, 0x90, 0xA0, 0x33, 0xE0, 0x9F, 0xFF, 0x90, 0xA0, 0x32, 0xE0, 0x94, 0x00, +0xFE, 0x90, 0xA1, 0xED, 0xE0, 0xD3, 0x9F, 0xE4, 0x9E, 0x40, 0x0A, 0x90, 0xA1, 0xEB, 0xE0, 0x90, +0xA1, 0xEF, 0xF0, 0x80, 0x08, 0x90, 0xA1, 0xEB, 0xE0, 0x04, 0xF0, 0x80, 0xD0, 0x90, 0xA1, 0xEE, +0xE0, 0x90, 0x9F, 0xF4, 0xF0, 0x90, 0xA1, 0xEF, 0xE0, 0x90, 0x9F, 0xF5, 0x51, 0x3D, 0x94, 0x0A, +0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x9F, 0xEC, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x9F, 0xEC, +0x51, 0x3D, 0x74, 0x0A, 0x9F, 0x90, 0x9F, 0xEB, 0xF0, 0x90, 0x9F, 0xF4, 0xE0, 0xFF, 0xA3, 0xE0, +0xC3, 0x9F, 0x90, 0x9F, 0xF2, 0xF0, 0x90, 0x9F, 0xD4, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0xA0, 0x30, +0x80, 0x03, 0x90, 0xA0, 0x31, 0xE0, 0xFF, 0x90, 0x9F, 0xF2, 0xE0, 0x2F, 0x04, 0xF0, 0x90, 0x9F, +0xF2, 0xE0, 0xC3, 0x94, 0x0A, 0x50, 0x03, 0x74, 0x0A, 0xF0, 0x90, 0x9F, 0xF2, 0xE0, 0x24, 0x02, +0xF0, 0x71, 0xC0, 0x74, 0x03, 0xF0, 0x51, 0xBC, 0xE4, 0xFF, 0x51, 0x8D, 0x22, 0xF0, 0x90, 0x9F, +0xF4, 0xE0, 0xFF, 0xC3, 0x22, 0x90, 0xA1, 0xEB, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x22, 0xE4, 0x90, +0xA1, 0xED, 0xF0, 0x90, 0xA1, 0xEB, 0xF0, 0x22, 0x74, 0xF7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, +0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA1, 0xED, 0xE0, 0x2F, 0xF0, 0x90, 0xA0, 0x34, 0xE0, 0xFF, 0x22, +0x12, 0x45, 0x7E, 0x90, 0xA0, 0x28, 0x12, 0x45, 0x72, 0x12, 0x45, 0x39, 0x78, 0x0A, 0x12, 0x08, +0x47, 0x90, 0x9F, 0xF1, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFF, 0x22, 0xE4, 0xFE, 0x74, +0xF7, 0x2E, 0x51, 0xB4, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x2D, 0xF4, 0xE4, 0x90, 0x9F, 0xF0, 0xF0, +0x90, 0x9F, 0xEF, 0xF0, 0x90, 0x9F, 0xF3, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0xA3, 0x74, 0x2D, 0xF0, +0xE4, 0xA3, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0x90, 0x9F, 0xD5, 0x12, 0x4F, 0xD1, 0x30, 0xE0, 0x02, 0x61, 0x75, +0x90, 0x9F, 0xD4, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x9F, 0xF6, 0xE0, 0x24, 0x04, 0x90, 0x9F, 0xEE, +0xF0, 0x90, 0x9F, 0xF6, 0xE0, 0x24, 0x03, 0x90, 0x9F, 0xED, 0xF0, 0x80, 0x0D, 0x90, 0x9F, 0xEE, +0x74, 0x02, 0xF0, 0x90, 0x9F, 0xED, 0x14, 0xF0, 0x0B, 0x0B, 0x90, 0x9F, 0xED, 0xE0, 0xFA, 0x90, +0x9F, 0xEC, 0xE0, 0xD3, 0x9A, 0x50, 0x0E, 0x90, 0x9F, 0xE1, 0xEB, 0xF0, 0x90, 0x9F, 0xEE, 0xE0, +0xC3, 0x9D, 0x2C, 0x80, 0x11, 0xC3, 0xED, 0x9A, 0x2B, 0x90, 0x9F, 0xE1, 0xF0, 0x90, 0x9F, 0xED, +0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x9F, 0xF1, 0xF0, 0x90, 0x9F, 0xEE, 0xE0, 0xFF, 0x24, +0x0A, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x9F, 0xF1, 0x71, 0x81, 0x40, 0x04, 0xEF, 0x24, 0x0A, 0xF0, +0x90, 0x9F, 0xF1, 0xE0, 0xFF, 0x24, 0x23, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x9F, 0xE1, 0x71, 0x81, +0x40, 0x04, 0xEF, 0x24, 0x23, 0xF0, 0x90, 0x9F, 0xF1, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x9F, 0xE5, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xE0, 0x6F, 0x70, 0x01, 0xE4, 0x60, 0x02, 0x71, +0xE2, 0x71, 0xD1, 0x80, 0x07, 0x90, 0x9F, 0xD6, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x22, 0x71, 0xEC, 0x90, 0xA1, +0xF9, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x61, +0xC6, 0x90, 0xA1, 0xF9, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, +0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x71, 0xC0, 0x74, 0x02, 0xF0, 0x41, 0xBC, +0x90, 0x9F, 0xEB, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x9F, 0xF2, 0xE0, 0xFB, 0x90, 0xA2, 0xE7, +0x22, 0x90, 0x9F, 0xD6, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0xA0, 0x8C, 0xE0, 0xFF, 0xE4, 0xFD, +0x22, 0xF0, 0x90, 0x9F, 0xE5, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0xFA, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x46, 0xAB, 0x90, 0xA1, 0xFA, 0xEF, 0xF0, 0x7F, +0x83, 0x12, 0x46, 0xAB, 0xAE, 0x07, 0x90, 0xA1, 0xFA, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, +0x90, 0xA1, 0xFC, 0xE0, 0x94, 0x64, 0x90, 0xA1, 0xFB, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, +0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0xFA, 0xE0, 0xFF, 0x22, 0x90, 0xA1, 0xFB, 0x12, 0x57, +0xDC, 0x80, 0xC2, 0x90, 0xA0, 0x4D, 0x12, 0x5F, 0xDF, 0x20, 0xE0, 0x1E, 0x90, 0xFD, 0x62, 0xE0, +0x30, 0xE0, 0x17, 0xE0, 0x90, 0xA2, 0x09, 0x30, 0xE1, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, +0x02, 0xF0, 0x90, 0xA2, 0x09, 0xE0, 0xFF, 0x12, 0xA7, 0xC9, 0x22, 0x90, 0xA0, 0x65, 0xE0, 0x54, +0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0xA0, 0x6A, 0xE0, 0xFF, 0x12, 0x88, 0x32, 0x90, 0xA0, 0x6B, +0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x48, 0x62, 0x90, 0x9F, 0xD9, 0xE0, 0x70, 0x0A, 0x90, 0xA0, +0x3D, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x66, 0x38, 0x22, 0x12, 0x8B, 0xBC, 0x90, 0xA0, 0x65, 0xE0, +0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, 0xEF, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9E, 0x40, 0x02, 0x80, +0xBA, 0x90, 0xA0, 0x65, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, +0x04, 0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, +0x89, 0x25, 0x51, 0x90, 0x9E, 0xC9, 0x12, 0x4F, 0x8E, 0x25, 0x51, 0x90, 0x9E, 0xCA, 0x12, 0x4F, +0xA4, 0x25, 0x51, 0x90, 0x9E, 0xCB, 0xF0, 0x12, 0x4C, 0x34, 0x25, 0x51, 0x90, 0x9E, 0xCC, 0x12, +0x4C, 0xE1, 0x25, 0x51, 0x90, 0x9E, 0xCD, 0x12, 0x6D, 0x4D, 0x25, 0x51, 0x90, 0x9E, 0xCE, 0x12, +0x5F, 0xC5, 0x25, 0x51, 0x90, 0x9E, 0xCF, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x9F, 0xBC, +0xF0, 0xBF, 0x01, 0x08, 0x12, 0x97, 0x0D, 0xE4, 0x90, 0x9F, 0xBC, 0xF0, 0x22, 0x12, 0x06, 0x89, +0x54, 0x01, 0xFF, 0x90, 0xA1, 0x3B, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x4F, 0xA5, 0xFF, +0x30, 0xE0, 0x1F, 0x12, 0x06, 0x89, 0x90, 0xA0, 0x36, 0x12, 0x4F, 0x8E, 0x90, 0xA0, 0x37, 0xF0, +0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x12, 0x4C, 0x34, 0x90, 0xA0, 0x39, +0xF0, 0x22, 0x90, 0xA0, 0x36, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE0, 0x54, 0x01, +0x44, 0x28, 0xF0, 0xA3, 0x74, 0x07, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x9F, 0xE4, 0xF0, 0x22, +0x12, 0x06, 0x89, 0x90, 0xA0, 0x3C, 0xF0, 0x60, 0x2C, 0x90, 0xA0, 0x4A, 0xE0, 0x20, 0xE0, 0x25, +0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x62, 0x5A, 0x12, 0x8F, 0xD6, 0x13, 0x30, 0xE0, 0x17, 0xEF, 0x13, +0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0E, 0xB1, 0x96, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x02, +0x7F, 0x09, 0x12, 0x88, 0x32, 0x22, 0x90, 0xA0, 0x3B, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, +0xA0, 0x72, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x58, 0xB1, 0x8F, 0x51, 0xE5, +0x51, 0xB4, 0x03, 0x0A, 0xE4, 0xFF, 0x12, 0x5B, 0x15, 0x7F, 0x04, 0x12, 0x97, 0xE1, 0x22, 0x90, +0xA0, 0x72, 0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x58, 0xB1, 0x90, 0xA1, 0xCF, +0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x73, 0xE0, 0x44, 0x01, +0xF0, 0x7D, 0x01, 0x7F, 0x28, 0xB1, 0xCA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xCF, 0x12, +0x45, 0x9F, 0x90, 0xA2, 0xF2, 0xE0, 0x70, 0x08, 0xD1, 0x40, 0x90, 0xA2, 0xF2, 0x74, 0x01, 0xF0, +0x12, 0x6D, 0x5A, 0x12, 0x06, 0x89, 0xFF, 0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, +0x90, 0xA0, 0x84, 0x12, 0x45, 0x72, 0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, +0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, 0xAD, 0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, +0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0x90, 0xA0, 0x80, 0x02, 0x08, 0x6D, +0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0x84, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, +0x90, 0xA0, 0x8C, 0x12, 0x4F, 0x8E, 0x90, 0xA0, 0x8D, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, +0xD1, 0xAA, 0x54, 0xFD, 0x4F, 0xF0, 0xE0, 0xC3, 0x13, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xE6, 0xF0, +0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE0, 0x29, 0x12, 0x58, 0x98, 0x64, 0x04, 0x70, 0x20, +0x90, 0xA0, 0x93, 0xE0, 0x30, 0xE0, 0x02, 0x80, 0x19, 0x90, 0xFD, 0x62, 0xE0, 0xB4, 0xAD, 0x0E, +0xA3, 0xE0, 0xB4, 0x35, 0x09, 0xD1, 0xA2, 0x90, 0x01, 0xE5, 0x74, 0xDF, 0xF0, 0x22, 0x80, 0x00, +0x80, 0x41, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x25, 0xE0, 0xFF, 0x90, 0xA0, 0x6F, +0xE0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0xD1, 0xAA, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, +0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x80, 0x12, 0x90, 0xA0, 0x93, 0xE0, 0x20, 0xE0, 0x02, +0xD1, 0xD3, 0x22, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x22, 0x90, 0x07, 0x65, 0xE0, 0x44, +0x18, 0xF0, 0x22, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, +0xFF, 0x90, 0xA0, 0xAB, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x30, 0xE0, 0x55, 0x90, 0x00, 0x40, 0xE0, +0x54, 0xBF, 0x44, 0xA0, 0xFD, 0x7F, 0x40, 0x12, 0x46, 0x8D, 0x90, 0x00, 0x41, 0xE0, 0x44, 0x04, +0xFD, 0x7F, 0x41, 0x12, 0x46, 0x8D, 0x90, 0x00, 0x6A, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x6A, 0x12, +0x46, 0x8D, 0x90, 0x07, 0x6E, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0x12, 0xF0, 0x90, 0x07, 0x78, 0xE0, +0x54, 0xF2, 0x44, 0x02, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x03, 0xF0, 0x90, 0x07, 0x65, 0xE0, +0x54, 0xF5, 0xF0, 0x90, 0x05, 0x23, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0x7F, 0x66, 0x12, 0x46, +0x8D, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0x21, 0xE0, 0xFF, 0x90, 0x9F, +0x20, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x3A, 0x90, 0x9F, +0x20, 0xE0, 0xFE, 0xF1, 0xAD, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xD1, 0xF9, 0x74, +0x9E, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x6D, 0xA7, 0x90, 0x9F, 0x20, 0x12, 0x7F, +0xE0, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0x20, 0xF0, 0x12, 0x7D, +0x4B, 0x90, 0x9E, 0x92, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x08, +0x90, 0x9E, 0xD0, 0x02, 0x45, 0x8A, 0xE4, 0x90, 0x9F, 0xB8, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0x20, +0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x01, 0xEF, 0xF0, +0xA3, 0xED, 0xF0, 0x7D, 0x44, 0x12, 0x57, 0xC5, 0x90, 0xA3, 0x02, 0xE0, 0x90, 0xA3, 0x01, 0xB4, +0x01, 0x0D, 0xE0, 0x75, 0xF0, 0x10, 0x12, 0x75, 0x67, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x0B, 0xE0, +0x75, 0xF0, 0x10, 0x12, 0x75, 0x67, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x66, 0x3A, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xE4, 0xFD, 0x80, 0xBE, 0x7D, 0x01, 0x80, 0xBA, 0x90, 0xA2, 0xF5, 0x12, 0x45, 0x9F, +0xE4, 0xFF, 0x90, 0xA2, 0xF5, 0x12, 0x45, 0x96, 0x8F, 0x82, 0x12, 0x95, 0x72, 0xFE, 0x74, 0xF0, +0x2F, 0x11, 0x2B, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE8, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x02, +0xF5, 0x83, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x90, 0x01, +0x30, 0x12, 0x60, 0x72, 0x90, 0x01, 0x38, 0x12, 0x60, 0x73, 0xFD, 0x7F, 0x50, 0x12, 0x46, 0x8D, +0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x46, 0x8D, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x46, 0x8D, 0xE4, 0xFD, +0x7F, 0x53, 0x02, 0x46, 0x8D, 0x11, 0x3E, 0x11, 0xD7, 0x11, 0x93, 0x11, 0xB2, 0xE4, 0xF5, 0x0D, +0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0x12, 0x46, 0x8D, 0xAD, 0x0E, +0x7F, 0x51, 0x12, 0x46, 0x8D, 0xAD, 0x0F, 0x7F, 0x52, 0x12, 0x46, 0x8D, 0xAD, 0x10, 0x7F, 0x53, +0x02, 0x46, 0x8D, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x32, 0x90, +0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, +0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x43, 0x20, +0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, +0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x34, 0x74, 0xFF, 0x12, 0x60, 0x73, 0x90, +0x01, 0x3C, 0x12, 0x60, 0x73, 0xFD, 0x7F, 0x54, 0x12, 0x46, 0x8D, 0x7D, 0xFF, 0x7F, 0x55, 0x12, +0x46, 0x8D, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46, 0x8D, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x46, 0x8D, +0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA1, 0xE9, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, +0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, +0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x11, 0x3E, 0x90, 0x00, 0x03, 0xE0, +0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x46, 0x8D, 0x80, 0xFE, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, +0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x48, 0xF0, +0x74, 0xB1, 0xA3, 0xF0, 0x90, 0xA0, 0xAC, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, +0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x74, 0x48, +0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xB1, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xE4, 0x74, +0x23, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, +0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, +0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, +0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, +0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, +0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, +0x91, 0xDF, 0x22, 0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, +0x90, 0x9F, 0xD9, 0xE0, 0x60, 0x03, 0x12, 0x6B, 0xD2, 0x12, 0x54, 0x0D, 0x02, 0x50, 0x48, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x99, 0xE0, 0x30, 0xE0, 0x21, 0x90, 0xA0, 0x9E, +0xE0, 0xB4, 0x01, 0x0D, 0xA3, 0xE0, 0xB4, 0x01, 0x15, 0x74, 0x02, 0xF0, 0x12, 0x89, 0xEB, 0x80, +0x0D, 0x90, 0xA0, 0x9E, 0xE0, 0xB4, 0x02, 0x06, 0x74, 0x03, 0xF0, 0x12, 0x89, 0x06, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0xEF, 0x90, 0x02, 0x86, 0x60, 0x06, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x04, 0xE0, +0x54, 0xFB, 0xF0, 0x90, 0x9E, 0x97, 0xED, 0xF0, 0x22, 0xE4, 0xF5, 0x5D, 0x12, 0x7C, 0x69, 0xE0, +0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3, 0x94, 0x11, 0x40, 0x22, 0x80, 0x18, 0xEE, 0xB4, 0x01, 0x08, +0xED, 0xC3, 0x94, 0x0A, 0x40, 0x16, 0x80, 0x0C, 0x12, 0x7C, 0x69, 0xE0, 0x70, 0x0B, 0xED, 0xC3, +0x94, 0x03, 0x40, 0x08, 0x75, 0x5D, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x5D, 0xAF, 0x5D, 0x22, 0x8F, +0x52, 0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, 0xEF, 0x12, 0x4E, 0x2E, 0xC4, 0x54, 0x03, 0x90, +0xA1, 0xD4, 0xF0, 0x90, 0xA1, 0xD2, 0x60, 0x09, 0x74, 0x32, 0xF0, 0xA3, 0x74, 0x2F, 0xF0, 0x80, +0x07, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40, 0x0A, 0x75, +0xF0, 0x04, 0xE5, 0x52, 0x12, 0x4F, 0xFD, 0x80, 0x20, 0xE5, 0x53, 0xD3, 0x94, 0x1E, 0x40, 0x05, +0x90, 0xA1, 0xD2, 0x80, 0x14, 0xE5, 0x53, 0xD3, 0x94, 0x14, 0x40, 0x05, 0x90, 0xA1, 0xD3, 0x80, +0x08, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x12, 0x95, 0x59, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4, 0xFB, +0xAF, 0x52, 0x02, 0x76, 0x59, 0xEF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x0B, 0x05, 0x90, 0xA0, +0x90, 0x80, 0x1F, 0xEF, 0x64, 0x12, 0x60, 0x04, 0xEF, 0xB4, 0x0A, 0x05, 0x90, 0xA0, 0x91, 0x80, +0x11, 0xEF, 0x64, 0x11, 0x60, 0x04, 0xEF, 0xB4, 0x09, 0x05, 0x90, 0xA0, 0x92, 0x80, 0x03, 0x90, +0xA0, 0x8F, 0xE0, 0xF5, 0x5F, 0xAF, 0x5F, 0x22, 0x8D, 0x5D, 0x90, 0xA0, 0x8E, 0xE0, 0x60, 0x44, +0x51, 0xE5, 0x8F, 0x5E, 0xE5, 0x5E, 0xC3, 0x94, 0x80, 0x50, 0x27, 0xE5, 0x5E, 0x94, 0x1B, 0x40, +0x02, 0x80, 0x12, 0xED, 0x25, 0x5E, 0xFF, 0xE4, 0x33, 0xFE, 0xD3, 0xEF, 0x94, 0x1B, 0xEE, 0x64, +0x80, 0x94, 0x80, 0x40, 0x05, 0x75, 0x5D, 0x1B, 0x80, 0x1A, 0xE5, 0x5E, 0x25, 0x5D, 0xF5, 0x5D, +0x80, 0x12, 0xC3, 0xE4, 0x95, 0x5E, 0xF5, 0x5E, 0xED, 0xD3, 0x95, 0x5E, 0x40, 0x06, 0xE5, 0x5D, +0x95, 0x5E, 0xF5, 0x5D, 0xAF, 0x5D, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, +0x30, 0x12, 0x97, 0xC3, 0x90, 0xA2, 0x93, 0xE0, 0x90, 0x04, 0x33, 0xF0, 0x90, 0xA2, 0x94, 0xE0, +0x90, 0x04, 0x34, 0xF0, 0x90, 0xA2, 0x95, 0xE0, 0x90, 0x04, 0x35, 0xF0, 0x90, 0xA2, 0x96, 0xE0, +0x90, 0x04, 0x36, 0xF0, 0x90, 0xA2, 0x97, 0xE0, 0x90, 0x04, 0x37, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0xEF, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x05, 0x22, 0xD3, 0xEF, 0x94, +0xC8, 0xEE, 0x94, 0x00, 0x7F, 0x00, 0x40, 0x02, 0x7F, 0x02, 0x22, 0xE4, 0x90, 0xA1, 0xE4, 0xF0, +0x90, 0xA1, 0xE4, 0xE0, 0xFF, 0xC3, 0x94, 0x03, 0x50, 0x5E, 0x74, 0x9E, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x0A, 0x50, 0x02, 0x80, 0x02, 0x7F, 0x0A, 0xAE, +0x07, 0xEF, 0x24, 0x02, 0x90, 0xA1, 0xE3, 0xF0, 0x90, 0xA1, 0xD5, 0x74, 0x0E, 0xF0, 0x90, 0xA1, +0xD7, 0x74, 0x01, 0xF0, 0x91, 0x29, 0x90, 0xA1, 0xD8, 0xF0, 0xE4, 0xFF, 0xEF, 0xC3, 0x9E, 0x50, +0x16, 0x91, 0x29, 0x2F, 0x91, 0x38, 0xE0, 0xFD, 0x74, 0xD9, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, +0xF5, 0x83, 0xED, 0xF0, 0x0F, 0x80, 0xE5, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xD5, 0x12, 0x97, 0xDC, +0x90, 0xA1, 0xE4, 0xE0, 0x04, 0xF0, 0x80, 0x98, 0x22, 0x90, 0xA1, 0xE4, 0xE0, 0x24, 0x9B, 0xF5, +0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x22, 0x24, 0xB5, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, +0x83, 0x22, 0x12, 0x4F, 0x8F, 0xF5, 0x51, 0x12, 0x4F, 0xA5, 0xF5, 0x52, 0x12, 0x06, 0x89, 0xF5, +0x53, 0x90, 0x9E, 0x99, 0xF0, 0xE5, 0x51, 0x60, 0x06, 0xFD, 0xAF, 0x52, 0x12, 0x96, 0x06, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x6C, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, +0xA2, 0x6A, 0x74, 0x0C, 0xF0, 0x90, 0xA2, 0x78, 0x74, 0x02, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, +0x6A, 0x12, 0x97, 0xDC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0xED, 0x60, 0x3A, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x4F, 0x95, 0xF0, 0x75, 0xF0, +0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x4F, 0x95, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, +0x12, 0x4F, 0x95, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x07, 0x12, 0x4F, 0x95, 0xF0, 0x75, +0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, 0x12, 0x4F, 0x95, 0x91, 0xE0, 0xE4, 0xF0, 0x12, 0x7F, 0x90, +0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x12, 0x7F, 0x90, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, +0xF0, 0x74, 0x91, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x09, 0xEF, 0xF0, 0x7F, 0x8F, 0x12, 0x46, 0xAB, 0xEF, 0x30, 0xE6, +0x41, 0x7F, 0x8D, 0x12, 0x46, 0xAB, 0xEF, 0x64, 0x01, 0x70, 0x37, 0x90, 0xA3, 0x0A, 0xF0, 0x90, +0xA3, 0x0A, 0xE0, 0xFD, 0x90, 0xA3, 0x09, 0xE0, 0x75, 0xF0, 0x10, 0x12, 0x75, 0x8E, 0xE5, 0x82, +0x2D, 0x12, 0x7A, 0x55, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x4D, 0xF7, 0x90, 0xA3, 0x0A, 0xE0, 0x04, +0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD8, 0x7F, 0x8F, 0x12, 0x46, 0xAB, 0xEF, 0x30, 0xE0, 0x02, +0xB1, 0x57, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFD, 0x7F, 0x8D, 0x02, 0x46, 0x8D, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x19, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA2, 0x18, +0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA2, 0x23, 0x12, 0x08, 0x6D, 0x90, +0xA2, 0x1B, 0x12, 0x45, 0x72, 0x12, 0x08, 0x3A, 0x90, 0xA2, 0x23, 0xD1, 0x74, 0xC0, 0x04, 0xC0, +0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA2, 0x1B, 0x12, 0x45, 0x72, 0x90, 0xA2, 0x1F, 0xD1, 0x74, +0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x54, 0x90, 0xA2, 0x27, 0x12, 0x08, +0x6D, 0x90, 0xA2, 0x19, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA2, 0x27, 0x12, 0x45, 0x72, 0x90, +0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x18, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0xDC, 0x12, 0x45, 0x8A, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0xEE, +0x13, 0x13, 0x54, 0x07, 0xFB, 0x90, 0xA0, 0xAE, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x90, 0xA2, 0xDF, +0xF0, 0xAF, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xDC, 0xEF, 0xF0, 0xED, +0x64, 0x01, 0x70, 0x2E, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x70, 0x80, 0x08, 0x90, +0xA2, 0xDC, 0xE0, 0x24, 0xFE, 0xF5, 0x70, 0x90, 0xA2, 0x1B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, +0xFF, 0xAF, 0x70, 0xD1, 0x65, 0xD1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x70, +0x80, 0x20, 0x90, 0xA2, 0x1B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA2, 0xDC, 0x12, +0x5D, 0x41, 0xD1, 0x69, 0xD1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA2, 0xDC, +0xE0, 0xFF, 0xD1, 0x65, 0x7F, 0x01, 0xB1, 0x5E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xB1, +0x5E, 0x90, 0xA2, 0x1B, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA2, 0x1F, 0x12, 0x08, 0x6D, 0x7D, +0x18, 0x7C, 0x00, 0x22, 0x12, 0x45, 0x7E, 0x02, 0x45, 0x47, 0x8F, 0x55, 0x90, 0x05, 0x22, 0xE0, +0x90, 0xA1, 0xD8, 0xF0, 0x12, 0x57, 0x4F, 0xEF, 0x64, 0x01, 0x70, 0x46, 0x75, 0xF0, 0x0B, 0xE5, +0x55, 0x12, 0x9F, 0xD5, 0xFC, 0x75, 0xF0, 0x0B, 0xE5, 0x55, 0xB1, 0xD4, 0x75, 0xF0, 0x0B, 0xE5, +0x55, 0x12, 0x55, 0x49, 0x12, 0x57, 0xE3, 0x54, 0x07, 0x20, 0xE0, 0x1C, 0x75, 0xF0, 0x0B, 0xE5, +0x55, 0x12, 0x77, 0xD8, 0xFF, 0x60, 0x03, 0xBF, 0x02, 0x0E, 0x75, 0xF0, 0x0B, 0xE5, 0x55, 0x12, +0x57, 0x1F, 0xE4, 0xFB, 0xFD, 0x12, 0x54, 0x71, 0xAD, 0x55, 0x7F, 0x01, 0x12, 0x54, 0xD1, 0x7F, +0x01, 0x22, 0x90, 0xA1, 0xD8, 0xE0, 0xFF, 0x7D, 0x49, 0x12, 0x54, 0xC6, 0x7F, 0x00, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x13, 0xED, 0xF0, 0xE4, 0xFE, 0xFD, 0xEF, 0xB4, +0x01, 0x0D, 0xEB, 0xB4, 0x02, 0x03, 0x0D, 0x80, 0x06, 0xEB, 0xB4, 0x01, 0x02, 0x7D, 0x02, 0xAF, +0x06, 0xEF, 0xC4, 0x54, 0xF0, 0x4D, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFE, 0xEF, 0x54, +0xE0, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xEF, 0x54, 0x1F, 0xFF, 0xED, 0x60, 0x2C, 0x14, 0x60, 0x1E, +0x24, 0xFD, 0x60, 0x0F, 0x24, 0xFE, 0x70, 0x2A, 0xEF, 0x25, 0xE0, 0xFF, 0xC3, 0x74, 0xDE, 0x9F, +0xFE, 0x80, 0x1F, 0xEF, 0x25, 0xE0, 0xFF, 0xC3, 0x74, 0xF2, 0x9F, 0xFE, 0x80, 0x14, 0xEF, 0x25, +0xE0, 0xFF, 0xC3, 0x74, 0x06, 0x9F, 0xFE, 0x80, 0x09, 0xEF, 0x25, 0xE0, 0xFF, 0xC3, 0x74, 0x10, +0x9F, 0xFE, 0xAF, 0x06, 0x22, 0xD3, 0xEF, 0x64, 0x80, 0x94, 0x1C, 0x40, 0x07, 0xEF, 0x64, 0x80, +0x94, 0x94, 0x40, 0x03, 0x7F, 0x00, 0x22, 0xC3, 0xEF, 0x64, 0x80, 0x94, 0x80, 0x40, 0x03, 0x7F, +0x64, 0x22, 0xEF, 0x24, 0x64, 0xFF, 0x22, 0xF1, 0x93, 0xBF, 0x01, 0x16, 0x90, 0xA1, 0xBF, 0xE0, +0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0xA1, 0x3A, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA1, +0x3A, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xBF, 0x7F, 0xFB, 0x7E, 0x01, 0x02, 0x34, 0xC1, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA1, +0xC2, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0xA1, 0xC6, 0x12, 0x08, +0x6D, 0x90, 0xA1, 0xC2, 0x12, 0xB8, 0x11, 0x60, 0x19, 0x90, 0xA1, 0xC2, 0x12, 0xB8, 0x08, 0x90, +0xA1, 0xC2, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xC2, 0x12, 0x47, 0xCC, 0x7F, 0x00, 0x7E, 0x08, 0x12, +0x38, 0x45, 0x90, 0xA1, 0xC6, 0x12, 0xB8, 0x11, 0x60, 0x19, 0x90, 0xA1, 0xC6, 0x12, 0xB8, 0x08, +0x90, 0xA1, 0xC6, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xC6, 0x12, 0x47, 0xCC, 0x7F, 0x00, 0x7E, 0x09, +0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, 0x72, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, +0x22, 0x12, 0x45, 0x72, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x22, 0x7E, 0x00, +0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xCF, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0xCF, +0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0x12, 0x60, 0x74, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0x11, 0x54, 0xE4, +0x90, 0x9F, 0xD2, 0xF0, 0x22, 0x12, 0x67, 0xA2, 0x80, 0xF3, 0x12, 0x67, 0x91, 0x80, 0xEE, 0x12, +0x67, 0xE6, 0x80, 0xE9, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, +0x12, 0x54, 0xC6, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x61, 0xC6, 0x11, 0x54, 0x90, 0x9F, 0xD3, 0x74, +0x02, 0xF0, 0x22, 0x7D, 0x20, 0x11, 0x80, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x67, 0xEA, 0x80, 0xF3, +0x7F, 0xFF, 0x12, 0x54, 0xC6, 0x12, 0x47, 0xEB, 0x90, 0x9F, 0xD2, 0x22, 0x11, 0x85, 0x74, 0x02, +0xF0, 0x22, 0x12, 0x67, 0xEC, 0x7D, 0x23, 0x11, 0x80, 0x74, 0x02, 0xF0, 0x22, 0x7D, 0x21, 0x7F, +0xFF, 0x12, 0x54, 0xC6, 0x90, 0x9F, 0xD2, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x67, 0xEA, 0x80, 0xED, +0x12, 0x66, 0xB8, 0x80, 0xEF, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x54, 0xC6, 0x12, 0x67, 0xEC, 0x80, +0xE3, 0x12, 0x67, 0xEA, 0x02, 0x6F, 0xCF, 0x12, 0x66, 0xB8, 0x7D, 0x24, 0x02, 0x6F, 0xD1, 0xAE, +0x07, 0x12, 0x6B, 0x1D, 0xBF, 0x01, 0x13, 0x90, 0x9F, 0xCF, 0x12, 0x5F, 0xDF, 0x20, 0xE0, 0x0A, +0xAF, 0x06, 0x7D, 0x01, 0x12, 0x62, 0x5A, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x9F, 0xD4, +0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x9F, 0xE2, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0xDD, 0xF0, 0x90, +0x9F, 0xD5, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0x12, 0x64, 0x79, 0x7D, 0x10, 0x7F, 0x03, 0x02, +0x66, 0x0D, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x24, 0x90, 0x9F, 0xDF, 0x74, 0x02, 0xF0, +0x80, 0x13, 0xED, 0x70, 0x06, 0x90, 0xA0, 0x39, 0xE0, 0x80, 0x02, 0xED, 0x14, 0x90, 0x9F, 0xDF, +0xF0, 0x90, 0x9F, 0xDF, 0xE0, 0xA3, 0xF0, 0x90, 0x9F, 0xD5, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x4A, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA0, 0x5C, +0xE0, 0x70, 0x61, 0x90, 0x9F, 0xDB, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x58, 0x90, 0xA0, 0x3C, 0xE0, +0x60, 0x4E, 0x80, 0x50, 0x12, 0xA2, 0xB7, 0xEF, 0x64, 0x01, 0x70, 0x48, 0x90, 0x9F, 0xDD, 0xE0, +0xFF, 0x54, 0x03, 0x70, 0x3F, 0x90, 0x9F, 0xDB, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x35, 0xEF, +0x20, 0xE2, 0x31, 0x90, 0x9F, 0xDD, 0xE0, 0x20, 0xE4, 0x2A, 0x90, 0x9F, 0xD5, 0xE0, 0x13, 0x13, +0x54, 0x3F, 0x30, 0xE0, 0x1F, 0x90, 0xA0, 0x3C, 0xE0, 0x70, 0x19, 0x90, 0x06, 0x62, 0xE0, 0x20, +0xE1, 0x12, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x04, +0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x30, 0x74, 0x04, +0xF0, 0xA3, 0x14, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x64, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, +0xF0, 0x22, 0x7D, 0x2F, 0x7F, 0xFF, 0x12, 0x54, 0xC6, 0x12, 0x47, 0xEB, 0x7D, 0x08, 0x7F, 0x01, +0x12, 0x61, 0xC6, 0x90, 0x9F, 0xD3, 0x74, 0x08, 0xF0, 0x22, 0x90, 0xA2, 0xB2, 0xE0, 0xFF, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x18, 0xEF, 0xF0, 0x90, 0x9E, 0xCB, 0xE0, 0xFF, +0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x39, 0x90, 0x9F, 0xDC, 0xE0, 0x64, 0x0E, 0x70, 0x10, 0x90, +0xA3, 0x18, 0xE0, 0x70, 0x2B, 0x51, 0x45, 0x90, 0x06, 0x04, 0x12, 0x61, 0xBE, 0x80, 0x1E, 0x90, +0x9F, 0xDC, 0xE0, 0x64, 0x06, 0x70, 0x19, 0x90, 0xA3, 0x18, 0xE0, 0x60, 0x13, 0x90, 0x9F, 0xD4, +0xE0, 0x54, 0xBF, 0xF0, 0x51, 0x4D, 0xF0, 0x90, 0x9F, 0xDC, 0x74, 0x04, 0xF0, 0x12, 0x66, 0x3A, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0xD4, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0x90, 0x06, 0x04, +0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0xA2, 0xE8, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1F, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, +0xEB, 0xF0, 0x7D, 0x29, 0x12, 0x57, 0x51, 0xBF, 0x01, 0x03, 0x12, 0x87, 0x8C, 0x90, 0xA2, 0xEB, +0xE0, 0xFF, 0x7D, 0x2A, 0x12, 0x54, 0xC6, 0x80, 0x03, 0x12, 0x87, 0x8C, 0x90, 0x04, 0x1F, 0x74, +0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, +0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x90, 0xA0, 0xAE, 0xE0, 0xFF, +0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54, 0x07, 0x25, 0xE0, 0x4F, 0xF0, 0xA3, +0xE0, 0xFF, 0x90, 0xA0, 0xAE, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0x22, 0xFF, 0x75, 0xF0, 0x0E, +0x90, 0xA0, 0xBB, 0x12, 0x45, 0x8A, 0xE0, 0xFE, 0x75, 0xF0, 0x0E, 0xEF, 0x90, 0xA0, 0xBA, 0x12, +0x45, 0x8A, 0xE0, 0x90, 0xA2, 0xAC, 0xF0, 0x90, 0xA2, 0xAB, 0xEE, 0x22, 0x90, 0xA1, 0xCE, 0x12, +0x45, 0x96, 0x75, 0xF0, 0x02, 0xE5, 0x5A, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, +0xAE, 0xF0, 0x22, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, +0x22, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x22, 0x8F, +0x58, 0xEF, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, +0x22, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x8A, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x22, 0xE5, +0x51, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0x74, 0x91, 0x25, +0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x22, 0x74, 0x28, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xA1, 0xF5, 0x83, 0xE0, 0x22, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, +0xFA, 0x7B, 0x01, 0x22, 0xFA, 0x74, 0xD0, 0x2B, 0xF5, 0x82, 0x74, 0xA1, 0x3A, 0xF5, 0x83, 0xEE, +0xF0, 0xC3, 0x22, 0x90, 0x9F, 0xD7, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0x78, 0x08, 0x12, 0x08, +0x5A, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x22, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, +0x54, 0xF7, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x3D, 0x22, +0x90, 0xA0, 0xFE, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, 0xFB, 0xE0, 0xFF, 0x22, 0x12, 0x45, 0x8A, +0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, 0x83, 0x22, 0x12, 0x08, 0x5A, 0x90, 0xA2, 0x31, 0x12, +0x08, 0x6D, 0x7F, 0x00, 0x22, 0x74, 0x05, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xEF, 0x13, 0x13, +0x13, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0x12, 0x56, 0xB0, +0x90, 0xA2, 0x1B, 0x22, 0xFC, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0x22, 0x90, +0x05, 0x58, 0x74, 0x02, 0xF0, 0x22, 0x90, 0xA2, 0xE3, 0xE0, 0xFF, 0x90, 0xA2, 0xE1, 0xE0, 0x22, +0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x22, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, +0xDF, 0x4D, 0xFF, 0x22, 0x12, 0x45, 0x8A, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x22, 0x7F, 0x30, 0x7E, +0x09, 0x12, 0x37, 0x4E, 0xE4, 0x22, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0x22, 0x90, +0xA0, 0x3F, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, +0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xFB, 0xF0, 0x22, 0x90, 0xA1, 0xFF, 0xE0, 0xFF, 0x75, +0xF0, 0x0B, 0x22, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x90, 0xA0, 0xB2, 0x22, 0x90, 0x81, 0x01, 0x12, +0x45, 0x8A, 0xEF, 0xF0, 0x22, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA2, 0x99, 0xF0, 0x22, 0xF0, 0x90, +0x04, 0xE0, 0xE0, 0x90, 0x9F, 0xD5, 0x22, 0x90, 0xA0, 0x50, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x22, +0x7F, 0x4E, 0x12, 0x46, 0xAB, 0xEF, 0x54, 0x7F, 0x22, 0x90, 0xA2, 0xC3, 0xE0, 0x7F, 0x48, 0x7E, +0x09, 0x22, 0x90, 0xA0, 0x4D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0xF0, 0x7F, 0x10, 0x7E, 0x00, +0x02, 0x3E, 0x50, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, +0x7F, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x5F, 0xB9, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, +0xFF, 0x22, 0x90, 0x9F, 0xDF, 0xE0, 0xFF, 0xA3, 0xE0, 0x22, 0x90, 0x9F, 0xDF, 0xE0, 0x90, 0x05, +0x73, 0x22, 0x90, 0xA0, 0xDF, 0x12, 0x45, 0x8A, 0xE0, 0x22, 0x90, 0x89, 0x07, 0x12, 0x45, 0x8A, +0xE0, 0x22, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x22, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, +0x2F, 0x22, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x22, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, +0xA3, 0x22, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x22, 0x90, 0xA2, 0x88, 0x12, 0x45, 0x72, +0xEF, 0x22, 0x12, 0x45, 0x72, 0xEF, 0x44, 0x80, 0xFF, 0x22, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, +0x5E, 0x22, 0x12, 0x46, 0xAB, 0xEF, 0x44, 0x40, 0xFD, 0x22, 0x44, 0xC7, }; -u4Byte ArrayLength_MP_8723B_FW_NIC = 28004; - +u4Byte ArrayLength_MP_8723B_FW_NIC = 32108; void @@ -3377,16 +3971,16 @@ ODM_ReadFirmware_MP_8723B_FW_NIC( *pFirmwareSize = ArrayLength_MP_8723B_FW_NIC; } -// v31.00 20140813 by Isaachsu +/* v35.00 20150326 by IsaacHsu */ u1Byte Array_MP_8723B_FW_WoWLAN[] = { -0x01, 0x53, 0x30, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x08, 0x13, 0x23, 0x38, 0xAA, 0x61, 0x00, 0x00, -0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x48, 0x94, 0x02, 0x70, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x70, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x70, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x53, 0x30, 0x00, 0x23, 0x00, 0x00, 0x00, 0x03, 0x26, 0x14, 0x35, 0xFE, 0x66, 0x00, 0x00, +0xE5, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x48, 0xA2, 0x02, 0x67, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x68, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x68, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x70, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xFC, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x7F, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x68, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6F, 0xFB, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x77, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3422,1530 +4016,1615 @@ u1Byte Array_MP_8723B_FW_WoWLAN[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xE8, 0x8F, 0xF0, -0xA4, 0xCC, 0x8B, 0xF0, 0xA4, 0x2C, 0xFC, 0xE9, 0x8E, 0xF0, 0xA4, 0x2C, 0xFC, 0x8A, 0xF0, 0xED, -0xA4, 0x2C, 0xFC, 0xEA, 0x8E, 0xF0, 0xA4, 0xCD, 0xA8, 0xF0, 0x8B, 0xF0, 0xA4, 0x2D, 0xCC, 0x38, -0x25, 0xF0, 0xFD, 0xE9, 0x8F, 0xF0, 0xA4, 0x2C, 0xCD, 0x35, 0xF0, 0xFC, 0xEB, 0x8E, 0xF0, 0xA4, -0xFE, 0xA9, 0xF0, 0xEB, 0x8F, 0xF0, 0xA4, 0xCF, 0xC5, 0xF0, 0x2E, 0xCD, 0x39, 0xFE, 0xE4, 0x3C, -0xFC, 0xEA, 0xA4, 0x2D, 0xCE, 0x35, 0xF0, 0xFD, 0xE4, 0x3C, 0xFC, 0x22, 0x75, 0xF0, 0x08, 0x75, -0x82, 0x00, 0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xCD, 0x33, 0xCD, 0xCC, 0x33, 0xCC, 0xC5, 0x82, -0x33, 0xC5, 0x82, 0x9B, 0xED, 0x9A, 0xEC, 0x99, 0xE5, 0x82, 0x98, 0x40, 0x0C, 0xF5, 0x82, 0xEE, -0x9B, 0xFE, 0xED, 0x9A, 0xFD, 0xEC, 0x99, 0xFC, 0x0F, 0xD5, 0xF0, 0xD6, 0xE4, 0xCE, 0xFB, 0xE4, -0xCD, 0xFA, 0xE4, 0xCC, 0xF9, 0xA8, 0x82, 0x22, 0xB8, 0x00, 0xC1, 0xB9, 0x00, 0x59, 0xBA, 0x00, -0x2D, 0xEC, 0x8B, 0xF0, 0x84, 0xCF, 0xCE, 0xCD, 0xFC, 0xE5, 0xF0, 0xCB, 0xF9, 0x78, 0x18, 0xEF, -0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xED, 0x33, 0xFD, 0xEC, 0x33, 0xFC, 0xEB, 0x33, 0xFB, 0x10, 0xD7, -0x03, 0x99, 0x40, 0x04, 0xEB, 0x99, 0xFB, 0x0F, 0xD8, 0xE5, 0xE4, 0xF9, 0xFA, 0x22, 0x78, 0x18, -0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xED, 0x33, 0xFD, 0xEC, 0x33, 0xFC, 0xC9, 0x33, 0xC9, 0x10, -0xD7, 0x05, 0x9B, 0xE9, 0x9A, 0x40, 0x07, 0xEC, 0x9B, 0xFC, 0xE9, 0x9A, 0xF9, 0x0F, 0xD8, 0xE0, -0xE4, 0xC9, 0xFA, 0xE4, 0xCC, 0xFB, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, -0xED, 0x33, 0xFD, 0xCC, 0x33, 0xCC, 0xC8, 0x33, 0xC8, 0x10, 0xD7, 0x07, 0x9B, 0xEC, 0x9A, 0xE8, -0x99, 0x40, 0x0A, 0xED, 0x9B, 0xFD, 0xEC, 0x9A, 0xFC, 0xE8, 0x99, 0xF8, 0x0F, 0xD5, 0xF0, 0xDA, -0xE4, 0xCD, 0xFB, 0xE4, 0xCC, 0xFA, 0xE4, 0xC8, 0xF9, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, -0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, -0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, -0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, -0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, -0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, -0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, -0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, -0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, -0xDF, 0xE3, 0xF5, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, 0xE3, 0xF5, -0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, 0xE6, 0x08, -0xB5, 0xF0, 0x52, 0xDF, 0xF6, 0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x46, 0xDF, -0xF6, 0x80, 0x42, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x36, 0xDF, -0xF6, 0x80, 0x32, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, 0x25, -0xDF, 0xF5, 0x80, 0x21, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, -0x14, 0xDF, 0xF5, 0x80, 0x10, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, 0x93, 0xA3, -0xB5, 0xF0, 0x02, 0xDF, 0xF4, 0x02, 0x45, 0x70, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, 0x80, 0xD4, -0x80, 0x3E, 0x80, 0x15, 0x80, 0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, 0x80, 0xA3, -0x80, 0x51, 0x80, 0x74, 0x80, 0x3C, 0x02, 0x45, 0x7C, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, -0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, -0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, 0x80, 0x70, -0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, 0xDF, 0xF4, -0x80, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x51, 0xDF, -0xF5, 0x80, 0x4D, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x40, -0xDF, 0xF5, 0x80, 0x3C, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, -0xF0, 0x2E, 0xDF, 0xF4, 0x80, 0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, -0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8, -0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0x00, -0x7F, 0xFF, 0xB5, 0xF0, 0x02, 0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, 0x8A, 0x83, -0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, -0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, 0xE3, 0x80, -0xCF, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, -0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, -0xAF, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xAB, -0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, -0x50, 0x8E, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x44, 0xB8, 0x73, 0xC2, 0xAF, 0x80, 0xFE, 0x32, -0x12, 0x45, 0xEF, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, 0x24, -0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, 0xE6, -0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, 0x78, -0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, 0x03, 0x44, 0x18, 0xF6, 0xD2, -0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, 0x23, 0x24, 0x81, 0xF8, 0x0F, -0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, 0xE4, 0xF2, 0x00, 0xE5, 0x0C, -0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, 0xE6, 0xFD, 0xA6, 0x81, 0x08, -0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, 0x6D, 0x60, 0xE0, 0x08, 0xE6, -0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, 0x0C, 0x24, 0x87, 0xF8, 0xE6, -0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, 0xF8, 0xE5, 0x81, 0x6D, 0x60, -0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, 0xC8, 0xF6, 0x15, 0x0C, 0x80, -0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, 0xE6, 0x30, 0xE0, 0x03, 0x10, -0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, 0x7C, -0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, 0x06, -0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, 0xF6, 0x08, 0xF6, 0x08, 0xDF, -0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x49, 0x33, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, 0xC0, -0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, 0x02, -0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, 0x20, -0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, 0x0C, 0xEE, 0xC3, 0x9F, 0x50, -0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, 0xBE, 0x02, 0x02, 0x74, 0xFF, -0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, 0x09, 0x80, 0xF3, 0x16, 0x16, -0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, 0xEE, 0xD3, 0x9F, 0x40, 0x22, -0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, 0x06, -0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, 0x1E, -0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, 0x04, 0x90, 0x49, 0x33, 0x93, -0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, -0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, 0x8C, -0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, 0x02, -0x46, 0x38, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, -0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, 0xE7, -0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, 0x7F, -0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, 0x0F, 0x74, 0x86, 0x2F, 0xF8, -0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, 0x81, 0xED, 0x6C, 0x60, 0x08, -0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, 0x7F, -0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, -0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, 0xD2, 0xE2, 0xC6, 0xD2, 0xAF, -0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x37, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, -0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, 0xF6, -0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, 0x60, 0x25, 0x7E, 0x02, 0x08, -0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, -0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, 0x02, -0x46, 0x38, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0x54, -0x80, 0x4F, 0xFF, 0x22, 0x02, 0x48, 0xD2, 0x02, 0x46, 0xC8, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, -0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, -0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, -0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, -0x40, 0x80, 0x90, 0x49, 0x17, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, -0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, -0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, -0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, -0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x41, 0x95, 0x1A, 0x00, 0x41, 0x95, 0x1B, 0x00, 0x41, -0x95, 0x2C, 0x00, 0x41, 0x94, 0x6F, 0x00, 0x41, 0x94, 0x51, 0x00, 0x44, 0x95, 0x0D, 0x00, 0x50, -0xF2, 0x01, 0x00, 0x4B, 0xAE, 0x60, 0x04, 0x67, 0xFC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF1, 0xDF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xF5, 0xEF, 0xF0, 0x90, 0x94, 0xF7, 0xEB, 0xF0, 0xED, 0x60, -0x02, 0x21, 0xF7, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, -0xF0, 0x90, 0x94, 0xF7, 0xE0, 0x70, 0x3B, 0xB1, 0x58, 0xD1, 0x21, 0x70, 0x2F, 0x12, 0xA1, 0x20, -0x70, 0x13, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, 0x91, 0xFE, 0x7F, 0x64, 0x51, 0x4E, -0xEF, 0x54, 0xFE, 0x80, 0x12, 0x12, 0x37, 0x4E, 0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0x91, 0xFE, -0x7F, 0x64, 0x51, 0x4E, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x31, 0x39, 0x7F, 0x4E, 0xD1, 0x81, -0x41, 0x40, 0xB1, 0x58, 0xD1, 0x21, 0x70, 0x06, 0xD1, 0x2F, 0xFF, 0xFE, 0x91, 0xFE, 0xD1, 0x38, -0xB1, 0x63, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0x31, 0x39, 0x7F, 0x30, 0xD1, 0x31, 0x74, 0x66, 0xFF, -0xEC, 0x12, 0x61, 0x5B, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, -0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x12, 0x61, 0x5B, 0x7F, 0x2C, -0x7E, 0x09, 0x12, 0x38, 0x45, 0x80, 0x52, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, -0x65, 0xE0, 0x44, 0x18, 0xF0, 0x90, 0x94, 0xF5, 0xE0, 0x70, 0x33, 0x90, 0x94, 0xF7, 0xE0, 0x60, -0x09, 0xB1, 0x58, 0x31, 0x39, 0xD1, 0x2F, 0xFF, 0x80, 0x21, 0x7F, 0x67, 0x51, 0x4E, 0xEF, 0x54, -0xDF, 0xFD, 0x7F, 0x67, 0x31, 0x39, 0x12, 0xA1, 0x20, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, -0x80, 0xFF, 0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0x91, 0xFE, 0xD1, 0x38, -0xB1, 0x63, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0x95, 0x26, 0xF1, 0xDF, -0x90, 0x95, 0x26, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0x95, 0x21, 0xED, 0xF0, 0x90, 0x95, 0x20, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x41, -0x7F, 0x47, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0x31, -0x39, 0x7F, 0x46, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0xD1, -0x28, 0x60, 0x0D, 0x7F, 0x45, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x0C, -0x7F, 0x45, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, -0x45, 0x90, 0x95, 0x20, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, -0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x31, 0x39, 0x7F, 0x62, 0x71, 0x0F, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0xD1, 0x28, 0x60, 0x0E, 0x71, 0x0D, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x0D, 0x71, 0x0D, 0x80, 0x02, 0xC3, 0x33, 0xD8, -0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x61, 0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x61, 0x51, -0x4E, 0x90, 0x95, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x22, 0x7F, 0xFF, 0x12, 0x53, -0xD9, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xFA, 0x7D, 0x01, 0x31, 0x4D, 0x12, 0x8F, -0xD0, 0x71, 0x68, 0x71, 0x55, 0x71, 0x55, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0x90, 0x01, -0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0x7F, 0x02, 0x51, 0x4E, -0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0x7F, 0x02, 0x51, 0x4E, 0xEF, 0x22, 0x7F, 0x54, -0x51, 0x4E, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x51, 0x4E, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, -0x7F, 0x56, 0x51, 0x4E, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x51, 0x4E, 0xE5, 0x10, 0x5F, -0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x31, 0x39, 0xAD, 0x12, 0x7F, 0x55, 0x31, 0x39, 0xAD, 0x13, -0x7F, 0x56, 0x31, 0x39, 0xAD, 0x14, 0x7F, 0x57, 0x31, 0x39, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, -0x51, 0x4E, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x31, 0x39, 0x7F, 0x80, 0xD1, 0x81, 0xFD, 0x7F, -0x80, 0x31, 0x39, 0x12, 0x8B, 0xA5, 0x12, 0x3E, 0x11, 0xF1, 0xF7, 0x12, 0x8C, 0x07, 0x7F, 0x01, -0x12, 0x47, 0x00, 0x90, 0x93, 0x27, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x47, 0x00, 0x90, 0x93, 0x27, -0xE0, 0x04, 0xF0, 0x91, 0x13, 0x12, 0x88, 0xCC, 0x7F, 0x80, 0xF1, 0xBA, 0x7F, 0x80, 0x31, 0x39, -0x75, 0x28, 0xFF, 0x12, 0x5F, 0xFD, 0x12, 0x8B, 0xCC, 0x12, 0x90, 0x33, 0x7F, 0x81, 0x51, 0x4E, -0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x31, 0x39, 0x12, 0x8C, 0x11, 0x12, 0x90, 0x5E, 0xE4, 0xFF, -0x02, 0x47, 0x89, 0xF1, 0xC1, 0x90, 0x8D, 0x06, 0xEF, 0xF0, 0xD1, 0x40, 0x90, 0x01, 0x64, 0x74, -0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x51, 0x4E, 0xEF, 0x54, 0xFC, -0x44, 0x04, 0xFD, 0x7F, 0x17, 0x31, 0x39, 0x7F, 0x16, 0x51, 0x4E, 0xEF, 0x54, 0x0F, 0x44, 0x40, -0xFD, 0x7F, 0x16, 0x31, 0x39, 0x7F, 0x38, 0xF1, 0xBA, 0x7F, 0x38, 0x31, 0x39, 0x02, 0x37, 0x99, -0xAD, 0x07, 0x90, 0x8E, 0xC9, 0xE0, 0x75, 0xF0, 0x40, 0xA4, 0xFF, 0x90, 0x95, 0x09, 0xE5, 0xF0, -0x12, 0xA1, 0x31, 0x90, 0x8E, 0xCA, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x95, 0x0C, 0xF0, 0xED, -0x64, 0x01, 0x70, 0x70, 0x90, 0x95, 0x09, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x0B, 0x90, 0x95, -0x09, 0x74, 0xFF, 0x75, 0xF0, 0xD0, 0x12, 0x08, 0xD6, 0x91, 0xF0, 0x13, 0x54, 0x07, 0x7D, 0x00, -0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0x6A, 0x91, 0xF0, 0x13, 0x54, 0x01, 0xFD, 0x51, 0x6A, 0x90, -0x8E, 0xCA, 0xE0, 0x30, 0xE0, 0x3E, 0x91, 0xE5, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, -0x7D, 0x01, 0x51, 0x6A, 0xE4, 0x90, 0x95, 0x0B, 0xF0, 0x90, 0x95, 0x0C, 0xE0, 0xFF, 0x90, 0x95, -0x0B, 0xE0, 0xC3, 0x9F, 0x50, 0x1E, 0x91, 0xE5, 0x13, 0x54, 0x01, 0xFD, 0x51, 0x6A, 0x91, 0xE5, -0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0x6A, 0x90, 0x95, 0x0B, 0xE0, -0x04, 0xF0, 0x80, 0xD5, 0x22, 0x90, 0x95, 0x09, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E, 0x50, -0x90, 0x8E, 0xC8, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8E, 0xC7, 0xE0, 0xFE, 0xC4, 0x22, 0xEC, 0x90, -0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x02, 0x38, 0x45, 0x90, 0x8E, 0x12, 0xE0, -0x44, 0x10, 0xF0, 0x90, 0x8E, 0x20, 0xE0, 0xFD, 0x7F, 0x93, 0x31, 0x39, 0x90, 0x8E, 0x16, 0xE0, +0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xC3, 0xEF, 0x9B, +0xFF, 0xEE, 0x9A, 0xFE, 0xED, 0x99, 0xFD, 0xEC, 0x98, 0xFC, 0x22, 0xE8, 0x8F, 0xF0, 0xA4, 0xCC, +0x8B, 0xF0, 0xA4, 0x2C, 0xFC, 0xE9, 0x8E, 0xF0, 0xA4, 0x2C, 0xFC, 0x8A, 0xF0, 0xED, 0xA4, 0x2C, +0xFC, 0xEA, 0x8E, 0xF0, 0xA4, 0xCD, 0xA8, 0xF0, 0x8B, 0xF0, 0xA4, 0x2D, 0xCC, 0x38, 0x25, 0xF0, +0xFD, 0xE9, 0x8F, 0xF0, 0xA4, 0x2C, 0xCD, 0x35, 0xF0, 0xFC, 0xEB, 0x8E, 0xF0, 0xA4, 0xFE, 0xA9, +0xF0, 0xEB, 0x8F, 0xF0, 0xA4, 0xCF, 0xC5, 0xF0, 0x2E, 0xCD, 0x39, 0xFE, 0xE4, 0x3C, 0xFC, 0xEA, +0xA4, 0x2D, 0xCE, 0x35, 0xF0, 0xFD, 0xE4, 0x3C, 0xFC, 0x22, 0x75, 0xF0, 0x08, 0x75, 0x82, 0x00, +0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xCD, 0x33, 0xCD, 0xCC, 0x33, 0xCC, 0xC5, 0x82, 0x33, 0xC5, +0x82, 0x9B, 0xED, 0x9A, 0xEC, 0x99, 0xE5, 0x82, 0x98, 0x40, 0x0C, 0xF5, 0x82, 0xEE, 0x9B, 0xFE, +0xED, 0x9A, 0xFD, 0xEC, 0x99, 0xFC, 0x0F, 0xD5, 0xF0, 0xD6, 0xE4, 0xCE, 0xFB, 0xE4, 0xCD, 0xFA, +0xE4, 0xCC, 0xF9, 0xA8, 0x82, 0x22, 0xB8, 0x00, 0xC1, 0xB9, 0x00, 0x59, 0xBA, 0x00, 0x2D, 0xEC, +0x8B, 0xF0, 0x84, 0xCF, 0xCE, 0xCD, 0xFC, 0xE5, 0xF0, 0xCB, 0xF9, 0x78, 0x18, 0xEF, 0x2F, 0xFF, +0xEE, 0x33, 0xFE, 0xED, 0x33, 0xFD, 0xEC, 0x33, 0xFC, 0xEB, 0x33, 0xFB, 0x10, 0xD7, 0x03, 0x99, +0x40, 0x04, 0xEB, 0x99, 0xFB, 0x0F, 0xD8, 0xE5, 0xE4, 0xF9, 0xFA, 0x22, 0x78, 0x18, 0xEF, 0x2F, +0xFF, 0xEE, 0x33, 0xFE, 0xED, 0x33, 0xFD, 0xEC, 0x33, 0xFC, 0xC9, 0x33, 0xC9, 0x10, 0xD7, 0x05, +0x9B, 0xE9, 0x9A, 0x40, 0x07, 0xEC, 0x9B, 0xFC, 0xE9, 0x9A, 0xF9, 0x0F, 0xD8, 0xE0, 0xE4, 0xC9, +0xFA, 0xE4, 0xCC, 0xFB, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xED, 0x33, +0xFD, 0xCC, 0x33, 0xCC, 0xC8, 0x33, 0xC8, 0x10, 0xD7, 0x07, 0x9B, 0xEC, 0x9A, 0xE8, 0x99, 0x40, +0x0A, 0xED, 0x9B, 0xFD, 0xEC, 0x9A, 0xFC, 0xE8, 0x99, 0xF8, 0x0F, 0xD5, 0xF0, 0xDA, 0xE4, 0xCD, +0xFB, 0xE4, 0xCC, 0xFA, 0xE4, 0xC8, 0xF9, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, +0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, +0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, +0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE0, +0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, +0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, +0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, +0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, +0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xE3, +0xF5, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, 0xE3, 0xF5, 0xF0, 0x09, +0xE6, 0x08, 0xB5, 0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, +0x52, 0xDF, 0xF6, 0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x46, 0xDF, 0xF6, 0x80, +0x42, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x36, 0xDF, 0xF6, 0x80, +0x32, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, 0x25, 0xDF, 0xF5, +0x80, 0x21, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x14, 0xDF, +0xF5, 0x80, 0x10, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, +0x02, 0xDF, 0xF4, 0x02, 0x45, 0x7E, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, 0x80, 0xD4, 0x80, 0x3E, +0x80, 0x15, 0x80, 0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, 0x80, 0xA3, 0x80, 0x51, +0x80, 0x74, 0x80, 0x3C, 0x02, 0x45, 0x8A, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xF5, +0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, +0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, 0x80, 0x70, 0x89, 0x82, +0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, 0xDF, 0xF4, 0x80, 0x5E, +0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x51, 0xDF, 0xF5, 0x80, +0x4D, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x40, 0xDF, 0xF5, +0x80, 0x3C, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x2E, +0xDF, 0xF4, 0x80, 0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, +0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, +0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0x00, 0x7F, 0xFF, +0xB5, 0xF0, 0x02, 0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, +0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8, 0xC5, +0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, 0xE3, 0x80, 0xCF, 0x89, +0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, +0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xAF, 0xDF, +0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xAB, 0xED, 0x24, +0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x8E, +0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x44, 0xC6, 0x73, 0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x45, +0xFD, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, +0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, +0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, +0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, 0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, +0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, 0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, +0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, 0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, +0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, 0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, +0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, 0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, +0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, 0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, +0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, 0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, +0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, 0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, +0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, +0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, +0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, +0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, 0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, +0x81, 0x76, 0x30, 0x90, 0x49, 0x41, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, +0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, +0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, +0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, 0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, +0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, +0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, 0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, +0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, 0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, +0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, +0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, +0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, 0x04, 0x90, 0x49, 0x41, 0x93, 0xF6, 0x08, +0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, +0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, +0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x46, 0x46, +0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, +0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, +0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, +0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, 0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, +0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, 0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, +0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, +0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, +0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, 0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, +0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x45, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, +0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, +0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, 0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, +0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, +0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x46, 0x46, +0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, +0xFF, 0x22, 0x02, 0x48, 0xE0, 0x02, 0x46, 0xD6, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, +0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, +0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, +0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, +0x90, 0x49, 0x25, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, +0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, +0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, +0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, +0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x41, 0x95, 0x42, 0x00, 0x41, 0x95, 0x43, 0x00, 0x41, 0x95, 0x56, +0x00, 0x41, 0x94, 0x8B, 0x00, 0x41, 0x94, 0x6D, 0x00, 0x44, 0x95, 0x32, 0x00, 0x50, 0xF2, 0x01, +0x00, 0x4B, 0xBD, 0x58, 0x02, 0x60, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, +0x75, 0x83, 0x00, 0xED, 0xF1, 0xEE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x90, 0x95, 0x16, 0xEF, 0xF0, 0x90, 0x95, 0x18, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0x21, +0xFF, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90, +0x95, 0x18, 0xE0, 0x70, 0x38, 0xB1, 0x83, 0x70, 0x2E, 0x12, 0xA6, 0x94, 0x70, 0x12, 0x12, 0x37, +0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xB1, 0x1D, 0x7F, 0x64, 0x51, 0x5D, 0xEF, 0x54, 0xFE, 0x80, 0x12, +0x12, 0x37, 0x4E, 0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0xB1, 0x1E, 0x7F, 0x64, 0x51, 0x5D, 0xEF, +0x44, 0x01, 0xFD, 0x7F, 0x64, 0x31, 0x47, 0x7F, 0x4E, 0xD1, 0xCE, 0x41, 0x4F, 0xB1, 0x83, 0x70, +0x05, 0xD1, 0x7C, 0xFF, 0xB1, 0x1D, 0xD1, 0x85, 0xB1, 0x78, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0x31, +0x47, 0x7F, 0x30, 0xD1, 0x7E, 0x74, 0x66, 0xFF, 0xEC, 0x12, 0x9E, 0x99, 0x7F, 0x30, 0x7E, 0x09, +0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEF, 0x44, +0x01, 0xFF, 0xEC, 0x12, 0x9E, 0x99, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x80, 0x59, 0x90, +0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x90, 0x95, 0x16, +0xE0, 0x70, 0x3A, 0x90, 0x95, 0x18, 0xE0, 0x60, 0x11, 0x7F, 0x67, 0x51, 0x5D, 0xEF, 0x44, 0x20, +0xFD, 0x7F, 0x67, 0x31, 0x47, 0xD1, 0x7C, 0xFF, 0x80, 0x21, 0x7F, 0x67, 0x51, 0x5D, 0xEF, 0x54, +0xDF, 0xFD, 0x7F, 0x67, 0x31, 0x47, 0x12, 0xA6, 0x94, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, +0x80, 0xFF, 0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xB1, 0x1D, 0xD1, 0x85, 0xB1, +0x78, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0x31, 0x47, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0x95, 0x50, 0xF1, 0xEE, 0x90, +0x95, 0x50, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x90, 0x95, 0x4B, 0xED, 0xF0, 0x90, 0x95, 0x4A, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x41, 0x7F, +0x47, 0x71, 0x1E, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0x31, 0x47, +0x7F, 0x46, 0x71, 0x1E, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0xD1, 0x75, +0x60, 0x0D, 0x7F, 0x45, 0x71, 0x1E, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x0C, 0x7F, +0x45, 0x71, 0x1E, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x45, +0x90, 0x95, 0x4A, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0x71, 0x1E, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x31, 0x47, 0x7F, 0x62, 0x71, 0x1E, 0x80, 0x02, 0xC3, 0x33, +0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0xD1, 0x75, 0x60, 0x0E, 0x71, 0x1C, 0x80, 0x02, 0xC3, 0x33, +0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x0D, 0x71, 0x1C, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, +0xF4, 0x5F, 0xFD, 0x7F, 0x61, 0x31, 0x47, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x61, 0x51, 0x5D, +0x90, 0x95, 0x4A, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x22, 0x7F, 0xFF, 0x12, 0x5A, 0x57, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xF8, 0x7D, 0x01, 0x31, 0x5B, 0x12, 0x5D, 0x30, +0x71, 0x77, 0x71, 0x64, 0x71, 0x64, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x31, 0x47, 0x90, 0x01, 0x00, +0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x31, 0x47, 0x7F, 0x02, 0x51, 0x5D, 0xEF, +0x44, 0x01, 0xFD, 0x7F, 0x02, 0x31, 0x47, 0x7F, 0x02, 0x51, 0x5D, 0xEF, 0x22, 0x7F, 0x54, 0x51, +0x5D, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x51, 0x5D, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, +0x56, 0x51, 0x5D, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x51, 0x5D, 0xE5, 0x10, 0x5F, 0xF5, +0x14, 0xAD, 0x11, 0x7F, 0x54, 0x31, 0x47, 0xAD, 0x12, 0x7F, 0x55, 0x31, 0x47, 0xAD, 0x13, 0x7F, +0x56, 0x31, 0x47, 0xAD, 0x14, 0x7F, 0x57, 0x31, 0x47, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, 0x51, +0x5D, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x31, 0x47, 0x7F, 0x80, 0xD1, 0xCE, 0xFD, 0x7F, 0x80, +0x31, 0x47, 0x12, 0x96, 0x3C, 0x12, 0x3E, 0x11, 0x12, 0x94, 0xAB, 0x12, 0x96, 0x7D, 0x7F, 0x01, +0x12, 0x47, 0x0E, 0x90, 0x93, 0x40, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x47, 0x0E, 0x90, 0x93, 0x40, +0xE0, 0x04, 0xF0, 0x91, 0x23, 0x12, 0x88, 0x8D, 0x7F, 0x80, 0xF1, 0xB3, 0x7F, 0x80, 0x31, 0x47, +0x75, 0x28, 0xFF, 0x12, 0x57, 0xFB, 0x12, 0x94, 0x4F, 0x12, 0x9D, 0x5C, 0x7F, 0x81, 0x51, 0x5D, +0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x31, 0x47, 0x12, 0x96, 0x87, 0x12, 0x9E, 0x0D, 0xE4, 0xFF, +0x02, 0x47, 0x97, 0xF1, 0xBA, 0x90, 0x8D, 0x07, 0xEF, 0xF0, 0xD1, 0x8D, 0x90, 0x01, 0x64, 0x74, +0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x51, 0x5D, 0xEF, 0x54, 0xFC, +0x44, 0x04, 0xFD, 0x7F, 0x17, 0x31, 0x47, 0x7F, 0x16, 0x51, 0x5D, 0xEF, 0x54, 0x0F, 0x44, 0x40, +0xFD, 0x7F, 0x16, 0x31, 0x47, 0x7F, 0x38, 0xF1, 0xB3, 0x7F, 0x38, 0x31, 0x47, 0x02, 0x37, 0x99, +0xAD, 0x07, 0x90, 0x8E, 0xB4, 0xE0, 0x75, 0xF0, 0x40, 0xA4, 0xFF, 0x90, 0x95, 0x0C, 0xE5, 0xF0, +0x12, 0xA6, 0x9D, 0x90, 0x8E, 0xB5, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x95, 0x0F, 0xF0, 0x90, +0x8E, 0xB6, 0xE0, 0x13, 0x13, 0x54, 0x01, 0x90, 0x95, 0x10, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x6E, +0xE0, 0x70, 0x15, 0x90, 0x95, 0x0C, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x0B, 0x90, 0x95, 0x0C, +0x74, 0xFF, 0x75, 0xF0, 0xD0, 0x12, 0x08, 0xD6, 0xB1, 0x0E, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, +0x02, 0x7D, 0x01, 0x51, 0x79, 0xB1, 0x0E, 0x54, 0x01, 0xFD, 0x51, 0x79, 0x90, 0x8E, 0xB5, 0xE0, +0x30, 0xE0, 0x3B, 0x91, 0xFF, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0x79, +0xE4, 0x90, 0x95, 0x0E, 0xF0, 0x90, 0x95, 0x0F, 0xE0, 0xFF, 0x90, 0x95, 0x0E, 0xE0, 0xC3, 0x9F, +0x50, 0x1C, 0x91, 0xFF, 0x54, 0x01, 0xFD, 0x51, 0x79, 0x91, 0xFF, 0x54, 0x07, 0x7D, 0x00, 0x20, +0xE0, 0x02, 0x7D, 0x01, 0x51, 0x79, 0x90, 0x95, 0x0E, 0xE0, 0x04, 0xF0, 0x80, 0xD7, 0x22, 0x90, +0x95, 0x0C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x95, 0x10, 0xE0, 0xFD, 0xB1, 0x94, 0x90, 0x8E, +0xB3, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8E, 0xB2, 0xE0, 0xFE, 0xC4, 0x13, 0x22, 0xFE, 0xEC, 0x90, +0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x02, 0x38, 0x45, 0x90, 0x8E, 0x43, 0xE0, +0x44, 0x10, 0xF0, 0x90, 0x8E, 0x52, 0xE0, 0xFD, 0x7F, 0x93, 0x31, 0x47, 0x90, 0x8E, 0x48, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, -0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x51, 0x4E, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x31, 0x39, -0x7F, 0x01, 0x12, 0x60, 0xA4, 0x7F, 0x90, 0x51, 0x4E, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x31, -0x39, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x7F, 0x67, 0x51, 0x4E, 0xEF, 0x44, 0x20, 0xFD, -0x7F, 0x67, 0x22, 0xFD, 0x7F, 0x4E, 0x31, 0x39, 0x7F, 0x4F, 0x51, 0x4E, 0xEF, 0x22, 0x90, 0x01, -0x30, 0xE4, 0xB1, 0xB3, 0x90, 0x01, 0x38, 0xB1, 0xB3, 0xFD, 0x7F, 0x50, 0x31, 0x39, 0xE4, 0xFD, -0x7F, 0x51, 0x31, 0x39, 0xE4, 0xFD, 0x7F, 0x52, 0x31, 0x39, 0xE4, 0xFD, 0x7F, 0x53, 0x21, 0x39, -0x90, 0x01, 0x34, 0x74, 0xFF, 0xB1, 0xB3, 0x90, 0x01, 0x3C, 0xB1, 0xB3, 0xFD, 0x7F, 0x54, 0x31, -0x39, 0x7D, 0xFF, 0x7F, 0x55, 0x31, 0x39, 0x7D, 0xFF, 0x7F, 0x56, 0x31, 0x39, 0x7D, 0xFF, 0x7F, -0x57, 0x21, 0x39, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0xD1, 0x1B, 0x30, 0xE6, 0x1B, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x26, 0x7F, 0x8D, 0x51, -0x4E, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x27, 0xD1, 0x1B, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, 0x8D, -0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, -0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, -0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0xF1, 0xFA, 0xE4, 0xFD, 0x31, 0x4D, 0x71, 0x68, 0x44, -0x01, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x8F, 0x51, 0x4E, 0xEF, -0x22, 0x31, 0x39, 0x90, 0x94, 0xF5, 0xE0, 0x22, 0x31, 0x39, 0x90, 0x95, 0x21, 0xE0, 0x22, 0x7F, -0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x22, 0x7F, 0x4E, 0x51, 0x4E, 0xEF, 0x54, 0x7F, 0x22, -0xB1, 0x6E, 0xB1, 0x90, 0x12, 0x8B, 0x67, 0x12, 0x8B, 0x86, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, -0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0x31, 0x39, 0xAD, 0x0E, 0x7F, 0x51, 0x31, 0x39, -0xAD, 0x0F, 0x7F, 0x52, 0x31, 0x39, 0xAD, 0x10, 0x7F, 0x53, 0x21, 0x39, 0x12, 0xA1, 0x39, 0x7F, -0xF2, 0x51, 0x4E, 0xEF, 0x20, 0xE6, 0x09, 0x7F, 0x05, 0xD1, 0x81, 0xFD, 0x7F, 0x05, 0x31, 0x39, -0x22, 0x51, 0x4E, 0xEF, 0x44, 0x80, 0x22, 0x12, 0x79, 0x62, 0xE4, 0x90, 0x93, 0x22, 0xB1, 0xB3, -0x90, 0x90, 0x74, 0xB1, 0xB3, 0xA3, 0xB1, 0xB3, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0x86, 0xF0, -0xA3, 0xF0, 0x90, 0x90, 0xC8, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x8E, 0x17, 0xE0, 0x90, 0x94, 0x6B, -0xF0, 0x7D, 0x02, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2D, 0xEF, -0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, 0x90, -0x8E, 0x11, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x8E, 0x18, 0xED, 0xF0, 0x80, 0x05, -0x90, 0x8E, 0x17, 0xED, 0xF0, 0xD1, 0x1B, 0x30, 0xE4, 0x30, 0x90, 0x95, 0x2D, 0xE0, 0x14, 0x60, -0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x22, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0x01, 0xC4, 0x33, -0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, -0x07, 0x90, 0x8E, 0x17, 0xE0, 0xFD, 0x7F, 0x89, 0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, -0x00, 0x7F, 0xA8, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0x11, 0x12, 0x08, 0xAA, 0x12, 0x89, -0xB2, 0x12, 0x08, 0xAA, 0x90, 0x8E, 0x14, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x1B, 0x14, 0x12, 0xA1, -0x80, 0x90, 0x8E, 0x21, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x12, 0xA0, 0x26, 0xE4, 0xFD, 0xFF, -0xD1, 0xB5, 0x7D, 0x0C, 0x7F, 0x02, 0xD1, 0xB5, 0xF1, 0xD9, 0x90, 0x8D, 0x06, 0xE0, 0xFF, 0xB4, -0x01, 0x08, 0x90, 0x8E, 0x20, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x8E, 0x20, 0xB4, 0x03, -0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x51, 0x4E, 0xEF, 0x54, 0x03, -0xFF, 0xBF, 0x02, 0x0E, 0x7F, 0x28, 0x51, 0x4E, 0xEF, 0x30, 0xE2, 0x06, 0x90, 0x8E, 0x4B, 0x74, -0x02, 0xF0, 0x12, 0x7F, 0x83, 0x12, 0xA0, 0x26, 0x7F, 0x01, 0x12, 0x9D, 0x05, 0x7E, 0x00, 0x7F, -0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xBD, 0x12, 0x08, 0xAA, 0x12, 0x67, 0xF4, 0x12, -0xA1, 0x29, 0xF1, 0xE9, 0xE4, 0x90, 0x8E, 0xBF, 0xF0, 0x22, 0x51, 0x4E, 0xEF, 0x44, 0x40, 0xFD, -0x22, 0x7F, 0xF4, 0x51, 0x4E, 0xEF, 0x20, 0xE5, 0x0D, 0x7F, 0xF4, 0x51, 0x4E, 0xEF, 0x7F, 0x01, -0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x7D, 0x0C, 0x7F, 0x01, 0xC1, 0xB5, 0xF0, -0x7F, 0x10, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xB1, 0xE7, 0xE4, 0xFD, 0xFF, 0x02, 0x53, 0xD9, 0xF1, -0xE7, 0x7D, 0x0C, 0x7F, 0x01, 0xC1, 0xB5, 0x22, 0xA1, 0xBB, 0x90, 0x8E, 0xE2, 0xE0, 0xFF, 0x90, -0x8E, 0xE1, 0xE0, 0xFB, 0x90, 0x8E, 0xE3, 0xE0, 0x90, 0x94, 0xF8, 0xF0, 0x22, 0x90, 0x94, 0xE3, -0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x94, 0xDE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xE2, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, -0x3C, 0x12, 0x36, 0x3E, 0x90, 0x94, 0xDE, 0x12, 0xA1, 0x17, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x94, 0xE9, 0xF0, 0x7F, 0x03, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xE4, 0xEF, 0xF0, 0x12, 0x90, 0x4C, 0x90, 0x94, 0xE4, 0xE0, 0xFF, -0x31, 0x5B, 0x74, 0x01, 0xF0, 0x90, 0x94, 0xE9, 0xE0, 0xFE, 0xEF, 0x31, 0x69, 0xEE, 0xF0, 0x90, -0x94, 0xE4, 0xE0, 0x11, 0xB0, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x11, 0xA5, 0x78, 0x10, -0x12, 0x08, 0x47, 0xAB, 0x07, 0x11, 0xA5, 0x78, 0x08, 0x12, 0x08, 0x47, 0x90, 0x94, 0xE2, 0xEF, -0xF0, 0x11, 0xA5, 0x90, 0x94, 0xE3, 0xEF, 0xF0, 0x7D, 0x01, 0x7F, 0x50, 0x7E, 0x01, 0x11, 0x18, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0xE5, 0x02, 0x43, 0xE5, 0x90, 0x93, 0x46, 0xE0, 0xFB, -0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xE4, 0x90, -0x93, 0x46, 0xF0, 0x90, 0x93, 0x46, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x40, 0x02, 0x21, 0x53, 0xEF, -0x31, 0x5B, 0xE0, 0x64, 0x01, 0x70, 0x74, 0x90, 0x93, 0x46, 0xE0, 0x11, 0xB0, 0x12, 0x43, 0xE5, -0xE4, 0x7B, 0x01, 0x31, 0x54, 0x70, 0x3A, 0x90, 0x93, 0x46, 0xE0, 0xFB, 0x31, 0x69, 0xE0, 0x60, -0x21, 0x14, 0x70, 0x57, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x94, -0xF5, 0x83, 0x12, 0x43, 0xE5, 0xEB, 0x11, 0xB0, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x46, 0xE0, 0xFF, -0x80, 0x0B, 0x11, 0xAB, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0x31, 0x77, 0x80, -0x2A, 0x90, 0x93, 0x46, 0xE0, 0x11, 0xB0, 0x12, 0x43, 0xE5, 0xE4, 0xFB, 0x31, 0x54, 0x50, 0x1B, -0x11, 0xAB, 0x12, 0x43, 0xE5, 0xEF, 0x24, 0xFF, 0xFF, 0xEE, 0x34, 0xFF, 0xFE, 0xED, 0x34, 0xFF, -0xFD, 0xEC, 0x34, 0xFF, 0xFC, 0xEB, 0x11, 0xB0, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x46, 0xE0, 0x04, -0xF0, 0x01, 0xC3, 0x22, 0xFA, 0xF9, 0xF8, 0xC3, 0x02, 0x43, 0xD4, 0x75, 0xF0, 0x0A, 0xA4, 0x24, -0x0A, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x09, 0xF5, -0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xEF, 0x24, 0xFC, 0x60, 0x05, 0x04, 0x70, 0x05, 0x80, -0x04, 0x12, 0x81, 0x22, 0x22, 0xE4, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x94, 0x6F, 0x04, 0xF0, 0x90, -0x06, 0x32, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0x12, 0x12, 0x43, 0xE5, 0x12, 0xA1, 0x40, 0xE4, -0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0x12, 0x12, 0x08, 0x6D, 0x12, 0x9E, 0xFB, 0xE4, 0x90, -0x94, 0x53, 0xF0, 0xFF, 0x12, 0x9F, 0x6D, 0x12, 0x73, 0x13, 0x70, 0x28, 0x31, 0xF3, 0x7F, 0x05, -0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x12, 0x4E, 0xA9, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x02, 0x60, 0x14, -0x90, 0x93, 0x47, 0xE0, 0x04, 0xF0, 0x12, 0xA1, 0x39, 0x31, 0xF3, 0x90, 0x93, 0x47, 0xE0, 0xD3, -0x94, 0x0A, 0x40, 0xE4, 0x90, 0x94, 0xE5, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0A, 0x12, 0x83, -0x95, 0x01, 0x4C, 0x7D, 0x01, 0x7F, 0x02, 0x80, 0x04, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2F, 0xED, 0xF0, 0x90, 0x8E, 0x11, 0xE0, 0xFE, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x61, 0x47, 0xEE, 0x12, 0x79, 0x1A, 0x30, 0xE0, 0x02, 0x61, -0x47, 0x90, 0x8E, 0x18, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x61, 0x47, 0xEF, 0x70, 0x02, 0x41, 0xBE, -0x24, 0xFE, 0x70, 0x02, 0x41, 0xF8, 0x24, 0xFE, 0x60, 0x4B, 0x24, 0xFC, 0x70, 0x02, 0x61, 0x34, -0x24, 0xFC, 0x60, 0x02, 0x61, 0x47, 0xEE, 0xB4, 0x0E, 0x02, 0x71, 0x67, 0x90, 0x8E, 0x18, 0xE0, -0x70, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0x6C, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0x83, -0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x95, 0x2F, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x9B, -0x11, 0x80, 0x03, 0x12, 0x77, 0x5E, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, 0x47, -0x12, 0x4F, 0xEF, 0x61, 0x47, 0x90, 0x8E, 0x18, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0x6C, -0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0x83, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x0E, 0x07, -0x71, 0x4C, 0xBF, 0x01, 0x02, 0x71, 0x67, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, -0x47, 0x71, 0x4C, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, 0x47, 0x71, 0xA5, 0x61, 0x47, 0x90, 0x8E, -0x18, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0x4C, 0xBF, 0x01, 0x02, 0x71, 0x67, 0x90, 0x8E, 0x18, 0xE0, -0xB4, 0x06, 0x02, 0x71, 0x83, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0x4C, 0xBF, 0x01, -0x02, 0x71, 0xA5, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0x9A, 0x5D, 0xEF, 0x64, -0x01, 0x70, 0x54, 0x12, 0x9B, 0x43, 0x80, 0x4F, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x0E, 0x07, 0x71, -0x4C, 0xBF, 0x01, 0x02, 0x71, 0x67, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0x83, 0x90, -0x8E, 0x18, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0x4C, 0xBF, 0x01, 0x02, 0x71, 0xA5, 0x90, 0x8E, 0x18, -0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0x6C, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x04, 0x18, 0x12, -0x9B, 0x5E, 0x80, 0x13, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x0C, 0x0C, 0x90, 0x8E, 0x12, 0x12, 0x67, -0xED, 0x30, 0xE0, 0x03, 0x12, 0x9D, 0x2E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x9A, 0x44, 0xBF, -0x01, 0x12, 0x12, 0xA0, 0x70, 0x20, 0xE0, 0x0C, 0x90, 0x8E, 0x17, 0xE0, 0xD3, 0x94, 0x04, 0x50, -0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x8E, 0x12, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, -0x7D, 0x0C, 0x80, 0x05, 0x12, 0xA0, 0x87, 0x7D, 0x04, 0x7F, 0x01, 0x12, 0x4E, 0xB5, 0xE4, 0xFD, -0xFF, 0x80, 0x56, 0x90, 0x8E, 0x12, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, -0xF0, 0x7D, 0x04, 0x80, 0x06, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x4E, 0xB5, -0xE4, 0xFD, 0xFF, 0x80, 0x34, 0x12, 0x73, 0x13, 0x70, 0x25, 0x90, 0x8E, 0x12, 0xE0, 0x54, 0xFD, -0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x71, 0xD9, 0x7D, 0x08, 0x7F, 0x01, 0x12, 0x65, 0x59, 0xBF, 0x01, -0x0E, 0x90, 0x8E, 0x11, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x12, 0x4E, 0xB5, 0x22, -0xE4, 0xFD, 0x7F, 0x0C, 0x31, 0xFD, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x8D, -0x05, 0xED, 0xF0, 0x22, 0x90, 0x93, 0x73, 0x12, 0x44, 0x12, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, -0x84, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0A, 0x7D, 0x39, 0x12, 0x8F, 0xCB, 0xBF, 0x01, 0x10, -0x80, 0x00, 0x90, 0x93, 0x1A, 0x12, 0x64, 0x32, 0x90, 0x93, 0x81, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x93, 0x81, 0x12, 0x97, 0xC4, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x81, 0x12, 0x9F, -0xF1, 0x90, 0x93, 0x7F, 0xE0, 0xFD, 0x12, 0x98, 0x0A, 0x90, 0x93, 0x80, 0xE0, 0x60, 0x02, 0x81, -0xBF, 0xD1, 0x8B, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0x76, 0xD1, 0x7A, 0x75, 0x43, -0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0xB1, 0x5D, 0x12, 0x9F, 0xFD, 0xC0, -0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0x73, 0xD1, 0x7A, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, -0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0xB1, 0x5D, 0xD1, 0x8E, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, -0xD1, 0x77, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0xB1, 0x5D, -0x24, 0x60, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xD1, -0x77, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0xB1, 0x5D, 0x24, -0x72, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, -0x7C, 0xD1, 0x7A, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, -0x93, 0x79, 0x12, 0x44, 0x09, 0x90, 0x93, 0xB0, 0x12, 0x44, 0x12, 0x90, 0x93, 0xB3, 0x12, 0x08, -0x79, 0x00, 0x00, 0x00, 0x20, 0x90, 0x93, 0xB7, 0x74, 0x3A, 0xF0, 0x90, 0x93, 0x73, 0x12, 0x44, -0x09, 0x12, 0x99, 0x40, 0xB1, 0x5D, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0x04, 0x75, 0x43, -0x28, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x85, 0x12, 0x35, 0x26, 0xB1, 0x5D, 0x12, 0xA0, 0xCB, 0xC0, -0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x68, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, -0x26, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x82, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x81, 0xE0, -0x34, 0x00, 0xCF, 0x24, 0x30, 0xFD, 0xE4, 0x3F, 0xFC, 0x90, 0x93, 0x1A, 0xE0, 0xFB, 0x7F, 0x3A, -0x12, 0x62, 0x1B, 0xB1, 0x5D, 0x12, 0xA0, 0xCB, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x93, 0x75, -0x42, 0x85, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x02, -0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x7D, 0x3A, 0x71, 0xD9, 0x02, 0x58, 0x01, 0x90, 0x93, 0x81, -0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, -0xA9, 0x12, 0x44, 0x12, 0x78, 0xB5, 0x7C, 0x94, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x64, -0xF1, 0xF5, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0xB4, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0A, -0x7D, 0x33, 0x12, 0x8F, 0xCB, 0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x93, 0x19, 0x12, 0x64, 0x32, -0x90, 0x94, 0xB1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xB1, 0x12, 0x97, 0xC4, 0x90, 0x94, -0xB3, 0xEF, 0xF0, 0x90, 0x94, 0xB1, 0x12, 0x9F, 0xF1, 0x90, 0x94, 0xAF, 0xE0, 0xFD, 0x12, 0x98, -0x0A, 0x90, 0x94, 0xB0, 0xE0, 0x70, 0x4E, 0xD1, 0x8B, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, -0x94, 0xAC, 0xD1, 0x7A, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1, 0x84, 0xB1, -0x60, 0xF1, 0xEE, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0xAC, 0xD1, -0x7A, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1, 0x84, 0xB1, 0x60, 0x12, 0x9F, -0xFD, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0xA9, 0xD1, 0x7A, 0x75, 0x43, 0x04, 0xD0, -0x01, 0xD0, 0x02, 0x80, 0x45, 0x90, 0x94, 0xB0, 0xE0, 0x64, 0x01, 0x70, 0x42, 0xD1, 0x8B, 0xC0, -0x03, 0x8B, 0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xE4, 0x75, 0x43, 0x06, 0xD0, 0x03, 0xD1, 0x84, -0xB1, 0x60, 0xF1, 0xEE, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, -0xEE, 0x75, 0x43, 0x06, 0xD0, 0x03, 0xD1, 0x84, 0xB1, 0x60, 0x12, 0x9F, 0xFD, 0xC0, 0x03, 0x8B, -0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xF4, 0x75, 0x43, 0x04, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, -0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x94, 0xB4, 0xE0, 0xFF, 0x7D, 0x34, 0x71, 0xD9, 0x12, -0x58, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x79, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, -0x41, 0x89, 0x42, 0x22, 0x12, 0x35, 0x26, 0x90, 0x94, 0xB1, 0x22, 0xA3, 0xA3, 0xE0, 0x24, 0x38, -0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0xF1, 0xC8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, -0x93, 0x4A, 0x12, 0x97, 0xC4, 0x90, 0x93, 0x4C, 0xEF, 0xF0, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, -0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0x04, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xE4, -0xF1, 0xE7, 0xB1, 0x60, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0x04, 0x75, 0x43, 0x04, 0x7B, -0x01, 0x7A, 0x8E, 0x79, 0xEA, 0xF1, 0xE7, 0xB1, 0x60, 0xF1, 0xEE, 0xF1, 0x04, 0x75, 0x43, 0x06, -0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xEE, 0xF1, 0xE7, 0xB1, 0x60, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, -0xF1, 0x04, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xF4, 0x02, 0x35, 0x26, 0x24, 0x00, -0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x22, 0x90, 0x93, 0x23, 0xF1, -0xC6, 0xEF, 0xF0, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, -0x74, 0x29, 0x2E, 0x12, 0x65, 0xC6, 0xFD, 0x90, 0x93, 0x4A, 0xE0, 0x24, 0x2C, 0x12, 0x97, 0xE1, -0x90, 0x93, 0x4A, 0xE0, 0x2F, 0x24, 0x30, 0xA3, 0xF0, 0xE0, 0xFD, 0x24, 0x04, 0x12, 0x66, 0xE7, -0xE0, 0xFE, 0x74, 0x05, 0x2D, 0x12, 0x66, 0xDB, 0x12, 0x84, 0xA3, 0x90, 0x90, 0x7E, 0xF0, 0xA3, -0xEF, 0xF0, 0x90, 0x93, 0x4B, 0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0x04, 0x75, 0x43, -0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x80, 0x12, 0x35, 0x26, 0x90, 0x93, 0x4B, 0xE0, 0x24, 0x14, -0xF0, 0xE0, 0xFD, 0x24, 0x01, 0x12, 0x63, 0xE8, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0x12, 0x5A, 0xFC, -0x12, 0x84, 0xA3, 0x90, 0x90, 0x84, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x24, 0xF1, 0xC6, 0xEF, -0xF0, 0x90, 0x90, 0x7A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x4E, 0x60, 0x11, 0x90, 0x93, 0x4A, 0xE0, -0xD1, 0xFE, 0x8F, 0x43, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x88, 0x12, 0x35, 0x26, 0x90, 0x93, 0x25, -0xF1, 0xC6, 0xEF, 0xF0, 0xD1, 0xFE, 0x90, 0x90, 0x7C, 0xA3, 0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A, -0x90, 0x79, 0xA8, 0x02, 0x35, 0x26, 0xE0, 0xFF, 0xF1, 0xD3, 0x90, 0x93, 0x4A, 0x22, 0x90, 0x8D, -0xFD, 0xE0, 0xFF, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, -0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x12, 0x35, 0x26, 0x90, 0x93, 0x4A, 0x22, 0x24, 0x42, -0xF9, 0xE4, 0x34, 0xFC, 0x22, 0x7E, 0x00, 0x7F, 0x06, 0x02, 0x06, 0x63, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0x54, 0x12, 0x96, 0x66, 0x90, 0x93, 0x6C, 0x74, 0x18, 0xF0, 0x7E, 0x00, 0x7F, 0x80, 0x7D, -0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x74, 0x12, 0x08, 0xAA, 0x90, 0x01, 0xC4, 0x74, 0x08, 0xF0, -0x74, 0x58, 0xA3, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0x12, 0x57, 0xD3, 0x90, 0x93, 0x6B, 0xEF, -0xF0, 0xF9, 0xE0, 0xFE, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x41, 0xF0, -0xEE, 0x24, 0x28, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x6C, 0xE0, 0x7A, 0x00, 0x2D, 0xFE, 0xEA, -0x3C, 0x90, 0x93, 0x70, 0xF0, 0xA3, 0xCE, 0xF0, 0x74, 0x28, 0x29, 0x12, 0x9F, 0xF5, 0x90, 0x93, -0x56, 0xE0, 0xFD, 0x12, 0x98, 0x0A, 0x12, 0x9F, 0xDD, 0x90, 0x93, 0x70, 0xE0, 0xFF, 0xA3, 0xE0, -0x90, 0x93, 0x6E, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x74, 0x74, 0x01, 0xF0, 0xA3, 0x74, -0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x93, 0x70, 0x12, 0x94, 0x41, 0x90, -0x8F, 0xDE, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE, 0x02, 0x7E, 0xFE, 0x90, 0x93, 0x70, 0xA3, 0xE0, -0xFD, 0x51, 0xFA, 0xEE, 0xF0, 0x74, 0x00, 0x2D, 0x51, 0xFC, 0xE0, 0x90, 0x93, 0x78, 0xF0, 0x90, -0x93, 0x70, 0x12, 0x61, 0x77, 0x90, 0x90, 0x73, 0xE0, 0x90, 0x93, 0x54, 0xB4, 0x01, 0x0B, 0xE0, -0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD, 0x80, 0x09, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, -0x44, 0x20, 0xFD, 0x90, 0x93, 0x72, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0x79, 0x74, 0x03, -0xF0, 0xA3, 0x74, 0x12, 0xF0, 0x12, 0xA0, 0xB6, 0xEF, 0x64, 0xFE, 0x70, 0x27, 0x90, 0x93, 0x70, -0xA3, 0xE0, 0x24, 0x00, 0x12, 0x9A, 0x24, 0xC0, 0x03, 0x8B, 0x40, 0x12, 0xA0, 0xD5, 0xD0, 0x03, -0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0x12, 0xA0, 0xD5, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7B, 0x12, -0x35, 0x26, 0x80, 0x58, 0x90, 0x93, 0x16, 0xE0, 0xFF, 0xB4, 0x02, 0x27, 0x90, 0x93, 0x70, 0xE0, -0xFC, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0xE4, 0xF0, 0x74, -0x01, 0x2D, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0x74, 0x20, 0x12, 0xA1, 0x58, 0x74, 0x20, -0xF0, 0x80, 0x29, 0xEF, 0xB4, 0x04, 0x25, 0x90, 0x93, 0x70, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, -0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0x74, -0xFC, 0x3E, 0xF5, 0x83, 0x74, 0x10, 0x12, 0xA1, 0x58, 0x74, 0x10, 0xF0, 0x12, 0xA0, 0xB6, 0xE4, -0x90, 0x93, 0x6D, 0xF0, 0x12, 0xA0, 0x07, 0xFE, 0x90, 0x93, 0x70, 0xA3, 0xE0, 0xFD, 0xEF, 0x2D, -0x51, 0xFA, 0xEE, 0xF0, 0x12, 0xA0, 0x07, 0xFE, 0x74, 0x7D, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, -0xF5, 0x83, 0xEE, 0xF1, 0xBF, 0xE0, 0xB4, 0x08, 0xDB, 0x12, 0x9F, 0xE7, 0x90, 0x93, 0x70, 0xF1, -0xF6, 0x90, 0x93, 0x70, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0x12, 0x9F, 0xDD, 0xE4, 0x90, -0x93, 0xF7, 0xF0, 0xE4, 0x90, 0x93, 0x6D, 0xF0, 0x12, 0xA0, 0xFC, 0x50, 0x0A, 0x12, 0x8F, 0xAA, -0x51, 0xF9, 0xE4, 0xF1, 0xBF, 0x80, 0xF1, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x06, -0x31, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0xFD, 0x12, 0x9A, 0x18, 0xCE, 0xC3, 0x13, -0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xAC, 0x7B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0xFF, 0x90, -0x93, 0x1B, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0xEF, 0x78, 0x07, 0xC3, 0x33, 0xCE, -0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x6C, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, 0xCF, -0x24, 0x38, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0x7B, 0x63, 0xE4, 0xFD, -0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x74, 0x90, 0xAC, 0xA0, 0x12, 0x44, 0x12, 0x7A, -0x93, 0x79, 0x57, 0x90, 0xAC, 0xA3, 0x12, 0x44, 0x12, 0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, -0x8F, 0x79, 0x9A, 0x12, 0x35, 0x86, 0x90, 0x93, 0xF7, 0xE0, 0x04, 0xF0, 0x90, 0x06, 0x31, 0xE0, -0x30, 0xE2, 0x07, 0x12, 0xA1, 0x50, 0x50, 0x02, 0x21, 0xC3, 0x12, 0xA1, 0x50, 0x40, 0x0A, 0x90, -0x06, 0x35, 0xE0, 0x44, 0x20, 0x90, 0x06, 0x34, 0xF0, 0xE4, 0x90, 0x93, 0x6D, 0xF0, 0x12, 0xA0, -0xFC, 0x50, 0x1C, 0x12, 0x8F, 0xAA, 0x90, 0x93, 0x6D, 0xE0, 0x24, 0x57, 0xF5, 0x82, 0xE4, 0x34, -0x93, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x6B, 0x51, 0xF9, 0xEF, 0xF1, 0xBF, 0x80, 0xDF, 0x90, -0x04, 0x1D, 0xE0, 0x60, 0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0xF6, 0xF0, 0x7D, 0x1D, 0x12, -0x8F, 0xCB, 0xBF, 0x01, 0x06, 0x12, 0x64, 0x2F, 0x12, 0xA0, 0x3E, 0x90, 0x93, 0xF6, 0xE0, 0xFF, -0x7D, 0x1E, 0x12, 0x53, 0xD9, 0x80, 0x06, 0x12, 0x64, 0x2F, 0x12, 0xA0, 0x3E, 0x11, 0x01, 0x90, -0x8E, 0x18, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0x6C, 0x74, 0x08, 0x04, 0x90, 0x01, 0xC4, -0xF0, 0x74, 0x58, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x42, 0x90, 0xA8, 0x04, 0xA9, -0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x93, 0x4A, 0xF0, -0xA3, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0x12, -0x57, 0xD3, 0x7E, 0x00, 0x90, 0x93, 0x4A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x51, 0xFA, 0xE0, 0x90, -0x90, 0xCA, 0xF0, 0x74, 0x01, 0x2F, 0x12, 0x63, 0xE8, 0xE0, 0x90, 0x90, 0xCB, 0xF0, 0x90, 0x01, -0xA0, 0xF0, 0x90, 0x93, 0x4A, 0x12, 0x94, 0x41, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x02, 0x12, -0x67, 0x56, 0xFF, 0xE4, 0xFC, 0xFD, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, -0x06, 0xC0, 0x07, 0xF1, 0xE9, 0xB1, 0x7E, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, -0xDC, 0xB1, 0x7E, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, -0x51, 0xEA, 0xB1, 0x80, 0x12, 0x42, 0x90, 0x90, 0x90, 0xCE, 0xB1, 0x65, 0x78, 0x10, 0x12, 0x08, -0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, 0xE9, 0xB1, 0x7E, 0x78, 0x18, 0x12, -0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, -0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, 0xDC, 0xB1, 0x7E, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, -0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x51, 0xEA, 0xB1, 0x80, 0x12, 0x42, 0x90, 0x90, 0x90, 0xD2, -0xB1, 0x65, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, -0xE9, 0xB1, 0x7E, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, -0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, 0xDC, 0xB1, 0x7E, 0x78, -0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x51, 0xEA, 0xB1, 0x80, -0x12, 0x42, 0x90, 0x90, 0x90, 0xD6, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x4A, 0xE4, 0x75, 0xF0, 0x04, -0xF1, 0xB6, 0xF1, 0xC7, 0x51, 0xFA, 0xE0, 0xFF, 0x12, 0x96, 0x84, 0xB1, 0x87, 0xE0, 0xB4, 0x10, -0xF1, 0xF1, 0xAF, 0xF1, 0xC7, 0x51, 0xFA, 0xE0, 0xFF, 0x74, 0xEA, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0x90, 0xB1, 0x87, 0xE0, 0xB4, 0x10, 0xEC, 0xF1, 0xAF, 0xF1, 0xC7, 0x51, 0xFA, 0xE0, 0xFF, 0x74, -0xFA, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xB1, 0x87, 0xE0, 0xB4, 0x10, 0xEC, 0xF1, 0xAF, 0x90, -0x93, 0x4C, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x1F, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0xFE, 0xEF, -0x2E, 0x51, 0xFA, 0xE0, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xFD, 0xEE, 0x2D, 0xFE, 0x74, 0x0A, 0x2F, -0x12, 0x83, 0x8D, 0xEE, 0xB1, 0x8A, 0x80, 0xD7, 0x90, 0x91, 0x0A, 0xE0, 0x90, 0x01, 0xA1, 0xF0, -0x90, 0x91, 0x0B, 0xE0, 0x90, 0x01, 0xA2, 0xF0, 0x90, 0x91, 0x0C, 0xE0, 0x90, 0x01, 0xA3, 0xF0, -0x90, 0x91, 0x0D, 0xE0, 0x90, 0x01, 0xA4, 0xF0, 0x90, 0x91, 0x0E, 0xE0, 0x90, 0x01, 0xA5, 0xF0, -0x90, 0x93, 0x26, 0xE0, 0x04, 0x90, 0x93, 0x4E, 0xF0, 0xE4, 0x90, 0x93, 0x4D, 0xF0, 0x90, 0x90, -0xCA, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4D, 0xE0, -0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x63, 0xA3, 0x12, 0x57, 0xC6, 0xE4, -0x12, 0xA1, 0x31, 0x90, 0x93, 0x4C, 0xE0, 0xFD, 0xC3, 0x94, 0x04, 0x50, 0x46, 0xA3, 0xE0, 0x75, -0xF0, 0x04, 0xA4, 0x7C, 0x00, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0xEF, 0x78, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x24, 0x12, 0xF9, 0x74, 0x91, 0x3E, 0xFA, 0x7B, 0x01, 0xC0, 0x03, -0xC0, 0x01, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x8B, 0x40, 0xF5, -0x41, 0x89, 0x42, 0x75, 0x43, 0x20, 0xD0, 0x01, 0xD0, 0x03, 0x12, 0x57, 0xE7, 0xF1, 0xF6, 0xB1, -0x8B, 0x80, 0xB0, 0x12, 0xA0, 0x50, 0x90, 0x93, 0x4D, 0xE0, 0x04, 0xF0, 0x80, 0x80, 0xE4, 0x90, -0x93, 0x4C, 0xF0, 0xE4, 0xFF, 0x0F, 0xEF, 0xB4, 0x20, 0xFB, 0xB1, 0x8B, 0xE0, 0xB4, 0x10, 0xF3, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x4A, 0xE4, 0x75, 0xF0, 0x04, 0x12, -0x08, 0xD6, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x04, -0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2A, 0xED, 0xF0, 0xEF, 0x14, -0x60, 0x02, 0xC1, 0x64, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x95, 0x2A, 0xE0, 0xC4, -0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0x94, 0x99, -0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, -0x01, 0xF1, 0x30, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, -0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, -0x10, 0x90, 0x95, 0x2A, 0xB1, 0x80, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, -0x78, 0x04, 0xF1, 0xA6, 0x7F, 0x00, 0x7E, 0x0A, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, -0x00, 0x90, 0x95, 0x2A, 0xB1, 0x80, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0xF1, 0xA6, 0x7F, -0x00, 0x7E, 0x0D, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x90, 0x95, 0x2A, 0xB1, -0x80, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x1A, 0xF1, 0xA6, 0x7F, 0x18, 0xF1, 0x32, 0x12, 0x08, -0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xF1, -0xD2, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0x8B, 0x12, 0x08, 0x79, 0x00, 0x00, -0x04, 0x00, 0x80, 0x58, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0x99, 0x12, 0x08, -0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xF1, -0x30, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, -0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0xF1, 0xD2, 0x12, 0x08, 0x79, 0x00, 0x00, -0x0C, 0x00, 0x90, 0x94, 0x8B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, -0xE4, 0xFF, 0x12, 0x82, 0xBE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x58, 0x7E, 0x0C, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x97, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, -0x90, 0x94, 0xA1, 0x12, 0x08, 0x6D, 0x90, 0x94, 0x99, 0x12, 0x43, 0xE5, 0x12, 0x08, 0x3A, 0x90, -0x94, 0xA1, 0x12, 0x83, 0x43, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0x99, -0x12, 0x43, 0xE5, 0x90, 0x94, 0x9D, 0x12, 0x83, 0x43, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, -0x00, 0x12, 0x43, 0xC7, 0x90, 0x94, 0xA5, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xA5, 0x12, 0x61, 0x58, -0x90, 0x94, 0x97, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x7F, 0x00, 0x7E, 0x08, 0xD1, 0xCE, 0x90, 0x94, 0x99, 0x22, 0x90, 0x8D, 0xFB, 0x12, 0x67, 0xED, -0x30, 0xE0, 0x08, 0x12, 0xA1, 0x48, 0xE4, 0x90, 0x94, 0x6E, 0xF0, 0x90, 0x94, 0x99, 0x12, 0x08, -0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x54, 0xB1, 0x80, 0xF1, 0xA9, 0x7F, 0x50, 0x7E, 0x0C, -0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x55, 0xB1, 0x80, 0xF1, 0xA9, -0xD1, 0xCA, 0x90, 0x94, 0x6A, 0xE0, 0x90, 0x06, 0x08, 0xF0, 0x90, 0x94, 0x6C, 0xA3, 0xE0, 0x90, -0x06, 0xA0, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x94, 0x58, 0xE0, 0xFF, 0x60, 0x05, 0xA3, 0xE0, 0xFD, -0xB1, 0x92, 0x90, 0x94, 0x57, 0xE0, 0xFF, 0x60, 0x0C, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0x12, -0x83, 0xA5, 0x12, 0x82, 0x4A, 0x22, 0x12, 0x08, 0x5A, 0x90, 0x94, 0x9D, 0x02, 0x08, 0x6D, 0x90, -0x93, 0x4A, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, 0x4C, 0xF0, 0x22, 0xF0, -0x90, 0x93, 0x6D, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, -0x2F, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0xD1, 0xCE, 0x90, 0x94, 0x87, 0x22, 0x90, 0x93, 0x4A, 0xA3, -0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x22, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x03, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x22, 0xE4, 0x75, 0xF0, 0x20, 0x02, 0x08, 0xD6, 0x75, 0xE8, 0x03, -0x75, 0xA8, 0x85, 0x22, 0xE4, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x93, 0x3C, 0xE0, 0x64, 0x01, 0xF0, -0x24, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, -0x12, 0x31, 0xFC, 0xC2, 0xAF, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x0F, 0x90, 0x8E, 0x18, 0xE0, 0xFF, -0x90, 0x8E, 0x17, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x74, 0xB2, 0xC2, 0xAF, 0x12, 0x8B, 0xD3, 0xBF, -0x01, 0x02, 0x11, 0x59, 0xD2, 0xAF, 0xD2, 0xAF, 0x90, 0x93, 0x34, 0xE0, 0xB4, 0x01, 0x02, 0x11, -0xF6, 0x12, 0x4F, 0xF8, 0x12, 0x46, 0x38, 0x80, 0xB0, 0x90, 0x8E, 0x11, 0xE0, 0x30, 0xE0, 0x02, -0x11, 0x63, 0x22, 0x90, 0x8E, 0x18, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x08, 0x12, 0x9A, 0xDB, -0xBF, 0x01, 0x02, 0x11, 0x76, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4D, 0x0C, -0x11, 0x87, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x90, 0x14, 0x7F, 0x08, 0x12, 0x4A, 0x4E, 0xEF, -0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x49, 0x39, 0xE4, 0xFF, 0x11, 0xA4, 0x90, 0x8E, 0x12, 0xE0, -0x54, 0xEF, 0xF0, 0x22, 0x90, 0x95, 0x17, 0xEF, 0xF1, 0xE6, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, -0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x95, 0x17, 0xE0, 0x6F, 0x60, 0x39, 0xC3, 0x90, 0x95, 0x19, -0xE0, 0x94, 0x88, 0x90, 0x95, 0x18, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, -0x10, 0xF0, 0x22, 0x90, 0x95, 0x18, 0x31, 0x77, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, -0x90, 0x95, 0x19, 0xE0, 0x94, 0x32, 0x90, 0x95, 0x18, 0xE0, 0x94, 0x00, 0x40, 0xBC, 0x90, 0x01, -0xC6, 0xE0, 0x30, 0xE0, 0xB5, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, -0x08, 0x12, 0x37, 0x4E, 0x90, 0x93, 0x3D, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, -0x4E, 0x90, 0x93, 0x41, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x3D, 0x31, 0x6A, 0x60, 0x17, 0x90, 0x93, -0x3D, 0x31, 0x61, 0x90, 0x93, 0x3D, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x3D, 0x31, 0x58, 0x7F, 0x00, -0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0x93, 0x41, 0x31, 0x6A, 0x60, 0x17, 0x90, 0x93, 0x41, 0x31, -0x61, 0x90, 0x93, 0x41, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x41, 0x31, 0x58, 0x7F, 0x00, 0x7E, 0x09, -0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x43, 0xE5, 0x90, 0xAA, 0xB9, 0x02, 0x08, -0x6D, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x22, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0x01, -0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x22, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, 0xAD, 0x07, -0x90, 0x90, 0x7E, 0x31, 0x77, 0x90, 0x90, 0x7E, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x04, 0x2E, 0xD1, -0xE7, 0xEF, 0xF0, 0x90, 0x90, 0x7E, 0xA3, 0xE0, 0xFF, 0x74, 0x05, 0x2E, 0xD1, 0xDB, 0xEF, 0xF0, -0x22, 0xE4, 0x90, 0x93, 0xFB, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x20, 0xF0, 0x12, -0x8F, 0x6B, 0xEF, 0x64, 0x01, 0x70, 0x63, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, -0x91, 0x38, 0x12, 0xA0, 0xF3, 0x90, 0x93, 0xF8, 0x12, 0x97, 0xC4, 0x90, 0x93, 0xFA, 0xEF, 0xF0, -0x90, 0x93, 0xF8, 0x12, 0x9F, 0xF1, 0xE4, 0xFD, 0x12, 0x98, 0x0A, 0x90, 0x93, 0xFA, 0xE0, 0xFF, -0x90, 0x93, 0xF9, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xF8, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF, -0x34, 0x00, 0xFE, 0x90, 0x93, 0xFB, 0xF0, 0xA3, 0xEF, 0xF0, 0x31, 0x7E, 0x91, 0x1B, 0x90, 0x93, -0x23, 0xE0, 0xFB, 0xE4, 0xFF, 0x51, 0x1B, 0x91, 0x1B, 0x90, 0x93, 0x1F, 0xE0, 0xFB, 0x7F, 0x11, -0x51, 0x1B, 0x12, 0x58, 0x01, 0x90, 0x90, 0x86, 0x31, 0x77, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x90, 0x94, 0xC9, 0xEC, 0x12, 0x83, 0x9D, 0xAA, 0x07, 0x90, 0x94, 0xD0, 0x12, 0x08, -0x79, 0x00, 0x00, 0x00, 0x00, 0x91, 0x24, 0xEA, 0x24, 0xEF, 0x60, 0x3C, 0x24, 0xD7, 0x70, 0x02, -0x61, 0x7A, 0x24, 0x3A, 0x60, 0x02, 0x61, 0xB3, 0x71, 0xF0, 0x24, 0x0A, 0x71, 0xFF, 0xED, 0xF0, -0xFE, 0x12, 0x5A, 0xFA, 0x71, 0xE3, 0xE4, 0xF0, 0xFE, 0x74, 0x00, 0x2F, 0x91, 0x13, 0x7D, 0x14, -0x71, 0xCC, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0x71, 0xD7, 0x90, 0xAC, 0x6A, 0x12, 0x08, 0x6D, -0x7D, 0x14, 0x7C, 0x00, 0xE4, 0xFF, 0x61, 0x75, 0x90, 0x94, 0xC9, 0xE4, 0x75, 0xF0, 0x14, 0x12, -0x08, 0xD6, 0x90, 0x94, 0xC9, 0xA3, 0xE0, 0xFB, 0xFF, 0x24, 0x06, 0xFC, 0x91, 0x00, 0xCC, 0xF0, -0x90, 0x94, 0xD4, 0xA3, 0xE0, 0xFE, 0x12, 0x5A, 0xFA, 0x71, 0xE3, 0xE4, 0xD1, 0xE3, 0xE0, 0xFE, -0xA9, 0x03, 0x74, 0x05, 0x29, 0xD1, 0xDB, 0x12, 0x84, 0xA3, 0xFE, 0x90, 0x94, 0xCE, 0xF0, 0xA3, -0xEF, 0xF0, 0x90, 0x94, 0xC9, 0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0xEF, -0x94, 0x00, 0xEE, 0x94, 0x01, 0x90, 0x94, 0xC9, 0x40, 0x69, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE9, -0x7C, 0x00, 0x24, 0x00, 0xF9, 0xEC, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC3, 0xE4, 0x9F, 0xFD, 0x74, -0x01, 0x9E, 0xFC, 0x71, 0xCE, 0x90, 0x94, 0xCB, 0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, -0x13, 0xEF, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x91, 0x0D, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, -0x03, 0x7B, 0x01, 0x7A, 0xFC, 0x79, 0x00, 0x90, 0x94, 0xC9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, -0xE4, 0x9F, 0xFF, 0x74, 0x01, 0x9E, 0xFE, 0x71, 0xF7, 0xC3, 0x9F, 0xFD, 0xEC, 0x9E, 0xFC, 0x12, -0x26, 0x4E, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0x71, 0xD1, 0x91, -0x24, 0x80, 0x0D, 0xA3, 0xE0, 0x7E, 0x00, 0x24, 0x00, 0x91, 0x13, 0x71, 0xF7, 0xFD, 0x71, 0xCE, -0x90, 0x94, 0xC9, 0x74, 0xFF, 0x75, 0xF0, 0xEC, 0x12, 0x08, 0xD6, 0x71, 0xF0, 0x7E, 0x00, 0x24, +0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x51, 0x5D, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x31, 0x47, +0x7F, 0x01, 0x12, 0x8B, 0xAB, 0x7F, 0x90, 0x51, 0x5D, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x31, +0x47, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xFD, 0x7F, 0x4E, 0x31, 0x47, 0x7F, 0x4F, 0x51, +0x5D, 0xEF, 0x22, 0x7F, 0x67, 0x51, 0x5D, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x31, 0x47, 0x90, +0x95, 0x16, 0xE0, 0x22, 0x8E, 0x59, 0x8F, 0x5A, 0xBD, 0x01, 0x13, 0xE5, 0x5A, 0x78, 0x03, 0xCE, +0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xEE, 0x54, 0x1F, 0xFE, 0x02, 0x3D, 0xC2, 0xAF, 0x5A, +0xAE, 0x59, 0x02, 0x3E, 0x50, 0x90, 0x01, 0x30, 0xE4, 0xB1, 0xFA, 0x90, 0x01, 0x38, 0xB1, 0xFA, +0xFD, 0x7F, 0x50, 0x31, 0x47, 0xE4, 0xFD, 0x7F, 0x51, 0x31, 0x47, 0xE4, 0xFD, 0x7F, 0x52, 0x31, +0x47, 0xE4, 0xFD, 0x7F, 0x53, 0x21, 0x47, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xB1, 0xFA, 0x90, 0x01, +0x3C, 0xB1, 0xFA, 0xFD, 0x7F, 0x54, 0x31, 0x47, 0x7D, 0xFF, 0x7F, 0x55, 0x31, 0x47, 0x7D, 0xFF, +0x7F, 0x56, 0x31, 0x47, 0x7D, 0xFF, 0x7F, 0x57, 0x21, 0x47, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, +0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, +0x86, 0xF0, 0xF1, 0xF8, 0xE4, 0xFD, 0x31, 0x5B, 0x71, 0x77, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x31, +0x47, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xD1, 0x6F, 0x30, +0xE6, 0x28, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0x95, 0x39, 0xF0, 0x7F, 0x8D, 0x51, 0x5D, 0x90, 0x95, +0x3A, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0x95, 0x3B, 0xF0, 0x90, 0x95, 0x3A, 0xE0, 0xD1, +0x6F, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, 0x8D, 0x31, 0x47, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, +0x8F, 0x51, 0x5D, 0xEF, 0x22, 0x31, 0x47, 0x90, 0x95, 0x4B, 0xE0, 0x22, 0x7F, 0x48, 0x7E, 0x09, +0x12, 0x37, 0x4E, 0xE4, 0x22, 0x7F, 0x4E, 0x51, 0x5D, 0xEF, 0x54, 0x7F, 0x22, 0xB1, 0xB5, 0xB1, +0xD7, 0x12, 0x95, 0xFE, 0x12, 0x96, 0x1D, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, +0x80, 0xAD, 0x0D, 0x7F, 0x50, 0x31, 0x47, 0xAD, 0x0E, 0x7F, 0x51, 0x31, 0x47, 0xAD, 0x0F, 0x7F, +0x52, 0x31, 0x47, 0xAD, 0x10, 0x7F, 0x53, 0x21, 0x47, 0x12, 0xA6, 0xAD, 0x7F, 0xF2, 0x51, 0x5D, +0xEF, 0x20, 0xE6, 0x09, 0x7F, 0x05, 0xD1, 0xCE, 0xFD, 0x7F, 0x05, 0x31, 0x47, 0x22, 0x51, 0x5D, +0xEF, 0x44, 0x80, 0x22, 0x12, 0x67, 0xF4, 0xE4, 0x90, 0x93, 0x3A, 0xB1, 0xFA, 0x90, 0x90, 0x8C, +0xB1, 0xFA, 0xA3, 0xB1, 0xFA, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0x9E, 0xF0, 0xA3, 0xF0, 0x90, +0x90, 0xE0, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x93, 0xC3, 0xEF, 0xF0, 0xA3, 0x12, 0x44, 0x20, 0x90, +0x93, 0xC4, 0x12, 0x5D, 0x0E, 0xF1, 0x96, 0x24, 0x02, 0xF1, 0x57, 0xF1, 0xAB, 0x24, 0x04, 0xF1, +0x8D, 0x24, 0x03, 0xF1, 0x57, 0xF1, 0xAB, 0x24, 0x08, 0xF1, 0x8D, 0x24, 0x04, 0xF1, 0x57, 0xF1, +0xAB, 0x24, 0x0C, 0xF1, 0x8D, 0x24, 0x05, 0xF1, 0x57, 0x90, 0x93, 0xC3, 0xE0, 0xFE, 0x44, 0x50, +0x90, 0x93, 0xC7, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xEE, 0x75, +0xF0, 0x08, 0xA4, 0xF1, 0x57, 0x90, 0x93, 0xC7, 0x74, 0xFF, 0xB1, 0xFA, 0xF1, 0xA2, 0x04, 0xF1, +0x57, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xC7, 0x12, 0x06, +0x89, 0x90, 0x06, 0x74, 0x12, 0x7A, 0x97, 0x90, 0x06, 0x75, 0x12, 0x79, 0xA0, 0x90, 0x06, 0x76, +0x12, 0x7B, 0xEF, 0x90, 0x06, 0x77, 0xF0, 0x90, 0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, +0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xF9, 0xE4, 0x3A, +0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xC7, 0x12, +0x35, 0x26, 0x90, 0x93, 0xC3, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x22, 0x90, 0x93, 0xC4, 0x12, 0x44, +0x17, 0xE9, 0x22, 0x51, 0x5D, 0xEF, 0x44, 0x40, 0xFD, 0x22, 0x7F, 0xF4, 0x51, 0x5D, 0xEF, 0x20, +0xE5, 0x0D, 0x7F, 0xF4, 0x51, 0x5D, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, +0x03, 0x22, 0x12, 0x9D, 0x3D, 0x7F, 0x08, 0x51, 0x5D, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x31, +0x47, 0xE4, 0xFF, 0x12, 0x8B, 0xAB, 0x90, 0x8E, 0x43, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xF0, 0x7F, +0x10, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xC1, 0x36, 0x90, 0x8E, 0xCD, 0xE0, 0xFF, 0x90, 0x8E, 0xCC, +0xE0, 0xFB, 0x90, 0x8E, 0xCE, 0xE0, 0x90, 0x95, 0x19, 0xF0, 0x22, 0xF0, 0xE4, 0x90, 0x94, 0xFE, +0xF0, 0x90, 0x8E, 0xA5, 0xE0, 0x90, 0x94, 0xFF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xFA, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, +0x94, 0xFE, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0x94, 0xFA, 0x12, +0x90, 0x23, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x57, +0x90, 0x8E, 0x47, 0xE0, 0x70, 0x02, 0x21, 0x0B, 0x12, 0x6A, 0xB6, 0x60, 0x02, 0x21, 0x0B, 0x31, +0x0D, 0x12, 0x43, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x31, +0x26, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, +0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0x31, 0x26, 0x78, 0x18, 0x12, 0x08, +0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0xA2, 0x36, 0x44, 0x80, 0xF0, 0x12, +0xA6, 0xCC, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x8E, 0x4E, 0xE0, 0x14, +0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x8E, 0x50, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x8E, +0x4D, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x57, 0x01, 0xE5, 0x57, 0x60, 0x3E, 0x12, 0xA2, 0x2E, +0x90, 0x8E, 0x50, 0xE0, 0x60, 0x04, 0x64, 0x01, 0x70, 0x13, 0xE4, 0x90, 0x94, 0xFE, 0xF0, 0x90, +0x8E, 0x50, 0xE0, 0xF1, 0xBE, 0x11, 0x15, 0x90, 0x8E, 0x50, 0xE0, 0x80, 0x0E, 0xE4, 0x90, 0x94, +0xFE, 0x12, 0x99, 0x2A, 0xF1, 0xBE, 0x11, 0x15, 0x12, 0x99, 0x2B, 0xF1, 0xBE, 0x90, 0x8E, 0x60, +0xF0, 0x90, 0x8E, 0x4A, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x58, 0x61, 0x22, 0xF0, 0x90, 0x05, 0x61, +0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xA8, 0x04, 0xA9, 0x05, 0xAA, +0x06, 0xAB, 0x07, 0x90, 0x05, 0x60, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x93, 0x64, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x69, 0xF0, 0x90, +0x02, 0x09, 0xE0, 0x90, 0x93, 0x6A, 0xF0, 0x90, 0x93, 0x3E, 0x12, 0x8F, 0xC1, 0x90, 0x93, 0x64, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x71, 0x7B, 0xE0, 0x90, 0x90, 0xE2, 0xF0, 0x74, 0x01, 0x2F, 0xF1, +0x1A, 0xE0, 0x90, 0x90, 0xE3, 0xF0, 0x12, 0xA4, 0x70, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x78, 0x10, +0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x12, 0xA4, 0x5E, 0x31, 0x26, +0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, +0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, 0x13, 0x31, 0x26, 0x78, 0x08, 0x12, 0x08, +0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x71, 0x6B, 0x31, 0x26, 0x12, 0x42, 0x90, +0x90, 0x90, 0xE6, 0x12, 0xA4, 0x6D, 0x31, 0x26, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, +0x05, 0xC0, 0x06, 0xC0, 0x07, 0x12, 0xA4, 0x5E, 0x31, 0x26, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, +0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, +0xC0, 0x07, 0xF1, 0x13, 0x31, 0x26, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, +0x01, 0xD0, 0x00, 0x71, 0x6B, 0x31, 0x26, 0x12, 0x42, 0x90, 0x90, 0x90, 0xEA, 0x12, 0xA4, 0x6D, +0x31, 0x26, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x12, +0xA4, 0x5E, 0x31, 0x26, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, +0x00, 0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, 0x13, 0x31, 0x26, +0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x71, 0x6B, 0x31, +0x26, 0x12, 0x42, 0x90, 0x90, 0x90, 0xEE, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x64, 0xE4, 0x75, 0xF0, +0x04, 0xF1, 0xB5, 0xF1, 0xDD, 0x71, 0x7B, 0xE0, 0xFF, 0x12, 0xA6, 0x55, 0x71, 0x85, 0xE0, 0xB4, +0x10, 0xF1, 0xF1, 0xAE, 0xF1, 0xDD, 0x71, 0x7B, 0xE0, 0xFF, 0x74, 0x02, 0x2E, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0x71, 0x85, 0xE0, 0xB4, 0x10, 0xEC, 0xF1, 0xAE, 0xF1, 0xDD, 0x71, 0x7B, 0xE0, 0xFF, +0x74, 0x12, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0x71, 0x85, 0xE0, 0xB4, 0x10, 0xEC, 0xF1, 0xAE, +0x90, 0x93, 0x66, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x1F, 0x90, 0x93, 0x64, 0xA3, 0xE0, 0xFE, +0xEF, 0x2E, 0x71, 0x7B, 0xE0, 0xFE, 0x90, 0x93, 0x6A, 0xE0, 0xFD, 0xEE, 0x2D, 0xFE, 0x74, 0x22, +0x2F, 0x12, 0xA6, 0xA5, 0xEE, 0x71, 0x88, 0x80, 0xD7, 0x90, 0x93, 0x3E, 0xE0, 0x04, 0x90, 0x93, +0x68, 0xF0, 0xE4, 0x90, 0x93, 0x67, 0xF0, 0x90, 0x90, 0xE2, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x24, +0x01, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x67, 0xE0, 0xC3, 0x9F, 0xEE, 0x12, 0x98, 0xEC, 0x50, +0x73, 0xA3, 0x12, 0x82, 0xB9, 0xE4, 0x12, 0xA6, 0x9D, 0x90, 0x93, 0x66, 0xE0, 0xFD, 0xC3, 0x94, +0x04, 0x50, 0x56, 0xA3, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x7C, 0x00, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, +0xFE, 0x90, 0x90, 0xE2, 0xE0, 0xFD, 0xC3, 0xEF, 0x9D, 0x74, 0x80, 0xF8, 0x6E, 0x98, 0x50, 0x39, +0xEF, 0x78, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x24, 0x2A, 0xF9, 0x74, 0x91, 0x3E, +0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0x90, 0x93, 0x64, 0xA3, 0xE0, 0x24, 0x00, 0xF9, 0xE4, +0x34, 0xFC, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x20, 0xD0, 0x01, 0xD0, 0x03, 0x12, +0x5F, 0x6E, 0x12, 0x87, 0xDF, 0x71, 0x89, 0x80, 0xA0, 0x12, 0xA5, 0xD7, 0x90, 0x93, 0x67, 0xE0, +0x04, 0xF0, 0x41, 0xC7, 0xE4, 0x90, 0x93, 0x66, 0xF0, 0xE4, 0xFF, 0x0F, 0xEF, 0xB4, 0x20, 0xFB, +0x71, 0x89, 0xE0, 0xB4, 0x10, 0xF3, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x42, 0x90, 0xA8, 0x04, +0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0x64, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x66, 0xE0, 0x04, 0xF0, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x48, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0xEF, +0x14, 0x60, 0x02, 0x81, 0x75, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x95, 0x48, 0xE0, +0xFB, 0xC4, 0x33, 0x54, 0xE0, 0xFE, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4E, 0xFE, 0xF0, 0xE4, +0xFD, 0x12, 0x9D, 0x75, 0x90, 0x95, 0x49, 0xEF, 0xF0, 0x90, 0x04, 0x83, 0xF0, 0x90, 0x94, 0xB5, +0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xB9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, +0x01, 0xB1, 0x40, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xB9, 0x12, 0x08, 0x79, +0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0xB1, 0x44, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, +0x10, 0x90, 0x95, 0x48, 0x31, 0x26, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, +0x78, 0x04, 0xF1, 0x99, 0x7F, 0x00, 0x7E, 0x0A, 0xB1, 0x44, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, +0x00, 0x90, 0x95, 0x48, 0x31, 0x26, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0xF1, 0x99, 0x7F, +0x00, 0x7E, 0x0D, 0xB1, 0x44, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x90, 0x95, 0x49, 0x31, +0x26, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x1A, 0xF1, 0x99, 0x7F, 0x18, 0xB1, 0x42, 0x12, 0x08, +0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xB9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x12, +0xA6, 0x36, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xA7, 0x12, 0x08, 0x79, 0x00, +0x00, 0x04, 0x00, 0x80, 0x59, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0xB5, 0x12, +0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xB9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, +0xB1, 0x40, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xB9, 0x12, 0x08, 0x79, 0x00, +0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0xB1, 0x44, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, +0x90, 0x94, 0xB9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x12, 0xA6, 0x36, 0x12, 0x08, 0x79, +0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xA7, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, +0x7C, 0x00, 0xE4, 0xFF, 0x12, 0x74, 0x9D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x58, 0x7E, 0x0C, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xB3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, +0x37, 0x4E, 0x90, 0x94, 0xBD, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xB5, 0x12, 0x43, 0xF3, 0x12, 0x08, +0x3A, 0x90, 0x94, 0xBD, 0xF1, 0xF3, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, +0xB5, 0x12, 0x43, 0xF3, 0x90, 0x94, 0xB9, 0xF1, 0xF3, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, +0x00, 0x12, 0x43, 0xD5, 0x90, 0x94, 0xC1, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xC1, 0x12, 0x9E, 0x96, +0x90, 0x94, 0xB3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x7F, 0x00, 0x7E, 0x08, 0x91, 0xE0, 0x90, 0x94, 0xB5, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x94, 0xE5, 0xEC, 0x12, 0x81, 0x15, 0xAA, 0x07, 0x90, 0x94, 0xEC, 0x12, 0x08, 0x79, +0x00, 0x00, 0x00, 0x00, 0x12, 0xA6, 0x2B, 0xEA, 0x24, 0xEF, 0x60, 0x41, 0x24, 0xD7, 0x70, 0x02, +0xC1, 0xBA, 0x24, 0x3A, 0x60, 0x02, 0xC1, 0xF7, 0xF1, 0xC5, 0x24, 0x0A, 0xF1, 0xD4, 0xED, 0xF0, +0xFE, 0x71, 0x7B, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF1, 0x1A, 0xE4, 0xF0, 0xFE, 0x74, 0x00, 0x2F, +0x12, 0xA6, 0xEC, 0x7D, 0x14, 0xF1, 0x22, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0xF1, 0xA2, 0x90, +0xAC, 0x6A, 0x12, 0x08, 0x6D, 0x7D, 0x14, 0x7C, 0x00, 0xE4, 0xFF, 0xC1, 0xB5, 0x90, 0x94, 0xE5, +0xE4, 0x75, 0xF0, 0x14, 0x12, 0x08, 0xD6, 0x90, 0x94, 0xE5, 0xA3, 0xE0, 0xFB, 0xFF, 0x24, 0x06, +0xFC, 0xF1, 0xD5, 0xCC, 0xF0, 0x90, 0x94, 0xF0, 0xA3, 0xE0, 0xFE, 0x71, 0x7B, 0xE4, 0xF0, 0x74, +0x01, 0x2E, 0xF1, 0x1A, 0xE4, 0x12, 0x87, 0xA9, 0xFE, 0xA9, 0x03, 0x74, 0x05, 0x29, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x12, 0x81, 0xF5, 0xFE, 0x90, 0x94, 0xEA, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0x94, 0xE5, 0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0xEF, 0x94, 0x00, +0xEE, 0x94, 0x01, 0x90, 0x94, 0xE5, 0x40, 0x6A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE9, 0x7C, 0x00, +0x24, 0x00, 0xF9, 0xEC, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC3, 0xE4, 0x9F, 0xFD, 0x74, 0x01, 0x9E, +0xFC, 0xF1, 0x24, 0x90, 0x94, 0xE7, 0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, +0x13, 0x90, 0xFD, 0x10, 0xF0, 0xF1, 0xED, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0x7B, +0x01, 0x7A, 0xFC, 0x79, 0x00, 0x90, 0x94, 0xE5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xE4, 0x9F, +0xFF, 0x74, 0x01, 0x9E, 0xFE, 0xF1, 0xCC, 0xC3, 0x9F, 0xFD, 0xEC, 0x9E, 0xFC, 0x12, 0x26, 0x4E, +0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xF1, 0x27, 0x12, 0xA6, 0x2B, +0x80, 0x0E, 0xA3, 0xE0, 0x7E, 0x00, 0x24, 0x00, 0x12, 0xA6, 0xEC, 0xF1, 0xCC, 0xFD, 0xF1, 0x24, +0x90, 0x94, 0xE5, 0x74, 0xFF, 0x75, 0xF0, 0xEC, 0x12, 0x08, 0xD6, 0xF1, 0xC5, 0x7E, 0x00, 0x24, 0x0C, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0x74, 0x10, 0x2F, 0xF9, -0xEE, 0x34, 0xFC, 0xFA, 0x71, 0xD7, 0x90, 0xAC, 0x6A, 0x12, 0x08, 0x6D, 0x71, 0xF7, 0xFD, 0xD0, -0x01, 0xD0, 0x02, 0x7F, 0x11, 0x12, 0x1B, 0xAC, 0x80, 0x31, 0x71, 0xF0, 0x24, 0x2A, 0x71, 0xFF, -0xED, 0xF0, 0xFE, 0x12, 0x5A, 0xFA, 0x71, 0xE3, 0xE4, 0xF0, 0x12, 0x9A, 0x21, 0x7D, 0x48, 0x71, -0xCC, 0x71, 0xDD, 0x91, 0x08, 0x12, 0x42, 0x90, 0xE4, 0xFD, 0xFC, 0x71, 0xD1, 0x71, 0xDD, 0x91, -0x08, 0x12, 0x42, 0x90, 0x71, 0xD1, 0x71, 0xDD, 0x12, 0x08, 0x3A, 0x90, 0x94, 0xCC, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xCC, 0x12, 0xA1, 0x98, 0x90, 0x94, 0xD4, 0xA3, 0xE0, 0xFE, 0x12, -0x5A, 0xFA, 0xEF, 0x71, 0xE4, 0xED, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7C, 0x00, 0x12, 0x26, -0x4E, 0x90, 0x94, 0xD0, 0x02, 0x08, 0x6D, 0x90, 0xAC, 0x67, 0x12, 0x44, 0x12, 0x90, 0x94, 0xD0, -0x02, 0x43, 0xE5, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, -0x90, 0x94, 0xC9, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x94, 0xCE, 0xE0, 0xFC, 0xA3, 0xE0, 0x22, 0xFD, -0xE4, 0x33, 0x90, 0x94, 0xD4, 0xF0, 0xA3, 0x22, 0x78, 0x10, 0x12, 0x08, 0x47, 0x90, 0x94, 0xD0, -0x02, 0x43, 0xF1, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x90, 0x93, 0xFB, 0xE0, 0xFC, -0xA3, 0xE0, 0xFD, 0x22, 0x90, 0x94, 0xCB, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x22, 0x90, -0x93, 0x1B, 0xE0, 0xFF, 0x7B, 0x18, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x95, 0x15, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x95, 0x14, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0xF1, -0x7C, 0x90, 0x95, 0x14, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x95, 0x15, 0xE0, 0x60, 0x05, 0xB1, -0xF0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x54, 0xC0, 0xF0, 0xB1, 0xF0, 0x54, 0xC0, 0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03, -0x74, 0x10, 0x40, 0x07, 0x91, 0xC2, 0x74, 0x04, 0xF0, 0x80, 0x04, 0x91, 0xC2, 0xE4, 0xF0, 0xAF, -0x05, 0x91, 0xCB, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x95, 0x16, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, -0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x91, 0xCB, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF1, 0x4E, 0x74, 0xFF, -0xF0, 0x74, 0x29, 0x2F, 0xB1, 0xC6, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x12, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90, 0x94, 0xF1, 0xE0, 0xFB, -0x7D, 0x01, 0x91, 0x38, 0x90, 0x94, 0xF2, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x94, -0xF0, 0xE0, 0xFF, 0xB1, 0xA4, 0x90, 0x94, 0xF2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, -0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0xB1, 0xE4, 0x44, 0x01, 0xF0, 0xB1, 0xE4, 0x54, 0xFB, 0xF0, -0xAC, 0x07, 0x74, 0x12, 0x2C, 0x91, 0xCE, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF1, 0x4E, -0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF1, 0x45, 0x44, 0x0E, 0xF0, 0x90, 0x04, -0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, -0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xB1, 0xDC, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, -0xB1, 0xDC, 0xED, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x94, 0xF0, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8D, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x04, -0x1D, 0xE0, 0x60, 0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0xF4, 0xF0, 0x7D, 0x26, 0x12, 0x8F, -0xCB, 0xEF, 0x64, 0x01, 0x70, 0x02, 0x91, 0xD6, 0x90, 0x94, 0xF4, 0xE0, 0xFF, 0x7D, 0x27, 0x12, -0x53, 0xD9, 0xB1, 0xFC, 0x80, 0x04, 0xB1, 0xFC, 0x91, 0xD6, 0x12, 0x58, 0x01, 0x7F, 0x01, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xB1, 0xD0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x0D, 0x74, 0x29, 0x2D, 0xB1, -0xC6, 0x44, 0x10, 0xB1, 0xCF, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xB1, 0xC6, 0x54, 0xEF, -0xB1, 0xCF, 0x44, 0x40, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF0, -0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0x22, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, -0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x94, 0xF0, 0xE0, -0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x31, 0xEF, 0xF0, 0x90, 0x8D, 0x09, -0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x3D, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x0E, 0x70, -0x14, 0x90, 0x95, 0x31, 0xE0, 0x70, 0x2F, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0x7F, 0xF0, 0xF1, 0xF4, -0x12, 0x4F, 0xD9, 0x80, 0x1E, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x06, 0x70, 0x19, 0x90, 0x95, 0x31, -0xE0, 0x60, 0x13, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0xA0, 0x87, 0x90, 0x8E, 0x18, -0x74, 0x04, 0xF0, 0x12, 0x4F, 0xE9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x93, -0x22, 0xF1, 0x7A, 0xAB, 0x05, 0x74, 0x01, 0x2B, 0x71, 0xE8, 0xE0, 0xFE, 0x74, 0x00, 0x2B, 0x12, -0x5A, 0xFC, 0x12, 0xA0, 0x35, 0x90, 0x90, 0x74, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03, 0x2B, 0xF1, -0x5F, 0xFE, 0x74, 0x02, 0x2B, 0xF1, 0x56, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0x76, 0xF0, -0xA3, 0xEF, 0xF0, 0x74, 0x05, 0x2B, 0xD1, 0xDB, 0xE0, 0xFE, 0x74, 0x04, 0x2B, 0xD1, 0xE7, 0xE0, -0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0x78, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x07, 0x2B, 0xF1, -0x71, 0xFE, 0x74, 0x06, 0x2B, 0xF1, 0x45, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0x7A, 0xF0, -0xA3, 0xEF, 0xF0, 0x74, 0x09, 0x2B, 0xB1, 0xD3, 0xFE, 0x74, 0x08, 0x2B, 0xF1, 0x68, 0x24, 0x00, -0xFF, 0xEC, 0x3E, 0x90, 0x90, 0x7C, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0x22, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x12, -0x57, 0xCE, 0x74, 0x00, 0x2F, 0x12, 0x5A, 0xFC, 0xE0, 0x90, 0x94, 0x56, 0xF0, 0x74, 0x01, 0x2F, -0x71, 0xE8, 0xE0, 0x90, 0x94, 0x57, 0xF0, 0x74, 0x02, 0x2F, 0xF1, 0x56, 0x90, 0x94, 0x58, 0xF0, -0x74, 0x03, 0x2F, 0xF1, 0x5F, 0x90, 0x94, 0x59, 0xD1, 0xE3, 0xE0, 0x90, 0x94, 0x5A, 0xF0, 0x74, -0x05, 0x2F, 0xD1, 0xDB, 0xE0, 0x90, 0x94, 0x5B, 0xF0, 0x74, 0x06, 0x2F, 0xF1, 0x45, 0x90, 0x94, -0x5C, 0xF0, 0x74, 0x07, 0x2F, 0xF1, 0x71, 0x90, 0x94, 0x5D, 0xF0, 0x74, 0x08, 0x2F, 0xF1, 0x68, -0x90, 0x94, 0x5E, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0xFF, 0x12, 0x57, 0xD3, 0x7C, -0x00, 0xAD, 0x07, 0x22, 0xF1, 0xAC, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x0C, 0x60, 0x05, 0x12, 0x53, -0xD0, 0xB1, 0x55, 0x22, 0x90, 0x93, 0x28, 0xF1, 0xED, 0x30, 0xE0, 0x0E, 0x7B, 0x00, 0x7A, 0x00, -0x79, 0x00, 0x12, 0xA0, 0x7A, 0x04, 0xF0, 0x02, 0x55, 0x67, 0xA1, 0x55, 0x12, 0xA0, 0x70, 0x30, -0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, -0x74, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0xE2, 0xF0, 0x90, 0x8E, 0xBB, 0xE0, 0xC3, 0x13, 0x54, 0x7F, -0x90, 0x94, 0xE3, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x50, 0x18, 0x90, 0x8E, -0x11, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE0, 0xFF, 0x13, -0x13, 0x54, 0x3F, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, -0x7F, 0x01, 0x12, 0x48, 0x39, 0x90, 0x93, 0x45, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x8D, 0x01, 0xE0, -0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE1, 0x0A, 0x90, 0x8D, 0x01, -0xE0, 0x54, 0xFD, 0xF0, 0x12, 0x88, 0x5C, 0xF1, 0xA9, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, -0x83, 0xD9, 0xF1, 0xA9, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x12, 0x90, 0xB9, 0xBF, 0x01, 0x02, -0x11, 0x51, 0xF1, 0xA9, 0x30, 0xE7, 0x06, 0x54, 0x7F, 0xF0, 0x12, 0x50, 0xBE, 0xD2, 0xAF, 0x80, -0xBB, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x94, 0x79, 0x12, 0xA1, 0x80, 0xA3, -0x12, 0x67, 0xE6, 0x90, 0x94, 0x81, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x51, -0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0xA1, 0x0E, 0x12, 0x84, 0xA3, 0x90, 0x94, 0x70, 0xF0, 0xA3, -0xEF, 0xF0, 0x90, 0x02, 0x82, 0xE0, 0x90, 0x94, 0x78, 0xF0, 0x90, 0x8E, 0xC4, 0xE0, 0x20, 0xE0, -0x02, 0x61, 0x3B, 0xE4, 0x90, 0x94, 0x77, 0xF0, 0x90, 0x94, 0x78, 0xE0, 0xFF, 0x90, 0x94, 0x77, -0xE0, 0xC3, 0x9F, 0x40, 0x02, 0x61, 0x3B, 0x90, 0x94, 0x70, 0x12, 0xA1, 0x98, 0x90, 0xFD, 0x11, -0xF0, 0x90, 0x94, 0x81, 0xEF, 0xF0, 0x12, 0x85, 0x37, 0x12, 0xA0, 0x35, 0x54, 0x3F, 0xFE, 0x90, -0x94, 0x72, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0x7D, 0xEE, 0x12, 0x86, 0x01, 0xE0, 0x54, 0x03, -0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x94, 0x82, 0xF0, 0x90, 0x94, 0x71, 0xE0, 0x2F, 0xFF, -0x90, 0x94, 0x70, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x74, 0xF1, 0xEB, 0xC0, 0x07, 0x71, 0x4C, -0x7D, 0x01, 0x71, 0x77, 0xC0, 0x07, 0x71, 0x4C, 0x7D, 0x04, 0x71, 0x77, 0xAB, 0x07, 0xD0, 0x05, -0xD0, 0x07, 0x12, 0x97, 0xEA, 0x90, 0x94, 0x79, 0xEF, 0x71, 0x4B, 0xE4, 0xFD, 0x71, 0x77, 0xEF, -0x54, 0xFC, 0x90, 0x94, 0x76, 0xF0, 0x90, 0x94, 0x82, 0xE0, 0xFF, 0x90, 0x94, 0x72, 0xE4, 0x8F, -0xF0, 0x12, 0x08, 0xD6, 0x90, 0x94, 0x72, 0x12, 0x85, 0xDA, 0x90, 0x94, 0x72, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0x90, 0x94, 0x70, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x0F, 0x71, 0x77, 0x90, 0x94, -0x72, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x94, 0x70, 0xEC, 0x8D, 0xF0, 0x12, 0xA1, 0x90, 0xFC, -0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x94, 0x71, 0xE0, 0x9D, 0x90, 0x94, 0x70, 0xE0, 0x9C, 0x40, 0x18, -0x90, 0x8D, 0xF9, 0xE0, 0x24, 0x01, 0xFD, 0x12, 0xA0, 0x5B, 0xFC, 0xC3, 0x90, 0x94, 0x71, 0xE0, -0x9D, 0xF0, 0x90, 0x94, 0x70, 0xE0, 0x9C, 0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, -0x22, 0xF0, 0xEF, 0x30, 0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE5, 0x06, -0x90, 0x01, 0xC7, 0x74, 0x23, 0xF0, 0x90, 0x94, 0x6F, 0xE0, 0x60, 0x3B, 0x90, 0x94, 0x76, 0xE0, -0x24, 0xB0, 0x60, 0x16, 0x24, 0xD0, 0x60, 0x02, 0x41, 0xD7, 0x12, 0xA1, 0x88, 0x20, 0xE0, 0x18, -0x12, 0x89, 0xA1, 0x20, 0xE0, 0x02, 0x41, 0xD7, 0x80, 0x0E, 0x12, 0xA1, 0x88, 0x20, 0xE0, 0x08, -0x12, 0x89, 0xA1, 0x20, 0xE0, 0x02, 0x41, 0xD7, 0x71, 0x4C, 0x90, 0x94, 0x7D, 0xE0, 0xFC, 0xA3, -0xE0, 0xFD, 0x12, 0x94, 0x48, 0x41, 0xD7, 0x90, 0x94, 0x76, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, -0x20, 0x70, 0x2A, 0x90, 0x8E, 0xC7, 0x12, 0x79, 0x18, 0x20, 0xE0, 0x02, 0x41, 0xD7, 0x90, 0x8E, -0xDA, 0xE0, 0x04, 0x71, 0x4B, 0x12, 0x91, 0x3C, 0xEF, 0x70, 0x02, 0x41, 0xD7, 0x90, 0x94, 0x76, -0xE0, 0xFF, 0x12, 0x91, 0x2A, 0x90, 0x8E, 0xDB, 0xE0, 0x04, 0xF0, 0x41, 0xD7, 0xF1, 0xFA, 0x30, -0xE0, 0x59, 0x90, 0x94, 0x79, 0xE0, 0xFF, 0x90, 0x94, 0x75, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0x74, -0xE0, 0x34, 0x00, 0xCF, 0x24, 0x08, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x7F, 0xF1, 0xEB, 0xEF, -0x64, 0x45, 0x70, 0x37, 0xB1, 0x58, 0x12, 0x96, 0xB5, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xB1, 0x58, -0xF1, 0xB3, 0xEF, 0x64, 0x01, 0x70, 0x24, 0x90, 0x94, 0x83, 0x04, 0xB1, 0x57, 0xA3, 0xE0, 0xFD, -0x12, 0x97, 0x33, 0xEF, 0x70, 0x0D, 0x90, 0x94, 0x81, 0xE0, 0xFD, 0x90, 0xFD, 0x11, 0xB1, 0x57, -0x12, 0x96, 0xEF, 0x90, 0x94, 0x81, 0xE0, 0x90, 0xFD, 0x11, 0xF0, 0x71, 0x4C, 0x12, 0x91, 0x3C, -0xEF, 0x60, 0x1F, 0x71, 0x4C, 0x90, 0x94, 0x79, 0xE0, 0xFD, 0x90, 0x94, 0x7C, 0xE0, 0xFB, 0x90, -0x94, 0x81, 0xE0, 0x90, 0x93, 0x4A, 0xF0, 0x71, 0xA6, 0xEF, 0x60, 0x06, 0x90, 0x94, 0x83, 0x74, -0x01, 0xF0, 0x90, 0x8E, 0xC4, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x71, 0x4C, 0x90, 0x94, 0x79, -0xE0, 0xFD, 0x91, 0x2B, 0xEF, 0x60, 0x06, 0x90, 0x94, 0x83, 0x74, 0x01, 0xF0, 0x12, 0x7F, 0x44, -0x54, 0x3F, 0x30, 0xE0, 0x0A, 0x71, 0x4C, 0x90, 0x94, 0x79, 0xE0, 0xFD, 0x12, 0x94, 0x97, 0x90, -0x8E, 0xC4, 0x12, 0x79, 0x18, 0x30, 0xE0, 0x0F, 0x90, 0x94, 0x83, 0xE0, 0x70, 0x09, 0x71, 0x4C, -0x90, 0x94, 0x79, 0xE0, 0xFD, 0xD1, 0xEE, 0x12, 0x99, 0x7F, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, -0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x21, 0x12, 0x91, 0x04, 0xEF, 0x64, -0x01, 0x70, 0x37, 0x90, 0x8E, 0xDC, 0xE0, 0x04, 0xF0, 0x12, 0x90, 0xEE, 0xAD, 0x07, 0xEF, 0x64, -0x01, 0x60, 0x1F, 0xF1, 0x98, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, 0x80, -0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x43, 0xF0, 0x7F, 0x01, 0x12, 0x79, 0x21, -0x80, 0x19, 0x90, 0x94, 0x70, 0x12, 0x90, 0xA6, 0x80, 0x09, 0x90, 0x8E, 0xC4, 0xE0, 0x54, 0xFE, -0xF0, 0x80, 0x08, 0x90, 0x94, 0x77, 0xE0, 0x04, 0xF0, 0x01, 0x98, 0x74, 0x51, 0x04, 0x90, 0x01, -0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x94, 0x74, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x48, 0xE0, 0xFD, 0x90, 0x93, 0x47, 0xE0, 0x2D, 0xFD, -0x90, 0x93, 0x46, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x10, 0xCD, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, -0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, -0xFA, 0xC3, 0x90, 0x8D, 0xF9, 0xE0, 0x9B, 0x90, 0x8D, 0xF8, 0xE0, 0x9A, 0x50, 0x0C, 0xA3, 0x12, -0xA0, 0x57, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0x12, 0xA1, 0x60, 0x74, 0x00, 0x2F, -0x12, 0x85, 0x46, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x48, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x91, -0x95, 0x90, 0x93, 0x4B, 0xF0, 0xFD, 0x71, 0x77, 0xEF, 0x54, 0x0C, 0x64, 0x08, 0x70, 0x5C, 0x91, -0x22, 0xA3, 0xE0, 0xF1, 0x90, 0x64, 0x88, 0x70, 0x52, 0x91, 0x22, 0xA3, 0xE0, 0x24, 0x07, 0xFD, -0x71, 0x77, 0xEF, 0x64, 0x8E, 0x70, 0x44, 0x90, 0x93, 0x4B, 0x04, 0x91, 0x21, 0x12, 0xA0, 0xAB, -0x04, 0xFD, 0x71, 0x77, 0xEF, 0x64, 0x03, 0x70, 0x32, 0x91, 0x22, 0x12, 0xA0, 0xAB, 0xF1, 0x90, -0x30, 0xE3, 0x07, 0x90, 0x01, 0xC7, 0x74, 0x01, 0x80, 0x1F, 0x90, 0x8E, 0xC4, 0x12, 0xA0, 0x73, -0x30, 0xE0, 0x09, 0x91, 0x22, 0xA3, 0xE0, 0xFD, 0xB1, 0x78, 0x80, 0x0F, 0x90, 0x8E, 0xC7, 0xF1, -0xFD, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xC7, 0x74, 0x02, 0xF1, 0x97, 0x90, 0x93, 0x4B, 0xE0, 0xFF, -0x22, 0xF0, 0x90, 0x93, 0x46, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x12, 0x96, 0x63, 0x12, 0x96, -0x9F, 0x7A, 0x40, 0x79, 0x56, 0x12, 0x57, 0xF5, 0x78, 0x55, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, -0x7A, 0x40, 0x79, 0x5C, 0xF1, 0xE4, 0x78, 0x59, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, -0x79, 0x60, 0xF1, 0xE4, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0xD1, 0xA4, 0xCF, 0x24, 0x06, 0xCF, 0xB1, -0x71, 0xEF, 0x64, 0x08, 0x60, 0x02, 0xA1, 0x4A, 0xD1, 0xA4, 0xCF, 0x24, 0x07, 0xCF, 0xB1, 0x71, -0xEF, 0x64, 0x06, 0x60, 0x02, 0xA1, 0x4A, 0x90, 0x93, 0x5E, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x5D, -0xF0, 0xB1, 0x50, 0x94, 0x06, 0x50, 0x17, 0x90, 0x93, 0x47, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x93, -0x46, 0xE0, 0x71, 0x6A, 0x90, 0x93, 0x5D, 0x12, 0x96, 0x96, 0xB1, 0x61, 0x80, 0xE3, 0xF1, 0xF3, -0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xD4, 0x12, 0x91, 0x8C, 0x60, 0x02, 0xA1, 0x4A, 0x90, 0x93, 0x5D, -0xF0, 0xB1, 0x50, 0x94, 0x04, 0x50, 0x19, 0x12, 0x96, 0x6F, 0xD1, 0xAF, 0xCD, 0x24, 0x20, 0x71, -0x69, 0x90, 0x93, 0x5D, 0xE0, 0x24, 0x59, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xB1, 0x61, 0x80, 0xE1, -0x78, 0x59, 0x7C, 0x93, 0x12, 0xA0, 0x17, 0xEF, 0x70, 0x67, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x01, -0x54, 0xDF, 0xF0, 0x90, 0x8E, 0xC6, 0xE0, 0x30, 0xE0, 0x09, 0x90, 0x01, 0xC7, 0x74, 0x09, 0xF1, -0x97, 0x80, 0x57, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0xB1, 0x50, 0x94, 0x06, 0x50, 0x0C, 0x71, 0x55, -0x90, 0x93, 0x5D, 0x12, 0x96, 0x8D, 0xB1, 0x61, 0x80, 0xEE, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0xB1, -0x50, 0x94, 0x04, 0x50, 0x19, 0x12, 0x96, 0x6F, 0xD1, 0xAF, 0xCD, 0x24, 0x16, 0x71, 0x69, 0x90, -0x93, 0x5D, 0xE0, 0x24, 0x55, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xB1, 0x61, 0x80, 0xE1, 0x7B, 0x01, -0x7A, 0x93, 0x79, 0x4F, 0x12, 0xA0, 0x7A, 0xF0, 0x7A, 0x93, 0x79, 0x55, 0x12, 0x55, 0x67, 0x80, -0x09, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x5E, 0xE0, 0xFF, 0x22, -0x90, 0x93, 0x5D, 0xE0, 0xFF, 0xC3, 0x22, 0xF0, 0x90, 0x94, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, -0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x5D, 0xE0, 0x04, 0xF0, 0x22, 0xFF, 0x90, 0x93, 0x4F, -0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x61, 0x77, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x06, 0x31, 0xE0, 0x54, 0xEF, 0x44, 0x08, 0xF0, 0xED, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x7C, 0x00, -0xEF, 0x24, 0x08, 0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x4F, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, -0x83, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xDA, 0x12, 0x08, 0xAA, 0x90, 0x93, 0x50, 0xE0, -0x24, 0x01, 0xB1, 0x6C, 0x90, 0x8F, 0xDB, 0xD1, 0x9D, 0x24, 0x04, 0xB1, 0x6C, 0x90, 0x8F, 0xDE, -0xD1, 0x9D, 0x24, 0x05, 0xB1, 0x6C, 0x90, 0x8F, 0xDF, 0xD1, 0x9D, 0x24, 0x06, 0xB1, 0x6C, 0x90, -0x8F, 0xE0, 0xD1, 0x9D, 0x24, 0x07, 0xB1, 0x6C, 0x90, 0x8F, 0xE1, 0xD1, 0x9D, 0x24, 0x08, 0xB1, -0x6C, 0x90, 0x8F, 0xE2, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0x4E, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0xFF, -0xC3, 0x94, 0x08, 0x50, 0x1D, 0x90, 0x93, 0x50, 0xE0, 0x24, 0x09, 0xFD, 0x90, 0x93, 0x4F, 0xE0, -0x71, 0x6A, 0x90, 0x93, 0x4E, 0xE0, 0x24, 0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x12, 0xA0, 0x4C, -0x80, 0xD9, 0xE4, 0x90, 0x93, 0x4E, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, -0x1D, 0x90, 0x93, 0x50, 0xE0, 0x24, 0x63, 0xFD, 0x90, 0x93, 0x4F, 0xE0, 0x71, 0x6A, 0x90, 0x93, -0x4E, 0xE0, 0x24, 0x3D, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0x12, 0xA0, 0x4C, 0x80, 0xD9, 0x90, 0x8F, -0xDF, 0x12, 0x9E, 0x47, 0x12, 0xA1, 0x05, 0x30, 0xE3, 0x0D, 0x7F, 0x01, 0x12, 0x79, 0x21, 0x90, -0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x3F, 0x90, 0x93, 0x4C, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x54, -0x07, 0xFD, 0x64, 0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED, 0x64, 0x02, 0x4C, 0x70, -0x25, 0xEF, 0x54, 0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF, 0xC4, 0x54, 0x0F, 0x48, -0x90, 0x90, 0x73, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0x9D, 0x3A, 0x90, 0x06, 0x31, -0xE0, 0x54, 0xF7, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0xF0, 0x90, -0x93, 0x50, 0xE0, 0x22, 0x90, 0x93, 0x48, 0xE0, 0xFF, 0x90, 0x93, 0x47, 0xE0, 0x2F, 0xFF, 0x90, -0x93, 0x46, 0xE0, 0x34, 0x00, 0x22, 0x90, 0x93, 0x56, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7D, 0x09, -0x71, 0x77, 0xEF, 0x64, 0x06, 0x70, 0x24, 0xF1, 0xA0, 0x7D, 0x14, 0x71, 0x77, 0xEF, 0x70, 0x1B, -0xF1, 0xA0, 0x7D, 0x15, 0x71, 0x77, 0xEF, 0x64, 0x50, 0x70, 0x10, 0xF1, 0xA0, 0x7D, 0x21, 0x71, -0x77, 0xEF, 0x20, 0xE0, 0x03, 0x30, 0xE2, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x12, 0x96, -0x63, 0xF1, 0xF3, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x90, 0x12, 0x57, 0xF5, 0x78, 0x50, 0x7C, 0x93, -0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x96, 0xF1, 0xE4, 0x91, 0x22, 0x12, 0x91, 0x3C, 0xEF, -0x60, 0x7D, 0xD1, 0xA4, 0xFE, 0x90, 0x93, 0x54, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x06, 0xFF, 0xE4, -0x3E, 0xB1, 0x73, 0xEF, 0x64, 0x08, 0x70, 0x67, 0x90, 0x93, 0x55, 0xE0, 0x24, 0x07, 0xFF, 0x90, -0x93, 0x54, 0xB1, 0x70, 0xEF, 0x70, 0x58, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x93, 0x4F, 0xE0, 0xFF, -0xC3, 0x94, 0x04, 0x50, 0x24, 0x90, 0x93, 0x55, 0xE0, 0x24, 0x18, 0xFD, 0x90, 0x93, 0x54, 0xE0, -0x71, 0x6A, 0x90, 0x93, 0x4F, 0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, -0xF0, 0x90, 0x93, 0x4F, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x78, 0x50, 0x7C, 0x93, 0x12, 0xA0, 0x17, -0xEF, 0x70, 0x1C, 0x90, 0x93, 0x55, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0x54, 0xE0, 0x34, 0x00, -0xFE, 0xD1, 0xB6, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF1, 0x97, 0x22, -0x24, 0x06, 0xFD, 0x71, 0x77, 0xEF, 0x22, 0xF0, 0x90, 0x8E, 0xCD, 0xE0, 0x44, 0x01, 0xF0, 0x22, -0x90, 0x93, 0x56, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, -0xE0, 0xFF, 0x22, 0x12, 0x96, 0x7B, 0x24, 0x16, 0xFF, 0xE4, 0x3E, 0xB1, 0x73, 0x90, 0x90, 0x84, -0xA3, 0xE0, 0xB5, 0x07, 0x19, 0x90, 0x93, 0x47, 0xE0, 0x24, 0x16, 0xD1, 0xAE, 0xFE, 0x7D, 0x01, -0x71, 0x77, 0xEF, 0xFD, 0x90, 0x90, 0x84, 0xE0, 0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F, 0x00, -0x22, 0x7F, 0x01, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x02, 0x06, 0x63, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, -0xFD, 0x61, 0x77, 0x78, 0x49, 0x7C, 0x93, 0x7D, 0x01, 0x22, 0x90, 0x8E, 0xC4, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, -0x05, 0xC0, 0x07, 0x7D, 0x04, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, 0x11, 0x2B, 0xD0, 0x07, -0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xFF, 0xA3, 0xF0, 0xED, 0x04, -0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, -0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x38, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, -0x11, 0x2B, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, +0xEE, 0x34, 0xFC, 0xFA, 0xF1, 0xA2, 0x90, 0xAC, 0x6A, 0x12, 0x08, 0x6D, 0xF1, 0xCC, 0xFD, 0xD0, +0x01, 0xD0, 0x02, 0x7F, 0x11, 0x12, 0x1B, 0xAC, 0x80, 0x35, 0xF1, 0xC5, 0x24, 0x2A, 0xF1, 0xD4, +0xED, 0xF0, 0xFE, 0x71, 0x7B, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF1, 0x1A, 0xE4, 0xF0, 0x12, 0xA5, +0x8E, 0x7D, 0x48, 0xF1, 0x22, 0xF1, 0xA8, 0xF1, 0xE8, 0x12, 0x42, 0x90, 0xE4, 0xFD, 0xFC, 0xF1, +0x27, 0xF1, 0xA8, 0xF1, 0xE8, 0x12, 0x42, 0x90, 0xF1, 0x27, 0xF1, 0xA8, 0x12, 0x08, 0x3A, 0x90, +0x94, 0xE8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xE8, 0x12, 0xA6, 0xE4, 0x90, 0x94, 0xF0, +0xA3, 0xE0, 0xFE, 0x71, 0x7B, 0xEF, 0xF0, 0x74, 0x01, 0x2E, 0xF1, 0x1A, 0xED, 0xF0, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x90, 0x93, 0x64, 0xA3, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0x22, 0x7C, 0x00, 0x12, 0x26, 0x4E, 0x90, 0x94, 0xEC, 0x02, 0x08, 0x6D, 0x90, 0x8E, 0x2C, +0x12, 0x9E, 0xD0, 0x30, 0xE0, 0x08, 0x12, 0x8F, 0xC9, 0xE4, 0x90, 0x94, 0x8A, 0xF0, 0x90, 0x94, +0xB5, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x70, 0x31, 0x26, 0xF1, 0x9C, 0x7F, +0x50, 0x7E, 0x0C, 0xB1, 0x44, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x71, 0x31, +0x26, 0xF1, 0x9C, 0x91, 0xDC, 0x90, 0x94, 0x86, 0xE0, 0x90, 0x06, 0x08, 0xF0, 0x90, 0x94, 0x88, +0xA3, 0xE0, 0x90, 0x06, 0xA0, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x94, 0x74, 0xE0, 0xFF, 0x60, 0x05, +0xA3, 0xE0, 0xFD, 0x71, 0x90, 0x90, 0x94, 0x73, 0xE0, 0xFF, 0x60, 0x0C, 0xA3, 0xE0, 0xFD, 0xA3, +0xE0, 0xFB, 0x12, 0xA6, 0x5E, 0x12, 0x74, 0x24, 0x22, 0x12, 0x08, 0x5A, 0x90, 0x94, 0xB9, 0x02, +0x08, 0x6D, 0x90, 0xAC, 0x67, 0x12, 0x44, 0x20, 0x90, 0x94, 0xEC, 0x02, 0x43, 0xF3, 0x90, 0x93, +0x64, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, 0x66, 0xF0, 0x22, 0xFF, 0x90, +0x8E, 0x4F, 0xE0, 0x2F, 0x22, 0x90, 0x94, 0xE5, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x94, 0xEA, 0xE0, +0xFC, 0xA3, 0xE0, 0x22, 0xFD, 0xE4, 0x33, 0x90, 0x94, 0xF0, 0xF0, 0xA3, 0x22, 0x90, 0x93, 0x64, +0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x22, 0x78, 0x10, 0x12, 0x08, 0x47, 0x90, 0x94, 0xEC, +0x02, 0x43, 0xFF, 0x12, 0x43, 0xFF, 0x02, 0x43, 0xC8, 0x01, 0x4D, 0x75, 0xE8, 0x03, 0x75, 0xA8, +0x85, 0x22, 0xE4, 0x90, 0x93, 0x56, 0xF0, 0x90, 0x93, 0x56, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x02, +0x90, 0x01, 0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, +0xFC, 0xC2, 0xAF, 0x90, 0x8E, 0x47, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x4A, 0xE0, 0xFF, 0x90, 0x8E, +0x49, 0xE0, 0x6F, 0x60, 0x02, 0x11, 0x58, 0xC2, 0xAF, 0x12, 0x96, 0x49, 0xBF, 0x01, 0x03, 0x12, +0xA1, 0x5E, 0xD2, 0xAF, 0xD2, 0xAF, 0x90, 0x93, 0x4D, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0x9E, 0x34, +0x12, 0x4F, 0xF6, 0x12, 0x46, 0x46, 0x80, 0xAF, 0x90, 0x8E, 0x49, 0xE0, 0xFF, 0x7D, 0x01, 0x80, +0x04, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x59, 0xED, +0xF0, 0x90, 0x8E, 0x42, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x21, 0xA6, +0xEE, 0x12, 0x7F, 0xA5, 0x30, 0xE0, 0x02, 0x21, 0xA6, 0x90, 0x8E, 0x4A, 0xE0, 0xFE, 0x6F, 0x70, +0x02, 0x21, 0xA6, 0xEF, 0x70, 0x02, 0x21, 0x24, 0x24, 0xFE, 0x70, 0x02, 0x21, 0x5D, 0x24, 0xFE, +0x60, 0x4A, 0x24, 0xFC, 0x70, 0x02, 0x21, 0x97, 0x24, 0xFC, 0x60, 0x02, 0x21, 0xA6, 0xEE, 0xB4, +0x0E, 0x02, 0x31, 0xD2, 0x90, 0x8E, 0x4A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x0E, 0x90, 0x8E, +0x4A, 0xE0, 0xB4, 0x06, 0x02, 0x31, 0xED, 0x90, 0x8E, 0x4A, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x95, +0x59, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0xA1, 0x7A, 0x80, 0x03, 0x12, 0x6F, 0x66, 0x90, 0x8E, 0x4A, +0xE0, 0x64, 0x08, 0x60, 0x02, 0x21, 0xA6, 0x12, 0xA2, 0x5B, 0x21, 0xA6, 0x90, 0x8E, 0x4A, 0xE0, +0x70, 0x04, 0x7F, 0x01, 0x51, 0x0E, 0x90, 0x8E, 0x4A, 0xE0, 0xB4, 0x06, 0x02, 0x31, 0xED, 0x90, +0x8E, 0x4A, 0xE0, 0xB4, 0x0E, 0x07, 0x31, 0xAB, 0xBF, 0x01, 0x02, 0x31, 0xD2, 0x90, 0x8E, 0x4A, +0xE0, 0x64, 0x0C, 0x60, 0x02, 0x21, 0xA6, 0x31, 0xAB, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x21, 0xA6, +0x51, 0x25, 0x21, 0xA6, 0x90, 0x8E, 0x4A, 0xE0, 0xB4, 0x0E, 0x07, 0x31, 0xAB, 0xBF, 0x01, 0x02, +0x31, 0xD2, 0x90, 0x8E, 0x4A, 0xE0, 0xB4, 0x06, 0x02, 0x31, 0xED, 0x90, 0x8E, 0x4A, 0xE0, 0xB4, +0x0C, 0x07, 0x31, 0xAB, 0xBF, 0x01, 0x02, 0x51, 0x25, 0x90, 0x8E, 0x4A, 0xE0, 0x64, 0x04, 0x70, +0x55, 0x12, 0xA0, 0x7D, 0xEF, 0x64, 0x01, 0x70, 0x4D, 0xF1, 0x8E, 0x80, 0x49, 0x90, 0x8E, 0x4A, +0xE0, 0xB4, 0x0E, 0x07, 0x31, 0xAB, 0xBF, 0x01, 0x02, 0x31, 0xD2, 0x90, 0x8E, 0x4A, 0xE0, 0xB4, +0x06, 0x02, 0x31, 0xED, 0x90, 0x8E, 0x4A, 0xE0, 0xB4, 0x0C, 0x07, 0x31, 0xAB, 0xBF, 0x01, 0x02, +0x51, 0x25, 0x90, 0x8E, 0x4A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x0E, 0x90, 0x8E, 0x4A, 0xE0, +0xB4, 0x04, 0x13, 0xF1, 0xEA, 0x80, 0x0F, 0x90, 0x8E, 0x4A, 0xE0, 0xB4, 0x0C, 0x08, 0x12, 0x9E, +0xCD, 0x30, 0xE0, 0x02, 0xF1, 0xD3, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x12, 0xA0, 0x64, 0xBF, 0x01, 0x13, 0x12, 0xA0, 0x5A, 0x20, 0xE0, 0x0D, 0x90, 0x8E, +0x49, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x8E, 0x43, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x7D, 0x0C, 0x80, 0x05, 0x12, +0xA2, 0xC4, 0x7D, 0x04, 0x7F, 0x01, 0xF1, 0x02, 0xE4, 0xFD, 0xFF, 0x80, 0x6A, 0x90, 0x8E, 0x43, +0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, 0x80, 0x06, 0xE0, +0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xF1, 0x02, 0xE4, 0xFD, 0xFF, 0x80, 0x49, 0x90, 0x95, +0x58, 0xEF, 0xF0, 0x12, 0x4E, 0x02, 0x90, 0x95, 0x58, 0xE0, 0x60, 0x03, 0x12, 0x8F, 0x77, 0x7D, +0x04, 0x7F, 0x01, 0xE1, 0x02, 0x12, 0x6A, 0xB6, 0x70, 0x23, 0x90, 0x8E, 0x43, 0xE0, 0x54, 0xFD, +0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x51, 0x57, 0x7D, 0x08, 0x7F, 0x01, 0xB1, 0x8E, 0xBF, 0x01, 0x0D, +0x90, 0x8E, 0x42, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0xF1, 0x02, 0x22, 0xE4, 0xFD, +0x7F, 0x0C, 0x11, 0x65, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x8D, 0x05, 0xED, +0xF0, 0x22, 0x90, 0x93, 0x8D, 0x12, 0x44, 0x20, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0x9E, 0xF0, +0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0B, 0x7D, 0x39, 0xB1, 0x2C, 0xEF, 0x64, 0x01, 0x70, 0x1B, 0x80, +0x00, 0x90, 0x93, 0x32, 0xE0, 0xFF, 0x90, 0x95, 0x29, 0x74, 0x11, 0xF0, 0x7B, 0x18, 0x7D, 0x01, +0xB1, 0xDA, 0x90, 0x93, 0x9B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x9B, 0x12, 0x9C, 0x67, +0x90, 0x93, 0x9D, 0xEF, 0xF0, 0x90, 0x93, 0x9B, 0xF1, 0xF6, 0x7B, 0x01, 0x90, 0x93, 0x99, 0xE0, +0xFD, 0x12, 0x7D, 0xC6, 0x90, 0x93, 0x9A, 0xE0, 0x60, 0x02, 0x61, 0x49, 0xB1, 0x1F, 0xC0, 0x03, +0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0x90, 0xB1, 0x0E, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, +0xD0, 0x03, 0x12, 0x35, 0x26, 0x71, 0xE6, 0xF1, 0xC9, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, +0x93, 0x8D, 0xB1, 0x0E, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, +0x71, 0xE6, 0xB1, 0x22, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xB1, 0x0B, 0x75, 0x43, 0x10, 0xD0, +0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x71, 0xE6, 0x24, 0x60, 0xF9, 0xE4, 0x34, 0xFC, +0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xB1, 0x0B, 0x75, 0x43, 0x10, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x71, 0xE6, 0x24, 0x72, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, +0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0x96, 0xB1, 0x0E, 0x75, 0x43, 0x06, +0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0x93, 0x12, 0x44, 0x17, 0x90, +0x93, 0xCA, 0x12, 0x44, 0x20, 0x90, 0x93, 0xCD, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x20, 0x90, +0x93, 0xD1, 0x74, 0x3A, 0xF0, 0x90, 0x93, 0x8D, 0x12, 0x44, 0x17, 0x12, 0x9F, 0x4A, 0x71, 0xE6, +0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xD1, 0xEE, 0x75, 0x43, 0x28, 0x7B, 0x01, 0x7A, 0x93, 0x79, +0x9F, 0x12, 0x35, 0x26, 0x71, 0xE6, 0x12, 0xA6, 0x41, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, +0x75, 0x42, 0x58, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0x9D, 0xE0, 0xFF, +0x90, 0x93, 0x9C, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x9B, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xFD, +0xE4, 0x3F, 0xFC, 0x90, 0x93, 0x32, 0xE0, 0xFB, 0x7F, 0x3A, 0x12, 0x55, 0x4A, 0x71, 0xE6, 0x12, +0xA6, 0x41, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x93, 0x75, 0x42, 0x9F, 0x75, 0x43, 0x28, 0xD0, +0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0xFF, +0x7D, 0x3A, 0x51, 0x57, 0xE1, 0xE3, 0x90, 0x93, 0x9B, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xC5, 0x12, 0x44, 0x20, 0x78, 0xD1, 0x7C, +0x94, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x64, 0x12, 0x91, 0x2E, 0x90, 0x05, 0x22, 0xE0, +0x90, 0x94, 0xD0, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0B, 0x7D, 0x33, 0xB1, 0x2C, 0xEF, 0x64, +0x01, 0x70, 0x1B, 0x80, 0x00, 0x90, 0x93, 0x31, 0xE0, 0xFF, 0x90, 0x95, 0x29, 0x74, 0x10, 0xF0, +0x7B, 0x18, 0x7D, 0x01, 0xB1, 0xDA, 0x90, 0x94, 0xCD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, +0xCD, 0x12, 0x9C, 0x67, 0x90, 0x94, 0xCF, 0xEF, 0xF0, 0x90, 0x94, 0xCD, 0xF1, 0xF6, 0x7B, 0x01, +0x90, 0x94, 0xCB, 0xE0, 0xFD, 0x12, 0x7D, 0xC6, 0x90, 0x94, 0xCC, 0xE0, 0x70, 0x4D, 0xB1, 0x1F, +0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0xC8, 0xB1, 0x0E, 0x75, 0x43, 0x06, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0xB1, 0x18, 0x71, 0xE9, 0xF1, 0xC2, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, +0x02, 0xC0, 0x01, 0x90, 0x94, 0xC8, 0xB1, 0x0E, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, +0x03, 0xB1, 0x18, 0x71, 0xE9, 0xF1, 0xC9, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0xC5, +0xB1, 0x0E, 0x75, 0x43, 0x04, 0xD0, 0x01, 0xD0, 0x02, 0x80, 0x44, 0x90, 0x94, 0xCC, 0xE0, 0x64, +0x01, 0x70, 0x41, 0xB1, 0x1F, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xD4, 0x75, +0x43, 0x06, 0xD0, 0x03, 0xB1, 0x18, 0x71, 0xE9, 0xF1, 0xC2, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, +0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xDE, 0x75, 0x43, 0x06, 0xD0, 0x03, 0xB1, 0x18, 0x71, 0xE9, +0xF1, 0xC9, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xE4, 0x75, 0x43, 0x04, 0xD0, +0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x94, 0xD0, 0xE0, 0xFF, +0x7D, 0x34, 0x51, 0x57, 0xF1, 0xE3, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x93, 0x12, 0x44, +0x17, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x22, 0x12, 0x35, 0x26, 0x90, 0x94, 0xCD, 0x22, 0xA3, +0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x7F, 0xFF, 0x51, 0x57, +0xE4, 0x90, 0x95, 0x3F, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x95, 0x41, 0xF0, 0x7D, +0x47, 0x7F, 0xFF, 0x51, 0x57, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x11, 0xA3, 0xE0, 0x70, 0x0D, 0xA3, +0xE0, 0x70, 0x09, 0xA3, 0xE0, 0x70, 0x05, 0xF1, 0x75, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x95, 0x40, +0xE0, 0x94, 0xE8, 0x90, 0x95, 0x3F, 0xE0, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x01, 0xC0, 0xE0, 0x44, +0x20, 0xF0, 0xF1, 0x75, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x95, +0x3F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBB, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x11, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8D, 0x03, +0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x95, 0x15, +0xF0, 0x7D, 0x26, 0xB1, 0x2C, 0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x86, 0xF3, 0x90, 0x95, 0x15, +0xE0, 0xFF, 0x7D, 0x27, 0x51, 0x57, 0x12, 0xA2, 0x65, 0x80, 0x06, 0x12, 0xA2, 0x65, 0x12, 0x86, +0xF3, 0xF1, 0xE3, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x95, 0x27, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x95, 0x26, 0xEF, 0xF0, 0xE4, 0xFD, +0xFC, 0x12, 0x87, 0xA2, 0x90, 0x95, 0x26, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x95, 0x27, 0xE0, +0x60, 0x06, 0x12, 0xA5, 0xF3, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x12, 0xA5, 0xF3, 0x54, 0xC0, 0xF0, 0x90, 0x95, +0x29, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x18, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, +0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03, 0x74, 0x10, 0x40, 0x08, 0x12, 0xA6, 0x8B, 0x74, +0x04, 0xF0, 0x80, 0x05, 0x12, 0xA6, 0x8B, 0xE4, 0xF0, 0xAF, 0x05, 0x12, 0xA5, 0xBF, 0xE0, 0x54, +0x01, 0xFE, 0x90, 0x95, 0x28, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, +0x12, 0xA5, 0xBF, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0x12, 0xA6, 0xBC, 0x74, 0xFF, 0xF0, 0x74, 0x29, +0x2F, 0x12, 0x86, 0x3A, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x12, 0x82, 0xBB, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x64, 0x12, 0x9C, 0x67, 0x90, +0x93, 0x66, 0xEF, 0xF0, 0x90, 0x93, 0x64, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xD1, +0xEE, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xD4, 0xF1, 0x6E, 0x71, 0xE9, 0x24, 0x3E, +0xF9, 0xE4, 0x34, 0xFC, 0xD1, 0xEE, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xDA, 0xF1, +0x6E, 0x71, 0xE9, 0xF1, 0xC2, 0xD1, 0xEE, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xDE, +0xF1, 0x6E, 0x71, 0xE9, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xD1, 0xEE, 0x75, 0x43, 0x04, 0x7B, +0x01, 0x7A, 0x8E, 0x79, 0xE4, 0x02, 0x35, 0x26, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, +0x01, 0xF5, 0x41, 0x89, 0x42, 0x22, 0x90, 0x8E, 0x49, 0xE0, 0x90, 0x94, 0x87, 0xF0, 0x7D, 0x02, +0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x57, 0xEF, 0xF0, 0x14, 0x60, +0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0x42, 0xE0, +0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x8E, 0x4A, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x49, +0xED, 0xF0, 0x12, 0x4E, 0x6F, 0x30, 0xE4, 0x31, 0x90, 0x95, 0x57, 0xE0, 0x14, 0x60, 0x07, 0x14, +0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, 0x8E, 0x42, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, +0x54, 0x80, 0xFF, 0x90, 0x8E, 0x4A, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, +0x8E, 0x49, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x49, 0x47, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x35, +0x26, 0x90, 0x93, 0x64, 0x22, 0x90, 0x95, 0x41, 0xE0, 0xFF, 0x7D, 0x48, 0x41, 0x57, 0x12, 0xA0, +0x21, 0x90, 0x8E, 0x4A, 0xE0, 0x64, 0x0C, 0x60, 0x04, 0x51, 0x4E, 0xB1, 0x8A, 0x22, 0x7D, 0x2D, +0xB1, 0x2C, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x6C, 0x7E, 0x12, 0x4B, +0x30, 0xE4, 0xFD, 0x7F, 0x01, 0xE1, 0x02, 0x90, 0x8E, 0x47, 0xE0, 0x64, 0x01, 0x70, 0x12, 0x12, +0x7F, 0xDE, 0x60, 0x05, 0x51, 0x4E, 0x02, 0xA0, 0x21, 0x90, 0x8E, 0x4A, 0xE0, 0x70, 0x02, 0x11, +0x61, 0x22, 0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0x22, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, +0x7B, 0x01, 0x22, 0x7D, 0x2F, 0x12, 0x4B, 0x2B, 0x7D, 0x08, 0x7F, 0x01, 0xE1, 0x02, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x51, 0x57, +0x7D, 0x02, 0x7F, 0x01, 0xE1, 0x02, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x22, +0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x48, 0x47, 0x90, 0x93, 0x5F, 0xEF, 0xF0, 0x60, 0xF0, +0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE1, +0x0A, 0x90, 0x8D, 0x01, 0xE0, 0x54, 0xFD, 0xF0, 0x12, 0x88, 0x1D, 0xF1, 0x4F, 0x30, 0xE2, 0x06, +0x54, 0xFB, 0xF0, 0x12, 0x81, 0x29, 0xF1, 0x4F, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x12, 0x94, +0xC9, 0xBF, 0x01, 0x02, 0x11, 0x55, 0xF1, 0x4F, 0x30, 0xE7, 0x06, 0x54, 0x7F, 0xF0, 0x12, 0x71, +0x44, 0xD2, 0xAF, 0x80, 0xBB, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x94, 0x95, +0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0x12, 0x8B, 0x50, 0x90, 0x94, 0x9D, 0xF0, 0xA3, +0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x55, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0xA6, 0x82, +0x12, 0x81, 0xF5, 0x90, 0x94, 0x8C, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x82, 0xE0, 0x90, 0x94, +0x94, 0xF0, 0x90, 0x8E, 0xAF, 0xE0, 0x20, 0xE0, 0x02, 0x61, 0x5D, 0xE4, 0x90, 0x94, 0x93, 0xF0, +0x90, 0x94, 0x94, 0xE0, 0xFF, 0x90, 0x94, 0x93, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0x61, 0x5D, 0x90, +0x94, 0x8C, 0x12, 0xA6, 0xE4, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x94, 0x9D, 0xEF, 0xF0, 0x12, 0x8E, +0x28, 0x12, 0xA5, 0xCA, 0x54, 0x3F, 0xFE, 0x90, 0x94, 0x8E, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, +0x99, 0xEE, 0x12, 0x8E, 0xAC, 0xE0, 0x54, 0x03, 0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x94, +0x9E, 0xF0, 0x90, 0x94, 0x8D, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0x8C, 0xE0, 0x34, 0x00, 0xFE, 0x90, +0x94, 0x90, 0x12, 0xA5, 0xAC, 0xC0, 0x07, 0x71, 0x6E, 0x7D, 0x01, 0x71, 0x99, 0xC0, 0x07, 0x71, +0x6E, 0x7D, 0x04, 0x71, 0x99, 0xAB, 0x07, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x9C, 0x8D, 0x90, 0x94, +0x95, 0xEF, 0x71, 0x6D, 0xE4, 0xFD, 0x71, 0x99, 0xEF, 0x54, 0xFC, 0x90, 0x94, 0x92, 0xF0, 0x90, +0x94, 0x9E, 0xE0, 0xFF, 0x90, 0x94, 0x8E, 0xE4, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x94, 0x8E, +0x12, 0x8E, 0x85, 0x90, 0x94, 0x8E, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0x8C, 0xE0, 0xFE, +0xA3, 0xE0, 0xFF, 0x7D, 0x0F, 0x71, 0x99, 0x90, 0x94, 0x8E, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, +0x94, 0x8C, 0xEC, 0x8D, 0xF0, 0x12, 0xA6, 0xDC, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x94, 0x8D, +0xE0, 0x9D, 0x90, 0x94, 0x8C, 0xE0, 0x9C, 0x40, 0x18, 0x90, 0x8E, 0x2A, 0xE0, 0x24, 0x01, 0xFD, +0x12, 0xA5, 0xE2, 0xFC, 0xC3, 0x90, 0x94, 0x8D, 0xE0, 0x9D, 0xF0, 0x90, 0x94, 0x8C, 0xE0, 0x9C, +0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0xEF, 0x30, 0xE7, 0x06, 0x90, +0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x23, 0xF0, 0x90, +0x94, 0x8B, 0xE0, 0x60, 0x3B, 0x90, 0x94, 0x92, 0xE0, 0x24, 0xB0, 0x60, 0x16, 0x24, 0xD0, 0x60, +0x02, 0x41, 0xE9, 0x12, 0xA6, 0xD4, 0x20, 0xE0, 0x18, 0x12, 0x8A, 0x4B, 0x20, 0xE0, 0x02, 0x41, +0xE9, 0x80, 0x0E, 0x12, 0xA6, 0xD4, 0x20, 0xE0, 0x08, 0x12, 0x8A, 0x4B, 0x20, 0xE0, 0x02, 0x41, +0xE9, 0x71, 0x6E, 0x90, 0x94, 0x99, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0xA5, 0x4A, 0x41, 0xE9, +0x90, 0x94, 0x92, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x2C, 0x90, 0x8E, 0xB2, 0xE0, +0xFF, 0x12, 0x7F, 0xA5, 0x20, 0xE0, 0x02, 0x41, 0xE9, 0x90, 0x8E, 0xC5, 0xE0, 0x04, 0x71, 0x6D, +0x12, 0x90, 0x36, 0xEF, 0x70, 0x02, 0x41, 0xE9, 0x90, 0x94, 0x92, 0xE0, 0xFF, 0x12, 0x9F, 0x38, +0x90, 0x8E, 0xC6, 0xE0, 0x04, 0xF0, 0x41, 0xE9, 0x12, 0xA5, 0xE9, 0x30, 0xE0, 0x5C, 0x90, 0x94, +0x95, 0xE0, 0xFF, 0x90, 0x94, 0x91, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0x90, 0xE0, 0x34, 0x00, 0xCF, +0x24, 0x08, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x9B, 0x12, 0xA5, 0xAC, 0xEF, 0x64, 0x45, 0x70, +0x39, 0xB1, 0xF4, 0x12, 0x94, 0xFA, 0xEF, 0x64, 0x01, 0x70, 0x2F, 0xB1, 0xF4, 0xF1, 0x6B, 0xEF, +0x64, 0x01, 0x70, 0x26, 0x90, 0x94, 0x9F, 0x04, 0xF0, 0xB1, 0xF4, 0xA3, 0xE0, 0xFD, 0x12, 0x93, +0x89, 0xEF, 0x70, 0x0E, 0x90, 0x94, 0x9D, 0xE0, 0xFD, 0x90, 0xFD, 0x11, 0xF0, 0xB1, 0xF4, 0x12, +0x93, 0x4D, 0x90, 0x94, 0x9D, 0xE0, 0x90, 0xFD, 0x11, 0xF0, 0x71, 0x6E, 0x12, 0x90, 0x36, 0xEF, +0x60, 0x1F, 0x71, 0x6E, 0x90, 0x94, 0x95, 0xE0, 0xFD, 0x90, 0x94, 0x98, 0xE0, 0xFB, 0x90, 0x94, +0x9D, 0xE0, 0x90, 0x93, 0x64, 0xF0, 0x91, 0x3F, 0xEF, 0x60, 0x06, 0x90, 0x94, 0x9F, 0x74, 0x01, +0xF0, 0x90, 0x8E, 0xAF, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x71, 0x6E, 0x90, 0x94, 0x95, 0xE0, +0xFD, 0x91, 0xC5, 0xEF, 0x60, 0x06, 0x90, 0x94, 0x9F, 0x74, 0x01, 0xF0, 0x12, 0x7E, 0xF3, 0x54, +0x3F, 0x30, 0xE0, 0x0A, 0x71, 0x6E, 0x90, 0x94, 0x95, 0xE0, 0xFD, 0x12, 0x91, 0x35, 0x90, 0x8E, +0xAF, 0xE0, 0xFF, 0x12, 0x7F, 0xA5, 0x30, 0xE0, 0x10, 0x90, 0x94, 0x9F, 0xE0, 0x70, 0x0A, 0x71, +0x6E, 0x90, 0x94, 0x95, 0xE0, 0xFD, 0x12, 0x90, 0x80, 0x12, 0x9F, 0x89, 0xEF, 0x64, 0x01, 0x60, +0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x10, 0x12, 0xA6, 0x79, 0x30, 0xE0, 0x06, 0x90, 0x01, +0x3F, 0x74, 0x04, 0xF0, 0x7F, 0x01, 0xF1, 0xAD, 0x12, 0x9F, 0x0D, 0xEF, 0x64, 0x01, 0x70, 0x36, +0x90, 0x8E, 0xC7, 0xE0, 0x04, 0xF0, 0x12, 0x9E, 0xF7, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60, 0x1E, +0xF1, 0x9D, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, 0x80, 0x0A, 0xED, 0xB4, +0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x43, 0xF0, 0x7F, 0x01, 0xF1, 0xAD, 0x80, 0x1F, 0x90, 0x94, +0x8C, 0x12, 0x9E, 0xE4, 0x80, 0x0F, 0x12, 0xA6, 0x79, 0x20, 0xE0, 0x11, 0x90, 0x8E, 0xAF, 0xE0, +0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x94, 0x93, 0xE0, 0x04, 0xF0, 0x01, 0xA0, 0x74, 0x55, 0x04, +0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x94, +0x90, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x62, 0xE0, 0xFD, 0x90, 0x93, 0x61, 0xE0, +0x2D, 0xFD, 0x90, 0x93, 0x60, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x10, 0xCD, 0x34, 0x00, 0xFC, 0x7E, +0x00, 0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, +0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x8E, 0x2A, 0xE0, 0x9B, 0x90, 0x8E, 0x29, 0xE0, 0x9A, 0x50, 0x0C, +0xA3, 0x12, 0xA5, 0xDE, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0x12, 0x8F, 0xD9, 0x74, +0x00, 0x2F, 0x12, 0x8E, 0x37, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x70, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0x7D, 0x09, 0x71, 0x99, 0xEF, 0x64, 0x06, 0x70, 0x24, 0xB1, 0xFD, 0x7D, 0x14, 0x71, 0x99, 0xEF, +0x70, 0x1B, 0xB1, 0xFD, 0x7D, 0x15, 0x71, 0x99, 0xEF, 0x64, 0x50, 0x70, 0x10, 0xB1, 0xFD, 0x7D, +0x21, 0x71, 0x99, 0xEF, 0x20, 0xE0, 0x03, 0x30, 0xE2, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x8E, 0xB0, +0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x34, 0xB1, 0xFD, 0x7D, 0x09, 0x71, 0x99, 0xEF, 0x64, +0x11, 0x70, 0x29, 0x90, 0x93, 0x71, 0xE0, 0x24, 0x14, 0x12, 0x93, 0xEC, 0x90, 0x93, 0x72, 0xF0, +0xA3, 0xEF, 0xF0, 0x7D, 0x02, 0x71, 0x99, 0xEF, 0x70, 0x12, 0x90, 0x93, 0x72, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0x7D, 0x03, 0x71, 0x99, 0xBF, 0x89, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, +0x93, 0x62, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x90, 0x2C, 0x90, 0x93, 0x65, 0xF0, 0xFD, 0x71, +0x99, 0xEF, 0x54, 0x0C, 0x64, 0x08, 0x70, 0x5D, 0x91, 0xBC, 0xA3, 0xE0, 0xF1, 0x48, 0x64, 0x88, +0x70, 0x53, 0x91, 0xBC, 0xA3, 0xE0, 0x24, 0x07, 0xFD, 0x71, 0x99, 0xEF, 0x64, 0x8E, 0x70, 0x45, +0x90, 0x93, 0x65, 0x04, 0x91, 0xBB, 0x12, 0xA6, 0x0B, 0x04, 0xFD, 0x71, 0x99, 0xEF, 0x64, 0x03, +0x70, 0x33, 0x91, 0xBC, 0x12, 0xA6, 0x0B, 0xF1, 0x48, 0x30, 0xE3, 0x07, 0x90, 0x01, 0xC7, 0x74, +0x01, 0x80, 0x20, 0x90, 0x8E, 0xAF, 0x12, 0xA0, 0x5D, 0x30, 0xE0, 0x09, 0x91, 0xBC, 0xA3, 0xE0, +0xFD, 0xD1, 0x1D, 0x80, 0x10, 0x90, 0x8E, 0xB2, 0x12, 0xA5, 0xEC, 0x30, 0xE0, 0x07, 0x90, 0x01, +0xC7, 0x74, 0x02, 0xF1, 0x9C, 0x90, 0x93, 0x65, 0xE0, 0xFF, 0x22, 0xF0, 0x90, 0x93, 0x60, 0xE0, +0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x12, 0x93, 0x12, 0x12, 0x94, 0x07, 0x7A, 0x40, 0x79, 0x56, 0x12, +0x91, 0x2E, 0x78, 0x6F, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x5C, 0x12, 0x91, +0x27, 0x78, 0x73, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x60, 0x12, 0x91, 0x27, +0xE4, 0x90, 0x93, 0x78, 0xF0, 0xF1, 0x59, 0xCF, 0x24, 0x06, 0xCF, 0xD1, 0x16, 0xEF, 0x64, 0x08, +0x60, 0x02, 0xA1, 0xE7, 0xF1, 0x59, 0xCF, 0x24, 0x07, 0xCF, 0xD1, 0x16, 0xEF, 0x64, 0x06, 0x60, +0x02, 0xA1, 0xE7, 0x90, 0x93, 0x78, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x77, 0xF0, 0xB1, 0xED, 0x94, +0x06, 0x50, 0x17, 0x90, 0x93, 0x61, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x93, 0x60, 0xE0, 0x71, 0x8C, +0x90, 0x93, 0x77, 0x12, 0x93, 0xFE, 0xD1, 0x06, 0x80, 0xE3, 0x12, 0x93, 0x0B, 0x7B, 0x01, 0x7A, +0x8E, 0x79, 0xBF, 0x12, 0x94, 0x10, 0x60, 0x02, 0xA1, 0xE7, 0x90, 0x93, 0x77, 0xF0, 0xB1, 0xED, +0x94, 0x04, 0x50, 0x19, 0x12, 0x92, 0xFF, 0xF1, 0x64, 0xCD, 0x24, 0x20, 0x71, 0x8B, 0x90, 0x93, +0x77, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xD1, 0x06, 0x80, 0xE1, 0x78, 0x73, 0x7C, +0x93, 0x12, 0x94, 0x27, 0xEF, 0x70, 0x67, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x01, 0x54, 0xDF, 0xF0, +0x90, 0x8E, 0xB1, 0xE0, 0x30, 0xE0, 0x09, 0x90, 0x01, 0xC7, 0x74, 0x09, 0xF1, 0x9C, 0x80, 0x57, +0xE4, 0x90, 0x93, 0x77, 0xF0, 0xB1, 0xED, 0x94, 0x06, 0x50, 0x0C, 0x71, 0x77, 0x90, 0x93, 0x77, +0x12, 0x93, 0xF5, 0xD1, 0x06, 0x80, 0xEE, 0xE4, 0x90, 0x93, 0x77, 0xF0, 0xB1, 0xED, 0x94, 0x04, +0x50, 0x19, 0x12, 0x92, 0xFF, 0xF1, 0x64, 0xCD, 0x24, 0x16, 0x71, 0x8B, 0x90, 0x93, 0x77, 0xE0, +0x24, 0x6F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xD1, 0x06, 0x80, 0xE1, 0x7B, 0x01, 0x7A, 0x93, 0x79, +0x69, 0x12, 0x9E, 0xD7, 0xF0, 0x7A, 0x93, 0x79, 0x6F, 0x12, 0x5B, 0xF0, 0x80, 0x09, 0x90, 0x06, +0x30, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x77, +0xE0, 0xFF, 0xC3, 0x22, 0x90, 0x94, 0x9B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x70, +0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x77, 0xE0, 0x04, 0xF0, +0x22, 0xFF, 0x90, 0x93, 0x69, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x61, 0x99, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xEF, 0x44, 0x08, 0xF0, 0xED, 0x2F, 0xFF, +0xE4, 0x3E, 0xFE, 0x7C, 0x00, 0xEF, 0x24, 0x08, 0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x69, 0xF0, 0xA3, +0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x83, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xC0, 0x12, 0x08, +0xAA, 0x90, 0x93, 0x6A, 0xE0, 0x24, 0x01, 0xD1, 0x11, 0x90, 0x8F, 0xC1, 0xF1, 0x41, 0x24, 0x04, +0xD1, 0x11, 0x90, 0x8F, 0xC4, 0xF1, 0x41, 0x24, 0x05, 0xD1, 0x11, 0x90, 0x8F, 0xC5, 0xF1, 0x41, +0x24, 0x06, 0xD1, 0x11, 0x90, 0x8F, 0xC6, 0xF1, 0x41, 0x24, 0x07, 0xD1, 0x11, 0x90, 0x8F, 0xC7, +0xF1, 0x41, 0x24, 0x08, 0xD1, 0x11, 0x90, 0x8F, 0xC8, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0x68, 0xF0, +0x90, 0x93, 0x68, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x1D, 0x90, 0x93, 0x6A, 0xE0, 0x24, 0x09, +0xFD, 0x90, 0x93, 0x69, 0xE0, 0x71, 0x8C, 0x90, 0x93, 0x68, 0xE0, 0x24, 0xC9, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0x12, 0xA5, 0xD3, 0x80, 0xD9, 0xE4, 0x90, 0x93, 0x68, 0xF0, 0x90, 0x93, 0x68, 0xE0, +0xFF, 0xC3, 0x94, 0x20, 0x50, 0x1D, 0x90, 0x93, 0x6A, 0xE0, 0x24, 0x63, 0xFD, 0x90, 0x93, 0x69, +0xE0, 0x71, 0x8C, 0x90, 0x93, 0x68, 0xE0, 0x24, 0x23, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0x12, 0xA5, +0xD3, 0x80, 0xD9, 0x90, 0x8F, 0xC5, 0x12, 0xA3, 0xFD, 0x12, 0xA6, 0x67, 0x30, 0xE3, 0x0C, 0x7F, +0x01, 0xF1, 0xAD, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x3F, 0x90, 0x93, 0x66, 0xA3, 0xE0, +0xFF, 0x7C, 0x00, 0x54, 0x07, 0xFD, 0x64, 0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED, +0x64, 0x02, 0x4C, 0x70, 0x25, 0xEF, 0x54, 0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF, +0xC4, 0x54, 0x0F, 0x48, 0x90, 0x90, 0x59, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0xA2, +0xD0, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xF7, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xEF, 0xF0, 0x90, 0x93, 0x6A, 0xE0, 0x22, 0x24, 0x06, 0xFD, 0x71, 0x99, 0xEF, 0x22, 0xD2, +0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x62, 0xE0, 0xFF, 0x90, 0x93, +0x61, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x60, 0xE0, 0x34, 0x00, 0x22, 0x12, 0xA5, 0x63, 0x24, 0x16, +0xFF, 0xE4, 0x3E, 0xD1, 0x18, 0x90, 0x90, 0x9C, 0xA3, 0xE0, 0xB5, 0x07, 0x19, 0x90, 0x93, 0x61, +0xE0, 0x24, 0x16, 0xF1, 0x63, 0xFE, 0x7D, 0x01, 0x71, 0x99, 0xEF, 0xFD, 0x90, 0x90, 0x9C, 0xE0, +0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xF0, 0x90, 0x8E, 0xB8, +0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x7F, 0x01, 0x90, 0x95, 0x55, +0xEF, 0xF0, 0x90, 0x8D, 0x07, 0xE0, 0x64, 0x02, 0x70, 0x1E, 0x90, 0x95, 0x55, 0xE0, 0xFD, 0x64, +0x01, 0x70, 0x2D, 0xF1, 0x9D, 0x12, 0x7F, 0xA1, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64, +0x80, 0xF0, 0x80, 0x1C, 0xAF, 0x05, 0x80, 0x15, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x12, 0x87, +0xE6, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x95, 0x55, 0xE0, 0xFF, 0x12, 0x4C, 0x60, +0x12, 0x7F, 0x79, 0xF0, 0x90, 0x8E, 0xAF, 0xE0, 0x54, 0xBF, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, +0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xFC, 0x90, 0x01, 0xC4, +0xED, 0xF0, 0x74, 0x67, 0x11, 0x23, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, +0xD0, 0xE0, 0x32, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, +0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, +0x30, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x68, 0x11, 0x23, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, +0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, +0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, +0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x57, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0x4B, +0x7D, 0xE5, 0x14, 0x30, 0xE7, 0x03, 0x12, 0x4E, 0xB9, 0x74, 0x57, 0x04, 0x90, 0x01, 0xC4, 0xF0, +0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, -0x5F, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x12, 0x4B, 0x6E, 0xE5, 0x14, 0x30, 0xE7, 0x03, 0x12, 0x4E, -0x6C, 0x74, 0x5F, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, -0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, -0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, -0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, -0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xB7, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x12, 0x8C, -0x1B, 0xE5, 0x19, 0x30, 0xE3, 0x03, 0x12, 0x8C, 0x78, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x31, 0xDA, -0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x8C, 0x85, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x31, 0x59, 0xE5, -0x1B, 0x30, 0xE1, 0x03, 0x12, 0x8C, 0xC1, 0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, 0x8E, 0x23, 0xE5, -0x1B, 0x30, 0xE3, 0x02, 0x71, 0x1B, 0xE5, 0x1B, 0x30, 0xE4, 0x02, 0x71, 0x57, 0xE5, 0x1B, 0x30, -0xE5, 0x02, 0x71, 0x87, 0xE5, 0x1B, 0x30, 0xE6, 0x02, 0x71, 0x70, 0xE5, 0x1C, 0x30, 0xE1, 0x03, -0x12, 0x8E, 0x35, 0x74, 0xB7, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0xD0, 0x07, -0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, -0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x58, 0x90, 0x8E, 0x15, 0xE0, -0x60, 0x6D, 0x71, 0x13, 0x70, 0x69, 0xF1, 0x6C, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x12, -0xA0, 0x9F, 0x90, 0x8E, 0x13, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, -0x70, 0x1E, 0x90, 0x8E, 0x1C, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x8E, 0x1E, 0xE0, -0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x8E, 0x1B, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x58, 0x01, -0xE5, 0x58, 0x60, 0x2B, 0x12, 0xA1, 0x78, 0x90, 0x8E, 0x1E, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x04, -0x31, 0xD0, 0x80, 0x08, 0x31, 0xD0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, 0x1D, -0xE0, 0x2F, 0x12, 0x50, 0x0D, 0x90, 0x8E, 0x18, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x51, 0xF9, 0x22, -0xE4, 0x90, 0x94, 0xE2, 0xF0, 0x90, 0x8E, 0x1E, 0xE0, 0x22, 0x31, 0xED, 0x7F, 0x02, 0x8F, 0x59, -0x7F, 0x02, 0x12, 0x48, 0x12, 0x90, 0x8D, 0x01, 0xE0, 0x45, 0x59, 0xF0, 0x22, 0x90, 0x01, 0xCC, -0xE0, 0x54, 0x0F, 0x90, 0x95, 0x1C, 0xF0, 0x90, 0x95, 0x1C, 0xE0, 0xFD, 0x70, 0x02, 0x41, 0xE8, -0x90, 0x8D, 0x5E, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, -0x90, 0x8D, 0x5F, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, -0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x95, 0x1A, 0x12, 0x89, 0xA8, 0x80, 0x05, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0xCA, 0xE4, 0x90, -0x95, 0x1D, 0xF0, 0x90, 0x95, 0x1D, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x31, 0x51, 0xE9, 0xA4, -0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x71, 0x01, 0x90, -0x8D, 0x0E, 0x51, 0xF1, 0x51, 0xE9, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x71, -0x01, 0x90, 0x8D, 0x12, 0x51, 0xF1, 0x90, 0x95, 0x1D, 0xE0, 0x04, 0xF0, 0x80, 0xC5, 0x90, 0x95, -0x1C, 0xE0, 0xFF, 0x90, 0x95, 0x1A, 0x12, 0x4B, 0x14, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, -0x5F, 0x90, 0x95, 0x1C, 0xF0, 0x90, 0x95, 0x1A, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, -0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x95, 0x1A, 0xE0, 0x04, 0xF0, 0xE0, -0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5F, 0x12, 0x83, 0x7E, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, -0x02, 0x21, 0xF7, 0xE4, 0x90, 0x8D, 0x5F, 0xF0, 0x21, 0xF7, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, -0xF0, 0x90, 0x95, 0x1A, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, 0x51, 0xE9, 0x90, 0x01, 0xD0, -0x12, 0x43, 0xFD, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0x90, 0x95, 0x1A, 0xE0, 0x75, 0xF0, 0x04, -0x22, 0x12, 0x43, 0xFD, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, -0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, 0x5F, 0xE0, 0x75, -0xF0, 0x08, 0x22, 0xE4, 0xFF, 0x71, 0x2E, 0xEF, 0x64, 0x01, 0x22, 0x71, 0x13, 0x70, 0x0E, 0x90, -0x8E, 0x15, 0xE0, 0x60, 0x08, 0xB1, 0x76, 0x12, 0x9B, 0xE5, 0x12, 0x50, 0x0D, 0x22, 0x12, 0x89, -0xA1, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0x12, 0x89, 0x3C, 0xE0, 0xFD, 0x7C, 0x00, 0x12, 0x89, 0xAA, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, -0x7F, 0x00, 0x60, 0x02, 0x7F, 0x01, 0x22, 0x71, 0x13, 0x70, 0x14, 0x90, 0x8E, 0x15, 0xE0, 0x60, -0x0E, 0xB1, 0x76, 0x90, 0x8E, 0x11, 0xE0, 0xF1, 0x53, 0x54, 0x07, 0x70, 0x02, 0x91, 0xB2, 0x22, -0xE4, 0xFF, 0x71, 0x2E, 0xBF, 0x01, 0x0F, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x09, 0x12, 0x9B, 0xDD, -0x54, 0x07, 0x70, 0x02, 0x91, 0xB2, 0x22, 0xE4, 0xFF, 0x71, 0x2E, 0xBF, 0x01, 0x12, 0x90, 0x8E, -0x15, 0xE0, 0x60, 0x0C, 0xF1, 0xF5, 0x64, 0x02, 0x60, 0x03, 0x02, 0x9B, 0xEF, 0x12, 0x67, 0x84, -0x22, 0xE4, 0x90, 0x93, 0xFD, 0xF0, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x3A, 0x71, 0x13, 0x70, 0x36, -0x12, 0xA1, 0x68, 0xF1, 0x6B, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x12, 0xA0, 0x9F, 0x90, -0x93, 0xFD, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x8E, 0x1C, 0xF0, 0x04, 0x60, 0x19, 0x12, 0xA1, 0x78, -0xE4, 0x90, 0x94, 0xE2, 0xF0, 0x90, 0x8E, 0x1D, 0xE0, 0x12, 0x50, 0x0D, 0x90, 0x8E, 0x18, 0xE0, -0x20, 0xE2, 0x03, 0x12, 0x51, 0xF9, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0xF1, 0xC3, 0xFF, -0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x7D, 0xB4, 0xF5, 0x56, -0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x26, 0xAB, 0x51, -0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFD, 0xAF, 0x54, 0x12, 0x88, 0xFC, 0xAF, -0x54, 0x71, 0x2E, 0xEF, 0xAF, 0x54, 0x70, 0x05, 0x12, 0x8A, 0x77, 0x80, 0x03, 0x12, 0x8A, 0x63, -0x05, 0x54, 0x80, 0xD3, 0xE5, 0x55, 0x70, 0x0E, 0xFF, 0x71, 0x2E, 0xEF, 0x70, 0x08, 0xB1, 0x69, -0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0xF1, 0x48, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x13, -0x54, 0x03, 0x30, 0xE0, 0x02, 0xF1, 0x12, 0x90, 0x8E, 0x11, 0x12, 0x67, 0xED, 0x30, 0xE0, 0x09, -0xEF, 0xF1, 0x53, 0x54, 0x07, 0x70, 0x42, 0x80, 0x3E, 0x90, 0x8E, 0x1E, 0xE0, 0x04, 0xF0, 0x90, -0x8E, 0x19, 0xE0, 0x54, 0xEF, 0xF0, 0x12, 0xA0, 0x93, 0x40, 0x2C, 0x71, 0x13, 0x70, 0x2A, 0xF1, -0xF5, 0x70, 0x04, 0x91, 0xBC, 0x80, 0x23, 0x91, 0xBC, 0x90, 0x8E, 0x1F, 0xE0, 0x04, 0xF0, 0xE0, -0xD3, 0x94, 0x02, 0x40, 0x09, 0x91, 0xAA, 0xE4, 0x90, 0x8E, 0x1F, 0xF0, 0x80, 0x03, 0x12, 0x67, -0x84, 0xE4, 0x90, 0x8E, 0x1E, 0xF0, 0x22, 0x91, 0xB2, 0x22, 0x90, 0x8E, 0x12, 0xE0, 0x54, 0xFB, -0xF0, 0x22, 0x90, 0x8E, 0x17, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x51, 0xFD, 0x12, 0xA0, 0x93, 0x40, -0x20, 0x90, 0x8E, 0x2F, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x14, 0x90, 0x8E, 0x27, -0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x8E, 0x2E, 0xF0, 0xFB, 0x12, 0x8F, 0x1B, 0x12, 0x8E, -0xB0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0xB1, -0x25, 0x7D, 0x02, 0x7F, 0x03, 0xB1, 0x25, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0x12, 0xA0, 0xC0, -0xE4, 0xFF, 0x71, 0x2E, 0xBF, 0x01, 0x10, 0x91, 0xAA, 0x90, 0x8E, 0x18, 0xE0, 0x20, 0xE2, 0x0A, -0x7D, 0x01, 0x7F, 0x04, 0x02, 0x51, 0xFD, 0x12, 0xA1, 0x70, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0xB1, -0x25, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0xF1, -0x34, 0xF0, 0x22, 0xEF, 0x70, 0x31, 0x7D, 0x78, 0x7F, 0x02, 0xD1, 0x27, 0x7D, 0x02, 0x7F, 0x03, -0xD1, 0x27, 0x7D, 0xC8, 0x7F, 0x02, 0xF1, 0x27, 0xB1, 0x76, 0xE4, 0xFF, 0x71, 0x2E, 0xEF, 0x70, -0x0A, 0xB1, 0x69, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, -0x51, 0xFD, 0xB1, 0x6E, 0x02, 0xA1, 0x29, 0x81, 0xE2, 0x12, 0x4D, 0xE7, 0xF1, 0x5E, 0x90, 0x8E, -0x11, 0xE0, 0x54, 0xF7, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, -0xF0, 0x22, 0xF1, 0x6C, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0xA0, 0xF3, 0x71, -0x13, 0x60, 0x02, 0xC1, 0x1C, 0x90, 0x8E, 0x15, 0xE0, 0x70, 0x02, 0xC1, 0x1C, 0xF1, 0x1E, 0x64, -0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, 0x1C, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, -0x8E, 0x1B, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x8E, 0x1B, 0xE0, 0xFE, 0xFF, 0x80, 0x00, -0x90, 0x8E, 0x1C, 0xEF, 0xF0, 0x12, 0x9C, 0x08, 0x12, 0xA1, 0x70, 0xE4, 0x90, 0x8E, 0x1E, 0x12, -0xA0, 0xC0, 0xB1, 0x76, 0xF1, 0x56, 0x54, 0xEF, 0xF0, 0xF1, 0x1E, 0x24, 0xFD, 0x50, 0x02, 0x80, -0x03, 0x12, 0x9B, 0x84, 0xF1, 0x48, 0x30, 0xE0, 0x33, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, -0xE0, 0x2A, 0x90, 0x8E, 0x1B, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x20, 0x90, 0x8E, 0x12, 0xE0, -0x44, 0x40, 0xF0, 0x12, 0xA1, 0x68, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, -0xD1, 0xC1, 0xD1, 0x23, 0xF1, 0x12, 0x90, 0x8E, 0x1C, 0xE0, 0x14, 0xF0, 0x22, 0x7D, 0x02, 0x7F, -0x02, 0xD1, 0x27, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x12, 0xA1, 0xA0, 0xFE, 0xF6, 0x74, 0x30, -0xF1, 0x34, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x30, 0xEF, 0xF0, -0x54, 0x01, 0xFF, 0x90, 0x8E, 0xC0, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x8D, 0xFB, 0xF1, 0x4B, -0x30, 0xE0, 0x39, 0x12, 0x83, 0xC2, 0x60, 0x10, 0x12, 0x83, 0xB8, 0x40, 0x0B, 0xE4, 0x7F, 0x0A, -0xFE, 0xFD, 0xFC, 0x90, 0x90, 0xD6, 0x80, 0x09, 0xE4, 0x7F, 0x0A, 0xFE, 0xFD, 0xFC, 0x90, 0x90, -0xCE, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x9D, 0xC0, 0x07, 0x90, 0x8E, 0xC2, 0xE0, 0xFB, 0xE4, 0xFA, -0xF9, 0xF8, 0xD0, 0x07, 0x12, 0x43, 0x28, 0x90, 0x8E, 0xC3, 0xEF, 0xF0, 0x90, 0x95, 0x30, 0xE0, -0x64, 0x01, 0x70, 0x1F, 0x90, 0x01, 0x53, 0xF0, 0x90, 0x8E, 0xC2, 0xE0, 0x60, 0x0A, 0x7D, 0x10, -0x7F, 0x03, 0xD1, 0xC1, 0xF1, 0x8D, 0x80, 0x14, 0xF1, 0x3E, 0xF1, 0x27, 0xD1, 0x1D, 0x12, 0x9D, -0x2E, 0x80, 0x09, 0xF1, 0x3E, 0xD1, 0xC1, 0xB1, 0x1B, 0x12, 0x4F, 0xEF, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xF1, 0x30, 0xF0, 0x22, 0x90, 0x8E, 0xC0, 0xE0, 0x30, -0xE0, 0x3F, 0xF1, 0x8D, 0x90, 0x8E, 0xC3, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x9D, 0x2E, 0x90, -0x8E, 0xC1, 0xE0, 0x14, 0x90, 0x8E, 0xC3, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, -0xD1, 0x34, 0xB1, 0x1B, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, 0x13, 0x54, -0x1F, 0x30, 0xE0, 0x0D, 0x90, 0x94, 0xE5, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x12, 0x50, -0x45, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0xC1, 0x27, 0x71, 0xA1, 0xF1, 0xBC, 0x80, 0xAD, 0x90, 0x8E, -0x13, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0x74, 0x1D, 0x12, 0xA1, 0xA0, 0xF1, 0x30, 0xF0, 0x22, -0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0x22, 0x90, 0x01, -0x53, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x22, 0x90, 0x8E, 0x12, 0xE0, 0xFF, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x22, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x19, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x12, 0x67, -0xF4, 0x12, 0x4F, 0xE9, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0xF0, 0x90, 0x05, 0x62, 0xE0, -0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0x22, 0x90, 0x8E, 0xC0, 0xE0, 0x30, 0xE0, -0x0B, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x04, 0xD1, 0x1D, 0xF1, 0x8D, 0x22, 0x90, 0x8E, 0xC2, -0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, -0x1E, 0xF0, 0xA3, 0xF0, 0x90, 0x8E, 0x19, 0xF0, 0x90, 0x8E, 0x12, 0xE0, 0x54, 0xF7, 0xF0, 0x54, -0xBF, 0xF0, 0xB1, 0x21, 0xF1, 0xBC, 0x7D, 0x10, 0x7F, 0x03, 0xE1, 0x27, 0x7D, 0x02, 0x7F, 0x02, -0xA1, 0x25, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x06, 0xA2, 0x90, 0x93, 0x4D, 0x12, 0x44, 0x12, 0xF1, -0x96, 0x90, 0x8E, 0x15, 0xE0, 0xFF, 0xB1, 0x33, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x12, 0x90, 0x93, -0x4D, 0x12, 0x44, 0x09, 0xF1, 0xC3, 0x54, 0x0F, 0xFF, 0x12, 0x7D, 0xB4, 0xFD, 0x12, 0x9A, 0xAE, -0x22, 0x7F, 0x80, 0x21, 0xDE, 0x90, 0x8E, 0x13, 0xE0, 0x54, 0x0F, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, -0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, -0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xFC, 0xF0, 0x74, -0x77, 0xA3, 0xF0, 0x12, 0x8C, 0x48, 0xE5, 0x21, 0x30, 0xE0, 0x03, 0x12, 0x77, 0xF1, 0xE5, 0x21, -0x30, 0xE1, 0x03, 0x12, 0x8E, 0x5B, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0x8E, 0x65, 0xE5, 0x22, -0x30, 0xE0, 0x03, 0x12, 0x8E, 0x7C, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, 0x71, 0xDE, -0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x77, 0x18, 0xE5, 0x24, 0x30, 0xE5, 0x02, 0x11, 0x8C, 0xE5, -0x24, 0x30, 0xE6, 0x02, 0x11, 0xF1, 0x74, 0xFC, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x77, 0xA3, -0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, -0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x8E, 0x11, 0x12, -0x9F, 0xD5, 0x30, 0xE0, 0x15, 0xEF, 0x54, 0xBF, 0xF1, 0xEE, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, -0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x74, 0xB2, 0xE4, 0xFF, 0x90, 0x93, 0x2C, 0xE0, -0x30, 0xE0, 0x3D, 0x90, 0x93, 0x31, 0xE0, 0xFD, 0x60, 0x36, 0x12, 0x89, 0xAA, 0x80, 0x05, 0xC3, -0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x0B, -0xE4, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x93, 0x33, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x2E, 0xE0, 0xD3, -0x9D, 0x50, 0x04, 0x31, 0x6A, 0xF0, 0x22, 0x12, 0x65, 0x55, 0x90, 0x93, 0x31, 0xE0, 0x04, 0xF0, -0x22, 0x90, 0x8E, 0x11, 0x31, 0x18, 0x30, 0xE0, 0x1B, 0xEF, 0x54, 0x7F, 0xF1, 0xEE, 0x30, 0xE1, -0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x8E, 0x15, 0xE0, 0x60, -0x03, 0x12, 0x74, 0xB2, 0x7F, 0x01, 0x80, 0x94, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0x22, 0x90, 0x95, 0x2B, 0xEF, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0x64, 0x02, 0x70, 0x22, 0x90, 0x95, -0x2B, 0xE0, 0xFD, 0x64, 0x01, 0x70, 0x28, 0x12, 0x6F, 0x98, 0x90, 0x8E, 0xC8, 0xE0, 0x31, 0x1A, -0x30, 0xE0, 0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, 0x13, 0xAF, 0x05, 0x80, 0x0C, -0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x95, 0x2B, 0xE0, 0xFF, 0x12, 0x4C, 0x50, 0x31, -0x74, 0xF0, 0x90, 0x8E, 0xC4, 0xE0, 0x54, 0xBF, 0xF0, 0x22, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, -0x7F, 0x01, 0x31, 0x21, 0x90, 0x93, 0x2C, 0xE0, 0x54, 0xFE, 0x22, 0xF1, 0x3E, 0x12, 0x06, 0x89, -0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x15, 0xF0, 0xEF, 0x31, 0x1A, 0xA3, 0x12, 0x77, 0xC2, 0xFF, 0x54, -0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x8E, 0x13, 0xE0, 0x54, 0xF0, 0x4E, 0xB1, 0xF7, 0x54, 0x01, -0x25, 0xE0, 0xFE, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, -0xF0, 0xFF, 0x12, 0x77, 0xF5, 0xB1, 0xB2, 0x90, 0x8E, 0x14, 0xF0, 0x91, 0x93, 0x30, 0xE0, 0x4D, -0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8E, 0x28, 0x50, 0x04, 0xEF, 0xF0, 0x80, -0x25, 0x74, 0x03, 0xF0, 0x51, 0x25, 0xE9, 0x24, 0x06, 0xF1, 0xC5, 0xFF, 0x74, 0x03, 0x24, 0xFD, -0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, -0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x51, 0x25, 0x91, 0x93, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, -0x04, 0x90, 0x8E, 0x1D, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x51, 0x25, 0xB1, -0x70, 0xFD, 0x7F, 0x02, 0x12, 0x4E, 0xB5, 0x90, 0x94, 0x6F, 0xE0, 0x60, 0x03, 0x12, 0x4E, 0xA9, -0x51, 0x25, 0x02, 0x77, 0xC9, 0x90, 0x93, 0x4A, 0x02, 0x44, 0x09, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0xF1, 0x3E, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x05, 0x12, 0x8B, 0x24, 0x41, 0xEE, 0x90, -0x8F, 0x98, 0x74, 0x05, 0xF0, 0xF1, 0x53, 0x90, 0x8E, 0xC7, 0x51, 0xF3, 0xF1, 0xD4, 0xFF, 0x90, -0x8E, 0xC7, 0x12, 0x9E, 0xF1, 0x71, 0x01, 0xF1, 0xDC, 0x90, 0x8E, 0xC7, 0x12, 0xA0, 0xE9, 0x71, -0x01, 0xF1, 0xE5, 0x90, 0x8E, 0xC7, 0x12, 0xA0, 0xDF, 0x12, 0x77, 0xC2, 0x54, 0x80, 0xFF, 0x90, -0x8E, 0xC8, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, -0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x51, 0x25, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x8D, 0x06, 0xE0, -0xB4, 0x02, 0x09, 0x90, 0x8E, 0xC8, 0xE0, 0x31, 0x1A, 0x20, 0xE0, 0x34, 0x12, 0x77, 0xC3, 0x54, -0x7F, 0xFF, 0x90, 0x8E, 0xC8, 0xE0, 0x54, 0x80, 0xB1, 0xB2, 0x90, 0x8E, 0xC9, 0xB1, 0xF7, 0xFF, -0x54, 0x01, 0xFE, 0x90, 0x8E, 0xCA, 0xF1, 0xCC, 0x54, 0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0xF0, -0x12, 0x4C, 0xF0, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x4A, 0x6A, -0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, -0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, -0x59, 0x90, 0x8E, 0xC4, 0x51, 0xF3, 0xF1, 0xD4, 0xFF, 0x90, 0x8E, 0xC4, 0x12, 0x9E, 0xF1, 0x71, -0x01, 0xF1, 0xDC, 0x90, 0x8E, 0xC4, 0x12, 0xA0, 0xE9, 0x71, 0x01, 0xF1, 0xE5, 0x90, 0x8E, 0xC4, -0x12, 0xA0, 0xDF, 0xB1, 0xB3, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0xC6, 0xE0, 0x54, 0xFE, 0x4F, 0x12, -0x77, 0xC2, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0xC5, 0xE0, 0x54, 0xFE, 0x4F, 0x12, 0x84, 0x9A, 0x12, -0x87, 0xE4, 0x90, 0x8E, 0xC4, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x99, 0xC9, 0xF1, 0x44, -0x54, 0x01, 0xFF, 0x12, 0x99, 0x35, 0xF1, 0x44, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x99, 0xD5, 0x90, -0x8E, 0xC4, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0x12, 0x9A, 0x2C, 0x90, 0x8E, 0xC4, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x01, 0xFF, 0x12, 0x9A, 0x3A, 0x90, 0x8E, 0xC4, 0xE0, 0x54, 0x01, 0xFF, 0x12, 0x86, -0x70, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x47, 0x12, 0x44, 0x12, 0x90, 0x93, 0x46, 0xEF, -0xF0, 0x12, 0x44, 0x1B, 0x7B, 0xE1, 0x00, 0x7B, 0xE9, 0x01, 0x7B, 0xF2, 0x02, 0x7B, 0xFB, 0x03, -0x7C, 0x04, 0x04, 0x7C, 0x0C, 0x12, 0x7C, 0x15, 0x14, 0x7C, 0x1E, 0x20, 0x7C, 0x26, 0x21, 0x7C, -0x2E, 0x23, 0x7C, 0x37, 0x25, 0x7C, 0x40, 0x27, 0x7C, 0x50, 0x80, 0x7C, 0x48, 0x81, 0x7C, 0x58, -0x82, 0x7C, 0x61, 0x83, 0x7C, 0x69, 0x84, 0x7C, 0x7A, 0x86, 0x7C, 0x71, 0x88, 0x00, 0x00, 0x7C, -0x83, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xA1, 0x76, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, -0x73, 0xE7, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x87, 0xEC, 0x90, 0x93, 0x47, 0x12, 0x44, -0x09, 0x02, 0x90, 0x85, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xE1, 0x07, 0x90, 0x93, 0x47, 0x12, -0x44, 0x09, 0x02, 0x88, 0x29, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x88, 0x3D, 0x90, 0x93, -0x47, 0x12, 0x44, 0x09, 0x21, 0x7B, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xE1, 0x61, 0x90, 0x93, -0x47, 0x12, 0x44, 0x09, 0x02, 0x88, 0x4C, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x88, 0x54, -0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xE1, 0x99, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x61, 0x08, -0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x41, 0x2B, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x99, -0xA3, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xA1, 0xBA, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xA1, -0xFE, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x99, 0xB9, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, -0x02, 0x9E, 0x4F, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0x46, 0xE0, 0x90, 0x01, -0xC2, 0xF0, 0x22, 0x90, 0x00, 0x06, 0x02, 0x06, 0xA2, 0x90, 0x94, 0xBB, 0x12, 0x44, 0x12, 0x12, -0x06, 0x89, 0x90, 0x94, 0xC0, 0x12, 0x77, 0xC2, 0x90, 0x94, 0xC1, 0xB1, 0x6F, 0x90, 0x94, 0xC2, -0xF1, 0x37, 0x90, 0x94, 0xC3, 0xF0, 0x91, 0x93, 0x90, 0x94, 0xC4, 0xF0, 0x90, 0x00, 0x07, 0x12, -0x06, 0xA2, 0x90, 0x94, 0xC5, 0xB1, 0xF7, 0x90, 0x94, 0xC8, 0xF0, 0xED, 0x70, 0x19, 0xFF, 0xB1, -0x64, 0xE0, 0xB4, 0xFF, 0x06, 0xB1, 0x64, 0xE4, 0xF0, 0x80, 0x07, 0xB1, 0x64, 0xE0, 0x04, 0xF0, -0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xE8, 0x90, 0x94, 0xBF, 0xE0, 0xFF, 0xB4, 0x04, 0x14, 0xA3, -0xE0, 0xFE, 0xB1, 0x5E, 0xEE, 0xF1, 0x4B, 0xFE, 0xB1, 0x5E, 0x12, 0x8A, 0x53, 0x90, 0x00, 0x02, -0xE4, 0x80, 0x20, 0xEF, 0xB4, 0x02, 0x1F, 0x90, 0x94, 0xC1, 0xB1, 0x5C, 0xEF, 0xF1, 0x4B, 0x44, -0x20, 0x54, 0x7F, 0xB1, 0x5D, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06, 0xE1, 0x90, 0x94, 0xC0, 0xE0, -0x90, 0x00, 0x02, 0x12, 0x06, 0xE1, 0xB1, 0x5E, 0xE9, 0x24, 0x03, 0xF1, 0xC5, 0x44, 0x20, 0x12, -0x06, 0xCF, 0x90, 0x94, 0xC2, 0xB1, 0x5C, 0x90, 0x00, 0x04, 0xEF, 0x12, 0x06, 0xE1, 0x90, 0x94, -0xC3, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x94, 0xC4, 0xE0, 0x90, 0x00, 0x06, 0x12, -0x06, 0xE1, 0x90, 0x94, 0xC5, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, 0xE1, 0xE0, 0xFF, 0x90, 0x94, -0xBB, 0x02, 0x44, 0x09, 0x74, 0xC0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xF0, -0x90, 0x00, 0x04, 0x02, 0x06, 0xA2, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, -0x51, 0x90, 0x8D, 0x07, 0x12, 0x77, 0xC2, 0x25, 0x51, 0x90, 0x8D, 0x08, 0xB1, 0xB3, 0x25, 0x51, -0x90, 0x8D, 0x09, 0xB1, 0xF7, 0x25, 0x51, 0x90, 0x8D, 0x0A, 0xB1, 0x6F, 0x25, 0x51, 0x90, 0x8D, -0x0B, 0xF1, 0x37, 0x25, 0x51, 0x90, 0x8D, 0x0C, 0xF0, 0x91, 0x93, 0x25, 0x51, 0x90, 0x8D, 0x0D, -0xF0, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x06, 0xA2, 0x12, 0xA0, 0x62, 0x90, 0x93, 0x18, -0x12, 0x77, 0xC2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x19, 0xB1, 0xB3, 0xFF, 0xED, 0x2F, 0x90, 0x93, -0x1A, 0xB1, 0xF7, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x1B, 0xB1, 0x6F, 0xFF, 0xED, 0x2F, 0x90, 0x93, -0x1C, 0xF1, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x1D, 0xF0, 0x91, 0x93, 0xFF, 0xAE, 0x05, 0xED, -0x2F, 0x90, 0x93, 0x1E, 0xF0, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x02, 0x06, 0xA2, 0x12, 0xA0, -0x62, 0x90, 0x93, 0x1F, 0x12, 0x77, 0xC2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x20, 0xB1, 0xB3, 0xFF, -0xED, 0x2F, 0x90, 0x93, 0x21, 0xB1, 0xF7, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x22, 0xB1, 0x6F, 0xFF, -0xED, 0x2F, 0x90, 0x93, 0x23, 0xF1, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x24, 0xF0, 0x91, 0x93, -0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x25, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x06, 0x74, -0x12, 0x77, 0xC2, 0x90, 0x06, 0x75, 0xB1, 0xB3, 0x90, 0x06, 0x76, 0xB1, 0xF7, 0x90, 0x06, 0x77, -0xF0, 0x90, 0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, -0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0x93, 0xA8, 0xEF, 0xF0, 0xA3, 0x12, 0x44, 0x12, -0x90, 0x93, 0xA9, 0x12, 0x56, 0x7A, 0xD1, 0xE1, 0x24, 0x02, 0xD1, 0xF6, 0x24, 0x04, 0xD1, 0xD8, -0x24, 0x03, 0xD1, 0xF6, 0x24, 0x08, 0xD1, 0xD8, 0x24, 0x04, 0xD1, 0xF6, 0x24, 0x0C, 0xD1, 0xD8, -0x24, 0x05, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, 0xD1, 0x3A, 0x90, 0x93, 0xA8, 0xE0, 0xFE, -0x44, 0x10, 0x90, 0x93, 0xAC, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, -0xEE, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, 0xD1, 0x3A, 0x90, 0x93, -0xAC, 0x74, 0xFF, 0x12, 0x4D, 0xB3, 0xD1, 0xED, 0x04, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, -0xD1, 0x3A, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, -0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, 0x12, 0x35, 0x26, 0x90, 0x93, 0xA8, -0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x22, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, 0xD1, 0x3A, 0x90, -0x93, 0xA9, 0x12, 0x44, 0x09, 0xE9, 0x22, 0xF1, 0x3E, 0x12, 0x89, 0xD2, 0xF1, 0x53, 0x31, 0x74, -0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x1E, 0x12, 0x77, 0xC3, 0x90, 0x93, 0x2D, 0xB1, 0xB3, -0x90, 0x93, 0x2E, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x04, 0xFF, 0x90, 0x93, 0x2C, 0xE0, 0x54, 0xFB, -0xB1, 0xF6, 0x90, 0x93, 0x2F, 0xF0, 0x22, 0xF0, 0x90, 0x00, 0x05, 0x02, 0x06, 0xA2, 0x90, 0x93, -0x4A, 0x02, 0x44, 0x12, 0x90, 0x8E, 0xC4, 0xE0, 0x13, 0x13, 0x22, 0x12, 0x06, 0xCF, 0x90, 0x94, -0xC1, 0xE0, 0x22, 0x90, 0x93, 0x4A, 0x12, 0x44, 0x09, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, -0x22, 0xB1, 0xB4, 0xFF, 0x30, 0xE0, 0x1C, 0x12, 0x06, 0x89, 0x90, 0x8E, 0xB9, 0x12, 0x77, 0xC2, -0x90, 0x8E, 0xBA, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0xB1, 0xF6, 0x90, 0x8E, -0xBC, 0xF0, 0x22, 0x90, 0x8E, 0xB9, 0x74, 0x05, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x54, -0x01, 0x44, 0x1E, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xF1, 0x59, 0x90, 0x8E, 0xC0, 0xF1, 0xCC, -0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0x12, 0x77, 0xC2, 0x90, 0x8E, 0xC1, 0xB1, 0xB3, 0x90, -0x8E, 0xC2, 0xF0, 0x90, 0x8E, 0xC1, 0xE0, 0x90, 0x8E, 0xC3, 0xF0, 0x90, 0x8E, 0xC0, 0xE0, 0x54, -0x01, 0xFF, 0x02, 0x76, 0x34, 0xF9, 0xE4, 0x3A, 0xFA, 0x02, 0x06, 0x89, 0xE0, 0x54, 0xFE, 0x4E, -0xFE, 0xF0, 0xEF, 0x22, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0x22, 0x54, 0x10, 0xFD, 0xEF, -0x54, 0xEF, 0x4D, 0xFF, 0x22, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x22, 0xF0, 0x90, -0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x12, 0x22, 0x32, 0x90, 0x95, 0x27, 0xEF, 0xF0, 0x7F, 0x02, 0x12, -0x48, 0x12, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x90, 0x95, 0x27, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, -0x01, 0xF0, 0x22, 0x90, 0x93, 0x55, 0x74, 0x12, 0xF0, 0x90, 0x93, 0x63, 0x74, 0x05, 0xF0, 0x90, -0x93, 0x57, 0xEF, 0x71, 0x9D, 0x90, 0x93, 0x53, 0xE0, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x54, -0xE0, 0x90, 0x93, 0x5B, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x55, 0x11, 0xC5, 0x7F, 0x04, 0x80, -0xB7, 0x11, 0xBE, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0x93, 0x4A, -0xE0, 0xA3, 0xF0, 0x11, 0xBE, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, -0x93, 0x4A, 0xE0, 0x90, 0x93, 0x4C, 0xF0, 0x11, 0xBE, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, -0xBF, 0x01, 0x08, 0x90, 0x93, 0x4A, 0xE0, 0x90, 0x93, 0x4D, 0xF0, 0x11, 0xBE, 0x7F, 0xF3, 0x7E, -0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x4A, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x11, -0xBE, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x4A, 0xE0, 0x90, -0x93, 0x4F, 0xF0, 0x90, 0x93, 0x4B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, -0x90, 0x93, 0x53, 0xF0, 0x90, 0x93, 0x4F, 0xE0, 0x90, 0x93, 0x54, 0xF0, 0x01, 0x13, 0x7B, 0x01, -0x7A, 0x93, 0x79, 0x4A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF6, 0xE0, -0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, -0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, -0x44, 0x02, 0xF0, 0x80, 0x28, 0xC0, 0x01, 0x90, 0x8D, 0xF7, 0xE0, 0x71, 0xCD, 0xA8, 0x01, 0xFC, -0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8D, 0xF7, 0x71, 0x7E, -0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF7, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x66, 0xE0, 0xFF, 0x12, 0x9F, -0x9E, 0xEF, 0x70, 0x02, 0x21, 0xDB, 0x90, 0x94, 0x67, 0xE0, 0xFB, 0xD3, 0x94, 0x00, 0x40, 0x1A, -0x90, 0x94, 0x99, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0F, 0xAF, 0x03, 0xE4, 0xFC, 0xFD, 0xFE, -0x12, 0x5F, 0xA9, 0x7F, 0x08, 0x7E, 0x0E, 0x12, 0x5E, 0xCE, 0x90, 0x94, 0x66, 0xE0, 0xFF, 0x90, -0x06, 0x33, 0xF0, 0x71, 0xA5, 0xE4, 0xFB, 0xFD, 0x51, 0x4A, 0x90, 0x94, 0x69, 0xE0, 0x60, 0x07, -0x90, 0x8D, 0xFC, 0xE0, 0xFF, 0x51, 0x20, 0x71, 0x85, 0x30, 0xE0, 0x39, 0x90, 0x90, 0xCB, 0xE0, -0x60, 0x33, 0xE4, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x90, 0xCB, 0xE0, 0xFF, 0x90, 0x93, 0x48, 0xE0, -0xC3, 0x9F, 0x50, 0x21, 0x7F, 0x03, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x90, 0x93, 0x48, 0xE0, 0x24, -0x0A, 0x71, 0x8D, 0xE0, 0xFF, 0x51, 0x20, 0x90, 0x01, 0xA6, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x48, -0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x90, 0x94, 0x68, 0xE0, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x94, 0x53, -0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x12, 0x9F, 0x6D, 0x90, 0x93, 0x47, 0x12, 0x5D, 0x80, 0x90, 0x94, -0xE5, 0x12, 0x08, 0x6D, 0x71, 0x95, 0x12, 0x50, 0x4C, 0x80, 0x40, 0xE4, 0x90, 0x94, 0x53, 0xF0, -0x90, 0x94, 0x6F, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x5F, 0x3A, 0xE4, 0xFF, -0x12, 0x73, 0x2E, 0xBF, 0x01, 0x0C, 0x90, 0x94, 0x6B, 0xE0, 0xFD, 0x7F, 0x02, 0x12, 0x4E, 0xB5, -0x71, 0xAE, 0x90, 0x93, 0x49, 0x74, 0x07, 0xF0, 0x90, 0x93, 0x57, 0xF0, 0x7B, 0x01, 0x7A, 0x93, -0x79, 0x49, 0x11, 0xC5, 0x7F, 0x04, 0x12, 0x7F, 0xF8, 0x71, 0x49, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x58, 0xEF, 0xF0, 0x12, 0x8F, 0x6B, 0xBF, -0x01, 0x13, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x93, 0x58, 0x12, 0x64, 0x32, 0x90, -0x93, 0x59, 0x12, 0x57, 0xFC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0x95, 0x05, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x33, 0xEB, 0xB4, 0x01, 0x07, 0xE0, -0x24, 0x02, 0xF5, 0x5A, 0x80, 0x08, 0x90, 0x95, 0x05, 0xE0, 0x24, 0xFE, 0xF5, 0x5A, 0x90, 0x94, -0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x5A, 0x71, 0x34, 0xE4, 0xFF, 0x51, 0xBE, -0x90, 0x94, 0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x5A, 0x80, 0x25, 0x90, 0x94, -0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, 0x05, 0x12, 0x5D, 0x80, 0x71, 0x38, -0xE4, 0xFF, 0x51, 0xBE, 0x90, 0x94, 0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, -0x05, 0xE0, 0xFF, 0x71, 0x34, 0x7F, 0x01, 0x51, 0xBE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x85, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x94, 0x84, -0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0x94, 0x8F, 0x12, 0x08, 0x6D, 0x90, -0x94, 0x87, 0x12, 0x43, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0x94, 0x8F, 0x71, 0x43, 0xC0, 0x04, 0xC0, -0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0x87, 0x12, 0x43, 0xE5, 0x90, 0x94, 0x8B, 0x71, 0x43, -0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0xC7, 0x90, 0x94, 0x93, 0x12, 0x08, -0x6D, 0x90, 0x94, 0x85, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x94, 0x93, 0x12, 0x43, 0xE5, 0x90, -0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0x94, 0x84, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0x8B, 0x12, 0x08, 0x6D, 0x7D, 0x18, -0x7C, 0x00, 0x22, 0x12, 0x43, 0xF1, 0x02, 0x43, 0xBA, 0x90, 0x8D, 0xFB, 0x12, 0x77, 0x4B, 0x30, -0xE0, 0x23, 0x71, 0xC2, 0x60, 0x0B, 0x71, 0xB8, 0x40, 0x07, 0x71, 0x76, 0x90, 0x90, 0xD6, 0x80, -0x05, 0x71, 0x76, 0x90, 0x90, 0xCE, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x9D, 0x90, 0x94, 0xE5, 0x12, -0x08, 0x6D, 0x12, 0x50, 0x45, 0x22, 0xE4, 0x7F, 0xE8, 0x7E, 0x03, 0xFD, 0xFC, 0x22, 0xE0, 0x04, -0xF0, 0xE0, 0x7F, 0x00, 0x22, 0x90, 0x8E, 0xC4, 0xE0, 0xC4, 0x54, 0x0F, 0x22, 0xF5, 0x82, 0xE4, -0x34, 0x91, 0xF5, 0x83, 0x22, 0xE4, 0x90, 0x94, 0xE9, 0xF0, 0x7F, 0x04, 0x22, 0xF0, 0xA3, 0xED, -0xF0, 0xA3, 0xEB, 0xF0, 0x22, 0x90, 0x94, 0x5E, 0xE0, 0x90, 0x95, 0x08, 0xF0, 0x22, 0x12, 0x4F, -0xE9, 0x7D, 0x04, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0x90, 0x93, 0x12, 0x12, 0x43, 0xF1, 0xD3, 0x02, -0x43, 0xD4, 0x90, 0x90, 0xD2, 0x12, 0x43, 0xE5, 0xEC, 0x4D, 0x4E, 0x4F, 0x22, 0x75, 0xF0, 0x0F, -0xA4, 0x24, 0x60, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0xE4, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, 0xFE, 0x90, 0x8D, 0xF6, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, -0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x3F, 0xED, 0x71, 0xCD, 0xFA, 0x7B, 0x01, -0x91, 0x3E, 0x7F, 0x01, 0xEF, 0x60, 0x32, 0x90, 0x8D, 0xF6, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, -0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF6, 0xF0, 0x90, 0x8D, 0xF7, -0xE0, 0xFF, 0x90, 0x8D, 0xF6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, +0xAF, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0x96, 0x91, 0xE5, 0x19, 0x30, 0xE3, 0x02, 0x51, 0x89, +0xE5, 0x19, 0x30, 0xE4, 0x02, 0x31, 0x50, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x96, 0xEE, 0xE5, +0x1B, 0x30, 0xE0, 0x03, 0x12, 0x57, 0xF9, 0xE5, 0x1B, 0x30, 0xE1, 0x02, 0xB1, 0x9A, 0xE5, 0x1B, +0x30, 0xE2, 0x02, 0x51, 0x95, 0xE5, 0x1B, 0x30, 0xE3, 0x02, 0x51, 0xA6, 0xE5, 0x1B, 0x30, 0xE4, +0x02, 0x51, 0xBE, 0xE5, 0x1B, 0x30, 0xE5, 0x03, 0x12, 0x97, 0x2A, 0xE5, 0x1B, 0x30, 0xE6, 0x02, +0xF1, 0x84, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0x97, 0xC2, 0x74, 0xAF, 0x04, 0x90, 0x01, 0xC4, +0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, +0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, +0x31, 0x63, 0x7F, 0x02, 0x8F, 0x26, 0x7F, 0x02, 0x12, 0x48, 0x20, 0x90, 0x8D, 0x01, 0xE0, 0x45, +0x26, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x95, 0x46, 0xF0, 0x90, 0x95, 0x46, +0xE0, 0xFD, 0x70, 0x02, 0x41, 0x5E, 0x90, 0x8D, 0x8F, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, +0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0x90, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, +0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x95, +0x42, 0x12, 0x8B, 0x36, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, +0x70, 0x02, 0x41, 0x40, 0xE4, 0x90, 0x95, 0x47, 0xF0, 0x90, 0x95, 0x47, 0xE0, 0xF9, 0xC3, 0x94, +0x04, 0x50, 0x31, 0x51, 0x5F, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, +0xFE, 0x74, 0xD0, 0x51, 0x77, 0x90, 0x8D, 0x3F, 0x51, 0x67, 0x51, 0x5F, 0xA4, 0x2D, 0xFF, 0xEC, +0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x51, 0x77, 0x90, 0x8D, 0x43, 0x51, 0x67, 0x90, 0x95, 0x47, 0xE0, +0x04, 0xF0, 0x80, 0xC5, 0x90, 0x95, 0x46, 0xE0, 0xFF, 0x90, 0x95, 0x42, 0x12, 0x4B, 0x23, 0x80, +0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x95, 0x46, 0xF0, 0x90, 0x95, 0x42, 0xE0, 0xFF, +0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, +0x95, 0x42, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x8D, 0x90, 0x12, 0x81, 0x0E, 0xB4, +0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x21, 0x6D, 0xE4, 0x90, 0x8D, 0x90, 0xF0, 0x21, 0x6D, +0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x95, 0x42, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, +0xF0, 0x51, 0x5F, 0x90, 0x01, 0xD0, 0x12, 0x44, 0x0B, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0x90, +0x95, 0x42, 0xE0, 0x75, 0xF0, 0x04, 0x22, 0x12, 0x44, 0x0B, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, +0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, +0xFF, 0x90, 0x8D, 0x90, 0xE0, 0x75, 0xF0, 0x08, 0x22, 0x90, 0x8E, 0xAF, 0xE0, 0x30, 0xE0, 0x04, +0x7F, 0x10, 0x31, 0x54, 0x22, 0x90, 0x93, 0x4B, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x4A, 0xE0, 0x64, +0x02, 0x60, 0x02, 0x71, 0x02, 0x22, 0x51, 0xB6, 0x70, 0x0B, 0x90, 0x8E, 0x47, 0xE0, 0x60, 0x05, +0xB1, 0x0E, 0x12, 0x50, 0x0B, 0x22, 0xE4, 0xFF, 0x51, 0xD9, 0xEF, 0x64, 0x01, 0x22, 0x51, 0xB6, +0x70, 0x16, 0x90, 0x8E, 0x47, 0xE0, 0x60, 0x10, 0xB1, 0x0E, 0xF0, 0x90, 0x8E, 0x42, 0xE0, 0xD1, +0xEE, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x58, 0x22, 0x12, 0x8A, 0x4B, 0xFE, 0xEF, 0x54, 0x07, +0xFF, 0x12, 0x89, 0xE6, 0xE0, 0xFD, 0x7C, 0x00, 0x12, 0x8B, 0x38, 0x80, 0x05, 0xC3, 0x33, 0xCE, +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x7F, 0x00, 0x60, 0x02, 0x7F, +0x01, 0x22, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, +0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x9C, 0xAD, 0x51, 0xB6, 0x60, 0x02, 0x61, 0xC6, +0x90, 0x8E, 0x47, 0xE0, 0x70, 0x02, 0x61, 0xC6, 0xD1, 0xE5, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, +0xAB, 0xE0, 0x90, 0x8E, 0x4E, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x8E, 0x4D, 0xF0, 0xA3, 0xE0, +0xFF, 0x70, 0x08, 0x90, 0x8E, 0x4D, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x8E, 0x4E, 0xEF, 0xF0, +0x12, 0x99, 0x36, 0xE4, 0x90, 0x8E, 0x50, 0xF0, 0x12, 0x9B, 0x48, 0xB1, 0x0E, 0xD1, 0xF0, 0x54, +0xEF, 0xF0, 0xD1, 0xE5, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x97, 0x64, 0xD1, 0x8E, 0x30, +0xE0, 0x51, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x23, 0xD1, 0xDD, 0x6F, 0x70, 0x43, +0x90, 0x8E, 0x43, 0xE0, 0x44, 0x40, 0xF0, 0x12, 0xA2, 0x26, 0x71, 0xC7, 0xB1, 0x04, 0x91, 0x63, +0x7D, 0x02, 0x7F, 0x02, 0x91, 0x67, 0x90, 0x8E, 0x4E, 0xE0, 0x14, 0xF0, 0x80, 0x25, 0x12, 0xA6, +0xCC, 0x64, 0x01, 0x70, 0x1E, 0xD1, 0xDD, 0xFE, 0x6F, 0x60, 0x18, 0x90, 0x05, 0x73, 0xE0, 0xFF, +0xEE, 0x6F, 0x60, 0x0F, 0x12, 0x9E, 0xCD, 0x30, 0xE0, 0x09, 0xEF, 0x54, 0xBF, 0x71, 0xC7, 0x91, +0x8C, 0x91, 0x74, 0x12, 0xA6, 0xC4, 0x22, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, +0x03, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x5A, 0xEF, 0xF0, 0x90, 0x8E, +0x2C, 0xD1, 0x91, 0x30, 0xE0, 0x39, 0x12, 0xA6, 0x20, 0x60, 0x10, 0x12, 0xA6, 0x16, 0x40, 0x0B, +0xE4, 0x7F, 0x0A, 0xFE, 0xFD, 0xFC, 0x90, 0x90, 0xEE, 0x80, 0x09, 0xE4, 0x7F, 0x0A, 0xFE, 0xFD, +0xFC, 0x90, 0x90, 0xE6, 0x12, 0x43, 0xFF, 0x12, 0x42, 0xAB, 0xC0, 0x07, 0x90, 0x8E, 0xAD, 0xE0, +0xFB, 0xE4, 0xFA, 0xF9, 0xF8, 0xD0, 0x07, 0x12, 0x43, 0x36, 0x90, 0x8E, 0xAE, 0xEF, 0xF0, 0x90, +0x95, 0x5A, 0xE0, 0x64, 0x01, 0x70, 0x18, 0xD1, 0xD5, 0x60, 0x09, 0x71, 0xCB, 0xB1, 0x04, 0x12, +0xA6, 0x70, 0x80, 0x06, 0x71, 0xCB, 0x91, 0x8C, 0x91, 0x5D, 0x12, 0x5F, 0xD3, 0x80, 0x19, 0xD1, +0xD5, 0x60, 0x06, 0x71, 0xCB, 0xB1, 0x04, 0x80, 0x04, 0x71, 0xCB, 0x91, 0x8C, 0x91, 0x7A, 0x7D, +0x01, 0x7F, 0x02, 0x91, 0x7E, 0x12, 0xA2, 0x5B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x02, 0x7F, +0x02, 0x91, 0x67, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x12, 0xA6, 0xF4, 0xFE, 0xF6, 0x74, 0x30, +0xB1, 0x1D, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x91, 0x7E, 0x7D, 0x02, 0x7F, 0x02, 0x74, 0x15, +0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0xB1, 0x1D, 0xF0, 0x22, 0x74, 0x1D, 0x12, 0xA6, +0xF4, 0xB1, 0x19, 0xF0, 0x22, 0xEF, 0x70, 0x32, 0x7D, 0x78, 0x7F, 0x02, 0x91, 0x67, 0x7D, 0x02, +0x7F, 0x03, 0x91, 0x67, 0x7D, 0xC8, 0x7F, 0x02, 0x91, 0x8C, 0xB1, 0x0E, 0xF0, 0xE4, 0xFF, 0x51, +0xD9, 0xEF, 0x70, 0x0A, 0xD1, 0xF9, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, +0x7F, 0x0C, 0x12, 0x58, 0x65, 0xD1, 0xFE, 0x02, 0x8F, 0xA9, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, +0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x91, 0x7E, 0x7D, 0x02, 0x7F, 0x03, 0x91, 0x7E, 0x90, +0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x9B, 0x48, 0xE4, 0xFF, 0x51, 0xD9, 0xBF, 0x01, 0x10, +0xB1, 0x92, 0x90, 0x8E, 0x4A, 0xE0, 0x20, 0xE2, 0x0A, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x58, 0x65, +0x12, 0xA6, 0xC4, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xB1, 0x19, 0xF0, 0x22, 0x90, 0x01, +0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x22, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0x22, 0xD1, 0x8E, 0x30, 0xE0, 0x0F, 0xEF, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x06, 0x7D, 0x02, 0x7F, 0x02, 0x91, 0x67, 0x90, 0x8E, 0x42, 0x12, 0x9E, +0xD0, 0x30, 0xE0, 0x09, 0xEF, 0xD1, 0xEE, 0x54, 0x07, 0x70, 0x46, 0x80, 0x41, 0x90, 0x8E, 0x50, +0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x4B, 0xE0, 0x54, 0xEF, 0xF0, 0x12, 0x9B, 0x52, 0x40, 0x2F, 0x51, +0xB6, 0x70, 0x2E, 0x12, 0x7F, 0xDE, 0x70, 0x05, 0x12, 0x98, 0xF3, 0x80, 0x25, 0x12, 0x98, 0xF3, +0x90, 0x8E, 0x51, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, 0x40, 0x09, 0xB1, 0x92, 0xE4, 0x90, +0x8E, 0x51, 0xF0, 0x80, 0x03, 0x12, 0x5F, 0x7E, 0xE4, 0x90, 0x8E, 0x50, 0xF0, 0x22, 0x12, 0x58, +0x58, 0x22, 0x90, 0x8E, 0x43, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x8E, 0x47, 0xE0, 0x70, 0x02, +0xC1, 0x29, 0x90, 0x8E, 0x5E, 0xE0, 0x04, 0x12, 0x51, 0x0C, 0x12, 0x43, 0xD5, 0xC0, 0x04, 0xC0, +0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x12, 0x51, 0x26, 0x78, 0x10, 0x12, 0x08, 0x5A, +0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0xA3, 0x12, 0x51, 0x26, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0xD5, 0x90, 0x8E, 0x92, 0x12, 0xA2, 0x3C, 0x54, 0x7F, 0xF0, +0xA3, 0xE0, 0x30, 0xE0, 0x0F, 0x12, 0x9B, 0x03, 0x90, 0x95, 0x31, 0x74, 0x05, 0xF0, 0x12, 0x98, +0x23, 0x12, 0x9B, 0x40, 0xD1, 0x8E, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x02, +0x91, 0x5D, 0x90, 0x95, 0x53, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, +0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x8A, 0x52, 0xD1, 0x99, 0xE4, 0x90, +0x93, 0x44, 0xF0, 0xF1, 0x73, 0x12, 0xA5, 0xE9, 0x30, 0xE0, 0x52, 0x90, 0x90, 0x8C, 0xE0, 0xFE, +0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x7D, 0x64, 0x12, 0x07, 0x15, 0x90, 0x90, 0xE0, 0xE0, 0x6E, 0x70, +0x03, 0xA3, 0xE0, 0x6F, 0x60, 0x0A, 0x90, 0x90, 0xE0, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, +0x90, 0x90, 0x90, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x9E, 0xE0, 0xB5, 0x06, 0x14, 0xA3, +0xE0, 0xB5, 0x07, 0x0F, 0xEF, 0x4E, 0x60, 0x0B, 0x90, 0x01, 0xC7, 0x74, 0x31, 0xF0, 0x7F, 0x01, +0x02, 0x67, 0xAD, 0x12, 0x9B, 0xD7, 0xE4, 0x90, 0x90, 0xE0, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x8E, +0x43, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x90, 0x93, 0x41, 0xE0, 0x30, 0xE0, 0x34, +0x51, 0xB6, 0x70, 0x30, 0x90, 0x95, 0x56, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x93, +0x43, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x95, 0x56, 0xF0, 0x90, 0x93, 0x43, 0xE0, 0xFF, 0x90, 0x93, +0x42, 0xE0, 0xD3, 0x9F, 0x50, 0x0E, 0x90, 0x93, 0x44, 0xE0, 0x70, 0x08, 0xE4, 0x90, 0x93, 0x43, +0xF0, 0x12, 0x9E, 0xB5, 0x22, 0x90, 0x8E, 0xAD, 0xE0, 0x90, 0x01, 0x3F, 0x22, 0x90, 0x8E, 0x4D, +0xE0, 0xFF, 0xA3, 0xE0, 0x22, 0x90, 0x8E, 0x45, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0x54, 0xFB, +0xF0, 0x90, 0x8E, 0x4B, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x12, 0x4E, 0x02, 0xF1, 0x66, 0x90, 0x8E, +0x42, 0xE0, 0x54, 0xF7, 0xF0, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x7A, 0x98, 0xFF, +0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x79, 0xA1, 0xF5, 0x56, +0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x25, 0xAB, 0x51, +0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFD, 0xAF, 0x54, 0x12, 0x89, 0xA6, 0xAF, +0x54, 0x51, 0xD9, 0xEF, 0xAF, 0x54, 0x70, 0x05, 0x12, 0x8A, 0xDB, 0x80, 0x02, 0xF1, 0xC0, 0x05, +0x54, 0x80, 0xD4, 0xE5, 0x55, 0x70, 0x0E, 0xFF, 0x51, 0xD9, 0xEF, 0x70, 0x08, 0xD1, 0xF9, 0x54, +0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x12, 0x8F, 0xA1, 0x12, 0x8F, 0x77, 0x7D, 0x0C, 0x7F, 0x01, +0x02, 0x5F, 0x02, 0x90, 0x8E, 0xAB, 0xE0, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, +0x02, 0x91, 0x5D, 0x22, 0xE4, 0xFF, 0x51, 0xD9, 0xBF, 0x01, 0x10, 0x90, 0x8E, 0x47, 0xE0, 0x60, +0x0A, 0x12, 0x97, 0xBA, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x58, 0x22, 0x90, 0x8E, 0x42, 0xE0, +0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x50, 0xF0, 0xA3, 0xF0, 0x90, 0x8E, 0x4B, 0xF0, 0x90, 0x8E, +0x43, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x91, 0x74, 0x7D, 0x10, 0x7F, 0x03, 0x81, 0x8C, +0xE4, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x44, 0xEF, 0xF0, 0xA3, 0xED, +0xF0, 0x7D, 0x44, 0x7F, 0x6F, 0x12, 0x5A, 0x57, 0x12, 0x5D, 0x30, 0x90, 0x95, 0x45, 0xE0, 0x90, +0x95, 0x44, 0xB4, 0x01, 0x08, 0x12, 0xA5, 0xFF, 0x44, 0x04, 0xF0, 0x80, 0x06, 0x12, 0xA5, 0xFF, +0x54, 0xFB, 0xF0, 0x12, 0x8F, 0x77, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, +0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, +0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xFB, 0xF0, 0x74, 0x6F, +0xA3, 0xF0, 0x12, 0x96, 0xBE, 0xE5, 0x21, 0x30, 0xE0, 0x02, 0xF1, 0xE9, 0xE5, 0x21, 0x30, 0xE1, +0x03, 0x12, 0x97, 0xCC, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0x97, 0xD6, 0xE5, 0x22, 0x30, 0xE0, +0x03, 0x12, 0x97, 0xED, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, 0x69, 0x54, 0xE5, 0x24, +0x30, 0xE4, 0x02, 0x11, 0x8B, 0xE5, 0x24, 0x30, 0xE5, 0x03, 0x12, 0x8B, 0x57, 0xE5, 0x24, 0x30, +0xE6, 0x03, 0x12, 0x8B, 0x78, 0x74, 0xFB, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, +0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, +0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x12, 0xA1, 0xAC, 0x12, 0x6C, +0x7A, 0x90, 0x8E, 0xAB, 0xE0, 0x30, 0xE0, 0x32, 0x12, 0xA6, 0x70, 0x90, 0x8E, 0xAE, 0xE0, 0x60, +0x05, 0x14, 0xF0, 0x02, 0x5F, 0xD3, 0x12, 0xA6, 0x4B, 0xE4, 0xFF, 0x12, 0x6B, 0xD2, 0x90, 0x8E, +0x2C, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0C, 0x90, 0x95, +0x01, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x11, 0xCB, 0x22, 0xE4, 0x90, 0x95, 0x05, 0xF0, +0x7F, 0x03, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x00, 0xEF, 0xF0, 0xB1, 0x33, +0x90, 0x95, 0x00, 0xE0, 0xFF, 0x31, 0xE1, 0x74, 0x01, 0xF0, 0x90, 0x95, 0x05, 0xE0, 0xFE, 0xEF, +0x31, 0xEF, 0xEE, 0xF0, 0x90, 0x95, 0x00, 0xE0, 0x31, 0x36, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, +0x01, 0x31, 0x2B, 0x78, 0x10, 0x12, 0x08, 0x47, 0xAB, 0x07, 0x31, 0x2B, 0x78, 0x08, 0x12, 0x08, +0x47, 0x90, 0x94, 0xFE, 0xEF, 0xF0, 0x31, 0x2B, 0x90, 0x94, 0xFF, 0xEF, 0xF0, 0x7D, 0x01, 0x7F, +0x50, 0x7E, 0x01, 0x12, 0x50, 0x20, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x01, 0x02, 0x43, +0xF3, 0x90, 0x93, 0x60, 0xE0, 0xFB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x1D, 0xF5, 0x82, 0xE4, 0x34, +0x94, 0xF5, 0x83, 0x22, 0xE4, 0x90, 0x93, 0x60, 0xF0, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0xC3, 0x94, +0x08, 0x40, 0x02, 0x21, 0xD9, 0xEF, 0x31, 0xE1, 0xE0, 0x64, 0x01, 0x70, 0x74, 0x90, 0x93, 0x60, +0xE0, 0x31, 0x36, 0x12, 0x43, 0xF3, 0xE4, 0x7B, 0x01, 0x31, 0xDA, 0x70, 0x3A, 0x90, 0x93, 0x60, +0xE0, 0xFB, 0x31, 0xEF, 0xE0, 0x60, 0x21, 0x14, 0x70, 0x57, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, +0x21, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x43, 0xF3, 0xEB, 0x31, 0x36, 0x12, 0x08, +0x6D, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0x80, 0x0B, 0x31, 0x31, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, +0x00, 0xAF, 0x03, 0x31, 0xFD, 0x80, 0x2A, 0x90, 0x93, 0x60, 0xE0, 0x31, 0x36, 0x12, 0x43, 0xF3, +0xE4, 0xFB, 0x31, 0xDA, 0x50, 0x1B, 0x31, 0x31, 0x12, 0x43, 0xF3, 0xEF, 0x24, 0xFF, 0xFF, 0xEE, +0x34, 0xFF, 0xFE, 0xED, 0x34, 0xFF, 0xFD, 0xEC, 0x34, 0xFF, 0xFC, 0xEB, 0x31, 0x36, 0x12, 0x08, +0x6D, 0x90, 0x93, 0x60, 0xE0, 0x04, 0xF0, 0x21, 0x49, 0x22, 0xFA, 0xF9, 0xF8, 0xC3, 0x02, 0x43, +0xE2, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x75, +0xF0, 0x0A, 0xA4, 0x24, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xEF, 0x24, 0xFC, +0x60, 0x05, 0x04, 0x70, 0x04, 0x80, 0x03, 0x51, 0x82, 0x22, 0xE4, 0x90, 0x93, 0x61, 0xF0, 0x90, +0x94, 0x8B, 0x04, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0x2A, 0x12, 0x43, +0xF3, 0x12, 0xA6, 0xB4, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0x2A, 0x12, 0x08, 0x6D, +0x12, 0xA4, 0xA4, 0xE4, 0x90, 0x94, 0x6F, 0xF0, 0xFF, 0x71, 0x7D, 0x12, 0x6A, 0xB6, 0x70, 0x28, +0x51, 0x7B, 0x7F, 0x05, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x12, 0x5E, 0xF6, 0x90, 0x8E, 0x4A, 0xE0, +0x64, 0x02, 0x60, 0x14, 0x90, 0x93, 0x61, 0xE0, 0x04, 0xF0, 0x12, 0xA6, 0xAD, 0x51, 0x7B, 0x90, +0x93, 0x61, 0xE0, 0xD3, 0x94, 0x0A, 0x40, 0xE4, 0x90, 0x95, 0x01, 0x12, 0x08, 0x79, 0x00, 0x00, +0x00, 0x0A, 0xE4, 0x90, 0x95, 0x05, 0xF0, 0x7F, 0x04, 0x01, 0xD2, 0x7D, 0x01, 0x7F, 0x02, 0x02, +0x58, 0x65, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x82, 0xE0, 0xFF, 0x12, 0xA5, +0x1F, 0xEF, 0x70, 0x02, 0x61, 0x38, 0x90, 0x94, 0x83, 0xE0, 0xFB, 0xD3, 0x94, 0x00, 0x40, 0x1A, +0x90, 0x94, 0xB5, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0F, 0xAF, 0x03, 0xE4, 0xFC, 0xFD, 0xFE, +0x12, 0x57, 0x9C, 0x7F, 0x08, 0x7E, 0x0E, 0x12, 0x54, 0xE0, 0x90, 0x94, 0x82, 0xE0, 0xFF, 0x90, +0x06, 0x33, 0xF0, 0x12, 0xA6, 0x5E, 0xE4, 0xFB, 0xFD, 0x91, 0x24, 0x90, 0x94, 0x85, 0xE0, 0x60, +0x07, 0x90, 0x8E, 0x2D, 0xE0, 0xFF, 0x71, 0xAE, 0x12, 0x8F, 0xB9, 0x30, 0xE0, 0x3A, 0x90, 0x90, +0xE3, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x62, 0xF0, 0x90, 0x90, 0xE3, 0xE0, 0xFF, 0x90, 0x93, +0x62, 0xE0, 0xC3, 0x9F, 0x50, 0x22, 0x7F, 0x03, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x90, 0x93, 0x62, +0xE0, 0x24, 0x22, 0x12, 0xA6, 0xA5, 0xE0, 0xFF, 0x71, 0xAE, 0x90, 0x01, 0xA6, 0xE0, 0x04, 0xF0, +0x90, 0x93, 0x62, 0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x90, 0x94, 0x84, 0xE0, 0x90, 0x93, 0x61, 0xF0, +0x90, 0x94, 0x6F, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x71, 0x7D, 0x90, 0x93, 0x61, 0x12, 0x51, 0x26, +0xB1, 0x27, 0x7F, 0x04, 0x11, 0xD2, 0x80, 0x40, 0xE4, 0x90, 0x94, 0x6F, 0xF0, 0x90, 0x94, 0x8B, +0xF0, 0x90, 0x06, 0x32, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x57, 0x2D, 0xE4, 0xFF, 0x12, 0x6A, 0xD9, +0xBF, 0x01, 0x0C, 0x90, 0x94, 0x87, 0xE0, 0xFD, 0x7F, 0x02, 0x12, 0x5F, 0x02, 0xB1, 0x1D, 0x90, +0x93, 0x63, 0x74, 0x07, 0xF0, 0x90, 0x93, 0x71, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x63, 0x12, +0x80, 0xB1, 0x7F, 0x04, 0xF1, 0xEF, 0x71, 0xE4, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x72, 0xEF, 0xF0, 0x12, 0x82, 0xC1, 0x74, 0x10, 0x2F, 0xFF, +0x90, 0x93, 0x72, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x2F, 0xFF, 0x12, 0x5E, 0xE8, 0x75, 0x43, 0x04, +0x7B, 0x01, 0x7A, 0x94, 0x79, 0x82, 0x12, 0x35, 0x26, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x72, 0xEF, 0xF0, 0x12, 0x9B, 0xA9, 0xBF, 0x01, 0x1F, +0x90, 0x06, 0x32, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x93, 0x72, 0xE0, 0xFF, 0x90, 0x95, 0x29, 0x74, +0x07, 0xF0, 0x7B, 0x18, 0x7D, 0x01, 0x12, 0x5D, 0xDA, 0x90, 0x93, 0x73, 0x12, 0x5F, 0xDE, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8E, 0x2C, 0x12, 0x6E, 0x91, 0x30, 0xE0, 0x2E, 0xEF, 0xC4, 0x54, +0x0F, 0x20, 0xE0, 0x22, 0x12, 0xA6, 0x20, 0x60, 0x0C, 0x12, 0xA6, 0x16, 0x40, 0x07, 0x91, 0x1C, +0x90, 0x90, 0xEE, 0x80, 0x05, 0x91, 0x1C, 0x90, 0x90, 0xE6, 0x12, 0x43, 0xFF, 0x12, 0x42, 0xAB, +0xB1, 0x27, 0x7F, 0x03, 0x01, 0xD2, 0x7F, 0x01, 0x12, 0x6B, 0xD2, 0x22, 0xE4, 0x7F, 0xE8, 0x7E, +0x03, 0xFD, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2A, 0xEF, 0xF0, +0xED, 0x64, 0x01, 0x70, 0x2E, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x27, 0x80, 0x08, +0x90, 0x95, 0x2A, 0xE0, 0x24, 0xFE, 0xF5, 0x27, 0x90, 0x94, 0xA3, 0x12, 0x08, 0x79, 0x00, 0x00, +0x00, 0xFF, 0xAF, 0x27, 0x91, 0x8E, 0xB1, 0x15, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, +0x27, 0x80, 0x20, 0x90, 0x94, 0xA3, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, 0x2A, +0x12, 0x51, 0x26, 0x91, 0x92, 0xB1, 0x15, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, +0x2A, 0xE0, 0xFF, 0x91, 0x8E, 0x7F, 0x01, 0x91, 0x9D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, +0xFD, 0xFE, 0x90, 0x94, 0xA7, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xA1, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x94, 0xA0, 0xEF, +0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0x94, 0xAB, 0x12, 0x08, 0x6D, 0x90, 0x94, +0xA3, 0x12, 0x43, 0xF3, 0x12, 0x08, 0x3A, 0x90, 0x94, 0xAB, 0x12, 0x57, 0xF3, 0xC0, 0x04, 0xC0, +0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0xA3, 0x12, 0x43, 0xF3, 0x90, 0x94, 0xA7, 0x12, 0x57, +0xF3, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0xD5, 0x90, 0x94, 0xAF, 0x12, +0x08, 0x6D, 0x90, 0x94, 0xA1, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x94, 0xAF, 0x12, 0x43, 0xF3, +0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xA0, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0x91, 0x9D, 0x90, 0x94, 0xA3, 0x22, 0x12, 0x8F, 0x77, +0x7D, 0x04, 0x7F, 0x01, 0x02, 0x5F, 0x02, 0x90, 0x95, 0x01, 0x12, 0x08, 0x6D, 0xE4, 0x90, 0x95, +0x05, 0xF0, 0x22, 0x90, 0x01, 0x53, 0xE4, 0xF0, 0xFF, 0xEF, 0x31, 0xE1, 0xE4, 0xF0, 0x0F, 0xEF, +0xB4, 0x08, 0xF6, 0x22, 0x90, 0x8E, 0xAF, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x05, 0xB1, +0x33, 0x12, 0x89, 0x51, 0x22, 0x90, 0x93, 0x64, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0x62, +0x12, 0x90, 0x2F, 0x90, 0x93, 0x88, 0xF0, 0xEF, 0x24, 0x24, 0xFF, 0xE4, 0x3E, 0xFE, 0xC0, 0x06, +0x12, 0xA5, 0x79, 0xD0, 0x06, 0xE4, 0xFB, 0xFA, 0xF1, 0x3E, 0x4E, 0x60, 0x3E, 0xE0, 0x24, 0x01, +0xFF, 0x90, 0x93, 0x89, 0x12, 0x66, 0x15, 0x90, 0x93, 0x67, 0xF1, 0x24, 0x90, 0x93, 0x67, 0xF1, +0x1A, 0xFE, 0xC3, 0x9F, 0x50, 0x25, 0x90, 0x93, 0x8A, 0xE0, 0x24, 0x02, 0xFD, 0x90, 0x93, 0x89, +0xE0, 0x34, 0x00, 0xFC, 0xEE, 0x7E, 0x00, 0x2D, 0x12, 0x63, 0x93, 0x90, 0x93, 0x66, 0xE0, 0x24, +0x68, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0x12, 0x53, 0x85, 0x80, 0xD1, 0xF1, 0x2C, 0xC0, 0x06, 0x12, +0xA5, 0x79, 0xD0, 0x06, 0x7B, 0x03, 0xF1, 0x3B, 0x90, 0x93, 0x63, 0xE0, 0x24, 0x22, 0xF1, 0x32, +0x90, 0x93, 0x89, 0x12, 0xA5, 0xAC, 0xEF, 0x20, 0xE4, 0x02, 0xC1, 0x92, 0x90, 0x93, 0x88, 0xE0, +0x04, 0xF0, 0xF1, 0x2C, 0xC0, 0x06, 0x12, 0xA5, 0x79, 0xD0, 0x06, 0x7B, 0x30, 0xF1, 0x3B, 0x4E, +0x60, 0x46, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0x89, 0x12, 0x66, 0x15, 0xF1, 0x21, 0xF1, 0x17, +0xC3, 0x9F, 0x50, 0x34, 0x90, 0x93, 0x8A, 0xE0, 0x24, 0x0D, 0xFF, 0x90, 0x93, 0x89, 0x12, 0x66, +0x15, 0x90, 0x93, 0x8B, 0xEF, 0xF0, 0xBF, 0x02, 0x09, 0x90, 0x93, 0x88, 0xE0, 0x24, 0x20, 0xF0, +0x80, 0x0E, 0x90, 0x93, 0x8B, 0xE0, 0xB4, 0x04, 0x07, 0x90, 0x93, 0x88, 0xE0, 0x24, 0x40, 0xF0, +0x12, 0xA5, 0xB5, 0x12, 0x53, 0x89, 0x80, 0xC6, 0xF1, 0x2C, 0xC0, 0x06, 0x12, 0xA5, 0x79, 0xD0, +0x06, 0x7B, 0xDD, 0x7A, 0x00, 0x7D, 0x01, 0xF1, 0x3F, 0x4E, 0x60, 0x4B, 0xE0, 0x24, 0x0C, 0xFF, +0x90, 0x93, 0x89, 0x12, 0x66, 0x15, 0xF1, 0x21, 0xF1, 0x17, 0xC3, 0x9F, 0x50, 0x39, 0x90, 0x93, +0x8A, 0xE0, 0x24, 0x11, 0xFF, 0x90, 0x93, 0x89, 0x12, 0x66, 0x15, 0x90, 0x93, 0x8B, 0xEF, 0xF0, +0xBF, 0x02, 0x09, 0x90, 0x93, 0x88, 0xE0, 0x24, 0x02, 0xF0, 0x80, 0x0E, 0x90, 0x93, 0x8B, 0xE0, +0xB4, 0x04, 0x07, 0x90, 0x93, 0x88, 0xE0, 0x24, 0x04, 0xF0, 0x12, 0xA5, 0xB5, 0x12, 0x53, 0x89, +0x80, 0xC6, 0xE4, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x90, 0xE2, 0xE0, 0x90, 0x04, 0xFD, 0xF1, 0x25, +0x90, 0x90, 0xE2, 0xF1, 0x1A, 0xFE, 0xC3, 0x9F, 0x50, 0x6C, 0x12, 0xA6, 0x55, 0xF5, 0x83, 0xE0, +0xFF, 0x90, 0x93, 0x67, 0xE0, 0xFE, 0x6F, 0x70, 0x58, 0x90, 0x04, 0xFC, 0xE0, 0x04, 0xF0, 0x90, +0x93, 0x66, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, +0x88, 0xE0, 0xFD, 0x4F, 0x60, 0x04, 0xED, 0x5F, 0x60, 0x37, 0xEE, 0xFF, 0x7E, 0x00, 0xC0, 0x06, +0xC0, 0x07, 0x90, 0x93, 0x66, 0xE0, 0x75, 0xF0, 0x20, 0xA4, 0x24, 0x2A, 0xF9, 0x74, 0x91, 0x35, +0xF0, 0xFA, 0x7B, 0x01, 0x78, 0x68, 0x7C, 0x93, 0x7D, 0x01, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x45, +0xD5, 0xEF, 0x70, 0x0D, 0x90, 0x01, 0xC7, 0x74, 0x55, 0xF0, 0x7F, 0x01, 0x12, 0x67, 0xAD, 0xB1, +0x44, 0x12, 0x53, 0x89, 0x80, 0x8A, 0x22, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x66, 0xE0, +0x22, 0x90, 0x93, 0x8C, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0x66, 0xF0, 0x22, 0x90, 0x93, 0x63, 0xE0, +0x24, 0x24, 0xFF, 0x90, 0x93, 0x62, 0xE0, 0x34, 0x00, 0xFE, 0x22, 0x7A, 0x00, 0xE4, 0xFD, 0xF1, +0x4A, 0x90, 0x93, 0x89, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x93, 0x8D, 0x12, 0x93, 0x15, +0xA3, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xC3, 0x90, 0x93, 0x93, 0xE0, 0x94, 0x01, 0x90, 0x93, 0x92, +0xE0, 0x94, 0x00, 0x50, 0x02, 0x80, 0x75, 0xE4, 0x90, 0x93, 0x96, 0xF0, 0xA3, 0xF0, 0xF1, 0xE0, +0xE4, 0xFD, 0x12, 0x63, 0x99, 0x90, 0x93, 0x90, 0xE0, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x70, 0x19, +0x90, 0x93, 0x8E, 0xE0, 0x24, 0x02, 0x12, 0x93, 0xE4, 0xFE, 0x90, 0x93, 0x8F, 0xE0, 0xFD, 0x12, +0xA5, 0x6C, 0xBF, 0x01, 0x02, 0x80, 0x49, 0x80, 0x00, 0x90, 0x93, 0x8E, 0xE0, 0x24, 0x01, 0xFF, +0x90, 0x93, 0x8D, 0x12, 0x66, 0x15, 0x7E, 0x00, 0x90, 0x93, 0x94, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0x24, 0x02, 0xFF, 0xEE, 0x33, 0xFE, 0x90, 0x93, 0x8D, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, +0x96, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x92, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, +0x90, 0x93, 0x97, 0xE0, 0x9F, 0x90, 0x93, 0x96, 0xE0, 0x9E, 0x40, 0x92, 0xE4, 0xFE, 0xFF, 0x22, +0x90, 0x93, 0x8D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x7F, 0x80, 0x02, 0x69, 0x54, 0x32, 0x90, +0x95, 0x51, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x48, 0x20, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x90, 0x95, +0x51, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x01, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, +0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x8D, 0x38, 0x51, 0x97, 0x25, 0x51, 0x90, 0x8D, 0x39, 0x31, +0xA0, 0x25, 0x51, 0x90, 0x8D, 0x3A, 0x71, 0xEF, 0x25, 0x51, 0x90, 0x8D, 0x3B, 0x91, 0x6A, 0x25, +0x51, 0x90, 0x8D, 0x3C, 0xD1, 0x59, 0x25, 0x51, 0x90, 0x8D, 0x3D, 0xD1, 0x52, 0x25, 0x51, 0x90, +0x8D, 0x3E, 0xF0, 0x22, 0x90, 0x93, 0x61, 0x12, 0x44, 0x20, 0x90, 0x93, 0x60, 0xEF, 0xF0, 0x12, +0x44, 0x29, 0x78, 0x8F, 0x00, 0x78, 0x93, 0x01, 0x78, 0x98, 0x02, 0x78, 0x9C, 0x03, 0x78, 0xA0, +0x04, 0x78, 0xA4, 0x12, 0x78, 0xA8, 0x14, 0x78, 0xAD, 0x20, 0x78, 0xB1, 0x21, 0x78, 0xB5, 0x23, +0x78, 0xBA, 0x25, 0x78, 0xBF, 0x27, 0x78, 0xC7, 0x80, 0x78, 0xC3, 0x81, 0x78, 0xCB, 0x82, 0x78, +0xCF, 0x83, 0x78, 0xD3, 0x84, 0x78, 0xDB, 0x86, 0x78, 0xD7, 0x88, 0x00, 0x00, 0x78, 0xDF, 0x11, +0xEF, 0x01, 0x0A, 0x11, 0xEF, 0x02, 0x6F, 0x06, 0x11, 0xEF, 0xE1, 0x3E, 0x11, 0xEF, 0xC1, 0x6B, +0x11, 0xEF, 0x61, 0xB3, 0x11, 0xEF, 0xE1, 0xEC, 0x11, 0xEF, 0x02, 0x87, 0xFE, 0x11, 0xEF, 0x81, +0x71, 0x11, 0xEF, 0x61, 0x46, 0x11, 0xEF, 0x02, 0x88, 0x0D, 0x11, 0xEF, 0x02, 0x88, 0x15, 0x11, +0xEF, 0x61, 0x7E, 0x11, 0xEF, 0x80, 0x2E, 0x11, 0xEF, 0x21, 0xBC, 0x11, 0xEF, 0xE1, 0xC9, 0x11, +0xEF, 0x61, 0xF6, 0x11, 0xEF, 0x81, 0x30, 0x11, 0xEF, 0xE1, 0x1F, 0x11, 0xEF, 0x41, 0x9E, 0x90, +0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0x60, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x90, +0x93, 0x61, 0x02, 0x44, 0x17, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x71, 0xAB, 0x90, 0x8E, +0xAF, 0x31, 0xA7, 0xF1, 0x90, 0xFF, 0x90, 0x8E, 0xAF, 0xF1, 0x09, 0x31, 0xB5, 0xF1, 0x80, 0xFF, +0x90, 0x8E, 0xAF, 0x71, 0x3C, 0x31, 0xB5, 0xF1, 0x88, 0xFF, 0x90, 0x8E, 0xAF, 0xF1, 0x98, 0x4E, +0x31, 0xA0, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8E, 0xB1, 0xE0, 0x54, 0xFE, 0x51, 0x96, 0xFE, 0x54, +0x01, 0xFD, 0x90, 0x8E, 0xB0, 0xE0, 0x54, 0xFE, 0x4D, 0xFD, 0xF0, 0xEE, 0x54, 0x04, 0xFE, 0xED, +0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xA3, 0xE0, 0x54, 0xEF, 0x4F, 0xFF, 0x31, 0xA0, +0x71, 0x3E, 0x90, 0x8E, 0xB1, 0x12, 0x81, 0xEC, 0x12, 0x8F, 0xB1, 0x90, 0x8E, 0xAF, 0xE0, 0xC3, +0x13, 0x54, 0x01, 0xFF, 0x12, 0x9F, 0xAD, 0xD1, 0xF3, 0x54, 0x01, 0xFF, 0x12, 0x9F, 0xB9, 0xD1, +0xF3, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x9F, 0xC5, 0x90, 0x8E, 0xAF, 0xE0, 0xC4, 0x54, 0x01, 0xFF, +0x12, 0xA0, 0x13, 0x90, 0x8E, 0xAF, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x87, 0x98, +0x90, 0x8E, 0xAF, 0xE0, 0x54, 0x01, 0xFF, 0x12, 0x8B, 0xF7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x4F, +0xF0, 0x90, 0x00, 0x02, 0x02, 0x06, 0xA2, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, +0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0xD1, 0xED, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x05, 0x12, 0x8C, 0xAD, 0x41, 0x91, +0x71, 0xA5, 0x90, 0x8E, 0xB2, 0x31, 0xA7, 0xF1, 0x90, 0xFF, 0x90, 0x8E, 0xB2, 0xF1, 0x09, 0x31, +0xB5, 0xF1, 0x80, 0xFF, 0x90, 0x8E, 0xB2, 0x71, 0x3C, 0x31, 0xB5, 0xF1, 0x88, 0xFF, 0x90, 0x8E, +0xB2, 0xF1, 0x98, 0x51, 0x96, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0xB3, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, +0x12, 0x06, 0x89, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, +0xF0, 0x90, 0x93, 0x64, 0x12, 0x44, 0x17, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, +0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x8D, 0x07, 0xE0, 0xB4, 0x02, 0x05, +0xF1, 0xA1, 0x20, 0xE0, 0x3F, 0x51, 0x98, 0x54, 0x7F, 0xFF, 0x90, 0x8E, 0xB3, 0xE0, 0x54, 0x80, +0x31, 0x9F, 0x90, 0x8E, 0xB4, 0x71, 0xEF, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8E, 0xB5, 0xD1, 0xFA, +0xEF, 0x54, 0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0x91, 0x6A, 0x54, 0x04, 0xFF, 0x90, 0x8E, 0xB6, +0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0x12, 0x4D, 0x0E, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, +0x01, 0x12, 0x4A, 0x79, 0x90, 0x8D, 0x07, 0xE0, 0xB4, 0x01, 0x16, 0x90, 0xFE, 0x10, 0xE0, 0x44, +0x04, 0xF0, 0x90, 0x90, 0x8A, 0x74, 0x05, 0xF0, 0xF1, 0xC0, 0x7A, 0x8F, 0x79, 0xC9, 0x12, 0x08, +0xAA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x4E, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x06, 0xA2, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x71, 0xAB, 0x90, 0x8E, 0x2C, 0x31, +0xA7, 0x54, 0x04, 0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8E, 0x2C, 0xF1, 0x09, 0xFF, 0xF0, +0x12, 0x06, 0x89, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0x90, 0x8E, 0x2C, 0x51, 0x97, 0xFF, +0xED, 0x2F, 0x90, 0x8E, 0x2D, 0x31, 0xA0, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8E, 0x2E, 0xF0, +0x90, 0x8E, 0x2C, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0A, +0x90, 0x06, 0x31, 0xE0, 0x44, 0x40, 0xF0, 0x12, 0xA4, 0x05, 0x90, 0x8E, 0x2C, 0xE0, 0xFF, 0x30, +0xE0, 0x35, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0x12, +0xA5, 0x16, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x09, 0x12, 0x8F, 0xD1, 0x90, 0x94, 0x8A, +0x74, 0x01, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x6C, 0x7E, 0x90, 0x95, 0x01, 0x12, 0x08, 0x79, +0x00, 0x00, 0x27, 0x10, 0x12, 0x70, 0xCB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0xEE, 0x54, 0x20, +0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x22, 0x31, 0xA1, 0xFF, 0x30, 0xE0, 0x1C, 0x12, 0x06, 0x89, 0x90, +0x8E, 0xA4, 0x51, 0x97, 0x90, 0x8E, 0xA5, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, +0x4F, 0x71, 0xEF, 0x90, 0x8E, 0xA7, 0xF0, 0x22, 0x90, 0x8E, 0xA4, 0x74, 0x03, 0xF0, 0xA3, 0x74, +0x0F, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x07, 0xF0, 0x22, 0x71, 0xAB, +0x90, 0x8E, 0xAB, 0xD1, 0xFA, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0x51, 0x97, 0x90, +0x8E, 0xAC, 0x31, 0xA0, 0x90, 0x8E, 0xAD, 0xF0, 0x12, 0xA6, 0x4B, 0x90, 0x8E, 0xAB, 0xE0, 0x54, +0x01, 0xFF, 0x02, 0x6B, 0xD2, 0x90, 0x93, 0x64, 0x12, 0x44, 0x17, 0x12, 0x06, 0x89, 0xFF, 0x54, +0x01, 0xFE, 0x22, 0xD1, 0xED, 0xF1, 0xAC, 0x71, 0xA5, 0xF1, 0x79, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, +0x30, 0xE0, 0x2A, 0x51, 0x98, 0x90, 0x93, 0x46, 0x31, 0xA0, 0x90, 0x93, 0x47, 0xF0, 0x12, 0x06, +0x89, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x45, 0xE0, 0x54, 0xFB, 0x71, 0xEE, 0x90, 0x93, 0x48, +0xF0, 0xEF, 0x54, 0x08, 0xFF, 0x90, 0x93, 0x45, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x22, 0x4E, 0xF0, +0x90, 0x00, 0x03, 0x02, 0x06, 0xA2, 0xF1, 0x31, 0x2E, 0x90, 0x93, 0x30, 0x51, 0x97, 0xFF, 0xED, +0x2F, 0x90, 0x93, 0x31, 0x31, 0xA0, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x32, 0x71, 0xEF, 0xFF, 0xED, +0x2F, 0x90, 0x93, 0x33, 0x91, 0x6A, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x34, 0xD1, 0x59, 0xFF, 0xED, +0x2F, 0x90, 0x93, 0x35, 0xD1, 0x52, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x36, 0xF0, 0x22, +0xF1, 0x31, 0x2E, 0x90, 0x93, 0x37, 0x51, 0x97, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x38, 0x31, 0xA0, +0xFF, 0xED, 0x2F, 0x90, 0x93, 0x39, 0x71, 0xEF, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x3A, 0x91, 0x6A, +0xFF, 0xED, 0x2F, 0x90, 0x93, 0x3B, 0xD1, 0x59, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x3C, 0xD1, 0x52, +0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x3D, 0xF0, 0x22, 0xF0, 0x90, 0x00, 0x04, 0x02, 0x06, +0xA2, 0xD1, 0xED, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x47, 0xF0, 0xEF, 0xF1, 0xA5, +0xA3, 0x51, 0x97, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x8E, 0x45, 0xE0, 0x54, 0xF0, +0x71, 0xEE, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x8E, 0x42, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, +0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0xF1, 0xDE, 0x31, 0x9F, 0x90, 0x8E, 0x46, 0x91, 0x6A, 0xFD, +0x7F, 0x02, 0x12, 0x5F, 0x02, 0x90, 0x94, 0x8B, 0xE0, 0x60, 0x03, 0x12, 0x5E, 0xF6, 0x90, 0x93, +0x64, 0x12, 0x44, 0x17, 0x90, 0x93, 0x67, 0x12, 0x44, 0x20, 0x12, 0x6F, 0x9C, 0x90, 0x8E, 0x47, +0xE0, 0xFF, 0x12, 0x6C, 0x95, 0x90, 0x8E, 0x47, 0xE0, 0x60, 0x1D, 0x90, 0x93, 0x67, 0x12, 0x44, +0x17, 0x51, 0x98, 0x54, 0x0F, 0xFF, 0x31, 0xA1, 0xFD, 0x12, 0xA0, 0xDA, 0x12, 0x9B, 0x03, 0x90, +0x95, 0x31, 0x74, 0x01, 0xF0, 0x12, 0x98, 0x23, 0x22, 0x90, 0x94, 0xD7, 0x12, 0x44, 0x20, 0x12, +0x06, 0x89, 0x90, 0x94, 0xDC, 0x51, 0x97, 0x90, 0x94, 0xDD, 0x91, 0x6A, 0x90, 0x94, 0xDE, 0xD1, +0x59, 0x90, 0x94, 0xDF, 0xD1, 0x52, 0x90, 0x94, 0xE0, 0xF0, 0x90, 0x00, 0x07, 0x12, 0x06, 0xA2, +0x90, 0x94, 0xE1, 0x71, 0xEF, 0x90, 0x94, 0xE4, 0xF0, 0xED, 0x70, 0x19, 0xFF, 0xD1, 0x60, 0xE0, +0xB4, 0xFF, 0x06, 0xD1, 0x60, 0xE4, 0xF0, 0x80, 0x07, 0xD1, 0x60, 0xE0, 0x04, 0xF0, 0x80, 0x05, +0x0F, 0xEF, 0xB4, 0x06, 0xE8, 0x90, 0x94, 0xDB, 0xE0, 0xFF, 0xB4, 0x04, 0x13, 0xA3, 0xE0, 0xFE, +0xB1, 0xC0, 0xEE, 0xF1, 0x01, 0xFE, 0xB1, 0xC0, 0xF1, 0xE5, 0x90, 0x00, 0x02, 0xE4, 0x80, 0x20, +0xEF, 0xB4, 0x02, 0x1F, 0x90, 0x94, 0xDD, 0xB1, 0xBE, 0xEF, 0xF1, 0x01, 0x44, 0x20, 0x54, 0x7F, +0xB1, 0xBF, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06, 0xE1, 0x90, 0x94, 0xDC, 0xE0, 0x90, 0x00, 0x02, +0x12, 0x06, 0xE1, 0xB1, 0xC0, 0xE9, 0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0x44, +0x20, 0x12, 0x06, 0xCF, 0x90, 0x94, 0xDE, 0xB1, 0xBE, 0x90, 0x00, 0x04, 0xEF, 0x12, 0x06, 0xE1, +0x90, 0x94, 0xDF, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x94, 0xE0, 0xE0, 0x90, 0x00, +0x06, 0x12, 0x06, 0xE1, 0x90, 0x94, 0xE1, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, 0xE1, 0xE0, 0xFF, +0x90, 0x94, 0xD7, 0x02, 0x44, 0x17, 0x90, 0x95, 0x09, 0xED, 0xF0, 0x90, 0x95, 0x06, 0x12, 0x44, +0x20, 0xE4, 0x90, 0x95, 0x0A, 0xF0, 0xA3, 0xF0, 0x12, 0x06, 0x89, 0xFF, 0x51, 0x98, 0xFD, 0x91, +0x6B, 0xFB, 0x12, 0x9C, 0x8D, 0x90, 0x95, 0x0A, 0xEF, 0xF0, 0x90, 0x95, 0x06, 0x12, 0x44, 0x17, +0x91, 0x6B, 0xFF, 0x12, 0x9C, 0xE8, 0x90, 0x95, 0x0B, 0xEF, 0xF0, 0x90, 0x90, 0x8B, 0xE0, 0x24, +0xFE, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, +0x40, 0xF1, 0x13, 0xD1, 0x8A, 0x80, 0x0C, 0xF1, 0x13, 0x90, 0x90, 0x8B, 0xE0, 0x90, 0x94, 0xDB, +0xF0, 0x91, 0xF9, 0x90, 0x95, 0x0B, 0xE0, 0xFF, 0x90, 0x95, 0x06, 0x12, 0x44, 0x17, 0x90, 0x95, +0x0A, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, 0xF9, 0xEA, 0x94, 0x00, +0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x90, 0x75, 0x42, 0x5A, 0xA3, 0xE0, 0xF5, 0x43, 0x12, 0x35, +0x26, 0x22, 0xF0, 0x90, 0x00, 0x06, 0x02, 0x06, 0xA2, 0xF0, 0x90, 0x00, 0x05, 0x02, 0x06, 0xA2, +0x74, 0xDC, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x71, 0xAB, 0x90, 0x93, 0x41, +0xD1, 0xFA, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0xC3, 0x13, +0x30, 0xE0, 0x06, 0x51, 0x98, 0x90, 0x93, 0x42, 0xF0, 0x22, 0x90, 0x94, 0xF5, 0xED, 0xF0, 0x90, +0x94, 0xF2, 0x12, 0x44, 0x20, 0x71, 0xF0, 0x90, 0x94, 0xF9, 0xF0, 0x90, 0x94, 0xF2, 0x12, 0x5D, +0x0E, 0x75, 0x43, 0x03, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0xF6, 0x12, 0x35, 0x26, 0x90, 0x94, 0xF5, +0xE0, 0x70, 0x2E, 0xFF, 0xD1, 0xE2, 0xE0, 0xB4, 0xFF, 0x06, 0xD1, 0xE2, 0xE4, 0xF0, 0x80, 0x07, +0xD1, 0xE2, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x03, 0xE8, 0x75, 0x40, 0x01, 0x75, +0x41, 0x94, 0x75, 0x42, 0xF6, 0x75, 0x43, 0x03, 0x90, 0x94, 0xF2, 0x12, 0x44, 0x17, 0x12, 0x35, +0x26, 0x22, 0x74, 0xF6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x90, 0x93, 0x64, +0x02, 0x44, 0x20, 0x90, 0x8E, 0xAF, 0xE0, 0x13, 0x13, 0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, +0x22, 0x12, 0x06, 0xCF, 0x90, 0x94, 0xDD, 0xE0, 0x22, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, +0xF7, 0x4E, 0x22, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x5A, 0x90, 0x95, 0x09, 0xE0, 0xFD, 0x22, 0xF1, +0x31, 0x2E, 0x90, 0x93, 0x3E, 0x51, 0x97, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x3F, 0xF0, +0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, +0x8E, 0x41, 0xF0, 0xBF, 0x01, 0x0C, 0x51, 0x98, 0x64, 0x01, 0x60, 0x18, 0x7D, 0x13, 0x7F, 0x6F, +0x80, 0x0F, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x51, 0x98, 0x64, 0x01, 0x60, 0x06, 0xE4, 0xFD, +0xFF, 0x12, 0x5A, 0x57, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x45, 0xE0, 0x54, 0xFE, 0x22, +0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0x22, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x22, +0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0x22, 0xF0, 0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, +0x22, 0x90, 0x8E, 0xB3, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0xF1, 0xC0, 0x7A, 0x93, +0x79, 0x45, 0x12, 0x08, 0xAA, 0x90, 0x93, 0x46, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, +0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, 0x7B, 0x01, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x93, 0x64, +0xF0, 0x12, 0x06, 0x89, 0x90, 0x93, 0x2E, 0x51, 0x97, 0x90, 0x93, 0x2F, 0xF0, 0x22, 0x90, 0x8E, +0x45, 0xE0, 0x54, 0x0F, 0x22, 0x90, 0x00, 0x01, 0xEE, 0x02, 0x06, 0xE1, 0x12, 0x06, 0x89, 0xFF, +0x90, 0x8E, 0x2B, 0xF0, 0xBF, 0x01, 0x08, 0x12, 0x80, 0x00, 0xE4, 0x90, 0x8E, 0x2B, 0xF0, 0x22, +0x11, 0xAA, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0x93, 0x64, 0xE0, +0xA3, 0xF0, 0x11, 0xAA, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, +0x64, 0xE0, 0x90, 0x93, 0x66, 0xF0, 0x11, 0xAA, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, +0x01, 0x08, 0x90, 0x93, 0x64, 0xE0, 0x90, 0x93, 0x67, 0xF0, 0x11, 0xAA, 0x7F, 0xF3, 0x7E, 0x01, +0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x64, 0xE0, 0x90, 0x93, 0x68, 0xF0, 0x11, 0xAA, +0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x64, 0xE0, 0x90, 0x93, +0x69, 0xF0, 0x90, 0x93, 0x65, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, +0x93, 0x6D, 0xF0, 0x90, 0x93, 0x69, 0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x90, 0x93, 0x6F, 0x74, 0x12, +0xF0, 0x90, 0x93, 0x7D, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x71, 0xEF, 0x31, 0x15, 0x90, 0x93, 0x6D, +0xE0, 0x90, 0x93, 0x74, 0xF0, 0x90, 0x93, 0x6E, 0xE0, 0x90, 0x93, 0x75, 0xF0, 0x7B, 0x01, 0x7A, +0x93, 0x79, 0x6F, 0x11, 0xB1, 0x7F, 0x04, 0x02, 0x77, 0xEF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x64, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8E, 0x27, 0xE0, 0xFF, 0x70, 0x06, 0xA3, +0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8E, 0x28, 0xE0, 0xB5, 0x07, 0x04, 0x7F, +0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, +0x28, 0xC0, 0x01, 0x90, 0x8E, 0x28, 0xE0, 0x31, 0x1D, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, +0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8E, 0x28, 0x31, 0x0E, 0xB4, 0x0A, 0x02, 0x7F, +0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8E, 0x28, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0x04, +0xF0, 0xE0, 0x7F, 0x00, 0x22, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x22, 0x75, 0xF0, 0x0F, +0xA4, 0x24, 0x91, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0xE4, 0xFF, 0x90, 0x8E, 0x28, 0xE0, 0xFE, 0x90, 0x8E, 0x27, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, +0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x3F, 0xED, 0x31, 0x1D, 0xFA, 0x7B, 0x01, +0x31, 0x8E, 0x7F, 0x01, 0xEF, 0x60, 0x32, 0x90, 0x8E, 0x27, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, +0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8E, 0x27, 0xF0, 0x90, 0x8E, 0x28, +0xE0, 0xFF, 0x90, 0x8E, 0x27, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x07, 0x90, 0x8D, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x01, 0x12, 0x44, 0x12, 0x7F, 0x96, 0x7E, 0x02, 0x91, -0xAC, 0xEF, 0x60, 0x41, 0x91, 0x9B, 0xFE, 0x12, 0xA1, 0x40, 0x90, 0x95, 0x04, 0xEF, 0xF0, 0xEE, -0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x95, 0x04, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, -0xF0, 0x90, 0x95, 0x01, 0x12, 0x8A, 0x5A, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x91, 0xF1, 0x90, -0x95, 0x04, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x95, 0x01, 0x12, 0x44, 0x09, 0x12, 0x89, 0xEC, 0x90, -0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, -0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xF9, 0x12, 0x91, 0x98, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0xF9, -0x12, 0xA1, 0x17, 0xE0, 0x60, 0x24, 0xC3, 0x90, 0x94, 0xFC, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0xFB, -0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x0C, -0x90, 0x94, 0xFB, 0x12, 0x61, 0x77, 0xF1, 0xDD, 0x80, 0xD3, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xB1, 0x46, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, -0xB1, 0x43, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, -0xF0, 0xF0, 0xD1, 0x18, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, -0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0x12, 0xA1, -0x0E, 0x91, 0xA3, 0x90, 0x93, 0x4A, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x87, 0xE0, 0xF9, 0x90, -0x8E, 0xC4, 0xE0, 0x30, 0xE0, 0x73, 0xEC, 0xC3, 0x99, 0x50, 0x6E, 0x90, 0x93, 0x4A, 0xE0, 0xFA, -0xA3, 0xE0, 0xFB, 0x12, 0xA1, 0x60, 0xAD, 0x07, 0xB1, 0x37, 0x12, 0xA0, 0x35, 0x54, 0x3F, 0x90, -0x93, 0x4C, 0xD1, 0x01, 0xE0, 0x54, 0x03, 0xFB, 0xEF, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0xCF, 0x2B, -0xCF, 0x3A, 0x90, 0x93, 0x4C, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x4C, 0xB1, 0xDA, 0x12, -0xA1, 0x05, 0x90, 0x93, 0x4A, 0xEE, 0x8F, 0xF0, 0x12, 0xA1, 0x90, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, -0x90, 0x93, 0x4B, 0xE0, 0x9F, 0x90, 0x93, 0x4A, 0xE0, 0x9E, 0x40, 0x14, 0x90, 0x8D, 0xF9, 0x12, -0xA0, 0x57, 0xFE, 0xC3, 0x90, 0x93, 0x4B, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x9E, 0xF0, -0x90, 0x93, 0x4A, 0x12, 0x90, 0xA6, 0x0C, 0x80, 0x8D, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, -0x07, 0xEF, 0x5D, 0xC3, 0x60, 0x0A, 0xB1, 0xF4, 0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x03, -0xB1, 0xF4, 0xFF, 0x22, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, -0x22, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, -0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0x22, 0x12, 0x90, 0xEE, 0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x23, 0xF0, 0x74, 0x86, -0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x1E, 0x12, 0x6F, 0x98, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, -0xC7, 0x74, 0x40, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x41, 0xF0, -0x7F, 0x01, 0x02, 0x79, 0x21, 0xB1, 0x4E, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF8, 0x90, 0x06, 0x90, -0xE0, 0x44, 0x02, 0xF0, 0x74, 0x23, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x86, 0xA3, 0xF0, 0x22, -0xEF, 0x60, 0x37, 0x90, 0x93, 0x18, 0xE0, 0xFF, 0x60, 0x03, 0x12, 0x99, 0x0A, 0x90, 0x01, 0xC7, -0xE4, 0x91, 0x9A, 0xF1, 0xE4, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x12, 0x4B, -0x1C, 0x12, 0x9E, 0xE0, 0xD1, 0x23, 0xF1, 0xA6, 0x12, 0x4F, 0xE7, 0x12, 0x8A, 0xD1, 0x90, 0x01, -0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x02, 0x75, 0x25, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x76, -0x27, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x12, 0xA1, 0x48, 0x12, 0x8B, 0x24, 0xF1, 0xD7, -0x12, 0x9E, 0x3E, 0x7A, 0x8E, 0x79, 0xC4, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, -0xF0, 0x12, 0x8B, 0x49, 0x12, 0x4E, 0x87, 0x90, 0x8D, 0x06, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x2A, -0xF1, 0x9F, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x8E, 0xE3, 0xF1, 0x9D, 0x30, 0xE1, 0x02, 0x7E, -0x01, 0x90, 0x8E, 0xE1, 0xF1, 0x9D, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x8E, 0xE2, 0xEE, 0xF0, -0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x4A, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0xF1, -0x96, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8E, 0xE3, 0xF1, 0x94, 0x30, 0xE1, 0x02, 0x7F, 0x01, -0x90, 0x8E, 0xE1, 0xF1, 0x94, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x8D, 0x06, 0xE0, -0x64, 0x03, 0x70, 0x20, 0xF1, 0x8D, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8E, 0xE3, 0xF1, 0x8B, -0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x8E, 0xE1, 0xF1, 0x8B, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90, -0x8E, 0xE2, 0xEF, 0xF0, 0x90, 0x8E, 0xC4, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0x90, 0x90, 0xCA, 0xF0, -0xA3, 0xF0, 0x90, 0x90, 0xD2, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90, 0xD6, 0x12, -0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90, 0xCE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, -0x90, 0x93, 0x12, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x78, -0xE0, 0x7F, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0xEE, 0xF0, 0x90, -0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x22, 0xF1, 0xDC, 0x71, 0x85, 0x30, 0xE0, 0x18, 0x90, 0x8D, 0xFB, -0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x0D, 0x90, 0x94, 0xE5, 0x12, 0x08, 0x79, 0x00, 0x00, -0x00, 0x14, 0x12, 0x50, 0x45, 0x22, 0x90, 0x8E, 0xC4, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x05, 0x12, 0x90, 0x4C, 0xF1, 0x54, 0x22, 0x12, 0x9F, 0xC9, 0x80, 0xEA, 0x22, 0x7F, 0x0A, 0x7E, -0x00, 0x02, 0x3E, 0x50, 0x90, 0x8D, 0xF8, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8E, 0x10, -0xF0, 0xBF, 0x01, 0x0D, 0x12, 0x77, 0xC3, 0x64, 0x01, 0x60, 0x19, 0x7D, 0x13, 0x7F, 0x6F, 0x80, -0x10, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x77, 0xC3, 0x64, 0x01, 0x60, 0x06, 0xE4, 0xFD, -0xFF, 0x12, 0x53, 0xD9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8D, 0xFA, -0xF0, 0xBF, 0x01, 0x08, 0x12, 0x80, 0x41, 0xE4, 0x90, 0x8D, 0xFA, 0xF0, 0x22, 0x12, 0x06, 0x89, -0x54, 0x01, 0xFF, 0x90, 0x93, 0x3A, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, -0x8E, 0x20, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, 0xBF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5F, 0xE0, 0xFF, 0x90, 0x8D, 0x5E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, -0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x41, 0x90, 0x8D, 0x5E, 0xE0, 0xFE, 0x75, 0xF0, 0x08, -0x90, 0x8D, 0x0E, 0x12, 0x43, 0xFD, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0F, 0xF9, -0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x7B, 0x96, 0x90, 0x8D, 0x5E, 0x12, -0x83, 0x7E, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0x5E, 0xF0, 0x12, -0x71, 0xED, 0x90, 0x8D, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, -0x8D, 0xF6, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5E, 0xF0, 0xA3, 0xF0, 0x22, 0x11, 0xF9, 0x11, 0xBE, -0x12, 0x4F, 0x1F, 0x31, 0x9C, 0x12, 0x86, 0xC0, 0x31, 0xBF, 0x31, 0xD2, 0x90, 0x93, 0x35, 0xE0, -0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x93, 0x37, -0xF0, 0x90, 0x93, 0x35, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x31, 0xA1, 0xFE, 0xEF, -0x54, 0x07, 0xFF, 0xED, 0x70, 0x12, 0x31, 0x3C, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0x34, 0x80, 0x02, -0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0x80, 0x0F, 0x31, 0x3C, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0x34, -0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x31, 0x47, 0x90, 0x8E, -0x0F, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x22, 0x74, 0xFF, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7D, 0x10, -0xED, 0x14, 0xF9, 0x24, 0xFF, 0x31, 0x3F, 0xE0, 0x60, 0x39, 0x7C, 0x08, 0xEC, 0x14, 0x90, 0x95, -0x28, 0xF0, 0x74, 0xFF, 0x29, 0x31, 0x3F, 0xE0, 0xFB, 0x7A, 0x00, 0x90, 0x95, 0x28, 0x31, 0xA8, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, -0x60, 0x0F, 0xE9, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x95, 0x28, 0xE0, 0x2F, 0x04, 0xFF, 0x80, -0x06, 0xDC, 0xC9, 0xDD, 0xBB, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x31, 0xB2, 0x02, 0x08, -0xAA, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xC0, 0x22, 0x90, -0x93, 0x28, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3, 0x74, 0x0A, 0x02, -0x67, 0xE6, 0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x2C, 0x12, 0x08, -0xAA, 0x90, 0x93, 0x2D, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x94, 0xFD, 0xEF, -0xF0, 0xA3, 0x12, 0x44, 0x12, 0x90, 0x95, 0x1B, 0xE0, 0xFE, 0x04, 0xF0, 0x51, 0x53, 0x74, 0x00, -0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, -0xFE, 0x12, 0x56, 0x7A, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, -0x90, 0x94, 0xFD, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, -0x02, 0xC0, 0x01, 0xA3, 0x12, 0x44, 0x09, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, -0x41, 0x89, 0x42, 0x90, 0x94, 0xFE, 0x51, 0x5A, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, -0x02, 0x35, 0x26, 0x90, 0x00, 0x01, 0xEE, 0x02, 0x06, 0xE1, 0x12, 0x44, 0x09, 0x90, 0x00, 0x0E, -0x02, 0x06, 0xA2, 0x51, 0x69, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, -0x81, 0x05, 0x12, 0x43, 0xFD, 0xE0, 0x22, 0x51, 0x69, 0x44, 0x04, 0xF0, 0x22, 0xEF, 0x70, 0x04, -0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, -0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, -0xF5, 0x83, 0xEB, 0xF0, 0x22, 0x90, 0x95, 0x11, 0x12, 0x44, 0x12, 0xE4, 0xFF, 0x90, 0x95, 0x11, -0x12, 0x44, 0x09, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x02, 0x51, 0xCA, 0xB4, 0x10, 0xE4, 0x22, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, -0x22, 0xE4, 0xFF, 0x74, 0x18, 0x51, 0xF5, 0x74, 0xD4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, -0x83, 0xEE, 0xF0, 0x74, 0x10, 0x51, 0xF5, 0x74, 0xCE, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0x51, -0xCA, 0xB4, 0x06, 0xDF, 0x22, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x22, -0xE4, 0xFF, 0x74, 0x90, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x84, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0x51, 0xCA, 0xB4, 0x08, 0xE7, 0x90, 0x8F, 0x98, 0xE0, 0x90, -0x04, 0x8C, 0xF0, 0x22, 0x71, 0x49, 0x71, 0x00, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, -0x06, 0xE0, 0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, -0x07, 0x90, 0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x49, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0xF1, 0xE0, -0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x75, 0x15, 0x10, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, -0x75, 0x18, 0x02, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, -0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x07, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, -0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, -0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, -0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x12, 0x87, 0xDD, 0x90, 0x01, -0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xC7, 0x74, -0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xD3, 0xF0, 0x74, 0x8B, 0xA3, 0xF0, 0x90, -0x93, 0x27, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, -0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x74, 0xD3, 0x04, 0x90, 0x01, 0xC4, 0xF0, -0x74, 0x8B, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x8D, 0x01, 0x12, 0x4D, 0xB3, 0xA3, 0xF0, -0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, -0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, -0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, -0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, -0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, -0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, -0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x8E, 0xC4, 0xE0, 0x30, 0xE0, 0x05, 0x7F, -0x10, 0x12, 0x71, 0xDE, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x93, 0xF8, 0xF0, 0xE0, 0xFF, 0x30, -0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, -0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, -0x4D, 0x6E, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x49, 0x39, 0x80, 0xFE, -0x22, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x46, 0x90, 0x8E, 0x11, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x8E, -0x2C, 0xE0, 0x04, 0x12, 0x77, 0x6B, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, -0x4C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x77, 0x48, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0x3B, 0xE0, -0x30, 0xE4, 0x03, 0x12, 0x76, 0x1D, 0x90, 0x95, 0x29, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, -0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xB1, 0xAF, 0xB1, -0x72, 0xE4, 0x90, 0x93, 0x2B, 0xF0, 0x12, 0x77, 0x7A, 0x12, 0x6F, 0xFA, 0x30, 0xE0, 0x52, 0x90, -0x90, 0x74, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x7D, 0x64, 0x12, 0x07, 0x15, 0x90, 0x90, -0xC8, 0xE0, 0x6E, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x60, 0x0A, 0x90, 0x90, 0xC8, 0xE4, 0x75, 0xF0, -0x01, 0x02, 0x08, 0xD6, 0x90, 0x90, 0x78, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x86, 0xE0, -0xB5, 0x06, 0x14, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0xEF, 0x4E, 0x60, 0x0B, 0x90, 0x01, 0xC7, 0x74, -0x31, 0xF0, 0x7F, 0x01, 0x02, 0x79, 0x21, 0x12, 0x61, 0xA1, 0xE4, 0x90, 0x90, 0xC8, 0xF0, 0xA3, -0xF0, 0x22, 0x90, 0x93, 0x28, 0xE0, 0x30, 0xE0, 0x35, 0x12, 0x73, 0x13, 0x70, 0x30, 0x90, 0x95, -0x2C, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0x90, -0x95, 0x2C, 0xF0, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xD3, 0x9F, 0x50, 0x0E, -0x90, 0x93, 0x2B, 0xE0, 0x70, 0x08, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x12, 0x67, 0x94, 0x22, 0x90, -0x93, 0x2C, 0xE0, 0x30, 0xE0, 0x6C, 0x90, 0x93, 0x30, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x33, 0xE0, -0x64, 0x01, 0x70, 0x21, 0x90, 0x93, 0x2C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x16, 0x90, -0x93, 0x32, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x2F, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x05, -0x12, 0x79, 0x6A, 0xF0, 0x22, 0x90, 0x93, 0x30, 0xE0, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0xD3, 0x9F, -0x50, 0x30, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x1A, 0x90, 0x93, 0x32, 0xE0, 0x70, 0x14, 0x7D, -0x08, 0xFF, 0x12, 0x65, 0x59, 0x90, 0x93, 0x31, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x2B, 0xE0, 0x04, -0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x30, 0xF0, 0x90, 0x93, -0x32, 0xF0, 0x22, 0x90, 0x93, 0x32, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x02, 0x60, -0x03, 0x12, 0x75, 0x82, 0x22, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x02, 0xD1, 0x3E, 0x22, 0x90, 0x8E, -0x15, 0xE0, 0x64, 0x01, 0x70, 0x14, 0x12, 0x77, 0xF5, 0x60, 0x06, 0x12, 0x53, 0xD0, 0x02, 0x67, -0xAC, 0x90, 0x8E, 0x18, 0xE0, 0x70, 0x03, 0x12, 0x51, 0xF9, 0x22, 0x90, 0x8E, 0x15, 0xE0, 0x60, -0x03, 0x12, 0x74, 0x47, 0x22, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x10, 0x90, 0x06, 0x92, 0xE0, 0x30, -0xE1, 0x03, 0x02, 0x67, 0xAC, 0x12, 0x75, 0x6E, 0x12, 0x74, 0xB2, 0x22, 0xF1, 0x24, 0x90, 0x93, -0xFD, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, -0xB5, 0x90, 0x93, 0xFD, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, -0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0xF1, 0x1B, 0x90, 0x8E, 0x2E, 0xE0, 0xFB, -0xAC, 0x07, 0x90, 0x8E, 0x11, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x8E, 0x4B, 0xE0, 0x24, 0x04, 0x90, -0x8E, 0x2A, 0xF0, 0x90, 0x8E, 0x4B, 0xE0, 0x24, 0x03, 0x90, 0x8E, 0x29, 0xF0, 0x80, 0x0B, 0x90, -0x8E, 0x2A, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x29, 0x14, 0xF0, 0x90, 0x8E, 0x29, 0xE0, 0xFA, 0x90, -0x8E, 0x28, 0xE0, 0xD3, 0x9A, 0x50, 0x09, 0x90, 0x8E, 0x1D, 0xEB, 0xF1, 0x13, 0x2C, 0x80, 0x0B, -0xAD, 0x02, 0xC3, 0xED, 0x9D, 0x2B, 0x90, 0x8E, 0x1D, 0xF1, 0x13, 0x90, 0x8E, 0x2D, 0xF0, 0x90, -0x8E, 0x2D, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x8E, 0x21, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, -0x58, 0xF0, 0x22, 0xF0, 0x90, 0x8E, 0x2A, 0xE0, 0xC3, 0x9D, 0x22, 0x90, 0x8E, 0x27, 0xE0, 0xFF, -0xA3, 0xE0, 0xFD, 0x22, 0xE4, 0x90, 0x93, 0xFE, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, -0x4A, 0x4E, 0x90, 0x93, 0xFE, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x4A, 0x4E, 0xAE, 0x07, 0x90, 0x93, -0xFE, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x94, 0x00, 0xE0, 0x94, 0x64, 0x90, 0x93, -0xFF, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0xFE, -0xE0, 0xFF, 0x22, 0x90, 0x93, 0xFF, 0x12, 0x61, 0x77, 0x80, 0xC2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, -0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, -0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, -0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x90, 0x93, 0x71, 0xE0, 0x2F, 0xFF, -0x90, 0x93, 0x70, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, -0x1B, 0xE0, 0xFD, 0xF1, 0x99, 0x90, 0x93, 0x6B, 0xEF, 0xF0, 0x22, 0x7F, 0xFF, 0x12, 0x53, 0xD9, -0xE4, 0x90, 0x95, 0x1E, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, -0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x95, 0x1F, -0xE0, 0x94, 0xE8, 0x90, 0x95, 0x1E, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, -0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x95, 0x1E, 0x12, -0x61, 0x77, 0x80, 0xC3, 0x90, 0x01, 0xC4, 0x74, 0x14, 0xF0, 0x74, 0x90, 0xA3, 0xF0, 0x7F, 0x90, -0x12, 0x4A, 0x4E, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x14, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x90, -0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0xEF, 0x12, 0x51, 0x5B, -0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xF5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x53, 0xE4, -0xF0, 0xFF, 0xEF, 0x12, 0x51, 0x5B, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xF5, 0x22, 0x7B, 0x01, -0x7A, 0x93, 0x79, 0x3B, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0x93, -0x3B, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0x93, 0x34, 0x74, 0x01, 0xF0, 0x22, 0xE4, -0x90, 0x93, 0x34, 0xF0, 0x22, 0x12, 0x7F, 0x59, 0x90, 0x93, 0x28, 0x12, 0x7F, 0xCC, 0x54, 0x04, -0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x77, -0xC3, 0x90, 0x93, 0x29, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, -0xEE, 0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x95, 0x22, 0xF0, 0xA3, 0xF0, -0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x24, 0xC3, 0x90, 0x95, 0x23, 0xE0, 0x94, 0xD0, 0x90, 0x95, -0x22, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, -0x90, 0x95, 0x22, 0x12, 0x61, 0x77, 0x12, 0x87, 0xDD, 0x80, 0xD5, 0x7F, 0x01, 0x22, 0x90, 0x02, -0x86, 0xE0, 0x20, 0xE2, 0x03, 0x7F, 0x04, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x7F, 0x01, 0x20, 0xE1, -0x02, 0x7F, 0x02, 0x22, 0x90, 0x8E, 0xCD, 0xE0, 0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, -0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x8E, 0xCD, 0xF0, 0x90, 0x8E, 0xC7, 0xE0, 0xC4, 0x54, -0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, -0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x02, 0x6F, 0x98, 0x90, 0x93, 0x56, 0x31, -0x98, 0x90, 0x93, 0x5E, 0xF0, 0x90, 0x93, 0x5E, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x28, 0x90, -0x93, 0x57, 0xE0, 0x24, 0x04, 0xFF, 0x90, 0x93, 0x56, 0xE0, 0x34, 0x00, 0xFE, 0x12, 0x6B, 0x77, -0x90, 0x93, 0x5E, 0xE0, 0x24, 0x58, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, -0x93, 0x5E, 0xE0, 0x04, 0xF0, 0x80, 0xCE, 0x78, 0xCE, 0x7C, 0x8E, 0x7D, 0x01, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0x58, 0x31, 0x8C, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0x7E, 0x00, 0x7F, 0x06, -0x12, 0x45, 0xC7, 0xEF, 0x22, 0x90, 0x93, 0x46, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x22, 0x90, -0x93, 0x4A, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0x48, 0x31, 0x98, 0x90, 0x93, 0x6E, 0xF0, -0xEF, 0x24, 0x24, 0xFF, 0xE4, 0x3E, 0xFE, 0xC0, 0x06, 0x91, 0x20, 0xD0, 0x06, 0xE4, 0xFB, 0xFA, -0x71, 0xF0, 0x4E, 0x60, 0x3E, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, 0x6F, 0x12, 0x6D, 0x70, 0x90, -0x93, 0x4D, 0x91, 0x09, 0x90, 0x93, 0x4D, 0x71, 0xFF, 0xFE, 0xC3, 0x9F, 0x50, 0x25, 0x90, 0x93, -0x70, 0xE0, 0x24, 0x02, 0xFD, 0x90, 0x93, 0x6F, 0xE0, 0x34, 0x00, 0xFC, 0xEE, 0x7E, 0x00, 0x2D, -0x12, 0x6B, 0x71, 0x90, 0x93, 0x4C, 0xE0, 0x24, 0x4E, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0x12, 0x5D, -0x87, 0x80, 0xD1, 0x91, 0x11, 0xC0, 0x06, 0x91, 0x20, 0xD0, 0x06, 0x7B, 0x03, 0x71, 0xED, 0x90, -0x93, 0x49, 0xE0, 0x24, 0x22, 0x91, 0x17, 0x90, 0x93, 0x6F, 0x12, 0x6F, 0xEB, 0xEF, 0x20, 0xE4, -0x02, 0x41, 0xD5, 0x90, 0x93, 0x6E, 0xE0, 0x04, 0xF0, 0x91, 0x11, 0xC0, 0x06, 0x91, 0x20, 0xD0, -0x06, 0x7B, 0x30, 0x71, 0xED, 0x4E, 0x60, 0x45, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0x6F, 0x12, -0x6D, 0x70, 0x91, 0x06, 0x71, 0xFC, 0xC3, 0x9F, 0x50, 0x33, 0x90, 0x93, 0x70, 0xE0, 0x24, 0x0D, -0xFF, 0x90, 0x93, 0x6F, 0x12, 0x6D, 0x70, 0x90, 0x93, 0x71, 0xEF, 0xF0, 0xBF, 0x02, 0x09, 0x90, -0x93, 0x6E, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x0E, 0x90, 0x93, 0x71, 0xE0, 0xB4, 0x04, 0x07, 0x90, -0x93, 0x6E, 0xE0, 0x24, 0x40, 0xF0, 0x91, 0x3E, 0x12, 0x5D, 0x8B, 0x80, 0xC7, 0x91, 0x11, 0xC0, -0x06, 0x91, 0x20, 0xD0, 0x06, 0x7B, 0xDD, 0x7A, 0x00, 0x7D, 0x01, 0x71, 0xF1, 0x4E, 0x60, 0x4A, -0xE0, 0x24, 0x0C, 0xFF, 0x90, 0x93, 0x6F, 0x12, 0x6D, 0x70, 0x91, 0x06, 0x71, 0xFC, 0xC3, 0x9F, -0x50, 0x38, 0x90, 0x93, 0x70, 0xE0, 0x24, 0x11, 0xFF, 0x90, 0x93, 0x6F, 0x12, 0x6D, 0x70, 0x90, -0x93, 0x71, 0xEF, 0xF0, 0xBF, 0x02, 0x09, 0x90, 0x93, 0x6E, 0xE0, 0x24, 0x02, 0xF0, 0x80, 0x0E, -0x90, 0x93, 0x71, 0xE0, 0xB4, 0x04, 0x07, 0x90, 0x93, 0x6E, 0xE0, 0x24, 0x04, 0xF0, 0x91, 0x3E, -0x12, 0x5D, 0x8B, 0x80, 0xC7, 0xE4, 0x90, 0x93, 0x6E, 0xF0, 0x90, 0x90, 0xCA, 0xE0, 0x90, 0x04, -0xFD, 0x91, 0x0A, 0x90, 0x90, 0xCA, 0x71, 0xFF, 0xFE, 0xC3, 0x9F, 0x50, 0x6C, 0xD1, 0x84, 0xF5, -0x83, 0xE0, 0xFF, 0x90, 0x93, 0x4D, 0xE0, 0xFE, 0x6F, 0x70, 0x59, 0x90, 0x04, 0xFC, 0xE0, 0x04, -0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x24, 0xEA, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFF, -0x90, 0x93, 0x6E, 0xE0, 0xFD, 0x4F, 0x60, 0x04, 0xED, 0x5F, 0x60, 0x38, 0xEE, 0xFF, 0x7E, 0x00, -0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x4C, 0xE0, 0x75, 0xF0, 0x20, 0xA4, 0x24, 0x12, 0xF9, 0x74, -0x91, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0x4E, 0x7C, 0x93, 0x7D, 0x01, 0xD0, 0x07, 0xD0, 0x06, -0x12, 0x45, 0xC7, 0xEF, 0x70, 0x0E, 0x90, 0x01, 0xC7, 0x74, 0x55, 0xF0, 0x7F, 0x01, 0x12, 0x79, -0x21, 0x12, 0x87, 0xC6, 0x12, 0x5D, 0x8B, 0x80, 0x8A, 0x22, 0x90, 0x93, 0x73, 0xD1, 0x66, 0xA3, -0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xC3, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x01, 0x90, 0x93, 0x78, 0xE0, -0x94, 0x00, 0x50, 0x02, 0x80, 0x73, 0xE4, 0x90, 0x93, 0x7C, 0xF0, 0xA3, 0xF0, 0x91, 0x35, 0xE4, -0xFD, 0x12, 0x6B, 0x77, 0x90, 0x93, 0x76, 0xE0, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x70, 0x17, 0x90, -0x93, 0x74, 0xE0, 0x24, 0x02, 0x91, 0x60, 0xFE, 0x90, 0x93, 0x75, 0xE0, 0xFD, 0xD1, 0xA8, 0xBF, -0x01, 0x02, 0x81, 0x35, 0x80, 0x00, 0x90, 0x93, 0x74, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, 0x73, -0x12, 0x6D, 0x70, 0x7E, 0x00, 0x90, 0x93, 0x7A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x02, 0xFF, -0xEE, 0x33, 0xFE, 0x90, 0x93, 0x73, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x7C, 0xEE, 0x8F, -0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x78, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x93, 0x7D, -0xE0, 0x9F, 0x90, 0x93, 0x7C, 0xE0, 0x9E, 0x40, 0x94, 0xE4, 0xFE, 0xFF, 0x22, 0x7A, 0x00, 0xE4, -0xFD, 0x71, 0x5A, 0x90, 0x93, 0x6F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x93, 0x72, 0xE0, -0xFF, 0x90, 0x93, 0x4C, 0xE0, 0x22, 0x90, 0x93, 0x72, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0x4C, 0xF0, -0x22, 0x90, 0x93, 0x49, 0xE0, 0x24, 0x24, 0xFF, 0x90, 0x93, 0x48, 0xE0, 0x34, 0x00, 0xFE, 0x22, -0x90, 0x93, 0x4B, 0xE0, 0x24, 0xDC, 0xFE, 0x90, 0x93, 0x4A, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0x78, -0xF0, 0xA3, 0xCE, 0xF0, 0x22, 0x90, 0x93, 0x73, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x93, -0x6F, 0xE4, 0x75, 0xF0, 0x04, 0x02, 0x08, 0xD6, 0xD1, 0x7B, 0x90, 0x94, 0x51, 0xE0, 0x64, 0x01, -0xF0, 0xE0, 0x24, 0x48, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x94, 0xA3, 0x12, 0x6C, 0x21, 0x21, 0x9F, -0xFF, 0x90, 0x93, 0x73, 0xE0, 0x34, 0x00, 0x22, 0x90, 0x93, 0x73, 0xD1, 0x66, 0x2F, 0xFF, 0xE4, -0x3E, 0xCF, 0x24, 0x06, 0xCF, 0x12, 0x6D, 0x71, 0xBF, 0x86, 0x19, 0x90, 0x93, 0x75, 0xE0, 0xFF, -0x90, 0x93, 0x74, 0xE0, 0x2F, 0x91, 0x60, 0xCF, 0x24, 0x07, 0xCF, 0x12, 0x6D, 0x71, 0xBF, 0xDD, -0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xD1, 0x63, 0x12, 0x6F, 0xF3, 0x7B, 0xFF, 0x7A, 0x40, -0x79, 0x6A, 0x12, 0x57, 0xF5, 0xD1, 0x9F, 0x7A, 0x40, 0x79, 0x70, 0xD1, 0x40, 0x78, 0x5F, 0x7C, -0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x80, 0xD1, 0x40, 0xE4, 0x90, 0x93, 0x72, 0x12, -0x6C, 0x21, 0xA3, 0xE0, 0xFD, 0x91, 0x68, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x28, 0x12, 0x6E, -0xA4, 0xCF, 0x24, 0x0E, 0xCF, 0x12, 0x6D, 0x71, 0xEF, 0x64, 0x3A, 0x60, 0x02, 0xC1, 0x28, 0x12, -0x6E, 0xA4, 0xCF, 0x24, 0x30, 0xCF, 0x12, 0x6D, 0x71, 0xEF, 0x64, 0x87, 0x60, 0x02, 0xC1, 0x28, -0x90, 0x93, 0x72, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x6F, 0xF0, 0xD1, 0x2E, 0x94, 0x10, 0x50, 0x1A, -0xD1, 0x6F, 0x12, 0x6E, 0xAF, 0xCD, 0x24, 0x38, 0x12, 0x6B, 0x69, 0x90, 0x93, 0x6F, 0xE0, 0x24, -0x5F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xD1, 0x35, 0x80, 0xE0, 0xE4, 0x90, 0x93, 0x70, 0xF0, 0x90, -0x93, 0x70, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, 0xC1, 0x28, 0x75, 0xF0, 0x38, 0xEF, 0xD1, -0x47, 0x20, 0xE0, 0x02, 0xC1, 0x28, 0xE4, 0x90, 0x93, 0x71, 0xF0, 0xD1, 0x4F, 0x90, 0x8E, 0xF9, -0x12, 0x43, 0xFD, 0xE0, 0xFE, 0x90, 0x93, 0x71, 0xE0, 0xC3, 0x9E, 0x40, 0x02, 0xC1, 0x20, 0xEF, -0x75, 0xF0, 0x38, 0xA4, 0x24, 0x10, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xE0, 0x75, -0xF0, 0x10, 0xA4, 0x29, 0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x78, 0x5F, 0x7C, 0x93, 0xD1, 0x58, 0x60, -0x02, 0xC1, 0x11, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x01, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x6F, -0xF0, 0xD1, 0x2E, 0x94, 0x06, 0x50, 0x14, 0xD1, 0x6F, 0x12, 0x6E, 0xAF, 0xCD, 0x24, 0x4A, 0x12, -0x6B, 0x69, 0x90, 0x93, 0x6F, 0xD1, 0x96, 0xD1, 0x35, 0x80, 0xE6, 0xE4, 0x90, 0x93, 0x6F, 0xF0, -0xD1, 0x2E, 0x94, 0x10, 0x50, 0x0C, 0x12, 0x6B, 0x55, 0x90, 0x93, 0x6F, 0xD1, 0x8D, 0xD1, 0x35, -0x80, 0xEE, 0xD1, 0x4F, 0xD1, 0x47, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x19, 0xEF, 0x75, 0xF0, 0x38, -0xA4, 0x24, 0x00, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0x4F, 0x7C, 0x93, 0xD1, -0x58, 0x70, 0x45, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x49, 0x90, 0x93, 0x76, 0x12, 0x44, -0x12, 0x7A, 0x93, 0x79, 0x5F, 0x90, 0x93, 0x79, 0x12, 0x44, 0x12, 0x90, 0x93, 0x70, 0xE0, 0x75, -0xF0, 0x38, 0xA4, 0x24, 0xFA, 0xF9, 0x74, 0x8E, 0x35, 0xF0, 0xFA, 0x90, 0x93, 0x7C, 0x12, 0x44, -0x12, 0xE4, 0x90, 0x93, 0x7F, 0xF0, 0xA3, 0xF0, 0x7A, 0x93, 0x79, 0x4F, 0x12, 0x53, 0xE4, 0x80, -0x07, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x05, 0xF0, 0x90, 0x93, 0x71, 0xE0, 0x04, 0xF0, 0xA1, 0x3B, -0x90, 0x93, 0x70, 0xE0, 0x04, 0xF0, 0xA1, 0x1F, 0x90, 0x93, 0x72, 0xE0, 0xFF, 0x22, 0x90, 0x93, -0x6F, 0xE0, 0xFF, 0xC3, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x6F, 0xE0, 0x04, 0xF0, 0x22, -0x7E, 0x00, 0x7F, 0x10, 0x02, 0x06, 0x63, 0x90, 0x8E, 0xF8, 0x12, 0x43, 0xFD, 0xE0, 0x22, 0x90, -0x93, 0x70, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0x22, 0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x45, -0xC7, 0xEF, 0x22, 0x90, 0x93, 0x46, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0x90, -0x93, 0x48, 0xE0, 0xFD, 0x90, 0x93, 0x47, 0xE0, 0x2D, 0xFD, 0x22, 0x90, 0x93, 0x46, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x22, 0x74, 0xDA, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0x22, 0xE0, 0x24, 0x4F, -0xF5, 0x82, 0xE4, 0x34, 0x93, 0x22, 0xE0, 0x24, 0x49, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0x22, 0x78, -0x4F, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x22, 0xED, 0x14, 0x60, 0x06, 0x04, 0x70, 0x03, 0x7F, -0x01, 0x22, 0x7F, 0x01, 0x22, 0x31, 0x95, 0xA3, 0xF0, 0x90, 0x93, 0x48, 0xE0, 0xFD, 0xC3, 0x94, -0x04, 0x50, 0x29, 0x90, 0x93, 0x47, 0xE0, 0x24, 0x10, 0x12, 0x6E, 0xAE, 0xFE, 0x12, 0x6B, 0x77, -0x90, 0x93, 0x48, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, -0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x48, 0xE0, 0x04, 0xF0, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0xD1, -0x63, 0xE4, 0xA3, 0xF0, 0xF1, 0x2A, 0x50, 0x1A, 0x12, 0x6C, 0x22, 0xF1, 0x79, 0x24, 0xA8, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xB5, 0x07, 0x1D, 0x90, 0x93, 0x49, 0xE0, 0x04, 0xF0, -0x80, 0xE2, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x30, 0xF0, 0x7F, -0x01, 0x12, 0x79, 0x21, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x49, 0xE0, 0xFD, 0xC3, -0x94, 0x02, 0x22, 0xD1, 0x63, 0x90, 0x90, 0x7A, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x26, 0xE4, -0x90, 0x93, 0x49, 0xF0, 0xF1, 0x2A, 0x50, 0x20, 0x12, 0x6C, 0x22, 0xF1, 0x79, 0x24, 0x88, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x49, -0xE0, 0x04, 0xF0, 0x80, 0xDF, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x40, 0xF0, 0xE4, -0x90, 0x90, 0x86, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x6B, 0x77, -0x90, 0x93, 0x49, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x20, 0xE0, 0x05, -0x90, 0x93, 0x16, 0x80, 0x03, 0x90, 0x93, 0x17, 0xE0, 0x90, 0x8F, 0x99, 0xF0, 0x90, 0x8F, 0x99, -0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, 0x09, 0x14, 0x60, -0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08, 0xAF, 0x06, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xA3, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0x2C, -0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x30, 0xE7, 0x04, -0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, 0xED, 0x30, 0xE6, 0x08, 0xAF, 0x03, 0xF1, 0x85, 0xAE, 0x07, -0x80, 0x02, 0xE4, 0xFE, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x90, 0x94, 0xED, 0xED, 0xF0, 0x90, -0x94, 0xEA, 0x12, 0x44, 0x12, 0xE4, 0x90, 0x94, 0xEE, 0xF0, 0xA3, 0xF0, 0x12, 0x06, 0x89, 0xFF, -0x12, 0x77, 0xC3, 0xFD, 0x12, 0x7D, 0x70, 0xFB, 0x12, 0x97, 0xEA, 0x90, 0x94, 0xEE, 0xEF, 0xF0, -0x90, 0x94, 0xEA, 0x12, 0x44, 0x09, 0x12, 0x7D, 0x70, 0xFF, 0x12, 0x97, 0x85, 0x90, 0x94, 0xEF, -0xEF, 0xF0, 0x90, 0x8F, 0x99, 0xE0, 0x24, 0xFE, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, -0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, 0x41, 0x11, 0x9A, 0x11, 0xA6, 0x80, 0x0D, 0x11, 0x9A, -0x90, 0x8F, 0x99, 0xE0, 0x90, 0x94, 0xBF, 0xF0, 0x12, 0x7C, 0x99, 0x90, 0x94, 0xEF, 0xE0, 0xFF, -0x90, 0x94, 0xEA, 0x12, 0x44, 0x09, 0x90, 0x94, 0xEE, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, -0xFA, 0xC3, 0xE9, 0x9F, 0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8F, 0x75, -0x42, 0x90, 0xA3, 0xE0, 0xF5, 0x43, 0x12, 0x35, 0x26, 0x22, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x90, -0x90, 0x94, 0xED, 0xE0, 0xFD, 0x22, 0x90, 0x94, 0xD9, 0xED, 0xF0, 0x90, 0x94, 0xD6, 0x12, 0x44, -0x12, 0x12, 0x7D, 0xF8, 0x90, 0x94, 0xDD, 0xF0, 0x90, 0x94, 0xD6, 0x12, 0x56, 0x7A, 0x75, 0x43, -0x03, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0xDA, 0x12, 0x35, 0x26, 0x90, 0x94, 0xD9, 0xE0, 0x70, 0x2E, -0xFF, 0x11, 0xFF, 0xE0, 0xB4, 0xFF, 0x06, 0x11, 0xFF, 0xE4, 0xF0, 0x80, 0x07, 0x11, 0xFF, 0xE0, -0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x03, 0xE8, 0x75, 0x40, 0x01, 0x75, 0x41, 0x94, 0x75, -0x42, 0xDA, 0x75, 0x43, 0x03, 0x90, 0x94, 0xD6, 0x12, 0x44, 0x09, 0x12, 0x35, 0x26, 0x22, 0x74, -0xDA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x31, 0x1B, 0x12, 0x57, 0x00, 0x75, -0x43, 0x08, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x90, 0x02, 0x35, 0x26, 0x12, 0x57, 0xD3, 0x7E, 0x00, -0x74, 0x00, 0x2F, 0x22, 0x31, 0x1B, 0x12, 0x57, 0x00, 0x75, 0x43, 0x70, 0x7B, 0x01, 0x7A, 0x8E, -0x79, 0xF8, 0x02, 0x35, 0x26, 0xEF, 0x60, 0x07, 0x90, 0x93, 0x1E, 0xE0, 0xFF, 0x31, 0x24, 0x22, -0x90, 0x93, 0xAD, 0x12, 0x44, 0x12, 0x90, 0x93, 0xB0, 0x12, 0x56, 0x7A, 0x75, 0x43, 0x10, 0x7B, -0x01, 0x7A, 0x8F, 0x79, 0x68, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAD, 0x12, 0x56, 0x7A, 0x75, 0x43, -0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x78, 0x12, 0x35, 0x26, 0x90, 0x93, 0xB3, 0x12, 0x43, 0xE5, -0x90, 0x8F, 0x88, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xB7, 0xE0, 0x90, 0x8F, 0x8F, 0xF0, 0x22, 0x90, -0x8E, 0xCD, 0xE0, 0x30, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x20, 0xE5, 0x10, -0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x09, 0x90, 0x01, 0xC7, 0x74, 0x25, 0xF0, 0x7F, 0x01, 0x22, -0x7F, 0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x93, 0x4A, 0xF0, 0x12, 0x06, 0x89, 0x90, 0x93, -0x16, 0x12, 0x77, 0xC2, 0x90, 0x93, 0x17, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x12, 0x06, -0x89, 0xFE, 0xEF, 0x2E, 0x90, 0x93, 0x26, 0xF0, 0x22, 0xEF, 0x60, 0x08, 0x90, 0x93, 0x19, 0xE0, -0xFF, 0x12, 0x56, 0x98, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, 0x3C, 0x90, 0x93, 0x1C, 0x12, 0x67, -0x7A, 0x51, 0x21, 0x12, 0x7F, 0x3E, 0x90, 0x93, 0x4A, 0x12, 0x56, 0x7A, 0x75, 0x43, 0x40, 0x7B, -0x01, 0x7A, 0x8F, 0x79, 0x9A, 0x12, 0x35, 0x26, 0xE4, 0xFD, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x90, -0x93, 0x1D, 0xE0, 0x51, 0x18, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x39, 0xD6, -0x7D, 0x01, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x22, 0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, -0x22, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0xEF, 0x60, 0x0A, 0x90, -0x06, 0x31, 0xE0, 0x44, 0x80, 0xF0, 0x12, 0x5B, 0x04, 0x22, 0xEF, 0x60, 0x06, 0x12, 0x66, 0x5B, -0x12, 0x57, 0x0C, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, -0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x51, 0x44, 0xEF, -0x64, 0x01, 0x70, 0x47, 0x90, 0x8E, 0x19, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x8E, 0x17, -0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x8E, 0x19, 0xE0, 0x20, -0xE4, 0x29, 0x90, 0x8E, 0x12, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x8E, 0xBF, -0xE0, 0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, -0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x24, -0xFE, 0x60, 0x0B, 0x04, 0x70, 0x24, 0x90, 0x8E, 0x1B, 0x74, 0x02, 0xF0, 0x80, 0x13, 0xED, 0x70, -0x06, 0x90, 0x8E, 0xBC, 0xE0, 0x80, 0x02, 0xED, 0x14, 0x90, 0x8E, 0x1B, 0xF0, 0x90, 0x8E, 0x1B, -0xE0, 0xA3, 0xF0, 0x90, 0x8E, 0x12, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x8E, 0xC0, 0xE0, 0xC3, -0x13, 0x20, 0xE0, 0x21, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x24, 0x90, 0x8E, 0xC4, 0xE0, 0x30, 0xE0, -0x06, 0x90, 0x02, 0x82, 0xE0, 0x70, 0x17, 0x90, 0x8E, 0xCD, 0xE0, 0x20, 0xE0, 0x10, 0x90, 0x02, -0x86, 0xE0, 0x30, 0xE1, 0x09, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, -0x22, 0xEF, 0x60, 0x2E, 0x12, 0x73, 0x13, 0x70, 0x29, 0x90, 0x8E, 0x12, 0xE0, 0x54, 0xFE, 0xF0, -0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x53, 0xD9, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0x65, -0x55, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x11, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x12, -0x4E, 0xB5, 0x22, 0x7D, 0x2D, 0x12, 0x8F, 0xCB, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, -0x03, 0x12, 0x75, 0x25, 0x12, 0x4B, 0x21, 0xE4, 0xFD, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0x7D, 0x2E, -0x7F, 0x6F, 0x12, 0x53, 0xD9, 0x7D, 0x02, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0x90, 0x95, 0x2E, 0xEF, -0xF0, 0x12, 0x4D, 0xE7, 0x90, 0x95, 0x2E, 0xE0, 0x60, 0x03, 0x12, 0x4F, 0xE9, 0x7D, 0x04, 0x7F, -0x01, 0x02, 0x4E, 0xB5, 0xE4, 0xF5, 0x58, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x58, 0x54, 0xC0, 0x70, -0x08, 0x71, 0xDD, 0x54, 0xFD, 0xF0, 0x02, 0x74, 0xB2, 0xE5, 0x58, 0x30, 0xE6, 0x1F, 0x90, 0x8E, -0x15, 0xE0, 0x64, 0x01, 0x70, 0x19, 0x90, 0x8E, 0x19, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x77, 0xF5, -0x64, 0x02, 0x60, 0x04, 0x71, 0xEF, 0x80, 0x07, 0x12, 0x67, 0x84, 0x80, 0x02, 0x71, 0xDD, 0xE5, -0x58, 0x90, 0x8E, 0x19, 0x30, 0xE7, 0x11, 0xE0, 0x44, 0x02, 0xF0, 0x71, 0xE5, 0x12, 0x50, 0x0D, -0x90, 0x8E, 0x11, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x8E, 0x19, -0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0xE2, 0xF0, 0x90, 0x8E, 0xBA, 0xE0, 0x22, 0x90, -0x04, 0x1D, 0xE0, 0x70, 0x12, 0x90, 0x8D, 0x08, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x64, -0x38, 0x90, 0x95, 0x24, 0x12, 0x57, 0xFC, 0x22, 0xE4, 0xFD, 0xF9, 0xFC, 0x90, 0x05, 0x62, 0xE0, -0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, -0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x8E, 0x4E, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0x90, 0x8E, 0x4E, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x21, 0xEB, -0x9F, 0xFF, 0x90, 0x8E, 0x2D, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xF9, 0xC3, 0x94, 0x19, -0x50, 0x0E, 0x74, 0x32, 0x29, 0x91, 0xF5, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x2B, 0xE0, 0x04, 0xF0, -0x90, 0x8E, 0x2B, 0xE0, 0xC3, 0x94, 0x64, 0x50, 0x02, 0x81, 0xF1, 0xE4, 0xFC, 0xFD, 0x91, 0xF2, -0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x05, 0x40, 0x07, 0x90, 0x93, 0xFA, 0xED, 0xF0, 0x80, 0x05, 0x0D, -0xED, 0xB4, 0x19, 0xEA, 0xE4, 0xFC, 0xFD, 0x91, 0xF2, 0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x5F, 0x40, -0x07, 0x90, 0x93, 0xFB, 0xED, 0xF0, 0x80, 0x05, 0x0D, 0xED, 0xB4, 0x19, 0xEA, 0x90, 0x93, 0xFA, -0xE0, 0x90, 0x8E, 0x30, 0xF0, 0x90, 0x93, 0xFB, 0xE0, 0x90, 0x8E, 0x31, 0x91, 0xFD, 0x94, 0x0B, -0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x8E, 0x28, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x8E, 0x28, -0x91, 0xFD, 0x74, 0x0A, 0x9F, 0x90, 0x8E, 0x27, 0xF0, 0x90, 0x8E, 0x30, 0xE0, 0xFF, 0xA3, 0xE0, -0xC3, 0x9F, 0x90, 0x8E, 0x2E, 0xF0, 0xC3, 0x94, 0x08, 0x50, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x8E, -0x28, 0xE0, 0xFD, 0x90, 0x8E, 0x2E, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x8E, 0xB0, 0xE4, 0xFF, 0xB1, -0x05, 0x22, 0x74, 0x32, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x22, 0xF0, 0x90, 0x8E, -0x30, 0xE0, 0xFF, 0xC3, 0x22, 0xE4, 0xFE, 0x74, 0x32, 0x2E, 0x91, 0xF5, 0xE4, 0xF0, 0x0E, 0xEE, -0xB4, 0x19, 0xF4, 0xE4, 0x90, 0x8E, 0x2B, 0xF0, 0x90, 0x8E, 0x2F, 0xF0, 0x90, 0x8E, 0x27, 0xF0, -0xEF, 0xB4, 0x01, 0x09, 0x90, 0x8E, 0x30, 0x74, 0x19, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x7D, 0x2F, -0x12, 0x4B, 0x1C, 0x7D, 0x08, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0x90, 0x93, 0x53, 0xED, 0xF0, 0x90, -0x93, 0x51, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xB1, 0x57, 0x90, 0x93, 0x51, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0xA3, 0xE0, 0xFD, 0x02, 0x58, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, -0x17, 0xE0, 0xFD, 0xB4, 0x02, 0x07, 0xD1, 0x36, 0x74, 0x08, 0xF0, 0x80, 0x09, 0xED, 0xB4, 0x04, -0x05, 0xD1, 0x36, 0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, 0x60, 0x02, 0xC1, 0x31, 0x90, 0x8F, -0xDB, 0xE0, 0xFF, 0x64, 0xFE, 0x70, 0x02, 0xC1, 0x31, 0xEF, 0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, -0x03, 0x60, 0x02, 0xC1, 0x31, 0x90, 0x90, 0x3B, 0xD1, 0x47, 0x90, 0x93, 0xA6, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0xD1, 0x3E, 0x7A, 0x93, 0x79, 0x64, 0x12, 0x08, 0xAA, 0xD1, 0x3E, 0x7A, 0x93, 0x79, -0x84, 0x12, 0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0x12, 0x67, 0xE6, 0x7B, 0x20, 0xFD, 0xFC, -0xFF, 0xFE, 0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x3D, 0x90, 0xAC, 0x89, 0x12, 0x44, -0x12, 0x7A, 0x93, 0x79, 0x84, 0x90, 0xAC, 0x8C, 0x12, 0x44, 0x12, 0x90, 0xAC, 0x8F, 0x74, 0x20, -0xF0, 0x7A, 0x8F, 0x79, 0xAA, 0x12, 0x34, 0x5B, 0x75, 0x40, 0x01, 0x75, 0x41, 0x93, 0x75, 0x42, -0x8C, 0x75, 0x43, 0x18, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x64, 0x12, 0x35, 0x26, 0x75, 0x40, 0x01, -0x75, 0x41, 0x93, 0x75, 0x42, 0x6C, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x54, 0x12, -0x35, 0x26, 0x90, 0x93, 0x6A, 0xE0, 0x54, 0x03, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8F, 0x98, 0x50, -0x04, 0xEF, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x54, 0x12, 0x7E, -0x67, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0xA4, 0x74, 0x80, 0xF0, 0xA3, 0x22, 0x7E, 0x00, -0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x7F, 0x59, 0x90, 0x8D, -0xFB, 0x12, 0x7A, 0xF3, 0x54, 0x04, 0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8D, 0xFB, 0xD1, -0xF1, 0x12, 0x77, 0xC2, 0xFF, 0xED, 0x2F, 0x90, 0x8D, 0xFC, 0x12, 0x7D, 0xB3, 0xFF, 0xAE, 0x05, -0xED, 0x2F, 0x90, 0x8D, 0xFD, 0xF0, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, -0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0A, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x40, 0xF0, 0x12, 0x66, 0xEF, -0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x30, 0xE0, 0x33, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x01, 0xF0, 0x90, -0x06, 0x09, 0xE0, 0x54, 0xFE, 0xD1, 0xE8, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, -0xE0, 0x90, 0x94, 0x6E, 0x74, 0x01, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x75, 0x25, 0x90, 0x94, -0xE5, 0x12, 0x08, 0x79, 0x00, 0x00, 0x27, 0x10, 0x12, 0x50, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xF0, 0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F, 0xF0, -0x22, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0x22, 0x7F, 0x50, 0x7E, 0x0C, 0x12, -0x37, 0x4E, 0x90, 0x94, 0x54, 0xEF, 0xF0, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, 0x4E, 0x90, 0x94, -0x55, 0xEF, 0xF0, 0x90, 0x94, 0x99, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x9D, -0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x7F, 0x50, 0x7E, 0x0C, 0x12, 0x5F, 0x34, 0x12, 0x08, -0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x12, -0x5E, 0xCA, 0x90, 0x06, 0x08, 0xE0, 0x90, 0x94, 0x6A, 0xF0, 0x90, 0x06, 0xA1, 0xE0, 0xFE, 0x90, -0x06, 0xA0, 0x12, 0x84, 0xA3, 0x90, 0x94, 0x6C, 0xF0, 0xA3, 0xEF, 0xD1, 0xE8, 0x90, 0x06, 0xA0, -0x74, 0x20, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x5D, 0x92, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x58, 0xEF, 0xF0, 0x12, 0x57, 0xCE, 0x74, 0x10, 0x2F, 0xFF, -0x90, 0x93, 0x58, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x2F, 0xFF, 0x12, 0x56, 0xFE, 0x75, 0x43, 0x04, -0x7B, 0x01, 0x7A, 0x94, 0x79, 0x66, 0x12, 0x35, 0x26, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x56, 0xE0, 0xFE, 0x90, 0x94, 0x53, 0xE0, 0xC3, 0x9E, -0x40, 0x04, 0x7F, 0x00, 0x80, 0x0E, 0xEF, 0x60, 0x05, 0xD3, 0x94, 0x0E, 0x40, 0x04, 0x7F, 0x00, -0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8E, 0xC4, 0xF1, 0xD5, 0x30, 0xE0, -0x03, 0x12, 0x4E, 0x87, 0x22, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x93, 0x70, -0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x70, 0xE4, 0x75, 0xF0, 0x08, 0x02, 0x08, -0xD6, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x24, 0x48, 0xF9, -0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x90, 0x93, 0x6D, 0xE0, 0xFF, 0x24, 0xE3, 0xF5, 0x82, -0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x22, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xEA, 0x7E, -0x00, 0x7F, 0x04, 0x02, 0x45, 0xC7, 0x90, 0x8E, 0x4B, 0xE0, 0x24, 0x04, 0x90, 0x8E, 0x2D, 0xF0, -0xA3, 0x74, 0x08, 0xF0, 0x22, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x22, 0x90, 0x93, -0x6B, 0xEF, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x22, 0xF5, 0x83, 0xEF, 0xF0, -0x90, 0x93, 0x4E, 0xE0, 0x04, 0xF0, 0x22, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF8, 0xE0, 0x34, -0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x22, -0x90, 0x8E, 0x11, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x90, 0x94, 0xAC, 0x12, 0x44, 0x12, -0xE4, 0x90, 0x94, 0xAF, 0xF0, 0xA3, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, -0x80, 0xF0, 0x22, 0x90, 0x8E, 0xB9, 0xE0, 0xFF, 0x90, 0x8E, 0x1E, 0xE0, 0xD3, 0x9F, 0x22, 0xFF, -0xEE, 0x54, 0x3F, 0x90, 0x8E, 0x50, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x93, 0x49, 0xE0, 0xFD, -0x90, 0x93, 0x48, 0xE0, 0x2D, 0x22, 0x90, 0x93, 0x70, 0xE4, 0x75, 0xF0, 0x02, 0x02, 0x08, 0xD6, -0xF0, 0x90, 0x8E, 0x21, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x24, 0x30, 0xF9, 0xE4, 0x34, -0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xE1, 0x75, 0x43, 0x02, 0x22, 0xF0, -0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x22, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, -0xDF, 0x4E, 0x22, 0x90, 0x93, 0xF8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x93, 0x6D, 0xE0, -0xFF, 0xC3, 0x94, 0x10, 0x22, 0x90, 0x93, 0x4C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x01, -0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x22, -0x90, 0x94, 0xF8, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x22, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, -0x22, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3D, 0xC2, -0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x22, -0x90, 0x93, 0xF7, 0xE0, 0xC3, 0x94, 0x0A, 0x22, 0xF0, 0xE4, 0x90, 0x93, 0x7B, 0xF0, 0xA3, 0x22, -0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x22, 0x90, 0x8E, 0x1B, 0xE0, 0x90, 0x05, 0x73, 0x22, -0x90, 0x8E, 0x12, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x19, 0xE0, 0x44, 0x10, 0xF0, 0x22, -0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0xC3, 0x13, 0x22, -0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF8, 0xE0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x22, -0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, 0x54, 0xDC +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x22, 0x12, 0x44, 0x20, 0x7F, 0x96, 0x7E, 0x02, 0x12, +0x8F, 0xE1, 0xEF, 0x60, 0x42, 0x31, 0xED, 0xFE, 0x12, 0xA6, 0xB4, 0x90, 0x95, 0x25, 0xEF, 0xF0, +0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x95, 0x25, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, +0xEF, 0xF0, 0x90, 0x95, 0x22, 0x12, 0x95, 0x9C, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x8E, +0x3F, 0x90, 0x95, 0x25, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x95, 0x22, 0x12, 0x44, 0x17, 0x12, 0x95, +0x34, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x01, 0x17, +0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x22, 0x90, 0x93, +0x3B, 0x51, 0xB9, 0xEF, 0xF0, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xD1, 0x3A, 0xE0, 0xFD, 0x90, 0x93, 0x64, 0xE0, 0x24, 0x2C, 0x12, +0x9C, 0x84, 0x90, 0x93, 0x64, 0xE0, 0x2F, 0x24, 0x30, 0xA3, 0xF0, 0xE0, 0xFD, 0x24, 0x04, 0xF1, +0xAD, 0xFE, 0x74, 0x05, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x31, 0xF5, 0x90, 0x90, +0x96, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x65, 0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34, 0xFC, 0x12, +0x5E, 0xEE, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x98, 0x12, 0x35, 0x26, 0x90, 0x93, +0x65, 0xE0, 0x24, 0x14, 0xF0, 0xE0, 0xFD, 0x12, 0x57, 0x18, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0x12, +0x53, 0x7D, 0x31, 0xF5, 0x90, 0x90, 0x9C, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x3C, 0x51, 0xB9, +0xEF, 0xF0, 0x90, 0x90, 0x92, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x4E, 0x60, 0x12, 0x90, 0x93, 0x64, +0xE0, 0x12, 0x5E, 0xE8, 0x8F, 0x43, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xA0, 0x12, 0x35, 0x26, 0x90, +0x93, 0x3D, 0x51, 0xB9, 0xEF, 0xF0, 0x12, 0x5E, 0xE8, 0x90, 0x90, 0x94, 0xA3, 0xE0, 0xF5, 0x43, +0x7B, 0x01, 0x7A, 0x90, 0x79, 0xC0, 0x02, 0x35, 0x26, 0xE0, 0xFF, 0x51, 0xC6, 0x90, 0x93, 0x64, +0x22, 0x90, 0x8E, 0x2E, 0xE0, 0xFF, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, +0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x93, 0x6E, 0x12, 0x93, 0x15, 0x90, 0x93, 0x86, 0x74, 0x18, 0xF0, 0x7E, 0x00, 0x7F, +0x80, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x8E, 0x12, 0x08, 0xAA, 0x90, 0x01, 0xC4, 0x74, +0xDA, 0xF0, 0x74, 0x82, 0xA3, 0xF0, 0x90, 0x93, 0x33, 0xE0, 0xFF, 0x51, 0xC6, 0x90, 0x93, 0x85, +0xEF, 0xF0, 0xF9, 0xE0, 0xFE, 0x24, 0x29, 0xD1, 0x3A, 0x74, 0x41, 0xF0, 0xEE, 0x24, 0x28, 0xFD, +0xE4, 0x33, 0xFC, 0x90, 0x93, 0x86, 0xE0, 0x7A, 0x00, 0x2D, 0xFE, 0xEA, 0x3C, 0x90, 0x93, 0x8A, +0xF0, 0xA3, 0xCE, 0xF0, 0x74, 0x28, 0x29, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x93, +0x70, 0xE0, 0xFD, 0x12, 0x7D, 0xC6, 0xB1, 0xDC, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, +0x93, 0x88, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x8E, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x03, +0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x93, 0x8A, 0x12, 0xA5, 0xB8, 0x90, 0x8F, +0xC4, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE, 0x02, 0x7E, 0xFE, 0x90, 0x93, 0x8A, 0xA3, 0xE0, 0xFD, +0x12, 0x53, 0x7B, 0xEE, 0xF0, 0x74, 0x00, 0x2D, 0x12, 0x53, 0x7D, 0xE0, 0x90, 0x93, 0x92, 0xF0, +0x90, 0x93, 0x8A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x90, 0x90, 0x59, 0xE0, 0x90, 0x93, +0x6E, 0xB4, 0x01, 0x0B, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD, 0x80, 0x09, 0xE0, +0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x20, 0xFD, 0x90, 0x93, 0x8C, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, +0x90, 0x93, 0x93, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x12, 0xF0, 0xD1, 0x09, 0xEF, 0x64, 0xFE, 0x70, +0x25, 0x90, 0x93, 0x8A, 0xA3, 0xE0, 0x24, 0x00, 0x12, 0xA5, 0x91, 0xC0, 0x03, 0x8B, 0x40, 0xD1, +0x2D, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0xD1, 0x2D, 0x7B, 0x01, 0x7A, 0x93, 0x79, +0x95, 0x12, 0x35, 0x26, 0x80, 0x56, 0x90, 0x93, 0x2E, 0xE0, 0xFF, 0xB4, 0x02, 0x26, 0x90, 0x93, +0x8A, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0xE4, +0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0x74, 0x20, 0xB1, 0xF8, 0x74, +0x20, 0xF0, 0x80, 0x28, 0xEF, 0xB4, 0x04, 0x24, 0x90, 0x93, 0x8A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, +0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, +0x74, 0xFC, 0x3E, 0xF5, 0x83, 0x74, 0x10, 0xB1, 0xF8, 0x74, 0x10, 0xF0, 0xD1, 0x09, 0xE4, 0x90, +0x93, 0x87, 0xF0, 0xF1, 0xB6, 0xFE, 0x90, 0x93, 0x8A, 0xA3, 0xE0, 0xFD, 0xEF, 0x2D, 0x12, 0x53, +0x7B, 0xEE, 0xF0, 0xF1, 0xB6, 0xFE, 0x74, 0x97, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, +0xEE, 0xB1, 0xD4, 0xE0, 0xB4, 0x08, 0xDC, 0xB1, 0xE6, 0x90, 0x93, 0x8A, 0xF1, 0xDF, 0x90, 0x93, +0x8A, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0xB1, 0xDC, 0xE4, 0x90, 0x94, 0x11, 0xF0, 0xE4, +0x90, 0x93, 0x87, 0xF0, 0xD1, 0x00, 0x50, 0x0F, 0x12, 0xA5, 0x99, 0xB1, 0xCD, 0xD1, 0x13, 0x12, +0x53, 0x7A, 0xE4, 0xB1, 0xD4, 0x80, 0xED, 0xF1, 0xE6, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xFB, 0xF0, +0x90, 0x93, 0x34, 0xE0, 0xFD, 0x12, 0xA0, 0x0A, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, +0x90, 0xAC, 0x7B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0xFF, 0x90, 0x93, 0x33, 0xE0, 0xC3, 0x9F, +0xFF, 0xE4, 0x94, 0x00, 0xFE, 0xEF, 0x78, 0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, +0x90, 0x93, 0x86, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, 0xCF, 0x24, 0x38, 0xCF, 0x34, 0x00, +0xFE, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0x7B, 0x63, 0xE4, 0xFD, 0x12, 0x39, 0x9C, 0x7B, 0x01, +0x7A, 0x93, 0x79, 0x8E, 0x90, 0xAC, 0xA0, 0x12, 0x44, 0x20, 0x7A, 0x93, 0x79, 0x71, 0x90, 0xAC, +0xA3, 0x12, 0x44, 0x20, 0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, 0x8F, 0x79, 0x80, 0x12, 0x35, +0x86, 0x90, 0x94, 0x11, 0xE0, 0x04, 0xF0, 0x90, 0x06, 0x31, 0xE0, 0x30, 0xE2, 0x06, 0xB1, 0xF0, +0x50, 0x02, 0x81, 0x8F, 0xB1, 0xF0, 0x40, 0x0A, 0x90, 0x06, 0x35, 0xE0, 0x44, 0x20, 0x90, 0x06, +0x34, 0xF0, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0xD1, 0x00, 0x50, 0x21, 0x12, 0xA5, 0x99, 0xB1, 0xCD, +0xD1, 0x13, 0x90, 0x93, 0x87, 0xE0, 0x24, 0x71, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, +0xFF, 0x90, 0x93, 0x85, 0x12, 0x53, 0x7A, 0xEF, 0xB1, 0xD4, 0x80, 0xDB, 0x90, 0x04, 0x1D, 0xE0, +0x60, 0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0x10, 0xF0, 0x7D, 0x1D, 0x12, 0x5D, 0x2C, 0xBF, +0x01, 0x06, 0xB1, 0xB8, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x94, 0x10, 0xE0, 0xFF, 0x7D, 0x1E, 0x12, +0x5A, 0x57, 0x80, 0x06, 0xB1, 0xB8, 0x90, 0x04, 0x25, 0xF0, 0x12, 0x5F, 0xE3, 0x90, 0x8E, 0x4A, +0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x5A, 0x0E, 0x74, 0xDA, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, +0x82, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x33, 0xE0, 0xFF, 0x90, 0x95, 0x29, +0x74, 0x08, 0xF0, 0x7B, 0x18, 0x7D, 0x01, 0x12, 0x5D, 0xDA, 0x90, 0x93, 0x85, 0xEF, 0xF0, 0x90, +0x93, 0x33, 0xE0, 0x22, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x8A, 0xE4, +0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x8A, 0xE4, 0x75, 0xF0, 0x08, 0x02, 0x08, 0xD6, +0x90, 0x94, 0x11, 0xE0, 0xC3, 0x94, 0x0A, 0x22, 0xF0, 0xE4, 0x90, 0x93, 0x95, 0xF0, 0xA3, 0x22, +0x90, 0x93, 0x87, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x22, 0x90, 0x93, 0x8A, 0xE4, 0x75, 0xF0, 0x02, +0x02, 0x08, 0xD6, 0xFD, 0xD1, 0x1C, 0x90, 0x93, 0x85, 0xEF, 0xF0, 0x22, 0xC3, 0xEE, 0x94, 0x01, +0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x75, 0x41, 0x8F, +0x75, 0x42, 0xC7, 0x75, 0x43, 0x02, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0x22, 0xD1, 0x61, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x0B, 0xD1, 0x37, 0xE0, 0x44, 0x10, 0xD1, +0x60, 0x44, 0x80, 0xF0, 0x22, 0xD1, 0x37, 0xE0, 0x54, 0xEF, 0xD1, 0x60, 0x44, 0x40, 0xF0, 0x22, +0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xE4, 0xFD, 0xFC, +0x90, 0x93, 0x3A, 0xF1, 0xA0, 0xAB, 0x05, 0x74, 0x01, 0x2B, 0x12, 0x57, 0x1A, 0xE0, 0xFE, 0x74, +0x00, 0x2B, 0x12, 0x53, 0x7D, 0x12, 0xA5, 0xCA, 0x90, 0x90, 0x8C, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, +0x03, 0x2B, 0x12, 0xA4, 0x65, 0xE0, 0xFE, 0x74, 0x02, 0x2B, 0x12, 0xA4, 0x81, 0xE0, 0x24, 0x00, +0xFF, 0xEA, 0x3E, 0x90, 0x90, 0x8E, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x05, 0x2B, 0x12, 0xA4, 0x89, +0xFE, 0x74, 0x04, 0x2B, 0xF1, 0xAD, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0x90, 0xF0, 0xA3, +0xEF, 0xF0, 0x74, 0x07, 0x2B, 0x12, 0xA4, 0x9B, 0xFE, 0x74, 0x06, 0x2B, 0xF1, 0x8F, 0x24, 0x00, +0xFF, 0xEA, 0x3E, 0x90, 0x90, 0x92, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x09, 0x2B, 0xD1, 0x64, 0xFE, +0x74, 0x08, 0x2B, 0x12, 0xA4, 0x92, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0x94, 0xF0, 0xA3, +0xEF, 0xF0, 0x22, 0x90, 0x8D, 0x3A, 0xE0, 0xFF, 0x90, 0x95, 0x12, 0xE0, 0xFB, 0x90, 0x95, 0x29, +0x74, 0x0A, 0xF0, 0x7D, 0x01, 0x12, 0x5D, 0xDA, 0x90, 0x95, 0x13, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, +0xF0, 0xFD, 0x90, 0x95, 0x11, 0xE0, 0xFF, 0xD1, 0x42, 0x90, 0x95, 0x13, 0xE0, 0xFE, 0xA3, 0xE0, +0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0xF1, 0x83, 0x44, 0x01, 0xF0, 0xF1, +0x83, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0x12, 0xA5, 0xC2, 0xE0, 0x44, 0xFA, 0xF0, +0x74, 0x11, 0x2C, 0x12, 0xA6, 0xBC, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF1, +0x8F, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, +0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF1, 0x7B, 0xE0, 0x54, +0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF1, 0x7B, 0xED, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0x22, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xEF, 0x60, 0x04, 0xD1, 0x6D, 0x31, 0xFE, 0x22, +0xE0, 0xFF, 0x51, 0xC6, 0x7C, 0x00, 0xAD, 0x07, 0x22, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x93, 0x87, 0xE0, 0xFF, 0x24, 0xC9, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x22, 0xF1, 0xD7, 0x12, 0x5E, 0xEA, 0x75, 0x43, 0x70, 0x7B, 0x01, +0x7A, 0x8E, 0x79, 0xE8, 0x02, 0x35, 0x26, 0x51, 0xC6, 0x7E, 0x00, 0x74, 0x00, 0x2F, 0x22, 0xE4, +0x75, 0xF0, 0x20, 0x02, 0x08, 0xD6, 0x7F, 0x64, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xF1, 0xD7, 0x12, +0x5E, 0xEA, 0x75, 0x43, 0x08, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x5A, 0x02, 0x35, 0x26, 0x12, 0x06, +0x89, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x53, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x06, 0x89, +0x90, 0x8E, 0x52, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, 0xAA, 0xF0, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x90, 0xE0, 0xFF, 0x90, 0x8D, 0x8F, 0xE0, 0xB5, 0x07, 0x04, +0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x41, 0x90, 0x8D, 0x8F, 0xE0, 0xFE, 0x75, 0xF0, +0x08, 0x90, 0x8D, 0x3F, 0x12, 0x44, 0x0B, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x40, +0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x78, 0x44, 0x90, 0x8D, 0x8F, +0x12, 0x81, 0x0E, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0x8F, 0xF0, +0x12, 0x69, 0x63, 0x90, 0x8D, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, +0x90, 0x8E, 0x27, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x8F, 0xF0, 0xA3, 0xF0, 0x22, 0x31, 0xA3, 0x11, +0x7F, 0xD1, 0xCE, 0x51, 0x46, 0x11, 0xB9, 0x71, 0x40, 0x12, 0x7F, 0xAC, 0x90, 0x93, 0x4E, 0xE0, +0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x93, 0x50, +0xF0, 0x90, 0x93, 0x4E, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x25, 0x7D, 0x00, 0x7B, +0x01, 0x7A, 0x8E, 0x79, 0xAF, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0x91, +0xD7, 0x12, 0x4E, 0xD4, 0x90, 0x8D, 0x07, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x2A, 0x31, 0x9C, 0x30, +0xE0, 0x02, 0x7E, 0x01, 0x90, 0x8E, 0xCE, 0x31, 0x9A, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0x8E, +0xCC, 0x31, 0x9A, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x8E, 0xCD, 0xEE, 0xF0, 0x90, 0xFD, 0x80, +0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x4A, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0x31, 0x93, 0x30, 0xE0, +0x02, 0x7F, 0x01, 0x90, 0x8E, 0xCE, 0x31, 0x91, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x8E, 0xCC, +0x31, 0x91, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x8D, 0x07, 0xE0, 0x64, 0x03, 0x70, +0x20, 0x31, 0x8A, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8E, 0xCE, 0x31, 0x88, 0x30, 0xE1, 0x02, +0x7F, 0x01, 0x90, 0x8E, 0xCC, 0x31, 0x88, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90, 0x8E, 0xCD, 0xEF, +0xF0, 0x90, 0x8E, 0xAF, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0x90, 0x90, 0xE2, 0xF0, 0xA3, 0xF0, 0x90, +0x90, 0xEA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90, 0xEE, 0x12, 0x08, 0x79, 0x00, +0x00, 0x00, 0x00, 0x90, 0x90, 0xE6, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x2A, +0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, +0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, +0x7E, 0x00, 0x22, 0xE4, 0xFD, 0xFF, 0x51, 0x4B, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0xED, 0x70, 0x12, +0x31, 0xE6, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0xDE, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, +0x80, 0x0F, 0x31, 0xE6, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0xDE, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, +0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x31, 0xF1, 0x90, 0x8E, 0x40, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, +0x74, 0x01, 0xA8, 0x07, 0x08, 0x22, 0x74, 0x30, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7D, 0x10, 0xED, 0x14, 0xF9, 0x24, 0x30, 0x31, +0xE9, 0xE0, 0x60, 0x39, 0x7C, 0x08, 0xEC, 0x14, 0x90, 0x95, 0x52, 0xF0, 0x74, 0x30, 0x29, 0x31, +0xE9, 0xE0, 0xFB, 0x7A, 0x00, 0x90, 0x95, 0x52, 0x71, 0x36, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, +0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x0F, 0xE9, 0x75, 0xF0, 0x08, +0xA4, 0xFF, 0x90, 0x95, 0x52, 0xE0, 0x2F, 0x04, 0xFF, 0x80, 0x06, 0xDC, 0xC9, 0xDD, 0xBB, 0x7F, +0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x7D, 0x02, 0x08, 0xAA, 0xEF, 0x13, 0x13, 0x13, 0x54, +0x1F, 0x22, 0x90, 0x93, 0x45, 0xE0, 0x30, 0xE0, 0x7A, 0x90, 0x93, 0x49, 0xE0, 0x04, 0xF0, 0x90, +0x93, 0x4C, 0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0x93, 0x45, 0x12, 0x9E, 0xD0, 0x30, 0xE0, 0x26, +0x90, 0x93, 0x4B, 0xE0, 0x70, 0x20, 0x90, 0x93, 0x48, 0xE0, 0xFE, 0xA3, 0xE0, 0xC3, 0x9E, 0x40, +0x15, 0x51, 0x4B, 0x30, 0xE0, 0x08, 0x51, 0xD4, 0x12, 0x7F, 0x79, 0xF0, 0x80, 0x08, 0x12, 0x67, +0xA5, 0x12, 0x7F, 0x79, 0xF0, 0x22, 0x90, 0x93, 0x49, 0xE0, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0xD3, +0x9F, 0x50, 0x30, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x1A, 0x90, 0x93, 0x4B, 0xE0, 0x70, 0x14, +0x7D, 0x08, 0xFF, 0x12, 0x5D, 0x8E, 0x90, 0x93, 0x4A, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x44, 0xE0, +0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x49, 0xF0, 0x90, +0x93, 0x4B, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x31, 0xA6, 0xE4, 0xFF, 0x7D, 0x01, 0x02, 0x6F, 0xC2, +0x90, 0x93, 0x45, 0xE0, 0xFD, 0x30, 0xE0, 0x4D, 0x90, 0x93, 0x4A, 0xE0, 0xFC, 0x60, 0x46, 0x71, +0x38, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, +0xEF, 0x5B, 0x60, 0x0B, 0xE4, 0x90, 0x93, 0x4A, 0xF0, 0x90, 0x93, 0x4C, 0x04, 0xF0, 0x22, 0x90, +0x93, 0x47, 0xE0, 0xD3, 0x9C, 0x50, 0x15, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, +0x51, 0xD4, 0x80, 0x03, 0x12, 0x67, 0xA5, 0x12, 0x7F, 0x79, 0xF0, 0x22, 0x12, 0x5D, 0x8A, 0x90, +0x93, 0x4A, 0xE0, 0x04, 0xF0, 0x22, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, +0x90, 0x93, 0x41, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3, 0x74, 0x0A, +0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x8E, 0x42, 0x91, 0x76, 0x30, 0xE0, 0x15, 0xEF, +0x54, 0xBF, 0x71, 0xA2, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, +0xF0, 0x12, 0x58, 0x58, 0xE4, 0xFF, 0x41, 0xE0, 0x90, 0x8E, 0x42, 0xE0, 0xFF, 0x12, 0x7F, 0xA5, +0x30, 0xE0, 0x1B, 0xEF, 0x54, 0x7F, 0x71, 0xA2, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, +0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x8E, 0x47, 0xE0, 0x60, 0x03, 0x12, 0x58, 0x58, 0x7F, 0x01, +0x41, 0xE0, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x43, 0x22, 0x90, 0x95, 0x3C, 0xEF, 0x71, +0x50, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x95, 0x3C, 0xE0, +0x6F, 0x60, 0x33, 0xC3, 0x90, 0x95, 0x3E, 0xE0, 0x94, 0x88, 0x90, 0x95, 0x3D, 0xE0, 0x94, 0x13, +0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x95, 0x3D, 0x12, 0x94, 0x9D, +0xD3, 0x90, 0x95, 0x3E, 0xE0, 0x94, 0x32, 0x90, 0x95, 0x3D, 0xE0, 0x94, 0x00, 0x40, 0xC2, 0x90, +0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xBB, 0x22, 0xEF, 0x60, 0x35, 0x90, 0x93, 0x30, 0xE0, 0xFF, 0x60, +0x03, 0x12, 0x87, 0xED, 0x90, 0x01, 0xC7, 0xE4, 0x12, 0x81, 0xEC, 0xF1, 0xB1, 0x90, 0x06, 0x09, +0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x12, 0x4B, 0x2B, 0xF1, 0xD1, 0x91, 0xEA, 0x91, 0x45, 0xF1, +0x74, 0x91, 0x7E, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x02, 0x6C, 0x7E, 0x7D, +0x08, 0xE4, 0xFF, 0x12, 0x6C, 0x67, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0xF1, 0xC9, 0x91, +0xAD, 0x91, 0x65, 0x01, 0xB9, 0xF1, 0x99, 0xF1, 0xB9, 0x30, 0xE0, 0x18, 0x90, 0x8E, 0x2C, 0xE0, +0xFF, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x0D, 0x90, 0x95, 0x01, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, +0x14, 0x12, 0x70, 0xCB, 0x22, 0x91, 0x6A, 0x02, 0x75, 0x44, 0x90, 0x8E, 0xAF, 0x91, 0x76, 0x30, +0xE0, 0x03, 0x12, 0x4E, 0xD4, 0x22, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0xE4, 0xFF, +0x74, 0x18, 0x91, 0xA2, 0x74, 0xBF, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, +0x74, 0x10, 0x91, 0xA2, 0x74, 0xB9, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xB1, 0x95, 0xB4, 0x06, +0xDF, 0x22, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x22, 0x91, 0xD7, 0x90, +0x93, 0x3F, 0xE0, 0xFF, 0xB1, 0x37, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x07, 0xE0, +0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, +0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, +0x7F, 0x8F, 0x12, 0x49, 0x47, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x9E, 0xF7, 0xAD, 0x07, 0x90, +0x01, 0xC4, 0x74, 0xEA, 0xF0, 0x74, 0x8C, 0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x1E, 0x12, 0x67, +0x9D, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x40, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, +0x06, 0x90, 0x01, 0xC7, 0x74, 0x41, 0xF0, 0x7F, 0x01, 0x02, 0x67, 0xAD, 0xB1, 0x9C, 0x90, 0x02, +0x87, 0xE0, 0x70, 0xF8, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0xEA, 0x04, 0x90, 0x01, +0xC4, 0xF0, 0x74, 0x8C, 0xA3, 0xF0, 0x22, 0x90, 0x93, 0x67, 0xEF, 0xF0, 0xE4, 0xFF, 0x74, 0x5A, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x04, 0xB1, 0x95, 0xB4, 0x08, 0xE7, 0x90, 0x90, 0x8A, 0xE0, 0x90, 0x04, 0x8C, 0xF0, 0x75, +0x40, 0x01, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xC9, 0x75, 0x43, 0x08, 0x7B, 0x01, 0x7A, 0x90, 0x79, +0x62, 0x12, 0x35, 0x26, 0x90, 0x93, 0x3F, 0xE0, 0x60, 0x1A, 0x90, 0x93, 0x67, 0xF1, 0xC1, 0x12, +0xA5, 0x8E, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x90, 0x75, 0x42, 0x5A, 0x75, 0x43, 0x32, 0xD0, +0x03, 0x12, 0x35, 0x26, 0x22, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0x22, 0x12, 0xA6, 0x82, 0x12, +0x81, 0xF5, 0x90, 0x93, 0x64, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x87, 0xE0, 0xF9, 0x90, 0x8E, +0xAF, 0xE0, 0x30, 0xE0, 0x72, 0xEC, 0xC3, 0x99, 0x50, 0x6D, 0x90, 0x93, 0x64, 0xE0, 0xFA, 0xA3, +0xE0, 0xFB, 0xF1, 0xD9, 0xAD, 0x07, 0xD1, 0x28, 0x12, 0xA5, 0xCA, 0x54, 0x3F, 0x90, 0x93, 0x66, +0xD1, 0xAC, 0xE0, 0x54, 0x03, 0xFB, 0xEF, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0xCF, 0x2B, 0xCF, 0x3A, +0x90, 0x93, 0x66, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x66, 0xD1, 0x85, 0x12, 0xA6, 0x67, +0x90, 0x93, 0x64, 0xEE, 0x8F, 0xF0, 0x12, 0xA6, 0xDC, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, +0x65, 0xE0, 0x9F, 0x90, 0x93, 0x64, 0xE0, 0x9E, 0x40, 0x14, 0x90, 0x8E, 0x2A, 0x12, 0xA5, 0xDE, +0xFE, 0xC3, 0x90, 0x93, 0x65, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x64, 0xE0, 0x9E, 0xF0, 0x90, 0x93, +0x64, 0x12, 0x9E, 0xE4, 0x0C, 0x80, 0x8E, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, +0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0xE4, +0xFC, 0xED, 0x2C, 0x24, 0x00, 0xD1, 0x37, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, 0xD1, 0x34, +0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, +0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, +0xD1, 0xC3, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, +0xE0, 0x44, 0x10, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x07, 0xEF, 0x5D, 0xC3, 0x60, +0x0A, 0xD1, 0x9F, 0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x03, 0xD1, 0x9F, 0xFF, 0x22, 0x74, +0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0x22, 0xF0, 0xA3, 0xEF, 0xF0, +0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, +0x54, 0xF8, 0xFF, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0x7E, 0x00, +0x7F, 0x62, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0x42, 0x12, 0x08, 0xAA, 0xF1, 0x7D, 0x12, +0x08, 0xAA, 0x90, 0x8E, 0x46, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x4D, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, +0x74, 0x0A, 0xF0, 0x90, 0x8E, 0x53, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xF1, 0x8A, 0x12, 0xA2, +0x44, 0xE4, 0xFD, 0xFF, 0x12, 0x5F, 0x02, 0x7D, 0x0C, 0x7F, 0x02, 0x12, 0x5F, 0x02, 0xF1, 0x9A, +0x90, 0x8D, 0x07, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x8E, 0x52, 0x74, 0xDD, 0xF0, 0x80, 0x0F, +0xEF, 0x90, 0x8E, 0x52, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, +0x79, 0x12, 0x4A, 0x5D, 0xEF, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x4A, 0x5D, +0xEF, 0x30, 0xE2, 0x06, 0x90, 0x8E, 0x64, 0x74, 0x02, 0xF0, 0x12, 0x7B, 0x68, 0xF1, 0x8A, 0x7F, +0x01, 0x12, 0x9B, 0x11, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x7E, 0x00, 0xFF, 0x7D, 0x00, 0x7B, +0x01, 0x7A, 0x8E, 0x79, 0xA8, 0x12, 0x08, 0xAA, 0xF1, 0xA1, 0xF1, 0xA9, 0xF1, 0x77, 0xE4, 0x90, +0x8E, 0xAA, 0xF0, 0x22, 0x12, 0x4E, 0x02, 0xE4, 0xFD, 0xFF, 0x02, 0x5A, 0x57, 0x7E, 0x00, 0x7F, +0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAB, 0x22, 0x90, 0x8E, 0x64, 0xE0, 0x24, 0x04, +0x90, 0x8E, 0x5F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0x22, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x5F, +0x02, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, +0x22, 0x90, 0x8E, 0x29, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x8E, 0xAF, 0xE0, 0xC4, 0x54, 0x0F, +0x22, 0xE0, 0xFF, 0x12, 0x82, 0xC6, 0x7E, 0x00, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, +0x22, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x1A, 0x12, 0x90, 0x2F, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x95, 0x1A, 0x12, 0x90, 0x23, 0xE0, 0x60, 0x21, 0xC3, 0x90, 0x95, 0x1D, 0xE0, +0x94, 0xE8, 0x90, 0x95, 0x1C, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, +0xF0, 0x7F, 0x00, 0x80, 0x09, 0x90, 0x95, 0x1C, 0x91, 0x19, 0x80, 0xD6, 0x7F, 0x01, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x22, 0x90, 0x93, 0x60, 0xEE, +0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x22, 0x90, 0x93, 0x70, 0x11, 0x2F, 0x90, 0x93, 0x78, 0xF0, 0x90, +0x93, 0x78, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x22, 0x90, 0x93, 0x71, 0xE0, 0x24, 0x04, 0x71, +0xEC, 0x12, 0x63, 0x99, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x72, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, +0x83, 0xEF, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x80, 0xD4, 0x78, 0xB9, 0x7C, 0x8E, 0x7D, +0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x72, 0x91, 0x10, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, +0x71, 0x12, 0x71, 0x0B, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x90, 0x31, 0x2E, 0x78, 0x6A, 0x7C, 0x93, +0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x96, 0x31, 0x27, 0x12, 0x64, 0xBC, 0x11, 0x36, 0xEF, +0x70, 0x02, 0x21, 0x26, 0x12, 0x67, 0x59, 0xFE, 0x90, 0x93, 0x6E, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, +0x06, 0xFF, 0xE4, 0x3E, 0x12, 0x66, 0x18, 0xEF, 0x64, 0x08, 0x70, 0x6A, 0x90, 0x93, 0x6F, 0xE0, +0x24, 0x07, 0xFF, 0x90, 0x93, 0x6E, 0x12, 0x66, 0x15, 0xEF, 0x70, 0x5A, 0x90, 0x93, 0x69, 0xF0, +0x90, 0x93, 0x69, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x25, 0x90, 0x93, 0x6F, 0xE0, 0x24, 0x18, +0xFD, 0x90, 0x93, 0x6E, 0xE0, 0x12, 0x63, 0x8C, 0x90, 0x93, 0x69, 0xE0, 0x24, 0x6A, 0xF5, 0x82, +0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x69, 0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, +0x6A, 0x7C, 0x93, 0x91, 0x27, 0xEF, 0x70, 0x1E, 0x90, 0x93, 0x6F, 0xE0, 0x24, 0x08, 0xFF, 0x90, +0x93, 0x6E, 0xE0, 0x34, 0x00, 0xFE, 0x12, 0x63, 0xC8, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, +0xC7, 0x74, 0x22, 0x12, 0x67, 0x9C, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x02, 0x06, 0x63, 0x7E, 0x00, +0x7F, 0x06, 0x02, 0x06, 0x63, 0x71, 0x12, 0x71, 0x0B, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x6A, 0x31, +0x2E, 0x91, 0x07, 0x7A, 0x40, 0x79, 0x70, 0x51, 0xDC, 0x78, 0x79, 0x7C, 0x93, 0x7D, 0x01, 0x7B, +0xFF, 0x7A, 0x40, 0x79, 0x80, 0x51, 0xDC, 0xE4, 0x90, 0x93, 0x8C, 0x12, 0x64, 0xBB, 0xA3, 0xE0, +0xFD, 0x71, 0x1E, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, 0xC4, 0x12, 0x67, 0x59, 0xCF, 0x24, 0x0E, +0xCF, 0x12, 0x66, 0x16, 0xEF, 0x64, 0x3A, 0x60, 0x02, 0x41, 0xC4, 0x12, 0x67, 0x59, 0xCF, 0x24, +0x30, 0xCF, 0x12, 0x66, 0x16, 0xEF, 0x64, 0x87, 0x60, 0x02, 0x41, 0xC4, 0x90, 0x93, 0x8C, 0x04, +0xF0, 0xE4, 0x90, 0x93, 0x89, 0xF0, 0x51, 0xCA, 0x94, 0x10, 0x50, 0x1A, 0x51, 0xFF, 0x12, 0x67, +0x64, 0xCD, 0x24, 0x38, 0x12, 0x63, 0x8B, 0x90, 0x93, 0x89, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, +0x34, 0x93, 0x51, 0xD1, 0x80, 0xE0, 0xE4, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0xFF, +0xC3, 0x94, 0x02, 0x40, 0x02, 0x41, 0xC4, 0x75, 0xF0, 0x38, 0xEF, 0x51, 0xE3, 0x20, 0xE0, 0x02, +0x41, 0xC4, 0xE4, 0x90, 0x93, 0x8B, 0xF0, 0x51, 0xEB, 0x90, 0x8E, 0xE9, 0x12, 0x44, 0x0B, 0xE0, +0xFE, 0x90, 0x93, 0x8B, 0xE0, 0xC3, 0x9E, 0x40, 0x02, 0x41, 0xBC, 0xEF, 0x75, 0xF0, 0x38, 0xA4, +0x24, 0x00, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xE0, 0x75, 0xF0, 0x10, 0xA4, 0x29, +0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x78, 0x79, 0x7C, 0x93, 0x51, 0xF4, 0x60, 0x02, 0x41, 0xAD, 0x90, +0x06, 0x33, 0xE0, 0x44, 0x01, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x89, 0xF0, 0x51, 0xCA, 0x94, +0x06, 0x50, 0x14, 0x51, 0xFF, 0x12, 0x67, 0x64, 0xCD, 0x24, 0x4A, 0x12, 0x63, 0x8B, 0x90, 0x93, +0x89, 0x71, 0xFE, 0x51, 0xD1, 0x80, 0xE6, 0xE4, 0x90, 0x93, 0x89, 0xF0, 0x51, 0xCA, 0x94, 0x10, +0x50, 0x0C, 0x12, 0x63, 0x77, 0x90, 0x93, 0x89, 0x71, 0xF5, 0x51, 0xD1, 0x80, 0xEE, 0x51, 0xEB, +0x51, 0xE3, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x19, 0xEF, 0x75, 0xF0, 0x38, 0xA4, 0x24, 0xF0, 0xF9, +0x74, 0x8E, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0x69, 0x7C, 0x93, 0x51, 0xF4, 0x70, 0x45, 0x80, +0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x63, 0x90, 0x93, 0x90, 0x12, 0x44, 0x20, 0x7A, 0x93, 0x79, +0x79, 0x90, 0x93, 0x93, 0x12, 0x44, 0x20, 0x90, 0x93, 0x8A, 0xE0, 0x75, 0xF0, 0x38, 0xA4, 0x24, +0xEA, 0xF9, 0x74, 0x8E, 0x35, 0xF0, 0xFA, 0x90, 0x93, 0x96, 0x12, 0x44, 0x20, 0xE4, 0x90, 0x93, +0x99, 0xF0, 0xA3, 0xF0, 0x7A, 0x93, 0x79, 0x69, 0x12, 0x5A, 0x62, 0x80, 0x07, 0x90, 0x06, 0x33, +0xE0, 0x44, 0x05, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0x04, 0xF0, 0x21, 0xD7, 0x90, 0x93, 0x8A, 0xE0, +0x04, 0xF0, 0x21, 0xBB, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0xC3, +0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0x04, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x10, +0x02, 0x06, 0x63, 0x90, 0x8E, 0xE8, 0x12, 0x44, 0x0B, 0xE0, 0x22, 0x90, 0x93, 0x8A, 0xE0, 0xFF, +0x75, 0xF0, 0x38, 0x22, 0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x45, 0xD5, 0xEF, 0x22, 0x90, +0x93, 0x62, 0xE0, 0xFD, 0x90, 0x93, 0x61, 0xE0, 0x2D, 0xFD, 0x22, 0x78, 0x63, 0x7C, 0x93, 0x7D, +0x01, 0x22, 0x90, 0x93, 0x60, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0x90, 0x93, +0x8D, 0x71, 0x15, 0x2F, 0xFF, 0xE4, 0x3E, 0xCF, 0x24, 0x06, 0xCF, 0x12, 0x66, 0x16, 0xBF, 0x86, +0x19, 0x90, 0x93, 0x8F, 0xE0, 0xFF, 0x90, 0x93, 0x8E, 0xE0, 0x2F, 0x71, 0xE4, 0xCF, 0x24, 0x07, +0xCF, 0x12, 0x66, 0x16, 0xBF, 0xDD, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x71, 0x12, 0xE4, +0xA3, 0xF0, 0x71, 0xD0, 0x50, 0x1B, 0x12, 0x64, 0xBC, 0x71, 0xD9, 0xE0, 0x24, 0xC0, 0xF5, 0x82, +0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xB5, 0x07, 0x1D, 0x90, 0x93, 0x63, 0xE0, 0x04, 0xF0, 0x80, +0xE1, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x30, 0xF0, 0x7F, 0x01, +0x12, 0x67, 0xAD, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x71, 0x12, 0x90, 0x90, 0x92, 0xE0, 0x70, +0x02, 0xA3, 0xE0, 0x60, 0x27, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0x71, 0xD0, 0x50, 0x21, 0x12, 0x64, +0xBC, 0x71, 0xD9, 0xE0, 0x24, 0xA0, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, +0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x63, 0xE0, 0x04, 0xF0, 0x80, 0xDE, 0x7F, 0x00, 0x22, 0x90, +0x06, 0x32, 0xE0, 0x44, 0x40, 0xF0, 0xE4, 0x90, 0x90, 0x9E, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, +0x90, 0x93, 0x63, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x22, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x63, 0x99, +0x90, 0x93, 0x63, 0x22, 0xFF, 0x90, 0x93, 0x8D, 0xE0, 0x34, 0x00, 0x22, 0xFF, 0x90, 0x93, 0x70, +0xE0, 0x34, 0x00, 0xFE, 0x22, 0xE0, 0x24, 0x69, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0x22, 0xE0, 0x24, +0x63, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0x22, 0x78, 0x69, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x22, +0x7E, 0x00, 0x7F, 0x06, 0x12, 0x45, 0xD5, 0xEF, 0x22, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, +0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xDA, 0x7E, +0x00, 0x7F, 0x04, 0x02, 0x45, 0xD5, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x91, +0x20, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, +0x90, 0x93, 0x54, 0xF0, 0xA3, 0xF0, 0x91, 0x36, 0xEF, 0x64, 0x01, 0x60, 0x39, 0xC3, 0x90, 0x93, +0x55, 0xE0, 0x94, 0x88, 0x90, 0x93, 0x54, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, +0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x1B, 0x90, 0x93, 0x54, 0x91, 0x9D, +0xD3, 0x90, 0x93, 0x55, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x54, 0xE0, 0x94, 0x00, 0x40, 0xC7, 0x90, +0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xC0, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0xE4, 0x75, 0xF0, +0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0x01, 0x01, 0xE0, 0x44, +0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x91, 0x20, 0x90, 0x01, 0x99, 0xE0, 0x44, +0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0xE4, 0x90, 0x95, 0x4C, 0xF0, 0xA3, 0xF0, +0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x20, 0xC3, 0x90, 0x95, 0x4D, 0xE0, 0x94, 0xD0, 0x90, 0x95, +0x4C, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, +0x90, 0x95, 0x4C, 0x91, 0x19, 0x80, 0xD9, 0x7F, 0x01, 0x22, 0x11, 0x2C, 0xA3, 0xF0, 0x90, 0x93, +0x62, 0xE0, 0xFD, 0xC3, 0x94, 0x04, 0x50, 0x29, 0x90, 0x93, 0x61, 0xE0, 0x24, 0x10, 0x12, 0x67, +0x63, 0xFE, 0x12, 0x63, 0x99, 0x90, 0x93, 0x62, 0xE0, 0x24, 0x98, 0xF5, 0x82, 0xE4, 0x34, 0x90, +0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x62, 0xE0, 0x04, 0xF0, 0x80, +0xCD, 0x7F, 0x01, 0x22, 0x90, 0x95, 0x1E, 0xEF, 0xF0, 0xA3, 0x12, 0x44, 0x20, 0x90, 0x95, 0x43, +0xE0, 0xFE, 0x04, 0xF0, 0x12, 0x7F, 0xE5, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, +0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x1F, 0x12, 0x5D, 0x0E, 0x75, 0x43, 0x02, +0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x1E, 0xE0, 0x24, 0x02, 0xF9, +0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x44, 0x17, +0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x95, 0x1F, 0xB1, +0x9C, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x12, 0x44, 0x17, 0x90, +0x00, 0x0E, 0x02, 0x06, 0xA2, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, +0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, +0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0x90, 0x95, 0x36, +0x12, 0x44, 0x20, 0xE4, 0xFF, 0x90, 0x95, 0x36, 0x12, 0x44, 0x17, 0x8F, 0x82, 0x75, 0x83, 0x00, +0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0x12, 0x8D, 0x95, 0xB4, +0x10, 0xE3, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x75, 0x15, +0x10, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x02, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, +0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x07, +0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, +0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, +0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x49, +0xF0, 0x74, 0x96, 0xA3, 0xF0, 0x90, 0x93, 0x40, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, +0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x74, +0x49, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x96, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x8D, +0x01, 0x12, 0x4D, 0xFA, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x23, 0xF0, 0xA3, 0xE4, 0xF0, +0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, +0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, +0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, +0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, +0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, +0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x01, +0xCF, 0xE0, 0x90, 0x94, 0x12, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, +0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, +0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x4D, 0xB5, 0x90, 0x00, 0x03, 0xE0, 0x54, +0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x49, 0x47, 0x80, 0xFE, 0x22, 0xE4, 0xFF, 0x12, 0x6A, 0xD9, 0xBF, +0x01, 0x12, 0x90, 0x8E, 0x47, 0xE0, 0x60, 0x0C, 0x12, 0x7F, 0xDE, 0x64, 0x02, 0x60, 0x02, 0x80, +0x04, 0x12, 0x5F, 0x7E, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x18, 0x90, 0x8D, 0x39, 0xE0, 0xFF, +0x90, 0x95, 0x29, 0x74, 0x09, 0xF0, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x5D, 0xDA, 0x90, 0x95, 0x4E, +0x12, 0x5F, 0xDE, 0x22, 0xE4, 0xF5, 0x57, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x57, 0x54, 0xC0, 0x70, +0x08, 0xF1, 0xBA, 0x54, 0xFD, 0xF0, 0x02, 0x58, 0x58, 0xE5, 0x57, 0x30, 0xE6, 0x1F, 0x90, 0x8E, +0x47, 0xE0, 0x64, 0x01, 0x70, 0x19, 0x90, 0x8E, 0x4B, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x7F, 0xDE, +0x64, 0x02, 0x60, 0x04, 0xF1, 0x45, 0x80, 0x07, 0x12, 0x5F, 0x7E, 0x80, 0x02, 0xF1, 0xBA, 0xE5, +0x57, 0x90, 0x8E, 0x4B, 0x30, 0xE7, 0x0E, 0xE0, 0x44, 0x02, 0x12, 0x50, 0x0B, 0x90, 0x8E, 0x42, +0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x8E, 0x4B, 0xE0, 0x54, 0xFE, +0xF0, 0x22, 0x90, 0x8E, 0x47, 0xE0, 0x60, 0x03, 0x12, 0x5F, 0xA7, 0x22, 0x90, 0x8E, 0x47, 0xE0, +0x60, 0x03, 0x12, 0x6D, 0x27, 0x22, 0x90, 0x8E, 0x47, 0xE0, 0x60, 0x10, 0x90, 0x06, 0x92, 0xE0, +0x30, 0xE1, 0x03, 0x02, 0xA0, 0x21, 0x12, 0x6E, 0xFE, 0x12, 0x58, 0x58, 0x22, 0x12, 0x9B, 0x5E, +0x90, 0x94, 0x19, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, +0x12, 0x5F, 0x02, 0x90, 0x94, 0x19, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, +0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x71, 0x03, 0x90, 0x95, 0x31, +0x74, 0x02, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0x90, 0x8E, 0x43, 0x12, +0x7F, 0xA4, 0x30, 0xE0, 0x02, 0x01, 0xDC, 0x90, 0x8E, 0x42, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x8E, +0x64, 0xE0, 0x24, 0x04, 0x90, 0x8E, 0x5C, 0xF0, 0x90, 0x8E, 0x64, 0xE0, 0x24, 0x03, 0x90, 0x8E, +0x5B, 0xF0, 0x80, 0x0D, 0x90, 0x8E, 0x5C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x5B, 0x14, 0xF0, 0x0B, +0x0B, 0x90, 0x8E, 0x5B, 0xE0, 0xFA, 0x90, 0x8E, 0x5A, 0xE0, 0xD3, 0x9A, 0x50, 0x0E, 0x90, 0x8E, +0x4F, 0xEB, 0xF0, 0x90, 0x8E, 0x5C, 0xE0, 0xC3, 0x9D, 0x2C, 0x80, 0x11, 0xC3, 0xED, 0x9A, 0x2B, +0x90, 0x8E, 0x4F, 0xF0, 0x90, 0x8E, 0x5B, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x8E, 0x5F, +0xF0, 0x90, 0x8E, 0x5C, 0xE0, 0xFF, 0x24, 0x0A, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x8E, 0x5F, 0x11, +0xE8, 0x40, 0x04, 0xEF, 0x24, 0x0A, 0xF0, 0x90, 0x8E, 0x5F, 0xE0, 0xFF, 0x24, 0x23, 0xFD, 0xE4, +0x33, 0xFC, 0x90, 0x8E, 0x4F, 0x11, 0xE8, 0x40, 0x04, 0xEF, 0x24, 0x23, 0xF0, 0x90, 0x8E, 0x5F, +0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x8E, 0x53, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xE0, +0x6F, 0x70, 0x01, 0xE4, 0x60, 0x02, 0x71, 0x48, 0x71, 0x40, 0x80, 0x07, 0x90, 0x8E, 0x44, 0xE0, +0x44, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, +0x80, 0x98, 0x22, 0x71, 0x52, 0x40, 0x32, 0x90, 0x8E, 0x61, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0xA3, +0xE0, 0xFF, 0x90, 0x8E, 0x61, 0xE0, 0xD3, 0x9F, 0x50, 0x1F, 0x90, 0x8E, 0x59, 0xE0, 0x04, 0x31, +0x2A, 0x12, 0x57, 0xBE, 0x90, 0x8E, 0x60, 0xF0, 0xFB, 0x90, 0x8E, 0x59, 0xE0, 0xFF, 0xA3, 0xE0, +0xFD, 0x90, 0x95, 0x31, 0x74, 0x04, 0xF0, 0x11, 0x23, 0x22, 0xF0, 0x90, 0x8E, 0x50, 0xE0, 0x75, +0xF0, 0x03, 0xA4, 0x24, 0xFE, 0x22, 0xE4, 0x90, 0x94, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, 0x51, +0x0C, 0x12, 0x43, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x12, +0x51, 0x26, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, +0x43, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0x12, 0x51, 0x26, 0x78, 0x18, +0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0xD5, 0x90, 0x8E, +0x96, 0x12, 0x08, 0x6D, 0x90, 0x8E, 0x9A, 0x12, 0x43, 0xF3, 0x90, 0x8E, 0x96, 0x12, 0x43, 0xFF, +0xC3, 0x12, 0x43, 0xE2, 0x40, 0x41, 0x90, 0x8E, 0x42, 0xE0, 0x90, 0x8E, 0x9A, 0x30, 0xE0, 0x10, +0x51, 0xE7, 0xFF, 0x90, 0x8E, 0x64, 0xE0, 0x24, 0x04, 0x2F, 0xFF, 0x90, 0x8E, 0x9E, 0x80, 0x06, +0x51, 0xE7, 0xFF, 0x90, 0x8E, 0x9F, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0x90, 0x94, 0x15, 0xF0, 0x90, +0x94, 0x15, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x0E, 0x74, 0x65, 0x2F, 0x71, 0x38, 0xE0, 0x04, +0xF0, 0x90, 0x8E, 0x5D, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x5D, 0xE0, 0xFF, 0xD3, 0x90, 0x8E, 0xA1, +0xE0, 0x9F, 0x90, 0x8E, 0xA0, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x41, 0xB4, 0x51, 0xC6, 0x51, 0xBD, +0x50, 0x1D, 0x51, 0xD0, 0xFF, 0x90, 0x94, 0x16, 0xE0, 0xD3, 0x9F, 0x40, 0x0A, 0x90, 0x94, 0x14, +0xE0, 0x90, 0x94, 0x17, 0xF0, 0x80, 0x08, 0x90, 0x94, 0x14, 0xE0, 0x04, 0xF0, 0x80, 0xDF, 0x51, +0xC6, 0x51, 0xBD, 0x50, 0x2D, 0x51, 0xD0, 0xFF, 0xC3, 0x90, 0x8E, 0xA1, 0xE0, 0x9F, 0xFF, 0x90, +0x8E, 0xA0, 0xE0, 0x94, 0x00, 0xFE, 0x90, 0x94, 0x16, 0xE0, 0xD3, 0x9F, 0xE4, 0x9E, 0x40, 0x0A, +0x90, 0x94, 0x14, 0xE0, 0x90, 0x94, 0x18, 0xF0, 0x80, 0x08, 0x90, 0x94, 0x14, 0xE0, 0x04, 0xF0, +0x80, 0xCF, 0x90, 0x94, 0x17, 0xE0, 0x90, 0x8E, 0x62, 0xF0, 0x90, 0x94, 0x18, 0xE0, 0x90, 0x8E, +0x63, 0x51, 0xB5, 0x94, 0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x8E, 0x5A, 0xF0, 0xE4, 0x80, +0x09, 0xE4, 0x90, 0x8E, 0x5A, 0x51, 0xB5, 0x74, 0x0A, 0x9F, 0x90, 0x8E, 0x59, 0xF0, 0x90, 0x8E, +0x62, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x8E, 0x60, 0xF0, 0x90, 0x8E, 0x42, 0xE0, 0x30, +0xE0, 0x05, 0x90, 0x8E, 0x9E, 0x80, 0x03, 0x90, 0x8E, 0x9F, 0xE0, 0xFF, 0x90, 0x8E, 0x60, 0xE0, +0x2F, 0x04, 0xF0, 0x90, 0x8E, 0x60, 0xE0, 0xC3, 0x94, 0x0A, 0x50, 0x03, 0x74, 0x0A, 0xF0, 0x90, +0x8E, 0x60, 0xE0, 0x24, 0x02, 0xF0, 0x71, 0x03, 0x90, 0x95, 0x31, 0x74, 0x03, 0xF0, 0x11, 0x23, +0xE4, 0xFF, 0x71, 0x11, 0x22, 0xF0, 0x90, 0x8E, 0x62, 0xE0, 0xFF, 0xC3, 0x22, 0x90, 0x94, 0x14, +0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x22, 0xE4, 0x90, 0x94, 0x16, 0xF0, 0x90, 0x94, 0x14, 0xF0, 0x22, +0x74, 0x65, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x94, 0x16, 0xE0, +0x2F, 0xF0, 0x90, 0x8E, 0xA2, 0xE0, 0x22, 0x12, 0x43, 0xFF, 0x90, 0x8E, 0x96, 0x12, 0x43, 0xF3, +0x12, 0x42, 0x9D, 0x78, 0x0A, 0x12, 0x08, 0x47, 0x90, 0x8E, 0x5F, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, +0x9E, 0x2F, 0x22, 0x90, 0x8E, 0x59, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x8E, 0x60, 0xE0, 0xFB, +0x22, 0xE4, 0xFE, 0x74, 0x65, 0x2E, 0x71, 0x38, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x2D, 0xF4, 0xE4, +0x90, 0x8E, 0x5E, 0xF0, 0x90, 0x8E, 0x5D, 0xF0, 0x90, 0x8E, 0x61, 0xF0, 0xEF, 0xB4, 0x01, 0x07, +0xA3, 0x74, 0x2D, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x22, +0x90, 0x8E, 0x44, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x8E, 0x53, 0xA3, 0xE0, 0x90, 0x05, 0x58, +0xF0, 0x22, 0x90, 0x8E, 0xA4, 0xE0, 0xFF, 0x90, 0x8E, 0x50, 0xE0, 0xD3, 0x9F, 0x22, 0xE4, 0x90, +0x94, 0x1A, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4A, 0x5D, 0x90, 0x94, 0x1A, 0xEF, +0xF0, 0x7F, 0x83, 0x12, 0x4A, 0x5D, 0xAE, 0x07, 0x90, 0x94, 0x1A, 0xE0, 0xFF, 0xB5, 0x06, 0x01, +0x22, 0xC3, 0x90, 0x94, 0x1C, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x1B, 0xE0, 0x94, 0x00, 0x40, 0x0D, +0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x94, 0x1A, 0xE0, 0xFF, 0x22, 0x90, 0x94, 0x1B, +0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, +0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, +0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x94, 0x15, 0xF0, 0xA3, 0xF0, 0x90, 0x06, +0x32, 0xE0, 0x44, 0x20, 0xF0, 0x71, 0xA9, 0xEF, 0x64, 0x01, 0x70, 0x71, 0x90, 0x93, 0x3B, 0xE0, +0xFF, 0x90, 0x95, 0x29, 0x74, 0x0D, 0xF0, 0x7B, 0x08, 0x7D, 0x01, 0x12, 0x5D, 0xDA, 0x91, 0xAD, +0x90, 0x94, 0x12, 0x91, 0x67, 0x90, 0x94, 0x14, 0xEF, 0xF0, 0x90, 0x94, 0x12, 0x12, 0x5F, 0xF6, +0x7B, 0x01, 0xE4, 0xFD, 0x12, 0x7D, 0xC6, 0x90, 0x94, 0x14, 0xE0, 0xFF, 0x90, 0x94, 0x13, 0xE0, +0x2F, 0xFF, 0x90, 0x94, 0x12, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0x90, +0x94, 0x15, 0xF0, 0xA3, 0xEF, 0xF0, 0x91, 0xB6, 0x91, 0x5E, 0x90, 0x93, 0x3B, 0xE0, 0xFB, 0xE4, +0xFF, 0x12, 0x55, 0x4A, 0x91, 0x5E, 0x90, 0x93, 0x37, 0xE0, 0xFB, 0x7F, 0x11, 0x12, 0x55, 0x4A, +0x12, 0x5F, 0xE3, 0x90, 0x90, 0x9E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x22, 0x90, 0x94, +0x15, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x22, 0xA3, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0xFD, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, +0x30, 0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, 0xED, 0x30, 0xE6, 0x08, 0xAF, 0x03, 0x91, +0xE8, 0xAE, 0x07, 0x80, 0x02, 0xE4, 0xFE, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x90, 0x94, 0x12, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x90, 0x90, 0x96, 0xE4, 0x75, 0xF0, 0x01, 0x12, +0x08, 0xD6, 0x90, 0x90, 0x96, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x04, 0x2E, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0x96, 0xA3, 0xE0, 0xFF, 0x74, 0x05, 0x2E, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, +0x20, 0xE0, 0x05, 0x90, 0x93, 0x2E, 0x80, 0x03, 0x90, 0x93, 0x2F, 0xE0, 0x90, 0x90, 0x8B, 0xF0, +0x90, 0x90, 0x8B, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, +0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08, +0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x90, 0x02, 0x86, 0x60, 0x06, 0xE0, 0x44, 0x04, +0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8D, 0x06, 0xED, 0xF0, 0x22, 0x90, 0x01, 0xC4, +0x74, 0x3D, 0xF0, 0x74, 0x9D, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x4A, 0x5D, 0xEF, 0x20, 0xE0, 0xF7, +0x74, 0x3D, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x9D, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0xEF, 0x12, 0x71, 0xE1, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xF5, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x54, 0xED, +0xF0, 0xE4, 0xFE, 0xFD, 0xEF, 0xB4, 0x01, 0x0D, 0xEB, 0xB4, 0x02, 0x03, 0x0D, 0x80, 0x06, 0xEB, +0xB4, 0x01, 0x02, 0x7D, 0x02, 0xAF, 0x06, 0xEF, 0xC4, 0x54, 0xF0, 0x4D, 0xFF, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xE4, 0xFE, 0xEF, 0x54, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xEF, 0x54, 0x1F, 0xFF, +0xED, 0x60, 0x2C, 0x14, 0x60, 0x1E, 0x24, 0xFD, 0x60, 0x0F, 0x24, 0xFE, 0x70, 0x2A, 0xEF, 0x25, +0xE0, 0xFF, 0xC3, 0x74, 0xDE, 0x9F, 0xFE, 0x80, 0x1F, 0xEF, 0x25, 0xE0, 0xFF, 0xC3, 0x74, 0xF2, +0x9F, 0xFE, 0x80, 0x14, 0xEF, 0x25, 0xE0, 0xFF, 0xC3, 0x74, 0x06, 0x9F, 0xFE, 0x80, 0x09, 0xEF, +0x25, 0xE0, 0xFF, 0xC3, 0x74, 0x10, 0x9F, 0xFE, 0xAF, 0x06, 0x22, 0xD3, 0xEF, 0x64, 0x80, 0x94, +0x1C, 0x40, 0x07, 0xEF, 0x64, 0x80, 0x94, 0x94, 0x40, 0x03, 0x7F, 0x00, 0x22, 0xC3, 0xEF, 0x64, +0x80, 0x94, 0x80, 0x40, 0x03, 0x7F, 0x64, 0x22, 0xEF, 0x24, 0x64, 0xFF, 0x22, 0x7B, 0x01, 0x7A, +0x93, 0x79, 0x54, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0x93, 0x54, +0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0x93, 0x4D, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, +0x93, 0x4D, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, +0x37, 0x4E, 0x90, 0x93, 0x57, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, +0x93, 0x5B, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x57, 0xD1, 0xA8, 0x60, 0x17, 0x90, 0x93, 0x57, 0xD1, +0x9F, 0x90, 0x93, 0x57, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x57, 0xD1, 0x96, 0x7F, 0x00, 0x7E, 0x08, +0x12, 0x38, 0x45, 0x90, 0x93, 0x5B, 0xD1, 0xA8, 0x60, 0x17, 0x90, 0x93, 0x5B, 0xD1, 0x9F, 0x90, +0x93, 0x5B, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x5B, 0xD1, 0x96, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, +0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x43, 0xF3, 0x90, 0xAA, 0xB9, 0x02, 0x08, 0x6D, 0x12, +0x43, 0xF3, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x22, 0x12, 0x43, 0xF3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, +0xFE, 0xFD, 0xFC, 0xEF, 0x22, 0x90, 0x93, 0x41, 0xD1, 0xD0, 0x30, 0xE0, 0x0D, 0x7B, 0x00, 0x7A, +0x00, 0x79, 0x00, 0xD1, 0xD7, 0x04, 0xF0, 0x02, 0x5B, 0xF0, 0x02, 0x5D, 0x8A, 0x90, 0x8E, 0x43, +0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0x94, 0xC8, 0x12, 0x44, 0x20, 0xE4, 0x90, 0x94, +0xCB, 0xF0, 0xA3, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3, +0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE2, 0x03, 0x7F, 0x04, +0x22, 0x90, 0x02, 0x86, 0xE0, 0x7F, 0x01, 0x20, 0xE1, 0x02, 0x7F, 0x02, 0x22, 0x90, 0x8E, 0xB1, +0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x0A, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x03, 0x12, 0x67, +0x9D, 0x90, 0x8E, 0xB8, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0x8E, 0xB2, 0xE0, 0xC4, 0x54, 0x0F, 0x20, +0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, 0x05, 0x74, +0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x02, 0x67, 0x9D, 0x90, 0x93, 0xC7, 0x12, 0x44, 0x20, +0x90, 0x93, 0xCA, 0x12, 0x5D, 0x0E, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x58, 0x12, +0x35, 0x26, 0x90, 0x93, 0xC7, 0x12, 0x5D, 0x0E, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, +0x68, 0x12, 0x35, 0x26, 0x90, 0x93, 0xCD, 0x12, 0x43, 0xF3, 0x90, 0x8F, 0x78, 0x12, 0x08, 0x6D, +0x90, 0x93, 0xD1, 0xE0, 0x90, 0x8F, 0x7F, 0xF0, 0x22, 0x90, 0x8E, 0xB8, 0xE0, 0x30, 0xE0, 0x03, +0x7F, 0x01, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x20, 0xE5, 0x10, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, +0x09, 0x90, 0x01, 0xC7, 0x74, 0x25, 0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x60, 0x08, +0x90, 0x93, 0x31, 0xE0, 0xFF, 0x12, 0x5E, 0x81, 0x22, 0xEF, 0x60, 0x08, 0x90, 0x93, 0x36, 0xE0, +0xFF, 0x12, 0x87, 0xC6, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, 0x3E, 0x90, 0x93, 0x34, 0x12, 0x87, +0xA0, 0x12, 0xA5, 0x8E, 0x12, 0x7E, 0xED, 0x90, 0x93, 0x64, 0x12, 0x5D, 0x0E, 0x75, 0x43, 0x40, +0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x80, 0x12, 0x35, 0x26, 0xE4, 0xFD, 0x7F, 0x03, 0x12, 0x30, 0xCE, +0x90, 0x93, 0x35, 0xE0, 0x12, 0xA0, 0x0A, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, +0x39, 0xD6, 0x7D, 0x01, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x22, 0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0, +0x78, 0x03, 0x22, 0xEF, 0x60, 0x0A, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x80, 0xF0, 0x12, 0x51, 0x2D, +0x22, 0x11, 0x5A, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, +0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0xFE, 0xF0, 0x90, 0x8E, 0xA6, 0xE0, +0xC3, 0x13, 0x54, 0x7F, 0x90, 0x94, 0xFF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, +0x50, 0x20, 0x90, 0x8E, 0x42, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x8E, 0x42, 0xE0, 0x13, 0x13, +0x13, 0x54, 0x1F, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, +0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x11, 0x64, 0xEF, 0x64, 0x01, 0x70, 0x48, 0x90, 0x8E, 0x4B, 0xE0, 0xFF, +0x54, 0x03, 0x70, 0x3F, 0x90, 0x8E, 0x49, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x35, 0xEF, 0x20, +0xE2, 0x31, 0x90, 0x8E, 0x4B, 0xE0, 0x20, 0xE4, 0x2A, 0x90, 0x8E, 0x43, 0xE0, 0x13, 0x13, 0x54, +0x3F, 0x30, 0xE0, 0x1F, 0x90, 0x8E, 0xAA, 0xE0, 0x70, 0x19, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, +0x12, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x04, 0x7F, +0x01, 0x80, 0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, +0x70, 0x24, 0x90, 0x8E, 0x4D, 0x74, 0x02, 0xF0, 0x80, 0x13, 0xED, 0x70, 0x06, 0x90, 0x8E, 0xA7, +0xE0, 0x80, 0x02, 0xED, 0x14, 0x90, 0x8E, 0x4D, 0xF0, 0x90, 0x8E, 0x4D, 0xE0, 0xA3, 0xF0, 0x90, +0x8E, 0x43, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x8E, 0xAB, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x30, +0x90, 0x02, 0x87, 0xE0, 0x70, 0x33, 0x90, 0x01, 0x00, 0xE0, 0x64, 0x3F, 0x70, 0x2B, 0x90, 0x8E, +0xAF, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x02, 0x82, 0xE0, 0x70, 0x1E, 0x90, 0x8E, 0xB8, 0xE0, 0x20, +0xE0, 0x17, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x10, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE3, 0x09, +0x90, 0x04, 0x1D, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x8E, 0x4A, 0xE0, +0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0x31, 0x07, 0xBF, 0x01, 0x02, 0x31, 0x68, 0x22, 0x90, 0x8E, +0x42, 0xE0, 0x30, 0xE0, 0x02, 0x31, 0x4C, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, +0x4D, 0x2C, 0x12, 0x4F, 0xD2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x2E, 0x12, 0x6A, 0xB6, +0x70, 0x29, 0x90, 0x8E, 0x43, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x5A, 0x57, +0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0x5D, 0x8A, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x42, +0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x12, 0x5F, 0x02, 0x22, 0xE4, 0x90, 0x94, 0x19, +0xF0, 0x90, 0x8E, 0x47, 0xE0, 0x60, 0x6E, 0x12, 0x6A, 0xB6, 0x70, 0x69, 0x51, 0x26, 0x12, 0x51, +0x0C, 0x12, 0x43, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x12, +0x51, 0x26, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, +0x43, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0x12, 0x51, 0x26, 0x78, 0x18, +0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x51, 0x36, 0x44, 0x80, 0xF0, +0x90, 0x94, 0x19, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x8E, 0x4E, 0xF0, 0x04, 0x60, 0x17, 0x51, 0x2E, +0xE4, 0x90, 0x94, 0xFE, 0xF0, 0x90, 0x8E, 0x4F, 0x12, 0x50, 0x14, 0x90, 0x8E, 0x4A, 0xE0, 0x20, +0xE2, 0x03, 0x12, 0x58, 0x61, 0x22, 0x90, 0x8E, 0x4D, 0xE0, 0x90, 0x05, 0x73, 0x22, 0x90, 0x8E, +0x4B, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x12, 0x43, 0xD5, 0x90, 0x8E, 0x9A, 0x12, 0x08, 0x6D, 0x90, +0x8E, 0x43, 0xE0, 0x22, 0x90, 0x8E, 0x9E, 0x74, 0x04, 0xF0, 0xA3, 0x14, 0xF0, 0xA3, 0xE4, 0xF0, +0xA3, 0x74, 0x64, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x8F, 0x74, 0x7D, 0x0C, +0x7F, 0x01, 0x02, 0x5F, 0x02, 0x90, 0x95, 0x11, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x95, 0x5B, 0xEF, 0xF0, 0x90, 0x8D, 0x3A, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, +0x70, 0x3D, 0x90, 0x8E, 0x4A, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0x95, 0x5B, 0xE0, 0x70, 0x2F, +0x90, 0x8E, 0x42, 0xE0, 0x54, 0x7F, 0xF0, 0x12, 0x8F, 0xA1, 0x12, 0x8F, 0x9A, 0x80, 0x1D, 0x90, +0x8E, 0x4A, 0xE0, 0x64, 0x06, 0x70, 0x18, 0x90, 0x95, 0x5B, 0xE0, 0x60, 0x12, 0x90, 0x8E, 0x42, +0xE0, 0x54, 0xBF, 0xF0, 0x51, 0xC4, 0x90, 0x8E, 0x4A, 0x74, 0x04, 0xF0, 0x12, 0x8F, 0x77, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x22, +0x90, 0x93, 0x6D, 0xED, 0xF0, 0x90, 0x93, 0x6B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x51, 0xED, 0x90, +0x93, 0x6B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x02, 0x82, 0xDA, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x2F, 0xE0, 0xFD, 0xB4, 0x02, 0x07, 0x71, 0xEC, 0x74, 0x08, +0xF0, 0x80, 0x09, 0xED, 0xB4, 0x04, 0x05, 0x71, 0xEC, 0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, +0x60, 0x02, 0x61, 0xE7, 0x90, 0x8F, 0xC1, 0xE0, 0xFF, 0x64, 0xFE, 0x70, 0x02, 0x61, 0xE7, 0xEF, +0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, 0x03, 0x60, 0x02, 0x61, 0xE7, 0x90, 0x90, 0x21, 0x71, 0xFD, +0x90, 0x93, 0xC1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x71, 0xF4, 0x7A, 0x93, 0x79, 0x7F, 0x12, 0x08, +0xAA, 0x71, 0xF4, 0x7A, 0x93, 0x79, 0x9F, 0x12, 0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0x12, +0x8B, 0x50, 0x7B, 0x20, 0xFD, 0xFC, 0xFF, 0xFE, 0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x90, 0x79, +0x23, 0x90, 0xAC, 0x89, 0x12, 0x44, 0x20, 0x7A, 0x93, 0x79, 0x9F, 0x90, 0xAC, 0x8C, 0x12, 0x44, +0x20, 0x90, 0xAC, 0x8F, 0x74, 0x20, 0xF0, 0x7A, 0x8F, 0x79, 0x90, 0x12, 0x34, 0x5B, 0x75, 0x40, +0x01, 0x75, 0x41, 0x93, 0x75, 0x42, 0xA7, 0x75, 0x43, 0x18, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7F, +0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0x75, 0x41, 0x93, 0x75, 0x42, 0x87, 0x75, 0x43, 0x10, 0x7B, +0x01, 0x7A, 0x93, 0x79, 0x6E, 0x12, 0x35, 0x26, 0x90, 0x93, 0x85, 0xE0, 0x54, 0x03, 0x90, 0x93, +0x7E, 0xF0, 0xC3, 0x94, 0x04, 0x50, 0x1C, 0xE0, 0x90, 0x90, 0x8A, 0xF0, 0x75, 0x40, 0x01, 0x75, +0x41, 0x93, 0x75, 0x42, 0x6E, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x6A, 0x12, 0x35, +0x26, 0x80, 0x06, 0x90, 0x90, 0x8A, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x7E, 0xE0, 0xFF, 0x7B, 0x01, +0x7A, 0x93, 0x79, 0x6E, 0x12, 0x4E, 0xF6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0xBF, 0x74, +0x80, 0xF0, 0xA3, 0x22, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x22, 0xE0, 0xFE, 0xA3, +0xE0, 0xFD, 0xED, 0xFF, 0x22, 0x12, 0x82, 0xC1, 0x74, 0x00, 0x2F, 0x12, 0x53, 0x7D, 0xE0, 0x90, +0x94, 0x72, 0xF0, 0x74, 0x01, 0x2F, 0x12, 0x57, 0x1A, 0xE0, 0x90, 0x94, 0x73, 0xF0, 0x74, 0x02, +0x2F, 0x91, 0x81, 0xE0, 0x90, 0x94, 0x74, 0xF0, 0x74, 0x03, 0x2F, 0x91, 0x65, 0xE0, 0x90, 0x94, +0x75, 0x12, 0x87, 0xA9, 0x90, 0x94, 0x76, 0xF0, 0x74, 0x05, 0x2F, 0x91, 0x89, 0x90, 0x94, 0x77, +0xF0, 0x74, 0x06, 0x2F, 0x12, 0x87, 0x8F, 0x90, 0x94, 0x78, 0xF0, 0x74, 0x07, 0x2F, 0x91, 0x9B, +0x90, 0x94, 0x79, 0xF0, 0x74, 0x08, 0x2F, 0x91, 0x92, 0x90, 0x94, 0x7A, 0xF0, 0x22, 0x90, 0x93, +0x64, 0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x12, 0x08, 0x6D, +0x90, 0x93, 0x64, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x64, 0xA3, 0xE0, 0x24, +0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x22, 0x7F, 0x50, 0x7E, 0x0C, 0x12, 0x37, 0x4E, 0x90, 0x94, 0x70, 0xEF, 0xF0, +0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, 0x4E, 0x90, 0x94, 0x71, 0xEF, 0xF0, 0x90, 0x94, 0xB5, 0x12, +0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0xB9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, +0x7F, 0x50, 0x7E, 0x0C, 0x12, 0x55, 0x44, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, +0xB9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x12, 0x54, 0xDC, 0x90, 0x06, 0x08, 0xE0, 0x90, +0x94, 0x86, 0xF0, 0x90, 0x06, 0xA1, 0xE0, 0xFE, 0x90, 0x06, 0xA0, 0x12, 0x81, 0xF5, 0x90, 0x94, +0x88, 0xF0, 0xA3, 0xEF, 0xB1, 0x16, 0x90, 0x06, 0xA0, 0x74, 0x20, 0xF0, 0xA3, 0x74, 0x01, 0xF0, +0xE4, 0xFD, 0xFF, 0x02, 0x53, 0x90, 0xF0, 0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x72, 0xE0, 0xFE, 0x90, 0x94, 0x6F, 0xE0, 0xC3, +0x9E, 0x40, 0x04, 0x7F, 0x00, 0x80, 0x0E, 0xEF, 0x60, 0x05, 0xD3, 0x94, 0x0E, 0x40, 0x04, 0x7F, +0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xB1, 0x63, 0x90, 0x94, 0x6D, 0xE0, +0x64, 0x01, 0xF0, 0xE0, 0x24, 0x4A, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xA5, 0xA3, 0x12, 0x64, 0xBB, +0x02, 0x75, 0x55, 0x90, 0x93, 0x60, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xED, 0x14, 0x60, 0x06, +0x04, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x01, 0x22, 0x90, 0x93, 0x65, 0xE0, 0x24, 0xDC, 0xFE, +0x90, 0x93, 0x64, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0x92, 0xF0, 0xA3, 0xCE, 0xF0, 0x22, 0x74, 0x00, +0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x90, 0x93, 0x8B, 0xE0, 0x2F, 0xFF, 0x90, +0x93, 0x8A, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x0E, 0xF0, 0xA3, 0x22, 0xF0, 0xA3, 0xEF, 0xF0, +0xE4, 0xFD, 0x02, 0x63, 0x99, 0x90, 0x93, 0x89, 0xE4, 0x75, 0xF0, 0x04, 0x02, 0x08, 0xD6, 0x74, +0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, +0xEA, 0x3E, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x68, 0xE0, 0x04, 0xF0, 0x22, 0xE0, 0x24, +0x01, 0xFF, 0x90, 0x8E, 0x29, 0xE0, 0x34, 0x00, 0x22, 0x90, 0x8E, 0xAF, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xE0, +0x75, 0xF0, 0x10, 0x90, 0x81, 0x05, 0x12, 0x44, 0x0B, 0xE0, 0x22, 0x90, 0x93, 0x63, 0xE0, 0xFD, +0x90, 0x93, 0x62, 0xE0, 0x2D, 0x22, 0x90, 0x93, 0x2A, 0x12, 0x43, 0xFF, 0xD3, 0x02, 0x43, 0xE2, +0x90, 0x90, 0xEA, 0x12, 0x43, 0xF3, 0xEC, 0x4D, 0x4E, 0x4F, 0x22, 0x90, 0x94, 0xE7, 0xE0, 0xC3, +0x13, 0x90, 0xFD, 0x10, 0xF0, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0x12, 0x54, 0xE0, 0x90, 0x94, 0xA3, +0x22, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x90, 0x8E, 0xAC, 0xE0, 0x14, +0x90, 0x8E, 0xAE, 0xF0, 0x22, 0x74, 0xF2, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0x22, 0x90, 0x94, +0x7A, 0xE0, 0x90, 0x95, 0x2D, 0xF0, 0x22, 0x90, 0x93, 0x66, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, +0x90, 0x8E, 0xAD, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x8E, 0xB1, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0x22, 0x2E, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0x22, 0x90, 0x95, 0x19, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x22, 0xF0, 0xA3, 0xEF, +0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x22, 0x7F, 0x01, 0x7E, +0x00, 0x02, 0x3D, 0xC2, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x22, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0x22, 0x90, 0x8E, 0x43, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x45, 0xE0, +0xC4, 0x54, 0x0F, 0x22, 0x90, 0x8E, 0x2C, 0xE0, 0xFF, 0xC3, 0x13, 0x22, 0x12, 0x08, 0xD6, 0x90, +0x8E, 0x29, 0xE0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x22, 0xF9, 0xEE, 0x34, 0xFC, +0xFA, 0x7B, 0x01, 0x22, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, 0xEA, 0xFD, }; -u4Byte ArrayLength_MP_8723B_FW_WoWLAN = 25034; +u4Byte ArrayLength_MP_8723B_FW_WoWLAN = 26398; void diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c index 74c100e9f931..acb9952ce689 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c @@ -18,6 +18,7 @@ * ******************************************************************************/ +/*Image2HeaderVersion: 2.9*/ #include "Mp_Precomp.h" #include "../phydm_precomp.h" @@ -36,11 +37,12 @@ CheckPositive( ((pDM_Odm->BoardType & BIT2) >> 2) << 4; // _BT u4Byte cond1 = Condition1, cond2 = Condition2; - u4Byte driver1 = pDM_Odm->CutVersion << 24 | - pDM_Odm->SupportPlatform << 16 | - pDM_Odm->PackageType << 12 | - pDM_Odm->SupportInterface << 8 | - _BoardType; + u4Byte driver1 = pDM_Odm->CutVersion << 24 | + (pDM_Odm->SupportInterface & 0xF0) << 16 | + pDM_Odm->SupportPlatform << 16 | + pDM_Odm->PackageType << 12 | + (pDM_Odm->SupportInterface & 0x0F) << 8 | + _BoardType; u4Byte driver2 = pDM_Odm->TypeGLNA << 0 | pDM_Odm->TypeGPA << 8 | @@ -58,44 +60,41 @@ CheckPositive( (" (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType)); - //============== Value Defined Check ===============// - //QFN Type [15:12] and Cut Version [27:24] need to do value check + /*============== Value Defined Check ===============*/ + /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ - if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) + if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) return FALSE; - if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) - return FALSE; + if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) + return FALSE; + + /*=============== Bit Defined Check ================*/ + /* We don't care [31:28] */ + + cond1 &= 0x00FF0FFF; + driver1 &= 0x00FF0FFF; - //=============== Bit Defined Check ================// - // We don't care [31:28] and [23:20] - // - cond1 &= 0x000F0FFF; - driver1 &= 0x000F0FFF; + if ((cond1 & driver1) == cond1) { + u4Byte bitMask = 0; - if ((cond1 & driver1) == cond1) - { - u4Byte bitMask = 0; - if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE + if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ return TRUE; - if ((cond1 & BIT0) != 0) //GLNA + if ((cond1 & BIT0) != 0) /*GLNA*/ bitMask |= 0x000000FF; - if ((cond1 & BIT1) != 0) //GPA + if ((cond1 & BIT1) != 0) /*GPA*/ bitMask |= 0x0000FF00; - if ((cond1 & BIT2) != 0) //ALNA + if ((cond1 & BIT2) != 0) /*ALNA*/ bitMask |= 0x00FF0000; - if ((cond1 & BIT3) != 0) //APA + if ((cond1 & BIT3) != 0) /*APA*/ bitMask |= 0xFF000000; - if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched + if ((cond2 & bitMask) == (driver2 & bitMask)) /* BoardType of each RF path is matched*/ return TRUE; - else + else return FALSE; - } - else - { + } else return FALSE; - } } static BOOLEAN CheckNegative( @@ -115,9 +114,9 @@ u4Byte Array_MP_8723B_MAC_REG[] = { 0x02F, 0x00000030, 0x035, 0x00000000, 0x039, 0x00000008, - 0x04E, 0x000000E0, 0x064, 0x00000000, 0x067, 0x00000020, + 0x421, 0x0000000F, 0x428, 0x0000000A, 0x429, 0x00000010, 0x430, 0x00000000, @@ -226,58 +225,42 @@ ODM_ReadAndConfig_MP_8723B_MAC_REG( u4Byte i = 0; u1Byte cCond; BOOLEAN bMatched = TRUE, bSkipped = FALSE; -//ask by Luke.Lee u4Byte ArrayLen = sizeof(Array_MP_8723B_MAC_REG)/sizeof(u4Byte); pu4Byte Array = Array_MP_8723B_MAC_REG; ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_MAC_REG\n")); - while(( i+1) < ArrayLen) - { + while ((i + 1) < ArrayLen) { u4Byte v1 = Array[i]; u4Byte v2 = Array[i+1]; - if(v1 & (BIT31|BIT30)) //positive & negative condition - { - if(v1 & BIT31) // positive condition - { + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if(cCond == COND_ENDIF) //end - { + if (cCond == COND_ENDIF) {/*end*/ bMatched = TRUE; bSkipped = FALSE; - } - else if(cCond == COND_ELSE) //else - { + } else if (cCond == COND_ELSE) /*else*/ bMatched = bSkipped?FALSE:TRUE; - } - else //if , else if - { - if(bSkipped) + else {/*if , else if*/ + if (bSkipped) bMatched = FALSE; - else - { - if(CheckPositive(pDM_Odm, v1, v2)) - { + else { + if (CheckPositive(pDM_Odm, v1, v2)) { bMatched = TRUE; bSkipped = TRUE; - } - else - { + } else { bMatched = FALSE; bSkipped = FALSE; } } } + } else if (v1 & BIT30) { /*negative condition*/ + /*do nothing*/ } - else if(v1 & BIT30){ //negative condition - //do nothing - } - } - else - { - if(bMatched) - odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2); + } else { + if (bMatched) + odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2); } i = i + 2; } @@ -286,8 +269,8 @@ ODM_ReadAndConfig_MP_8723B_MAC_REG( u4Byte ODM_GetVersion_MP_8723B_MAC_REG(void) { - return 12; + return 18; } -#endif // end of HWIMG_SUPPORT +#endif /* end of HWIMG_SUPPORT*/ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h index 1f74db8b12f7..6384c333f5bd 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h @@ -18,6 +18,7 @@ * ******************************************************************************/ +/*Image2HeaderVersion: 2.9*/ #if (RTL8723B_SUPPORT == 1) #ifndef __INC_MP_MAC_HW_IMG_8723B_H #define __INC_MP_MAC_HW_IMG_8723B_H @@ -28,11 +29,11 @@ ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_MAC_REG( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_MAC_REG(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_MAC_REG(void); #endif -#endif // end of HWIMG_SUPPORT +#endif /* end of HWIMG_SUPPORT*/ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c index e4480ccf56be..ee16335fe399 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c @@ -18,6 +18,7 @@ * ******************************************************************************/ +/*Image2HeaderVersion: 2.9*/ #include "Mp_Precomp.h" #include "../phydm_precomp.h" @@ -36,11 +37,12 @@ CheckPositive( ((pDM_Odm->BoardType & BIT2) >> 2) << 4; // _BT u4Byte cond1 = Condition1, cond2 = Condition2; - u4Byte driver1 = pDM_Odm->CutVersion << 24 | - pDM_Odm->SupportPlatform << 16 | - pDM_Odm->PackageType << 12 | - pDM_Odm->SupportInterface << 8 | - _BoardType; + u4Byte driver1 = pDM_Odm->CutVersion << 24 | + (pDM_Odm->SupportInterface & 0xF0) << 16 | + pDM_Odm->SupportPlatform << 16 | + pDM_Odm->PackageType << 12 | + (pDM_Odm->SupportInterface & 0x0F) << 8 | + _BoardType; u4Byte driver2 = pDM_Odm->TypeGLNA << 0 | pDM_Odm->TypeGPA << 8 | @@ -58,44 +60,41 @@ CheckPositive( (" (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType)); - //============== Value Defined Check ===============// - //QFN Type [15:12] and Cut Version [27:24] need to do value check + /*============== Value Defined Check ===============*/ + /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ - if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) + if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) return FALSE; - if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) - return FALSE; - - //=============== Bit Defined Check ================// - // We don't care [31:28] and [23:20] - // - cond1 &= 0x000F0FFF; - driver1 &= 0x000F0FFF; - - if ((cond1 & driver1) == cond1) - { - u4Byte bitMask = 0; - if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE + if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) + return FALSE; + + /*=============== Bit Defined Check ================*/ + /* We don't care [31:28] */ + + cond1 &= 0x00FF0FFF; + driver1 &= 0x00FF0FFF; + + if ((cond1 & driver1) == cond1) { + u4Byte bitMask = 0; + + if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ return TRUE; - if ((cond1 & BIT0) != 0) //GLNA + if ((cond1 & BIT0) != 0) /*GLNA*/ bitMask |= 0x000000FF; - if ((cond1 & BIT1) != 0) //GPA + if ((cond1 & BIT1) != 0) /*GPA*/ bitMask |= 0x0000FF00; - if ((cond1 & BIT2) != 0) //ALNA + if ((cond1 & BIT2) != 0) /*ALNA*/ bitMask |= 0x00FF0000; - if ((cond1 & BIT3) != 0) //APA + if ((cond1 & BIT3) != 0) /*APA*/ bitMask |= 0xFF000000; - if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched + if ((cond2 & bitMask) == (driver2 & bitMask)) /* BoardType of each RF path is matched*/ return TRUE; - else + else return FALSE; - } - else - { + } else return FALSE; - } } static BOOLEAN CheckNegative( @@ -135,31 +134,37 @@ u4Byte Array_MP_8723B_RadioA[] = { 0x01E, 0x00000000, 0x0DF, 0x00000780, 0x050, 0x00067435, - 0x80002000,0x00000000,0x40000000,0x00000000, - 0x051, 0x0006B10E, - 0x90003000,0x00000000,0x40000000,0x00000000, - 0x051, 0x0006B10E, - 0x90004000,0x00000000,0x40000000,0x00000000, - 0x051, 0x0006B10E, - 0xA0000000,0x00000000, + 0x80002000, 0x00000000, 0x40000000, 0x00000000, + 0x051, 0x0006F10E, + 0x052, 0x000007D3, + 0x90003000, 0x00000000, 0x40000000, 0x00000000, + 0x051, 0x0006F10E, + 0x052, 0x000007D3, + 0x90004000, 0x00000000, 0x40000000, 0x00000000, + 0x051, 0x0006F10E, + 0x052, 0x000007D3, + 0xA0000000, 0x00000000, 0x051, 0x0006B04E, - 0xB0000000,0x00000000, 0x052, 0x000007D2, + 0xB0000000, 0x00000000, 0x053, 0x00000000, 0x054, 0x00050400, 0x055, 0x0004026E, 0x0DD, 0x0000004C, 0x070, 0x00067435, - 0x80002000,0x00000000,0x40000000,0x00000000, - 0x071, 0x0006B10E, - 0x90003000,0x00000000,0x40000000,0x00000000, - 0x071, 0x0006B10E, - 0x90004000,0x00000000,0x40000000,0x00000000, - 0x071, 0x0006B10E, - 0xA0000000,0x00000000, + 0x80002000, 0x00000000, 0x40000000, 0x00000000, + 0x071, 0x0006F10E, + 0x072, 0x000007D3, + 0x90003000, 0x00000000, 0x40000000, 0x00000000, + 0x071, 0x0006F10E, + 0x072, 0x000007D3, + 0x90004000, 0x00000000, 0x40000000, 0x00000000, + 0x071, 0x0006F10E, + 0x072, 0x000007D3, + 0xA0000000, 0x00000000, 0x071, 0x0006B04E, - 0xB0000000,0x00000000, 0x072, 0x000007D2, + 0xB0000000, 0x00000000, 0x073, 0x00000000, 0x074, 0x00050400, 0x075, 0x0004026E, @@ -247,58 +252,42 @@ ODM_ReadAndConfig_MP_8723B_RadioA( u4Byte i = 0; u1Byte cCond; BOOLEAN bMatched = TRUE, bSkipped = FALSE; -//ask by Luke.Lee u4Byte ArrayLen = sizeof(Array_MP_8723B_RadioA)/sizeof(u4Byte); pu4Byte Array = Array_MP_8723B_RadioA; ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_RadioA\n")); - while(( i+1) < ArrayLen) - { + while ((i + 1) < ArrayLen) { u4Byte v1 = Array[i]; u4Byte v2 = Array[i+1]; - if(v1 & (BIT31|BIT30)) //positive & negative condition - { - if(v1 & BIT31) // positive condition - { + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if(cCond == COND_ENDIF) //end - { + if (cCond == COND_ENDIF) {/*end*/ bMatched = TRUE; bSkipped = FALSE; - } - else if(cCond == COND_ELSE) //else - { + } else if (cCond == COND_ELSE) /*else*/ bMatched = bSkipped?FALSE:TRUE; - } - else //if , else if - { - if(bSkipped) + else {/*if , else if*/ + if (bSkipped) bMatched = FALSE; - else - { - if(CheckPositive(pDM_Odm, v1, v2)) - { + else { + if (CheckPositive(pDM_Odm, v1, v2)) { bMatched = TRUE; bSkipped = TRUE; - } - else - { + } else { bMatched = FALSE; bSkipped = FALSE; } } } + } else if (v1 & BIT30) { /*negative condition*/ + /*do nothing*/ } - else if(v1 & BIT30){ //negative condition - //do nothing - } - } - else - { - if(bMatched) - odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2); + } else { + if (bMatched) + odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2); } i = i + 2; } @@ -307,42 +296,42 @@ ODM_ReadAndConfig_MP_8723B_RadioA( u4Byte ODM_GetVersion_MP_8723B_RadioA(void) { - return 12; + return 18; } /****************************************************************************** * TxPowerTrack_AP.TXT ******************************************************************************/ -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, }; u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, }; u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, }; u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_AP_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, }; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; #endif void @@ -350,7 +339,7 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP( IN PDM_ODM_T pDM_Odm ) { -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8723B\n")); @@ -379,33 +368,33 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP( #if DEV_BUS_TYPE == RT_PCI_INTERFACE u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, }; u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, }; u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, }; u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, }; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; #endif void @@ -442,33 +431,33 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_PCIE( #if DEV_BUS_TYPE == RT_SDIO_INTERFACE u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, }; u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, }; u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, }; u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, }; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; #endif void @@ -505,33 +494,33 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO( #if DEV_BUS_TYPE == RT_USB_INTERFACE u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, }; u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, }; u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, }; u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8723B[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, }; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15}; #endif void @@ -823,8 +812,8 @@ pu1Byte Array_MP_8723B_TXPWR_LMT[] = { void ODM_ReadAndConfig_MP_8723B_TXPWR_LMT( - IN PDM_ODM_T pDM_Odm - ) + IN PDM_ODM_T pDM_Odm +) { u4Byte i = 0; u4Byte ArrayLen = sizeof(Array_MP_8723B_TXPWR_LMT)/sizeof(pu1Byte); @@ -832,20 +821,19 @@ ODM_ReadAndConfig_MP_8723B_TXPWR_LMT( ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_TXPWR_LMT\n")); - for (i = 0; i < ArrayLen; i += 7 ) - { - pu1Byte regulation = Array[i]; - pu1Byte band = Array[i+1]; - pu1Byte bandwidth = Array[i+2]; - pu1Byte rate = Array[i+3]; - pu1Byte rfPath = Array[i+4]; - pu1Byte chnl = Array[i+5]; - pu1Byte val = Array[i+6]; + for (i = 0; i < ArrayLen; i += 7) { + pu1Byte regulation = Array[i]; + pu1Byte band = Array[i+1]; + pu1Byte bandwidth = Array[i+2]; + pu1Byte rate = Array[i+3]; + pu1Byte rfPath = Array[i+4]; + pu1Byte chnl = Array[i+5]; + pu1Byte val = Array[i+6]; - odm_ConfigBB_TXPWR_LMT_8723B(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); + odm_ConfigBB_TXPWR_LMT_8723B(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); } } -#endif // end of HWIMG_SUPPORT +#endif /* end of HWIMG_SUPPORT*/ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h index aee0ae470a63..8e17b71ace0e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h @@ -18,6 +18,7 @@ * ******************************************************************************/ +/*Image2HeaderVersion: 2.9*/ #if (RTL8723B_SUPPORT == 1) #ifndef __INC_MP_RF_HW_IMG_8723B_H #define __INC_MP_RF_HW_IMG_8723B_H @@ -28,7 +29,7 @@ ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_RadioA( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_RadioA(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_RadioA(void); @@ -38,7 +39,7 @@ u4Byte ODM_GetVersion_MP_8723B_RadioA(void); ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_AP(void); @@ -48,7 +49,7 @@ u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_AP(void); ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_TxPowerTrack_PCIE( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_TxPowerTrack_PCIE(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_PCIE(void); @@ -58,7 +59,7 @@ u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_PCIE(void); ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_SDIO(void); @@ -68,7 +69,7 @@ u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_SDIO(void); ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_TxPowerTrack_USB( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_TxPowerTrack_USB(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_USB(void); @@ -78,11 +79,11 @@ u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_USB(void); ******************************************************************************/ void -ODM_ReadAndConfig_MP_8723B_TXPWR_LMT( // TC: Test Chip, MP: MP Chip +ODM_ReadAndConfig_MP_8723B_TXPWR_LMT(/* TC: Test Chip, MP: MP Chip*/ IN PDM_ODM_T pDM_Odm ); u4Byte ODM_GetVersion_MP_8723B_TXPWR_LMT(void); #endif -#endif // end of HWIMG_SUPPORT +#endif /* end of HWIMG_SUPPORT*/ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c index 0cbf190188cd..ad9a9c46c518 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c @@ -168,13 +168,14 @@ setCCKFilterCoefficient( } void DoIQK_8723B( - PDM_ODM_T pDM_Odm, + PVOID pDM_VOID, u1Byte DeltaThermalIndex, u1Byte ThermalValue, u1Byte Threshold ) { #if 0 // mark by Lucas@SD4 20140128, suggested by Allen@SD3 + PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) PADAPTER Adapter = pDM_Odm->Adapter; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); @@ -249,7 +250,7 @@ ODM_TxPwrTrackSetPwr_8723B( u1Byte Final_OFDM_Swing_Index = 0; u1Byte Final_CCK_Swing_Index = 0; u1Byte i = 0; - + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); if (pDM_Odm->mp_mode == TRUE) { #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE )) @@ -302,7 +303,7 @@ ODM_TxPwrTrackSetPwr_8723B( PwrTrackingLimit_OFDM= 34; //+2dB else - PwrTrackingLimit_OFDM = pDM_Odm->DefaultOfdmIndex; //Default OFDM index = 30 + PwrTrackingLimit_OFDM = pRFCalibrateInfo->DefaultOfdmIndex; /*Default OFDM index = 30*/ } ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("TxRate=0x%x, PwrTrackingLimit=%d\n", TxRate, PwrTrackingLimit_OFDM)); @@ -314,7 +315,7 @@ ODM_TxPwrTrackSetPwr_8723B( ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("odm_TxPwrTrackSetPwr8723B CH=%d\n", *(pDM_Odm->pChannel))); - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = pDM_Odm->Absolute_OFDMSwingIdx[RFPath]; + pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]; #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE )) if (pDM_Odm->mp_mode == TRUE) @@ -327,7 +328,7 @@ ODM_TxPwrTrackSetPwr_8723B( ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("ODM_TxPwrTrackSetPwr8723B: CCK Tx-rf(A) Power = 0x%x\n", TxAGC)); pwr = PHY_QueryBBReg(Adapter, rTxAGC_A_Rate18_06, 0xFF); - pwr += (pDM_Odm->BbSwingIdxOfdm[RFPath] - pDM_Odm->BbSwingIdxOfdmBase[RFPath]); + pwr += (pRFCalibrateInfo->BbSwingIdxOfdm[RFPath] - pRFCalibrateInfo->BbSwingIdxOfdmBase[RFPath]); TxAGC |= ((pwr<<24)|(pwr<<16)|(pwr<<8)|pwr); PHY_SetBBReg(Adapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC); PHY_SetBBReg(Adapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC); @@ -339,19 +340,19 @@ ODM_TxPwrTrackSetPwr_8723B( } else { - pDM_Odm->Modify_TxAGC_Flag_PathA = TRUE; - pDM_Odm->Modify_TxAGC_Flag_PathA_CCK = TRUE; + pRFCalibrateInfo->Modify_TxAGC_Flag_PathA = TRUE; + pRFCalibrateInfo->Modify_TxAGC_Flag_PathA_CCK = TRUE; - PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, CCK ); - PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, OFDM ); - PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, HT_MCS0_MCS7 ); + PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, CCK); + PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, OFDM); + PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, HT_MCS0_MCS7); } #endif } else if (Method == BBSWING) { - Final_OFDM_Swing_Index = pDM_Odm->DefaultOfdmIndex + pDM_Odm->Absolute_OFDMSwingIdx[RFPath]; - Final_CCK_Swing_Index = pDM_Odm->DefaultCckIndex + pDM_Odm->Absolute_OFDMSwingIdx[RFPath]; + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]; + Final_CCK_Swing_Index = pRFCalibrateInfo->DefaultCckIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]; // Adjust BB swing by OFDM IQ matrix if (Final_OFDM_Swing_Index >= PwrTrackingLimit_OFDM) @@ -361,7 +362,7 @@ ODM_TxPwrTrackSetPwr_8723B( if (Final_CCK_Swing_Index >= CCK_TABLE_SIZE) Final_CCK_Swing_Index = CCK_TABLE_SIZE-1; - else if (pDM_Odm->BbSwingIdxCck <= 0) + else if (pRFCalibrateInfo->BbSwingIdxCck <= 0) Final_CCK_Swing_Index = 0; setIqkMatrix_8723B(pDM_Odm, Final_OFDM_Swing_Index, RFPath, @@ -374,43 +375,43 @@ ODM_TxPwrTrackSetPwr_8723B( else if (Method == MIX_MODE) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->DefaultCCKIndex=%d, pDM_Odm->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", - pDM_Odm->DefaultOfdmIndex, pDM_Odm->DefaultCckIndex, pDM_Odm->Absolute_OFDMSwingIdx[RFPath],RFPath )); + ("pRFCalibrateInfo->DefaultOfdmIndex=%d, pDM_Odm->DefaultCCKIndex=%d, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", + pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->DefaultCckIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath)); - Final_OFDM_Swing_Index = pDM_Odm->DefaultOfdmIndex + pDM_Odm->Absolute_OFDMSwingIdx[RFPath]; - Final_CCK_Swing_Index = pDM_Odm->DefaultCckIndex + pDM_Odm->Absolute_OFDMSwingIdx[RFPath]; + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]; + Final_CCK_Swing_Index = pRFCalibrateInfo->DefaultCckIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]; if(Final_OFDM_Swing_Index > PwrTrackingLimit_OFDM ) //BBSwing higher then Limit { - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index - PwrTrackingLimit_OFDM; + pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index - PwrTrackingLimit_OFDM; setIqkMatrix_8723B(pDM_Odm, PwrTrackingLimit_OFDM, RFPath, pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][0], pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][1]); - pDM_Odm->Modify_TxAGC_Flag_PathA = TRUE; + pRFCalibrateInfo->Modify_TxAGC_Flag_PathA = TRUE; PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, OFDM ); PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, HT_MCS0_MCS7 ); 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])); + ("******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d\n", + PwrTrackingLimit_OFDM, pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath])); } else if (Final_OFDM_Swing_Index <= 0) { - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index; + pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index; setIqkMatrix_8723B(pDM_Odm, 0, RFPath, pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][0], pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][1]); - pDM_Odm->Modify_TxAGC_Flag_PathA = TRUE; + pRFCalibrateInfo->Modify_TxAGC_Flag_PathA = TRUE; PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, OFDM ); PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, HT_MCS0_MCS7 ); ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d \n", - pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); + ("******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d\n", + pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath])); } else { @@ -419,55 +420,55 @@ ODM_TxPwrTrackSetPwr_8723B( pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][1]); ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d\n", Final_OFDM_Swing_Index)); - if(pDM_Odm->Modify_TxAGC_Flag_PathA) //If TxAGC has changed, reset TxAGC again + if (pRFCalibrateInfo->Modify_TxAGC_Flag_PathA) /*If TxAGC has changed, reset TxAGC again*/ { - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = 0; + pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath] = 0; PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, OFDM ); PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, HT_MCS0_MCS7 ); - pDM_Odm->Modify_TxAGC_Flag_PathA = FALSE; + pRFCalibrateInfo->Modify_TxAGC_Flag_PathA = FALSE; ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A pDM_Odm->Modify_TxAGC_Flag = FALSE \n")); + ("******Path_A pDM_Odm->Modify_TxAGC_Flag = FALSE\n")); } } if(Final_CCK_Swing_Index > PwrTrackingLimit_CCK) { - pDM_Odm->Remnant_CCKSwingIdx = Final_CCK_Swing_Index - PwrTrackingLimit_CCK; + pRFCalibrateInfo->Remnant_CCKSwingIdx = Final_CCK_Swing_Index - PwrTrackingLimit_CCK; setCCKFilterCoefficient(pDM_Odm, PwrTrackingLimit_CCK); - pDM_Odm->Modify_TxAGC_Flag_PathA_CCK = TRUE; + pRFCalibrateInfo->Modify_TxAGC_Flag_PathA_CCK = TRUE; PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, CCK ); ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A CCK Over Limit , PwrTrackingLimit_CCK = %d , pDM_Odm->Remnant_CCKSwingIdx = %d \n", PwrTrackingLimit_CCK, pDM_Odm->Remnant_CCKSwingIdx)); + ("******Path_A CCK Over Limit , PwrTrackingLimit_CCK = %d , pRFCalibrateInfo->Remnant_CCKSwingIdx = %d\n", PwrTrackingLimit_CCK, pRFCalibrateInfo->Remnant_CCKSwingIdx)); } else if(Final_CCK_Swing_Index <= 0) // Lowest CCK Index = 0 { - pDM_Odm->Remnant_CCKSwingIdx = Final_CCK_Swing_Index; + pRFCalibrateInfo->Remnant_CCKSwingIdx = Final_CCK_Swing_Index; setCCKFilterCoefficient(pDM_Odm, 0); - pDM_Odm->Modify_TxAGC_Flag_PathA_CCK = TRUE; + pRFCalibrateInfo->Modify_TxAGC_Flag_PathA_CCK = TRUE; PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, CCK ); ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A CCK Under Limit , PwrTrackingLimit_CCK = %d , pDM_Odm->Remnant_CCKSwingIdx = %d \n", 0, pDM_Odm->Remnant_CCKSwingIdx)); + ("******Path_A CCK Under Limit , PwrTrackingLimit_CCK = %d , pRFCalibrateInfo->Remnant_CCKSwingIdx = %d\n", 0, pRFCalibrateInfo->Remnant_CCKSwingIdx)); } else { setCCKFilterCoefficient(pDM_Odm, Final_CCK_Swing_Index); ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A CCK Compensate with BBSwing , Final_CCK_Swing_Index = %d \n", Final_CCK_Swing_Index)); + ("******Path_A CCK Compensate with BBSwing , Final_CCK_Swing_Index = %d\n", Final_CCK_Swing_Index)); - if(pDM_Odm->Modify_TxAGC_Flag_PathA_CCK) //If TxAGC has changed, reset TxAGC again + if (pRFCalibrateInfo->Modify_TxAGC_Flag_PathA_CCK) /*If TxAGC has changed, reset TxAGC again*/ { - pDM_Odm->Remnant_CCKSwingIdx = 0; + pRFCalibrateInfo->Remnant_CCKSwingIdx = 0; PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, CCK ); - pDM_Odm->Modify_TxAGC_Flag_PathA_CCK= FALSE; + pRFCalibrateInfo->Modify_TxAGC_Flag_PathA_CCK = FALSE; ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A pDM_Odm->Modify_TxAGC_Flag_CCK = FALSE \n")); + ("******Path_A pDM_Odm->Modify_TxAGC_Flag_CCK = FALSE\n")); } } } @@ -662,7 +663,7 @@ phy_PathA_IQK_8723B( (((regE9C & 0x03FF0000)>>16) != 0x42)) result |= 0x01; - return result; + return result; #if 0 if(!(regEAC & BIT27) && //if Tx is OK, check whether Rx is OK @@ -1506,7 +1507,7 @@ ODM_CheckPowerStatus( // // 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)); + rtw_hal_get_hwreg(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) { ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", @@ -2974,14 +2975,14 @@ PHY_IQCalibrate_8723B( //#define PATH_S0 1 // RF_PATH_B //#define PATH_S1 0 // RF_PATH_A - path = (RF_Path==0 ? ODM_RF_PATH_A : ODM_RF_PATH_B); + path = (RF_Path == 0 ? ODM_RF_PATH_A : ODM_RF_PATH_B); // Restore TX IQK for (i = 0; i < 3; ++i) { offset = pRFCalibrateInfo->TxIQC_8723B[path][i][0]; data = pRFCalibrateInfo->TxIQC_8723B[path][i][1]; - if ((offset==0) || (i==1 && data==0)) { // 0xc80, 0xc88 ==> index=1 - DBG_871X("%s =>path:%s Restore TX IQK result failed \n",__FUNCTION__,(path==ODM_RF_PATH_A)?"A":"B"); + if ((offset == 0) || (i == 1 && data == 0)) { /* 0xc80, 0xc88 ==> index=1 */ + DBG_871X("%s =>path:%s Restore TX IQK result failed\n", __func__, (path == ODM_RF_PATH_A) ? "A" : "B"); bResult = FAIL; break; } @@ -2993,8 +2994,8 @@ PHY_IQCalibrate_8723B( for (i = 0; i < 2; ++i) { offset = pRFCalibrateInfo->RxIQC_8723B[path][i][0]; data = pRFCalibrateInfo->RxIQC_8723B[path][i][1]; - if ((offset==0) || (i==0 && data==0)) { // 0xc14, 0xc1c ==> index=0 - DBG_871X("%s =>path:%s Restore RX IQK result failed \n",__FUNCTION__,(path==ODM_RF_PATH_A)?"A":"B"); + if ((offset == 0) || (i == 0 && data == 0)) { /* 0xc14, 0xc1c ==> index=0 */ + DBG_871X("%s =>path:%s Restore RX IQK result failed\n", __func__, (path == ODM_RF_PATH_A) ? "A" : "B"); bResult = FAIL; break; } @@ -3028,7 +3029,6 @@ PHY_IQCalibrate_8723B( #endif goto out; } - StartTime = ODM_GetCurrentTime( pDM_Odm); ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK:Start!!!\n")); @@ -3229,7 +3229,7 @@ PHY_IQCalibrate_8723B( } ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK finished\n")); - ProgressingTime = ODM_GetProgressingTime( pDM_Odm, StartTime); + ProgressingTime = ODM_GetProgressingTime(pDM_Odm, StartTime); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK ProgressingTime = %d\n", ProgressingTime)); out: @@ -3342,7 +3342,7 @@ PHY_APCalibrate_8723B( return; #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - if(IS_92C_SERIAL( pHalData->VersionID)){ + if(IS_2T2R( pHalData->VersionID)){ phy_APCalibrate_8723B(pAdapter, delta, TRUE); } else @@ -3868,7 +3868,7 @@ PHY_DigitalPredistortion_8723B( return; #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - if(IS_92C_SERIAL( pHalData->VersionID)){ + if(IS_2T2R( pHalData->VersionID)){ phy_DigitalPredistortion8723B(pAdapter, TRUE); } else diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.h index 405310fae7b0..583d718da1f9 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.h @@ -34,7 +34,7 @@ void ConfigureTxpowerTrack_8723B( ); void DoIQK_8723B( - PDM_ODM_T pDM_Odm, + PVOID pDM_VOID, u1Byte DeltaThermalIndex, u1Byte ThermalValue, u1Byte Threshold diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RTL8723B.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RTL8723B.c deleted file mode 100755 index a81a00db834a..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RTL8723B.c +++ /dev/null @@ -1,578 +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" - -#if (RTL8723B_SUPPORT == 1) - -VOID -odm8723b_DigForBtHsMode( - IN PDM_ODM_T pDM_Odm - ) -{ -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - //PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt; - pDIG_T pDM_DigTable=&pDM_Odm->DM_DigTable; - u1Byte digForBtHs=0; - //BOOLEAN bChkFA=FALSE; - - if(pDM_Odm->bBtConnectProcess) - { - if(pDM_Odm->SupportICType&(ODM_RTL8723A)) - digForBtHs = 0x28; - else - digForBtHs = 0x22; - } - else - { - // - // Decide DIG value by BT RSSI. - // - digForBtHs = pDM_Odm->btHsRssi+4; -#if 0 - // check if cur dig and pre dig diff is larger than 10 - - if(digForBtHs > pDM_DigTable->PreIGValue) - { - if( (digForBtHs - pDM_DigTable->PreIGValue) > 10) - pDM_DigTable->PreIGValue = digForBtHs; - else - bChkFA = TRUE; - } - else - { - if( (pDM_DigTable->PreIGValue -digForBtHs) > 10) - pDM_DigTable->PreIGValue = digForBtHs; - else - bChkFA = TRUE; - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : pFalseAlmCnt->Cnt_all=0x%x\n", pFalseAlmCnt->Cnt_all)); - //Current IGI update by FA - if(bChkFA) - { - if(pFalseAlmCnt->Cnt_all > 0x150) - pDM_DigTable->PreIGValue += 2; - else if (pFalseAlmCnt->Cnt_all > 0x100) - pDM_DigTable->PreIGValue += 1; - else if(pFalseAlmCnt->Cnt_all < 0x20) - pDM_DigTable->PreIGValue -= 1; - - digForBtHs = pDM_DigTable->PreIGValue; - } - - if(digForBtHs > (pDM_Odm->btHsRssi+10)) - digForBtHs = (pDM_Odm->btHsRssi+10); - else - { - if(pDM_Odm->btHsRssi < 10) - digForBtHs = 0x1c; - else - { - if(digForBtHs > (pDM_Odm->btHsRssi -10)) - digForBtHs = (pDM_Odm->btHsRssi -10); - } - } -#endif - //DIG Bound - if(digForBtHs > 0x3e) - digForBtHs = 0x3e; - 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)); - //ODM_Write_DIG(pDM_Odm, digForBtHs); -#endif -} - -VOID -odm_DIG_8723( - 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; - BOOLEAN FirstConnect, FirstDisConnect; - u1Byte dm_dig_max, dm_dig_min; - u1Byte CurrentIGI = pDM_DigTable->CurIGValue; - -#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->bBtHsOperation) - { - odm8723b_DigForBtHsMode(pDM_Odm); - } - -#if 0 // Neil Chen No RX HP for 8723 - 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 - - -#endif - -#if 0 -#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 -#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|ODM_RTL8723B)) - { - if(pDM_Odm->bDMInitialGainEnable == FALSE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: PSD is Processing \n")); - return; - } - } - - - 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 0 - 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; - - dm_dig_min = DM_DIG_MIN_NIC; - DIG_MaxOfMin = DM_DIG_MAX_AP; - } - } -#endif // masked by neilchen to simpily 8723B case - - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI=0x%x\n",pDM_Odm->RSSI_Min)); - - if((pDM_Odm->SupportICType >= ODM_RTL8723B) && (pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))) - dm_dig_max = 0x5A; - else - dm_dig_max = DM_DIG_MAX_NIC; - - - dm_dig_min = DM_DIG_MIN_NIC_8723; - - if(pDM_Odm->bLinked) - { - if(pDM_Odm->SupportICType&(ODM_RTL8723B)) - { - //BT is Concurrent - if(pDM_Odm->bBtLimitedDig) - { - 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; - - 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_8723) - DIG_Dynamic_MIN = DM_DIG_MIN_NIC_8723; - else - DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - 10; - } - else - DIG_Dynamic_MIN=DM_DIG_MIN_NIC_8723; - } - 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; - - - if(pDM_Odm->RSSI_Min>20) - { - if((pDM_Odm->RSSI_Min - 20) > DM_DIG_MAX_NIC) - DIG_Dynamic_MIN = DM_DIG_MAX_NIC; - else if((pDM_Odm->RSSI_Min - 20) < DM_DIG_MIN_NIC_8723) - DIG_Dynamic_MIN = DM_DIG_MIN_NIC_8723; - else - DIG_Dynamic_MIN = pDM_Odm->RSSI_Min -20; - } - else - DIG_Dynamic_MIN=DM_DIG_MIN_NIC_8723; - - - } - } - - } - else - { - pDM_DigTable->rx_gain_range_max = dm_dig_max; - pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC_8723; - DIG_Dynamic_MIN = dm_dig_min; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : No Link\n")); - } - -#if 0 - 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 = 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)); -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG():pDM_DigTable->Recover_cnt=%d\n",pDM_DigTable->Recover_cnt)); - - //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) - { - CurrentIGI = pDM_Odm->RSSI_Min; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG: First Connect\n")); - } - else - { - //FA for Combo IC--NeilChen--2012--09--28 - if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - //WLAN and BT ConCurrent - if(pDM_Odm->bBtLimitedDig) - { - if(pFalseAlmCnt->Cnt_all > 0x500) - CurrentIGI = CurrentIGI + 4; - else if (pFalseAlmCnt->Cnt_all > 0x300) - CurrentIGI = CurrentIGI + 2; - else if(pFalseAlmCnt->Cnt_all <0x150) - CurrentIGI = CurrentIGI -2; - } - else //Not Concurrent - { - if(pFalseAlmCnt->Cnt_all > 0x400) - CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2; - else if (pFalseAlmCnt->Cnt_all > 0x200) - CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1; - else if(pFalseAlmCnt->Cnt_all < 0x100) - CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1; - } - } - - } - } - 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; - - 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)); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI=0x%x\n",pDM_Odm->RSSI_Min)); - - //2 High power RSSI threshold -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter); - //----------------------------------------------------------end for LC Mocca issue - if((pDM_Odm->SupportICType == ODM_RTL8723B)&& (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 0 - 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 // end if 0 -} -#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; - } -} - - - s1Byte -odm_CCKRSSI_8723B( - IN u1Byte LNA_idx, - IN u1Byte VGA_idx - ) -{ - s1Byte rx_pwr_all=0x00; - switch(LNA_idx) - { - //46 53 73 95 201301231630 - // 46 53 77 99 201301241630 - - case 6: - rx_pwr_all = -34 - (2 * VGA_idx); - break; - case 4: - rx_pwr_all = -14 - (2 * VGA_idx); - break; - case 1: - rx_pwr_all = 6 - (2 * VGA_idx); - break; - case 0: - rx_pwr_all = 16 - (2 * VGA_idx); - break; - default: - //rx_pwr_all = -53+(2*(31-VGA_idx)); - //DbgPrint("wrong LNA index\n"); - break; - - } - return rx_pwr_all; -} - -#endif // end if RTL8723B - - - - - - - - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RegConfig8723B.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RegConfig8723B.c deleted file mode 100755 index fa1c97c31dac..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RegConfig8723B.c +++ /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 (RTL8723B_SUPPORT == 1) - -void -odm_ConfigRFReg_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Data, - IN ODM_RF_RADIO_PATH_E RF_PATH, - IN u4Byte RegAddr - ) -{ - if(Addr == 0xfe || Addr == 0xffe) - { - #ifdef CONFIG_LONG_DELAY_ISSUE - ODM_sleep_ms(50); - #else - ODM_delay_ms(50); - #endif - } - else - { - ODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data); - // Add 1us delay between BB/RF register setting. - ODM_delay_us(1); - - //For disable/enable test in high temperature, the B6 value will fail to fill. Suggestion by BB Stanley, 2013.06.25. - if(Addr == 0xb6) - { - u4Byte getvalue=0; - u1Byte count =0; - getvalue = ODM_GetRFReg(pDM_Odm, RF_PATH, Addr, bMaskDWord); - - ODM_delay_us(1); - - while((getvalue>>8)!=(Data>>8)) - { - count++; - ODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data); - ODM_delay_us(1); - getvalue = ODM_GetRFReg(pDM_Odm, RF_PATH, Addr, bMaskDWord); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [B6] getvalue 0x%x, Data 0x%x, count %d\n", getvalue, Data,count)); - if(count>5) - break; - } - } - - if(Addr == 0xb2) - { - u4Byte getvalue=0; - u1Byte count =0; - getvalue = ODM_GetRFReg(pDM_Odm, RF_PATH, Addr, bMaskDWord); - - ODM_delay_us(1); - - while(getvalue!=Data) - { - count++; - ODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data); - ODM_delay_us(1); - //Do LCK againg - ODM_SetRFReg(pDM_Odm, RF_PATH, 0x18, bRFRegOffsetMask, 0x0fc07); - ODM_delay_us(1); - getvalue = ODM_GetRFReg(pDM_Odm, RF_PATH, Addr, bMaskDWord); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [B2] getvalue 0x%x, Data 0x%x, count %d\n", getvalue, Data,count)); - if(count>5) - break; - } - } - } -} - - -void -odm_ConfigRF_RadioA_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Data - ) -{ - u4Byte content = 0x1000; // RF_Content: radioa_txt - u4Byte maskforPhySet= (u4Byte)(content&0xE000); - - odm_ConfigRFReg_8723B(pDM_Odm, Addr, Data, ODM_RF_PATH_A, Addr|maskforPhySet); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioA] %08X %08X\n", Addr, Data)); -} - -void -odm_ConfigRF_RadioB_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Data - ) -{ - u4Byte content = 0x1001; // RF_Content: radiob_txt - u4Byte maskforPhySet= (u4Byte)(content&0xE000); - - odm_ConfigRFReg_8723B(pDM_Odm, Addr, Data, ODM_RF_PATH_B, Addr|maskforPhySet); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioB] %08X %08X\n", Addr, Data)); - -} - -void -odm_ConfigMAC_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u1Byte Data - ) -{ - ODM_Write1Byte(pDM_Odm, Addr, Data); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigMACWithHeaderFile: [MAC_REG] %08X %08X\n", Addr, Data)); -} - -void -odm_ConfigBB_AGC_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Bitmask, - IN u4Byte Data - ) -{ - ODM_SetBBReg(pDM_Odm, Addr, Bitmask, Data); - // Add 1us delay between BB/RF register setting. - ODM_delay_us(1); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigBBWithHeaderFile: [AGC_TAB] %08X %08X\n", Addr, Data)); -} - -void -odm_ConfigBB_PHY_REG_PG_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Band, - IN u4Byte RfPath, - IN u4Byte TxNum, - IN u4Byte Addr, - IN u4Byte Bitmask, - IN u4Byte Data - ) -{ - if (Addr == 0xfe || Addr == 0xffe) - #ifdef CONFIG_LONG_DELAY_ISSUE - ODM_sleep_ms(50); - #else - ODM_delay_ms(50); - #endif - else - { -#if !(DM_ODM_SUPPORT_TYPE&ODM_AP) - PHY_StoreTxPowerByRate(pDM_Odm->Adapter, Band, RfPath, TxNum, Addr, Bitmask, Data); -#endif - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X %08X\n", Addr, Bitmask, Data)); -} - -void -odm_ConfigBB_PHY_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Bitmask, - IN u4Byte Data - ) -{ - if (Addr == 0xfe) - #ifdef CONFIG_LONG_DELAY_ISSUE - ODM_sleep_ms(50); - #else - ODM_delay_ms(50); - #endif - else if (Addr == 0xfd) - ODM_delay_ms(5); - else if (Addr == 0xfc) - ODM_delay_ms(1); - else if (Addr == 0xfb) - ODM_delay_us(50); - else if (Addr == 0xfa) - ODM_delay_us(5); - else if (Addr == 0xf9) - ODM_delay_us(1); - else - { - ODM_SetBBReg(pDM_Odm, Addr, Bitmask, Data); - } - - // Add 1us delay between BB/RF register setting. - ODM_delay_us(1); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X\n", Addr, Data)); -} - -void -odm_ConfigBB_TXPWR_LMT_8723B( - IN PDM_ODM_T pDM_Odm, - IN pu1Byte Regulation, - IN pu1Byte Band, - IN pu1Byte Bandwidth, - IN pu1Byte RateSection, - IN pu1Byte RfPath, - IN pu1Byte Channel, - IN pu1Byte PowerLimit - ) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - PHY_SetTxPowerLimit(pDM_Odm, Regulation, Band, - Bandwidth, RateSection, RfPath, Channel, PowerLimit); -#elif (DM_ODM_SUPPORT_TYPE & (ODM_CE)) - PHY_SetTxPowerLimit(pDM_Odm->Adapter, Regulation, Band, - Bandwidth, RateSection, RfPath, Channel, PowerLimit); -#endif -} - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RegConfig8723B.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RegConfig8723B.h deleted file mode 100755 index 4f2d3884e314..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RegConfig8723B.h +++ /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_8723B -#define __INC_ODM_REGCONFIG_H_8723B - -#if (RTL8723B_SUPPORT == 1) - -void -odm_ConfigRFReg_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Data, - IN ODM_RF_RADIO_PATH_E RF_PATH, - IN u4Byte RegAddr - ); - -void -odm_ConfigRF_RadioA_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Data - ); - -void -odm_ConfigRF_RadioB_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Data - ); - -void -odm_ConfigMAC_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u1Byte Data - ); - -void -odm_ConfigBB_AGC_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Bitmask, - IN u4Byte Data - ); - -void -odm_ConfigBB_PHY_REG_PG_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Band, - IN u4Byte RfPath, - IN u4Byte TxNum, - IN u4Byte Addr, - IN u4Byte Bitmask, - IN u4Byte Data - ); - -void -odm_ConfigBB_PHY_8723B( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Addr, - IN u4Byte Bitmask, - IN u4Byte Data - ); - -void -odm_ConfigBB_TXPWR_LMT_8723B( - IN PDM_ODM_T pDM_Odm, - IN pu1Byte Regulation, - IN pu1Byte Band, - IN pu1Byte Bandwidth, - IN pu1Byte RateSection, - IN pu1Byte RfPath, - IN pu1Byte Channel, - IN pu1Byte PowerLimit - ); - -#endif -#endif // end of SUPPORT - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.c index f2defeb3381e..722184d26bf2 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.c @@ -34,26 +34,25 @@ odm_CCKRSSI_8723B( ) { s1Byte rx_pwr_all=0x00; - switch(LNA_idx) - { + switch (LNA_idx) { //46 53 73 95 201301231630 // 46 53 77 99 201301241630 case 6: - rx_pwr_all = -34 - (2 * VGA_idx); + rx_pwr_all = -40 - (2 * VGA_idx); break; case 4: - rx_pwr_all = -14 - (2 * VGA_idx); + rx_pwr_all = -20 - (2 * VGA_idx); break; case 1: - rx_pwr_all = 6 - (2 * VGA_idx); + rx_pwr_all = 0 - (2 * VGA_idx); break; case 0: - rx_pwr_all = 16 - (2 * VGA_idx); + rx_pwr_all = 10 - (2 * VGA_idx); break; default: - //rx_pwr_all = -53+(2*(31-VGA_idx)); - //DbgPrint("wrong LNA index\n"); + /*rx_pwr_all = -53+(2*(31-VGA_idx));*/ + /*DbgPrint("wrong LNA index\n");*/ break; } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/efuse_mask.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/efuse_mask.h new file mode 100755 index 000000000000..d5bd81d571da --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/efuse_mask.h @@ -0,0 +1,60 @@ + +#if DEV_BUS_TYPE == RT_USB_INTERFACE + + #if defined(CONFIG_RTL8188E) + #include "rtl8188e/HalEfuseMask8188E_USB.h" + #endif + + #if defined(CONFIG_RTL8812A) + #include "rtl8812a/HalEfuseMask8812A_USB.h" + #endif + + #if defined(CONFIG_RTL8821A) + #include "rtl8812a/HalEfuseMask8821A_USB.h" + #endif + + #if defined(CONFIG_RTL8192E) + #include "rtl8192e/HalEfuseMask8192E_USB.h" + #endif + + #if defined(CONFIG_RTL8723B) + #include "rtl8723b/HalEfuseMask8723B_USB.h" + #endif + + #if defined(CONFIG_RTL8814A) + #include "rtl8814a/HalEfuseMask8814A_USB.h" + #endif + +#elif DEV_BUS_TYPE == RT_PCI_INTERFACE + + #if defined(CONFIG_RTL8188E) + #include "rtl8188e/HalEfuseMask8188E_PCIE.h" + #endif + + #if defined(CONFIG_RTL8812A) + #include "rtl8812a/HalEfuseMask8812A_PCIE.h" + #endif + + #if defined(CONFIG_RTL8821A) + #include "rtl8812a/HalEfuseMask8821A_PCIE.h" + #endif + + #if defined(CONFIG_RTL8192E) + #include "rtl8192e/HalEfuseMask8192E_PCIE.h" + #endif + + #if defined(CONFIG_RTL8723B) + #include "rtl8723b/HalEfuseMask8723B_PCIE.h" + #endif + + #if defined(CONFIG_RTL8814A) + #include "rtl8814a/HalEfuseMask8814A_PCIE.h" + #endif + +#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE + + #if defined(CONFIG_RTL8188E) + #include "rtl8188e/HalEfuseMask8188E_SDIO.h" + #endif + +#endif \ No newline at end of file diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_PCIE.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_PCIE.c new file mode 100755 index 000000000000..1ddaeb00517a --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_PCIE.c @@ -0,0 +1,101 @@ +/****************************************************************************** +* +* 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 "../odm_precomp.h" +#include +#include "../../../hal/OUTSRC/phydm_precomp.h" +#include "HalEfuseMask8723B_PCIE.h" + + +/****************************************************************************** +* MPCIE.TXT +******************************************************************************/ + +u1Byte Array_MP_8723B_MPCIE[] = { + 0xFF, + 0xF3, + 0x00, + 0x0E, + 0x70, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x07, + 0xF3, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xF1, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + +}; + +u2Byte +EFUSE_GetArrayLen_MP_8723B_MPCIE(VOID) +{ + return sizeof(Array_MP_8723B_MPCIE)/sizeof(u1Byte); +} + +VOID +EFUSE_GetMaskArray_MP_8723B_MPCIE( + IN OUT pu1Byte Array + ) +{ + u2Byte len = EFUSE_GetArrayLen_MP_8723B_MPCIE(), i = 0; + + for (i = 0; i < len; ++i) + Array[i] = Array_MP_8723B_MPCIE[i]; +} +BOOLEAN +EFUSE_IsAddressMasked_MP_8723B_MPCIE( + IN u2Byte Offset + ) +{ + int r = Offset/16; + int c = (Offset%16) / 2; + int result = 0; + + if (c < 4) // Upper double word + result = (Array_MP_8723B_MPCIE[r] & (0x10 << c)); + else + result = (Array_MP_8723B_MPCIE[r] & (0x01 << (c-4))); + + return (result > 0) ? 0 : 1; +} + + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_PCIE.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_PCIE.h new file mode 100755 index 000000000000..41d333835843 --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_PCIE.h @@ -0,0 +1,40 @@ +/****************************************************************************** +* +* 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 +* +* +******************************************************************************/ + + +/****************************************************************************** +* MPCIE.TXT +******************************************************************************/ + + +u2Byte +EFUSE_GetArrayLen_MP_8723B_MPCIE(VOID); + +VOID +EFUSE_GetMaskArray_MP_8723B_MPCIE( + IN OUT pu1Byte Array +); + +BOOLEAN +EFUSE_IsAddressMasked_MP_8723B_MPCIE( // TC: Test Chip, MP: MP Chip + IN u2Byte Offset +); + + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_USB.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_USB.c new file mode 100755 index 000000000000..687e6339ee47 --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_USB.c @@ -0,0 +1,100 @@ +/****************************************************************************** +* +* 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 "../odm_precomp.h" + +#include +#include "../../../hal/OUTSRC/phydm_precomp.h" +#include "HalEfuseMask8723B_USB.h" +/****************************************************************************** +* MUSB.TXT +******************************************************************************/ + +u1Byte Array_MP_8723B_MUSB[] = { + 0xFF, + 0xF3, + 0x00, + 0x0E, + 0x70, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x07, + 0xF1, + 0x00, + 0x00, + 0x00, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xB0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + +}; + +u2Byte +EFUSE_GetArrayLen_MP_8723B_MUSB(VOID) +{ + return sizeof(Array_MP_8723B_MUSB)/sizeof(u1Byte); +} + +VOID +EFUSE_GetMaskArray_MP_8723B_MUSB( + IN OUT pu1Byte Array + ) +{ + u2Byte len = EFUSE_GetArrayLen_MP_8723B_MUSB(), i = 0; + + for (i = 0; i < len; ++i) + Array[i] = Array_MP_8723B_MUSB[i]; +} +BOOLEAN +EFUSE_IsAddressMasked_MP_8723B_MUSB( + IN u2Byte Offset + ) +{ + int r = Offset/16; + int c = (Offset%16) / 2; + int result = 0; + + if (c < 4) // Upper double word + result = (Array_MP_8723B_MUSB[r] & (0x10 << c)); + else + result = (Array_MP_8723B_MUSB[r] & (0x01 << (c-4))); + + return (result > 0) ? 0 : 1; +} + + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_USB.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_USB.h new file mode 100755 index 000000000000..45c29223dcfe --- /dev/null +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/efuse/rtl8723b/HalEfuseMask8723B_USB.h @@ -0,0 +1,42 @@ +/****************************************************************************** +* +* 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 +* +* +******************************************************************************/ + + + +/****************************************************************************** +* MUSB.TXT +******************************************************************************/ + + +u2Byte +EFUSE_GetArrayLen_MP_8723B_MUSB(VOID); + +VOID +EFUSE_GetMaskArray_MP_8723B_MUSB( + IN OUT pu1Byte Array +); + +BOOLEAN +EFUSE_IsAddressMasked_MP_8723B_MUSB( // TC: Test Chip, MP: MP Chip + IN u2Byte Offset +); + + + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_btcoex.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_btcoex.c index 119aaf78ef5e..f51e45d0dd42 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_btcoex.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_btcoex.c @@ -90,6 +90,27 @@ const char *const GLBtcWifiFreqString[]={ "5G" }; +const char *const GLBtcIotPeerString[] = { + "UNKNOWN", + "REALTEK", + "REALTEK_92SE", + "BROADCOM", + "RALINK", + "ATHEROS", + "CISCO", + "MERU", + "MARVELL", + "REALTEK_SOFTAP", /* peer is RealTek SOFT_AP, by Bohn, 2009.12.17 */ + "SELF_SOFTAP", /* Self is SoftAP */ + "AIRGO", + "INTEL", + "RTK_APCLIENT", + "REALTEK_81XX", + "REALTEK_WOW", + "REALTEK_JAGUAR_BCUTAP", + "REALTEK_JAGUAR_CCUTAP" +}; + #define HALBTCOUTSRC_AGG_CHK_WINDOW_IN_MS 8000 BTC_COEXIST GLBtCoexist; @@ -99,7 +120,7 @@ u8 GLBtcWiFiInIPS; u8 GLBtcWiFiInLPS; u8 GLBtcBtCoexAliveRegistered; -u32 GLBtcDbgType[BTC_MSG_MAX]; +u32 GLBtcDbgType[COMP_MAX]; u8 GLBtcDbgBuf[BT_TMP_BUF_SIZE]; typedef struct _btcoexdbginfo @@ -163,26 +184,8 @@ static void halbtcoutsrc_DbgInit(void) { u8 i; - for (i=0; iAdapter; @@ -362,7 +365,7 @@ void halbtcoutsrc_AggregationCheck(PBTC_COEXIST pBtCoexist) if (pBtCoexist->btInfo.bRejectAggPkt) { - rtw_btcoex_RejectApAggregatedPacket(padapter, _TRUE); + bNeedToAct = _TRUE; pBtCoexist->btInfo.bPreRejectAggPkt = pBtCoexist->btInfo.bRejectAggPkt; } else @@ -389,13 +392,10 @@ void halbtcoutsrc_AggregationCheck(PBTC_COEXIST pBtCoexist) } pBtCoexist->btInfo.preAggBufSize = pBtCoexist->btInfo.aggBufSize; } - - if (bNeedToAct) - { - rtw_btcoex_RejectApAggregatedPacket(padapter, _TRUE); - rtw_btcoex_RejectApAggregatedPacket(padapter, _FALSE); - } } + + if (bNeedToAct) + rtw_btcoex_rx_ampdu_apply(padapter); } u8 halbtcoutsrc_IsWifiBusy(PADAPTER padapter) @@ -413,7 +413,7 @@ u8 halbtcoutsrc_IsWifiBusy(PADAPTER padapter) return _TRUE; } -#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT) +#if defined(CONFIG_CONCURRENT_MODE) pmlmepriv = &padapter->pbuddy_adapter->mlmepriv; if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE) == _TRUE) @@ -513,9 +513,10 @@ u32 halbtcoutsrc_GetBtPatchVer(PBTC_COEXIST pBtCoexist) u8 btFwVer = 0x0; u8 cnt = 0; -#if 0 +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX if (!pBtCoexist->btInfo.btRealFwVer && cnt<=5) { +#if 0 if (halbtcoutsrc_IsHwMailboxExist(pBtCoexist)) { // mailbox exists, through mailbox if (NDBG_GetBtFwVersion(pBtCoexist->Adapter, &btRealFwVer, &btFwVer)) @@ -530,6 +531,8 @@ u32 halbtcoutsrc_GetBtPatchVer(PBTC_COEXIST pBtCoexist) } } else // no mailbox, query bt patch version through stack. +#endif + // query bt patch version through socket. { u1Byte dataLen=2; u1Byte buf[4] = {0}; @@ -539,7 +542,7 @@ u32 halbtcoutsrc_GetBtPatchVer(PBTC_COEXIST pBtCoexist) } cnt++; } -#endif +#endif //CONFIG_BT_COEXIST_SOCKET_TRX return pBtCoexist->btInfo.btRealFwVer; } @@ -548,10 +551,9 @@ s32 halbtcoutsrc_GetWifiRssi(PADAPTER padapter) PHAL_DATA_TYPE pHalData; s32 UndecoratedSmoothedPWDB = 0; - pHalData = GET_HAL_DATA(padapter); - UndecoratedSmoothedPWDB = pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB; + UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB; return UndecoratedSmoothedPWDB; } @@ -774,7 +776,7 @@ u8 halbtcoutsrc_Get(void *pBtcContext, u8 getType, void *pOutBuf) break; case BTC_GET_U1_MAC_PHY_MODE: - *pU1Tmp = BTC_SMSP; +// *pU1Tmp = BTC_SMSP; // *pU1Tmp = BTC_DMSP; // *pU1Tmp = BTC_DMDP; // *pU1Tmp = BTC_MP_UNKNOWN; @@ -784,7 +786,32 @@ u8 halbtcoutsrc_Get(void *pBtcContext, u8 getType, void *pOutBuf) *pU1Tmp = halbtcoutsrc_GetWifiScanAPNum(padapter); break; case BTC_GET_U1_ANT_TYPE: - *pU1Tmp = (u1Byte)BTC_ANT_TYPE_0; + switch(pHalData->bt_coexist.btAntisolation) + { + case 0: + *pU1Tmp = (u1Byte)BTC_ANT_TYPE_0; + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_0; + break; + case 1: + *pU1Tmp = (u1Byte)BTC_ANT_TYPE_1; + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_1; + break; + case 2: + *pU1Tmp = (u1Byte)BTC_ANT_TYPE_2; + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_2; + break; + case 3: + *pU1Tmp = (u1Byte)BTC_ANT_TYPE_3; + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_3; + break; + case 4: + *pU1Tmp = (u1Byte)BTC_ANT_TYPE_4; + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_4; + break; + } + break; + case BTC_GET_U1_IOT_PEER: + *pU1Tmp = mlmeext->mlmext_info.assoc_AP_vendor; break; //=======1Ant=========== @@ -930,27 +957,26 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf) case BTC_SET_ACT_SEND_MIMO_PS: { - 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) - { - //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); + 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) { + /* 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); } } break; case BTC_SET_ACT_CTRL_BT_INFO: -#if 0 +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX { u8 dataLen = *pU1Tmp; u8 tmpBuf[20]; @@ -958,15 +984,15 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf) { _rtw_memcpy(tmpBuf, pU1Tmp+1, dataLen); } -// BT_SendEventExtBtInfoControl(padapter, dataLen, &tmpBuf[0]); + BT_SendEventExtBtInfoControl(padapter, dataLen, &tmpBuf[0]); } -#else +#else //!CONFIG_BT_COEXIST_SOCKET_TRX ret = _FALSE; -#endif +#endif //CONFIG_BT_COEXIST_SOCKET_TRX break; case BTC_SET_ACT_CTRL_BT_COEX: -#if 0 +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX { u8 dataLen = *pU1Tmp; u8 tmpBuf[20]; @@ -974,11 +1000,11 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf) { _rtw_memcpy(tmpBuf, pU1Tmp+1, dataLen); } -// BT_SendEventExtBtCoexControl(padapter, _FALSE, dataLen, &tmpBuf[0]); + BT_SendEventExtBtCoexControl(padapter, _FALSE, dataLen, &tmpBuf[0]); } -#else +#else //!CONFIG_BT_COEXIST_SOCKET_TRX ret = _FALSE; -#endif +#endif //CONFIG_BT_COEXIST_SOCKET_TRX break; case BTC_SET_ACT_CTRL_8723B_ANT: #if 0 @@ -1108,8 +1134,9 @@ void halbtcoutsrc_DisplayCoexStatistics(PBTC_COEXIST pBtCoexist) pBtCoexist->statistics.cntScanNotify, pBtCoexist->statistics.cntConnectNotify, pBtCoexist->statistics.cntMediaStatusNotify); CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Special pkt/Bt info", \ - pBtCoexist->statistics.cntSpecialPacketNotify, pBtCoexist->statistics.cntBtInfoNotify); + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Special pkt/Bt info/ bind", + pBtCoexist->statistics.cntSpecialPacketNotify, pBtCoexist->statistics.cntBtInfoNotify, + pBtCoexist->statistics.cntBind); CL_PRINTF(cliBuf); #endif } @@ -1165,6 +1192,11 @@ void halbtcoutsrc_DisplayWifiStatus(PBTC_COEXIST pBtCoexist) ((wifiLinkStatus&WIFI_P2P_GC_CONNECTED)? 1:0) ); CL_PRINTF(cliBuf); + if (wifiLinkStatus&WIFI_STA_CONNECTED) { + CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "IOT Peer", GLBtcIotPeerString[padapter->mlmeextpriv.mlmext_info.assoc_AP_vendor]); + 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)", \ @@ -1437,6 +1469,25 @@ void halbtcoutsrc_SetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr, u32 Data) } } +u8 halbtcoutsrc_SetBtAntDetection(void *pBtcContext, u8 txTime, u8 btChnl) +{ +/* Always return _FALSE since we don't implement this yet */ +#if 0 + PBTC_COEXIST pBtCoexist = (PBTC_COEXIST)pBtcContext; + PADAPTER Adapter = pBtCoexist->Adapter; + u1Byte btCanTx = 0; + BOOLEAN bStatus = FALSE; + + bStatus = NDBG_SetBtAntDetection(Adapter, txTime, btChnl, &btCanTx); + if (bStatus && btCanTx) + return _TRUE; + else + return _FALSE; +#else + return _FALSE; +#endif +} + u32 halbtcoutsrc_GetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr) { /* To be implemented. Always return 0 temporarily */ @@ -1458,6 +1509,20 @@ void halbtcoutsrc_FillH2cCmd(void *pBtcContext, u8 elementId, u32 cmdLen, u8 *pC //==================================== // Extern functions called by other module //==================================== +u8 EXhalbtcoutsrc_IsTfbgaPackageType(PADAPTER padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + +#ifdef CONFIG_RTL8723B + if ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA80) + || (pHalData->PackageType == PACKAGE_TFBGA90)) { + return _TRUE; + } +#endif + + return _FALSE; +} + u8 EXhalbtcoutsrc_BindBtCoexWithAdapter(void *padapter) { PBTC_COEXIST pBtCoexist=&GLBtCoexist; @@ -1488,6 +1553,16 @@ u8 EXhalbtcoutsrc_BindBtCoexWithAdapter(void *padapter) #endif // set default antenna position to main port pBtCoexist->boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT; + + pBtCoexist->boardInfo.btdmAntDetFinish = _FALSE; + pBtCoexist->boardInfo.btdmAntNumByAntDet = 1; + + pBtCoexist->boardInfo.bTfbgaPackage = EXhalbtcoutsrc_IsTfbgaPackageType((PADAPTER)padapter); + + if (pBtCoexist->boardInfo.bTfbgaPackage) + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Package Type = TFBGA\n")); + else + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Package Type = Non-TFBGA\n")); return _TRUE; } @@ -1534,6 +1609,7 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter) pBtCoexist->fBtcSet = halbtcoutsrc_Set; pBtCoexist->fBtcGetBtReg = halbtcoutsrc_GetBtReg; pBtCoexist->fBtcSetBtReg = halbtcoutsrc_SetBtReg; + pBtCoexist->fBtcSetBtAntDetection = halbtcoutsrc_SetBtAntDetection; pBtCoexist->cliBuf = &GLBtcDbgBuf[0]; @@ -1606,21 +1682,6 @@ void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist, u8 bWifiOnly) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_InitHwConfig(pBtCoexist, bWifiOnly); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_InitHwConfig(pBtCoexist, bWifiOnly); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_InitHwConfig(pBtCoexist, bWifiOnly); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_InitHwConfig(pBtCoexist, bWifiOnly); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -1660,21 +1721,6 @@ void EXhalbtcoutsrc_InitCoexDm(PBTC_COEXIST pBtCoexist) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_InitCoexDm(pBtCoexist); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_InitCoexDm(pBtCoexist); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_InitCoexDm(pBtCoexist); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_InitCoexDm(pBtCoexist); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -1734,21 +1780,6 @@ void EXhalbtcoutsrc_IpsNotify(PBTC_COEXIST pBtCoexist, u8 type) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_IpsNotify(pBtCoexist, ipsType); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_IpsNotify(pBtCoexist, ipsType); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_IpsNotify(pBtCoexist, ipsType); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_IpsNotify(pBtCoexist, ipsType); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -1806,21 +1837,6 @@ void EXhalbtcoutsrc_LpsNotify(PBTC_COEXIST pBtCoexist, u8 type) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_LpsNotify(pBtCoexist, lpsType); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_LpsNotify(pBtCoexist, lpsType); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_LpsNotify(pBtCoexist, lpsType); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_LpsNotify(pBtCoexist, lpsType); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -1877,21 +1893,6 @@ void EXhalbtcoutsrc_ScanNotify(PBTC_COEXIST pBtCoexist, u8 type) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_ScanNotify(pBtCoexist, scanType); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_ScanNotify(pBtCoexist, scanType); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_ScanNotify(pBtCoexist, scanType); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_ScanNotify(pBtCoexist, scanType); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -1944,21 +1945,6 @@ void EXhalbtcoutsrc_ConnectNotify(PBTC_COEXIST pBtCoexist, u8 action) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_ConnectNotify(pBtCoexist, assoType); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_ConnectNotify(pBtCoexist, assoType); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_ConnectNotify(pBtCoexist, assoType); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_ConnectNotify(pBtCoexist, assoType); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -2012,21 +1998,6 @@ void EXhalbtcoutsrc_MediaStatusNotify(PBTC_COEXIST pBtCoexist, RT_MEDIA_STATUS m else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, mStatus); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_MediaStatusNotify(pBtCoexist, mStatus); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_MediaStatusNotify(pBtCoexist, mStatus); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_MediaStatusNotify(pBtCoexist, mStatus); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -2086,21 +2057,6 @@ void EXhalbtcoutsrc_SpecialPacketNotify(PBTC_COEXIST pBtCoexist, u8 pktType) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_SpecialPacketNotify(pBtCoexist, packetType); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_SpecialPacketNotify(pBtCoexist, packetType); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_SpecialPacketNotify(pBtCoexist, packetType); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_SpecialPacketNotify(pBtCoexist, packetType); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -2145,21 +2101,6 @@ void EXhalbtcoutsrc_BtInfoNotify(PBTC_COEXIST pBtCoexist, u8 *tmpBuf, u8 length) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_BtInfoNotify(pBtCoexist, tmpBuf, length); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_BtInfoNotify(pBtCoexist, tmpBuf, length); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_BtInfoNotify(pBtCoexist, tmpBuf, length); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_BtInfoNotify(pBtCoexist, tmpBuf, length); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -2233,11 +2174,6 @@ void EXhalbtcoutsrc_StackOperationNotify(PBTC_COEXIST pBtCoexist, u8 type) stackOpType = BTC_STACK_OP_NONE; } - if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_StackOperationNotify(pBtCoexist, stackOpType); - } #endif } @@ -2262,23 +2198,6 @@ void EXhalbtcoutsrc_HaltNotify(PBTC_COEXIST pBtCoexist) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_HaltNotify(pBtCoexist); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_HaltNotify(pBtCoexist); - else if (pBtCoexist->boardInfo.btdmAntNum == 1) - EXhalbtc8723a1ant_HaltNotify(pBtCoexist); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_HaltNotify(pBtCoexist); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_HaltNotify(pBtCoexist); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -2405,26 +2324,6 @@ void EXhalbtcoutsrc_Periodical(PBTC_COEXIST pBtCoexist) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_Periodical(pBtCoexist); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_Periodical(pBtCoexist); - else if (pBtCoexist->boardInfo.btdmAntNum == 1) - { - if (!halbtcoutsrc_UnderIps(pBtCoexist)) - EXhalbtc8723a1ant_Periodical(pBtCoexist); - } - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_Periodical(pBtCoexist); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_Periodical(pBtCoexist); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -2501,10 +2400,10 @@ EXhalbtcoutsrc_AntennaDetection( void EXhalbtcoutsrc_StackUpdateProfileInfo(void) { -#if 0 +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX PBTC_COEXIST pBtCoexist = &GLBtCoexist; - PADAPTER padapter = (PADAPTER)GLBtCoexist.padapter; - PBT_MGNT pBtMgnt = &padapter->MgntInfo.BtInfo.BtMgnt; + PADAPTER padapter = (PADAPTER)GLBtCoexist.Adapter; + PBT_MGNT pBtMgnt = &padapter->coex_info.BtMgnt; u8 i; if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist)) @@ -2556,7 +2455,7 @@ void EXhalbtcoutsrc_StackUpdateProfileInfo(void) pBtCoexist->stackInfo.bUnknownAclExist = _TRUE; } } -#endif +#endif //CONFIG_BT_COEXIST_SOCKET_TRX } void EXhalbtcoutsrc_UpdateMinBtRssi(s8 btRssi) @@ -2684,23 +2583,6 @@ void EXhalbtcoutsrc_DisplayBtCoexInfo(PBTC_COEXIST pBtCoexist) else if (pBtCoexist->boardInfo.btdmAntNum == 1) EXhalbtc8723b1ant_DisplayCoexInfo(pBtCoexist); } - else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8723a2ant_DisplayCoexInfo(pBtCoexist); - else if (pBtCoexist->boardInfo.btdmAntNum == 1) - EXhalbtc8723a1ant_DisplayCoexInfo(pBtCoexist); - } - else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8188c2ant_DisplayCoexInfo(pBtCoexist); - } - else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter)) - { - if (pBtCoexist->boardInfo.btdmAntNum == 2) - EXhalbtc8192d2ant_DisplayCoexInfo(pBtCoexist); - } else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter)) { if (pBtCoexist->boardInfo.btdmAntNum == 2) @@ -2719,10 +2601,7 @@ void EXhalbtcoutsrc_DisplayBtCoexInfo(PBTC_COEXIST pBtCoexist) halbtcoutsrc_NormalLowPower(pBtCoexist); } -VOID -EXhalbtcoutsrc_DisplayAntIsolation( - IN PBTC_COEXIST pBtCoexist - ) +void EXhalbtcoutsrc_DisplayAntDetection(PBTC_COEXIST pBtCoexist) { if(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist)) return; @@ -2732,7 +2611,7 @@ EXhalbtcoutsrc_DisplayAntIsolation( if(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter)) { if(pBtCoexist->boardInfo.btdmAntNum == 1) - EXhalbtc8723b1ant_DisplayAntIsolation(pBtCoexist); + EXhalbtc8723b1ant_DisplayAntDetection(pBtCoexist); } halbtcoutsrc_NormalLowPower(pBtCoexist); @@ -2907,15 +2786,6 @@ void hal_btcoex_InitHwConfig(PADAPTER padapter, u8 bWifiOnly) if (!hal_btcoex_IsBtExist(padapter)) return; - if (IS_HARDWARE_TYPE_8192C(padapter)) - { - halbt_InitHwConfig92C(padapter); - } - else if(IS_HARDWARE_TYPE_8192D(padapter)) - { - halbt_InitHwConfig92D(padapter); - } - EXhalbtcoutsrc_InitHwConfig(&GLBtCoexist, bWifiOnly); EXhalbtcoutsrc_InitCoexDm(&GLBtCoexist); } @@ -2988,6 +2858,11 @@ void hal_btcoex_Hanlder(PADAPTER padapter) EXhalbtcoutsrc_Periodical(&GLBtCoexist); } +s32 hal_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter) +{ + return (s32)GLBtCoexist.btInfo.bRejectAggPkt; +} + s32 hal_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER padapter) { return (s32)GLBtCoexist.btInfo.bBtCtrlAggBufSize; @@ -3055,22 +2930,23 @@ 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; - // 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; + /* 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; } void hal_btcoex_RecordPwrMode(PADAPTER padapter, u8 *pCmdBuf, u8 cmdLen) { - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write pwrModeCmd=0x%04x%08x\n", + RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], FW write pwrModeCmd=0x%04x%08x\n", pCmdBuf[0]<<8|pCmdBuf[1], pCmdBuf[2]<<24|pCmdBuf[3]<<16|pCmdBuf[4]<<8|pCmdBuf[5])); @@ -3096,7 +2972,7 @@ void hal_btcoex_SetDBG(PADAPTER padapter, u32 *pDbgModule) if (NULL == pDbgModule) return; - for (i=0; i= leftSize)) goto exit; pstr += count; leftSize -= count; +#if 0 count = rtw_sprintf(pstr, leftSize, "INTERFACE Debug Setting Definition:\n"); if ((count < 0) || (count >= leftSize)) goto exit; @@ -3219,6 +3095,7 @@ u32 hal_btcoex_GetDBG(PADAPTER padapter, u8 *pStrBuf, u32 bufSize) goto exit; pstr += count; leftSize -= count; +#endif exit: count = pstr - pStrBuf; @@ -3246,27 +3123,61 @@ u8 hal_btcoex_IsBtLinkExist(PADAPTER padapter) return _FALSE; } +void hal_btcoex_SetBtPatchVersion(PADAPTER padapter,u16 btHciVer,u16 btPatchVer) +{ + EXhalbtcoutsrc_SetBtPatchVersion(btHciVer,btPatchVer); +} + +void hal_btcoex_SetHciVersion(PADAPTER padapter, u16 hciVersion) +{ + EXhalbtcoutsrc_SetHciVersion(hciVersion); +} + +void hal_btcoex_StackUpdateProfileInfo(void) +{ + EXhalbtcoutsrc_StackUpdateProfileInfo(); +} + /* - * Description: + * 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 + * coex mechanisn/ spital stream/ best throughput + * anttype = 0 , PSTDMA / 2SS / 0.5T , bad isolation , WiFi/BT ANT Distance<15cm , (<20dB) for 2,3 antenna + * anttype = 1 , PSTDMA / 1SS / 0.5T , normal isolaiton , 50cm>WiFi/BT ANT Distance>15cm , (>20dB) for 2 antenna + * anttype = 2 , TDMA / 2SS / T , normal isolaiton , 50cm>WiFi/BT ANT Distance>15cm , (>20dB) for 3 antenna + * anttype = 3 , no TDMA / 1SS / 0.5T , good isolation , WiFi/BT ANT Distance >50cm , (>40dB) for 2 antenna + * anttype = 4 , no TDMA / 2SS / T , good isolation , WiFi/BT ANT Distance >50cm , (>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; + PHAL_DATA_TYPE pHalData; + PBTC_COEXIST pBtCoexist = &GLBtCoexist; - //DBG_871X("####%s , anttype = %d , %d \n", __FUNCTION__,anttype,__LINE__); - pHalData = GET_HAL_DATA(padapter); + /*DBG_871X("####%s , anttype = %d , %d\n" , __func__ , anttype , __LINE__); */ + pHalData = GET_HAL_DATA(padapter); - pHalData->bt_coexist.btAntisolation= anttype; + pHalData->bt_coexist.btAntisolation = anttype; + + switch (pHalData->bt_coexist.btAntisolation) { + case 0: + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_0; + break; + case 1: + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_1; + break; + case 2: + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_2; + break; + case 3: + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_3; + break; + case 4: + pBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_4; + break; + } } @@ -3277,108 +3188,89 @@ hal_btcoex_ParseAntIsolationConfigFile( 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" ); - + 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 , rfe_type = 1; + + 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}, + {"RFE_TYPE" , &rfe_type}, + {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; + for (szLine = GetLineFromBuffer(ptmp) ; szLine != NULL; szLine = GetLineFromBuffer(ptmp)) { + /* skip comment */ + if (IsCommentString(szLine)) + continue; + + /* DBG_871X("%s : szLine = %s , strlen(szLine) = %d\n" , __func__ , 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 if (!GetU1ByteIntegerFromStringInDecimal(param_value_string , ant_isolation_param[j].value)) + DBG_871X("Fail to GetU1ByteIntegerFromStringInDecimal\n"); + + break; + } + } + } + } + } + + /* YiWei 20140716 , for BT coex antenna isolation control */ + /* rfe_type = 0 was SPDT , rfe_type = 1 was coupler */ + if (ant_num == 3 && ant_distance >= 50) + anttype = 3; + else if (ant_num == 2 && ant_distance >= 50 && rfe_type == 1) + anttype = 2; + else if (ant_num == 3 && ant_distance >= 15 && ant_distance < 50) + anttype = 2; + else if (ant_num == 2 && ant_distance >= 15 && ant_distance < 50 && rfe_type == 1) + anttype = 2; + else if ((ant_num == 2 && ant_distance < 15 && rfe_type == 1) || (ant_num == 3 && ant_distance < 15)) + anttype = 1; + else if (ant_num == 2 && rfe_type == 0) + anttype = 0; + else + anttype = 0; + + hal_btcoex_SetAntIsolationType(Adapter, anttype); + + DBG_871X("%s : ant_num = %d\n" , __func__ , ant_num); + DBG_871X("%s : ant_distance = %d\n" , __func__ , ant_distance); + DBG_871X("%s : rfe_type = %d\n" , __func__ , rfe_type); + /* DBG_871X("<===Hal_ParseAntIsolationConfigFile()\n"); */ + return rtStatus; } @@ -3388,14 +3280,10 @@ hal_btcoex_AntIsolationConfig_ParaFile( 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; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rlen = 0 , rtStatus = _FAIL; - _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN); + _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); @@ -3410,14 +3298,11 @@ hal_btcoex_AntIsolationConfig_ParaFile( } - 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); + if (rtStatus == _SUCCESS) { + /*DBG_871X("%s(): read %s ok\n", __func__ , pFileName);*/ + rtStatus = hal_btcoex_ParseAntIsolationConfigFile(Adapter , pHalData->para_file_buf); + } else { + DBG_871X("%s(): No File %s, Load from *** Array!\n" , __func__ , pFileName); } return rtStatus; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com.c index bf5256f0b80c..5c5b09849bea 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com.c @@ -30,51 +30,12 @@ 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) { int cnt = 0; - u8 buf[128]; + u8 buf[128]={0}; - if(IS_81XXC(ChipVersion)){ - cnt += sprintf((buf+cnt), "Chip Version Info: %s_", IS_92C_SERIAL(ChipVersion)?"CHIP_8192C":"CHIP_8188C"); - } - else if(IS_92D(ChipVersion)){ - cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8192D_"); - } - else if(IS_8723_SERIES(ChipVersion)){ - cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8723A_"); - } - else if(IS_8188E(ChipVersion)){ + if(IS_8188E(ChipVersion)){ cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8188E_"); } else if(IS_8812_SERIES(ChipVersion)){ @@ -98,26 +59,70 @@ void dump_chip_info(HAL_VERSION ChipVersion) else if(IS_CHIP_VENDOR_SMIC(ChipVersion)) cnt += sprintf((buf+cnt), "%s_","SMIC"); - if(IS_A_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "A_CUT_"); - else if(IS_B_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "B_CUT_"); - else if(IS_C_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "C_CUT_"); - else if(IS_D_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "D_CUT_"); - else if(IS_E_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "E_CUT_"); - else if(IS_I_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "I_CUT_"); - else if(IS_J_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "J_CUT_"); - else if(IS_K_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "K_CUT_"); - else cnt += sprintf((buf+cnt), "UNKNOWN_CUT(%d)_", ChipVersion.CUTVersion); + if (IS_A_CUT(ChipVersion)) + cnt += sprintf((buf+cnt), "A_CUT_"); + else if (IS_B_CUT(ChipVersion)) + cnt += sprintf((buf+cnt), "B_CUT_"); + else if (IS_C_CUT(ChipVersion)) + cnt += sprintf((buf+cnt), "C_CUT_"); + else if (IS_D_CUT(ChipVersion)) + cnt += sprintf((buf+cnt), "D_CUT_"); + else if (IS_E_CUT(ChipVersion)) + cnt += sprintf((buf+cnt), "E_CUT_"); + else if (IS_F_CUT(ChipVersion)) + cnt += sprintf((buf+cnt), "F_CUT_"); + else if (IS_I_CUT(ChipVersion)) + cnt += sprintf((buf+cnt), "I_CUT_"); + else if (IS_J_CUT(ChipVersion)) + cnt += sprintf((buf+cnt), "J_CUT_"); + else if (IS_K_CUT(ChipVersion)) + cnt += sprintf((buf+cnt), "K_CUT_"); + else + cnt += sprintf((buf+cnt), "UNKNOWN_CUT(%d)_", ChipVersion.CUTVersion); if(IS_1T1R(ChipVersion)) cnt += sprintf((buf+cnt), "1T1R_"); else if(IS_1T2R(ChipVersion)) cnt += sprintf((buf+cnt), "1T2R_"); else if(IS_2T2R(ChipVersion)) cnt += sprintf((buf+cnt), "2T2R_"); + else if(IS_3T3R(ChipVersion)) cnt += sprintf((buf+cnt), "3T3R_"); + else if(IS_3T4R(ChipVersion)) cnt += sprintf((buf+cnt), "3T4R_"); + else if(IS_4T4R(ChipVersion)) cnt += sprintf((buf+cnt), "4T4R_"); else cnt += sprintf((buf+cnt), "UNKNOWN_RFTYPE(%d)_", ChipVersion.RFType); cnt += sprintf((buf+cnt), "RomVer(%d)\n", ChipVersion.ROMVer); DBG_871X("%s", buf); } - +void rtw_hal_config_rftype(PADAPTER padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if (IS_1T1R(pHalData->VersionID)) { + pHalData->rf_type = RF_1T1R; + pHalData->NumTotalRFPath = 1; + } + else if (IS_2T2R(pHalData->VersionID)) { + pHalData->rf_type = RF_2T2R; + pHalData->NumTotalRFPath = 2; + } + else if (IS_1T2R(pHalData->VersionID)) { + pHalData->rf_type = RF_1T2R; + pHalData->NumTotalRFPath = 2; + } + else if(IS_3T3R(pHalData->VersionID)) { + pHalData->rf_type = RF_3T3R; + pHalData->NumTotalRFPath = 3; + } + else if(IS_4T4R(pHalData->VersionID)) { + pHalData->rf_type = RF_4T4R; + pHalData->NumTotalRFPath = 4; + } + else { + pHalData->rf_type = RF_1T1R; + pHalData->NumTotalRFPath = 1; + } + + DBG_871X("%s RF_Type is %d TotalTxPath is %d \n", __FUNCTION__, pHalData->rf_type, pHalData->NumTotalRFPath); +} #define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 @@ -627,10 +632,10 @@ Hal_MappingOutPipe( void hal_init_macaddr(_adapter *adapter) { - rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr); + rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter_mac_addr(adapter)); #ifdef CONFIG_CONCURRENT_MODE if (adapter->pbuddy_adapter) - rtw_hal_set_hwreg(adapter->pbuddy_adapter, HW_VAR_MAC_ADDR, adapter->pbuddy_adapter->eeprompriv.mac_addr); + rtw_hal_set_hwreg(adapter->pbuddy_adapter, HW_VAR_MAC_ADDR, adapter_mac_addr(adapter->pbuddy_adapter)); #endif } @@ -662,7 +667,7 @@ s32 c2h_evt_read(_adapter *adapter, u8 *buf) if (buf == NULL) goto exit; -#if defined(CONFIG_RTL8192C) || defined(CONFIG_RTL8192D) || defined(CONFIG_RTL8723A) || defined (CONFIG_RTL8188E) +#if defined (CONFIG_RTL8188E) trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR); @@ -689,7 +694,7 @@ s32 c2h_evt_read(_adapter *adapter, u8 *buf) /* Read the content */ for (i = 0; i < c2h_evt->plen; i++) - c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + sizeof(*c2h_evt) + i); + c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i); RT_PRINT_DATA(_module_hal_init_c_, _drv_info_, "c2h_evt_read(): Command Content:\n", c2h_evt->payload, c2h_evt->plen); @@ -798,7 +803,7 @@ u8 rtw_get_mgntframe_raid(_adapter *adapter,unsigned char network_type) void rtw_hal_update_sta_rate_mask(PADAPTER padapter, struct sta_info *psta) { u8 i, rf_type, limit; - u32 tx_ra_bitmap; + u64 tx_ra_bitmap; if(psta == NULL) { @@ -825,11 +830,14 @@ void rtw_hal_update_sta_rate_mask(PADAPTER padapter, struct sta_info *psta) #endif //CONFIG_80211AC_VHT { //n mode ra_bitmap - if(psta->htpriv.ht_option) + if(psta->htpriv.ht_option) { + rf_type = RF_1T1R; rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); if(rf_type == RF_2T2R) limit=16;// 2R + else if(rf_type == RF_3T3R) + limit=24;// 3R else limit=8;// 1R @@ -840,7 +848,8 @@ void rtw_hal_update_sta_rate_mask(PADAPTER padapter, struct sta_info *psta) } } #endif //CONFIG_80211N_HT - + DBG_871X("supp_mcs_set = %02x, %02x, %02x, rf_type=%d, tx_ra_bitmap=%016llx\n" + , psta->htpriv.ht_cap.supp_mcs_set[0], psta->htpriv.ht_cap.supp_mcs_set[1], psta->htpriv.ht_cap.supp_mcs_set[2], rf_type, tx_ra_bitmap); psta->ra_mask = tx_ra_bitmap; psta->init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f; } @@ -964,7 +973,7 @@ void hw_var_port_switch(_adapter *adapter) /* write bcn ctl */ #ifdef CONFIG_BT_COEXIST -#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B) +#if defined(CONFIG_RTL8723B) // always enable port0 beacon function for PSTDMA bcn_ctrl_1 |= EN_BCN_FUNCTION; // always disable port1 beacon function for PSTDMA @@ -1061,23 +1070,77 @@ void rtw_hal_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) 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, + ret = rtw_hal_fill_h2c_cmd(padapter, H2C_RSVD_PAGE, H2C_RSVDPAGE_LOC_LEN, u1H2CRsvdPageParm); + +} + +void rtw_hal_set_ap_wow_rsvdpage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) +{ + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct hal_ops *pHalFunc = &padapter->HalFunc; + u8 res = 0, count = 0, header = 0; + u8 rsvdparm[H2C_AOAC_RSVDPAGE_LOC_LEN] = {0}; + + header = rtw_read8(padapter, 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); + + if (pHalFunc->fill_h2c_cmd != NULL) { + res = pHalFunc->fill_h2c_cmd(padapter, + H2C_BCN_RSVDPAGE, + H2C_BCN_RSVDPAGE_LEN, + rsvdparm); } else { DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__); - ret = _FAIL; + res = _FAIL; + } + + rtw_msleep_os(10); + + _rtw_memset(&rsvdparm, 0, sizeof(rsvdparm)); + + SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp( + rsvdparm, + rsvdpageloc->LocProbeRsp + header); + + if (pHalFunc->fill_h2c_cmd != NULL) { + res = pHalFunc->fill_h2c_cmd(padapter, + H2C_PROBERSP_RSVDPAGE, + H2C_PROBERSP_RSVDPAGE_LEN, + rsvdparm); + } else { + DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__); + res = _FAIL; } + + rtw_msleep_os(10); } #ifdef CONFIG_GPIO_WAKEUP -static void rtw_hal_set_output_gpio(_adapter* padapter, u8 index, u8 outputval) +/* + * Switch GPIO_13, GPIO_14 to wlan control, or pull GPIO_13,14 MUST fail. + * It happended at 8723B/8192E/8821A. New IC will check multi function GPIO, + * and implement HAL function. + */ +static void rtw_hal_switch_gpio_wl_ctrl(_adapter* padapter, u8 index, u8 enable) { - u8 val8; + if (index !=13 && index != 14) return; + rtw_hal_set_hwreg(padapter, HW_SET_GPIO_WL_CTRL, (u8 *)(&enable)); +} +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, @@ -1097,23 +1160,11 @@ static void rtw_hal_set_output_gpio(_adapter* padapter, u8 index, u8 outputval) rtw_write8(padapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(padapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(index)); } - } else if (index <= 15) { + } else if (index <= 15){ /* 88C Series: */ /* index: 11~8 transform to 3~0 */ /* 8723 Series: */ /* index: 12~8 transform to 4~0 */ -#ifdef CONFIG_RTL8723B - if ((index == 13) || (index == 14)) { - // Set BIT_GPIO13_14_WL_CTRL_EN to 0 - val8 = rtw_read8(padapter, 0x4e); - if (val8 & BIT(6)) { - val8 &= ~BIT(6); - rtw_write8(padapter, 0x4e, val8); - DBG_871X("%s: set GPIO%d to WL control, 0x4E=0x%02X\n", - __FUNCTION__, index, rtw_read8(padapter, 0x4e)); - } - } -#endif // CONFIG_RTL8723B index -= 8; @@ -1136,26 +1187,10 @@ static void rtw_hal_set_output_gpio(_adapter* padapter, u8 index, u8 outputval) rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 1) & ~BIT(index)); } } else { - DBG_871X("%s: invalid GPIO%d=%d\n", __FUNCTION__, index, outputval); + DBG_871X("%s: invalid GPIO%d=%d\n", + __FUNCTION__, index, outputval); } } - -/* - * Set GPIO high/low under init and - * fw will trigger Low/High Pulse when need to wake up host - */ -void rtw_clear_hostwakeupgpio(PADAPTER padapter) -{ - u8 high = 0; - - -#ifdef CONFIG_GPIO_WAKEUP_LOW_ACTIVE - high = 1; -#endif // CONFIG_GPIO_WAKEUP_LOW_ACTIVE - DBG_871X("%s: Set GPIO%d to %s for wake\n", - __FUNCTION__, WAKEUP_GPIO_IDX, high?"high":"low"); - rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, high); -} #endif void rtw_hal_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) @@ -1182,15 +1217,10 @@ void rtw_hal_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc #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, + ret = rtw_hal_fill_h2c_cmd(padapter, H2C_AOAC_RSVD_PAGE, H2C_AOAC_RSVDPAGE_LOC_LEN, u1H2CAoacRsvdPageParm); - } else { - DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__); - ret = _FAIL; - } } #ifdef CONFIG_PNO_SUPPORT else @@ -1202,15 +1232,10 @@ void rtw_hal_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc sizeof(u1H2CAoacRsvdPageParm)); SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocPNOInfo); - if (pHalFunc->fill_h2c_cmd != NULL) { - ret = pHalFunc->fill_h2c_cmd(padapter, + ret = rtw_hal_fill_h2c_cmd(padapter, H2C_AOAC_RSVDPAGE3, H2C_AOAC_RSVDPAGE_LOC_LEN, u1H2CAoacRsvdPageParm); - } else { - DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__); - ret = _FAIL; - } } } #endif //CONFIG_PNO_SUPPORT @@ -1312,132 +1337,6 @@ static void rtw_hal_enable_tx_report(_adapter* adapter) DBG_871X("enable TX_RPT:0x%02x\n", rtw_read8(adapter, REG_TX_RPT_CTRL)); } -void rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen, - u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame) -{ - - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct hal_ops *pHalFunc = &padapter->HalFunc; - struct tx_desc *ptxdesc; - - // Clear all status - _rtw_memset(pDesc, 0, TXDESC_SIZE); - - if (TXDESC_SIZE == 32) { - ptxdesc = (struct tx_desc*)pDesc; - //offset 0 - //own, bFirstSeg, bLastSeg; - ptxdesc->txdw0 |= - cpu_to_le32( BIT(31) | BIT(27)| BIT(26)); - - //32 bytes for TX Desc - ptxdesc->txdw0 |= - cpu_to_le32(((TXDESC_SIZE + 0) << 16)&0x00ff0000); - - // Buffer size + command header - ptxdesc->txdw0 |= - cpu_to_le32(BufferLen&0x0000ffff); - - //offset 4 - // Fixed queue of Mgnt queue - ptxdesc->txdw1 |= cpu_to_le32((QSLT_MGNT<< 8)&0x00001f00); - - //Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw. - if (IsPsPoll) { - ptxdesc->txdw1 |= cpu_to_le32(BIT(20)); - } else { - // Hw set sequence number - ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); - //set bit3 to 1. Suugested by TimChen. 2009.12.29. - ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); - } - - if (_TRUE == IsBTQosNull) { - ptxdesc->txdw2 |= cpu_to_le32(BIT(23)); // BT NULL - } - - //offset 16 - //driver uses rate - ptxdesc->txdw4 |= cpu_to_le32(BIT(8)); - - } else if (TXDESC_SIZE == 40) { - SET_TX_DESC_FIRST_SEG(pDesc, 1); //bFirstSeg; - SET_TX_DESC_LAST_SEG(pDesc, 1); //bLastSeg; - - SET_TX_DESC_OFFSET(pDesc, TXDESC_SIZE); - - SET_TX_DESC_PKT_SIZE(pDesc, BufferLen); // Buffer size + command header - - if (pmlmeext->cur_wireless_mode & WIRELESS_11B) { - SET_TX_DESC_RATE_ID(pDesc, RATR_INX_WIRELESS_B); - } else { - SET_TX_DESC_RATE_ID(pDesc, RATR_INX_WIRELESS_G); - } - - SET_TX_DESC_QUEUE_SEL(pDesc, QSLT_MGNT); // Fixed queue of Mgnt queue - - // Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw. - if (_TRUE == IsPsPoll) { - SET_TX_DESC_NAV_USE_HDR(pDesc, 1); - } else { - SET_TX_DESC_HWSEQ_EN(pDesc, 1); // Hw set sequence number - SET_TX_DESC_HWSEQ_SEL(pDesc, 0); - } - - if (_TRUE ==IsBTQosNull) { - SET_TX_DESC_BT_INT(pDesc, 1); - } - - SET_TX_DESC_USE_RATE(pDesc, 1); // use data rate which is set by Sw - SET_TX_DESC_OWN((pu1Byte)pDesc, 1); - - SET_TX_DESC_TX_RATE(pDesc, MRateToHwRate(pmlmeext->tx_rate)); - - } - - // - // Encrypt the data frame if under security mode excepct null data. - // Suggested by CCW. - // - if (_TRUE ==bDataFrame) - { - u32 EncAlg; - - EncAlg = padapter->securitypriv.dot11PrivacyAlgrthm; - switch (EncAlg) - { - case _NO_PRIVACY_: - SET_TX_DESC_SEC_TYPE(pDesc, 0x0); - break; - case _WEP40_: - case _WEP104_: - case _TKIP_: - SET_TX_DESC_SEC_TYPE(pDesc, 0x1); - break; - case _SMS4_: - SET_TX_DESC_SEC_TYPE(pDesc, 0x2); - break; - case _AES_: - SET_TX_DESC_SEC_TYPE(pDesc, 0x3); - break; - default: - SET_TX_DESC_SEC_TYPE(pDesc, 0x0); - break; - } - } - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - // USB interface drop packet if the checksum of descriptor isn't correct. - // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.). - if(pHalFunc->hal_cal_txdesc_chksum != NULL) -#if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8723A) ||defined(CONFIG_RTL8723B) - pHalFunc->hal_cal_txdesc_chksum((struct tx_desc*)pDesc); -#else - pHalFunc->hal_cal_txdesc_chksum(pDesc); -#endif //CONFIG_RTL8188E || CONFIG_RTL8723B -#endif -} - static void rtw_hal_backup_rate(_adapter* adapter) { DBG_871X("%s\n", __func__); @@ -1559,7 +1458,7 @@ static void rtw_hal_fw_sync_cam_id(_adapter* adapter) write_cam(adapter, cam_id, ctrl, null_addr, get_key); } index++; - }while(cam_id != -1); + }while(index < 4); rtw_write8(adapter, REG_SECCFG, 0xcc); } @@ -1567,13 +1466,13 @@ static void rtw_hal_fw_sync_cam_id(_adapter* adapter) static void rtw_hal_update_gtk_offload_info(_adapter* adapter) { struct security_priv *psecuritypriv = &adapter->securitypriv; - int cam_id; + u8 defualt_cam_id=0; + u8 cam_id=5; 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; + u8 index = 1; u16 ctrl = 0; u32 algorithm = 0; @@ -1584,38 +1483,29 @@ static void rtw_hal_update_gtk_offload_info(_adapter* adapter) return; } - _rtw_memset(null_key, 0, sizeof(null_key)); + _rtw_memset(get_key, 0, sizeof(get_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); + //chech if GK + if(read_phy_cam_is_gtk(adapter, defualt_cam_id) == _TRUE) + { + read_cam(adapter ,defualt_cam_id, get_key); algorithm = psecuritypriv->dot11PrivacyAlgrthm; - ctrl = BIT(15) | BIT6 |(algorithm << 2) | index; - write_cam(adapter, cam_id+4, ctrl, - addr, get_key); + //in defualt cam entry, cam id = key id + ctrl = BIT(15) | BIT6 |(algorithm << 2) | defualt_cam_id; + write_cam(adapter, cam_id, ctrl, addr, get_key); + cam_id++; ctrl = 0; - write_cam(adapter, cam_id, ctrl, - null_addr, get_key); + write_cam(adapter, defualt_cam_id, ctrl, null_addr, get_key); } - if (gtk_keyindex < 4 &&(index == gtk_keyindex)) { + if (gtk_keyindex < 4 &&(defualt_cam_id == gtk_keyindex)) { psecuritypriv->dot118021XGrpKeyid = gtk_keyindex; _rtw_memcpy(psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, get_key, 16); @@ -1627,8 +1517,8 @@ static void rtw_hal_update_gtk_offload_info(_adapter* adapter) psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[2], psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[3]); } - index++; - }while(index < 4); + defualt_cam_id++; + }while(defualt_cam_id < 4); rtw_write8(adapter, REG_SECCFG, 0x0c); #ifdef CONFIG_GTK_OL_DBG @@ -1671,15 +1561,10 @@ static u8 rtw_hal_set_keep_alive_cmd(_adapter *adapter, u8 enable, u8 pkt_type) 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, + ret = rtw_hal_fill_h2c_cmd(adapter, H2C_KEEP_ALIVE, H2C_KEEP_ALIVE_CTRL_LEN, u1H2CKeepAliveParm); - } else { - DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__); - ret = _FAIL; - } return ret; } @@ -1697,16 +1582,10 @@ static u8 rtw_hal_set_disconnect_decision_cmd(_adapter *adapter, u8 enable) 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, + ret = rtw_hal_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; } @@ -1720,15 +1599,10 @@ static u8 rtw_hal_set_ap_offload_ctrl_cmd(_adapter *adapter, u8 enable) SET_H2CCMD_AP_WOWLAN_EN(u1H2CAPOffloadCtrlParm, enable); - if (pHalFunc->fill_h2c_cmd != NULL) { - ret = pHalFunc->fill_h2c_cmd(adapter, + ret = rtw_hal_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; } @@ -1739,11 +1613,6 @@ static u8 rtw_hal_set_ap_rsvdpage_loc_cmd(_adapter *adapter, 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__, @@ -1754,7 +1623,7 @@ static u8 rtw_hal_set_ap_rsvdpage_loc_cmd(_adapter *adapter, SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_BCN(rsvdparm, rsvdpageloc->LocApOffloadBCN + header); - ret = pHalFunc->fill_h2c_cmd(adapter, H2C_BCN_RSVDPAGE, + ret = rtw_hal_fill_h2c_cmd(adapter, H2C_BCN_RSVDPAGE, H2C_BCN_RSVDPAGE_LEN, rsvdparm); if (ret == _FAIL) @@ -1765,7 +1634,7 @@ static u8 rtw_hal_set_ap_rsvdpage_loc_cmd(_adapter *adapter, SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp(rsvdparm, rsvdpageloc->LocProbeRsp + header); - ret = pHalFunc->fill_h2c_cmd(adapter, H2C_PROBERSP_RSVDPAGE, + ret = rtw_hal_fill_h2c_cmd(adapter, H2C_PROBERSP_RSVDPAGE, H2C_PROBERSP_RSVDPAGE_LEN, rsvdparm); if (ret == _FAIL) @@ -1774,7 +1643,7 @@ static u8 rtw_hal_set_ap_rsvdpage_loc_cmd(_adapter *adapter, return ret; } -u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable) +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); @@ -1782,7 +1651,7 @@ u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable) u8 u1H2CWoWlanCtrlParm[H2C_WOWLAN_LEN]={0}; u8 discont_wake = 1, gpionum = 0, gpio_dur = 0; - u8 hw_unicast = 0, gpio_pulse_cnt = 0; + u8 hw_unicast = 0, gpio_pulse_cnt=0; u8 sdio_wakeup_enable = 1; u8 gpio_high_active = 0; //0: low active, 1: high active u8 magic_pkt = 0; @@ -1791,12 +1660,6 @@ u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable) #ifdef CONFIG_GPIO_WAKEUP gpionum = WAKEUP_GPIO_IDX; sdio_wakeup_enable = 0; - gpio_dur = 32; // 32*32us = 1024us -#ifdef CONFIG_GPIO_WAKEUP_LOW_ACTIVE - gpio_high_active = 0; -#else // !CONFIG_GPIO_WAKEUP_LOW_ACTIVE - gpio_high_active = 1; -#endif // !CONFIG_GPIO_WAKEUP_LOW_ACTIVE #endif //CONFIG_GPIO_WAKEUP if (!ppwrpriv->wowlan_pno_enable) @@ -1804,12 +1667,10 @@ u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable) if (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_) hw_unicast = 1; - else if (IS_HARDWARE_TYPE_8192E(adapter)) - hw_unicast = 1; else hw_unicast = 0; - DBG_871X("%s: enable=%d GPIO=%d\n", __FUNCTION__, enable, gpionum); + DBG_871X("%s(): enable=%d\n", __func__, enable); SET_H2CCMD_WOWLAN_FUNC_ENABLE(u1H2CWoWlanCtrlParm, enable); SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(u1H2CWoWlanCtrlParm, 0); @@ -1823,23 +1684,19 @@ u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable) SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(u1H2CWoWlanCtrlParm, discont_wake); SET_H2CCMD_WOWLAN_GPIONUM(u1H2CWoWlanCtrlParm, gpionum); SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(u1H2CWoWlanCtrlParm, sdio_wakeup_enable); - SET_H2CCMD_WOWLAN_GPIO_DURATION(u1H2CWoWlanCtrlParm, gpio_dur); // (real)unit: 32us - SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 1); + SET_H2CCMD_WOWLAN_GPIO_DURATION(u1H2CWoWlanCtrlParm, gpio_dur); #ifdef CONFIG_PLATFORM_ARM_RK3188 - SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, 4); + SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 1); + SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, 0x04); #else + SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 0); SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, gpio_pulse_cnt); #endif - if (pHalFunc->fill_h2c_cmd != NULL) { - ret = pHalFunc->fill_h2c_cmd(adapter, + ret = rtw_hal_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; } @@ -1872,6 +1729,15 @@ static u8 rtw_hal_set_remote_wake_ctrl_cmd(_adapter *adapter, u8 enable) SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN( u1H2CRemoteWakeCtrlParm, 1); + + /* + * filter NetBios name service pkt to avoid being waked-up + * by this kind of unicast pkt this exceptional modification + * is used for match competitor's behavior + */ + SET_H2CCMD_REMOTE_WAKE_CTRL_NBNS_FILTER_EN( + u1H2CRemoteWakeCtrlParm, 1); + if ((psecuritypriv->dot11PrivacyAlgrthm == _AES_) || (psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_)) { SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION( @@ -1880,6 +1746,9 @@ static u8 rtw_hal_set_remote_wake_ctrl_cmd(_adapter *adapter, u8 enable) SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION( u1H2CRemoteWakeCtrlParm, 1); } + + SET_H2CCMD_REMOTE_WAKE_CTRL_FW_PARSING_UNTIL_WAKEUP( + u1H2CRemoteWakeCtrlParm, 1); } #ifdef CONFIG_PNO_SUPPORT else { @@ -1904,15 +1773,10 @@ static u8 rtw_hal_set_remote_wake_ctrl_cmd(_adapter *adapter, u8 enable) #endif //CONFIG_P2P_WOWLAN - if (pHalFunc->fill_h2c_cmd != NULL) { - ret = pHalFunc->fill_h2c_cmd(adapter, + ret = rtw_hal_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; } @@ -1929,15 +1793,10 @@ static u8 rtw_hal_set_global_info_cmd(_adapter* adapter, u8 group_alg, u8 pairwi SET_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(u1H2CAOACGlobalInfoParm, group_alg); - if (pHalFunc->fill_h2c_cmd != NULL) { - ret = pHalFunc->fill_h2c_cmd(adapter, + ret = rtw_hal_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; } @@ -1957,6 +1816,7 @@ static u8 rtw_hal_set_scan_offload_info_cmd(_adapter* adapter, rsvdpageloc->LocScanInfo, rsvdpageloc->LocSSIDInfo); SET_H2CCMD_AOAC_NLO_FUN_EN(u1H2CScanOffloadInfoParm, enable); + SET_H2CCMD_AOAC_NLO_IPS_EN(u1H2CScanOffloadInfoParm, enable); SET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(u1H2CScanOffloadInfoParm, rsvdpageloc->LocScanInfo); SET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(u1H2CScanOffloadInfoParm, @@ -1964,15 +1824,10 @@ static u8 rtw_hal_set_scan_offload_info_cmd(_adapter* adapter, SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(u1H2CScanOffloadInfoParm, rsvdpageloc->LocSSIDInfo); - if (pHalFunc->fill_h2c_cmd != NULL) { - ret = pHalFunc->fill_h2c_cmd(adapter, + ret = rtw_hal_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 @@ -2109,7 +1964,7 @@ static void rtw_hal_construct_P2PBeacon(_adapter *padapter, u8 *pframe, u32 *pLe *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); @@ -2419,7 +2274,7 @@ static void rtw_hal_construct_P2PProbeRsp(_adapter *padapter, u8 *pframe, u32 *p DBG_871X("%s\n", __FUNCTION__); pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - mac = myid(&(padapter->eeprompriv)); + mac = adapter_mac_addr(padapter); fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; @@ -2579,7 +2434,7 @@ static void rtw_hal_construct_P2PProbeRsp(_adapter *padapter, u8 *pframe, u32 *p // Value: if (pwdinfo->external_uuid == 0) { _rtw_memset( wpsie + wpsielen, 0x0, 16 ); - _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(wpsie + wpsielen, mac, ETH_ALEN); } else { _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 ); } @@ -2770,8 +2625,8 @@ static void rtw_hal_construct_P2PNegoRsp(_adapter *padapter, u8 *pframe, u32 *pL //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); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); SetSeqNum(pwlanhdr, 0); SetFrameSubType(pframe, WIFI_ACTION); @@ -2983,7 +2838,7 @@ static void rtw_hal_construct_P2PNegoRsp(_adapter *padapter, u8 *pframe, u32 *pL p2pielen += 2; // Value: - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; // Channel List @@ -3101,7 +2956,7 @@ static void rtw_hal_construct_P2PNegoRsp(_adapter *padapter, u8 *pframe, u32 *pL // Value: // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; // Config Method @@ -3228,7 +3083,7 @@ static void rtw_hal_construct_P2PInviteRsp(_adapter * padapter, u8 * pframe, u32 //RA fill by FW _rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); //BSSID fill by FW _rtw_memset(pwlanhdr->addr3, 0, ETH_ALEN); @@ -3332,7 +3187,7 @@ static void rtw_hal_construct_P2PInviteRsp(_adapter * padapter, u8 * pframe, u32 // Value: // P2P Device Address for GO - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; } @@ -3502,8 +3357,8 @@ static void rtw_hal_construct_P2PProvisionDisRsp(_adapter * padapter, u8 * pfram //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); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); SetSeqNum(pwlanhdr,0); SetFrameSubType(pframe, WIFI_ACTION); @@ -3595,15 +3450,10 @@ u8 rtw_hal_set_FwP2PRsvdPage_cmd(_adapter* adapter, PRSVDPAGE_LOC rsvdpageloc) 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, + ret = rtw_hal_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; } @@ -3642,16 +3492,10 @@ u8 rtw_hal_set_p2p_wowlan_offload_cmd(_adapter* adapter) 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, + ret = rtw_hal_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); @@ -3678,7 +3522,7 @@ static void rtw_hal_construct_beacon(_adapter *padapter, *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); @@ -3787,7 +3631,7 @@ static void rtw_hal_construct_PSPoll(_adapter *padapter, _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); // TA. - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); *pLength = 16; } @@ -3827,19 +3671,19 @@ static void rtw_hal_construct_NullFunctionData( 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->addr2, adapter_mac_addr(padapter), 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); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), 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->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); break; } @@ -3865,6 +3709,47 @@ static void rtw_hal_construct_NullFunctionData( *pLength = pktlen; } +void rtw_hal_construct_ProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u8 *mac, *bssid; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + + /*DBG_871X("%s\n", __FUNCTION__);*/ + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + mac = adapter_mac_addr(padapter); + bssid = cur_network->MacAddress; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); + + SetSeqNum(pwlanhdr, 0); + SetFrameSubType(fctrl, WIFI_PROBERSP); + + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += pktlen; + + if (cur_network->IELength > MAX_IE_SZ) + return; + + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pktlen += cur_network->IELength; + + *pLength = pktlen; +} + + #ifdef CONFIG_WOWLAN // // Description: @@ -3904,7 +3789,7 @@ static void rtw_hal_construct_ARPRsp( //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->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, 0); @@ -3966,7 +3851,7 @@ static void rtw_hal_construct_ARPRsp( 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_MAC_ADDR(pARPRspPkt, adapter_mac_addr(padapter)); SET_ARP_PKT_SENDER_IP_ADDR(pARPRspPkt, pIPAddress); #ifdef CONFIG_ARP_KEEP_ALIVE if (rtw_gw_addr_query(padapter)==0) { @@ -4046,7 +3931,7 @@ static void rtw_hal_construct_ProbeReq(_adapter *padapter, u8 *pframe, u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - mac = myid(&(padapter->eeprompriv)); + mac = adapter_mac_addr(padapter); fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; @@ -4245,7 +4130,7 @@ static void rtw_hal_construct_GTKRsp( get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, - myid(&(padapter->eeprompriv)), ETH_ALEN); + adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); @@ -4311,6 +4196,7 @@ static void rtw_hal_construct_GTKRsp( } #endif //CONFIG_GTK_OL +#endif //CONFIG_WOWLAN // @@ -4355,6 +4241,7 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) u8 cur_dot11txpn[8]; #ifdef CONFIG_GTK_OL struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecpriv = NULL; struct sta_info * psta; u8 kek[RTW_KEK_LEN]; u8 kck[RTW_KCK_LEN]; @@ -4382,16 +4269,15 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) 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__); - } + if (PageSize == 0) { + DBG_871X("[Error]: %s, PageSize is zero!!\n", __func__); + return; + } + + RsvdPageNum = rtw_hal_get_txbuff_rsvd_page_num(adapter, _TRUE); + DBG_871X("%s PageSize: %d, RsvdPageNUm: %d\n",__func__, PageSize, RsvdPageNum); + MaxRsvdPageBufSize = RsvdPageNum*PageSize; pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv); @@ -4410,7 +4296,7 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) // 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); + CurtPktPageNum = (u8)PageNum((TxDescLen + BeaconLength), PageSize); //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; @@ -4546,10 +4432,27 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) //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(IS_HARDWARE_TYPE_8188E(adapter) || IS_HARDWARE_TYPE_8812(adapter)){ + psecpriv = &adapter->securitypriv; + _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen, + &psecpriv->dot11PrivacyAlgrthm, 1); + _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen+1, + &psecpriv->dot118021XGrpPrivacy, 1); + _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen+2, + kck, RTW_KCK_LEN); + _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen+2+RTW_KCK_LEN, + kek, RTW_KEK_LEN); + + CurtPktPageNum = (u8)PageNum(TxDescLen + 2 + RTW_KCK_LEN + RTW_KEK_LEN, PageSize); + } + else{ + _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen, + kck, RTW_KCK_LEN); + _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen+RTW_KCK_LEN, + kek, RTW_KEK_LEN); + + CurtPktPageNum = (u8)PageNum(TxDescLen + RTW_KCK_LEN + RTW_KEK_LEN, PageSize); + } #if 0 { int i; @@ -4567,8 +4470,6 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) // __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); @@ -4639,18 +4540,6 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) &ReservedPagePacket[BufIndex-TxDescLen], ProbeReqLength, _FALSE, _FALSE, _FALSE); -#ifdef CONFIG_PNO_SET_DEBUG - { - int gj; - printk("probe req pkt=> \n"); - for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) { - printk(" %02x ",ReservedPagePacket[BufIndex- TxDescLen + gj]); - if ((gj + 1)%8==0) - printk("\n"); - } - printk(" <=end\n"); - } -#endif CurtPktPageNum = (u8)PageNum(TxDescLen + ProbeReqLength, PageSize); @@ -4675,18 +4564,6 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) &ReservedPagePacket[BufIndex-TxDescLen], ProbeReqLength, _FALSE, _FALSE, _FALSE); -#ifdef CONFIG_PNO_SET_DEBUG - { - int gj; - printk("probe req pkt=> \n"); - for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) { - printk(" %02x ", ReservedPagePacket[BufIndex- TxDescLen + gj]); - if ((gj + 1)%8==0) - printk("\n"); - } - printk(" <=end\n"); - } -#endif CurtPktPageNum = (u8)PageNum(TxDescLen + ProbeReqLength, PageSize); @@ -4700,18 +4577,6 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) rtw_hal_construct_PNO_info(adapter, &ReservedPagePacket[BufIndex -TxDescLen], &PNOLength); -#ifdef CONFIG_PNO_SET_DEBUG - { - int gj; - printk("PNO pkt=> \n"); - for(gj=0; gj < PNOLength; gj++) { - printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen +gj]); - if ((gj + 1)%8==0) - printk("\n"); - } - printk(" <=end\n"); - } -#endif CurtPktPageNum = (u8)PageNum_128(PNOLength); TotalPageNum += CurtPktPageNum; @@ -4722,18 +4587,7 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) rtw_hal_construct_ssid_list(adapter, &ReservedPagePacket[BufIndex-TxDescLen], &SSIDLegnth); -#ifdef CONFIG_PNO_SET_DEBUG - { - int gj; - printk("SSID list pkt=> \n"); - for(gj=0; gj < SSIDLegnth; gj++) { - printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]); - if ((gj + 1)%8==0) - printk("\n"); - } - printk(" <=end\n"); - } -#endif + CurtPktPageNum = (u8)PageNum_128(SSIDLegnth); TotalPageNum += CurtPktPageNum; BufIndex += (CurtPktPageNum*PageSize); @@ -4743,18 +4597,7 @@ void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished) rtw_hal_construct_scan_info(adapter, &ReservedPagePacket[BufIndex-TxDescLen], &ScanInfoLength); -#ifdef CONFIG_PNO_SET_DEBUG - { - int gj; - printk("Scan info pkt=> \n"); - for(gj=0; gj < ScanInfoLength; gj++) { - printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]); - if ((gj + 1)%8==0) - printk("\n"); - } - printk(" <=end\n"); - } -#endif + CurtPktPageNum = (u8)PageNum(ScanInfoLength, PageSize); TotalPageNum += CurtPktPageNum; BufIndex += (CurtPktPageNum*PageSize); @@ -4918,110 +4761,155 @@ error: rtw_free_xmitframe(pxmitpriv, pcmdframe); } -static void rtw_hal_download_rsvd_page(_adapter* adapter, u8 mstatus) +#ifdef CONFIG_AP_WOWLAN +/* +*Description: Fill the reserved packets that FW will use to RSVD page. +*Now we just send 2 types packet to rsvd page. (1)Beacon, (2)ProbeRsp. +* +*Input: bDLFinished +* +*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 length. +* +*TRUE: At the second time, we should send the first packet (default:beacon) +*to Hw again and set the length in descriptor to the real beacon length. +*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_AP_fw_rsvd_page(_adapter *padapter , bool finished) { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter); - BOOLEAN bcn_valid = _FALSE; - u8 DLBcnCount=0; - u32 poll = 0; - u8 val8; + 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 = &padapter->mlmepriv; + struct hal_ops *pHalFunc = &padapter->HalFunc; + u32 BeaconLength = 0 , ProbeRspLength = 0; + u8 *ReservedPagePacket; + u8 TxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET; + u8 TotalPageNum = 0 , CurtPktPageNum = 0 , RsvdPageNum = 0; + u8 currentip[4]; + u16 BufIndex, PageSize = 0; + u32 TotalPacketLen = 0 , MaxRsvdPageBufSize = 0; + RSVDPAGE_LOC RsvdPageLoc; +#ifdef DBG_CONFIG_ERROR_DETECT + struct sreset_priv *psrtpriv; +#endif /* DBG_CONFIG_ERROR_DETECT */ -_func_enter_; + DBG_8192C("+" FUNC_ADPT_FMT ": iface_type=%d\n", + FUNC_ADPT_ARG(padapter), get_iface_type(padapter)); - DBG_8192C("+" FUNC_ADPT_FMT ": iface_type=%d mstatus(%x)\n", - FUNC_ADPT_ARG(adapter), get_iface_type(adapter), mstatus); - - if(mstatus == RT_MEDIA_CONNECT) { - BOOLEAN bRecover = _FALSE; - u8 v8; - - // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. - // Suggested by filen. Added by tynli. - rtw_write16(adapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); - - // set REG_CR bit 8 - v8 = rtw_read8(adapter, REG_CR+1); - v8 |= BIT(0); // ENSWBCN - rtw_write8(adapter, REG_CR+1, v8); - - // Disable Hw protection for a time which revserd for Hw sending beacon. - // Fix download reserved page packet fail that access collision with the protection time. - // 2010.05.11. Added by tynli. - val8 = rtw_read8(adapter, REG_BCN_CTRL); - val8 &= ~EN_BCN_FUNCTION; - val8 |= DIS_TSF_UDT; - rtw_write8(adapter, REG_BCN_CTRL, val8); - - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - if (pHalData->RegFwHwTxQCtrl & BIT(6)) - bRecover = _TRUE; - - // To tell Hw the packet is not a real beacon frame. - rtw_write8(adapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl & ~BIT(6)); - pHalData->RegFwHwTxQCtrl &= ~BIT(6); - - // Clear beacon valid check bit. - rtw_hal_set_hwreg(adapter, HW_VAR_BCN_VALID, NULL); - rtw_hal_set_hwreg(adapter, HW_VAR_DL_BCN_SEL, NULL); - - DLBcnCount = 0; - poll = 0; - do { - // download rsvd page. - rtw_hal_set_fw_rsvd_page(adapter, 0); - - DLBcnCount++; - do { - rtw_yield_os(); - //rtw_mdelay_os(10); - // check rsvd page download OK. - rtw_hal_get_hwreg(adapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); - poll++; - } while(!bcn_valid && (poll%10)!=0 && !adapter->bSurpriseRemoved && !adapter->bDriverStopped); - }while(!bcn_valid && DLBcnCount<=100 && !adapter->bSurpriseRemoved && !adapter->bDriverStopped); - - if(adapter->bSurpriseRemoved || adapter->bDriverStopped) { - DBG_871X(ADPT_FMT": 0 bSurpriseRemoved:%d, bDriverStopped:%d\n", - ADPT_ARG(adapter) ,adapter->bSurpriseRemoved, - adapter->bDriverStopped); - } else if(!bcn_valid) { - DBG_871X(ADPT_FMT": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\n", - ADPT_ARG(adapter) ,DLBcnCount, poll); - } else { - struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter); - pwrctl->fw_psmode_iface_id = adapter->iface_id; - DBG_871X(ADPT_FMT": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\n", - ADPT_ARG(adapter), DLBcnCount, poll); - } + pHalData = GET_HAL_DATA(padapter); +#ifdef DBG_CONFIG_ERROR_DETECT + psrtpriv = &pHalData->srestpriv; +#endif + pxmitpriv = &padapter->xmitpriv; + pmlmeext = &padapter->mlmeextpriv; + pmlmeinfo = &pmlmeext->mlmext_info; + pwrctl = adapter_to_pwrctl(padapter); - // 2010.05.11. Added by tynli. - val8 = rtw_read8(adapter, REG_BCN_CTRL); - val8 |= EN_BCN_FUNCTION; - val8 &= ~DIS_TSF_UDT; - rtw_write8(adapter, REG_BCN_CTRL, val8); - - // To make sure that if there exists an adapter which would like to send beacon. - // If exists, the origianl value of 0x422[6] will be 1, we should check this to - // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause - // the beacon cannot be sent by HW. - // 2010.06.23. Added by tynli. - if(bRecover) { - rtw_write8(adapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl | BIT(6)); - pHalData->RegFwHwTxQCtrl |= BIT(6); - } + rtw_hal_get_def_var(padapter, 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(padapter, _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; + DBG_871X("%s: RsvdPageNum:%d, PageSize:%d\n", __func__ , RsvdPageNum , PageSize); - // Clear CR[8] or beacon packet will not be send to TxBuf anymore. - v8 = rtw_read8(adapter, REG_CR+1); - v8 &= ~BIT(0); // ~ENSWBCN - rtw_write8(adapter, REG_CR+1, v8); + pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv); + if (pcmdframe == NULL) { + DBG_871X("%s: alloc ReservedPagePacket fail!\n", __func__); + return; } -_func_exit_; + ReservedPagePacket = pcmdframe->buf_addr; + _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC)); + + /* (1) beacon*/ + BufIndex = TxDescOffset; + rtw_hal_construct_beacon(padapter, &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(TxDescLen + BeaconLength, PageSize); + /*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); + + /* (4) probe response*/ + RsvdPageLoc.LocProbeRsp = TotalPageNum; + rtw_hal_construct_ProbeRsp( + padapter, + &ReservedPagePacket[BufIndex], + &ProbeRspLength, + get_my_bssid(&pmlmeinfo->network), + _FALSE); + rtw_hal_fill_fake_txdesc(padapter, + &ReservedPagePacket[BufIndex-TxDescLen], + ProbeRspLength, _FALSE, _FALSE, _FALSE); + + DBG_871X("%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\n", + __func__, &ReservedPagePacket[BufIndex-TxDescLen], + (ProbeRspLength+TxDescLen)); + + CurtPktPageNum = (u8)PageNum(TxDescLen + BeaconLength, PageSize); + + TotalPageNum += CurtPktPageNum; + + BufIndex += (CurtPktPageNum*PageSize); + + TotalPacketLen = BufIndex + ProbeRspLength; + + if (TotalPacketLen > MaxRsvdPageBufSize) { + DBG_871X("%s(): ERROR: The rsvd page size is not enough !!TotalPacketLen %d, MaxRsvdPageBufSize %d\n", + __func__ , TotalPacketLen , MaxRsvdPageBufSize); + goto error; + } else { + /* update attribute*/ + pattrib = &pcmdframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->qsel = QSLT_BEACON; + pattrib->pktlen = TotalPacketLen - TxDescOffset; + pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset; +#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), TotalPageNum(%d)\n" , __func__ , TotalPacketLen , TotalPageNum); + rtw_hal_set_ap_wow_rsvdpage_cmd(padapter, &RsvdPageLoc); + if (0) + dump_TX_FIFO(padapter , 8 , 512); + + return; +error: + rtw_free_xmitframe(pxmitpriv, pcmdframe); } -#endif //CONFIG_WOWLAN + +#endif /*CONFIG_AP_WOWLAN*/ + + void SetHwReg(_adapter *adapter, u8 variable, u8 *val) { @@ -5033,8 +4921,8 @@ _func_enter_; switch (variable) { case HW_VAR_INITIAL_GAIN: { - u32 rx_gain = ((u32 *)(val))[0]; - + u8 rx_gain = *((u8 *)(val)); + //printk("rx_gain:%x\n",rx_gain); if(rx_gain == 0xff){//restore rx gain //ODM_Write_DIG(podmpriv,pDigTable->BackupIGValue); odm_PauseDIG(odm, ODM_RESUME_DIG,rx_gain); @@ -5055,7 +4943,7 @@ _func_enter_; u8 rate_index = 0; HAL_VERSION *hal_ver = &hal_data->VersionID; - if (IS_81XXC(*hal_ver) ||IS_92D(*hal_ver) || IS_8723_SERIES(*hal_ver) || IS_8188E(*hal_ver)) { + if (IS_8188E(*hal_ver)) { while (brate_cfg > 0x1) { brate_cfg = (brate_cfg >> 1); @@ -5114,13 +5002,7 @@ _func_enter_; } 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); - } + odm->SupportAbility |= *((u32 *)val); break; case HW_VAR_DM_FUNC_CLR: /* @@ -5169,12 +5051,12 @@ _func_enter_; if (IS_HARDWARE_TYPE_8723B(adapter)) rtw_hal_backup_rate(adapter); - if (pHalFunc->hal_set_wowlan_fw != NULL) - pHalFunc->hal_set_wowlan_fw(adapter, _TRUE); - else - DBG_871X("hal_set_wowlan_fw is null\n"); + rtw_hal_set_wowlan_fw(adapter, _TRUE); - 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 (!pwrctl->wowlan_pno_enable) { psta = rtw_get_stainfo(&adapter->stapriv, @@ -5204,7 +5086,10 @@ _func_enter_; if (res == _FAIL) DBG_871X_LEVEL(_drv_always_, "[WARNING] enable cpwm2 fail\n"); #endif - +#ifdef CONFIG_GPIO_WAKEUP + rtw_hal_switch_gpio_wl_ctrl(adapter, + WAKEUP_GPIO_IDX, _TRUE); +#endif //Set WOWLAN H2C command. DBG_871X_LEVEL(_drv_always_, "Set WOWLan cmd\n"); rtw_hal_set_fw_wow_related_cmd(adapter, 1); @@ -5223,9 +5108,15 @@ _func_enter_; dump_cam_table(adapter); #endif #ifdef CONFIG_USB_HCI - if (adapter->intf_stop) + if (adapter->intf_stop) //free adapter's resource adapter->intf_stop(adapter); +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_buddy_adapter_up(adapter)) { //free buddy adapter's resource + adapter->pbuddy_adapter->intf_stop(adapter->pbuddy_adapter); + } +#endif //CONFIG_CONCURRENT_MODE + /* Invoid SE0 reset signal during suspending*/ rtw_write8(adapter, REG_RSV_CTRL, 0x20); rtw_write8(adapter, REG_RSV_CTRL, 0x60); @@ -5280,19 +5171,26 @@ _func_enter_; 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"); + rtw_hal_set_wowlan_fw(adapter, _FALSE); + #ifdef CONFIG_GPIO_WAKEUP - rtw_clear_hostwakeupgpio(adapter); + DBG_871X_LEVEL(_drv_always_, "Set Wake GPIO to high for default.\n"); + rtw_hal_set_output_gpio(adapter, WAKEUP_GPIO_IDX, 1); + rtw_hal_switch_gpio_wl_ctrl(adapter, + WAKEUP_GPIO_IDX, _FALSE); #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); + //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); @@ -5308,10 +5206,175 @@ _func_enter_; } break; #endif //CONFIG_WOWLAN +#ifdef CONFIG_AP_WOWLAN + case HW_VAR_AP_WOWLAN: + { + u8 trycnt = 100; + 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_AP_ENABLE: + DBG_871X("%s, WOWLAN_AP_ENABLE\n", __func__); + /* 1. Download WOWLAN FW*/ + DBG_871X_LEVEL(_drv_always_, "Re-download WoWlan FW!\n"); +#ifdef DBG_CHECK_FW_PS_STATE + if (rtw_fw_ps_state(adapter) == _FAIL) { + pdbgpriv->dbg_enwow_dload_fw_fail_cnt++; + DBG_871X_LEVEL(_drv_always_, "wowlan enable no leave 32k\n"); + } +#endif /*DBG_CHECK_FW_PS_STATE*/ + do { + if (rtw_read8(adapter, REG_HMETFR) == 0x00) { + DBG_871X_LEVEL(_drv_always_, "Ready to change FW.\n"); + break; + } + rtw_msleep_os(10); + DBG_871X_LEVEL(_drv_always_, "trycnt: %d\n", (100-trycnt)); + } while (trycnt--); + + if (pHalFunc->hal_set_wowlan_fw != NULL) + pHalFunc->hal_set_wowlan_fw(adapter, _TRUE); + else + DBG_871X("hal_set_wowlan_fw is null\n"); + + /* 2. RX DMA stop*/ + DBG_871X_LEVEL(_drv_always_, "Pause DMA\n"); + trycnt = 100; + 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"); + /*if (Adapter->intf_stop) + Adapter->intf_stop(Adapter); + */ + break; + } + /* If RX_DMA is not idle, receive one pkt from DMA*/ + DBG_871X_LEVEL(_drv_always_ , "RX_DMA_IDLE is not true\n"); + } while (trycnt--); + + if (trycnt == 0) + DBG_871X_LEVEL(_drv_always_ , "Stop RX DMA failed......\n"); + + /* 5. Set Enable WOWLAN H2C command. */ + DBG_871X_LEVEL(_drv_always_, "Set Enable AP WOWLan cmd\n"); + if (pHalFunc->hal_set_ap_wowlan_cmd != NULL) + pHalFunc->hal_set_ap_wowlan_cmd(adapter, 1); + else + DBG_871X("hal_set_ap_wowlan_cmd is null\n"); + + /* 6. add some delay for H2C cmd ready*/ + rtw_msleep_os(10); + /* 7. enable AP power save*/ + + rtw_write8(adapter, REG_MCUTST_WOWLAN, 0); + + if (adapter->intf_stop) + adapter->intf_stop(adapter); + +#ifdef CONFIG_USB_HCI + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_buddy_adapter_up(adapter)) { /*free buddy adapter's resource*/ + adapter->pbuddy_adapter->intf_stop(adapter->pbuddy_adapter); + } +#endif /*CONFIG_CONCURRENT_MODE*/ + + /* 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_AP_DISABLE: + DBG_871X("%s, WOWLAN_AP_DISABLE\n", __func__); + /* 1. Read wakeup reason*/ + pwrctl->wowlan_wake_reason = + rtw_read8(adapter, REG_MCUTST_WOWLAN); + + DBG_871X_LEVEL(_drv_always_, "wakeup_reason: 0x%02x\n", + pwrctl->wowlan_wake_reason); + + /* 2. disable AP power save*/ + if (pHalFunc->hal_set_ap_ps_wowlan_cmd != NULL) + pHalFunc->hal_set_ap_ps_wowlan_cmd(adapter, 0); + else + DBG_871X("hal_set_ap_ps_wowlan_cmd is null\n"); + /* 3. Set Disable WOWLAN H2C command.*/ + DBG_871X_LEVEL(_drv_always_, "Set Disable WOWLan cmd\n"); + if (pHalFunc->hal_set_ap_wowlan_cmd != NULL) + pHalFunc->hal_set_ap_wowlan_cmd(adapter, 0); + else + DBG_871X("hal_set_ap_wowlan_cmd is null\n"); + /* 6. add some delay for H2C cmd ready*/ + rtw_msleep_os(2); +#ifdef DBG_CHECK_FW_PS_STATE + if (rtw_fw_ps_state(adapter) == _FAIL) { + pdbgpriv->dbg_diswow_dload_fw_fail_cnt++; + DBG_871X_LEVEL(_drv_always_, "wowlan enable no leave 32k\n"); + } +#endif /*DBG_CHECK_FW_PS_STATE*/ + + DBG_871X_LEVEL(_drv_always_, "Release RXDMA\n"); + + rtw_write32(adapter, REG_RXPKT_NUM, + (rtw_read32(adapter , REG_RXPKT_NUM) & (~RW_RELEASE_EN))); + + do { + if (rtw_read8(adapter, REG_HMETFR) == 0x00) { + DBG_871X_LEVEL(_drv_always_, "Ready to change FW.\n"); + break; + } + rtw_msleep_os(10); + DBG_871X_LEVEL(_drv_always_, "trycnt: %d\n", (100-trycnt)); + } while (trycnt--); + + 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 + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_buddy_adapter_up(adapter) == _TRUE && + check_buddy_fwstate(adapter, WIFI_AP_STATE) == _TRUE) { + media_status_rpt = RT_MEDIA_CONNECT; + rtw_hal_set_hwreg(adapter->pbuddy_adapter , HW_VAR_H2C_FW_JOINBSSRPT , (u8 *)&media_status_rpt); + issue_beacon(adapter->pbuddy_adapter, 0); + } else { + media_status_rpt = RT_MEDIA_CONNECT; + rtw_hal_set_hwreg(adapter , HW_VAR_H2C_FW_JOINBSSRPT , (u8 *)&media_status_rpt); + issue_beacon(adapter, 0); + } +#else + media_status_rpt = RT_MEDIA_CONNECT; + rtw_hal_set_hwreg(adapter , HW_VAR_H2C_FW_JOINBSSRPT , (u8 *)&media_status_rpt); + issue_beacon(adapter , 0); +#endif + + break; + default: + break; + } + } + break; +#endif /*CONFIG_AP_WOWLAN*/ default: if (0) - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n", - FUNC_ADPT_ARG(adapter), variable); + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n", + FUNC_ADPT_ARG(adapter), variable); break; } @@ -5337,8 +5400,8 @@ _func_enter_; break; default: if (0) - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n", - FUNC_ADPT_ARG(adapter), variable); + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n", + FUNC_ADPT_ARG(adapter), variable); break; } @@ -5390,49 +5453,6 @@ SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value) 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; @@ -5483,9 +5503,6 @@ GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value) 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; @@ -5874,8 +5891,7 @@ void rtw_hal_check_rxfifo_full(_adapter *adapter) int save_cnt=_FALSE; //switch counter to RX fifo - if(IS_81XXC(pHalData->VersionID) || IS_92D(pHalData->VersionID) - || IS_8188E(pHalData->VersionID) || IS_8723_SERIES(pHalData->VersionID) + if( IS_8188E(pHalData->VersionID) || IS_8812_SERIES(pHalData->VersionID) || IS_8821_SERIES(pHalData->VersionID) || IS_8723B_SERIES(pHalData->VersionID) || IS_8192E(pHalData->VersionID)) { @@ -6010,10 +6026,9 @@ 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; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + u8* pContent = pHalData->efuse_eeprom_data; int index = 0; u16 tx_index_offset = 0x0000; @@ -6027,21 +6042,25 @@ int check_phy_efuse_tx_power_info_valid(PADAPTER padapter) { case RTL8192E: tx_index_offset = EEPROM_TX_PWR_INX_8192E; break; + case RTL8821: + tx_index_offset = EEPROM_TX_PWR_INX_8821; + break; default: tx_index_offset = 0x0010; break; } - for (index = 0 ; index < 12 ; index++) { + for (index = 0 ; index < 11 ; index++) { if (pContent[tx_index_offset + index] == 0xFF) { return _FALSE; } else { - DBG_871X("0x%02x ,", pContent[EEPROM_TX_PWR_INX_88E+index]); + DBG_871X("0x%02x ,", pContent[tx_index_offset+index]); } } DBG_871X("\n"); return _TRUE; } +#ifdef CONFIG_EFUSE_CONFIG_FILE int check_phy_efuse_macaddr_info_valid(PADAPTER padapter) { u8 val = 0; @@ -6078,6 +6097,21 @@ int check_phy_efuse_macaddr_info_valid(PADAPTER padapter) { DBG_871X("%s: interface is GSPI\n", __func__); } break; + case RTL8821: + if (padapter->interface_type == RTW_USB) { + addr_offset = EEPROM_MAC_ADDR_8821AU; + DBG_871X("%s: interface is USB\n", __func__); + } else if (padapter->interface_type == RTW_SDIO) { + addr_offset = EEPROM_MAC_ADDR_8821AS; + DBG_871X("%s: interface is SDIO\n", __func__); + } else if (padapter->interface_type == RTW_PCIE) { + addr_offset = EEPROM_MAC_ADDR_8821AE; + 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) { @@ -6103,8 +6137,8 @@ u32 Hal_readPGDataFromConfigFile( 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; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 *PROMContent = pHalData->efuse_eeprom_data; temp[2] = 0; // add end of string '\0' @@ -6127,7 +6161,7 @@ u32 Hal_readPGDataFromConfigFile( } set_fs(fs); - pEEPROM->bloadfile_fail_flag = _FALSE; + pHalData->bloadfile_fail_flag = _FALSE; #ifdef CONFIG_DEBUG DBG_871X("Efuse configure file:\n"); @@ -6153,11 +6187,11 @@ void Hal_ReadMACAddrFromFile( u8 source_addr[18]; loff_t pos = 0; u32 curtime = rtw_get_current_time(); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); u8 *head, *end; _rtw_memset(source_addr, 0, 18); - _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN); + _rtw_memset(pHalData->EEPROMMACAddr, 0, ETH_ALEN); fs = get_fs(); set_fs(KERNEL_DS); @@ -6174,7 +6208,7 @@ void Hal_ReadMACAddrFromFile( if (end && (*end == ':') ) *end = '\0'; - pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 ); + pHalData->EEPROMMACAddr[i] = simple_strtoul(head, NULL, 16 ); if (end) { end++; @@ -6183,29 +6217,29 @@ void Hal_ReadMACAddrFromFile( } set_fs(fs); - pEEPROM->bloadmac_fail_flag = _FALSE; + pHalData->bloadmac_fail_flag = _FALSE; - if (rtw_check_invalid_mac_address(pEEPROM->mac_addr) == _TRUE) { + if (rtw_check_invalid_mac_address(pHalData->EEPROMMACAddr) == _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; + get_random_bytes(pHalData->EEPROMMACAddr, ETH_ALEN); + pHalData->EEPROMMACAddr[0] = 0x00; + pHalData->EEPROMMACAddr[1] = 0xe0; + pHalData->EEPROMMACAddr[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) ; + pHalData->EEPROMMACAddr[0] = 0x00; + pHalData->EEPROMMACAddr[1] = 0xe0; + pHalData->EEPROMMACAddr[2] = 0x4c; + pHalData->EEPROMMACAddr[3] = (u8)(curtime & 0xff) ; + pHalData->EEPROMMACAddr[4] = (u8)((curtime>>8) & 0xff) ; + pHalData->EEPROMMACAddr[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]); + __func__, pHalData->EEPROMMACAddr[0], pHalData->EEPROMMACAddr[1], + pHalData->EEPROMMACAddr[2], pHalData->EEPROMMACAddr[3], + pHalData->EEPROMMACAddr[4], pHalData->EEPROMMACAddr[5]); } void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr) { @@ -6243,6 +6277,21 @@ void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr) { DBG_871X("%s: interface is GSPI\n", __func__); } break; + case RTL8821: + if (padapter->interface_type == RTW_USB) { + addr_offset = EEPROM_MAC_ADDR_8821AU; + DBG_871X("%s: interface is USB\n", __func__); + } else if (padapter->interface_type == RTW_SDIO) { + addr_offset = EEPROM_MAC_ADDR_8821AS; + DBG_871X("%s: interface is SDIO\n", __func__); + } else if (padapter->interface_type == RTW_PCIE) { + addr_offset = EEPROM_MAC_ADDR_8821AE; + 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); @@ -6287,55 +6336,25 @@ u32 Array_kfreemap[] = { void rtw_bb_rf_gain_offset(_adapter *padapter) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 value = padapter->eeprompriv.EEPROMRFGainOffset; + u8 value = pHalData->EEPROMRFGainOffset; u8 tmp = 0x3e; u32 res,i=0; u4Byte ArrayLen = sizeof(Array_kfreemap)/sizeof(u32); pu4Byte Array = Array_kfreemap; 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"); - 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, 0xd, 0xffffffff); - DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res); - res &= 0xfff87fff; - - res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; - DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res); - - rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET_CCK, RF_GAIN_OFFSET_MASK, res); - - res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xe, 0xffffffff); - DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res); - res &= 0xfffffff0; - - res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f); - DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res); - - rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET_OFDM, RF_GAIN_OFFSET_MASK, res); - } - else - { - DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal); - } - } else { - DBG_871X("Using the default RF gain.\n"); - } -#elif defined(CONFIG_RTL8723B) +#if defined(CONFIG_RTL8723B) if (value & BIT4) { DBG_871X("Offset RF Gain.\n"); - DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal); + DBG_871X("Offset RF Gain. pHalData->EEPROMRFGainVal=0x%x\n",pHalData->EEPROMRFGainVal); - if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){ + if(pHalData->EEPROMRFGainVal != 0xff){ if(pHalData->ant_path == ODM_RF_PATH_A) { - GainValue=(padapter->eeprompriv.EEPROMRFGainVal & 0x0f); + GainValue=(pHalData->EEPROMRFGainVal & 0x0f); } else { - GainValue=(padapter->eeprompriv.EEPROMRFGainVal & 0xf0)>>4; + GainValue=(pHalData->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); @@ -6350,7 +6369,7 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) break; } } - DBG_871X("padapter->eeprompriv.EEPROMRFGainVal=0x%x ,Gain offset Target Value=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal,target); + DBG_871X("pHalData->EEPROMRFGainVal=0x%x ,Gain offset Target Value=0x%x\n",pHalData->EEPROMRFGainVal,target); res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff); DBG_871X("Offset RF Gain. before reg 0x7f=0x%08x\n",res); @@ -6361,7 +6380,7 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) }else { - DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal); + DBG_871X("Offset RF Gain. pHalData->EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",pHalData->EEPROMRFGainVal); } } else { DBG_871X("Using the default RF gain.\n"); @@ -6371,16 +6390,16 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) if (value & BIT4) { DBG_871X("8188ES Offset RF Gain.\n"); DBG_871X("8188ES Offset RF Gain. EEPROMRFGainVal=0x%x\n", - padapter->eeprompriv.EEPROMRFGainVal); + pHalData->EEPROMRFGainVal); - if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) { + if (pHalData->EEPROMRFGainVal != 0xff) { res = rtw_hal_read_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, 0xffffffff); DBG_871X("Offset RF Gain. reg 0x55=0x%x\n",res); res &= 0xfff87fff; - res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f) << 15; + res |= (pHalData->EEPROMRFGainVal & 0x0f) << 15; DBG_871X("Offset RF Gain. res=0x%x\n",res); rtw_hal_write_rfreg(padapter, RF_PATH_A, @@ -6388,7 +6407,7 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) RF_GAIN_OFFSET_MASK, res); } else { DBG_871X("Offset RF Gain. EEPROMRFGainVal=0x%x == 0xff, didn't run Kfree\n", - padapter->eeprompriv.EEPROMRFGainVal); + pHalData->EEPROMRFGainVal); } } else { DBG_871X("Using the default RF gain.\n"); @@ -6408,12 +6427,53 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) } #endif //CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_USB_RX_AGGREGATION +void rtw_set_usb_agg_by_mode(_adapter *padapter, u8 cur_wireless_mode) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + if(cur_wireless_mode < WIRELESS_11_24N + && cur_wireless_mode > 0) //ABG mode + { + if(0x6 != pHalData->RegAcUsbDmaSize || 0x10 !=pHalData->RegAcUsbDmaTime) + { + pHalData->RegAcUsbDmaSize = 0x6; + pHalData->RegAcUsbDmaTime = 0x10; + rtw_write16(padapter, REG_RXDMA_AGG_PG_TH, + pHalData->RegAcUsbDmaSize | (pHalData->RegAcUsbDmaTime<<8)); + } + + } + else if(cur_wireless_mode >= WIRELESS_11_24N + && cur_wireless_mode <= WIRELESS_MODE_MAX)//N AC mode + { + if(0x5 != pHalData->RegAcUsbDmaSize || 0x20 !=pHalData->RegAcUsbDmaTime) + { + pHalData->RegAcUsbDmaSize = 0x5; + pHalData->RegAcUsbDmaTime = 0x20; + rtw_write16(padapter, REG_RXDMA_AGG_PG_TH, + pHalData->RegAcUsbDmaSize | (pHalData->RegAcUsbDmaTime<<8)); + } + + } + else + { + /* DBG_871X("%s: Unknow wireless mode(0x%x)\n",__func__,padapter->mlmeextpriv.cur_wireless_mode); */ + } +} +#endif //CONFIG_USB_RX_AGGREGATION + //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); + struct mlme_ext_priv *pmlmeextpriv = &(padapter->mlmeextpriv); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 cur_wireless_mode = pmlmeextpriv->cur_wireless_mode; +#ifdef CONFIG_CONCURRENT_MODE + struct mlme_ext_priv *pbuddymlmeextpriv = &(padapter->pbuddy_adapter->mlmeextpriv); +#endif //CONFIG_CONCURRENT_MODE + #ifdef CONFIG_USB_RX_AGGREGATION if(IS_HARDWARE_TYPE_8821U(padapter) )//|| IS_HARDWARE_TYPE_8192EU(padapter)) { @@ -6421,13 +6481,33 @@ void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer) if((pHalData->UsbRxAggMode == USB_RX_AGG_USB) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) { if(pdvobjpriv->traffic_stat.cur_tx_tp > 2 && pdvobjpriv->traffic_stat.cur_rx_tp < 30) - rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x1003); + rtw_write16(padapter , REG_RXDMA_AGG_PG_TH , 0x1010); 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); } } + else if(IS_HARDWARE_TYPE_8812(padapter)) + { +#ifdef CONFIG_CONCURRENT_MODE + if(rtw_linked_check(padapter) == _TRUE && rtw_linked_check(padapter->pbuddy_adapter) == _TRUE) + { + if(pbuddymlmeextpriv->cur_wireless_mode >= pmlmeextpriv->cur_wireless_mode) + cur_wireless_mode = pbuddymlmeextpriv->cur_wireless_mode; + else + cur_wireless_mode = pmlmeextpriv->cur_wireless_mode; + + rtw_set_usb_agg_by_mode(padapter,cur_wireless_mode); + } + else if (rtw_linked_check(padapter) == _TRUE && rtw_linked_check(padapter->pbuddy_adapter) == _FALSE) + { + rtw_set_usb_agg_by_mode(padapter,cur_wireless_mode); + } +#else //!CONFIG_CONCURRENT_MODE + rtw_set_usb_agg_by_mode(padapter,cur_wireless_mode); +#endif //CONFIG_CONCURRENT_MODE + } #endif } @@ -6460,7 +6540,7 @@ inline u8 rtw_hal_busagg_qsel_check(_adapter *padapter,u8 pre_qsel,u8 next_qsel) * 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. + * page_size: page size of each page. eg. 128 bytes, 256 bytes, 512byte. */ void dump_TX_FIFO(_adapter* padapter, u8 page_num, u16 page_size){ @@ -6475,7 +6555,7 @@ void dump_TX_FIFO(_adapter* padapter, u8 page_num, u16 page_size){ return; } - if (page_size < 128 || page_size > 256) { + if (page_size < 128 || page_size > 512) { DBG_871X("!!%s: incorrect input page_size paramter!\n", __func__); return; } @@ -6523,7 +6603,7 @@ u8 rtw_hal_get_gpio(_adapter* adapter, u8 gpio_num) return value; } -int rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, BOOLEAN isHigh) +int rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, bool isHigh) { u8 direction = 0; u8 res = -1; @@ -6564,7 +6644,7 @@ int rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, BOOLEAN isHig return res; } -int rtw_hal_config_gpio(_adapter* adapter, u8 gpio_num, BOOLEAN isOutput) +int rtw_hal_config_gpio(_adapter* adapter, u8 gpio_num, bool isOutput) { if (IS_HARDWARE_TYPE_8188E(adapter)){ if( gpio_num > 7 || gpio_num < 4) @@ -6593,5 +6673,414 @@ int rtw_hal_config_gpio(_adapter* adapter, u8 gpio_num, BOOLEAN isOutput) return 0; } +int rtw_hal_register_gpio_interrupt(_adapter* adapter, int gpio_num, void(*callback)(u8 level)) +{ + u8 value; + u8 direction; + PHAL_DATA_TYPE phal = GET_HAL_DATA(adapter); + + if (IS_HARDWARE_TYPE_8188E(adapter)){ + if(gpio_num > 7 || gpio_num < 4) + { + DBG_871X_LEVEL(_drv_always_, "%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(direction){ + DBG_871X_LEVEL(_drv_always_, "%s Can't register output gpio as interrupt.\n",__FUNCTION__); + return -1; + } + + /* Config GPIO Mode */ + rtw_write8(adapter, REG_GPIO_PIN_CTRL + 3, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 3) | BIT(gpio_num)); + + /* Register GPIO interrupt handler*/ + adapter->gpiointpriv.callback[gpio_num] = callback; + + /* Set GPIO interrupt mode, 0:positive edge, 1:negative edge */ + value = rtw_read8(adapter, REG_GPIO_PIN_CTRL) & BIT(gpio_num); + adapter->gpiointpriv.interrupt_mode = rtw_read8(adapter, REG_HSIMR + 2)^value; + rtw_write8(adapter, REG_GPIO_INTM, adapter->gpiointpriv.interrupt_mode); + + /* Enable GPIO interrupt */ + adapter->gpiointpriv.interrupt_enable_mask = rtw_read8(adapter, REG_HSIMR + 2) | BIT(gpio_num); + rtw_write8(adapter, REG_HSIMR + 2, adapter->gpiointpriv.interrupt_enable_mask); + + rtw_hal_update_hisr_hsisr_ind(adapter, 1); + + rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL); + + return 0; +} +int rtw_hal_disable_gpio_interrupt(_adapter* adapter, int gpio_num) +{ + u8 value; + u8 direction; + PHAL_DATA_TYPE phal = GET_HAL_DATA(adapter); + + 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; + } + } + + rtw_ps_deny(adapter, PS_DENY_IOCTL); + LeaveAllPowerSaveModeDirect(adapter); + + /* Config GPIO Mode */ + rtw_write8(adapter, REG_GPIO_PIN_CTRL + 3, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 3) &~ BIT(gpio_num)); + + /* Unregister GPIO interrupt handler*/ + adapter->gpiointpriv.callback[gpio_num] = NULL; + + /* Reset GPIO interrupt mode, 0:positive edge, 1:negative edge */ + adapter->gpiointpriv.interrupt_mode = rtw_read8(adapter, REG_GPIO_INTM) &~ BIT(gpio_num); + rtw_write8(adapter, REG_GPIO_INTM, 0x00); + + /* Disable GPIO interrupt */ + adapter->gpiointpriv.interrupt_enable_mask = rtw_read8(adapter, REG_HSIMR + 2) &~ BIT(gpio_num); + rtw_write8(adapter, REG_HSIMR + 2, adapter->gpiointpriv.interrupt_enable_mask); + + if(!adapter->gpiointpriv.interrupt_enable_mask) + rtw_hal_update_hisr_hsisr_ind(adapter, 0); + + rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL); + + return 0; +} +#endif + +void rtw_dump_mac_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter) +{ + u32 mac_cck_ok=0, mac_ofdm_ok=0, mac_ht_ok=0, mac_vht_ok=0; + u32 mac_cck_err=0, mac_ofdm_err=0, mac_ht_err=0, mac_vht_err=0; + u32 mac_cck_fa=0, mac_ofdm_fa=0, mac_ht_fa=0; + u32 DropPacket=0; + + if(!rx_counter){ + rtw_warn_on(1); + return; + } + + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x3); + mac_cck_ok = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x0); + mac_ofdm_ok = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x6); + mac_ht_ok = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + mac_vht_ok = 0; + if (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)) { + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x0); + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT26, 0x1); + mac_vht_ok = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + } + + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x4); + mac_cck_err = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x1); + mac_ofdm_err = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x7); + mac_ht_err = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + mac_vht_err = 0; + if (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)) { + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x1); + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT26, 0x1); + mac_vht_err = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + } + + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x5); + mac_cck_fa = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x2); + mac_ofdm_fa = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x9); + mac_ht_fa = PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0] + + //Mac_DropPacket + rtw_write32(padapter, REG_RXERR_RPT, (rtw_read32(padapter, REG_RXERR_RPT)& 0x0FFFFFFF)| Mac_DropPacket); + DropPacket = rtw_read32(padapter, REG_RXERR_RPT)& 0x0000FFFF; + + rx_counter->rx_pkt_ok = mac_cck_ok+mac_ofdm_ok+mac_ht_ok+mac_vht_ok; + rx_counter->rx_pkt_crc_error = mac_cck_err+mac_ofdm_err+mac_ht_err+mac_vht_err; + rx_counter->rx_cck_fa = mac_cck_fa; + rx_counter->rx_ofdm_fa = mac_ofdm_fa; + rx_counter->rx_ht_fa = mac_ht_fa; + rx_counter->rx_pkt_drop = DropPacket; +} +void rtw_reset_mac_rx_counters(_adapter* padapter) +{ + //reset mac counter + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT27, 0x1); + PHY_SetMacReg(padapter, REG_RXERR_RPT, BIT27, 0x0); +} + +void rtw_dump_phy_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter) +{ + u32 cckok=0,cckcrc=0,ofdmok=0,ofdmcrc=0,htok=0,htcrc=0,OFDM_FA=0,CCK_FA=0,vht_ok=0,vht_err=0; + if(!rx_counter){ + rtw_warn_on(1); + return; + } + if (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)){ + cckok = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF); // [13:0] + ofdmok = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF); // [13:0] + htok = PHY_QueryBBReg(padapter, 0xF10, 0x3FFF); // [13:0] + vht_ok = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF); // [13:0] + 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] + CCK_FA = PHY_QueryBBReg(padapter, 0xA5C, bMaskLWord); + OFDM_FA = PHY_QueryBBReg(padapter, 0xF48, bMaskLWord); + } + else + { + cckok = PHY_QueryBBReg(padapter, 0xF88, bMaskDWord); + ofdmok = PHY_QueryBBReg(padapter, 0xF94, bMaskLWord); + htok = PHY_QueryBBReg(padapter, 0xF90, bMaskLWord); + vht_ok = 0; + cckcrc = PHY_QueryBBReg(padapter, 0xF84, bMaskDWord); + ofdmcrc = PHY_QueryBBReg(padapter, 0xF94, bMaskHWord); + htcrc = PHY_QueryBBReg(padapter, 0xF90, bMaskHWord); + vht_err = 0; + OFDM_FA = PHY_QueryBBReg(padapter, 0xCF0, bMaskLWord) + PHY_QueryBBReg(padapter, 0xCF2, bMaskLWord) + + PHY_QueryBBReg(padapter, 0xDA2, bMaskLWord) + PHY_QueryBBReg(padapter, 0xDA4, bMaskLWord) + + PHY_QueryBBReg(padapter, 0xDA6, bMaskLWord) + PHY_QueryBBReg(padapter, 0xDA8, bMaskLWord); + + CCK_FA=(rtw_read8(padapter, 0xA5B )<<8 ) | (rtw_read8(padapter, 0xA5C)); + } + + rx_counter->rx_pkt_ok = cckok+ofdmok+htok+vht_ok; + rx_counter->rx_pkt_crc_error = cckcrc+ofdmcrc+htcrc+vht_err; + rx_counter->rx_ofdm_fa = OFDM_FA; + rx_counter->rx_cck_fa = CCK_FA; + +} + +void rtw_reset_phy_rx_counters(_adapter* padapter) +{ + //reset phy counter + if (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)) + { + PHY_SetBBReg(padapter, 0xB58, BIT0, 0x1); + PHY_SetBBReg(padapter, 0xB58, BIT0, 0x0); + + PHY_SetBBReg(padapter, 0x9A4, BIT17, 0x1);//reset OFDA FA counter + PHY_SetBBReg(padapter, 0x9A4, BIT17, 0x0); + + PHY_SetBBReg(padapter, 0xA2C, BIT15, 0x0);//reset CCK FA counter + PHY_SetBBReg(padapter, 0xA2C, BIT15, 0x1); + } + else + { + PHY_SetBBReg(padapter, 0xF14, BIT16, 0x1); + rtw_msleep_os(10); + PHY_SetBBReg(padapter, 0xF14, BIT16, 0x0); + + PHY_SetBBReg(padapter, 0xD00, BIT27, 0x1);//reset OFDA FA counter + PHY_SetBBReg(padapter, 0xC0C, BIT31, 0x1);//reset OFDA FA counter + PHY_SetBBReg(padapter, 0xD00, BIT27, 0x0); + PHY_SetBBReg(padapter, 0xC0C, BIT31, 0x0); + + PHY_SetBBReg(padapter, 0xA2C, BIT15, 0x0);//reset CCK FA counter + PHY_SetBBReg(padapter, 0xA2C, BIT15, 0x1); + } +} +#ifdef DBG_RX_COUNTER_DUMP +void rtw_dump_drv_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter) +{ + struct recv_priv *precvpriv = &padapter->recvpriv; + if(!rx_counter){ + rtw_warn_on(1); + return; + } + rx_counter->rx_pkt_ok = padapter->drv_rx_cnt_ok; + rx_counter->rx_pkt_crc_error = padapter->drv_rx_cnt_crcerror; + rx_counter->rx_pkt_drop = precvpriv->rx_drop - padapter->drv_rx_cnt_drop; +} +void rtw_reset_drv_rx_counters(_adapter* padapter) +{ + struct recv_priv *precvpriv = &padapter->recvpriv; + padapter->drv_rx_cnt_ok = 0; + padapter->drv_rx_cnt_crcerror = 0; + padapter->drv_rx_cnt_drop = precvpriv->rx_drop; +} +void rtw_dump_phy_rxcnts_preprocess(_adapter* padapter,u8 rx_cnt_mode) +{ + u8 initialgain; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter); + DM_ODM_T *odm = &(hal_data->odmpriv); + DIG_T *pDigTable = &odm->DM_DigTable; + + if((!(padapter->dump_rx_cnt_mode& DUMP_PHY_RX_COUNTER)) && (rx_cnt_mode & DUMP_PHY_RX_COUNTER)) + { + initialgain = pDigTable->CurIGValue; + DBG_871X("%s CurIGValue:0x%02x\n",__FUNCTION__,initialgain); + 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, ~(ODM_BB_DIG|ODM_BB_FA_CNT), _FALSE); + } + else if((padapter->dump_rx_cnt_mode& DUMP_PHY_RX_COUNTER) &&(!(rx_cnt_mode & DUMP_PHY_RX_COUNTER ))) + { + //turn on phy-dynamic functions + Restore_DM_Func_Flag(padapter); + initialgain = 0xff; //restore RX GAIN + rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + + } +} + +void rtw_dump_rx_counters(_adapter* padapter) +{ + struct dbg_rx_counter rx_counter; + + if( padapter->dump_rx_cnt_mode & DUMP_DRV_RX_COUNTER ){ + _rtw_memset(&rx_counter,0,sizeof(struct dbg_rx_counter)); + rtw_dump_drv_rx_counters(padapter,&rx_counter); + DBG_871X( "Drv Received packet OK:%d CRC error:%d Drop Packets: %d\n", + rx_counter.rx_pkt_ok,rx_counter.rx_pkt_crc_error,rx_counter.rx_pkt_drop); + rtw_reset_drv_rx_counters(padapter); + } + + if( padapter->dump_rx_cnt_mode & DUMP_MAC_RX_COUNTER ){ + _rtw_memset(&rx_counter,0,sizeof(struct dbg_rx_counter)); + rtw_dump_mac_rx_counters(padapter,&rx_counter); + DBG_871X( "Mac Received packet OK:%d CRC error:%d FA Counter: %d Drop Packets: %d\n", + rx_counter.rx_pkt_ok,rx_counter.rx_pkt_crc_error, + rx_counter.rx_cck_fa+rx_counter.rx_ofdm_fa+rx_counter.rx_ht_fa, + rx_counter.rx_pkt_drop); + rtw_reset_mac_rx_counters(padapter); + } + + if(padapter->dump_rx_cnt_mode & DUMP_PHY_RX_COUNTER ){ + _rtw_memset(&rx_counter,0,sizeof(struct dbg_rx_counter)); + rtw_dump_phy_rx_counters(padapter,&rx_counter); + //DBG_871X("%s: OFDM_FA =%d\n", __FUNCTION__, rx_counter.rx_ofdm_fa); + //DBG_871X("%s: CCK_FA =%d\n", __FUNCTION__, rx_counter.rx_cck_fa); + DBG_871X("Phy Received packet OK:%d CRC error:%d FA Counter: %d\n",rx_counter.rx_pkt_ok,rx_counter.rx_pkt_crc_error, + rx_counter.rx_ofdm_fa+rx_counter.rx_cck_fa); + rtw_reset_phy_rx_counters(padapter); + } +} #endif +void rtw_get_noise(_adapter* padapter) +{ +#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR) + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct noise_info info; + if(rtw_linked_check(padapter)){ + 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 + +} + +#ifdef CONFIG_FW_C2H_DEBUG + +/* C2H RX package original is 128. +if enable CONFIG_FW_C2H_DEBUG, it should increase to 256. + C2H FW debug message: + without aggregate: + {C2H_CmdID,Seq,SubID,Len,Content[0~n]} + Content[0~n]={'a','b','c',...,'z','\n'} + with aggregate: + {C2H_CmdID,Seq,SubID,Len,Content[0~n]} + Content[0~n]={'a','b','c',...,'z','\n',Extend C2H pkt 2...} + Extend C2H pkt 2={C2H CmdID,Seq,SubID,Len,Content = {'a','b','c',...,'z','\n'}} + Author: Isaac */ + +void Debug_FwC2H(PADAPTER padapter, u8 *pdata, u8 len) +{ + int i = 0; + int cnt = 0, total_length = 0; + u8 buf[128] = {0}; + u8 more_data = _FALSE; + u8 *nextdata = NULL; + u8 test = 0; + + u8 data_len; + u8 seq_no; + + nextdata = pdata; + do { + data_len = *(nextdata + 1); + seq_no = *(nextdata + 2); + + for (i = 0 ; i < data_len - 2 ; i++) { + cnt += sprintf((buf+cnt), "%c", nextdata[3 + i]); + + if (nextdata[3 + i] == 0x0a && nextdata[4 + i] == 0xff) + more_data = _TRUE; + else if (nextdata[3 + i] == 0x0a && nextdata[4 + i] != 0xff) + more_data = _FALSE; + } + + DBG_871X("[RTKFW, SEQ=%d]: %s", seq_no, buf); + data_len += 3; + total_length += data_len; + + if (more_data == _TRUE) { + _rtw_memset(buf, '\0', 128); + cnt = 0; + nextdata = (pdata + total_length); + } + } while (more_data == _TRUE); +} +#endif /*CONFIG_FW_C2H_DEBUG*/ +void update_IOT_info(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + switch (pmlmeinfo->assoc_AP_vendor) + { + case HT_IOT_PEER_MARVELL: + pmlmeinfo->turboMode_cts2self = 1; + pmlmeinfo->turboMode_rtsen = 0; + break; + + case HT_IOT_PEER_RALINK: + pmlmeinfo->turboMode_cts2self = 0; + pmlmeinfo->turboMode_rtsen = 1; + //disable high power + Switch_DM_Func(padapter, (~ODM_BB_DYNAMIC_TXPWR), _FALSE); + break; + case HT_IOT_PEER_REALTEK: + //rtw_write16(padapter, 0x4cc, 0xffff); + //rtw_write16(padapter, 0x546, 0x01c0); + //disable high power + Switch_DM_Func(padapter, (~ODM_BB_DYNAMIC_TXPWR), _FALSE); + break; + default: + pmlmeinfo->turboMode_cts2self = 0; + pmlmeinfo->turboMode_rtsen = 1; + break; + } + +} + + + diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com_phycfg.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com_phycfg.c index 4866324cc7ec..bdf75cfceaaa 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com_phycfg.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com_phycfg.c @@ -920,7 +920,7 @@ PHY_InitTxPowerByRate( HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); u8 band = 0, rfPath = 0, TxNum = 0, rate = 0, i = 0, j = 0; - if ( IS_HARDWARE_TYPE_8188E( pAdapter ) || IS_HARDWARE_TYPE_8723A( pAdapter ) ) + if ( IS_HARDWARE_TYPE_8188E( pAdapter ) ) { for ( i = 0; i < MAX_PG_GROUP; ++i ) for ( j = 0; j < 16; ++j ) @@ -1509,13 +1509,13 @@ PHY_GetTxPowerTrackingOffset( if ((Rate == MGN_1M) ||(Rate == MGN_2M)||(Rate == MGN_5_5M)||(Rate == MGN_11M)) { - offset = pDM_Odm->Remnant_CCKSwingIdx; - //DBG_871X("+Remnant_CCKSwingIdx = 0x%x\n", RFPath, Rate, pDM_Odm->Remnant_CCKSwingIdx); + offset = pDM_Odm->RFCalibrateInfo.Remnant_CCKSwingIdx; + /*DBG_871X("+Remnant_CCKSwingIdx = 0x%x\n", RFPath, Rate, pRFCalibrateInfo->Remnant_CCKSwingIdx);*/ } else { - offset = pDM_Odm->Remnant_OFDMSwingIdx[RFPath]; - //DBG_871X("+Remanant_OFDMSwingIdx[RFPath %u][Rate 0x%x] = 0x%x\n", RFPath, Rate, pDM_Odm->Remnant_OFDMSwingIdx[RFPath]); + offset = pDM_Odm->RFCalibrateInfo.Remnant_OFDMSwingIdx[RFPath]; + /*DBG_871X("+Remanant_OFDMSwingIdx[RFPath %u][Rate 0x%x] = 0x%x\n", RFPath, Rate, pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath]); */ } @@ -1721,17 +1721,17 @@ PHY_SetTxPowerLevelByPath( PHY_SetTxPowerIndexByRateSection( Adapter, path, channel, OFDM ); PHY_SetTxPowerIndexByRateSection( Adapter, path, channel, HT_MCS0_MCS7 ); - if ( IS_HARDWARE_TYPE_JAGUAR( Adapter ) || IS_HARDWARE_TYPE_8813A( Adapter ) ) - PHY_SetTxPowerIndexByRateSection( Adapter, path, channel, VHT_1SSMCS0_1SSMCS9 ); + if (IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter)) + PHY_SetTxPowerIndexByRateSection(Adapter, path, channel, VHT_1SSMCS0_1SSMCS9); - if ( pHalData->NumTotalRFPath >= 2 ) + if (pHalData->NumTotalRFPath >= 2) { PHY_SetTxPowerIndexByRateSection( Adapter, path, channel, HT_MCS8_MCS15 ); - if ( IS_HARDWARE_TYPE_JAGUAR( Adapter ) || IS_HARDWARE_TYPE_8813A( Adapter ) ) - PHY_SetTxPowerIndexByRateSection( Adapter, path, channel, VHT_2SSMCS0_2SSMCS9 ); + if (IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter)) + PHY_SetTxPowerIndexByRateSection(Adapter, path, channel, VHT_2SSMCS0_2SSMCS9); - if ( IS_HARDWARE_TYPE_8813A( Adapter ) ) + if (IS_HARDWARE_TYPE_8814A(Adapter)) { PHY_SetTxPowerIndexByRateSection( Adapter, path, channel, HT_MCS16_MCS23 ); PHY_SetTxPowerIndexByRateSection( Adapter, path, channel, VHT_3SSMCS0_3SSMCS9 ); @@ -1967,6 +1967,8 @@ PHY_GetTxPowerLimit( if ( Band == BAND_ON_2_4G ) { s8 limits[10] = {0}; u8 i = 0; + if (bandwidth >= MAX_2_4G_BANDWITH_NUM) + bandwidth = MAX_2_4G_BANDWITH_NUM - 1; for (i = 0; i < MAX_REGULATION_NUM; ++i) limits[i] = pHalData->TxPwrLimit_2_4G[i][bandwidth][rateSection][channel][RfPath]; @@ -2145,7 +2147,7 @@ PHY_ConvertTxPowerLimitToPowerIndex( } } - if ( IS_HARDWARE_TYPE_JAGUAR( Adapter ) || IS_HARDWARE_TYPE_8813A( Adapter ) ) + if (IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter)) { for ( regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation ) { @@ -2299,6 +2301,9 @@ PHY_SetTxPowerLimit( if ( channelIndex == -1 ) return; + if (bandwidth >= MAX_2_4G_BANDWITH_NUM) + bandwidth = MAX_2_4G_BANDWITH_NUM - 1; + prevPowerLimit = pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A]; if ( powerLimit < prevPowerLimit ) @@ -2340,18 +2345,17 @@ PHY_GetTxPowerIndex( { u8 txPower = 0x3E; - if (IS_HARDWARE_TYPE_8813A(pAdapter)) { -//#if (RTL8814A_SUPPORT==1) -// txPower = PHY_GetTxPowerIndex_8813A( pAdapter, PowerIndex, RFPath, Rate ); -//#endif - } - else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) { -#if ((RTL8812A_SUPPORT==1) || (RTL8821A_SUPPORT == 1)) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) { +#if (RTL8814A_SUPPORT == 1) + txPower = PHY_GetTxPowerIndex_8814A(pAdapter, RFPath, Rate, BandWidth, Channel); +#endif + } else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) { +#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1)) txPower = PHY_GetTxPowerIndex_8812A(pAdapter, RFPath, Rate, BandWidth, Channel); #endif } else if (IS_HARDWARE_TYPE_8723B(pAdapter)) { -#if (RTL8723B_SUPPORT==1) +#if (RTL8723B_SUPPORT == 1) txPower = PHY_GetTxPowerIndex_8723B(pAdapter, RFPath, Rate, BandWidth, Channel); #endif } @@ -2377,10 +2381,10 @@ PHY_SetTxPowerIndex( IN u8 Rate ) { - if (IS_HARDWARE_TYPE_8813A(pAdapter)) { -//#if (RTL8814A_SUPPORT==1) -// PHY_SetTxPowerIndex_8813A( pAdapter, PowerIndex, RFPath, Rate ); -//#endif + if (IS_HARDWARE_TYPE_8814A(pAdapter)) { +#if (RTL8814A_SUPPORT == 1) + PHY_SetTxPowerIndex_8814A(pAdapter, PowerIndex, RFPath, Rate); +#endif } else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) { #if ((RTL8812A_SUPPORT==1) || (RTL8821A_SUPPORT == 1)) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.c index 46dab54b0839..0c3b3f8db248 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.c @@ -76,8 +76,6 @@ void Init_ODM_ComInfo(_adapter *adapter) { struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; @@ -97,61 +95,55 @@ void Init_ODM_ComInfo(_adapter *adapter) ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->VersionID)); - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pEEPROM->CustomerID); + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID); ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, adapter->registrypriv.wifi_spec); - if (pHalData->rf_type == RF_1T1R) { - ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R); - } - else if (pHalData->rf_type == RF_2T2R){ - ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R); - } - else if (pHalData->rf_type == RF_1T2R){ - ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R); - } + + if (pHalData->rf_type == RF_1T1R) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R); + else if (pHalData->rf_type == RF_1T2R) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R); + else if (pHalData->rf_type == RF_2T2R) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R); + else if (pHalData->rf_type == RF_2T2R_GREEN) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R_GREEN); + else if (pHalData->rf_type == RF_2T3R) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T3R); + else if (pHalData->rf_type == RF_2T4R) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T4R); + else if (pHalData->rf_type == RF_3T3R) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_3T3R); + else if (pHalData->rf_type == RF_3T4R) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_3T4R); + else if (pHalData->rf_type == RF_4T4R) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_4T4R); + else + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_XTXR); + { //1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE ======= u8 odm_board_type = ODM_BOARD_DEFAULT; - if (!IS_HARDWARE_TYPE_OLDER_THAN_8723A(adapter)) - { - if (pHalData->ExternalLNA_2G != 0) { - odm_board_type |= ODM_BOARD_EXT_LNA; - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1); - } - if (pHalData->ExternalLNA_5G != 0) { - odm_board_type |= ODM_BOARD_EXT_LNA_5G; - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1); - } - if (pHalData->ExternalPA_2G != 0) { - odm_board_type |= ODM_BOARD_EXT_PA; - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 1); - } - if (pHalData->ExternalPA_5G != 0) { - odm_board_type |= ODM_BOARD_EXT_PA_5G; - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1); - } - if (pHalData->EEPROMBluetoothCoexist) - odm_board_type |= ODM_BOARD_BT; - - } else { - #ifdef CONFIG_USB_HCI - if (pHalData->InterfaceSel == INTF_SEL1_USB_High_Power - || pHalData->BoardType == BOARD_USB_High_PA /* This is legacy code for hal_data.BoardType */ - ) { - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_LNA, 1); - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_PA, 1); - } else - #endif - { - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, pHalData->ExternalPA_2G); - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, pHalData->ExternalLNA_2G); - } - - odm_board_type = boardType(pHalData->InterfaceSel); + if (pHalData->ExternalLNA_2G != 0) { + odm_board_type |= ODM_BOARD_EXT_LNA; + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1); + } + if (pHalData->ExternalLNA_5G != 0) { + odm_board_type |= ODM_BOARD_EXT_LNA_5G; + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1); + } + if (pHalData->ExternalPA_2G != 0) { + odm_board_type |= ODM_BOARD_EXT_PA; + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 1); + } + if (pHalData->ExternalPA_5G != 0) { + odm_board_type |= ODM_BOARD_EXT_PA_5G; + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1); } + if (pHalData->EEPROMBluetoothCoexist) + odm_board_type |= ODM_BOARD_BT; ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, odm_board_type); //1 ============== End of BoardType ============== diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_hci/hal_usb.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_hci/hal_usb.c index 0ea23519956e..65eaf5df6211 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_hci/hal_usb.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_hci/hal_usb.c @@ -22,6 +22,222 @@ #include #include +int usb_init_recv_priv(_adapter *padapter, u16 ini_in_buf_sz) +{ + struct recv_priv *precvpriv = &padapter->recvpriv; + int i, res = _SUCCESS; + struct recv_buf *precvbuf; + +#ifdef CONFIG_RECV_THREAD_MODE + _rtw_init_sema(&precvpriv->recv_sema, 0);//will be removed + _rtw_init_sema(&precvpriv->terminate_recvthread_sema, 0);//will be removed +#endif /* CONFIG_RECV_THREAD_MODE */ + +#ifdef PLATFORM_LINUX + tasklet_init(&precvpriv->recv_tasklet, + (void(*)(unsigned long))usb_recv_tasklet, + (unsigned long)padapter); +#endif /* PLATFORM_LINUX */ + +#ifdef PLATFORM_FREEBSD + #ifdef CONFIG_RX_INDICATE_QUEUE + TASK_INIT(&precvpriv->rx_indicate_tasklet, 0, rtw_rx_indicate_tasklet, padapter); + #endif /* CONFIG_RX_INDICATE_QUEUE */ +#endif /* PLATFORM_FREEBSD */ + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE +#ifdef PLATFORM_LINUX + precvpriv->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); + if(precvpriv->int_in_urb == NULL){ + res = _FAIL; + DBG_8192C("alloc_urb for interrupt in endpoint fail !!!!\n"); + goto exit; + } +#endif /* PLATFORM_LINUX */ + precvpriv->int_in_buf = rtw_zmalloc(ini_in_buf_sz); + if(precvpriv->int_in_buf == NULL){ + res = _FAIL; + DBG_8192C("alloc_mem for interrupt in endpoint fail !!!!\n"); + goto exit; + } +#endif /* CONFIG_USB_INTERRUPT_IN_PIPE */ + + /* init recv_buf */ + _rtw_init_queue(&precvpriv->free_recv_buf_queue); + _rtw_init_queue(&precvpriv->recv_buf_pending_queue); + #ifndef CONFIG_USE_USB_BUFFER_ALLOC_RX + /* this is used only when RX_IOBUF is sk_buff */ + skb_queue_head_init(&precvpriv->free_recv_skb_queue); + #endif + + DBG_871X("NR_RECVBUFF: %d\n", NR_RECVBUFF); + DBG_871X("MAX_RECVBUF_SZ: %d\n", MAX_RECVBUF_SZ); + precvpriv->pallocated_recv_buf = rtw_zmalloc(NR_RECVBUFF *sizeof(struct recv_buf) + 4); + if(precvpriv->pallocated_recv_buf==NULL){ + res= _FAIL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("alloc recv_buf fail!\n")); + goto exit; + } + + precvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_recv_buf), 4); + + precvbuf = (struct recv_buf*)precvpriv->precv_buf; + + for(i=0; i < NR_RECVBUFF ; i++) + { + _rtw_init_listhead(&precvbuf->list); + + _rtw_spinlock_init(&precvbuf->recvbuf_lock); + + precvbuf->alloc_sz = MAX_RECVBUF_SZ; + + res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf); + if(res==_FAIL) + break; + + precvbuf->ref_cnt = 0; + precvbuf->adapter =padapter; + + //rtw_list_insert_tail(&precvbuf->list, &(precvpriv->free_recv_buf_queue.queue)); + + precvbuf++; + } + + precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF; + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) + + skb_queue_head_init(&precvpriv->rx_skb_queue); + +#ifdef CONFIG_RX_INDICATE_QUEUE + memset(&precvpriv->rx_indicate_queue, 0, sizeof(struct ifqueue)); + mtx_init(&precvpriv->rx_indicate_queue.ifq_mtx, "rx_indicate_queue", NULL, MTX_DEF); +#endif /* CONFIG_RX_INDICATE_QUEUE */ + +#ifdef CONFIG_PREALLOC_RECV_SKB + { + int i; + SIZE_PTR tmpaddr=0; + SIZE_PTR alignment=0; + struct sk_buff *pskb=NULL; + + DBG_871X("NR_PREALLOC_RECV_SKB: %d\n", NR_PREALLOC_RECV_SKB); + for(i=0; idev = padapter->pifp; + #else + pskb->dev = padapter->pnetdev; + #endif //PLATFORM_FREEBSD + +#ifndef CONFIG_PREALLOC_RX_SKB_BUFFER + tmpaddr = (SIZE_PTR)pskb->data; + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); + skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment)); +#endif + skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); + } + } + } +#endif /* CONFIG_PREALLOC_RECV_SKB */ + +#endif /* defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) */ + +exit: + + return res; +} + +void usb_free_recv_priv (_adapter *padapter, u16 ini_in_buf_sz) +{ + int i; + struct recv_buf *precvbuf; + struct recv_priv *precvpriv = &padapter->recvpriv; + + precvbuf = (struct recv_buf *)precvpriv->precv_buf; + + for(i=0; i < NR_RECVBUFF ; i++) + { + rtw_os_recvbuf_resource_free(padapter, precvbuf); + precvbuf++; + } + + if(precvpriv->pallocated_recv_buf) + rtw_mfree(precvpriv->pallocated_recv_buf, NR_RECVBUFF *sizeof(struct recv_buf) + 4); + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE +#ifdef PLATFORM_LINUX + if(precvpriv->int_in_urb) + { + usb_free_urb(precvpriv->int_in_urb); + } +#endif + if(precvpriv->int_in_buf) + rtw_mfree(precvpriv->int_in_buf, ini_in_buf_sz); +#endif /* CONFIG_USB_INTERRUPT_IN_PIPE */ + +#ifdef PLATFORM_LINUX + + if (skb_queue_len(&precvpriv->rx_skb_queue)) { + DBG_8192C(KERN_WARNING "rx_skb_queue not empty\n"); + } + + rtw_skb_queue_purge(&precvpriv->rx_skb_queue); + + if (skb_queue_len(&precvpriv->free_recv_skb_queue)) { + DBG_8192C(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue)); + } + +#if !defined(CONFIG_USE_USB_BUFFER_ALLOC_RX) + #if defined(CONFIG_PREALLOC_RECV_SKB) && defined(CONFIG_PREALLOC_RX_SKB_BUFFER) + { + struct sk_buff *skb; + + while ((skb = skb_dequeue(&precvpriv->free_recv_skb_queue)) != NULL) + { + if (rtw_free_skb_premem(skb) != 0) + rtw_skb_free(skb); + } + } + #else + rtw_skb_queue_purge(&precvpriv->free_recv_skb_queue); + #endif /* defined(CONFIG_PREALLOC_RX_SKB_BUFFER) && defined(CONFIG_PREALLOC_RECV_SKB) */ +#endif /* !defined(CONFIG_USE_USB_BUFFER_ALLOC_RX) */ + +#endif /* PLATFORM_LINUX */ + +#ifdef PLATFORM_FREEBSD + struct sk_buff *pskb; + while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) + { + rtw_skb_free(pskb); + } + + #if !defined(CONFIG_USE_USB_BUFFER_ALLOC_RX) + rtw_skb_queue_purge(&precvpriv->free_recv_skb_queue); + #endif + +#ifdef CONFIG_RX_INDICATE_QUEUE + struct mbuf *m; + for (;;) { + IF_DEQUEUE(&precvpriv->rx_indicate_queue, m); + if (m == NULL) + break; + m_freem(m); + } + mtx_destroy(&precvpriv->rx_indicate_queue.ifq_mtx); +#endif /* CONFIG_RX_INDICATE_QUEUE */ + +#endif /* PLATFORM_FREEBSD */ +} #ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ int usb_write_async(struct usb_device *udev, u32 addr, void *pdata, u16 len) @@ -89,65 +305,6 @@ int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) } #endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */ - - -#ifdef CONFIG_RTL8192D -/* This function only works in 92DU chip. */ -void usb_read_reg_rf_byfw(struct intf_hdl *pintfhdl, - u16 byteCount, - u32 registerIndex, - PVOID buffer) -{ - u16 wPage = 0x0000, offset; - u32 BufferLengthRead; - PADAPTER Adapter = pintfhdl->padapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 RFPath=0,nPHY=0; - - RFPath =(u8) ((registerIndex&0xff0000)>>16); - - if (pHalData->interfaceIndex!=0) - { - nPHY = 1; //MAC1 - if(registerIndex&MAC1_ACCESS_PHY0)// MAC1 need to access PHY0 - nPHY = 0; - } - else - { - if(registerIndex&MAC0_ACCESS_PHY1) - nPHY = 1; - } - registerIndex &= 0xFF; - wPage = ((nPHY<<7)|(RFPath<<5)|8)<<8; - offset = (u16)registerIndex; - - // - // IN a vendor request to read back MAC register. - // - usbctrl_vendorreq(pintfhdl, 0x05, offset, wPage, buffer, byteCount, 0x01); - -} -#endif - -/* - 92DU chip needs to remask "value" parameter, this function only works in 92DU chip. -*/ -static inline void usb_value_remask(struct intf_hdl *pintfhdl, u16 *value) -{ -#ifdef CONFIG_RTL8192D - _adapter *padapter = pintfhdl->padapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - if ((IS_HARDWARE_TYPE_8192DU(padapter)) && (pHalData->interfaceIndex!=0)) - { - if(*value<0x1000) - *value|=0x4000; - else if ((*value&MAC1_ACCESS_PHY0) && !(*value&0x8000)) // MAC1 need to access PHY0 - *value &= 0xFFF; - } -#endif -} - u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr) { u8 request; @@ -165,7 +322,6 @@ u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr) wvalue = (u16)(addr&0x0000ffff); len = 1; - usb_value_remask(pintfhdl, &wvalue); usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype); @@ -191,7 +347,6 @@ u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr) wvalue = (u16)(addr&0x0000ffff); len = 2; - usb_value_remask(pintfhdl, &wvalue); usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype); @@ -218,17 +373,9 @@ u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr) wvalue = (u16)(addr&0x0000ffff); len = 4; -#ifdef CONFIG_RTL8192D - if ((IS_HARDWARE_TYPE_8192DU(pintfhdl->padapter)) && ((addr&0xff000000)>>24 == 0x66)) { - usb_read_reg_rf_byfw(pintfhdl, len, addr, &data); - } else -#endif - { - usb_value_remask(pintfhdl, &wvalue); - usbctrl_vendorreq(pintfhdl, request, wvalue, index, + usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype); - } - + _func_exit_; return data; @@ -253,8 +400,7 @@ int usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) wvalue = (u16)(addr&0x0000ffff); len = 1; - data = val; - usb_value_remask(pintfhdl, &wvalue); + data = val; ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype); @@ -283,7 +429,6 @@ int usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) len = 2; data = val; - usb_value_remask(pintfhdl, &wvalue); ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype); @@ -311,8 +456,7 @@ int usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) wvalue = (u16)(addr&0x0000ffff); len = 4; - data =val; - usb_value_remask(pintfhdl, &wvalue); + data =val; ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype); @@ -341,7 +485,6 @@ int usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata) wvalue = (u16)(addr&0x0000ffff); len = length; _rtw_memcpy(buf, pdata, len ); - usb_value_remask(pintfhdl, &wvalue); ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, buf, len, requesttype); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_intf.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_intf.c index 811cc3dabcb3..b4ac4ee8d6fd 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_intf.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_intf.c @@ -25,27 +25,23 @@ void rtw_hal_chip_configure(_adapter *padapter) { - if(padapter->HalFunc.intf_chip_configure) - padapter->HalFunc.intf_chip_configure(padapter); + padapter->HalFunc.intf_chip_configure(padapter); } void rtw_hal_read_chip_info(_adapter *padapter) { - if(padapter->HalFunc.read_adapter_info) - padapter->HalFunc.read_adapter_info(padapter); + padapter->HalFunc.read_adapter_info(padapter); } void rtw_hal_read_chip_version(_adapter *padapter) { - if(padapter->HalFunc.read_chip_version) - padapter->HalFunc.read_chip_version(padapter); + padapter->HalFunc.read_chip_version(padapter); } void rtw_hal_def_value_init(_adapter *padapter) { if (is_primary_adapter(padapter)) { - if(padapter->HalFunc.init_default_value) - padapter->HalFunc.init_default_value(padapter); + padapter->HalFunc.init_default_value(padapter); rtw_init_hal_com_default_value(padapter); @@ -58,37 +54,58 @@ void rtw_hal_def_value_init(_adapter *padapter) } } } + +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 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); + rtw_hal_data_deinit(padapter); } void rtw_hal_dm_init(_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); + + padapter->HalFunc.dm_init(padapter); - _rtw_spinlock_init(&pdmpriv->IQKSpinLock); + _rtw_spinlock_init(&pHalData->IQKSpinLock); } } void rtw_hal_dm_deinit(_adapter *padapter) { if (is_primary_adapter(padapter)) { - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - if(padapter->HalFunc.dm_deinit) - padapter->HalFunc.dm_deinit(padapter); + padapter->HalFunc.dm_deinit(padapter); - _rtw_spinlock_free(&pdmpriv->IQKSpinLock); + _rtw_spinlock_free(&pHalData->IQKSpinLock); } } void rtw_hal_sw_led_init(_adapter *padapter) @@ -104,17 +121,15 @@ void rtw_hal_sw_led_deinit(_adapter *padapter) } u32 rtw_hal_power_on(_adapter *padapter) -{ - if(padapter->HalFunc.hal_power_on) - return padapter->HalFunc.hal_power_on(padapter); - return _FAIL; +{ + return padapter->HalFunc.hal_power_on(padapter); } void rtw_hal_power_off(_adapter *padapter) -{ - if(padapter->HalFunc.hal_power_off) - padapter->HalFunc.hal_power_off(padapter); +{ + padapter->HalFunc.hal_power_off(padapter); } + void rtw_hal_init_opmode(_adapter *padapter) { NDIS_802_11_NETWORK_INFRASTRUCTURE networkType = Ndis802_11InfrastructureMax; @@ -141,37 +156,6 @@ uint rtw_hal_init(_adapter *padapter) struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); int i; -#ifdef CONFIG_DUALMAC_CONCURRENT - if(padapter->hw_init_completed == _TRUE) - { - DBG_871X("rtw_hal_init: hw_init_completed == _TRUE\n"); - return status; - } - - // before init mac0, driver must init mac1 first to avoid usb rx error. - if((padapter->pbuddy_adapter != NULL) && (padapter->DualMacConcurrent == _TRUE) - && (padapter->adapter_type == PRIMARY_ADAPTER)) - { - if(padapter->pbuddy_adapter->hw_init_completed == _TRUE) - { - DBG_871X("rtw_hal_init: pbuddy_adapter hw_init_completed == _TRUE\n"); - } - else - { - status = padapter->HalFunc.hal_init(padapter->pbuddy_adapter); - if(status == _SUCCESS){ - padapter->pbuddy_adapter->hw_init_completed = _TRUE; - } - else{ - padapter->pbuddy_adapter->hw_init_completed = _FALSE; - RT_TRACE(_module_hal_init_c_,_drv_err_,("rtw_hal_init: hal__init fail(pbuddy_adapter)\n")); - DBG_871X("rtw_hal_init: hal__init fail(pbuddy_adapter)\n"); - return status; - } - } - } -#endif - status = padapter->HalFunc.hal_init(padapter); if(status == _SUCCESS){ @@ -238,14 +222,12 @@ _func_exit_; void rtw_hal_set_hwreg(_adapter *padapter, u8 variable, u8 *val) { - if (padapter->HalFunc.SetHwRegHandler) - padapter->HalFunc.SetHwRegHandler(padapter, variable, val); + padapter->HalFunc.SetHwRegHandler(padapter, variable, val); } void rtw_hal_get_hwreg(_adapter *padapter, u8 variable, u8 *val) { - if (padapter->HalFunc.GetHwRegHandler) - padapter->HalFunc.GetHwRegHandler(padapter, variable, val); + padapter->HalFunc.GetHwRegHandler(padapter, variable, val); } #ifdef CONFIG_C2H_PACKET_EN @@ -258,45 +240,39 @@ void rtw_hal_set_hwreg_with_buf(_adapter *padapter, u8 variable, u8 *pbuf, int l u8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue) { - if(padapter->HalFunc.SetHalDefVarHandler) - return padapter->HalFunc.SetHalDefVarHandler(padapter,eVariable,pValue); - return _FAIL; + return padapter->HalFunc.SetHalDefVarHandler(padapter,eVariable,pValue); } u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue) { - if(padapter->HalFunc.GetHalDefVarHandler) - return padapter->HalFunc.GetHalDefVarHandler(padapter,eVariable,pValue); - return _FAIL; + return padapter->HalFunc.GetHalDefVarHandler(padapter,eVariable,pValue); } void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet) { - if(padapter->HalFunc.SetHalODMVarHandler) - padapter->HalFunc.SetHalODMVarHandler(padapter,eVariable,pValue1,bSet); + padapter->HalFunc.SetHalODMVarHandler(padapter,eVariable,pValue1,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,pValue2); + padapter->HalFunc.GetHalODMVarHandler(padapter,eVariable,pValue1,pValue2); } +/* FOR SDIO & PCIE */ void rtw_hal_enable_interrupt(_adapter *padapter) { - if (padapter->HalFunc.enable_interrupt) - padapter->HalFunc.enable_interrupt(padapter); - else - DBG_871X("%s: HalFunc.enable_interrupt is NULL!\n", __FUNCTION__); - +#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) + padapter->HalFunc.enable_interrupt(padapter); +#endif //#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) } + +/* FOR SDIO & PCIE */ void rtw_hal_disable_interrupt(_adapter *padapter) { - if (padapter->HalFunc.disable_interrupt) - padapter->HalFunc.disable_interrupt(padapter); - else - DBG_871X("%s: HalFunc.disable_interrupt is NULL!\n", __FUNCTION__); - +#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) + padapter->HalFunc.disable_interrupt(padapter); +#endif //#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) } + u8 rtw_hal_check_ips_status(_adapter *padapter) { u8 val = _FALSE; @@ -310,43 +286,43 @@ u8 rtw_hal_check_ips_status(_adapter *padapter) #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) void rtw_hal_clear_interrupt(_adapter *padapter) +{ +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + padapter->HalFunc.clear_interrupt(padapter); +#endif +} +void rtw_hal_set_wowlan_fw(_adapter *padapter, u8 sleep) { - if (padapter->HalFunc.clear_interrupt) - padapter->HalFunc.clear_interrupt(padapter); - else - DBG_871X("%s: HalFunc.clear_interrupt is NULL!\n", __FUNCTION__); - + padapter->HalFunc.hal_set_wowlan_fw(padapter, sleep); } + #endif +#if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI) u32 rtw_hal_inirp_init(_adapter *padapter) { - u32 rst = _FAIL; - if(padapter->HalFunc.inirp_init) - rst = padapter->HalFunc.inirp_init(padapter); - else - DBG_871X(" %s HalFunc.inirp_init is NULL!!!\n",__FUNCTION__); - return rst; + if (is_primary_adapter(padapter)) + return padapter->HalFunc.inirp_init(padapter); + return _SUCCESS; } - u32 rtw_hal_inirp_deinit(_adapter *padapter) { - - if(padapter->HalFunc.inirp_deinit) + + if (is_primary_adapter(padapter)) return padapter->HalFunc.inirp_deinit(padapter); - return _FAIL; - + return _SUCCESS; } +#endif //#if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI) +#if defined(CONFIG_PCI_HCI) void rtw_hal_irp_reset(_adapter *padapter) { - if(padapter->HalFunc.irp_reset) - padapter->HalFunc.irp_reset(padapter); - else - DBG_871X("%s: HalFunc.rtw_hal_irp_reset is NULL!\n", __FUNCTION__); + padapter->HalFunc.irp_reset(padapter); } +#endif //#if defined(CONFIG_PCI_HCI) +/* for USB Auto-suspend */ u8 rtw_hal_intf_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val) { if(padapter->HalFunc.interface_ps_func) @@ -356,18 +332,12 @@ u8 rtw_hal_intf_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val) s32 rtw_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe) { - if(padapter->HalFunc.hal_xmitframe_enqueue) - return padapter->HalFunc.hal_xmitframe_enqueue(padapter, pxmitframe); - - return _FALSE; + return padapter->HalFunc.hal_xmitframe_enqueue(padapter, pxmitframe); } s32 rtw_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe) { - if(padapter->HalFunc.hal_xmit) - return padapter->HalFunc.hal_xmit(padapter, pxmitframe); - - return _FALSE; + return padapter->HalFunc.hal_xmit(padapter, pxmitframe); } /* @@ -400,35 +370,26 @@ s32 rtw_hal_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe) } #endif //CONFIG_IEEE80211W - if(padapter->HalFunc.mgnt_xmit) - ret = padapter->HalFunc.mgnt_xmit(padapter, pmgntframe); + ret = padapter->HalFunc.mgnt_xmit(padapter, pmgntframe); return ret; } s32 rtw_hal_init_xmit_priv(_adapter *padapter) { - if(padapter->HalFunc.init_xmit_priv != NULL) - return padapter->HalFunc.init_xmit_priv(padapter); - return _FAIL; + return padapter->HalFunc.init_xmit_priv(padapter); } void rtw_hal_free_xmit_priv(_adapter *padapter) { - if(padapter->HalFunc.free_xmit_priv != NULL) - padapter->HalFunc.free_xmit_priv(padapter); + padapter->HalFunc.free_xmit_priv(padapter); } s32 rtw_hal_init_recv_priv(_adapter *padapter) { - if(padapter->HalFunc.init_recv_priv) - return padapter->HalFunc.init_recv_priv(padapter); - - return _FAIL; + return padapter->HalFunc.init_recv_priv(padapter); } void rtw_hal_free_recv_priv(_adapter *padapter) { - - if(padapter->HalFunc.free_recv_priv) - padapter->HalFunc.free_recv_priv(padapter); + padapter->HalFunc.free_recv_priv(padapter); } void rtw_hal_update_ra_mask(struct sta_info *psta, u8 rssi_level) @@ -449,28 +410,34 @@ void rtw_hal_update_ra_mask(struct sta_info *psta, u8 rssi_level) } else { - if(padapter->HalFunc.UpdateRAMaskHandler) - padapter->HalFunc.UpdateRAMaskHandler(padapter, psta->mac_id, rssi_level); + padapter->HalFunc.UpdateRAMaskHandler(padapter, psta->mac_id, rssi_level); } } void rtw_hal_add_ra_tid(_adapter *padapter, u32 bitmap, u8* arg, u8 rssi_level) { - if(padapter->HalFunc.Add_RateATid) - padapter->HalFunc.Add_RateATid(padapter, bitmap, arg, rssi_level); + padapter->HalFunc.Add_RateATid(padapter, bitmap, arg, rssi_level); } /* Start specifical interface thread */ void rtw_hal_start_thread(_adapter *padapter) { - if(padapter->HalFunc.run_thread) - padapter->HalFunc.run_thread(padapter); +#if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) +#ifndef CONFIG_SDIO_TX_TASKLET + padapter->HalFunc.run_thread(padapter); +#endif +#endif } /* Start specifical interface thread */ void rtw_hal_stop_thread(_adapter *padapter) { - if(padapter->HalFunc.cancel_thread) - padapter->HalFunc.cancel_thread(padapter); +#if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) +#ifndef CONFIG_SDIO_TX_TASKLET + + padapter->HalFunc.cancel_thread(padapter); + +#endif +#endif } u32 rtw_hal_read_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask) @@ -498,27 +465,25 @@ void rtw_hal_write_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMa if(padapter->HalFunc.write_rfreg) padapter->HalFunc.write_rfreg(padapter, eRFPath, RegAddr, BitMask, Data); } - +#if defined(CONFIG_PCI_HCI) s32 rtw_hal_interrupt_handler(_adapter *padapter) { - if(padapter->HalFunc.interrupt_handler) - return padapter->HalFunc.interrupt_handler(padapter); - return _FAIL; + s32 ret = _FAIL; + ret = padapter->HalFunc.interrupt_handler(padapter); + return ret; } - +#endif 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); - } + 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) @@ -526,14 +491,11 @@ 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); - } + 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) @@ -541,14 +503,11 @@ void rtw_hal_set_chnl_bw(_adapter *padapter, u8 channel, CHANNEL_WIDTH Bandwidth 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); - } + 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) @@ -565,16 +524,14 @@ void rtw_hal_get_tx_power_level(_adapter *padapter, s32 *powerlevel) void rtw_hal_dm_watchdog(_adapter *padapter) { -#if defined(CONFIG_CONCURRENT_MODE) - if (padapter->adapter_type != PRIMARY_ADAPTER) + if (!is_primary_adapter(padapter)) return; -#endif - if(padapter->HalFunc.hal_dm_watchdog) - padapter->HalFunc.hal_dm_watchdog(padapter); + padapter->HalFunc.hal_dm_watchdog(padapter); } +#ifdef CONFIG_LPS_LCLK_WD_TIMER void rtw_hal_dm_watchdog_in_lps(_adapter *padapter) { #if defined(CONFIG_CONCURRENT_MODE) @@ -582,19 +539,15 @@ void rtw_hal_dm_watchdog_in_lps(_adapter *padapter) return; #endif - if (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode ==_TRUE ) - { - if(padapter->HalFunc.hal_dm_watchdog_in_lps) - { - padapter->HalFunc.hal_dm_watchdog_in_lps(padapter);//this fuction caller is in interrupt context - } + if (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode ==_TRUE ) { + padapter->HalFunc.hal_dm_watchdog_in_lps(padapter);//this fuction caller is in interrupt context } } +#endif void rtw_hal_bcn_related_reg_setting(_adapter *padapter) -{ - if(padapter->HalFunc.SetBeaconRelatedRegistersHandler) - padapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter); +{ + padapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter); } @@ -624,21 +577,17 @@ s32 rtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) #ifdef DBG_CONFIG_ERROR_DETECT void rtw_hal_sreset_init(_adapter *padapter) { - if(padapter->HalFunc.sreset_init_value) - padapter->HalFunc.sreset_init_value(padapter); + padapter->HalFunc.sreset_init_value(padapter); } void rtw_hal_sreset_reset(_adapter *padapter) { padapter = GET_PRIMARY_ADAPTER(padapter); - - if(padapter->HalFunc.silentreset) - padapter->HalFunc.silentreset(padapter); + padapter->HalFunc.silentreset(padapter); } void rtw_hal_sreset_reset_value(_adapter *padapter) { - if(padapter->HalFunc.sreset_reset_value) - padapter->HalFunc.sreset_reset_value(padapter); + padapter->HalFunc.sreset_reset_value(padapter); } void rtw_hal_sreset_xmit_status_check(_adapter *padapter) @@ -646,34 +595,23 @@ void rtw_hal_sreset_xmit_status_check(_adapter *padapter) if (!is_primary_adapter(padapter)) return; - if(padapter->HalFunc.sreset_xmit_status_check) - padapter->HalFunc.sreset_xmit_status_check(padapter); + padapter->HalFunc.sreset_xmit_status_check(padapter); } void rtw_hal_sreset_linked_status_check(_adapter *padapter) { if (!is_primary_adapter(padapter)) return; - - if(padapter->HalFunc.sreset_linked_status_check) - padapter->HalFunc.sreset_linked_status_check(padapter); + padapter->HalFunc.sreset_linked_status_check(padapter); } u8 rtw_hal_sreset_get_wifi_status(_adapter *padapter) -{ - u8 status = 0; - if(padapter->HalFunc.sreset_get_wifi_status) - status = padapter->HalFunc.sreset_get_wifi_status(padapter); - return status; +{ + return padapter->HalFunc.sreset_get_wifi_status(padapter); } bool rtw_hal_sreset_inprogress(_adapter *padapter) { - bool inprogress = _FALSE; - padapter = GET_PRIMARY_ADAPTER(padapter); - - if(padapter->HalFunc.sreset_inprogress) - inprogress = padapter->HalFunc.sreset_inprogress(padapter); - return inprogress; + return padapter->HalFunc.sreset_inprogress(padapter); } #endif //DBG_CONFIG_ERROR_DETECT @@ -688,10 +626,8 @@ int rtw_hal_iol_cmd(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wat #ifdef CONFIG_XMIT_THREAD_MODE s32 rtw_hal_xmit_thread_handler(_adapter *padapter) -{ - if(padapter->HalFunc.xmit_thread_handler) - return padapter->HalFunc.xmit_thread_handler(padapter); - return _FAIL; +{ + return padapter->HalFunc.xmit_thread_handler(padapter); } #endif @@ -713,7 +649,7 @@ bool rtw_hal_c2h_valid(_adapter *adapter, u8 *buf) HAL_VERSION *hal_ver = &HalData->VersionID; bool ret = _FAIL; - if (IS_81XXC(*hal_ver) || IS_8723_SERIES(*hal_ver) ||IS_92D(*hal_ver) ||IS_8188E(*hal_ver)) { + if (IS_8188E(*hal_ver)) { ret = c2h_evt_valid((struct c2h_evt_hdr *)buf); } else if(IS_8192E(*hal_ver) || IS_8812_SERIES(*hal_ver) || IS_8821_SERIES(*hal_ver) || IS_8723B_SERIES(*hal_ver)) { ret = c2h_evt_valid((struct c2h_evt_hdr_88xx*)buf); @@ -730,7 +666,7 @@ s32 rtw_hal_c2h_evt_read(_adapter *adapter, u8 *buf) HAL_VERSION *hal_ver = &HalData->VersionID; s32 ret = _FAIL; - if (IS_81XXC(*hal_ver) || IS_8723_SERIES(*hal_ver) ||IS_92D(*hal_ver) ||IS_8188E(*hal_ver)) { + if (IS_8188E(*hal_ver)) { ret = c2h_evt_read(adapter, buf); } else if(IS_8192E(*hal_ver) || IS_8812_SERIES(*hal_ver) || IS_8821_SERIES(*hal_ver) || IS_8723B_SERIES(*hal_ver)) { ret = c2h_evt_read_88xx(adapter, buf); @@ -805,16 +741,291 @@ s32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid) s32 rtw_hal_fill_h2c_cmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer) { - s32 ret = _FAIL; + return padapter->HalFunc.fill_h2c_cmd(padapter, ElementID, CmdLen, pCmdBuffer); +} - if (padapter->HalFunc.fill_h2c_cmd) - ret = padapter->HalFunc.fill_h2c_cmd(padapter, ElementID, CmdLen, pCmdBuffer); - else - { - DBG_871X("%s: func[fill_h2c_cmd] not defined!\n", __FUNCTION__); - rtw_warn_on(1); +void rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen, + u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame) +{ + padapter->HalFunc.fill_fake_txdesc(padapter, pDesc, BufferLen,IsPsPoll, IsBTQosNull, bDataFrame); + +} +u8 rtw_hal_get_txbuff_rsvd_page_num(_adapter *adapter, bool wowlan) +{ + return adapter->HalFunc.hal_get_tx_buff_rsvd_page_num(adapter, wowlan); +} + +#ifdef CONFIG_GPIO_API +void rtw_hal_update_hisr_hsisr_ind(_adapter *padapter, u32 flag) +{ + if (padapter->HalFunc.update_hisr_hsisr_ind) + padapter->HalFunc.update_hisr_hsisr_ind(padapter, flag); +} +#endif + +#define rtw_hal_error_msg(ops_fun) \ + DBG_871X_LEVEL(_drv_always_, "### %s - Error : Please hook HalFunc.%s ###\n",__FUNCTION__,ops_fun) + +u8 rtw_hal_ops_check(_adapter *padapter) +{ + u8 ret = _SUCCESS; +#if 1 + /*** initialize section ***/ + if (NULL == padapter->HalFunc.read_chip_version) { + rtw_hal_error_msg("read_chip_version"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.init_default_value) { + rtw_hal_error_msg("init_default_value"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.intf_chip_configure) { + rtw_hal_error_msg("intf_chip_configure"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.read_adapter_info) { + rtw_hal_error_msg("read_adapter_info"); + ret = _FAIL; } - return ret; + if (NULL == padapter->HalFunc.hal_power_on) { + rtw_hal_error_msg("hal_power_on"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.hal_power_off) { + rtw_hal_error_msg("hal_power_off"); + ret = _FAIL; + } + + if (NULL == padapter->HalFunc.hal_init) { + rtw_hal_error_msg("hal_init"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.hal_deinit) { + rtw_hal_error_msg("hal_deinit"); + ret = _FAIL; + } + + /*** xmit section ***/ + if (NULL == padapter->HalFunc.init_xmit_priv) { + rtw_hal_error_msg("init_xmit_priv"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.free_xmit_priv) { + rtw_hal_error_msg("free_xmit_priv"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.hal_xmit) { + rtw_hal_error_msg("hal_xmit"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.mgnt_xmit) { + rtw_hal_error_msg("mgnt_xmit"); + ret = _FAIL; + } + #ifdef CONFIG_XMIT_THREAD_MODE + if (NULL == padapter->HalFunc.xmit_thread_handler) { + rtw_hal_error_msg("xmit_thread_handler"); + ret = _FAIL; + } + #endif + if (NULL == padapter->HalFunc.hal_xmitframe_enqueue) { + rtw_hal_error_msg("hal_xmitframe_enqueue"); + ret = _FAIL; + } + #if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) + #ifndef CONFIG_SDIO_TX_TASKLET + if (NULL == padapter->HalFunc.run_thread) { + rtw_hal_error_msg("run_thread"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.cancel_thread) { + rtw_hal_error_msg("cancel_thread"); + ret = _FAIL; + } + #endif + #endif + + /*** recv section ***/ + if (NULL == padapter->HalFunc.init_recv_priv) { + rtw_hal_error_msg("init_recv_priv"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.free_recv_priv) { + rtw_hal_error_msg("free_recv_priv"); + ret = _FAIL; + } + #if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI) + if (NULL == padapter->HalFunc.inirp_init) { + rtw_hal_error_msg("inirp_init"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.inirp_deinit) { + rtw_hal_error_msg("inirp_deinit"); + ret = _FAIL; + } + #endif //#if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI) + + + /*** interrupt hdl section ***/ + #if defined(CONFIG_PCI_HCI) + if (NULL == padapter->HalFunc.irp_reset) { + rtw_hal_error_msg("irp_reset"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.interrupt_handler) { + rtw_hal_error_msg("interrupt_handler"); + ret = _FAIL; + } + #endif //#if defined(CONFIG_PCI_HCI) + + #if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) + if (NULL == padapter->HalFunc.enable_interrupt) { + rtw_hal_error_msg("enable_interrupt"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.disable_interrupt) { + rtw_hal_error_msg("disable_interrupt"); + ret = _FAIL; + } + #endif //defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) + + + /*** DM section ***/ + if (NULL == padapter->HalFunc.dm_init) { + rtw_hal_error_msg("dm_init"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.dm_deinit) { + rtw_hal_error_msg("dm_deinit"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.hal_dm_watchdog) { + rtw_hal_error_msg("hal_dm_watchdog"); + ret = _FAIL; + } + #ifdef CONFIG_LPS_LCLK_WD_TIMER + if (NULL == padapter->HalFunc.hal_dm_watchdog_in_lps) { + rtw_hal_error_msg("hal_dm_watchdog_in_lps"); + ret = _FAIL; + } + #endif + + /*** xxx section ***/ + if (NULL == padapter->HalFunc.set_bwmode_handler) { + rtw_hal_error_msg("set_bwmode_handler"); + ret = _FAIL; + } + + if (NULL == padapter->HalFunc.set_channel_handler) { + rtw_hal_error_msg("set_channel_handler"); + ret = _FAIL; + } + + if (NULL == padapter->HalFunc.set_chnl_bw_handler) { + rtw_hal_error_msg("set_chnl_bw_handler"); + ret = _FAIL; + } + + if (NULL == padapter->HalFunc.SetHwRegHandler) { + rtw_hal_error_msg("SetHwRegHandler"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.GetHwRegHandler) { + rtw_hal_error_msg("GetHwRegHandler"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.GetHalDefVarHandler) { + rtw_hal_error_msg("GetHalDefVarHandler"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.SetHalDefVarHandler) { + rtw_hal_error_msg("SetHalDefVarHandler"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.GetHalODMVarHandler) { + rtw_hal_error_msg("GetHalODMVarHandler"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.SetHalODMVarHandler) { + rtw_hal_error_msg("SetHalODMVarHandler"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.UpdateRAMaskHandler) { + rtw_hal_error_msg("UpdateRAMaskHandler"); + ret = _FAIL; + } + + if (NULL == padapter->HalFunc.SetBeaconRelatedRegistersHandler) { + rtw_hal_error_msg("SetBeaconRelatedRegistersHandler"); + ret = _FAIL; + } + + if (NULL == padapter->HalFunc.Add_RateATid) { + rtw_hal_error_msg("Add_RateATid"); + ret = _FAIL; + } + + if (NULL == padapter->HalFunc.fill_h2c_cmd) { + rtw_hal_error_msg("fill_h2c_cmd"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.fill_fake_txdesc) { + rtw_hal_error_msg("fill_fake_txdesc"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.hal_get_tx_buff_rsvd_page_num) { + rtw_hal_error_msg("hal_get_tx_buff_rsvd_page_num"); + ret = _FAIL; + } + + #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) + #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + if (NULL == padapter->HalFunc.clear_interrupt) { + rtw_hal_error_msg("clear_interrupt"); + ret = _FAIL; + } + #endif + if (NULL == padapter->HalFunc.hal_set_wowlan_fw) { + rtw_hal_error_msg("hal_set_wowlan_fw"); + ret = _FAIL; + } + #endif //CONFIG_WOWLAN + + + /*** SReset section ***/ + #ifdef DBG_CONFIG_ERROR_DETECT + if (NULL == padapter->HalFunc.sreset_init_value) { + rtw_hal_error_msg("sreset_init_value"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.sreset_reset_value) { + rtw_hal_error_msg("sreset_reset_value"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.silentreset) { + rtw_hal_error_msg("silentreset"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.sreset_xmit_status_check) { + rtw_hal_error_msg("sreset_xmit_status_check"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.sreset_linked_status_check) { + rtw_hal_error_msg("sreset_linked_status_check"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.sreset_get_wifi_status) { + rtw_hal_error_msg("sreset_get_wifi_status"); + ret = _FAIL; + } + if (NULL == padapter->HalFunc.sreset_inprogress) { + rtw_hal_error_msg("sreset_inprogress"); + ret = _FAIL; + } + #endif //#ifdef DBG_CONFIG_ERROR_DETECT + +#endif + return ret; } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/led/hal_usb_led.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/led/hal_usb_led.c index 6706e0101c86..4827b9b21253 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/led/hal_usb_led.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/led/hal_usb_led.c @@ -149,17 +149,17 @@ SwLedBlink1( ) { _adapter *padapter = pLed->padapter; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); struct led_priv *ledpriv = &(padapter->ledpriv); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); PLED_USB pLed1 = &(ledpriv->SwLed1); u8 bStopBlinking = _FALSE; u32 uLedBlinkNoLinkInterval = LED_BLINK_NO_LINK_INTERVAL_ALPHA; //add by ylb 20121012 for customer led for alpha - if(pEEPROM->CustomerID == RT_CID_819x_ALPHA_Dlink) + if(pHalData->CustomerID == RT_CID_819x_ALPHA_Dlink) uLedBlinkNoLinkInterval= LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS; - if(pEEPROM->CustomerID == RT_CID_819x_CAMEO) + if(pHalData->CustomerID == RT_CID_819x_CAMEO) pLed = &(ledpriv->SwLed1); // Change LED according to BlinkingLedState specified. @@ -175,7 +175,7 @@ SwLedBlink1( } - if(pEEPROM->CustomerID == RT_CID_DEFAULT) + if(pHalData->CustomerID == RT_CID_DEFAULT) { if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) { @@ -795,18 +795,12 @@ SwLedBlink4( } else { - if(IS_HARDWARE_TYPE_8192DU(padapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } + + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); } } @@ -879,20 +873,13 @@ SwLedBlink4( } else { - if(IS_HARDWARE_TYPE_8192DU(padapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; else - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); } pLed->bLedBlinkInProgress = _FALSE; @@ -906,17 +893,11 @@ SwLedBlink4( } else { - if(IS_HARDWARE_TYPE_8192DU(padapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - } + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); } } @@ -1354,18 +1335,11 @@ SwLedBlink9( } else { - if(IS_HARDWARE_TYPE_8192DU(Adapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); } } @@ -1448,7 +1422,7 @@ SwLedBlink9( } else { - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + if(IS_HARDWARE_TYPE_8812AU(Adapter)) { pLed->BlinkingLedState = RTW_LED_ON; pLed->CurrLedState = LED_BLINK_ALWAYS_ON; @@ -1475,7 +1449,7 @@ SwLedBlink9( } else { - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8723AU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + if(IS_HARDWARE_TYPE_8812AU(Adapter)) { pLed->BlinkingLedState = RTW_LED_ON; } @@ -1716,7 +1690,7 @@ SwLedBlink10( } else { - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + if(IS_HARDWARE_TYPE_8812AU(Adapter)) { pLed->BlinkingLedState = RTW_LED_ON; pLed->CurrLedState = LED_BLINK_ALWAYS_ON; @@ -1743,7 +1717,7 @@ SwLedBlink10( } else { - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8723AU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + if(IS_HARDWARE_TYPE_8812AU(Adapter)) { pLed->BlinkingLedState = RTW_LED_ON; } @@ -2426,7 +2400,8 @@ void BlinkTimerCallback(void *data) #ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD rtw_led_blink_cmd(padapter, (PVOID)pLed); #else - _set_workitem(&(pLed->BlinkWorkItem)); + if(ATOMIC_READ(&pLed->bCancelWorkItem) == _FALSE) + _set_workitem(&(pLed->BlinkWorkItem)); #endif } @@ -2567,13 +2542,13 @@ SwLedControlMode1( struct led_priv *ledpriv = &(padapter->ledpriv); PLED_USB pLed = &(ledpriv->SwLed0); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); u32 uLedBlinkNoLinkInterval = LED_BLINK_NO_LINK_INTERVAL_ALPHA; //add by ylb 20121012 for customer led for alpha - if(pEEPROM->CustomerID == RT_CID_819x_ALPHA_Dlink) + if(pHalData->CustomerID == RT_CID_819x_ALPHA_Dlink) uLedBlinkNoLinkInterval= LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS; - if(pEEPROM->CustomerID == RT_CID_819x_CAMEO) + if(pHalData->CustomerID == RT_CID_819x_CAMEO) pLed = &(ledpriv->SwLed1); switch(LedAction) @@ -3266,31 +3241,12 @@ SwLedControlMode4( } pLed->bLedNoLinkBlinkInProgress = _TRUE; - if(IS_HARDWARE_TYPE_8192DU(padapter)) - { - if(LedAction == LED_CTL_LINK) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } - else - { - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - } - } + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; else - { - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); } break; @@ -3314,10 +3270,7 @@ SwLedControlMode4( pLed->bLedBlinkInProgress = _FALSE; } pLed->bLedScanBlinkInProgress = _TRUE; - if(IS_HARDWARE_TYPE_8192D(padapter)) - pLed->CurrLedState = LED_BLINK_SLOWLY; - else - pLed->CurrLedState = LED_BLINK_SCAN; + pLed->CurrLedState = LED_BLINK_SCAN; pLed->BlinkTimes = 24; if( pLed->bLedOn ) pLed->BlinkingLedState = RTW_LED_OFF; @@ -3556,10 +3509,10 @@ SwLedControlMode5( { struct led_priv *ledpriv = &(padapter->ledpriv); struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); PLED_USB pLed = &(ledpriv->SwLed0); - if(pEEPROM->CustomerID == RT_CID_819x_CAMEO) + if(pHalData->CustomerID == RT_CID_819x_CAMEO) pLed = &(ledpriv->SwLed1); switch(LedAction) @@ -3975,7 +3928,7 @@ SwLedControlMode9( } pLed->bLedNoLinkBlinkInProgress = _TRUE; - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + if(IS_HARDWARE_TYPE_8812AU(Adapter)) { if(LedAction == LED_CTL_LINK) { @@ -4023,10 +3976,7 @@ SwLedControlMode9( pLed->bLedBlinkInProgress = _FALSE; } pLed->bLedScanBlinkInProgress = _TRUE; - if(IS_HARDWARE_TYPE_8192D(Adapter)) - pLed->CurrLedState = LED_BLINK_SLOWLY; - else - pLed->CurrLedState = LED_BLINK_SCAN; + pLed->CurrLedState = LED_BLINK_SCAN; pLed->BlinkTimes = 24; if( pLed->bLedOn ) pLed->BlinkingLedState = RTW_LED_OFF; @@ -5202,9 +5152,8 @@ InitLed( pLed->LedPin = LedPin; ResetLedStatus(pLed); - + ATOMIC_SET(&pLed->bCancelWorkItem, _FALSE); _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed); - _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed); } @@ -5218,6 +5167,7 @@ DeInitLed( PLED_USB pLed ) { + ATOMIC_SET(&pLed->bCancelWorkItem, _TRUE); _cancel_workitem_sync(&(pLed->BlinkWorkItem)); _cancel_timer_ex(&(pLed->BlinkTimer)); ResetLedStatus(pLed); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_cmd.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_cmd.c index 7714e38b448e..7c46ea78c89b 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_cmd.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_cmd.c @@ -42,10 +42,8 @@ static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num) if(0 == valid ){ read_down = _TRUE; } -#ifdef CONFIG_WOWLAN else - rtw_msleep_os(1); -#endif + rtw_msleep_os(1); }while( (!read_down) && (retry_cnts--)); return read_down; @@ -171,7 +169,7 @@ static void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength) *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); @@ -279,7 +277,7 @@ static void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength) _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); // TA. - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); *pLength = 16; } @@ -319,19 +317,19 @@ static void ConstructNullFunctionData( 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->addr2, adapter_mac_addr(padapter), 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); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), 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->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); break; } @@ -397,7 +395,7 @@ static void ConstructARPResponse( //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->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, 0); @@ -479,7 +477,7 @@ static void ConstructARPResponse( 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_MAC_ADDR(pARPRspPkt, adapter_mac_addr(padapter)); SET_ARP_PKT_SENDER_IP_ADDR(pARPRspPkt, pIPAddress); #ifdef CONFIG_ARP_KEEP_ALIVE if (rtw_gw_addr_query(padapter)==0) { @@ -702,7 +700,7 @@ static void ConstructGTKResponse( //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->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); SetSeqNum(pwlanhdr, 0); @@ -801,7 +799,7 @@ static void ConstructProbeReq(_adapter *padapter, u8 *pframe, u32 *pLength, u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - mac = myid(&(padapter->eeprompriv)); + mac = adapter_mac_addr(padapter); fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; @@ -866,7 +864,7 @@ static void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 * pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - mac = myid(&(padapter->eeprompriv)); + mac = adapter_mac_addr(padapter); bssid = cur_network->MacAddress; fctrl = &(pwlanhdr->frame_ctl); @@ -926,7 +924,7 @@ static void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 * /* retrieve SSID IE from cur_network->Ssid */ { u8 *ssid_ie; - sint ssid_ielen; + sint ssid_ielen = 0; sint ssid_ielen_diff; u8 buf[MAX_IE_SZ]; u8 *ies = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); @@ -1282,12 +1280,6 @@ void rtl8723b_set_FwPwrMode_cmd(PADAPTER padapter, u8 psmode) _func_enter_; -#ifdef CONFIG_PLATFORM_INTEL_BYT - if(psmode == PS_MODE_DTIM) - psmode = PS_MODE_MAX; -#endif //CONFIG_PLATFORM_INTEL_BYT - - if(pwrpriv->dtim > 0) DBG_871X("%s(): FW LPS mode = %d, SmartPS=%d, dtim=%d\n", __func__, psmode, pwrpriv->smart_ps, pwrpriv->dtim); else @@ -1499,13 +1491,58 @@ void rtl8723b_set_FwPwrModeInIPS_cmd(PADAPTER padapter, u8 cmd_param) DBG_871X("%s()\n", __func__); - cmd_param = cmd_param; - FillH2CCmd8723B(padapter, H2C_8723B_FWLPS_IN_IPS_, 1, &cmd_param); } #ifdef CONFIG_WOWLAN +static void rtl8723b_set_FwWoWlanCtrl_Cmd(PADAPTER padapter, u8 bFuncEn) +{ + struct security_priv *psecpriv = &padapter->securitypriv; + struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter); + u8 u1H2CWoWlanCtrlParm[H2C_WOWLAN_LEN]={0}; + u8 discont_wake = 1, gpionum = 0, gpio_dur = 0, hw_unicast = 0, gpio_pulse_cnt=100; + u8 sdio_wakeup_enable = 1; + u8 gpio_high_active = 0; //0: low active, 1: high active + u8 magic_pkt = 0; + +#ifdef CONFIG_GPIO_WAKEUP + gpionum = WAKEUP_GPIO_IDX; + sdio_wakeup_enable = 0; +#endif + +#ifdef CONFIG_PNO_SUPPORT + if (!ppwrpriv->wowlan_pno_enable) { + magic_pkt = 1; + } +#endif + + if (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_) + hw_unicast = 1; + + DBG_871X("%s(): bFuncEn=%d\n", __func__, bFuncEn); + + SET_H2CCMD_WOWLAN_FUNC_ENABLE(u1H2CWoWlanCtrlParm, bFuncEn); + SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(u1H2CWoWlanCtrlParm, 0); + SET_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(u1H2CWoWlanCtrlParm, magic_pkt); + SET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(u1H2CWoWlanCtrlParm, hw_unicast); + SET_H2CCMD_WOWLAN_ALL_PKT_DROP(u1H2CWoWlanCtrlParm, 0); + SET_H2CCMD_WOWLAN_GPIO_ACTIVE(u1H2CWoWlanCtrlParm, gpio_high_active); +#ifndef CONFIG_GTK_OL + SET_H2CCMD_WOWLAN_REKEY_WAKE_UP(u1H2CWoWlanCtrlParm, 1); +#endif //!CONFIG_GTK_OL + SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(u1H2CWoWlanCtrlParm, discont_wake); + SET_H2CCMD_WOWLAN_GPIONUM(u1H2CWoWlanCtrlParm, gpionum); + SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(u1H2CWoWlanCtrlParm, sdio_wakeup_enable); + SET_H2CCMD_WOWLAN_GPIO_DURATION(u1H2CWoWlanCtrlParm, gpio_dur); + //SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 1); + SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, 0x09); + + RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CWoWlanCtrlParm:", u1H2CWoWlanCtrlParm, H2C_WOWLAN_LEN); + + FillH2CCmd8723B(padapter, H2C_8723B_WOWLAN, H2C_WOWLAN_LEN, u1H2CWoWlanCtrlParm); +} + static void rtl8723b_set_FwRemoteWakeCtrl_Cmd(PADAPTER padapter, u8 benable) { u8 u1H2CRemoteWakeCtrlParm[H2C_REMOTE_WAKE_CTRL_LEN]={0}; @@ -1636,7 +1673,7 @@ _func_enter_; rtw_msleep_os(2); } - rtw_hal_set_wowlan_ctrl_cmd(padapter, enable); + rtl8723b_set_FwWoWlanCtrl_Cmd(padapter, enable); rtw_msleep_os(2); rtl8723b_set_FwRemoteWakeCtrl_Cmd(padapter, enable); @@ -1652,7 +1689,7 @@ _func_enter_; #endif rtl8723b_set_FwRemoteWakeCtrl_Cmd(padapter, enable); rtw_msleep_os(2); - rtw_hal_set_wowlan_ctrl_cmd(padapter, enable); + rtl8723b_set_FwWoWlanCtrl_Cmd(padapter, enable); } _func_exit_; @@ -2450,10 +2487,10 @@ _func_enter_; if (pwrpriv->wowlan_ap_mode) rtl8723b_set_AP_FwRsvdPagePkt(padapter, 0); else - rtl8723b_set_FwRsvdPagePkt(padapter, 0); + rtw_hal_set_fw_rsvd_page(padapter, 0); #else // download rsvd page. - rtl8723b_set_FwRsvdPagePkt(padapter, 0); + rtw_hal_set_fw_rsvd_page(padapter, 0); #endif DLBcnCount++; do @@ -2589,7 +2626,7 @@ static void ConstructBtNullFunctionData( if (NULL == StaAddr) { - _rtw_memcpy(bssid, myid(&padapter->eeprompriv), ETH_ALEN); + _rtw_memcpy(bssid, adapter_mac_addr(padapter), ETH_ALEN); StaAddr = bssid; } @@ -2600,8 +2637,8 @@ static void ConstructBtNullFunctionData( SetFrDs(fctrl); _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); SetDuration(pwlanhdr, 0); SetSeqNum(pwlanhdr, 0); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_dm.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_dm.c index 2224afb83615..c149fe481db5 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_dm.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_dm.c @@ -246,7 +246,7 @@ static void Init_ODM_ComInfo_8723b(PADAPTER Adapter) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - struct dm_priv *pdmpriv = &pHalData->dmpriv; + u32 SupportAbility = 0; u8 cut_ver,fab_ver; Init_ODM_ComInfo(Adapter); @@ -262,32 +262,32 @@ static void Init_ODM_ComInfo_8723b(PADAPTER Adapter) ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver); #ifdef CONFIG_DISABLE_ODM - pdmpriv->InitODMFlag = 0; + SupportAbility = 0; #else - pdmpriv->InitODMFlag = ODM_RF_CALIBRATION | - ODM_RF_TX_PWR_TRACK //| - ; - //if(pHalData->AntDivCfg) - // pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; + SupportAbility = ODM_RF_CALIBRATION | + ODM_RF_TX_PWR_TRACK + ; + /*if(pHalData->AntDivCfg) + SupportAbility |= ODM_BB_ANT_DIV;*/ #endif - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag); + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,SupportAbility); } static void Update_ODM_ComInfo_8723b(PADAPTER Adapter) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - struct dm_priv *pdmpriv = &pHalData->dmpriv; + u32 SupportAbility = 0; - pdmpriv->InitODMFlag = 0 + SupportAbility = 0 | ODM_BB_DIG | ODM_BB_RA_MASK | ODM_BB_DYNAMIC_TXPWR | ODM_BB_FA_CNT | ODM_BB_RSSI_MONITOR | ODM_BB_CCK_PD - | ODM_BB_PWR_SAVE + //| ODM_BB_PWR_SAVE | ODM_BB_CFO_TRACKING | ODM_MAC_EDCA_TURBO | ODM_RF_TX_PWR_TRACK @@ -297,16 +297,16 @@ static void Update_ODM_ComInfo_8723b(PADAPTER Adapter) ; if (rtw_odm_adaptivity_needed(Adapter) == _TRUE) - pdmpriv->InitODMFlag |= ODM_BB_ADAPTIVITY; + SupportAbility |= ODM_BB_ADAPTIVITY; #ifdef CONFIG_ANTENNA_DIVERSITY if(pHalData->AntDivCfg) - pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; + SupportAbility |= ODM_BB_ANT_DIV; #endif #if (MP_DRIVER==1) if (Adapter->registrypriv.mp_mode == 1) { - pdmpriv->InitODMFlag = 0 + SupportAbility = 0 | ODM_RF_CALIBRATION | ODM_RF_TX_PWR_TRACK ; @@ -314,10 +314,10 @@ static void Update_ODM_ComInfo_8723b(PADAPTER Adapter) #endif//(MP_DRIVER==1) #ifdef CONFIG_DISABLE_ODM - pdmpriv->InitODMFlag = 0; + SupportAbility = 0; #endif//CONFIG_DISABLE_ODM - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag); + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,SupportAbility); } void @@ -326,7 +326,6 @@ rtl8723b_InitHalDm( ) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); u8 i; @@ -335,13 +334,7 @@ rtl8723b_InitHalDm( dm_InitGPIOSetting(Adapter); #endif - pdmpriv->DM_Type = DM_Type_ByDriver; - pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; - -#ifdef CONFIG_BT_COEXIST - pdmpriv->DMFlag |= DYNAMIC_FUNC_BT; -#endif - pdmpriv->InitDMFlag = pdmpriv->DMFlag; + pHalData->DM_Type = DM_Type_ByDriver; Update_ODM_ComInfo_8723b(Adapter); @@ -350,92 +343,6 @@ rtl8723b_InitHalDm( } -static void -FindMinimumRSSI_8723b( -IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv; - - //1 1.Determine the minimum RSSI - - -#ifdef CONFIG_CONCURRENT_MODE - // FindMinimumRSSI() per-adapter - { - PADAPTER pbuddy_adapter = pAdapter->pbuddy_adapter; - PHAL_DATA_TYPE pbuddy_HalData = GET_HAL_DATA(pbuddy_adapter); - struct dm_priv *pbuddy_dmpriv = &pbuddy_HalData->dmpriv; - - if((pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0) && - (pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB != 0)) - { - - if(pdmpriv->EntryMinUndecoratedSmoothedPWDB > pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB) - pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB; - } - else - { - if(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0) - pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB; - - } - #if 0 - if((pdmpriv->UndecoratedSmoothedPWDB != (-1)) && - (pbuddy_dmpriv->UndecoratedSmoothedPWDB != (-1))) - { - - if((pdmpriv->UndecoratedSmoothedPWDB > pbuddy_dmpriv->UndecoratedSmoothedPWDB) && - (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0)) - pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB; - } - else - { - if((pdmpriv->UndecoratedSmoothedPWDB == (-1)) && (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0)) - pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB; - } - #endif - } -#endif - - if((check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) && - (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)) - { - pdmpriv->MinUndecoratedPWDBForDM = 0; - //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n")); - } - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port - { - #if 0 - if((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) - { - pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("AP Client PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM)); - } - else//for STA mode - { - pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->UndecoratedSmoothedPWDB; - //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM)); - } - #else - pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - #endif - } - else // associated entry pwdb - { - pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("AP Ext Port or disconnet PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM)); - } - - //odm_FindMinimumRSSI_Dmsp(pAdapter); - //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM); - //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM)); -} - VOID rtl8723b_HalDmWatchDog( IN PADAPTER Adapter @@ -445,7 +352,6 @@ rtl8723b_HalDmWatchDog( BOOLEAN bFwPSAwake = _TRUE; u8 hw_init_completed = _FALSE; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; #ifdef CONFIG_CONCURRENT_MODE PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter; #endif //CONFIG_CONCURRENT_MODE @@ -520,7 +426,6 @@ if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP p ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked); ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state); - //FindMinimumRSSI_8723b(Adapter); //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); #ifdef CONFIG_BT_COEXIST @@ -578,7 +483,6 @@ void rtl8723b_HalDmWatchDog_in_LPS(IN PADAPTER Adapter) u8 bLinked=_FALSE; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - struct dm_priv *pdmpriv = &pHalData->dmpriv; PDM_ODM_T pDM_Odm = &pHalData->odmpriv; pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; struct sta_priv *pstapriv = &Adapter->stapriv; @@ -616,16 +520,16 @@ void rtl8723b_HalDmWatchDog_in_LPS(IN PADAPTER Adapter) if(psta == NULL) goto skip_lps_dm; - pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; + pHalData->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; - DBG_871X("CurIGValue=%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB ); + DBG_871X("CurIGValue=%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pHalData->EntryMinUndecoratedSmoothedPWDB ); - if(pdmpriv->EntryMinUndecoratedSmoothedPWDB <=0) + if(pHalData->EntryMinUndecoratedSmoothedPWDB <=0) goto skip_lps_dm; - pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + pHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB; - pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM; + pDM_Odm->RSSI_Min = pHalData->MinUndecoratedPWDBForDM; //if(pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) if((pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) || @@ -645,9 +549,7 @@ skip_lps_dm: void rtl8723b_init_dm_priv(IN PADAPTER Adapter) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; PDM_ODM_T podmpriv = &pHalData->odmpriv; - _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv)); Init_ODM_ComInfo_8723b(Adapter); ODM_InitAllTimers(podmpriv ); } @@ -655,7 +557,6 @@ void rtl8723b_init_dm_priv(IN PADAPTER Adapter) void rtl8723b_deinit_dm_priv(IN PADAPTER Adapter) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; PDM_ODM_T podmpriv = &pHalData->odmpriv; ODM_CancelAllTimers(podmpriv); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_hal_init.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_hal_init.c index 37cb5cc5fb66..81acdcac03a6 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_hal_init.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_hal_init.c @@ -22,6 +22,7 @@ #include #include "rtw_bt_mp.h" #include "hal_com_h2c.h" +#include static VOID _FWDownloadEnable( @@ -224,7 +225,6 @@ _WriteFW( ) { // Since we need dynamic decide method of dwonload fw, so we call this function to get chip version. - // We can remove _ReadChipVersion from ReadpadapterInfo8192C later. int ret = _SUCCESS; u32 pageNums,remainSize ; u32 page, offset; @@ -1241,13 +1241,6 @@ SetFwRelatedForWoWLAN8723b( } #endif //CONFIG_WOWLAN -static void rtl8723b_free_hal_data(PADAPTER padapter) -{ -_func_enter_; - -_func_exit_; -} - //=========================================================== // Efuse related code //=========================================================== @@ -1660,11 +1653,13 @@ if(0) // Check word enable condition in the section if (!(wden & (0x01<>CHIP_VER_RTL_SHIFT; // IC version (CUT) + pHalData->VersionID.ICType = CHIP_8723B; + pHalData->VersionID.ChipType = ((value32 & RTL_ID) ? TEST_CHIP : NORMAL_CHIP); + pHalData->VersionID.RFType = RF_TYPE_1T1R ; + pHalData->VersionID.VendorType = ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : CHIP_VENDOR_TSMC); + pHalData->VersionID.CUTVersion = (value32 & CHIP_VER_RTL_MASK)>>CHIP_VER_RTL_SHIFT; // IC version (CUT) // For regulator mode. by tynli. 2011.01.14 pHalData->RegulatorMode = ((value32 & SPS_SEL) ? RT_LDO_REGULATOR : RT_SWITCHING_REGULATOR); value32 = rtw_read32(padapter, REG_GPIO_OUTSTS); - ChipVersion.ROMVer = ((value32 & RF_RL_ID) >> 20); // ROM code version. + pHalData->VersionID.ROMVer = ((value32 & RF_RL_ID) >> 20); // ROM code version. // For multi-function consideration. Added by Roger, 2010.10.06. pHalData->MultiFunc = RT_MULTI_FUNC_NONE; @@ -2864,39 +2865,27 @@ ReadChipVersion8723B( pHalData->MultiFunc |= ((value32 & BT_FUNC_EN) ? RT_MULTI_FUNC_BT : 0); pHalData->MultiFunc |= ((value32 & GPS_FUNC_EN) ? RT_MULTI_FUNC_GPS : 0); pHalData->PolarityCtl = ((value32 & WL_HWPDN_SL) ? RT_POLARITY_HIGH_ACT : RT_POLARITY_LOW_ACT); -//#if DBG -#if 1 - dump_chip_info(ChipVersion); -#endif - pHalData->VersionID = ChipVersion; + + rtw_hal_config_rftype(padapter); + /* // mark for chage to use efuse - if( IS_B_CUT(ChipVersion) || IS_C_CUT(ChipVersion)) + if( IS_B_CUT(pHalData->VersionID) || IS_C_CUT(pHalData->VersionID)) { MSG_8192C(" IS_B/C_CUT SWR up 1 level !!!!!!!!!!!!!!!!!\n"); PHY_SetMacReg(padapter, 0x14, BIT23|BIT22|BIT21|BIT20, 0x5); //MAC reg 0x14[23:20] = 4b'0101 (SWR 1.220V) - }else if ( IS_D_CUT(ChipVersion)) + }else if ( IS_D_CUT(pHalData->VersionID)) { MSG_8192C(" IS_D_CUT SKIP SWR !!!!!!!!!!!!!!!!!\n"); } */ - if (IS_1T2R(ChipVersion)) - pHalData->rf_type = RF_1T2R; - else if (IS_2T2R(ChipVersion)) - pHalData->rf_type = RF_2T2R; - else - pHalData->rf_type = RF_1T1R; - MSG_8192C("RF_Type is %x!!\n", pHalData->rf_type); +#if 1 + dump_chip_info(pHalData->VersionID); +#endif - return ChipVersion; } -static void rtl8723b_read_chip_version(PADAPTER padapter) -{ - ReadChipVersion8723B(padapter); -} - void rtl8723b_InitBeaconParameters(PADAPTER padapter) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); @@ -2933,7 +2922,7 @@ void rtl8723b_InitBeaconParameters(PADAPTER padapter) void rtl8723b_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode) { -#ifdef RTL8192CU_ADHOC_WORKAROUND_SETTING +#ifdef CONFIG_ADHOC_WORKAROUND_SETTING rtw_write8(padapter, REG_BCN_MAX_ERR, 0xFF); #else //rtw_write8(Adapter, REG_BCN_MAX_ERR, (InfraMode ? 0xFF : 0x10)); @@ -3183,7 +3172,6 @@ void UpdateHalRAMask8723B(PADAPTER padapter, u32 mac_id, u8 rssi_level) u8 shortGIrate = _FALSE; struct sta_info *psta; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -3235,7 +3223,7 @@ void UpdateHalRAMask8723B(PADAPTER padapter, u32 mac_id, u8 rssi_level) } //set correct initial date rate for each mac_id - pdmpriv->INIDATA_RATE[mac_id] = psta->init_rate; + pHalData->INIDATA_RATE[mac_id] = psta->init_rate; DBG_871X("%s(): mac_id=%d raid=0x%x bw=%d mask=0x%x init_rate=0x%x\n", __func__, mac_id, psta->raid, psta->bw_mode, mask, psta->init_rate); } @@ -3264,14 +3252,97 @@ void rtl8723b_cal_txdesc_chksum(struct tx_desc *ptxdesc) } #endif -void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc) + +// +// 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 +// Fw can tell Hw to send these packet derectly. +// Added by tynli. 2009.10.15. +// +//type1:pspoll, type2:null +void rtl8723b_fill_fake_txdesc( + PADAPTER padapter, + u8* pDesc, + u32 BufferLen, + u8 IsPsPoll, + u8 IsBTQosNull, + u8 bDataFrame) { - pHalFunc->free_hal_data = &rtl8723b_free_hal_data; + // Clear all status + _rtw_memset(pDesc, 0, TXDESC_SIZE); + + SET_TX_DESC_FIRST_SEG_8723B(pDesc, 1); //bFirstSeg; + SET_TX_DESC_LAST_SEG_8723B(pDesc, 1); //bLastSeg; + + SET_TX_DESC_OFFSET_8723B(pDesc, 0x28); // Offset = 32 + SET_TX_DESC_PKT_SIZE_8723B(pDesc, BufferLen); // Buffer size + command header + SET_TX_DESC_QUEUE_SEL_8723B(pDesc, QSLT_MGNT); // Fixed queue of Mgnt queue + + // Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw. + if (_TRUE == IsPsPoll) + { + SET_TX_DESC_NAV_USE_HDR_8723B(pDesc, 1); + } + else + { + SET_TX_DESC_HWSEQ_EN_8723B(pDesc, 1); // Hw set sequence number + SET_TX_DESC_HWSEQ_SEL_8723B(pDesc, 0); + } + + if (_TRUE ==IsBTQosNull) + { + SET_TX_DESC_BT_INT_8723B(pDesc, 1); + } + + SET_TX_DESC_USE_RATE_8723B(pDesc, 1); // use data rate which is set by Sw + SET_TX_DESC_OWN_8723B((pu1Byte)pDesc, 1); + + SET_TX_DESC_TX_RATE_8723B(pDesc, DESC8723B_RATE1M); + + // + // Encrypt the data frame if under security mode excepct null data. Suggested by CCW. + // + if (_TRUE ==bDataFrame) + { + u32 EncAlg; + + EncAlg = padapter->securitypriv.dot11PrivacyAlgrthm; + switch (EncAlg) + { + case _NO_PRIVACY_: + SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x0); + break; + case _WEP40_: + case _WEP104_: + case _TKIP_: + SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x1); + break; + case _SMS4_: + SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x2); + break; + case _AES_: + SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x3); + break; + default: + SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x0); + break; + } + } + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + // USB interface drop packet if the checksum of descriptor isn't correct. + // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.). + rtl8723b_cal_txdesc_chksum((struct tx_desc*)pDesc); +#endif +} + +void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc) +{ pHalFunc->dm_init = &rtl8723b_init_dm_priv; pHalFunc->dm_deinit = &rtl8723b_deinit_dm_priv; - pHalFunc->read_chip_version = &rtl8723b_read_chip_version; + pHalFunc->read_chip_version = read_chip_version_8723b; pHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8723B; @@ -3283,7 +3354,9 @@ void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc) pHalFunc->get_tx_power_level_handler = &PHY_GetTxPowerLevel8723B; pHalFunc->hal_dm_watchdog = &rtl8723b_HalDmWatchDog; +#ifdef CONFIG_LPS_LCLK_WD_TIMER pHalFunc->hal_dm_watchdog_in_lps = &rtl8723b_HalDmWatchDog_in_LPS; +#endif #ifdef CONFIG_C2H_PACKET_EN pHalFunc->SetHwRegHandlerWithBuf = &SetHwRegWithBuf8723B; @@ -3333,9 +3406,7 @@ void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc) pHalFunc->c2h_id_filter_ccx = c2h_id_filter_ccx_8723b; pHalFunc->fill_h2c_cmd = &FillH2CCmd8723B; -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - pHalFunc->hal_cal_txdesc_chksum = &rtl8723b_cal_txdesc_chksum; -#endif + pHalFunc->fill_fake_txdesc = &rtl8723b_fill_fake_txdesc; #ifdef CONFIG_WOWLAN pHalFunc->hal_set_wowlan_fw = &SetFwRelatedForWoWLAN8723b; #endif @@ -3387,19 +3458,14 @@ void rtl8723b_DeinitAntenna_Selection(PADAPTER padapter) void rtl8723b_init_default_value(PADAPTER padapter) { - PHAL_DATA_TYPE pHalData; - struct dm_priv *pdmpriv; + PHAL_DATA_TYPE pHalData; u8 i; - - pHalData = GET_HAL_DATA(padapter); - pdmpriv = &pHalData->dmpriv; padapter->registrypriv.wireless_mode = WIRELESS_11BG_24N; // init default value pHalData->fw_ractrl = _FALSE; - pHalData->bIQKInitialized = _FALSE; if (!adapter_to_pwrctl(padapter)->bkeepfwalive) pHalData->LastHMEBoxNum = 0; @@ -3407,15 +3473,12 @@ void rtl8723b_init_default_value(PADAPTER padapter) pHalData->macid_num = MACID_NUM_8723B; pHalData->cam_entry_num = CAM_ENTRY_NUM_8723B; - // init dm default value - pdmpriv->TM_Trigger = 0;//for IQK -// pdmpriv->binitialized = _FALSE; -// pdmpriv->prv_traffic_idx = 3; -// pdmpriv->initialize = 0; - - pdmpriv->ThermalValue_HP_index = 0; - for (i=0; iThermalValue_HP[i] = 0; + //init phydm default value + pHalData->bIQKInitialized = _FALSE; + pHalData->odmpriv.RFCalibrateInfo.TM_Trigger = 0;//for IQK + pHalData->odmpriv.RFCalibrateInfo.ThermalValue_HP_index = 0; + for(i = 0; i < HP_THERMAL_NUM; i++) + pHalData->odmpriv.RFCalibrateInfo.ThermalValue_HP[i] = 0; // init Efuse variables pHalData->EfuseUsedBytes = 0; @@ -3517,47 +3580,22 @@ n. LEDCFG 0x4C[15:0] = 0x8080 value32 |= ((u4bTmp<<8) | 0x00FF0000); rtw_write32(padapter, REG_GPIO_PIN_CTRL, value32); - if (IS_HARDWARE_TYPE_8723AU(padapter) || - IS_HARDWARE_TYPE_8723AS(padapter)) - { - // - // For RTL8723u multi-function configuration which was autoload from Efuse offset 0x0a and 0x0b, - // WLAN HW GPIO[9], GPS HW GPIO[10] and BT HW GPIO[11]. - // Added by Roger, 2010.10.07. - // - //2. Disable GPIO[8] and GPIO[12] - rtw_write16(padapter, REG_GPIO_IO_SEL_2, 0x0000); // Configure all pins as input mode. - value32 = rtw_read32(padapter, REG_GPIO_PIN_CTRL_2) & 0xFFFF001F; - u4bTmp = value32 & 0x0000001F; -// if( IS_MULTI_FUNC_CHIP(padapter) ) -// value32 |= ((u4bTmp<<8) | 0x00110000); // Set pin 8 and pin 12 to output mode. -// else - value32 |= ((u4bTmp<<8) | 0x001D0000); // Set pin 8, 10, 11 and pin 12 to output mode. - rtw_write32(padapter, REG_GPIO_PIN_CTRL_2, value32); - } - else - { - //2. Disable GPIO[10:8] - rtw_write8(padapter, REG_MAC_PINMUX_CFG, 0x00); - value16 = rtw_read16(padapter, REG_GPIO_IO_SEL) & 0xFF0F; - value8 = (u8) (value16&0x000F); - value16 |= ((value8<<4) | 0x0780); - rtw_write16(padapter, REG_GPIO_IO_SEL, value16); - } + + //2. Disable GPIO[10:8] + rtw_write8(padapter, REG_MAC_PINMUX_CFG, 0x00); + value16 = rtw_read16(padapter, REG_GPIO_IO_SEL) & 0xFF0F; + value8 = (u8) (value16&0x000F); + value16 |= ((value8<<4) | 0x0780); + rtw_write16(padapter, REG_GPIO_IO_SEL, value16); + //3. Disable LED0 & 1 - if(IS_HARDWARE_TYPE_8192DU(padapter)) - { - rtw_write16(padapter, REG_LEDCFG0, 0x8888); - } - else - { - rtw_write16(padapter, REG_LEDCFG0, 0x8080); - } + rtw_write16(padapter, REG_LEDCFG0, 0x8080); + // RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable GPIO and LED.\n")); } //end of _DisableGPIO() -void _DisableRFAFEAndResetBB8192C(PADAPTER padapter) +void _DisableRFAFEAndResetBB8723B(PADAPTER padapter) { /************************************** a. TXPAUSE 0x522[7:0] = 0xFF //Pause MAC TX queue @@ -3591,15 +3629,10 @@ e. SYS_FUNC_EN 0x02[7:0] = 0x14 //reset BB state machine void _DisableRFAFEAndResetBB(PADAPTER padapter) { -#if 0 - if (IS_HARDWARE_TYPE_8192D(padapter)) - _DisableRFAFEAndResetBB8192D(padapter); - else -#endif - _DisableRFAFEAndResetBB8192C(padapter); + _DisableRFAFEAndResetBB8723B(padapter); } -void _ResetDigitalProcedure1_92C(PADAPTER padapter, BOOLEAN bWithoutHWSM) +void _ResetDigitalProcedure1_8723B(PADAPTER padapter, BOOLEAN bWithoutHWSM) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); @@ -3704,10 +3737,7 @@ void _ResetDigitalProcedure1_92C(PADAPTER padapter, BOOLEAN bWithoutHWSM) //rtw_write16(padapter, REG_SYS_CLKR, 0x30A3); //if(!pDevice->RegUsbSS) // 2011/01/26 MH SD4 Scott suggest to fix UNC-B cut bug. - //if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) - //rtw_write16(padapter, REG_SYS_CLKR, (0x70A3|BIT6)); //modify to 0x70A3 by Scott. - //else - rtw_write16(padapter, REG_SYS_CLKR, 0x70A3); //modify to 0x70A3 by Scott. + rtw_write16(padapter, REG_SYS_CLKR, 0x70A3); //modify to 0x70A3 by Scott. rtw_write8(padapter, REG_AFE_PLL_CTRL, 0x80); rtw_write16(padapter, REG_AFE_XTAL_CTRL, 0x880F); //if(!pDevice->RegUsbSS) @@ -3724,12 +3754,7 @@ void _ResetDigitalProcedure1_92C(PADAPTER padapter, BOOLEAN bWithoutHWSM) void _ResetDigitalProcedure1(PADAPTER padapter, BOOLEAN bWithoutHWSM) { -#if 0 - if(IS_HARDWARE_TYPE_8192D(padapter)) - _ResetDigitalProcedure1_92D(padapter, bWithoutHWSM); - else -#endif - _ResetDigitalProcedure1_92C(padapter, bWithoutHWSM); + _ResetDigitalProcedure1_8723B(padapter, bWithoutHWSM); } void _ResetDigitalProcedure2(PADAPTER padapter) @@ -3742,10 +3767,7 @@ m. SYS_ISO_CTRL 0x01[7:0] = 0x83 // isolated ELDR to PON ******************************/ //rtw_write8(padapter, REG_SYS_FUNC_EN+1, 0x44); //marked by Scott. // 2011/01/26 MH SD4 Scott suggest to fix UNC-B cut bug. - //if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) - //rtw_write16(padapter, REG_SYS_CLKR, 0x70a3|BIT6); - //else - rtw_write16(padapter, REG_SYS_CLKR, 0x70a3); //modify to 0x70a3 by Scott. + rtw_write16(padapter, REG_SYS_CLKR, 0x70a3); //modify to 0x70a3 by Scott. rtw_write8(padapter, REG_SYS_ISO_CTRL+1, 0x82); //modify to 0x82 by Scott. } @@ -3778,8 +3800,6 @@ void _DisableAnalog(PADAPTER padapter, BOOLEAN bWithoutHWSM) i. APS_FSMCO 0x04[15:0] = 0x4802 // set USB suspend ******************************/ value8 = 0x23; - if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) - value8 |= BIT3; rtw_write8(padapter, REG_SPS0_CTRL, value8); @@ -3922,15 +3942,15 @@ Hal_InitPGData( PADAPTER padapter, u8 *PROMContent) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); -// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); u32 i; u16 value16; - if(_FALSE == pEEPROM->bautoload_fail_flag) + if(_FALSE == pHalData->bautoload_fail_flag) { // autoload OK. // if (IS_BOOT_FROM_EEPROM(padapter)) - if (_TRUE == pEEPROM->EepromOrEfuse) + if (_TRUE == pHalData->EepromOrEfuse) { // Read all Content from EEPROM or EFUSE. for(i = 0; i < HWSET_MAX_SIZE_8723B; i += 2) @@ -3943,7 +3963,7 @@ Hal_InitPGData( { // Read EFUSE real map to shadow. EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); - _rtw_memcpy((void*)PROMContent, (void*)pEEPROM->efuse_eeprom_data, HWSET_MAX_SIZE_8723B); + _rtw_memcpy((void*)PROMContent, (void*)pHalData->efuse_eeprom_data, HWSET_MAX_SIZE_8723B); } } else @@ -3951,9 +3971,9 @@ Hal_InitPGData( RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("AutoLoad Fail reported from CR9346!!\n")); // pHalData->AutoloadFailFlag = _TRUE; //update to default value 0xFF - if (_FALSE == pEEPROM->EepromOrEfuse) + if (_FALSE == pHalData->EepromOrEfuse) EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); - _rtw_memcpy((void*)PROMContent, (void*)pEEPROM->efuse_eeprom_data, HWSET_MAX_SIZE_8723B); + _rtw_memcpy((void*)PROMContent, (void*)pHalData->efuse_eeprom_data, HWSET_MAX_SIZE_8723B); } } @@ -3963,8 +3983,7 @@ Hal_EfuseParseIDCode( IN u8 *hwinfo ) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); -// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); u16 EEPROMId; @@ -3973,11 +3992,11 @@ Hal_EfuseParseIDCode( if (EEPROMId != RTL_EEPROM_ID) { DBG_8192C("EEPROM ID(%#x) is invalid!!\n", EEPROMId); - pEEPROM->bautoload_fail_flag = _TRUE; + pHalData->bautoload_fail_flag = _TRUE; } else { - pEEPROM->bautoload_fail_flag = _FALSE; + pHalData->bautoload_fail_flag = _FALSE; } RT_TRACE(_module_hal_init_c_, _drv_notice_, ("EEPROM ID=0x%04x\n", EEPROMId)); @@ -4102,64 +4121,36 @@ Hal_ReadPowerValueFromPROM_8723B( if(TxCount==0) { pwrInfo24G->BW40_Diff[rfPath][TxCount] = 0; - if(PROMContent[eeAddr] == 0xFF) - pwrInfo24G->BW20_Diff[rfPath][TxCount] = EEPROM_DEFAULT_24G_HT20_DIFF; - else - { - pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; - if(pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; - } + pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; + if (pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3) /*4bit sign number to 8 bit sign number*/ + pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; + + pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); + if (pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3) /*4bit sign number to 8 bit sign number*/ + pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; - if(PROMContent[eeAddr] == 0xFF) - pwrInfo24G->OFDM_Diff[rfPath][TxCount] = EEPROM_DEFAULT_24G_OFDM_DIFF; - else - { - pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); - if(pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; - } pwrInfo24G->CCK_Diff[rfPath][TxCount] = 0; eeAddr++; - } - else - { - if(PROMContent[eeAddr] == 0xFF) - pwrInfo24G->BW40_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - else - { - pwrInfo24G->BW40_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; - if(pwrInfo24G->BW40_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->BW40_Diff[rfPath][TxCount] |= 0xF0; - } - - if(PROMContent[eeAddr] == 0xFF) - pwrInfo24G->BW20_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - else - { - pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); - if(pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; - } + } else{ + pwrInfo24G->BW40_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; + if (pwrInfo24G->BW40_Diff[rfPath][TxCount] & BIT3) /*4bit sign number to 8 bit sign number*/ + pwrInfo24G->BW40_Diff[rfPath][TxCount] |= 0xF0; + + pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); + if (pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3) /*4bit sign number to 8 bit sign number*/ + pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; + eeAddr++; - - if(PROMContent[eeAddr] == 0xFF) - pwrInfo24G->OFDM_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - else - { - pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; - if(pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; - } - - if(PROMContent[eeAddr] == 0xFF) - pwrInfo24G->CCK_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - else - { - pwrInfo24G->CCK_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); - if(pwrInfo24G->CCK_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->CCK_Diff[rfPath][TxCount] |= 0xF0; - } + + pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; + if (pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3) /*4bit sign number to 8 bit sign number*/ + pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; + + + pwrInfo24G->CCK_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); + if (pwrInfo24G->CCK_Diff[rfPath][TxCount] & BIT3) /*4bit sign number to 8 bit sign number*/ + pwrInfo24G->CCK_Diff[rfPath][TxCount] |= 0xF0; + eeAddr++; } } @@ -4238,6 +4229,31 @@ Hal_EfuseParseTxPowerInfo_8723B( RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory)); } +VOID +Hal_EfuseParseBoardType_8723B( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(!AutoloadFail) + { + pHalData->InterfaceSel = (PROMContent[EEPROM_RF_BOARD_OPTION_8723B]&0xE0)>>5; + if(PROMContent[EEPROM_RF_BOARD_OPTION_8723B] == 0xFF) + pHalData->InterfaceSel = (EEPROM_DEFAULT_BOARD_OPTION&0xE0)>>5; + } + else + { + pHalData->InterfaceSel = 0; + } + RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("Board Type: 0x%2x\n", pHalData->InterfaceSel)); + +} + VOID Hal_EfuseParseBTCoexistInfo_8723B( IN PADAPTER padapter, @@ -4391,6 +4407,15 @@ Hal_EfuseParsePackageType_8723B( } DBG_871X("PackageType = 0x%X\n", pHalData->PackageType); + +#ifdef CONFIG_SDIO_HCI + /* RTL8703AS: 0x1FB[5:4] 2b'10 */ + /* RTL8723BS: 0x1FB[5:4] 2b'11 */ + if ((efuseContent & 0x30) == 0x20) { + pAdapter->registrypriv.bw_mode &= 0xF0; + DBG_871X("This is the case of 8703AS\n"); + } +#endif } @@ -4402,12 +4427,11 @@ Hal_EfuseParseVoltage_8723B( ) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); - - //_rtw_memcpy(pEEPROM->adjuseVoltageVal, &hwinfo[EEPROM_Voltage_ADDR_8723B], 1); + + //_rtw_memcpy(pHalData->adjuseVoltageVal, &hwinfo[EEPROM_Voltage_ADDR_8723B], 1); DBG_871X("%s hwinfo[EEPROM_Voltage_ADDR_8723B] =%02x \n",__func__, hwinfo[EEPROM_Voltage_ADDR_8723B]); - pEEPROM->adjuseVoltageVal = (hwinfo[EEPROM_Voltage_ADDR_8723B] & 0xf0) >> 4 ; - DBG_871X("%s pEEPROM->adjuseVoltageVal =%x \n",__func__,pEEPROM->adjuseVoltageVal); + pHalData->adjuseVoltageVal = (hwinfo[EEPROM_Voltage_ADDR_8723B] & 0xf0) >> 4 ; + DBG_871X("%s pHalData->adjuseVoltageVal =%x \n",__func__,pHalData->adjuseVoltageVal); } VOID @@ -4536,7 +4560,7 @@ Hal_EfuseParseThermalMeter_8723B( if ((pHalData->EEPROMThermalMeter == 0xff) || (_TRUE == AutoLoadFail)) { - pHalData->bAPKThermalMeterIgnore = _TRUE; + pHalData->odmpriv.RFCalibrateInfo.bAPKThermalMeterIgnore = _TRUE; pHalData->EEPROMThermalMeter = EEPROM_Default_ThermalMeter_8723B; } @@ -4550,22 +4574,23 @@ void Hal_ReadRFGainOffset( IN u8* PROMContent, IN BOOLEAN AutoloadFail) { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); // // BB_RF Gain Offset from EEPROM // if(!AutoloadFail ){ - Adapter->eeprompriv.EEPROMRFGainOffset =PROMContent[EEPROM_RF_GAIN_OFFSET]; + pHalData->EEPROMRFGainOffset =PROMContent[EEPROM_RF_GAIN_OFFSET]; DBG_871X("AutoloadFail =%x,\n", AutoloadFail); - Adapter->eeprompriv.EEPROMRFGainVal=EFUSE_Read1Byte(Adapter, EEPROM_RF_GAIN_VAL); - DBG_871X("Adapter->eeprompriv.EEPROMRFGainVal=%x\n", Adapter->eeprompriv.EEPROMRFGainVal); + pHalData->EEPROMRFGainVal=EFUSE_Read1Byte(Adapter, EEPROM_RF_GAIN_VAL); + DBG_871X("pHalData->EEPROMRFGainVal=%x\n", pHalData->EEPROMRFGainVal); } else{ - Adapter->eeprompriv.EEPROMRFGainOffset = 0; - Adapter->eeprompriv.EEPROMRFGainVal=0xFF; + pHalData->EEPROMRFGainOffset = 0; + pHalData->EEPROMRFGainVal=0xFF; DBG_871X("else AutoloadFail =%x,\n", AutoloadFail); } - DBG_871X("EEPRORFGainOffset = 0x%02x\n", Adapter->eeprompriv.EEPROMRFGainOffset); + DBG_871X("EEPRORFGainOffset = 0x%02x\n", pHalData->EEPROMRFGainOffset); } #endif //CONFIG_RF_GAIN_OFFSET @@ -4755,8 +4780,7 @@ static void rtl8723b_fill_default_txdesc( u8 *pbuf) { PADAPTER padapter; - HAL_DATA_TYPE *pHalData; - struct dm_priv *pdmpriv; + HAL_DATA_TYPE *pHalData; struct mlme_ext_priv *pmlmeext; struct mlme_ext_info *pmlmeinfo; struct pkt_attrib *pattrib; @@ -4765,8 +4789,7 @@ static void rtl8723b_fill_default_txdesc( _rtw_memset(pbuf, 0, TXDESC_SIZE); padapter = pxmitframe->padapter; - pHalData = GET_HAL_DATA(padapter); - pdmpriv = &pHalData->dmpriv; + pHalData = GET_HAL_DATA(padapter); pmlmeext = &padapter->mlmeextpriv; pmlmeinfo = &(pmlmeext->mlmext_info); @@ -4816,11 +4839,11 @@ static void rtl8723b_fill_default_txdesc( if (pHalData->fw_ractrl == _FALSE) { SET_TX_DESC_USE_RATE_8723B(pbuf, 1); - if (pHalData->dmpriv.INIDATA_RATE[pattrib->mac_id] & BIT(7)) { + if (pHalData->INIDATA_RATE[pattrib->mac_id] & BIT(7)) { SET_TX_DESC_DATA_SHORT_8723B(pbuf, 1); } - SET_TX_DESC_TX_RATE_8723B(pbuf, pHalData->dmpriv.INIDATA_RATE[pattrib->mac_id] & 0x7F); + SET_TX_DESC_TX_RATE_8723B(pbuf, pHalData->INIDATA_RATE[pattrib->mac_id] & 0x7F); } // modify data rate by iwpriv @@ -4866,6 +4889,19 @@ static void rtl8723b_fill_default_txdesc( #if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) SET_TX_DESC_USB_TXAGG_NUM_8723B(pbuf, pxmitframe->agg_num); +#endif + +#ifdef CONFIG_TDLS +#ifdef CONFIG_XMIT_ACK + /* CCX-TXRPT ack for xmit mgmt frames. */ + if (pxmitframe->ack_report) { + #ifdef DBG_CCX + DBG_8192C("%s set spe_rpt\n", __func__); + #endif + SET_TX_DESC_SPE_RPT_8723B(pbuf, 1); + SET_TX_DESC_SW_DEFINE_8723B(pbuf, (u8)(GET_PRIMARY_ADAPTER(padapter)->xmitpriv.seq_no)); + } +#endif /* CONFIG_XMIT_ACK */ #endif } else if (pxmitframe->frame_tag == MGNT_FRAMETAG) @@ -4981,6 +5017,7 @@ static void rtl8723b_fill_default_txdesc( */ void rtl8723b_update_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf) { + PADAPTER padapter = pxmitframe->padapter; rtl8723b_fill_default_txdesc(pxmitframe, pbuf); #ifdef CONFIG_ANTENNA_DIVERSITY @@ -4992,90 +5029,6 @@ void rtl8723b_update_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf) #endif } -// -// 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 -// Fw can tell Hw to send these packet derectly. -// Added by tynli. 2009.10.15. -// -//type1:pspoll, type2:null -void rtl8723b_fill_fake_txdesc( - PADAPTER padapter, - u8* pDesc, - u32 BufferLen, - u8 IsPsPoll, - u8 IsBTQosNull, - u8 bDataFrame) -{ - // Clear all status - _rtw_memset(pDesc, 0, TXDESC_SIZE); - - SET_TX_DESC_FIRST_SEG_8723B(pDesc, 1); //bFirstSeg; - SET_TX_DESC_LAST_SEG_8723B(pDesc, 1); //bLastSeg; - - SET_TX_DESC_OFFSET_8723B(pDesc, 0x28); // Offset = 32 - - SET_TX_DESC_PKT_SIZE_8723B(pDesc, BufferLen); // Buffer size + command header - SET_TX_DESC_QUEUE_SEL_8723B(pDesc, QSLT_MGNT); // Fixed queue of Mgnt queue - - // Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw. - if (_TRUE == IsPsPoll) - { - SET_TX_DESC_NAV_USE_HDR_8723B(pDesc, 1); - } - else - { - SET_TX_DESC_HWSEQ_EN_8723B(pDesc, 1); // Hw set sequence number - SET_TX_DESC_HWSEQ_SEL_8723B(pDesc, 0); - } - - if (_TRUE ==IsBTQosNull) - { - SET_TX_DESC_BT_INT_8723B(pDesc, 1); - } - - SET_TX_DESC_USE_RATE_8723B(pDesc, 1); // use data rate which is set by Sw - SET_TX_DESC_OWN_8723B((pu1Byte)pDesc, 1); - - SET_TX_DESC_TX_RATE_8723B(pDesc, DESC8723B_RATE1M); - - // - // Encrypt the data frame if under security mode excepct null data. Suggested by CCW. - // - if (_TRUE ==bDataFrame) - { - u32 EncAlg; - - EncAlg = padapter->securitypriv.dot11PrivacyAlgrthm; - switch (EncAlg) - { - case _NO_PRIVACY_: - SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x0); - break; - case _WEP40_: - case _WEP104_: - case _TKIP_: - SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x1); - break; - case _SMS4_: - SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x2); - break; - case _AES_: - SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x3); - break; - default: - SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x0); - break; - } - } - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - // USB interface drop packet if the checksum of descriptor isn't correct. - // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.). - rtl8723b_cal_txdesc_chksum((struct tx_desc*)pDesc); -#endif -} - #ifdef CONFIG_TSF_RESET_OFFLOAD int reset_tsf(PADAPTER Adapter, u8 reset_port ) { @@ -5097,11 +5050,69 @@ int reset_tsf(PADAPTER Adapter, u8 reset_port ) } #endif // CONFIG_TSF_RESET_OFFLOAD +static void hw_var_set_monitor(PADAPTER Adapter, u8 variable, u8 *val) +{ + u32 value_rcr, rcr_bits; + u16 value_rxfltmap2; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + if (*((u8 *)val) == _HW_STATE_MONITOR_) { + + /* Leave IPS */ + rtw_pm_set_ips(Adapter, IPS_NONE); + LeaveAllPowerSaveMode(Adapter); + + /* Receive all type */ + rcr_bits = RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_APWRMGT | RCR_ADF | RCR_ACF | RCR_AMF | RCR_APP_PHYST_RXFF; + + /* Append FCS */ + rcr_bits |= RCR_APPFCS; + + #if 0 + /* + CRC and ICV packet will drop in recvbuf2recvframe() + We no turn on it. + */ + rcr_bits |= (RCR_ACRC32 | RCR_AICV); + #endif + + /* Receive all data frames */ + value_rxfltmap2 = 0xFFFF; + + value_rcr = rcr_bits; + rtw_write32(Adapter, REG_RCR, value_rcr); + + rtw_write16(Adapter, REG_RXFLTMAP2, value_rxfltmap2); + + #if 0 + /* tx pause */ + rtw_write8(padapter, REG_TXPAUSE, 0xFF); + #endif + } else { + /* do nothing */ + } + +} + static void hw_var_set_opmode(PADAPTER padapter, u8 variable, u8* val) { u8 val8; u8 mode = *((u8 *)val); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + /* reset RCR */ + rtw_write32(padapter, REG_RCR, pHalData->ReceiveConfig); + + if (mode == _HW_STATE_MONITOR_) { + /* set net_type */ + Set_MSR(padapter, _HW_STATE_NOLINK_); + + hw_var_set_monitor(padapter, variable, val); + return; + } + #ifdef CONFIG_CONCURRENT_MODE if (padapter->iface_type == IFACE_PORT1) { @@ -5608,7 +5619,7 @@ static void hw_var_set_mlme_sitesurvey(PADAPTER padapter, u8 variable, u8* val) #ifdef CONFIG_FIND_BEST_CHANNEL rcr_clear_bit = (RCR_CBSSID_BCN | RCR_CBSSID_DATA); - // Recieve all data frames + /* Receive all data frames */ value_rxfltmap2 = 0xFFFF; #else // CONFIG_FIND_BEST_CHANNEL @@ -5710,14 +5721,11 @@ static void hw_var_set_mlme_join(PADAPTER padapter, u8 variable, u8 *val) u8 type; PHAL_DATA_TYPE pHalData; struct mlme_priv *pmlmepriv; - EEPROM_EFUSE_PRIV *pEEPROM; - RetryLimit = 0x30; type = *(u8*)val; pHalData = GET_HAL_DATA(padapter); pmlmepriv = &padapter->mlmepriv; - pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); #ifdef CONFIG_CONCURRENT_MODE if (type == 0) @@ -5747,7 +5755,7 @@ static void hw_var_set_mlme_join(PADAPTER padapter, u8 variable, u8 *val) if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) { - RetryLimit = (pEEPROM->CustomerID == RT_CID_CCX) ? 7 : 48; + RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48; } else // Ad-hoc Mode { @@ -5821,7 +5829,7 @@ static void hw_var_set_mlme_join(PADAPTER padapter, u8 variable, u8 *val) if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) { - RetryLimit = (pEEPROM->CustomerID == RT_CID_CCX) ? 7 : 48; + RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48; } else // Ad-hoc Mode { @@ -5878,70 +5886,6 @@ void CCX_FwC2HTxRpt_8723b(PADAPTER padapter, u8 *pdata, u8 len) #endif } -#ifdef CONFIG_FW_C2H_DEBUG -/* - * C2H RX package original is 128. - * If enable CONFIG_FW_C2H_DEBUG, it should increase to 256. - * C2H FW debug message: - * without aggregate: - * {C2H CmdID, Seq, SubID, Len, Content[0~n]} - * Content[0~n] = { 'a' , 'b' , 'c' ,..., 'z' , '\n'} - * - * with aggregate: - * {C2H CmdID, Seq, SubID, Len, Content[0~n]} - * Content[0~n] = { 'a' , 'b' , 'c' ,..., 'z', '\n' , Extend C2H pkt 2...} - * Extend C2H pkt 2 = {C2H CmdID, Seq, SubID, Len, Content = { 'a' , 'b' , 'c' ,..., 'z' , '\n'}} - * - * Author: Isaac - */ -void Debug_FwC2H_8723b(PADAPTER padapter, u8 *pdata, u8 len) -{ - int i = 0; - int cnt = 0, total_length = 0; - u8 buf[128]={0}; - u8 more_data = _FALSE; - u8 *nextdata = NULL; - u8 test = 0; - - u8 data_len; - u8 seq_no; - - nextdata = pdata; -#if 0 - for (i = 0 ; i < len ; i++) { - printk("%02x ", pdata[i]); - if ((i + 1)%8 == 0) - printk("\n"); - } - printk("\n"); -#endif - do { - data_len = *(nextdata + 1); - seq_no = *(nextdata + 2); - - for (i = 0 ; i < data_len - 2 ; i++) { - cnt += sprintf((buf+cnt), "%c", nextdata[3 + i]); - - if (nextdata[3 + i] == 0x0a && nextdata[4 + i] == 0xff) { - more_data = _TRUE; - } else if (nextdata[3 + i] == 0x0a && nextdata[4 + i] != 0xff) { - more_data = _FALSE; - } - } - - DBG_871X("[RTKFW, SEQ=%d]: %s", seq_no, buf); - data_len += 3; - total_length += data_len; - - if (more_data == _TRUE) { - _rtw_memset(buf, '\0', 128); - cnt = 0; - nextdata = (pdata + total_length); - } - } while (more_data == _TRUE); -} -#endif //CONFIG_FW_C2H_DEBUG - s32 c2h_id_filter_ccx_8723b(u8 *buf) { struct c2h_evt_hdr_88xx *c2h_evt = (struct c2h_evt_hdr_88xx *)buf; @@ -6134,7 +6078,7 @@ static void process_c2h_event(PADAPTER padapter, PC2H_EVT_HDR pC2hEvent, u8 *c2h #ifdef CONFIG_FW_C2H_DEBUG case C2H_8723B_FW_DEBUG: - Debug_FwC2H_8723b(padapter, c2hBuf, pC2hEvent->CmdLen); + Debug_FwC2H(padapter, c2hBuf, pC2hEvent->CmdLen); break; #endif // CONFIG_FW_C2H_DEBUG @@ -6605,7 +6549,7 @@ _func_enter_; // 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))) + if (psmode != PS_MODE_ACTIVE) { ODM_RF_Saving(&pHalData->odmpriv, _TRUE); } @@ -6635,22 +6579,6 @@ _func_enter_; case HW_VAR_TDLS_WRCR: rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)&(~RCR_CBSSID_DATA )); break; - case HW_VAR_TDLS_INIT_CH_SEN: - { - rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)&(~ RCR_CBSSID_DATA )&(~RCR_CBSSID_BCN )); - rtw_write16(padapter, REG_RXFLTMAP2,0xffff); - - //disable update TSF - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|DIS_TSF_UDT); - } - break; - case HW_VAR_TDLS_DONE_CH_SEN: - { - //enable update TSF - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~ DIS_TSF_UDT)); - rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|(RCR_CBSSID_BCN )); - } - break; case HW_VAR_TDLS_RS_RCR: rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|(RCR_CBSSID_DATA)); break; @@ -6934,7 +6862,23 @@ _func_enter_; rtw_write32(padapter, reg_macid_sleep, val32); } break; - +#ifdef CONFIG_GPIO_WAKEUP + case HW_SET_GPIO_WL_CTRL: + { + u8 enable = *val; + u8 value = rtw_read8(padapter, 0x4e); + if (enable && (value & BIT(6))) { + value &= ~BIT(6); + rtw_write8(padapter, 0x4e, value); + } else if (enable == _FALSE){ + value |= BIT(6); + rtw_write8(padapter, 0x4e, value); + } + DBG_871X("%s: set WL control, 0x4E=0x%02X\n", + __func__, rtw_read8(padapter, 0x4e)); + } + break; +#endif default: SetHwReg(padapter, variable, val); break; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_mp.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_mp.c index 80b3eea6297e..17cb14ace219 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_mp.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_mp.c @@ -129,7 +129,7 @@ void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter) s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); if (!netif_running(padapter->pnetdev)) { @@ -141,11 +141,10 @@ s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable) RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: not in MP mode!\n")); return _FAIL; } - - if (enable) - pdmpriv->TxPowerTrackControl = _TRUE; + if (enable) + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE; else - pdmpriv->TxPowerTrackControl = _FALSE; + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl= _FALSE; return _SUCCESS; } @@ -153,18 +152,18 @@ s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable) void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - *enable = pdmpriv->TxPowerTrackControl; + *enable = pDM_Odm->RFCalibrateInfo.TxPowerTrackControl; } + static void Hal_disable_dm(PADAPTER padapter) { u8 v8; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); //3 1. disable firmware dynamic mechanism // disable Power Training, Rate Adaptive @@ -173,14 +172,11 @@ static void Hal_disable_dm(PADAPTER padapter) rtw_write8(padapter, REG_BCN_CTRL, v8); //3 2. disable driver dynamic mechanism - // disable Dynamic Initial Gain - // disable High Power - // disable Power Tracking Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); // enable APK, LCK and IQK but disable power tracking - pdmpriv->TxPowerTrackControl = _FALSE; - Switch_DM_Func(padapter, DYNAMIC_RF_TX_PWR_TRACK , _TRUE); + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE; + Switch_DM_Func(padapter, ODM_RF_CALIBRATION , _TRUE); } void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) @@ -273,7 +269,9 @@ void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - +#if 1 + return; +#else if (!IS_92C_SERIAL(pHalData->VersionID)) return; #if 0 @@ -371,6 +369,7 @@ void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); #endif +#endif } /*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ @@ -391,6 +390,7 @@ void Hal_SetChannel(PADAPTER pAdapter) u8 eRFPath; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); struct mp_priv *pmp = &pAdapter->mppriv; u8 channel = pmp->channel; u8 bandwidth = pmp->bandwidth; @@ -400,22 +400,19 @@ void Hal_SetChannel(PADAPTER pAdapter) // set RF channel register for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) { - if(IS_HARDWARE_TYPE_8192D(pAdapter)) - _write_rfreg(pAdapter, (RF_PATH)eRFPath, rRfChannel, 0xFF, channel); - else - _write_rfreg(pAdapter, eRFPath, rRfChannel, 0x3FF, channel); + _write_rfreg(pAdapter, eRFPath, rRfChannel, 0x3FF, channel); } Hal_mpt_SwitchRfSetting(pAdapter); SelectChannel(pAdapter, channel); - if (pHalData->CurrentChannel == 14 && !pHalData->dmpriv.bCCKinCH14) { - pHalData->dmpriv.bCCKinCH14 = _TRUE; - Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); + if (pHalData->CurrentChannel == 14 && !pDM_Odm->RFCalibrateInfo.bCCKinCH14) { + pDM_Odm->RFCalibrateInfo.bCCKinCH14 = _TRUE; + Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14); } - else if (pHalData->CurrentChannel != 14 && pHalData->dmpriv.bCCKinCH14) { - pHalData->dmpriv.bCCKinCH14 = _FALSE; - Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); + else if (pHalData->CurrentChannel != 14 && pDM_Odm->RFCalibrateInfo.bCCKinCH14) { + pDM_Odm->RFCalibrateInfo.bCCKinCH14 = _FALSE; + Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14); } #endif @@ -669,8 +666,7 @@ void Hal_SetDataRate(PADAPTER pAdapter) DataRate=MptToMgntRate(pAdapter->mppriv.rateidx); - if(!IS_HARDWARE_TYPE_8723A(pAdapter)) - Hal_mpt_SwitchRfSetting(pAdapter); + Hal_mpt_SwitchRfSetting(pAdapter); if (IS_CCK_RATE(DataRate)) { if (pMptCtx->MptRfPath == ODM_RF_PATH_A) // S1 @@ -900,7 +896,6 @@ void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); - BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); static u4Byte reg58 = 0x0; static u4Byte regRF0x0 = 0x0; static u4Byte reg0xCB0 = 0x0; @@ -1169,13 +1164,6 @@ void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart) write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); -#ifdef CONFIG_RTL8192C - // Patch for CCK 11M waveform - if (cckrate == MPT_RATE_1M) - write_bbreg(pAdapter, 0xA71, BIT(6), bDisable); - else - write_bbreg(pAdapter, 0xA71, BIT(6), bEnable); -#endif } else { diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_phycfg.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_phycfg.c index 137270e00dad..d50f72435dcd 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_phycfg.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_phycfg.c @@ -498,10 +498,6 @@ s32 PHY_MACConfig8723B(PADAPTER Adapter) #endif//CONFIG_EMBEDDED_FWIMG } -#ifdef CONFIG_GPIO_WAKEUP - rtw_clear_hostwakeupgpio(Adapter); -#endif // CONFIG_GPIO_WAKEUP - return rtStatus; } @@ -573,41 +569,41 @@ phy_ConfigBBWithMpHeaderFile( IN u1Byte ConfigType) { int i; - u32* Rtl8192CPHY_REGArray_Table_MP; + u32* Rtl8723BPHY_REGArray_Table_MP; u16 PHY_REGArrayMPLen; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); PHY_REGArrayMPLen = Rtl8723B_PHY_REG_Array_MPLength; - Rtl8192CPHY_REGArray_Table_MP = (u32*)Rtl8723B_PHY_REG_Array_MP; + Rtl8723BPHY_REGArray_Table_MP = (u32*)Rtl8723B_PHY_REG_Array_MP; if(ConfigType == BaseBand_Config_PHY_REG) { for(i=0;i -static void process_rssi(_adapter *padapter,union recv_frame *prframe) -{ - u32 last_rssi, tmp_val; - struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - struct signal_stat * signal_stat = &padapter->recvpriv.signal_strength_data; -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - - //DBG_8192C("process_rssi=> pattrib->rssil(%d) signal_strength(%d)\n ",pattrib->RecvSignalPower,pattrib->signal_strength); - //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon) - { - - #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - if(signal_stat->update_req) { - signal_stat->total_num = 0; - signal_stat->total_val = 0; - signal_stat->update_req = 0; - } - - signal_stat->total_num++; - signal_stat->total_val += pattrib->phy_info.SignalStrength; - signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; - #else //CONFIG_NEW_SIGNAL_STAT_PROCESS - - //Adapter->RxStats.RssiCalculateCnt++; //For antenna Test - if(padapter->recvpriv.signal_strength_data.total_num++ >= PHY_RSSI_SLID_WIN_MAX) - { - padapter->recvpriv.signal_strength_data.total_num = PHY_RSSI_SLID_WIN_MAX; - last_rssi = padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index]; - padapter->recvpriv.signal_strength_data.total_val -= last_rssi; - } - padapter->recvpriv.signal_strength_data.total_val +=pattrib->phy_info.SignalStrength; - - padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index++] = pattrib->phy_info.SignalStrength; - if(padapter->recvpriv.signal_strength_data.index >= PHY_RSSI_SLID_WIN_MAX) - padapter->recvpriv.signal_strength_data.index = 0; - - - tmp_val = padapter->recvpriv.signal_strength_data.total_val/padapter->recvpriv.signal_strength_data.total_num; - - if(padapter->recvpriv.is_signal_dbg) { - padapter->recvpriv.signal_strength= 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)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)); - #endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - } - -}// Process_UI_RSSI_8192C - -static void process_link_qual(_adapter *padapter,union recv_frame *prframe) -{ - u32 last_evm=0, tmpVal; - struct rx_pkt_attrib *pattrib; -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - struct signal_stat * signal_stat; -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - - if(prframe == NULL || padapter==NULL){ - return; - } - - pattrib = &prframe->u.hdr.attrib; -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - signal_stat = &padapter->recvpriv.signal_qual_data; -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - - //DBG_8192C("process_link_qual=> pattrib->signal_qual(%d)\n ",pattrib->signal_qual); - -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - if(signal_stat->update_req) { - signal_stat->total_num = 0; - signal_stat->total_val = 0; - signal_stat->update_req = 0; - } - - signal_stat->total_num++; - signal_stat->total_val += pattrib->phy_info.SignalQuality; - signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; - -#else //CONFIG_NEW_SIGNAL_STAT_PROCESS - if(pattrib->phy_info.SignalQuality != 0) - { - // - // 1. Record the general EVM to the sliding window. - // - if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX) - { - padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX; - last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index]; - padapter->recvpriv.signal_qual_data.total_val -= last_evm; - } - padapter->recvpriv.signal_qual_data.total_val += pattrib->phy_info.SignalQuality; - - padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = pattrib->phy_info.SignalQuality; - if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) - padapter->recvpriv.signal_qual_data.index = 0; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, pattrib->phy_info.SignalQuality)); - - // <1> Showed on UI for user, in percentage. - tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num; - padapter->recvpriv.signal_qual=(u8)tmpVal; - - } - else - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" pattrib->signal_qual =%d\n", pattrib->phy_info.SignalQuality)); - } -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - -}// Process_UiLinkQuality8192S - -static void process_phy_info(_adapter *padapter, void *prframe) -{ - union recv_frame *precvframe = (union recv_frame *)prframe; - // - // Check RSSI - // - process_rssi(padapter, precvframe); - // - // Check PWDB. - // - //process_PWDB(padapter, precvframe); - - //UpdateRxSignalStatistics8192C(Adapter, pRfd); - // - // Check EVM - // - process_link_qual(padapter, precvframe); - #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA - rtw_store_phy_info( padapter,prframe); - #endif - -} - -/* - * Notice: - * Before calling this function, - * precvframe->u.hdr.rx_data should be ready! - */ -void rtl8723b_query_rx_phy_status(union recv_frame *precvframe, struct phy_stat *pphy_status) -{ - PADAPTER padapter = precvframe->u.hdr.adapter; - struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - PODM_PHY_INFO_T pPHYInfo = (PODM_PHY_INFO_T)(&pattrib->phy_info); - - u8 *wlanhdr; - ODM_PACKET_INFO_T pkt_info; - u8 *sa = NULL; - //_irqL irqL; - struct sta_priv *pstapriv; - struct sta_info *psta; - - - pkt_info.bPacketMatchBSSID =_FALSE; - pkt_info.bPacketToSelf = _FALSE; - pkt_info.bPacketBeacon = _FALSE; - - wlanhdr = get_recvframe_data(precvframe); - - pkt_info.bPacketMatchBSSID = ((!IsFrameTypeCtrl(wlanhdr)) && - !pattrib->icv_err && !pattrib->crc_err && - _rtw_memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN)); - - pkt_info.bToSelf = ((!pattrib->icv_err) && (!pattrib->crc_err)) && (_rtw_memcmp(get_ra(wlanhdr), myid(&padapter->eeprompriv), ETH_ALEN)); - - pkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID && (_rtw_memcmp(get_ra(wlanhdr), myid(&padapter->eeprompriv), ETH_ALEN)); - - pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && (GetFrameSubType(wlanhdr) == WIFI_BEACON); -/* - if(pkt_info.bPacketBeacon){ - if(check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE){ - sa = padapter->mlmepriv.cur_network.network.MacAddress; - #if 0 - { - DBG_871X("==> rx beacon from AP[%02x:%02x:%02x:%02x:%02x:%02x]\n", - sa[0],sa[1],sa[2],sa[3],sa[4],sa[5]); - } - #endif - } - //to do Ad-hoc - } - else{ - sa = get_sa(wlanhdr); - } -*/ - sa = get_ta(wlanhdr); - - pkt_info.StationID = 0xFF; - - pstapriv = &padapter->stapriv; - psta = rtw_get_stainfo(pstapriv, sa); - if (psta) - pkt_info.StationID = psta->mac_id; - pkt_info.DataRate = pattrib->data_rate; - - ODM_PhyStatusQuery(&pHalData->odmpriv, pPHYInfo, (u8*)pphy_status, &pkt_info); - if(psta) - psta->rssi = pattrib->phy_info.RecvSignalPower; - - precvframe->u.hdr.psta = NULL; - if (pkt_info.bPacketMatchBSSID && - (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)) { - if (psta) { - precvframe->u.hdr.psta = psta; - process_phy_info(padapter, precvframe); - } - } else if (pkt_info.bPacketToSelf || pkt_info.bPacketBeacon) { - if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) - if (psta) - precvframe->u.hdr.psta = psta; - process_phy_info(padapter, precvframe); - } -} - void rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc) { struct rx_pkt_attrib *pattrib; @@ -276,6 +55,15 @@ void rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc) // Offset 12 pattrib->data_rate = (u8)GET_RX_STATUS_DESC_RX_RATE_8723B(pdesc); + + /* Offset 16 */ + pattrib->sgi = (u8)GET_RX_STATUS_DESC_SPLCP_8723B(pdesc); + pattrib->ldpc = (u8)GET_RX_STATUS_DESC_LDPC_8723B(pdesc); + pattrib->stbc = (u8)GET_RX_STATUS_DESC_STBC_8723B(pdesc); + pattrib->bw = (u8)GET_RX_STATUS_DESC_BW_8723B(pdesc); + + /* Offset 20 */ + /* pattrib->tsfl=(u8)GET_RX_STATUS_DESC_TSFL_8723B(pdesc); */ } } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_sreset.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_sreset.c index 2c1ee809da36..8843c52e3f14 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_sreset.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_sreset.c @@ -56,7 +56,7 @@ void rtl8723b_sreset_xmit_status_check(_adapter *padapter) else{ diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time); if (diff_time > 4000) { - u32 ability; + u32 ability = 0; //padapter->Wifi_Error_Status = WIFI_TX_HANG; rtw_hal_get_hwreg(padapter, HW_VAR_DM_FLAG, (u8*)&ability); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_recv.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_recv.c index c0e893db6792..518f66ce1028 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_recv.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_recv.c @@ -23,190 +23,11 @@ int rtl8723bu_init_recv_priv(_adapter *padapter) { - struct recv_priv *precvpriv = &padapter->recvpriv; - int i, res = _SUCCESS; - struct recv_buf *precvbuf; - -#ifdef CONFIG_RECV_THREAD_MODE - _rtw_init_sema(&precvpriv->recv_sema, 0);//will be removed - _rtw_init_sema(&precvpriv->terminate_recvthread_sema, 0);//will be removed -#endif - -#ifdef PLATFORM_LINUX - tasklet_init(&precvpriv->recv_tasklet, - (void(*)(unsigned long))usb_recv_tasklet, - (unsigned long)padapter); -#endif - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE -#ifdef PLATFORM_LINUX - precvpriv->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); - if(precvpriv->int_in_urb == NULL){ - DBG_8192C("alloc_urb for interrupt in endpoint fail !!!!\n"); - } -#endif - precvpriv->int_in_buf = rtw_zmalloc(USB_INTR_CONTENT_LENGTH); - if(precvpriv->int_in_buf == NULL){ - DBG_8192C("alloc_mem for interrupt in endpoint fail !!!!\n"); - } -#endif - - //init recv_buf - _rtw_init_queue(&precvpriv->free_recv_buf_queue); - - _rtw_init_queue(&precvpriv->recv_buf_pending_queue); - - precvpriv->pallocated_recv_buf = rtw_zmalloc(NR_RECVBUFF *sizeof(struct recv_buf) + 4); - if(precvpriv->pallocated_recv_buf==NULL){ - res= _FAIL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("alloc recv_buf fail!\n")); - goto exit; - } - _rtw_memset(precvpriv->pallocated_recv_buf, 0, NR_RECVBUFF *sizeof(struct recv_buf) + 4); - - precvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_recv_buf), 4); - //precvpriv->precv_buf = precvpriv->pallocated_recv_buf + 4 - - // ((uint) (precvpriv->pallocated_recv_buf) &(4-1)); - - - precvbuf = (struct recv_buf*)precvpriv->precv_buf; - - for(i=0; i < NR_RECVBUFF ; i++) - { - _rtw_init_listhead(&precvbuf->list); - - _rtw_spinlock_init(&precvbuf->recvbuf_lock); - - precvbuf->alloc_sz = MAX_RECVBUF_SZ; - - res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf); - if(res==_FAIL) - break; - - precvbuf->ref_cnt = 0; - precvbuf->adapter =padapter; - - - //rtw_list_insert_tail(&precvbuf->list, &(precvpriv->free_recv_buf_queue.queue)); - - precvbuf++; - - } - - precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF; - -#ifdef PLATFORM_LINUX - - skb_queue_head_init(&precvpriv->rx_skb_queue); - -#ifdef CONFIG_PREALLOC_RECV_SKB - { - int i; - SIZE_PTR tmpaddr=0; - SIZE_PTR alignment=0; - struct sk_buff *pskb=NULL; - - skb_queue_head_init(&precvpriv->free_recv_skb_queue); - - for(i=0; idev = padapter->pnetdev; - -#ifndef CONFIG_PREALLOC_RX_SKB_BUFFER - tmpaddr = (SIZE_PTR)pskb->data; - alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); - skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment)); -#endif //! - - skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); - } - - pskb=NULL; - - } - } -#endif - -#endif - -exit: - - return res; - + return usb_init_recv_priv(padapter, USB_INTR_CONTENT_LENGTH); } -void rtl8723bu_free_recv_priv (_adapter *padapter) +void rtl8723bu_free_recv_priv(_adapter *padapter) { - int i; - struct recv_buf *precvbuf; - struct recv_priv *precvpriv = &padapter->recvpriv; - - precvbuf = (struct recv_buf *)precvpriv->precv_buf; - - for(i=0; i < NR_RECVBUFF ; i++) - { - rtw_os_recvbuf_resource_free(padapter, precvbuf); - precvbuf++; - } - - if(precvpriv->pallocated_recv_buf) - rtw_mfree(precvpriv->pallocated_recv_buf, NR_RECVBUFF *sizeof(struct recv_buf) + 4); - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE -#ifdef PLATFORM_LINUX - if(precvpriv->int_in_urb) - { - usb_free_urb(precvpriv->int_in_urb); - } -#endif - if(precvpriv->int_in_buf) - rtw_mfree(precvpriv->int_in_buf, USB_INTR_CONTENT_LENGTH); -#endif - -#ifdef PLATFORM_LINUX - - if (skb_queue_len(&precvpriv->rx_skb_queue)) { - DBG_8192C(KERN_WARNING "rx_skb_queue not empty\n"); - } - - rtw_skb_queue_purge(&precvpriv->rx_skb_queue); - -#ifdef CONFIG_PREALLOC_RECV_SKB - - if (skb_queue_len(&precvpriv->free_recv_skb_queue)) { - DBG_8192C(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue)); - } - -#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER - { - int i=0; - struct sk_buff *skb; - - while ((skb = skb_dequeue(&precvpriv->free_recv_skb_queue)) != NULL) - { - if(ifree_recv_skb_queue); -#endif //CONFIG_PREALLOC_RX_SKB_BUFFER - -#endif - -#endif + usb_free_recv_priv(padapter, USB_INTR_CONTENT_LENGTH); } diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_xmit.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_xmit.c index 0540a38f0109..e811070f2b77 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_xmit.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_xmit.c @@ -182,7 +182,6 @@ static s32 update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, s32 sz, u8 bag struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct pkt_attrib *pattrib = &pxmitframe->attrib; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -922,7 +921,7 @@ s32 rtl8723bu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. - rtl8192cu_cal_txdesc_chksum(ptxdesc); + rtl8723b_cal_txdesc_chksum(ptxdesc); // ----- end of fill tx desc ----- // @@ -940,7 +939,7 @@ s32 rtl8723bu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) pipe = usb_sndbulkpipe(pdvobj->pusbdev, pHalData->Queue2EPNum[(u8)MGT_QUEUE_INX]&0x0f); usb_fill_bulk_urb(urb, pdvobj->pusbdev, pipe, - pxmit_skb->data, pxmit_skb->len, rtl8192cu_hostap_mgnt_xmit_cb, pxmit_skb); + pxmit_skb->data, pxmit_skb->len, rtl8723bu_hostap_mgnt_xmit_cb, pxmit_skb); urb->transfer_flags |= URB_ZERO_PACKET; usb_anchor_urb(urb, &phostapdpriv->anchored); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_halinit.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_halinit.c index a837014d5b00..3c15ee36b0b9 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_halinit.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_halinit.c @@ -129,10 +129,10 @@ void rtl8723bu_interface_configure(_adapter *padapter) #ifdef CONFIG_USB_RX_AGGREGATION pHalData->UsbRxAggMode = USB_RX_AGG_USB; - pHalData->UsbRxAggBlockCount = 0x5; // unit: 4KB, for USB mode - pHalData->UsbRxAggBlockTimeout = 0x20; // unit: 32us, for USB mode - pHalData->UsbRxAggPageCount = 0xF; // uint: 1KB, for DMA mode - pHalData->UsbRxAggPageTimeout = 0x20; // unit: 32us, for DMA mode + pHalData->UsbRxAggBlockCount = 0x5; /* unit: 4KB, for USB mode */ + pHalData->UsbRxAggBlockTimeout = 0x20; /* unit: 32us, for USB mode */ + pHalData->UsbRxAggPageCount = 0xF; /* uint: 1KB, for DMA mode */ + pHalData->UsbRxAggPageTimeout = 0x20; /* unit: 32us, for DMA mode */ #endif HalUsbSetQueuePipeMapping8723BUsb(padapter, @@ -140,16 +140,79 @@ void rtl8723bu_interface_configure(_adapter *padapter) } -static u8 _InitPowerOn_8723BU(PADAPTER padapter) +#ifdef CONFIG_GPIO_WAKEUP +//we set it high under init and fw will +//give us Low Pulse when host wake up +void HostWakeUpGpioClear(PADAPTER Adapter) +{ + u32 value32; + + value32 = rtw_read32(Adapter, REG_GPIO_PIN_CTRL_2); + + //set GPIO 12 1 + value32 |= BIT(12);//4+8 + //GPIO 12 out put + value32 |= BIT(20);//4+16 + + rtw_write32(Adapter, REG_GPIO_PIN_CTRL_2, value32); +} //HostWakeUpGpioClear + +void HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue) +{ + 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 ( OutPutValue ) { + 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 ( OutPutValue ) { + 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)); + } + } +} +#endif + +static u32 _InitPowerOn_8723BU(PADAPTER padapter) { u8 status = _SUCCESS; u16 value16=0; u8 value8 = 0; u32 value32; + rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &value8); + if (value8 == _TRUE) + return _SUCCESS; + // HW Power on sequence if(!HalPwrSeqCmdParsing(padapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, rtl8723B_card_enable_flow )) - return _FAIL; + return _FAIL; // Enable MAC DMA/WMAC/SCHEDULE/SEC block // Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy. Added by tynli. 2011.08.31. @@ -159,6 +222,9 @@ static u8 _InitPowerOn_8723BU(PADAPTER padapter) | PROTOCOL_EN | SCHEDULE_EN | ENSEC | CALTMR_EN); rtw_write16(padapter, REG_CR_8723B, value16); + value8 = _TRUE; + rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &value8); + #ifdef CONFIG_BT_COEXIST rtw_btcoex_PowerOnSetting(padapter); @@ -183,10 +249,6 @@ static u8 _InitPowerOn_8723BU(PADAPTER padapter) //DBG_8192C("%s: REG_PAD_CTRL1(0x%x)=0x%02X\n", __FUNCTION__, REG_PAD_CTRL1_8723B, rtw_read8(padapter, REG_PAD_CTRL1_8723B)); #endif // CONFIG_BT_COEXIST -#ifdef CONFIG_GPIO_WAKEUP - rtw_clear_hostwakeupgpio(padapter); -#endif // CONFIG_GPIO_WAKEUP - return status; } @@ -795,7 +857,7 @@ static void usb_AggSettingRxUpdate(PADAPTER padapter) agg_size = RX_DMA_BOUNDARY_8723B >> 1; if ((agg_size + 2048) > MAX_RECVBUF_SZ) agg_size = MAX_RECVBUF_SZ - 2048; - agg_size >>= 10; // unit: 1K + agg_size >>= 10; /* unit: 1K */ if (agg_size > 0xF) agg_size = 0xF; @@ -804,7 +866,7 @@ static void usb_AggSettingRxUpdate(PADAPTER padapter) aggrx |= agg_size; aggrx |= (pHalData->UsbRxAggPageTimeout << 8); DBG_8192C("%s: RX Agg-DMA mode, size=%dKB, timeout=%dus\n", - __FUNCTION__, agg_size, pHalData->UsbRxAggPageTimeout*32); + __func__, agg_size, pHalData->UsbRxAggPageTimeout*32); break; case USB_RX_AGG_USB: @@ -812,7 +874,7 @@ static void usb_AggSettingRxUpdate(PADAPTER padapter) agg_size = pHalData->UsbRxAggBlockCount << 12; if ((agg_size + 2048) > MAX_RECVBUF_SZ) agg_size = MAX_RECVBUF_SZ - 2048; - agg_size >>= 12; // unit: 4K + agg_size >>= 12; /* unit: 4K */ if (agg_size > 0xF) agg_size = 0xF; @@ -821,7 +883,7 @@ static void usb_AggSettingRxUpdate(PADAPTER padapter) aggrx |= agg_size; aggrx |= (pHalData->UsbRxAggBlockTimeout << 8); DBG_8192C("%s: RX Agg-USB mode, size=%dKB, timeout=%dus\n", - __FUNCTION__, agg_size*4, pHalData->UsbRxAggBlockTimeout*32); + __func__, agg_size*4, pHalData->UsbRxAggBlockTimeout*32); break; case USB_RX_AGG_DISABLE: @@ -872,7 +934,7 @@ PHY_InitAntennaSelection8723B( static VOID _InitAdhocWorkaroundParams(IN PADAPTER Adapter) { -#ifdef RTL8192CU_ADHOC_WORKAROUND_SETTING +#ifdef CONFIG_ADHOC_WORKAROUND_SETTING HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); pHalData->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL); pHalData->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE); @@ -913,7 +975,7 @@ HalDetectPwrDownMode( HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter); - EFUSE_ShadowRead(Adapter, 1, EEPROM_RF_OPT3_92C, (u32 *)&tmpvalue); + EFUSE_ShadowRead(Adapter, 1, EEPROM_FEATURE_OPTION_8723B, (u32 *)&tmpvalue); // 2010/08/25 MH INF priority > PDN Efuse value. if(tmpvalue & BIT4 && pwrctrlpriv->reg_pdnmode) @@ -1063,7 +1125,6 @@ u32 rtl8723bu_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; - u8 is92C = IS_92C_SERIAL(pHalData->VersionID); rt_rf_power_state eRfPowerStateToSet; u32 NavUpper = WiFiNavUpperUs; u32 value32; @@ -1143,7 +1204,7 @@ _func_enter_; HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BEGIN); // if(Adapter->bSurpriseRemoved) -// return RT_STATUS_FAILURE; +// return _FAIL; // Check if MAC has already power on. value8 = rtw_read8(padapter, REG_SYS_CLKR_8723B+1); @@ -1459,7 +1520,7 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_HAL_DM); restore_iqk_rst = (pwrpriv->bips_processing==_TRUE)?_TRUE:_FALSE; b2Ant = pHalData->EEPROMBluetoothAntNum==Ant_x2?_TRUE:_FALSE; PHY_IQCalibrate_8723B(padapter, _FALSE, restore_iqk_rst, b2Ant, pHalData->ant_path); - pHalData->odmpriv.RFCalibrateInfo.bIQKInitialized = _TRUE; + pHalData->bIQKInitialized = _TRUE; #ifdef CONFIG_BT_COEXIST rtw_btcoex_IQKNotify(padapter, _FALSE); #endif @@ -1880,8 +1941,6 @@ i. APS_FSMCO 0x04[15:0] = 0x4802 // set USB suspend value8 = 0x23; - if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) - value8 |= BIT3; rtw_write8(Adapter, REG_SPS0_CTRL, value8); @@ -1944,9 +2003,13 @@ CardDisableRTL8723U( ) { u8 u1bTmp; -// PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - DBG_8192C("CardDisableRTL8723BU\n"); + rtw_hal_get_hwreg(Adapter, HW_VAR_APFM_ON_MAC, &u1bTmp); + DBG_8192C(FUNC_ADPT_FMT ": bMacPwrCtrlOn=%d\n", FUNC_ADPT_ARG(Adapter), u1bTmp); + if (u1bTmp == _FALSE) + return; + u1bTmp = _FALSE; + rtw_hal_set_hwreg(Adapter, HW_VAR_APFM_ON_MAC, &u1bTmp); //Stop Tx Report Timer. 0x4EC[Bit1]=b'0 u1bTmp = rtw_read8(Adapter, REG_TX_RPT_CTRL); @@ -2099,83 +2162,6 @@ _GetChannelGroup( // EEPROM/EFUSE Content Parsing // //------------------------------------------------------------------- -static void -_ReadIDs( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); - - if(_FALSE == AutoloadFail){ - // VID, PID - pHalData->EEPROMVID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_VID_8723BU]); - pHalData->EEPROMPID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_PID_8723BU]); - - // Customer ID, 0x00 and 0xff are reserved for Realtek. - pHalData->EEPROMCustomerID = *(u8 *)&PROMContent[EEPROM_CUSTOMER_ID_92C]; - pHalData->EEPROMSubCustomerID = *(u8 *)&PROMContent[EEPROM_SUBCUSTOMER_ID_92C]; - - } - else{ - pHalData->EEPROMVID = EEPROM_Default_VID; - pHalData->EEPROMPID = EEPROM_Default_PID; - - // Customer ID, 0x00 and 0xff are reserved for Realtek. - pHalData->EEPROMCustomerID = EEPROM_Default_CustomerID; - pHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; - - } - - // For customized behavior. - if((pHalData->EEPROMVID == 0x103C) && (pHalData->EEPROMVID == 0x1629))// HP Lite-On for RTL8188CUS Slim Combo. - pEEPROM->CustomerID = RT_CID_819x_HP; - - // Decide CustomerID according to VID/DID or EEPROM - switch(pHalData->EEPROMCustomerID) - { - case EEPROM_CID_DEFAULT: - if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3308)) - pEEPROM->CustomerID = RT_CID_DLINK; - else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3309)) - pEEPROM->CustomerID = RT_CID_DLINK; - else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a)) - pEEPROM->CustomerID = RT_CID_DLINK; - break; - case EEPROM_CID_WHQL: -/* - Adapter->bInHctTest = TRUE; - - pMgntInfo->bSupportTurboMode = FALSE; - pMgntInfo->bAutoTurboBy8186 = FALSE; - - pMgntInfo->PowerSaveControl.bInactivePs = FALSE; - pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE; - pMgntInfo->PowerSaveControl.bLeisurePs = FALSE; - - pMgntInfo->keepAliveLevel = 0; - - Adapter->bUnloadDriverwhenS3S4 = FALSE; -*/ - break; - default: - pEEPROM->CustomerID = RT_CID_DEFAULT; - break; - - } - - MSG_8192C("EEPROMVID = 0x%04x\n", pHalData->EEPROMVID); - MSG_8192C("EEPROMPID = 0x%04x\n", pHalData->EEPROMPID); - MSG_8192C("EEPROMCustomerID : 0x%02x\n", pHalData->EEPROMCustomerID); - MSG_8192C("EEPROMSubCustomerID: 0x%02x\n", pHalData->EEPROMSubCustomerID); - - MSG_8192C("RT_CustomerID: 0x%02x\n", pEEPROM->CustomerID); - -} - - static VOID _ReadMACAddress( IN PADAPTER Adapter, @@ -2183,59 +2169,24 @@ _ReadMACAddress( IN BOOLEAN AutoloadFail ) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); if(_FALSE == AutoloadFail){ //Read Permanent MAC address and set value to hardware - _rtw_memcpy(pEEPROM->mac_addr, &PROMContent[EEPROM_MAC_ADDR_8723BU], ETH_ALEN); + _rtw_memcpy(pHalData->EEPROMMACAddr, &PROMContent[EEPROM_MAC_ADDR_8723BU], ETH_ALEN); } else{ //Random assigh MAC address u8 sMacAddr[MAC_ADDR_LEN] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00}; //sMacAddr[5] = (u8)GetRandomNumber(1, 254); - _rtw_memcpy(pEEPROM->mac_addr, sMacAddr, ETH_ALEN); + _rtw_memcpy(pHalData->EEPROMMACAddr, sMacAddr, ETH_ALEN); } - DBG_8192C("%s MAC Address from EFUSE = "MAC_FMT"\n",__FUNCTION__, MAC_ARG(pEEPROM->mac_addr)); + DBG_8192C("%s MAC Address from EFUSE = "MAC_FMT"\n",__FUNCTION__, MAC_ARG(pHalData->EEPROMMACAddr)); //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress); //RT_PRINT_ADDR(COMP_INIT|COMP_EFUSE, DBG_LOUD, "MAC Addr: %s", Adapter->PermanentAddress); } -static VOID -_ReadBoardType( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ -#if 0 //amyma - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 value32; - u8 boardType = BOARD_USB_DONGLE; - - if(AutoloadFail){ - if(IS_8723_SERIES(pHalData->VersionID)) - pHalData->rf_type = RF_1T1R; - else - pHalData->rf_type = RF_2T2R; - - pHalData->BoardType = boardType; - return; - } - - boardType = PROMContent[EEPROM_NORMAL_BoardType_92C]; - boardType &= BOARD_TYPE_NORMAL_MASK;//bit[7:5] - boardType >>= 5; - - pHalData->BoardType = boardType; - MSG_8192C("_ReadBoardType(%x)\n",pHalData->BoardType); - - if (boardType == BOARD_USB_High_PA) - pHalData->ExternalPA = 1; -#endif -} - - static VOID _ReadLEDSetting( IN PADAPTER Adapter, @@ -2245,7 +2196,6 @@ _ReadLEDSetting( { struct led_priv *pledpriv = &(Adapter->ledpriv); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); #ifdef CONFIG_SW_LED pledpriv->bRegUseLed = _TRUE; @@ -2253,7 +2203,7 @@ _ReadLEDSetting( // // Led mode // - switch(pEEPROM->CustomerID) + switch(pHalData->CustomerID) { case RT_CID_DEFAULT: pledpriv->LedStrategy = SW_LED_MODE1; @@ -2269,51 +2219,12 @@ _ReadLEDSetting( break; } -// if( BOARD_MINICARD == pHalData->BoardType ) -// { -// pledpriv->LedStrategy = SW_LED_MODE6; -// } pHalData->bLedOpenDrain = _TRUE;// Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. #else // HW LED pledpriv->LedStrategy = HW_LED; #endif //CONFIG_SW_LED } - -static VOID -_ReadThermalMeter( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u8 tempval; - - // - // ThermalMeter from EEPROM - // - if(!AutoloadFail) - tempval = PROMContent[EEPROM_THERMAL_METER_8723A]; - else - tempval = EEPROM_Default_ThermalMeter; - - pHalData->EEPROMThermalMeter = (tempval&0x1f); //[4:0] - - if(pHalData->EEPROMThermalMeter == 0x1f || AutoloadFail) - pdmpriv->bAPKThermalMeterIgnore = _TRUE; - -#if 0 - if(pHalData->EEPROMThermalMeter < 0x06 || pHalData->EEPROMThermalMeter > 0x1c) - pHalData->EEPROMThermalMeter = 0x12; -#endif - - pdmpriv->ThermalMeter[0] = pHalData->EEPROMThermalMeter; - - //RTPRINT(FINIT, INIT_TxPower, ("ThermalMeter = 0x%x\n", pHalData->EEPROMThermalMeter)); - -} - + static VOID _ReadRFSetting( IN PADAPTER Adapter, @@ -2342,13 +2253,13 @@ static void _ReadPSSetting(IN PADAPTER Adapter,IN u8*PROMContent,IN u8 AutoloadF //hw power down mode selection , 0:rf-off / 1:power down if(Adapter->registrypriv.hwpdn_mode==2) - pwrctl->bHWPowerdown = (PROMContent[EEPROM_RF_OPT3_92C] & BIT4); + pwrctl->bHWPowerdown = (PROMContent[EEPROM_FEATURE_OPTION_8723B] & BIT4); else pwrctl->bHWPowerdown = Adapter->registrypriv.hwpdn_mode; // decide hw if support remote wakeup function // if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume - pwrctl->bSupportRemoteWakeup = (PROMContent[EEPROM_TEST_USB_OPT] & BIT1)?_TRUE :_FALSE; + pwrctl->bSupportRemoteWakeup = (PROMContent[EEPROM_USB_OPTIONAL_FUNCTION0] & BIT1)?_TRUE :_FALSE; //if(SUPPORT_HW_RADIO_DETECT(Adapter)) //Adapter->registrypriv.usbss_enable = pwrctl->bSupportRemoteWakeup ; @@ -2403,24 +2314,23 @@ Hal_EfuseParseMACAddr_8723BU( { u16 i, usValue; u8 sMacAddr[6] = {0x00, 0xE0, 0x4C, 0x87, 0x23, 0x00}; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); - + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); if (AutoLoadFail) { // sMacAddr[5] = (u1Byte)GetRandomNumber(1, 254); for (i=0; i<6; i++) - pEEPROM->mac_addr[i] = sMacAddr[i]; + pHalData->EEPROMMACAddr[i] = sMacAddr[i]; } else { //Read Permanent MAC address #if 1 - _rtw_memcpy(pEEPROM->mac_addr, &hwinfo[EEPROM_MAC_ADDR_8723BU], ETH_ALEN); + _rtw_memcpy(pHalData->EEPROMMACAddr, &hwinfo[EEPROM_MAC_ADDR_8723BU], ETH_ALEN); #else for(i=0; i<6; i+=2) { usValue = *(u16*)&hwinfo[EEPROM_MAC_ADDR_8723S+i]; - *((u16*)(&pEEPROM->mac_addr[i])) = usValue; + *((u16*)(&pHalData->EEPROMMACAddr[i])) = usValue; } #endif } @@ -2428,9 +2338,9 @@ Hal_EfuseParseMACAddr_8723BU( RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("Hal_EfuseParseMACAddr_8723BU: Permanent Address=%02x:%02x:%02x:%02x:%02x:%02x\n", - pEEPROM->mac_addr[0], pEEPROM->mac_addr[1], - pEEPROM->mac_addr[2], pEEPROM->mac_addr[3], - pEEPROM->mac_addr[4], pEEPROM->mac_addr[5])); + pHalData->EEPROMMACAddr[0], pHalData->EEPROMMACAddr[1], + pHalData->EEPROMMACAddr[2], pHalData->EEPROMMACAddr[3], + pHalData->EEPROMMACAddr[4], pHalData->EEPROMMACAddr[5])); } @@ -2443,15 +2353,15 @@ static u32 Hal_readPGDataFromConfigFile( 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; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + u8 *PROMContent = pHalData->efuse_eeprom_data; temp[2] = 0; // add end of string '\0' fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDWR, 0644); if (IS_ERR(fp)) { - pEEPROM->bloadfile_fail_flag= _TRUE; + pHalData->bloadfile_fail_flag= _TRUE; DBG_871X("Error, Efuse configure file doesn't exist.\n"); return _FAIL; } @@ -2471,7 +2381,7 @@ static u32 Hal_readPGDataFromConfigFile( filp_close(fp, NULL); - pEEPROM->bloadfile_fail_flag= _FALSE; + pHalData->bloadfile_fail_flag= _FALSE; return _SUCCESS; } @@ -2487,18 +2397,18 @@ Hal_ReadMACAddrFromFile_8723AU( u8 source_addr[18]; loff_t pos = 0; u32 curtime = rtw_get_current_time(); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); u8 *head, *end; u8 null_mac_addr[ETH_ALEN] = {0, 0, 0,0, 0, 0}; u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; _rtw_memset(source_addr, 0, 18); - _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN); + _rtw_memset(pHalData->EEPROMMACAddr, 0, ETH_ALEN); fp = filp_open("/data/wifimac.txt", O_RDWR, 0644); if (IS_ERR(fp)) { - pEEPROM->bloadmac_fail_flag = _TRUE; + pHalData->bloadmac_fail_flag = _TRUE; DBG_871X("Error, wifi mac address file doesn't exist.\n"); } else { fs = get_fs(); @@ -2516,13 +2426,13 @@ Hal_ReadMACAddrFromFile_8723AU( if (end && (*end == ':') ) *end = '\0'; - pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 ); + pHalData->EEPROMMACAddr[i] = simple_strtoul(head, NULL, 16 ); if (end) { end++; head = end; } - DBG_871X("%02x \n", pEEPROM->mac_addr[i]); + DBG_871X("%02x \n", pHalData->EEPROMMACAddr[i]); } DBG_871X("\n"); set_fs(fs); @@ -2530,22 +2440,22 @@ Hal_ReadMACAddrFromFile_8723AU( filp_close(fp, NULL); } - if ( (_rtw_memcmp(pEEPROM->mac_addr, null_mac_addr, ETH_ALEN)) || - (_rtw_memcmp(pEEPROM->mac_addr, multi_mac_addr, ETH_ALEN)) ) { - 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) ; + if ( (_rtw_memcmp(pHalData->EEPROMMACAddr, null_mac_addr, ETH_ALEN)) || + (_rtw_memcmp(pHalData->EEPROMMACAddr, multi_mac_addr, ETH_ALEN)) ) { + pHalData->EEPROMMACAddr[0] = 0x00; + pHalData->EEPROMMACAddr[1] = 0xe0; + pHalData->EEPROMMACAddr[2] = 0x4c; + pHalData->EEPROMMACAddr[3] = (u8)(curtime & 0xff) ; + pHalData->EEPROMMACAddr[4] = (u8)((curtime>>8) & 0xff) ; + pHalData->EEPROMMACAddr[5] = (u8)((curtime>>16) & 0xff) ; } - pEEPROM->bloadmac_fail_flag = _FALSE; + pHalData->bloadmac_fail_flag = _FALSE; DBG_871X("Hal_ReadMACAddrFromFile_8188ES: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n", - pEEPROM->mac_addr[0], pEEPROM->mac_addr[1], - pEEPROM->mac_addr[2], pEEPROM->mac_addr[3], - pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]); + pHalData->EEPROMMACAddr[0], pHalData->EEPROMMACAddr[1], + pHalData->EEPROMMACAddr[2], pHalData->EEPROMMACAddr[3], + pHalData->EEPROMMACAddr[4], pHalData->EEPROMMACAddr[5]); } #endif //CONFIG_EFUSE_CONFIG_FILE @@ -2555,14 +2465,14 @@ InitAdapterVariablesByPROM_8723BU( IN PADAPTER padapter ) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); - //PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); u8* hwinfo = NULL; - if (sizeof(pEEPROM->efuse_eeprom_data) < HWSET_MAX_SIZE_8723B) + if (sizeof(pHalData->efuse_eeprom_data) < HWSET_MAX_SIZE_8723B) DBG_871X("[WARNING] size of efuse_eeprom_data is less than HWSET_MAX_SIZE_8723B!\n"); - hwinfo = pEEPROM->efuse_eeprom_data; + hwinfo = pHalData->efuse_eeprom_data; #ifdef CONFIG_EFUSE_CONFIG_FILE Hal_readPGDataFromConfigFile(padapter); @@ -2570,32 +2480,32 @@ InitAdapterVariablesByPROM_8723BU( Hal_InitPGData(padapter, hwinfo); #endif //CONFIG_EFUSE_CONFIG_FILE Hal_EfuseParseIDCode(padapter, hwinfo); - Hal_EfuseParsePIDVID_8723BU(padapter, hwinfo, pEEPROM->bautoload_fail_flag); - Hal_EfuseParseEEPROMVer_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); + Hal_EfuseParsePIDVID_8723BU(padapter, hwinfo, pHalData->bautoload_fail_flag); + Hal_EfuseParseEEPROMVer_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); #ifdef CONFIG_EFUSE_CONFIG_FILE Hal_ReadMACAddrFromFile_8723BU(padapter); #else //CONFIG_EFUSE_CONFIG_FILE - Hal_EfuseParseMACAddr_8723BU(padapter, hwinfo, pEEPROM->bautoload_fail_flag); + Hal_EfuseParseMACAddr_8723BU(padapter, hwinfo, pHalData->bautoload_fail_flag); #endif - Hal_EfuseParseTxPowerInfo_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); - _ReadBoardType(padapter, hwinfo, pEEPROM->bautoload_fail_flag); - Hal_EfuseParseBTCoexistInfo_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); - - Hal_EfuseParseChnlPlan_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); - Hal_EfuseParseThermalMeter_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); -// _ReadLEDSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); -// _ReadRFSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); -// _ReadPSSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - Hal_EfuseParseAntennaDiversity_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); - - Hal_EfuseParseEEPROMVer_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); - Hal_EfuseParseCustomerID_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); -// Hal_EfuseParseRateIndicationOption(padapter, hwinfo, pEEPROM->bautoload_fail_flag); - Hal_EfuseParseXtal_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); + Hal_EfuseParseTxPowerInfo_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); + Hal_EfuseParseBoardType_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); + + Hal_EfuseParseBTCoexistInfo_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); + + Hal_EfuseParseChnlPlan_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); + Hal_EfuseParseThermalMeter_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); +// _ReadLEDSetting(Adapter, PROMContent, pHalData->bautoload_fail_flag); +// _ReadRFSetting(Adapter, PROMContent, pHalData->bautoload_fail_flag); +// _ReadPSSetting(Adapter, PROMContent, pHalData->bautoload_fail_flag); + Hal_EfuseParseAntennaDiversity_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); + + Hal_EfuseParseEEPROMVer_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); + Hal_EfuseParseCustomerID_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); +// Hal_EfuseParseRateIndicationOption(padapter, hwinfo, pHalData->bautoload_fail_flag); + Hal_EfuseParseXtal_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag); // // The following part initialize some vars by PG info. // -// Hal_InitChannelPlan(padapter); @@ -2609,20 +2519,20 @@ static void _ReadPROMContent( IN PADAPTER Adapter ) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + u8 eeValue; u32 i; u16 value16; eeValue = rtw_read8(Adapter, REG_9346CR); // To check system boot selection. - pEEPROM->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE; - pEEPROM->bautoload_fail_flag = (eeValue & EEPROM_EN) ? _FALSE : _TRUE; + pHalData->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE; + pHalData->bautoload_fail_flag = (eeValue & EEPROM_EN) ? _FALSE : _TRUE; - DBG_8192C("Boot from %s, Autoload %s !\n", (pEEPROM->EepromOrEfuse ? "EEPROM" : "EFUSE"), - (pEEPROM->bautoload_fail_flag ? "Fail" : "OK") ); + DBG_8192C("Boot from %s, Autoload %s !\n", (pHalData->EepromOrEfuse ? "EEPROM" : "EFUSE"), + (pHalData->bautoload_fail_flag ? "Fail" : "OK") ); InitAdapterVariablesByPROM_8723BU(Adapter); @@ -2813,7 +2723,7 @@ GetHalDefVar8723BUsb( { case HAL_DEF_IS_SUPPORT_ANT_DIV: #ifdef CONFIG_ANTENNA_DIVERSITY - *((u8 *)pValue) = (IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))?_FALSE:_TRUE; + *((u8 *)pValue) =_FALSE; #endif break; case HAL_DEF_CURRENT_ANTENNA: @@ -2917,6 +2827,9 @@ _func_enter_; rtl8723b_set_hal_ops(pHalFunc); + pHalFunc->hal_power_on = &_InitPowerOn_8723BU; + pHalFunc->hal_power_off = &CardDisableRTL8723U; + pHalFunc->hal_init = &rtl8723bu_hal_init; pHalFunc->hal_deinit = &rtl8723bu_hal_deinit; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_ops.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_ops.c index c5dc2682116f..31547e274012 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_ops.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_ops.c @@ -229,11 +229,11 @@ _func_exit_; #endif -static s32 pre_recv_entry(union recv_frame *precvframe, struct phy_stat *pphy_status) +static s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status) { s32 ret=_SUCCESS; #ifdef CONFIG_CONCURRENT_MODE - u8 *primary_myid, *secondary_myid, *paddr1; + u8 *secondary_myid, *paddr1; union recv_frame *precvframe_if2 = NULL; _adapter *primary_padapter = precvframe->u.hdr.adapter; _adapter *secondary_padapter = primary_padapter->pbuddy_adapter; @@ -248,8 +248,7 @@ static s32 pre_recv_entry(union recv_frame *precvframe, struct phy_stat *pphy_st if(IS_MCAST(paddr1) == _FALSE)//unicast packets { - //primary_myid = myid(&primary_padapter->eeprompriv); - secondary_myid = myid(&secondary_padapter->eeprompriv); + secondary_myid = adapter_mac_addr(secondary_padapter); if(_rtw_memcmp(paddr1, secondary_myid, ETH_ALEN)) { @@ -313,7 +312,7 @@ static s32 pre_recv_entry(union recv_frame *precvframe, struct phy_stat *pphy_st recvframe_pull_tail(precvframe_if2, IEEE80211_FCS_LEN); if (pattrib->physt) - rtl8723b_query_rx_phy_status(precvframe_if2, pphy_status); + rx_query_phy_status(precvframe_if2, pphy_status); if(rtw_recv_entry(precvframe_if2) != _SUCCESS) { @@ -323,7 +322,7 @@ static s32 pre_recv_entry(union recv_frame *precvframe, struct phy_stat *pphy_st } //if (precvframe->u.hdr.attrib.physt) - // rtl8723b_query_rx_phy_status(precvframe, pphy_status); + // rx_query_phy_status(precvframe, pphy_status); //ret = rtw_recv_entry(precvframe); #endif @@ -337,7 +336,7 @@ static s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status) { s32 ret=_SUCCESS; #ifdef CONFIG_CONCURRENT_MODE - u8 *primary_myid, *secondary_myid, *paddr1; + u8 *secondary_myid, *paddr1; union recv_frame *precvframe_if2 = NULL; _adapter *primary_padapter = precvframe->u.hdr.adapter; _adapter *secondary_padapter = primary_padapter->pbuddy_adapter; @@ -352,8 +351,7 @@ static s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status) if(IS_MCAST(paddr1) == _FALSE)//unicast packets { - //primary_myid = myid(&primary_padapter->eeprompriv); - secondary_myid = myid(&secondary_padapter->eeprompriv); + secondary_myid = adapter_mac_addr(secondary_padapter); if(_rtw_memcmp(paddr1, secondary_myid, ETH_ALEN)) { @@ -466,7 +464,7 @@ static s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status) //recvframe_pull(precvframe_if2, drvinfo_sz + RXDESC_SIZE); if (pattrib->physt && pphy_status) - rtl8812_query_rx_phy_status(precvframe_if2, pphy_status); + rx_query_phy_status(precvframe_if2, pphy_status); ret = rtw_recv_entry(precvframe_if2); } @@ -482,7 +480,7 @@ static s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status) } //if (precvframe->u.hdr.attrib.physt) - // rtl8812_query_rx_phy_status(precvframe, pphy_status); + // rx_query_phy_status(precvframe, pphy_status); //ret = rtw_recv_entry(precvframe); @@ -578,7 +576,7 @@ int recvbuf2recvframe(PADAPTER padapter, void *ptr) #ifdef CONFIG_CONCURRENT_MODE if (rtw_buddy_adapter_up(padapter)) { - if (pre_recv_entry(precvframe, (struct phy_stat*)pphy_status) != _SUCCESS) { + if (pre_recv_entry(precvframe, pphy_status) != _SUCCESS) { // Return fail except data frame //DBG_8192C("%s: RX Error! (concurrent)pre_recv_entry FAIL!\n", __FUNCTION__); } @@ -586,7 +584,7 @@ int recvbuf2recvframe(PADAPTER padapter, void *ptr) #endif // CONFIG_CONCURRENT_MODE if (pphy_status) - rtl8723b_query_rx_phy_status(precvframe, (struct phy_stat*)pphy_status); + rx_query_phy_status(precvframe, pphy_status); if (rtw_recv_entry(precvframe) != _SUCCESS) { // Return fail except data frame @@ -628,9 +626,6 @@ void rtl8723bu_xmit_tasklet(void *priv) _adapter *padapter = (_adapter*)priv; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - if(check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE) - return; - while(1) { if (RTW_CANNOT_TX(padapter)) @@ -639,6 +634,14 @@ void rtl8723bu_xmit_tasklet(void *priv) break; } + if(check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE + #ifdef CONFIG_CONCURRENT_MODE + || check_buddy_fwstate(padapter, _FW_UNDER_SURVEY) == _TRUE + #endif + ) { + break; + } + ret = rtl8723bu_xmitframe_complete(padapter, pxmitpriv, NULL); if(ret==_FALSE) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/Hal8192CPhyReg.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/Hal8192CPhyReg.h deleted file mode 100755 index 1c7cd5d1ed1e..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/Hal8192CPhyReg.h +++ /dev/null @@ -1,1133 +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 - * - * - ******************************************************************************/ -/***************************************************************************** - * - * Module: __INC_HAL8192CPHYREG_H - * - * - * Note: 1. Define PMAC/BB register map - * 2. Define RF register map - * 3. PMAC/BB register bit mask. - * 4. RF reg bit mask. - * 5. Other BB/RF relative definition. - * - * - * Export: Constants, macro, functions(API), global variables(None). - * - * Abbrev: - * - * History: - * Data Who Remark - * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. - * 2. Reorganize code architecture. - * 09/25/2008 MH 1. Add RL6052 register definition - * - *****************************************************************************/ -#ifndef __INC_HAL8192CPHYREG_H -#define __INC_HAL8192CPHYREG_H - - -/*--------------------------Define Parameters-------------------------------*/ - -//============================================================ -// 8192S Regsiter offset definition -//============================================================ - -// -// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 -// 3. RF register 0x00-2E -// 4. Bit Mask for BB/RF register -// 5. Other defintion for BB/RF R/W -// - - -// -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 1. Page1(0x100) -// -#define rPMAC_Reset 0x100 -#define rPMAC_TxStart 0x104 -#define rPMAC_TxLegacySIG 0x108 -#define rPMAC_TxHTSIG1 0x10c -#define rPMAC_TxHTSIG2 0x110 -#define rPMAC_PHYDebug 0x114 -#define rPMAC_TxPacketNum 0x118 -#define rPMAC_TxIdle 0x11c -#define rPMAC_TxMACHeader0 0x120 -#define rPMAC_TxMACHeader1 0x124 -#define rPMAC_TxMACHeader2 0x128 -#define rPMAC_TxMACHeader3 0x12c -#define rPMAC_TxMACHeader4 0x130 -#define rPMAC_TxMACHeader5 0x134 -#define rPMAC_TxDataType 0x138 -#define rPMAC_TxRandomSeed 0x13c -#define rPMAC_CCKPLCPPreamble 0x140 -#define rPMAC_CCKPLCPHeader 0x144 -#define rPMAC_CCKCRC16 0x148 -#define rPMAC_OFDMRxCRC32OK 0x170 -#define rPMAC_OFDMRxCRC32Er 0x174 -#define rPMAC_OFDMRxParityEr 0x178 -#define rPMAC_OFDMRxCRC8Er 0x17c -#define rPMAC_CCKCRxRC16Er 0x180 -#define rPMAC_CCKCRxRC32Er 0x184 -#define rPMAC_CCKCRxRC32OK 0x188 -#define rPMAC_TxStatus 0x18c - -// -// 2. Page2(0x200) -// -// The following two definition are only used for USB interface. -#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. -#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. - -// -// 3. Page8(0x800) -// -#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? - -#define rFPGA0_TxInfo 0x804 // Status report?? -#define rFPGA0_PSDFunction 0x808 - -#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? - -#define rFPGA0_RFTiming1 0x810 // Useless now -#define rFPGA0_RFTiming2 0x814 - -#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register -#define rFPGA0_XA_HSSIParameter2 0x824 -#define rFPGA0_XB_HSSIParameter1 0x828 -#define rFPGA0_XB_HSSIParameter2 0x82c -#define rTxAGC_B_Rate18_06 0x830 -#define rTxAGC_B_Rate54_24 0x834 -#define rTxAGC_B_CCK1_55_Mcs32 0x838 -#define rTxAGC_B_Mcs03_Mcs00 0x83c - -#define rTxAGC_B_Mcs07_Mcs04 0x848 -#define rTxAGC_B_Mcs11_Mcs08 0x84c - -#define rFPGA0_XA_LSSIParameter 0x840 -#define rFPGA0_XB_LSSIParameter 0x844 - -#define rFPGA0_RFWakeUpParameter 0x850 // Useless now -#define rFPGA0_RFSleepUpParameter 0x854 - -#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch -#define rFPGA0_XCD_SwitchControl 0x85c - -#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch -#define rFPGA0_XB_RFInterfaceOE 0x864 - -#define rTxAGC_B_Mcs15_Mcs12 0x868 -#define rTxAGC_B_CCK11_A_CCK2_11 0x86c - -#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control -#define rFPGA0_XCD_RFInterfaceSW 0x874 - -#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -#define rFPGA0_XCD_RFParameter 0x87c - -#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -#define rFPGA0_AnalogParameter2 0x884 -#define rFPGA0_AnalogParameter3 0x888 // Useless now -#define rFPGA0_AnalogParameter4 0x88c - -#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback -#define rFPGA0_XB_LSSIReadBack 0x8a4 -#define rFPGA0_XC_LSSIReadBack 0x8a8 -#define rFPGA0_XD_LSSIReadBack 0x8ac - -#define rFPGA0_PSDReport 0x8b4 // Useless now -#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback -#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback -#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value -#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now - -// -// 4. Page9(0x900) -// -#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? - -#define rFPGA1_TxBlock 0x904 // Useless now -#define rFPGA1_DebugSelect 0x908 // Useless now -#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? -#define rS0S1_PathSwitch 0x948 - -// -// 5. PageA(0xA00) -// -// Set Control channel to upper or lower. These settings are required only for 40MHz -#define rCCK0_System 0xa00 - -#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI -#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain - -#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series -#define rCCK0_RxAGC2 0xa10 //AGC & DAGC - -#define rCCK0_RxHP 0xa14 - -#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold -#define rCCK0_DSPParameter2 0xa1c //SQ threshold - -#define rCCK0_TxFilter1 0xa20 -#define rCCK0_TxFilter2 0xa24 -#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 -#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report -#define rCCK0_TRSSIReport 0xa50 -#define rCCK0_RxReport 0xa54 //0xa57 -#define rCCK0_FACounterLower 0xa5c //0xa5b -#define rCCK0_FACounterUpper 0xa58 //0xa5c -// -// PageB(0xB00) -// -#define rPdp_AntA 0xb00 -#define rPdp_AntA_4 0xb04 -#define rConfig_Pmpd_AntA 0xb28 -#define rConfig_AntA 0xb68 -#define rConfig_AntB 0xb6c -#define rPdp_AntB 0xb70 -#define rPdp_AntB_4 0xb74 -#define rConfig_Pmpd_AntB 0xb98 -#define rAPK 0xbd8 - -// -// 6. PageC(0xC00) -// -#define rOFDM0_LSTF 0xc00 - -#define rOFDM0_TRxPathEnable 0xc04 -#define rOFDM0_TRMuxPar 0xc08 -#define rOFDM0_TRSWIsolation 0xc0c - -#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter -#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix -#define rOFDM0_XBRxAFE 0xc18 -#define rOFDM0_XBRxIQImbalance 0xc1c -#define rOFDM0_XCRxAFE 0xc20 -#define rOFDM0_XCRxIQImbalance 0xc24 -#define rOFDM0_XDRxAFE 0xc28 -#define rOFDM0_XDRxIQImbalance 0xc2c - -#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain -#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. -#define rOFDM0_RxDetector3 0xc38 //Frame Sync. -#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI - -#define rOFDM0_RxDSP 0xc40 //Rx Sync Path -#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC -#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold -#define rOFDM0_ECCAThreshold 0xc4c // energy CCA - -#define rOFDM0_XAAGCCore1 0xc50 // DIG -#define rOFDM0_XAAGCCore2 0xc54 -#define rOFDM0_XBAGCCore1 0xc58 -#define rOFDM0_XBAGCCore2 0xc5c -#define rOFDM0_XCAGCCore1 0xc60 -#define rOFDM0_XCAGCCore2 0xc64 -#define rOFDM0_XDAGCCore1 0xc68 -#define rOFDM0_XDAGCCore2 0xc6c - -#define rOFDM0_AGCParameter1 0xc70 -#define rOFDM0_AGCParameter2 0xc74 -#define rOFDM0_AGCRSSITable 0xc78 -#define rOFDM0_HTSTFAGC 0xc7c - -#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG -#define rOFDM0_XATxAFE 0xc84 -#define rOFDM0_XBTxIQImbalance 0xc88 -#define rOFDM0_XBTxAFE 0xc8c -#define rOFDM0_XCTxIQImbalance 0xc90 -#define rOFDM0_XCTxAFE 0xc94 -#define rOFDM0_XDTxIQImbalance 0xc98 -#define rOFDM0_XDTxAFE 0xc9c - -#define rOFDM0_RxIQExtAnta 0xca0 -#define rOFDM0_TxCoeff1 0xca4 -#define rOFDM0_TxCoeff2 0xca8 -#define rOFDM0_TxCoeff3 0xcac -#define rOFDM0_TxCoeff4 0xcb0 -#define rOFDM0_TxCoeff5 0xcb4 -#define rOFDM0_TxCoeff6 0xcb8 -#define rOFDM0_RxHPParameter 0xce0 -#define rOFDM0_TxPseudoNoiseWgt 0xce4 -#define rOFDM0_FrameSync 0xcf0 -#define rOFDM0_DFSReport 0xcf4 - -// -// 7. PageD(0xD00) -// -#define rOFDM1_LSTF 0xd00 -#define rOFDM1_TRxPathEnable 0xd04 - -#define rOFDM1_CFO 0xd08 // No setting now -#define rOFDM1_CSI1 0xd10 -#define rOFDM1_SBD 0xd14 -#define rOFDM1_CSI2 0xd18 -#define rOFDM1_CFOTracking 0xd2c -#define rOFDM1_TRxMesaure1 0xd34 -#define rOFDM1_IntfDet 0xd3c -#define rOFDM1_PseudoNoiseStateAB 0xd50 -#define rOFDM1_PseudoNoiseStateCD 0xd54 -#define rOFDM1_RxPseudoNoiseWgt 0xd58 - -#define rOFDM_PHYCounter1 0xda0 //cca, parity fail -#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail -#define rOFDM_PHYCounter3 0xda8 //MCS not support - -#define rOFDM_ShortCFOAB 0xdac // No setting now -#define rOFDM_ShortCFOCD 0xdb0 -#define rOFDM_LongCFOAB 0xdb4 -#define rOFDM_LongCFOCD 0xdb8 -#define rOFDM_TailCFOAB 0xdbc -#define rOFDM_TailCFOCD 0xdc0 -#define rOFDM_PWMeasure1 0xdc4 -#define rOFDM_PWMeasure2 0xdc8 -#define rOFDM_BWReport 0xdcc -#define rOFDM_AGCReport 0xdd0 -#define rOFDM_RxSNR 0xdd4 -#define rOFDM_RxEVMCSI 0xdd8 -#define rOFDM_SIGReport 0xddc - - -// -// 8. PageE(0xE00) -// -#define rTxAGC_A_Rate18_06 0xe00 -#define rTxAGC_A_Rate54_24 0xe04 -#define rTxAGC_A_CCK1_Mcs32 0xe08 -#define rTxAGC_A_Mcs03_Mcs00 0xe10 -#define rTxAGC_A_Mcs07_Mcs04 0xe14 -#define rTxAGC_A_Mcs11_Mcs08 0xe18 -#define rTxAGC_A_Mcs15_Mcs12 0xe1c - -#define rFPGA0_IQK 0xe28 -#define rTx_IQK_Tone_A 0xe30 -#define rRx_IQK_Tone_A 0xe34 -#define rTx_IQK_PI_A 0xe38 -#define rRx_IQK_PI_A 0xe3c - -#define rTx_IQK 0xe40 -#define rRx_IQK 0xe44 -#define rIQK_AGC_Pts 0xe48 -#define rIQK_AGC_Rsp 0xe4c -#define rTx_IQK_Tone_B 0xe50 -#define rRx_IQK_Tone_B 0xe54 -#define rTx_IQK_PI_B 0xe58 -#define rRx_IQK_PI_B 0xe5c -#define rIQK_AGC_Cont 0xe60 - -#define rBlue_Tooth 0xe6c -#define rRx_Wait_CCA 0xe70 -#define rTx_CCK_RFON 0xe74 -#define rTx_CCK_BBON 0xe78 -#define rTx_OFDM_RFON 0xe7c -#define rTx_OFDM_BBON 0xe80 -#define rTx_To_Rx 0xe84 -#define rTx_To_Tx 0xe88 -#define rRx_CCK 0xe8c - -#define rTx_Power_Before_IQK_A 0xe94 -#define rTx_Power_After_IQK_A 0xe9c - -#define rRx_Power_Before_IQK_A 0xea0 -#define rRx_Power_Before_IQK_A_2 0xea4 -#define rRx_Power_After_IQK_A 0xea8 -#define rRx_Power_After_IQK_A_2 0xeac - -#define rTx_Power_Before_IQK_B 0xeb4 -#define rTx_Power_After_IQK_B 0xebc - -#define rRx_Power_Before_IQK_B 0xec0 -#define rRx_Power_Before_IQK_B_2 0xec4 -#define rRx_Power_After_IQK_B 0xec8 -#define rRx_Power_After_IQK_B_2 0xecc - -#define rRx_OFDM 0xed0 -#define rRx_Wait_RIFS 0xed4 -#define rRx_TO_Rx 0xed8 -#define rStandby 0xedc -#define rSleep 0xee0 -#define rPMPD_ANAEN 0xeec - -// -// 7. RF Register 0x00-0x2E (RF 8256) -// RF-0222D 0x00-3F -// -//Zebra1 -#define rZebra1_HSSIEnable 0x0 // Useless now -#define rZebra1_TRxEnable1 0x1 -#define rZebra1_TRxEnable2 0x2 -#define rZebra1_AGC 0x4 -#define rZebra1_ChargePump 0x5 -#define rZebra1_Channel 0x7 // RF channel switch - -//#endif -#define rZebra1_TxGain 0x8 // Useless now -#define rZebra1_TxLPF 0x9 -#define rZebra1_RxLPF 0xb -#define rZebra1_RxHPFCorner 0xc - -//Zebra4 -#define rGlobalCtrl 0 // Useless now -#define rRTL8256_TxLPF 19 -#define rRTL8256_RxLPF 11 - -//RTL8258 -#define rRTL8258_TxLPF 0x11 // Useless now -#define rRTL8258_RxLPF 0x13 -#define rRTL8258_RSSILPF 0xa - -// -// RL6052 Register definition -// -#define RF_AC 0x00 // - -#define RF_IQADJ_G1 0x01 // -#define RF_IQADJ_G2 0x02 // -#define RF_BS_PA_APSET_G1_G4 0x03 -#define RF_BS_PA_APSET_G5_G8 0x04 -#define RF_POW_TRSW 0x05 // - -#define RF_GAIN_RX 0x06 // -#define RF_GAIN_TX 0x07 // - -#define RF_TXM_IDAC 0x08 // -#define RF_IPA_G 0x09 // -#define RF_TXBIAS_G 0x0A -#define RF_TXPA_AG 0x0B -#define RF_IPA_A 0x0C // -#define RF_TXBIAS_A 0x0D -#define RF_BS_PA_APSET_G9_G11 0x0E -#define RF_BS_IQGEN 0x0F // - -#define RF_MODE1 0x10 // -#define RF_MODE2 0x11 // - -#define RF_RX_AGC_HP 0x12 // -#define RF_TX_AGC 0x13 // -#define RF_BIAS 0x14 // -#define RF_IPA 0x15 // -#define RF_TXBIAS 0x16 // -#define RF_POW_ABILITY 0x17 // -#define RF_MODE_AG 0x18 // -#define rRfChannel 0x18 // RF channel and BW switch -#define RF_CHNLBW 0x18 // RF channel and BW switch -#define RF_TOP 0x19 // - -#define RF_RX_G1 0x1A // -#define RF_RX_G2 0x1B // - -#define RF_RX_BB2 0x1C // -#define RF_RX_BB1 0x1D // - -#define RF_RCK1 0x1E // -#define RF_RCK2 0x1F // - -#define RF_TX_G1 0x20 // -#define RF_TX_G2 0x21 // -#define RF_TX_G3 0x22 // - -#define RF_TX_BB1 0x23 // - -#define RF_T_METER 0x24 // - -#define RF_SYN_G1 0x25 // RF TX Power control -#define RF_SYN_G2 0x26 // RF TX Power control -#define RF_SYN_G3 0x27 // RF TX Power control -#define RF_SYN_G4 0x28 // RF TX Power control -#define RF_SYN_G5 0x29 // RF TX Power control -#define RF_SYN_G6 0x2A // RF TX Power control -#define RF_SYN_G7 0x2B // RF TX Power control -#define RF_SYN_G8 0x2C // RF TX Power control - -#define RF_RCK_OS 0x30 // RF TX PA control - -#define RF_TXPA_G1 0x31 // RF TX PA control -#define RF_TXPA_G2 0x32 // RF TX PA control -#define RF_TXPA_G3 0x33 // RF TX PA control -#define RF_TX_BIAS_A 0x35 -#define RF_TX_BIAS_D 0x36 -#define RF_LOBF_9 0x38 -#define RF_RXRF_A3 0x3C // -#define RF_TRSW 0x3F - -#define RF_TXRF_A2 0x41 -#define RF_TXPA_G4 0x46 -#define RF_TXPA_A4 0x4B -#define RF_0x52 0x52 -#define RF_WE_LUT 0xEF -#define RF_S0S1 0xB0 - -// -//Bit Mask -// -// 1. Page1(0x100) -#define bBBResetB 0x100 // Useless now? -#define bGlobalResetB 0x200 -#define bOFDMTxStart 0x4 -#define bCCKTxStart 0x8 -#define bCRC32Debug 0x100 -#define bPMACLoopback 0x10 -#define bTxLSIG 0xffffff -#define bOFDMTxRate 0xf -#define bOFDMTxReserved 0x10 -#define bOFDMTxLength 0x1ffe0 -#define bOFDMTxParity 0x20000 -#define bTxHTSIG1 0xffffff -#define bTxHTMCSRate 0x7f -#define bTxHTBW 0x80 -#define bTxHTLength 0xffff00 -#define bTxHTSIG2 0xffffff -#define bTxHTSmoothing 0x1 -#define bTxHTSounding 0x2 -#define bTxHTReserved 0x4 -#define bTxHTAggreation 0x8 -#define bTxHTSTBC 0x30 -#define bTxHTAdvanceCoding 0x40 -#define bTxHTShortGI 0x80 -#define bTxHTNumberHT_LTF 0x300 -#define bTxHTCRC8 0x3fc00 -#define bCounterReset 0x10000 -#define bNumOfOFDMTx 0xffff -#define bNumOfCCKTx 0xffff0000 -#define bTxIdleInterval 0xffff -#define bOFDMService 0xffff0000 -#define bTxMACHeader 0xffffffff -#define bTxDataInit 0xff -#define bTxHTMode 0x100 -#define bTxDataType 0x30000 -#define bTxRandomSeed 0xffffffff -#define bCCKTxPreamble 0x1 -#define bCCKTxSFD 0xffff0000 -#define bCCKTxSIG 0xff -#define bCCKTxService 0xff00 -#define bCCKLengthExt 0x8000 -#define bCCKTxLength 0xffff0000 -#define bCCKTxCRC16 0xffff -#define bCCKTxStatus 0x1 -#define bOFDMTxStatus 0x2 - -#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) - -// 2. Page8(0x800) -#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD -#define bJapanMode 0x2 -#define bCCKTxSC 0x30 -#define bCCKEn 0x1000000 -#define bOFDMEn 0x2000000 - -#define bOFDMRxADCPhase 0x10000 // Useless now -#define bOFDMTxDACPhase 0x40000 -#define bXATxAGC 0x3f - -#define bAntennaSelect 0x0300 - -#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage -#define bXCTxAGC 0xf000 -#define bXDTxAGC 0xf0000 - -#define bPAStart 0xf0000000 // Useless now -#define bTRStart 0x00f00000 -#define bRFStart 0x0000f000 -#define bBBStart 0x000000f0 -#define bBBCCKStart 0x0000000f -#define bPAEnd 0xf //Reg0x814 -#define bTREnd 0x0f000000 -#define bRFEnd 0x000f0000 -#define bCCAMask 0x000000f0 //T2R -#define bR2RCCAMask 0x00000f00 -#define bHSSI_R2TDelay 0xf8000000 -#define bHSSI_T2RDelay 0xf80000 -#define bContTxHSSI 0x400 //chane gain at continue Tx -#define bIGFromCCK 0x200 -#define bAGCAddress 0x3f -#define bRxHPTx 0x7000 -#define bRxHPT2R 0x38000 -#define bRxHPCCKIni 0xc0000 -#define bAGCTxCode 0xc00000 -#define bAGCRxCode 0x300000 - -#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 -#define b3WireAddressLength 0x400 - -#define b3WireRFPowerDown 0x1 // Useless now -//#define bHWSISelect 0x8 -#define b5GPAPEPolarity 0x40000000 -#define b2GPAPEPolarity 0x80000000 -#define bRFSW_TxDefaultAnt 0x3 -#define bRFSW_TxOptionAnt 0x30 -#define bRFSW_RxDefaultAnt 0x300 -#define bRFSW_RxOptionAnt 0x3000 -#define bRFSI_3WireData 0x1 -#define bRFSI_3WireClock 0x2 -#define bRFSI_3WireLoad 0x4 -#define bRFSI_3WireRW 0x8 -#define bRFSI_3Wire 0xf - -#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW - -#define bRFSI_TRSW 0x20 // Useless now -#define bRFSI_TRSWB 0x40 -#define bRFSI_ANTSW 0x100 -#define bRFSI_ANTSWB 0x200 -#define bRFSI_PAPE 0x400 -#define bRFSI_PAPE5G 0x800 -#define bBandSelect 0x1 -#define bHTSIG2_GI 0x80 -#define bHTSIG2_Smoothing 0x01 -#define bHTSIG2_Sounding 0x02 -#define bHTSIG2_Aggreaton 0x08 -#define bHTSIG2_STBC 0x30 -#define bHTSIG2_AdvCoding 0x40 -#define bHTSIG2_NumOfHTLTF 0x300 -#define bHTSIG2_CRC8 0x3fc -#define bHTSIG1_MCS 0x7f -#define bHTSIG1_BandWidth 0x80 -#define bHTSIG1_HTLength 0xffff -#define bLSIG_Rate 0xf -#define bLSIG_Reserved 0x10 -#define bLSIG_Length 0x1fffe -#define bLSIG_Parity 0x20 -#define bCCKRxPhase 0x4 - -#define bLSSIReadAddress 0x7f800000 // T65 RF - -#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal - -#define bLSSIReadBackData 0xfffff // T65 RF - -#define bLSSIReadOKFlag 0x1000 // Useless now -#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz -#define bRegulator0Standby 0x1 -#define bRegulatorPLLStandby 0x2 -#define bRegulator1Standby 0x4 -#define bPLLPowerUp 0x8 -#define bDPLLPowerUp 0x10 -#define bDA10PowerUp 0x20 -#define bAD7PowerUp 0x200 -#define bDA6PowerUp 0x2000 -#define bXtalPowerUp 0x4000 -#define b40MDClkPowerUP 0x8000 -#define bDA6DebugMode 0x20000 -#define bDA6Swing 0x380000 - -#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ - -#define b80MClkDelay 0x18000000 // Useless -#define bAFEWatchDogEnable 0x20000000 - -#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap -#define bXtalCap23 0x3 -#define bXtalCap92x 0x0f000000 -#define bXtalCap 0x0f000000 - -#define bIntDifClkEnable 0x400 // Useless -#define bExtSigClkEnable 0x800 -#define bBandgapMbiasPowerUp 0x10000 -#define bAD11SHGain 0xc0000 -#define bAD11InputRange 0x700000 -#define bAD11OPCurrent 0x3800000 -#define bIPathLoopback 0x4000000 -#define bQPathLoopback 0x8000000 -#define bAFELoopback 0x10000000 -#define bDA10Swing 0x7e0 -#define bDA10Reverse 0x800 -#define bDAClkSource 0x1000 -#define bAD7InputRange 0x6000 -#define bAD7Gain 0x38000 -#define bAD7OutputCMMode 0x40000 -#define bAD7InputCMMode 0x380000 -#define bAD7Current 0xc00000 -#define bRegulatorAdjust 0x7000000 -#define bAD11PowerUpAtTx 0x1 -#define bDA10PSAtTx 0x10 -#define bAD11PowerUpAtRx 0x100 -#define bDA10PSAtRx 0x1000 -#define bCCKRxAGCFormat 0x200 -#define bPSDFFTSamplepPoint 0xc000 -#define bPSDAverageNum 0x3000 -#define bIQPathControl 0xc00 -#define bPSDFreq 0x3ff -#define bPSDAntennaPath 0x30 -#define bPSDIQSwitch 0x40 -#define bPSDRxTrigger 0x400000 -#define bPSDTxTrigger 0x80000000 -#define bPSDSineToneScale 0x7f000000 -#define bPSDReport 0xffff - -// 3. Page9(0x900) -#define bOFDMTxSC 0x30000000 // Useless -#define bCCKTxOn 0x1 -#define bOFDMTxOn 0x2 -#define bDebugPage 0xfff //reset debug page and also HWord, LWord -#define bDebugItem 0xff //reset debug page and LWord -#define bAntL 0x10 -#define bAntNonHT 0x100 -#define bAntHT1 0x1000 -#define bAntHT2 0x10000 -#define bAntHT1S1 0x100000 -#define bAntNonHTS1 0x1000000 - -// 4. PageA(0xA00) -#define bCCKBBMode 0x3 // Useless -#define bCCKTxPowerSaving 0x80 -#define bCCKRxPowerSaving 0x40 - -#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch - -#define bCCKScramble 0x8 // Useless -#define bCCKAntDiversity 0x8000 -#define bCCKCarrierRecovery 0x4000 -#define bCCKTxRate 0x3000 -#define bCCKDCCancel 0x0800 -#define bCCKISICancel 0x0400 -#define bCCKMatchFilter 0x0200 -#define bCCKEqualizer 0x0100 -#define bCCKPreambleDetect 0x800000 -#define bCCKFastFalseCCA 0x400000 -#define bCCKChEstStart 0x300000 -#define bCCKCCACount 0x080000 -#define bCCKcs_lim 0x070000 -#define bCCKBistMode 0x80000000 -#define bCCKCCAMask 0x40000000 -#define bCCKTxDACPhase 0x4 -#define bCCKRxADCPhase 0x20000000 //r_rx_clk -#define bCCKr_cp_mode0 0x0100 -#define bCCKTxDCOffset 0xf0 -#define bCCKRxDCOffset 0xf -#define bCCKCCAMode 0xc000 -#define bCCKFalseCS_lim 0x3f00 -#define bCCKCS_ratio 0xc00000 -#define bCCKCorgBit_sel 0x300000 -#define bCCKPD_lim 0x0f0000 -#define bCCKNewCCA 0x80000000 -#define bCCKRxHPofIG 0x8000 -#define bCCKRxIG 0x7f00 -#define bCCKLNAPolarity 0x800000 -#define bCCKRx1stGain 0x7f0000 -#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity -#define bCCKRxAGCSatLevel 0x1f000000 -#define bCCKRxAGCSatCount 0xe0 -#define bCCKRxRFSettle 0x1f //AGCsamp_dly -#define bCCKFixedRxAGC 0x8000 -//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 -#define bCCKAntennaPolarity 0x2000 -#define bCCKTxFilterType 0x0c00 -#define bCCKRxAGCReportType 0x0300 -#define bCCKRxDAGCEn 0x80000000 -#define bCCKRxDAGCPeriod 0x20000000 -#define bCCKRxDAGCSatLevel 0x1f000000 -#define bCCKTimingRecovery 0x800000 -#define bCCKTxC0 0x3f0000 -#define bCCKTxC1 0x3f000000 -#define bCCKTxC2 0x3f -#define bCCKTxC3 0x3f00 -#define bCCKTxC4 0x3f0000 -#define bCCKTxC5 0x3f000000 -#define bCCKTxC6 0x3f -#define bCCKTxC7 0x3f00 -#define bCCKDebugPort 0xff0000 -#define bCCKDACDebug 0x0f000000 -#define bCCKFalseAlarmEnable 0x8000 -#define bCCKFalseAlarmRead 0x4000 -#define bCCKTRSSI 0x7f -#define bCCKRxAGCReport 0xfe -#define bCCKRxReport_AntSel 0x80000000 -#define bCCKRxReport_MFOff 0x40000000 -#define bCCKRxRxReport_SQLoss 0x20000000 -#define bCCKRxReport_Pktloss 0x10000000 -#define bCCKRxReport_Lockedbit 0x08000000 -#define bCCKRxReport_RateError 0x04000000 -#define bCCKRxReport_RxRate 0x03000000 -#define bCCKRxFACounterLower 0xff -#define bCCKRxFACounterUpper 0xff000000 -#define bCCKRxHPAGCStart 0xe000 -#define bCCKRxHPAGCFinal 0x1c00 -#define bCCKRxFalseAlarmEnable 0x8000 -#define bCCKFACounterFreeze 0x4000 -#define bCCKTxPathSel 0x10000000 -#define bCCKDefaultRxPath 0xc000000 -#define bCCKOptionRxPath 0x3000000 - -// 5. PageC(0xC00) -#define bNumOfSTF 0x3 // Useless -#define bShift_L 0xc0 -#define bGI_TH 0xc -#define bRxPathA 0x1 -#define bRxPathB 0x2 -#define bRxPathC 0x4 -#define bRxPathD 0x8 -#define bTxPathA 0x1 -#define bTxPathB 0x2 -#define bTxPathC 0x4 -#define bTxPathD 0x8 -#define bTRSSIFreq 0x200 -#define bADCBackoff 0x3000 -#define bDFIRBackoff 0xc000 -#define bTRSSILatchPhase 0x10000 -#define bRxIDCOffset 0xff -#define bRxQDCOffset 0xff00 -#define bRxDFIRMode 0x1800000 -#define bRxDCNFType 0xe000000 -#define bRXIQImb_A 0x3ff -#define bRXIQImb_B 0xfc00 -#define bRXIQImb_C 0x3f0000 -#define bRXIQImb_D 0xffc00000 -#define bDC_dc_Notch 0x60000 -#define bRxNBINotch 0x1f000000 -#define bPD_TH 0xf -#define bPD_TH_Opt2 0xc000 -#define bPWED_TH 0x700 -#define bIfMF_Win_L 0x800 -#define bPD_Option 0x1000 -#define bMF_Win_L 0xe000 -#define bBW_Search_L 0x30000 -#define bwin_enh_L 0xc0000 -#define bBW_TH 0x700000 -#define bED_TH2 0x3800000 -#define bBW_option 0x4000000 -#define bRatio_TH 0x18000000 -#define bWindow_L 0xe0000000 -#define bSBD_Option 0x1 -#define bFrame_TH 0x1c -#define bFS_Option 0x60 -#define bDC_Slope_check 0x80 -#define bFGuard_Counter_DC_L 0xe00 -#define bFrame_Weight_Short 0x7000 -#define bSub_Tune 0xe00000 -#define bFrame_DC_Length 0xe000000 -#define bSBD_start_offset 0x30000000 -#define bFrame_TH_2 0x7 -#define bFrame_GI2_TH 0x38 -#define bGI2_Sync_en 0x40 -#define bSarch_Short_Early 0x300 -#define bSarch_Short_Late 0xc00 -#define bSarch_GI2_Late 0x70000 -#define bCFOAntSum 0x1 -#define bCFOAcc 0x2 -#define bCFOStartOffset 0xc -#define bCFOLookBack 0x70 -#define bCFOSumWeight 0x80 -#define bDAGCEnable 0x10000 -#define bTXIQImb_A 0x3ff -#define bTXIQImb_B 0xfc00 -#define bTXIQImb_C 0x3f0000 -#define bTXIQImb_D 0xffc00000 -#define bTxIDCOffset 0xff -#define bTxQDCOffset 0xff00 -#define bTxDFIRMode 0x10000 -#define bTxPesudoNoiseOn 0x4000000 -#define bTxPesudoNoise_A 0xff -#define bTxPesudoNoise_B 0xff00 -#define bTxPesudoNoise_C 0xff0000 -#define bTxPesudoNoise_D 0xff000000 -#define bCCADropOption 0x20000 -#define bCCADropThres 0xfff00000 -#define bEDCCA_H 0xf -#define bEDCCA_L 0xf0 -#define bLambda_ED 0x300 -#define bRxInitialGain 0x7f -#define bRxAntDivEn 0x80 -#define bRxAGCAddressForLNA 0x7f00 -#define bRxHighPowerFlow 0x8000 -#define bRxAGCFreezeThres 0xc0000 -#define bRxFreezeStep_AGC1 0x300000 -#define bRxFreezeStep_AGC2 0xc00000 -#define bRxFreezeStep_AGC3 0x3000000 -#define bRxFreezeStep_AGC0 0xc000000 -#define bRxRssi_Cmp_En 0x10000000 -#define bRxQuickAGCEn 0x20000000 -#define bRxAGCFreezeThresMode 0x40000000 -#define bRxOverFlowCheckType 0x80000000 -#define bRxAGCShift 0x7f -#define bTRSW_Tri_Only 0x80 -#define bPowerThres 0x300 -#define bRxAGCEn 0x1 -#define bRxAGCTogetherEn 0x2 -#define bRxAGCMin 0x4 -#define bRxHP_Ini 0x7 -#define bRxHP_TRLNA 0x70 -#define bRxHP_RSSI 0x700 -#define bRxHP_BBP1 0x7000 -#define bRxHP_BBP2 0x70000 -#define bRxHP_BBP3 0x700000 -#define bRSSI_H 0x7f0000 //the threshold for high power -#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity -#define bRxSettle_TRSW 0x7 -#define bRxSettle_LNA 0x38 -#define bRxSettle_RSSI 0x1c0 -#define bRxSettle_BBP 0xe00 -#define bRxSettle_RxHP 0x7000 -#define bRxSettle_AntSW_RSSI 0x38000 -#define bRxSettle_AntSW 0xc0000 -#define bRxProcessTime_DAGC 0x300000 -#define bRxSettle_HSSI 0x400000 -#define bRxProcessTime_BBPPW 0x800000 -#define bRxAntennaPowerShift 0x3000000 -#define bRSSITableSelect 0xc000000 -#define bRxHP_Final 0x7000000 -#define bRxHTSettle_BBP 0x7 -#define bRxHTSettle_HSSI 0x8 -#define bRxHTSettle_RxHP 0x70 -#define bRxHTSettle_BBPPW 0x80 -#define bRxHTSettle_Idle 0x300 -#define bRxHTSettle_Reserved 0x1c00 -#define bRxHTRxHPEn 0x8000 -#define bRxHTAGCFreezeThres 0x30000 -#define bRxHTAGCTogetherEn 0x40000 -#define bRxHTAGCMin 0x80000 -#define bRxHTAGCEn 0x100000 -#define bRxHTDAGCEn 0x200000 -#define bRxHTRxHP_BBP 0x1c00000 -#define bRxHTRxHP_Final 0xe0000000 -#define bRxPWRatioTH 0x3 -#define bRxPWRatioEn 0x4 -#define bRxMFHold 0x3800 -#define bRxPD_Delay_TH1 0x38 -#define bRxPD_Delay_TH2 0x1c0 -#define bRxPD_DC_COUNT_MAX 0x600 -//#define bRxMF_Hold 0x3800 -#define bRxPD_Delay_TH 0x8000 -#define bRxProcess_Delay 0xf0000 -#define bRxSearchrange_GI2_Early 0x700000 -#define bRxFrame_Guard_Counter_L 0x3800000 -#define bRxSGI_Guard_L 0xc000000 -#define bRxSGI_Search_L 0x30000000 -#define bRxSGI_TH 0xc0000000 -#define bDFSCnt0 0xff -#define bDFSCnt1 0xff00 -#define bDFSFlag 0xf0000 -#define bMFWeightSum 0x300000 -#define bMinIdxTH 0x7f000000 -#define bDAFormat 0x40000 -#define bTxChEmuEnable 0x01000000 -#define bTRSWIsolation_A 0x7f -#define bTRSWIsolation_B 0x7f00 -#define bTRSWIsolation_C 0x7f0000 -#define bTRSWIsolation_D 0x7f000000 -#define bExtLNAGain 0x7c00 - -// 6. PageE(0xE00) -#define bSTBCEn 0x4 // Useless -#define bAntennaMapping 0x10 -#define bNss 0x20 -#define bCFOAntSumD 0x200 -#define bPHYCounterReset 0x8000000 -#define bCFOReportGet 0x4000000 -#define bOFDMContinueTx 0x10000000 -#define bOFDMSingleCarrier 0x20000000 -#define bOFDMSingleTone 0x40000000 -//#define bRxPath1 0x01 -//#define bRxPath2 0x02 -//#define bRxPath3 0x04 -//#define bRxPath4 0x08 -//#define bTxPath1 0x10 -//#define bTxPath2 0x20 -#define bHTDetect 0x100 -#define bCFOEn 0x10000 -#define bCFOValue 0xfff00000 -#define bSigTone_Re 0x3f -#define bSigTone_Im 0x7f00 -#define bCounter_CCA 0xffff -#define bCounter_ParityFail 0xffff0000 -#define bCounter_RateIllegal 0xffff -#define bCounter_CRC8Fail 0xffff0000 -#define bCounter_MCSNoSupport 0xffff -#define bCounter_FastSync 0xffff -#define bShortCFO 0xfff -#define bShortCFOTLength 12 //total -#define bShortCFOFLength 11 //fraction -#define bLongCFO 0x7ff -#define bLongCFOTLength 11 -#define bLongCFOFLength 11 -#define bTailCFO 0x1fff -#define bTailCFOTLength 13 -#define bTailCFOFLength 12 -#define bmax_en_pwdB 0xffff -#define bCC_power_dB 0xffff0000 -#define bnoise_pwdB 0xffff -#define bPowerMeasTLength 10 -#define bPowerMeasFLength 3 -#define bRx_HT_BW 0x1 -#define bRxSC 0x6 -#define bRx_HT 0x8 -#define bNB_intf_det_on 0x1 -#define bIntf_win_len_cfg 0x30 -#define bNB_Intf_TH_cfg 0x1c0 -#define bRFGain 0x3f -#define bTableSel 0x40 -#define bTRSW 0x80 -#define bRxSNR_A 0xff -#define bRxSNR_B 0xff00 -#define bRxSNR_C 0xff0000 -#define bRxSNR_D 0xff000000 -#define bSNREVMTLength 8 -#define bSNREVMFLength 1 -#define bCSI1st 0xff -#define bCSI2nd 0xff00 -#define bRxEVM1st 0xff0000 -#define bRxEVM2nd 0xff000000 -#define bSIGEVM 0xff -#define bPWDB 0xff00 -#define bSGIEN 0x10000 - -#define bSFactorQAM1 0xf // Useless -#define bSFactorQAM2 0xf0 -#define bSFactorQAM3 0xf00 -#define bSFactorQAM4 0xf000 -#define bSFactorQAM5 0xf0000 -#define bSFactorQAM6 0xf0000 -#define bSFactorQAM7 0xf00000 -#define bSFactorQAM8 0xf000000 -#define bSFactorQAM9 0xf0000000 -#define bCSIScheme 0x100000 - -#define bNoiseLvlTopSet 0x3 // Useless -#define bChSmooth 0x4 -#define bChSmoothCfg1 0x38 -#define bChSmoothCfg2 0x1c0 -#define bChSmoothCfg3 0xe00 -#define bChSmoothCfg4 0x7000 -#define bMRCMode 0x800000 -#define bTHEVMCfg 0x7000000 - -#define bLoopFitType 0x1 // Useless -#define bUpdCFO 0x40 -#define bUpdCFOOffData 0x80 -#define bAdvUpdCFO 0x100 -#define bAdvTimeCtrl 0x800 -#define bUpdClko 0x1000 -#define bFC 0x6000 -#define bTrackingMode 0x8000 -#define bPhCmpEnable 0x10000 -#define bUpdClkoLTF 0x20000 -#define bComChCFO 0x40000 -#define bCSIEstiMode 0x80000 -#define bAdvUpdEqz 0x100000 -#define bUChCfg 0x7000000 -#define bUpdEqz 0x8000000 - -//Rx Pseduo noise -#define bRxPesudoNoiseOn 0x20000000 // Useless -#define bRxPesudoNoise_A 0xff -#define bRxPesudoNoise_B 0xff00 -#define bRxPesudoNoise_C 0xff0000 -#define bRxPesudoNoise_D 0xff000000 -#define bPesudoNoiseState_A 0xffff -#define bPesudoNoiseState_B 0xffff0000 -#define bPesudoNoiseState_C 0xffff -#define bPesudoNoiseState_D 0xffff0000 - -//7. RF Register -//Zebra1 -#define bZebra1_HSSIEnable 0x8 // Useless -#define bZebra1_TRxControl 0xc00 -#define bZebra1_TRxGainSetting 0x07f -#define bZebra1_RxCorner 0xc00 -#define bZebra1_TxChargePump 0x38 -#define bZebra1_RxChargePump 0x7 -#define bZebra1_ChannelNum 0xf80 -#define bZebra1_TxLPFBW 0x400 -#define bZebra1_RxLPFBW 0x600 - -//Zebra4 -#define bRTL8256RegModeCtrl1 0x100 // Useless -#define bRTL8256RegModeCtrl0 0x40 -#define bRTL8256_TxLPFBW 0x18 -#define bRTL8256_RxLPFBW 0x600 - -//RTL8258 -#define bRTL8258_TxLPFBW 0xc // Useless -#define bRTL8258_RxLPFBW 0xc00 -#define bRTL8258_RSSILPFBW 0xc0 - - -// -// Other Definition -// - -//byte endable for sb_write -#define bByte0 0x1 // Useless -#define bByte1 0x2 -#define bByte2 0x4 -#define bByte3 0x8 -#define bWord0 0x3 -#define bWord1 0xc -#define bDWord 0xf - -//for PutRegsetting & GetRegSetting BitMask -#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f -#define bMaskByte1 0xff00 -#define bMaskByte2 0xff0000 -#define bMaskByte3 0xff000000 -#define bMaskHWord 0xffff0000 -#define bMaskLWord 0x0000ffff -#define bMaskDWord 0xffffffff -#define bMaskH3Bytes 0xffffff00 -#define bMask12Bits 0xfff -#define bMaskH4Bits 0xf0000000 -#define bMaskOFDM_D 0xffc00000 -#define bMaskCCK 0x3f3f3f3f - - -#define bEnable 0x1 // Useless -#define bDisable 0x0 - -#define LeftAntenna 0x0 // Useless -#define RightAntenna 0x1 - -#define tCheckTxStatus 500 //500ms // Useless -#define tUpdateRxCounter 100 //100ms - -#define rateCCK 0 // Useless -#define rateOFDM 1 -#define rateHT 2 - -//define Register-End -#define bPMAC_End 0x1ff // Useless -#define bFPGAPHY0_End 0x8ff -#define bFPGAPHY1_End 0x9ff -#define bCCKPHY0_End 0xaff -#define bOFDMPHY0_End 0xcff -#define bOFDMPHY1_End 0xdff - -//define max debug item in each debug page -//#define bMaxItem_FPGA_PHY0 0x9 -//#define bMaxItem_FPGA_PHY1 0x3 -//#define bMaxItem_PHY_11B 0x16 -//#define bMaxItem_OFDM_PHY0 0x29 -//#define bMaxItem_OFDM_PHY1 0x0 - -#define bPMACControl 0x0 // Useless -#define bWMACControl 0x1 -#define bWNICControl 0x2 - -#define PathA 0x0 // Useless -#define PathB 0x1 -#define PathC 0x2 -#define PathD 0x3 - -/*--------------------------Define Parameters-------------------------------*/ - - -#endif //__INC_HAL8192SPHYREG_H - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/Hal8723BPhyReg.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/Hal8723BPhyReg.h index a9b006e2dd81..ff444b275454 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/Hal8723BPhyReg.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/Hal8723BPhyReg.h @@ -20,16 +20,154 @@ #ifndef __INC_HAL8723BPHYREG_H__ #define __INC_HAL8723BPHYREG_H__ -#include +#define rSYM_WLBT_PAPE_SEL 0x64 +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c + +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 // Useless now +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now -// BB Register Definition // // 4. Page9(0x900) // -#define rDPDT_control 0x92c -#define rfe_ctrl_anta_src 0x930 -#define rS0S1_PathSwitch 0x948 -#define AGC_table_select 0xb2c +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? +#define rDPDT_control 0x92c +#define rfe_ctrl_anta_src 0x930 +#define rS0S1_PathSwitch 0x948 + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c // // PageB(0xB00) @@ -78,6 +216,922 @@ #define rPm_Rx1_AntB 0xbf0 #define rPm_Rx2_AntB 0xbf4 #define rPm_Rx3_AntB 0xbf8 +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rFPGA0_IQK 0xe28 +#define rTx_IQK_Tone_A 0xe30 +#define rRx_IQK_Tone_A 0xe34 +#define rTx_IQK_PI_A 0xe38 +#define rRx_IQK_PI_A 0xe3c + +#define rTx_IQK 0xe40 +#define rRx_IQK 0xe44 +#define rIQK_AGC_Pts 0xe48 +#define rIQK_AGC_Rsp 0xe4c +#define rTx_IQK_Tone_B 0xe50 +#define rRx_IQK_Tone_B 0xe54 +#define rTx_IQK_PI_B 0xe58 +#define rRx_IQK_PI_B 0xe5c +#define rIQK_AGC_Cont 0xe60 + +#define rBlue_Tooth 0xe6c +#define rRx_Wait_CCA 0xe70 +#define rTx_CCK_RFON 0xe74 +#define rTx_CCK_BBON 0xe78 +#define rTx_OFDM_RFON 0xe7c +#define rTx_OFDM_BBON 0xe80 +#define rTx_To_Rx 0xe84 +#define rTx_To_Tx 0xe88 +#define rRx_CCK 0xe8c + +#define rTx_Power_Before_IQK_A 0xe94 +#define rTx_Power_After_IQK_A 0xe9c + +#define rRx_Power_Before_IQK_A 0xea0 +#define rRx_Power_Before_IQK_A_2 0xea4 +#define rRx_Power_After_IQK_A 0xea8 +#define rRx_Power_After_IQK_A_2 0xeac + +#define rTx_Power_Before_IQK_B 0xeb4 +#define rTx_Power_After_IQK_B 0xebc + +#define rRx_Power_Before_IQK_B 0xec0 +#define rRx_Power_Before_IQK_B_2 0xec4 +#define rRx_Power_After_IQK_B 0xec8 +#define rRx_Power_After_IQK_B_2 0xecc + +#define rRx_OFDM 0xed0 +#define rRx_Wait_RIFS 0xed4 +#define rRx_TO_Rx 0xed8 +#define rStandby 0xedc +#define rSleep 0xee0 +#define rPMPD_ANAEN 0xeec + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // +#define RF_BS_PA_APSET_G1_G4 0x03 +#define RF_BS_PA_APSET_G5_G8 0x04 +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_IPA_G 0x09 // +#define RF_TXBIAS_G 0x0A +#define RF_TXPA_AG 0x0B +#define RF_IPA_A 0x0C // +#define RF_TXBIAS_A 0x0D +#define RF_BS_PA_APSET_G9_G11 0x0E +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_TXBIAS 0x16 // +#define RF_POW_ABILITY 0x17 // +#define RF_MODE_AG 0x18 // +#define rRfChannel 0x18 // RF channel and BW switch +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +#define RF_T_METER 0x24 // + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control + +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control +#define RF_TX_BIAS_A 0x35 +#define RF_TX_BIAS_D 0x36 +#define RF_LOBF_9 0x38 +#define RF_RXRF_A3 0x3C // +#define RF_TRSW 0x3F + +#define RF_TXRF_A2 0x41 +#define RF_TXPA_G4 0x46 +#define RF_TXPA_A4 0x4B +#define RF_0x52 0x52 +#define RF_WE_LUT 0xEF +#define RF_S0S1 0xB0 + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMaskH3Bytes 0xffffff00 +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/HalVerDef.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/HalVerDef.h index ce30c4a3027d..0e94ed2f2dad 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/HalVerDef.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/HalVerDef.h @@ -36,6 +36,7 @@ typedef enum tag_HAL_IC_Type_Definition CHIP_8821 = 7, CHIP_8723B = 8, CHIP_8192E = 9, + CHIP_8814A = 10, }HAL_IC_TYPE_E; //HAL_CHIP_TYPE_E @@ -109,13 +110,17 @@ typedef struct tag_HAL_VERSION //HAL_VERSION VersionID // HAL_IC_TYPE_E +#if 0 #define IS_81XXC(version) (((GET_CVID_IC_TYPE(version) == CHIP_8192C)||(GET_CVID_IC_TYPE(version) == CHIP_8188C))? TRUE : FALSE) #define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723A)? TRUE : FALSE) #define IS_92D(version) ((GET_CVID_IC_TYPE(version) == CHIP_8192D)? TRUE : FALSE) +#endif + #define IS_8188E(version) ((GET_CVID_IC_TYPE(version) == CHIP_8188E)? TRUE : FALSE) #define IS_8192E(version) ((GET_CVID_IC_TYPE(version) == CHIP_8192E)? TRUE : FALSE) #define IS_8812_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8812)? TRUE : FALSE) #define IS_8821_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8821)? TRUE : FALSE) +#define IS_8814A_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8814A) ? TRUE : FALSE) #define IS_8723B_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723B)? TRUE : FALSE) @@ -129,6 +134,7 @@ typedef struct tag_HAL_VERSION #define IS_C_CUT(version) ((GET_CVID_CUT_VERSION(version) == C_CUT_VERSION) ? TRUE : FALSE) #define IS_D_CUT(version) ((GET_CVID_CUT_VERSION(version) == D_CUT_VERSION) ? TRUE : FALSE) #define IS_E_CUT(version) ((GET_CVID_CUT_VERSION(version) == E_CUT_VERSION) ? TRUE : FALSE) +#define IS_F_CUT(version) ((GET_CVID_CUT_VERSION(version) == F_CUT_VERSION) ? TRUE : FALSE) #define IS_I_CUT(version) ((GET_CVID_CUT_VERSION(version) == I_CUT_VERSION) ? TRUE : FALSE) #define IS_J_CUT(version) ((GET_CVID_CUT_VERSION(version) == J_CUT_VERSION) ? TRUE : FALSE) #define IS_K_CUT(version) ((GET_CVID_CUT_VERSION(version) == K_CUT_VERSION) ? TRUE : FALSE) @@ -142,11 +148,16 @@ typedef struct tag_HAL_VERSION #define IS_1T1R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T1R)? TRUE : FALSE ) #define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)? TRUE : FALSE) #define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)? TRUE : FALSE) +#define IS_3T3R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_3T3R)? TRUE : FALSE) +#define IS_3T4R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_3T4R)? TRUE : FALSE) +#define IS_4T4R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_4T4R)? TRUE : FALSE) + //---------------------------------------------------------------------------- //Chip version Macro. -- //---------------------------------------------------------------------------- +#if 0 #define IS_81XXC_TEST_CHIP(version) ((IS_81XXC(version) && (!IS_NORMAL_CHIP(version)))? TRUE: FALSE) #define IS_92C_SERIAL(version) ((IS_81XXC(version) && IS_2T2R(version)) ? TRUE : FALSE) @@ -163,6 +174,7 @@ typedef struct tag_HAL_VERSION #define IS_8723A_A_CUT(version) ((IS_8723_SERIES(version)) ? ( IS_A_CUT(version)?TRUE : FALSE) : FALSE) #define IS_8723A_B_CUT(version) ((IS_8723_SERIES(version)) ? ( IS_B_CUT(version)?TRUE : FALSE) : FALSE) +#endif #define IS_VENDOR_8188E_I_CUT_SERIES(_Adapter) ((IS_8188E(GET_HAL_DATA(_Adapter)->VersionID)) ? ((GET_CVID_CUT_VERSION(GET_HAL_DATA(_Adapter)->VersionID) >= I_CUT_VERSION) ? TRUE : FALSE) : FALSE) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/autoconf.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/autoconf.h index a99eae1d11ef..b858573725bb 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/autoconf.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/autoconf.h @@ -61,7 +61,6 @@ #define CONFIG_HOSTAPD_MLME #endif //#define CONFIG_FIND_BEST_CHANNEL - //#define CONFIG_NO_WIRELESS_HANDLERS #define CONFIG_TX_MCAST2UNI // Support IP multicast->unicast //#define CONFIG_AUTO_AP_MODE @@ -73,9 +72,8 @@ //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_P2P_REMOVE_GROUP_INFO + //#define CONFIG_DBG_P2P #define CONFIG_P2P_PS //#define CONFIG_P2P_IPS @@ -85,13 +83,14 @@ #endif // Added by Kurt 20110511 -//#define CONFIG_TDLS #ifdef CONFIG_TDLS + #define CONFIG_TDLS_DRIVER_SETUP // #ifndef CONFIG_WFD // #define CONFIG_WFD // #endif // #define CONFIG_TDLS_AUTOSETUP -// #define CONFIG_TDLS_AUTOCHECKALIVE + #define CONFIG_TDLS_AUTOCHECKALIVE + #define CONFIG_TDLS_CH_SW /* Enable "CONFIG_TDLS_CH_SW" by default, however limit it to only work in wifi logo test mode but not in normal mode currently */ #endif //#define CONFIG_CONCURRENT_MODE // Set from Makefile @@ -138,19 +137,11 @@ #define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */ -//#define CONFIG_IOL -#ifdef CONFIG_IOL - #define CONFIG_IOL_READ_EFUSE_MAP - //#define DBG_IOL_READ_EFUSE_MAP - #define CONFIG_IOL_LLT -#endif - - /* * Interface Related Config */ #define CONFIG_USB_TX_AGGREGATION -//#define CONFIG_USB_RX_AGGREGATION +#define CONFIG_USB_RX_AGGREGATION #define USB_INTERFERENCE_ISSUE // this should be checked in all usb interface @@ -189,8 +180,6 @@ */ #define CONFIG_SKB_COPY //for amsdu -#define CONFIG_PREALLOC_RECV_SKB - //#define CONFIG_EASY_REPLACEMENT //#define CONFIG_ADAPTOR_INFO_CACHING_FILE // now just applied on 8192cu only, should make it general... @@ -214,9 +203,6 @@ #define CONFIG_LONG_DELAY_ISSUE #define CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR -// Android L(5.0) support -#define CONFIG_RADIO_WORK - /* * Auto Config Section @@ -275,7 +261,6 @@ #ifndef WAKEUP_GPIO_IDX #define WAKEUP_GPIO_IDX 14 // WIFI Chip Side #endif // !WAKEUP_GPIO_IDX - #define CONFIG_GPIO_WAKEUP_LOW_ACTIVE // mark this for HIGH active #endif // CONFIG_GPIO_WAKEUP #ifdef CONFIG_AP_MODE @@ -290,10 +275,11 @@ #endif // CONFIG_AP_MODE #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX - #undef CONFIG_PREALLOC_RECV_SKB + #else + #define CONFIG_PREALLOC_RECV_SKB #ifdef CONFIG_PREALLOC_RECV_SKB -// #define CONFIG_FIX_NR_BULKIN_BUFFER // only use USB prealloc_recv_buffer, no use alloc_skb() + //#define CONFIG_FIX_NR_BULKIN_BUFFER /* only use PREALLOC_RECV_SKB buffer, don't alloc skb at runtime */ #endif #endif @@ -311,21 +297,7 @@ */ #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 RTL8723AS_SUPPORT 0 -#define RTL8723AU_SUPPORT 0 -#define RTL8723AE_SUPPORT 0 -#define RTL8723A_SUPPORT (RTL8723AU_SUPPORT|RTL8723AS_SUPPORT|RTL8723AE_SUPPORT) -#define RTL8723_FPGA_VERIFICATION 0 - + #define RTL8188E_SUPPORT 0 #define RTL8812A_SUPPORT 0 #define RTL8821A_SUPPORT 0 diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/basic_types.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/basic_types.h index 28ba763ba5a2..6f98c1af231d 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/basic_types.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/basic_types.h @@ -76,7 +76,7 @@ #ifdef PLATFORM_LINUX - + #include #include #define IN #define OUT @@ -96,6 +96,10 @@ #define UINT u32 #define ULONG u32 + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)) + typedef _Bool bool; + #endif + typedef void (*proc_t)(void*); typedef __kernel_size_t SIZE_T; @@ -268,7 +272,7 @@ ( \ LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ & \ - ( ~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \ + (u16)(~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen))\ ) #define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \ @@ -299,7 +303,7 @@ ( \ LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ & \ - ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \ + (u8)(~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen))\ ) #define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \ @@ -330,14 +334,14 @@ ) #define SET_BITS_TO_LE_1BYTE_8BIT(__pStart, __BitOffset, __BitLen, __Value) \ -{ \ +do { \ *((u8 *)(__pStart)) = \ EF1Byte( \ LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \ | \ ((u8)__Value) \ ); \ -} +} while (0) // Get the N-bytes aligment offset from the current length #define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment)) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_conf.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_conf.h index b93d60db9449..944834b3b38b 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_conf.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_conf.h @@ -92,8 +92,12 @@ #define CONFIG_RTW_ADAPTIVITY_MODE 0 #endif -#ifndef CONFIG_RTW_NHM_EN - #define CONFIG_RTW_NHM_EN 0 +#ifndef CONFIG_RTW_ADAPTIVITY_DML + #define CONFIG_RTW_ADAPTIVITY_DML 0 +#endif + +#ifndef CONFIG_RTW_ADAPTIVITY_DC_BACKOFF + #define CONFIG_RTW_ADAPTIVITY_DC_BACKOFF 2 #endif #ifndef CONFIG_RTW_AMPLIFIER_TYPE_2G @@ -107,6 +111,7 @@ #define MACID_NUM_SW_LIMIT 32 #define CAM_ENTRY_NUM_SW_LIMIT 32 +/*#define CONFIG_WEXT_DONT_JOIN_BYSSID */ //#include #endif // __DRV_CONF_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_types.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_types.h index ea6ce92aff08..352a84df789a 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_types.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_types.h @@ -153,6 +153,10 @@ typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER; #include +#ifdef CONFIG_BT_COEXIST +#include +#endif // CONFIG_BT_COEXIST + #define SPEC_DEV_ID_NONE BIT(0) #define SPEC_DEV_ID_DISABLE_HT BIT(1) #define SPEC_DEV_ID_ENABLE_PS BIT(2) @@ -263,6 +267,8 @@ struct registry_priv u8 antdiv_cfg; u8 antdiv_type; + + u8 switch_usb3; u8 usbss_enable;//0:disable,1:enable u8 hwpdn_mode;//0:disable,1:enable,2:decide by EFUSE config @@ -282,10 +288,6 @@ struct registry_priv u8 fw_iol; //enable iol without other concern #endif -#ifdef CONFIG_DUALMAC_CONCURRENT - u8 dmsp;//0:disable,1:enable -#endif - #ifdef CONFIG_80211D u8 enable80211d; #endif @@ -312,7 +314,8 @@ struct registry_priv u8 bEn_RFE; u8 RFE_Type; u8 check_fw_ps; - + u8 RegRfKFreeEnable; + #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE u8 load_phy_file; u8 RegDecryptCustomFile; @@ -326,7 +329,10 @@ struct registry_priv u8 hiq_filter; u8 adaptivity_en; u8 adaptivity_mode; - u8 nhm_en; + u8 adaptivity_dml; + u8 adaptivity_dc_backoff; + u8 boffefusemask; + BOOLEAN bFileMaskEfuse; }; @@ -543,6 +549,7 @@ struct debug_priv { u64 dbg_rx_ampdu_loss_count; u64 dbg_rx_dup_mgt_frame_drop_count; u64 dbg_rx_ampdu_window_shift_cnt; + u64 dbg_rx_conflic_mac_addr_cnt; }; struct rtw_traffic_statistics { @@ -851,8 +858,8 @@ struct _ADAPTER{ struct sta_priv stapriv; struct security_priv securitypriv; _lock security_key_mutex; // add for CONFIG_IEEE80211W, none 11w also can use - struct registry_priv registrypriv; - struct eeprom_priv eeprompriv; + struct registry_priv registrypriv; + struct led_priv ledpriv; #ifdef CONFIG_MP_INCLUDED @@ -891,6 +898,12 @@ struct _ADAPTER{ struct wifi_display_info wfd_info; #endif //CONFIG_WFD +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + struct bt_coex_info coex_info; +#endif //CONFIG_BT_COEXIST_SOCKET_TRX + + ERROR_CODE LastError; /* <20130613, Kordan> Only the functions associated with MP records the error code by now. */ + PVOID HalData; u32 hal_data_sz; struct hal_ops HalFunc; @@ -909,6 +922,11 @@ struct _ADAPTER{ u8 bHaltInProgress; #ifdef CONFIG_GPIO_API u8 pre_gpio_pin; + struct gpio_int_priv { + u8 interrupt_mode; + u8 interrupt_enable_mask; + void (*callback[8])(u8 level); + }gpiointpriv; #endif _thread_hdl_ cmdThread; _thread_hdl_ evtThread; @@ -970,6 +988,7 @@ struct _ADAPTER{ int bup; _lock glock; #endif //PLATFORM_FREEBSD + u8 mac_addr[ETH_ALEN]; int net_closed; u8 netif_up; @@ -998,7 +1017,7 @@ struct _ADAPTER{ //for PRIMARY_ADAPTER(IFACE_ID0) can directly refer to if1 in struct dvobj_priv _adapter *pbuddy_adapter; -#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT) +#if defined(CONFIG_CONCURRENT_MODE) u8 isprimary; //is primary adapter or not //notes: // if isprimary is true, the adapter_type value is 0, iface_id is IFACE_ID0 for PRIMARY_ADAPTER @@ -1006,17 +1025,13 @@ struct _ADAPTER{ // refer to iface_id if iface_nums>2 and isprimary is false and the adapter_type value is 0xff. u8 adapter_type;//used only in two inteface case(PRIMARY_ADAPTER and SECONDARY_ADAPTER) . u8 iface_type; //interface port type, it depends on HW port -#endif //CONFIG_CONCURRENT_MODE || CONFIG_DUALMAC_CONCURRENT +#endif //CONFIG_CONCURRENT_MODE //extend to support multi interface //IFACE_ID0 is equals to PRIMARY_ADAPTER //IFACE_ID1 is equals to SECONDARY_ADAPTER u8 iface_id; -#ifdef CONFIG_DUALMAC_CONCURRENT - u8 DualMacConcurrent; // 1: DMSP 0:DMDP -#endif - #ifdef CONFIG_BR_EXT _lock br_ext_lock; //unsigned int macclone_completed; @@ -1050,9 +1065,16 @@ struct _ADAPTER{ 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 + u8 fix_rx_ampdu_accept; + u8 fix_rx_ampdu_size; /* 0~127, TODO:consider each sta and each TID */ unsigned char in_cta_test; +#ifdef DBG_RX_COUNTER_DUMP + u8 dump_rx_cnt_mode;/*BIT0:drv,BIT1:mac,BIT2:phy*/ + u32 drv_rx_cnt_ok; + u32 drv_rx_cnt_crcerror; + u32 drv_rx_cnt_drop; +#endif #ifdef CONFIG_DBG_COUNTER struct rx_logs rx_logs; @@ -1064,6 +1086,7 @@ struct _ADAPTER{ #define adapter_to_dvobj(adapter) (adapter->dvobj) #define adapter_to_pwrctl(adapter) (dvobj_to_pwrctl(adapter->dvobj)) #define adapter_wdev_data(adapter) (&((adapter)->wdev_data)) +#define adapter_mac_addr(adapter) (adapter->mac_addr) // // Function disabled. @@ -1104,8 +1127,6 @@ __inline static void RTW_ENABLE_FUNC(_adapter*padapter, int func_bit) (padapter)->bSurpriseRemoved || \ RTW_IS_FUNC_DISABLED((padapter), DF_TX_BIT)) -int rtw_handle_dualmac(_adapter *adapter, bool init); - #ifdef CONFIG_PNO_SUPPORT int rtw_parse_ssid_list_tlv(char** list_str, pno_ssid_t* ssid, int max, int *bytes_left); int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num, @@ -1120,11 +1141,6 @@ 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); -} - // HCI Related header file #ifdef CONFIG_USB_HCI #include @@ -1150,9 +1166,5 @@ __inline static u8 *myid(struct eeprom_priv *peepriv) #include #endif -#ifdef CONFIG_BT_COEXIST -#include -#endif // CONFIG_BT_COEXIST - #endif //__DRV_TYPES_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_btcoex.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_btcoex.h index 84aa63ac49bf..0deb3993d818 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_btcoex.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_btcoex.h @@ -63,6 +63,7 @@ void hal_btcoex_SwitchBtTRxMask(PADAPTER padapter); void hal_btcoex_Hanlder(PADAPTER padapter); +s32 hal_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter); s32 hal_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER padapter); u32 hal_btcoex_GetAMPDUSize(PADAPTER padapter); void hal_btcoex_SetManualControl(PADAPTER padapter, u8 bmanual); @@ -78,6 +79,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_SetBtPatchVersion(PADAPTER,u16 btHciVer,u16 btPatchVer); +void hal_btcoex_SetHciVersion(PADAPTER, u16 hciVersion); +void hal_btcoex_SendScanNotify(PADAPTER, u8 type); +void hal_btcoex_StackUpdateProfileInfo(void); 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); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com.h index 6cb7f717328e..5c509da5044e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com.h @@ -214,11 +214,32 @@ typedef enum _FIRMWARE_SOURCE { #define PageNum_512(_Len) (u32)(((_Len)>>9) + ((_Len)&0x1FF ? 1:0)) #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); +struct dbg_rx_counter +{ + u32 rx_pkt_ok; + u32 rx_pkt_crc_error; + u32 rx_pkt_drop; + u32 rx_ofdm_fa; + u32 rx_cck_fa; + u32 rx_ht_fa; +}; +void rtw_dump_mac_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter); +void rtw_dump_phy_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter); +void rtw_reset_mac_rx_counters(_adapter* padapter); +void rtw_reset_phy_rx_counters(_adapter* padapter); + +#ifdef DBG_RX_COUNTER_DUMP +#define DUMP_DRV_RX_COUNTER BIT0 +#define DUMP_MAC_RX_COUNTER BIT1 +#define DUMP_PHY_RX_COUNTER BIT2 +#define DUMP_DRV_TRX_COUNTER_DATA BIT3 + +void rtw_dump_phy_rxcnts_preprocess(_adapter* padapter,u8 rx_cnt_mode); +void rtw_dump_rx_counters(_adapter* padapter); +#endif void dump_chip_info(HAL_VERSION ChipVersion); +void rtw_hal_config_rftype(PADAPTER padapter); u8 //return the final channel plan decision hal_com_config_channel_plan( @@ -342,10 +363,11 @@ void rtw_dump_raw_rssi_info(_adapter *padapter); 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 +int check_phy_efuse_tx_power_info_valid(PADAPTER padapter); + #ifdef CONFIG_RF_GAIN_OFFSET void rtw_bb_rf_gain_offset(_adapter *padapter); #endif //CONFIG_RF_GAIN_OFFSET @@ -372,15 +394,17 @@ struct noise_info u8 chan; }; #endif +void rtw_get_noise(_adapter* padapter); + +void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished); +void rtw_hal_set_AP_fw_rsvd_page(_adapter *padapter , 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_GPIO_WAKEUP -void rtw_clear_hostwakeupgpio(PADAPTER padapter); +int rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, bool isHigh); +int rtw_hal_config_gpio(_adapter* adapter, u8 gpio_num, bool isOutput); +int rtw_hal_register_gpio_interrupt(_adapter* adapter, int gpio_num, void(*callback)(u8 level)); +int rtw_hal_disable_gpio_interrupt(_adapter* adapter, int gpio_num); #endif #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE @@ -389,5 +413,12 @@ extern char file_path[PATH_LENGTH_MAX]; #define GetLineFromBuffer(buffer) strsep(&buffer, "\n") #endif +#ifdef CONFIG_FW_C2H_DEBUG +void Debug_FwC2H(PADAPTER padapter, u8 *pdata, u8 len); +#endif +/*CONFIG_FW_C2H_DEBUG*/ + +void update_IOT_info(_adapter *padapter); + #endif //__HAL_COMMON_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_h2c.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_h2c.h index 8ad82f63d482..609cafbca2e8 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_h2c.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_h2c.h @@ -51,11 +51,18 @@ enum h2c_cmd{ H2C_FWLPS_IN_IPS_ = 0x28, //Dynamic Mechanism Class: 010 - H2C_MACID_CFG = 0x40, + H2C_MACID_CFG = 0x40, H2C_TXBF = 0x41, H2C_RSSI_SETTING = 0x42, H2C_AP_REQ_TXRPT = 0x43, H2C_INIT_RATE_COLLECT = 0x44, + H2C_IQ_CALIBRATION = 0x45, + + H2C_RA_MASK_3SS = 0x46,/* for 8814A */ + H2C_RA_PARA_ADJUST = 0x47,/* CONFIG_RA_DBG_CMD */ + H2C_DYNAMIC_TX_PATH = 0x48,/* for 8814A */ + + H2C_FW_TRACE_EN = 0x49, //BT Class: 011 H2C_B_TYPE_TDMA = 0x60, @@ -113,7 +120,7 @@ enum h2c_cmd{ #define H2C_P2PRSVDPAGE_LOC_LEN 5 #define H2C_P2P_OFFLOAD_LEN 3 -#ifdef CONFIG_WOWLAN +#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_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 ) #define cpMacAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5]) #define cpIpAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3]) @@ -225,8 +232,8 @@ enum h2c_cmd{ #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((__pH2CCmd)+3, 1, 7, __Value) -#define SET_H2CCMD_WOWLAN_LOWPR_RX(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 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) @@ -236,7 +243,9 @@ enum h2c_cmd{ #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_NBNS_FILTER_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 2, 1, __Value) #define SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 1, __Value) +#define SET_H2CCMD_REMOTE_WAKE_CTRL_FW_PARSING_UNTIL_WAKEUP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 4, 1, __Value) // AOAC_GLOBAL_INFO_0x82 #define SET_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value) @@ -258,6 +267,7 @@ enum h2c_cmd{ #ifdef CONFIG_PNO_SUPPORT // D0_Scan_Offload_Info_0x86 #define SET_H2CCMD_AOAC_NLO_FUN_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd), 3, 1, __Value) +#define SET_H2CCMD_AOAC_NLO_IPS_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd), 4, 1, __Value) #define SET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value) #define SET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value) #define SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value) @@ -311,18 +321,13 @@ typedef struct _RSVDPAGE_LOC { #endif void dump_TX_FIFO(PADAPTER padapter, u8 page_num, u16 page_size); -u8 rtw_check_invalid_mac_address (u8 *mac_addr); u8 rtw_hal_set_fw_media_status_cmd(_adapter* adapter, u8 mstatus, u8 macid); #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip); void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr); void rtw_set_sec_pn(_adapter *padapter); -void rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen, - u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame); - //WOW command function -u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable); void rtw_hal_set_fw_wow_related_cmd(_adapter* padapter, u8 enable); #ifdef CONFIG_P2P_WOWLAN //H2C 0x8A diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_led.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_led.h index e03c692fd044..79e62c6e58f1 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_led.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_led.h @@ -264,7 +264,8 @@ typedef struct _LED_USB{ _timer BlinkTimer; // Timer object for led blinking. - _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED. + _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED.' + ATOMIC_T bCancelWorkItem; //check if WorkItem is cancelled } LED_USB, *PLED_USB; typedef struct _LED_USB LED_DATA, *PLED_DATA; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_reg.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_reg.h index 6a0faf00c4ab..78937442b50a 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_reg.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_reg.h @@ -43,6 +43,7 @@ #define REG_SYS_FUNC_EN 0x0002 #define REG_APS_FSMCO 0x0004 #define REG_SYS_CLKR 0x0008 +#define REG_SYS_CLK_CTRL REG_SYS_CLKR #define REG_9346CR 0x000A #define REG_SYS_EEPROM_CTRL 0x000A #define REG_EE_VPD 0x000C @@ -1211,6 +1212,7 @@ Current IOREG MAP #define RFINI_RDY BIT(5) #define WINTINI_RDY BIT(6) #define RAM_DL_SEL BIT(7) +#define CPU_DL_READY BIT(15) /* add flag by gw for fw download ready 20130826 */ #define ROM_DLEN BIT(19) #define CPRST BIT(23) @@ -1762,6 +1764,7 @@ Current IOREG MAP // GPIO BIT +#define HAL_8812A_HW_GPIO_WPS_BIT BIT2 #define HAL_8192C_HW_GPIO_WPS_BIT BIT2 #define HAL_8192EU_HW_GPIO_WPS_BIT BIT7 #define HAL_8188E_HW_GPIO_WPS_BIT BIT7 diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_data.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_data.h index ac6007e8977e..a91086655a46 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_data.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_data.h @@ -75,22 +75,6 @@ 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, @@ -134,14 +118,6 @@ typedef enum _RT_AMPDU_BRUST_MODE{ //#define HP_THERMAL_NUM 8 //###### duplicate code,will move to ODM ######### -#if defined(CONFIG_RTL8192D) || defined(CONFIG_BT_COEXIST) -typedef enum _MACPHY_MODE_8192D{ - SINGLEMAC_SINGLEPHY, //SMSP - DUALMAC_DUALPHY, //DMDP - DUALMAC_SINGLEPHY, //DMSP -}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D; -#endif - #ifdef CONFIG_USB_RX_AGGREGATION typedef enum _USB_RX_AGG_MODE{ USB_RX_AGG_DISABLE, @@ -158,156 +134,63 @@ typedef enum _USB_RX_AGG_MODE{ #define PAGE_SIZE_256 256 #define PAGE_SIZE_512 512 -struct dm_priv -{ - u8 DM_Type; - -#define DYNAMIC_FUNC_BT BIT0 - - u8 DMFlag; - u8 InitDMFlag; - //u8 RSVD_1; - - u32 InitODMFlag; - //* Upper and Lower Signal threshold for Rate Adaptive*/ - int UndecoratedSmoothedPWDB; - int UndecoratedSmoothedCCK; - int EntryMinUndecoratedSmoothedPWDB; - int EntryMaxUndecoratedSmoothedPWDB; - int MinUndecoratedPWDBForDM; - int LastMinUndecoratedPWDBForDM; - - s32 UndecoratedSmoothedBeacon; - -//###### duplicate code,will move to ODM ######### - //for High Power - u8 bDynamicTxPowerEnable; - u8 LastDTPLvl; - u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06 - - //for tx power tracking - u8 bTXPowerTracking; - u8 TXPowercount; - u8 bTXPowerTrackingInit; - u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default - u8 TM_Trigger; - - u8 ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 - u8 ThermalValue; - u8 ThermalValue_LCK; - u8 ThermalValue_IQK; - u8 ThermalValue_DPK; - u8 bRfPiEnable; - //u8 RSVD_2; - - //for APK - u32 APKoutput[2][2]; //path A/B; output1_1a/output1_2a - u8 bAPKdone; - u8 bAPKThermalMeterIgnore; - u8 bDPdone; - u8 bDPPathAOK; - u8 bDPPathBOK; - //u8 RSVD_3; - //u8 RSVD_4; - //u8 RSVD_5; - - //for IQK - u32 ADDA_backup[IQK_ADDA_REG_NUM]; - u32 IQK_MAC_backup[IQK_MAC_REG_NUM]; - u32 IQK_BB_backup_recover[9]; - u32 IQK_BB_backup[IQK_BB_REG_NUM]; - - u8 PowerIndex_backup[6]; - u8 OFDM_index[2]; - - u8 bCCKinCH14; - u8 CCK_index; - u8 bDoneTxpower; - u8 CCK_index_HP; - - u8 OFDM_index_HP[2]; - u8 ThermalValue_HP[HP_THERMAL_NUM]; - u8 ThermalValue_HP_index; - //u8 RSVD_6; - - //for TxPwrTracking2 - s32 RegE94; - s32 RegE9C; - s32 RegEB4; - s32 RegEBC; - - u32 TXPowerTrackingCallbackCnt; //cosa add for debug - - u32 prv_traffic_idx; // edca turbo -#ifdef CONFIG_RTL8192D - u8 ThermalValue_AVG[AVG_THERMAL_NUM]; - u8 ThermalValue_AVG_index; - u8 ThermalValue_RxGain; - u8 ThermalValue_Crystal; - u8 bReloadtxpowerindex; - - u32 RegD04_MP; - - u8 RegC04_MP; - u8 Delta_IQK; - u8 Delta_LCK; - //u8 RSVD_7; - - BOOLEAN bDPKdone[2]; - //u16 RSVD_8; - - u32 RegA24; - u32 RegRF3C[2]; //pathA / pathB -#endif -//###### duplicate code,will move to ODM ######### - - // 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; -}; - - typedef struct hal_com_data { HAL_VERSION VersionID; RT_MULTI_FUNC MultiFunc; // For multi-function consideration. RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO - + + /****** FW related ******/ u16 FirmwareVersion; u16 FirmwareVersionRev; u16 FirmwareSubVersion; u16 FirmwareSignature; + u8 RegFWOffload; + u8 fw_ractrl; + u8 FwRsvdPageStartOffset; /* 2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ.*/ + u8 LastHMEBoxNum; /* H2C - for host message to fw */ - //current WIFI_PHY values - WIRELESS_MODE CurrentWirelessMode; + /****** current WIFI_PHY values ******/ + WIRELESS_MODE CurrentWirelessMode; CHANNEL_WIDTH CurrentChannelBW; - BAND_TYPE CurrentBandType; //0:2.4G, 1:5G - BAND_TYPE BandSet; - u8 CurrentChannel; - u8 CurrentCenterFrequencyIndex1; - u8 nCur40MhzPrimeSC;// Control channel sub-carrier - u8 nCur80MhzPrimeSC; //used for primary 40MHz of 80MHz mode - - u16 CustomerID; - u16 BasicRateSet; - u16 ForcedDataRate;// Force Data Rate. 0: Auto, 0x02: 1M ~ 0x6C: 54M. - u32 ReceiveConfig; - - //rf_ctrl + BAND_TYPE CurrentBandType; /* 0:2.4G, 1:5G */ + BAND_TYPE BandSet; + u8 CurrentChannel; + u8 CurrentCenterFrequencyIndex1; + u8 nCur40MhzPrimeSC; /* Control channel sub-carrier */ + u8 nCur80MhzPrimeSC; /* used for primary 40MHz of 80MHz mode */ + BOOLEAN bSwChnlAndSetBWInProgress; + u8 bDisableSWChannelPlan; /* flag of disable software change channel plan */ + u16 BasicRateSet; + u32 ReceiveConfig; + BOOLEAN bSwChnl; + BOOLEAN bSetChnlBW; + BOOLEAN bChnlBWInitialized; + + /****** rf_ctrl *****/ u8 rf_chip; u8 rf_type; u8 PackageType; - u8 NumTotalRFPath; + u8 NumTotalRFPath; - u8 InterfaceSel; - u8 framesync; - u32 framesyncC34; - u8 framesyncMonitor; - u8 DefaultInitialGain[4]; - // - // EEPROM setting. - // + /****** Debug ******/ + u16 ForcedDataRate; /* Force Data Rate. 0: Auto, 0x02: 1M ~ 0x6C: 54M. */ + u8 u1ForcedIgiLb; /* forced IGI lower bound */ + u8 bDumpRxPkt; + u8 bDumpTxPkt; + u8 bDisableTXPowerTraining; + + + /****** EEPROM setting.******/ + u8 bautoload_fail_flag; + u8 bloadfile_fail_flag; + u8 bloadmac_fail_flag; + u8 EepromOrEfuse; + u8 efuse_eeprom_data[EEPROM_MAX_SIZE]; /*92C:256bytes, 88E:512bytes, we use union set (512bytes)*/ + u8 InterfaceSel; /* board type kept in eFuse */ + u16 CustomerID; + u16 EEPROMVID; u16 EEPROMSVID; #ifdef CONFIG_USB_HCI @@ -330,16 +213,22 @@ typedef struct hal_com_data u8 EEPROMBluetoothAntIsolation; u8 EEPROMBluetoothRadioShared; u8 bTXPowerDataReadFromEEPORM; - u8 bAPKThermalMeterIgnore; - u8 bDisableSWChannelPlan; // flag of disable software change channel plan + u8 EEPROMMACAddr[ETH_ALEN]; + +#ifdef CONFIG_RF_GAIN_OFFSET + u8 EEPROMRFGainOffset; + u8 EEPROMRFGainVal; +#endif /*CONFIG_RF_GAIN_OFFSET*/ - BOOLEAN EepromOrEfuse; - u8 EfuseUsedPercentage; - u16 EfuseUsedBytes; - //u8 EfuseMap[2][HWSET_MAX_SIZE_JAGUAR]; - EFUSE_HAL EfuseHal; +#ifdef CONFIG_RTL8723B + u8 adjuseVoltageVal; +#endif + u8 EfuseUsedPercentage; + u16 EfuseUsedBytes; + /*u8 EfuseMap[2][HWSET_MAX_SIZE_JAGUAR];*/ + EFUSE_HAL EfuseHal; - //---------------------------------------------------------------------------------// + /*---------------------------------------------------------------------------------*/ //3 [2.4G] u8 Index24G_CCK_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; u8 Index24G_BW40_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; @@ -361,16 +250,15 @@ typedef struct hal_com_data u8 TxPwrInPercentage; - u8 TxPwrCalibrateRate; - // - // TX power by rate table at most 4RF path. - // The register is - // - // VHT TX power by rate off setArray = - // Band:-2G&5G = 0 / 1 - // RF: at most 4*4 = ABCD=0/1/2/3 - // CCK=0 OFDM=1/2 HT-MCS 0-15=3/4/56 VHT=7/8/9/10/11 - // + /******************************** + * TX power by rate table at most 4RF path. + * The register is + * + * VHT TX power by rate off setArray = + * Band:-2G&5G = 0 / 1 + * RF: at most 4*4 = ABCD=0/1/2/3 + * CCK=0 OFDM=1/2 HT-MCS 0-15=3/4/56 VHT=7/8/9/10/11 + **********************************/ u8 TxPwrByRateTable; u8 TxPwrByRateBand; s8 TxPwrByRateOffset[TX_PWR_BY_RATE_NUM_BAND] @@ -412,12 +300,8 @@ typedef struct hal_com_data // For power group u8 PwrGroupHT20[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER]; u8 PwrGroupHT40[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER]; - - - - u8 PGMaxGroup; - u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + // The current Tx Power Level u8 CurrentCckTxPwrIdx; u8 CurrentOfdm24GTxPwrIdx; @@ -430,9 +314,7 @@ typedef struct hal_com_data u32 CCKTxPowerLevelOriginalOffset; u8 CrystalCap; - u32 AntennaTxPath; // Antenna path Tx - u32 AntennaRxPath; // Antenna path Rx - + u8 PAType_2G; u8 PAType_5G; u8 LNAType_2G; @@ -446,33 +328,17 @@ typedef struct hal_com_data u8 TypeALNA; u8 TypeAPA; u8 RFEType; - u8 BoardType; - u8 ExternalPA; - u8 bIQKInitialized; - BOOLEAN bLCKInProgress; - - BOOLEAN bSwChnl; - BOOLEAN bSetChnlBW; - BOOLEAN bChnlBWInitialized; - BOOLEAN bNeedIQK; - - u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. - u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default - u8 b1x1RecvCombine; // for 1T1R receive combining - u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + u8 bLedOpenDrain; /* Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. */ + u32 AcParam_BE; /* Original parameter for BE, use for EDCA turbo. */ - BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + BB_REGISTER_DEFINITION_T PHYRegDef[MAX_RF_PATH]; //Radio A/B/C/D - u32 RfRegChnlVal[2]; + u32 RfRegChnlVal[MAX_RF_PATH]; //RDG enable BOOLEAN bRDGEnable; - //for host message to fw - u8 LastHMEBoxNum; - - u8 fw_ractrl; u8 RegTxPause; // Beacon function related global variable. u8 RegBcnCtrlVal; @@ -481,18 +347,30 @@ typedef struct hal_com_data u8 RegCR_1; u8 Reg837; u16 RegRRSR; - + + /****** antenna diversity ******/ u8 CurAntenna; u8 AntDivCfg; u8 AntDetection; u8 TRxAntDivType; - u8 ant_path; //for 8723B s0/s1 selection + u8 ant_path; //for 8723B s0/s1 selection + u32 AntennaTxPath; /* Antenna path Tx */ + u32 AntennaRxPath; /* Antenna path Rx */ + + /******** PHY DM & DM Section **********/ + u8 DM_Type; + _lock IQKSpinLock; + u8 INIDATA_RATE[MACID_NUM_SW_LIMIT]; + /* Upper and Lower Signal threshold for Rate Adaptive*/ + int EntryMinUndecoratedSmoothedPWDB; + int EntryMaxUndecoratedSmoothedPWDB; + int MinUndecoratedPWDBForDM; + DM_ODM_T odmpriv; + u8 bIQKInitialized; + u8 bNeedIQK; + /******** PHY DM & DM Section **********/ - u8 u1ForcedIgiLb; // forced IGI lower bound - u8 bDumpRxPkt;//for debug - u8 bDumpTxPkt;//for debug - u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. // 2010/08/09 MH Add CU power down mode. BOOLEAN pwrdown; @@ -500,30 +378,20 @@ typedef struct hal_com_data // Add for dual MAC 0--Mac0 1--Mac1 u32 interfaceIndex; - u8 OutEpQueueSel; - u8 OutEpNumber; - - // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. - BOOLEAN UsbRxHighSpeedMode; - - // 2010/11/22 MH Add for slim combo debug mode selective. - // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock. - BOOLEAN SlimComboDbg; - #ifdef CONFIG_P2P u8 p2p_ps_offload; #endif - - //u8 AMPDUDensity; - - // Auto FSM to Turn On, include clock, isolation, power control for MAC only + /* 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 + u8 OutEpQueueSel; + u8 OutEpNumber; + #if defined (CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) // // For SDIO Interface HAL related @@ -546,7 +414,6 @@ typedef struct hal_com_data _lock SdioTxFIFOFreePageLock; u8 SdioTxOQTMaxFreeSpace; u8 SdioTxOQTFreeSpace; - // // SDIO Rx FIFO related. @@ -558,30 +425,34 @@ typedef struct hal_com_data #endif //CONFIG_SDIO_HCI #ifdef CONFIG_USB_HCI - u32 UsbBulkOutSize; + + // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. + BOOLEAN UsbRxHighSpeedMode; + BOOLEAN UsbTxVeryHighSpeedMode; + u32 UsbBulkOutSize; BOOLEAN bSupportUSB3; // Interrupt relatd register information. - u32 IntArray[3];//HISR0,HISR1,HSISR - u32 IntrMask[3]; - u8 C2hArray[16]; + u32 IntArray[3];//HISR0,HISR1,HSISR + u32 IntrMask[3]; + u8 C2hArray[16]; #ifdef CONFIG_USB_TX_AGGREGATION - u8 UsbTxAggMode; - u8 UsbTxAggDescNum; + u8 UsbTxAggMode; + u8 UsbTxAggDescNum; #endif // CONFIG_USB_TX_AGGREGATION #ifdef CONFIG_USB_RX_AGGREGATION - u16 HwRxPageSize; // Hardware setting - u32 MaxUsbRxAggBlock; + u16 HwRxPageSize; // Hardware setting + u32 MaxUsbRxAggBlock; USB_RX_AGG_MODE UsbRxAggMode; - u8 UsbRxAggBlockCount; //FOR USB Mode, USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed - u8 UsbRxAggBlockTimeout; - u8 UsbRxAggPageCount; //FOR DMA Mode, 8192C DMA page count - u8 UsbRxAggPageTimeout; + u8 UsbRxAggBlockCount; /* FOR USB Mode, USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed */ + u8 UsbRxAggBlockTimeout; + u8 UsbRxAggPageCount; /* FOR DMA Mode, 8192C DMA page count*/ + u8 UsbRxAggPageTimeout; - u8 RegAcUsbDmaSize; - u8 RegAcUsbDmaTime; + u8 RegAcUsbDmaSize; + u8 RegAcUsbDmaTime; #endif//CONFIG_USB_RX_AGGREGATION #endif //CONFIG_USB_HCI @@ -590,34 +461,27 @@ typedef struct hal_com_data // // EEPROM setting. // - u16 EEPROMChannelPlan; - - u8 EEPROMTSSI[2]; - u8 EEPROMBoardType; - u32 TransmitConfig; - - u32 IntrMaskToSet[2]; - u32 IntArray[2]; - u32 IntrMask[2]; - u32 SysIntArray[1]; - u32 SysIntrMask[1]; - u32 IntrMaskReg[2]; - u32 IntrMaskDefault[2]; - - BOOLEAN bL1OffSupport; - BOOLEAN bSupportBackDoor; - - u8 bDefaultAntenna; - //u8 bIQKInitialized; + u32 TransmitConfig; + u32 IntrMaskToSet[2]; + u32 IntArray[2]; + u32 IntrMask[2]; + u32 SysIntArray[1]; + u32 SysIntrMask[1]; + u32 IntrMaskReg[2]; + u32 IntrMaskDefault[2]; + + BOOLEAN bL1OffSupport; + BOOLEAN bSupportBackDoor; + + u8 bDefaultAntenna; - u8 bInterruptMigration; - u8 bDisableTxInt; + u8 bInterruptMigration; + u8 bDisableTxInt; - u16 RxTag; + u16 RxTag; #endif //CONFIG_PCI_HCI + - struct dm_priv dmpriv; - DM_ODM_T odmpriv; #ifdef DBG_CONFIG_ERROR_DETECT struct sreset_priv srestpriv; #endif //#ifdef DBG_CONFIG_ERROR_DETECT @@ -625,58 +489,15 @@ typedef struct hal_com_data #ifdef CONFIG_BT_COEXIST // For bluetooth co-existance BT_COEXIST bt_coexist; -#ifdef CONFIG_RTL8723A - u8 bAntennaDetected; -#endif // CONFIG_RTL8723A #endif // CONFIG_BT_COEXIST -#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B) +#if defined(CONFIG_RTL8723B) #ifndef CONFIG_PCI_HCI // mutual exclusive with PCI -- so they're SDIO and GSPI // Interrupt relatd register information. u32 SysIntrStatus; u32 SysIntrMask; #endif -#endif //endif CONFIG_RTL8723A - - -#if defined(CONFIG_RTL8192C) ||defined(CONFIG_RTL8192D) - - u8 BluetoothCoexist; - - u8 EEPROMChnlAreaTxPwrCCK[2][3]; - u8 EEPROMChnlAreaTxPwrHT40_1S[2][3]; - u8 EEPROMChnlAreaTxPwrHT40_2SDiff[2][3]; - u8 EEPROMPwrLimitHT20[3]; - u8 EEPROMPwrLimitHT40[3]; - #ifdef CONFIG_RTL8192D - MACPHY_MODE_8192D MacPhyMode92D; - BAND_TYPE CurrentBandType92D; //0:2.4G, 1:5G - BAND_TYPE BandSet92D; - BOOLEAN bMasterOfDMSP; - BOOLEAN bSlaveOfDMSP; - - IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM_92D]; - #ifdef CONFIG_DUALMAC_CONCURRENT - BOOLEAN bInModeSwitchProcess; - #endif - u8 AutoLoadStatusFor8192D; - u8 EEPROMC9; - u8 EEPROMCC; - u8 PAMode; - u8 InternalPA5G[2]; //pathA / pathB - BOOLEAN bPhyValueInitReady; - BOOLEAN bLoadIMRandIQKSettingFor2G;// True if IMR or IQK have done for 2.4G in scan progress - BOOLEAN bNOPG; - BOOLEAN bIsVS; - //Query RF by FW - BOOLEAN bReadRFbyFW; - BOOLEAN bEarlyModeEnable; - BOOLEAN bSupportRemoteWakeUp; - BOOLEAN bInSetPower; - u8 RTSInitRate; // 2010.11.24.by tynli. - #endif //CONFIG_RTL8192D - -#endif //defined(CONFIG_RTL8192C) ||defined(CONFIG_RTL8192D) +#endif /*endif CONFIG_RTL8723B */ #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE char para_file_buf[MAX_PARA_FILE_BUF_LEN]; @@ -704,17 +525,27 @@ typedef struct hal_com_data s16 noise[ODM_MAX_CHANNEL_NUM]; #endif - u8 macid_num; - u8 cam_entry_num; + u8 macid_num; + u8 cam_entry_num; + u8 RfKFreeEnable; } HAL_DATA_COMMON, *PHAL_DATA_COMMON; + typedef struct hal_com_data HAL_DATA_TYPE, *PHAL_DATA_TYPE; -#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) -#define GET_HAL_RFPATH_NUM(__pAdapter) (((HAL_DATA_TYPE *)((__pAdapter)->HalData))->NumTotalRFPath ) -#define RT_GetInterfaceSelection(_Adapter) (GET_HAL_DATA(_Adapter)->InterfaceSel) -#define GET_RF_TYPE(__pAdapter) (GET_HAL_DATA(__pAdapter)->rf_type) +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) +#define GET_HAL_RFPATH_NUM(__pAdapter) (((HAL_DATA_TYPE *)((__pAdapter)->HalData))->NumTotalRFPath ) +#define RT_GetInterfaceSelection(_Adapter) (GET_HAL_DATA(_Adapter)->InterfaceSel) +#define GET_RF_TYPE(__pAdapter) (GET_HAL_DATA(__pAdapter)->rf_type) + +#define SUPPORT_HW_RADIO_DETECT(Adapter) ( RT_GetInterfaceSelection(Adapter) == INTF_SEL2_MINICARD ||\ + RT_GetInterfaceSelection(Adapter) == INTF_SEL3_USB_Solo ||\ + RT_GetInterfaceSelection(Adapter) == INTF_SEL4_USB_Combo) + +#define get_hal_mac_addr(adapter) (GET_HAL_DATA(adapter)->EEPROMMACAddr) +#define is_boot_from_eeprom(adapter) (GET_HAL_DATA(adapter)->EepromOrEfuse) + #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_gspi.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_gspi.h deleted file mode 100755 index f5880e274512..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_gspi.h +++ /dev/null @@ -1,32 +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 __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 - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_intf.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_intf.h index 9dadd66cfaac..b58556097eb8 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_intf.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_intf.h @@ -30,15 +30,13 @@ enum RTL871X_HCI_TYPE { enum _CHIP_TYPE { - NULL_CHIP_TYPE, - RTL8188C_8192C, - RTL8192D, - RTL8723A, + NULL_CHIP_TYPE, RTL8188E, RTL8192E, RTL8812, RTL8821, //RTL8811 RTL8723B, + RTL8814A, MAX_CHIP_TYPE }; @@ -68,10 +66,12 @@ typedef enum _HW_VARIABLES{ HW_VAR_SEC_DK_CFG, HW_VAR_BCN_VALID, HW_VAR_RF_TYPE, - HW_VAR_DM_FLAG, + /* PHYDM odm->SupportAbility */ + HW_VAR_DM_FLAG, HW_VAR_DM_FUNC_OP, HW_VAR_DM_FUNC_SET, HW_VAR_DM_FUNC_CLR, + /* PHYDM odm->SupportAbility */ HW_VAR_CAM_EMPTY_ENTRY, HW_VAR_CAM_INVALID_ALL, HW_VAR_CAM_WRITE, @@ -92,9 +92,7 @@ typedef enum _HW_VARIABLES{ HW_VAR_FWLPS_RF_ON, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, HW_VAR_TDLS_WRCR, - HW_VAR_TDLS_INIT_CH_SEN, HW_VAR_TDLS_RS_RCR, - HW_VAR_TDLS_DONE_CH_SEN, HW_VAR_INITIAL_GAIN, HW_VAR_TRIGGER_GPIO_0, HW_VAR_BT_SET_COEXIST, @@ -120,6 +118,9 @@ typedef enum _HW_VARIABLES{ #endif #ifdef CONFIG_AP_WOWLAN HW_VAR_AP_WOWLAN, +#endif +#ifdef CONFIG_GPIO_WAKEUP + HW_SET_GPIO_WL_CTRL, #endif HW_VAR_SYS_CLKR, HW_VAR_NAV_UPPER, @@ -158,7 +159,6 @@ typedef enum _HAL_DEF_VARIABLE{ HAL_DEF_MAX_RECVBUF_SZ, HAL_DEF_RX_PACKET_OFFSET, HAL_DEF_DBG_DUMP_RXPKT,//for dbg - HAL_DEF_DBG_DM_FUNC,//for dbg HAL_DEF_RA_DECISION_RATE, HAL_DEF_RA_SGI, HAL_DEF_PT_PWR_STATUS, @@ -184,6 +184,8 @@ typedef enum _HAL_DEF_VARIABLE{ 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_EFUSE_USAGE, /* Get current EFUSE utilization. 2008.12.19. Added by Roger. */ + HAL_DEF_EFUSE_BYTES, }HAL_DEF_VARIABLE; typedef enum _HAL_ODM_VARIABLE{ @@ -202,41 +204,58 @@ typedef enum _HAL_INTF_PS_FUNC{ typedef s32 (*c2h_id_filter)(u8 *c2h_evt); struct hal_ops { + /*** initialize section ***/ + void (*read_chip_version)(_adapter *padapter); + void (*init_default_value)(_adapter *padapter); + void (*intf_chip_configure)(_adapter *padapter); + void (*read_adapter_info)(_adapter *padapter); u32 (*hal_power_on)(_adapter *padapter); - void (*hal_power_off)(_adapter *padapter); + void (*hal_power_off)(_adapter *padapter); u32 (*hal_init)(_adapter *padapter); u32 (*hal_deinit)(_adapter *padapter); - - void (*free_hal_data)(_adapter *padapter); - - u32 (*inirp_init)(_adapter *padapter); - u32 (*inirp_deinit)(_adapter *padapter); - void (*irp_reset)(_adapter *padapter); - + void (*dm_init)(_adapter *padapter); + void (*dm_deinit)(_adapter *padapter); + + /*** xmit section ***/ s32 (*init_xmit_priv)(_adapter *padapter); void (*free_xmit_priv)(_adapter *padapter); + s32 (*hal_xmit)(_adapter *padapter, struct xmit_frame *pxmitframe); + /* + * mgnt_xmit should be implemented to run in interrupt context + */ + s32 (*mgnt_xmit)(_adapter *padapter, struct xmit_frame *pmgntframe); + s32 (*hal_xmitframe_enqueue)(_adapter *padapter, struct xmit_frame *pxmitframe); +#ifdef CONFIG_XMIT_THREAD_MODE + s32 (*xmit_thread_handler)(_adapter *padapter); +#endif + void (*run_thread)(_adapter *padapter); + void (*cancel_thread)(_adapter *padapter); + /*** recv section ***/ s32 (*init_recv_priv)(_adapter *padapter); - void (*free_recv_priv)(_adapter *padapter); + void (*free_recv_priv)(_adapter *padapter); +#if defined(CONFIG_USB_HCI)||defined(CONFIG_PCI_HCI) + u32 (*inirp_init)(_adapter *padapter); + u32 (*inirp_deinit)(_adapter *padapter); +#endif + /*** interrupt hdl section ***/ + void (*enable_interrupt)(_adapter *padapter); + void (*disable_interrupt)(_adapter *padapter); + u8 (*check_ips_status)(_adapter *padapter); +#if defined(CONFIG_PCI_HCI) + s32 (*interrupt_handler)(_adapter *padapter); +#endif +#if defined(CONFIG_PCI_HCI) + void (*irp_reset)(_adapter *padapter); +#endif + + /*** DM section ***/ + void (*InitSwLeds)(_adapter *padapter); void (*DeInitSwLeds)(_adapter *padapter); + - void (*dm_init)(_adapter *padapter); - void (*dm_deinit)(_adapter *padapter); - void (*read_chip_version)(_adapter *padapter); - - void (*init_default_value)(_adapter *padapter); - - void (*intf_chip_configure)(_adapter *padapter); - - void (*read_adapter_info)(_adapter *padapter); - - void (*enable_interrupt)(_adapter *padapter); - void (*disable_interrupt)(_adapter *padapter); - u8 (*check_ips_status)(_adapter *padapter); - s32 (*interrupt_handler)(_adapter *padapter); - void (*clear_interrupt)(_adapter *padapter); void (*set_bwmode_handler)(_adapter *padapter, CHANNEL_WIDTH Bandwidth, u8 Offset); void (*set_channel_handler)(_adapter *padapter, u8 channel); void (*set_chnl_bw_handler)(_adapter *padapter, u8 channel, CHANNEL_WIDTH Bandwidth, u8 Offset40, u8 Offset80); @@ -245,14 +264,15 @@ struct hal_ops { void (*get_tx_power_level_handler)(_adapter *padapter, s32 *powerlevel); void (*hal_dm_watchdog)(_adapter *padapter); +#ifdef CONFIG_LPS_LCLK_WD_TIMER void (*hal_dm_watchdog_in_lps)(_adapter *padapter); - +#endif void (*SetHwRegHandler)(_adapter *padapter, u8 variable,u8* val); void (*GetHwRegHandler)(_adapter *padapter, u8 variable,u8* val); #ifdef CONFIG_C2H_PACKET_EN - void (*SetHwRegHandlerWithBuf)(_adapter *padapter, u8 variable, u8* pbuf, int len); + void (*SetHwRegHandlerWithBuf)(_adapter *padapter, u8 variable, u8 * pbuf, int len); #endif u8 (*GetHalDefVarHandler)(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue); @@ -266,8 +286,6 @@ struct hal_ops { void (*Add_RateATid)(_adapter *padapter, u32 bitmap, u8* arg, u8 rssi_level); - void (*run_thread)(_adapter *padapter); - void (*cancel_thread)(_adapter *padapter); #ifdef CONFIG_ANTENNA_DIVERSITY u8 (*AntDivBeforeLinkHandler)(_adapter *padapter); @@ -275,12 +293,6 @@ struct hal_ops { #endif u8 (*interface_ps_func)(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val); - s32 (*hal_xmit)(_adapter *padapter, struct xmit_frame *pxmitframe); - /* - * mgnt_xmit should be implemented to run in interrupt context - */ - s32 (*mgnt_xmit)(_adapter *padapter, struct xmit_frame *pmgntframe); - s32 (*hal_xmitframe_enqueue)(_adapter *padapter, struct xmit_frame *pxmitframe); u32 (*read_bbreg)(_adapter *padapter, u32 RegAddr, u32 BitMask); void (*write_bbreg)(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data); @@ -315,23 +327,27 @@ struct hal_ops { int (*IOL_exec_cmds_sync)(_adapter *padapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt); #endif -#ifdef CONFIG_XMIT_THREAD_MODE - s32 (*xmit_thread_handler)(_adapter *padapter); -#endif void (*hal_notch_filter)(_adapter * adapter, bool enable); void (*hal_reset_security_engine)(_adapter * adapter); s32 (*c2h_handler)(_adapter *padapter, u8 *c2h_evt); c2h_id_filter c2h_id_filter_ccx; s32 (*fill_h2c_cmd)(PADAPTER, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); -#if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B) - void (*hal_cal_txdesc_chksum)(struct tx_desc *ptxdesc); -#else - void (*hal_cal_txdesc_chksum)(u8 *ptxdesc); -#endif -#ifdef CONFIG_WOWLAN + void (*fill_fake_txdesc)(PADAPTER, u8 *pDesc, u32 BufferLen, + u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame); + +#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) void (*hal_set_wowlan_fw)(_adapter *adapter, u8 sleep); -#endif //CONFIG_WOWLAN + void (*clear_interrupt)(_adapter *padapter); +#endif + +#ifdef CONFIG_AP_WOWLAN + void (*hal_set_ap_wowlan_cmd)(_adapter *padapter, u8 enable); + void (*hal_set_ap_ps_wowlan_cmd)(_adapter *padapter , u8 enable); +#endif u8 (*hal_get_tx_buff_rsvd_page_num)(_adapter *adapter, bool wowlan); +#ifdef CONFIG_GPIO_API + void (*update_hisr_hsisr_ind)(PADAPTER padapter, u32 flag); +#endif }; typedef enum _RT_EEPROM_TYPE{ @@ -349,22 +365,6 @@ typedef enum _RT_EEPROM_TYPE{ #define RF_CHANGE_BY_SW BIT31 typedef enum _HARDWARE_TYPE{ - HARDWARE_TYPE_RTL8180, - HARDWARE_TYPE_RTL8185, - HARDWARE_TYPE_RTL8187, - HARDWARE_TYPE_RTL8188, - HARDWARE_TYPE_RTL8190P, - HARDWARE_TYPE_RTL8192E, - HARDWARE_TYPE_RTL819xU, - HARDWARE_TYPE_RTL8192SE, - HARDWARE_TYPE_RTL8192SU, - HARDWARE_TYPE_RTL8192CE, - HARDWARE_TYPE_RTL8192CU, - HARDWARE_TYPE_RTL8192DE, - HARDWARE_TYPE_RTL8192DU, - HARDWARE_TYPE_RTL8723AE, - HARDWARE_TYPE_RTL8723AU, - HARDWARE_TYPE_RTL8723AS, HARDWARE_TYPE_RTL8188EE, HARDWARE_TYPE_RTL8188EU, HARDWARE_TYPE_RTL8188ES, @@ -381,14 +381,26 @@ typedef enum _HARDWARE_TYPE{ HARDWARE_TYPE_RTL8723BE, HARDWARE_TYPE_RTL8723BU, HARDWARE_TYPE_RTL8723BS, - HARDWARE_TYPE_RTL8813AE, - HARDWARE_TYPE_RTL8813AU, - HARDWARE_TYPE_RTL8813AS, - + HARDWARE_TYPE_RTL8814AE, + HARDWARE_TYPE_RTL8814AU, + HARDWARE_TYPE_RTL8814AS, + HARDWARE_TYPE_RTL8821BE, + HARDWARE_TYPE_RTL8821BU, + HARDWARE_TYPE_RTL8821BS, + HARDWARE_TYPE_RTL8822BE, + HARDWARE_TYPE_RTL8822BU, + HARDWARE_TYPE_RTL8822BS, + HARDWARE_TYPE_RTL8703BE, + HARDWARE_TYPE_RTL8703BU, + HARDWARE_TYPE_RTL8703BS, + HARDWARE_TYPE_RTL8188FE, + HARDWARE_TYPE_RTL8188FU, + HARDWARE_TYPE_RTL8188FS, HARDWARE_TYPE_MAX, }HARDWARE_TYPE; #define IS_NEW_GENERATION_IC(_Adapter) (((PADAPTER)_Adapter)->HardwareType >=HARDWARE_TYPE_RTL8192EE) +#if 0 // // RTL8192C Series // @@ -416,6 +428,7 @@ typedef enum _HARDWARE_TYPE{ #define IS_HARDWARE_TYPE_8723AS(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723AS) #define IS_HARDWARE_TYPE_8723A(_Adapter) \ (IS_HARDWARE_TYPE_8723AE(_Adapter) || IS_HARDWARE_TYPE_8723AU(_Adapter) || IS_HARDWARE_TYPE_8723AS(_Adapter)) +#endif // // RTL8188E Series @@ -426,17 +439,6 @@ 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) ||\ - IS_HARDWARE_TYPE_8188EE(_Adapter) || IS_HARDWARE_TYPE_8188EU(_Adapter) || IS_HARDWARE_TYPE_8188ES(_Adapter)\ -) - // RTL8812 Series #define IS_HARDWARE_TYPE_8812E(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8812E) #define IS_HARDWARE_TYPE_8812AU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8812AU) @@ -471,18 +473,48 @@ typedef enum _HARDWARE_TYPE{ #define IS_HARDWARE_TYPE_8723B(_Adapter) \ (IS_HARDWARE_TYPE_8723BE(_Adapter) || IS_HARDWARE_TYPE_8723BU(_Adapter) ||IS_HARDWARE_TYPE_8723BS(_Adapter)) -//RTL8813A Series -#define IS_HARDWARE_TYPE_8813AE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8813AE) -#define IS_HARDWARE_TYPE_8813AU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8813AU) -#define IS_HARDWARE_TYPE_8813AS(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8813AS) +/* RTL8814A Series */ +#define IS_HARDWARE_TYPE_8814AE(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8814AE) +#define IS_HARDWARE_TYPE_8814AU(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8814AU) +#define IS_HARDWARE_TYPE_8814AS(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8814AS) + +#define IS_HARDWARE_TYPE_8814A(_Adapter) \ +(IS_HARDWARE_TYPE_8814AE(_Adapter) || IS_HARDWARE_TYPE_8814AU(_Adapter) || IS_HARDWARE_TYPE_8814AS(_Adapter)) + +#define IS_HARDWARE_TYPE_JAGUAR2(_Adapter) \ +(IS_HARDWARE_TYPE_8814A(_Adapter) || IS_HARDWARE_TYPE_8821B(_Adapter) || IS_HARDWARE_TYPE_8822B(_Adapter)) + +#define IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(_Adapter) \ +(IS_HARDWARE_TYPE_JAGUAR(_Adapter) || IS_HARDWARE_TYPE_JAGUAR2(_Adapter)) + +/* RTL8703B Series */ +#define IS_HARDWARE_TYPE_8703BE(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8703BE) +#define IS_HARDWARE_TYPE_8703BS(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8703BS) +#define IS_HARDWARE_TYPE_8703BU(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8703BU) +#define IS_HARDWARE_TYPE_8703B(_Adapter) \ +(IS_HARDWARE_TYPE_8703BE(_Adapter) || IS_HARDWARE_TYPE_8703BU(_Adapter) || IS_HARDWARE_TYPE_8703BS(_Adapter)) + +/* RTL8188F Series */ +#define IS_HARDWARE_TYPE_8188FE(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8188FE) +#define IS_HARDWARE_TYPE_8188FS(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8188FS) +#define IS_HARDWARE_TYPE_8188FU(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8188FU) +#define IS_HARDWARE_TYPE_8188F(_Adapter) \ +(IS_HARDWARE_TYPE_8188FE(_Adapter) || IS_HARDWARE_TYPE_8188FU(_Adapter) || IS_HARDWARE_TYPE_8188FS(_Adapter)) + +#define IS_HARDWARE_TYPE_8821BE(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8821BE) +#define IS_HARDWARE_TYPE_8821BU(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8821BU) +#define IS_HARDWARE_TYPE_8821BS(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8821BS) -#define IS_HARDWARE_TYPE_8813A(_Adapter) \ -(IS_HARDWARE_TYPE_8813AE(_Adapter) || IS_HARDWARE_TYPE_8813AU(_Adapter) ||IS_HARDWARE_TYPE_8813AS(_Adapter)) +#define IS_HARDWARE_TYPE_8821B(_Adapter) \ +(IS_HARDWARE_TYPE_8821BE(_Adapter) || IS_HARDWARE_TYPE_8821BU(_Adapter) || IS_HARDWARE_TYPE_8821BS(_Adapter)) + +#define IS_HARDWARE_TYPE_8822BE(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8822BE) +#define IS_HARDWARE_TYPE_8822BU(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8822BU) +#define IS_HARDWARE_TYPE_8822BS(_Adapter) (((PADAPTER)_Adapter)->HardwareType == HARDWARE_TYPE_RTL8822BS) +#define IS_HARDWARE_TYPE_8822B(_Adapter) \ +(IS_HARDWARE_TYPE_8822BE(_Adapter) || IS_HARDWARE_TYPE_8822BU(_Adapter) || IS_HARDWARE_TYPE_8822BS(_Adapter)) -typedef struct eeprom_priv EEPROM_EFUSE_PRIV, *PEEPROM_EFUSE_PRIV; -#define GET_EEPROM_EFUSE_PRIV(adapter) (&adapter->eeprompriv) -#define is_boot_from_eeprom(adapter) (adapter->eeprompriv.EepromOrEfuse) typedef enum _wowlan_subcode{ WOWLAN_PATTERN_MATCH = 1, @@ -520,6 +552,9 @@ struct wowlan_ioctl_param{ #define RX_PNOWakeUp 0x55 #define AP_WakeUp 0x66 +u8 rtw_hal_data_init(_adapter *padapter); +void rtw_hal_data_deinit(_adapter *padapter); + void rtw_hal_def_value_init(_adapter *padapter); void rtw_hal_free_data(_adapter *padapter); @@ -531,6 +566,7 @@ void rtw_hal_sw_led_deinit(_adapter *padapter); u32 rtw_hal_power_on(_adapter *padapter); void rtw_hal_power_off(_adapter *padapter); + uint rtw_hal_init(_adapter *padapter); uint rtw_hal_deinit(_adapter *padapter); void rtw_hal_stop(_adapter *padapter); @@ -550,16 +586,20 @@ u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pVa 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,PVOID pValue2); - + void rtw_hal_enable_interrupt(_adapter *padapter); void rtw_hal_disable_interrupt(_adapter *padapter); u8 rtw_hal_check_ips_status(_adapter *padapter); +#if defined(CONFIG_USB_HCI)||defined(CONFIG_PCI_HCI) u32 rtw_hal_inirp_init(_adapter *padapter); u32 rtw_hal_inirp_deinit(_adapter *padapter); +#endif +#if defined(CONFIG_PCI_HCI) void rtw_hal_irp_reset(_adapter *padapter); +#endif u8 rtw_hal_intf_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val); @@ -645,7 +685,20 @@ s32 rtw_hal_is_disable_sw_channel_plan(PADAPTER padapter); s32 rtw_hal_macid_sleep(PADAPTER padapter, u8 macid); s32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid); -s32 rtw_hal_fill_h2c_cmd(PADAPTER, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); +s32 rtw_hal_fill_h2c_cmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); +void rtw_hal_fill_fake_txdesc(_adapter *padapter, u8 *pDesc, u32 BufferLen, + u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame); +u8 rtw_hal_get_txbuff_rsvd_page_num(_adapter *adapter, bool wowlan); + +#ifdef CONFIG_GPIO_API +void rtw_hal_update_hisr_hsisr_ind(_adapter *padapter, u32 flag); +#endif + +#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) +void rtw_hal_clear_interrupt(_adapter *padapter); +void rtw_hal_set_wowlan_fw(_adapter *padapter, u8 sleep); +#endif +u8 rtw_hal_ops_check(_adapter *padapter); #endif //__HAL_INTF_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_pg.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_pg.h index 9d9911f3cf3b..26280caa5f2b 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_pg.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_pg.h @@ -21,193 +21,7 @@ #ifndef __HAL_PG_H__ #define __HAL_PG_H__ -//==================================================== -// EEPROM/Efuse PG Offset for 8192 CE/CU -//==================================================== -#define EEPROM_VID_92C 0x0A -#define EEPROM_PID_92C 0x0C -#define EEPROM_DID_92C 0x0C -#define EEPROM_SVID_92C 0x0E -#define EEPROM_SMID_92C 0x10 -#define EEPROM_MAC_ADDR_92C 0x16 - -#define EEPROM_MAC_ADDR 0x16 -#define EEPROM_TV_OPTION 0x50 -#define EEPROM_SUBCUSTOMER_ID_92C 0x59 -#define EEPROM_CCK_TX_PWR_INX 0x5A -#define EEPROM_HT40_1S_TX_PWR_INX 0x60 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 -#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 -#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C -#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F -#define EEPROM_HT20_MAX_PWR_OFFSET 0x72 -#define EEPROM_CHANNEL_PLAN_92C 0x75 -#define EEPROM_TSSI_A 0x76 -#define EEPROM_TSSI_B 0x77 -#define EEPROM_THERMAL_METER_92C 0x78 -#define EEPROM_RF_OPT1_92C 0x79 -#define EEPROM_RF_OPT2_92C 0x7A -#define EEPROM_RF_OPT3_92C 0x7B -#define EEPROM_RF_OPT4_92C 0x7C -#define EEPROM_VERSION_92C 0x7E -#define EEPROM_CUSTOMER_ID_92C 0x7F - -#define EEPROM_NORMAL_CHANNEL_PLAN 0x75 -#define EEPROM_NORMAL_BoardType_92C EEPROM_RF_OPT1_92C -#define BOARD_TYPE_NORMAL_MASK 0xE0 -#define BOARD_TYPE_TEST_MASK 0xF -#define EEPROM_TYPE_ID 0x7E - -// PCIe related -#define EEPROM_PCIE_DEV_CAP_01 0xE0 // Express device capability in PCIe configuration space, i.e., map to offset 0x74 -#define EEPROM_PCIE_DEV_CAP_02 0xE1 // Express device capability in PCIe configuration space, i.e., map to offset 0x75 - -// EEPROM address for Test chip -#define EEPROM_TEST_USB_OPT 0x0E - -#define EEPROM_EASY_REPLACEMENT 0x50//BIT0 1 for build-in module, 0 for external dongle - -//==================================================== -// EEPROM/Efuse PG Offset for 8723AE/8723AU/8723AS -//==================================================== -#define EEPROM_CCK_TX_PWR_INX_8723A 0x10 -#define EEPROM_HT40_1S_TX_PWR_INX_8723A 0x16 -#define EEPROM_HT20_TX_PWR_INX_DIFF_8723A 0x1C -#define EEPROM_OFDM_TX_PWR_INX_DIFF_8723A 0x1F -#define EEPROM_HT40_MAX_PWR_OFFSET_8723A 0x22 -#define EEPROM_HT20_MAX_PWR_OFFSET_8723A 0x25 - -#define EEPROM_ChannelPlan_8723A 0x28 -#define EEPROM_TSSI_A_8723A 0x29 -#define EEPROM_THERMAL_METER_8723A 0x2A -#define RF_OPTION1_8723A 0x2B -#define RF_OPTION2_8723A 0x2C -#define RF_OPTION3_8723A 0x2D -#define RF_OPTION4_8723A 0x2E -#define EEPROM_VERSION_8723A 0x30 -#define EEPROM_CustomID_8723A 0x31 -#define EEPROM_SubCustomID_8723A 0x32 -#define EEPROM_XTAL_K_8723A 0x33 -#define EEPROM_Chipset_8723A 0x34 - - -// RTL8723AE -#define EEPROM_VID_8723AE 0x49 -#define EEPROM_DID_8723AE 0x4B -#define EEPROM_SVID_8723AE 0x4D -#define EEPROM_SMID_8723AE 0x4F -#define EEPROM_MAC_ADDR_8723AE 0x67 - -//RTL8723AU -#define EEPROM_MAC_ADDR_8723AU 0xC6 -#define EEPROM_VID_8723AU 0xB7 -#define EEPROM_PID_8723AU 0xB9 - -// RTL8723AS -#define EEPROM_MAC_ADDR_8723AS 0xAA - -//==================================================== -// EEPROM/Efuse PG Offset for 8192 DE/DU -//==================================================== -// pcie -#define RTL8190_EEPROM_ID 0x8129 // 0-1 -#define EEPROM_HPON 0x02 // LDO settings.2-5 -#define EEPROM_CLK 0x06 // Clock settings.6-7 -#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8 - -#define EEPROM_MAC_ADDR_MAC0_92DE 0x55 -#define EEPROM_MAC_ADDR_MAC1_92DE 0x5B - -//usb -#define EEPROM_ENDPOINT_SETTING 0x10 -#define EEPROM_CHIRP_K 0x12 // Changed -#define EEPROM_USB_PHY 0x13 // Changed -#define EEPROM_STRING 0x1F -#define EEPROM_SUBCUSTOMER_ID_92D 0x59 - -#define EEPROM_MAC_ADDR_MAC0_92DU 0x19 -#define EEPROM_MAC_ADDR_MAC1_92DU 0x5B -//---------------------------------------------------------------- -// 2.4G band Tx power index setting -#define EEPROM_CCK_TX_PWR_INX_2G_92D 0x61 -#define EEPROM_HT40_1S_TX_PWR_INX_2G_92D 0x67 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G_92D 0x6D -#define EEPROM_HT20_TX_PWR_INX_DIFF_2G_92D 0x70 -#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G_92D 0x73 -#define EEPROM_HT40_MAX_PWR_OFFSET_2G_92D 0x76 -#define EEPROM_HT20_MAX_PWR_OFFSET_2G_92D 0x79 - -//5GL channel 32-64 -#define EEPROM_HT40_1S_TX_PWR_INX_5GL_92D 0x7C -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL_92D 0x82 -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL_92D 0x85 -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL_92D 0x88 -#define EEPROM_HT40_MAX_PWR_OFFSET_5GL_92D 0x8B -#define EEPROM_HT20_MAX_PWR_OFFSET_5GL_92D 0x8E - -//5GM channel 100-140 -#define EEPROM_HT40_1S_TX_PWR_INX_5GM_92D 0x91 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM_92D 0x97 -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM_92D 0x9A -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM_92D 0x9D -#define EEPROM_HT40_MAX_PWR_OFFSET_5GM_92D 0xA0 -#define EEPROM_HT20_MAX_PWR_OFFSET_5GM_92D 0xA3 - -//5GH channel 149-165 -#define EEPROM_HT40_1S_TX_PWR_INX_5GH_92D 0xA6 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH_92D 0xAC -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH_92D 0xAF -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH_92D 0xB2 -#define EEPROM_HT40_MAX_PWR_OFFSET_5GH_92D 0xB5 -#define EEPROM_HT20_MAX_PWR_OFFSET_5GH_92D 0xB8 - - -#define EEPROM_CHANNEL_PLAN_92D 0xBB // Map of supported channels. -#define EEPROM_TEST_CHANNEL_PLAN_92D 0xBB -#define EEPROM_THERMAL_METER_92D 0xC3 //[4:0] -#define EEPROM_IQK_DELTA_92D 0xBC -#define EEPROM_LCK_DELTA_92D 0xBC -#define EEPROM_XTAL_K_92D 0xBD //[7:5] -#define EEPROM_TSSI_A_5G_92D 0xBE -#define EEPROM_TSSI_B_5G_92D 0xBF -#define EEPROM_TSSI_AB_5G_92D 0xC0 - -#define EEPROM_RF_OPT1_92D 0xC4 -#define EEPROM_RF_OPT2_92D 0xC5 -#define EEPROM_RF_OPT3_92D 0xC6 -#define EEPROM_RF_OPT4_92D 0xC7 -#define EEPROM_RF_OPT5_92D 0xC8 -#define EEPROM_RF_OPT6_92D 0xC9 -#define EEPROM_RF_OPT7_92D 0xCC - -#define EEPROM_NORMAL_BoardType_92D EEPROM_RF_OPT1_92D //[7:5] - -#define EEPROM_WIDIPAIRING_ADDR 0xF0 -#define EEPROM_WIDIPAIRING_KEY 0xF6 - -#define EEPROM_DEF_PART_NO 0x3FD //Byte -#define EEPROME_CHIP_VERSION_L 0x3FF -#define EEPROME_CHIP_VERSION_H 0x3FE - -//---------------------------------------------------------------- - -#define EEPROM_VID_92DE 0x28 -#define EEPROM_PID_92DE 0x2A -#define EEPROM_SVID_92DE 0x2C -#define EEPROM_SMID_92DE 0x2E -#define EEPROM_PATHDIV_92D 0xC4 - -#define EEPROM_BOARD_OPTIONS_92D 0xC4 -#define EEPROM_5G_LNA_GAIN_92D 0xC6 -#define EEPROM_FEATURE_OPTIONS_92D 0xC7 -#define EEPROM_BT_SETTING_92D 0xC8 - -#define EEPROM_VERSION_92D 0xCA -#define EEPROM_CUSTOMER_ID_92D 0xCB - -#define EEPROM_VID_92DU 0xC -#define EEPROM_PID_92DU 0xE - + //==================================================== // EEPROM/Efuse PG Offset for 88EE/88EU/88ES //==================================================== @@ -236,7 +50,7 @@ #define EEPROM_MAC_ADDR_88EU 0xD7 #define EEPROM_VID_88EU 0xD0 #define EEPROM_PID_88EU 0xD2 -#define EEPROM_USB_OPTIONAL_FUNCTION0 0xD4 //8192EU, 8812AU is the same +#define EEPROM_USB_OPTIONAL_FUNCTION0 0xD4 //8188EU,8192EU, 8812AU is the same #define EEPROM_USB_OPTIONAL_FUNCTION0_8811AU 0x104 // RTL88ES @@ -281,7 +95,7 @@ #define EEPROM_LNA_TYPE_5G_8192EU 0xBF // RTL8192ES -#define EEPROM_MAC_ADDR_8192ES 0x11B +#define EEPROM_MAC_ADDR_8192ES 0x11A //==================================================== // EEPROM/Efuse PG Offset for 8812AE/8812AU/8812AS //==================================================== @@ -323,6 +137,39 @@ #define EEPROM_LNA_TYPE_2G_8812AU 0xBD #define EEPROM_LNA_TYPE_5G_8812AU 0xBF +//RTL8814AU +#define EEPROM_MAC_ADDR_8814AU 0xD8 +#define EEPROM_VID_8814AU 0xD0 +#define EEPROM_PID_8814AU 0xD2 +#define EEPROM_PA_TYPE_8814AU 0xBC +#define EEPROM_LNA_TYPE_2G_8814AU 0xBD +#define EEPROM_LNA_TYPE_5G_8814AU 0xBF + +//==================================================== +// EEPROM/Efuse PG Offset for 8814AU +//==================================================== +#define EEPROM_TX_PWR_INX_8814 0x10 +#define EEPROM_ChannelPlan_8814 0xB8 +#define EEPROM_XTAL_8814 0xB9 +#define EEPROM_THERMAL_METER_8814 0xBA +#define EEPROM_IQK_LCK_8814 0xBB +#define EEPROM_RFE_OPTION_8814 0xCA + + +#define EEPROM_PA_TYPE_8814 0xBC +#define EEPROM_LNA_TYPE_AB_2G_8814 0xBD +#define EEPROM_LNA_TYPE_CD_2G_8814 0xBE +#define EEPROM_LNA_TYPE_AB_5G_8814 0xBF +#define EEPROM_LNA_TYPE_CD_5G_8814 0xC0 +#define EEPROM_RF_BOARD_OPTION_8814 0xC1 +#define EEPROM_RF_BT_SETTING_8814 0xC3 +#define EEPROM_VERSION_8814 0xC4 +#define EEPROM_CustomID_8814 0xC5 +#define EEPROM_TX_BBSWING_2G_8814 0xC6 +#define EEPROM_TX_BBSWING_5G_8814 0xC7 +#define EEPROM_TRX_ANTENNA_OPTION_8814 0xC9 +#define EEPROM_RFE_OPTION_8814 0xCA + //==================================================== // EEPROM/Efuse PG Offset for 8821AE/8821AU/8821AS //==================================================== @@ -422,6 +269,7 @@ #define EEPROM_PA_TYPE_8723BU 0xBC #define EEPROM_LNA_TYPE_2G_8723BU 0xBD + //RTL8723BS #define EEPROM_MAC_ADDR_8723BS 0x11A #define EEPROM_Voltage_ADDR_8723B 0x8 @@ -481,6 +329,7 @@ #define EEPROM_Default_CrystalCap_8723A 0x20 #define EEPROM_Default_CrystalCap_88E 0x20 #define EEPROM_Default_CrystalCap_8812 0x20 +#define EEPROM_Default_CrystalCap_8814 0x20 #define EEPROM_Default_CrystalCap_8192E 0x20 #define EEPROM_Default_CrystalCap_8723B 0x20 #define EEPROM_Default_CrystalFreq 0x0 @@ -535,6 +384,11 @@ #define EEPROM_DEFAULT_TX_CALIBRATE_RATE 0x00 +// PCIe related +#define EEPROM_PCIE_DEV_CAP_01 0xE0 // Express device capability in PCIe configuration space, i.e., map to offset 0x74 +#define EEPROM_PCIE_DEV_CAP_02 0xE1 // Express device capability in PCIe configuration space, i.e., map to offset 0x75 + + // // For VHT series TX power by rate table. // VHT TX power by rate off setArray = @@ -643,7 +497,7 @@ typedef enum _BT_CoType{ BT_RTL8821 = 7, BT_RTL8723B = 8, BT_RTL8192E = 9, - BT_RTL8813A = 10, + BT_RTL8814A = 10, BT_RTL8812A = 11 } BT_CoType, *PBT_CoType; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_sdio.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_sdio.h deleted file mode 100755 index ccb49e780a4c..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_sdio.h +++ /dev/null @@ -1,32 +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 __HAL_SDIO_H_ -#define __HAL_SDIO_H_ - -#define ffaddr2deviceId(pdvobj, addr) (pdvobj->Queue2Pipe[addr]) - -u8 rtw_hal_sdio_max_txoqt_free_space(_adapter *padapter); -u8 rtw_hal_sdio_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum); -void rtw_hal_sdio_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum); -void rtw_hal_set_sdio_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ); -u32 rtw_hal_get_sdio_tx_max_length(PADAPTER padapter, u8 queue_idx); - -#endif //__RTW_LED_H_ - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/ieee80211.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/ieee80211.h index 5dfc421366cb..09475efa5277 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/ieee80211.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/ieee80211.h @@ -166,6 +166,10 @@ typedef enum _RATEID_IDX_ { RATEID_IDX_B = 8, RATEID_IDX_VHT_2SS = 9, RATEID_IDX_VHT_1SS = 10, + RATEID_IDX_MIX1 = 11, + RATEID_IDX_MIX2 = 12, + RATEID_IDX_VHT_3SS = 13, + RATEID_IDX_BGN_3SS = 14, } RATEID_IDX, *PRATEID_IDX; typedef enum _RATR_TABLE_MODE{ @@ -207,13 +211,13 @@ enum NETWORK_TYPE //Type for registry default wireless mode WIRELESS_11AGN = (WIRELESS_11A|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only WIRELESS_11ABGN = (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N), - WIRELESS_MODE_24G = (WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11AC), + WIRELESS_MODE_24G = (WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N), WIRELESS_MODE_5G = (WIRELESS_11A|WIRELESS_11_5N|WIRELESS_11AC), WIRELESS_MODE_MAX = (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N|WIRELESS_11AC), }; -#define SUPPORTED_24G_NETTYPE_MSK (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N) -#define SUPPORTED_5G_NETTYPE_MSK (WIRELESS_11A | WIRELESS_11_5N) +#define SUPPORTED_24G_NETTYPE_MSK WIRELESS_MODE_24G +#define SUPPORTED_5G_NETTYPE_MSK WIRELESS_MODE_5G #define IsLegacyOnly(NetType) ((NetType) == ((NetType) & (WIRELESS_11BG|WIRELESS_11A))) @@ -1342,7 +1346,7 @@ typedef struct tx_pending_t{ -#define MAXTID 16 +#define TID_NUM 16 #define IEEE_A (1<<0) #define IEEE_B (1<<1) @@ -1714,7 +1718,8 @@ int rtw_check_network_type(unsigned char *rate, int ratelen, int channel); void rtw_get_bcn_info(struct wlan_network *pnetwork); -void rtw_macaddr_cfg(u8 *mac_addr); +u8 rtw_check_invalid_mac_address(u8 *mac_addr); +void rtw_macaddr_cfg(u8 *out, const u8 *hw_mac_addr); u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI, unsigned char * MCS_rate); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/ioctl_cfg80211.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/ioctl_cfg80211.h deleted file mode 100755 index b689c8b75745..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/ioctl_cfg80211.h +++ /dev/null @@ -1,177 +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 __IOCTL_CFG80211_H__ -#define __IOCTL_CFG80211_H__ - - -#if defined(RTW_USE_CFG80211_STA_EVENT) - #undef CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER -#endif - -struct rtw_wdev_invit_info { - u8 state; /* 0: req, 1:rep */ - u8 peer_mac[ETH_ALEN]; - u8 active; - u8 token; - u8 flags; - u8 status; - u8 req_op_ch; - u8 rsp_op_ch; -}; - -#define rtw_wdev_invit_info_init(invit_info) \ - do { \ - (invit_info)->state = 0xff; \ - _rtw_memset((invit_info)->peer_mac, 0, ETH_ALEN); \ - (invit_info)->active = 0xff; \ - (invit_info)->token = 0; \ - (invit_info)->flags = 0x00; \ - (invit_info)->status = 0xff; \ - (invit_info)->req_op_ch = 0; \ - (invit_info)->rsp_op_ch = 0; \ - } while (0) - -struct rtw_wdev_nego_info { - u8 state; /* 0: req, 1:rep, 2:conf */ - u8 peer_mac[ETH_ALEN]; - u8 active; - u8 token; - u8 status; - u8 req_intent; - u8 req_op_ch; - u8 req_listen_ch; - u8 rsp_intent; - u8 rsp_op_ch; - u8 conf_op_ch; -}; - -#define rtw_wdev_nego_info_init(nego_info) \ - do { \ - (nego_info)->state = 0xff; \ - _rtw_memset((nego_info)->peer_mac, 0, ETH_ALEN); \ - (nego_info)->active = 0xff; \ - (nego_info)->token = 0; \ - (nego_info)->status = 0xff; \ - (nego_info)->req_intent = 0xff; \ - (nego_info)->req_op_ch = 0; \ - (nego_info)->req_listen_ch = 0; \ - (nego_info)->rsp_intent = 0xff; \ - (nego_info)->rsp_op_ch = 0; \ - (nego_info)->conf_op_ch = 0; \ - } while (0) - -struct rtw_wdev_priv -{ - struct wireless_dev *rtw_wdev; - - _adapter *padapter; - - struct cfg80211_scan_request *scan_request; - _lock scan_req_lock; - - struct net_device *pmon_ndev;//for monitor interface - char ifname_mon[IFNAMSIZ + 1]; //interface name for monitor interface - - u8 p2p_enabled; - - u8 provdisc_req_issued; - - struct rtw_wdev_invit_info invit_info; - struct rtw_wdev_nego_info nego_info; - - u8 bandroid_scan; - bool block; - bool power_mgmt; - -#ifdef CONFIG_CONCURRENT_MODE - ATOMIC_T ro_ch_to; - ATOMIC_T switch_ch_to; -#endif - -}; - -#define wiphy_to_adapter(x) (*((_adapter**)wiphy_priv(x))) - -#define wdev_to_ndev(w) ((w)->netdev) - -int rtw_wdev_alloc(_adapter *padapter, struct device *dev); -void rtw_wdev_free(struct wireless_dev *wdev); -void rtw_wdev_unregister(struct wireless_dev *wdev); - -void rtw_cfg80211_init_wiphy(_adapter *padapter); - -void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork); -void rtw_cfg80211_surveydone_event_callback(_adapter *padapter); -struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork); -int rtw_cfg80211_check_bss(_adapter *padapter); -void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter); -void rtw_cfg80211_indicate_connect(_adapter *padapter); -void rtw_cfg80211_indicate_disconnect(_adapter *padapter); -void rtw_cfg80211_indicate_scan_done(_adapter *adapter, bool aborted); - -#ifdef CONFIG_AP_MODE -void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); -void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason); -#endif //CONFIG_AP_MODE - -void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len); -void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); -void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); -void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg); - -int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, int type); - -bool rtw_cfg80211_pwr_mgmt(_adapter *adapter); - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) -#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, buf, len, gfp) -#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) -#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, sig_dbm, buf, len, gfp) -#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0)) -#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp) -#else // kernel >= 3.12 -#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) -#endif // kernel >= 3.12 - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) -#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, buf, len) -#else -#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, bss, buf, len) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) -#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->pnetdev, cookie, buf, len, ack, gfp) -#else -#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->rtw_wdev, cookie, buf, len, ack, gfp) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) -#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) -#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) -#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) -#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) -#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) -#else -#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, duration, gfp) -#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, gfp) -#endif - -#endif //__IOCTL_CFG80211_H__ - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_intf.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_intf.h index 805f3b2f5eeb..5e4a48005665 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_intf.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_intf.h @@ -110,6 +110,7 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname); struct net_device *rtw_init_netdev(_adapter *padapter); +void rtw_unregister_netdev(_adapter *adapter); void rtw_unregister_netdevs(struct dvobj_priv *dvobj); #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service.h index b5901766e262..228589459ac2 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service.h @@ -256,7 +256,7 @@ void _rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_a 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); +extern void _rtw_memcpy(void *dec, const void *sour, u32 sz); extern int _rtw_memcmp(void *dst, void *src, u32 sz); extern void _rtw_memset(void *pbuf, int c, u32 sz); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_bsd.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_bsd.h deleted file mode 100755 index b56ccbb2b0f1..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_bsd.h +++ /dev/null @@ -1,749 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2013 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 __OSDEP_BSD_SERVICE_H_ -#define __OSDEP_BSD_SERVICE_H_ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include "usbdevs.h" - -#define USB_DEBUG_VAR rum_debug -#include - -#if 1 //Baron porting from linux, it's all temp solution, needs to check again -#include -#include /* XXX for PCPU_GET */ -// typedef struct semaphore _sema; - typedef struct sema _sema; -// typedef spinlock_t _lock; - typedef struct mtx _lock; - typedef struct mtx _mutex; - typedef struct timer_list _timer; - struct list_head { - struct list_head *next, *prev; - }; - struct __queue { - struct list_head queue; - _lock lock; - }; - - //typedef struct sk_buff _pkt; - typedef struct mbuf _pkt; - typedef struct mbuf _buffer; - - typedef struct __queue _queue; - typedef struct list_head _list; - typedef int _OS_STATUS; - //typedef u32 _irqL; - typedef unsigned long _irqL; - typedef struct ifnet * _nic_hdl; - - typedef pid_t _thread_hdl_; -// typedef struct thread _thread_hdl_; - typedef void thread_return; - typedef void* thread_context; - - //#define thread_exit() complete_and_exit(NULL, 0) - - #define thread_exit() do{printf("%s", "RTKTHREAD_exit");}while(0) - - typedef void timer_hdl_return; - typedef void* timer_hdl_context; - typedef struct work_struct _workitem; - -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -/* emulate a modern version */ -#define LINUX_VERSION_CODE KERNEL_VERSION(2, 6, 35) - -#define WIRELESS_EXT -1 -#define HZ hz -#define spin_lock_irqsave mtx_lock_irqsave -#define spin_lock_bh mtx_lock_irqsave -#define mtx_lock_irqsave(lock, x) mtx_lock(lock)//{local_irq_save((x)); mtx_lock_spin((lock));} -//#define IFT_RTW 0xf9 //ifnet allocate type for RTW -#define free_netdev if_free -#define LIST_CONTAINOR(ptr, type, member) \ - ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) -#define container_of(p,t,n) (t*)((p)-&(((t*)0)->n)) -/* - * Linux timers are emulated using FreeBSD callout functions - * (and taskqueue functionality). - * - * Currently no timer stats functionality. - * - * See (linux_compat) processes.c - * - */ -struct timer_list { - - /* FreeBSD callout related fields */ - struct callout callout; - - //timeout function - void (*function)(void*); - //argument - void *arg; - -}; -struct workqueue_struct; -struct work_struct; -typedef void (*work_func_t)(struct work_struct *work); -/* Values for the state of an item of work (work_struct) */ -typedef enum work_state { - WORK_STATE_UNSET = 0, - WORK_STATE_CALLOUT_PENDING = 1, - WORK_STATE_TASK_PENDING = 2, - WORK_STATE_WORK_CANCELLED = 3 -} work_state_t; - -struct work_struct { - struct task task; /* FreeBSD task */ - work_state_t state; /* the pending or otherwise state of work. */ - work_func_t func; -}; -#define spin_unlock_irqrestore mtx_unlock_irqrestore -#define spin_unlock_bh mtx_unlock_irqrestore -#define mtx_unlock_irqrestore(lock,x) mtx_unlock(lock); -extern void _rtw_spinlock_init(_lock *plock); - -//modify private structure to match freebsd -#define BITS_PER_LONG 32 -union ktime { - s64 tv64; -#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR) - struct { -#ifdef __BIG_ENDIAN - s32 sec, nsec; -#else - s32 nsec, sec; -#endif - } tv; -#endif -}; -#define kmemcheck_bitfield_begin(name) -#define kmemcheck_bitfield_end(name) -#define CHECKSUM_NONE 0 -typedef unsigned char *sk_buff_data_t; -typedef union ktime ktime_t; /* Kill this */ - -void rtw_mtx_lock(_lock *plock); - -void rtw_mtx_unlock(_lock *plock); - -/** - * struct sk_buff - socket buffer - * @next: Next buffer in list - * @prev: Previous buffer in list - * @sk: Socket we are owned by - * @tstamp: Time we arrived - * @dev: Device we arrived on/are leaving by - * @transport_header: Transport layer header - * @network_header: Network layer header - * @mac_header: Link layer header - * @_skb_refdst: destination entry (with norefcount bit) - * @sp: the security path, used for xfrm - * @cb: Control buffer. Free for use by every layer. Put private vars here - * @len: Length of actual data - * @data_len: Data length - * @mac_len: Length of link layer header - * @hdr_len: writable header length of cloned skb - * @csum: Checksum (must include start/offset pair) - * @csum_start: Offset from skb->head where checksumming should start - * @csum_offset: Offset from csum_start where checksum should be stored - * @local_df: allow local fragmentation - * @cloned: Head may be cloned (check refcnt to be sure) - * @nohdr: Payload reference only, must not modify header - * @pkt_type: Packet class - * @fclone: skbuff clone status - * @ip_summed: Driver fed us an IP checksum - * @priority: Packet queueing priority - * @users: User count - see {datagram,tcp}.c - * @protocol: Packet protocol from driver - * @truesize: Buffer size - * @head: Head of buffer - * @data: Data head pointer - * @tail: Tail pointer - * @end: End pointer - * @destructor: Destruct function - * @mark: Generic packet mark - * @nfct: Associated connection, if any - * @ipvs_property: skbuff is owned by ipvs - * @peeked: this packet has been seen already, so stats have been - * done for it, don't do them again - * @nf_trace: netfilter packet trace flag - * @nfctinfo: Relationship of this skb to the connection - * @nfct_reasm: netfilter conntrack re-assembly pointer - * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c - * @skb_iif: ifindex of device we arrived on - * @rxhash: the packet hash computed on receive - * @queue_mapping: Queue mapping for multiqueue devices - * @tc_index: Traffic control index - * @tc_verd: traffic control verdict - * @ndisc_nodetype: router type (from link layer) - * @dma_cookie: a cookie to one of several possible DMA operations - * done by skb DMA functions - * @secmark: security marking - * @vlan_tci: vlan tag control information - */ - -struct sk_buff { - /* These two members must be first. */ - struct sk_buff *next; - struct sk_buff *prev; - - ktime_t tstamp; - - struct sock *sk; - //struct net_device *dev; - struct ifnet *dev; - - /* - * This is the control buffer. It is free to use for every - * layer. Please put your private variables there. If you - * want to keep them across layers you have to do a skb_clone() - * first. This is owned by whoever has the skb queued ATM. - */ - char cb[48] __aligned(8); - - unsigned long _skb_refdst; -#ifdef CONFIG_XFRM - struct sec_path *sp; -#endif - unsigned int len, - data_len; - u16 mac_len, - hdr_len; - union { - u32 csum; - struct { - u16 csum_start; - u16 csum_offset; - }smbol2; - }smbol1; - u32 priority; - kmemcheck_bitfield_begin(flags1); - u8 local_df:1, - cloned:1, - ip_summed:2, - nohdr:1, - nfctinfo:3; - u8 pkt_type:3, - fclone:2, - ipvs_property:1, - peeked:1, - nf_trace:1; - kmemcheck_bitfield_end(flags1); - u16 protocol; - - void (*destructor)(struct sk_buff *skb); -#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) - struct nf_conntrack *nfct; - struct sk_buff *nfct_reasm; -#endif -#ifdef CONFIG_BRIDGE_NETFILTER - struct nf_bridge_info *nf_bridge; -#endif - - int skb_iif; -#ifdef CONFIG_NET_SCHED - u16 tc_index; /* traffic control index */ -#ifdef CONFIG_NET_CLS_ACT - u16 tc_verd; /* traffic control verdict */ -#endif -#endif - - u32 rxhash; - - kmemcheck_bitfield_begin(flags2); - u16 queue_mapping:16; -#ifdef CONFIG_IPV6_NDISC_NODETYPE - u8 ndisc_nodetype:2, - deliver_no_wcard:1; -#else - u8 deliver_no_wcard:1; -#endif - kmemcheck_bitfield_end(flags2); - - /* 0/14 bit hole */ - -#ifdef CONFIG_NET_DMA - dma_cookie_t dma_cookie; -#endif -#ifdef CONFIG_NETWORK_SECMARK - u32 secmark; -#endif - union { - u32 mark; - u32 dropcount; - }symbol3; - - u16 vlan_tci; - - sk_buff_data_t transport_header; - sk_buff_data_t network_header; - sk_buff_data_t mac_header; - /* These elements must be at the end, see alloc_skb() for details. */ - sk_buff_data_t tail; - sk_buff_data_t end; - unsigned char *head, - *data; - unsigned int truesize; - atomic_t users; -}; -struct sk_buff_head { - /* These two members must be first. */ - struct sk_buff *next; - struct sk_buff *prev; - - u32 qlen; - _lock lock; -}; -#define skb_tail_pointer(skb) skb->tail -static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len) -{ - unsigned char *tmp = skb_tail_pointer(skb); - //SKB_LINEAR_ASSERT(skb); - skb->tail += len; - skb->len += len; - return tmp; -} - -static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len) -{ - skb->len -= len; - if(skb->len < skb->data_len) - printf("%s(),%d,error!\n",__FUNCTION__,__LINE__); - return skb->data += len; -} -static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len) -{ - #ifdef PLATFORM_FREEBSD - return __skb_pull(skb, len); - #else - return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len); - #endif //PLATFORM_FREEBSD -} -static inline u32 skb_queue_len(const struct sk_buff_head *list_) -{ - return list_->qlen; -} -static inline void __skb_insert(struct sk_buff *newsk, - struct sk_buff *prev, struct sk_buff *next, - struct sk_buff_head *list) -{ - newsk->next = next; - newsk->prev = prev; - next->prev = prev->next = newsk; - list->qlen++; -} -static inline void __skb_queue_before(struct sk_buff_head *list, - struct sk_buff *next, - struct sk_buff *newsk) -{ - __skb_insert(newsk, next->prev, next, list); -} -static inline void skb_queue_tail(struct sk_buff_head *list, - struct sk_buff *newsk) -{ - mtx_lock(&list->lock); - __skb_queue_before(list, (struct sk_buff *)list, newsk); - mtx_unlock(&list->lock); -} -static inline struct sk_buff *skb_peek(struct sk_buff_head *list_) -{ - struct sk_buff *list = ((struct sk_buff *)list_)->next; - if (list == (struct sk_buff *)list_) - list = NULL; - return list; -} -static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list) -{ - struct sk_buff *next, *prev; - - list->qlen--; - next = skb->next; - prev = skb->prev; - skb->next = skb->prev = NULL; - next->prev = prev; - prev->next = next; -} - -static inline struct sk_buff *skb_dequeue(struct sk_buff_head *list) -{ - mtx_lock(&list->lock); - - struct sk_buff *skb = skb_peek(list); - if (skb) - __skb_unlink(skb, list); - - mtx_unlock(&list->lock); - - return skb; -} -static inline void skb_reserve(struct sk_buff *skb, int len) -{ - skb->data += len; - skb->tail += len; -} -static inline void __skb_queue_head_init(struct sk_buff_head *list) -{ - list->prev = list->next = (struct sk_buff *)list; - list->qlen = 0; -} -/* - * This function creates a split out lock class for each invocation; - * this is needed for now since a whole lot of users of the skb-queue - * infrastructure in drivers have different locking usage (in hardirq) - * than the networking core (in softirq only). In the long run either the - * network layer or drivers should need annotation to consolidate the - * main types of usage into 3 classes. - */ -static inline void skb_queue_head_init(struct sk_buff_head *list) -{ - _rtw_spinlock_init(&list->lock); - __skb_queue_head_init(list); -} -unsigned long copy_from_user(void *to, const void *from, unsigned long n); -unsigned long copy_to_user(void *to, const void *from, unsigned long n); -struct sk_buff * dev_alloc_skb(unsigned int size); -struct sk_buff *skb_clone(const struct sk_buff *skb); -void dev_kfree_skb_any(struct sk_buff *skb); -#endif //Baron porting from linux, it's all temp solution, needs to check again - - -#if 1 // kenny add Linux compatibility code for Linux USB driver -#include - -#define __init // __attribute ((constructor)) -#define __exit // __attribute ((destructor)) - -/* - * Definitions for module_init and module_exit macros. - * - * These macros will use the SYSINIT framework to call a specified - * function (with no arguments) on module loading or unloading. - * - */ - -void module_init_exit_wrapper(void *arg); - -#define module_init(initfn) \ - SYSINIT(mod_init_ ## initfn, \ - SI_SUB_KLD, SI_ORDER_FIRST, \ - module_init_exit_wrapper, initfn) - -#define module_exit(exitfn) \ - SYSUNINIT(mod_exit_ ## exitfn, \ - SI_SUB_KLD, SI_ORDER_ANY, \ - module_init_exit_wrapper, exitfn) - -/* - * The usb_register and usb_deregister functions are used to register - * usb drivers with the usb subsystem. - */ -int usb_register(struct usb_driver *driver); -int usb_deregister(struct usb_driver *driver); - -/* - * usb_get_dev and usb_put_dev - increment/decrement the reference count - * of the usb device structure. - * - * Original body of usb_get_dev: - * - * if (dev) - * get_device(&dev->dev); - * return dev; - * - * Reference counts are not currently used in this compatibility - * layer. So these functions will do nothing. - */ -static inline struct usb_device * -usb_get_dev(struct usb_device *dev) -{ - return dev; -} - -static inline void -usb_put_dev(struct usb_device *dev) -{ - return; -} - - -// rtw_usb_compat_linux -int rtw_usb_submit_urb(struct urb *urb, uint16_t mem_flags); -int rtw_usb_unlink_urb(struct urb *urb); -int rtw_usb_clear_halt(struct usb_device *dev, struct usb_host_endpoint *uhe); -int rtw_usb_control_msg(struct usb_device *dev, struct usb_host_endpoint *uhe, - uint8_t request, uint8_t requesttype, - uint16_t value, uint16_t index, void *data, - uint16_t size, usb_timeout_t timeout); -int rtw_usb_set_interface(struct usb_device *dev, uint8_t iface_no, uint8_t alt_index); -int rtw_usb_setup_endpoint(struct usb_device *dev, - struct usb_host_endpoint *uhe, usb_size_t bufsize); -struct urb *rtw_usb_alloc_urb(uint16_t iso_packets, uint16_t mem_flags); -struct usb_host_endpoint *rtw_usb_find_host_endpoint(struct usb_device *dev, uint8_t type, uint8_t ep); -struct usb_host_interface *rtw_usb_altnum_to_altsetting(const struct usb_interface *intf, uint8_t alt_index); -struct usb_interface *rtw_usb_ifnum_to_if(struct usb_device *dev, uint8_t iface_no); -void *rtw_usbd_get_intfdata(struct usb_interface *intf); -void rtw_usb_linux_register(void *arg); -void rtw_usb_linux_deregister(void *arg); -void rtw_usb_linux_free_device(struct usb_device *dev); -void rtw_usb_free_urb(struct urb *urb); -void rtw_usb_init_urb(struct urb *urb); -void rtw_usb_kill_urb(struct urb *urb); -void rtw_usb_set_intfdata(struct usb_interface *intf, void *data); -void rtw_usb_fill_bulk_urb(struct urb *urb, struct usb_device *udev, - struct usb_host_endpoint *uhe, void *buf, - int length, usb_complete_t callback, void *arg); -int rtw_usb_bulk_msg(struct usb_device *udev, struct usb_host_endpoint *uhe, - void *data, int len, uint16_t *pactlen, usb_timeout_t timeout); -void *usb_get_intfdata(struct usb_interface *intf); -int usb_linux_init_endpoints(struct usb_device *udev); - - - -typedef struct urb * PURB; - -typedef unsigned gfp_t; -#define __GFP_WAIT ((gfp_t)0x10u) /* Can wait and reschedule? */ -#define __GFP_HIGH ((gfp_t)0x20u) /* Should access emergency pools? */ -#define __GFP_IO ((gfp_t)0x40u) /* Can start physical IO? */ -#define __GFP_FS ((gfp_t)0x80u) /* Can call down to low-level FS? */ -#define __GFP_COLD ((gfp_t)0x100u) /* Cache-cold page required */ -#define __GFP_NOWARN ((gfp_t)0x200u) /* Suppress page allocation failure warning */ -#define __GFP_REPEAT ((gfp_t)0x400u) /* Retry the allocation. Might fail */ -#define __GFP_NOFAIL ((gfp_t)0x800u) /* Retry for ever. Cannot fail */ -#define __GFP_NORETRY ((gfp_t)0x1000u)/* Do not retry. Might fail */ -#define __GFP_NO_GROW ((gfp_t)0x2000u)/* Slab internal usage */ -#define __GFP_COMP ((gfp_t)0x4000u)/* Add compound page metadata */ -#define __GFP_ZERO ((gfp_t)0x8000u)/* Return zeroed page on success */ -#define __GFP_NOMEMALLOC ((gfp_t)0x10000u) /* Don't use emergency reserves */ -#define __GFP_HARDWALL ((gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */ - -/* This equals 0, but use constants in case they ever change */ -#define GFP_NOWAIT (GFP_ATOMIC & ~__GFP_HIGH) -/* GFP_ATOMIC means both !wait (__GFP_WAIT not set) and use emergency pool */ -#define GFP_ATOMIC (__GFP_HIGH) -#define GFP_NOIO (__GFP_WAIT) -#define GFP_NOFS (__GFP_WAIT | __GFP_IO) -#define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS) -#define GFP_USER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL) -#define GFP_HIGHUSER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL | \ - __GFP_HIGHMEM) - - -#endif // kenny add Linux compatibility code for Linux USB - -__inline static _list *get_next(_list *list) -{ - return list->next; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - - -#define LIST_CONTAINOR(ptr, type, member) \ - ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) - - -__inline static void _enter_critical(_lock *plock, _irqL *pirqL) -{ - spin_lock_irqsave(plock, *pirqL); -} - -__inline static void _exit_critical(_lock *plock, _irqL *pirqL) -{ - spin_unlock_irqrestore(plock, *pirqL); -} - -__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - spin_lock_irqsave(plock, *pirqL); -} - -__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - spin_unlock_irqrestore(plock, *pirqL); -} - -__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) -{ - spin_lock_bh(plock, *pirqL); -} - -__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) -{ - spin_unlock_bh(plock, *pirqL); -} - -__inline static void _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - - mtx_lock(pmutex); - -} - - -__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - - mtx_unlock(pmutex); - -} -static inline void __list_del(struct list_head * prev, struct list_head * next) -{ - next->prev = prev; - prev->next = next; -} -static inline void INIT_LIST_HEAD(struct list_head *list) -{ - list->next = list; - list->prev = list; -} -__inline static void rtw_list_delete(_list *plist) -{ - __list_del(plist->prev, plist->next); - INIT_LIST_HEAD(plist); -} - -__inline static void _init_timer(_timer *ptimer,_nic_hdl padapter,void *pfunc,void* cntx) -{ - ptimer->function = pfunc; - ptimer->arg = cntx; - callout_init(&ptimer->callout, CALLOUT_MPSAFE); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - // mod_timer(ptimer , (jiffies+(delay_time*HZ/1000))); - if(ptimer->function && ptimer->arg){ - rtw_mtx_lock(NULL); - callout_reset(&ptimer->callout, delay_time,ptimer->function, ptimer->arg); - rtw_mtx_unlock(NULL); - } -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - // del_timer_sync(ptimer); - // *bcancelled= _TRUE;//TRUE ==1; FALSE==0 - rtw_mtx_lock(NULL); - callout_drain(&ptimer->callout); - rtw_mtx_unlock(NULL); -} - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ - printf("%s Not implement yet! \n",__FUNCTION__); -} - -__inline static void _set_workitem(_workitem *pwork) -{ - printf("%s Not implement yet! \n",__FUNCTION__); -// schedule_work(pwork); -} - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ -} - -#define ATOMIC_INIT(i) { (i) } - -static __inline void thread_enter(char *name); - -//Atomic integer operations -typedef uint32_t ATOMIC_T ; - -#define rtw_netdev_priv(netdev) (((struct ifnet *)netdev)->if_softc) - -#define rtw_free_netdev(netdev) if_free((netdev)) - -#define NDEV_FMT "%s" -#define NDEV_ARG(ndev) "" -#define ADPT_FMT "%s" -#define ADPT_ARG(adapter) "" -#define FUNC_NDEV_FMT "%s" -#define FUNC_NDEV_ARG(ndev) __func__ -#define FUNC_ADPT_FMT "%s" -#define FUNC_ADPT_ARG(adapter) __func__ - -#define STRUCT_PACKED - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_ce.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_ce.h deleted file mode 100755 index 04c5b188e647..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_ce.h +++ /dev/null @@ -1,192 +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 __OSDEP_CE_SERVICE_H_ -#define __OSDEP_CE_SERVICE_H_ - - -#include -#include - -#ifdef CONFIG_SDIO_HCI -#include "SDCardDDK.h" -#endif - -#ifdef CONFIG_USB_HCI -#include -#endif - -typedef HANDLE _sema; -typedef LIST_ENTRY _list; -typedef NDIS_STATUS _OS_STATUS; - -typedef NDIS_SPIN_LOCK _lock; - -typedef HANDLE _rwlock; //Mutex - -typedef u32 _irqL; - -typedef NDIS_HANDLE _nic_hdl; - - -typedef NDIS_MINIPORT_TIMER _timer; - -struct __queue { - LIST_ENTRY queue; - _lock lock; -}; - -typedef NDIS_PACKET _pkt; -typedef NDIS_BUFFER _buffer; -typedef struct __queue _queue; - -typedef HANDLE _thread_hdl_; -typedef DWORD thread_return; -typedef void* thread_context; -typedef NDIS_WORK_ITEM _workitem; - -#define thread_exit() ExitThread(STATUS_SUCCESS); return 0; - - -#define SEMA_UPBND (0x7FFFFFFF) //8192 - -__inline static _list *get_prev(_list *list) -{ - return list->Blink; -} - -__inline static _list *get_next(_list *list) -{ - return list->Flink; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - -#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) - -__inline static void _enter_critical(_lock *plock, _irqL *pirqL) -{ - NdisAcquireSpinLock(plock); -} - -__inline static void _exit_critical(_lock *plock, _irqL *pirqL) -{ - NdisReleaseSpinLock(plock); -} - -__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - - -__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL) -{ - WaitForSingleObject(*prwlock, INFINITE ); - -} - -__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL) -{ - ReleaseMutex(*prwlock); -} - -__inline static void rtw_list_delete(_list *plist) -{ - RemoveEntryList(plist); - InitializeListHead(plist); -} - -#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3 - -__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) -{ - NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - NdisMSetTimer(ptimer,delay_time); -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - NdisMCancelTimer(ptimer,bcancelled); -} - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ - - NdisInitializeWorkItem(pwork, pfunc, cntx); -} - -__inline static void _set_workitem(_workitem *pwork) -{ - NdisScheduleWorkItem(pwork); -} - -#define ATOMIC_INIT(i) { (i) } - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ - { \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ - NdisMSleep(10000); \ - } \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ -} - -// limitation of path length -#define PATH_LENGTH_MAX MAX_PATH - -//Atomic integer operations -#define ATOMIC_T LONG - -#define NDEV_FMT "%s" -#define NDEV_ARG(ndev) "" -#define ADPT_FMT "%s" -#define ADPT_ARG(adapter) "" -#define FUNC_NDEV_FMT "%s" -#define FUNC_NDEV_ARG(ndev) __func__ -#define FUNC_ADPT_FMT "%s" -#define FUNC_ADPT_ARG(adapter) __func__ - -#define STRUCT_PACKED - - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_linux.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_linux.h index 894169dd1e58..223efc1c580f 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_linux.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_linux.h @@ -69,10 +69,16 @@ #include #endif +#ifdef CONFIG_NET_RADIO + #define CONFIG_WIRELESS_EXT +#endif + + /* Monitor mode */ + #include + #ifdef CONFIG_IOCTL_CFG80211 -// #include - #include - #include +/* #include */ + #include #endif //CONFIG_IOCTL_CFG80211 #ifdef CONFIG_TCP_CSUM_OFFLOAD_TX @@ -97,6 +103,14 @@ #endif #endif +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + #include + #include + #include + #include + #include +#endif //CONFIG_BT_COEXIST_SOCKET_TRX + #ifdef CONFIG_USB_HCI typedef struct urb * PURB; #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22)) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_xp.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_xp.h deleted file mode 100755 index 45d54af1f3be..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service_xp.h +++ /dev/null @@ -1,202 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2013 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 __OSDEP_LINUX_SERVICE_H_ -#define __OSDEP_LINUX_SERVICE_H_ - - #include - #include - #include - #include - -#ifdef CONFIG_USB_HCI - #include - #include - #include -#endif - - typedef KSEMAPHORE _sema; - typedef LIST_ENTRY _list; - typedef NDIS_STATUS _OS_STATUS; - - - typedef NDIS_SPIN_LOCK _lock; - - typedef KMUTEX _mutex; - - typedef KIRQL _irqL; - - // USB_PIPE for WINCE , but handle can be use just integer under windows - typedef NDIS_HANDLE _nic_hdl; - - - typedef NDIS_MINIPORT_TIMER _timer; - - struct __queue { - LIST_ENTRY queue; - _lock lock; - }; - - typedef NDIS_PACKET _pkt; - typedef NDIS_BUFFER _buffer; - typedef struct __queue _queue; - - typedef PKTHREAD _thread_hdl_; - typedef void thread_return; - typedef void* thread_context; - - typedef NDIS_WORK_ITEM _workitem; - - #define thread_exit() PsTerminateSystemThread(STATUS_SUCCESS); - - #define HZ 10000000 - #define SEMA_UPBND (0x7FFFFFFF) //8192 - -__inline static _list *get_next(_list *list) -{ - return list->Flink; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - - -#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) - - -__inline static _enter_critical(_lock *plock, _irqL *pirqL) -{ - NdisAcquireSpinLock(plock); -} - -__inline static _exit_critical(_lock *plock, _irqL *pirqL) -{ - NdisReleaseSpinLock(plock); -} - - -__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - -__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - -__inline static _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - KeWaitForSingleObject(pmutex, Executive, KernelMode, FALSE, NULL); -} - - -__inline static _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - KeReleaseMutex(pmutex, FALSE); -} - - -__inline static void rtw_list_delete(_list *plist) -{ - RemoveEntryList(plist); - InitializeListHead(plist); -} - -#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3 - -__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) -{ - NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - NdisMSetTimer(ptimer,delay_time); -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - NdisMCancelTimer(ptimer,bcancelled); -} - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ - - NdisInitializeWorkItem(pwork, pfunc, cntx); -} - -__inline static void _set_workitem(_workitem *pwork) -{ - NdisScheduleWorkItem(pwork); -} - - -#define ATOMIC_INIT(i) { (i) } - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ - { \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ - NdisMSleep(10000); \ - } \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ -} - -// limitation of path length -#define PATH_LENGTH_MAX MAX_PATH - -//Atomic integer operations -#define ATOMIC_T LONG - - -#define NDEV_FMT "%s" -#define NDEV_ARG(ndev) "" -#define ADPT_FMT "%s" -#define ADPT_ARG(adapter) "" -#define FUNC_NDEV_FMT "%s" -#define FUNC_NDEV_ARG(ndev) __func__ -#define FUNC_ADPT_FMT "%s" -#define FUNC_ADPT_ARG(adapter) __func__ - -#define STRUCT_PACKED - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/recv_osdep.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/recv_osdep.h index e1013379f11f..269ce2460c2c 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/recv_osdep.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/recv_osdep.h @@ -29,6 +29,8 @@ extern s32 rtw_recv_entry(union recv_frame *precv_frame); extern int rtw_recv_indicatepkt(_adapter *adapter, union recv_frame *precv_frame); extern void rtw_recv_returnpacket(IN _nic_hdl cnxt, IN _pkt *preturnedpkt); +extern int rtw_recv_monitor(_adapter *padapter, union recv_frame *precv_frame); + extern void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame); extern void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8192c_recv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8192c_recv.h deleted file mode 100755 index ad4d37010700..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8192c_recv.h +++ /dev/null @@ -1,113 +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 _RTL8192C_RECV_H_ -#define _RTL8192C_RECV_H_ - -#define RECV_BLK_SZ 512 -#define RECV_BLK_CNT 16 -#define RECV_BLK_TH RECV_BLK_CNT - -#if defined(CONFIG_USB_HCI) - -#ifndef MAX_RECVBUF_SZ -#ifdef PLATFORM_OS_CE -#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k -#else - #ifndef CONFIG_MINIMAL_MEMORY_USAGE - //#define MAX_RECVBUF_SZ (32768) // 32k - //#define MAX_RECVBUF_SZ (16384) //16K - //#define MAX_RECVBUF_SZ (10240) //10K - #ifdef CONFIG_PLATFORM_MSTAR - #define MAX_RECVBUF_SZ (8192) // 8K - #else - #define MAX_RECVBUF_SZ (15360) // 15k < 16k - #endif - //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k - #else - #define MAX_RECVBUF_SZ (4000) // about 4K - #endif -#endif -#endif //!MAX_RECVBUF_SZ - -#elif defined(CONFIG_PCI_HCI) -//#ifndef CONFIG_MINIMAL_MEMORY_USAGE -// #define MAX_RECVBUF_SZ (9100) -//#else - #define MAX_RECVBUF_SZ (4000) // about 4K -//#endif - - -#elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - -#define MAX_RECVBUF_SZ (10240) - -#endif - - - -struct phy_stat -{ - unsigned int phydw0; - - unsigned int phydw1; - - unsigned int phydw2; - - unsigned int phydw3; - - unsigned int phydw4; - - unsigned int phydw5; - - unsigned int phydw6; - - unsigned int phydw7; -}; - -// Rx smooth factor -#define Rx_Smooth_Factor (20) - - -#ifdef CONFIG_USB_HCI -typedef struct _INTERRUPT_MSG_FORMAT_EX{ - unsigned int C2H_MSG0; - unsigned int C2H_MSG1; - unsigned int C2H_MSG2; - unsigned int C2H_MSG3; - unsigned int HISR; // from HISR Reg0x124, read to clear - unsigned int HISRE;// from HISRE Reg0x12c, read to clear - unsigned int MSG_EX; -}INTERRUPT_MSG_FORMAT_EX,*PINTERRUPT_MSG_FORMAT_EX; - -void rtl8192cu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); -int rtl8192cu_init_recv_priv(_adapter * padapter); -void rtl8192cu_free_recv_priv(_adapter * padapter); -#endif - -#ifdef CONFIG_PCI_HCI -int rtl8192ce_init_recv_priv(_adapter * padapter); -void rtl8192ce_free_recv_priv(_adapter * padapter); -#endif - -void rtl8192c_translate_rx_signal_stuff(union recv_frame *precvframe, struct phy_stat *pphy_status); -void rtl8192c_query_rx_desc_status(union recv_frame *precvframe, struct recv_stat *pdesc); - -#endif - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8192c_rf.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8192c_rf.h deleted file mode 100755 index 46196508669d..000000000000 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8192c_rf.h +++ /dev/null @@ -1,45 +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 _RTL8192C_RF_H_ -#define _RTL8192C_RF_H_ - - -// -// RF RL6052 Series API -// -void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, - IN u16 DataRate); -void rtl8192c_PHY_RF6052SetBandwidth( - IN PADAPTER Adapter, - IN CHANNEL_WIDTH Bandwidth); -VOID rtl8192c_PHY_RF6052SetCckTxPower( - IN PADAPTER Adapter, - IN u8* pPowerlevel); -VOID rtl8192c_PHY_RF6052SetOFDMTxPower( - IN PADAPTER Adapter, - IN u8* pPowerLevel, - IN u8 Channel); -int PHY_RF6052_Config8192C( IN PADAPTER Adapter ); - -/*--------------------------Exported Function prototype---------------------*/ - - -#endif/* End of HalRf.h */ - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_cmd.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_cmd.h index 9826d0da30ed..0abb84b0e1e9 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_cmd.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_cmd.h @@ -56,6 +56,7 @@ enum h2c_cmd_8723B{ H2C_8723B_RSSI_SETTING = 0x42, H2C_8723B_AP_REQ_TXRPT = 0x43, H2C_8723B_INIT_RATE_COLLECT = 0x44, + H2C_8723B_RA_PARA_ADJUST = 0x46, //BT Class: 011 H2C_8723B_B_TYPE_TDMA = 0x60, diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_hal.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_hal.h index 11ccd6ef09f5..7a2b059f43f2 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_hal.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_hal.h @@ -124,8 +124,8 @@ typedef struct _RT_8723B_FIRMWARE_HDR #define PAGE_SIZE_TX_8723B 128 #define PAGE_SIZE_RX_8723B 8 -#define TX_DMA_SIZE_8723B 0x8000 // 32K(TX) -#define RX_DMA_SIZE_8723B 0x4000 // 16K(RX) +#define TX_DMA_SIZE_8723B 0x8000 /* 32K(TX) */ +#define RX_DMA_SIZE_8723B 0x4000 /* 16K(RX) */ #ifdef CONFIG_FW_C2H_DEBUG #define RX_DMA_RESERVED_SIZE_8723B 0x100 // 256B, reserved for c2h debug message @@ -283,6 +283,7 @@ void Hal_EfuseParseXtal_8723B(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); void Hal_EfuseParseThermalMeter_8723B(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); VOID Hal_EfuseParsePackageType_8723B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); VOID Hal_EfuseParseVoltage_8723B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +VOID Hal_EfuseParseBoardType_8723B(PADAPTER Adapter, u8* PROMContent,BOOLEAN AutoloadFail); #ifdef CONFIG_C2H_PACKET_EN void rtl8723b_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length); @@ -317,12 +318,13 @@ void rtl8723bs_cancle_checkbthang_workqueue(_adapter * adapter); void rtl8723bs_hal_check_bt_hang(_adapter * adapter); #endif +#ifdef CONFIG_GPIO_WAKEUP +void HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue); +#endif + int FirmwareDownloadBT(IN PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware); void CCX_FwC2HTxRpt_8723b(PADAPTER padapter, u8 *pdata, u8 len); -#ifdef CONFIG_FW_C2H_DEBUG -void Debug_FwC2H_8723b(PADAPTER padapter, u8 *pdata, u8 len); -#endif //CONFIG_FW_C2H_DEBUG s32 c2h_id_filter_ccx_8723b(u8 *buf); s32 c2h_handler_8723b(PADAPTER padapter, u8 *pC2hEvent); u8 MRateToHwRate8723B(u8 rate); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_recv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_recv.h index 4218f50999b3..f4611864dc78 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_recv.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_recv.h @@ -20,7 +20,48 @@ #ifndef __RTL8723B_RECV_H__ #define __RTL8723B_RECV_H__ -#include +#define RECV_BLK_SZ 512 +#define RECV_BLK_CNT 16 +#define RECV_BLK_TH RECV_BLK_CNT + +#if defined(CONFIG_USB_HCI) + +#ifndef MAX_RECVBUF_SZ +#ifdef PLATFORM_OS_CE +#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k +#else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + //#define MAX_RECVBUF_SZ (32768) // 32k + //#define MAX_RECVBUF_SZ (16384) //16K + //#define MAX_RECVBUF_SZ (10240) //10K + #ifdef CONFIG_PLATFORM_MSTAR + #define MAX_RECVBUF_SZ (8192) // 8K + #else + #define MAX_RECVBUF_SZ (15360) // 15k < 16k + #endif + //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k + #else + #define MAX_RECVBUF_SZ (4000) // about 4K + #endif +#endif +#endif //!MAX_RECVBUF_SZ + +#elif defined(CONFIG_PCI_HCI) +//#ifndef CONFIG_MINIMAL_MEMORY_USAGE +// #define MAX_RECVBUF_SZ (9100) +//#else + #define MAX_RECVBUF_SZ (4000) // about 4K +//#endif + + +#elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + +#define MAX_RECVBUF_SZ (10240) + +#endif + +// Rx smooth factor +#define Rx_Smooth_Factor (20) #ifdef CONFIG_SDIO_HCI #ifndef CONFIG_SDIO_RX_COPY @@ -45,8 +86,7 @@ s32 rtl8723be_init_recv_priv(PADAPTER padapter); void rtl8723be_free_recv_priv(PADAPTER padapter); #endif -void rtl8723b_query_rx_phy_status(union recv_frame *precvframe, struct phy_stat *pphy_status); void rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc); -#endif +#endif /* __RTL8723B_RECV_H__ */ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_rf.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_rf.h index 1c6d42072c28..2bb734176e96 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_rf.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_rf.h @@ -20,8 +20,6 @@ #ifndef __RTL8723B_RF_H__ #define __RTL8723B_RF_H__ -#include "rtl8192c_rf.h" - int PHY_RF6052_Config8723B( IN PADAPTER Adapter ); VOID diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_spec.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_spec.h index aa4bc2cf3552..0821e50a1aa1 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_spec.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_spec.h @@ -164,7 +164,10 @@ // 0x0100h ~ 0x01FFh MACTOP General Configuration // //----------------------------------------------------- - +#undef IS_E_CUT +#define IS_E_CUT(version) FALSE +#undef IS_F_CUT +#define IS_F_CUT(version) ((GET_CVID_CUT_VERSION(version) == E_CUT_VERSION) ? TRUE : FALSE) //----------------------------------------------------- // diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_android.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_android.h index cc59417397a1..9609b3ac87a8 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_android.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_android.h @@ -57,6 +57,7 @@ enum ANDROID_WIFI_CMD { ANDROID_WIFI_CMD_MACADDR, + ANDROID_WIFI_CMD_BLOCK_SCAN, ANDROID_WIFI_CMD_BLOCK, ANDROID_WIFI_CMD_WFD_ENABLE, @@ -69,7 +70,7 @@ enum ANDROID_WIFI_CMD { ANDROID_WIFI_CMD_HOSTAPD_SET_MACADDR_ACL, ANDROID_WIFI_CMD_HOSTAPD_ACL_ADD_STA, ANDROID_WIFI_CMD_HOSTAPD_ACL_REMOVE_STA, -#ifdef CONFIG_GTK_OL +#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)) ANDROID_WIFI_CMD_GTK_REKEY_OFFLOAD, #endif //CONFIG_GTK_OL ANDROID_WIFI_CMD_P2P_DISABLE, diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_br_ext.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_br_ext.h index c8d780165ae0..dcb51014ae2f 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_br_ext.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_br_ext.h @@ -29,7 +29,7 @@ #define DEBUG_INFO //DBG_8192C #define DEBUG_ERR DBG_8192C //#define GET_MY_HWADDR ((GET_MIB(priv))->dot11OperationEntry.hwaddr) -#define GET_MY_HWADDR(padapter) ((padapter)->eeprompriv.mac_addr) +#define GET_MY_HWADDR(padapter) (adapter_mac_addr(padapter)) #endif // rtw_wifi_driver #define NAT25_HASH_BITS 4 diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_btcoex.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_btcoex.h index e7b2fa0a5d6f..266ce1e46765 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_btcoex.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_btcoex.h @@ -22,6 +22,302 @@ #include +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + +#define NETLINK_USER 31 +#define CONNECT_PORT 30000 +#define CONNECT_PORT_BT 30001 +#define KERNEL_SOCKET_OK 0x01 +#define NETLINK_SOCKET_OK 0x02 + +#define OTHER 0 +#define RX_ATTEND_ACK 1 +#define RX_LEAVE_ACK 2 +#define RX_BT_LEAVE 3 +#define RX_INVITE_REQ 4 +#define RX_ATTEND_REQ 5 +#define RX_INVITE_RSP 6 + +#define invite_req "INVITE_REQ" +#define invite_rsp "INVITE_RSP" +#define attend_req "ATTEND_REQ" +#define attend_ack "ATTEND_ACK" +#define wifi_leave "WIFI_LEAVE" +#define leave_ack "LEAVE_ACK" +#define bt_leave "BT_LEAVE" + +#define BT_INFO_NOTIFY_CMD 0x0106 +#define BT_INFO_LEN 8 + +typedef struct _HCI_LINK_INFO{ + u2Byte ConnectHandle; + u1Byte IncomingTrafficMode; + u1Byte OutgoingTrafficMode; + u1Byte BTProfile; + u1Byte BTCoreSpec; + s1Byte BT_RSSI; + u1Byte TrafficProfile; + u1Byte linkRole; +}HCI_LINK_INFO, *PHCI_LINK_INFO; + +#define MAX_BT_ACL_LINK_NUM 8 + +typedef struct _HCI_EXT_CONFIG{ + HCI_LINK_INFO aclLink[MAX_BT_ACL_LINK_NUM]; + u1Byte btOperationCode; + u2Byte CurrentConnectHandle; + u1Byte CurrentIncomingTrafficMode; + u1Byte CurrentOutgoingTrafficMode; + + u1Byte NumberOfACL; + u1Byte NumberOfSCO; + u1Byte CurrentBTStatus; + u2Byte HCIExtensionVer; + + BOOLEAN bEnableWifiScanNotify; +}HCI_EXT_CONFIG, *PHCI_EXT_CONFIG; + +typedef struct _HCI_PHY_LINK_BSS_INFO{ + u2Byte bdCap; // capability information + + // Qos related. Added by Annie, 2005-11-01. + //BSS_QOS BssQos; + +}HCI_PHY_LINK_BSS_INFO, *PHCI_PHY_LINK_BSS_INFO; + +typedef enum _BT_CONNECT_TYPE{ + BT_CONNECT_AUTH_REQ =0x00, + BT_CONNECT_AUTH_RSP =0x01, + BT_CONNECT_ASOC_REQ =0x02, + BT_CONNECT_ASOC_RSP =0x03, + BT_DISCONNECT =0x04 +}BT_CONNECT_TYPE,*PBT_CONNECT_TYPE; + + +typedef struct _PACKET_IRP_HCIEVENT_DATA { + u8 EventCode; + u8 Length; //total cmd length = extension event length+1(extension event code length) + u8 Data[1]; // byte1 is extension event code +} rtw_HCI_event; + + +struct btinfo_8761ATV { + 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 bPage:1; + u8 TRxMask:1; + u8 Sniff_attempt:1; + + u8 rssi; + + u8 A2dp_rate:1; + u8 ReInit:1; + u8 MaxPower:1; + u8 bEnIgnoreWlanAct:1; + u8 TxPowerLow:1; + u8 TxPowerHigh:1; + u8 eSCO_SCO:1; + u8 Master_Slave:1; + + u8 ACL_TRx_TP_low; + u8 ACL_TRx_TP_high; +}; + +#define HCIOPCODE(_OCF, _OGF) ((_OGF)<<10|(_OCF)) +#define HCIOPCODELOW(_OCF, _OGF) (u8)(HCIOPCODE(_OCF, _OGF)&0x00ff) +#define HCIOPCODEHIGHT(_OCF, _OGF) (u8)(HCIOPCODE(_OCF, _OGF)>>8) +#define HCI_OGF(opCode) (unsigned char)((0xFC00 & (opCode)) >> 10) +#define HCI_OCF(opCode) ( 0x3FF & (opCode)) + + +typedef enum _HCI_STATUS{ + HCI_STATUS_SUCCESS =0x00, //Success + HCI_STATUS_UNKNOW_HCI_CMD =0x01, //Unknown HCI Command + HCI_STATUS_UNKNOW_CONNECT_ID =0X02, //Unknown Connection Identifier + HCI_STATUS_HW_FAIL =0X03, //Hardware Failure + HCI_STATUS_PAGE_TIMEOUT =0X04, //Page Timeout + HCI_STATUS_AUTH_FAIL =0X05, //Authentication Failure + HCI_STATUS_PIN_OR_KEY_MISSING =0X06, //PIN or Key Missing + HCI_STATUS_MEM_CAP_EXCEED =0X07, //Memory Capacity Exceeded + HCI_STATUS_CONNECT_TIMEOUT =0X08, //Connection Timeout + HCI_STATUS_CONNECT_LIMIT =0X09, //Connection Limit Exceeded + HCI_STATUS_SYN_CONNECT_LIMIT =0X0a, //Synchronous Connection Limit To A Device Exceeded + HCI_STATUS_ACL_CONNECT_EXISTS =0X0b, //ACL Connection Already Exists + HCI_STATUS_CMD_DISALLOW =0X0c, //Command Disallowed + HCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE =0X0d, //Connection Rejected due to Limited Resources + HCI_STATUS_CONNECT_RJT_SEC_REASON =0X0e, //Connection Rejected Due To Security Reasons + HCI_STATUS_CONNECT_RJT_UNACCEPT_BD_ADDR =0X0f, //Connection Rejected due to Unacceptable BD_ADDR + HCI_STATUS_CONNECT_ACCEPT_TIMEOUT =0X10, //Connection Accept Timeout Exceeded + HCI_STATUS_UNSUPPORT_FEATURE_PARA_VALUE =0X11, //Unsupported Feature or Parameter Value + HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE =0X12, //Invalid HCI Command Parameters + HCI_STATUS_REMOTE_USER_TERMINATE_CONNECT =0X13, //Remote User Terminated Connection + HCI_STATUS_REMOTE_DEV_TERMINATE_LOW_RESOURCE =0X14, //Remote Device Terminated Connection due to Low Resources + HCI_STATUS_REMOTE_DEV_TERMINATE_CONNECT_POWER_OFF =0X15, //Remote Device Terminated Connection due to Power Off + HCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST =0X16, //Connection Terminated By Local Host + HCI_STATUS_REPEATE_ATTEMPT =0X17, //Repeated Attempts + HCI_STATUS_PAIR_NOT_ALLOW =0X18, //Pairing Not Allowed + HCI_STATUS_UNKNOW_LMP_PDU =0X19, //Unknown LMP PDU + HCI_STATUS_UNSUPPORT_REMOTE_LMP_FEATURE =0X1a, //Unsupported Remote Feature / Unsupported LMP Feature + HCI_STATUS_SOC_OFFSET_REJECT =0X1b, //SCO Offset Rejected + HCI_STATUS_SOC_INTERVAL_REJECT =0X1c, //SCO Interval Rejected + HCI_STATUS_SOC_AIR_MODE_REJECT =0X1d,//SCO Air Mode Rejected + HCI_STATUS_INVALID_LMP_PARA =0X1e, //Invalid LMP Parameters + HCI_STATUS_UNSPECIFIC_ERROR =0X1f, //Unspecified Error + HCI_STATUS_UNSUPPORT_LMP_PARA_VALUE =0X20, //Unsupported LMP Parameter Value + HCI_STATUS_ROLE_CHANGE_NOT_ALLOW =0X21, //Role Change Not Allowed + HCI_STATUS_LMP_RESPONSE_TIMEOUT =0X22, //LMP Response Timeout + HCI_STATUS_LMP_ERROR_TRANSACTION_COLLISION =0X23, //LMP Error Transaction Collision + HCI_STATUS_LMP_PDU_NOT_ALLOW =0X24, //LMP PDU Not Allowed + HCI_STATUS_ENCRYPTION_MODE_NOT_ALLOW =0X25, //Encryption Mode Not Acceptable + HCI_STATUS_LINK_KEY_CAN_NOT_CHANGE =0X26, //Link Key Can Not be Changed + HCI_STATUS_REQUEST_QOS_NOT_SUPPORT =0X27, //Requested QoS Not Supported + HCI_STATUS_INSTANT_PASSED =0X28, //Instant Passed + HCI_STATUS_PAIRING_UNIT_KEY_NOT_SUPPORT =0X29, //Pairing With Unit Key Not Supported + HCI_STATUS_DIFFERENT_TRANSACTION_COLLISION =0X2a, //Different Transaction Collision + HCI_STATUS_RESERVE_1 =0X2b, //Reserved + HCI_STATUS_QOS_UNACCEPT_PARA =0X2c, //QoS Unacceptable Parameter + HCI_STATUS_QOS_REJECT =0X2d, //QoS Rejected + HCI_STATUS_CHNL_CLASSIFICATION_NOT_SUPPORT =0X2e, //Channel Classification Not Supported + HCI_STATUS_INSUFFICIENT_SECURITY =0X2f, //Insufficient Security + HCI_STATUS_PARA_OUT_OF_RANGE =0x30, //Parameter Out Of Mandatory Range + HCI_STATUS_RESERVE_2 =0X31, //Reserved + HCI_STATUS_ROLE_SWITCH_PENDING =0X32, //Role Switch Pending + HCI_STATUS_RESERVE_3 =0X33, //Reserved + HCI_STATUS_RESERVE_SOLT_VIOLATION =0X34, //Reserved Slot Violation + HCI_STATUS_ROLE_SWITCH_FAIL =0X35, //Role Switch Failed + HCI_STATUS_EXTEND_INQUIRY_RSP_TOO_LARGE =0X36, //Extended Inquiry Response Too Large + HCI_STATUS_SEC_SIMPLE_PAIRING_NOT_SUPPORT =0X37, //Secure Simple Pairing Not Supported By Host. + HCI_STATUS_HOST_BUSY_PAIRING =0X38, //Host Busy - Pairing + HCI_STATUS_CONNECT_REJ_NOT_SUIT_CHNL_FOUND =0X39, //Connection Rejected due to No Suitable Channel Found + HCI_STATUS_CONTROLLER_BUSY =0X3a //CONTROLLER BUSY +}RTW_HCI_STATUS; + +#define HCI_EVENT_COMMAND_COMPLETE 0x0e + +#define OGF_EXTENSION 0X3f +typedef enum HCI_EXTENSION_COMMANDS{ + HCI_SET_ACL_LINK_DATA_FLOW_MODE =0x0010, + HCI_SET_ACL_LINK_STATUS =0x0020, + HCI_SET_SCO_LINK_STATUS =0x0030, + HCI_SET_RSSI_VALUE =0x0040, + HCI_SET_CURRENT_BLUETOOTH_STATUS =0x0041, + + //The following is for RTK8723 + HCI_EXTENSION_VERSION_NOTIFY =0x0100, + HCI_LINK_STATUS_NOTIFY =0x0101, + HCI_BT_OPERATION_NOTIFY =0x0102, + HCI_ENABLE_WIFI_SCAN_NOTIFY =0x0103, + HCI_QUERY_RF_STATUS =0x0104, + HCI_BT_ABNORMAL_NOTIFY =0x0105, + HCI_BT_INFO_NOTIFY =0x0106, + HCI_BT_COEX_NOTIFY =0x0107, + HCI_BT_PATCH_VERSION_NOTIFY =0x0108, + HCI_BT_AFH_MAP_NOTIFY =0x0109, + HCI_BT_REGISTER_VALUE_NOTIFY =0x010a, + + //The following is for IVT + HCI_WIFI_CURRENT_CHANNEL =0x0300, + HCI_WIFI_CURRENT_BANDWIDTH =0x0301, + HCI_WIFI_CONNECTION_STATUS =0x0302 +}RTW_HCI_EXT_CMD; + +#define HCI_EVENT_EXTENSION_RTK 0xfe +typedef enum HCI_EXTENSION_EVENT_RTK{ + HCI_EVENT_EXT_WIFI_SCAN_NOTIFY =0x01, + HCI_EVENT_EXT_WIFI_RF_STATUS_NOTIFY =0x02, + HCI_EVENT_EXT_BT_INFO_CONTROL =0x03, + HCI_EVENT_EXT_BT_COEX_CONTROL =0x04 +}RTW_HCI_EXT_EVENT; + +typedef enum _BT_TRAFFIC_MODE{ + BT_MOTOR_EXT_BE = 0x00, //Best Effort. Default. for HCRP, PAN, SDP, RFCOMM-based profiles like FTP,OPP, SPP, DUN, etc. + BT_MOTOR_EXT_GUL = 0x01, //Guaranteed Latency. This type of traffic is used e.g. for HID and AVRCP. + BT_MOTOR_EXT_GUB = 0X02, //Guaranteed Bandwidth. + BT_MOTOR_EXT_GULB = 0X03 //Guaranteed Latency and Bandwidth. for A2DP and VDP. +} BT_TRAFFIC_MODE; + +typedef enum _BT_TRAFFIC_MODE_PROFILE{ + BT_PROFILE_NONE, + BT_PROFILE_A2DP, + BT_PROFILE_PAN , + BT_PROFILE_HID, + BT_PROFILE_SCO +} BT_TRAFFIC_MODE_PROFILE; + +typedef enum _HCI_EXT_BT_OPERATION { + HCI_BT_OP_NONE = 0x0, + HCI_BT_OP_INQUIRY_START = 0x1, + HCI_BT_OP_INQUIRY_FINISH = 0x2, + HCI_BT_OP_PAGING_START = 0x3, + HCI_BT_OP_PAGING_SUCCESS = 0x4, + HCI_BT_OP_PAGING_UNSUCCESS = 0x5, + HCI_BT_OP_PAIRING_START = 0x6, + HCI_BT_OP_PAIRING_FINISH = 0x7, + HCI_BT_OP_BT_DEV_ENABLE = 0x8, + HCI_BT_OP_BT_DEV_DISABLE = 0x9, + HCI_BT_OP_MAX +} HCI_EXT_BT_OPERATION, *PHCI_EXT_BT_OPERATION; + +typedef struct _BT_MGNT{ + BOOLEAN bBTConnectInProgress; + BOOLEAN bLogLinkInProgress; + BOOLEAN bPhyLinkInProgress; + BOOLEAN bPhyLinkInProgressStartLL; + u1Byte BtCurrentPhyLinkhandle; + u2Byte BtCurrentLogLinkhandle; + u1Byte CurrentConnectEntryNum; + u1Byte DisconnectEntryNum; + u1Byte CurrentBTConnectionCnt; + BT_CONNECT_TYPE BTCurrentConnectType; + BT_CONNECT_TYPE BTReceiveConnectPkt; + u1Byte BTAuthCount; + u1Byte BTAsocCount; + BOOLEAN bStartSendSupervisionPkt; + BOOLEAN BtOperationOn; + BOOLEAN BTNeedAMPStatusChg; + BOOLEAN JoinerNeedSendAuth; + HCI_PHY_LINK_BSS_INFO bssDesc; + HCI_EXT_CONFIG ExtConfig; + BOOLEAN bNeedNotifyAMPNoCap; + BOOLEAN bCreateSpportQos; + BOOLEAN bSupportProfile; + u1Byte BTChannel; + BOOLEAN CheckChnlIsSuit; + BOOLEAN bBtScan; + BOOLEAN btLogoTest; + BOOLEAN bRfStatusNotified; + BOOLEAN bBtRsvedPageDownload; +}BT_MGNT, *PBT_MGNT; + +struct bt_coex_info { + /* For Kernel Socket */ + struct socket *udpsock; + struct sockaddr_in wifi_sockaddr; /*wifi socket*/ + struct sockaddr_in bt_sockaddr;/* BT socket */ + struct sock *sk_store;/*back up socket for UDP RX int*/ + + /* store which socket is OK */ + u8 sock_open; + + u8 BT_attend; + u8 is_exist; /* socket exist */ + BT_MGNT BtMgnt; + struct workqueue_struct *btcoex_wq; + struct delayed_work recvmsg_work; +}; +#endif //CONFIG_BT_COEXIST_SOCKET_TRX #define PACKET_NORMAL 0 #define PACKET_DHCP 1 @@ -46,6 +342,7 @@ void rtw_btcoex_SwitchBtTRxMask(PADAPTER); void rtw_btcoex_Switch(PADAPTER, u8 enable); u8 rtw_btcoex_IsBtDisabled(PADAPTER); void rtw_btcoex_Handler(PADAPTER); +s32 rtw_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter); s32 rtw_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER); u32 rtw_btcoex_GetAMPDUSize(PADAPTER); void rtw_btcoex_SetManualControl(PADAPTER, u8 bmanual); @@ -66,11 +363,31 @@ void rtw_btcoex_SetDBG(PADAPTER, u32 *pDbgModule); u32 rtw_btcoex_GetDBG(PADAPTER, u8 *pStrBuf, u32 bufSize); u8 rtw_btcoex_IncreaseScanDeviceNum(PADAPTER); u8 rtw_btcoex_IsBtLinkExist(PADAPTER); +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX +void rtw_btcoex_SetBtPatchVersion(PADAPTER padapter,u16 btHciVer, u16 btPatchVer); +void rtw_btcoex_SetHciVersion(PADAPTER padapter, u16 hciVersion); +void rtw_btcoex_StackUpdateProfileInfo(void); +void rtw_btcoex_init_socket(_adapter *padapter); +void rtw_btcoex_close_socket(_adapter *padapter); +void rtw_btcoex_dump_tx_msg(u8 *tx_msg, u8 len, u8 *msg_name); +u8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool force); +u8 rtw_btcoex_create_kernel_socket(_adapter *padapter); +void rtw_btcoex_close_kernel_socket(_adapter *padapter); +void rtw_btcoex_recvmsgbysocket(void *data); +u16 rtw_btcoex_parse_recv_data(u8 *msg, u8 msg_size); +u8 rtw_btcoex_btinfo_cmd(PADAPTER padapter, u8 *pbuf, u16 length); +void rtw_btcoex_parse_hci_cmd(_adapter *padapter, u8 *cmd, u16 len); +void rtw_btcoex_SendEventExtBtCoexControl(PADAPTER Adapter, u8 bNeedDbgRsp, u8 dataLen, void *pData); +void rtw_btcoex_SendEventExtBtInfoControl(PADAPTER Adapter, u8 dataLen, void *pData); +void rtw_btcoex_SendScanNotify(PADAPTER padapter, u8 scanType); +#define BT_SendEventExtBtCoexControl(Adapter, bNeedDbgRsp, dataLen, pData) rtw_btcoex_SendEventExtBtCoexControl(Adapter, bNeedDbgRsp, dataLen, pData) +#define BT_SendEventExtBtInfoControl(Adapter, dataLen, pData) rtw_btcoex_SendEventExtBtInfoControl(Adapter, dataLen, pData) +#endif //CONFIG_BT_COEXIST_SOCKET_TRX // ================================================== // Below Functions are called by BT-Coex // ================================================== -void rtw_btcoex_RejectApAggregatedPacket(PADAPTER, u8 enable); +void rtw_btcoex_rx_ampdu_apply(PADAPTER); void rtw_btcoex_LPS_Enter(PADAPTER); void rtw_btcoex_LPS_Leave(PADAPTER); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_cmd.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_cmd.h index eb0e33ea10f1..4e0d7a01c38b 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_cmd.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_cmd.h @@ -250,6 +250,13 @@ enum LPS_CTRL_TYPE LPS_CTRL_ENTER = 9, }; +enum STAKEY_TYPE +{ + GROUP_KEY =0, + UNICAST_KEY =1, + TDLS_KEY =2, +}; + enum RFINTFS { SWSI, HWSI, @@ -1007,7 +1014,7 @@ u8 rtw_startbss_cmd(_adapter *padapter, int flags); extern u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch); struct sta_info; -extern u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 unicast_key, bool enqueue); +extern u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 key_type, bool enqueue); extern u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue); extern u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_debug.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_debug.h index 67edf7f0a6d0..bf8ba13257a1 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_debug.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_debug.h @@ -338,10 +338,14 @@ 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); +bool rtw_del_rx_ampdu_test_trigger_no_tx_fail(void); u32 rtw_get_wait_hiq_empty_ms(void); void rtw_sink_rtp_seq_dbg( _adapter *adapter,_pkt *pkt); +struct sta_info; +void sta_rx_reorder_ctl_dump(void *sel, struct sta_info *sta); + #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); @@ -363,16 +367,22 @@ int proc_get_rf_info(struct seq_file *m, void *v); int proc_get_survey_info(struct seq_file *m, void *v); int proc_get_ap_info(struct seq_file *m, void *v); int proc_get_adapter_state(struct seq_file *m, void *v); +ssize_t proc_reset_trx_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); 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); +#ifdef DBG_RX_COUNTER_DUMP +int proc_get_rx_cnt_dump(struct seq_file *m, void *v); +ssize_t proc_set_rx_cnt_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); +#endif 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); +ssize_t proc_set_del_rx_ampdu_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); #ifdef CONFIG_AP_MODE @@ -463,6 +473,17 @@ int proc_get_p2p_wowlan_info(struct seq_file *m, void *v); 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); +#ifdef CONFIG_POWER_SAVING +int proc_get_ps_info(struct seq_file *m, void *v); +#endif //CONFIG_POWER_SAVING + +#ifdef CONFIG_TDLS +int proc_get_tdls_info(struct seq_file *m, void *v); +#endif + +int proc_get_monitor(struct seq_file *m, void *v); +ssize_t proc_set_monitor(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); + #endif /* CONFIG_PROC_DEBUG */ #endif //__RTW_DEBUG_H__ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_eeprom.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_eeprom.h index 7705adc9bd52..2da2a67b348e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_eeprom.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_eeprom.h @@ -27,8 +27,9 @@ #define HWSET_MAX_SIZE_128 128 #define HWSET_MAX_SIZE_256 256 #define HWSET_MAX_SIZE_512 512 +#define HWSET_MAX_SIZE_1024 1024 -#define EEPROM_MAX_SIZE HWSET_MAX_SIZE_512 +#define EEPROM_MAX_SIZE HWSET_MAX_SIZE_1024 #define CLOCK_RATE 50 //100us @@ -44,11 +45,6 @@ #define EUROPE 0x1 //temp, should be provided later #define JAPAN 0x2 //temp, should be provided later -#ifdef CONFIG_SDIO_HCI -#define eeprom_cis0_sz 17 -#define eeprom_cis1_sz 50 -#endif - // // Customer ID, note that: // This variable is initiailzed through EEPROM or registry, @@ -108,35 +104,6 @@ typedef enum _RT_CUSTOMER_ID RT_CID_DNI_BUFFALO = 46,//add by page for NEC }RT_CUSTOMER_ID, *PRT_CUSTOMER_ID; -struct eeprom_priv -{ - u8 bautoload_fail_flag; - u8 bloadfile_fail_flag; - u8 bloadmac_fail_flag; - u8 EepromOrEfuse; - - u8 mac_addr[6]; //PermanentAddress - - u16 channel_plan; - u16 CustomerID; - - u8 efuse_eeprom_data[EEPROM_MAX_SIZE]; //92C:256bytes, 88E:512bytes, we use union set (512bytes) - u8 adjuseVoltageVal; - -#ifdef CONFIG_RF_GAIN_OFFSET - u8 EEPROMRFGainOffset; - u8 EEPROMRFGainVal; -#endif //CONFIG_RF_GAIN_OFFSET - -#ifdef CONFIG_SDIO_HCI - u8 sdio_setting; - u32 ocr; - u8 cis0[eeprom_cis0_sz]; - u8 cis1[eeprom_cis1_sz]; -#endif -}; - - extern void eeprom_write16(_adapter *padapter, u16 reg, u16 data); extern u16 eeprom_read16(_adapter *padapter, u16 reg); extern void read_eeprom_content(_adapter *padapter); @@ -147,8 +114,8 @@ extern void read_eeprom_content_by_attrib(_adapter * padapter ); #ifdef PLATFORM_LINUX #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE extern int isAdaptorInfoFileValid(void); -extern int storeAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv); -extern int retriveAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv); +extern int storeAdaptorInfoFile(char *path, u8 *efuse_data); +extern int retriveAdaptorInfoFile(char *path, u8 *efuse_data); #endif //CONFIG_ADAPTOR_INFO_CACHING_FILE #endif //PLATFORM_LINUX diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_efuse.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_efuse.h index 9dbab56fa0ca..be32193383c8 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_efuse.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_efuse.h @@ -59,6 +59,18 @@ enum _EFUSE_DEF_TYPE { #define EFUSE_REPEAT_THRESHOLD_ 3 +#define IS_MASKED_MP(ic, txt, offset) (EFUSE_IsAddressMasked_MP_##ic##txt(offset)) +#define IS_MASKED_TC(ic, txt, offset) (EFUSE_IsAddressMasked_TC_##ic##txt(offset)) +#define GET_MASK_ARRAY_LEN_MP(ic, txt) (EFUSE_GetArrayLen_MP_##ic##txt()) +#define GET_MASK_ARRAY_LEN_TC(ic, txt) (EFUSE_GetArrayLen_TC_##ic##txt()) +#define GET_MASK_ARRAY_MP(ic, txt, offset) (EFUSE_GetMaskArray_MP_##ic##txt(offset)) +#define GET_MASK_ARRAY_TC(ic, txt, offset) (EFUSE_GetMaskArray_TC_##ic##txt(offset)) + + +#define IS_MASKED(ic, txt, offset) ( IS_MASKED_MP(ic,txt, offset) ) +#define GET_MASK_ARRAY_LEN(ic, txt) ( GET_MASK_ARRAY_LEN_MP(ic,txt) ) +#define GET_MASK_ARRAY(ic, txt, out) do { GET_MASK_ARRAY_MP(ic,txt, out);} while(0) + //============================================= // The following is for BT Efuse definition //============================================= @@ -77,6 +89,21 @@ typedef struct PG_PKT_STRUCT_A{ u8 word_cnts; }PGPKT_STRUCT,*PPGPKT_STRUCT; +typedef enum +{ + ERR_SUCCESS = 0, + ERR_DRIVER_FAILURE, + ERR_IO_FAILURE, + ERR_WI_TIMEOUT, + ERR_WI_BUSY, + ERR_BAD_FORMAT, + ERR_INVALID_DATA, + ERR_NOT_ENOUGH_SPACE, + ERR_WRITE_PROTECT, + ERR_READ_BACK_FAIL, + ERR_OUT_OF_RANGE +} ERROR_CODE; + /*------------------------------Define structure----------------------------*/ typedef struct _EFUSE_HAL{ u8 fakeEfuseBank; @@ -84,7 +111,9 @@ typedef struct _EFUSE_HAL{ u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]; u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]; u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]; - + u32 EfuseUsedBytes; + u8 EfuseUsedPercentage; + u16 BTEfuseUsedBytes; u8 BTEfuseUsedPercentage; u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; @@ -95,8 +124,32 @@ typedef struct _EFUSE_HAL{ u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]; u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]; + + // EFUSE Configuration, initialized in HAL_CmnInitPGData(). + const u16 MaxSecNum_WiFi; + const u16 MaxSecNum_BT; + const u16 WordUnit; + const u16 PhysicalLen_WiFi; + const u16 PhysicalLen_BT; + const u16 LogicalLen_WiFi; + const u16 LogicalLen_BT; + const u16 BankSize; + const u16 TotalBankNum; + const u16 BankNum_WiFi; + const u16 BankNum_BT; + const u16 OOBProtectBytes; + const u16 ProtectBytes; + const u16 BankAvailBytes; + const u16 TotalAvailBytes_WiFi; + const u16 TotalAvailBytes_BT; + const u16 HeaderRetry; + const u16 DataRetry; + + ERROR_CODE Status; + }EFUSE_HAL, *PEFUSE_HAL; +extern u8 maskfileBuffer[32]; /*------------------------Export global variable----------------------------*/ extern u8 fakeEfuseBank; @@ -119,6 +172,7 @@ extern u8 fakeBTEfuseModifiedMap[]; u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size); u16 efuse_GetMaxSize(PADAPTER padapter); u8 rtw_efuse_access(PADAPTER padapter, u8 bRead, u16 start_addr, u16 cnts, u8 *data); +u8 rtw_efuse_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); u8 rtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); @@ -143,6 +197,7 @@ void EFUSE_ShadowMapUpdate(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest) void EFUSE_ShadowRead(PADAPTER pAdapter, u8 Type, u16 Offset, u32 *Value); void Rtw_Hal_ReadMACAddrFromFile(PADAPTER padapter); u32 Rtw_Hal_readPGDataFromConfigFile(PADAPTER padapter); +u8 rtw_efuse_file_read(PADAPTER padapter,u8 *filepatch,u8 *buf, u32 len); #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_ioctl_set.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_ioctl_set.h index da08376b2eb1..1b7184688dc4 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_ioctl_set.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_ioctl_set.h @@ -70,7 +70,7 @@ u16 rtw_get_cur_max_rate(_adapter *adapter); int rtw_set_scan_mode(_adapter *adapter, RT_SCAN_TYPE scan_mode); int rtw_set_channel_plan(_adapter *adapter, u8 channel_plan); int rtw_set_country(_adapter *adapter, const char *country_code); -int rtw_set_band(_adapter *adapter, enum _BAND band); +int rtw_set_band(_adapter *adapter, u8 band); #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme.h index 1cf2ab1b20f4..8afa435dc391 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme.h @@ -30,6 +30,10 @@ // Increase the scanning timeout because of increasing the SURVEY_TO value. #define SCANNING_TIMEOUT 8000 +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE +#define CONC_SCANNING_TIMEOUT_SINGLE_BAND 10000 +#define CONC_SCANNING_TIMEOUT_DUAL_BAND 15000 +#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE #ifdef PALTFORM_OS_WINCE #define SCANQUEUE_LIFETIME 12000000 // unit:us @@ -60,6 +64,7 @@ #define WIFI_AUTOCONF 0x00004000 #define WIFI_AUTOCONF_IND 0x00008000 #endif +#define WIFI_MONITOR_STATE 0x80000000 /* // ========== P2P Section Start =============== @@ -101,15 +106,11 @@ typedef enum _RT_SCAN_TYPE SCAN_MIX, }RT_SCAN_TYPE, *PRT_SCAN_TYPE; -enum _BAND -{ - GHZ24_50 = 0, - GHZ_50, - GHZ_24, - GHZ_MAX, -}; +#define WIFI_FREQUENCY_BAND_AUTO 0 +#define WIFI_FREQUENCY_BAND_5GHZ 1 +#define WIFI_FREQUENCY_BAND_2GHZ 2 -#define rtw_band_valid(band) ((band) >= GHZ24_50 && (band) < GHZ_MAX) +#define rtw_band_valid(band) ((band) <= WIFI_FREQUENCY_BAND_2GHZ) enum DriverInterface { DRIVER_WEXT = 1, @@ -264,7 +265,7 @@ struct cfg80211_wifidirect_info{ struct ieee80211_channel remain_on_ch_channel; enum nl80211_channel_type remain_on_ch_type; ATOMIC_T ro_ch_cookie_gen; - u64 remain_on_ch_cookie; + u64 remain_on_ch_cookie; bool is_ro_ch; u32 last_ro_ch_time; /* this will be updated at the beginning and end of ro_ch */ }; @@ -400,22 +401,46 @@ struct tdls_ss_record{ //signal strength record u8 is_tdls_sta; // _TRUE: direct link sta, _FALSE: else }; +struct tdls_temp_mgmt{ + u8 initiator; // 0: None, 1: we initiate, 2: peer initiate + u8 peer_addr[ETH_ALEN]; +}; + +#ifdef CONFIG_TDLS_CH_SW +struct tdls_ch_switch{ + u32 ch_sw_state; + ATOMIC_T chsw_on; + u8 addr[ETH_ALEN]; + u8 off_ch_num; + u8 ch_offset; + u32 cur_time; + u8 delay_switch_back; + u8 dump_stack; +}; +#endif + struct tdls_info{ u8 ap_prohibited; + u8 ch_switch_prohibited; u8 link_established; u8 sta_cnt; - u8 sta_maximum; // 1:tdls sta is equal (NUM_STA-1), reach max direct link number; 0: else; + u8 sta_maximum; /* 1:tdls sta is equal (NUM_STA-1), reach max direct link number; 0: else; */ struct tdls_ss_record ss_record; +#ifdef CONFIG_TDLS_CH_SW + struct tdls_ch_switch chsw_info; +#endif + u8 ch_sensing; u8 cur_channel; - u8 candidate_ch; u8 collect_pkt_num[MAX_CHANNEL_NUM]; _lock cmd_lock; _lock hdl_lock; u8 watchdog_count; - u8 dev_discovered; //WFD_TDLS: for sigma test + u8 dev_discovered; /* WFD_TDLS: for sigma test */ u8 tdls_enable; - u8 external_setup; // _TRUE: setup is handled by wpa_supplicant + + /* Let wpa_supplicant to setup*/ + u8 driver_setup; #ifdef CONFIG_WFD struct wifi_display_info *wfd_info; #endif @@ -428,7 +453,6 @@ struct tdls_txmgmt { u16 status_code; u8 *buf; size_t len; - u8 external_support; }; /* used for mlme_priv.roam_flags */ @@ -678,6 +702,12 @@ struct mlme_priv { // u32 timeBcnInfoChkStart; }; +#define mlme_set_scan_to_timer(mlme, ms) \ + do { \ + /* DBG_871X("%s set_scan_to_timer(%p, %d)\n", __FUNCTION__, (mlme), (ms)); */ \ + _set_timer(&(mlme)->scan_to_timer, (ms)); \ + } while(0) + #define rtw_mlme_set_auto_scan_int(adapter, ms) \ do { \ adapter->mlmepriv.auto_scan_int_ms = ms; \ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme_ext.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme_ext.h index f5ba9b4414b2..f8fd112ca290 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme_ext.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme_ext.h @@ -56,39 +56,11 @@ #define DYNAMIC_FUNC_DISABLE (0x0) -// ====== ODM_ABILITY_E ======== -// BB ODM section BIT 0-15 -#define DYNAMIC_BB_DIG BIT0 //ODM_BB_DIG -#define DYNAMIC_BB_RA_MASK BIT1 //ODM_BB_RA_MASK -#define DYNAMIC_BB_DYNAMIC_TXPWR BIT2 //ODM_BB_DYNAMIC_TXPWR -#define DYNAMIC_BB_BB_FA_CNT BIT3 //ODM_BB_FA_CNT -#define DYNAMIC_BB_RSSI_MONITOR BIT4 //ODM_BB_RSSI_MONITOR -#define DYNAMIC_BB_CCK_PD BIT5 //ODM_BB_CCK_PD -#define DYNAMIC_BB_ANT_DIV BIT6 //ODM_BB_ANT_DIV -#define DYNAMIC_BB_PWR_SAVE BIT7 //ODM_BB_PWR_SAVE -#define DYNAMIC_BB_PWR_TRAIN BIT8 //ODM_BB_PWR_TRAIN -#define DYNAMIC_BB_RATE_ADAPTIVE BIT9 //ODM_BB_RATE_ADAPTIVE -#define DYNAMIC_BB_PATH_DIV BIT10//ODM_BB_PATH_DIV -#define DYNAMIC_BB_PSD BIT11//ODM_BB_PSD -#define DYNAMIC_BB_RXHP BIT12//ODM_BB_RXHP -#define DYNAMIC_BB_ADAPTIVITY BIT13//ODM_BB_ADAPTIVITY -#define DYNAMIC_BB_DYNAMIC_ATC BIT14//ODM_BB_DYNAMIC_ATC - -// MAC DM section BIT 16-23 -#define DYNAMIC_MAC_EDCA_TURBO BIT16//ODM_MAC_EDCA_TURBO -#define DYNAMIC_MAC_EARLY_MODE BIT17//ODM_MAC_EARLY_MODE - -// RF ODM section BIT 24-31 -#define DYNAMIC_RF_TX_PWR_TRACK BIT24//ODM_RF_TX_PWR_TRACK -#define DYNAMIC_RF_RX_GAIN_TRACK BIT25//ODM_RF_RX_GAIN_TRACK -#define DYNAMIC_RF_CALIBRATION BIT26//ODM_RF_CALIBRATION - -#define DYNAMIC_ALL_FUNC_ENABLE 0xFFFFFFF - #define _HW_STATE_NOLINK_ 0x00 #define _HW_STATE_ADHOC_ 0x01 #define _HW_STATE_STATION_ 0x02 #define _HW_STATE_AP_ 0x03 +#define _HW_STATE_MONITOR_ 0x04 #define _1M_RATE_ 0 @@ -378,30 +350,15 @@ struct ss_res #define WIFI_FW_LINKING_STATE (WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE | WIFI_FW_AUTH_SUCCESS |WIFI_FW_ASSOC_STATE) #ifdef CONFIG_TDLS -// 1: Write RCR DATA BIT -// 2: Issue peer traffic indication -// 3: Go back to the channel linked with AP, terminating channel switch procedure -// 4: Init channel sensing, receive all data and mgnt frame -// 5: Channel sensing and report candidate channel -// 6: First time set channel to off channel -// 7: Go back tp the channel linked with AP when set base channel as target channel -// 8: Set channel back to base channel -// 9: Set channel back to off channel -// 10: Restore RCR DATA BIT -// 11: Free TDLS sta enum TDLS_option { TDLS_ESTABLISHED = 1, - TDLS_SD_PTI = 2, - TDLS_CS_OFF = 3, - TDLS_INIT_CH_SEN = 4, - TDLS_DONE_CH_SEN = 5, - TDLS_OFF_CH = 6, - TDLS_BASE_CH = 7, - TDLS_P_OFF_CH = 8, - TDLS_P_BASE_CH = 9, - TDLS_RS_RCR = 10, - TDLS_TEAR_STA = 11, + TDLS_ISSUE_PTI = 2, + TDLS_CH_SW_RESP = 3, + TDLS_CH_SW = 4, + TDLS_CH_SW_BACK = 5, + TDLS_RS_RCR = 6, + TDLS_TEAR_STA = 7, maxTDLS, }; @@ -618,6 +575,8 @@ struct mlme_ext_priv }; +#define mlmeext_msr(mlmeext) ((mlmeext)->mlmext_info.state & 0x03) + void init_mlme_default_rate_set(_adapter* padapter); int init_mlme_ext_priv(_adapter* padapter); int init_hw_mlme_ext(_adapter *padapter); @@ -726,7 +685,6 @@ void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_inf #ifdef CONFIG_DFS void process_csa_ie(_adapter *padapter, u8 *pframe, uint len); #endif //CONFIG_DFS -void update_IOT_info(_adapter *padapter); void update_capinfo(PADAPTER Adapter, u16 updateCap); void update_wireless_mode(_adapter * padapter); void update_tx_basic_rate(_adapter *padapter, u8 modulation); @@ -811,12 +769,20 @@ int issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int try_c 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); void issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_offset); -void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status); +void issue_addba_req(_adapter *adapter, unsigned char *ra, u8 tid); +void issue_addba_rsp(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size); +void issue_del_ba(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator); +int issue_del_ba_ex(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator, int try_cnt, int wait_ms); + #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_sta_tid(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid, u8 force); +unsigned int send_delba_sta_tid_wait_ack(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid, u8 force); + unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr); unsigned int send_beacon(_adapter *padapter); @@ -841,6 +807,22 @@ unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame); unsigned int on_action_spct(_adapter *padapter, union recv_frame *precv_frame); unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame); unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame); + +#define RX_AMPDU_ACCEPT_INVALID 0xFF +#define RX_AMPDU_SIZE_INVALID 0xFF + +enum rx_ampdu_reason { + RX_AMPDU_DRV_FIXED = 1, + RX_AMPDU_BTCOEX = 2, /* not used, because BTCOEX has its own variable management */ +}; +u8 rtw_rx_ampdu_size(_adapter *adapter); +bool rtw_rx_ampdu_is_accept(_adapter *adapter); +bool rtw_rx_ampdu_set_size(_adapter *adapter, u8 size, u8 reason); +bool rtw_rx_ampdu_set_accept(_adapter *adapter, u8 accept, u8 reason); +u8 rx_ampdu_apply_sta_tid(_adapter *adapter, struct sta_info *sta, u8 tid, u8 accept, u8 size); +u8 rx_ampdu_apply_sta(_adapter *adapter, struct sta_info *sta, u8 accept, u8 size); +u16 rtw_rx_ampdu_apply(_adapter *adapter); + unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame); unsigned int on_action_public(_adapter *padapter, union recv_frame *precv_frame); unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame); @@ -903,21 +885,6 @@ extern u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer); void concurrent_chk_joinbss_done(_adapter *padapter, int join_res); #endif //CONFIG_CONCURRENT_MODE -#ifdef CONFIG_DUALMAC_CONCURRENT -void dc_SelectChannel(_adapter *padapter, unsigned char channel); -void dc_SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset); -void dc_set_channel_bwmode_disconnect(_adapter *padapter); -u8 dc_handle_join_request(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset); -void dc_handle_join_done(_adapter *padapter, u8 join_res); -sint dc_check_fwstate(_adapter *padapter, sint fw_state); -u8 dc_handle_site_survey(_adapter *padapter); -void dc_report_survey_event(_adapter *padapter, union recv_frame *precv_frame); -void dc_set_channel_bwmode_survey_done(_adapter *padapter); -void dc_set_ap_channel_bandwidth(_adapter *padapter, u8 channel, u8 channel_offset, u8 bwmode); -void dc_resume_xmit(_adapter *padapter); -u8 dc_check_xmit(_adapter *padapter); -#endif - int rtw_chk_start_clnt_join(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset); int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset); @@ -1134,7 +1101,7 @@ static struct fwevent wlanevents[] = }; -#endif//_RTL8192C_CMD_C_ +#endif//_RTW_MLME_EXT_C_ #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mp.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mp.h index e5f11415a411..b788c6a2e8f6 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mp.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mp.h @@ -137,8 +137,6 @@ struct mp_tx _thread_hdl_ PktTxThread; }; -#if defined(CONFIG_RTL8192C) || defined(CONFIG_RTL8192D) || defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) ||defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8723B) - #define MP_MAX_LINES 1000 #define MP_MAX_LINES_BYTES 256 #define u1Byte u8 @@ -231,7 +229,7 @@ typedef struct _MPT_CONTEXT // Register value kept for Single Carrier Tx test. u8 btMpOfdmTxPower; // For MP Tx Power index - u8 TxPwrLevel[2]; // rf-A, rf-B + u8 TxPwrLevel[4]; /* rf-A, rf-B*/ u32 RegTxPwrLimit; // Content of RCR Regsiter for Mass Production Test. ULONG MptRCR; @@ -281,23 +279,13 @@ typedef struct _MPT_CONTEXT u1Byte mptOutBuf[100]; }MPT_CONTEXT, *PMPT_CONTEXT; -#endif //#endif /* E-Fuse */ -#ifdef CONFIG_RTL8192D -#define EFUSE_MAP_SIZE 256 -#endif -#ifdef CONFIG_RTL8192C -#define EFUSE_MAP_SIZE 128 -#endif -#ifdef CONFIG_RTL8723A -#define EFUSE_MAP_SIZE 256 -#endif #ifdef CONFIG_RTL8188E #define EFUSE_MAP_SIZE 512 #endif -#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) #define EFUSE_MAP_SIZE 512 #endif #ifdef CONFIG_RTL8192E @@ -306,8 +294,11 @@ typedef struct _MPT_CONTEXT #ifdef CONFIG_RTL8723B #define EFUSE_MAP_SIZE 512 #endif +#ifdef CONFIG_RTL8814A +#define EFUSE_MAP_SIZE 512 +#endif -#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) #define EFUSE_MAX_SIZE 1024 #elif defined(CONFIG_RTL8188E) #define EFUSE_MAX_SIZE 256 @@ -349,6 +340,9 @@ enum { MP_DISABLE_BT_COEXIST, MP_PwrCtlDM, MP_GETVER, + MP_MON, + EFUSE_MASK, + EFUSE_FILE, #ifdef CONFIG_WOWLAN MP_WOW_ENABLE, #endif @@ -393,6 +387,8 @@ struct mp_priv u8 prime_channel_offset; u8 txpoweridx; u8 txpoweridx_b; + u8 txpoweridx_c; + u8 txpoweridx_d; u8 rateidx; u32 preamble; // u8 modem; @@ -445,7 +441,7 @@ struct mp_priv u32 free_mp_xmitframe_cnt; BOOLEAN bSetRxBssid; BOOLEAN bTxBufCkFail; - + BOOLEAN bRTWSmbCfg; MPT_CONTEXT MptCtx; u8 *TXradomBuffer; @@ -702,16 +698,14 @@ typedef enum _ENCRY_CTRL_STATE_ { typedef enum _MPT_TXPWR_DEF{ MPT_CCK, MPT_OFDM, // L and HT OFDM - MPT_VHT_OFDM + MPT_OFDM_AND_HT, + MPT_HT, + MPT_VHT }MPT_TXPWR_DEF; #ifdef CONFIG_RF_GAIN_OFFSET -#if defined(CONFIG_RTL8723A) - #define REG_RF_BB_GAIN_OFFSET_CCK 0x0d - #define REG_RF_BB_GAIN_OFFSET_OFDM 0x0e - #define RF_GAIN_OFFSET_MASK 0xfffff -#elif defined(CONFIG_RTL8723B) +#if defined(CONFIG_RTL8723B) #define REG_RF_BB_GAIN_OFFSET 0x7f #define RF_GAIN_OFFSET_MASK 0xfffff #elif defined(CONFIG_RTL8188E) @@ -720,7 +714,7 @@ typedef enum _MPT_TXPWR_DEF{ #else #define REG_RF_BB_GAIN_OFFSET 0x55 #define RF_GAIN_OFFSET_MASK 0xfffff -#endif //CONFIG_RTL8723A +#endif //CONFIG_RTL8723B #endif //CONFIG_RF_GAIN_OFFSET @@ -758,73 +752,74 @@ extern void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val); extern u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr); extern void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val); -extern void SetChannel(PADAPTER pAdapter); -extern void SetBandwidth(PADAPTER pAdapter); -extern int SetTxPower(PADAPTER pAdapter); -extern void SetAntennaPathPower(PADAPTER pAdapter); +void SetChannel(PADAPTER pAdapter); +void SetBandwidth(PADAPTER pAdapter); +int SetTxPower(PADAPTER pAdapter); +void SetAntennaPathPower(PADAPTER pAdapter); //extern void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset); -extern void SetDataRate(PADAPTER pAdapter); +void SetDataRate(PADAPTER pAdapter); -extern void SetAntenna(PADAPTER pAdapter); +void SetAntenna(PADAPTER pAdapter); //extern void SetCrystalCap(PADAPTER pAdapter); -extern s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther); -extern void GetThermalMeter(PADAPTER pAdapter, u8 *value); - -extern void SetContinuousTx(PADAPTER pAdapter, u8 bStart); -extern void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart); -extern void SetSingleToneTx(PADAPTER pAdapter, u8 bStart); -extern void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); -extern void PhySetTxPowerLevel(PADAPTER pAdapter); - -extern void fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc); -extern void SetPacketTx(PADAPTER padapter); -extern void SetPacketRx(PADAPTER pAdapter, u8 bStartRx); - -extern void ResetPhyRxPktCount(PADAPTER pAdapter); -extern u32 GetPhyRxPktReceived(PADAPTER pAdapter); -extern u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter); - -extern s32 SetPowerTracking(PADAPTER padapter, u8 enable); -extern void GetPowerTracking(PADAPTER padapter, u8 *enable); - -extern u32 mp_query_psd(PADAPTER pAdapter, u8 *data); - - -extern void Hal_SetAntenna(PADAPTER pAdapter); -extern void Hal_SetBandwidth(PADAPTER pAdapter); - -extern void Hal_SetTxPower(PADAPTER pAdapter); -extern void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); -extern void Hal_SetSingleToneTx ( PADAPTER pAdapter , u8 bStart ); -extern void Hal_SetSingleCarrierTx (PADAPTER pAdapter, u8 bStart); -extern void Hal_SetContinuousTx (PADAPTER pAdapter, u8 bStart); -extern void Hal_SetBandwidth(PADAPTER pAdapter); - -extern void Hal_SetDataRate(PADAPTER pAdapter); -extern void Hal_SetChannel(PADAPTER pAdapter); -extern void Hal_SetAntennaPathPower(PADAPTER pAdapter); -extern s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther); -extern s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable); -extern void Hal_GetPowerTracking(PADAPTER padapter, u8 * enable); -extern void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value); -extern void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter); -extern void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14); -extern void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven); -extern void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 * TxPower); -extern void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 * TxPower); -extern void Hal_TriggerRFThermalMeter(PADAPTER pAdapter); -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); +s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther); +void GetThermalMeter(PADAPTER pAdapter, u8 *value); + +void SetContinuousTx(PADAPTER pAdapter, u8 bStart); +void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart); +void SetSingleToneTx(PADAPTER pAdapter, u8 bStart); +void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); +void PhySetTxPowerLevel(PADAPTER pAdapter); + +void fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc); +void SetPacketTx(PADAPTER padapter); +void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB); + +void ResetPhyRxPktCount(PADAPTER pAdapter); +u32 GetPhyRxPktReceived(PADAPTER pAdapter); +u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter); + +s32 SetPowerTracking(PADAPTER padapter, u8 enable); +void GetPowerTracking(PADAPTER padapter, u8 *enable); + +u32 mp_query_psd(PADAPTER pAdapter, u8 *data); + + +void Hal_SetAntenna(PADAPTER pAdapter); +void Hal_SetBandwidth(PADAPTER pAdapter); + +void Hal_SetTxPower(PADAPTER pAdapter); +void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); +void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart); +void Hal_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart); +void Hal_SetContinuousTx(PADAPTER pAdapter, u8 bStart); +void Hal_SetBandwidth(PADAPTER pAdapter); + +void Hal_SetDataRate(PADAPTER pAdapter); +void Hal_SetChannel(PADAPTER pAdapter); +void Hal_SetAntennaPathPower(PADAPTER pAdapter); +s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther); +s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable); +void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable); +void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value); +void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter); +void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14); +void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven); +void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower); +void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower); +void Hal_TriggerRFThermalMeter(PADAPTER pAdapter); +u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter); +void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart); +void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart); +void Hal_ProSetCrystalCap(PADAPTER pAdapter , u32 CrystalCapVal); //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); +void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter , BOOLEAN bMain); +ULONG mpt_ProQueryCalTxPower(PADAPTER pAdapter, u8 RfPath); +void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart); +u8 MptToMgntRate(u32 MptRateIdx); +u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr); +u32 mp_join(PADAPTER padapter, u8 mode); #endif //_RTW_MP_H_ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_odm.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_odm.h index a1d81ac4c923..f7ef82460f5f 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_odm.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_odm.h @@ -36,8 +36,7 @@ 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_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff); 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); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_p2p.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_p2p.h index d43ad24f37ed..2425cb2b1ea1 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_p2p.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_p2p.h @@ -51,6 +51,7 @@ u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); +int process_p2p_cross_connect_ie(PADAPTER padapter, u8 *IEs, u32 IELength); void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_pwrctrl.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_pwrctrl.h index 0eb89fa3bd84..4fceaee2545d 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_pwrctrl.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_pwrctrl.h @@ -282,6 +282,8 @@ struct pwrctrl_priv uint ips_enter_cnts; uint ips_leave_cnts; + uint lps_enter_cnts; + uint lps_leave_cnts; u8 ips_mode; u8 ips_org_mode; @@ -320,12 +322,12 @@ struct pwrctrl_priv 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; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_recv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_recv.h index dab240e3efdc..f04c045a8aa7 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_recv.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_recv.h @@ -96,6 +96,7 @@ struct recv_reorder_ctrl u16 indicate_seq;//=wstart_b, init_value=0xffff u16 wend_b; u8 wsize_b; + u8 ampdu_size; _queue pending_recvframe_queue; _timer reordering_ctrl_timer; }; @@ -254,8 +255,12 @@ struct rx_pkt_attrib { u8 key_index; u8 data_rate; + u8 bw; + u8 stbc; + u8 ldpc; u8 sgi; u8 pkt_rpt_type; + u32 tsfl; u32 MacIDValidEntry[2]; // 64 bits present 64 entry. /* @@ -265,7 +270,7 @@ struct rx_pkt_attrib { u32 RxPWDBAll; s32 RecvSignalPower; */ - struct phy_info phy_info; + struct phy_info phy_info; }; @@ -521,11 +526,9 @@ struct recv_buf #ifdef PLATFORM_LINUX _pkt *pskb; - u8 reuse; #endif #ifdef PLATFORM_FREEBSD //skb solution struct sk_buff *pskb; - u8 reuse; #endif //PLATFORM_FREEBSD //skb solution }; @@ -628,6 +631,8 @@ struct recv_buf *rtw_dequeue_recvbuf (_queue *queue); void rtw_reordering_ctrl_timeout_handler(void *pcontext); +void rx_query_phy_status(union recv_frame *rframe, u8 *phy_stat); + __inline static u8 *get_rxmem(union recv_frame *precvframe) { //always return rx_head... diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_rf.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_rf.h index 35d031f0b1e4..97365607d601 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_rf.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_rf.h @@ -155,7 +155,6 @@ typedef enum _PROTECTION_MODE{ PROTECTION_MODE_FORCE_DISABLE = 2, }PROTECTION_MODE, *PPROTECTION_MODE; -/* 2007/11/15 MH Define different RF type. */ typedef enum _RT_RF_TYPE_DEFINITION { RF_1T2R = 0, @@ -163,7 +162,12 @@ typedef enum _RT_RF_TYPE_DEFINITION RF_2T2R = 2, RF_1T1R = 3, RF_2T2R_GREEN = 4, - RF_MAX_TYPE = 5, + RF_2T3R = 5, + RF_3T3R = 6, + RF_3T4R = 7, + RF_4T4R = 8, + + RF_MAX_TYPE = 0xF, /* u1Byte */ }RT_RF_TYPE_DEF_E; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_security.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_security.h index 00b08fd75e46..7d758f6f01e8 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_security.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_security.h @@ -468,6 +468,8 @@ void wpa_tdls_generate_tpk(_adapter *padapter, PVOID sta); int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, u8 *mic); +int wpa_tdls_teardown_ftie_mic(u8 *kck, u8 *lnkid, u16 reason, + u8 dialog_token, u8 trans_seq, u8 *ftie, u8 *mic); int tdls_verify_mic(u8 *kck, u8 trans_seq, u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie); #endif //CONFIG_TDLS diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_tdls.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_tdls.h index ce0e2fc3c897..ed54a9968c52 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_tdls.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_tdls.h @@ -23,33 +23,32 @@ #ifdef CONFIG_TDLS /* TDLS STA state */ -#define TDLS_STATE_NONE 0x00000000 //default state -#define TDLS_INITIATOR_STATE 0x10000000 -#define TDLS_RESPONDER_STATE 0x20000000 -#define TDLS_LINKED_STATE 0x40000000 -#define TDLS_CH_SWITCH_ON_STATE 0x01000000 -#define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch -#define TDLS_AT_OFF_CH_STATE 0x04000000 -#define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp. -#define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch -#define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping //[TDLS] UAPSD: will not be used one day -#define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing -#define TDLS_ALIVE_STATE 0x00010000 //Check if peer sta is alived. -#define TDLS_WAIT_PTR_STATE 0x00020000 //Waiting peer's TDLS_PEER_TRAFFIC_RESPONSE frame - -#define TPK_RESEND_COUNT 301 -#define CH_SWITCH_TIME 10 -#define CH_SWITCH_TIMEOUT 30 -#define TDLS_STAY_TIME 500 + + +/* TDLS Diect Link Establishment */ +#define TDLS_STATE_NONE 0x00000000 /* Default state */ +#define TDLS_INITIATOR_STATE BIT(28) /* 0x10000000 */ +#define TDLS_RESPONDER_STATE BIT(29) /* 0x20000000 */ +#define TDLS_LINKED_STATE BIT(30) /* 0x40000000 */ +/* TDLS PU Buffer STA */ +#define TDLS_WAIT_PTR_STATE BIT(24) /* 0x01000000 */ /* Waiting peer's TDLS_PEER_TRAFFIC_RESPONSE frame */ +/* TDLS Check ALive */ +#define TDLS_ALIVE_STATE BIT(20) /* 0x00100000 */ /* Check if peer sta is alived. */ +/* TDLS Channel Switch */ +#define TDLS_CH_SWITCH_ON_STATE BIT(16) /* 0x00010000 */ +#define TDLS_PEER_AT_OFF_STATE BIT(17) /* 0x00020000 */ /* Could send pkt on target ch */ +#define TDLS_CH_SW_INITIATOR_STATE BIT(18) /* 0x00040000 */ /* Avoid duplicated or unconditional ch. switch rsp. */ +#define TDLS_WAIT_CH_RSP_STATE BIT(19) /* 0x00080000 */ /* Wait Ch. response as we are TDLS channel switch initiator */ + + +#define TPK_RESEND_COUNT 1800 /*Unit: seconds */ +#define CH_SWITCH_TIME 5 +#define CH_SWITCH_TIMEOUT 20 #define TDLS_SIGNAL_THRESH 0x20 -#define TDLS_WATCHDOG_PERIOD 10 //Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec -#define TDLS_STAY_TIME 500 +#define TDLS_WATCHDOG_PERIOD 10 /* Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec */ #define TDLS_HANDSHAKE_TIME 3000 -#define TDLS_PTI_TIME 7000 -#define TDLS_ALIVE_COUNT 3 -#define TDLS_INI_MACID_ENTRY 6 +#define TDLS_PTI_TIME 7000 -/* TDLS */ #define TDLS_MIC_LEN 16 #define WPA_NONCE_LEN 32 #define TDLS_TIMEOUT_LEN 4 @@ -72,44 +71,48 @@ struct wpa_tdls_lnkid { u8 resp_sta[ETH_ALEN]; } ; -static u8 TDLS_RSNIE[]={ 0x01, 0x00, //version shall be set to 1 - 0x00, 0x0f, 0xac, 0x07, //group sipher suite - 0x01, 0x00, //pairwise cipher suite count - 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only - 0x01, 0x00, //AKM suite count - 0x00, 0x0f, 0xac, 0x07, //TPK Handshake - 0x0c, 0x02, - //PMKID shall not be present +static u8 TDLS_RSNIE[20]={ 0x01, 0x00, /* Version shall be set to 1 */ + 0x00, 0x0f, 0xac, 0x07, /* Group sipher suite */ + 0x01, 0x00, /* Pairwise cipher suite count */ + 0x00, 0x0f, 0xac, 0x04, /* Pairwise cipher suite list; CCMP only */ + 0x01, 0x00, /* AKM suite count */ + 0x00, 0x0f, 0xac, 0x07, /* TPK Handshake */ + 0x0c, 0x02, + /* PMKID shall not be present */ }; -static u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero +static u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; /* Qos info all set zero */ + +static u8 TDLS_WMM_PARAM_IE[] = {0x00, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00}; -static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00}; //bit(28), bit(30), bit(37) +static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00}; /* bit(28), bit(30), bit(37) */ -// SRC: Supported Regulatory Classes +/* SRC: Supported Regulatory Classes */ static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 }; +int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len); +int check_ap_tdls_ch_switching_prohibited(u8 *pframe, u8 pkt_len); void rtw_reset_tdls_info(_adapter* padapter); int rtw_init_tdls_info(_adapter* padapter); void rtw_free_tdls_info(struct tdls_info *ptdlsinfo); int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms); void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta); -void rtw_free_tdls_timer(struct sta_info *psta); +void rtw_free_tdls_timer(struct sta_info *psta); void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta); #ifdef CONFIG_WFD int issue_tunneled_probe_req(_adapter *padapter); int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame); -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ int issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt); int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack); int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt); int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt); int issue_tdls_dis_rsp(_adapter * padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy); int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack); -int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *psta); +int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *psta, struct tdls_txmgmt *ptxmgmt); int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta); -int issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr); -int issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr); +int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta); +int issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack); sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame); sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame); int On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame); @@ -118,24 +121,29 @@ int On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame); int On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame); int On_TDLS_Peer_Traffic_Indication(_adapter *adapter, union recv_frame *precv_frame); int On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame); +#ifdef CONFIG_TDLS_CH_SW sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame); sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame); +void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); +void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); +#endif void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); -void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog, u8 privacy); -void rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, u8 privacy); +void rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); +void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt); void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); u8 update_sgi_tdls(_adapter *padapter, struct sta_info *psta); u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta); -#endif //CONFIG_TDLS +int rtw_tdls_is_driver_setup(_adapter *padapter); +void rtw_tdls_set_key(_adapter *padapter, struct sta_info *ptdls_sta); +const char * rtw_tdls_action_txt(enum TDLS_ACTION_FIELD action); +#endif /* CONFIG_TDLS */ #endif diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_version.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_version.h index 6bd3f4c78d0d..9ac6e8122be6 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_version.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_version.h @@ -1,2 +1,2 @@ -#define DRIVERVERSION "v4.3.9.6_13610.20150310_BTCOEX20140929-5443" -#define BTCOEXVERSION "BTCOEX20140929-5443" +#define DRIVERVERSION "v4.3.16_14189.20150519_BTCOEX20150119-5844" +#define BTCOEXVERSION "BTCOEX20150119-5844" diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_vht.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_vht.h index 62ad08b5a7d1..3e93131dfc3c 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_vht.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_vht.h @@ -117,7 +117,7 @@ struct vht_priv u8 rtw_get_vht_highest_rate(u8 *pvht_mcs_map); void rtw_get_vht_nss(u8 *pvht_mcs_map); u16 rtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate); -u32 rtw_vht_rate_to_bitmap(u8 *pVHTRate); +u64 rtw_vht_rate_to_bitmap(u8 *pVHTRate); void rtw_vht_use_default_setting(_adapter *padapter); u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel); u32 rtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_xmit.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_xmit.h index d7d8fca072e2..c7938684a65d 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_xmit.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_xmit.h @@ -156,7 +156,7 @@ do{\ #endif #endif -#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8723B) +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8814A) #define TXDESC_SIZE 40 //8192EE_TODO #elif defined (CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture @@ -198,105 +198,6 @@ do{\ #define TX_DESC_NEXT_DESC_OFFSET (TXDESC_SIZE + 8) #endif //CONFIG_PCI_HCI -#ifdef CONFIG_WOWLAN -// The following foramt is 40 bytes tx description. -// It supports 8192E, 8723B, 8812a. -// Dword 0 -#define GET_TX_DESC_OWN(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc, 31, 1) -#define SET_TX_DESC_PKT_SIZE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value) -#define SET_TX_DESC_OFFSET(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value) -#define SET_TX_DESC_BMC(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value) -#define SET_TX_DESC_HTC(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value) -#define SET_TX_DESC_LAST_SEG(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value) -#define SET_TX_DESC_FIRST_SEG(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value) -#define SET_TX_DESC_LINIP(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value) -#define SET_TX_DESC_NO_ACM(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value) -#define SET_TX_DESC_GF(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value) -#define SET_TX_DESC_OWN(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value) -// Dword 1 -#define SET_TX_DESC_MACID(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value) -#define SET_TX_DESC_QUEUE_SEL(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value) -#define SET_TX_DESC_RDG_NAV_EXT(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value) -#define SET_TX_DESC_LSIG_TXOP_EN(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value) -#define SET_TX_DESC_PIFS(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value) -#define SET_TX_DESC_RATE_ID(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value) -#define SET_TX_DESC_EN_DESC_ID(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value) -#define SET_TX_DESC_SEC_TYPE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value) -#define SET_TX_DESC_PKT_OFFSET(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value) -// Dword 2 -#define SET_TX_DESC_PAID(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 9, __Value) -#define SET_TX_DESC_CCA_RTS(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value) -#define SET_TX_DESC_AGG_ENABLE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value) -#define SET_TX_DESC_RDG_ENABLE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value) -#define SET_TX_DESC_AGG_BREAK(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value) -#define SET_TX_DESC_MORE_FRAG(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value) -#define SET_TX_DESC_RAW(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value) -#define SET_TX_DESC_SPE_RPT(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value) -#define SET_TX_DESC_AMPDU_DENSITY(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value) -#define SET_TX_DESC_BT_INT(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value) -#define SET_TX_DESC_GID(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value) -// Dword 3 -#define SET_TX_DESC_WHEADER_LEN(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value) -#define SET_TX_DESC_CHK_EN(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value) -#define SET_TX_DESC_EARLY_MODE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value) -#define SET_TX_DESC_HWSEQ_SEL(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value) -#define SET_TX_DESC_USE_RATE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value) -#define SET_TX_DESC_DISABLE_RTS_FB(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value) -#define SET_TX_DESC_DISABLE_FB(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value) -#define SET_TX_DESC_CTS2SELF(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value) -#define SET_TX_DESC_RTS_ENABLE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value) -#define SET_TX_DESC_HW_RTS_ENABLE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value) -#define SET_TX_DESC_NAV_USE_HDR(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value) -#define SET_TX_DESC_USE_MAX_LEN(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value) -#define SET_TX_DESC_MAX_AGG_NUM(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value) -#define SET_TX_DESC_NDPA(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value) -#define SET_TX_DESC_AMPDU_MAX_TIME(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value) -// Dword 4 -#define SET_TX_DESC_TX_RATE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value) -#define SET_TX_DESC_DATA_RATE_FB_LIMIT(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value) -#define SET_TX_DESC_RTS_RATE_FB_LIMIT(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value) -#define SET_TX_DESC_RETRY_LIMIT_ENABLE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value) -#define SET_TX_DESC_DATA_RETRY_LIMIT(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value) -#define SET_TX_DESC_RTS_RATE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value) -// Dword 5 -#define SET_TX_DESC_DATA_SC(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value) -#define SET_TX_DESC_DATA_SHORT(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value) -#define SET_TX_DESC_DATA_BW(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value) -#define SET_TX_DESC_DATA_LDPC(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value) -#define SET_TX_DESC_DATA_STBC(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value) -#define SET_TX_DESC_CTROL_STBC(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value) -#define SET_TX_DESC_RTS_SHORT(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value) -#define SET_TX_DESC_RTS_SC(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value) -// Dword 6 -#define SET_TX_DESC_SW_DEFINE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value) -#define SET_TX_DESC_ANTSEL_A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value) -#define SET_TX_DESC_ANTSEL_B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value) -#define SET_TX_DESC_ANTSEL_C(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value) -#define SET_TX_DESC_ANTSEL_D(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value) -// Dword 7 -#ifdef CONFIG_PCI_HCI -#define SET_TX_DESC_TX_BUFFER_SIZE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) -#else -#define SET_TX_DESC_TX_DESC_CHECKSUM(__pTxDesc, __Value)SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) -#endif -#define SET_TX_DESC_USB_TXAGG_NUM(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value) -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) -#define SET_TX_DESC_SDIO_TXSEQ(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value) -#endif - -// Dword 8 -#define SET_TX_DESC_HWSEQ_EN(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value) -// Dword 9 -#define SET_TX_DESC_SEQ(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value) -// Dword 10 -#define SET_TX_DESC_TX_BUFFER_ADDRESS(__pTxDesc, __Value)SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value) -#define GET_TX_DESC_TX_BUFFER_ADDRESS(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc+40, 0, 32) - -// Dword 11 -#define SET_TX_DESC_NEXT_DESC_ADDRESS(__pTxDesc, __Value)SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value) -// 40 bytes tx description end. -#endif - enum TXDESC_SC{ SC_DONT_CARE = 0x00, SC_UPPER= 0x01, @@ -669,10 +570,6 @@ struct xmit_frame u8 agg_num; #endif s8 pkt_offset; -#ifdef CONFIG_RTL8192D - u8 EMPktNum; - u16 EMPktLen[5];//The max value by HW -#endif #endif #ifdef CONFIG_XMIT_ACK @@ -876,7 +773,13 @@ struct xmit_priv { 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) +#if defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI) +extern struct xmit_frame *__rtw_alloc_cmdxmitframe_8192ee(struct xmit_priv *pxmitpriv, + enum cmdbuf_type buf_type); +#define rtw_alloc_bcnxmitframe(p) __rtw_alloc_cmdxmitframe_8192ee(p, CMDBUF_BEACON) +#else #define rtw_alloc_bcnxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_BEACON) +#endif 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); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/sta_info.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/sta_info.h index 15964d7f80c4..dc3634e2e8c1 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/sta_info.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/sta_info.h @@ -22,9 +22,12 @@ #define IBSS_START_MAC_ID 2 -#define NUM_STA 32 +#define NUM_STA MACID_NUM_SW_LIMIT #define NUM_ACL 16 +#ifdef CONFIG_TDLS +#define MAX_ALLOWED_TDLS_STA_NUM 4 +#endif //if mode ==0, then the sta is allowed once the addr is hit. //if mode ==1, then the sta is rejected once the addr is non-hit. @@ -136,7 +139,7 @@ struct sta_info { u8 raid; u8 init_rate; - u32 ra_mask; + u64 ra_mask; u8 wireless_mode; // NETWORK_TYPE u8 bw_mode; @@ -147,27 +150,24 @@ struct sta_info { #ifdef CONFIG_TDLS u32 tdls_sta_state; - u8 dialog; u8 SNonce[32]; u8 ANonce[32]; u32 TDLS_PeerKey_Lifetime; u16 TPK_count; _timer TPK_timer; struct TDLS_PeerKey tpk; - u16 stat_code; - u8 off_ch; +#ifdef CONFIG_TDLS_CH_SW u16 ch_switch_time; u16 ch_switch_timeout; - u8 option; - _timer option_timer; - _timer base_ch_timer; - _timer off_ch_timer; + //u8 option; + _timer ch_sw_timer; + _timer delay_timer; +#endif _timer handshake_timer; - u8 timer_flag; u8 alive_count; _timer pti_timer; - u8 TDLS_RSNIE[20]; //Save peer's RSNIE, use for sending TDLS_SETUP_RSP -#endif //CONFIG_TDLS + u8 TDLS_RSNIE[20]; /* Save peer's RSNIE, used for sending TDLS_SETUP_RSP */ +#endif /* CONFIG_TDLS */ //for A-MPDU TX, ADDBA timeout check _timer addba_retry_timer; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/usb_hal.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/usb_hal.h index 51f25b8086ab..bf17f82013ea 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/usb_hal.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/usb_hal.h @@ -20,19 +20,10 @@ #ifndef __USB_HAL_H__ #define __USB_HAL_H__ -void rtw_set_hal_ops(_adapter *padapter); +int usb_init_recv_priv(_adapter *padapter, u16 ini_in_buf_sz); +void usb_free_recv_priv (_adapter *padapter, u16 ini_in_buf_sz); -#ifdef CONFIG_RTL8192C -void rtl8192cu_set_hal_ops(_adapter * padapter); -#endif - -#ifdef CONFIG_RTL8192D -void rtl8192du_set_hal_ops(_adapter * padapter); -#endif - -#ifdef CONFIG_RTL8723A -void rtl8723au_set_hal_ops(_adapter * padapter); -#endif +u8 rtw_set_hal_ops(_adapter *padapter); #ifdef CONFIG_RTL8188E void rtl8188eu_set_hal_ops(_adapter * padapter); @@ -51,6 +42,10 @@ void rtl8192eu_set_hal_ops(_adapter * padapter); void rtl8723bu_set_hal_ops(_adapter * padapter); #endif +#ifdef CONFIG_RTL8814A +void rtl8814au_set_hal_ops(_adapter * padapter); +#endif /* CONFIG_RTL8814A */ + #ifdef CONFIG_INTEL_PROXIM extern _adapter *rtw_usb_get_sw_pointer(void); #endif //CONFIG_INTEL_PROXIM diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/usb_ops.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/usb_ops.h index 5606891ec909..43c275909eda 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/usb_ops.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/usb_ops.h @@ -51,35 +51,6 @@ enum{ #include #endif //PLATFORM_LINUX -#ifdef CONFIG_RTL8192C -void rtl8192cu_set_hw_type(_adapter *padapter); -void rtl8192cu_set_intf_ops(struct _io_ops *pops); -void rtl8192cu_recv_tasklet(void *priv); -void rtl8192cu_xmit_tasklet(void *priv); -#endif - -#ifdef CONFIG_RTL8723A -void rtl8723au_set_hw_type(_adapter *padapter); -void rtl8723au_set_intf_ops(struct _io_ops *pops); -void rtl8192cu_recv_tasklet(void *priv); -void rtl8192cu_xmit_tasklet(void *priv); -#endif - -#ifdef CONFIG_RTL8192D -void rtl8192du_set_hw_type(_adapter *padapter); -void rtl8192du_set_intf_ops(struct _io_ops *pops); -#ifndef PLATFORM_FREEBSD -void rtl8192du_recv_tasklet(void *priv); -#else // PLATFORM_FREEBSD -void rtl8192du_recv_tasklet(void *priv, int npending); -#ifdef CONFIG_RX_INDICATE_QUEUE -void rtw_rx_indicate_tasklet(void *priv, int npending); -#endif // CONFIG_RX_INDICATE_QUEUE -#endif // PLATFORM_FREEBSD - -void rtl8192du_xmit_tasklet(void *priv); -#endif - #ifdef CONFIG_RTL8188E void rtl8188eu_set_hw_type(_adapter *padapter); void rtl8188eu_set_intf_ops(struct _io_ops *pops); @@ -90,6 +61,11 @@ void rtl8812au_set_hw_type(_adapter *padapter); void rtl8812au_set_intf_ops(struct _io_ops *pops); #endif +#ifdef CONFIG_RTL8814A +void rtl8814au_set_hw_type(_adapter *padapter); +void rtl8814au_set_intf_ops(struct _io_ops *pops); +#endif /* CONFIG_RTL8814 */ + #ifdef CONFIG_RTL8192E void rtl8192eu_set_hw_type(_adapter *padapter); void rtl8192eu_set_intf_ops(struct _io_ops *pops); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/wifi.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/wifi.h index dff95b413506..bb309050e44e 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/wifi.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/wifi.h @@ -170,6 +170,8 @@ enum WIFI_REASON_CODE { enum WIFI_STATUS_CODE { _STATS_SUCCESSFUL_ = 0, _STATS_FAILURE_ = 1, + _STATS_SEC_DISABLED_ = 5, + _STATS_NOT_IN_SAME_BSS_ = 7, _STATS_CAP_FAIL_ = 10, _STATS_NO_ASOC_ = 11, _STATS_OTHER_ = 12, @@ -179,6 +181,9 @@ enum WIFI_STATUS_CODE { _STATS_AUTH_TIMEOUT_ = 16, _STATS_UNABLE_HANDLE_STA_ = 17, _STATS_RATE_FAIL_ = 18, + _STATS_DECLINE_REQ_ = 37, + _STATS_INVALID_PARAMETERS_ = 38, + _STATS_INVALID_RSNIE_ = 72, }; /* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) */ diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/wlan_bssdef.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/wlan_bssdef.h index dac17a05bb44..3490b29fb667 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/wlan_bssdef.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/include/wlan_bssdef.h @@ -73,7 +73,7 @@ typedef struct _NDIS_802_11_CONFIGURATION ULONG Length; // Length of structure ULONG BeaconPeriod; // units are Kusec ULONG ATIMWindow; // units are Kusec - ULONG DSConfig; // Frequency, units are kHz + ULONG DSConfig; /* channel number */ NDIS_802_11_CONFIGURATION_FH FHConfig; } NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; @@ -85,7 +85,8 @@ typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE Ndis802_11Infrastructure, Ndis802_11AutoUnknown, Ndis802_11InfrastructureMax, // Not a real value, defined as upper bound - Ndis802_11APMode + Ndis802_11APMode, + Ndis802_11Monitor, } NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE; @@ -345,7 +346,7 @@ typedef struct _NDIS_802_11_CONFIGURATION ULONG Length; // Length of structure ULONG BeaconPeriod; // units are Kusec ULONG ATIMWindow; // units are Kusec - ULONG DSConfig; // Frequency, units are kHz + ULONG DSConfig; /* channel number */ NDIS_802_11_CONFIGURATION_FH FHConfig; } NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/custom_gpio_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/custom_gpio_linux.c index 45606cdde5d7..418d7932e622 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/custom_gpio_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/custom_gpio_linux.c @@ -71,7 +71,7 @@ int rtw_wifi_gpio_init(void) gpio_request(GPIO_WIFI_POWER, "wifi_power"); #ifdef CONFIG_SDIO_HCI -#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1) +#if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1) if(rtw_mp_mode==1){ DBG_871X("%s GPIO_BT_RESET pin special for mp_test\n", __func__); if (GPIO_BT_RESET > 0) @@ -94,7 +94,7 @@ int rtw_wifi_gpio_deinit(void) gpio_free(GPIO_WIFI_POWER); #ifdef CONFIG_SDIO_HCI -#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1) +#if ( defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1) if(rtw_mp_mode==1){ DBG_871X("%s GPIO_BT_RESET pin special for mp_test\n", __func__); if (GPIO_BT_RESET > 0) @@ -134,7 +134,7 @@ void rtw_wifi_gpio_wlan_ctrl(int onoff) case WLAN_POWER_ON: break; #ifdef CONFIG_SDIO_HCI -#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1) +#if ( defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1) case WLAN_BT_PWDN_OFF: if(rtw_mp_mode==1) { @@ -168,13 +168,13 @@ void rtw_wifi_gpio_wlan_ctrl(int onoff) extern int sprd_3rdparty_gpio_wifi_power; #endif extern int sprd_3rdparty_gpio_wifi_pwd; -#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) +#if defined(CONFIG_RTL8723B) extern int sprd_3rdparty_gpio_bt_reset; #endif int rtw_wifi_gpio_init(void) { -#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) +#if defined(CONFIG_RTL8723B) if (sprd_3rdparty_gpio_bt_reset > 0) gpio_direction_output(sprd_3rdparty_gpio_bt_reset, 1); #endif @@ -259,7 +259,7 @@ void rtw_wifi_gpio_wlan_ctrl(int onoff) case WLAN_BT_PWDN_OFF: DBG_8192C("%s: call customer specific GPIO to set bt power down pin to 0\n", __FUNCTION__); -#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) +#if defined(CONFIG_RTL8723B) if (sprd_3rdparty_gpio_bt_reset > 0) gpio_set_value(sprd_3rdparty_gpio_bt_reset, 0); #endif @@ -268,7 +268,7 @@ void rtw_wifi_gpio_wlan_ctrl(int onoff) case WLAN_BT_PWDN_ON: DBG_8192C("%s: callc customer specific GPIO to set bt power down pin to 1\n", __FUNCTION__); -#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) +#if defined(CONFIG_RTL8723B) if (sprd_3rdparty_gpio_bt_reset > 0) gpio_set_value(sprd_3rdparty_gpio_bt_reset, 1); #endif @@ -312,6 +312,37 @@ void rtw_wifi_gpio_wlan_ctrl(int onoff) { } +#ifdef CONFIG_GPIO_API +//this is a demo for extending GPIO pin[7] as interrupt mode +struct net_device * rtl_net; +extern int rtw_register_gpio_interrupt(struct net_device *netdev, int gpio_num, void(*callback)(u8 level)); +extern int rtw_disable_gpio_interrupt(struct net_device *netdev, int gpio_num); +void gpio_int(u8 is_high) +{ + DBG_8192C("%s level=%d\n",__func__, is_high); +} +int register_net_gpio_init(void) +{ + rtl_net = dev_get_by_name(&init_net,"wlan0"); + if(!rtl_net) + { + DBG_871X_LEVEL(_drv_always_, "rtl_net init fail!\n"); + return -1; + } + return rtw_register_gpio_interrupt(rtl_net,7, gpio_int); +} +int unregister_net_gpio_init(void) +{ + rtl_net = dev_get_by_name(&init_net,"wlan0"); + if(!rtl_net) + { + DBG_871X_LEVEL(_drv_always_, "rtl_net init fail!\n"); + return -1; + } + return rtw_disable_gpio_interrupt(rtl_net,7); +} +#endif + #else int rtw_wifi_gpio_init(void) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.c index 12ce112da794..f3c693b83ffc 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.c @@ -550,7 +550,7 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); SetFrameSubType(pbuf, WIFI_BEACON); } else { - _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr1, adapter_mac_addr(padapter), ETH_ALEN); SetFrameSubType(pbuf, WIFI_PROBERSP); } @@ -675,11 +675,22 @@ void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter) struct cfg80211_bss *bss = NULL; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)) struct wiphy *wiphy = pwdev->wiphy; - int freq = (int)cur_network->network.Configuration.DSConfig; - struct ieee80211_channel *chan; + int freq = 2412; + struct ieee80211_channel *notify_channel; #endif DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)) + if (cur_network->network.Configuration.DSConfig <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(cur_network->network.Configuration.DSConfig, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(cur_network->network.Configuration.DSConfig, IEEE80211_BAND_5GHZ); + + if (0) + DBG_871X("chan: %d, freq: %d\n", cur_network->network.Configuration.DSConfig, freq); +#endif + if (pwdev->iftype != NL80211_IFTYPE_ADHOC) { return; @@ -730,8 +741,8 @@ void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter) } //notify cfg80211 that device joined an IBSS #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)) - chan = ieee80211_get_channel(wiphy, freq); - cfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, chan, GFP_ATOMIC); + notify_channel = ieee80211_get_channel(wiphy, freq); + cfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, notify_channel, GFP_ATOMIC); #else cfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, GFP_ATOMIC); #endif @@ -1334,7 +1345,7 @@ _func_enter_; //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len)); DBG_871X(" ~~~~set sta key:unicastkey\n"); - rtw_setstakey_cmd(padapter, psta, _TRUE, _TRUE); + rtw_setstakey_cmd(padapter, psta, UNICAST_KEY, _TRUE); } else//group key { @@ -1494,6 +1505,9 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); struct wireless_dev *rtw_wdev = padapter->rtw_wdev; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_TDLS + struct sta_info *ptdls_sta; +#endif /* CONFIG_TDLS */ DBG_871X(FUNC_NDEV_FMT" adding key for %pM\n", FUNC_NDEV_ARG(ndev), mac_addr); DBG_871X("cipher=0x%x\n", params->cipher); @@ -1583,6 +1597,17 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) { +#ifdef CONFIG_TDLS + if (rtw_tdls_is_driver_setup(padapter) == _FALSE && mac_addr) { + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, (void *)mac_addr); + if (ptdls_sta != NULL && ptdls_sta->tdls_sta_state) { + _rtw_memcpy(ptdls_sta->tpk.tk, params->key, params->key_len); + rtw_tdls_set_key(padapter, ptdls_sta); + goto addkey_end; + } + } +#endif /* CONFIG_TDLS */ + ret = rtw_cfg80211_set_encryption(ndev, param, param_len); } else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) @@ -1680,15 +1705,23 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); struct security_priv *psecuritypriv = &padapter->securitypriv; - DBG_871X(FUNC_NDEV_FMT" key_index=%d" - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - ", unicast=%d, multicast=%d" - #endif - ".\n", FUNC_NDEV_ARG(ndev), key_index - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - , unicast, multicast - #endif - ); +#define SET_DEF_KEY_PARAM_FMT " key_index=%d" +#define SET_DEF_KEY_PARAM_ARG , key_index +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) + #define SET_DEF_KEY_PARAM_FMT_2_6_38 ", unicast=%d, multicast=%d" + #define SET_DEF_KEY_PARAM_ARG_2_6_38 , unicast, multicast +#else + #define SET_DEF_KEY_PARAM_FMT_2_6_38 "" + #define SET_DEF_KEY_PARAM_ARG_2_6_38 +#endif + + DBG_871X(FUNC_NDEV_FMT + SET_DEF_KEY_PARAM_FMT + SET_DEF_KEY_PARAM_FMT_2_6_38 + "\n", FUNC_NDEV_ARG(ndev) + SET_DEF_KEY_PARAM_ARG + SET_DEF_KEY_PARAM_ARG_2_6_38 + ); if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) //set wep default key { @@ -1710,7 +1743,41 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, return 0; } +#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)) +static int cfg80211_rtw_set_rekey_data(struct wiphy *wiphy, + struct net_device *ndev, + struct cfg80211_gtk_rekey_data *data) +{ + /*int i;*/ + struct sta_info *psta; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &(padapter->securitypriv); + + psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); + if (psta == NULL) { + DBG_871X("%s, : Obtain Sta_info fail\n", __func__); + return -1; + } + + _rtw_memcpy(psta->kek, data->kek, NL80211_KEK_LEN); + /*printk("\ncfg80211_rtw_set_rekey_data KEK:"); + for(i=0;ikek[i]);*/ + _rtw_memcpy(psta->kck, data->kck, NL80211_KCK_LEN); + /*printk("\ncfg80211_rtw_set_rekey_data KCK:"); + for(i=0;ikck[i]);*/ + _rtw_memcpy(psta->replay_ctr, data->replay_ctr, NL80211_REPLAY_CTR_LEN); + psecuritypriv->binstallKCK_KEK = _TRUE; + /*printk("\nREPLAY_CTR: "); + for(i=0;ireplay_ctr[i]);*/ + return 0; +} +#endif /*CONFIG_GTK_OL*/ static int cfg80211_rtw_get_station(struct wiphy *wiphy, struct net_device *ndev, #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0)) @@ -1869,7 +1936,10 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy, pmlmeext->action_public_rxseq = 0xffff; pmlmeext->action_public_dialog_token = 0xff; } - + + /* initial default type */ + ndev->type = ARPHRD_ETHER; + switch (type) { case NL80211_IFTYPE_ADHOC: networkType = Ndis802_11IBSS; @@ -1908,7 +1978,14 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy, } } #endif //CONFIG_P2P - break; + break; + case NL80211_IFTYPE_MONITOR: + networkType = Ndis802_11Monitor; +#if 0 + ndev->type = ARPHRD_IEEE80211; /* IEEE 802.11 : 801 */ +#endif + ndev->type = ARPHRD_IEEE80211_RADIOTAP; /* IEEE 802.11 + radiotap header : 803 */ + break; default: ret = -EOPNOTSUPP; goto exit; @@ -1923,7 +2000,7 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy, goto exit; } - rtw_setopmode_cmd(padapter, networkType,_TRUE); + rtw_setopmode_cmd(padapter, networkType, _TRUE); exit: @@ -2185,6 +2262,7 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy struct cfg80211_ssid *ssids = request->ssids; int social_channel = 0, j = 0; bool need_indicate_scan_done = _FALSE; + bool ps_denied = _FALSE; _adapter *padapter; struct rtw_wdev_priv *pwdev_priv; @@ -2243,6 +2321,12 @@ if (padapter->registrypriv.mp_mode == 1) pwdev_priv->scan_request = request; _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + if (adapter_wdev_data(padapter)->block_scan == _TRUE) { + DBG_871X(FUNC_ADPT_FMT" wdev_priv.block_scan is set\n", FUNC_ADPT_ARG(padapter)); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { #ifdef CONFIG_DEBUG_CFG80211 @@ -2264,6 +2348,7 @@ if (padapter->registrypriv.mp_mode == 1) } rtw_ps_deny(padapter, PS_DENY_SCAN); + ps_denied = _TRUE; if(_FAIL == rtw_pwr_wakeup(padapter)) { need_indicate_scan_done = _TRUE; goto check_need_indicate_scan_done; @@ -2457,7 +2542,8 @@ check_need_indicate_scan_done: } cancel_ps_deny: - rtw_ps_deny_cancel(padapter, PS_DENY_SCAN); + if (ps_denied == _TRUE) + rtw_ps_deny_cancel(padapter, PS_DENY_SCAN); exit: return ret; @@ -2900,7 +2986,21 @@ static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, NDIS_802_11_SSID ndis_ssid; struct security_priv *psecuritypriv = &padapter->securitypriv; 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)); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + struct cfg80211_chan_def *pch_def; +#endif + struct ieee80211_channel *pch; int ret=0; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + pch_def = (struct cfg80211_chan_def *)(¶ms->chandef); + pch = (struct ieee80211_channel *) pch_def->chan; +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) + pch = (struct ieee80211_channel *)(params->channel); +#endif if(_FAIL == rtw_pwr_wakeup(padapter)) { ret= -EPERM; @@ -2949,6 +3049,9 @@ static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, ret = rtw_cfg80211_set_auth_type(psecuritypriv, NL80211_AUTHTYPE_OPEN_SYSTEM); rtw_set_802_11_authentication_mode(padapter, psecuritypriv->ndisauthtype); + + DBG_871X("%s: center_freq = %d\n", __func__, pch->center_freq); + pmlmeext->cur_channel = rtw_freq2ch(pch->center_freq); if (rtw_set_802_11_ssid(padapter, &ndis_ssid) == _FALSE) { @@ -3552,9 +3655,7 @@ void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, u fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - //_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - //_rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr1, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, da, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); @@ -4124,9 +4225,9 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network; if(0) - DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%zu), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter), - settings->ssid, settings->ssid_len, - pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength); + DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%zu), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter), + settings->ssid, settings->ssid_len, + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength); _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); pbss_network->Ssid.SsidLength = settings->ssid_len; @@ -4134,9 +4235,9 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, pbss_network_ext->Ssid.SsidLength = settings->ssid_len; if(0) - DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), - pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, - pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); + DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, + pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); } return ret; @@ -4171,9 +4272,28 @@ static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev #endif struct station_parameters *params) { + int ret = 0; +#ifdef CONFIG_TDLS + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta; +#endif /* CONFIG_TDLS */ DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; +#ifdef CONFIG_TDLS + psta = rtw_get_stainfo(pstapriv, mac); + if (psta == NULL) { + psta = rtw_alloc_stainfo(pstapriv, mac); + if (psta ==NULL) { + DBG_871X("[%s] Alloc station for "MAC_FMT" fail\n", __FUNCTION__, MAC_ARG(mac)); + ret =-EOPNOTSUPP; + goto exit; + } + } +#endif /* CONFIG_TDLS */ + +exit: + return ret; } static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev, @@ -4290,7 +4410,7 @@ static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *n struct sta_info *rtw_sta_info_get_by_idx(const int idx, struct sta_priv *pstapriv) -{ +{ _list *phead, *plist; struct sta_info *psta = NULL; int i = 0; @@ -4366,10 +4486,37 @@ static int cfg80211_rtw_set_channel(struct wiphy *wiphy #endif , struct ieee80211_channel *chan, enum nl80211_channel_type channel_type) { + int chan_target = (u8) ieee80211_frequency_to_channel(chan->center_freq); + int chan_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + int chan_width = CHANNEL_WIDTH_20; + _adapter *padapter = wiphy_to_adapter(wiphy); + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); #endif - + + switch (channel_type) { + case NL80211_CHAN_NO_HT: + case NL80211_CHAN_HT20: + chan_width = CHANNEL_WIDTH_20; + chan_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + case NL80211_CHAN_HT40MINUS: + chan_width = CHANNEL_WIDTH_40; + chan_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + case NL80211_CHAN_HT40PLUS: + chan_width = CHANNEL_WIDTH_40; + chan_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + default: + chan_width = CHANNEL_WIDTH_20; + chan_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + set_channel_bwmode(padapter, chan_target, chan_offset, chan_width); + return 0; } @@ -4606,7 +4753,7 @@ void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); @@ -4752,7 +4899,6 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, struct cfg80211_wifidirect_info *pcfg80211_wdinfo; u8 is_p2p_find = _FALSE; - #ifndef CONFIG_RADIO_WORK #define RTW_ROCH_DURATION_ENLARGE #define RTW_ROCH_BACK_OP @@ -4770,8 +4916,9 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, #ifdef CONFIG_CONCURRENT_MODE is_p2p_find=(duration < (pwdinfo->ext_listen_interval))? _TRUE : _FALSE; #endif - *cookie = ATOMIC_INC_RETURN(&pcfg80211_wdinfo->ro_ch_cookie_gen); + *cookie = ATOMIC_INC_RETURN(&pcfg80211_wdinfo->ro_ch_cookie_gen); + DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d, cookie:0x%llx\n", FUNC_ADPT_ARG(padapter), remain_ch, duration, *cookie); if(pcfg80211_wdinfo->is_ro_ch == _TRUE) @@ -4834,21 +4981,19 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - -#ifdef RTW_ROCH_DURATION_ENLARGE - if(duration < 400) - duration = duration*3;//extend from exper. -#endif /* RTW_ROCH_DURATION_ENLARGE */ + + #ifdef RTW_ROCH_DURATION_ENLARGE + if (duration < 400) + duration = duration * 3; /* extend from exper */ + #endif #ifdef RTW_ROCH_BACK_OP -#ifdef CONFIG_CONCURRENT_MODE - if (check_buddy_fwstate(padapter, _FW_LINKED)) - { - if (is_p2p_find) // p2p_find , duration<1000 - duration = duration + pwdinfo->ext_listen_interval; - else // p2p_listen, duration=5000 - duration = pwdinfo->ext_listen_interval - + (pwdinfo->ext_listen_interval/4); +#ifdef CONFIG_CONCURRENT_MODE + if (check_buddy_fwstate(padapter, _FW_LINKED)) { + if (is_p2p_find) /* p2p_find , duration<1000 */ + duration = duration + pwdinfo->ext_listen_interval; + else /* p2p_listen, duration=5000 */ + duration = pwdinfo->ext_listen_interval + (pwdinfo->ext_listen_interval / 4); } #endif #endif /* RTW_ROCH_BACK_OP */ @@ -4867,15 +5012,17 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, if(ATOMIC_READ(&pwdev_priv->switch_ch_to)==1 || (remain_ch != pmlmeext->cur_channel)) { - DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); - issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); - + if (check_buddy_fwstate(padapter, WIFI_FW_STATION_STATE)) { + DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); + } + ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); #ifdef RTW_ROCH_BACK_OP DBG_8192C("%s, set switch ch timer, duration=%d\n", __func__, duration-pwdinfo->ext_listen_interval); _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval); - #endif /* RTW_ROCH_BACK_OP */ + #endif } } @@ -5056,8 +5203,10 @@ static int _cfg80211_rtw_mgmt_tx(_adapter *padapter, u8 tx_ch, const u8 *buf, si u16 ext_listen_period; if (ATOMIC_READ(&pwdev_priv->switch_ch_to)==1) { - DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); - issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); + if (check_buddy_fwstate(padapter, WIFI_FW_STATION_STATE)) { + DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); + } ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); @@ -5373,12 +5522,15 @@ static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy, size_t len) { _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; int ret = 0; struct tdls_txmgmt txmgmt; - //TDLS: discard wpa_supplicant's frame mgmt - DBG_871X("%s %d\n", __FUNCTION__, __LINE__); - return 0; + if (rtw_tdls_is_driver_setup(padapter)) { + DBG_871X("Discard tdls action:%d, let driver to set up direct link\n", action_code); + goto discard; + } _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); _rtw_memcpy(txmgmt.peer, peer, ETH_ALEN); @@ -5387,53 +5539,52 @@ static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy, txmgmt.status_code = status_code; txmgmt.len = len; txmgmt.buf = (u8 *)rtw_malloc(txmgmt.len); - if (txmgmt.buf == NULL) - { + if (txmgmt.buf == NULL) { ret = -ENOMEM; goto bad; } _rtw_memcpy(txmgmt.buf, (void*)buf, txmgmt.len); - txmgmt.external_support = _TRUE; -//TDLS: Debug purpose -#if 0 +/* Debug purpose */ +#if 1 DBG_871X("%s %d\n", __FUNCTION__, __LINE__); - DBG_871X("peer:"MAC_FMT" ", MAC_ARG(txmgmt.peer)); - DBG_871X("action code:%d ", txmgmt.action_code); - DBG_871X("dialog:%d ", txmgmt.dialog_token); - DBG_871X("status code:%d\n", txmgmt.status_code); - if( txmgmt.len > 0 ) - { + DBG_871X("peer:"MAC_FMT", action code:%d, dialog:%d, status code:%d\n", + MAC_ARG(txmgmt.peer), txmgmt.action_code, + txmgmt.dialog_token, txmgmt.status_code); + if (txmgmt.len > 0) { int i=0; for(;i < len; i++) - DBG_871X("%02x ", *(txmgmt.buf+i)); - DBG_871X("\n len:%d\n", txmgmt.len); + printk("%02x ", *(txmgmt.buf+i)); + DBG_871X("len:%d\n", txmgmt.len); } #endif - switch(txmgmt.action_code) { - case TDLS_SETUP_REQUEST: - issue_tdls_setup_req(padapter, &txmgmt, _TRUE); - break; - case TDLS_SETUP_RESPONSE: - issue_tdls_setup_rsp(padapter, &txmgmt); - break; - case TDLS_SETUP_CONFIRM: - issue_tdls_setup_cfm(padapter, &txmgmt); - break; - case TDLS_TEARDOWN: - break; - case TDLS_DISCOVERY_REQUEST: - issue_tdls_dis_req(padapter, &txmgmt); + switch (txmgmt.action_code) { + case TDLS_SETUP_REQUEST: + issue_tdls_setup_req(padapter, &txmgmt, _TRUE); + break; + case TDLS_SETUP_RESPONSE: + issue_tdls_setup_rsp(padapter, &txmgmt); + break; + case TDLS_SETUP_CONFIRM: + issue_tdls_setup_cfm(padapter, &txmgmt); + break; + case TDLS_TEARDOWN: + issue_tdls_teardown(padapter, &txmgmt, _TRUE); + break; + case TDLS_DISCOVERY_REQUEST: + issue_tdls_dis_req(padapter, &txmgmt); + break; + case TDLS_DISCOVERY_RESPONSE: + issue_tdls_dis_rsp(padapter, &txmgmt, pmlmeinfo->enc_algo? _TRUE : _FALSE); break; } bad: if (txmgmt.buf) - { rtw_mfree(txmgmt.buf, txmgmt.len); - } +discard: return ret; } @@ -5443,6 +5594,7 @@ static int cfg80211_rtw_tdls_oper(struct wiphy *wiphy, enum nl80211_tdls_operation oper) { _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; struct tdls_txmgmt txmgmt; struct sta_info *ptdls_sta = NULL; @@ -5453,50 +5605,58 @@ static int cfg80211_rtw_tdls_oper(struct wiphy *wiphy, #endif //CONFIG_LPS _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - if(peer) + if (peer) _rtw_memcpy(txmgmt.peer, peer, ETH_ALEN); -#if 0 - CFG80211_TDLS_DISCOVERY_REQ, - CFG80211_TDLS_SETUP, - CFG80211_TDLS_TEARDOWN, - CFG80211_TDLS_ENABLE_LINK, - CFG80211_TDLS_DISABLE_LINK, - CFG80211_TDLS_ENABLE, - CFG80211_TDLS_DISABLE -#endif - switch(oper) { - case NL80211_TDLS_DISCOVERY_REQ: - issue_tdls_dis_req(padapter, &txmgmt); - break; - case NL80211_TDLS_SETUP: + + if (rtw_tdls_is_driver_setup(padapter)) { + /* these two cases are done by driver itself */ + if (oper == NL80211_TDLS_ENABLE_LINK || oper == NL80211_TDLS_DISABLE_LINK) + return 0; + } + + switch (oper) { + case NL80211_TDLS_DISCOVERY_REQ: + issue_tdls_dis_req(padapter, &txmgmt); + break; + case NL80211_TDLS_SETUP: #ifdef CONFIG_WFD - if ( _AES_ != padapter->securitypriv.dot11PrivacyAlgrthm ) - { - if ( padapter->wdinfo.wfd_tdls_weaksec == _TRUE) - issue_tdls_setup_req(padapter, &txmgmt, _TRUE); - else - DBG_871X( "[%s] Current link is not AES, SKIP sending the tdls setup request!!\n", __FUNCTION__ ); - } - else -#endif // CONFIG_WFD - { + if ( _AES_ != padapter->securitypriv.dot11PrivacyAlgrthm ) { + if ( padapter->wdinfo.wfd_tdls_weaksec == _TRUE) issue_tdls_setup_req(padapter, &txmgmt, _TRUE); - } - break; - case NL80211_TDLS_TEARDOWN: - ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), txmgmt.peer); - if(ptdls_sta != NULL) - { - txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_; - issue_tdls_teardown(padapter, &txmgmt, _FALSE); - } else - DBG_871X( "TDLS peer not found\n"); - break; - case NL80211_TDLS_ENABLE_LINK: - break; - case NL80211_TDLS_DISABLE_LINK: - break; + DBG_871X( "[%s] Current link is not AES, SKIP sending the tdls setup request!!\n", __FUNCTION__ ); + } else +#endif // CONFIG_WFD + { + issue_tdls_setup_req(padapter, &txmgmt, _TRUE); + } + break; + case NL80211_TDLS_TEARDOWN: + ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), txmgmt.peer); + if (ptdls_sta != NULL) { + txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_; + issue_tdls_teardown(padapter, &txmgmt, _TRUE); + }else { + DBG_871X( "TDLS peer not found\n"); + } + break; + case NL80211_TDLS_ENABLE_LINK: + DBG_871X(FUNC_NDEV_FMT", NL80211_TDLS_ENABLE_LINK;mac:"MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(peer)); + ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), peer); + if (ptdls_sta != NULL) { + ptdlsinfo->link_established = _TRUE; + ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE; + ptdls_sta->state |= _FW_LINKED; + rtw_tdls_cmd(padapter, txmgmt.peer, TDLS_ESTABLISHED); + } + break; + case NL80211_TDLS_DISABLE_LINK: + DBG_871X(FUNC_NDEV_FMT", NL80211_TDLS_DISABLE_LINK;mac:"MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(peer)); + ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), peer); + if (ptdls_sta != NULL) { + rtw_tdls_cmd(padapter, peer, TDLS_TEAR_STA ); + } + break; } return 0; } @@ -5991,14 +6151,14 @@ void rtw_cfg80211_init_wiphy(_adapter *padapter) DBG_8192C("%s:rf_type=%d\n", __func__, rf_type); - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ + if (padapter->registrypriv.wireless_mode & WIRELESS_11G) { bands = wiphy->bands[IEEE80211_BAND_2GHZ]; if(bands) rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_2GHZ, rf_type); } - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ + if (padapter->registrypriv.wireless_mode & WIRELESS_11A) { bands = wiphy->bands[IEEE80211_BAND_5GHZ]; if(bands) @@ -6009,7 +6169,7 @@ void rtw_cfg80211_init_wiphy(_adapter *padapter) rtw_regd_init(padapter); /* copy mac_addr to wiphy */ - _rtw_memcpy(wiphy->perm_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); + _rtw_memcpy(wiphy->perm_addr, adapter_mac_addr(padapter), ETH_ALEN); } @@ -6053,9 +6213,9 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy) | BIT(NL80211_IFTYPE_ADHOC) #ifdef CONFIG_AP_MODE | BIT(NL80211_IFTYPE_AP) -#ifndef CONFIG_RADIO_WORK + #ifndef CONFIG_RADIO_WORK | BIT(NL80211_IFTYPE_MONITOR) -#endif /* !CONFIG_RADIO_WORK */ + #endif #endif #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) | BIT(NL80211_IFTYPE_P2P_CLIENT) @@ -6070,9 +6230,9 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy) #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)) -#ifndef CONFIG_RADIO_WORK + #ifndef CONFIG_RADIO_WORK wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR); -#endif /* !CONFIG_RADIO_WORK */ + #endif #endif /* @@ -6085,8 +6245,10 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy) /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ wiphy->bands[IEEE80211_BAND_2GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_2GHZ); +#ifdef CONFIG_IEEE80211_BAND_5GHZ /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ wiphy->bands[IEEE80211_BAND_5GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_5GHZ); +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) && LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)) wiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS; @@ -6114,7 +6276,10 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy) #if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; - //wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP; +#ifndef CONFIG_TDLS_DRIVER_SETUP + wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP; //Driver handles key exchange + wiphy->flags |= NL80211_ATTR_HT_CAPABILITY; +#endif //CONFIG_TDLS_DRIVER_SETUP #endif /* CONFIG_TDLS */ if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) @@ -6137,6 +6302,9 @@ static struct cfg80211_ops rtw_cfg80211_ops = { .get_key = cfg80211_rtw_get_key, .del_key = cfg80211_rtw_del_key, .set_default_key = cfg80211_rtw_set_default_key, +#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)) + .set_rekey_data = cfg80211_rtw_set_rekey_data, +#endif /*CONFIG_GTK_OL*/ .get_station = cfg80211_rtw_get_station, .scan = cfg80211_rtw_scan, .set_wiphy_params = cfg80211_rtw_set_wiphy_params, diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.h index 3727922c43ba..6c463cc35884 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.h @@ -98,6 +98,7 @@ struct rtw_wdev_priv u8 bandroid_scan; bool block; + bool block_scan; bool power_mgmt; #ifdef CONFIG_CONCURRENT_MODE @@ -146,8 +147,10 @@ bool rtw_cfg80211_pwr_mgmt(_adapter *adapter); #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, sig_dbm, buf, len, gfp) #elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0)) #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp) -#else +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3 , 18 , 0)) #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) +#else +#define rtw_cfg80211_rx_mgmt(adapter , freq , sig_dbm , buf , len , gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev , freq , sig_dbm , buf , len , 0) #endif #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_linux.c index 1c6c50b91555..cce7250f51c2 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_linux.c @@ -22,15 +22,11 @@ #include //#ifdef CONFIG_MP_INCLUDED +#include #include #include "../../hal/OUTSRC/phydm_precomp.h" //#endif -#if defined(CONFIG_RTL8723A) -#include "rtl8723a_hal.h" -#include -#endif - #if defined(CONFIG_RTL8723B) #include #endif @@ -1541,7 +1537,7 @@ _func_enter_; //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len)); DBG_871X(" ~~~~set sta key:unicastkey\n"); - rtw_setstakey_cmd(padapter, psta, _TRUE, _TRUE); + rtw_setstakey_cmd(padapter, psta, UNICAST_KEY, _TRUE); } else//group key { @@ -1962,10 +1958,51 @@ static int rtw_wx_set_freq(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { + + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + int exp = 1, freq = 0, div = 0; + _func_enter_; RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+rtw_wx_set_freq\n")); + if (wrqu->freq.m <= 1000) { + if (wrqu->freq.flags == IW_FREQ_AUTO) { + padapter->mlmeextpriv.cur_channel = 1; + DBG_871X("%s: channel is auto, set to channel 1\n", __func__); + } else { + padapter->mlmeextpriv.cur_channel = wrqu->freq.m; + DBG_871X("%s: set to channel %d\n", __func__, padapter->mlmeextpriv.cur_channel); + } + } else { + while (wrqu->freq.e) { + exp *= 10; + wrqu->freq.e--; + } + + freq = wrqu->freq.m; + while (!(freq%10)) { + freq /= 10; + exp *= 10; + } + + /* freq unit is MHz here */ + div = 1000000/exp; + + if (div) + freq /= div; + else { + div = exp/1000000; + freq *= div; + } + + /* If freq is invalid, rtw_freq2ch() will return channel 1 */ + padapter->mlmeextpriv.cur_channel = rtw_freq2ch(freq); + DBG_871X("%s: set to channel %d\n", __func__, padapter->mlmeextpriv.cur_channel); + } + _func_exit_; return 0; @@ -2014,9 +2051,21 @@ static int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a, ret = -EPERM; goto exit; } - + + /* initial default type */ + dev->type = ARPHRD_ETHER; + switch(wrqu->mode) { + case IW_MODE_MONITOR: + networkType = Ndis802_11Monitor; +#if 0 + dev->type = ARPHRD_IEEE80211; /* IEEE 802.11 : 801 */ +#endif + dev->type = ARPHRD_IEEE80211_RADIOTAP; /* IEEE 802.11 + radiotap header : 803 */ + DBG_871X("set_mode = IW_MODE_MONITOR\n"); + break; + case IW_MODE_AUTO: networkType = Ndis802_11AutoUnknown; DBG_871X("set_mode = IW_MODE_AUTO\n"); @@ -2399,15 +2448,6 @@ static int rtw_wx_set_wap(struct net_device *dev, } #endif -#ifdef CONFIG_DUALMAC_CONCURRENT - if (dc_check_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)== _TRUE) - { - DBG_871X("set bssid, but buddy_intf is under scanning or linking\n"); - ret = -EINVAL; - goto exit; - } -#endif - rtw_ps_deny(padapter, PS_DENY_JOIN); if(_FAIL == rtw_pwr_wakeup(padapter)) { @@ -2564,12 +2604,12 @@ struct iw_mlme { case IW_MLME_DEAUTH: if(!rtw_set_802_11_disassociate(padapter)) - ret = -1; + ret = -1; break; case IW_MLME_DISASSOC: if(!rtw_set_802_11_disassociate(padapter)) - ret = -1; + ret = -1; break; @@ -2616,14 +2656,14 @@ _func_enter_; goto exit; } #ifdef CONFIG_CONCURRENT_MODE - if (padapter->pbuddy_adapter) { + if (padapter->pbuddy_adapter) { if (padapter->pbuddy_adapter->registrypriv.mp_mode == 1) { DBG_871X(FUNC_ADPT_FMT ": MP mode block Scan request\n", FUNC_ADPT_ARG(padapter->pbuddy_adapter)); ret = -1; goto exit; } - } + } #endif //CONFIG_CONCURRENT_MODE #endif @@ -2678,14 +2718,6 @@ _func_enter_; } #endif -#ifdef CONFIG_DUALMAC_CONCURRENT - if (dc_check_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)== _TRUE) - { - indicate_wx_scan_complete_event(padapter); - goto exit; - } -#endif - #ifdef CONFIG_P2P if ( pwdinfo->p2p_state != P2P_STATE_NONE ) { @@ -2872,11 +2904,7 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a, #ifdef CONFIG_P2P if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { - // P2P is enabled - if ( padapter->chip_type == RTL8192D ) - wait_for_surveydone = 300; // Because the 8192du supports more channels. - else - wait_for_surveydone = 200; + wait_for_surveydone = 200; } else { @@ -2907,16 +2935,6 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a, #endif ; -#ifdef CONFIG_DUALMAC_CONCURRENT - while(dc_check_fwstate(padapter, wait_status)== _TRUE) - { - rtw_msleep_os(30); - cnt++; - if(cnt > wait_for_surveydone ) - break; - } -#endif // CONFIG_DUALMAC_CONCURRENT - while(check_fwstate(pmlmepriv, wait_status) == _TRUE) { rtw_msleep_os(30); @@ -2999,7 +3017,10 @@ static int rtw_wx_set_essid(struct net_device *dev, #ifdef DBG_IOCTL DBG_871X("DBG_IOCTL %s:%d\n",__FUNCTION__, __LINE__); #endif - + #ifdef CONFIG_WEXT_DONT_JOIN_BYSSID + DBG_871X("%s: CONFIG_WEXT_DONT_JOIN_BYSSID be defined!! only allow bssid joining\n", __func__); + return -EPERM; + #endif /* #ifdef CONFIG_CONCURRENT_MODE if(padapter->iface_type > PRIMARY_IFACE) @@ -3021,15 +3042,6 @@ static int rtw_wx_set_essid(struct net_device *dev, } #endif -#ifdef CONFIG_DUALMAC_CONCURRENT - if (dc_check_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)== _TRUE) - { - DBG_871X("set bssid, but buddy_intf is under scanning or linking\n"); - ret = -EINVAL; - goto exit; - } -#endif - RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, ("+rtw_wx_set_essid: fw_state=0x%08x\n", get_fwstate(pmlmepriv))); @@ -5720,13 +5732,10 @@ static int rtw_p2p_get_invitation_procedure(struct net_device *dev, sprintf(inv_proc_str, "\nIP=-1"); } else { - if (attr_content[0] && 0x20) - { + if ((attr_content[0] & 0x20) == 0x20) sprintf(inv_proc_str, "\nIP=1"); - } else - { + else sprintf(inv_proc_str, "\nIP=0"); - } } wrqu->data.length = strlen(inv_proc_str); @@ -7059,7 +7068,7 @@ static int rtw_p2p_get2(struct net_device *dev, if (copy_from_user(buffer, wrqu->data.pointer, wrqu->data.length)) { - ret - EFAULT; + ret = -EFAULT; goto bad; } @@ -7290,7 +7299,6 @@ static int rtw_dbg_port(struct net_device *dev, case 0x01: //dbg mode padapter->recvpriv.is_signal_dbg = 1; extra_arg = extra_arg>100?100:extra_arg; - extra_arg = extra_arg<0?0:extra_arg; padapter->recvpriv.signal_strength_dbg=extra_arg; break; } @@ -7521,9 +7529,6 @@ static int rtw_dbg_port(struct net_device *dev, psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); if(psta) { - int i; - struct recv_reorder_ctrl *preorder_ctrl; - DBG_871X("SSID=%s\n", cur_network->network.Ssid.Ssid); DBG_871X("sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); DBG_871X("cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); @@ -7535,16 +7540,8 @@ static int rtw_dbg_port(struct net_device *dev, DBG_871X("ampdu_enable = %d\n", psta->htpriv.ampdu_enable); DBG_871X("agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); #endif //CONFIG_80211N_HT - - for(i=0;i<16;i++) - { - preorder_ctrl = &psta->recvreorder_ctrl[i]; - if(preorder_ctrl->enable) - { - DBG_871X("tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq); - } - } - + + sta_rx_reorder_ctl_dump(RTW_DBGDUMP, psta); } else { @@ -7552,13 +7549,7 @@ static int rtw_dbg_port(struct net_device *dev, } break; case 0x06: - { - u32 ODMFlag; - rtw_hal_get_hwreg(padapter, HW_VAR_DM_FLAG, (u8*)(&ODMFlag)); - DBG_871X("(B)DMFlag=0x%x, arg=0x%x\n", ODMFlag, arg); - ODMFlag = (u32)(0x0f&arg); - DBG_871X("(A)DMFlag=0x%x\n", ODMFlag); - rtw_hal_set_hwreg(padapter, HW_VAR_DM_FLAG, (u8 *)(&ODMFlag)); + { } break; case 0x07: @@ -7583,9 +7574,8 @@ static int rtw_dbg_port(struct net_device *dev, break; case 0x09: { - int i, j; + int i; _list *plist, *phead; - struct recv_reorder_ctrl *preorder_ctrl; #ifdef CONFIG_AP_MODE DBG_871X("sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap); @@ -7624,18 +7614,8 @@ static int rtw_dbg_port(struct net_device *dev, DBG_871X("qos_info=0x%x\n", psta->qos_info); #endif DBG_871X("dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy); - - - - for(j=0;j<16;j++) - { - preorder_ctrl = &psta->recvreorder_ctrl[j]; - if(preorder_ctrl->enable) - { - DBG_871X("tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq); - } - } - + + sta_rx_reorder_ctl_dump(RTW_DBGDUMP, psta); } } @@ -8021,31 +8001,9 @@ static int rtw_dbg_port(struct net_device *dev, } break; - case 0xee://turn on/off dynamic funcs + case 0xee: { - u32 odm_flag; - - if(0xf==extra_arg){ - rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DM_FUNC,&odm_flag); - DBG_871X(" === DMFlag(0x%08x) === \n",odm_flag); - DBG_871X("extra_arg = 0 - disable all dynamic func \n"); - DBG_871X("extra_arg = 1 - disable DIG- BIT(0)\n"); - DBG_871X("extra_arg = 2 - disable High power - BIT(1)\n"); - DBG_871X("extra_arg = 3 - disable tx power tracking - BIT(2)\n"); - DBG_871X("extra_arg = 4 - disable BT coexistence - BIT(3)\n"); - DBG_871X("extra_arg = 5 - disable antenna diversity - BIT(4)\n"); - DBG_871X("extra_arg = 6 - enable all dynamic func \n"); - } - else{ - /* extra_arg = 0 - disable all dynamic func - extra_arg = 1 - disable DIG - extra_arg = 2 - disable tx power tracking - extra_arg = 3 - turn on all dynamic func - */ - rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DM_FUNC, &(extra_arg)); - rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DM_FUNC,&odm_flag); - DBG_871X(" === DMFlag(0x%08x) === \n",odm_flag); - } + DBG_871X(" === please control /proc to trun on/off PHYDM func === \n"); } break; @@ -9108,7 +9066,7 @@ static int rtw_set_hidden_ssid(struct net_device *dev, struct ieee_param *param, int ie_len; u8 *ssid_ie; char ssid[NDIS_802_11_LENGTH_SSID + 1]; - sint ssid_len; + sint ssid_len = 0; u8 ignore_broadcast_ssid; if(check_fwstate(mlmepriv, WIFI_AP_STATE) != _TRUE) @@ -9130,10 +9088,10 @@ static int rtw_set_hidden_ssid(struct net_device *dev, struct ieee_param *param, ssid[ssid_len] = 0x0; if(0) - DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), - ssid, ssid_len, - pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, - pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); + DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), + ssid, ssid_len, + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, + pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)ssid, ssid_len); pbss_network->Ssid.SsidLength = ssid_len; @@ -9141,9 +9099,9 @@ static int rtw_set_hidden_ssid(struct net_device *dev, struct ieee_param *param, pbss_network_ext->Ssid.SsidLength = ssid_len; if(0) - DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), - pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, - pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); + DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, + pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); } DBG_871X(FUNC_ADPT_FMT" ignore_broadcast_ssid:%d, %s,%d\n", FUNC_ADPT_ARG(adapter), @@ -9649,8 +9607,7 @@ static int rtw_ap_wowlan_ctrl(struct net_device *dev, 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); + rtw_hal_clear_interrupt(padapter); poidparam.subcode = WOWLAN_AP_ENABLE; @@ -9663,8 +9620,7 @@ static int rtw_ap_wowlan_ctrl(struct net_device *dev, rtw_hal_disable_interrupt(padapter); - if (padapter->HalFunc.clear_interrupt) - padapter->HalFunc.clear_interrupt(padapter); + rtw_hal_clear_interrupt(padapter); poidparam.subcode = WOWLAN_AP_ENABLE; @@ -9733,12 +9689,12 @@ static int rtw_mp_efuse_get(struct net_device *dev, union iwreq_data *wdata, char *extra) { PADAPTER padapter = rtw_netdev_priv(dev); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + PEFUSE_HAL pEfuseHal; struct iw_point *wrqu; - u8 *PROMContent = pEEPROM->efuse_eeprom_data; + u8 *PROMContent = pHalData->efuse_eeprom_data; u8 ips_mode = IPS_NUM; // init invalid value u8 lps_mode = PS_MODE_NUM; // init invalid value struct pwrctrl_priv *pwrctrlpriv ; @@ -9801,7 +9757,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, #endif if(strcmp(tmp[0], "status") == 0){ - sprintf(extra, "Load File efuse=%s,Load File MAC=%s",(pEEPROM->bloadfile_fail_flag? "FAIL" : "OK"),(pEEPROM->bloadmac_fail_flag? "FAIL" : "OK")); + sprintf(extra, "Load File efuse=%s,Load File MAC=%s",(pHalData->bloadfile_fail_flag? "FAIL" : "OK"),(pHalData->bloadmac_fail_flag? "FAIL" : "OK")); goto exit; } @@ -9832,7 +9788,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, else if (strcmp(tmp[0], "realmap") == 0) { mapLen = EFUSE_MAP_SIZE; - if (rtw_efuse_map_read(padapter, EFUSE_WIFI , mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL) + if (rtw_efuse_mask_map_read(padapter, EFUSE_WIFI , mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL) { DBG_871X("%s: read realmap Fail!!\n", __FUNCTION__); err = -EFAULT; @@ -9890,9 +9846,9 @@ static int rtw_mp_efuse_get(struct net_device *dev, goto exit; } - if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL) + if (rtw_efuse_mask_map_read(padapter, addr, cnts, data) == _FAIL) { - DBG_871X("%s: rtw_efuse_map_read error!\n", __FUNCTION__); + DBG_871X("%s: rtw_efuse_mask_map_read error!\n", __func__); err = -EFAULT; goto exit; } @@ -9909,6 +9865,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, { addr = 0; mapLen = EFUSE_MAX_SIZE; + DBG_871X("EFUSE_MAX_SIZE =%d\n",EFUSE_MAX_SIZE); if (rtw_efuse_access(padapter, _FALSE, addr, mapLen, rawdata) == _FAIL) { DBG_871X("%s: rtw_efuse_access Fail!!\n", __FUNCTION__); @@ -9918,7 +9875,8 @@ static int rtw_mp_efuse_get(struct net_device *dev, _rtw_memset(extra,'\0',strlen(extra)); // DBG_871X("%s: realraw={\n", __FUNCTION__); sprintf(extra, "\n0x00\t"); - for (i=0; i< mapLen; i++) + + for (i=0; i< 512 ; i++) { // DBG_871X("%02X", rawdata[i]); sprintf(extra, "%s%02X", extra, rawdata[i]); @@ -9937,35 +9895,41 @@ static int rtw_mp_efuse_get(struct net_device *dev, } // DBG_871X("}\n"); } - else if (strcmp(tmp[0], "mac") == 0) + else if (strcmp(tmp[0], "realrawb") == 0) { - #ifdef CONFIG_RTL8192C - addr = EEPROM_MAC_ADDR_92C; - #endif // CONFIG_RTL8192C - #ifdef CONFIG_RTL8192D - #ifdef CONFIG_USB_HCI - if (pHalData->interfaceIndex == 0) - addr = EEPROM_MAC_ADDR_MAC0_92DU; - else - addr = EEPROM_MAC_ADDR_MAC1_92DU; - #else - if (pHalData->interfaceIndex == 0) - addr = EEPROM_MAC_ADDR_MAC0_92DE; - else - addr = EEPROM_MAC_ADDR_MAC1_92DE; - #endif - #endif // CONFIG_RTL8192D - #ifdef CONFIG_RTL8723A - #ifdef CONFIG_SDIO_HCI - addr = EEPROM_MAC_ADDR_8723AS; - #endif - #ifdef CONFIG_GSPI_HCI - addr = EEPROM_MAC_ADDR_8723AS; - #endif - #ifdef CONFIG_USB_HCI - addr = EEPROM_MAC_ADDR_8723AU; - #endif - #endif // CONFIG_RTL8723A + addr = 0; + mapLen = EFUSE_MAX_SIZE; + DBG_871X("EFUSE_MAX_SIZE =%d \n",EFUSE_MAX_SIZE); + if (rtw_efuse_access(padapter, _FALSE, addr, mapLen, rawdata) == _FAIL) + { + DBG_871X("%s: rtw_efuse_access Fail!!\n", __FUNCTION__); + err = -EFAULT; + goto exit; + } + _rtw_memset(extra,'\0',strlen(extra)); + // DBG_871X("%s: realraw={\n", __FUNCTION__); + sprintf(extra, "\n0x00\t"); + for (i= 512; i< mapLen; i++) + { + // DBG_871X("%02X", rawdata[i]); + sprintf(extra, "%s%02X", extra, rawdata[i]); + if ((i & 0xF) == 0xF) { + // DBG_871X("\n"); + sprintf(extra, "%s\n", extra); + sprintf(extra, "%s0x%02x\t", extra, i+1); + } + else if ((i & 0x7) == 0x7){ + // DBG_871X("\t"); + sprintf(extra, "%s \t", extra); + } else { + // DBG_871X(" "); + sprintf(extra, "%s ", extra); + } + } + // DBG_871X("}\n"); + } + else if (strcmp(tmp[0], "mac") == 0) + { #ifdef CONFIG_RTL8188E #ifdef CONFIG_USB_HCI addr = EEPROM_MAC_ADDR_88EU; @@ -10009,9 +9973,9 @@ static int rtw_mp_efuse_get(struct net_device *dev, goto exit; } - if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL) + if (rtw_efuse_mask_map_read(padapter, addr, cnts, data) == _FAIL) { - DBG_871X("%s: rtw_efuse_map_read error!\n", __FUNCTION__); + DBG_871X("%s: rtw_efuse_mask_map_read error!\n", __func__); err = -EFAULT; goto exit; } @@ -10032,21 +9996,6 @@ static int rtw_mp_efuse_get(struct net_device *dev, } else if (strcmp(tmp[0], "vidpid") == 0) { - #ifdef CONFIG_RTL8192C - addr = EEPROM_VID_92C; - #endif // CONFIG_RTL8192C - #ifdef CONFIG_RTL8192D - #ifdef CONFIG_USB_HCI - addr = EEPROM_VID_92DU; - #else - addr = EEPROM_VID_92DE; - #endif - #endif // CONFIG_RTL8192D - #ifdef CONFIG_RTL8723A - #ifdef CONFIG_USB_HCI - addr = EEPROM_VID_8723AU; - #endif - #endif // CONFIG_RTL8723A #ifdef CONFIG_RTL8188E #ifdef CONFIG_USB_HCI addr = EEPROM_VID_88EU; @@ -10076,7 +10025,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, err = -EFAULT; goto exit; } - if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL) + if (rtw_efuse_mask_map_read(padapter, addr, cnts, data) == _FAIL) { DBG_871X("%s: rtw_efuse_access error!!\n", __FUNCTION__); err = -EFAULT; @@ -10517,8 +10466,8 @@ static int rtw_mp_efuse_set(struct net_device *dev, goto exit; } *extra = 0; - DBG_871X("%s: after rtw_BT_efuse_map_write to _rtw_memcmp \n", __FUNCTION__); - if ( (rtw_efuse_map_read(padapter, addr, cnts, ShadowMapWiFi) == _SUCCESS ) ) + DBG_871X("%s: after rtw_efuse_map_write to _rtw_memcmp\n", __func__); + if (rtw_efuse_mask_map_read(padapter, addr, cnts, ShadowMapWiFi) == _SUCCESS) { if (_rtw_memcmp((void*)ShadowMapWiFi ,(void*)setdata,cnts)) { @@ -10585,33 +10534,7 @@ static int rtw_mp_efuse_set(struct net_device *dev, } //mac,00e04c871200 - #ifdef CONFIG_RTL8192C - addr = EEPROM_MAC_ADDR_92C; - #endif - #ifdef CONFIG_RTL8192D - #ifdef CONFIG_USB_HCI - if (pHalData->interfaceIndex == 0) - addr = EEPROM_MAC_ADDR_MAC0_92DU; - else - addr = EEPROM_MAC_ADDR_MAC1_92DU; - #else - if (pHalData->interfaceIndex == 0) - addr = EEPROM_MAC_ADDR_MAC0_92DE; - else - addr = EEPROM_MAC_ADDR_MAC1_92DE; - #endif - #endif - #ifdef CONFIG_RTL8723A - #ifdef CONFIG_SDIO_HCI - addr = EEPROM_MAC_ADDR_8723AS; - #endif - #ifdef CONFIG_GSPI_HCI - addr = EEPROM_MAC_ADDR_8723AS; - #endif - #ifdef CONFIG_USB_HCI - addr = EEPROM_MAC_ADDR_8723AU; - #endif - #endif // CONFIG_RTL8723A + #ifdef CONFIG_RTL8188E #ifdef CONFIG_USB_HCI addr = EEPROM_MAC_ADDR_88EU; @@ -10716,22 +10639,7 @@ static int rtw_mp_efuse_set(struct net_device *dev, goto exit; } - // pidvid,da0b7881 - #ifdef CONFIG_RTL8192C - addr = EEPROM_VID_92C; - #endif // CONFIG_RTL8192C - #ifdef CONFIG_RTL8192D - #ifdef CONFIG_USB_HCI - addr = EEPROM_VID_92DU; - #else - addr = EEPROM_VID_92DE; - #endif - #endif // CONFIG_RTL8192D - #ifdef CONFIG_RTL8723A - #ifdef CONFIG_USB_HCI - addr = EEPROM_VID_8723AU; - #endif - #endif // CONFIG_RTL8723A + // pidvid,da0b7881 #ifdef CONFIG_RTL8188E #ifdef CONFIG_USB_HCI addr = EEPROM_VID_88EU; @@ -10793,10 +10701,10 @@ static int rtw_mp_efuse_set(struct net_device *dev, } else if (strcmp(tmp[0], "wldumpfake") == 0) { - if (rtw_efuse_map_read(padapter, 0, EFUSE_MAP_SIZE, pEfuseHal->fakeEfuseModifiedMap) == _SUCCESS) { - DBG_871X("%s: WiFi hw efuse dump to Fake map success \n", __FUNCTION__); + if (rtw_efuse_mask_map_read(padapter, 0, EFUSE_MAP_SIZE, pEfuseHal->fakeEfuseModifiedMap) == _SUCCESS) { + DBG_871X("%s: WiFi hw efuse dump to Fake map success\n", __func__); } else { - DBG_871X("%s: WiFi hw efuse dump to Fake map Fail \n", __FUNCTION__); + DBG_871X("%s: WiFi hw efuse dump to Fake map Fail\n", __func__); err = -EFAULT; } } @@ -11041,8 +10949,8 @@ static int rtw_mp_efuse_set(struct net_device *dev, goto exit; } *extra = 0; - DBG_871X("%s: after rtw_BT_efuse_map_write to _rtw_memcmp \n", __FUNCTION__); - if ( (rtw_efuse_map_read(padapter, 0x00, EFUSE_MAP_SIZE, ShadowMapWiFi) == _SUCCESS ) ) + DBG_871X("%s: after rtw_BT_efuse_map_write to _rtw_memcmp\n", __func__); + if (rtw_efuse_mask_map_read(padapter, 0x00, EFUSE_MAP_SIZE, ShadowMapWiFi) == _SUCCESS) { if (_rtw_memcmp((void*)ShadowMapWiFi ,(void*)setdata,cnts)) { @@ -11092,6 +11000,8 @@ static int rtw_mp_efuse_set(struct net_device *dev, { pEfuseHal->fakeEfuseModifiedMap[addr+jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]); } + _rtw_memset(extra, '\0', strlen(extra)); + sprintf(extra, "wlwfake OK\n"); } exit: @@ -11304,8 +11214,8 @@ static int rtw_mp_read_reg(struct net_device *dev, tmp[j]=' '; j++; } - if ( data[i] != '\0' ) - tmp[j] = data[i]; + if ( data[i] != '\0' ) + tmp[j] = data[i]; j++; } @@ -11361,6 +11271,8 @@ static int rtw_mp_read_reg(struct net_device *dev, PADAPTER padapter = rtw_netdev_priv(dev); char input[wrqu->length]; + + _rtw_memset(input, 0, wrqu->length); if (copy_from_user(input, wrqu->pointer, wrqu->length)) return -EFAULT; @@ -11404,6 +11316,7 @@ static int rtw_mp_read_rf(struct net_device *dev, if (wrqu->length > 128) return -EFAULT; + _rtw_memset(input, 0, wrqu->length); if (copy_from_user(input, wrqu->pointer, wrqu->length)) return -EFAULT; @@ -11459,18 +11372,13 @@ static int rtw_mp_start(struct net_device *dev, u8 val8; PADAPTER padapter = rtw_netdev_priv(dev); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - 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) - { - -#ifdef CONFIG_BT_COEXIST - pdmpriv->DMFlag &= ~DYNAMIC_FUNC_BT; -#endif + { pHalFunc->hal_deinit(padapter); padapter->registrypriv.mp_mode =1; pHalFunc->hal_init(padapter); @@ -11568,7 +11476,7 @@ static int rtw_mp_rate(struct net_device *dev, DBG_871X("%s: %s rate index=%d \n", __func__,input,rate); if (rate >= MPT_RATE_LAST ) - return -EINVAL; + return -EINVAL; padapter->mppriv.rateidx = rate; Hal_SetDataRate(padapter); @@ -11665,7 +11573,8 @@ static int rtw_mp_txpower(struct net_device *dev, struct iw_request_info *info, struct iw_point *wrqu, char *extra) { - u32 idx_a=0,idx_b=0,MsetPower=1; + u32 idx_a = 0, idx_b = 0, idx_c = 0, idx_d = 0, status = 0; + int MsetPower = 1; u8 input[wrqu->length]; PADAPTER padapter = rtw_netdev_priv(dev); @@ -11673,22 +11582,24 @@ static int rtw_mp_txpower(struct net_device *dev, if (copy_from_user(input, wrqu->pointer, wrqu->length)) return -EFAULT; - MsetPower = strncmp(input, "off", 3); - sscanf(input,"patha=%d,pathb=%d",&idx_a,&idx_b); - //DBG_871X("%s: tx_pwr_idx_a=%x b=%x\n", __func__, idx_a, idx_b); - if(MsetPower==0) - { + MsetPower = strncmp(input, "off", 3); + if (MsetPower == 0) { padapter->mppriv.bSetTxPower = 0; sprintf( extra, "MP Set power off"); - } - else - { - sprintf( extra, "Set power level path_A:%d path_B:%d", idx_a , idx_b ); - padapter->mppriv.txpoweridx = (u8)idx_a; - padapter->mppriv.txpoweridx_b = (u8)idx_b; - padapter->mppriv.bSetTxPower = 1; + } else { + if (sscanf(input, "patha=%d,pathb=%d,pathc=%d,pathd=%d", &idx_a, &idx_b, &idx_c, &idx_d) < 3) + DBG_871X("Invalid format on line %s ,patha=%d,pathb=%d,pathc=%d,pathd=%d\n", input , idx_a , idx_b , idx_c , idx_d); + + sprintf(extra, "Set power level path_A:%d path_B:%d path_C:%d path_D:%d", idx_a , idx_b , idx_c , idx_d); + padapter->mppriv.txpoweridx = (u8)idx_a; + padapter->mppriv.txpoweridx_b = (u8)idx_b; + padapter->mppriv.txpoweridx_c = (u8)idx_c; + padapter->mppriv.txpoweridx_d = (u8)idx_d; + padapter->mppriv.bSetTxPower = 1; + Hal_SetAntennaPathPower(padapter); } + wrqu->length = strlen(extra); return 0; } @@ -11701,6 +11612,7 @@ static int rtw_mp_ant_tx(struct net_device *dev, u8 input[wrqu->length]; u16 antenna = 0; PADAPTER padapter = rtw_netdev_priv(dev); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); if (copy_from_user(input, wrqu->pointer, wrqu->length)) return -EFAULT; @@ -11713,19 +11625,26 @@ static int rtw_mp_ant_tx(struct net_device *dev, { switch(input[i]) { - case 'a' : - antenna|=ANTENNA_A; + case 'a': + antenna |= ANTENNA_A; break; case 'b': - antenna|=ANTENNA_B; + antenna |= ANTENNA_B; + break; + case 'c': + antenna |= ANTENNA_C; break; + case 'd': + antenna |= ANTENNA_D; + break; } } //antenna |= BIT(extra[i]-'a'); - //DBG_871X("%s: antenna=0x%x\n", __func__, antenna); + 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); + pHalData->AntennaTxPath = antenna; Hal_SetAntenna(padapter); @@ -11741,7 +11660,8 @@ static int rtw_mp_ant_rx(struct net_device *dev, u16 antenna = 0; u8 input[wrqu->length]; PADAPTER padapter = rtw_netdev_priv(dev); - + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + if (copy_from_user(input, wrqu->pointer, wrqu->length)) return -EFAULT; //DBG_871X("%s: input=%s\n", __func__, input); @@ -11752,21 +11672,25 @@ static int rtw_mp_ant_rx(struct net_device *dev, for (i=0; i < strlen(input); i++) { switch( input[i] ) { - case 'a' : - antenna|=ANTENNA_A; + case 'a': + antenna |= ANTENNA_A; break; case 'b': - antenna|=ANTENNA_B; + antenna |= ANTENNA_B; + break; + case 'c': + antenna |= ANTENNA_C; break; - case 'c' : - antenna|=ANTENNA_C; + case 'd': + antenna |= ANTENNA_D; break; } } - //DBG_871X("%s: antenna=0x%x\n", __func__, antenna); + DBG_871X("%s: antenna=0x%x\n", __func__, antenna); padapter->mppriv.antenna_tx = antenna; padapter->mppriv.antenna_rx = antenna; + pHalData->AntennaRxPath = antenna; //DBG_871X("%s:mppriv.antenna_rx=%d\n", __func__, padapter->mppriv.antenna_rx); Hal_SetAntenna(padapter); wrqu->length = strlen(extra); @@ -11774,20 +11698,46 @@ static int rtw_mp_ant_rx(struct net_device *dev, return 0; } +static int rtw_set_ctx_destAddr(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *wrqu, char *extra) +{ + int jj,kk=0; + + struct pkt_attrib *pattrib; + struct mp_priv *pmp_priv; + PADAPTER padapter = rtw_netdev_priv(dev); + pmp_priv = &padapter->mppriv; + pattrib = &pmp_priv->tx.attrib; + + if( strlen(extra) < 5 ) + return _FAIL; + + DBG_871X("%s: in=%s\n", __func__, extra); + for(jj = 0,kk = 0; jj < ETH_ALEN; jj++, kk += 3 ) + { + pattrib->dst[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] ); + } + + DBG_871X("pattrib->dst:%x %x %x %x %x %x\n",pattrib->dst[0],pattrib->dst[1],pattrib->dst[2],pattrib->dst[3],pattrib->dst[4],pattrib->dst[5]); + return 0; +} + static int rtw_mp_ctx(struct net_device *dev, struct iw_request_info *info, struct iw_point *wrqu, char *extra) { - u32 pkTx = 1, countPkTx = 1, cotuTx = 1, CarrSprTx = 1, scTx = 1, sgleTx = 1, stop = 1; + u32 pkTx = 1; + int countPkTx = 1, cotuTx = 1, CarrSprTx = 1, scTx = 1, sgleTx = 1, stop = 1; u32 bStartTest = 1; - u32 count = 0,pktinterval=0; + u32 count = 0,pktinterval=0,pktlen=0; struct mp_priv *pmp_priv; struct pkt_attrib *pattrib; - PADAPTER padapter = rtw_netdev_priv(dev); - + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); pmp_priv = &padapter->mppriv; + pattrib = &pmp_priv->tx.attrib; if (copy_from_user(extra, wrqu->pointer, wrqu->length)) return -EFAULT; @@ -11803,19 +11753,33 @@ static int rtw_mp_ctx(struct net_device *dev, stop = strncmp(extra, "stop", 4); sscanf(extra, "count=%d,pkt", &count); sscanf(extra, "pktinterval=%d", &pktinterval); + sscanf(extra, "pktlen=%d", &pktlen); + + if ( _rtw_memcmp( extra, "destmac=", 8 ) ) + { + wrqu->length -= 8; + rtw_set_ctx_destAddr (dev,info,wrqu,&extra[8]); + sprintf( extra, "Set dest mac OK ! \n"); + return 0; + } //DBG_871X("%s: count=%d countPkTx=%d cotuTx=%d CarrSprTx=%d scTx=%d sgleTx=%d pkTx=%d stop=%d\n", __func__, count, countPkTx, cotuTx, CarrSprTx, pkTx, sgleTx, scTx, stop); - _rtw_memset(extra, '\0', sizeof(extra)); + _rtw_memset(extra, '\0', strlen(extra)); if( pktinterval !=0 ) { sprintf( extra, "Pkt Interval = %d",pktinterval); padapter->mppriv.pktInterval = pktinterval; - wrqu->length = strlen(extra); return 0; } - + if( pktlen !=0 ) + { + sprintf( extra, "Pkt len = %d",pktlen); + pattrib->pktlen = pktlen ; + wrqu->length = strlen(extra); + return 0; + } if (stop == 0) { bStartTest = 0; // To set Stop pmp_priv->tx.stop = 1; @@ -11854,20 +11818,11 @@ static int rtw_mp_ctx(struct net_device *dev, } else if (pmp_priv->tx.stop == 1) { - sprintf( extra, "Start continuous DA=ffffffffffff len=1500 count=%u,\n",count); + sprintf( extra, "Start continuous DA=ffffffffffff len=1500 count=%u\n",count); //DBG_871X("%s:countPkTx %d\n", __func__,count); pmp_priv->tx.stop = 0; pmp_priv->tx.count = count; - pmp_priv->tx.payload = 2; -#ifdef CONFIG_80211N_HT - pmp_priv->tx.attrib.ht_en = 1; -#endif -#ifdef CONFIG_80211AC_VHT - pmp_priv->tx.attrib.raid = RATEID_IDX_VHT_1SS; //10 -#endif - pattrib = &pmp_priv->tx.attrib; - pattrib->pktlen = 1000; - _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN); + SetPacketTx(padapter); } else { @@ -11929,9 +11884,6 @@ static int rtw_mp_ctx(struct net_device *dev, } #ifdef CONFIG_80211N_HT pmp_priv->tx.attrib.ht_en = 1; -#endif -#ifdef CONFIG_80211AC_VHT - pmp_priv->tx.attrib.raid = RATEID_IDX_VHT_1SS; //10 #endif pmp_priv->tx.stop = 0; pmp_priv->tx.count = 1; @@ -11950,8 +11902,7 @@ static int rtw_mp_disable_bt_coexist(struct net_device *dev, union iwreq_data *wrqu, char *extra) { PADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct hal_ops *pHalFunc = &padapter->HalFunc; u8 input[wrqu->data.length]; @@ -11969,8 +11920,7 @@ static int rtw_mp_disable_bt_coexist(struct net_device *dev, DBG_871X("Set OID_RT_SET_DISABLE_BT_COEXIST: disable BT_COEXIST\n"); #ifdef CONFIG_BT_COEXIST rtw_btcoex_HaltNotify(padapter); - rtw_btcoex_SetManualControl(padapter, _TRUE); - pdmpriv->DMFlag &= ~DYNAMIC_FUNC_BT; + rtw_btcoex_SetManualControl(padapter, _TRUE); // Force to switch Antenna to WiFi rtw_write16(padapter, 0x870, 0x300); rtw_write16(padapter, 0x860, 0x110); @@ -11980,8 +11930,7 @@ static int rtw_mp_disable_bt_coexist(struct net_device *dev, { RT_TRACE(_module_mp_, _drv_info_, ("Set OID_RT_SET_DISABLE_BT_COEXIST: enable BT_COEXIST\n")); -#ifdef CONFIG_BT_COEXIST - pdmpriv->DMFlag |= DYNAMIC_FUNC_BT; +#ifdef CONFIG_BT_COEXIST rtw_btcoex_SetManualControl(padapter, _FALSE); #endif } @@ -11994,16 +11943,14 @@ static int rtw_mp_arx(struct net_device *dev, struct iw_request_info *info, struct iw_point *wrqu, char *extra) { - u8 bStartRx=0,bStopRx=0,bQueryPhy=0,bQueryMac=0,bSetBssid=0; - u8 bmac_filter = 0,bfilter_init=0; - u32 cckok=0,cckcrc=0,ofdmok=0,ofdmcrc=0,htok=0,htcrc=0,OFDM_FA=0,CCK_FA=0,DropPacket=0,vht_ok=0,vht_err=0; - u32 mac_cck_ok=0, mac_ofdm_ok=0, mac_ht_ok=0, mac_vht_ok=0; - u32 mac_cck_err=0, mac_ofdm_err=0, mac_ht_err=0, mac_vht_err=0; + int bStartRx = 0, bStopRx = 0, bQueryPhy = 0, bQueryMac = 0, bSetBssid = 0; + int bmac_filter = 0, bfilter_init = 0, bmon = 0, bSmpCfg = 0; u8 input[wrqu->length]; char *pch, *ptmp, *token, *tmp[2]={0x00,0x00}; - u32 i=0,ii=0,jj=0,kk=0,cnts=0,bmon=0; + u32 i = 0, ii = 0, jj = 0, kk = 0, cnts = 0, ret; PADAPTER padapter = rtw_netdev_priv(dev); struct mp_priv *pmppriv = &padapter->mppriv; + struct dbg_rx_counter rx_counter; if (copy_from_user(input, wrqu->pointer, wrqu->length)) return -EFAULT; @@ -12018,6 +11965,7 @@ static int rtw_mp_arx(struct net_device *dev, //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; + bSmpCfg = (strncmp(input , "smpcfg=" , 7) == 0)?1:0; if(bSetBssid==1){ pch = input; @@ -12071,80 +12019,32 @@ static int rtw_mp_arx(struct net_device *dev, if(bStartRx) { sprintf( extra, "start"); - SetPacketRx(padapter, bStartRx); + SetPacketRx(padapter, bStartRx, _FALSE); } else if(bStopRx) { - SetPacketRx(padapter, 0); + SetPacketRx(padapter, bStartRx, _FALSE); pmppriv->bmac_filter = _FALSE; sprintf( extra, "Received packet OK:%d CRC error:%d ,Filter out:%d",padapter->mppriv.rx_pktcount,padapter->mppriv.rx_crcerrpktcount,padapter->mppriv.rx_pktcount_filter_out); } else if(bQueryPhy) - { - - if (IS_HARDWARE_TYPE_JAGUAR(padapter)) - { - cckok = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF); // [13:0] - ofdmok = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF); // [13:0] - htok = PHY_QueryBBReg(padapter, 0xF10, 0x3FFF); // [13:0] - vht_ok = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF); // [13:0] - - 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] - - CCK_FA = PHY_QueryBBReg(padapter, 0xa5c, bMaskLWord); - OFDM_FA = PHY_QueryBBReg(padapter, 0xF48, bMaskLWord); - } - else - { - cckok = PHY_QueryBBReg(padapter, 0xF88, bMaskDWord); - ofdmok = PHY_QueryBBReg(padapter, 0xF94, bMaskLWord); - htok = PHY_QueryBBReg(padapter, 0xF90, bMaskLWord); - vht_ok = 0; - - cckcrc = PHY_QueryBBReg(padapter, 0xF84, bMaskDWord); - ofdmcrc = PHY_QueryBBReg(padapter, 0xF94, bMaskHWord); - htcrc = PHY_QueryBBReg(padapter, 0xF90, bMaskHWord); - vht_err = 0; + { + _rtw_memset(&rx_counter,0,sizeof(struct dbg_rx_counter)); + rtw_dump_phy_rx_counters(padapter,&rx_counter); - OFDM_FA = PHY_QueryBBReg(padapter, 0xCF0, bMaskLWord) + PHY_QueryBBReg(padapter, 0xCF2, bMaskLWord) + - PHY_QueryBBReg(padapter, 0xDA2, bMaskLWord)+ PHY_QueryBBReg(padapter, 0xDA4, bMaskLWord) + - PHY_QueryBBReg(padapter, 0xDA6, bMaskLWord) + PHY_QueryBBReg(padapter, 0xDA8, bMaskLWord); + DBG_871X("%s: OFDM_FA =%d\n", __FUNCTION__, rx_counter.rx_ofdm_fa); + DBG_871X("%s: CCK_FA =%d\n", __FUNCTION__, rx_counter.rx_cck_fa); + sprintf( extra, "Phy Received packet OK:%d CRC error:%d FA Counter: %d",rx_counter.rx_pkt_ok,rx_counter.rx_pkt_crc_error,rx_counter.rx_cck_fa+rx_counter.rx_ofdm_fa); - CCK_FA=(rtw_read8(padapter, 0xa5b )<<8 ) | (rtw_read8(padapter, 0xa5c)); - } - DBG_871X("%s: OFDM_FA =%d\n", __FUNCTION__, OFDM_FA); - DBG_871X("%s: CCK_FA =%d\n", __FUNCTION__, CCK_FA); - sprintf( extra, "Phy Received packet OK:%d CRC error:%d FA Counter: %d",cckok+ofdmok+htok+vht_ok,cckcrc+ofdmcrc+htcrc+vht_err,OFDM_FA+CCK_FA); + } else if(bQueryMac) { - // for 8723A - { - PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x3); - mac_cck_ok = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] - PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x0); - mac_ofdm_ok = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] - PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x6); - mac_ht_ok = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] - mac_vht_ok = 0; - - PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x4); - mac_cck_err = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] - PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x1); - mac_ofdm_err = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] - PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x7); - mac_ht_err = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] - mac_vht_err = 0; - //Mac_DropPacket - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_DropPacket); - DropPacket = rtw_read32(padapter, 0x664)& 0x0000FFFF; - } - + _rtw_memset(&rx_counter,0,sizeof(struct dbg_rx_counter)); + rtw_dump_mac_rx_counters(padapter,&rx_counter); 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); + rx_counter.rx_pkt_ok,rx_counter.rx_pkt_crc_error,rx_counter.rx_pkt_drop); + } if( bmon==1 ) { @@ -12159,6 +12059,19 @@ static int rtw_mp_arx(struct net_device *dev, sprintf( extra, "Indicating Receive Packet to network Stop\n"); } } + if (bSmpCfg == 1) { + ret = sscanf(input, "smpcfg=%d", &bSmpCfg); + + if (bSmpCfg == 1) { + pmppriv->bRTWSmbCfg = _TRUE; + sprintf(extra , "Indicate By Simple Config Format\n"); + SetPacketRx(padapter, _TRUE, _TRUE); + } else { + pmppriv->bRTWSmbCfg = _FALSE; + sprintf(extra , "Indicate By Normal Format\n"); + SetPacketRx(padapter, _TRUE, _FALSE); + } + } wrqu->length = strlen(extra) + 1; @@ -12210,11 +12123,9 @@ static int rtw_mp_pwrtrk(struct net_device *dev, if (strncmp(input, "stop", 4) == 0) { enable = 0; - sprintf(extra, "mp tx power tracking stop"); - pHalData->TxPowerTrackControl = _FALSE; + sprintf(extra, "mp tx power tracking stop"); } - else if (sscanf(input, "ther=%d", &thermal)) { - pHalData->TxPowerTrackControl = _TRUE; + else if (sscanf(input, "ther=%d", &thermal)) { ret = Hal_SetThermalMeter(padapter, (u8)thermal); if (ret == _FAIL) return -EPERM; sprintf(extra, "mp tx power tracking start,target value=%d ok ",thermal); @@ -12253,21 +12164,12 @@ static int rtw_mp_thermal(struct net_device *dev, struct iw_point *wrqu, char *extra) { u8 val; - int bwrite=1; + int bwrite=1; - #ifdef CONFIG_RTL8192C - u16 addr=EEPROM_THERMAL_METER_92C; - #endif - #ifdef CONFIG_RTL8192D - u16 addr=EEPROM_THERMAL_METER_92D; - #endif - #ifdef CONFIG_RTL8723A - u16 addr=EEPROM_THERMAL_METER_8723A; - #endif #ifdef CONFIG_RTL8188E u16 addr=EEPROM_THERMAL_METER_88E; #endif - #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) u16 addr=EEPROM_THERMAL_METER_8812; #endif #ifdef CONFIG_RTL8192E @@ -12333,35 +12235,9 @@ static int rtw_mp_reset_stats(struct net_device *dev, pmp_priv->rx_pktcount_filter_out=0; pmp_priv->rx_crcerrpktcount = 0; - //reset phy counter - if (IS_HARDWARE_TYPE_JAGUAR(padapter)) - { - write_bbreg(padapter, 0xB58, BIT0, 0x1); - write_bbreg(padapter, 0xB58, BIT0, 0x0); + rtw_reset_phy_rx_counters(padapter); + rtw_reset_mac_rx_counters(padapter); - write_bbreg(padapter, 0x9A4, BIT17, 0x1);//reset OFDA FA counter - write_bbreg(padapter, 0x9A4, BIT17, 0x0); - - write_bbreg(padapter, 0xA5C, BIT15, 0x0);//reset CCK FA counter - write_bbreg(padapter, 0xA5C, BIT15, 0x1); - } - else - { - write_bbreg(padapter, 0xF14, BIT16, 0x1); - rtw_msleep_os(10); - write_bbreg(padapter, 0xF14, BIT16, 0x0); - - write_bbreg(padapter, 0xD00, BIT27, 0x1);//reset OFDA FA counter - write_bbreg(padapter, 0xC0C, BIT31, 0x1);//reset OFDA FA counter - write_bbreg(padapter, 0xD00, BIT27, 0x0); - write_bbreg(padapter, 0xC0C, BIT31, 0x0); - - write_bbreg(padapter, 0xA2C, BIT15, 0x0);//reset CCK FA counter - write_bbreg(padapter, 0xA2C, BIT15, 0x1); - } - //reset mac counter - PHY_SetMacReg(padapter, 0x664, BIT27, 0x1); - PHY_SetMacReg(padapter, 0x664, BIT27, 0x0); return 0; } @@ -12424,7 +12300,7 @@ static int rtw_mp_SetRFPath(struct net_device *dev, { PADAPTER padapter = rtw_netdev_priv(dev); char input[wrqu->data.length]; - s32 bMain=1,bTurnoff=1; + int bMain = 1, bTurnoff = 1; if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -12453,9 +12329,9 @@ static int rtw_mp_QueryDrv(struct net_device *dev, { PADAPTER padapter = rtw_netdev_priv(dev); char input[wrqu->data.length]; - s32 qAutoLoad=1; + int qAutoLoad = 1; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; @@ -12467,7 +12343,7 @@ static int rtw_mp_QueryDrv(struct net_device *dev, { DBG_871X("%s:qAutoLoad\n", __func__); - if(pEEPROM->bautoload_fail_flag) + if(pHalData->bautoload_fail_flag) sprintf(extra, "fail"); else sprintf(extra, "ok"); @@ -12529,28 +12405,162 @@ static int rtw_mp_getver(struct net_device *dev, return 0; } -#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) -/* update Tx AGC offset */ -static int rtw_mp_SetBT(struct net_device *dev, +static int rtw_mp_mon(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 = &padapter->mppriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct hal_ops *pHalFunc = &padapter->HalFunc; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + NDIS_802_11_NETWORK_INFRASTRUCTURE networkType ; + int bstart = 1, bstop = 1; + networkType=Ndis802_11Infrastructure; + if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) + return -EFAULT; + + rtw_pm_set_ips(padapter,IPS_NONE); + LeaveAllPowerSaveMode(padapter); - BT_REQ_CMD BtReq; - PMPT_CONTEXT pMptCtx=&(padapter->mppriv.MptCtx); - PBT_RSP_CMD pBtRsp=(PBT_RSP_CMD)&pMptCtx->mptOutBuf[0]; - char input[128]; +#ifdef CONFIG_MP_INCLUDED + if (init_mp_priv(padapter) == _FAIL) { + DBG_871X("%s: initialize MP private data Fail!\n", __func__); + } + padapter->mppriv.channel = 6; + + bstart = strncmp(extra, "start", 5); // strncmp TRUE is 0 + bstop = strncmp(extra, "stop", 4); // strncmp TRUE is 0 + if(bstart==0) + { + mp_join(padapter,WIFI_FW_ADHOC_STATE); + SetPacketRx(padapter, _TRUE, _FALSE); + Hal_SetChannel(padapter); + pmp_priv->rx_bindicatePkt= _TRUE; + pmp_priv->bRTWSmbCfg = _TRUE; + sprintf(extra, "monitor mode start\n"); + } + else if (bstop==0) + { + SetPacketRx(padapter, _FALSE, _FALSE); + pmp_priv->rx_bindicatePkt= _FALSE; + pmp_priv->bRTWSmbCfg = _FALSE; + padapter->registrypriv.mp_mode=1; + pHalFunc->hal_deinit(padapter); + padapter->registrypriv.mp_mode=0; + pHalFunc->hal_init(padapter); + //rtw_disassoc_cmd(padapter, 0, _TRUE); + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { + rtw_disassoc_cmd(padapter, 500, _TRUE); + rtw_indicate_disconnect(padapter); + //rtw_free_assoc_resources(padapter, 1); + } + rtw_pm_set_ips(padapter,IPS_NORMAL); + sprintf(extra, "monitor mode Stop\n"); + } +#endif + wrqu->data.length = strlen(extra); + return 0; +} + +static int rtw_efuse_mask_file(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + char *rtw_efuse_mask_file_path; + u8 Status; + PADAPTER padapter = rtw_netdev_priv(dev); + _rtw_memset(maskfileBuffer,0x00,sizeof(maskfileBuffer)); + + if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) + return -EFAULT; + + if(strncmp(extra, "off",3) ==0 && strlen(extra)<4) + { + padapter->registrypriv.boffefusemask=1; + sprintf(extra, "Turn off Efuse Mask\n"); + wrqu->data.length = strlen(extra); + return 0; + } + if(strncmp(extra, "on",2) ==0 && strlen(extra)<3) + { + padapter->registrypriv.boffefusemask=0; + sprintf(extra, "Turn on Efuse Mask\n"); + wrqu->data.length = strlen(extra); + return 0; + } + rtw_efuse_mask_file_path=extra; + + if (rtw_is_file_readable(rtw_efuse_mask_file_path) == _TRUE) + { + DBG_871X("%s do rtw_efuse_mask_file_read = %s! ,sizeof maskfileBuffer %zu\n",__FUNCTION__,rtw_efuse_mask_file_path,sizeof(maskfileBuffer)); + Status=rtw_efuse_file_read(padapter,rtw_efuse_mask_file_path,maskfileBuffer,sizeof(maskfileBuffer)); + if(Status==_TRUE) + padapter->registrypriv.bFileMaskEfuse = _TRUE; + sprintf(extra, "efuse mask file read OK\n"); + } else { + padapter->registrypriv.bFileMaskEfuse = _FALSE; + sprintf(extra, "efuse mask file readable FAIL\n"); + DBG_871X("%s rtw_is_file_readable fail !\n",__FUNCTION__); + } + wrqu->data.length = strlen(extra); + return 0; +} + + +static int rtw_efuse_file_map(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + char *rtw_efuse_file_map_path; + u8 Status; + PEFUSE_HAL pEfuseHal; + PADAPTER padapter = rtw_netdev_priv(dev); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pEfuseHal = &pHalData->EfuseHal; + if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) + return -EFAULT; + + rtw_efuse_file_map_path=extra; + + if (rtw_is_file_readable(rtw_efuse_file_map_path) == _TRUE) + { + DBG_871X("%s do rtw_efuse_mask_file_read = %s! \n",__FUNCTION__,rtw_efuse_file_map_path); + Status=rtw_efuse_file_read(padapter,rtw_efuse_file_map_path,pEfuseHal->fakeEfuseModifiedMap,sizeof(pEfuseHal->fakeEfuseModifiedMap)); + if(Status==_TRUE) + sprintf(extra, "efuse file file_read OK\n"); + else + sprintf(extra, "efuse file file_read FAIL\n"); + } else { + sprintf(extra, "efuse file readable FAIL\n"); + DBG_871X("%s rtw_is_file_readable fail !\n",__FUNCTION__); + } + wrqu->data.length = strlen(extra); + return 0; +} + + +#if defined(CONFIG_RTL8723B) +/* update Tx AGC offset */ +static int rtw_mp_SetBT(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + PADAPTER padapter = rtw_netdev_priv(dev); + struct hal_ops *pHalFunc = &padapter->HalFunc; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + BT_REQ_CMD BtReq; + PMPT_CONTEXT pMptCtx=&(padapter->mppriv.MptCtx); + PBT_RSP_CMD pBtRsp=(PBT_RSP_CMD)&pMptCtx->mptOutBuf[0]; + char input[128]; char *pch, *ptmp, *token, *tmp[2]={0x00,0x00}; u8 setdata[100]; u8 resetbt=0x00; u8 tempval,BTStatus; u8 H2cSetbtmac[6]; u8 u1H2CBtMpOperParm[4]={0x01}; - u16 testmode=1,ready=1,trxparam=1,setgen=1,getgen=1,testctrl=1,testbt=1,readtherm=1,setbtmac=1; - u32 i=0,ii=0,jj=0,kk=0,cnts=0,status=0; + int testmode = 1, ready = 1, trxparam = 1, setgen = 1, getgen = 1, testctrl = 1, testbt = 1, readtherm = 1, setbtmac = 1; + u32 i = 0, ii = 0, jj = 0, kk = 0, cnts = 0, status = 0; PRT_MP_FIRMWARE pBTFirmware = NULL; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) @@ -12619,19 +12629,16 @@ static int rtw_mp_SetBT(struct net_device *dev, rtw_msleep_os(100); DBG_8192C("FirmwareDownloadBT ready = 0x%x 0x%x", pMptCtx->mptOutBuf[4],pMptCtx->mptOutBuf[5]); - if( (pMptCtx->mptOutBuf[4]==0x00) && (pMptCtx->mptOutBuf[5]==0x00)) - { - if(padapter->mppriv.bTxBufCkFail==_TRUE) - sprintf(extra, "check TxBuf Fail.\n"); - else - sprintf(extra, "download FW Fail.\n"); - } + if ((pMptCtx->mptOutBuf[4] == 0x00) && (pMptCtx->mptOutBuf[5] == 0x00)) { + + if (padapter->mppriv.bTxBufCkFail == _TRUE) + sprintf(extra, "check TxBuf Fail.\n"); else - { - sprintf(extra, "download FW OK.\n"); - goto exit; - } - goto exit; + sprintf(extra, "download FW Fail.\n"); + } else { + sprintf(extra, "download FW OK.\n"); + goto exit; + } goto exit; } if ( strncmp(extra, "dlfw", 4) == 0) @@ -12674,11 +12681,9 @@ static int rtw_mp_SetBT(struct net_device *dev, DBG_871X("%s: pull up BT reset pin when bt start mp test\n", __FUNCTION__); rtw_wifi_gpio_wlan_ctrl(WLAN_BT_PWDN_ON); #endif - DBG_871X(" rtl8723a_FirmwareDownload!\n"); + DBG_871X(" FirmwareDownload!\n"); -#ifdef CONFIG_RTL8723A - status = rtl8723a_FirmwareDownload(padapter); -#elif defined(CONFIG_RTL8723B) +#if defined(CONFIG_RTL8723B) status = rtl8723b_FirmwareDownload(padapter, _FALSE); #endif DBG_871X("Wait for FirmwareDownloadBT fw boot!\n"); @@ -12881,11 +12886,7 @@ todo: if ((pMptCtx->mptOutBuf[i]==0x00) && (pMptCtx->mptOutBuf[i+1]==0x00)) goto exit; -#ifdef CONFIG_RTL8723A - sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i]& 0x3f)); -#else sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i]& 0x1f)); -#endif } } else @@ -12903,7 +12904,7 @@ exit: return status; } -#endif //#ifdef CONFIG_RTL8723A +#endif //#ifdef CONFIG_RTL8723B static int rtw_mp_set(struct net_device *dev, struct iw_request_info *info, @@ -13081,7 +13082,7 @@ static int rtw_mp_get(struct net_device *dev, DBG_871X("set case MP_CTX \n"); rtw_mp_ctx (dev,info,wrqu,extra); break; - + case MP_ARX: DBG_871X("set case MP_ARX \n"); rtw_mp_arx (dev,info,wrqu,extra); @@ -13123,12 +13124,24 @@ static int rtw_mp_get(struct net_device *dev, case MP_GET_TXPOWER_INX: DBG_871X("mp_get MP_GET_TXPOWER_INX \n"); rtw_mp_txpower_index(dev,info,wrqu,extra); - break; + break; case MP_GETVER: DBG_871X("mp_get MP_GETVER \n"); rtw_mp_getver(dev,info,wdata,extra); break; -#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B) + case MP_MON: + DBG_871X("mp_get MP_MON \n"); + rtw_mp_mon(dev,info,wdata,extra); + break; + case EFUSE_MASK: + DBG_871X("mp_get EFUSE_MASK\n"); + rtw_efuse_mask_file(dev,info,wdata,extra); + break; + case EFUSE_FILE: + DBG_871X("mp_get EFUSE_FILE\n"); + rtw_efuse_file_map(dev,info,wdata,extra); + break; +#if defined(CONFIG_RTL8723B) case MP_SetBT: DBG_871X("set MP_SetBT \n"); rtw_mp_SetBT(dev,info,wdata,extra); @@ -13154,19 +13167,15 @@ static int rtw_wfd_tdls_enable(struct net_device *dev, _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); + DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); if ( extra[ 0 ] == '0' ) - { padapter->wdinfo.wfd_tdls_enable = 0; - } else - { padapter->wdinfo.wfd_tdls_enable = 1; - } -#endif //CONFIG_WFD -#endif //CONFIG_TDLS +#endif /* CONFIG_WFD */ +#endif /* CONFIG_TDLS */ return ret; } @@ -13185,14 +13194,11 @@ static int rtw_tdls_weaksec(struct net_device *dev, DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); if ( extra[ 0 ] == '0' ) - { padapter->wdinfo.wfd_tdls_weaksec = 0; - } else - { padapter->wdinfo.wfd_tdls_weaksec = 1; - } -#endif + +#endif /* CONFIG_TDLS */ return ret; } @@ -13217,56 +13223,48 @@ static int rtw_tdls_enable(struct net_device *dev, u8 empty_hwaddr[ETH_ALEN] = { 0x00 }; struct tdls_txmgmt txmgmt; - printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); + DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); _rtw_memset(tdls_sta, 0x00, sizeof(tdls_sta)); _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - if ( extra[ 0 ] == '0' ) - { + if (extra[ 0 ] == '0') { ptdlsinfo->tdls_enable = 0; if(pstapriv->asoc_sta_count==1) return ret; _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - for(index=0; index< NUM_STA; index++) - { + for (index=0; index< NUM_STA; index++) { phead = &(pstapriv->sta_hash[index]); plist = get_next(phead); - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list); plist = get_next(plist); - if(psta->tdls_sta_state != TDLS_STATE_NONE) - { + if (psta->tdls_sta_state != TDLS_STATE_NONE) { _rtw_memcpy(tdls_sta[index], psta->hwaddr, ETH_ALEN); } } } _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - for(index=0; index< NUM_STA; index++) - { - if( !_rtw_memcmp(tdls_sta[index], empty_hwaddr, ETH_ALEN) ) - { - printk("issue tear down to "MAC_FMT"\n", MAC_ARG(tdls_sta[index])); + for (index=0; index< NUM_STA; index++) { + if (!_rtw_memcmp(tdls_sta[index], empty_hwaddr, ETH_ALEN)) { + DBG_871X("issue tear down to "MAC_FMT"\n", MAC_ARG(tdls_sta[index])); txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_; _rtw_memcpy(txmgmt.peer, tdls_sta[index], ETH_ALEN); - issue_tdls_teardown(padapter, &txmgmt, _FALSE); + issue_tdls_teardown(padapter, &txmgmt, _TRUE); } } - rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR); + rtw_tdls_cmd(padapter, NULL, TDLS_RS_RCR); rtw_reset_tdls_info(padapter); - } - else if ( extra[ 0 ] == '1' ) - { + } else if (extra[0] == '1') { ptdlsinfo->tdls_enable = 1; } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ return ret; } @@ -13282,13 +13280,12 @@ static int rtw_tdls_setup(struct net_device *dev, struct tdls_txmgmt txmgmt; #ifdef CONFIG_WFD struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif // CONFIG_WFD +#endif /* CONFIG_WFD */ - printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); + DBG_871X("[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1); - if(wrqu->data.length - 1 != 17 ) - { - printk( "[%s] length:%d != 17\n", __FUNCTION__, (wrqu->data.length -1) ); + if (wrqu->data.length - 1 != 17) { + DBG_871X("[%s] length:%d != 17\n", __FUNCTION__, (wrqu->data.length -1)); return ret; } @@ -13298,25 +13295,21 @@ static int rtw_tdls_setup(struct net_device *dev, } #ifdef CONFIG_WFD - if ( _AES_ != padapter->securitypriv.dot11PrivacyAlgrthm ) - { - // Weak Security situation with AP. - if ( 0 == pwdinfo->wfd_tdls_weaksec ) - { - // Can't send the tdls setup request out!! - DBG_871X( "[%s] Current link is not AES, SKIP sending the tdls setup request!!\n", __FUNCTION__ ); - } - else - { + if (_AES_ != padapter->securitypriv.dot11PrivacyAlgrthm) { + /* Weak Security situation with AP. */ + if (0 == pwdinfo->wfd_tdls_weaksec) { + /* Can't send the tdls setup request out!! */ + DBG_871X("[%s] Current link is not AES, " + "SKIP sending the tdls setup request!!\n", __FUNCTION__); + } else { issue_tdls_setup_req(padapter, &txmgmt, _TRUE); } - } - else -#endif // CONFIG_WFD + } else +#endif /* CONFIG_WFD */ { issue_tdls_setup_req(padapter, &txmgmt, _TRUE); } -#endif +#endif /* CONFIG_TDLS */ return ret; } @@ -13336,30 +13329,28 @@ static int rtw_tdls_teardown(struct net_device *dev, DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); - if(wrqu->data.length - 1 != 17 && wrqu->data.length - 1 != 19) - { - printk( "[%s] length:%d != 17 or 19\n", __FUNCTION__, (wrqu->data.length -1) ); + if (wrqu->data.length - 1 != 17 && wrqu->data.length - 1 != 19) { + DBG_871X("[%s] length:%d != 17 or 19\n", + __FUNCTION__, (wrqu->data.length -1)); return ret; } _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){ + for (i=0, j=0; i < ETH_ALEN; i++, j+=3) txmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1)); - } ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), txmgmt.peer); - if(ptdls_sta != NULL) - { + if (ptdls_sta != NULL) { txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_; - if(wrqu->data.length - 1 == 17) + if (wrqu->data.length - 1 == 19) issue_tdls_teardown(padapter, &txmgmt, _FALSE); - else if(wrqu->data.length - 1 == 19) + else issue_tdls_teardown(padapter, &txmgmt, _TRUE); - } - else + } else { DBG_871X( "TDLS peer not found\n"); -#endif //CONFIG_TDLS + } +#endif /* CONFIG_TDLS */ return ret; } @@ -13373,8 +13364,6 @@ static int rtw_tdls_discovery(struct net_device *dev, #ifdef CONFIG_TDLS _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct tdls_txmgmt txmgmt; int i = 0, j=0; @@ -13387,7 +13376,7 @@ static int rtw_tdls_discovery(struct net_device *dev, issue_tdls_dis_req(padapter, &txmgmt); -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ return ret; } @@ -13399,27 +13388,169 @@ static int rtw_tdls_ch_switch(struct net_device *dev, int ret = 0; #ifdef CONFIG_TDLS - +#ifdef CONFIG_TDLS_CH_SW _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - u8 i, j, mac_addr[ETH_ALEN]; + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; + u8 i, j; struct sta_info *ptdls_sta = NULL; DBG_8192C( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); + if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE) + { + DBG_871X("Can't do TDLS channel switch since ch_switch_prohibited = _TRUE\n"); + return ret; + } + for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){ - mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1)); + pchsw_info->addr[i] = key_2char2num(*(extra+j), *(extra+j+1)); } - ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr); + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pchsw_info->addr); if( ptdls_sta == NULL ) return ret; -// ptdlsinfo->ch_sensing=1; + pchsw_info->ch_sw_state |= TDLS_CH_SW_INITIATOR_STATE; + + if (ptdls_sta != NULL) { + if (pchsw_info->off_ch_num == 0) + pchsw_info->off_ch_num = 11; + }else { + DBG_871X( "TDLS peer not found\n"); + } + + + //issue_tdls_ch_switch_req(padapter, ptdls_sta); + /* DBG_871X("issue tdls ch switch req\n"); */ + +#endif /* CONFIG_TDLS_CH_SW */ +#endif /* CONFIG_TDLS */ + + return ret; +} + +static int rtw_tdls_ch_switch_off(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0; + +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW + + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; + u8 i, j, mac_addr[ETH_ALEN]; + struct sta_info *ptdls_sta = NULL; + struct tdls_txmgmt txmgmt; + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + + DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); + + if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE) + { + DBG_871X("Can't do TDLS channel switch since ch_switch_prohibited = _TRUE\n"); + return ret; + } + + if (wrqu->data.length >= 17) { + for (i=0, j=0 ; i < ETH_ALEN; i++, j+=3) + mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1)); + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr); + } + + if (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)) { + SelectChannel(padapter, padapter->mlmeextpriv.cur_channel); + } + + pchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE | + TDLS_CH_SWITCH_ON_STATE | + TDLS_PEER_AT_OFF_STATE); + ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); + _rtw_memset(pchsw_info->addr, 0x00, ETH_ALEN); + + if (ptdls_sta != NULL) { + ptdls_sta->ch_switch_time = 0; + ptdls_sta->ch_switch_timeout = 0; + _cancel_timer_ex(&ptdls_sta->ch_sw_timer); + _cancel_timer_ex(&ptdls_sta->delay_timer); + } + +#endif /* CONFIG_TDLS_CH_SW */ +#endif /* CONFIG_TDLS */ -// rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_INIT_CH_SEN); + return ret; +} + +static int rtw_tdls_dump_ch(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0; + +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + DBG_8192C("[%s] dump_stack:%s\n", __FUNCTION__, extra); + + extra[ wrqu->data.length ] = 0x00; + ptdlsinfo->chsw_info.dump_stack = rtw_atoi( extra ); + + return ret; + +#endif +#endif /* CONFIG_TDLS */ + + return ret; +} + +static int rtw_tdls_off_ch_num(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0; + +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + DBG_8192C("[%s] off_ch_num:%s\n", __FUNCTION__, extra); + + extra[ wrqu->data.length ] = 0x00; + ptdlsinfo->chsw_info.off_ch_num = rtw_atoi(extra); + + return ret; + +#endif +#endif /* CONFIG_TDLS */ + + return ret; +} + +static int rtw_tdls_ch_offset(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0; + +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + DBG_8192C("[%s] ch_offset:%s\n", __FUNCTION__, extra); + + extra[ wrqu->data.length ] = 0x00; + ptdlsinfo->chsw_info.ch_offset = rtw_atoi( extra ); + + return ret; -#endif //CONFIG_TDLS +#endif +#endif /* CONFIG_TDLS */ return ret; } @@ -13433,22 +13564,19 @@ static int rtw_tdls_pson(struct net_device *dev, #ifdef CONFIG_TDLS _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 i, j, mac_addr[ETH_ALEN]; struct sta_info *ptdls_sta = NULL; DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); - for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){ + for (i=0, j=0; i < ETH_ALEN; i++, j+=3) mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1)); - } ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr); issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 1, 3, 500); -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ return ret; } @@ -13462,25 +13590,20 @@ static int rtw_tdls_psoff(struct net_device *dev, #ifdef CONFIG_TDLS _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 i, j, mac_addr[ETH_ALEN]; struct sta_info *ptdls_sta = NULL; DBG_8192C( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); - for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){ + for (i=0, j=0; i < ETH_ALEN; i++, j+=3) mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1)); - } ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr); if(ptdls_sta) - { - //issue_tdls_peer_traffic_rsp(padapter, ptdls_sta); issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 3, 500); - } -#endif //CONFIG_TDLS + +#endif /* CONFIG_TDLS */ return ret; } @@ -13497,17 +13620,13 @@ static int rtw_tdls_setip(struct net_device *dev, _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info; - u8 i=0, j=0, k=0, tag=0, ip[3] = { 0xff }, *ptr = extra; - - printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length - 1 ); + u8 i=0, j=0, k=0, tag=0; + DBG_871X("[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length - 1); - while( i < 4 ) - { - for( j=0; j < 4; j++) - { - if( *( extra + j + tag ) == '.' || *( extra + j + tag ) == '\0' ) - { + while (i < 4) { + for (j=0; j < 4; j++) { + if (*( extra + j + tag ) == '.' || *( extra + j + tag ) == '\0') { if( j == 1 ) pwfd_info->ip_address[i]=convert_ip_addr( '0', '0', *(extra+(j-1)+tag)); if( j == 2 ) @@ -13522,13 +13641,14 @@ static int rtw_tdls_setip(struct net_device *dev, i++; } - printk( "[%s] Set IP = %u.%u.%u.%u \n", __FUNCTION__, - ptdlsinfo->wfd_info->ip_address[0], ptdlsinfo->wfd_info->ip_address[1], - ptdlsinfo->wfd_info->ip_address[2], ptdlsinfo->wfd_info->ip_address[3] - ); + DBG_871X( "[%s] Set IP = %u.%u.%u.%u \n", __FUNCTION__, + ptdlsinfo->wfd_info->ip_address[0], + ptdlsinfo->wfd_info->ip_address[1], + ptdlsinfo->wfd_info->ip_address[2], + ptdlsinfo->wfd_info->ip_address[3]); -#endif //CONFIG_WFD -#endif //CONFIG_TDLS +#endif /* CONFIG_WFD */ +#endif /* CONFIG_TDLS */ return ret; } @@ -13546,22 +13666,20 @@ static int rtw_tdls_getip(struct net_device *dev, struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info; - printk( "[%s]\n", __FUNCTION__); + DBG_871X( "[%s]\n", __FUNCTION__); sprintf( extra, "\n\n%u.%u.%u.%u\n", pwfd_info->peer_ip_address[0], pwfd_info->peer_ip_address[1], - pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3] - ); + pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]); - printk( "[%s] IP=%u.%u.%u.%u\n", __FUNCTION__, + DBG_871X( "[%s] IP=%u.%u.%u.%u\n", __FUNCTION__, pwfd_info->peer_ip_address[0], pwfd_info->peer_ip_address[1], - pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3] - ); + pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]); wrqu->data.length = strlen( extra ); -#endif //CONFIG_WFD -#endif //CONFIG_TDLS +#endif /* CONFIG_WFD */ +#endif /* CONFIG_TDLS */ return ret; } @@ -13580,21 +13698,22 @@ static int rtw_tdls_getport(struct net_device *dev, struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info; - printk( "[%s]\n", __FUNCTION__); + DBG_871X( "[%s]\n", __FUNCTION__); sprintf( extra, "\n\n%d\n", pwfd_info->peer_rtsp_ctrlport ); - printk( "[%s] remote port = %d\n", __FUNCTION__, pwfd_info->peer_rtsp_ctrlport ); + DBG_871X( "[%s] remote port = %d\n", + __FUNCTION__, pwfd_info->peer_rtsp_ctrlport ); wrqu->data.length = strlen( extra ); -#endif //CONFIG_WFD -#endif //CONFIG_TDLS +#endif /* CONFIG_WFD */ +#endif /* CONFIG_TDLS */ return ret; } -//WFDTDLS, for sigma test +/* WFDTDLS, for sigma test */ static int rtw_tdls_dis_result(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -13607,26 +13726,24 @@ static int rtw_tdls_dis_result(struct net_device *dev, _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info; - printk( "[%s]\n", __FUNCTION__); + DBG_871X( "[%s]\n", __FUNCTION__); - if(ptdlsinfo->dev_discovered == 1 ) - { + if (ptdlsinfo->dev_discovered == _TRUE) { sprintf( extra, "\n\nDis=1\n" ); - ptdlsinfo->dev_discovered = 0; + ptdlsinfo->dev_discovered = _FALSE; } wrqu->data.length = strlen( extra ); -#endif //CONFIG_WFD -#endif //CONFIG_TDLS +#endif /* CONFIG_WFD */ +#endif /* CONFIG_TDLS */ return ret; } -//WFDTDLS, for sigma test +/* WFDTDLS, for sigma test */ static int rtw_wfd_tdls_status(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -13639,20 +13756,39 @@ static int rtw_wfd_tdls_status(struct net_device *dev, _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - printk( "[%s]\n", __FUNCTION__); + DBG_871X("[%s]\n", __FUNCTION__); - sprintf( extra, "\nlink_established:0x%08x \n" + sprintf( extra, "\nlink_established:%d \n" "sta_cnt:%d \n" "sta_maximum:%d \n" "cur_channel:%d \n" - "tdls_enable:%d", - ptdlsinfo->link_established, ptdlsinfo->sta_cnt, ptdlsinfo->sta_maximum, - ptdlsinfo->cur_channel, ptdlsinfo->tdls_enable - ); + "tdls_enable:%d" +#ifdef CONFIG_TDLS_CH_SW + "ch_sw_state:%08x\n" + "chsw_on:%d\n" + "off_ch_num:%d\n" + "cur_time:%d\n" + "ch_offset:%d\n" + "delay_swtich_back:%d" +#endif + , + ptdlsinfo->link_established, ptdlsinfo->sta_cnt, + ptdlsinfo->sta_maximum, ptdlsinfo->cur_channel, + ptdlsinfo->tdls_enable +#ifdef CONFIG_TDLS_CH_SW +, + ptdlsinfo->chsw_info.ch_sw_state, + ATOMIC_READ(&padapter->tdlsinfo.chsw_info.chsw_on), + ptdlsinfo->chsw_info.off_ch_num, + ptdlsinfo->chsw_info.cur_time, + ptdlsinfo->chsw_info.ch_offset, + ptdlsinfo->chsw_info.delay_switch_back +#endif +); wrqu->data.length = strlen( extra ); -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ return ret; @@ -13671,68 +13807,102 @@ static int rtw_tdls_getsta(struct net_device *dev, char charmac[17]; struct sta_info *ptdls_sta = NULL; - printk( "[%s] %s %d\n", __FUNCTION__, (char *)wrqu->data.pointer, wrqu->data.length -1 ); + DBG_871X("[%s] %s %d\n", __FUNCTION__, + (char *)wrqu->data.pointer, wrqu->data.length -1); if(copy_from_user(charmac, wrqu->data.pointer+9, 17)){ ret = -EFAULT; goto exit; } - printk("[%s] %d, charmac:%s\n", __FUNCTION__, __LINE__, charmac); - for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){ + DBG_871X("[%s] %d, charmac:%s\n", __FUNCTION__, __LINE__, charmac); + for (i=0, j=0 ; i < ETH_ALEN; i++, j+=3) addr[i]=key_2char2num(*(charmac+j), *(charmac+j+1)); - } - printk("[%s] %d, charmac:%s, addr:"MAC_FMT"\n", __FUNCTION__, __LINE__, charmac, MAC_ARG(addr)); + DBG_871X("[%s] %d, charmac:%s, addr:"MAC_FMT"\n", + __FUNCTION__, __LINE__, charmac, MAC_ARG(addr)); ptdls_sta = rtw_get_stainfo(&padapter->stapriv, addr); if(ptdls_sta) { - sprintf(extra, "\n\ntdls_sta_state=%d\n", ptdls_sta->tdls_sta_state); - printk("\n\ntdls_sta_state=%d\n", ptdls_sta->tdls_sta_state); - } - else { + sprintf(extra, "\n\ntdls_sta_state=0x%08x\n", ptdls_sta->tdls_sta_state); + DBG_871X("\n\ntdls_sta_state=%d\n", ptdls_sta->tdls_sta_state); + } else { sprintf(extra, "\n\nNot found this sta\n"); - printk("\n\nNot found this sta\n"); + DBG_871X("\n\nNot found this sta\n"); } wrqu->data.length = strlen( extra ); -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ exit: return ret; } -static int rtw_tdls_ch_switch_off(struct net_device *dev, +static int rtw_tdls_get_best_ch(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - int ret = 0; - -#ifdef CONFIG_TDLS - +#ifdef CONFIG_FIND_BEST_CHANNEL _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - u8 i, j, mac_addr[ETH_ALEN]; - struct sta_info *ptdls_sta = NULL; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0; + + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { + if (pmlmeext->channel_set[i].ChannelNum == 1) + index_24G = i; + if (pmlmeext->channel_set[i].ChannelNum == 36) + index_5G = i; + } + + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { + /* 2.4G */ + if (pmlmeext->channel_set[i].ChannelNum == 6 || pmlmeext->channel_set[i].ChannelNum == 11) { + if (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count) { + index_24G = i; + best_channel_24G = pmlmeext->channel_set[i].ChannelNum; + } + } + + /* 5G */ + if (pmlmeext->channel_set[i].ChannelNum >= 36 + && pmlmeext->channel_set[i].ChannelNum < 140) { + /* Find primary channel */ + if (((pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0) + && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) { + index_5G = i; + best_channel_5G = pmlmeext->channel_set[i].ChannelNum; + } + } + + if (pmlmeext->channel_set[i].ChannelNum >= 149 + && pmlmeext->channel_set[i].ChannelNum < 165) { + /* Find primary channel */ + if (((pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0) + && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) { + index_5G = i; + best_channel_5G = pmlmeext->channel_set[i].ChannelNum; + } + } +#if 1 /* debug */ + DBG_871X("The rx cnt of channel %3d = %d\n", + pmlmeext->channel_set[i].ChannelNum, + pmlmeext->channel_set[i].rx_count); +#endif + } - DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); + sprintf( extra, "\nbest_channel_24G = %d\n", best_channel_24G ); + DBG_871X("best_channel_24G = %d\n", best_channel_24G); - for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){ - mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1)); + if (index_5G != 0) { + sprintf(extra, "best_channel_5G = %d\n", best_channel_5G); + DBG_871X("best_channel_5G = %d\n", best_channel_5G); } - ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr); + wrqu->data.length = strlen( extra ); - ptdls_sta->tdls_sta_state |= TDLS_SW_OFF_STATE; -/* - if((ptdls_sta->tdls_sta_state & TDLS_AT_OFF_CH_STATE) && (ptdls_sta->tdls_sta_state & TDLS_PEER_AT_OFF_STATE)){ - pmlmeinfo->tdls_candidate_ch= pmlmeext->cur_channel; - issue_tdls_ch_switch_req(padapter, mac_addr); - DBG_871X("issue tdls ch switch req back to base channel\n"); - } -*/ - -#endif //CONFIG_TDLS +#endif + + return 0; - return ret; } static int rtw_tdls(struct net_device *dev, @@ -13742,85 +13912,71 @@ static int rtw_tdls(struct net_device *dev, int ret = 0; #ifdef CONFIG_TDLS - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); DBG_871X( "[%s] extra = %s\n", __FUNCTION__, extra ); - // WFD Sigma will use the tdls enable command to let the driver know we want to test the tdls now! - if ( _rtw_memcmp( extra, "wfdenable=", 10 ) ) - { + /* WFD Sigma will use the tdls enable command to let the driver know we want to test the tdls now! */ + if (_rtw_memcmp(extra, "wfdenable=", 10)) { wrqu->data.length -=10; rtw_wfd_tdls_enable( dev, info, wrqu, &extra[10] ); return ret; - } - else if ( _rtw_memcmp( extra, "weaksec=", 8 ) ) - { + } else if (_rtw_memcmp(extra, "weaksec=", 8)) { wrqu->data.length -=8; rtw_tdls_weaksec( dev, info, wrqu, &extra[8] ); return ret; - } - else if ( _rtw_memcmp( extra, "tdlsenable=", 11 ) ) - { + } else if (_rtw_memcmp( extra, "tdlsenable=", 11)) { wrqu->data.length -=11; rtw_tdls_enable( dev, info, wrqu, &extra[11] ); return ret; } - if( padapter->tdlsinfo.tdls_enable == 0 ) - { - printk("tdls haven't enabled\n"); + if (padapter->tdlsinfo.tdls_enable == 0) { + DBG_871X("tdls haven't enabled\n"); return 0; } - if ( _rtw_memcmp( extra, "setup=", 6 ) ) - { + if (_rtw_memcmp(extra, "setup=", 6)) { wrqu->data.length -=6; rtw_tdls_setup( dev, info, wrqu, &extra[6] ); - } - else if (_rtw_memcmp( extra, "tear=", 5 ) ) - { + } else if (_rtw_memcmp(extra, "tear=", 5)) { wrqu->data.length -= 5; rtw_tdls_teardown( dev, info, wrqu, &extra[5] ); - } - else if (_rtw_memcmp( extra, "dis=", 4 ) ) - { + } else if (_rtw_memcmp(extra, "dis=", 4)) { wrqu->data.length -= 4; rtw_tdls_discovery( dev, info, wrqu, &extra[4] ); - } - else if (_rtw_memcmp( extra, "sw=", 3 ) ) - { + } else if (_rtw_memcmp(extra, "swoff=", 6)) { + wrqu->data.length -= 6; + rtw_tdls_ch_switch_off(dev, info, wrqu, &extra[6]); + } else if (_rtw_memcmp(extra, "sw=", 3)) { wrqu->data.length -= 3; rtw_tdls_ch_switch( dev, info, wrqu, &extra[3] ); - } - else if (_rtw_memcmp( extra, "swoff=", 6 ) ) - { - wrqu->data.length -= 6; - rtw_tdls_ch_switch_off( dev, info, wrqu, &extra[6] ); - } - else if (_rtw_memcmp( extra, "pson=", 5 ) ) - { + } else if (_rtw_memcmp(extra, "dumpstack=", 10)) { + wrqu->data.length -= 10; + rtw_tdls_dump_ch(dev, info, wrqu, &extra[10]); + } else if (_rtw_memcmp(extra, "offchnum=", 9)) { + wrqu->data.length -= 9; + rtw_tdls_off_ch_num(dev, info, wrqu, &extra[9]); + } else if (_rtw_memcmp(extra, "choffset=", 9)) { + wrqu->data.length -= 9; + rtw_tdls_ch_offset(dev, info, wrqu, &extra[9]); + } else if (_rtw_memcmp(extra, "pson=", 5)) { wrqu->data.length -= 5; rtw_tdls_pson( dev, info, wrqu, &extra[5] ); - } - else if (_rtw_memcmp( extra, "psoff=", 6 ) ) - { + } else if (_rtw_memcmp(extra, "psoff=", 6)) { wrqu->data.length -= 6; rtw_tdls_psoff( dev, info, wrqu, &extra[6] ); } #ifdef CONFIG_WFD - else if (_rtw_memcmp( extra, "setip=", 6 ) ) - { + else if (_rtw_memcmp(extra, "setip=", 6)) { wrqu->data.length -= 6; rtw_tdls_setip( dev, info, wrqu, &extra[6] ); - } - else if (_rtw_memcmp( extra, "tprobe=", 6 ) ) - { + } else if (_rtw_memcmp(extra, "tprobe=", 6)) { issue_tunneled_probe_req((_adapter *)rtw_netdev_priv(dev)); } -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ return ret; } @@ -13832,33 +13988,24 @@ static int rtw_tdls_get(struct net_device *dev, { int ret = 0; -#ifdef CONFIG_WFD +#ifdef CONFIG_TDLS DBG_871X( "[%s] extra = %s\n", __FUNCTION__, (char*) wrqu->data.pointer ); if ( _rtw_memcmp( wrqu->data.pointer, "ip", 2 ) ) - { rtw_tdls_getip( dev, info, wrqu, extra ); - } - if ( _rtw_memcmp( wrqu->data.pointer, "port", 4 ) ) - { + else if (_rtw_memcmp(wrqu->data.pointer, "port", 4)) rtw_tdls_getport( dev, info, wrqu, extra ); - } - //WFDTDLS, for sigma test - if ( _rtw_memcmp( wrqu->data.pointer, "dis", 3 ) ) - { + /* WFDTDLS, for sigma test */ + else if ( _rtw_memcmp(wrqu->data.pointer, "dis", 3)) rtw_tdls_dis_result( dev, info, wrqu, extra ); - } - if ( _rtw_memcmp( wrqu->data.pointer, "status", 6 ) ) - { + else if ( _rtw_memcmp(wrqu->data.pointer, "status", 6)) rtw_wfd_tdls_status( dev, info, wrqu, extra ); - } - if ( _rtw_memcmp( wrqu->data.pointer, "tdls_sta=", 9 ) ) - { + else if ( _rtw_memcmp(wrqu->data.pointer, "tdls_sta=", 9)) rtw_tdls_getsta( dev, info, wrqu, extra ); - } - -#endif //CONFIG_WFD + else if (_rtw_memcmp(wrqu->data.pointer, "best_ch", 7)) + rtw_tdls_get_best_ch(dev, info, wrqu, extra); +#endif /* CONFIG_TDLS */ return ret; } @@ -13906,12 +14053,6 @@ static int rtw_widi_set_probe_request(struct net_device *dev, #ifdef CONFIG_MAC_LOOPBACK_DRIVER -#ifdef CONFIG_RTL8723A -extern void rtl8723a_cal_txdesc_chksum(struct tx_desc *ptxdesc); -#define cal_txdesc_chksum rtl8723a_cal_txdesc_chksum -extern void rtl8723a_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf); -#define fill_default_txdesc rtl8723a_fill_default_txdesc -#endif #if defined(CONFIG_RTL8188E) #include extern void rtl8188e_cal_txdesc_chksum(struct tx_desc *ptxdesc); @@ -14103,7 +14244,7 @@ static struct xmit_frame* createloopbackpkt(PADAPTER padapter, u32 size) _rtw_memset(pattrib, 0, sizeof(struct pkt_attrib)); pattrib->ether_type = 0x8723; - _rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN); _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); @@ -14415,11 +14556,9 @@ static void loopbackTest(PADAPTER padapter, u32 cnt, u32 size, u8* pmsg) return; } - // disable dynamic algorithm - { - u32 DMFlag = DYNAMIC_FUNC_DISABLE; - rtw_hal_get_hwreg(padapter, HW_VAR_DM_FLAG, (u8*)&DMFlag); - } + // disable dynamic algorithm + Save_DM_Func_Flag(padapter); + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); // create pseudo ad-hoc connection err = initpseudoadhoc(padapter); @@ -14527,34 +14666,6 @@ static int rtw_test( } #endif -#if 0 -//#ifdef CONFIG_RTL8723A - if (strcmp(pch, "poweron") == 0) - { - s32 ret; - - ret = _InitPowerOn(padapter); - DBG_871X("%s: power on %s\n", __func__, (_FAIL==ret) ? "FAIL!":"OK."); - sprintf(extra, "Power ON %s", (_FAIL==ret) ? "FAIL!":"OK."); - wrqu->data.length = strlen(extra) + 1; - - rtw_mfree(pbuf, len); - return 0; - } - - if (strcmp(pch, "dlfw") == 0) - { - s32 ret; - - ret = rtl8723a_FirmwareDownload(padapter); - DBG_871X("%s: download FW %s\n", __func__, (_FAIL==ret) ? "FAIL!":"OK."); - sprintf(extra, "download FW %s", (_FAIL==ret) ? "FAIL!":"OK."); - wrqu->data.length = strlen(extra) + 1; - - rtw_mfree(pbuf, len); - return 0; - } -#endif #ifdef CONFIG_BT_COEXIST if (strcmp(pch, "bton") == 0) @@ -14602,20 +14713,6 @@ 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); @@ -14834,8 +14931,10 @@ static const struct iw_priv_args rtw_private_args[] = { { 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_MON, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_mon" }, + { EFUSE_MASK, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_mask" }, + { EFUSE_FILE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_file" }, +#if defined(CONFIG_RTL8723B) { MP_SetBT, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_setbt" }, { MP_DISABLE_BT_COEXIST, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_disa_btcoex"}, #endif @@ -14943,26 +15042,7 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev) #endif tmp_qual = padapter->recvpriv.signal_qual; -#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 + rtw_get_noise(padapter); 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); @@ -15067,12 +15147,13 @@ static int _rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq input_len = wdata.data.length; input = rtw_zmalloc(input_len); - if (NULL == input) + if (NULL == input || input_len == 0) return -ENOMEM; if (copy_from_user(input, wdata.data.pointer, input_len)) { err = -EFAULT; goto exit; } + input[input_len - 1] = '\0'; ptr = input; len = input_len; sscanf(ptr, "%16s", cmdname); @@ -15439,7 +15520,7 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) case RTL_IOCTL_HOSTAPD: ret = rtw_hostapd_ioctl(dev, &wrq->u.data); break; -#ifdef CONFIG_NO_WIRELESS_HANDLERS +#ifdef CONFIG_WIRELESS_EXT case SIOCSIWMODE: ret = rtw_wx_set_mode(dev, NULL, &wrq->u, NULL); break; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/os_intfs.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/os_intfs.c index 1eef779c4292..4f6541d311f5 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/os_intfs.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/os_intfs.c @@ -54,11 +54,7 @@ int rtw_adhoc_tx_pwr = 1; int rtw_soft_ap = 0; //int smart_ps = 1; #ifdef CONFIG_POWER_SAVING -#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 @@ -104,6 +100,8 @@ int rtw_uapsd_acbe_en = 0; int rtw_uapsd_acvi_en = 0; int rtw_uapsd_acvo_en = 0; +int rtw_rfkfree_enable = 2; /* disable kfree */ + #ifdef CONFIG_80211N_HT int rtw_ht_enable = 1; // 0: 20 MHz, 1: 40 MHz, 2: 80 MHz, 3: 160MHz, 4: 80+80MHz @@ -138,6 +136,7 @@ int rtw_lowrate_two_xmit = 1;//Use 2 path Tx to transmit MCS0~7 and legacy mode //int rf_config = RF_1T2R; // 1T2R int rtw_rf_config = RF_MAX_TYPE; //auto + int rtw_low_power = 0; #ifdef CONFIG_WIFI_TEST int rtw_wifi_spec = 1;//for wifi test @@ -166,6 +165,7 @@ int rtw_AcceptAddbaReq = _TRUE;// 0:Reject AP's Add BA req, 1:Accept AP's Add BA int rtw_antdiv_cfg = 2; // 0:OFF , 1:ON, 2:decide by Efuse config int rtw_antdiv_type = 0 ; //0:decide by efuse 1: for 88EE, 1Tx and 1RxCG are diversity.(2 Ant with SPDT), 2: for 88EE, 1Tx and 2Rx are diversity.( 2 Ant, Tx and RxCG are both on aux port, RxCS is on main port ), 3: for 88EE, 1Tx and 1RxCG are fixed.(1Ant, Tx and RxCG are both on aux port) +int rtw_switch_usb3 = _FALSE; /* _FALSE: doesn't switch, _TRUE: switch from usb2.0 to usb 3.0 */ #ifdef CONFIG_USB_AUTOSUSPEND int rtw_enusbss = 1;//0:disable,1:enable @@ -191,10 +191,6 @@ int rtw_hw_wps_pbc = 0; int rtw_mc2u_disable = 0; #endif // CONFIG_TX_MCAST2UNI -#ifdef CONFIG_DUALMAC_CONCURRENT -int rtw_dmsp = 0; -#endif // CONFIG_DUALMAC_CONCURRENT - #ifdef CONFIG_80211D int rtw_80211d = 0; #endif @@ -268,6 +264,8 @@ module_param(rtw_wifi_spec, int, 0644); module_param(rtw_antdiv_cfg, int, 0644); module_param(rtw_antdiv_type, int, 0644); +module_param(rtw_switch_usb3, int, 0644); + module_param(rtw_enusbss, int, 0644); module_param(rtw_hwpdn_mode, int, 0644); module_param(rtw_hwpwrp_detect, int, 0644); @@ -290,9 +288,9 @@ MODULE_PARM_DESC(rtw_max_roaming_times,"The max roaming times to try"); #endif //CONFIG_LAYER2_ROAMING #ifdef CONFIG_IOL -int rtw_fw_iol=1;// 0:Disable, 1:enable, 2:by usb speed +int rtw_fw_iol=1; module_param(rtw_fw_iol, int, 0644); -MODULE_PARM_DESC(rtw_fw_iol,"FW IOL"); +MODULE_PARM_DESC(rtw_fw_iol, "FW IOL. 0:Disable, 1:enable, 2:by usb speed"); #endif //CONFIG_IOL #ifdef CONFIG_FILE_FWIMG @@ -315,10 +313,6 @@ MODULE_PARM_DESC(rtw_fw_mp_bt_file_path, "The path of fw for MP-BT image"); module_param(rtw_mc2u_disable, int, 0644); #endif // CONFIG_TX_MCAST2UNI -#ifdef CONFIG_DUALMAC_CONCURRENT -module_param(rtw_dmsp, int, 0644); -#endif // CONFIG_DUALMAC_CONCURRENT - #ifdef CONFIG_80211D module_param(rtw_80211d, int, 0644); MODULE_PARM_DESC(rtw_80211d, "Enable 802.11d mechanism"); @@ -334,15 +328,19 @@ 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"); +MODULE_PARM_DESC(rtw_adaptivity_en, "0:disable, 1:enable"); 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_adaptivity_dml = CONFIG_RTW_ADAPTIVITY_DML; +module_param(rtw_adaptivity_dml, uint, 0644); +MODULE_PARM_DESC(rtw_adaptivity_dml, "0:disable, 1:enable"); + +uint rtw_adaptivity_dc_backoff = CONFIG_RTW_ADAPTIVITY_DC_BACKOFF; +module_param(rtw_adaptivity_dc_backoff, uint, 0644); +MODULE_PARM_DESC(rtw_adaptivity_dc_backoff, "DC backoff for Adaptivity"); uint rtw_amplifier_type_2g = CONFIG_RTW_AMPLIFIER_TYPE_2G; module_param(rtw_amplifier_type_2g, uint, 0644); @@ -364,6 +362,15 @@ uint rtw_TxBBSwing_5G = 0xFF; module_param(rtw_TxBBSwing_5G, uint, 0644); MODULE_PARM_DESC(rtw_TxBBSwing_5G, "default init value:0xFF"); +uint rtw_OffEfuseMask = 0; +module_param(rtw_OffEfuseMask, uint, 0644); +MODULE_PARM_DESC(rtw_OffEfuseMask, "default open Efuse Mask vaule:0"); + +uint rtw_FileMaskEfuse = 0; +module_param(rtw_FileMaskEfuse, uint, 0644); +MODULE_PARM_DESC(rtw_FileMaskEfuse, "default drv Mask Efuse vaule:0"); + + #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; @@ -478,6 +485,8 @@ _func_enter_; registry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en; registry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en; + registry_par->RegRfKFreeEnable = (u8)rtw_rfkfree_enable; + #ifdef CONFIG_80211N_HT registry_par->ht_enable = (u8)rtw_ht_enable; registry_par->bw_mode = (u8)rtw_bw_mode; @@ -521,6 +530,8 @@ _func_enter_; registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg; registry_par->antdiv_type = (u8)rtw_antdiv_type; + + registry_par->switch_usb3 = (u8)rtw_switch_usb3; #ifdef CONFIG_AUTOSUSPEND registry_par->usbss_enable = (u8)rtw_enusbss;//0:disable,1:enable @@ -548,10 +559,6 @@ _func_enter_; registry_par->fw_iol = rtw_fw_iol; #endif -#ifdef CONFIG_DUALMAC_CONCURRENT - registry_par->dmsp= (u8)rtw_dmsp; -#endif - #ifdef CONFIG_80211D registry_par->enable80211d = (u8)rtw_80211d; #endif @@ -591,8 +598,11 @@ _func_enter_; registry_par->adaptivity_en = (u8)rtw_adaptivity_en; registry_par->adaptivity_mode = (u8)rtw_adaptivity_mode; - registry_par->nhm_en = (u8)rtw_nhm_en; + registry_par->adaptivity_dml = (u8)rtw_adaptivity_dml; + registry_par->adaptivity_dc_backoff = (u8)rtw_adaptivity_dc_backoff; + registry_par->boffefusemask = (u8)rtw_OffEfuseMask; + registry_par->bFileMaskEfuse = (u8)rtw_FileMaskEfuse; _func_exit_; return status; @@ -607,7 +617,7 @@ static int rtw_net_set_mac_address(struct net_device *pnetdev, void *p) { //DBG_871X("r8711_net_set_mac_address(), MAC=%x:%x:%x:%x:%x:%x\n", addr->sa_data[0], addr->sa_data[1], addr->sa_data[2], addr->sa_data[3], //addr->sa_data[4], addr->sa_data[5]); - _rtw_memcpy(padapter->eeprompriv.mac_addr, addr->sa_data, ETH_ALEN); + _rtw_memcpy(adapter_mac_addr(padapter), addr->sa_data, ETH_ALEN); //_rtw_memcpy(pnetdev->dev_addr, addr->sa_data, ETH_ALEN); //padapter->bset_hwaddr = _TRUE; } @@ -766,6 +776,7 @@ int rtw_ndev_init(struct net_device *dev) DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); strncpy(adapter->old_ifname, dev->name, IFNAMSIZ); + adapter->old_ifname[IFNAMSIZ-1] = '\0'; rtw_adapter_proc_init(dev); return 0; @@ -904,51 +915,54 @@ struct net_device *rtw_init_netdev(_adapter *old_padapter) } -void rtw_unregister_netdevs(struct dvobj_priv *dvobj) +void rtw_unregister_netdev(_adapter *adapter) { - int i; - _adapter *padapter = NULL; - - for(i=0;iiface_nums;i++) - { - struct net_device *pnetdev = NULL; - - padapter = dvobj->padapters[i]; + struct net_device *netdev = NULL; - if (padapter == NULL) - continue; + if (adapter == NULL) + return; - pnetdev = padapter->pnetdev; + netdev = adapter->pnetdev; - if((padapter->DriverState != DRIVER_DISAPPEAR) && pnetdev) { - - unregister_netdev(pnetdev); //will call netdev_close() - } + if ((adapter->DriverState != DRIVER_DISAPPEAR) && netdev) + unregister_netdev(netdev); /* will call netdev_close() */ -#ifdef CONFIG_IOCTL_CFG80211 - rtw_wdev_unregister(padapter->rtw_wdev); +#ifdef CONFIG_IOCTL_CFG80211 + rtw_wdev_unregister(adapter->rtw_wdev); #endif +} +void rtw_unregister_netdevs(struct dvobj_priv *dvobj) +{ + int i; + _adapter *adapter = NULL; + + for (i = 0; i < dvobj->iface_nums; i++) { + adapter = dvobj->padapters[i]; + + if (adapter == NULL) + continue; + + rtw_unregister_netdev(adapter); } - -} +} u32 rtw_start_drv_threads(_adapter *padapter) { u32 _status = _SUCCESS; RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_start_drv_threads\n")); + #ifdef CONFIG_XMIT_THREAD_MODE -#if defined(CONFIG_SDIO_HCI) && defined(CONFIG_CONCURRENT_MODE) - if(padapter->adapter_type == PRIMARY_ADAPTER){ -#endif - padapter->xmitThread = kthread_run(rtw_xmit_thread, padapter, "RTW_XMIT_THREAD"); - if(IS_ERR(padapter->xmitThread)) - _status = _FAIL; -#if defined(CONFIG_SDIO_HCI) && defined(CONFIG_CONCURRENT_MODE) +#if defined(CONFIG_SDIO_HCI) + if(is_primary_adapter(padapter)) +#endif + { + padapter->xmitThread = kthread_run(rtw_xmit_thread, padapter, "RTW_XMIT_THREAD"); + if(IS_ERR(padapter->xmitThread)) + _status = _FAIL; } -#endif // CONFIG_SDIO_HCI+CONFIG_CONCURRENT_MODE -#endif +#endif //#ifdef CONFIG_XMIT_THREAD_MODE #ifdef CONFIG_RECV_THREAD_MODE padapter->recvThread = kthread_run(rtw_recv_thread, padapter, "RTW_RECV_THREAD"); @@ -956,10 +970,7 @@ u32 rtw_start_drv_threads(_adapter *padapter) _status = _FAIL; #endif - -#ifdef CONFIG_CONCURRENT_MODE - if(padapter->isprimary == _TRUE) -#endif //CONFIG_CONCURRENT_MODE + if(is_primary_adapter(padapter)) { padapter->cmdThread = kthread_run(rtw_cmd_thread, padapter, "RTW_CMD_THREAD"); if(IS_ERR(padapter->cmdThread)) @@ -1086,7 +1097,7 @@ u8 rtw_init_default_value(_adapter *padapter) RTW_ENABLE_FUNC(padapter, DF_RX_BIT); RTW_ENABLE_FUNC(padapter, DF_TX_BIT); padapter->bLinkInfoDump = 0; - padapter->bNotifyChannelChange = 0; + padapter->bNotifyChannelChange = _FALSE; #ifdef CONFIG_P2P padapter->bShowGetP2PState = 1; #endif @@ -1097,8 +1108,14 @@ u8 rtw_init_default_value(_adapter *padapter) padapter->driver_ampdu_spacing = 0xFF; padapter->driver_rx_ampdu_factor = 0xFF; padapter->driver_rx_ampdu_spacing = 0xFF; - padapter->fix_ba_rxbuf_bz = 0xFF; - + padapter->fix_rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID; + padapter->fix_rx_ampdu_size = RX_AMPDU_SIZE_INVALID; +#ifdef DBG_RX_COUNTER_DUMP + padapter->dump_rx_cnt_mode = 0; + padapter->drv_rx_cnt_ok = 0; + padapter->drv_rx_cnt_crcerror = 0; + padapter->drv_rx_cnt_drop = 0; +#endif return ret; } @@ -1284,10 +1301,17 @@ _func_enter_; } padapter->stapriv.padapter = padapter; - padapter->setband = GHZ24_50; + padapter->setband = WIFI_FREQUENCY_BAND_AUTO; padapter->fix_rate = 0xFF; padapter->data_fb = 0; - padapter->fix_ba_rxbuf_bz = 0xFF; + padapter->fix_rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID; + padapter->fix_rx_ampdu_size = RX_AMPDU_SIZE_INVALID; +#ifdef DBG_RX_COUNTER_DUMP + padapter->dump_rx_cnt_mode = 0; + padapter->drv_rx_cnt_ok = 0; + padapter->drv_rx_cnt_crcerror = 0; + padapter->drv_rx_cnt_drop = 0; +#endif rtw_init_bcmc_stainfo(padapter); rtw_init_pwrctrl_priv(padapter); @@ -1618,10 +1642,6 @@ _adapter *rtw_drv_add_vir_if(_adapter *primary_padapter, pnetdev->stop = netdev_vir_if_close; #endif -#ifdef CONFIG_NO_WIRELESS_HANDLERS - pnetdev->wireless_handlers = NULL; -#endif - /****** init adapter ******/ padapter = rtw_netdev_priv(pnetdev); _rtw_memcpy(padapter, primary_padapter, sizeof(_adapter)); @@ -1666,58 +1686,33 @@ _adapter *rtw_drv_add_vir_if(_adapter *primary_padapter, padapter->chip_type = primary_padapter->chip_type; padapter->HardwareType = primary_padapter->HardwareType; - //step 2. hook HalFunc, allocate HalData - //hal_set_hal_ops(padapter); - rtw_set_hal_ops(padapter); - - padapter->HalFunc.inirp_init = NULL; - padapter->HalFunc.inirp_deinit = NULL; padapter->intf_start = NULL; padapter->intf_stop = NULL; //step init_io_priv if ((rtw_init_io_priv(padapter, set_intf_ops)) == _FAIL) { - RT_TRACE(_module_hci_intfs_c_,_drv_err_,(" \n Can't init io_reqs\n")); + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("\n Can't init io_reqs\n")); + goto error_rtw_drv_add_iface; } - //step read_chip_version - rtw_hal_read_chip_version(padapter); - - //step usb endpoint mapping - rtw_hal_chip_configure(padapter); - - //init drv data if(rtw_init_drv_sw(padapter)!= _SUCCESS) goto error_rtw_drv_add_iface; //get mac address from primary_padapter - _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 -#if 1 //needs enable MBSSID CAM - mac[0] |= BIT(1); // locally administered - mac[0] |= (padapter->iface_id-1)<<4; + _rtw_memcpy(mac, adapter_mac_addr(primary_padapter), ETH_ALEN); + + /* + * If the BIT1 is 0, the address is universally administered. + * If it is 1, the address is locally administered + */ +#if 1 /* needs enable MBSSID CAM */ + mac[0] |= BIT(1); + mac[0] |= (padapter->iface_id-1)<<4; #endif - } - _rtw_memcpy(padapter->eeprompriv.mac_addr, mac, ETH_ALEN); + _rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN); res = _SUCCESS; @@ -1837,36 +1832,23 @@ int _netdev_if2_open(struct net_device *pnetdev) #ifdef CONFIG_PLATFORM_INTEL_BYT if (padapter->bup == _FALSE) { - u8 mac[ETH_ALEN]; + u8 mac[ETH_ALEN]; - //get mac address from primary_padapter + /* get mac address from primary_padapter */ if (primary_padapter->bup == _FALSE) - rtw_macaddr_cfg(primary_padapter->eeprompriv.mac_addr); + rtw_macaddr_cfg(adapter_mac_addr(primary_padapter), get_hal_mac_addr(primary_padapter)); - _rtw_memcpy(mac, primary_padapter->eeprompriv.mac_addr, ETH_ALEN); + _rtw_memcpy(mac, adapter_mac_addr(primary_padapter), 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 - } + /* + * If the BIT1 is 0, the address is universally administered. + * If it is 1, the address is locally administered + */ + mac[0] |= BIT(1); - _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); + _rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN); + rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter)); + _rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN); } #endif //CONFIG_PLATFORM_INTEL_BYT @@ -1958,8 +1940,10 @@ int netdev_if2_open(struct net_device *pnetdev) static int netdev_if2_close(struct net_device *pnetdev) { _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; padapter->net_closed = _TRUE; + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; if(pnetdev) { @@ -2018,10 +2002,6 @@ _adapter *rtw_drv_if2_init(_adapter *primary_padapter, pnetdev->stop = netdev_if2_close; #endif -#ifdef CONFIG_NO_WIRELESS_HANDLERS - pnetdev->wireless_handlers = NULL; -#endif - /****** init adapter ******/ padapter = rtw_netdev_priv(pnetdev); _rtw_memcpy(padapter, primary_padapter, sizeof(_adapter)); @@ -2061,59 +2041,32 @@ _adapter *rtw_drv_if2_init(_adapter *primary_padapter, padapter->chip_type = primary_padapter->chip_type; padapter->HardwareType = primary_padapter->HardwareType; - //step 2. hook HalFunc, allocate HalData - //hal_set_hal_ops(padapter); - rtw_set_hal_ops(padapter); - - padapter->HalFunc.inirp_init = NULL; - padapter->HalFunc.inirp_deinit = NULL; - // padapter->intf_start = primary_padapter->intf_start; padapter->intf_stop = primary_padapter->intf_stop; //step init_io_priv if ((rtw_init_io_priv(padapter, set_intf_ops)) == _FAIL) { - RT_TRACE(_module_hci_intfs_c_,_drv_err_,(" \n Can't init io_reqs\n")); + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("\n Can't init io_reqs\n")); + goto error_rtw_drv_if2_init; } - //step read_chip_version - rtw_hal_read_chip_version(padapter); - - //step usb endpoint mapping - rtw_hal_chip_configure(padapter); - - //init drv data if(rtw_init_drv_sw(padapter)!= _SUCCESS) goto error_rtw_drv_if2_init; - //get mac address from primary_padapter - _rtw_memcpy(mac, primary_padapter->eeprompriv.mac_addr, ETH_ALEN); + /* get mac address from primary_padapter */ + _rtw_memcpy(mac, adapter_mac_addr(primary_padapter), 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 - - } + /* + * If the BIT1 is 0, the address is universally administered. + * If it is 1, the address is locally administered + */ + mac[0] |= BIT(1); - _rtw_memcpy(padapter->eeprompriv.mac_addr, mac, ETH_ALEN); - rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr, padapter->eeprompriv.mac_addr); + _rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN); + rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter)); primary_padapter->pbuddy_adapter = padapter; @@ -2241,7 +2194,7 @@ static int _rtw_drv_register_netdev(_adapter *padapter, char *name) /* alloc netdev name */ rtw_init_netdev_name(pnetdev, name); - _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); + _rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN); /* Tell the network stack we exist */ if (register_netdev(pnetdev) != 0) { @@ -2303,6 +2256,9 @@ int _netdev_open(struct net_device *pnetdev) uint status; _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#endif //CONFIG_BT_COEXIST_SOCKET_TRX RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - dev_open\n")); DBG_871X("+871x_drv - drv_open, bup=%d\n", padapter->bup); @@ -2321,9 +2277,9 @@ 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); + rtw_macaddr_cfg(adapter_mac_addr(padapter), get_hal_mac_addr(padapter)); + rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter)); + _rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN); #endif //CONFIG_PLATFORM_INTEL_BYT padapter->bDriverStopped = _FALSE; @@ -2385,6 +2341,18 @@ int _netdev_open(struct net_device *pnetdev) netdev_br_init(pnetdev); #endif // CONFIG_BR_EXT +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + if(is_primary_adapter(padapter) && _TRUE == pHalData->EEPROMBluetoothCoexist) + { + rtw_btcoex_init_socket(padapter); + padapter->coex_info.BtMgnt.ExtConfig.HCIExtensionVer = 0x04; + rtw_btcoex_SetHciVersion(padapter,0x04); + } + else + DBG_871X("CONFIG_BT_COEXIST: SECONDARY_ADAPTER\n"); +#endif //CONFIG_BT_COEXIST_SOCKET_TRX + + netdev_open_normal_process: #ifdef CONFIG_CONCURRENT_MODE @@ -2490,7 +2458,7 @@ int rtw_ips_pwr_up(_adapter *padapter) if (psrtpriv->silent_reset_inprogress == _TRUE) #endif//#ifdef DBG_CONFIG_ERROR_DETECT #endif //defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS) - rtw_reset_drv_sw(padapter); + rtw_reset_drv_sw(padapter); result = ips_netdrv_open(padapter); @@ -2571,6 +2539,10 @@ static int netdev_close(struct net_device *pnetdev) { _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#endif //CONFIG_BT_COEXIST_SOCKET_TRX RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - drv_close\n")); @@ -2583,6 +2555,7 @@ static int netdev_close(struct net_device *pnetdev) } padapter->net_closed = _TRUE; padapter->netif_up = _FALSE; + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; /* if(!padapter->hw_init_completed) { @@ -2638,6 +2611,12 @@ static int netdev_close(struct net_device *pnetdev) #ifdef CONFIG_WAPI_SUPPORT rtw_wapi_disable_tx(padapter); #endif +#ifdef CONFIG_BT_COEXIST_SOCKET_TRX + if(is_primary_adapter(padapter) && _TRUE == pHalData->EEPROMBluetoothCoexist) + rtw_btcoex_close_socket(padapter); + else + DBG_871X("CONFIG_BT_COEXIST: SECONDARY_ADAPTER\n"); +#endif //CONFIG_BT_COEXIST_SOCKET_TRX #else //!CONFIG_PLATFORM_INTEL_BYT if (pwrctl->bInSuspend == _TRUE) @@ -3097,7 +3076,7 @@ int rtw_suspend_free_assoc_resource(_adapter *padapter) #ifdef CONFIG_AUTOSUSPEND if(is_primary_adapter(padapter) && (!adapter_to_pwrctl(padapter)->bInternalAutoSuspend )) #endif - rtw_free_network_queue(padapter, _TRUE); + rtw_free_network_queue(padapter, _TRUE); if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) rtw_indicate_scan_done(padapter, 1); @@ -3138,6 +3117,7 @@ int rtw_suspend_wow(_adapter *padapter) #endif if (pwrpriv->wowlan_mode == _TRUE) { + if(pnetdev) rtw_netif_stop_queue(pnetdev); #ifdef CONFIG_CONCURRENT_MODE @@ -3146,6 +3126,8 @@ int rtw_suspend_wow(_adapter *padapter) rtw_netif_stop_queue(pbuddy_netdev); } #endif//CONFIG_CONCURRENT_MODE + // 0. Power off LED + rtw_led_control(padapter, LED_CTL_POWER_OFF); // 1. stop thread padapter->bDriverStopped = _TRUE; //for stop thread rtw_stop_drv_threads(padapter); @@ -3177,8 +3159,7 @@ int rtw_suspend_wow(_adapter *padapter) #endif // 2.1 clean interupt - if (padapter->HalFunc.clear_interrupt) - padapter->HalFunc.clear_interrupt(padapter); + rtw_hal_clear_interrupt(padapter); #endif //CONFIG_SDIO_HCI // 2.2 free irq @@ -3194,7 +3175,7 @@ int rtw_suspend_wow(_adapter *padapter) #endif poidparam.subcode = WOWLAN_ENABLE; - padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); + rtw_hal_set_hwreg(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) { if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED)) @@ -3232,10 +3213,13 @@ int rtw_suspend_wow(_adapter *padapter) if(pwrpriv->wowlan_pno_enable) { DBG_871X_LEVEL(_drv_always_, "%s: pno: %d\n", __func__, pwrpriv->wowlan_pno_enable); +#ifdef CONFIG_FWLPS_IN_IPS + rtw_set_fw_in_ips_mode(padapter, _TRUE); +#endif } #ifdef CONFIG_LPS else - rtw_set_ps_mode(padapter, PS_MODE_DTIM, 0, 0, "WOWLAN"); + rtw_set_ps_mode(padapter, PS_MODE_MAX, 0, 0, "WOWLAN"); #endif //#ifdef CONFIG_LPS } @@ -3279,6 +3263,8 @@ int rtw_suspend_ap_wow(_adapter *padapter) rtw_netif_stop_queue(pbuddy_netdev); } #endif//CONFIG_CONCURRENT_MODE + // 0. Power off LED + rtw_led_control(padapter, LED_CTL_POWER_OFF); // 1. stop thread padapter->bDriverStopped = _TRUE; //for stop thread rtw_stop_drv_threads(padapter); @@ -3307,8 +3293,7 @@ int rtw_suspend_ap_wow(_adapter *padapter) #endif // 2.1 clean interupt - if (padapter->HalFunc.clear_interrupt) - padapter->HalFunc.clear_interrupt(padapter); + rtw_hal_clear_interrupt(padapter); #endif //CONFIG_SDIO_HCI // 2.2 free irq @@ -3324,8 +3309,7 @@ int rtw_suspend_ap_wow(_adapter *padapter) #endif poidparam.subcode = WOWLAN_AP_ENABLE; - padapter->HalFunc.SetHwRegHandler(padapter, - HW_VAR_AP_WOWLAN,(u8 *)&poidparam); + rtw_hal_set_hwreg(padapter,HW_VAR_AP_WOWLAN,(u8 *)&poidparam); DBG_871X_LEVEL(_drv_always_, "%s: wowmode suspending\n", __func__); @@ -3431,6 +3415,7 @@ int rtw_suspend_common(_adapter *padapter) DBG_871X_LEVEL(_drv_always_, " suspend start\n"); DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + pdbgpriv->dbg_suspend_cnt++; pwrpriv->bInSuspend = _TRUE; @@ -3483,10 +3468,6 @@ int rtw_suspend_common(_adapter *padapter) } #endif // CONFIG_BT_COEXIST -#if defined(CONFIG_WOWLAN) && defined(CONFIG_GPIO_WAKEUP) - rtw_clear_hostwakeupgpio(padapter); -#endif // CONFIG_WOWLAN && CONFIG_GPIO_WAKEUP - rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND); if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE @@ -3541,6 +3522,7 @@ int rtw_suspend_common(_adapter *padapter) rtw_suspend_normal(padapter); } + DBG_871X_LEVEL(_drv_always_, "rtw suspend success in %d ms\n", rtw_get_passing_time_ms(start_time)); @@ -3589,7 +3571,11 @@ _func_enter_; #ifdef CONFIG_PNO_SUPPORT pwrpriv->pno_in_resume = _TRUE; -#endif +#ifdef CONFIG_FWLPS_IN_IPS + if(pwrpriv->wowlan_pno_enable) + rtw_set_fw_in_ips_mode(padapter, _FALSE); +#endif //CONFIG_FWLPS_IN_IPS +#endif//CONFIG_PNO_SUPPORT if (pwrpriv->wowlan_mode == _TRUE){ #ifdef CONFIG_LPS @@ -3609,8 +3595,7 @@ _func_enter_; } #endif - if (padapter->HalFunc.clear_interrupt) - padapter->HalFunc.clear_interrupt(padapter); + rtw_hal_clear_interrupt(padapter); #endif //CONFIG_SDIO_HCI //if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) { @@ -3622,7 +3607,7 @@ _func_enter_; //Disable WOW, set H2C command poidparam.subcode=WOWLAN_DISABLE; - padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); + rtw_hal_set_hwreg(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); #ifdef CONFIG_CONCURRENT_MODE rtw_reset_drv_sw(padapter->pbuddy_adapter); @@ -3714,7 +3699,11 @@ _func_enter_; } if (pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) { - rtw_lock_ext_suspend_timeout(15000); +#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) { @@ -3729,8 +3718,18 @@ _func_enter_; pwrpriv->wowlan_mode =_FALSE; + // Power On LED + rtw_hal_sw_led_init(padapter); + if(pwrpriv->wowlan_wake_reason == Rx_DisAssoc || + pwrpriv->wowlan_wake_reason == Rx_DeAuth || + pwrpriv->wowlan_wake_reason == FWDecisionDisconnect) + rtw_led_control(padapter, LED_CTL_NO_LINK); + else + rtw_led_control(padapter, LED_CTL_LINK); + //clean driver side wake up reason. pwrpriv->wowlan_wake_reason = 0; + exit: DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter)); _func_exit_; @@ -3775,8 +3774,7 @@ _func_enter_; rtw_hal_disable_interrupt(padapter); - if (padapter->HalFunc.clear_interrupt) - padapter->HalFunc.clear_interrupt(padapter); + rtw_hal_clear_interrupt(padapter); //if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) { if((padapter->intf_alloc_irq) && (padapter->intf_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)){ @@ -3787,8 +3785,7 @@ _func_enter_; //Disable WOW, set H2C command poidparam.subcode = WOWLAN_AP_DISABLE; - padapter->HalFunc.SetHwRegHandler(padapter, - HW_VAR_AP_WOWLAN,(u8 *)&poidparam); + rtw_hal_set_hwreg(padapter,HW_VAR_AP_WOWLAN,(u8 *)&poidparam); pwrpriv->wowlan_ap_mode = _FALSE; padapter->bDriverStopped = _FALSE; @@ -3869,6 +3866,10 @@ _func_enter_; #endif //clean driver side wake up reason. pwrpriv->wowlan_wake_reason = 0; + + // Power On LED + rtw_hal_sw_led_init(padapter); + rtw_led_control(padapter, LED_CTL_LINK); exit: DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter)); _func_exit_; @@ -4077,7 +4078,7 @@ u8 rtw_get_gpio(struct net_device *netdev, u8 gpio_num) } EXPORT_SYMBOL(rtw_get_gpio); -int rtw_set_gpio_output_value(struct net_device *netdev, u8 gpio_num, BOOLEAN isHigh) +int rtw_set_gpio_output_value(struct net_device *netdev, u8 gpio_num, bool isHigh) { u8 direction = 0; u8 res = -1; @@ -4086,11 +4087,25 @@ int rtw_set_gpio_output_value(struct net_device *netdev, u8 gpio_num, BOOLEAN i } EXPORT_SYMBOL(rtw_set_gpio_output_value); -int rtw_config_gpio(struct net_device *netdev, u8 gpio_num, BOOLEAN isOutput) +int rtw_config_gpio(struct net_device *netdev, u8 gpio_num, bool isOutput) { _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev); return rtw_hal_config_gpio(adapter,gpio_num,isOutput); } EXPORT_SYMBOL(rtw_config_gpio); +int rtw_register_gpio_interrupt(struct net_device *netdev, int gpio_num, void(*callback)(u8 level)) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev); + return rtw_hal_register_gpio_interrupt(adapter,gpio_num,callback); +} +EXPORT_SYMBOL(rtw_register_gpio_interrupt); + +int rtw_disable_gpio_interrupt(struct net_device *netdev, int gpio_num) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev); + return rtw_hal_disable_gpio_interrupt(adapter,gpio_num); +} +EXPORT_SYMBOL(rtw_disable_gpio_interrupt); + #endif //#ifdef CONFIG_GPIO_API diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/recv_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/recv_linux.c index 2c2a47ab66a3..0b1a74585c37 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/recv_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/recv_linux.c @@ -183,8 +183,6 @@ int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf) precvbuf->pskb = NULL; - precvbuf->reuse = _FALSE; - precvbuf->pallocated_buf = precvbuf->pbuf = NULL; precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL; @@ -319,7 +317,7 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri //DBG_871X("bmcast=%d\n", bmcast); - if(_rtw_memcmp(pattrib->dst, myid(&padapter->eeprompriv), ETH_ALEN)==_FALSE) + if (_rtw_memcmp(pattrib->dst, adapter_mac_addr(padapter), ETH_ALEN) == _FALSE) { //DBG_871X("not ap psta=%p, addr=%pM\n", psta, pattrib->dst); @@ -565,6 +563,52 @@ static void rtw_os_ksocket_send(_adapter *padapter, union recv_frame *precv_fram } #endif //CONFIG_AUTO_AP_MODE +int rtw_recv_monitor(_adapter *padapter, union recv_frame *precv_frame) +{ + int ret = _FAIL; + struct recv_priv *precvpriv; + _queue *pfree_recv_queue; + _pkt *skb; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct rx_pkt_attrib *pattrib; + + if (NULL == precv_frame) + goto _recv_drop; + + pattrib = &precv_frame->u.hdr.attrib; + precvpriv = &(padapter->recvpriv); + pfree_recv_queue = &(precvpriv->free_recv_queue); + + skb = precv_frame->u.hdr.pkt; + if (skb == NULL) { + DBG_871X("%s :skb==NULL something wrong!!!!\n", __func__); + goto _recv_drop; + } + + skb->data = precv_frame->u.hdr.rx_data; + skb_set_tail_pointer(skb, precv_frame->u.hdr.len); + skb->len = precv_frame->u.hdr.len; + skb->ip_summed = CHECKSUM_NONE; + skb->pkt_type = PACKET_OTHERHOST; + skb->protocol = htons(0x0019); /* ETH_P_80211_RAW */ + + rtw_netif_rx(padapter->pnetdev, skb); + + /* pointers to NULL before rtw_free_recvframe() */ + precv_frame->u.hdr.pkt = NULL; + + ret = _SUCCESS; + +_recv_drop: + + /* enqueue back to free_recv_queue */ + if (precv_frame) + rtw_free_recvframe(precv_frame, pfree_recv_queue); + + return ret; + +} + int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame) { struct recv_priv *precvpriv; @@ -672,7 +716,6 @@ void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf) rtw_skb_free(precvbuf->pskb); precvbuf->pskb = NULL; - precvbuf->reuse = _FALSE; if(precvbuf->irp_pending == _FALSE) { diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_android.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_android.c index abb99f087d4f..6d0c84ffd6f1 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_android.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_android.c @@ -76,6 +76,7 @@ const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = { "MACADDR", + "BLOCK_SCAN", "BLOCK", "WFD-ENABLE", "WFD-DISABLE", @@ -86,7 +87,7 @@ const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = { "HOSTAPD_SET_MACADDR_ACL", "HOSTAPD_ACL_ADD_STA", "HOSTAPD_ACL_REMOVE_STA", -#ifdef CONFIG_GTK_OL +#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)) "GTK_REKEY_OFFLOAD", #endif //CONFIG_GTK_OL /* Private command for P2P disable*/ @@ -409,6 +410,18 @@ int rtw_android_get_p2p_dev_addr(struct net_device *net, char *command, int tota return bytes_written; } +int rtw_android_set_block_scan(struct net_device *net, char *command, int total_len) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(net); + char *block_value = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_BLOCK_SCAN]) + 1; + + #ifdef CONFIG_IOCTL_CFG80211 + adapter_wdev_data(adapter)->block_scan = (*block_value == '0')?_FALSE:_TRUE; + #endif + + return 0; +} + int rtw_android_set_block(struct net_device *net, char *command, int total_len) { _adapter *adapter = (_adapter *)rtw_netdev_priv(net); @@ -425,11 +438,11 @@ int rtw_android_setband(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_SETBAND]) + 1; - u32 band = GHZ_MAX; + u32 band = WIFI_FREQUENCY_BAND_AUTO; int ret = _FAIL; - sscanf(arg, "%u", &band); - ret = rtw_set_band(adapter, band); + if (sscanf(arg, "%u", &band) >= 1) + ret = rtw_set_band(adapter, band); return (ret==_SUCCESS)?0:-1; } @@ -482,7 +495,7 @@ int get_int_from_command( char* pcmd ) return ( rtw_atoi( pcmd + i ) ); } -#ifdef CONFIG_GTK_OL +#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)) int rtw_gtk_offload(struct net_device *net, u8 *cmd_ptr) { int i; @@ -641,7 +654,11 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) case ANDROID_WIFI_CMD_MACADDR: bytes_written = rtw_android_get_macaddr(net, command, priv_cmd.total_len); break; - + + case ANDROID_WIFI_CMD_BLOCK_SCAN: + bytes_written = rtw_android_set_block_scan(net, command, priv_cmd.total_len); + break; + case ANDROID_WIFI_CMD_BLOCK: bytes_written = rtw_android_set_block(net, command, priv_cmd.total_len); break; @@ -735,6 +752,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) #endif //CONFIG_IOCTL_CFG80211 #ifdef CONFIG_WFD + case ANDROID_WIFI_CMD_MIRACAST: bytes_written = rtw_android_set_miracast_mode(net, command, priv_cmd.total_len); break; @@ -829,7 +847,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) rtw_acl_remove_sta(padapter, addr); break; } -#ifdef CONFIG_GTK_OL +#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)) case ANDROID_WIFI_CMD_GTK_REKEY_OFFLOAD: rtw_gtk_offload(net, (u8*)command); break; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.c index 2e249c92c6dd..af51646b5e9d 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.c @@ -20,6 +20,10 @@ #include +#ifdef CONFIG_IOCTL_CFG80211 + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT) + /* #include #include @@ -38,10 +42,6 @@ #include -#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 @@ -229,7 +229,8 @@ int rtw_dev_get_feature_set(struct net_device *dev) feature_set |= WIFI_FEATURE_INFRA; - if(IS_92D(*hal_ver) || IS_8812_SERIES(*hal_ver) || IS_8821_SERIES(*hal_ver)) + if (IS_8814A_SERIES(*hal_ver) || IS_8812_SERIES(*hal_ver) || + IS_8821_SERIES(*hal_ver)) feature_set |= WIFI_FEATURE_INFRA_5G; feature_set |= WIFI_FEATURE_P2P; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_proc.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_proc.c index c752173b69cd..80575c1584a3 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_proc.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_proc.c @@ -392,24 +392,6 @@ static ssize_t proc_set_linked_info_dump(struct file *file, const char __user *b return count; } -int proc_get_rx_info(struct seq_file *m, void *v) -{ - struct net_device *dev = m->private; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct dvobj_priv *psdpriv = padapter->dvobj; - struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; - - //Counts of packets whose seq_num is less than preorder_ctrl->indicate_seq, Ex delay, retransmission, redundant packets and so on - DBG_871X_SEL_NL(m,"Counts of Packets Whose Seq_Num Less Than Reorder Control Seq_Num: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_drop_count); - //How many times the Rx Reorder Timer is triggered. - DBG_871X_SEL_NL(m,"Rx Reorder Time-out Trigger Counts: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_forced_indicate_count); - //Total counts of packets loss - DBG_871X_SEL_NL(m,"Rx Packet Loss Counts: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_loss_count); - DBG_871X_SEL_NL(m,"Duplicate Management Frame Drop Count: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_dup_mgt_frame_drop_count); - DBG_871X_SEL_NL(m,"AMPDU BA window shift Count: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_window_shift_cnt); - return 0; -} - static int proc_get_mac_qinfo(struct seq_file *m, void *v) { struct net_device *dev = m->private; @@ -420,26 +402,6 @@ static int proc_get_mac_qinfo(struct seq_file *m, void *v) 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; @@ -603,6 +565,11 @@ static ssize_t proc_set_cam(struct file *file, const char __user *buffer, size_t if (num < 2) return count; + if (id >= CAM_ENTRY_NUM_SW_LIMIT) { + DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" invalid id:%u\n", FUNC_ADPT_ARG(adapter), id); + return count; + } + if (strcmp("c", cmd) == 0) { _clear_cam_entry(adapter, id); adapter->securitypriv.hw_decrypted = _FALSE; /* temporarily set this for TX path to use SW enc */ @@ -698,7 +665,7 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = { {"survey_info", proc_get_survey_info, NULL}, {"ap_info", proc_get_ap_info, NULL}, {"adapter_state", proc_get_adapter_state, NULL}, - {"trx_info", proc_get_trx_info, NULL}, + {"trx_info", proc_get_trx_info, proc_reset_trx_info}, {"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}, @@ -706,7 +673,6 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = { {"cam", proc_get_cam, proc_set_cam}, {"cam_cache", proc_get_cam_cache, NULL}, {"suspend_info", proc_get_suspend_resume_info, NULL}, - {"rx_info", proc_get_rx_info, proc_reset_rx_info}, {"wifi_spec",proc_get_wifi_spec,NULL}, #ifdef CONFIG_LAYER2_ROAMING {"roam_flags", proc_get_roam_flags, proc_set_roam_flags}, @@ -719,6 +685,7 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = { #endif /* CONFIG_SDIO_HCI */ {"fwdl_test_case", proc_get_dummy, proc_set_fwdl_test_case}, + {"del_rx_ampdu_test_case", proc_get_dummy, proc_set_del_rx_ampdu_test_case}, {"wait_hiq_empty", proc_get_dummy, proc_set_wait_hiq_empty}, {"mac_reg_dump", proc_get_mac_reg_dump, NULL}, @@ -768,9 +735,9 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = { {"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}, + {"gpio_info",proc_get_gpio,proc_set_gpio}, + {"gpio_set_output_value",proc_get_dummy,proc_set_gpio_output_value}, + {"gpio_set_direction",proc_get_dummy,proc_set_config_gpio}, #endif #ifdef CONFIG_DBG_COUNTER @@ -789,6 +756,16 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = { {"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}, +#ifdef DBG_RX_COUNTER_DUMP + {"dump_rx_cnt_mode",proc_get_rx_cnt_dump,proc_set_rx_cnt_dump}, +#endif +#ifdef CONFIG_POWER_SAVING + {"ps_info",proc_get_ps_info, NULL}, +#endif +#ifdef CONFIG_TDLS + {"tdls_info", proc_get_tdls_info, NULL}, +#endif + {"monitor", proc_get_monitor, proc_set_monitor}, }; const int adapter_proc_hdls_num = sizeof(adapter_proc_hdls) / sizeof(struct rtw_proc_hdl); @@ -941,23 +918,18 @@ ssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, si char tmp[32]; u32 TH_L2H_ini; s8 TH_EDCCA_HL_diff; - u32 IGI_Base; - int ForceEDCCA; - u8 AdapEn_RSSI; - u8 IGI_LowerBound; if (count < 1) return -EFAULT; if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { - int num = sscanf(tmp, "%x %hhd %x %d %hhu %hhu", - &TH_L2H_ini, &TH_EDCCA_HL_diff, &IGI_Base, &ForceEDCCA, &AdapEn_RSSI, &IGI_LowerBound); + int num = sscanf(tmp, "%x %hhd", &TH_L2H_ini, &TH_EDCCA_HL_diff); - if (num != 6) + if (num != 2) return count; - rtw_odm_adaptivity_parm_set(padapter, (s8)TH_L2H_ini, TH_EDCCA_HL_diff, (s8)IGI_Base, (bool)ForceEDCCA, AdapEn_RSSI, IGI_LowerBound); + rtw_odm_adaptivity_parm_set(padapter, (s8)TH_L2H_ini, TH_EDCCA_HL_diff); } return count; @@ -984,7 +956,7 @@ int proc_get_phydm_cmd(struct seq_file *m, void *v) if (NULL == phydm_msg) return -ENOMEM; - PhyDM_Cmd(phydm, NULL, 0, 0, phydm_msg, PHYDM_MSG_LEN); + phydm_cmd(phydm, NULL, 0, 0, phydm_msg, PHYDM_MSG_LEN); } DBG_871X_SEL(m, "%s\n", phydm_msg); @@ -1024,7 +996,7 @@ ssize_t proc_set_phydm_cmd(struct file *file, const char __user *buffer, size_t _rtw_memset(phydm_msg, 0, PHYDM_MSG_LEN); } - PhyDM_Cmd(phydm, tmp, count, 1, phydm_msg, 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); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_intf.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_intf.c index 1ea0e5aed86c..c331b33864ad 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_intf.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_intf.c @@ -20,6 +20,8 @@ #define _HCI_INTF_C_ #include +#include + #include #ifndef CONFIG_USB_HCI @@ -137,133 +139,6 @@ static void rtw_dev_shutdown(struct device *dev) /* DID_USB_v916_20130116 */ static struct usb_device_id rtw_usb_id_tbl[] ={ - -#ifdef CONFIG_RTL8192C - /*=== Realtek demoboard ===*/ - /****** 8188CUS ********/ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8176),.driver_info = RTL8188C_8192C},/* 8188cu 1*1 dongole */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8170),.driver_info = RTL8188C_8192C},/* 8188CE-VAU USB minCard */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817E),.driver_info = RTL8188C_8192C},/* 8188CE-VAU USB minCard */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817A),.driver_info = RTL8188C_8192C},/* 8188cu Slim Solo */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817B),.driver_info = RTL8188C_8192C},/* 8188cu Slim Combo */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817D),.driver_info = RTL8188C_8192C},/* 8188RU High-power USB Dongle */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8754),.driver_info = RTL8188C_8192C},/* 8188 Combo for BC4 */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817F),.driver_info = RTL8188C_8192C},/* 8188RU */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x818A),.driver_info = RTL8188C_8192C},/* RTL8188CUS-VL */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x018A),.driver_info = RTL8188C_8192C},/* RTL8188CTV */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x17C0),.driver_info = RTL8188C_8192C},/* RTK demoboard - USB-N10E */ - /****** 8192CUS ********/ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8177),.driver_info = RTL8188C_8192C},/* 8191cu 1*2 */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8178),.driver_info = RTL8188C_8192C},/* 8192cu 2*2 */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817C),.driver_info = RTL8188C_8192C},/* 8192CE-VAU USB minCard */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8191),.driver_info = RTL8188C_8192C},/* 8192CU 2*2 */ - {USB_DEVICE(0x1058, 0x0631),.driver_info = RTL8188C_8192C},/* Alpha, 8192CU */ - /*=== Customer ID ===*/ - /****** 8188CUS Dongle ********/ - {USB_DEVICE(0x2019, 0xED17),.driver_info = RTL8188C_8192C},/* PCI - Edimax */ - {USB_DEVICE(0x0DF6, 0x0052),.driver_info = RTL8188C_8192C},/* Sitecom - Edimax */ - {USB_DEVICE(0x7392, 0x7811),.driver_info = RTL8188C_8192C},/* Edimax - Edimax */ - {USB_DEVICE(0x07B8, 0x8189),.driver_info = RTL8188C_8192C},/* Abocom - Abocom */ - {USB_DEVICE(0x0EB0, 0x9071),.driver_info = RTL8188C_8192C},/* NO Brand - Etop */ - {USB_DEVICE(0x06F8, 0xE033),.driver_info = RTL8188C_8192C},/* Hercules - Edimax */ - {USB_DEVICE(0x103C, 0x1629),.driver_info = RTL8188C_8192C},/* HP - Lite-On ,8188CUS Slim Combo */ - {USB_DEVICE(0x2001, 0x3308),.driver_info = RTL8188C_8192C},/* D-Link - Alpha */ - {USB_DEVICE(0x050D, 0x1102),.driver_info = RTL8188C_8192C},/* Belkin - Edimax */ - {USB_DEVICE(0x2019, 0xAB2A),.driver_info = RTL8188C_8192C},/* Planex - Abocom */ - {USB_DEVICE(0x20F4, 0x648B),.driver_info = RTL8188C_8192C},/* TRENDnet - Cameo */ - {USB_DEVICE(0x4855, 0x0090),.driver_info = RTL8188C_8192C},/* - Feixun */ - {USB_DEVICE(0x13D3, 0x3357),.driver_info = RTL8188C_8192C},/* - AzureWave */ - {USB_DEVICE(0x0DF6, 0x005C),.driver_info = RTL8188C_8192C},/* Sitecom - Edimax */ - {USB_DEVICE(0x0BDA, 0x5088),.driver_info = RTL8188C_8192C},/* Thinkware - CC&C */ - {USB_DEVICE(0x4856, 0x0091),.driver_info = RTL8188C_8192C},/* NetweeN - Feixun */ - {USB_DEVICE(0x0846, 0x9041),.driver_info = RTL8188C_8192C}, /* Netgear - Cameo */ - {USB_DEVICE(0x2019, 0x4902),.driver_info = RTL8188C_8192C},/* Planex - Etop */ - {USB_DEVICE(0x2019, 0xAB2E),.driver_info = RTL8188C_8192C},/* SW-WF02-AD15 -Abocom */ - {USB_DEVICE(0x2001, 0x330B),.driver_info = RTL8188C_8192C}, /* D-LINK - T&W */ - {USB_DEVICE(0xCDAB, 0x8010),.driver_info = RTL8188C_8192C}, /* - - compare */ - {USB_DEVICE(0x0B05, 0x17BA),.driver_info = RTL8188C_8192C}, /* ASUS - Edimax */ - {USB_DEVICE(0x0BDA, 0x1E1E),.driver_info = RTL8188C_8192C}, /* Intel - - */ - {USB_DEVICE(0x04BB, 0x094c),.driver_info = RTL8188C_8192C}, /* I-O DATA - Edimax */ - /****** 8188CTV ********/ - {USB_DEVICE(0xCDAB, 0x8011),.driver_info = RTL8188C_8192C}, /* - - compare */ - {USB_DEVICE(0x0BDA, 0x0A8A),.driver_info = RTL8188C_8192C}, /* Sony - Foxconn */ - /****** 8188 RU ********/ - {USB_DEVICE(0x0BDA, 0x317F),.driver_info = RTL8188C_8192C},/* Netcore,Netcore */ - /****** 8188CE-VAU ********/ - {USB_DEVICE(0x13D3, 0x3359),.driver_info = RTL8188C_8192C},/* - Azwave */ - {USB_DEVICE(0x13D3, 0x3358),.driver_info = RTL8188C_8192C},/* - Azwave */ - /****** 8188CUS Slim Solo********/ - {USB_DEVICE(0x04F2, 0xAFF7),.driver_info = RTL8188C_8192C},/* XAVI - XAVI */ - {USB_DEVICE(0x04F2, 0xAFF9),.driver_info = RTL8188C_8192C},/* XAVI - XAVI */ - {USB_DEVICE(0x04F2, 0xAFFA),.driver_info = RTL8188C_8192C},/* XAVI - XAVI */ - /****** 8188CUS Slim Combo ********/ - {USB_DEVICE(0x04F2, 0xAFF8),.driver_info = RTL8188C_8192C},/* XAVI - XAVI */ - {USB_DEVICE(0x04F2, 0xAFFB),.driver_info = RTL8188C_8192C},/* XAVI - XAVI */ - {USB_DEVICE(0x04F2, 0xAFFC),.driver_info = RTL8188C_8192C},/* XAVI - XAVI */ - {USB_DEVICE(0x2019, 0x1201),.driver_info = RTL8188C_8192C},/* Planex - Vencer */ - /****** 8192CUS Dongle ********/ - {USB_DEVICE(0x2001, 0x3307),.driver_info = RTL8188C_8192C},/* D-Link - Cameo */ - {USB_DEVICE(0x2001, 0x330A),.driver_info = RTL8188C_8192C},/* D-Link - Alpha */ - {USB_DEVICE(0x2001, 0x3309),.driver_info = RTL8188C_8192C},/* D-Link - Alpha */ - {USB_DEVICE(0x0586, 0x341F),.driver_info = RTL8188C_8192C},/* Zyxel - Abocom */ - {USB_DEVICE(0x7392, 0x7822),.driver_info = RTL8188C_8192C},/* Edimax - Edimax */ - {USB_DEVICE(0x2019, 0xAB2B),.driver_info = RTL8188C_8192C},/* Planex - Abocom */ - {USB_DEVICE(0x07B8, 0x8178),.driver_info = RTL8188C_8192C},/* Abocom - Abocom */ - {USB_DEVICE(0x07AA, 0x0056),.driver_info = RTL8188C_8192C},/* ATKK - Gemtek */ - {USB_DEVICE(0x4855, 0x0091),.driver_info = RTL8188C_8192C},/* - Feixun */ - {USB_DEVICE(0x050D, 0x2102),.driver_info = RTL8188C_8192C},/* Belkin - Sercomm */ - {USB_DEVICE(0x050D, 0x2103),.driver_info = RTL8188C_8192C},/* Belkin - Edimax */ - {USB_DEVICE(0x20F4, 0x624D),.driver_info = RTL8188C_8192C},/* TRENDnet */ - {USB_DEVICE(0x0DF6, 0x0061),.driver_info = RTL8188C_8192C},/* Sitecom - Edimax */ - {USB_DEVICE(0x0B05, 0x17AB),.driver_info = RTL8188C_8192C},/* ASUS - Edimax */ - {USB_DEVICE(0x0846, 0x9021),.driver_info = RTL8188C_8192C},/* Netgear - Sercomm */ - {USB_DEVICE(0x0846, 0xF001),.driver_info = RTL8188C_8192C}, /* Netgear - Sercomm */ - {USB_DEVICE(0x0E66, 0x0019),.driver_info = RTL8188C_8192C},/* Hawking,Edimax */ - {USB_DEVICE(0x0E66, 0x0020),.driver_info = RTL8188C_8192C}, /* Hawking - Edimax */ - {USB_DEVICE(0x050D, 0x1004),.driver_info = RTL8188C_8192C}, /* Belkin - Edimax */ - {USB_DEVICE(0x0BDA, 0x2E2E),.driver_info = RTL8188C_8192C}, /* Intel - - */ - {USB_DEVICE(0x2357, 0x0100),.driver_info = RTL8188C_8192C}, /* TP-Link - TP-Link */ - {USB_DEVICE(0x06F8, 0xE035),.driver_info = RTL8188C_8192C}, /* Hercules - Edimax */ - {USB_DEVICE(0x04BB, 0x0950),.driver_info = RTL8188C_8192C}, /* IO-DATA - Edimax */ - {USB_DEVICE(0x0DF6, 0x0070),.driver_info = RTL8188C_8192C}, /* Sitecom - Edimax */ - {USB_DEVICE(0x0789, 0x016D),.driver_info = RTL8188C_8192C}, /* LOGITEC - Edimax */ - /****** 8192CE-VAU ********/ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8186),.driver_info = RTL8188C_8192C},/* Intel-Xavi( Azwave) */ -#endif - -#ifdef CONFIG_RTL8192D - /*=== Realtek demoboard ===*/ - /****** 8192DU ********/ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8193),.driver_info = RTL8192D},/* 8192DU-VC */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8194),.driver_info = RTL8192D},/* 8192DU-VS */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8111),.driver_info = RTL8192D},/* Realtek 5G dongle for WiFi Display */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0193),.driver_info = RTL8192D},/* 8192DE-VAU */ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8171),.driver_info = RTL8192D},/* 8192DU-VC */ - /*=== Customer ID ===*/ - /****** 8192DU-VC ********/ - {USB_DEVICE(0x2019, 0xAB2C),.driver_info = RTL8192D},/* PCI - Abocm */ - {USB_DEVICE(0x2019, 0x4903),.driver_info = RTL8192D},/* PCI - ETOP */ - {USB_DEVICE(0x2019, 0x4904),.driver_info = RTL8192D},/* PCI - ETOP */ - {USB_DEVICE(0x07B8, 0x8193),.driver_info = RTL8192D},/* Abocom - Abocom */ - /****** 8192DU-VS ********/ - {USB_DEVICE(0x20F4, 0x664B),.driver_info = RTL8192D},/* TRENDnet */ - {USB_DEVICE(0x04DD, 0x954F),.driver_info = RTL8192D}, /* Sharp */ - {USB_DEVICE(0x04DD, 0x96A6),.driver_info = RTL8192D}, /* Sharp */ - {USB_DEVICE(0x050D, 0x110A),.driver_info = RTL8192D}, /* Belkin - Edimax */ - {USB_DEVICE(0x050D, 0x1105),.driver_info = RTL8192D}, /* Belkin - Edimax */ - {USB_DEVICE(0x050D, 0x120A),.driver_info = RTL8192D}, /* Belkin - Edimax */ - {USB_DEVICE(0x1668, 0x8102),.driver_info = RTL8192D}, /* - */ - {USB_DEVICE(0x0BDA, 0xE194),.driver_info = RTL8192D}, /* - Edimax */ - /****** 8192DU-WiFi Display Dongle ********/ - {USB_DEVICE(0x2019, 0xAB2D),.driver_info = RTL8192D},/* Planex - Abocom ,5G dongle for WiFi Display */ -#endif - -#ifdef CONFIG_RTL8723A - {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x8724,0xff,0xff,0xff),.driver_info = RTL8723A}, /* 8723AU 1*1 */ - {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x1724,0xff,0xff,0xff),.driver_info = RTL8723A}, /* 8723AU 1*1 */ - {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0724,0xff,0xff,0xff),.driver_info = RTL8723A}, /* 8723AU 1*1 */ -#endif - #ifdef CONFIG_RTL8188E /*=== Realtek demoboard ===*/ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179),.driver_info = RTL8188E}, /* 8188EUS */ @@ -305,6 +180,7 @@ static struct usb_device_id rtw_usb_id_tbl[] ={ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0821),.driver_info = RTL8821},/* Default ID */ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8822),.driver_info = RTL8821},/* Default ID */ {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0820,0xff,0xff,0xff),.driver_info = RTL8821}, /* 8821AU */ + {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0823,0xff,0xff,0xff),.driver_info = RTL8821}, /* 8821AU */ /*=== Customer ID ===*/ {USB_DEVICE(0x7392, 0xA811),.driver_info = RTL8821}, /* Edimax - Edimax */ {USB_DEVICE(0x04BB, 0x0953),.driver_info = RTL8821}, /* I-O DATA - Edimax */ @@ -324,6 +200,11 @@ static struct usb_device_id rtw_usb_id_tbl[] ={ {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xB720,0xff,0xff,0xff),.driver_info = RTL8723B}, /* 8723BU 1*1 */ //{USB_DEVICE(USB_VENDER_ID_REALTEK, 0xB720),.driver_info = RTL8723B}, /* 8723BU */ #endif + +#ifdef CONFIG_RTL8814A + + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8813),.driver_info = RTL8814A}, +#endif /* CONFIG_RTL8814A */ {} /* Terminating entry */ }; @@ -671,24 +552,36 @@ _func_enter_; _func_exit_; } -static void rtw_decide_chip_type_by_usb_info(_adapter *padapter, const struct usb_device_id *pdid) +static int usb_reprobe_to_usb3(PADAPTER Adapter) { - padapter->chip_type = pdid->driver_info; + struct registry_priv *registry_par = &Adapter->registrypriv; + int ret = _FALSE; + + if (registry_par->switch_usb3 == _TRUE) { + if (IS_HIGH_SPEED_USB(Adapter)) { + if ((rtw_read8(Adapter, 0x74) & (BIT(2)|BIT(3))) != BIT(3)) { + rtw_write8(Adapter, 0x74, 0x8); + rtw_write8(Adapter, 0x70, 0x2); + rtw_write8(Adapter, 0x3e, 0x1); + rtw_write8(Adapter, 0x3d, 0x3); + /* usb disconnect */ + rtw_write8(Adapter, 0x5, 0x80); + ret = _TRUE; + } + + } else if (IS_SUPER_SPEED_USB(Adapter)) { + rtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1))); + rtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0))); + } + } - #ifdef CONFIG_RTL8192C - if(padapter->chip_type == RTL8188C_8192C) - rtl8192cu_set_hw_type(padapter); - #endif + return ret; +} - #ifdef CONFIG_RTL8192D - if(padapter->chip_type == RTL8192D) - rtl8192du_set_hw_type(padapter); - #endif - #ifdef CONFIG_RTL8723A - if(padapter->chip_type == RTL8723A) - rtl8723au_set_hw_type(padapter); - #endif +static void rtw_decide_chip_type_by_usb_info(_adapter *padapter, const struct usb_device_id *pdid) +{ + padapter->chip_type = pdid->driver_info; #ifdef CONFIG_RTL8188E if(padapter->chip_type == RTL8188E) @@ -709,27 +602,18 @@ static void rtw_decide_chip_type_by_usb_info(_adapter *padapter, const struct us if(padapter->chip_type == RTL8723B) rtl8723bu_set_hw_type(padapter); #endif + + #ifdef CONFIG_RTL8814A + if(padapter->chip_type == RTL8814A) + rtl8814au_set_hw_type(padapter); + #endif /* CONFIG_RTL8814A */ } -void rtw_set_hal_ops(_adapter *padapter) +u8 rtw_set_hal_ops(_adapter *padapter) { //alloc memory for HAL DATA - rtw_hal_data_init(padapter); - - #ifdef CONFIG_RTL8192C - if(padapter->chip_type == RTL8188C_8192C) - rtl8192cu_set_hal_ops(padapter); - #endif - - #ifdef CONFIG_RTL8192D - if(padapter->chip_type == RTL8192D) - rtl8192du_set_hal_ops(padapter); - #endif - - #ifdef CONFIG_RTL8723A - if(padapter->chip_type == RTL8723A) - rtl8723au_set_hal_ops(padapter); - #endif + if (rtw_hal_data_init(padapter) == _FAIL) + return _FAIL; #ifdef CONFIG_RTL8188E if(padapter->chip_type == RTL8188E) @@ -749,25 +633,19 @@ void rtw_set_hal_ops(_adapter *padapter) if(padapter->chip_type == RTL8723B) rtl8723bu_set_hal_ops(padapter); #endif + #ifdef CONFIG_RTL8814A + if(padapter->chip_type == RTL8814A) + rtl8814au_set_hal_ops(padapter); + #endif /* CONFIG_RTL8814A */ + + if (_FAIL == rtw_hal_ops_check(padapter) ) + return _FAIL; + + return _SUCCESS; } void usb_set_intf_ops(_adapter *padapter,struct _io_ops *pops) { - #ifdef CONFIG_RTL8192C - if(padapter->chip_type == RTL8188C_8192C) - rtl8192cu_set_intf_ops(pops); - #endif - - #ifdef CONFIG_RTL8192D - if(padapter->chip_type == RTL8192D) - rtl8192du_set_intf_ops(pops); - #endif - - #ifdef CONFIG_RTL8723A - if(padapter->chip_type == RTL8723A) - rtl8723au_set_intf_ops(pops); - #endif - #ifdef CONFIG_RTL8188E if(padapter->chip_type == RTL8188E) rtl8188eu_set_intf_ops(pops); @@ -787,6 +665,10 @@ void usb_set_intf_ops(_adapter *padapter,struct _io_ops *pops) if(padapter->chip_type == RTL8723B) rtl8723bu_set_intf_ops(pops); #endif + + #ifdef CONFIG_RTL8814A + rtl8814au_set_intf_ops(pops); + #endif /* CONFIG_RTL8814A */ } @@ -1008,7 +890,6 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) { u8 bOpen = _TRUE; rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); - //rtl8192c_set_FwSelectSuspend_cmd(padapter,_TRUE ,500);//note fw to support hw power down ping detect } #endif//SUPPORT_HW_RFOFF_DETECTED } @@ -1074,7 +955,6 @@ int rtw_resume_process(_adapter *padapter) // The FW command register update must after MAC and FW init ready. if((padapter->bFWReady) && (pwrpriv->bHWPwrPindetect) && (padapter->registrypriv.usbss_enable )) { - //rtl8192c_set_FwSelectSuspend_cmd(padapter,_FALSE ,500);//note fw to support hw power down ping detect u8 bOpen = _FALSE; rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); } @@ -1311,7 +1191,7 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, dvobj->padapters[dvobj->iface_nums++] = padapter; padapter->iface_id = IFACE_ID0; -#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT) +#if defined(CONFIG_CONCURRENT_MODE) //set adapter_type/iface type for primary padapter padapter->isprimary = _TRUE; padapter->adapter_type = PRIMARY_ADAPTER; @@ -1319,37 +1199,37 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, padapter->iface_type = IFACE_PORT0; #else padapter->iface_type = IFACE_PORT1; - #endif + #endif #endif //step 1-1., decide the chip_type via driver_info padapter->interface_type = RTW_USB; rtw_decide_chip_type_by_usb_info(padapter, pdid); - - if (rtw_handle_dualmac(padapter, 1) != _SUCCESS) - goto free_adapter; - + if((pnetdev = rtw_init_netdev(padapter)) == NULL) { - goto handle_dualmac; + goto free_adapter; } SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj)); padapter = rtw_netdev_priv(pnetdev); #ifdef CONFIG_IOCTL_CFG80211 if(rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj)) != 0) { - goto handle_dualmac; + goto free_adapter; } #endif //step 2. hook HalFunc, allocate HalData //hal_set_hal_ops(padapter); - rtw_set_hal_ops(padapter); + if(rtw_set_hal_ops(padapter) ==_FAIL) + goto free_hal_data; + padapter->intf_start=&usb_intf_start; padapter->intf_stop=&usb_intf_stop; //step init_io_priv - rtw_init_io_priv(padapter,usb_set_intf_ops); + if( rtw_init_io_priv(padapter,usb_set_intf_ops) ==_FAIL) + goto free_hal_data; //step read_chip_version rtw_hal_read_chip_version(padapter); @@ -1422,9 +1302,9 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, #endif // set mac addr - rtw_macaddr_cfg(padapter->eeprompriv.mac_addr); + rtw_macaddr_cfg(adapter_mac_addr(padapter), get_hal_mac_addr(padapter)); #ifdef CONFIG_P2P - rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr, padapter->eeprompriv.mac_addr); + rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter)); #endif // CONFIG_P2P DBG_871X("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n" , padapter->bDriverStopped @@ -1436,8 +1316,8 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, status = _SUCCESS; free_hal_data: - if(status != _SUCCESS && padapter->HalData) - rtw_mfree(padapter->HalData, sizeof(*(padapter->HalData))); + if (status != _SUCCESS && padapter->HalData) + rtw_hal_free_data(padapter); free_wdev: if(status != _SUCCESS) { #ifdef CONFIG_IOCTL_CFG80211 @@ -1445,9 +1325,7 @@ free_wdev: rtw_wdev_free(padapter->rtw_wdev); #endif } -handle_dualmac: - if (status != _SUCCESS) - rtw_handle_dualmac(padapter, 0); + free_adapter: if (status != _SUCCESS) { if (pnetdev) @@ -1487,8 +1365,6 @@ static void rtw_usb_if1_deinit(_adapter *if1) DBG_871X("+r871xu_dev_remove, hw_init_completed=%d\n", if1->hw_init_completed); - rtw_handle_dualmac(if1, 0); - #ifdef CONFIG_IOCTL_CFG80211 if(if1->rtw_wdev) { rtw_wdev_free(if1->rtw_wdev); @@ -1545,7 +1421,10 @@ static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device DBG_871X("rtw_usb_if1_init Failed!\n"); goto free_dvobj; } - + + if (usb_reprobe_to_usb3(if1) == _TRUE) + goto free_if1; + #ifdef CONFIG_CONCURRENT_MODE if((if2 = rtw_drv_if2_init(if1, usb_set_intf_ops)) == NULL) { goto free_if1; @@ -1574,9 +1453,8 @@ static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device #endif //dev_alloc_name && register_netdev - if((status = rtw_drv_register_netdev(if1)) != _SUCCESS) { + if (rtw_drv_register_netdev(if1) != _SUCCESS) goto free_if2; - } #ifdef CONFIG_HOSTAPD_MLME hostapd_mode_init(if1); @@ -1591,15 +1469,26 @@ static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device status = _SUCCESS; +#if 0 /* not used now */ +unregister_ndevs: + if (status != _SUCCESS) + rtw_unregister_netdevs(dvobj); +#endif free_if2: if(status != _SUCCESS && if2) { #ifdef CONFIG_CONCURRENT_MODE +#ifdef CONFIG_IOCTL_CFG80211 + rtw_wdev_unregister(if2->rtw_wdev); +#endif /*CONFIG_IOCTL_CFG80211*/ rtw_drv_if2_stop(if2); rtw_drv_if2_free(if2); #endif } free_if1: if (status != _SUCCESS && if1) { +#ifdef CONFIG_IOCTL_CFG80211 + rtw_wdev_unregister(if1->rtw_wdev); +#endif /*CONFIG_IOCTL_CFG80211*/ rtw_usb_if1_deinit(if1); } free_dvobj: @@ -1690,7 +1579,7 @@ _func_exit_; extern int console_suspend_enabled; #endif -static int rtw_drv_entry(void) +static int rtw_drv_entry(void) { int ret = 0; @@ -1731,7 +1620,7 @@ exit: return ret; } -static void rtw_drv_halt(void) +static void rtw_drv_halt(void) { DBG_871X_LEVEL(_drv_always_, "module exit start\n"); @@ -1788,7 +1677,6 @@ void rockchip_wifi_exit_module_rtkwifi(void) rockchip_wifi_power(0); // wifi_deactivate_usb(); } - #ifdef CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP late_initcall(rockchip_wifi_init_module_rtkwifi); module_exit(rockchip_wifi_exit_module_rtkwifi); diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_ops_linux.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_ops_linux.c index b552caf212a1..f432c53d5ab5 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_ops_linux.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_ops_linux.c @@ -22,11 +22,6 @@ #include #include -#ifdef CONFIG_RTL8192D -#include -#endif - - struct rtw_async_write_data { u8 data[VENDOR_CMD_MAX_DATA_LEN]; struct usb_ctrlrequest dr; @@ -389,8 +384,7 @@ void usb_read_port_cancel(struct intf_hdl *pintfhdl) DBG_871X("%s\n", __func__); for (i=0; i < NR_RECVBUFF ; i++) { - - precvbuf->reuse = _TRUE; + if (precvbuf->purb) { //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n"); usb_kill_urb(precvbuf->purb); @@ -520,8 +514,7 @@ _func_enter_; { padapter->bSurpriseRemoved=_TRUE; DBG_8192C("bSurpriseRemoved=TRUE\n"); - //rtl8192cu_trigger_gpio_0(padapter); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n")); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n")); goto check_completion; } @@ -916,46 +909,34 @@ void usb_recv_tasklet(void *priv) _adapter *padapter = (_adapter*)priv; struct recv_priv *precvpriv = &padapter->recvpriv; struct recv_buf *precvbuf = NULL; - - while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) - { - if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) - { - DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); -#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER - if(rtw_free_skb_premem(pskb)!=0) -#endif //CONFIG_PREALLOC_RX_SKB_BUFFER - rtw_skb_free(pskb); + while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) { + + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) { + DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); + #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER + if (rtw_free_skb_premem(pskb) != 0) + #endif //CONFIG_PREALLOC_RX_SKB_BUFFER + rtw_skb_free(pskb); break; } - - recvbuf2recvframe(padapter, pskb); -#ifdef CONFIG_PREALLOC_RECV_SKB + recvbuf2recvframe(padapter, pskb); skb_reset_tail_pointer(pskb); - pskb->len = 0; - + skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); - -#else - rtw_skb_free(pskb); -#endif + if (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue))) { precvbuf->pskb = NULL; - precvbuf->reuse = _FALSE; rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); } } } - void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) { - _irqL irqL; - uint isevt, *pbuf; struct recv_buf *precvbuf = (struct recv_buf *)purb->context; _adapter *padapter =(_adapter *)precvbuf->adapter; struct recv_priv *precvpriv = &padapter->recvpriv; @@ -966,18 +947,9 @@ void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) if(RTW_CANNOT_RX(padapter)) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - - #ifdef CONFIG_PREALLOC_RECV_SKB - precvbuf->reuse = _TRUE; - #else - if(precvbuf->pskb){ - DBG_8192C("==> free skb(%p)\n",precvbuf->pskb); - rtw_skb_free(precvbuf->pskb); - } - #endif + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved)); DBG_8192C("%s() RX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) \n", - __FUNCTION__,padapter->bDriverStopped, padapter->bSurpriseRemoved); + __FUNCTION__,padapter->bDriverStopped, padapter->bSurpriseRemoved); goto exit; } @@ -986,7 +958,6 @@ void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)) { RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n")); - precvbuf->reuse = _TRUE; rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); DBG_8192C("%s()-%d: RX Warning!\n", __FUNCTION__, __LINE__); } @@ -997,13 +968,13 @@ void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) precvbuf->transfer_len = purb->actual_length; skb_put(precvbuf->pskb, purb->actual_length); skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb); -#ifndef CONFIG_FIX_NR_BULKIN_BUFFER + + #ifndef CONFIG_FIX_NR_BULKIN_BUFFER if (skb_queue_len(&precvpriv->rx_skb_queue)<=1) -#endif + #endif tasklet_schedule(&precvpriv->recv_tasklet); precvbuf->pskb = NULL; - precvbuf->reuse = _FALSE; rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); } } @@ -1039,7 +1010,6 @@ void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL; } #endif - precvbuf->reuse = _TRUE; rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); break; case -EINPROGRESS: @@ -1059,12 +1029,9 @@ _func_exit_; u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) { - _irqL irqL; int err; unsigned int pipe; - SIZE_PTR tmpaddr=0; - SIZE_PTR alignment=0; - u32 ret = _SUCCESS; + u32 ret = _FAIL; PURB purb = NULL; struct recv_buf *precvbuf = (struct recv_buf *)rmem; _adapter *adapter = pintfhdl->padapter; @@ -1072,85 +1039,70 @@ u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj); struct recv_priv *precvpriv = &adapter->recvpriv; struct usb_device *pusbd = pdvobj->pusbdev; - _func_enter_; - - if (RTW_CANNOT_RX(adapter) || (precvbuf == NULL)) - { + + if (RTW_CANNOT_RX(adapter) || (precvbuf == NULL)) { RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( RTW_CANNOT_RX ) || precvbuf == NULL!!!\n")); - return _FAIL; + goto exit; } -#ifdef CONFIG_PREALLOC_RECV_SKB - if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL)) - { - if (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue))) - { - precvbuf->reuse = _TRUE; - } - } -#endif + usb_init_recvbuf(adapter, precvbuf); - usb_init_recvbuf(adapter, precvbuf); + if (precvbuf->pskb == NULL) { + SIZE_PTR tmpaddr = 0; + SIZE_PTR alignment = 0; - //re-assign for linux based on skb - if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL)) - { -#ifndef CONFIG_FIX_NR_BULKIN_BUFFER + if (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue))) + goto recv_buf_hook; + + #ifndef CONFIG_FIX_NR_BULKIN_BUFFER precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); -#endif - if(precvbuf->pskb == NULL) - { + #endif + + if (precvbuf->pskb == NULL) { if (0) - DBG_8192C("usb_read_port() enqueue precvbuf=%p \n", precvbuf); - //enqueue precvbuf and wait for free skb + DBG_871X("usb_read_port() enqueue precvbuf=%p \n", precvbuf); + /* enqueue precvbuf and wait for free skb */ rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue); - return _FAIL; + goto exit; } tmpaddr = (SIZE_PTR)precvbuf->pskb->data; - alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment)); - - precvbuf->phead = precvbuf->pskb->head; - precvbuf->pdata = precvbuf->pskb->data; - precvbuf->ptail = skb_tail_pointer(precvbuf->pskb); - precvbuf->pend = skb_end_pointer(precvbuf->pskb); - precvbuf->pbuf = precvbuf->pskb->data; - } - else//reuse skb - { - precvbuf->phead = precvbuf->pskb->head; - precvbuf->pdata = precvbuf->pskb->data; - precvbuf->ptail = skb_tail_pointer(precvbuf->pskb); - precvbuf->pend = skb_end_pointer(precvbuf->pskb); - precvbuf->pbuf = precvbuf->pskb->data; - - precvbuf->reuse = _FALSE; } - ATOMIC_INC(&(precvpriv->rx_pending_cnt)); - +recv_buf_hook: + precvbuf->phead = precvbuf->pskb->head; + precvbuf->pdata = precvbuf->pskb->data; + precvbuf->ptail = skb_tail_pointer(precvbuf->pskb); + precvbuf->pend = skb_end_pointer(precvbuf->pskb); + precvbuf->pbuf = precvbuf->pskb->data; + purb = precvbuf->purb; - //translate DMA FIFO addr to pipehandle + /* translate DMA FIFO addr to pipehandle */ pipe = ffaddr2pipehdl(pdvobj, addr); - usb_fill_bulk_urb(purb, pusbd, pipe, - precvbuf->pbuf, - MAX_RECVBUF_SZ, - usb_read_port_complete, - precvbuf);//context is precvbuf + usb_fill_bulk_urb(purb, pusbd, pipe, + precvbuf->pbuf, + MAX_RECVBUF_SZ, + usb_read_port_complete, + precvbuf); err = usb_submit_urb(purb, GFP_ATOMIC); - if((err) && (err != (-EPERM))) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status)); - DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status); - ret = _FAIL; + if (err && err != (-EPERM)) { + DBG_871X("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n" + , err, purb->status); + goto exit; } + ATOMIC_INC(&(precvpriv->rx_pending_cnt)); + ret = _SUCCESS; + +exit: + _func_exit_; return ret; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/wifi_version.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/wifi_version.h index 7cd319cd6e01..ac40287e1e2f 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/wifi_version.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/wifi_version.h @@ -7,7 +7,6 @@ /* * Broadcom BCM4319 driver version. */ -#define RTL8723BU_DRV_VERSION "4.39.WFD" +#define RTL8723BU_DRV_VERSION "4.3.16.WFD" #endif /* WIFI_VERSION_H */ - diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/osdep_service.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/osdep_service.c index dcef0e75acf5..39c5349bf573 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/osdep_service.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/osdep_service.c @@ -804,7 +804,7 @@ void rtw_mfree2d(void *pbuf, int h, int w, int size) rtw_mfree((u8 *)pbuf, h*sizeof(void*) + w*h*size); } -void _rtw_memcpy(void* dst, void* src, u32 sz) +void _rtw_memcpy(void *dst, const void *src, u32 sz) { #if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD) @@ -1551,7 +1551,7 @@ void rtw_udelay_os(int us) } #endif -void rtw_yield_os() +void rtw_yield_os(void) { #ifdef PLATFORM_LINUX yield(); @@ -1598,7 +1598,7 @@ static android_suspend_lock_t rtw_resume_scan_lock ={ }; #endif -inline void rtw_suspend_lock_init() +inline void rtw_suspend_lock_init(void) { #ifdef CONFIG_WAKELOCK wake_lock_init(&rtw_suspend_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_LOCK_NAME); @@ -1617,7 +1617,7 @@ inline void rtw_suspend_lock_init() #endif } -inline void rtw_suspend_lock_uninit() +inline void rtw_suspend_lock_uninit(void) { #ifdef CONFIG_WAKELOCK wake_lock_destroy(&rtw_suspend_lock); @@ -2190,7 +2190,7 @@ int rtw_change_ifname(_adapter *padapter, const char *ifname) rtw_init_netdev_name(pnetdev, ifname); - _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); + _rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) if(!rtnl_is_locked()) diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/platform/platform_ARM_SUNnI_sdio.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/platform/platform_ARM_SUNnI_sdio.c index d384141eba0c..64f93a201141 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/platform/platform_ARM_SUNnI_sdio.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/platform/platform_ARM_SUNnI_sdio.c @@ -34,12 +34,19 @@ static int sdc_id = -1; static signed int gpio_eint_wlan = -1; static u32 eint_wlan_handle = 0; + #if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I) extern void sw_mci_rescan_card(unsigned id, unsigned insert); #elif defined(CONFIG_PLATFORM_ARM_SUN8I) extern void sunxi_mci_rescan_card(unsigned id, unsigned insert); #endif + +#ifdef CONFIG_PLATFORM_ARM_SUN8I_W5P1 +extern int get_rf_mod_type(void); +#else extern int wifi_pm_get_mod_type(void); +#endif + extern void wifi_pm_power(int on); #ifdef CONFIG_GPIO_WAKEUP extern unsigned int oob_irq; @@ -60,7 +67,11 @@ int platform_wifi_power_on(void) script_item_u val; script_item_value_type_e type; +#ifdef CONFIG_PLATFORM_ARM_SUN8I_W5P1 + unsigned int mod_sel = get_rf_mod_type(); +#else unsigned int mod_sel = wifi_pm_get_mod_type(); +#endif type = script_get_item("wifi_para", "wifi_sdc_id", &val); if (SCIRPT_ITEM_VALUE_TYPE_INT!=type) { @@ -82,12 +93,16 @@ int platform_wifi_power_on(void) } #ifdef CONFIG_GPIO_WAKEUP +#ifdef CONFIG_PLATFORM_ARM_SUN8I_W5P1 + type = script_get_item("wifi_para", "wl_host_wake", &val); +#else #ifdef CONFIG_RTL8723B type = script_get_item("wifi_para", "rtl8723bs_wl_host_wake", &val); #endif #ifdef CONFIG_RTL8188E type = script_get_item("wifi_para", "rtl8189es_host_wake", &val); #endif +#endif /* CONFIG_PLATFORM_ARM_SUN8I_W5P1 */ if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) { DBG_871X("No definition of wake up host PIN\n"); ret = -1; diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RTL8723B.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/platform/platform_arm_act_sdio.c similarity index 52% rename from drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RTL8723B.h rename to drivers/net/wireless/rockchip_wlan/rtl8723bu/platform/platform_arm_act_sdio.c index dd5da85e34ec..539bb178c584 100755 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/odm_RTL8723B.h +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bu/platform/platform_arm_act_sdio.c @@ -1,36 +1,58 @@ -/****************************************************************************** - * - * 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_RTL8723B_H__ -#define __ODM_RTL8723B_H__ - -#define DM_DIG_MIN_NIC_8723 0x1C - -VOID -odm_DIG_8723(IN PDM_ODM_T pDM_Odm); - -s1Byte -odm_CCKRSSI_8723B( - IN u1Byte LNA_idx, - IN u1Byte VGA_idx - ); - - - -#endif +/****************************************************************************** + * + * Copyright(c) 2013 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 + * + * + ******************************************************************************/ +/* + * Description: + * This file can be applied to following platforms: + * CONFIG_PLATFORM_ACTIONS_ATM703X + */ +#include + +#ifdef CONFIG_PLATFORM_ACTIONS_ATM705X +extern int acts_wifi_init(void); +extern void acts_wifi_cleanup(void); +#endif + +/* + * Return: + * 0: power on successfully + * others: power on failed + */ +int platform_wifi_power_on(void) +{ + int ret = 0; + +#ifdef CONFIG_PLATFORM_ACTIONS_ATM705X + ret = acts_wifi_init(); + if (unlikely(ret < 0)) { + pr_err("%s Failed to register the power control driver.\n", __FUNCTION__); + goto exit; + } +#endif + +exit: + return ret; +} + +void platform_wifi_power_off(void) +{ +#ifdef CONFIG_PLATFORM_ACTIONS_ATM705X + acts_wifi_cleanup(); +#endif +} -- 2.34.1