diff --git a/Kconfig b/Kconfig old mode 100755 new mode 100644 index bddf51b..f87653d --- a/Kconfig +++ b/Kconfig @@ -1,6 +1,6 @@ -config RTL8821AU - tristate "Realtek 8821A USB WiFi" +config RTL8812AU + tristate "Realtek 8812A USB WiFi" depends on USB ---help--- - Help message of RTL8821AU + Help message of RTL8812AU diff --git a/Makefile b/Makefile index 1b22474..c6b25fe 100755 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS) -EXTRA_CFLAGS += -O1 +EXTRA_CFLAGS += -O2 #EXTRA_CFLAGS += -O3 #EXTRA_CFLAGS += -Wall #EXTRA_CFLAGS += -Wextra @@ -14,7 +14,7 @@ EXTRA_CFLAGS += -Wno-unused-parameter EXTRA_CFLAGS += -Wno-unused-function EXTRA_CFLAGS += -Wno-unused #EXTRA_CFLAGS += -Wno-uninitialized -#EXTRA_CFLAGS += -Wno-error=date-time # Fix compile error on gcc 4.9 and later +EXTRA_CFLAGS += -Wno-error=date-time # Fix compile error on gcc 4.9 and later EXTRA_CFLAGS += -I$(src)/include EXTRA_CFLAGS += -I$(src)/hal/phydm @@ -27,12 +27,15 @@ CONFIG_AUTOCFG_CP = n CONFIG_MULTIDRV = n CONFIG_RTL8188E = n CONFIG_RTL8812A = y -CONFIG_RTL8821A = y +CONFIG_RTL8821A = n CONFIG_RTL8192E = n CONFIG_RTL8723B = n CONFIG_RTL8814A = n CONFIG_RTL8723C = n CONFIG_RTL8188F = n +CONFIG_RTL8822B = n +CONFIG_RTL8723D = n +CONFIG_RTL8821C = n ######################### Interface ########################### CONFIG_USB_HCI = y CONFIG_PCI_HCI = n @@ -47,7 +50,7 @@ CONFIG_WIFI_TEST = n CONFIG_BT_COEXIST = n CONFIG_INTEL_WIDI = n CONFIG_WAPI_SUPPORT = n -CONFIG_EFUSE_CONFIG_FILE = n +CONFIG_EFUSE_CONFIG_FILE = y CONFIG_EXT_CLK = n CONFIG_TRAFFIC_PROTECT = y CONFIG_LOAD_PHY_PARA_FROM_FILE = y @@ -59,12 +62,19 @@ CONFIG_SIGNAL_SCALE_MAPPING = n CONFIG_80211W = n CONFIG_REDUCE_TX_CPU_LOADING = n CONFIG_BR_EXT = y -CONFIG_ANTENNA_DIVERSITY = n CONFIG_TDLS = n CONFIG_WIFI_MONITOR = y +CONFIG_MCC_MODE = n +CONFIG_APPEND_VENDOR_IE_ENABLE = n +########################## Debug ########################### +CONFIG_RTW_DEBUG = y +# default log level is _DRV_INFO_ = 4, +# please refer to "How_to_set_driver_debug_log_level.doc" to set the available level. +CONFIG_RTW_LOG_LEVEL = 4 ######################## Wake On Lan ########################## CONFIG_WOWLAN = n CONFIG_GPIO_WAKEUP = n +CONFIG_DEFAULT_PATTERNS_EN = n CONFIG_WAKEUP_GPIO_IDX = default CONFIG_HIGH_ACTIVE = n CONFIG_PNO_SUPPORT = n @@ -72,6 +82,8 @@ CONFIG_PNO_SET_DEBUG = n CONFIG_AP_WOWLAN = n ######### Notify SDIO Host Keep Power During Syspend ########## CONFIG_RTW_SDIO_PM_KEEP_POWER = y +###################### MP HW TX MODE FOR VHT ####################### +CONFIG_MP_VHT_HW_TX_MODE = n ###################### Platform Related ####################### CONFIG_PLATFORM_I386_PC = y CONFIG_PLATFORM_ANDROID_X86 = n @@ -95,6 +107,7 @@ CONFIG_PLATFORM_TEGRA4_DALMORE = n CONFIG_PLATFORM_ARM_TCC8900 = n CONFIG_PLATFORM_ARM_TCC8920 = n CONFIG_PLATFORM_ARM_TCC8920_JB42 = n +CONFIG_PLATFORM_ARM_TCC8930_JB42 = n CONFIG_PLATFORM_ARM_RK2818 = n CONFIG_PLATFORM_ARM_RK3066 = n CONFIG_PLATFORM_ARM_RK3188 = n @@ -121,6 +134,7 @@ CONFIG_PLATFORM_ARM_WMT = n CONFIG_PLATFORM_TI_DM365 = n CONFIG_PLATFORM_MOZART = n CONFIG_PLATFORM_RTK119X = n +CONFIG_PLATFORM_RTK129X = n CONFIG_PLATFORM_NOVATEK_NT72668 = n CONFIG_PLATFORM_HISILICON = n ############################################################### @@ -183,6 +197,7 @@ _HAL_INTFS_FILES := hal/hal_intf.o \ hal/hal_dm.o \ hal/hal_btcoex.o \ hal/hal_mp.o \ + hal/hal_mcc.o \ hal/hal_hci/hal_$(HCI_NAME).o \ hal/led/hal_$(HCI_NAME)_led.o @@ -206,8 +221,12 @@ _OUTSRC_FILES := hal/phydm/phydm_debug.o \ hal/phydm/phydm_noisemonitor.o\ hal/phydm/phydm_acs.o\ hal/phydm/phydm_beamforming.o\ + hal/phydm/phydm_dfs.o\ hal/phydm/txbf/halcomtxbf.o\ - hal/phydm/txbf/haltxbfinterface.o + hal/phydm/txbf/haltxbfinterface.o\ + hal/phydm/txbf/phydm_hal_txbf_api.o\ + hal/phydm/phydm_kfree.o\ + hal/phydm/phydm_ccx.o EXTRA_CFLAGS += -I$(src)/platform @@ -225,7 +244,11 @@ _OUTSRC_FILES += hal/btc/HalBtc8192e1Ant.o \ hal/btc/HalBtc8821a2Ant.o \ hal/btc/HalBtc8821aCsr2Ant.o \ hal/btc/HalBtc8703b1Ant.o \ - hal/btc/HalBtc8703b2Ant.o + hal/btc/halbtc8723d1ant.o \ + hal/btc/halbtc8723d2ant.o \ + hal/btc/HalBtc8822b1Ant.o \ + hal/btc/halbtc8821c1ant.o \ + hal/btc/halbtc8821c2ant.o endif @@ -261,6 +284,8 @@ _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ hal/$(RTL871X)/$(RTL871X)_dm.o \ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ hal/$(RTL871X)/$(RTL871X)_cmd.o \ + hal/$(RTL871X)/hal8188e_s_fw.o \ + hal/$(RTL871X)/hal8188e_t_fw.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 \ @@ -326,6 +351,7 @@ _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ hal/$(RTL871X)/$(RTL871X)_dm.o \ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ hal/$(RTL871X)/$(RTL871X)_cmd.o \ + hal/$(RTL871X)/hal8192e_fw.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 \ @@ -420,6 +446,8 @@ endif ifeq ($(CONFIG_RTL8812A), y) EXTRA_CFLAGS += -DCONFIG_RTL8812A +_HAL_INTFS_FILES += hal/rtl8812a/hal8812a_fw.o + _OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8812a_fw.o\ hal/phydm/$(RTL871X)/halhwimg8812a_mac.o\ hal/phydm/$(RTL871X)/halhwimg8812a_bb.o\ @@ -436,7 +464,11 @@ ifeq ($(CONFIG_RTL8812A), n) RTL871X = rtl8821a ifeq ($(CONFIG_USB_HCI), y) +ifeq ($(CONFIG_BT_COEXIST), y) MODULE_NAME := 8821au +else +MODULE_NAME := 8811au +endif endif ifeq ($(CONFIG_PCI_HCI), y) MODULE_NAME := 8821ae @@ -448,6 +480,8 @@ endif endif EXTRA_CFLAGS += -DCONFIG_RTL8821A + +_HAL_INTFS_FILES += hal/rtl8812a/hal8821a_fw.o _OUTSRC_FILES += hal/phydm/rtl8821a/halhwimg8821a_fw.o\ hal/phydm/rtl8821a/halhwimg8821a_mac.o\ hal/phydm/rtl8821a/halhwimg8821a_bb.o\ @@ -461,7 +495,6 @@ _OUTSRC_FILES += hal/phydm/rtl8821a/halhwimg8821a_fw.o\ endif - endif ########### HAL_RTL8723B ################################# @@ -490,7 +523,7 @@ _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ hal/$(RTL871X)/$(RTL871X)_dm.o \ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ hal/$(RTL871X)/$(RTL871X)_cmd.o \ - + hal/$(RTL871X)/hal8723b_fw.o _HAL_INTFS_FILES += \ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ @@ -524,7 +557,10 @@ endif ########### HAL_RTL8814A ################################# ifeq ($(CONFIG_RTL8814A), y) - +## ADD NEW VHT MP HW TX MODE ## +EXTRA_CFLAGS += -DCONFIG_MP_VHT_HW_TX_MODE +CONFIG_MP_VHT_HW_TX_MODE = y +########################################## RTL871X = rtl8814a ifeq ($(CONFIG_USB_HCI), y) MODULE_NAME = 8814au @@ -549,6 +585,7 @@ _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ hal/$(RTL871X)/$(RTL871X)_dm.o \ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ hal/$(RTL871X)/$(RTL871X)_cmd.o \ + hal/$(RTL871X)/hal8814a_fw.o _HAL_INTFS_FILES += \ @@ -586,7 +623,6 @@ _OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8814a_bb.o\ endif - ########### HAL_RTL8723C ################################# ifeq ($(CONFIG_RTL8723C), y) @@ -616,7 +652,7 @@ _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ hal/$(RTL871X)/$(RTL871X)_dm.o \ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ hal/$(RTL871X)/$(RTL871X)_cmd.o \ - + hal/$(RTL871X)/hal8703b_fw.o _HAL_INTFS_FILES += \ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ @@ -645,6 +681,67 @@ _OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8703b_bb.o\ hal/phydm/$(RTL871X)/halphyrf_8703b.o endif +########### HAL_RTL8723D ################################# +ifeq ($(CONFIG_RTL8723D), y) + +RTL871X = rtl8723d +ifeq ($(CONFIG_USB_HCI), y) +MODULE_NAME = 8723du +MODULE_SUB_NAME = 8723du +endif +ifeq ($(CONFIG_PCI_HCI), y) +MODULE_NAME = 8723de +MODULE_SUB_NAME = 8723de +endif +ifeq ($(CONFIG_SDIO_HCI), y) +MODULE_NAME = 8723ds +MODULE_SUB_NAME = 8723ds +endif + +EXTRA_CFLAGS += -DCONFIG_RTL8723D + +_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \ + hal/$(RTL871X)/Hal8723DPwrSeq.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)/hal8723d_fw.o \ + hal/$(RTL871X)/$(RTL871X)_lps_poff.o + + +_HAL_INTFS_FILES += \ + hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ + hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_led.o \ + hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_xmit.o \ + hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_recv.o + +ifeq ($(CONFIG_PCI_HCI), y) +_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o +else +_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o +endif + +ifeq ($(CONFIG_USB_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723D_USB.o +endif +ifeq ($(CONFIG_PCI_HCI), y) +_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723D_PCIE.o +endif + +_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8723d_bb.o\ + hal/phydm/$(RTL871X)/halhwimg8723d_mac.o\ + hal/phydm/$(RTL871X)/halhwimg8723d_rf.o\ + hal/phydm/$(RTL871X)/halhwimg8723d_fw.o\ + hal/phydm/$(RTL871X)/phydm_regconfig8723d.o\ + hal/phydm/$(RTL871X)/phydm_rtl8723d.o\ + hal/phydm/$(RTL871X)/halphyrf_8723d.o +endif + ########### HAL_RTL8188F ################################# ifeq ($(CONFIG_RTL8188F), y) @@ -671,7 +768,7 @@ _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \ hal/$(RTL871X)/$(RTL871X)_dm.o \ hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ hal/$(RTL871X)/$(RTL871X)_cmd.o \ - + hal/$(RTL871X)/hal8188f_fw.o _HAL_INTFS_FILES += \ hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \ @@ -703,6 +800,23 @@ _OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8188f_bb.o\ endif +########### HAL_RTL8822B ################################# +ifeq ($(CONFIG_RTL8822B), y) +include $(TopDIR)/rtl8822b.mk +endif + +########### HAL_RTL8821C ################################# +ifeq ($(CONFIG_RTL8821C), y) +include $(TopDIR)/rtl8821c.mk + +_OUTSRC_FILES += hal/phydm/rtl8821c/halhwimg8821c_testchip_bb.o \ + hal/phydm/rtl8821c/halhwimg8821c_testchip_mac.o \ + hal/phydm/rtl8821c/halhwimg8821c_testchip_rf.o \ + hal/phydm/rtl8821c/phydm_hal_api8821c.o \ + hal/phydm/rtl8821c/phydm_regconfig8821c.o\ + hal/phydm/rtl8821c/phydm_iqk_8821c.o +endif + ########### AUTO_CFG ################################# ifeq ($(CONFIG_AUTOCFG_CP), y) @@ -725,7 +839,6 @@ endif ########### END OF PATH ################################# - ifeq ($(CONFIG_USB_HCI), y) ifeq ($(CONFIG_USB_AUTOSUSPEND), y) EXTRA_CFLAGS += -DCONFIG_USB_AUTOSUSPEND @@ -797,6 +910,7 @@ endif ifeq ($(CONFIG_LOAD_PHY_PARA_FROM_FILE), y) EXTRA_CFLAGS += -DCONFIG_LOAD_PHY_PARA_FROM_FILE +#EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER #EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH=\"/lib/firmware/\" EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH=\"\" endif @@ -834,6 +948,9 @@ EXTRA_CFLAGS += -DCONFIG_WOWLAN ifeq ($(CONFIG_SDIO_HCI), y) EXTRA_CFLAGS += -DCONFIG_RTW_SDIO_PM_KEEP_POWER endif +ifeq ($(CONFIG_DEFAULT_PATTERNS_EN), y) +EXTRA_CFLAGS += -DCONFIG_DEFAULT_PATTERNS_EN +endif endif ifeq ($(CONFIG_AP_WOWLAN), y) @@ -891,6 +1008,30 @@ ifeq ($(CONFIG_WIFI_MONITOR), y) EXTRA_CFLAGS += -DCONFIG_WIFI_MONITOR endif +ifeq ($(CONFIG_MCC_MODE), y) +EXTRA_CFLAGS += -DCONFIG_MCC_MODE +endif + +ifeq ($(CONFIG_MP_VHT_HW_TX_MODE), y) +EXTRA_CFLAGS += -DCONFIG_MP_VHT_HW_TX_MODE +ifeq ($(CONFIG_PLATFORM_I386_PC), y) +## For I386 X86 ToolChain use Hardware FLOATING +EXTRA_CFLAGS += -mhard-float +else +## For ARM ToolChain use Hardware FLOATING +EXTRA_CFLAGS += -mfloat-abi=hard +endif +endif + +ifeq ($(CONFIG_APPEND_VENDOR_IE_ENABLE), y) +EXTRA_CFLAGS += -DCONFIG_APPEND_VENDOR_IE_ENABLE +endif + +ifeq ($(CONFIG_RTW_DEBUG), y) +EXTRA_CFLAGS += -DCONFIG_RTW_DEBUG +EXTRA_CFLAGS += -DRTW_LOG_LEVEL=$(CONFIG_RTW_LOG_LEVEL) +endif + EXTRA_CFLAGS += -DDM_ODM_SUPPORT_TYPE=0x04 ifeq ($(CONFIG_PLATFORM_I386_PC), y) @@ -925,7 +1066,6 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN 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 @@ -947,7 +1087,6 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS EXTRA_CFLAGS += -DCONFIG_RESUME_IN_WORKQUEUE EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS @@ -1009,7 +1148,6 @@ EXTRA_CFLAGS += -DCONFIG_PLATFORM_INTEL_BYT EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS EXTRA_CFLAGS += -DCONFIG_SKIP_SIGNAL_SCALE_MAPPING ifeq ($(CONFIG_SDIO_HCI), y) EXTRA_CFLAGS += -DCONFIG_RESUME_IN_WORKQUEUE @@ -1020,7 +1158,6 @@ ifeq ($(CONFIG_PLATFORM_JB_X86), 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 := /home/android_sdk/android-x86_JB/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7/bin/i686-linux-android- @@ -1172,7 +1309,6 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ARCH := arm CROSS_COMPILE := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- KSRC := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/out/target/product/cardhu/obj/KERNEL @@ -1185,7 +1321,6 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ARCH := arm CROSS_COMPILE := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- KSRC := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/out/target/product/dalmore/obj/KERNEL @@ -1213,7 +1348,6 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN # 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 ARCH := arm CROSS_COMPILE := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- KSRC := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/kernel @@ -1237,7 +1371,6 @@ EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN # default setting for Special function -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ARCH := arm CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3188/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- KSRC := /home/android_sdk/Rockchip/Rk3188/kernel @@ -1250,7 +1383,6 @@ EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ifeq ($(CONFIG_SDIO_HCI), y) EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN endif @@ -1312,7 +1444,6 @@ EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUNxI # 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 += -DDCONFIG_P2P_IPS EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS ifeq ($(CONFIG_USB_HCI), y) @@ -1340,7 +1471,7 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2, 4.3, 4.4 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION +EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS ifeq ($(CONFIG_USB_HCI), y) @@ -1372,7 +1503,7 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2, 4.3, 4.4 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION +EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS ifeq ($(CONFIG_USB_HCI), y) @@ -1403,7 +1534,6 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS ifeq ($(CONFIG_USB_HCI), y) @@ -1431,7 +1561,6 @@ 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 @@ -1464,7 +1593,6 @@ ifeq ($(CONFIG_PLATFORM_ARM_RTD299X), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DUSB_XMITBUF_ALIGN_SZ=1024 -DUSB_PACKET_OFFSET_SZ=0 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ifeq ($(CONFIG_ANDROID), y) EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT # Enable this for Android 5.0 @@ -1480,7 +1608,6 @@ 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- @@ -1544,8 +1671,9 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IFACE_NUMBER=3 EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -#EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION +#EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION #EXTRA_CFLAGS += -DCONFIG_#PLATFORM_OPS @@ -1569,12 +1697,41 @@ MODULE_NAME := 8192eu endif +ifeq ($(CONFIG_PLATFORM_RTK129X), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +EXTRA_CFLAGS += -DRTK_129X_PLATFORM +EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT +# default setting for Android 4.1, 4.2 +#EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +#EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION +EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION +EXTRA_CFLAGS += -Wno-error=date-time + +#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 := arm64 + +# ==== Cross compile setting for Android 4.4 SDK ===== +#CROSS_COMPILE := arm-linux-gnueabihf- +KVER := 4.1.10 +CROSS_COMPILE := $(CROSS) +KSRC := $(LINUX_KERNEL_PATH) +MODULE_NAME := 8822be +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 @@ -1584,6 +1741,17 @@ KSRC := /Custom/Novatek/TCL/linux-3.8_header #KSRC := $(KERNELDIR) endif +ifeq ($(CONFIG_PLATFORM_ARM_TCC8930_JB42), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +# default setting for Android 4.1, 4.2 +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +ARCH := arm +CROSS_COMPILE := /home/android_sdk/Telechips/v13.05_r1-tcc-android-4.2.2_tcc893x-evm_build/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- +KSRC := /home/android_sdk/Telechips/v13.05_r1-tcc-android-4.2.2_tcc893x-evm_build/kernel +MODULE_NAME := wlan +endif + ifeq ($(CONFIG_MULTIDRV), y) ifeq ($(CONFIG_SDIO_HCI), y) @@ -1617,6 +1785,7 @@ rtk_core := core/rtw_cmd.o \ core/rtw_ieee80211.o \ core/rtw_mlme.o \ core/rtw_mlme_ext.o \ + core/rtw_mi.o \ core/rtw_wlan_util.o \ core/rtw_vht.o \ core/rtw_pwrctrl.o \ @@ -1635,6 +1804,10 @@ rtk_core := core/rtw_cmd.o \ core/rtw_odm.o \ core/efuse/rtw_efuse.o +ifeq ($(CONFIG_SDIO_HCI), y) +rtk_core += core/rtw_sdio.o +endif + $(MODULE_NAME)-y += $(rtk_core) $(MODULE_NAME)-$(CONFIG_INTEL_WIDI) += core/rtw_intel_widi.o @@ -1647,21 +1820,17 @@ $(MODULE_NAME)-y += $(_HAL_INTFS_FILES) $(MODULE_NAME)-y += $(_OUTSRC_FILES) $(MODULE_NAME)-y += $(_PLATFORM_FILES) -$(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o \ - core/rtw_mp_ioctl.o +$(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o ifeq ($(CONFIG_RTL8723B), y) $(MODULE_NAME)-$(CONFIG_MP_INCLUDED)+= core/rtw_bt_mp.o endif -ifeq ($(CONFIG_RTL8821A), y) -$(MODULE_NAME)-$(CONFIG_MP_INCLUDED)+= core/rtw_bt_mp.o -endif -obj-$(CONFIG_RTL8812AU_8821AU) := $(MODULE_NAME).o +obj-$(CONFIG_RTL8812AU) := $(MODULE_NAME).o else -export CONFIG_RTL8812AU_8821AU = m +export CONFIG_RTL8812AU = m all: modules @@ -1687,9 +1856,8 @@ config_r: .PHONY: modules clean clean: - cd hal/phydm/ ; rm -fr */*.mod.c */*.mod */*.o */.*.cmd */*.ko - cd hal/phydm/ ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko - cd hal/led ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko + #$(MAKE) -C $(KSRC) M=$(shell pwd) clean + cd hal ; rm -fr */*/*/*.mod.c */*/*/*.mod */*/*/*.o */*/*/.*.cmd */*/*/*.ko cd hal ; rm -fr */*/*.mod.c */*/*.mod */*/*.o */*/.*.cmd */*/*.ko cd hal ; rm -fr */*.mod.c */*.mod */*.o */.*.cmd */*.ko cd hal ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko diff --git a/clean b/clean old mode 100755 new mode 100644 diff --git a/core/efuse/rtw_efuse.c b/core/efuse/rtw_efuse.c old mode 100755 new mode 100644 index 3c93c9d..1bb5105 --- a/core/efuse/rtw_efuse.c +++ b/core/efuse/rtw_efuse.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. @@ -25,50 +25,1122 @@ #include "../hal/efuse/efuse_mask.h" /*------------------------Define local variable------------------------------*/ -u8 fakeEfuseBank=0; -u32 fakeEfuseUsedBytes=0; -u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]={0}; -u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]={0}; -u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]={0}; +u8 fakeEfuseBank = {0}; +u32 fakeEfuseUsedBytes = {0}; +u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE] = {0}; +u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN] = {0}; +u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN] = {0}; -u32 BTEfuseUsedBytes=0; +u32 BTEfuseUsedBytes = {0}; u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; -u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0}; -u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0}; +u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN] = {0}; +u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN] = {0}; -u32 fakeBTEfuseUsedBytes=0; +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 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN] = {0}; +u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN] = {0}; -u8 maskfileBuffer[32]; +u8 maskfileBuffer[32]; /*------------------------Define local variable------------------------------*/ - -//------------------------------------------------------------------------------ -#define REG_EFUSE_CTRL 0x0030 -#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. -//------------------------------------------------------------------------------ - -BOOLEAN -Efuse_Read1ByteFromFakeContent( - IN PADAPTER pAdapter, - IN u16 Offset, - IN OUT u8 *Value ); -BOOLEAN -Efuse_Read1ByteFromFakeContent( - IN PADAPTER pAdapter, - IN u16 Offset, - IN OUT u8 *Value ) +BOOLEAN rtw_file_efuse_IsMasked(PADAPTER pAdapter, u16 Offset) { - if(Offset >= EFUSE_MAX_HW_SIZE) - { + int r = Offset / 16; + int c = (Offset % 16) / 2; + int result = 0; + + if (pAdapter->registrypriv.boffefusemask) + return FALSE; + + if (c < 4) /* Upper double word */ + result = (maskfileBuffer[r] & (0x10 << c)); + else + result = (maskfileBuffer[r] & (0x01 << (c - 4))); + + return (result > 0) ? 0 : 1; +} + +BOOLEAN efuse_IsMasked(PADAPTER pAdapter, u16 Offset) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); + + if (pAdapter->registrypriv.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 0 + if (IS_HARDWARE_TYPE_8811AU(pAdapter)) + return (IS_MASKED(8811A, _MUSB, Offset)) ? TRUE : FALSE; +#endif + 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_RTL8703B) + if (IS_HARDWARE_TYPE_8703B(pAdapter)) + return (IS_MASKED(8703B, _MUSB, Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8814A) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + return (IS_MASKED(8814A, _MUSB, Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8188F) + if (IS_HARDWARE_TYPE_8188F(pAdapter)) + return (IS_MASKED(8188F, _MUSB, Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8822B) + if (IS_HARDWARE_TYPE_8822B(pAdapter)) + return (IS_MASKED(8822B, _MUSB, Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8723D) + if (IS_HARDWARE_TYPE_8723D(pAdapter)) + return (IS_MASKED(8723D, _MUSB, Offset)) ? TRUE : FALSE; +#endif + + /*#if defined(CONFIG_RTL8821C) + if (IS_HARDWARE_TYPE_8821C(pAdapter)) + return (IS_MASKED(8821C,_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 +#if defined(CONFIG_RTL8822B) + if (IS_HARDWARE_TYPE_8822B(pAdapter)) + return (IS_MASKED(8822B, _MPCIE, Offset)) ? TRUE : FALSE; +#endif + +#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 +#ifdef CONFIG_RTL8188F_SDIO + if (IS_HARDWARE_TYPE_8188F(pAdapter)) + return (IS_MASKED(8188F, _MSDIO, Offset)) ? TRUE : FALSE; +#endif +#endif + + return FALSE; +} + +void rtw_efuse_mask_array(PADAPTER pAdapter, u8 *pArray) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); + +#if DEV_BUS_TYPE == RT_USB_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + GET_MASK_ARRAY(8188E, _MUSB, pArray); +#endif +#if defined(CONFIG_RTL8812A) + if (IS_HARDWARE_TYPE_8812(pAdapter)) + GET_MASK_ARRAY(8812A, _MUSB, pArray); +#endif +#if defined(CONFIG_RTL8821A) + if (IS_HARDWARE_TYPE_8821(pAdapter)) + GET_MASK_ARRAY(8821A, _MUSB, pArray); +#endif +#if defined(CONFIG_RTL8192E) + if (IS_HARDWARE_TYPE_8192E(pAdapter)) + GET_MASK_ARRAY(8192E, _MUSB, pArray); +#endif +#if defined(CONFIG_RTL8723B) + if (IS_HARDWARE_TYPE_8723B(pAdapter)) + GET_MASK_ARRAY(8723B, _MUSB, pArray); +#endif +#if defined(CONFIG_RTL8703B) + if (IS_HARDWARE_TYPE_8703B(pAdapter)) + GET_MASK_ARRAY(8703B, _MUSB, pArray); +#endif +#if defined(CONFIG_RTL8188F) + if (IS_HARDWARE_TYPE_8188F(pAdapter)) + GET_MASK_ARRAY(8188F, _MUSB, pArray); +#endif +#if defined(CONFIG_RTL8814A) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + GET_MASK_ARRAY(8814A, _MUSB, pArray); +#endif +#if defined(CONFIG_RTL8822B) + if (IS_HARDWARE_TYPE_8822B(pAdapter)) + GET_MASK_ARRAY(8822B, _MUSB, pArray); +#endif + /*#if defined(CONFIG_RTL8821C) + if (IS_HARDWARE_TYPE_8821C(pAdapter)) + GET_MASK_ARRAY(8821C,_MUSB,pArray); + #endif*/ +#elif DEV_BUS_TYPE == RT_PCI_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + GET_MASK_ARRAY(8188E, _MPCIE, pArray); +#endif +#if defined(CONFIG_RTL8192E) + if (IS_HARDWARE_TYPE_8192E(pAdapter)) + GET_MASK_ARRAY(8192E, _MPCIE, pArray); +#endif +#if defined(CONFIG_RTL8812A) + if (IS_HARDWARE_TYPE_8812(pAdapter)) + GET_MASK_ARRAY(8812A, _MPCIE, pArray); +#endif +#if defined(CONFIG_RTL8821A) + if (IS_HARDWARE_TYPE_8821(pAdapter)) + GET_MASK_ARRAY(8821A, _MPCIE, pArray); +#endif +#if defined(CONFIG_RTL8723B) + if (IS_HARDWARE_TYPE_8723B(pAdapter)) + GET_MASK_ARRAY(8723B, _MPCIE, pArray); +#endif +#if defined(CONFIG_RTL8814A) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + GET_MASK_ARRAY(8814A, _MPCIE, pArray); +#endif +#if defined(CONFIG_RTL8822B) + if (IS_HARDWARE_TYPE_8822B(pAdapter)) + GET_MASK_ARRAY(8822B, _MPCIE, pArray); +#endif +#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + GET_MASK_ARRAY(8188E, _MSDIO, pArray); +#endif +#if defined(CONFIG_RTL8188F) + if (IS_HARDWARE_TYPE_8188F(pAdapter)) + GET_MASK_ARRAY(8188F, _MSDIO, pArray); +#endif +#endif /*#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE*/ +} + +u16 rtw_get_efuse_mask_arraylen(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#if DEV_BUS_TYPE == RT_USB_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + return GET_MASK_ARRAY_LEN(8188E, _MUSB); +#endif +#if defined(CONFIG_RTL8812A) + if (IS_HARDWARE_TYPE_8812(pAdapter)) + return GET_MASK_ARRAY_LEN(8812A, _MUSB); +#endif +#if defined(CONFIG_RTL8821A) + if (IS_HARDWARE_TYPE_8821(pAdapter)) + return GET_MASK_ARRAY_LEN(8821A, _MUSB); +#endif +#if defined(CONFIG_RTL8192E) + if (IS_HARDWARE_TYPE_8192E(pAdapter)) + return GET_MASK_ARRAY_LEN(8192E, _MUSB); +#endif +#if defined(CONFIG_RTL8723B) + if (IS_HARDWARE_TYPE_8723B(pAdapter)) + return GET_MASK_ARRAY_LEN(8723B, _MUSB); +#endif +#if defined(CONFIG_RTL8703B) + if (IS_HARDWARE_TYPE_8703B(pAdapter)) + return GET_MASK_ARRAY_LEN(8703B, _MUSB); +#endif +#if defined(CONFIG_RTL8188F) + if (IS_HARDWARE_TYPE_8188F(pAdapter)) + return GET_MASK_ARRAY_LEN(8188F, _MUSB); +#endif +#if defined(CONFIG_RTL8814A) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + return GET_MASK_ARRAY_LEN(8814A, _MUSB); +#endif +#if defined(CONFIG_RTL8822B) + if (IS_HARDWARE_TYPE_8822B(pAdapter)) + return GET_MASK_ARRAY_LEN(8822B, _MUSB); +#endif + /*#if defined(CONFIG_RTL8821C) + if (IS_HARDWARE_TYPE_8821C(pAdapter)) + return GET_MASK_ARRAY_LEN(8821C,_MUSB); + #endif*/ +#elif DEV_BUS_TYPE == RT_PCI_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + return GET_MASK_ARRAY_LEN(8188E, _MPCIE); +#endif +#if defined(CONFIG_RTL8192E) + if (IS_HARDWARE_TYPE_8192E(pAdapter)) + return GET_MASK_ARRAY_LEN(8192E, _MPCIE); +#endif +#if defined(CONFIG_RTL8812A) + if (IS_HARDWARE_TYPE_8812(pAdapter)) + return GET_MASK_ARRAY_LEN(8812A, _MPCIE); +#endif +#if defined(CONFIG_RTL8821A) + if (IS_HARDWARE_TYPE_8821(pAdapter)) + return GET_MASK_ARRAY_LEN(8821A, _MPCIE); +#endif +#if defined(CONFIG_RTL8723B) + if (IS_HARDWARE_TYPE_8723B(pAdapter)) + return GET_MASK_ARRAY_LEN(8723B, _MPCIE); +#endif +#if defined(CONFIG_RTL8814A) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + return GET_MASK_ARRAY_LEN(8814A, _MPCIE); +#endif +#if defined(CONFIG_RTL8822B) + if (IS_HARDWARE_TYPE_8822B(pAdapter)) + return GET_MASK_ARRAY_LEN(8822B, _MPCIE); +#endif +#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + return GET_MASK_ARRAY_LEN(8188E, _MSDIO); +#endif +#if defined(CONFIG_RTL8188F) + if (IS_HARDWARE_TYPE_8188F(pAdapter)) + return GET_MASK_ARRAY_LEN(8188F, _MSDIO); +#endif + +#endif + return 0; +} + + +#ifdef RTW_HALMAC +#include "../../hal/hal_halmac.h" + +void Efuse_PowerSwitch(PADAPTER adapter, u8 write, u8 pwrstate) +{ +} + +void BTEfuse_PowerSwitch(PADAPTER adapter, u8 write, u8 pwrstate) +{ +} + +u8 efuse_GetCurrentSize(PADAPTER adapter, u16 *size) +{ + *size = 0; + + return _FAIL; +} + +u16 efuse_GetMaxSize(PADAPTER adapter) +{ + struct dvobj_priv *d; + u32 size = 0; + int err; + + d = adapter_to_dvobj(adapter); + err = rtw_halmac_get_physical_efuse_size(d, &size); + if (err) + return 0; + + return size; +} + +u8 efuse_bt_GetCurrentSize(PADAPTER adapter, u16 *size) +{ + *size = 0; + + return _FAIL; +} + +u16 efuse_bt_GetMaxSize(PADAPTER adapter) +{ + return 0; +} + +void EFUSE_GetEfuseDefinition(PADAPTER adapter, u8 efusetype, u8 type, void *out, BOOLEAN test) +{ + struct dvobj_priv *d; + u32 v32 = 0; + + + d = adapter_to_dvobj(adapter); + + if (adapter->HalFunc.EFUSEGetEfuseDefinition) { + adapter->HalFunc.EFUSEGetEfuseDefinition(adapter, efusetype, type, out, test); + return; + } + + if (EFUSE_WIFI == efusetype) { + switch (type) { + case TYPE_EFUSE_MAP_LEN: + rtw_halmac_get_logical_efuse_size(d, &v32); + *(u16 *)out = (u16)v32; + return; + } + } +} + +/* + * read/write raw efuse data + */ +u8 rtw_efuse_access(PADAPTER adapter, u8 write, u16 addr, u16 cnts, u8 *data) +{ + struct dvobj_priv *d; + u8 *efuse = NULL; + u32 size, i; + int err; + + + d = adapter_to_dvobj(adapter); + err = rtw_halmac_get_physical_efuse_size(d, &size); + if (err) + size = EFUSE_MAX_SIZE; + + if ((addr + cnts) > size) + return _FAIL; + + if (_TRUE == write) { + err = rtw_halmac_write_physical_efuse(d, addr, cnts, data); + if (err) + return _FAIL; + } else { + if (cnts > 16) + efuse = rtw_zmalloc(size); + + if (efuse) { + err = rtw_halmac_read_physical_efuse_map(d, efuse, size); + if (err) { + rtw_mfree(efuse, size); + return _FAIL; + } + + _rtw_memcpy(data, efuse + addr, cnts); + rtw_mfree(efuse, size); + } else { + err = rtw_halmac_read_physical_efuse(d, addr, cnts, data); + if (err) + return _FAIL; + } + } + + return _SUCCESS; +} + +static inline void dump_buf(u8 *buf, u32 len) +{ + u32 i; + + RTW_INFO("-----------------Len %d----------------\n", len); + for (i = 0; i < len; i++) + printk("%2.2x-", *(buf + i)); + printk("\n"); +} + +/* + * read/write raw efuse data + */ +u8 rtw_efuse_bt_access(PADAPTER adapter, u8 write, u16 addr, u16 cnts, u8 *data) +{ + struct dvobj_priv *d; + u8 *efuse = NULL; + u32 size, i; + int err = _FAIL; + + + d = adapter_to_dvobj(adapter); + + size = EFUSE_BT_REAL_BANK_CONTENT_LEN; + + if ((addr + cnts) > size) + return _FAIL; + + if (_TRUE == write) { + err = rtw_halmac_write_bt_physical_efuse(d, addr, cnts, data); + if (err == -1) { + RTW_ERR("%s: rtw_halmac_write_bt_physical_efuse fail!\n", __FUNCTION__); + return _FAIL; + } + RTW_INFO("%s: rtw_halmac_write_bt_physical_efuse OK! data 0x%x\n", __FUNCTION__, *data); + } else { + efuse = rtw_zmalloc(size); + + if (efuse) { + err = rtw_halmac_read_bt_physical_efuse_map(d, efuse, size); + + if (err == -1) { + RTW_ERR("%s: rtw_halmac_read_bt_physical_efuse_map fail!\n", __FUNCTION__); + rtw_mfree(efuse, size); + return _FAIL; + } + dump_buf(efuse + addr, cnts); + + RTW_INFO("%s: rtw_halmac_read_bt_physical_efuse_map ok!\n", __FUNCTION__); + _rtw_memcpy(data, efuse + addr, cnts); + rtw_mfree(efuse, size); + } + } + + return _SUCCESS; +} + +u8 rtw_efuse_map_read(PADAPTER adapter, u16 addr, u16 cnts, u8 *data) +{ + struct dvobj_priv *d; + u8 *efuse = NULL; + u32 size, i; + int err; + + + d = adapter_to_dvobj(adapter); + err = rtw_halmac_get_logical_efuse_size(d, &size); + if (err) + return _FAIL; + + /* size error handle */ + if ((addr + cnts) > size) { + if (addr < size) + cnts = size - addr; + else + return _FAIL; + } + + if (cnts > 16) + efuse = rtw_zmalloc(size); + + if (efuse) { + err = rtw_halmac_read_logical_efuse_map(d, efuse, size); + if (err) { + rtw_mfree(efuse, size); + return _FAIL; + } + + _rtw_memcpy(data, efuse + addr, cnts); + rtw_mfree(efuse, size); + } else { + err = rtw_halmac_read_logical_efuse(d, addr, cnts, data); + if (err) + return _FAIL; + } + + return _SUCCESS; +} + +u8 rtw_efuse_mask_map_read(PADAPTER adapter, u16 addr, u16 cnts, u8 *data) +{ + return rtw_efuse_map_read(adapter, addr, cnts, data); +} + +u8 rtw_efuse_map_write(PADAPTER adapter, u16 addr, u16 cnts, u8 *data) +{ + struct dvobj_priv *d; + u8 *efuse = NULL; + u32 size, i; + int err; + u8 mask_buf[64] = ""; + u16 mask_len = sizeof(u8) * rtw_get_efuse_mask_arraylen(adapter); + + d = adapter_to_dvobj(adapter); + err = rtw_halmac_get_logical_efuse_size(d, &size); + if (err) + return _FAIL; + + if ((addr + cnts) > size) + return _FAIL; + + efuse = rtw_zmalloc(size); + if (!efuse) + return _FAIL; + + err = rtw_halmac_read_logical_efuse_map(d, efuse, size); + if (err) { + rtw_mfree(efuse, size); + return _FAIL; + } + + _rtw_memcpy(efuse + addr, data, cnts); + + if (adapter->registrypriv.boffefusemask == 0) { + RTW_INFO("Use mask Array Len: %d\n", mask_len); + + if (mask_len != 0) { + rtw_efuse_mask_array(adapter, mask_buf); + err = rtw_halmac_write_logical_efuse_map(d, efuse, size, mask_buf, mask_len); + } else + err = rtw_halmac_write_logical_efuse_map(d, efuse, size, NULL, 0); + } else { + _rtw_memset(mask_buf, 0xFF, sizeof(mask_buf)); + RTW_INFO("Efuse mask off\n"); + err = rtw_halmac_write_logical_efuse_map(d, efuse, size, mask_buf, size/16); + } + + if (err) { + rtw_mfree(efuse, size); + return _FAIL; + } + + rtw_mfree(efuse, size); + + return _SUCCESS; +} + +int Efuse_PgPacketRead(PADAPTER adapter, u8 offset, u8 *data, BOOLEAN test) +{ + return _FALSE; +} + +int Efuse_PgPacketWrite(PADAPTER adapter, u8 offset, u8 word_en, u8 *data, BOOLEAN test) +{ + return _FALSE; +} + +u8 rtw_BT_efuse_map_read(PADAPTER adapter, u16 addr, u16 cnts, u8 *data) +{ + hal_ReadEFuse_BT_logic_map(adapter,addr, cnts, data); + + return _SUCCESS; +} + +u8 rtw_BT_efuse_map_write(PADAPTER adapter, u16 addr, u16 cnts, u8 *data) +{ +#define RT_ASSERT_RET(expr) \ + if (!(expr)) { \ + printk("Assertion failed! %s at ......\n", #expr); \ + printk(" ......%s,%s, line=%d\n",__FILE__, __FUNCTION__, __LINE__); \ + return _FAIL; \ + } + + u8 offset, word_en; + u8 *map; + u8 newdata[PGPKT_DATA_SIZE]; + s32 i = 0, j = 0, idx; + u8 ret = _SUCCESS; + u16 mapLen = 1024; + + if ((addr + cnts) > mapLen) + return _FAIL; + + RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); /* have to be 8 byte alignment */ + RT_ASSERT_RET((mapLen & 0x7) == 0); /* have to be PGPKT_DATA_SIZE alignment for memcpy */ + + map = rtw_zmalloc(mapLen); + if (map == NULL) + return _FAIL; + + ret = rtw_BT_efuse_map_read(adapter, 0, mapLen, map); + if (ret == _FAIL) + goto exit; + RTW_INFO("OFFSET\tVALUE(hex)\n"); + for (i = 0; i < 1024; i += 16) { /* set 512 because the iwpriv's extra size have limit 0x7FF */ + RTW_INFO("0x%03x\t", i); + for (j = 0; j < 8; j++) + RTW_INFO("%02X ", map[i + j]); + RTW_INFO("\t"); + for (; j < 16; j++) + RTW_INFO("%02X ", map[i + j]); + RTW_INFO("\n"); + } + RTW_INFO("\n"); + + idx = 0; + offset = (addr >> 3); + while (idx < cnts) { + word_en = 0xF; + j = (addr + idx) & 0x7; + _rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE); + for (i = j; i < PGPKT_DATA_SIZE && idx < cnts; i++, idx++) { + if (data[idx] != map[addr + idx]) { + word_en &= ~BIT(i >> 1); + newdata[i] = data[idx]; + } + } + + if (word_en != 0xF) { + RTW_INFO("offset=%x\n", offset); + RTW_INFO("word_en=%x\n", word_en); + RTW_INFO("%s: data=", __FUNCTION__); + for (i = 0; i < PGPKT_DATA_SIZE; i++) + RTW_INFO("0x%02X ", newdata[i]); + RTW_INFO("\n"); + ret = EfusePgPacketWrite_BT(adapter, offset, word_en, newdata, _FALSE); + if (ret == _FAIL) + break; + } + offset++; + } +exit: + rtw_mfree(map, mapLen); + return _SUCCESS; +} + +VOID hal_ReadEFuse_BT_logic_map( + PADAPTER padapter, + u16 _offset, + u16 _size_byte, + u8 *pbuf +) +{ + + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + PEFUSE_HAL pEfuseHal = &pHalData->EfuseHal; + + u8 *efuseTbl, *phyefuse; + u8 bank; + u16 eFuse_Addr = 0; + u8 efuseHeader, efuseExtHdr, efuseData; + u8 offset, wden; + u16 i, total, used; + u8 efuse_usage; + + + /* */ + /* Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. */ + /* */ + if ((_offset + _size_byte) > EFUSE_BT_MAP_LEN) { + RTW_INFO("%s: Invalid offset(%#x) with read bytes(%#x)!!\n", __FUNCTION__, _offset, _size_byte); + return; + } + + efuseTbl = rtw_malloc(EFUSE_BT_MAP_LEN); + phyefuse = rtw_malloc(EFUSE_BT_REAL_BANK_CONTENT_LEN); + + if (efuseTbl == NULL || phyefuse == NULL) { + RTW_INFO("%s: efuseTbl malloc fail!\n", __FUNCTION__); + return; + } + /* 0xff will be efuse default value instead of 0x00. */ + _rtw_memset(efuseTbl, 0xFF, EFUSE_BT_MAP_LEN); + _rtw_memset(phyefuse, 0xFF, EFUSE_BT_REAL_BANK_CONTENT_LEN); + + if(rtw_efuse_bt_access(padapter, _FALSE, 0, EFUSE_BT_REAL_BANK_CONTENT_LEN, phyefuse)) + dump_buf(phyefuse, EFUSE_BT_REAL_BANK_CONTENT_LEN); + + total = BANK_NUM; + for (bank = 1; bank <= total; bank++) { /* 8723d Max bake 0~2 */ + eFuse_Addr = 0; + + while (AVAILABLE_EFUSE_ADDR(eFuse_Addr)) { + /* ReadEFuseByte(padapter, eFuse_Addr++, &efuseHeader, bPseudoTest); */ + efuseHeader = phyefuse[eFuse_Addr++]; + + if (efuseHeader == 0xFF) + break; + RTW_INFO("%s: efuse[%#X]=0x%02x (header)\n", __FUNCTION__, (((bank - 1) * EFUSE_BT_REAL_CONTENT_LEN) + eFuse_Addr - 1), efuseHeader); + + /* Check PG header for section num. */ + if (EXT_HEADER(efuseHeader)) { /* extended header */ + offset = GET_HDR_OFFSET_2_0(efuseHeader); + RTW_INFO("%s: extended header offset_2_0=0x%X\n", __FUNCTION__, offset); + + /* ReadEFuseByte(padapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest); */ + efuseExtHdr = phyefuse[eFuse_Addr++]; + + RTW_INFO("%s: efuse[%#X]=0x%02x (ext header)\n", __FUNCTION__, (((bank - 1) * EFUSE_BT_REAL_CONTENT_LEN) + eFuse_Addr - 1), efuseExtHdr); + if (ALL_WORDS_DISABLED(efuseExtHdr)) + continue; + + offset |= ((efuseExtHdr & 0xF0) >> 1); + wden = (efuseExtHdr & 0x0F); + } else { + offset = ((efuseHeader >> 4) & 0x0f); + wden = (efuseHeader & 0x0f); + } + + if (offset < EFUSE_BT_MAX_SECTION) { + u16 addr; + + /* Get word enable value from PG header */ + RTW_INFO("%s: Offset=%d Worden=%#X\n", __FUNCTION__, offset, wden); + + addr = offset * PGPKT_DATA_SIZE; + for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) { + /* Check word enable condition in the section */ + if (!(wden & (0x01 << i))) { + efuseData = 0; + /* ReadEFuseByte(padapter, eFuse_Addr++, &efuseData, bPseudoTest); */ + efuseData = phyefuse[eFuse_Addr++]; + + RTW_INFO("%s: efuse[%#X]=0x%02X\n", __FUNCTION__, eFuse_Addr - 1, efuseData); + efuseTbl[addr] = efuseData; + + efuseData = 0; + /* ReadEFuseByte(padapter, eFuse_Addr++, &efuseData, bPseudoTest); */ + efuseData = phyefuse[eFuse_Addr++]; + + RTW_INFO("%s: efuse[%#X]=0x%02X\n", __FUNCTION__, eFuse_Addr - 1, efuseData); + efuseTbl[addr + 1] = efuseData; + } + addr += 2; + } + } else { + RTW_INFO("%s: offset(%d) is illegal!!\n", __FUNCTION__, offset); + eFuse_Addr += Efuse_CalculateWordCnts(wden) * 2; + } + } + + if ((eFuse_Addr - 1) < total) { + RTW_INFO("%s: bank(%d) data end at %#x\n", __FUNCTION__, bank, eFuse_Addr - 1); + break; + } + } + + /* switch bank back to bank 0 for later BT and wifi use. */ + //hal_EfuseSwitchToBank(padapter, 0, bPseudoTest); + + /* Copy from Efuse map to output pointer memory!!! */ + for (i = 0; i < _size_byte; i++) + pbuf[i] = efuseTbl[_offset + i]; + /* Calculate Efuse utilization */ + total = EFUSE_BT_REAL_BANK_CONTENT_LEN; + + used = eFuse_Addr - 1; + + if (total) + efuse_usage = (u8)((used * 100) / total); + else + efuse_usage = 100; + + fakeBTEfuseUsedBytes = used; + +exit: + if (efuseTbl) + rtw_mfree(efuseTbl, EFUSE_BT_MAP_LEN); +} + + +static u8 hal_EfusePartialWriteCheck( + PADAPTER padapter, + u8 efuseType, + u16 *pAddr, + PPGPKT_STRUCT pTargetPkt, + u8 bPseudoTest) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + PEFUSE_HAL pEfuseHal = &pHalData->EfuseHal; + u8 bRet = _FALSE; + u16 startAddr = 0, efuse_max_available_len = EFUSE_BT_REAL_BANK_CONTENT_LEN, efuse_max = EFUSE_BT_REAL_BANK_CONTENT_LEN; + u8 efuse_data = 0; + + startAddr = (u16)fakeBTEfuseUsedBytes; + + startAddr %= efuse_max; + RTW_INFO("%s: startAddr=%#X\n", __FUNCTION__, startAddr); + + while (1) { + if (startAddr >= efuse_max_available_len) { + bRet = _FALSE; + RTW_INFO("%s: startAddr(%d) >= efuse_max_available_len(%d)\n", + __FUNCTION__, startAddr, efuse_max_available_len); + break; + } + if (rtw_efuse_bt_access(padapter, _FALSE, startAddr, 1, &efuse_data)&& (efuse_data != 0xFF)) { + bRet = _FALSE; + RTW_INFO("%s: Something Wrong! last bytes(%#X=0x%02X) is not 0xFF\n", + __FUNCTION__, startAddr, efuse_data); + break; + } else { + /* not used header, 0xff */ + *pAddr = startAddr; + /* RTW_INFO("%s: Started from unused header offset=%d\n", __FUNCTION__, startAddr)); */ + bRet = _TRUE; + break; + } + } + + return bRet; +} + + +static u8 hal_EfusePgPacketWrite2ByteHeader( + PADAPTER padapter, + u8 efuseType, + u16 *pAddr, + PPGPKT_STRUCT pTargetPkt, + u8 bPseudoTest) +{ + u16 efuse_addr, efuse_max_available_len = EFUSE_BT_REAL_BANK_CONTENT_LEN; + u8 pg_header = 0, tmp_header = 0; + u8 repeatcnt = 0; + + /* RTW_INFO("%s\n", __FUNCTION__); */ + + efuse_addr = *pAddr; + if (efuse_addr >= efuse_max_available_len) { + RTW_INFO("%s: addr(%d) over avaliable(%d)!!\n", __FUNCTION__, efuse_addr, efuse_max_available_len); return _FALSE; } - //DbgPrint("Read fake content, offset = %d\n", Offset); - if(fakeEfuseBank == 0) + + pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F; + /* RTW_INFO("%s: pg_header=0x%x\n", __FUNCTION__, pg_header); */ + + do { + + rtw_efuse_bt_access(padapter, _TRUE, efuse_addr, 1, &pg_header); + rtw_efuse_bt_access(padapter, _FALSE, efuse_addr, 1, &tmp_header); + + if (tmp_header != 0xFF) + break; + if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) { + RTW_INFO("%s: Repeat over limit for pg_header!!\n", __FUNCTION__); + return _FALSE; + } + } while (1); + + if (tmp_header != pg_header) { + RTW_ERR("%s: PG Header Fail!!(pg=0x%02X read=0x%02X)\n", __FUNCTION__, pg_header, tmp_header); + return _FALSE; + } + + /* to write ext_header */ + efuse_addr++; + pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en; + + do { + rtw_efuse_bt_access(padapter, _TRUE, efuse_addr, 1, &pg_header); + rtw_efuse_bt_access(padapter, _FALSE, efuse_addr, 1, &tmp_header); + + if (tmp_header != 0xFF) + break; + if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) { + RTW_INFO("%s: Repeat over limit for ext_header!!\n", __FUNCTION__); + return _FALSE; + } + } while (1); + + if (tmp_header != pg_header) { /* offset PG fail */ + RTW_ERR("%s: PG EXT Header Fail!!(pg=0x%02X read=0x%02X)\n", __FUNCTION__, pg_header, tmp_header); + return _FALSE; + } + + *pAddr = efuse_addr; + + return _TRUE; +} + + +static u8 hal_EfusePgPacketWrite1ByteHeader( + PADAPTER pAdapter, + u8 efuseType, + u16 *pAddr, + PPGPKT_STRUCT pTargetPkt, + u8 bPseudoTest) +{ + u8 bRet = _FALSE; + u8 pg_header = 0, tmp_header = 0; + u16 efuse_addr = *pAddr; + u8 repeatcnt = 0; + + + /* RTW_INFO("%s\n", __FUNCTION__); */ + pg_header = ((pTargetPkt->offset << 4) & 0xf0) | pTargetPkt->word_en; + + do { + rtw_efuse_bt_access(pAdapter, _TRUE, efuse_addr, 1, &pg_header); + rtw_efuse_bt_access(pAdapter, _FALSE, efuse_addr, 1, &tmp_header); + + if (tmp_header != 0xFF) + break; + if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) { + RTW_INFO("%s: Repeat over limit for pg_header!!\n", __FUNCTION__); + return _FALSE; + } + } while (1); + + if (tmp_header != pg_header) { + RTW_ERR("%s: PG Header Fail!!(pg=0x%02X read=0x%02X)\n", __FUNCTION__, pg_header, tmp_header); + return _FALSE; + } + + *pAddr = efuse_addr; + + return _TRUE; +} + +static u8 hal_EfusePgPacketWriteHeader( + PADAPTER padapter, + u8 efuseType, + u16 *pAddr, + PPGPKT_STRUCT pTargetPkt, + u8 bPseudoTest) +{ + u8 bRet = _FALSE; + + if (pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE) + bRet = hal_EfusePgPacketWrite2ByteHeader(padapter, efuseType, pAddr, pTargetPkt, bPseudoTest); + else + bRet = hal_EfusePgPacketWrite1ByteHeader(padapter, efuseType, pAddr, pTargetPkt, bPseudoTest); + + return bRet; +} + + +static u8 +Hal_EfuseWordEnableDataWrite( + PADAPTER padapter, + u16 efuse_addr, + u8 word_en, + u8 *data, + u8 bPseudoTest) +{ + u16 tmpaddr = 0; + u16 start_addr = efuse_addr; + u8 badworden = 0x0F; + u8 tmpdata[PGPKT_DATA_SIZE]; + + + /* RTW_INFO("%s: efuse_addr=%#x word_en=%#x\n", __FUNCTION__, efuse_addr, word_en); */ + _rtw_memset(tmpdata, 0xFF, PGPKT_DATA_SIZE); + + if (!(word_en & BIT(0))) { + tmpaddr = start_addr; + rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[0]); + rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[1]); + rtw_efuse_bt_access(padapter, _FALSE, tmpaddr, 1, &tmpdata[0]); + rtw_efuse_bt_access(padapter, _FALSE, tmpaddr + 1, 1, &tmpdata[1]); + if ((data[0] != tmpdata[0]) || (data[1] != tmpdata[1])) + badworden &= (~BIT(0)); + } + if (!(word_en & BIT(1))) { + tmpaddr = start_addr; + rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[2]); + rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[3]); + rtw_efuse_bt_access(padapter, _FALSE, tmpaddr, 1, &tmpdata[2]); + rtw_efuse_bt_access(padapter, _FALSE, tmpaddr + 1, 1, &tmpdata[3]); + if ((data[2] != tmpdata[2]) || (data[3] != tmpdata[3])) + badworden &= (~BIT(1)); + } + if (!(word_en & BIT(2))) { + tmpaddr = start_addr; + rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[4]); + rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[5]); + rtw_efuse_bt_access(padapter, _FALSE, tmpaddr, 1, &tmpdata[4]); + rtw_efuse_bt_access(padapter, _FALSE, tmpaddr + 1, 1, &tmpdata[5]); + if ((data[4] != tmpdata[4]) || (data[5] != tmpdata[5])) + badworden &= (~BIT(2)); + } + if (!(word_en & BIT(3))) { + tmpaddr = start_addr; + rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[6]); + rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[7]); + rtw_efuse_bt_access(padapter, _FALSE, tmpaddr, 1, &tmpdata[6]); + rtw_efuse_bt_access(padapter, _FALSE, tmpaddr + 1, 1, &tmpdata[7]); + + if ((data[6] != tmpdata[6]) || (data[7] != tmpdata[7])) + badworden &= (~BIT(3)); + } + + return badworden; +} + +static void +hal_EfuseConstructPGPkt( + u8 offset, + u8 word_en, + u8 *pData, + PPGPKT_STRUCT pTargetPkt) +{ + _rtw_memset(pTargetPkt->data, 0xFF, PGPKT_DATA_SIZE); + pTargetPkt->offset = offset; + pTargetPkt->word_en = word_en; + efuse_WordEnableDataRead(word_en, pData, pTargetPkt->data); + pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); +} + +static u8 +hal_EfusePgPacketWriteData( + PADAPTER pAdapter, + u8 efuseType, + u16 *pAddr, + PPGPKT_STRUCT pTargetPkt, + u8 bPseudoTest) +{ + u16 efuse_addr; + u8 badworden; + + efuse_addr = *pAddr; + badworden = Hal_EfuseWordEnableDataWrite(pAdapter, efuse_addr + 1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest); + if (badworden != 0x0F) { + RTW_INFO("%s: Fail!!\n", __FUNCTION__); + return _FALSE; + } + + /* RTW_INFO("%s: ok\n", __FUNCTION__); */ + return _TRUE; +} + +u8 EfusePgPacketWrite_BT( + PADAPTER pAdapter, + u8 offset, + u8 word_en, + u8 *pData, + u8 bPseudoTest) +{ + PGPKT_STRUCT targetPkt; + u16 startAddr = 0; + u8 efuseType = EFUSE_BT; + + hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt); + + if (!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if (!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if (!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + return _TRUE; +} + + +#else /* !RTW_HALMAC */ +/* ------------------------------------------------------------------------------ */ +#define REG_EFUSE_CTRL 0x0030 +#define EFUSE_CTRL REG_EFUSE_CTRL /* E-Fuse Control. */ +/* ------------------------------------------------------------------------------ */ + +BOOLEAN +Efuse_Read1ByteFromFakeContent( + IN PADAPTER pAdapter, + IN u16 Offset, + IN OUT u8 *Value); +BOOLEAN +Efuse_Read1ByteFromFakeContent( + IN PADAPTER pAdapter, + IN u16 Offset, + IN OUT u8 *Value) +{ + if (Offset >= EFUSE_MAX_HW_SIZE) + return _FALSE; + /* DbgPrint("Read fake content, offset = %d\n", Offset); */ + if (fakeEfuseBank == 0) *Value = fakeEfuseContent[Offset]; else - *Value = fakeBTEfuseContent[fakeEfuseBank-1][Offset]; + *Value = fakeBTEfuseContent[fakeEfuseBank - 1][Offset]; return _TRUE; } @@ -76,30 +1148,26 @@ BOOLEAN Efuse_Write1ByteToFakeContent( IN PADAPTER pAdapter, IN u16 Offset, - IN u8 Value ); + IN u8 Value); BOOLEAN Efuse_Write1ByteToFakeContent( IN PADAPTER pAdapter, IN u16 Offset, - IN u8 Value ) + IN u8 Value) { - if(Offset >= EFUSE_MAX_HW_SIZE) - { + if (Offset >= EFUSE_MAX_HW_SIZE) return _FALSE; - } - if(fakeEfuseBank == 0) + if (fakeEfuseBank == 0) fakeEfuseContent[Offset] = Value; else - { - fakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value; - } + fakeBTEfuseContent[fakeEfuseBank - 1][Offset] = Value; return _TRUE; } /*----------------------------------------------------------------------------- * Function: Efuse_PowerSwitch * - * Overview: When we want to enable write operation, we should change to + * Overview: When we want to enable write operation, we should change to * pwr on state. When we stop write, we should switch to 500k mode * and disable LDO 2.5V. * @@ -111,7 +1179,7 @@ Efuse_Write1ByteToFakeContent( * * Revised History: * When Who Remark - * 11/17/2008 MHC Create Version 0. + * 11/17/2008 MHC Create Version 0. * *---------------------------------------------------------------------------*/ VOID @@ -129,7 +1197,7 @@ BTEfuse_PowerSwitch( IN u8 bWrite, IN u8 PwrState) { - if(pAdapter->HalFunc.BTEfusePowerSwitch) + if (pAdapter->HalFunc.BTEfusePowerSwitch) pAdapter->HalFunc.BTEfusePowerSwitch(pAdapter, bWrite, PwrState); } @@ -146,7 +1214,7 @@ BTEfuse_PowerSwitch( * * Revised History: * When Who Remark - * 11/16/2008 MHC Create Version 0. + * 11/16/2008 MHC Create Version 0. * *---------------------------------------------------------------------------*/ u16 @@ -155,126 +1223,111 @@ Efuse_GetCurrentSize( IN u8 efuseType, IN BOOLEAN bPseudoTest) { - u16 ret=0; + u16 ret = 0; ret = pAdapter->HalFunc.EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest); return ret; } -/* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */ -u8 -Efuse_CalculateWordCnts(IN u8 word_en) -{ - u8 word_cnts = 0; - if(!(word_en & BIT(0))) word_cnts++; // 0 : write enable - if(!(word_en & BIT(1))) word_cnts++; - if(!(word_en & BIT(2))) word_cnts++; - if(!(word_en & BIT(3))) word_cnts++; - return word_cnts; -} - -// -// Description: -// Execute E-Fuse read byte operation. -// Refered from SD1 Richard. -// -// Assumption: -// 1. Boot from E-Fuse and successfully auto-load. -// 2. PASSIVE_LEVEL (USB interface) -// -// Created by Roger, 2008.10.21. -// +/* + * Description: + * Execute E-Fuse read byte operation. + * Refered from SD1 Richard. + * + * Assumption: + * 1. Boot from E-Fuse and successfully auto-load. + * 2. PASSIVE_LEVEL (USB interface) + * + * Created by Roger, 2008.10.21. + * */ VOID ReadEFuseByte( - PADAPTER Adapter, - u16 _offset, - u8 *pbuf, - IN BOOLEAN bPseudoTest) + PADAPTER Adapter, + u16 _offset, + u8 *pbuf, + IN BOOLEAN bPseudoTest) { u32 value32; u8 readbyte; u16 retry; - //u32 start=rtw_get_current_time(); + /* u32 start=rtw_get_current_time(); */ - if(bPseudoTest) - { + if (bPseudoTest) { Efuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf); return; } - if (IS_HARDWARE_TYPE_8723B(Adapter)) - { - // <20130121, Kordan> For SMIC S55 EFUSE specificatoin. - //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) + if (IS_HARDWARE_TYPE_8723B(Adapter)) { + /* <20130121, Kordan> For SMIC S55 EFUSE specificatoin. */ + /* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */ PHY_SetMacReg(Adapter, EFUSE_TEST, BIT11, 0); } - //Write Address - rtw_write8(Adapter, EFUSE_CTRL+1, (_offset & 0xff)); - readbyte = rtw_read8(Adapter, EFUSE_CTRL+2); - rtw_write8(Adapter, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc)); + /* Write Address */ + rtw_write8(Adapter, EFUSE_CTRL + 1, (_offset & 0xff)); + readbyte = rtw_read8(Adapter, EFUSE_CTRL + 2); + rtw_write8(Adapter, EFUSE_CTRL + 2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc)); - //Write bit 32 0 - readbyte = rtw_read8(Adapter, EFUSE_CTRL+3); - rtw_write8(Adapter, EFUSE_CTRL+3, (readbyte & 0x7f)); - - //Check bit 32 read-ready + /* Write bit 32 0 */ + readbyte = rtw_read8(Adapter, EFUSE_CTRL + 3); + rtw_write8(Adapter, EFUSE_CTRL + 3, (readbyte & 0x7f)); + + /* Check bit 32 read-ready */ retry = 0; value32 = rtw_read32(Adapter, EFUSE_CTRL); - //while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10)) - while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10000)) - { + /* while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10)) */ + while (!(((value32 >> 24) & 0xff) & 0x80) && (retry < 10000)) { value32 = rtw_read32(Adapter, EFUSE_CTRL); retry++; } - // 20100205 Joseph: Add delay suggested by SD1 Victor. - // This fix the problem that Efuse read error in high temperature condition. - // Designer says that there shall be some delay after ready bit is set, or the - // result will always stay on last data we read. + /* 20100205 Joseph: Add delay suggested by SD1 Victor. */ + /* This fix the problem that Efuse read error in high temperature condition. */ + /* Designer says that there shall be some delay after ready bit is set, or the */ + /* result will always stay on last data we read. */ rtw_udelay_os(50); value32 = rtw_read32(Adapter, EFUSE_CTRL); - + *pbuf = (u8)(value32 & 0xff); - //DBG_871X("ReadEFuseByte _offset:%08u, in %d ms\n",_offset ,rtw_get_passing_time_ms(start)); - + /* RTW_INFO("ReadEFuseByte _offset:%08u, in %d ms\n",_offset ,rtw_get_passing_time_ms(start)); */ + } -// -// Description: -// 1. Execute E-Fuse read byte operation according as map offset and -// save to E-Fuse table. -// 2. Refered from SD1 Richard. -// -// Assumption: -// 1. Boot from E-Fuse and successfully auto-load. -// 2. PASSIVE_LEVEL (USB interface) -// -// Created by Roger, 2008.10.21. -// -// 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description. -// 2. Add efuse utilization collect. -// 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1 -// write addr must be after sec5. -// +/* + * Description: + * 1. Execute E-Fuse read byte operation according as map offset and + * save to E-Fuse table. + * 2. Refered from SD1 Richard. + * + * Assumption: + * 1. Boot from E-Fuse and successfully auto-load. + * 2. PASSIVE_LEVEL (USB interface) + * + * Created by Roger, 2008.10.21. + * + * 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description. + * 2. Add efuse utilization collect. + * 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1 + * write addr must be after sec5. + * */ VOID efuse_ReadEFuse( PADAPTER Adapter, u8 efuseType, u16 _offset, - u16 _size_byte, - u8 *pbuf, + u16 _size_byte, + u8 *pbuf, IN BOOLEAN bPseudoTest - ); +); VOID efuse_ReadEFuse( PADAPTER Adapter, u8 efuseType, u16 _offset, - u16 _size_byte, - u8 *pbuf, + u16 _size_byte, + u8 *pbuf, IN BOOLEAN bPseudoTest - ) +) { Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest); } @@ -286,7 +1339,7 @@ EFUSE_GetEfuseDefinition( IN u8 type, OUT void *pOut, IN BOOLEAN bPseudoTest - ) +) { pAdapter->HalFunc.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, bPseudoTest); } @@ -304,56 +1357,52 @@ EFUSE_GetEfuseDefinition( * * Revised History: * When Who Remark - * 09/23/2008 MHC Copy from WMAC. + * 09/23/2008 MHC Copy from WMAC. * *---------------------------------------------------------------------------*/ u8 -EFUSE_Read1Byte( - IN PADAPTER Adapter, +EFUSE_Read1Byte( + IN PADAPTER Adapter, IN u16 Address) { u8 data; u8 Bytetemp = {0x00}; u8 temp = {0x00}; - u32 k=0; - u16 contentLen=0; + u32 k = 0; + u16 contentLen = 0; EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE); - if (Address < contentLen) //E-fuse 512Byte - { - //Write E-fuse Register address bit0~7 - temp = Address & 0xFF; - rtw_write8(Adapter, EFUSE_CTRL+1, temp); - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2); - //Write E-fuse Register address bit8~9 - temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); - rtw_write8(Adapter, EFUSE_CTRL+2, temp); + if (Address < contentLen) { /* E-fuse 512Byte */ + /* Write E-fuse Register address bit0~7 */ + temp = Address & 0xFF; + rtw_write8(Adapter, EFUSE_CTRL + 1, temp); + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 2); + /* Write E-fuse Register address bit8~9 */ + temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); + rtw_write8(Adapter, EFUSE_CTRL + 2, temp); - //Write 0x30[31]=0 - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + /* Write 0x30[31]=0 */ + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 3); temp = Bytetemp & 0x7F; - rtw_write8(Adapter, EFUSE_CTRL+3, temp); + rtw_write8(Adapter, EFUSE_CTRL + 3, temp); - //Wait Write-ready (0x30[31]=1) - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); - while(!(Bytetemp & 0x80)) - { - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + /* Wait Write-ready (0x30[31]=1) */ + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 3); + while (!(Bytetemp & 0x80)) { + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 3); k++; - if(k==1000) - { - k=0; + if (k == 1000) { + k = 0; break; } } - data=rtw_read8(Adapter, EFUSE_CTRL); + data = rtw_read8(Adapter, EFUSE_CTRL); return data; - } - else + } else return 0xFF; - -}/* EFUSE_Read1Byte */ + +} /* EFUSE_Read1Byte */ /*----------------------------------------------------------------------------- * Function: EFUSE_Write1Byte @@ -368,67 +1417,63 @@ EFUSE_Read1Byte( * * Revised History: * When Who Remark - * 09/23/2008 MHC Copy from WMAC. + * 09/23/2008 MHC Copy from WMAC. * *---------------------------------------------------------------------------*/ -void -EFUSE_Write1Byte( - IN PADAPTER Adapter, +void +EFUSE_Write1Byte( + IN PADAPTER Adapter, IN u16 Address, IN u8 Value); -void -EFUSE_Write1Byte( - IN PADAPTER Adapter, +void +EFUSE_Write1Byte( + IN PADAPTER Adapter, IN u16 Address, IN u8 Value) { u8 Bytetemp = {0x00}; u8 temp = {0x00}; - u32 k=0; - u16 contentLen=0; + u32 k = 0; + u16 contentLen = 0; - //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr=%x Data =%x\n", Address, Value)); EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE); - if( Address < contentLen) //E-fuse 512Byte - { + if (Address < contentLen) { /* E-fuse 512Byte */ rtw_write8(Adapter, EFUSE_CTRL, Value); - //Write E-fuse Register address bit0~7 - temp = Address & 0xFF; - rtw_write8(Adapter, EFUSE_CTRL+1, temp); - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2); - - //Write E-fuse Register address bit8~9 - temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); - rtw_write8(Adapter, EFUSE_CTRL+2, temp); + /* Write E-fuse Register address bit0~7 */ + temp = Address & 0xFF; + rtw_write8(Adapter, EFUSE_CTRL + 1, temp); + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 2); - //Write 0x30[31]=1 - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + /* Write E-fuse Register address bit8~9 */ + temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); + rtw_write8(Adapter, EFUSE_CTRL + 2, temp); + + /* Write 0x30[31]=1 */ + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 3); temp = Bytetemp | 0x80; - rtw_write8(Adapter, EFUSE_CTRL+3, temp); + rtw_write8(Adapter, EFUSE_CTRL + 3, temp); - //Wait Write-ready (0x30[31]=0) - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); - while(Bytetemp & 0x80) - { - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + /* Wait Write-ready (0x30[31]=0) */ + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 3); + while (Bytetemp & 0x80) { + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL + 3); k++; - if(k==100) - { - k=0; + if (k == 100) { + k = 0; break; } } } -}/* EFUSE_Write1Byte */ +} /* EFUSE_Write1Byte */ /* 11/16/2008 MH Read one byte from real Efuse. */ u8 efuse_OneByteRead( - IN PADAPTER pAdapter, + IN PADAPTER pAdapter, IN u16 addr, IN u8 *data, IN BOOLEAN bPseudoTest) @@ -437,154 +1482,143 @@ efuse_OneByteRead( 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)); - if(bPseudoTest) - { + /* RTW_INFO("===> EFUSE_OneByteRead(), addr = %x\n", addr); */ + /* RTW_INFO("===> EFUSE_OneByteRead() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST)); */ + + if (bPseudoTest) { bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data); return bResult; } - - if( IS_HARDWARE_TYPE_8723B(pAdapter) || - (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || - (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID)) - ) - { - // <20130121, Kordan> For SMIC EFUSE specificatoin. - //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) - //PHY_SetMacReg(pAdapter, 0x34, BIT11, 0); - rtw_write16(pAdapter, 0x34, rtw_read16(pAdapter,0x34)& (~BIT11) ); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || + (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || + (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID)) + ) { + /* <20130121, Kordan> For SMIC EFUSE specificatoin. */ + /* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */ + /* PHY_SetMacReg(pAdapter, 0x34, BIT11, 0); */ + rtw_write16(pAdapter, 0x34, rtw_read16(pAdapter, 0x34) & (~BIT11)); } - // -----------------e-fuse reg ctrl --------------------------------- - //address - rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff)); - rtw_write8(pAdapter, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) | - (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC )); + /* -----------------e-fuse reg ctrl --------------------------------- */ + /* address */ + rtw_write8(pAdapter, EFUSE_CTRL + 1, (u8)(addr & 0xff)); + rtw_write8(pAdapter, EFUSE_CTRL + 2, ((u8)((addr >> 8) & 0x03)) | + (rtw_read8(pAdapter, EFUSE_CTRL + 2) & 0xFC)); - //rtw_write8(pAdapter, EFUSE_CTRL+3, 0x72);//read cmd - //Write bit 32 0 - readbyte = rtw_read8(pAdapter, EFUSE_CTRL+3); - rtw_write8(pAdapter, EFUSE_CTRL+3, (readbyte & 0x7f)); + /* rtw_write8(pAdapter, EFUSE_CTRL+3, 0x72); */ /* read cmd */ + /* Write bit 32 0 */ + readbyte = rtw_read8(pAdapter, EFUSE_CTRL + 3); + rtw_write8(pAdapter, EFUSE_CTRL + 3, (readbyte & 0x7f)); - while(!(0x80 &rtw_read8(pAdapter, EFUSE_CTRL+3))&&(tmpidx<1000)) - { + while (!(0x80 & rtw_read8(pAdapter, EFUSE_CTRL + 3)) && (tmpidx < 1000)) { rtw_mdelay_os(1); tmpidx++; } - if(tmpidx<100) - { - *data=rtw_read8(pAdapter, EFUSE_CTRL); + if (tmpidx < 100) { + *data = rtw_read8(pAdapter, EFUSE_CTRL); bResult = _TRUE; - } - else - { - *data = 0xff; + } else { + *data = 0xff; bResult = _FALSE; - DBG_871X("%s: [ERROR] addr=0x%x bResult=%d time out 1s !!!\n", __FUNCTION__, addr, bResult); - DBG_871X("%s: [ERROR] EFUSE_CTRL =0x%08x !!!\n", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL)); + RTW_INFO("%s: [ERROR] addr=0x%x bResult=%d time out 1s !!!\n", __FUNCTION__, addr, bResult); + RTW_INFO("%s: [ERROR] EFUSE_CTRL =0x%08x !!!\n", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL)); } return bResult; } - + /* 11/16/2008 MH Write one byte to reald Efuse. */ u8 efuse_OneByteWrite( - IN PADAPTER pAdapter, - IN u16 addr, + IN PADAPTER pAdapter, + IN u16 addr, IN u8 data, IN BOOLEAN bPseudoTest) { u8 tmpidx = 0; - u8 bResult=_FALSE; + 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)); - if(bPseudoTest) - { + /* RTW_INFO("===> EFUSE_OneByteWrite(), addr = %x data=%x\n", addr, data); */ + /* RTW_INFO("===> EFUSE_OneByteWrite() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST)); */ + + if (bPseudoTest) { bResult = Efuse_Write1ByteToFakeContent(pAdapter, addr, data); return bResult; } + Efuse_PowerSwitch(pAdapter, _TRUE, _TRUE); + + /* -----------------e-fuse reg ctrl --------------------------------- */ + /* address */ - // -----------------e-fuse reg ctrl --------------------------------- - //address - efuseValue = rtw_read32(pAdapter, EFUSE_CTRL); - efuseValue |= (BIT21|BIT31); + efuseValue |= (BIT21 | BIT31); efuseValue &= ~(0x3FFFF); - efuseValue |= ((addr<<8 | data) & 0x3FFFF); + efuseValue |= ((addr << 8 | data) & 0x3FFFF); - // <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_A_CUT(pHalData->VersionID))) || - (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID)) - ) { - // <20130121, Kordan> For SMIC EFUSE specificatoin. - //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) - //PHY_SetMacReg(pAdapter, 0x34, BIT11, 1); - rtw_write16(pAdapter, 0x34, rtw_read16(pAdapter,0x34)| (BIT11) ); - rtw_write32(pAdapter, EFUSE_CTRL, 0x90600000|((addr<<8 | data)) ); - } - else - { + /* <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_A_CUT(pHalData->VersionID))) || + (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID)) + ) { + /* <20130121, Kordan> For SMIC EFUSE specificatoin. */ + /* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */ + /* PHY_SetMacReg(pAdapter, 0x34, BIT11, 1); */ + rtw_write16(pAdapter, 0x34, rtw_read16(pAdapter, 0x34) | (BIT11)); + rtw_write32(pAdapter, EFUSE_CTRL, 0x90600000 | ((addr << 8 | data))); + } else rtw_write32(pAdapter, EFUSE_CTRL, efuseValue); - } - while((0x80 & rtw_read8(pAdapter, EFUSE_CTRL+3)) && (tmpidx<100) ){ + while ((0x80 & rtw_read8(pAdapter, EFUSE_CTRL + 3)) && (tmpidx < 100)) { rtw_mdelay_os(1); tmpidx++; } - if(tmpidx<100) - { + if (tmpidx < 100) bResult = _TRUE; - } - else - { + else { bResult = _FALSE; - DBG_871X("%s: [ERROR] addr=0x%x ,efuseValue=0x%x ,bResult=%d time out 1s !!! \n", - __FUNCTION__, addr, efuseValue, bResult); - DBG_871X("%s: [ERROR] EFUSE_CTRL =0x%08x !!!\n", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL)); + RTW_INFO("%s: [ERROR] addr=0x%x ,efuseValue=0x%x ,bResult=%d time out 1s !!!\n", + __FUNCTION__, addr, efuseValue, bResult); + RTW_INFO("%s: [ERROR] EFUSE_CTRL =0x%08x !!!\n", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL)); } - // disable Efuse program enable - if ( IS_HARDWARE_TYPE_8723B(pAdapter) || - (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || - (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID)) - ) { + /* disable Efuse program enable */ + if (IS_HARDWARE_TYPE_8723B(pAdapter) || + (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || + (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID)) + ) PHY_SetMacReg(pAdapter, EFUSE_TEST, BIT(11), 0); - } + + Efuse_PowerSwitch(pAdapter, _TRUE, _FALSE); return bResult; } int -Efuse_PgPacketRead( IN PADAPTER pAdapter, - IN u8 offset, - IN u8 *data, - IN BOOLEAN bPseudoTest) +Efuse_PgPacketRead(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) { - int ret=0; + int ret = 0; ret = pAdapter->HalFunc.Efuse_PgPacketRead(pAdapter, offset, data, bPseudoTest); return ret; } -int -Efuse_PgPacketWrite(IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) +int +Efuse_PgPacketWrite(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) { int ret; @@ -594,12 +1628,12 @@ Efuse_PgPacketWrite(IN PADAPTER pAdapter, } -int -Efuse_PgPacketWrite_BT(IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) +int +Efuse_PgPacketWrite_BT(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) { int ret; @@ -608,73 +1642,29 @@ Efuse_PgPacketWrite_BT(IN PADAPTER pAdapter, return ret; } -/*----------------------------------------------------------------------------- - * Function: efuse_WordEnableDataRead - * - * Overview: Read allowed word in current efuse section data. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/16/2008 MHC Create Version 0. - * 11/21/2008 MHC Fix Write bug when we only enable late word. - * - *---------------------------------------------------------------------------*/ -void -efuse_WordEnableDataRead(IN u8 word_en, - IN u8 *sourdata, - IN u8 *targetdata) -{ - if (!(word_en&BIT(0))) - { - targetdata[0] = sourdata[0]; - targetdata[1] = sourdata[1]; - } - if (!(word_en&BIT(1))) - { - targetdata[2] = sourdata[2]; - targetdata[3] = sourdata[3]; - } - if (!(word_en&BIT(2))) - { - targetdata[4] = sourdata[4]; - targetdata[5] = sourdata[5]; - } - if (!(word_en&BIT(3))) - { - targetdata[6] = sourdata[6]; - targetdata[7] = sourdata[7]; - } -} - u8 -Efuse_WordEnableDataWrite( IN PADAPTER pAdapter, - IN u16 efuse_addr, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) +Efuse_WordEnableDataWrite(IN PADAPTER pAdapter, + IN u16 efuse_addr, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) { - u8 ret=0; + u8 ret = 0; ret = pAdapter->HalFunc.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest); - + return ret; } static u8 efuse_read8(PADAPTER padapter, u16 address, u8 *value) { - return efuse_OneByteRead(padapter,address, value, _FALSE); + return efuse_OneByteRead(padapter, address, value, _FALSE); } static u8 efuse_write8(PADAPTER padapter, u16 address, u8 *value) { - return efuse_OneByteWrite(padapter,address, *value, _FALSE); + return efuse_OneByteWrite(padapter, address, *value, _FALSE); } /* @@ -685,7 +1675,7 @@ u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 * int i = 0; u16 real_content_len = 0, max_available_size = 0; u8 res = _FAIL ; - u8 (*rw8)(PADAPTER, u16, u8*); + u8(*rw8)(PADAPTER, u16, u8 *); EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&real_content_len, _FALSE); EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); @@ -702,7 +1692,7 @@ u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 * Efuse_PowerSwitch(padapter, bWrite, _TRUE); - // e-fuse one byte read / write + /* e-fuse one byte read / write */ for (i = 0; i < cnts; i++) { if (start_addr >= real_content_len) { res = _FAIL; @@ -710,14 +1700,15 @@ u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 * } res = rw8(padapter, start_addr++, data++); - if (_FAIL == res) break; + if (_FAIL == res) + break; } Efuse_PowerSwitch(padapter, bWrite, _FALSE); return res; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ u16 efuse_GetMaxSize(PADAPTER padapter) { u16 max_size; @@ -726,7 +1717,7 @@ u16 efuse_GetMaxSize(PADAPTER padapter) EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE); return max_size; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size) { Efuse_PowerSwitch(padapter, _FALSE, _TRUE); @@ -735,10 +1726,28 @@ u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size) return _SUCCESS; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ +u16 efuse_bt_GetMaxSize(PADAPTER padapter) +{ + u16 max_size; + + max_size = 0; + EFUSE_GetEfuseDefinition(padapter, EFUSE_BT , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE); + return max_size; +} + +u8 efuse_bt_GetCurrentSize(PADAPTER padapter, u16 *size) +{ + Efuse_PowerSwitch(padapter, _FALSE, _TRUE); + *size = Efuse_GetCurrentSize(padapter, EFUSE_BT, _FALSE); + Efuse_PowerSwitch(padapter, _FALSE, _FALSE); + + return _SUCCESS; +} + u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { - u16 mapLen=0; + u16 mapLen = 0; EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); @@ -756,7 +1765,7 @@ u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) u8 rtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { - u16 mapLen=0; + u16 mapLen = 0; EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); @@ -772,171 +1781,13 @@ 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_retrieve_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_RTL8703B) - if (IS_HARDWARE_TYPE_8703B(pAdapter)) - return (IS_MASKED(8703B, _MUSB, Offset)) ? TRUE : FALSE; -#endif -#if defined(CONFIG_RTL8814A) - if (IS_HARDWARE_TYPE_8814A(pAdapter)) - return (IS_MASKED(8814A, _MUSB, Offset)) ? TRUE : FALSE; -#endif -#if defined(CONFIG_RTL8188F) - if (IS_HARDWARE_TYPE_8188F(pAdapter)) - return (IS_MASKED(8188F, _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 -#ifdef CONFIG_RTL8188F_SDIO - if (IS_HARDWARE_TYPE_8188F(pAdapter)) - return (IS_MASKED(8188F, _MSDIO, Offset)) ? TRUE : FALSE; -#endif -#endif - - return FALSE; -} - -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { #define RT_ASSERT_RET(expr) \ - if(!(expr)) { \ - printk( "Assertion failed! %s at ......\n", #expr); \ - printk( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ + if (!(expr)) { \ + printk("Assertion failed! %s at ......\n", #expr); \ + printk(" ......%s,%s, line=%d\n",__FILE__, __FUNCTION__, __LINE__); \ return _FAIL; \ } @@ -945,7 +1796,7 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) u8 newdata[PGPKT_DATA_SIZE]; s32 i, j, idx; u8 ret = _SUCCESS; - u16 mapLen=0; + u16 mapLen = 0; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); @@ -953,83 +1804,71 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) if ((addr + cnts) > mapLen) return _FAIL; - RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); // have to be 8 byte alignment - RT_ASSERT_RET((mapLen & 0x7) == 0); // have to be PGPKT_DATA_SIZE alignment for memcpy + RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); /* have to be 8 byte alignment */ + RT_ASSERT_RET((mapLen & 0x7) == 0); /* have to be PGPKT_DATA_SIZE alignment for memcpy */ map = rtw_zmalloc(mapLen); - if(map == NULL){ + if (map == NULL) return _FAIL; - } - - _rtw_memset(map, 0xFF, mapLen); - - 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]; + _rtw_memset(map, 0xFF, mapLen); + + 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]; } - 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]); + RTW_INFO("%s , data[%d] = %x, map[addr+i]= %x\n", __func__, i, data[i], map[addr + i]); } } - Efuse_PowerSwitch(padapter, _TRUE, _TRUE); + /*Efuse_PowerSwitch(padapter, _TRUE, _TRUE);*/ idx = 0; offset = (addr >> 3); - while (idx < cnts) - { + while (idx < cnts) { word_en = 0xF; j = (addr + idx) & 0x7; _rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE); - for (i = j; i> 1); newdata[i] = data[idx]; -#ifdef CONFIG_RTL8723B - if( addr + idx == 0x8) - { - if (IS_C_CUT(pHalData->VersionID) || IS_B_CUT(pHalData->VersionID)) - { - if(pHalData->adjuseVoltageVal == 6) - { - newdata[i] = map[addr + idx]; - DBG_8192C(" %s ,\n adjuseVoltageVal = %d ,newdata[%d] = %x \n",__func__,pHalData->adjuseVoltageVal,i,newdata[i]); +#ifdef CONFIG_RTL8723B + if (addr + idx == 0x8) { + if (IS_C_CUT(pHalData->VersionID) || IS_B_CUT(pHalData->VersionID)) { + if (pHalData->adjuseVoltageVal == 6) { + newdata[i] = map[addr + idx]; + RTW_INFO(" %s ,\n adjuseVoltageVal = %d ,newdata[%d] = %x\n", __func__, pHalData->adjuseVoltageVal, i, newdata[i]); } } - } + } #endif } } if (word_en != 0xF) { ret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, _FALSE); - DBG_871X("offset=%x \n",offset); - DBG_871X("word_en=%x \n",word_en); + RTW_INFO("offset=%x\n", offset); + RTW_INFO("word_en=%x\n", word_en); - for(i=0;iregistrypriv.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]);*/ - } + 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 { + /*RTW_INFO(" %s , data[%d] = %x\n", __func__, i, data[i]);*/ + if (efuse_IsMasked(padapter, addr + i)) { + data[i] = 0xff; + /*RTW_INFO(" %s ,mask data[%d] = %x\n", __func__, i, data[i]);*/ } } - + } + } return ret; @@ -1070,77 +1909,70 @@ u8 rtw_efuse_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) u8 rtw_BT_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { #define RT_ASSERT_RET(expr) \ - if(!(expr)) { \ - printk( "Assertion failed! %s at ......\n", #expr); \ - printk( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ + if (!(expr)) { \ + printk("Assertion failed! %s at ......\n", #expr); \ + printk(" ......%s,%s, line=%d\n",__FILE__, __FUNCTION__, __LINE__); \ return _FAIL; \ } u8 offset, word_en; u8 *map; u8 newdata[PGPKT_DATA_SIZE]; - s32 i=0, j=0, idx; + s32 i = 0, j = 0, idx; u8 ret = _SUCCESS; - u16 mapLen=0; + u16 mapLen = 0; EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); if ((addr + cnts) > mapLen) return _FAIL; - RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); // have to be 8 byte alignment - RT_ASSERT_RET((mapLen & 0x7) == 0); // have to be PGPKT_DATA_SIZE alignment for memcpy + RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); /* have to be 8 byte alignment */ + RT_ASSERT_RET((mapLen & 0x7) == 0); /* have to be PGPKT_DATA_SIZE alignment for memcpy */ map = rtw_zmalloc(mapLen); - if(map == NULL){ + if (map == NULL) return _FAIL; - } ret = rtw_BT_efuse_map_read(padapter, 0, mapLen, map); - if (ret == _FAIL) goto exit; - DBG_871X("OFFSET\tVALUE(hex)\n"); - for (i=0; i<1024; i+=16) // set 512 because the iwpriv's extra size have limit 0x7FF - { - DBG_871X("0x%03x\t", i); - for (j=0; j<8; j++) { - DBG_871X("%02X ", map[i+j]); - } - DBG_871X("\t"); - for (; j<16; j++) { - DBG_871X("%02X ", map[i+j]); - } - DBG_871X("\n"); + if (ret == _FAIL) + goto exit; + RTW_INFO("OFFSET\tVALUE(hex)\n"); + for (i = 0; i < 1024; i += 16) { /* set 512 because the iwpriv's extra size have limit 0x7FF */ + RTW_INFO("0x%03x\t", i); + for (j = 0; j < 8; j++) + RTW_INFO("%02X ", map[i + j]); + RTW_INFO("\t"); + for (; j < 16; j++) + RTW_INFO("%02X ", map[i + j]); + RTW_INFO("\n"); } - DBG_871X("\n"); + RTW_INFO("\n"); Efuse_PowerSwitch(padapter, _TRUE, _TRUE); idx = 0; offset = (addr >> 3); - while (idx < cnts) - { + while (idx < cnts) { word_en = 0xF; j = (addr + idx) & 0x7; _rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE); - for (i = j; i> 1); newdata[i] = data[idx]; } } if (word_en != 0xF) { - DBG_871X("offset=%x \n",offset); - DBG_871X("word_en=%x \n",word_en); - DBG_871X("%s: data=", __FUNCTION__); - for(i=0;iefuse_eeprom_data[Offset]; -} // EFUSE_ShadowRead1Byte +} /* EFUSE_ShadowRead1Byte */ -//---------------Read Two Bytes +/* ---------------Read Two Bytes */ static VOID efuse_ShadowRead2Byte( IN PADAPTER pAdapter, @@ -1235,11 +2067,11 @@ efuse_ShadowRead2Byte( PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); *Value = pHalData->efuse_eeprom_data[Offset]; - *Value |= pHalData->efuse_eeprom_data[Offset+1]<<8; + *Value |= pHalData->efuse_eeprom_data[Offset + 1] << 8; -} // EFUSE_ShadowRead2Byte +} /* EFUSE_ShadowRead2Byte */ -//---------------Read Four Bytes +/* ---------------Read Four Bytes */ static VOID efuse_ShadowRead4Byte( IN PADAPTER pAdapter, @@ -1249,11 +2081,11 @@ efuse_ShadowRead4Byte( PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); *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; + *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 +} /* efuse_ShadowRead4Byte */ /*----------------------------------------------------------------------------- @@ -1271,7 +2103,7 @@ efuse_ShadowRead4Byte( * * Revised History: * When Who Remark - * 11/12/2008 MHC Create Version 0. + * 11/12/2008 MHC Create Version 0. * *---------------------------------------------------------------------------*/ #ifdef PLATFORM @@ -1279,37 +2111,37 @@ static VOID efuse_ShadowWrite1Byte( IN PADAPTER pAdapter, IN u16 Offset, - IN u8 Value); -#endif //PLATFORM + IN u8 Value); +#endif /* PLATFORM */ static VOID efuse_ShadowWrite1Byte( IN PADAPTER pAdapter, IN u16 Offset, - IN u8 Value) + IN u8 Value) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); pHalData->efuse_eeprom_data[Offset] = Value; -} // efuse_ShadowWrite1Byte +} /* efuse_ShadowWrite1Byte */ -//---------------Write Two Bytes +/* ---------------Write Two Bytes */ static VOID efuse_ShadowWrite2Byte( IN PADAPTER pAdapter, IN u16 Offset, - IN u16 Value) + IN u16 Value) { - + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - - pHalData->efuse_eeprom_data[Offset] = Value&0x00FF; - pHalData->efuse_eeprom_data[Offset+1] = Value>>8; -} // efuse_ShadowWrite1Byte + pHalData->efuse_eeprom_data[Offset] = Value & 0x00FF; + pHalData->efuse_eeprom_data[Offset + 1] = Value >> 8; -//---------------Write Four Bytes +} /* efuse_ShadowWrite1Byte */ + +/* ---------------Write Four Bytes */ static VOID efuse_ShadowWrite4Byte( IN PADAPTER pAdapter, @@ -1318,60 +2150,12 @@ efuse_ShadowWrite4Byte( { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - 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); + 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 - -/*----------------------------------------------------------------------------- - * Function: EFUSE_ShadowMapUpdate - * - * Overview: Transfer current EFUSE content to shadow init and modify map. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/13/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -void EFUSE_ShadowMapUpdate( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN BOOLEAN bPseudoTest) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - u16 mapLen=0; - - EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest); - - if (pHalData->bautoload_fail_flag == _TRUE) - { - _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, pHalData->efuse_eeprom_data)) { - #endif - - Efuse_ReadAllMap(pAdapter, efuseType, pHalData->efuse_eeprom_data, bPseudoTest); - - #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE - storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data); - } - #endif - } - - //PlatformMoveMemory((PVOID)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0], - //(PVOID)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen); -}// EFUSE_ShadowMapUpdate +} /* efuse_ShadowWrite1Byte */ /*----------------------------------------------------------------------------- @@ -1387,7 +2171,7 @@ void EFUSE_ShadowMapUpdate( * * Revised History: * When Who Remark - * 11/12/2008 MHC Create Version 0. + * 11/12/2008 MHC Create Version 0. * *---------------------------------------------------------------------------*/ void @@ -1395,7 +2179,7 @@ EFUSE_ShadowRead( IN PADAPTER pAdapter, IN u8 Type, IN u16 Offset, - IN OUT u32 *Value ) + IN OUT u32 *Value) { if (Type == 1) efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value); @@ -1403,8 +2187,8 @@ EFUSE_ShadowRead( efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value); else if (Type == 4) efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value); - -} // EFUSE_ShadowRead + +} /* EFUSE_ShadowRead */ /*----------------------------------------------------------------------------- * Function: EFUSE_ShadowWrite @@ -1419,7 +2203,7 @@ EFUSE_ShadowRead( * * Revised History: * When Who Remark - * 11/12/2008 MHC Create Version 0. + * 11/12/2008 MHC Create Version 0. * *---------------------------------------------------------------------------*/ VOID @@ -1438,7 +2222,7 @@ EFUSE_ShadowWrite( #if (MP_DRIVER == 0) return; #endif - if ( pAdapter->registrypriv.mp_mode == 0) + if (pAdapter->registrypriv.mp_mode == 0) return; @@ -1449,95 +2233,310 @@ EFUSE_ShadowWrite( else if (Type == 4) efuse_ShadowWrite4Byte(pAdapter, Offset, (u32)Value); -} // EFUSE_ShadowWrite +} /* EFUSE_ShadowWrite */ VOID Efuse_InitSomeVar( IN PADAPTER pAdapter - ); +); VOID Efuse_InitSomeVar( IN PADAPTER pAdapter - ) +) { u8 i; - + _rtw_memset((PVOID)&fakeEfuseContent[0], 0xff, EFUSE_MAX_HW_SIZE); _rtw_memset((PVOID)&fakeEfuseInitMap[0], 0xff, EFUSE_MAX_MAP_LEN); _rtw_memset((PVOID)&fakeEfuseModifiedMap[0], 0xff, EFUSE_MAX_MAP_LEN); - for(i=0; iefuse_eeprom_data; + /* efuse default content is 0xFF */ + _rtw_memset(efuse_map, 0xFF, EEPROM_MAX_SIZE); + + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest); + if (!mapLen) { + RTW_WARN("%s: fail to get efuse size!\n", __FUNCTION__); + mapLen = EEPROM_MAX_SIZE; + } + if (mapLen > EEPROM_MAX_SIZE) { + RTW_WARN("%s: size of efuse data(%d) is large than expected(%d)!\n", + __FUNCTION__, mapLen, EEPROM_MAX_SIZE); + mapLen = EEPROM_MAX_SIZE; + } + + if (pHalData->bautoload_fail_flag == _FALSE) { + err = rtw_halmac_read_logical_efuse_map(adapter_to_dvobj(pAdapter), efuse_map, mapLen); + if (err) + RTW_ERR("%s: fail to get efuse map!\n", __FUNCTION__); + } +#else /* !RTW_HALMAC */ + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest); + + if (pHalData->bautoload_fail_flag == _TRUE) + _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, pHalData->efuse_eeprom_data)) { +#endif + + Efuse_ReadAllMap(pAdapter, efuseType, pHalData->efuse_eeprom_data, bPseudoTest); + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data); + } +#endif + } + + /* PlatformMoveMemory((PVOID)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0], */ + /* (PVOID)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen); */ +#endif /* !RTW_HALMAC */ + + rtw_dump_cur_efuse(pAdapter); +} /* EFUSE_ShadowMapUpdate */ + +const u8 _mac_hidden_max_bw_to_hal_bw_cap[MAC_HIDDEN_MAX_BW_NUM] = { + 0, + 0, + (BW_CAP_160M | BW_CAP_80M | BW_CAP_40M | BW_CAP_20M | BW_CAP_10M | BW_CAP_5M), + (BW_CAP_5M), + (BW_CAP_10M | BW_CAP_5M), + (BW_CAP_20M | BW_CAP_10M | BW_CAP_5M), + (BW_CAP_40M | BW_CAP_20M | BW_CAP_10M | BW_CAP_5M), + (BW_CAP_80M | BW_CAP_40M | BW_CAP_20M | BW_CAP_10M | BW_CAP_5M), +}; + +const u8 _mac_hidden_proto_to_hal_proto_cap[MAC_HIDDEN_PROTOCOL_NUM] = { + 0, + 0, + (PROTO_CAP_11N | PROTO_CAP_11G | PROTO_CAP_11B), + (PROTO_CAP_11AC | PROTO_CAP_11N | PROTO_CAP_11G | PROTO_CAP_11B), +}; + +u8 mac_hidden_wl_func_to_hal_wl_func(u8 func) +{ + u8 wl_func = 0; + + if (func & BIT0) + wl_func |= WL_FUNC_MIRACAST; + if (func & BIT1) + wl_func |= WL_FUNC_P2P; + if (func & BIT2) + wl_func |= WL_FUNC_TDLS; + if (func & BIT3) + wl_func |= WL_FUNC_FTM; + + return wl_func; +} #ifdef PLATFORM_LINUX #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE -//#include +/* #include */ - int isAdaptorInfoFileValid(void) +int isAdaptorInfoFileValid(void) { return _TRUE; } -int storeAdaptorInfoFile(char *path, u8* efuse_data) +int storeAdaptorInfoFile(char *path, u8 *efuse_data) { - int ret =_SUCCESS; + int ret = _SUCCESS; - if(path && efuse_data) { + if (path && efuse_data) { ret = rtw_store_to_file(path, efuse_data, EEPROM_MAX_SIZE_512); - if(ret == EEPROM_MAX_SIZE) + if (ret == EEPROM_MAX_SIZE) ret = _SUCCESS; else ret = _FAIL; } else { - DBG_871X("%s NULL pointer\n",__FUNCTION__); + RTW_INFO("%s NULL pointer\n", __FUNCTION__); ret = _FAIL; } return ret; } -int retriveAdaptorInfoFile(char *path, u8* efuse_data) +int retriveAdaptorInfoFile(char *path, u8 *efuse_data) { int ret = _SUCCESS; mm_segment_t oldfs; struct file *fp; - - if(path && efuse_data) { + + if (path && efuse_data) { ret = rtw_retrieve_from_file(path, efuse_data, EEPROM_MAX_SIZE); - - if(ret == EEPROM_MAX_SIZE) + + if (ret == EEPROM_MAX_SIZE) ret = _SUCCESS; else ret = _FAIL; - #if 0 - if(isAdaptorInfoFileValid()) { +#if 0 + if (isAdaptorInfoFileValid()) return 0; - } else { + else return _FAIL; - } - #endif - +#endif + } else { - DBG_871X("%s NULL pointer\n",__FUNCTION__); + RTW_INFO("%s NULL pointer\n", __FUNCTION__); ret = _FAIL; } return ret; } #endif /* CONFIG_ADAPTOR_INFO_CACHING_FILE */ +u8 rtw_efuse_file_read(PADAPTER padapter, u8 *filepatch, u8 *buf, u32 len) +{ + char *ptmpbuf = NULL, *ptr; + u8 val8; + u32 count, i, j; + int err; + u32 bufsize = 4096; + + ptmpbuf = rtw_zmalloc(bufsize); + if (ptmpbuf == NULL) + return _FALSE; + + count = rtw_retrieve_from_file(filepatch, ptmpbuf, bufsize); + if (count <= 100) { + rtw_mfree(ptmpbuf, bufsize); + RTW_ERR("%s, filepatch %s, size=%d, FAIL!!\n", __FUNCTION__, filepatch, count); + return _FALSE; + } + + i = 0; + j = 0; + ptr = ptmpbuf; + while ((j < len) && (i < count)) { + if (ptmpbuf[i] == '\0') + break; + + ptr = strpbrk(&ptmpbuf[i], " \t\n\r"); + if (ptr) { + if (ptr == &ptmpbuf[i]) { + i++; + continue; + } + + /* Add string terminating null */ + *ptr = 0; + } else { + ptr = &ptmpbuf[count-1]; + } + + err = sscanf(&ptmpbuf[i], "%hhx", &val8); + if (err != 1) { + RTW_WARN("Something wrong to parse efuse file, string=%s\n", &ptmpbuf[i]); + } else { + buf[j] = val8; + RTW_DBG("i=%d, j=%d, 0x%02x\n", i, j, buf[j]); + j++; + } + + i = ptr - ptmpbuf + 1; + } + + rtw_mfree(ptmpbuf, bufsize); + RTW_INFO("%s, filepatch %s, size=%d, done\n", __FUNCTION__, filepatch, count); + return _TRUE; +} + #ifdef CONFIG_EFUSE_CONFIG_FILE u32 rtw_read_efuse_from_file(const char *path, u8 *buf) { @@ -1552,11 +2551,11 @@ u32 rtw_read_efuse_from_file(const char *path, u8 *buf) fp = filp_open(path, O_RDONLY, 0); if (fp == NULL || IS_ERR(fp)) { if (fp != NULL) - DBG_871X_LEVEL(_drv_always_, "%s open %s fail, err:%ld\n" - , __func__, path, PTR_ERR(fp)); + RTW_PRINT("%s open %s fail, err:%ld\n" + , __func__, path, PTR_ERR(fp)); else - DBG_871X_LEVEL(_drv_always_, "%s open %s fail, fp is NULL\n" - , __func__, path); + RTW_PRINT("%s open %s fail, fp is NULL\n" + , __func__, path); goto exit; } @@ -1570,7 +2569,7 @@ u32 rtw_read_efuse_from_file(const char *path, u8 *buf) vfs_read(fp, temp, 2, &pos); if (sscanf(temp, "%hhx", &buf[i]) != 1) { if (0) - DBG_871X_LEVEL(_drv_err_, "%s sscanf fail\n", __func__); + RTW_ERR("%s sscanf fail\n", __func__); buf[i] = 0xFF; } if ((i % EFUSE_FILE_COLUMN_NUM) == (EFUSE_FILE_COLUMN_NUM - 1)) { @@ -1587,18 +2586,18 @@ u32 rtw_read_efuse_from_file(const char *path, u8 *buf) set_fs(fs); - DBG_871X_LEVEL(_drv_always_, "efuse file: %s\n", path); -#ifdef CONFIG_DEBUG + RTW_PRINT("efuse file: %s\n", path); +#ifdef CONFIG_RTW_DEBUG for (i = 0; i < HWSET_MAX_SIZE; i++) { if (i % 16 == 0) - DBG_871X_SEL_NL(RTW_DBGDUMP, "0x%03x: ", i); + RTW_PRINT_SEL(RTW_DBGDUMP, "0x%03x: ", i); - DBG_871X_SEL(RTW_DBGDUMP, "%02X%s" - , buf[i] + _RTW_PRINT_SEL(RTW_DBGDUMP, "%02X%s" + , buf[i] , ((i + 1) % 16 == 0) ? "\n" : (((i + 1) % 8 == 0) ? " " : " ") - ); + ); } - DBG_871X_SEL(RTW_DBGDUMP, "\n"); + _RTW_PRINT_SEL(RTW_DBGDUMP, "\n"); #endif ret = _SUCCESS; @@ -1623,11 +2622,11 @@ u32 rtw_read_macaddr_from_file(const char *path, u8 *buf) fp = filp_open(path, O_RDONLY, 0); if (fp == NULL || IS_ERR(fp)) { if (fp != NULL) - DBG_871X_LEVEL(_drv_always_, "%s open %s fail, err:%ld\n" - , __func__, path, PTR_ERR(fp)); + RTW_PRINT("%s open %s fail, err:%ld\n" + , __func__, path, PTR_ERR(fp)); else - DBG_871X_LEVEL(_drv_always_, "%s open %s fail, fp is NULL\n" - , __func__, path); + RTW_PRINT("%s open %s fail, fp is NULL\n" + , __func__, path); goto exit; } @@ -1648,7 +2647,7 @@ u32 rtw_read_macaddr_from_file(const char *path, u8 *buf) if (sscanf(head, "%hhx", &buf[i]) != 1) { if (0) - DBG_871X_LEVEL(_drv_err_, "%s sscanf fail\n", __func__); + RTW_ERR("%s sscanf fail\n", __func__); buf[i] = 0xFF; } @@ -1660,9 +2659,9 @@ u32 rtw_read_macaddr_from_file(const char *path, u8 *buf) set_fs(fs); - DBG_871X_LEVEL(_drv_always_, "wifi_mac file: %s\n", path); -#ifdef CONFIG_DEBUG - DBG_871X(MAC_FMT"\n", MAC_ARG(buf)); + RTW_PRINT("wifi_mac file: %s\n", path); +#ifdef CONFIG_RTW_DEBUG + RTW_INFO(MAC_FMT"\n", MAC_ARG(buf)); #endif ret = _SUCCESS; @@ -1673,4 +2672,3 @@ exit: #endif /* CONFIG_EFUSE_CONFIG_FILE */ #endif /* PLATFORM_LINUX */ - diff --git a/core/rtw_ap.c b/core/rtw_ap.c old mode 100755 new mode 100644 index e378ef5..1527834 --- a/core/rtw_ap.c +++ b/core/rtw_ap.c @@ -1,4230 +1,4108 @@ -/****************************************************************************** - * - * 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 - * - * - ******************************************************************************/ -#define _RTW_AP_C_ - -#include - - -#ifdef CONFIG_AP_MODE - -extern unsigned char RTW_WPA_OUI[]; -extern unsigned char WMM_OUI[]; -extern unsigned char WPS_OUI[]; -extern unsigned char P2P_OUI[]; -extern unsigned char WFD_OUI[]; - -void init_mlme_ap_info(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - - - _rtw_spinlock_init(&pmlmepriv->bcn_update_lock); - - //for ACL - _rtw_init_queue(&pacl_list->acl_node_q); - - //pmlmeext->bstart_bss = _FALSE; - - start_ap_mode(padapter); -} - -void free_mlme_ap_info(_adapter *padapter) -{ - _irqL irqL; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //stop_ap_mode(padapter); - - pmlmepriv->update_bcn = _FALSE; - pmlmeext->bstart_bss = _FALSE; - - rtw_sta_flush(padapter, _TRUE); - - pmlmeinfo->state = _HW_STATE_NOLINK_; - - //free_assoc_sta_resources - rtw_free_all_stainfo(padapter); - - //free bc/mc sta_info - psta = rtw_get_bcmc_stainfo(padapter); - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - - _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); - -} - -static void update_BCNTIM(_adapter *padapter) -{ - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); - unsigned char *pie = pnetwork_mlmeext->IEs; - -/* - //DBG_871X("%s\n", __FUNCTION__); - - //update TIM IE - //if(pstapriv->tim_bitmap) -*/ - if (_TRUE) { - u8 *p, *dst_ie, *premainder_ie = NULL, *pbackup_remainder_ie = NULL; - u16 tim_bitmap_le; - uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen; - - tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); - - p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_); - if (p != NULL && tim_ielen > 0) { - tim_ielen += 2; - - premainder_ie = p + tim_ielen; - - tim_ie_offset = (sint)(p -pie); - - remainder_ielen = pnetwork_mlmeext->IELength - tim_ie_offset - tim_ielen; - - /*append TIM IE from dst_ie offset*/ - dst_ie = p; - } else { - tim_ielen = 0; - - /*calculate head_len*/ - offset = _FIXED_IE_LENGTH_; - - /* get ssid_ie len */ - p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SSID_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - offset += tmp_len+2; - - /*get supported rates len*/ - p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - { - offset += tmp_len+2; - } - - /*DS Parameter Set IE, len=3*/ - offset += 3; - - premainder_ie = pie + offset; - - remainder_ielen = pnetwork_mlmeext->IELength - offset - tim_ielen; - - /*append TIM IE from offset*/ - dst_ie = pie + offset; - - } - - if (remainder_ielen > 0) { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie && premainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - *dst_ie++=_TIM_IE_; - - if ((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fe)) - tim_ielen = 5; - else - tim_ielen = 4; - - *dst_ie++ = tim_ielen; - - *dst_ie++ = 0;/*DTIM count*/ - *dst_ie++ = 1;/*DTIM period*/ - - if (pstapriv->tim_bitmap & BIT(0))/*for bc/mc frames*/ - *dst_ie++ = BIT(0);/*bitmap ctrl */ - else - *dst_ie++ = 0; - - if (tim_ielen == 4) { - u8 pvb = 0; - - if (pstapriv->tim_bitmap & 0x00fe) - pvb = (u8)tim_bitmap_le; - else if (pstapriv->tim_bitmap & 0xff00) - pvb = (u8)(tim_bitmap_le >> 8); - else - pvb = (u8)tim_bitmap_le; - - *dst_ie++ = pvb; - - } else if (tim_ielen == 5) { - _rtw_memcpy(dst_ie, &tim_bitmap_le, 2); - dst_ie += 2; - } - - /*copy remainder IE*/ - if (pbackup_remainder_ie) { - _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); - - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - } - - offset = (uint)(dst_ie - pie); - pnetwork_mlmeext->IELength = offset + remainder_ielen; - - } -} - -void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len) -{ - PNDIS_802_11_VARIABLE_IEs pIE; - u8 bmatch = _FALSE; - u8 *pie = pnetwork->IEs; - u8 *p=NULL, *dst_ie=NULL, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; - u32 i, offset, ielen, ie_offset, remainder_ielen = 0; - - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); - - if (pIE->ElementID > index) - { - break; - } - else if(pIE->ElementID == index) // already exist the same IE - { - p = (u8 *)pIE; - ielen = pIE->Length; - bmatch = _TRUE; - break; - } - - p = (u8 *)pIE; - ielen = pIE->Length; - i += (pIE->Length + 2); - } - - if (p != NULL && ielen>0) - { - ielen += 2; - - premainder_ie = p+ielen; - - ie_offset = (sint)(p -pie); - - remainder_ielen = pnetwork->IELength - ie_offset - ielen; - - if(bmatch) - dst_ie = p; - else - dst_ie = (p+ielen); - } - - if(dst_ie == NULL) - return; - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie && premainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - *dst_ie++=index; - *dst_ie++=len; - - _rtw_memcpy(dst_ie, data, len); - dst_ie+=len; - - //copy remainder IE - if(pbackup_remainder_ie) - { - _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); - - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - } - - offset = (uint)(dst_ie - pie); - pnetwork->IELength = offset + remainder_ielen; -} - -void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index) -{ - u8 *p, *dst_ie=NULL, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; - uint offset, ielen, ie_offset, remainder_ielen = 0; - u8 *pie = pnetwork->IEs; - - p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, index, &ielen, pnetwork->IELength - _FIXED_IE_LENGTH_); - if (p != NULL && ielen>0) - { - ielen += 2; - - premainder_ie = p+ielen; - - ie_offset = (sint)(p -pie); - - remainder_ielen = pnetwork->IELength - ie_offset - ielen; - - dst_ie = p; - } - else { - return; - } - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie && premainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - //copy remainder IE - if(pbackup_remainder_ie) - { - _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); - - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - } - - offset = (uint)(dst_ie - pie); - pnetwork->IELength = offset + remainder_ielen; -} - - -u8 chk_sta_is_alive(struct sta_info *psta); -u8 chk_sta_is_alive(struct sta_info *psta) -{ - u8 ret = _FALSE; - #ifdef DBG_EXPIRATION_CHK - DBG_871X("sta:"MAC_FMT", rssi:%d, rx:"STA_PKTS_FMT", expire_to:%u, %s%ssq_len:%u\n" - , MAC_ARG(psta->hwaddr) - , psta->rssi_stat.UndecoratedSmoothedPWDB - //, STA_RX_PKTS_ARG(psta) - , STA_RX_PKTS_DIFF_ARG(psta) - , psta->expire_to - , psta->state&WIFI_SLEEP_STATE?"PS, ":"" - , psta->state&WIFI_STA_ALIVE_CHK_STATE?"SAC, ":"" - , psta->sleepq_len - ); - #endif - - //if(sta_last_rx_pkts(psta) == sta_rx_pkts(psta)) - if((psta->sta_stats.last_rx_data_pkts + psta->sta_stats.last_rx_ctrl_pkts) == (psta->sta_stats.rx_data_pkts + psta->sta_stats.rx_ctrl_pkts)) - { - #if 0 - if(psta->state&WIFI_SLEEP_STATE) - ret = _TRUE; - #endif - } - else - { - ret = _TRUE; - } - - sta_update_last_rx_pkts(psta); - - return ret; -} - -void expire_timeout_chk(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - u8 updated = _FALSE; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 chk_alive_num = 0; - char chk_alive_list[NUM_STA]; - int i; - - - _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); - - phead = &pstapriv->auth_list; - plist = get_next(phead); - - //check auth_queue - #ifdef DBG_EXPIRATION_CHK - if (rtw_end_of_queue_search(phead, plist) == _FALSE) { - DBG_871X(FUNC_NDEV_FMT" auth_list, cnt:%u\n" - , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->auth_list_cnt); - } - #endif - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, auth_list); - - plist = get_next(plist); - - -#ifdef CONFIG_ATMEL_RC_PATCH - if (_TRUE == _rtw_memcmp((void *)(pstapriv->atmel_rc_pattern), (void *)(psta->hwaddr), ETH_ALEN)) - continue; - if (psta->flag_atmel_rc) - continue; -#endif - if(psta->expire_to>0) - { - psta->expire_to--; - if (psta->expire_to == 0) - { - rtw_list_delete(&psta->auth_list); - pstapriv->auth_list_cnt--; - - DBG_871X("auth expire %02X%02X%02X%02X%02X%02X\n", - psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); - - _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); - - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); - } - } - - } - - _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); - psta = NULL; - - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - #ifdef DBG_EXPIRATION_CHK - if (rtw_end_of_queue_search(phead, plist) == _FALSE) { - DBG_871X(FUNC_NDEV_FMT" asoc_list, cnt:%u\n" - , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->asoc_list_cnt); - } - #endif - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); -#ifdef CONFIG_ATMEL_RC_PATCH - DBG_871X("%s:%d psta=%p, %02x,%02x||%02x,%02x \n\n", __func__, __LINE__, - psta,pstapriv->atmel_rc_pattern[0], pstapriv->atmel_rc_pattern[5], psta->hwaddr[0], psta->hwaddr[5]); - if (_TRUE == _rtw_memcmp((void *)pstapriv->atmel_rc_pattern, (void *)(psta->hwaddr), ETH_ALEN)) - continue; - if (psta->flag_atmel_rc) - continue; - DBG_871X("%s: debug line:%d \n", __func__, __LINE__); -#endif -#ifdef CONFIG_AUTO_AP_MODE - if(psta->isrc) - continue; -#endif - if (chk_sta_is_alive(psta) || !psta->expire_to) { - psta->expire_to = pstapriv->expire_to; - psta->keep_alive_trycnt = 0; - #ifdef CONFIG_TX_MCAST2UNI - psta->under_exist_checking = 0; - #endif // CONFIG_TX_MCAST2UNI - } else { - psta->expire_to--; - } - -#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK -#ifdef CONFIG_80211N_HT -#ifdef CONFIG_TX_MCAST2UNI - if ( (psta->flags & WLAN_STA_HT) && (psta->htpriv.agg_enable_bitmap || psta->under_exist_checking) ) { - // check sta by delba(addba) for 11n STA - // ToDo: use CCX report to check for all STAs - //DBG_871X("asoc check by DELBA/ADDBA! (pstapriv->expire_to=%d s)(psta->expire_to=%d s), [%02x, %d]\n", pstapriv->expire_to*2, psta->expire_to*2, psta->htpriv.agg_enable_bitmap, psta->under_exist_checking); - - if ( psta->expire_to <= (pstapriv->expire_to - 50 ) ) { - DBG_871X("asoc expire by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); - psta->under_exist_checking = 0; - psta->expire_to = 0; - } else if ( psta->expire_to <= (pstapriv->expire_to - 3) && (psta->under_exist_checking==0)) { - DBG_871X("asoc check by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); - psta->under_exist_checking = 1; - //tear down TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - } - } -#endif //CONFIG_TX_MCAST2UNI -#endif //CONFIG_80211N_HT -#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK - - if (psta->expire_to <= 0) - { - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - if (padapter->registrypriv.wifi_spec == 1) - { - psta->expire_to = pstapriv->expire_to; - continue; - } - -#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK -#ifdef CONFIG_80211N_HT - -#define KEEP_ALIVE_TRYCNT (3) - - if(psta->keep_alive_trycnt > 0 && psta->keep_alive_trycnt <= KEEP_ALIVE_TRYCNT) - { - if(psta->state & WIFI_STA_ALIVE_CHK_STATE) - psta->state ^= WIFI_STA_ALIVE_CHK_STATE; - else - psta->keep_alive_trycnt = 0; - - } - else if((psta->keep_alive_trycnt > KEEP_ALIVE_TRYCNT) && !(psta->state & WIFI_STA_ALIVE_CHK_STATE)) - { - psta->keep_alive_trycnt = 0; - } - if((psta->htpriv.ht_option==_TRUE) && (psta->htpriv.ampdu_enable==_TRUE)) - { - uint priority = 1; //test using BK - u8 issued=0; - - //issued = (psta->htpriv.agg_enable_bitmap>>priority)&0x1; - issued |= (psta->htpriv.candidate_tid_bitmap>>priority)&0x1; - - if(0==issued) - { - if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) - { - psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); - - if (psta->state & WIFI_SLEEP_STATE) - psta->expire_to = 2; // 2x2=4 sec - else - psta->expire_to = 1; // 2 sec - - psta->state |= WIFI_STA_ALIVE_CHK_STATE; - - //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_addba_req(padapter, psta->hwaddr, (u8)priority); - - _set_timer(&psta->addba_retry_timer, ADDBA_TO); - - psta->keep_alive_trycnt++; - - continue; - } - } - } - if(psta->keep_alive_trycnt > 0 && psta->state & WIFI_STA_ALIVE_CHK_STATE) - { - psta->keep_alive_trycnt = 0; - psta->state ^= WIFI_STA_ALIVE_CHK_STATE; - DBG_871X("change to another methods to check alive if staion is at ps mode\n"); - } - -#endif //CONFIG_80211N_HT -#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK - if (psta->state & WIFI_SLEEP_STATE) { - if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) { - //to check if alive by another methods if staion is at ps mode. - psta->expire_to = pstapriv->expire_to; - psta->state |= WIFI_STA_ALIVE_CHK_STATE; - - //DBG_871X("alive chk, sta:" MAC_FMT " is at ps mode!\n", MAC_ARG(psta->hwaddr)); - - //to update bcn with tim_bitmap for this station - pstapriv->tim_bitmap |= BIT(psta->aid); - update_beacon(padapter, _TIM_IE_, NULL, _TRUE); - - if(!pmlmeext->active_keep_alive_check) - continue; - } - } - #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK - if (pmlmeext->active_keep_alive_check) { - int stainfo_offset; - - stainfo_offset = rtw_stainfo_offset(pstapriv, psta); - if (stainfo_offset_valid(stainfo_offset)) { - chk_alive_list[chk_alive_num++] = stainfo_offset; - } - - continue; - } - #endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); - updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING, _TRUE); - } - else - { - /* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */ - if (psta->sleepq_len > (NR_XMITFRAME/pstapriv->asoc_list_cnt) - && padapter->xmitpriv.free_xmitframe_cnt < ((NR_XMITFRAME/pstapriv->asoc_list_cnt)/2) - ){ - DBG_871X("%s sta:"MAC_FMT", sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n", __func__ - , MAC_ARG(psta->hwaddr) - , psta->sleepq_len, padapter->xmitpriv.free_xmitframe_cnt, pstapriv->asoc_list_cnt); - wakeup_sta_to_xmit(padapter, psta); - } - } - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - -#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK -if (chk_alive_num) { - - u8 backup_oper_channel=0; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - /* switch to correct channel of current network before issue keep-alive frames */ - if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) { - backup_oper_channel = rtw_get_oper_ch(padapter); - SelectChannel(padapter, pmlmeext->cur_channel); - } - - /* issue null data to check sta alive*/ - for (i = 0; i < chk_alive_num; i++) { - int ret = _FAIL; - - psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); -#ifdef CONFIG_ATMEL_RC_PATCH - if (_TRUE == _rtw_memcmp( pstapriv->atmel_rc_pattern, psta->hwaddr, ETH_ALEN)) - continue; - if (psta->flag_atmel_rc) - continue; -#endif - if(!(psta->state &_FW_LINKED)) - continue; - - if (psta->state & WIFI_SLEEP_STATE) - ret = issue_nulldata(padapter, psta->hwaddr, 0, 1, 50); - else - ret = issue_nulldata(padapter, psta->hwaddr, 0, 3, 50); - - psta->keep_alive_trycnt++; - if (ret == _SUCCESS) - { - DBG_871X("asoc check, sta(" MAC_FMT ") is alive\n", MAC_ARG(psta->hwaddr)); - psta->expire_to = pstapriv->expire_to; - psta->keep_alive_trycnt = 0; - continue; - } - else if (psta->keep_alive_trycnt <= 3) - { - DBG_871X("ack check for asoc expire, keep_alive_trycnt=%d\n", psta->keep_alive_trycnt); - psta->expire_to = 1; - continue; - } - - psta->keep_alive_trycnt = 0; - DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - if (rtw_is_list_empty(&psta->asoc_list)==_FALSE) { - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING, _TRUE); - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - } - - if (backup_oper_channel>0) /* back to the original operation channel */ - SelectChannel(padapter, backup_oper_channel); -} -#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ - - associated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL); -} - -void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level) -{ - int i; - u8 rf_type; - unsigned char sta_band = 0, shortGIrate = _FALSE; - u64 tx_ra_bitmap = 0; - struct ht_priv *psta_ht = NULL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - -#ifdef CONFIG_80211N_HT - if(psta) - psta_ht = &psta->htpriv; - else - return; -#endif //CONFIG_80211N_HT - - if(!(psta->state & _FW_LINKED)) - return; - -#if 0//gtest - if(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R) - { - //is this a 2r STA? - if((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid))) - { - priv->pshare->has_2r_sta |= BIT(pstat->aid); - if(rtw_read16(padapter, 0x102501f6) != 0xffff) - { - rtw_write16(padapter, 0x102501f6, 0xffff); - reset_1r_sta_RA(priv, 0xffff); - Switch_1SS_Antenna(priv, 3); - } - } - else// bg or 1R STA? - { - if((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0) - { - if(rtw_read16(padapter, 0x102501f6) != 0x7777) - { // MCS7 SGI - rtw_write16(padapter, 0x102501f6,0x7777); - reset_1r_sta_RA(priv, 0x7777); - Switch_1SS_Antenna(priv, 2); - } - } - } - - } - - if ((pstat->rssi_level < 1) || (pstat->rssi_level > 3)) - { - if (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper) - pstat->rssi_level = 1; - else if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) || - ((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) && - (pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) && - (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_)))) - pstat->rssi_level = 2; - else - pstat->rssi_level = 3; - } - - // rate adaptive by rssi - if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len) - { - if ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R)) - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x100f0000; - break; - case 2: - pstat->tx_ra_bitmap &= 0x100ff000; - break; - case 3: - if (priv->pshare->is_40m_bw) - pstat->tx_ra_bitmap &= 0x100ff005; - else - pstat->tx_ra_bitmap &= 0x100ff001; - - break; - } - } - else - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x1f0f0000; - break; - case 2: - pstat->tx_ra_bitmap &= 0x1f0ff000; - break; - case 3: - if (priv->pshare->is_40m_bw) - pstat->tx_ra_bitmap &= 0x000ff005; - else - pstat->tx_ra_bitmap &= 0x000ff001; - - break; - } - - // Don't need to mask high rates due to new rate adaptive parameters - //if (pstat->is_broadcom_sta) // use MCS12 as the highest rate vs. Broadcom sta - // pstat->tx_ra_bitmap &= 0x81ffffff; - - // NIC driver will report not supporting MCS15 and MCS14 in asoc req - //if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta) - // pstat->tx_ra_bitmap &= 0x83ffffff; // if Realtek 1x2 sta, don't use MCS15 and MCS14 - } - } - else if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat)) - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x00000f00; - break; - case 2: - pstat->tx_ra_bitmap &= 0x00000ff0; - break; - case 3: - pstat->tx_ra_bitmap &= 0x00000ff5; - break; - } - } - else - { - pstat->tx_ra_bitmap &= 0x0000000d; - } - - // disable tx short GI when station cannot rx MCS15(AP is 2T2R) - // disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R) - // if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate - if ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) || - (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R))) - { - pstat->tx_ra_bitmap &= ~BIT(28); - } -#endif - - rtw_hal_update_sta_rate_mask(padapter, psta); - tx_ra_bitmap = psta->ra_mask; - - shortGIrate = query_ra_short_GI(psta); - - if ( pcur_network->Configuration.DSConfig > 14 ) { - - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_5N ; - - if (tx_ra_bitmap & 0xff0) - sta_band |= WIRELESS_11A; - - // 5G band - #ifdef CONFIG_80211AC_VHT - if (psta->vhtpriv.vht_option) { - sta_band = WIRELESS_11_5AC; - } - #endif - - } else { - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_24N; - - if (tx_ra_bitmap & 0xff0) - sta_band |= WIRELESS_11G; - - if (tx_ra_bitmap & 0x0f) - sta_band |= WIRELESS_11B; - } - - psta->wireless_mode = sta_band; - psta->raid = rtw_hal_networktype_to_raid(padapter, psta); - - if (psta->aid < NUM_STA) - { - u8 arg[4] = {0}; - - arg[0] = psta->mac_id; - arg[1] = psta->raid; - arg[2] = shortGIrate; - arg[3] = psta->init_rate; - - DBG_871X("%s=> mac_id:%d , raid:%d , shortGIrate=%d, tx_ra_bitmap:0x%016llx, networkType:0x%02x\n", - __FUNCTION__, psta->mac_id, psta->raid, shortGIrate, tx_ra_bitmap, psta->wireless_mode); - - rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, rssi_level); - } - else - { - DBG_871X("station aid %d exceed the max number\n", psta->aid); - } - -} - -void update_bmc_sta(_adapter *padapter) -{ - _irqL irqL; - unsigned char network_type; - int supportRateNum = 0; - u64 tx_ra_bitmap = 0; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); - - if(psta) - { - psta->aid = 0;//default set to 0 - - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - - psta->qos_option = 0; -#ifdef CONFIG_80211N_HT - psta->htpriv.ht_option = _FALSE; -#endif //CONFIG_80211N_HT - - psta->ieee8021x_blocked = 0; - - _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); - - //psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this. - - //prepare for add_RATid - supportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates); - network_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, pcur_network->Configuration.DSConfig); - if (IsSupportedTxCCK(network_type)) { - network_type = WIRELESS_11B; - } - else if (network_type == WIRELESS_INVALID) { // error handling - if ( pcur_network->Configuration.DSConfig > 14 ) - network_type = WIRELESS_11A; - else - network_type = WIRELESS_11B; - } - update_sta_basic_rate(psta, network_type); - psta->wireless_mode = network_type; - - rtw_hal_update_sta_rate_mask(padapter, psta); - tx_ra_bitmap = psta->ra_mask; - - psta->raid = rtw_hal_networktype_to_raid(padapter,psta); - - //ap mode - rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE); - - //if(pHalData->fw_ractrl == _TRUE) - { - u8 arg[4] = {0}; - - arg[0] = psta->mac_id; - arg[1] = psta->raid; - arg[2] = 0; - arg[3] = psta->init_rate; - - DBG_871X("%s=> mac_id:%d , raid:%d , bitmap=0x%016llx\n", - __FUNCTION__ , psta->mac_id, psta->raid , tx_ra_bitmap); - - rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, 0); - } - - rtw_sta_media_status_rpt(padapter, psta, 1); - - _enter_critical_bh(&psta->lock, &irqL); - psta->state = _FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - } - else - { - DBG_871X("add_RATid_bmc_sta error!\n"); - } - -} - -//notes: -//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode -//MAC_ID = AID+1 for sta in ap/adhoc mode -//MAC_ID = 1 for bc/mc for sta/ap/adhoc -//MAC_ID = 0 for bssid for sta/ap/adhoc -//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1; - -void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); -#ifdef CONFIG_80211N_HT - struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; - struct ht_priv *phtpriv_sta = &psta->htpriv; -#endif //CONFIG_80211N_HT - u8 cur_ldpc_cap=0, cur_stbc_cap=0, cur_beamform_cap=0; - //set intf_tag to if1 - //psta->intf_tag = 0; - - DBG_871X("%s\n",__FUNCTION__); - - //psta->mac_id = psta->aid+4; - //psta->mac_id = psta->aid+1;//alloc macid when call rtw_alloc_stainfo(), - //release macid when call rtw_free_stainfo() - - //ap mode - rtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,psta,_TRUE); - - if(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) - psta->ieee8021x_blocked = _TRUE; - else - psta->ieee8021x_blocked = _FALSE; - - - //update sta's cap - - //ERP - VCS_update(padapter, psta); -#ifdef CONFIG_80211N_HT - //HT related cap - if(phtpriv_sta->ht_option) - { - //check if sta supports rx ampdu - phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; - - phtpriv_sta->rx_ampdu_min_spacing = (phtpriv_sta->ht_cap.ampdu_params_info&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2; - - // bwmode - if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) - { - psta->bw_mode = CHANNEL_WIDTH_40; - } - else - { - psta->bw_mode = CHANNEL_WIDTH_20; - } - - if (psta->ht_40mhz_intolerant) - psta->bw_mode = CHANNEL_WIDTH_20; - - if(pmlmeext->cur_bwmode < psta->bw_mode) - { - psta->bw_mode = pmlmeext->cur_bwmode; - } - - phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; - - - //check if sta support s Short GI 20M - if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20)) - { - phtpriv_sta->sgi_20m = _TRUE; - } - - //check if sta support s Short GI 40M - if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40)) - { - if(psta->bw_mode == CHANNEL_WIDTH_40) //according to psta->bw_mode - phtpriv_sta->sgi_40m = _TRUE; - else - phtpriv_sta->sgi_40m = _FALSE; - } - - psta->qos_option = _TRUE; - - // B0 Config LDPC Coding Capability - if (TEST_FLAG(phtpriv_ap->ldpc_cap, LDPC_HT_ENABLE_TX) && - GET_HT_CAP_ELE_LDPC_CAP((u8 *)(&phtpriv_sta->ht_cap))) - { - SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX)); - DBG_871X("Enable HT Tx LDPC for STA(%d)\n",psta->aid); - } - - // B7 B8 B9 Config STBC setting - if (TEST_FLAG(phtpriv_ap->stbc_cap, STBC_HT_ENABLE_TX) && - GET_HT_CAP_ELE_RX_STBC((u8 *)(&phtpriv_sta->ht_cap))) - { - SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX) ); - DBG_871X("Enable HT Tx STBC for STA(%d)\n",psta->aid); - } - -#ifdef CONFIG_BEAMFORMING - /*Config Tx beamforming setting*/ - if (TEST_FLAG(phtpriv_ap->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && - GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP((u8 *)(&phtpriv_sta->ht_cap))) - { - SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE); - /*Shift to BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP*/ - SET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS((u8 *)(&phtpriv_sta->ht_cap)) << 6); - } - - if (TEST_FLAG(phtpriv_ap->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) && - GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP((u8 *)(&phtpriv_sta->ht_cap))) - { - SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE); - /*Shift to BEAMFORMING_HT_BEAMFORMER_STEER_NUM*/ - SET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS((u8 *)(&phtpriv_sta->ht_cap)) << 4); - } - if (cur_beamform_cap) { - DBG_871X("Client STA(%d) HT Beamforming Cap = 0x%02X\n", psta->aid, cur_beamform_cap); - } -#endif /*CONFIG_BEAMFORMING*/ - } - else - { - phtpriv_sta->ampdu_enable = _FALSE; - - phtpriv_sta->sgi_20m = _FALSE; - phtpriv_sta->sgi_40m = _FALSE; - psta->bw_mode = CHANNEL_WIDTH_20; - phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - } - - phtpriv_sta->ldpc_cap = cur_ldpc_cap; - phtpriv_sta->stbc_cap = cur_stbc_cap; - phtpriv_sta->beamform_cap = cur_beamform_cap; - - //Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - phtpriv_sta->agg_enable_bitmap = 0x0;//reset - phtpriv_sta->candidate_tid_bitmap = 0x0;//reset -#endif //CONFIG_80211N_HT - -#ifdef CONFIG_80211AC_VHT - update_sta_vht_info_apmode(padapter, psta); -#endif - - update_ldpc_stbc_cap(psta); - - //todo: init other variables - - _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); - - - //add ratid - //add_RATid(padapter, psta);//move to ap_sta_info_defer_update() - - - _enter_critical_bh(&psta->lock, &irqL); - psta->state |= _FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - -} - -static void update_ap_info(_adapter *padapter, struct sta_info *psta) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); -#ifdef CONFIG_80211N_HT - struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; -#endif //CONFIG_80211N_HT - - psta->wireless_mode = pmlmeext->cur_wireless_mode; - - psta->bssratelen = rtw_get_rateset_len(pnetwork->SupportedRates); - _rtw_memcpy(psta->bssrateset, pnetwork->SupportedRates, psta->bssratelen); - -#ifdef CONFIG_80211N_HT - //HT related cap - if(phtpriv_ap->ht_option) - { - //check if sta supports rx ampdu - //phtpriv_ap->ampdu_enable = phtpriv_ap->ampdu_enable; - - //check if sta support s Short GI 20M - if((phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20)) - { - phtpriv_ap->sgi_20m = _TRUE; - } - //check if sta support s Short GI 40M - if((phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40)) - { - phtpriv_ap->sgi_40m = _TRUE; - } - - psta->qos_option = _TRUE; - } - else - { - phtpriv_ap->ampdu_enable = _FALSE; - - phtpriv_ap->sgi_20m = _FALSE; - phtpriv_ap->sgi_40m = _FALSE; - } - - psta->bw_mode = pmlmeext->cur_bwmode; - phtpriv_ap->ch_offset = pmlmeext->cur_ch_offset; - - phtpriv_ap->agg_enable_bitmap = 0x0;//reset - phtpriv_ap->candidate_tid_bitmap = 0x0;//reset - - _rtw_memcpy(&psta->htpriv, &pmlmepriv->htpriv, sizeof(struct ht_priv)); - -#ifdef CONFIG_80211AC_VHT - _rtw_memcpy(&psta->vhtpriv, &pmlmepriv->vhtpriv, sizeof(struct vht_priv)); -#endif //CONFIG_80211AC_VHT - -#endif //CONFIG_80211N_HT - - psta->state |= WIFI_AP_STATE; /* Aries, add,fix bug of flush_cam_entry at STOP AP mode , 0724 */ -} - -static void rtw_set_hw_wmm_param(_adapter *padapter) -{ - u8 ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime; - u8 acm_mask; - u16 TXOP; - u32 acParm, i; - u32 edca[4], inx[4]; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct registry_priv *pregpriv = &padapter->registrypriv; - - acm_mask = 0; - - if (IsSupported5G(pmlmeext->cur_wireless_mode) || - (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) - aSifsTime = 16; - else - aSifsTime = 10; - - if (pmlmeinfo->WMM_enable == 0) { - padapter->mlmepriv.acm_mask = 0; - - AIFS = aSifsTime + (2 * pmlmeinfo->slotTime); - - if (pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11A)) { - ECWMin = 4; - ECWMax = 10; - } else if (pmlmeext->cur_wireless_mode & WIRELESS_11B) { - ECWMin = 5; - ECWMax = 10; - } else { - ECWMin = 4; - ECWMax = 10; - } - - TXOP = 0; - acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); - - ECWMin = 2; - ECWMax = 3; - TXOP = 0x2f; - acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); - - } else { - edca[0] = edca[1] = edca[2] = edca[3] = 0; - - /*TODO:*/ - acm_mask = 0; - padapter->mlmepriv.acm_mask = acm_mask; - - /* - //BK - //AIFS = AIFSN * slot time + SIFS - r2t phy delay - */ - AIFS = (7 * pmlmeinfo->slotTime) + aSifsTime; - ECWMin = 4; - ECWMax = 10; - TXOP = 0; - acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); - edca[XMIT_BK_QUEUE] = acParm; - DBG_871X("WMM(BK): %x\n", acParm); - - /* BE */ - AIFS = (3 * pmlmeinfo->slotTime) + aSifsTime; - ECWMin = 4; - ECWMax = 6; - TXOP = 0; - acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); - edca[XMIT_BE_QUEUE] = acParm; - DBG_871X("WMM(BE): %x\n", acParm); - - /* VI */ - AIFS = (1 * pmlmeinfo->slotTime) + aSifsTime; - ECWMin = 3; - ECWMax = 4; - TXOP = 94; - acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); - edca[XMIT_VI_QUEUE] = acParm; - DBG_871X("WMM(VI): %x\n", acParm); - - /* VO */ - AIFS = (1 * pmlmeinfo->slotTime) + aSifsTime; - ECWMin = 2; - ECWMax = 3; - TXOP = 47; - acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); - edca[XMIT_VO_QUEUE] = acParm; - DBG_871X("WMM(VO): %x\n", acParm); - - - if (padapter->registrypriv.acm_method == 1) - rtw_hal_set_hwreg(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask)); - else - padapter->mlmepriv.acm_mask = acm_mask; - - inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3; - - if (pregpriv->wifi_spec == 1) { - u32 j, tmp, change_inx = _FALSE; - - /* entry indx: 0->vo, 1->vi, 2->be, 3->bk. */ - for (i = 0 ; i < 4 ; i++) { - for (j = i+1 ; j < 4 ; j++) { - /* compare CW and AIFS */ - if ((edca[j] & 0xFFFF) < (edca[i] & 0xFFFF)) { - change_inx = _TRUE; - } else if ((edca[j] & 0xFFFF) == (edca[i] & 0xFFFF)) { - /* compare TXOP */ - if ((edca[j] >> 16) > (edca[i] >> 16)) - change_inx = _TRUE; - } - - if (change_inx) { - tmp = edca[i]; - edca[i] = edca[j]; - edca[j] = tmp; - - tmp = inx[i]; - inx[i] = inx[j]; - inx[j] = tmp; - - change_inx = _FALSE; - } - } - } - } - - for (i = 0 ; i < 4 ; i++) { - pxmitpriv->wmm_para_seq[i] = inx[i]; - DBG_871X("wmm_para_seq(%d): %d\n", i, pxmitpriv->wmm_para_seq[i]); - } - - } - -} - -static void update_hw_ht_param(_adapter *padapter) -{ - unsigned char max_AMPDU_len; - unsigned char min_MPDU_spacing; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - DBG_871X("%s\n", __FUNCTION__); - - - //handle A-MPDU parameter field - /* - AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k - AMPDU_para [4:2]:Min MPDU Start Spacing - */ - max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; - - min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; - - rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); - - rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); - - // - // Config SM Power Save setting - // - pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2; - if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) - { - /*u8 i; - //update the MCS rates - for (i = 0; i < 16; i++) - { - pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; - }*/ - DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); - } - - // - // Config current HT Protection mode. - // - //pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; - -} - -static void rtw_ap_check_scan(_adapter *padapter) -{ - _irqL irqL; - _list *plist, *phead; - u32 delta_time, lifetime; - struct wlan_network *pnetwork = NULL; - WLAN_BSSID_EX *pbss = NULL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - _queue *queue = &(pmlmepriv->scanned_queue); - u8 do_scan = _FALSE; - - lifetime = SCANQUEUE_LIFETIME; /* 20 sec */ - - _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - phead = get_list_head(queue); - if (rtw_end_of_queue_search(phead, get_next(phead)) == _TRUE) - if (padapter->registrypriv.wifi_spec) - do_scan = _TRUE; - _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - -#ifdef CONFIG_AUTO_CHNL_SEL_NHM - if (padapter->registrypriv.acs_auto_scan) { - do_scan = _TRUE; - rtw_acs_start(padapter, _TRUE); - } -#endif - - if (_TRUE == do_scan) { - DBG_871X("%s : drv scans by itself and wait_completed\n", __func__); - rtw_drv_scan_by_self(padapter); - rtw_scan_wait_completed(padapter); - } - -#ifdef CONFIG_AUTO_CHNL_SEL_NHM - if (padapter->registrypriv.acs_auto_scan) - rtw_acs_start(padapter, _FALSE); -#endif - _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - phead = get_list_head(queue); - plist = get_next(phead); - - while (1) { - - if (rtw_end_of_queue_search(phead, plist) == _TRUE) - break; - - pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); - - if (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0 - && rtw_mlme_band_check(padapter, pnetwork->network.Configuration.DSConfig) == _TRUE - && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid))) { - delta_time = (u32) rtw_get_passing_time_ms(pnetwork->last_scanned); - - if (delta_time < lifetime) { - - uint ie_len = 0; - u8 *pbuf = NULL; - u8 *ie = NULL; - - pbss = &pnetwork->network; - ie = pbss->IEs; - - /*check if HT CAP INFO IE exists or not*/ - pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss->IELength - _BEACON_IE_OFFSET_)); - if (pbuf == NULL) { - /* HT CAP INFO IE don't exist, it is b/g mode bss.*/ - - if (pmlmepriv->olbc == _FALSE) - pmlmepriv->olbc = _TRUE; - - if (pmlmepriv->olbc_ht == _FALSE) - pmlmepriv->olbc_ht = _TRUE; - } - } - } - - plist = get_next(plist); - - } - - _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - pmlmepriv->num_sta_no_ht = 0; /* reset to 0 after ap do scanning*/ - -} - -void rtw_start_bss_hdl_after_chbw_decided(_adapter *adapter) -{ - WLAN_BSSID_EX *pnetwork = &(adapter->mlmepriv.cur_network.network); - struct sta_info *sta = NULL; - - /* update cur_wireless_mode */ - update_wireless_mode(adapter); - - /* update RRSR and RTS_INIT_RATE register after set channel and bandwidth */ - UpdateBrateTbl(adapter, pnetwork->SupportedRates); - rtw_hal_set_hwreg(adapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates); - - /* update capability after cur_wireless_mode updated */ - update_capinfo(adapter, rtw_get_capability(pnetwork)); - - /* update bc/mc sta_info */ - update_bmc_sta(adapter); - - /* update AP's sta info */ - sta = rtw_get_stainfo(&adapter->stapriv, pnetwork->MacAddress); - if (!sta) { - DBG_871X(FUNC_ADPT_FMT" !sta for macaddr="MAC_FMT"\n", FUNC_ADPT_ARG(adapter), MAC_ARG(pnetwork->MacAddress)); - rtw_warn_on(1); - return; - } - - update_ap_info(adapter, sta); -} - -void start_bss_network(_adapter *padapter, struct createbss_parm *parm) -{ -#define DUMP_ADAPTERS_STATUS 0 - - u8 val8; - u16 bcn_interval; - u32 acparm; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv* psecuritypriv=&(padapter->securitypriv); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; /* used as input */ - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); - u8 req_ch, req_bw, req_offset; - bool ch_setting_changed = _FALSE; - u8 ch_to_set = 0, bw_to_set, offset_to_set; - - if (parm->req_ch == 0) { - /* change to unspecificed ch, bw, offset, get from IE */ - goto get_cbhw_from_ie; - } else if (parm->req_ch > 0) { - /* change ch, bw, offset */ - req_ch = parm->req_ch; - req_bw = parm->req_bw; - req_offset = parm->req_offset; - goto change_chbw; - } - - bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; - - //check if there is wps ie, - //if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, - //and at first time the security ie ( RSN/WPA IE) will not include in beacon. - if(NULL == rtw_get_wps_ie(pnetwork->IEs+_FIXED_IE_LENGTH_, pnetwork->IELength-_FIXED_IE_LENGTH_, NULL, NULL)) - { - pmlmeext->bstart_bss = _TRUE; - } - - //todo: update wmm, ht cap - //pmlmeinfo->WMM_enable; - //pmlmeinfo->HT_enable; - if(pmlmepriv->qospriv.qos_option) - pmlmeinfo->WMM_enable = _TRUE; -#ifdef CONFIG_80211N_HT - if(pmlmepriv->htpriv.ht_option) - { - pmlmeinfo->WMM_enable = _TRUE; - pmlmeinfo->HT_enable = _TRUE; - //pmlmeinfo->HT_info_enable = _TRUE; - //pmlmeinfo->HT_caps_enable = _TRUE; - - update_hw_ht_param(padapter); - } -#endif //#CONFIG_80211N_HT - -#ifdef CONFIG_80211AC_VHT - if(pmlmepriv->vhtpriv.vht_option) { - pmlmeinfo->VHT_enable = _TRUE; - update_hw_vht_param(padapter); - } -#endif //CONFIG_80211AC_VHT - - if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time - { - //WEP Key will be set before this function, do not clear CAM. - if ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_)) - flush_all_cam_entry(padapter); //clear CAM - } - - //set MSR to AP_Mode - Set_MSR(padapter, _HW_STATE_AP_); - - //Set BSSID REG - rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress); - - //Set EDCA param reg -#ifdef CONFIG_CONCURRENT_MODE - acparm = 0x005ea42b; -#else - acparm = 0x002F3217; // VO -#endif - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); - acparm = 0x005E4317; // VI - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); - //acparm = 0x00105320; // BE - acparm = 0x005ea42b; - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); - acparm = 0x0000A444; // BK - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); - - //Set Security - val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; - rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - - //Beacon Control related register - rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); - - 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; - - //initialgain = 0x1e; - - - //disable dynamic functions, such as high power, DIG - /*rtw_phydm_ability_backup(padapter);*/ - /*rtw_phydm_func_disable_all(padapter);*/ - - //turn on all dynamic functions - /* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE);*/ - - /*rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, _FALSE);*/ - - } -#endif - -get_cbhw_from_ie: - rtw_ies_get_chbw(pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs) - , pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs) - , &req_ch, &req_bw, &req_offset); - -change_chbw: - rtw_warn_on(req_ch == 0); - - ch_setting_changed = rtw_ap_chbw_decision(padapter, req_ch, req_bw, req_offset - , &ch_to_set, &bw_to_set, &offset_to_set); - - //let pnetwork_mlmeext == pnetwork_mlme. - _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); - - rtw_start_bss_hdl_after_chbw_decided(padapter); - - #if defined(CONFIG_DFS_MASTER) - rtw_dfs_master_status_apply(padapter, MLME_AP_STARTED); - #endif - - if (ch_to_set != 0) - set_channel_bwmode(padapter, ch_to_set, offset_to_set, bw_to_set); - - if (DUMP_ADAPTERS_STATUS) { - DBG_871X(FUNC_ADPT_FMT" done\n", FUNC_ADPT_ARG(padapter)); - dump_adapters_status(RTW_DBGDUMP , adapter_to_dvobj(padapter)); - } - - if (_TRUE == pmlmeext->bstart_bss - && !check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) - && !check_fwstate(pmlmepriv, WIFI_OP_CH_SWITCHING) - #ifdef CONFIG_CONCURRENT_MODE - && !check_buddy_fwstate(padapter, WIFI_SITE_MONITOR) - #endif - ) { - - if ((pmlmepriv->olbc == _TRUE) || (pmlmepriv->olbc_ht == _TRUE)) { - - /* AP is not starting a 40 MHz BSS in presence of an 802.11g BSS. */ - - pmlmepriv->ht_op_mode &= (~HT_INFO_OPERATION_MODE_OP_MODE_MASK); - pmlmepriv->ht_op_mode |= OP_MODE_MAY_BE_LEGACY_STAS; - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _FALSE); - } - - update_beacon(padapter, _TIM_IE_, NULL, _TRUE); - - #if !defined(CONFIG_INTERRUPT_BASED_TXBCN) - #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - /* other case will tx beacon when bcn interrupt coming in. */ - if (send_beacon(padapter) == _FAIL) - DBG_871X("issue_beacon, fail!\n"); - #endif - #endif /* !defined(CONFIG_INTERRUPT_BASED_TXBCN) */ - } - - /*Set EDCA param reg after update cur_wireless_mode & update_capinfo*/ - if (pregpriv->wifi_spec == 1) - rtw_set_hw_wmm_param(padapter); - - /*pmlmeext->bstart_bss = _TRUE;*/ -} - -int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) -{ - int ret=_SUCCESS; - u8 *p; - u8 *pHT_caps_ie=NULL; - u8 *pHT_info_ie=NULL; - u16 cap, ht_cap=_FALSE; - uint ie_len = 0; - int group_cipher, pairwise_cipher; - u8 channel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX]; - int supportRateNum = 0; - u8 OUI1[] = {0x00, 0x50, 0xf2,0x01}; - u8 wps_oui[4]={0x0,0x50,0xf2,0x04}; - u8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pbss_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *ie = pbss_network->IEs; - u8 vht_cap=_FALSE; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 rf_num = 0; - - /* SSID */ - /* Supported rates */ - /* DS Params */ - /* WLAN_EID_COUNTRY */ - /* ERP Information element */ - /* Extended supported rates */ - /* WPA/WPA2 */ - /* Wi-Fi Wireless Multimedia Extensions */ - /* ht_capab, ht_oper */ - /* WPS IE */ - - DBG_871X("%s, len=%d\n", __FUNCTION__, len); - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) - return _FAIL; - - - if(len>MAX_IE_SZ) - return _FAIL; - - pbss_network->IELength = len; - - _rtw_memset(ie, 0, MAX_IE_SZ); - - _rtw_memcpy(ie, pbuf, pbss_network->IELength); - - - if(pbss_network->InfrastructureMode!=Ndis802_11APMode) - return _FAIL; - - - rtw_ap_check_scan(padapter); - - - pbss_network->Rssi = 0; - - _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 - //pbss_network->Configuration.BeaconPeriod = le16_to_cpu(*(unsigned short*)p); - pbss_network->Configuration.BeaconPeriod = RTW_GET_LE16(p); - - //capability - //cap = *(unsigned short *)rtw_get_capability_from_ie(ie); - //cap = le16_to_cpu(cap); - cap = RTW_GET_LE16(ie); - - //SSID - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength -_BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - _rtw_memset(&pbss_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); - _rtw_memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len); - pbss_network->Ssid.SsidLength = ie_len; - #ifdef CONFIG_P2P - _rtw_memcpy(padapter->wdinfo.p2p_group_ssid, pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength); - padapter->wdinfo.p2p_group_ssid_len = pbss_network->Ssid.SsidLength; - #endif - } - - //chnnel - channel = 0; - pbss_network->Configuration.Length = 0; - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - channel = *(p + 2); - - pbss_network->Configuration.DSConfig = channel; - - - _rtw_memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX); - // get supported rates - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - { - _rtw_memcpy(supportRate, p+2, ie_len); - supportRateNum = ie_len; - } - - //get ext_supported rates - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_); - if (p != NULL) - { - _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); - supportRateNum += ie_len; - - } - - network_type = rtw_check_network_type(supportRate, supportRateNum, channel); - - rtw_set_supported_rate(pbss_network->SupportedRates, network_type); - - - //parsing ERP_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - ERP_IE_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)p); - } - - //update privacy/security - if (cap & BIT(4)) - pbss_network->Privacy = 1; - else - pbss_network->Privacy = 0; - - psecuritypriv->wpa_psk = 0; - - //wpa2 - group_cipher = 0; pairwise_cipher = 0; - psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; - psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - if(rtw_parse_wpa2_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - - psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x - psecuritypriv->wpa_psk |= BIT(1); - - psecuritypriv->wpa2_group_cipher = group_cipher; - psecuritypriv->wpa2_pairwise_cipher = pairwise_cipher; -#if 0 - switch(group_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa2_group_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa2_group_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa2_group_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa2_group_cipher = _WEP104_; - break; - } - - switch(pairwise_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa2_pairwise_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa2_pairwise_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa2_pairwise_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa2_pairwise_cipher = _WEP104_; - break; - } -#endif - } - - } - - //wpa - ie_len = 0; - group_cipher = 0; pairwise_cipher = 0; - psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; - psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; - for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) - { - p = rtw_get_ie(p, _SSN_IE_1_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); - if ((p) && (_rtw_memcmp(p+2, OUI1, 4))) - { - if(rtw_parse_wpa_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - - psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x - - psecuritypriv->wpa_psk |= BIT(0); - - psecuritypriv->wpa_group_cipher = group_cipher; - psecuritypriv->wpa_pairwise_cipher = pairwise_cipher; - -#if 0 - switch(group_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa_group_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa_group_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa_group_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa_group_cipher = _WEP104_; - break; - } - - switch(pairwise_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa_pairwise_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa_pairwise_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa_pairwise_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa_pairwise_cipher = _WEP104_; - break; - } -#endif - } - - break; - - } - - if ((p == NULL) || (ie_len == 0)) - { - break; - } - - } - - //wmm - ie_len = 0; - pmlmepriv->qospriv.qos_option = 0; - if(pregistrypriv->wmm_enable) - { - for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) - { - p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); - if((p) && _rtw_memcmp(p+2, WMM_PARA_IE, 6)) - { - pmlmepriv->qospriv.qos_option = 1; - - *(p+8) |= BIT(7);//QoS Info, support U-APSD - - /* disable all ACM bits since the WMM admission control is not supported */ - *(p + 10) &= ~BIT(4); /* BE */ - *(p + 14) &= ~BIT(4); /* BK */ - *(p + 18) &= ~BIT(4); /* VI */ - *(p + 22) &= ~BIT(4); /* VO */ - - break; - } - - if ((p == NULL) || (ie_len == 0)) - { - break; - } - } - } -#ifdef CONFIG_80211N_HT - //parsing HT_CAP_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - u8 rf_type=0; - HT_CAP_AMPDU_FACTOR max_rx_ampdu_factor=MAX_AMPDU_FACTOR_64K; - struct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p+2); - - if (0) { - DBG_871X(FUNC_ADPT_FMT" HT_CAP_IE from upper layer:\n", FUNC_ADPT_ARG(padapter)); - dump_ht_cap_ie_content(RTW_DBGDUMP, p+2, ie_len); - } - - pHT_caps_ie=p; - - ht_cap = _TRUE; - network_type |= WIRELESS_11_24N; - - rtw_ht_use_default_setting(padapter); - - /* Update HT Capabilities Info field */ - if (pmlmepriv->htpriv.sgi_20m == _FALSE) - pht_cap->cap_info &= ~(IEEE80211_HT_CAP_SGI_20); - - if (pmlmepriv->htpriv.sgi_40m == _FALSE) - pht_cap->cap_info &= ~(IEEE80211_HT_CAP_SGI_40); - - if (!TEST_FLAG(pmlmepriv->htpriv.ldpc_cap, LDPC_HT_ENABLE_RX)) - { - pht_cap->cap_info &= ~(IEEE80211_HT_CAP_LDPC_CODING); - } - - if (!TEST_FLAG(pmlmepriv->htpriv.stbc_cap, STBC_HT_ENABLE_TX)) - { - pht_cap->cap_info &= ~(IEEE80211_HT_CAP_TX_STBC); - } - - if (!TEST_FLAG(pmlmepriv->htpriv.stbc_cap, STBC_HT_ENABLE_RX)) - { - pht_cap->cap_info &= ~(IEEE80211_HT_CAP_RX_STBC_3R); - } - - /* Update A-MPDU Parameters field */ - pht_cap->ampdu_params_info &= ~(IEEE80211_HT_CAP_AMPDU_FACTOR|IEEE80211_HT_CAP_AMPDU_DENSITY); - - if((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) || - (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) - { - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2)); - } - else - { - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00); - } - - rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor); - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & max_rx_ampdu_factor); //set Max Rx AMPDU size to 64K - - _rtw_memcpy(&(pmlmeinfo->HT_caps), pht_cap, sizeof(struct HT_caps_element)); - - /* Update Supported MCS Set field */ - { - int i; - - rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - - /* RX MCS Bitmask */ - switch(rf_type) - { - case RF_1T1R: - case RF_1T2R: //? - set_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_1R); - break; - case RF_2T2R: - 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]; - } - -#ifdef CONFIG_BEAMFORMING - // Use registry value to enable HT Beamforming. - // ToDo: use configure file to set these capability. - pht_cap->tx_BF_cap_info = 0; - - // HT Beamformer - if(TEST_FLAG(pmlmepriv->htpriv.beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE)) - { - // Transmit NDP Capable - SET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(pht_cap, 1); - // Explicit Compressed Steering Capable - SET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pht_cap, 1); - // Compressed Steering Number Antennas - SET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pht_cap, 1); - rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMER_CAP, (u8 *)&rf_num); - SET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(pht_cap, rf_num); - } - - // HT Beamformee - if(TEST_FLAG(pmlmepriv->htpriv.beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE)) - { - // Receive NDP Capable - SET_HT_CAP_TXBF_RECEIVE_NDP_CAP(pht_cap, 1); - // Explicit Compressed Beamforming Feedback Capable - SET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pht_cap, 2); - rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMEE_CAP, (u8 *)&rf_num); - SET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pht_cap, rf_num); - } -#endif //CONFIG_BEAMFORMING - - _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len); - - if (0) { - DBG_871X(FUNC_ADPT_FMT" HT_CAP_IE driver masked:\n", FUNC_ADPT_ARG(padapter)); - dump_ht_cap_ie_content(RTW_DBGDUMP, p+2, ie_len); - } - } - - //parsing HT_INFO_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - pHT_info_ie=p; - } -#endif //CONFIG_80211N_HT - switch(network_type) - { - case WIRELESS_11B: - pbss_network->NetworkTypeInUse = Ndis802_11DS; - break; - case WIRELESS_11G: - case WIRELESS_11BG: - case WIRELESS_11G_24N: - case WIRELESS_11BG_24N: - pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; - break; - case WIRELESS_11A: - pbss_network->NetworkTypeInUse = Ndis802_11OFDM5; - break; - default : - pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; - break; - } - - pmlmepriv->cur_network.network_type = network_type; - -#ifdef CONFIG_80211N_HT - pmlmepriv->htpriv.ht_option = _FALSE; - - if( (psecuritypriv->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) || - (psecuritypriv->wpa_pairwise_cipher&WPA_CIPHER_TKIP)) - { - //todo: - //ht_cap = _FALSE; - } - - //ht_cap - if(pregistrypriv->ht_enable && ht_cap==_TRUE) - { - pmlmepriv->htpriv.ht_option = _TRUE; - pmlmepriv->qospriv.qos_option = 1; - - if(pregistrypriv->ampdu_enable==1) - { - pmlmepriv->htpriv.ampdu_enable = _TRUE; - } - - HT_caps_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_caps_ie); - - HT_info_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_info_ie); - } -#endif - -#ifdef CONFIG_80211AC_VHT - - //Parsing VHT CAP IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, EID_VHTCapability, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - vht_cap = _TRUE; - } - //Parsing VHT OPERATION IE - - - pmlmepriv->vhtpriv.vht_option = _FALSE; - // if channel in 5G band, then add vht ie . - if ((pbss_network->Configuration.DSConfig > 14) && - (pmlmepriv->htpriv.ht_option == _TRUE) && - (pregistrypriv->vht_enable)) - { - if(vht_cap == _TRUE) - { - pmlmepriv->vhtpriv.vht_option = _TRUE; - } - else if(pregistrypriv->vht_enable == 2) // auto enabled - { - u8 cap_len, operation_len; - - rtw_vht_use_default_setting(padapter); - - { - /* VHT Operation mode notifiy bit in Extended IE (127) */ - uint len = 0; - - SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(pmlmepriv->ext_capab_ie_data, 1); - pmlmepriv->ext_capab_ie_len = 10; - rtw_set_ie(pbss_network->IEs + pbss_network->IELength, EID_EXTCapability, 8, pmlmepriv->ext_capab_ie_data, &len); - pbss_network->IELength += pmlmepriv->ext_capab_ie_len; - } - - // VHT Capabilities element - cap_len = rtw_build_vht_cap_ie(padapter, pbss_network->IEs + pbss_network->IELength); - pbss_network->IELength += cap_len; - - // VHT Operation element - operation_len = rtw_build_vht_operation_ie(padapter, pbss_network->IEs + pbss_network->IELength, pbss_network->Configuration.DSConfig); - pbss_network->IELength += operation_len; - - pmlmepriv->vhtpriv.vht_option = _TRUE; - } - } -#endif //CONFIG_80211AC_VHT - - pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network); - - rtw_ies_get_chbw(pbss_network->IEs + _BEACON_IE_OFFSET_, pbss_network->IELength - _BEACON_IE_OFFSET_ - , &pmlmepriv->ori_ch, &pmlmepriv->ori_bw, &pmlmepriv->ori_offset); - rtw_warn_on(pmlmepriv->ori_ch == 0); - -{ - /* alloc sta_info for ap itself */ - - struct sta_info *sta; - - sta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress); - if (!sta) { - sta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress); - if (sta == NULL) - return _FAIL; - } -} - - rtw_startbss_cmd(padapter, RTW_CMDF_WAIT_ACK); - - rtw_indicate_connect( padapter); - - pmlmepriv->cur_network.join_res = _TRUE;//for check if already set beacon - - //update bc/mc sta_info - //update_bmc_sta(padapter); - - return ret; - -} - -void rtw_set_macaddr_acl(_adapter *padapter, int mode) -{ - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - - DBG_871X("%s, mode=%d\n", __func__, mode); - - pacl_list->mode = mode; -} - -int rtw_acl_add_sta(_adapter *padapter, u8 *addr) -{ - _irqL irqL; - _list *plist, *phead; - u8 added = _FALSE; - int i, ret=0; - struct rtw_wlan_acl_node *paclnode; - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - - DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); - - if((NUM_ACL-1) < pacl_list->num) - return (-1); - - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); - - if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN)) - { - if(paclnode->valid == _TRUE) - { - added = _TRUE; - DBG_871X("%s, sta has been added\n", __func__); - break; - } - } - } - - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - - if(added == _TRUE) - return ret; - - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - - for(i=0; i< NUM_ACL; i++) - { - paclnode = &pacl_list->aclnode[i]; - - if(paclnode->valid == _FALSE) - { - _rtw_init_listhead(&paclnode->list); - - _rtw_memcpy(paclnode->addr, addr, ETH_ALEN); - - paclnode->valid = _TRUE; - - rtw_list_insert_tail(&paclnode->list, get_list_head(pacl_node_q)); - - pacl_list->num++; - - break; - } - } - - DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); - - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - return ret; -} - -int rtw_acl_remove_sta(_adapter *padapter, u8 *addr) -{ - _irqL irqL; - _list *plist, *phead; - int i, ret=0; - struct rtw_wlan_acl_node *paclnode; - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - u8 baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; //Baddr is used for clearing acl_list - - DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); - - if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN) || _rtw_memcmp(baddr, addr, ETH_ALEN)) - { - if(paclnode->valid == _TRUE) - { - paclnode->valid = _FALSE; - - rtw_list_delete(&paclnode->list); - - pacl_list->num--; - } - } - } - - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); - - return ret; - -} - -u8 rtw_ap_set_pairwise_key(_adapter *padapter, struct sta_info *psta) -{ - struct cmd_obj* ph2c; - struct set_stakey_parm *psetstakey_para; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if ( ph2c == NULL){ - res= _FAIL; - goto exit; - } - - psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); - if(psetstakey_para==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); - - - psetstakey_para->algorithm = (u8)psta->dot118021XPrivacy; - - _rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN); - - _rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16); - - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - - return res; - -} - -static int rtw_ap_set_key(_adapter *padapter, u8 *key, u8 alg, int keyid, u8 set_tx) -{ - u8 keylen; - struct cmd_obj* pcmd; - struct setkey_parm *psetkeyparm; - struct cmd_priv *pcmdpriv=&(padapter->cmdpriv); - int res=_SUCCESS; - - //DBG_871X("%s\n", __FUNCTION__); - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; - goto exit; - } - psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); - if(psetkeyparm==NULL){ - rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); - - psetkeyparm->keyid=(u8)keyid; - if (is_wep_enc(alg)) - padapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid); - - psetkeyparm->algorithm = alg; - - psetkeyparm->set_tx = set_tx; - - switch(alg) - { - case _WEP40_: - keylen = 5; - break; - case _WEP104_: - keylen = 13; - break; - case _TKIP_: - case _TKIP_WTMIC_: - case _AES_: - default: - keylen = 16; - } - - _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen); - - pcmd->cmdcode = _SetKey_CMD_; - pcmd->parmbuf = (u8 *)psetkeyparm; - pcmd->cmdsz = (sizeof(struct setkey_parm)); - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - - _rtw_init_listhead(&pcmd->list); - - res = rtw_enqueue_cmd(pcmdpriv, pcmd); - -exit: - - return res; -} - -int rtw_ap_set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid) -{ - DBG_871X("%s\n", __FUNCTION__); - - return rtw_ap_set_key(padapter, key, alg, keyid, 1); -} - -int rtw_ap_set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid, u8 set_tx) -{ - u8 alg; - - switch(keylen) - { - case 5: - alg =_WEP40_; - break; - case 13: - alg =_WEP104_; - break; - default: - alg =_NO_PRIVACY_; - } - - DBG_871X("%s\n", __FUNCTION__); - - return rtw_ap_set_key(padapter, key, alg, keyid, set_tx); -} - -u8 rtw_ap_bmc_frames_hdl(_adapter *padapter) -{ -#define HIQ_XMIT_COUNTS (6) - _irqL irqL; - struct sta_info *psta_bmc; - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe = NULL; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct sta_priv *pstapriv = &padapter->stapriv; - bool update_tim = _FALSE; - - - if (padapter->registrypriv.wifi_spec != 1) - return H2C_SUCCESS; - - - psta_bmc = rtw_get_bcmc_stainfo(padapter); - if (!psta_bmc) - return H2C_SUCCESS; - - - _enter_critical_bh(&pxmitpriv->lock, &irqL); - - if ((pstapriv->tim_bitmap & BIT(0)) && (psta_bmc->sleepq_len > 0)) { - int tx_counts = 0; - - _update_beacon(padapter, _TIM_IE_, NULL, _FALSE, "update TIM with TIB=1"); - - DBG_871X("sleepq_len of bmc_sta = %d\n", psta_bmc->sleepq_len); - - xmitframe_phead = get_list_head(&psta_bmc->sleep_q); - xmitframe_plist = get_next(xmitframe_phead); - - 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); - - psta_bmc->sleepq_len--; - tx_counts++; - - if (psta_bmc->sleepq_len > 0) - pxmitframe->attrib.mdata = 1; - else - pxmitframe->attrib.mdata = 0; - - if (tx_counts == HIQ_XMIT_COUNTS) - pxmitframe->attrib.mdata = 0; - - pxmitframe->attrib.triggered = 1; - - if (xmitframe_hiq_filter(pxmitframe) == _TRUE) - pxmitframe->attrib.qsel = QSLT_HIGH;/*HIQ*/ - - rtw_hal_xmitframe_enqueue(padapter, pxmitframe); - - if (tx_counts == HIQ_XMIT_COUNTS) - break; - - } - - } else { - if (psta_bmc->sleepq_len == 0) { - - /*DBG_871X("sleepq_len of bmc_sta = %d\n", psta_bmc->sleepq_len);*/ - - if (pstapriv->tim_bitmap & BIT(0)) - update_tim = _TRUE; - - pstapriv->tim_bitmap &= ~BIT(0); - pstapriv->sta_dz_bitmap &= ~BIT(0); - - if (update_tim == _TRUE) { - DBG_871X("clear TIB\n"); - _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "bmc sleepq and HIQ empty"); - } - } - } - - _exit_critical_bh(&pxmitpriv->lock, &irqL); - -/* - //HIQ Check - rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty); - - while (_FALSE == empty && rtw_get_passing_time_ms(start) < 3000) - { - rtw_msleep_os(100); - rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty); - } - - - printk("check if hiq empty=%d\n", empty); -*/ - - return H2C_SUCCESS; -} - -#ifdef CONFIG_NATIVEAP_MLME - -static void associated_stainfo_update(_adapter *padapter, struct sta_info *psta, u32 sta_info_type) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - DBG_871X("%s: "MAC_FMT", updated_type=0x%x\n", __func__, MAC_ARG(psta->hwaddr), sta_info_type); - - if (sta_info_type & STA_INFO_UPDATE_BW) { - - if ((psta->flags & WLAN_STA_HT) && !psta->ht_20mhz_set) { - if (pmlmepriv->sw_to_20mhz) { - psta->bw_mode = CHANNEL_WIDTH_20; - /*psta->htpriv.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;*/ - psta->htpriv.sgi_40m = _FALSE; - } else { - /*TODO: Switch back to 40MHZ?80MHZ*/ - } - } - } - -/* - if (sta_info_type & STA_INFO_UPDATE_RATE) { - - } -*/ - - if (sta_info_type & STA_INFO_UPDATE_PROTECTION_MODE) - VCS_update(padapter, psta); - -/* - if (sta_info_type & STA_INFO_UPDATE_CAP) { - - } - - if (sta_info_type & STA_INFO_UPDATE_HT_CAP) { - - } - - if (sta_info_type & STA_INFO_UPDATE_VHT_CAP) { - - } -*/ - -} - -static void update_bcn_ext_capab_ie(_adapter *padapter) -{ - sint ie_len = 0; - unsigned char *pbuf; - 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 = &(pmlmeinfo->network); - u8 *ie = pnetwork->IEs; - u8 null_extcap_data[8] = {0}; - - pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_CAP_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if (pbuf && ie_len > 0) - rtw_remove_bcn_ie(padapter, pnetwork, _EXT_CAP_IE_); - - if ((pmlmepriv->ext_capab_ie_len > 0) && - (_rtw_memcmp(pmlmepriv->ext_capab_ie_data, null_extcap_data, sizeof(null_extcap_data)) == _FALSE)) - rtw_add_bcn_ie(padapter, pnetwork, _EXT_CAP_IE_, pmlmepriv->ext_capab_ie_data, pmlmepriv->ext_capab_ie_len); - -} - -static void update_bcn_fixed_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_erpinfo_ie(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); - unsigned char *p, *ie = pnetwork->IEs; - u32 len = 0; - - DBG_871X("%s, ERP_enable=%d\n", __FUNCTION__, pmlmeinfo->ERP_enable); - - if(!pmlmeinfo->ERP_enable) - return; - - //parsing ERP_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if(p && len>0) - { - PNDIS_802_11_VARIABLE_IEs pIE = (PNDIS_802_11_VARIABLE_IEs)p; - - if (pmlmepriv->num_sta_non_erp == 1) - pIE->data[0] |= RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION; - else - pIE->data[0] &= ~(RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION); - - if(pmlmepriv->num_sta_no_short_preamble > 0) - pIE->data[0] |= RTW_ERP_INFO_BARKER_PREAMBLE_MODE; - else - pIE->data[0] &= ~(RTW_ERP_INFO_BARKER_PREAMBLE_MODE); - - ERP_IE_handler(padapter, pIE); - } - -} - -static void update_bcn_htcap_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_htinfo_ie(_adapter *padapter) -{ - /* - u8 beacon_updated = _FALSE; - u32 sta_info_update_type = STA_INFO_UPDATE_NONE; - */ - 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 = &(pmlmeinfo->network); - unsigned char *p, *ie = pnetwork->IEs; - u32 len = 0; - - if (pmlmepriv->htpriv.ht_option == _FALSE) - return; - - if (pmlmeinfo->HT_info_enable != 1) - return; - - - DBG_871X("%s current operation mode=0x%X\n", - __FUNCTION__, pmlmepriv->ht_op_mode); - - DBG_871X("num_sta_40mhz_intolerant(%d), 20mhz_width_req(%d), intolerant_ch_rpt(%d), olbc(%d)\n", - pmlmepriv->num_sta_40mhz_intolerant, pmlmepriv->ht_20mhz_width_req, pmlmepriv->ht_intolerant_ch_reported, pmlmepriv->olbc); - - /*parsing HT_INFO_IE, currently only update ht_op_mode - pht_info->infos[1] & pht_info->infos[2] for wifi logo test*/ - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if (p && len > 0) { - struct HT_info_element *pht_info = NULL; - - pht_info = (struct HT_info_element *)(p + 2); - - /* for STA Channel Width/Secondary Channel Offset*/ - if ((pmlmepriv->sw_to_20mhz == 0) && (pmlmeext->cur_channel <= 14)) { - if ((pmlmepriv->num_sta_40mhz_intolerant > 0) || (pmlmepriv->ht_20mhz_width_req == _TRUE) - || (pmlmepriv->ht_intolerant_ch_reported == _TRUE) || (pmlmepriv->olbc == _TRUE)) { - SET_HT_OP_ELE_2ND_CHL_OFFSET(pht_info, 0); - SET_HT_OP_ELE_STA_CHL_WIDTH(pht_info, 0); - - pmlmepriv->sw_to_20mhz = 1; - /* - sta_info_update_type |= STA_INFO_UPDATE_BW; - beacon_updated = _TRUE; - */ - - DBG_871X("%s:switching to 20Mhz\n", __FUNCTION__); - - /*TODO : cur_bwmode/cur_ch_offset switches to 20Mhz*/ - } - } else { - - if ((pmlmepriv->num_sta_40mhz_intolerant == 0) && (pmlmepriv->ht_20mhz_width_req == _FALSE) - && (pmlmepriv->ht_intolerant_ch_reported == _FALSE) && (pmlmepriv->olbc == _FALSE)) { - - if (pmlmeext->cur_bwmode >= CHANNEL_WIDTH_40) { - - SET_HT_OP_ELE_STA_CHL_WIDTH(pht_info, 1); - - SET_HT_OP_ELE_2ND_CHL_OFFSET(pht_info, - (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) ? - HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE : HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW); - - pmlmepriv->sw_to_20mhz = 0; - /* - sta_info_update_type |= STA_INFO_UPDATE_BW; - beacon_updated = _TRUE; - */ - - DBG_871X("%s:switching back to 40Mhz\n", __FUNCTION__); - } - } - } - - /* to update ht_op_mode*/ - *(u16 *)(pht_info->infos + 1) = cpu_to_le16(pmlmepriv->ht_op_mode); - - } - - /*associated_clients_update(padapter, beacon_updated, sta_info_update_type);*/ - -} - -static void update_bcn_rsn_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wpa_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wmm_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wps_ie(_adapter *padapter) -{ - u8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL; - uint wps_ielen=0, wps_offset, remainder_ielen; - 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 = &(pmlmeinfo->network); - unsigned char *ie = pnetwork->IEs; - u32 ielen = pnetwork->IELength; - - - DBG_871X("%s\n", __FUNCTION__); - - pwps_ie = rtw_get_wps_ie(ie+_FIXED_IE_LENGTH_, ielen-_FIXED_IE_LENGTH_, NULL, &wps_ielen); - - if(pwps_ie==NULL || wps_ielen==0) - return; - - pwps_ie_src = pmlmepriv->wps_beacon_ie; - if(pwps_ie_src == NULL) - return; - - wps_offset = (uint)(pwps_ie-ie); - - premainder_ie = pwps_ie + wps_ielen; - - remainder_ielen = ielen - wps_offset - wps_ielen; - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - wps_ielen = (uint)pwps_ie_src[1];//to get ie data len - if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) - { - _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2); - pwps_ie += (wps_ielen+2); - - if(pbackup_remainder_ie) - _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); - - //update IELength - pnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen; - } - - if(pbackup_remainder_ie) - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - - // deal with the case without set_tx_beacon_cmd() in update_beacon() -#if defined( CONFIG_INTERRUPT_BASED_TXBCN ) || defined( CONFIG_PCI_HCI ) - if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - u8 sr = 0; - rtw_get_wps_attr_content(pwps_ie_src, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL); - - if( sr ) { - set_fwstate(pmlmepriv, WIFI_UNDER_WPS); - DBG_871X("%s, set WIFI_UNDER_WPS\n", __func__); - } - } -#endif -} - -static void update_bcn_p2p_ie(_adapter *padapter) -{ - -} - -static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui) -{ - DBG_871X("%s\n", __FUNCTION__); - - if(_rtw_memcmp(RTW_WPA_OUI, oui, 4)) - { - update_bcn_wpa_ie(padapter); - } - else if(_rtw_memcmp(WMM_OUI, oui, 4)) - { - update_bcn_wmm_ie(padapter); - } - else if(_rtw_memcmp(WPS_OUI, oui, 4)) - { - update_bcn_wps_ie(padapter); - } - else if(_rtw_memcmp(P2P_OUI, oui, 4)) - { - update_bcn_p2p_ie(padapter); - } - else - { - DBG_871X("unknown OUI type!\n"); - } - - -} - -void _update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx, const char *tag) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv; - struct mlme_ext_priv *pmlmeext; - //struct mlme_ext_info *pmlmeinfo; - - //DBG_871X("%s\n", __FUNCTION__); - - if(!padapter) - return; - - pmlmepriv = &(padapter->mlmepriv); - pmlmeext = &(padapter->mlmeextpriv); - //pmlmeinfo = &(pmlmeext->mlmext_info); - - if(_FALSE == pmlmeext->bstart_bss) - return; - - _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - - switch(ie_id) - { - case 0xFF: - - update_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability - - break; - - case _TIM_IE_: - - update_BCNTIM(padapter); - - break; - - case _ERPINFO_IE_: - - update_bcn_erpinfo_ie(padapter); - - break; - - case _HT_CAPABILITY_IE_: - - update_bcn_htcap_ie(padapter); - - break; - - case _RSN_IE_2_: - - update_bcn_rsn_ie(padapter); - - break; - - case _HT_ADD_INFO_IE_: - - update_bcn_htinfo_ie(padapter); - - break; - - case _EXT_CAP_IE_: - - update_bcn_ext_capab_ie(padapter); - - break; - - case _VENDOR_SPECIFIC_IE_: - - update_bcn_vendor_spec_ie(padapter, oui); - - break; - - default: - break; - } - - pmlmepriv->update_bcn = _TRUE; - - _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - -#ifndef CONFIG_INTERRUPT_BASED_TXBCN -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - if(tx) - { - //send_beacon(padapter);//send_beacon must execute on TSR level - if (0) - DBG_871X(FUNC_ADPT_FMT" ie_id:%u - %s\n", FUNC_ADPT_ARG(padapter), ie_id, tag); - set_tx_beacon_cmd(padapter); - } -#else - { - //PCI will issue beacon when BCN interrupt occurs. - } -#endif -#endif //!CONFIG_INTERRUPT_BASED_TXBCN - -} - -#ifdef CONFIG_80211N_HT - -void rtw_process_public_act_bsscoex(_adapter *padapter, u8 *pframe, uint frame_len) -{ - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); - uint frame_body_len = frame_len - sizeof(struct rtw_ieee80211_hdr_3addr); - u8 category, action; - - psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - if (psta == NULL) - return; - - - category = frame_body[0]; - action = frame_body[1]; - - if (frame_body_len > 0) { - if ((frame_body[2] == EID_BSSCoexistence) && (frame_body[3] > 0)) { - u8 ie_data = frame_body[4]; - - if (ie_data & RTW_WLAN_20_40_BSS_COEX_40MHZ_INTOL) { - if (psta->ht_40mhz_intolerant == 0) { - psta->ht_40mhz_intolerant = 1; - pmlmepriv->num_sta_40mhz_intolerant++; - beacon_updated = _TRUE; - } - } else if (ie_data & RTW_WLAN_20_40_BSS_COEX_20MHZ_WIDTH_REQ) { - if (pmlmepriv->ht_20mhz_width_req == _FALSE) { - pmlmepriv->ht_20mhz_width_req = _TRUE; - beacon_updated = _TRUE; - } - } else - beacon_updated = _FALSE; - } - } - - if (frame_body_len > 8) { - /* if EID_BSSIntolerantChlReport ie exists */ - if ((frame_body[5] == EID_BSSIntolerantChlReport) && (frame_body[6] > 0)) { - /*todo:*/ - if (pmlmepriv->ht_intolerant_ch_reported == _FALSE) { - pmlmepriv->ht_intolerant_ch_reported = _TRUE; - beacon_updated = _TRUE; - } - } - } - - if (beacon_updated) { - - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); - - associated_stainfo_update(padapter, psta, STA_INFO_UPDATE_BW); - } - - - -} - -void rtw_process_ht_action_smps(_adapter *padapter, u8 *ta, u8 ctrl_field) -{ - u8 e_field, m_field; - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - - psta = rtw_get_stainfo(pstapriv, ta); - if (psta == NULL) - return; - - e_field = (ctrl_field & BIT(0)) ? 1 : 0; - m_field = (ctrl_field & BIT(1)) ? 1 : 0; - - if (e_field) { - - /* enable */ - /* 0:static SMPS, 1:dynamic SMPS, 3:SMPS disabled, 2:reserved*/ - - if (m_field) /*mode*/ - psta->htpriv.smps_cap = 1; - else - psta->htpriv.smps_cap = 0; - } else { - /*disable*/ - psta->htpriv.smps_cap = 3; - } - - rtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta); - -} - -/* -op_mode -Set to 0 (HT pure) under the followign conditions - - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or - - all STAs in the BSS are 20 MHz HT in 20 MHz BSS -Set to 1 (HT non-member protection) if there may be non-HT STAs - in both the primary and the secondary channel -Set to 2 if only HT STAs are associated in BSS, - however and at least one 20 MHz HT STA is associated -Set to 3 (HT mixed mode) when one or more non-HT STAs are associated - (currently non-GF HT station is considered as non-HT STA also) -*/ -static int rtw_ht_operation_update(_adapter *padapter) -{ - u16 cur_op_mode, new_op_mode; - int op_mode_changes = 0; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; - - if (pmlmepriv->htpriv.ht_option == _FALSE) - return 0; - - /*if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) - return 0;*/ - - DBG_871X("%s current operation mode=0x%X\n", - __FUNCTION__, pmlmepriv->ht_op_mode); - - if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) - && pmlmepriv->num_sta_ht_no_gf) { - pmlmepriv->ht_op_mode |= - HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; - op_mode_changes++; - } else if ((pmlmepriv->ht_op_mode & - HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && - pmlmepriv->num_sta_ht_no_gf == 0) { - pmlmepriv->ht_op_mode &= - ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; - op_mode_changes++; - } - - if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && - (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) { - pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; - op_mode_changes++; - } else if ((pmlmepriv->ht_op_mode & - HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && - (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) { - pmlmepriv->ht_op_mode &= - ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; - op_mode_changes++; - } - - /* Note: currently we switch to the MIXED op mode if HT non-greenfield - * station is associated. Probably it's a theoretical case, since - * it looks like all known HT STAs support greenfield. - */ - new_op_mode = 0; - if (pmlmepriv->num_sta_no_ht /*|| - (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)*/) - new_op_mode = OP_MODE_MIXED; - else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH) - && pmlmepriv->num_sta_ht_20mhz) - new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; - else if (pmlmepriv->olbc_ht) - new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; - else - new_op_mode = OP_MODE_PURE; - - cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; - if (cur_op_mode != new_op_mode) { - pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; - pmlmepriv->ht_op_mode |= new_op_mode; - op_mode_changes++; - } - - DBG_871X("%s new operation mode=0x%X changes=%d\n", - __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes); - - return op_mode_changes; - -} - -#endif /* CONFIG_80211N_HT */ - -void associated_clients_update(_adapter *padapter, u8 updated, u32 sta_info_type) -{ - //update associcated stations cap. - if(updated == _TRUE) - { - _irqL irqL; - _list *phead, *plist; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - associated_stainfo_update(padapter, psta, sta_info_type); - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - } - -} - -/* called > TSR LEVEL for USB or SDIO Interface*/ -void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta) -{ - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - -#if 0 - if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && - !psta->no_short_preamble_set) { - psta->no_short_preamble_set = 1; - pmlmepriv->num_sta_no_short_preamble++; - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 1)) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - - if(!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) - { - if(!psta->no_short_preamble_set) - { - psta->no_short_preamble_set = 1; - - pmlmepriv->num_sta_no_short_preamble++; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 1)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - } - } - else - { - if(psta->no_short_preamble_set) - { - psta->no_short_preamble_set = 0; - - pmlmepriv->num_sta_no_short_preamble--; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 0)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - } - } - -#if 0 - if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) { - psta->nonerp_set = 1; - pmlmepriv->num_sta_non_erp++; - if (pmlmepriv->num_sta_non_erp == 1) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - if(psta->flags & WLAN_STA_NONERP) - { - if(!psta->nonerp_set) - { - psta->nonerp_set = 1; - - pmlmepriv->num_sta_non_erp++; - - if (pmlmepriv->num_sta_non_erp == 1) - { - beacon_updated = _TRUE; - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - } - - } - else - { - if(psta->nonerp_set) - { - psta->nonerp_set = 0; - - pmlmepriv->num_sta_non_erp--; - - if (pmlmepriv->num_sta_non_erp == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - } - - } - - -#if 0 - if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) && - !psta->no_short_slot_time_set) { - psta->no_short_slot_time_set = 1; - pmlmepriv->num_sta_no_short_slot_time++; - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 1)) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - if(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) - { - if(!psta->no_short_slot_time_set) - { - psta->no_short_slot_time_set = 1; - - pmlmepriv->num_sta_no_short_slot_time++; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 1)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - } - } - else - { - if(psta->no_short_slot_time_set) - { - psta->no_short_slot_time_set = 0; - - pmlmepriv->num_sta_no_short_slot_time--; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 0)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - } - -#ifdef CONFIG_80211N_HT - - if (psta->flags & WLAN_STA_HT) - { - u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); - - DBG_871X("HT: STA " MAC_FMT " HT Capabilities " - "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab); - - if (psta->no_ht_set) { - psta->no_ht_set = 0; - pmlmepriv->num_sta_no_ht--; - } - - if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { - if (!psta->no_ht_gf_set) { - psta->no_ht_gf_set = 1; - pmlmepriv->num_sta_ht_no_gf++; - } - DBG_871X("%s STA " MAC_FMT " - no " - "greenfield, num of non-gf stations %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_ht_no_gf); - } - - if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) { - if (!psta->ht_20mhz_set) { - psta->ht_20mhz_set = 1; - pmlmepriv->num_sta_ht_20mhz++; - } - DBG_871X("%s STA " MAC_FMT " - 20 MHz HT, " - "num of 20MHz HT STAs %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_ht_20mhz); - } - - - if (ht_capab & RTW_IEEE80211_HT_CAP_40MHZ_INTOLERANT) { - - if (!psta->ht_40mhz_intolerant) { - psta->ht_40mhz_intolerant = 1; - pmlmepriv->num_sta_40mhz_intolerant++; - DBG_871X("%s STA " MAC_FMT " - HT_CAP_40MHZ_INTOLERANT is set\n" , - __FUNCTION__, MAC_ARG(psta->hwaddr)); - beacon_updated = _TRUE; - } - -/* - if (pmlmepriv->ht_40mhz_intolerant == _FALSE) { - - pmlmepriv->ht_40mhz_intolerant = _TRUE; - - DBG_871X("%s STA " MAC_FMT " - HT_CAP_40MHZ_INTOLERANT is set\n" , - __FUNCTION__, MAC_ARG(psta->hwaddr)); - - beacon_updated = _TRUE; - } -*/ - - /*update ext_capab_ie_len & ext_capab_ie_data for beacon, probersp, assocrsp.*/ - if (pmlmepriv->ext_capab_ie_len == 0) - pmlmepriv->ext_capab_ie_len = 1; - SET_EXT_CAPABILITY_ELE_BSS_COEXIST(pmlmepriv->ext_capab_ie_data, 1); - - update_beacon(padapter, _EXT_CAP_IE_, NULL, _FALSE); - } - - } - else - { - if (!psta->no_ht_set) { - psta->no_ht_set = 1; - pmlmepriv->num_sta_no_ht++; - } - if(pmlmepriv->htpriv.ht_option == _TRUE) { - DBG_871X("%s STA " MAC_FMT - " - no HT, num of non-HT stations %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_no_ht); - } - } - - if (rtw_ht_operation_update(padapter) > 0) { - update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); - /*beacon_updated = _TRUE;*/ - } - -#endif /* CONFIG_80211N_HT */ - - //update associcated stations cap. - associated_clients_update(padapter, beacon_updated, STA_INFO_UPDATE_ALL); - - DBG_871X("%s, updated=%d\n", __func__, beacon_updated); - -} - -u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta) -{ - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - if(!psta) - return beacon_updated; - - if (psta->no_short_preamble_set) { - psta->no_short_preamble_set = 0; - pmlmepriv->num_sta_no_short_preamble--; - if (pmlmeext->cur_wireless_mode > WIRELESS_11B - && pmlmepriv->num_sta_no_short_preamble == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - - if (psta->nonerp_set) { - psta->nonerp_set = 0; - pmlmepriv->num_sta_non_erp--; - if (pmlmepriv->num_sta_non_erp == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - } - - if (psta->no_short_slot_time_set) { - psta->no_short_slot_time_set = 0; - pmlmepriv->num_sta_no_short_slot_time--; - if (pmlmeext->cur_wireless_mode > WIRELESS_11B - && pmlmepriv->num_sta_no_short_slot_time == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - -#ifdef CONFIG_80211N_HT - - if (psta->no_ht_gf_set) { - psta->no_ht_gf_set = 0; - pmlmepriv->num_sta_ht_no_gf--; - } - - if (psta->no_ht_set) { - psta->no_ht_set = 0; - pmlmepriv->num_sta_no_ht--; - } - - if (psta->ht_20mhz_set) { - psta->ht_20mhz_set = 0; - pmlmepriv->num_sta_ht_20mhz--; - } - - if (psta->ht_40mhz_intolerant) { - psta->ht_40mhz_intolerant = 0; - pmlmepriv->num_sta_40mhz_intolerant--; - - /*update ext_capab_ie_len & ext_capab_ie_data for beacon, probersp, assocrsp.*/ - if ((pmlmepriv->ext_capab_ie_len > 0) && (pmlmepriv->num_sta_40mhz_intolerant == 0)) { - SET_EXT_CAPABILITY_ELE_BSS_COEXIST(pmlmepriv->ext_capab_ie_data, 0); - update_beacon(padapter, _EXT_CAP_IE_, NULL, _FALSE); - } - - beacon_updated = _TRUE; - - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _FALSE); - } - - if (rtw_ht_operation_update(padapter) > 0) { - update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); - } - -#endif /* CONFIG_80211N_HT */ - - /* update associated stations cap. - associated_clients_update(padapter, beacon_updated, STA_INFO_UPDATE_ALL); //move it to avoid deadlock - */ - - DBG_871X("%s, updated=%d\n", __func__, beacon_updated); - - return beacon_updated; - -} - -u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason, bool enqueue) -{ - _irqL irqL; - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - if(!psta) - return beacon_updated; - - if (active == _TRUE) - { -#ifdef CONFIG_80211N_HT - //tear down Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //tear down TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - -#endif //CONFIG_80211N_HT - - issue_deauth(padapter, psta->hwaddr, reason); - } - -#ifdef CONFIG_BEAMFORMING - beamforming_wk_cmd(padapter, BEAMFORMING_CTRL_LEAVE, psta->hwaddr, ETH_ALEN, 1); -#endif - - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - - //clear cam entry / key - rtw_clearstakey_cmd(padapter, psta, enqueue); - - - _enter_critical_bh(&psta->lock, &irqL); - psta->state &= ~_FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - #ifdef CONFIG_IOCTL_CFG80211 - if (1) { - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); - #else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - /* will call rtw_cfg80211_indicate_sta_disassoc() in cmd_thread for old API context */ - #endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - } else - #endif //CONFIG_IOCTL_CFG80211 - { - rtw_indicate_sta_disassoc_event(padapter, psta); - } - - report_del_sta_event(padapter, psta->hwaddr, reason, enqueue); - - beacon_updated = bss_cap_update_on_sta_leave(padapter, psta); - - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - - return beacon_updated; - -} - -int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset) -{ - _irqL irqL; - _list *phead, *plist; - int ret=0; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - return ret; - - DBG_871X(FUNC_NDEV_FMT" with ch:%u, offset:%u\n", - FUNC_NDEV_ARG(padapter->pnetdev), new_ch, ch_offset); - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - /* for each sta in asoc_queue */ - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); - - issue_action_spct_ch_switch(padapter, psta->hwaddr, new_ch, ch_offset); - psta->expire_to = ((pstapriv->expire_to * 2) > 5) ? 5 : (pstapriv->expire_to * 2); - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - issue_action_spct_ch_switch(padapter, bc_addr, new_ch, ch_offset); - - return ret; -} - -int rtw_sta_flush(_adapter *padapter, bool enqueue) -{ - _irqL irqL; - _list *phead, *plist; - int ret = 0; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - u8 flush_num = 0; - char flush_list[NUM_STA]; - int i; - - if ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - return ret; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); - - /* pick sta from sta asoc_queue */ - _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); - - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - - stainfo_offset = rtw_stainfo_offset(pstapriv, psta); - if (stainfo_offset_valid(stainfo_offset)) - flush_list[flush_num++] = stainfo_offset; - else - rtw_warn_on(1); - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - /* call ap_free_sta() for each sta picked */ - for (i = 0; i < flush_num; i++) { - psta = rtw_get_stainfo_by_offset(pstapriv, flush_list[i]); - ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING, enqueue); - } - - issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); - - associated_clients_update(padapter, _TRUE, STA_INFO_UPDATE_ALL); - - return ret; -} - -/* called > TSR LEVEL for USB or SDIO Interface*/ -void sta_info_update(_adapter *padapter, struct sta_info *psta) -{ - int flags = psta->flags; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - - //update wmm cap. - if(WLAN_STA_WME&flags) - psta->qos_option = 1; - else - psta->qos_option = 0; - - if(pmlmepriv->qospriv.qos_option == 0) - psta->qos_option = 0; - - -#ifdef CONFIG_80211N_HT - //update 802.11n ht cap. - if(WLAN_STA_HT&flags) - { - psta->htpriv.ht_option = _TRUE; - psta->qos_option = 1; - - psta->htpriv.smps_cap = (psta->htpriv.ht_cap.cap_info & IEEE80211_HT_CAP_SM_PS)>>2; - } - else - { - psta->htpriv.ht_option = _FALSE; - } - - if(pmlmepriv->htpriv.ht_option == _FALSE) - psta->htpriv.ht_option = _FALSE; -#endif - -#ifdef CONFIG_80211AC_VHT - //update 802.11AC vht cap. - if(WLAN_STA_VHT&flags) - { - psta->vhtpriv.vht_option = _TRUE; - } - else - { - psta->vhtpriv.vht_option = _FALSE; - } - - if(pmlmepriv->vhtpriv.vht_option == _FALSE) - psta->vhtpriv.vht_option = _FALSE; -#endif - - - update_sta_info_apmode(padapter, psta); - - -} - -/* called >= TSR LEVEL for USB or SDIO Interface*/ -void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if(psta->state & _FW_LINKED) - { - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - - //add ratid - add_RATid(padapter, psta, 0);//DM_RATR_STA_INIT - } -} -/* restore hw setting from sw data structures */ -void rtw_ap_restore_network(_adapter *padapter) -{ - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv * pstapriv = &padapter->stapriv; - struct sta_info *psta; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - _irqL irqL; - _list *phead, *plist; - u8 chk_alive_num = 0; - char chk_alive_list[NUM_STA]; - int i; - - rtw_setopmode_cmd(padapter, Ndis802_11APMode,_FALSE); - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - rtw_startbss_cmd(padapter, RTW_CMDF_DIRECTLY); - - if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) - { - /* restore group key, WEP keys is restored in ips_leave() */ - rtw_set_key(padapter, psecuritypriv, psecuritypriv->dot118021XGrpKeyid, 0,_FALSE); - } - - _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)) { - chk_alive_list[chk_alive_num++] = stainfo_offset; - } - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - for (i = 0; i < chk_alive_num; i++) { - psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); - - if (psta == NULL) { - DBG_871X(FUNC_ADPT_FMT" sta_info is null\n", FUNC_ADPT_ARG(padapter)); - } else if (psta->state &_FW_LINKED) { - rtw_sta_media_status_rpt(padapter, psta, 1); - Update_RA_Entry(padapter, psta); - //pairwise key - /* per sta pairwise key and settings */ - if( (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) - { - rtw_setstakey_cmd(padapter, psta, UNICAST_KEY,_FALSE); - } - } - } - -} - -void start_ap_mode(_adapter *padapter) -{ - int i; - 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; - - /*init_mlme_ap_info(padapter);*/ - - pmlmeext->bstart_bss = _FALSE; - - pmlmepriv->num_sta_non_erp = 0; - - pmlmepriv->num_sta_no_short_slot_time = 0; - - pmlmepriv->num_sta_no_short_preamble = 0; - - pmlmepriv->num_sta_ht_no_gf = 0; -#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->num_sta_40mhz_intolerant = 0; - pmlmepriv->olbc = _FALSE; - pmlmepriv->olbc_ht = _FALSE; - -#ifdef CONFIG_80211N_HT - pmlmepriv->ht_20mhz_width_req = _FALSE; - pmlmepriv->ht_intolerant_ch_reported = _FALSE; - pmlmepriv->ht_op_mode = 0; - pmlmepriv->sw_to_20mhz = 0; -#endif - - _rtw_memset(pmlmepriv->ext_capab_ie_data, 0, sizeof(pmlmepriv->ext_capab_ie_data)); - pmlmepriv->ext_capab_ie_len = 0; - - for (i = 0 ; i < NUM_STA ; i++) - pstapriv->sta_aid[i] = NULL; - -/* to avoid memory leak issue, don't set to NULL directly - pmlmepriv->wps_beacon_ie = NULL; - pmlmepriv->wps_probe_resp_ie = NULL; - pmlmepriv->wps_assoc_resp_ie = NULL; - - pmlmepriv->p2p_beacon_ie = NULL; - pmlmepriv->p2p_probe_resp_ie = NULL; -*/ - - //for ACL - _rtw_init_listhead(&(pacl_list->acl_node_q.queue)); - pacl_list->num = 0; - pacl_list->mode = 0; - for(i = 0; i < NUM_ACL; i++) - { - _rtw_init_listhead(&pacl_list->aclnode[i].list); - pacl_list->aclnode[i].valid = _FALSE; - } - -} - -void stop_ap_mode(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - struct rtw_wlan_acl_node *paclnode; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - - pmlmepriv->update_bcn = _FALSE; - pmlmeext->bstart_bss = _FALSE; - padapter->netif_up = _FALSE; - //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock); - - //reset and init security priv , this can refine with rtw_reset_securitypriv - _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); - padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; - padapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; - - #ifdef CONFIG_DFS_MASTER - rtw_dfs_master_status_apply(padapter, MLME_AP_STOPPED); - #endif - - /* free scan queue */ - rtw_free_network_queue(padapter, _TRUE); - - //for ACL - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); - - if(paclnode->valid == _TRUE) - { - paclnode->valid = _FALSE; - - rtw_list_delete(&paclnode->list); - - pacl_list->num--; - } - } - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - DBG_871X("%s, free acl_node_queue, num=%d\n", __func__, pacl_list->num); - - rtw_sta_flush(padapter, _TRUE); - - //free_assoc_sta_resources - rtw_free_all_stainfo(padapter); - - psta = rtw_get_bcmc_stainfo(padapter); - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - rtw_init_bcmc_stainfo(padapter); - - rtw_free_mlme_priv_ie_data(pmlmepriv); - -#ifdef CONFIG_BT_COEXIST - rtw_btcoex_MediaStatusNotify(padapter, 0); //disconnect -#endif - -} - -#endif //CONFIG_NATIVEAP_MLME - -void rtw_ap_update_bss_chbw(_adapter *adapter, WLAN_BSSID_EX *bss, u8 ch, u8 bw, u8 offset) -{ -#define UPDATE_VHT_CAP 1 -#define UPDATE_HT_CAP 1 - -#ifdef CONFIG_80211AC_VHT - { - struct vht_priv *vhtpriv = &adapter->mlmepriv.vhtpriv; - u8 *vht_cap_ie, *vht_op_ie; - int vht_cap_ielen, vht_op_ielen; - u8 center_freq; - - vht_cap_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_VHTCapability, &vht_cap_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - vht_op_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_VHTOperation, &vht_op_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - center_freq = rtw_get_center_ch(ch, bw, offset); - - /* update vht cap ie */ - if (vht_cap_ie && vht_cap_ielen) { - #if UPDATE_VHT_CAP - /* if ((bw == CHANNEL_WIDTH_160 || bw == CHANNEL_WIDTH_80_80) && pvhtpriv->sgi_160m) - SET_VHT_CAPABILITY_ELE_SHORT_GI160M(pvht_cap_ie + 2, 1); - else */ - SET_VHT_CAPABILITY_ELE_SHORT_GI160M(vht_cap_ie + 2, 0); - - if (bw >= CHANNEL_WIDTH_80 && vhtpriv->sgi_80m) - SET_VHT_CAPABILITY_ELE_SHORT_GI80M(vht_cap_ie + 2, 1); - else - SET_VHT_CAPABILITY_ELE_SHORT_GI80M(vht_cap_ie + 2, 0); - #endif - } - - /* update vht op ie */ - if (vht_op_ie && vht_op_ielen) { - if (bw < CHANNEL_WIDTH_80) { - SET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2, 0); - SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op_ie + 2, 0); - SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op_ie + 2, 0); - } else if (bw == CHANNEL_WIDTH_80) { - SET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2, 1); - SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op_ie + 2, center_freq); - SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op_ie + 2, 0); - } else { - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" unsupported BW:%u\n", FUNC_ADPT_ARG(adapter), bw); - rtw_warn_on(1); - } - } - } -#endif /* CONFIG_80211AC_VHT */ -#ifdef CONFIG_80211N_HT - { - struct ht_priv *htpriv = &adapter->mlmepriv.htpriv; - u8 *ht_cap_ie, *ht_op_ie; - int ht_cap_ielen, ht_op_ielen; - - ht_cap_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_HTCapability, &ht_cap_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - ht_op_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_HTInfo, &ht_op_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - - /* update ht cap ie */ - if (ht_cap_ie && ht_cap_ielen) { - #if UPDATE_HT_CAP - if (bw >= CHANNEL_WIDTH_40) - SET_HT_CAP_ELE_CHL_WIDTH(ht_cap_ie + 2, 1); - else - SET_HT_CAP_ELE_CHL_WIDTH(ht_cap_ie + 2, 0); - - if (bw >= CHANNEL_WIDTH_40 && htpriv->sgi_40m) - SET_HT_CAP_ELE_SHORT_GI40M(ht_cap_ie + 2, 1); - else - SET_HT_CAP_ELE_SHORT_GI40M(ht_cap_ie + 2, 0); - - if (htpriv->sgi_20m) - SET_HT_CAP_ELE_SHORT_GI20M(ht_cap_ie + 2, 1); - else - SET_HT_CAP_ELE_SHORT_GI20M(ht_cap_ie + 2, 0); - #endif - } - - /* update ht op ie */ - if (ht_op_ie && ht_op_ielen) { - SET_HT_OP_ELE_PRI_CHL(ht_op_ie + 2, ch); - switch (offset) { - case HAL_PRIME_CHNL_OFFSET_LOWER: - SET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2, SCA); - break; - case HAL_PRIME_CHNL_OFFSET_UPPER: - SET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2, SCB); - break; - case HAL_PRIME_CHNL_OFFSET_DONT_CARE: - default: - SET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2, SCN); - break; - } - - if (bw >= CHANNEL_WIDTH_40) - SET_HT_OP_ELE_STA_CHL_WIDTH(ht_op_ie + 2, 1); - else - SET_HT_OP_ELE_STA_CHL_WIDTH(ht_op_ie + 2, 0); - } - } -#endif /* CONFIG_80211N_HT */ - -{ - u8 *p; - int ie_len; - u8 old_ch = bss->Configuration.DSConfig; - bool change_band = _FALSE; - - if ((ch <= 14 && old_ch >= 36) || (ch >= 36 && old_ch <= 14)) - change_band = _TRUE; - - /* update channel in IE */ - p = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if (p && ie_len > 0) - *(p + 2) = ch; - - bss->Configuration.DSConfig = ch; - - /* band is changed, update ERP, support rate, ext support rate IE */ - if (change_band == _TRUE) - change_band_update_ie(adapter, bss, ch); -} - -} - -bool rtw_ap_chbw_decision(_adapter *adapter, u8 req_ch, u8 req_bw, u8 req_offset - , u8 *ch, u8 *bw, u8 *offset) -{ - u8 dec_ch, dec_bw, dec_offset; - u8 u_ch = 0, u_offset, u_bw; - bool changed = _FALSE; - struct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv); - u8 sta_num; - u8 ld_sta_num; - u8 lg_sta_num; - u8 ap_num; - u8 ld_ap_num; - bool set_u_ch = _FALSE, set_dec_ch = _FALSE; - - dec_ch = req_ch; - dec_bw = req_bw; - dec_offset = req_offset; - - rtw_dev_iface_status_no_self(adapter, &sta_num, &ld_sta_num, &lg_sta_num, &ap_num, &ld_ap_num); - DBG_871X(FUNC_ADPT_FMT" ld_sta_num:%u, lg_sta_num%u, ap_num:%u\n" - , FUNC_ADPT_ARG(adapter), ld_sta_num, lg_sta_num, ap_num); - - if (ld_sta_num || ap_num) { - /* has linked STA or AP mode, follow */ - - rtw_warn_on(!rtw_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset)); - - DBG_871X(FUNC_ADPT_FMT" union no self: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); - DBG_871X(FUNC_ADPT_FMT" req: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), req_ch, req_bw, req_offset); - - rtw_adjust_chbw(adapter, u_ch, &dec_bw, &dec_offset); - - rtw_sync_chbw(&dec_ch, &dec_bw, &dec_offset - , &u_ch, &u_bw, &u_offset); - - rtw_ap_update_bss_chbw(adapter, &(adapter->mlmepriv.cur_network.network) - , dec_ch, dec_bw, dec_offset); - - set_u_ch = _TRUE; - } else if (lg_sta_num) { - /* has linking STA */ - - rtw_warn_on(!rtw_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset)); - - DBG_871X(FUNC_ADPT_FMT" union no self: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); - DBG_871X(FUNC_ADPT_FMT" req: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), req_ch, req_bw, req_offset); - - rtw_adjust_chbw(adapter, dec_ch, &dec_bw, &dec_offset); - - if (rtw_is_chbw_grouped(u_ch, u_bw, u_offset, dec_ch, dec_bw, dec_offset)) { - - rtw_sync_chbw(&dec_ch, &dec_bw, &dec_offset - , &u_ch, &u_bw, &u_offset); - - rtw_ap_update_bss_chbw(adapter, &(adapter->mlmepriv.cur_network.network) - , dec_ch, dec_bw, dec_offset); - - set_u_ch = _TRUE; - } else { - /* set this for possible ch change when join down*/ - set_fwstate(&adapter->mlmepriv, WIFI_OP_CH_SWITCHING); - } - } else { - /* single AP mode */ - - DBG_871X(FUNC_ADPT_FMT" req: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), req_ch, req_bw, req_offset); - rtw_adjust_chbw(adapter, dec_ch, &dec_bw, &dec_offset); - - #if defined(CONFIG_DFS_MASTER) - /* check NOL */ - if (rtw_chset_is_ch_non_ocp(mlmeext->channel_set, dec_ch, dec_bw, dec_offset)) { - /* choose 5G DFS channel for debug */ - if (adapter_to_rfctl(adapter)->dbg_dfs_master_choose_dfs_ch_first - && rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_2G|RTW_CHF_NON_DFS) == _TRUE) { - DBG_871X(FUNC_ADPT_FMT" choose 5G DFS channel for debug\n", FUNC_ADPT_ARG(adapter)); - } else - /* choose from 5G no DFS */ - if (rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_2G|RTW_CHF_DFS) == _FALSE) { - /* including 5G DFS, not long CAC */ - if (rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_2G|RTW_CHF_LONG_CAC) == _FALSE) { - /* including 5G DFS, long CAC */ - if (rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_2G) == _FALSE) { - /* including 2.4G channel */ - if (rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_5G) == _FALSE) { - DBG_871X(FUNC_ADPT_FMT" no available ch\n", FUNC_ADPT_ARG(adapter)); - rtw_warn_on(1); - } - } - } - } - } - #endif /* defined(CONFIG_DFS_MASTER) */ - - rtw_ap_update_bss_chbw(adapter, &(adapter->mlmepriv.cur_network.network) - , dec_ch, dec_bw, dec_offset); - - set_dec_ch = _TRUE; - } - - if (check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) - #ifdef CONFIG_CONCURRENT_MODE - || check_buddy_fwstate(adapter, _FW_UNDER_SURVEY) - #endif - ) { - /* scanning, leave ch setting to scan state machine */ - set_u_ch = set_dec_ch = _FALSE; - } - - if (mlmeext->cur_channel != dec_ch - || mlmeext->cur_bwmode != dec_bw - || mlmeext->cur_ch_offset != dec_offset) - changed = _TRUE; - - if (changed == _TRUE && rtw_linked_check(adapter) == _TRUE) { - #ifdef CONFIG_SPCT_CH_SWITCH - if (1) - rtw_ap_inform_ch_switch(adapter, dec_ch, dec_offset); - else - #endif - rtw_sta_flush(adapter, _FALSE); - } - - mlmeext->cur_channel = dec_ch; - mlmeext->cur_bwmode = dec_bw; - mlmeext->cur_ch_offset = dec_offset; - - if (u_ch != 0) - DBG_871X(FUNC_ADPT_FMT" union: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); - - DBG_871X(FUNC_ADPT_FMT" dec: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), dec_ch, dec_bw, dec_offset); - - if (set_u_ch == _TRUE) { - *ch = u_ch; - *bw = u_bw; - *offset = u_offset; - } else if (set_dec_ch == _TRUE) { - *ch = dec_ch; - *bw = dec_bw; - *offset = dec_offset; - } - - return changed; -} - -#endif //CONFIG_AP_MODE - +/****************************************************************************** + * + * 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 + * + * + ******************************************************************************/ +#define _RTW_AP_C_ + +#include + + +#ifdef CONFIG_AP_MODE + +extern unsigned char RTW_WPA_OUI[]; +extern unsigned char WMM_OUI[]; +extern unsigned char WPS_OUI[]; +extern unsigned char P2P_OUI[]; +extern unsigned char WFD_OUI[]; + +void init_mlme_ap_info(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + _rtw_spinlock_init(&pmlmepriv->bcn_update_lock); + + /* pmlmeext->bstart_bss = _FALSE; */ + +} + +void free_mlme_ap_info(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + stop_ap_mode(padapter); + _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); + +} + +static void update_BCNTIM(_adapter *padapter) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); + unsigned char *pie = pnetwork_mlmeext->IEs; + +#if 0 + + + /* update TIM IE */ + /* if(pstapriv->tim_bitmap) */ +#endif + if (_TRUE) { + u8 *p, *dst_ie, *premainder_ie = NULL, *pbackup_remainder_ie = NULL; + u16 tim_bitmap_le; + uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen; + + tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); + + p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_); + if (p != NULL && tim_ielen > 0) { + tim_ielen += 2; + + premainder_ie = p + tim_ielen; + + tim_ie_offset = (sint)(p - pie); + + remainder_ielen = pnetwork_mlmeext->IELength - tim_ie_offset - tim_ielen; + + /*append TIM IE from dst_ie offset*/ + dst_ie = p; + } else { + tim_ielen = 0; + + /*calculate head_len*/ + offset = _FIXED_IE_LENGTH_; + + /* get ssid_ie len */ + p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SSID_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + offset += tmp_len + 2; + + /*get supported rates len*/ + p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + offset += tmp_len + 2; + + /*DS Parameter Set IE, len=3*/ + offset += 3; + + premainder_ie = pie + offset; + + remainder_ielen = pnetwork_mlmeext->IELength - offset - tim_ielen; + + /*append TIM IE from offset*/ + dst_ie = pie + offset; + + } + + if (remainder_ielen > 0) { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if (pbackup_remainder_ie && premainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + *dst_ie++ = _TIM_IE_; + + if ((pstapriv->tim_bitmap & 0xff00) && (pstapriv->tim_bitmap & 0x00fe)) + tim_ielen = 5; + else + tim_ielen = 4; + + *dst_ie++ = tim_ielen; + + *dst_ie++ = 0;/*DTIM count*/ + *dst_ie++ = 1;/*DTIM period*/ + + if (pstapriv->tim_bitmap & BIT(0))/*for bc/mc frames*/ + *dst_ie++ = BIT(0);/*bitmap ctrl */ + else + *dst_ie++ = 0; + + if (tim_ielen == 4) { + u8 pvb = 0; + + if (pstapriv->tim_bitmap & 0x00fe) + pvb = (u8)tim_bitmap_le; + else if (pstapriv->tim_bitmap & 0xff00) + pvb = (u8)(tim_bitmap_le >> 8); + else + pvb = (u8)tim_bitmap_le; + + *dst_ie++ = pvb; + + } else if (tim_ielen == 5) { + _rtw_memcpy(dst_ie, &tim_bitmap_le, 2); + dst_ie += 2; + } + + /*copy remainder IE*/ + if (pbackup_remainder_ie) { + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); + + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + } + + offset = (uint)(dst_ie - pie); + pnetwork_mlmeext->IELength = offset + remainder_ielen; + + } +} + +void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len) +{ + PNDIS_802_11_VARIABLE_IEs pIE; + u8 bmatch = _FALSE; + u8 *pie = pnetwork->IEs; + u8 *p = NULL, *dst_ie = NULL, *premainder_ie = NULL, *pbackup_remainder_ie = NULL; + u32 i, offset, ielen, ie_offset, remainder_ielen = 0; + + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); + + if (pIE->ElementID > index) + break; + else if (pIE->ElementID == index) { /* already exist the same IE */ + p = (u8 *)pIE; + ielen = pIE->Length; + bmatch = _TRUE; + break; + } + + p = (u8 *)pIE; + ielen = pIE->Length; + i += (pIE->Length + 2); + } + + if (p != NULL && ielen > 0) { + ielen += 2; + + premainder_ie = p + ielen; + + ie_offset = (sint)(p - pie); + + remainder_ielen = pnetwork->IELength - ie_offset - ielen; + + if (bmatch) + dst_ie = p; + else + dst_ie = (p + ielen); + } + + if (dst_ie == NULL) + return; + + if (remainder_ielen > 0) { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if (pbackup_remainder_ie && premainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + *dst_ie++ = index; + *dst_ie++ = len; + + _rtw_memcpy(dst_ie, data, len); + dst_ie += len; + + /* copy remainder IE */ + if (pbackup_remainder_ie) { + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); + + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + } + + offset = (uint)(dst_ie - pie); + pnetwork->IELength = offset + remainder_ielen; +} + +void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index) +{ + u8 *p, *dst_ie = NULL, *premainder_ie = NULL, *pbackup_remainder_ie = NULL; + uint offset, ielen, ie_offset, remainder_ielen = 0; + u8 *pie = pnetwork->IEs; + + p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, index, &ielen, pnetwork->IELength - _FIXED_IE_LENGTH_); + if (p != NULL && ielen > 0) { + ielen += 2; + + premainder_ie = p + ielen; + + ie_offset = (sint)(p - pie); + + remainder_ielen = pnetwork->IELength - ie_offset - ielen; + + dst_ie = p; + } else + return; + + if (remainder_ielen > 0) { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if (pbackup_remainder_ie && premainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + /* copy remainder IE */ + if (pbackup_remainder_ie) { + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); + + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + } + + offset = (uint)(dst_ie - pie); + pnetwork->IELength = offset + remainder_ielen; +} + + +u8 chk_sta_is_alive(struct sta_info *psta); +u8 chk_sta_is_alive(struct sta_info *psta) +{ + u8 ret = _FALSE; +#ifdef DBG_EXPIRATION_CHK + RTW_INFO("sta:"MAC_FMT", rssi:%d, rx:"STA_PKTS_FMT", expire_to:%u, %s%ssq_len:%u\n" + , MAC_ARG(psta->hwaddr) + , psta->rssi_stat.UndecoratedSmoothedPWDB + /* , STA_RX_PKTS_ARG(psta) */ + , STA_RX_PKTS_DIFF_ARG(psta) + , psta->expire_to + , psta->state & WIFI_SLEEP_STATE ? "PS, " : "" + , psta->state & WIFI_STA_ALIVE_CHK_STATE ? "SAC, " : "" + , psta->sleepq_len + ); +#endif + + /* if(sta_last_rx_pkts(psta) == sta_rx_pkts(psta)) */ + if ((psta->sta_stats.last_rx_data_pkts + psta->sta_stats.last_rx_ctrl_pkts) == (psta->sta_stats.rx_data_pkts + psta->sta_stats.rx_ctrl_pkts)) { +#if 0 + if (psta->state & WIFI_SLEEP_STATE) + ret = _TRUE; +#endif + } else + ret = _TRUE; + + sta_update_last_rx_pkts(psta); + + return ret; +} + +void expire_timeout_chk(_adapter *padapter) +{ + _irqL irqL; + _list *phead, *plist; + u8 updated = _FALSE; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 chk_alive_num = 0; + char chk_alive_list[NUM_STA]; + int i; + + +#ifdef CONFIG_MCC_MODE + /* then driver may check fail due to not recv client's frame under sitesurvey, + * don't expire timeout chk under MCC under sitesurvey */ + + if (rtw_hal_mcc_link_status_chk(padapter, __func__) == _FALSE) + return; +#endif + + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); + + phead = &pstapriv->auth_list; + plist = get_next(phead); + + /* check auth_queue */ +#ifdef DBG_EXPIRATION_CHK + if (rtw_end_of_queue_search(phead, plist) == _FALSE) { + RTW_INFO(FUNC_NDEV_FMT" auth_list, cnt:%u\n" + , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->auth_list_cnt); + } +#endif + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info, auth_list); + + plist = get_next(plist); + + +#ifdef CONFIG_ATMEL_RC_PATCH + if (_TRUE == _rtw_memcmp((void *)(pstapriv->atmel_rc_pattern), (void *)(psta->hwaddr), ETH_ALEN)) + continue; + if (psta->flag_atmel_rc) + continue; +#endif + if (psta->expire_to > 0) { + psta->expire_to--; + if (psta->expire_to == 0) { + rtw_list_delete(&psta->auth_list); + pstapriv->auth_list_cnt--; + + RTW_INFO("auth expire %02X%02X%02X%02X%02X%02X\n", + psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2], psta->hwaddr[3], psta->hwaddr[4], psta->hwaddr[5]); + + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); + + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + rtw_free_stainfo(padapter, psta); + /* _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); + } + } + + } + + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); + psta = NULL; + + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + /* check asoc_queue */ +#ifdef DBG_EXPIRATION_CHK + if (rtw_end_of_queue_search(phead, plist) == _FALSE) { + RTW_INFO(FUNC_NDEV_FMT" asoc_list, cnt:%u\n" + , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->asoc_list_cnt); + } +#endif + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); +#ifdef CONFIG_ATMEL_RC_PATCH + RTW_INFO("%s:%d psta=%p, %02x,%02x||%02x,%02x \n\n", __func__, __LINE__, + psta, pstapriv->atmel_rc_pattern[0], pstapriv->atmel_rc_pattern[5], psta->hwaddr[0], psta->hwaddr[5]); + if (_TRUE == _rtw_memcmp((void *)pstapriv->atmel_rc_pattern, (void *)(psta->hwaddr), ETH_ALEN)) + continue; + if (psta->flag_atmel_rc) + continue; + RTW_INFO("%s: debug line:%d\n", __func__, __LINE__); +#endif +#ifdef CONFIG_AUTO_AP_MODE + if (psta->isrc) + continue; +#endif + if (chk_sta_is_alive(psta) || !psta->expire_to) { + psta->expire_to = pstapriv->expire_to; + psta->keep_alive_trycnt = 0; +#ifdef CONFIG_TX_MCAST2UNI + psta->under_exist_checking = 0; +#endif /* CONFIG_TX_MCAST2UNI */ + } else + psta->expire_to--; + +#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK +#ifdef CONFIG_80211N_HT +#ifdef CONFIG_TX_MCAST2UNI + if ((psta->flags & WLAN_STA_HT) && (psta->htpriv.agg_enable_bitmap || psta->under_exist_checking)) { + /* check sta by delba(addba) for 11n STA */ + /* ToDo: use CCX report to check for all STAs */ + /* RTW_INFO("asoc check by DELBA/ADDBA! (pstapriv->expire_to=%d s)(psta->expire_to=%d s), [%02x, %d]\n", pstapriv->expire_to*2, psta->expire_to*2, psta->htpriv.agg_enable_bitmap, psta->under_exist_checking); */ + + if (psta->expire_to <= (pstapriv->expire_to - 50)) { + RTW_INFO("asoc expire by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to - psta->expire_to) * 2); + psta->under_exist_checking = 0; + psta->expire_to = 0; + } else if (psta->expire_to <= (pstapriv->expire_to - 3) && (psta->under_exist_checking == 0)) { + RTW_INFO("asoc check by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to - psta->expire_to) * 2); + psta->under_exist_checking = 1; + /* tear down TX AMPDU */ + send_delba(padapter, 1, psta->hwaddr);/* */ /* originator */ + psta->htpriv.agg_enable_bitmap = 0x0;/* reset */ + psta->htpriv.candidate_tid_bitmap = 0x0;/* reset */ + } + } +#endif /* CONFIG_TX_MCAST2UNI */ +#endif /* CONFIG_80211N_HT */ +#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + + if (psta->expire_to <= 0) { + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + if (padapter->registrypriv.wifi_spec == 1) { + psta->expire_to = pstapriv->expire_to; + continue; + } + +#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK +#ifdef CONFIG_80211N_HT + +#define KEEP_ALIVE_TRYCNT (3) + + if (psta->keep_alive_trycnt > 0 && psta->keep_alive_trycnt <= KEEP_ALIVE_TRYCNT) { + if (psta->state & WIFI_STA_ALIVE_CHK_STATE) + psta->state ^= WIFI_STA_ALIVE_CHK_STATE; + else + psta->keep_alive_trycnt = 0; + + } else if ((psta->keep_alive_trycnt > KEEP_ALIVE_TRYCNT) && !(psta->state & WIFI_STA_ALIVE_CHK_STATE)) + psta->keep_alive_trycnt = 0; + if ((psta->htpriv.ht_option == _TRUE) && (psta->htpriv.ampdu_enable == _TRUE)) { + uint priority = 1; /* test using BK */ + u8 issued = 0; + + /* issued = (psta->htpriv.agg_enable_bitmap>>priority)&0x1; */ + issued |= (psta->htpriv.candidate_tid_bitmap >> priority) & 0x1; + + if (0 == issued) { + if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) { + psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); + + if (psta->state & WIFI_SLEEP_STATE) + psta->expire_to = 2; /* 2x2=4 sec */ + else + psta->expire_to = 1; /* 2 sec */ + + psta->state |= WIFI_STA_ALIVE_CHK_STATE; + + /* add_ba_hdl(padapter, (u8*)paddbareq_parm); */ + + RTW_INFO("issue addba_req to check if sta alive, keep_alive_trycnt=%d\n", psta->keep_alive_trycnt); + + issue_addba_req(padapter, psta->hwaddr, (u8)priority); + + _set_timer(&psta->addba_retry_timer, ADDBA_TO); + + psta->keep_alive_trycnt++; + + continue; + } + } + } + if (psta->keep_alive_trycnt > 0 && psta->state & WIFI_STA_ALIVE_CHK_STATE) { + psta->keep_alive_trycnt = 0; + psta->state ^= WIFI_STA_ALIVE_CHK_STATE; + RTW_INFO("change to another methods to check alive if staion is at ps mode\n"); + } + +#endif /* CONFIG_80211N_HT */ +#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + if (psta->state & WIFI_SLEEP_STATE) { + if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) { + /* to check if alive by another methods if staion is at ps mode. */ + psta->expire_to = pstapriv->expire_to; + psta->state |= WIFI_STA_ALIVE_CHK_STATE; + + /* RTW_INFO("alive chk, sta:" MAC_FMT " is at ps mode!\n", MAC_ARG(psta->hwaddr)); */ + + /* to update bcn with tim_bitmap for this station */ + pstapriv->tim_bitmap |= BIT(psta->aid); + update_beacon(padapter, _TIM_IE_, NULL, _TRUE); + + if (!pmlmeext->active_keep_alive_check) + continue; + } + } +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK + if (pmlmeext->active_keep_alive_check) { + int stainfo_offset; + + stainfo_offset = rtw_stainfo_offset(pstapriv, psta); + if (stainfo_offset_valid(stainfo_offset)) + chk_alive_list[chk_alive_num++] = stainfo_offset; + + continue; + } +#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + RTW_INFO("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); + updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING, _TRUE); + } else { + /* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */ + if (psta->sleepq_len > (NR_XMITFRAME / pstapriv->asoc_list_cnt) + && padapter->xmitpriv.free_xmitframe_cnt < ((NR_XMITFRAME / pstapriv->asoc_list_cnt) / 2) + ) { + RTW_INFO("%s sta:"MAC_FMT", sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n", __func__ + , MAC_ARG(psta->hwaddr) + , psta->sleepq_len, padapter->xmitpriv.free_xmitframe_cnt, pstapriv->asoc_list_cnt); + wakeup_sta_to_xmit(padapter, psta); + } + } + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK + if (chk_alive_num) { + + u8 backup_ch = 0, backup_bw, backup_offset; + u8 union_ch = 0, union_bw, union_offset; + u8 switch_channel = _TRUE; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + if (!rtw_mi_get_ch_setting_union(padapter, &union_ch, &union_bw, &union_offset) + || pmlmeext->cur_channel != union_ch) + goto bypass_active_keep_alive; + +#ifdef CONFIG_MCC_MODE + if (MCC_EN(padapter)) { + /* driver doesn't switch channel under MCC */ + if (rtw_hal_check_mcc_status(padapter, MCC_STATUS_DOING_MCC)) + switch_channel = _FALSE; + } +#endif + /* switch to correct channel of current network before issue keep-alive frames */ + if (switch_channel == _TRUE && rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) { + backup_ch = rtw_get_oper_ch(padapter); + backup_bw = rtw_get_oper_bw(padapter); + backup_offset = rtw_get_oper_choffset(padapter); + set_channel_bwmode(padapter, union_ch, union_offset, union_bw); + } + + /* issue null data to check sta alive*/ + for (i = 0; i < chk_alive_num; i++) { + int ret = _FAIL; + + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); +#ifdef CONFIG_ATMEL_RC_PATCH + if (_TRUE == _rtw_memcmp(pstapriv->atmel_rc_pattern, psta->hwaddr, ETH_ALEN)) + continue; + if (psta->flag_atmel_rc) + continue; +#endif + if (!(psta->state & _FW_LINKED)) + continue; + + if (psta->state & WIFI_SLEEP_STATE) + ret = issue_nulldata(padapter, psta->hwaddr, 0, 1, 50); + else + ret = issue_nulldata(padapter, psta->hwaddr, 0, 3, 50); + + psta->keep_alive_trycnt++; + if (ret == _SUCCESS) { + RTW_INFO("asoc check, sta(" MAC_FMT ") is alive\n", MAC_ARG(psta->hwaddr)); + psta->expire_to = pstapriv->expire_to; + psta->keep_alive_trycnt = 0; + continue; + } else if (psta->keep_alive_trycnt <= 3) { + RTW_INFO("ack check for asoc expire, keep_alive_trycnt=%d\n", psta->keep_alive_trycnt); + psta->expire_to = 1; + continue; + } + + psta->keep_alive_trycnt = 0; + RTW_INFO("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + if (rtw_is_list_empty(&psta->asoc_list) == _FALSE) { + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING, _TRUE); + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + } + + /* back to the original operation channel */ + if (switch_channel && backup_ch > 0) + set_channel_bwmode(padapter, backup_ch, backup_offset, backup_bw); + +bypass_active_keep_alive: + ; + } +#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + + associated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL); +} + +void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level) +{ + int i; + u8 rf_type; + unsigned char sta_band = 0; + u64 tx_ra_bitmap = 0; + struct ht_priv *psta_ht = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + +#ifdef CONFIG_80211N_HT + if (psta) + psta_ht = &psta->htpriv; + else + return; +#endif /* CONFIG_80211N_HT */ + + if (!(psta->state & _FW_LINKED)) + return; + + rtw_hal_update_sta_rate_mask(padapter, psta); + tx_ra_bitmap = psta->ra_mask; + + if (pcur_network->Configuration.DSConfig > 14) { + + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_5N ; + + if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11A; + + /* 5G band */ +#ifdef CONFIG_80211AC_VHT + if (psta->vhtpriv.vht_option) + sta_band = WIRELESS_11_5AC; +#endif + + } else { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_24N; + + if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11G; + + if (tx_ra_bitmap & 0x0f) + sta_band |= WIRELESS_11B; + } + + psta->wireless_mode = sta_band; + psta->raid = rtw_hal_networktype_to_raid(padapter, psta); + + if (psta->aid < NUM_STA) { + RTW_INFO("%s=> mac_id:%d , raid:%d, tx_ra_bitmap:0x%016llx, networkType:0x%02x\n", + __FUNCTION__, psta->mac_id, psta->raid, tx_ra_bitmap, psta->wireless_mode); + + rtw_update_ramask(padapter, psta, psta->mac_id, rssi_level); + } else + RTW_INFO("station aid %d exceed the max number\n", psta->aid); + +} + +void update_bmc_sta(_adapter *padapter) +{ + _irqL irqL; + unsigned char network_type; + int supportRateNum = 0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); + + if (psta) { + psta->aid = 0;/* default set to 0 */ + psta->qos_option = 0; +#ifdef CONFIG_80211N_HT + psta->htpriv.ht_option = _FALSE; +#endif /* CONFIG_80211N_HT */ + + psta->ieee8021x_blocked = 0; + + _rtw_memset((void *)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + /* psta->dot118021XPrivacy = _NO_PRIVACY_; */ /* !!! remove it, because it has been set before this. */ + + /* prepare for add_RATid */ + supportRateNum = rtw_get_rateset_len((u8 *)&pcur_network->SupportedRates); + network_type = rtw_check_network_type((u8 *)&pcur_network->SupportedRates, supportRateNum, pcur_network->Configuration.DSConfig); + if (IsSupportedTxCCK(network_type)) + network_type = WIRELESS_11B; + else if (network_type == WIRELESS_INVALID) { /* error handling */ + if (pcur_network->Configuration.DSConfig > 14) + network_type = WIRELESS_11A; + else + network_type = WIRELESS_11B; + } + update_sta_basic_rate(psta, network_type); + psta->wireless_mode = network_type; + + rtw_hal_update_sta_rate_mask(padapter, psta); + + psta->raid = rtw_hal_networktype_to_raid(padapter, psta); + + _enter_critical_bh(&psta->lock, &irqL); + psta->state = _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + rtw_sta_media_status_rpt(padapter, psta, 1); + rtw_hal_update_ra_mask(psta, 0); + } else + RTW_INFO("add_RATid_bmc_sta error!\n"); + +} + +/* notes: + * AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode */ +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); +#ifdef CONFIG_80211N_HT + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + struct ht_priv *phtpriv_sta = &psta->htpriv; +#endif /* CONFIG_80211N_HT */ + u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0; + /* set intf_tag to if1 */ + /* psta->intf_tag = 0; */ + + RTW_INFO("%s\n", __FUNCTION__); + + /*alloc macid when call rtw_alloc_stainfo(),release macid when call rtw_free_stainfo()*/ + + /* ap mode */ + rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE); + + if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) + psta->ieee8021x_blocked = _TRUE; + else + psta->ieee8021x_blocked = _FALSE; + + + /* update sta's cap */ + + /* ERP */ + VCS_update(padapter, psta); +#ifdef CONFIG_80211N_HT + /* HT related cap */ + if (phtpriv_sta->ht_option) { + /* check if sta supports rx ampdu */ + phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; + + phtpriv_sta->rx_ampdu_min_spacing = (phtpriv_sta->ht_cap.ampdu_params_info & IEEE80211_HT_CAP_AMPDU_DENSITY) >> 2; + + /* bwmode */ + if ((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) + psta->bw_mode = CHANNEL_WIDTH_40; + else + psta->bw_mode = CHANNEL_WIDTH_20; + + if (psta->ht_40mhz_intolerant) + psta->bw_mode = CHANNEL_WIDTH_20; + + if (pmlmeext->cur_bwmode < psta->bw_mode) + psta->bw_mode = pmlmeext->cur_bwmode; + + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; + + + /* check if sta support s Short GI 20M */ + if ((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20)) + phtpriv_sta->sgi_20m = _TRUE; + + /* check if sta support s Short GI 40M */ + if ((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40)) { + if (psta->bw_mode == CHANNEL_WIDTH_40) /* according to psta->bw_mode */ + phtpriv_sta->sgi_40m = _TRUE; + else + phtpriv_sta->sgi_40m = _FALSE; + } + + psta->qos_option = _TRUE; + + /* B0 Config LDPC Coding Capability */ + if (TEST_FLAG(phtpriv_ap->ldpc_cap, LDPC_HT_ENABLE_TX) && + GET_HT_CAP_ELE_LDPC_CAP((u8 *)(&phtpriv_sta->ht_cap))) { + SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX)); + RTW_INFO("Enable HT Tx LDPC for STA(%d)\n", psta->aid); + } + + /* B7 B8 B9 Config STBC setting */ + if (TEST_FLAG(phtpriv_ap->stbc_cap, STBC_HT_ENABLE_TX) && + GET_HT_CAP_ELE_RX_STBC((u8 *)(&phtpriv_sta->ht_cap))) { + SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX)); + RTW_INFO("Enable HT Tx STBC for STA(%d)\n", psta->aid); + } + +#ifdef CONFIG_BEAMFORMING + /*Config Tx beamforming setting*/ + if (TEST_FLAG(phtpriv_ap->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && + GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP((u8 *)(&phtpriv_sta->ht_cap))) { + SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE); + /*Shift to BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP*/ + SET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS((u8 *)(&phtpriv_sta->ht_cap)) << 6); + } + + if (TEST_FLAG(phtpriv_ap->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) && + GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP((u8 *)(&phtpriv_sta->ht_cap))) { + SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE); + /*Shift to BEAMFORMING_HT_BEAMFORMER_STEER_NUM*/ + SET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS((u8 *)(&phtpriv_sta->ht_cap)) << 4); + } + if (cur_beamform_cap) + RTW_INFO("Client STA(%d) HT Beamforming Cap = 0x%02X\n", psta->aid, cur_beamform_cap); +#endif /*CONFIG_BEAMFORMING*/ + } else { + phtpriv_sta->ampdu_enable = _FALSE; + + phtpriv_sta->sgi_20m = _FALSE; + phtpriv_sta->sgi_40m = _FALSE; + psta->bw_mode = CHANNEL_WIDTH_20; + phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + + phtpriv_sta->ldpc_cap = cur_ldpc_cap; + phtpriv_sta->stbc_cap = cur_stbc_cap; + phtpriv_sta->beamform_cap = cur_beamform_cap; + + /* Rx AMPDU */ + send_delba(padapter, 0, psta->hwaddr);/* recipient */ + + /* TX AMPDU */ + send_delba(padapter, 1, psta->hwaddr);/* */ /* originator */ + phtpriv_sta->agg_enable_bitmap = 0x0;/* reset */ + phtpriv_sta->candidate_tid_bitmap = 0x0;/* reset */ +#endif /* CONFIG_80211N_HT */ + +#ifdef CONFIG_80211AC_VHT + update_sta_vht_info_apmode(padapter, psta); +#endif + + update_ldpc_stbc_cap(psta); + + /* todo: init other variables */ + + _rtw_memset((void *)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + + /* add ratid */ + /* add_RATid(padapter, psta); */ /* move to ap_sta_info_defer_update() */ + + + _enter_critical_bh(&psta->lock, &irqL); + psta->state |= _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + +} + +static void update_ap_info(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); +#ifdef CONFIG_80211N_HT + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; +#endif /* CONFIG_80211N_HT */ + + psta->wireless_mode = pmlmeext->cur_wireless_mode; + + psta->bssratelen = rtw_get_rateset_len(pnetwork->SupportedRates); + _rtw_memcpy(psta->bssrateset, pnetwork->SupportedRates, psta->bssratelen); + +#ifdef CONFIG_80211N_HT + /* HT related cap */ + if (phtpriv_ap->ht_option) { + /* check if sta supports rx ampdu */ + /* phtpriv_ap->ampdu_enable = phtpriv_ap->ampdu_enable; */ + + /* check if sta support s Short GI 20M */ + if ((phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20)) + phtpriv_ap->sgi_20m = _TRUE; + /* check if sta support s Short GI 40M */ + if ((phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40)) + phtpriv_ap->sgi_40m = _TRUE; + + psta->qos_option = _TRUE; + } else { + phtpriv_ap->ampdu_enable = _FALSE; + + phtpriv_ap->sgi_20m = _FALSE; + phtpriv_ap->sgi_40m = _FALSE; + } + + psta->bw_mode = pmlmeext->cur_bwmode; + phtpriv_ap->ch_offset = pmlmeext->cur_ch_offset; + + phtpriv_ap->agg_enable_bitmap = 0x0;/* reset */ + phtpriv_ap->candidate_tid_bitmap = 0x0;/* reset */ + + _rtw_memcpy(&psta->htpriv, &pmlmepriv->htpriv, sizeof(struct ht_priv)); + +#ifdef CONFIG_80211AC_VHT + _rtw_memcpy(&psta->vhtpriv, &pmlmepriv->vhtpriv, sizeof(struct vht_priv)); +#endif /* CONFIG_80211AC_VHT */ + +#endif /* CONFIG_80211N_HT */ + + psta->state |= WIFI_AP_STATE; /* Aries, add,fix bug of flush_cam_entry at STOP AP mode , 0724 */ +} + +static void rtw_set_hw_wmm_param(_adapter *padapter) +{ + u8 ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime; + u8 acm_mask; + u16 TXOP; + u32 acParm, i; + u32 edca[4], inx[4]; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct registry_priv *pregpriv = &padapter->registrypriv; + + acm_mask = 0; + + if (IsSupported5G(pmlmeext->cur_wireless_mode) || + (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) + aSifsTime = 16; + else + aSifsTime = 10; + + if (pmlmeinfo->WMM_enable == 0) { + padapter->mlmepriv.acm_mask = 0; + + AIFS = aSifsTime + (2 * pmlmeinfo->slotTime); + + if (pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11A)) { + ECWMin = 4; + ECWMax = 10; + } else if (pmlmeext->cur_wireless_mode & WIRELESS_11B) { + ECWMin = 5; + ECWMax = 10; + } else { + ECWMin = 4; + ECWMax = 10; + } + + TXOP = 0; + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); + + ECWMin = 2; + ECWMax = 3; + TXOP = 0x2f; + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); + + } else { + edca[0] = edca[1] = edca[2] = edca[3] = 0; + + /*TODO:*/ + acm_mask = 0; + padapter->mlmepriv.acm_mask = acm_mask; + +#if 0 + /* BK */ + /* AIFS = AIFSN * slot time + SIFS - r2t phy delay */ +#endif + AIFS = (7 * pmlmeinfo->slotTime) + aSifsTime; + ECWMin = 4; + ECWMax = 10; + TXOP = 0; + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); + edca[XMIT_BK_QUEUE] = acParm; + RTW_INFO("WMM(BK): %x\n", acParm); + + /* BE */ + AIFS = (3 * pmlmeinfo->slotTime) + aSifsTime; + ECWMin = 4; + ECWMax = 6; + TXOP = 0; + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); + edca[XMIT_BE_QUEUE] = acParm; + RTW_INFO("WMM(BE): %x\n", acParm); + + /* VI */ + AIFS = (1 * pmlmeinfo->slotTime) + aSifsTime; + ECWMin = 3; + ECWMax = 4; + TXOP = 94; + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); + edca[XMIT_VI_QUEUE] = acParm; + RTW_INFO("WMM(VI): %x\n", acParm); + + /* VO */ + AIFS = (1 * pmlmeinfo->slotTime) + aSifsTime; + ECWMin = 2; + ECWMax = 3; + TXOP = 47; + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); + edca[XMIT_VO_QUEUE] = acParm; + RTW_INFO("WMM(VO): %x\n", acParm); + + + if (padapter->registrypriv.acm_method == 1) + rtw_hal_set_hwreg(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask)); + else + padapter->mlmepriv.acm_mask = acm_mask; + + inx[0] = 0; + inx[1] = 1; + inx[2] = 2; + inx[3] = 3; + + if (pregpriv->wifi_spec == 1) { + u32 j, tmp, change_inx = _FALSE; + + /* entry indx: 0->vo, 1->vi, 2->be, 3->bk. */ + for (i = 0 ; i < 4 ; i++) { + for (j = i + 1 ; j < 4 ; j++) { + /* compare CW and AIFS */ + if ((edca[j] & 0xFFFF) < (edca[i] & 0xFFFF)) + change_inx = _TRUE; + else if ((edca[j] & 0xFFFF) == (edca[i] & 0xFFFF)) { + /* compare TXOP */ + if ((edca[j] >> 16) > (edca[i] >> 16)) + change_inx = _TRUE; + } + + if (change_inx) { + tmp = edca[i]; + edca[i] = edca[j]; + edca[j] = tmp; + + tmp = inx[i]; + inx[i] = inx[j]; + inx[j] = tmp; + + change_inx = _FALSE; + } + } + } + } + + for (i = 0 ; i < 4 ; i++) { + pxmitpriv->wmm_para_seq[i] = inx[i]; + RTW_INFO("wmm_para_seq(%d): %d\n", i, pxmitpriv->wmm_para_seq[i]); + } + + } + +} + +static void update_hw_ht_param(_adapter *padapter) +{ + unsigned char max_AMPDU_len; + unsigned char min_MPDU_spacing; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + RTW_INFO("%s\n", __FUNCTION__); + + + /* handle A-MPDU parameter field */ + /* + AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k + AMPDU_para [4:2]:Min MPDU Start Spacing + */ + max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; + + min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; + + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); + + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); + + /* */ + /* Config SM Power Save setting */ + /* */ + pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2; + if (pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) { +#if 0 + u8 i; + /* update the MCS rates */ + for (i = 0; i < 16; i++) + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; +#endif + RTW_INFO("%s(): WLAN_HT_CAP_SM_PS_STATIC\n", __FUNCTION__); + } + + /* */ + /* Config current HT Protection mode. */ + /* */ + /* pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; */ + +} + +static void rtw_ap_check_scan(_adapter *padapter) +{ + _irqL irqL; + _list *plist, *phead; + u32 delta_time, lifetime; + struct wlan_network *pnetwork = NULL; + WLAN_BSSID_EX *pbss = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + _queue *queue = &(pmlmepriv->scanned_queue); + u8 do_scan = _FALSE; + u8 reason = RTW_AUTO_SCAN_REASON_UNSPECIFIED; + + lifetime = SCANQUEUE_LIFETIME; /* 20 sec */ + + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + phead = get_list_head(queue); + if (rtw_end_of_queue_search(phead, get_next(phead)) == _TRUE) + if (padapter->registrypriv.wifi_spec) { + do_scan = _TRUE; + reason |= RTW_AUTO_SCAN_REASON_2040_BSS; + } + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + +#ifdef CONFIG_AUTO_CHNL_SEL_NHM + if (padapter->registrypriv.acs_auto_scan) { + do_scan = _TRUE; + reason |= RTW_AUTO_SCAN_REASON_ACS; + rtw_acs_start(padapter, _TRUE); + } +#endif + + if (_TRUE == do_scan) { + RTW_INFO("%s : drv scans by itself and wait_completed\n", __func__); + rtw_drv_scan_by_self(padapter, reason); + rtw_scan_wait_completed(padapter); + } + +#ifdef CONFIG_AUTO_CHNL_SEL_NHM + if (padapter->registrypriv.acs_auto_scan) + rtw_acs_start(padapter, _FALSE); +#endif + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + phead = get_list_head(queue); + plist = get_next(phead); + + while (1) { + + if (rtw_end_of_queue_search(phead, plist) == _TRUE) + break; + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + + if (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0 + && rtw_mlme_band_check(padapter, pnetwork->network.Configuration.DSConfig) == _TRUE + && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid))) { + delta_time = (u32) rtw_get_passing_time_ms(pnetwork->last_scanned); + + if (delta_time < lifetime) { + + uint ie_len = 0; + u8 *pbuf = NULL; + u8 *ie = NULL; + + pbss = &pnetwork->network; + ie = pbss->IEs; + + /*check if HT CAP INFO IE exists or not*/ + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss->IELength - _BEACON_IE_OFFSET_)); + if (pbuf == NULL) { + /* HT CAP INFO IE don't exist, it is b/g mode bss.*/ + + if (_FALSE == ATOMIC_READ(&pmlmepriv->olbc)) + ATOMIC_SET(&pmlmepriv->olbc, _TRUE); + + if (_FALSE == ATOMIC_READ(&pmlmepriv->olbc_ht)) + ATOMIC_SET(&pmlmepriv->olbc_ht, _TRUE); + + if (padapter->registrypriv.wifi_spec) + RTW_INFO("%s: %s is a/b/g ap\n", __func__, pnetwork->network.Ssid.Ssid); + } + } + } + + plist = get_next(plist); + + } + + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + pmlmepriv->num_sta_no_ht = 0; /* reset to 0 after ap do scanning*/ + +} + +void rtw_start_bss_hdl_after_chbw_decided(_adapter *adapter) +{ + WLAN_BSSID_EX *pnetwork = &(adapter->mlmepriv.cur_network.network); + struct sta_info *sta = NULL; + + /* update cur_wireless_mode */ + update_wireless_mode(adapter); + + /* update RRSR and RTS_INIT_RATE register after set channel and bandwidth */ + UpdateBrateTbl(adapter, pnetwork->SupportedRates); + rtw_hal_set_hwreg(adapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates); + + /* update capability after cur_wireless_mode updated */ + update_capinfo(adapter, rtw_get_capability(pnetwork)); + + /* update bc/mc sta_info */ + update_bmc_sta(adapter); + + /* update AP's sta info */ + sta = rtw_get_stainfo(&adapter->stapriv, pnetwork->MacAddress); + if (!sta) { + RTW_INFO(FUNC_ADPT_FMT" !sta for macaddr="MAC_FMT"\n", FUNC_ADPT_ARG(adapter), MAC_ARG(pnetwork->MacAddress)); + rtw_warn_on(1); + return; + } + + update_ap_info(adapter, sta); +} + +void start_bss_network(_adapter *padapter, struct createbss_parm *parm) +{ +#define DUMP_ADAPTERS_STATUS 0 + + u8 val8; + u16 bcn_interval; + u32 acparm; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecuritypriv = &(padapter->securitypriv); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; /* used as input */ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); + struct dvobj_priv *pdvobj = padapter->dvobj; + s16 req_ch = -1, req_bw = -1, req_offset = -1; + bool ch_setting_changed = _FALSE; + u8 ch_to_set = 0, bw_to_set, offset_to_set; + u8 doiqk = _FALSE; + /* use for check ch bw offset can be allowed or not */ + u8 chbw_allow = _TRUE; + + if (parm->req_ch != 0) { + /* bypass other setting, go checking ch, bw, offset */ + req_ch = parm->req_ch; + req_bw = parm->req_bw; + req_offset = parm->req_offset; + goto chbw_decision; + } + + bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; + + /* check if there is wps ie, */ + /* if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, */ + /* and at first time the security ie ( RSN/WPA IE) will not include in beacon. */ + if (NULL == rtw_get_wps_ie(pnetwork->IEs + _FIXED_IE_LENGTH_, pnetwork->IELength - _FIXED_IE_LENGTH_, NULL, NULL)) + pmlmeext->bstart_bss = _TRUE; + + /* todo: update wmm, ht cap */ + /* pmlmeinfo->WMM_enable; */ + /* pmlmeinfo->HT_enable; */ + if (pmlmepriv->qospriv.qos_option) + pmlmeinfo->WMM_enable = _TRUE; +#ifdef CONFIG_80211N_HT + if (pmlmepriv->htpriv.ht_option) { + pmlmeinfo->WMM_enable = _TRUE; + pmlmeinfo->HT_enable = _TRUE; + /* pmlmeinfo->HT_info_enable = _TRUE; */ + /* pmlmeinfo->HT_caps_enable = _TRUE; */ + + update_hw_ht_param(padapter); + } +#endif /* #CONFIG_80211N_HT */ + +#ifdef CONFIG_80211AC_VHT + if (pmlmepriv->vhtpriv.vht_option) { + pmlmeinfo->VHT_enable = _TRUE; + update_hw_vht_param(padapter); + } +#endif /* CONFIG_80211AC_VHT */ + + if (pmlmepriv->cur_network.join_res != _TRUE) { /* setting only at first time */ + /* WEP Key will be set before this function, do not clear CAM. */ + if ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_)) + flush_all_cam_entry(padapter); /* clear CAM */ + } + + /* set MSR to AP_Mode */ + Set_MSR(padapter, _HW_STATE_AP_); + + /* Set BSSID REG */ + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress); + + /* Set EDCA param reg */ +#ifdef CONFIG_CONCURRENT_MODE + acparm = 0x005ea42b; +#else + acparm = 0x002F3217; /* VO */ +#endif + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); + acparm = 0x005E4317; /* VI */ + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); + /* acparm = 0x00105320; */ /* BE */ + acparm = 0x005ea42b; + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + acparm = 0x0000A444; /* BK */ + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); + + /* Set Security */ + val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) ? 0xcc : 0xcf; + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + /* Beacon Control related register */ + rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); + +chbw_decision: + ch_setting_changed = rtw_ap_chbw_decision(padapter, req_ch, req_bw, req_offset + , &ch_to_set, &bw_to_set, &offset_to_set, &chbw_allow); + + /* let pnetwork_mlmeext == pnetwork_mlme. */ + _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); + + rtw_start_bss_hdl_after_chbw_decided(padapter); + +#if defined(CONFIG_DFS_MASTER) + rtw_dfs_master_status_apply(padapter, MLME_AP_STARTED); +#endif + +#ifdef CONFIG_MCC_MODE + /* issue null data to AP for all interface connecting to AP before switch channel setting for softap */ + rtw_hal_mcc_issue_null_data(padapter, chbw_allow, 1); +#endif /* CONFIG_MCC_MODE */ + + doiqk = _TRUE; + rtw_hal_set_hwreg(padapter , HW_VAR_DO_IQK , &doiqk); + + if (ch_to_set != 0) { + set_channel_bwmode(padapter, ch_to_set, offset_to_set, bw_to_set); + rtw_mi_update_union_chan_inf(padapter, ch_to_set, offset_to_set, bw_to_set); + } + + doiqk = _FALSE; + rtw_hal_set_hwreg(padapter , HW_VAR_DO_IQK , &doiqk); + +#ifdef CONFIG_MCC_MODE + /* after set_channel_bwmode for backup IQK */ + rtw_hal_set_mcc_setting_start_bss_network(padapter, chbw_allow); +#endif + + if (DUMP_ADAPTERS_STATUS) { + RTW_INFO(FUNC_ADPT_FMT" done\n", FUNC_ADPT_ARG(padapter)); + dump_adapters_status(RTW_DBGDUMP , adapter_to_dvobj(padapter)); + } + + /* update beacon content only if bstart_bss is _TRUE */ + if (_TRUE == pmlmeext->bstart_bss) { + + _irqL irqL; + + if ((ATOMIC_READ(&pmlmepriv->olbc) == _TRUE) || (ATOMIC_READ(&pmlmepriv->olbc_ht) == _TRUE)) { + /* AP is not starting a 40 MHz BSS in presence of an 802.11g BSS. */ + + pmlmepriv->ht_op_mode &= (~HT_INFO_OPERATION_MODE_OP_MODE_MASK); + pmlmepriv->ht_op_mode |= OP_MODE_MAY_BE_LEGACY_STAS; + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _FALSE); + } + + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + +#ifdef CONFIG_SWTIMER_BASED_TXBCN + _enter_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + if (rtw_is_list_empty(&padapter->list)) { + rtw_list_insert_tail(&padapter->list, get_list_head(&pdvobj->ap_if_q)); + pdvobj->nr_ap_if++; + pdvobj->inter_bcn_space = DEFAULT_BCN_INTERVAL / pdvobj->nr_ap_if; + } + _exit_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + + rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pdvobj->inter_bcn_space)); + +#endif /*CONFIG_SWTIMER_BASED_TXBCN*/ + + } + + rtw_scan_wait_completed(padapter); + + /* send beacon */ + if ((0 == rtw_mi_check_fwstate(padapter, _FW_UNDER_SURVEY)) + && (0 == rtw_mi_check_fwstate(padapter, WIFI_OP_CH_SWITCHING)) + ) { + + /*update_beacon(padapter, _TIM_IE_, NULL, _TRUE);*/ + +#if !defined(CONFIG_INTERRUPT_BASED_TXBCN) +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) +#ifdef CONFIG_SWTIMER_BASED_TXBCN + if (pdvobj->nr_ap_if == 1) { + RTW_INFO("start SW BCN TIMER!\n"); + _set_timer(&pdvobj->txbcn_timer, bcn_interval); + } +#else + /* other case will tx beacon when bcn interrupt coming in. */ + if (send_beacon(padapter) == _FAIL) + RTW_INFO("issue_beacon, fail!\n"); +#endif +#endif +#endif /* !defined(CONFIG_INTERRUPT_BASED_TXBCN) */ + } + + /*Set EDCA param reg after update cur_wireless_mode & update_capinfo*/ + if (pregpriv->wifi_spec == 1) + rtw_set_hw_wmm_param(padapter); + + /*pmlmeext->bstart_bss = _TRUE;*/ +} + +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) +{ + int ret = _SUCCESS; + u8 *p; + u8 *pHT_caps_ie = NULL; + u8 *pHT_info_ie = NULL; + u16 cap, ht_cap = _FALSE; + uint ie_len = 0; + int group_cipher, pairwise_cipher; + u8 channel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX]; + int supportRateNum = 0; + u8 OUI1[] = {0x00, 0x50, 0xf2, 0x01}; + u8 wps_oui[4] = {0x0, 0x50, 0xf2, 0x04}; + u8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pbss_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *ie = pbss_network->IEs; + u8 vht_cap = _FALSE; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 rf_num = 0; + + /* SSID */ + /* Supported rates */ + /* DS Params */ + /* WLAN_EID_COUNTRY */ + /* ERP Information element */ + /* Extended supported rates */ + /* WPA/WPA2 */ + /* Wi-Fi Wireless Multimedia Extensions */ + /* ht_capab, ht_oper */ + /* WPS IE */ + + RTW_INFO("%s, len=%d\n", __FUNCTION__, len); + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + return _FAIL; + + + if (len > MAX_IE_SZ) + return _FAIL; + + pbss_network->IELength = len; + + _rtw_memset(ie, 0, MAX_IE_SZ); + + _rtw_memcpy(ie, pbuf, pbss_network->IELength); + + + if (pbss_network->InfrastructureMode != Ndis802_11APMode) + return _FAIL; + + + rtw_ap_check_scan(padapter); + + + pbss_network->Rssi = 0; + + _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 */ + /* pbss_network->Configuration.BeaconPeriod = le16_to_cpu(*(unsigned short*)p); */ + pbss_network->Configuration.BeaconPeriod = RTW_GET_LE16(p); + + /* capability */ + /* cap = *(unsigned short *)rtw_get_capability_from_ie(ie); */ + /* cap = le16_to_cpu(cap); */ + cap = RTW_GET_LE16(ie); + + /* SSID */ + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p && ie_len > 0) { + _rtw_memset(&pbss_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len); + pbss_network->Ssid.SsidLength = ie_len; +#ifdef CONFIG_P2P + _rtw_memcpy(padapter->wdinfo.p2p_group_ssid, pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength); + padapter->wdinfo.p2p_group_ssid_len = pbss_network->Ssid.SsidLength; +#endif + } + + /* chnnel */ + channel = 0; + pbss_network->Configuration.Length = 0; + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p && ie_len > 0) + channel = *(p + 2); + + pbss_network->Configuration.DSConfig = channel; + + + _rtw_memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX); + /* get supported rates */ + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) { + _rtw_memcpy(supportRate, p + 2, ie_len); + supportRateNum = ie_len; + } + + /* get ext_supported rates */ + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_); + if (p != NULL) { + _rtw_memcpy(supportRate + supportRateNum, p + 2, ie_len); + supportRateNum += ie_len; + + } + + network_type = rtw_check_network_type(supportRate, supportRateNum, channel); + + rtw_set_supported_rate(pbss_network->SupportedRates, network_type); + + + /* parsing ERP_IE */ + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p && ie_len > 0) + ERP_IE_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)p); + + /* update privacy/security */ + if (cap & BIT(4)) + pbss_network->Privacy = 1; + else + pbss_network->Privacy = 0; + + psecuritypriv->wpa_psk = 0; + + /* wpa2 */ + group_cipher = 0; + pairwise_cipher = 0; + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p && ie_len > 0) { + if (rtw_parse_wpa2_ie(p, ie_len + 2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + + psecuritypriv->dot8021xalg = 1;/* psk, todo:802.1x */ + psecuritypriv->wpa_psk |= BIT(1); + + psecuritypriv->wpa2_group_cipher = group_cipher; + psecuritypriv->wpa2_pairwise_cipher = pairwise_cipher; +#if 0 + switch (group_cipher) { + case WPA_CIPHER_NONE: + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa2_group_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa2_group_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa2_group_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa2_group_cipher = _WEP104_; + break; + } + + switch (pairwise_cipher) { + case WPA_CIPHER_NONE: + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa2_pairwise_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa2_pairwise_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa2_pairwise_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa2_pairwise_cipher = _WEP104_; + break; + } +#endif + } + + } + + /* wpa */ + ie_len = 0; + group_cipher = 0; + pairwise_cipher = 0; + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; + for (p = ie + _BEACON_IE_OFFSET_; ; p += (ie_len + 2)) { + p = rtw_get_ie(p, _SSN_IE_1_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if ((p) && (_rtw_memcmp(p + 2, OUI1, 4))) { + if (rtw_parse_wpa_ie(p, ie_len + 2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + + psecuritypriv->dot8021xalg = 1;/* psk, todo:802.1x */ + + psecuritypriv->wpa_psk |= BIT(0); + + psecuritypriv->wpa_group_cipher = group_cipher; + psecuritypriv->wpa_pairwise_cipher = pairwise_cipher; + +#if 0 + switch (group_cipher) { + case WPA_CIPHER_NONE: + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa_group_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa_group_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa_group_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa_group_cipher = _WEP104_; + break; + } + + switch (pairwise_cipher) { + case WPA_CIPHER_NONE: + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa_pairwise_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa_pairwise_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa_pairwise_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa_pairwise_cipher = _WEP104_; + break; + } +#endif + } + + break; + + } + + if ((p == NULL) || (ie_len == 0)) + break; + + } + + /* wmm */ + ie_len = 0; + pmlmepriv->qospriv.qos_option = 0; + if (pregistrypriv->wmm_enable) { + for (p = ie + _BEACON_IE_OFFSET_; ; p += (ie_len + 2)) { + p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if ((p) && _rtw_memcmp(p + 2, WMM_PARA_IE, 6)) { + pmlmepriv->qospriv.qos_option = 1; + + *(p + 8) |= BIT(7); /* QoS Info, support U-APSD */ + + /* disable all ACM bits since the WMM admission control is not supported */ + *(p + 10) &= ~BIT(4); /* BE */ + *(p + 14) &= ~BIT(4); /* BK */ + *(p + 18) &= ~BIT(4); /* VI */ + *(p + 22) &= ~BIT(4); /* VO */ + + break; + } + + if ((p == NULL) || (ie_len == 0)) + break; + } + } +#ifdef CONFIG_80211N_HT + /* parsing HT_CAP_IE */ + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p && ie_len > 0) { + u8 rf_type = 0; + HT_CAP_AMPDU_FACTOR max_rx_ampdu_factor = MAX_AMPDU_FACTOR_64K; + struct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p + 2); + + if (0) { + RTW_INFO(FUNC_ADPT_FMT" HT_CAP_IE from upper layer:\n", FUNC_ADPT_ARG(padapter)); + dump_ht_cap_ie_content(RTW_DBGDUMP, p + 2, ie_len); + } + + pHT_caps_ie = p; + + ht_cap = _TRUE; + network_type |= WIRELESS_11_24N; + + rtw_ht_use_default_setting(padapter); + + /* Update HT Capabilities Info field */ + if (pmlmepriv->htpriv.sgi_20m == _FALSE) + pht_cap->cap_info &= ~(IEEE80211_HT_CAP_SGI_20); + + if (pmlmepriv->htpriv.sgi_40m == _FALSE) + pht_cap->cap_info &= ~(IEEE80211_HT_CAP_SGI_40); + + if (!TEST_FLAG(pmlmepriv->htpriv.ldpc_cap, LDPC_HT_ENABLE_RX)) + pht_cap->cap_info &= ~(IEEE80211_HT_CAP_LDPC_CODING); + + if (!TEST_FLAG(pmlmepriv->htpriv.stbc_cap, STBC_HT_ENABLE_TX)) + pht_cap->cap_info &= ~(IEEE80211_HT_CAP_TX_STBC); + + if (!TEST_FLAG(pmlmepriv->htpriv.stbc_cap, STBC_HT_ENABLE_RX)) + pht_cap->cap_info &= ~(IEEE80211_HT_CAP_RX_STBC_3R); + + /* Update A-MPDU Parameters field */ + pht_cap->ampdu_params_info &= ~(IEEE80211_HT_CAP_AMPDU_FACTOR | IEEE80211_HT_CAP_AMPDU_DENSITY); + + if ((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) || + (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & (0x07 << 2)); + else + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & 0x00); + + rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor); + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & max_rx_ampdu_factor); /* set Max Rx AMPDU size to 64K */ + + _rtw_memcpy(&(pmlmeinfo->HT_caps), pht_cap, sizeof(struct HT_caps_element)); + + /* Update Supported MCS Set field */ + { + int i; + + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + + /* RX MCS Bitmask */ + switch (rf_type) { + case RF_1T1R: + case RF_1T2R: /* ? */ + set_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_1R); + break; + case RF_2T2R: + 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: + RTW_INFO("[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]; + } + +#ifdef CONFIG_BEAMFORMING + /* Use registry value to enable HT Beamforming. */ + /* ToDo: use configure file to set these capability. */ + pht_cap->tx_BF_cap_info = 0; + + /* HT Beamformer */ + if (TEST_FLAG(pmlmepriv->htpriv.beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE)) { + /* Transmit NDP Capable */ + SET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(pht_cap, 1); + /* Explicit Compressed Steering Capable */ + SET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pht_cap, 1); + /* Compressed Steering Number Antennas */ + SET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pht_cap, 1); + rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMER_CAP, (u8 *)&rf_num); + SET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(pht_cap, rf_num); + } + + /* HT Beamformee */ + if (TEST_FLAG(pmlmepriv->htpriv.beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE)) { + /* Receive NDP Capable */ + SET_HT_CAP_TXBF_RECEIVE_NDP_CAP(pht_cap, 1); + /* Explicit Compressed Beamforming Feedback Capable */ + SET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pht_cap, 2); + rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMEE_CAP, (u8 *)&rf_num); + SET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pht_cap, rf_num); + } +#endif /* CONFIG_BEAMFORMING */ + + _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p + 2, ie_len); + + if (0) { + RTW_INFO(FUNC_ADPT_FMT" HT_CAP_IE driver masked:\n", FUNC_ADPT_ARG(padapter)); + dump_ht_cap_ie_content(RTW_DBGDUMP, p + 2, ie_len); + } + } + + /* parsing HT_INFO_IE */ + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p && ie_len > 0) + pHT_info_ie = p; +#endif /* CONFIG_80211N_HT */ + switch (network_type) { + case WIRELESS_11B: + pbss_network->NetworkTypeInUse = Ndis802_11DS; + break; + case WIRELESS_11G: + case WIRELESS_11BG: + case WIRELESS_11G_24N: + case WIRELESS_11BG_24N: + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; + break; + case WIRELESS_11A: + pbss_network->NetworkTypeInUse = Ndis802_11OFDM5; + break; + default: + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; + break; + } + + pmlmepriv->cur_network.network_type = network_type; + +#ifdef CONFIG_80211N_HT + pmlmepriv->htpriv.ht_option = _FALSE; + + if ((psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_TKIP) || + (psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_TKIP)) { + /* todo: */ + /* ht_cap = _FALSE; */ + } + + /* ht_cap */ + if (pregistrypriv->ht_enable && ht_cap == _TRUE) { + pmlmepriv->htpriv.ht_option = _TRUE; + pmlmepriv->qospriv.qos_option = 1; + + pmlmepriv->htpriv.ampdu_enable = pregistrypriv->ampdu_enable ? _TRUE : _FALSE; + + HT_caps_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_caps_ie); + + HT_info_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_info_ie); + } +#endif + +#ifdef CONFIG_80211AC_VHT + + /* Parsing VHT CAP IE */ + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, EID_VHTCapability, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p && ie_len > 0) + vht_cap = _TRUE; + /* Parsing VHT OPERATION IE */ + + + pmlmepriv->vhtpriv.vht_option = _FALSE; + /* if channel in 5G band, then add vht ie . */ + if ((pbss_network->Configuration.DSConfig > 14) + && (pmlmepriv->htpriv.ht_option == _TRUE) + && REGSTY_IS_11AC_ENABLE(pregistrypriv) + && hal_chk_proto_cap(padapter, PROTO_CAP_11AC) + && (!pmlmepriv->country_ent || COUNTRY_CHPLAN_EN_11AC(pmlmepriv->country_ent)) + ) { + if (vht_cap == _TRUE) + pmlmepriv->vhtpriv.vht_option = _TRUE; + else if (REGSTY_IS_11AC_AUTO(pregistrypriv)) { + u8 cap_len, operation_len; + + rtw_vht_use_default_setting(padapter); + + { + /* VHT Operation mode notifiy bit in Extended IE (127) */ + uint len = 0; + + SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(pmlmepriv->ext_capab_ie_data, 1); + pmlmepriv->ext_capab_ie_len = 10; + rtw_set_ie(pbss_network->IEs + pbss_network->IELength, EID_EXTCapability, 8, pmlmepriv->ext_capab_ie_data, &len); + pbss_network->IELength += pmlmepriv->ext_capab_ie_len; + } + + /* VHT Capabilities element */ + cap_len = rtw_build_vht_cap_ie(padapter, pbss_network->IEs + pbss_network->IELength); + pbss_network->IELength += cap_len; + + /* VHT Operation element */ + operation_len = rtw_build_vht_operation_ie(padapter, pbss_network->IEs + pbss_network->IELength, pbss_network->Configuration.DSConfig); + pbss_network->IELength += operation_len; + + pmlmepriv->vhtpriv.vht_option = _TRUE; + } + } +#endif /* CONFIG_80211AC_VHT */ + + if(pbss_network->Configuration.DSConfig <= 14 && padapter->registrypriv.wifi_spec == 1) { + uint len = 0; + + SET_EXT_CAPABILITY_ELE_BSS_COEXIST(pmlmepriv->ext_capab_ie_data, 1); + pmlmepriv->ext_capab_ie_len = 10; + rtw_set_ie(pbss_network->IEs + pbss_network->IELength, EID_EXTCapability, 8, pmlmepriv->ext_capab_ie_data, &len); + pbss_network->IELength += pmlmepriv->ext_capab_ie_len; + } + + pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network); + + rtw_ies_get_chbw(pbss_network->IEs + _BEACON_IE_OFFSET_, pbss_network->IELength - _BEACON_IE_OFFSET_ + , &pmlmepriv->ori_ch, &pmlmepriv->ori_bw, &pmlmepriv->ori_offset); + rtw_warn_on(pmlmepriv->ori_ch == 0); + + { + /* alloc sta_info for ap itself */ + + struct sta_info *sta; + + sta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress); + if (!sta) { + sta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress); + if (sta == NULL) + return _FAIL; + } + } + + rtw_startbss_cmd(padapter, RTW_CMDF_WAIT_ACK); + { + int sk_band = RTW_GET_SCAN_BAND_SKIP(padapter); + + if (sk_band) + RTW_CLR_SCAN_BAND_SKIP(padapter, sk_band); + } + + rtw_indicate_connect(padapter); + + pmlmepriv->cur_network.join_res = _TRUE;/* for check if already set beacon */ + + /* update bc/mc sta_info */ + /* update_bmc_sta(padapter); */ + + return ret; + +} + +#if CONFIG_RTW_MACADDR_ACL +void rtw_macaddr_acl_init(_adapter *adapter) +{ + struct sta_priv *stapriv = &adapter->stapriv; + struct wlan_acl_pool *acl = &stapriv->acl_list; + _queue *acl_node_q = &acl->acl_node_q; + int i; + _irqL irqL; + + _enter_critical_bh(&(acl_node_q->lock), &irqL); + _rtw_init_listhead(&(acl_node_q->queue)); + acl->num = 0; + acl->mode = RTW_ACL_MODE_DISABLED; + for (i = 0; i < NUM_ACL; i++) { + _rtw_init_listhead(&acl->aclnode[i].list); + acl->aclnode[i].valid = _FALSE; + } + _exit_critical_bh(&(acl_node_q->lock), &irqL); +} + +void rtw_macaddr_acl_deinit(_adapter *adapter) +{ + struct sta_priv *stapriv = &adapter->stapriv; + struct wlan_acl_pool *acl = &stapriv->acl_list; + _queue *acl_node_q = &acl->acl_node_q; + _irqL irqL; + _list *head, *list; + struct rtw_wlan_acl_node *acl_node; + + _enter_critical_bh(&(acl_node_q->lock), &irqL); + head = get_list_head(acl_node_q); + list = get_next(head); + while (rtw_end_of_queue_search(head, list) == _FALSE) { + acl_node = LIST_CONTAINOR(list, struct rtw_wlan_acl_node, list); + list = get_next(list); + + if (acl_node->valid == _TRUE) { + acl_node->valid = _FALSE; + rtw_list_delete(&acl_node->list); + acl->num--; + } + } + _exit_critical_bh(&(acl_node_q->lock), &irqL); + + rtw_warn_on(acl->num); + acl->mode = RTW_ACL_MODE_DISABLED; +} + +void rtw_set_macaddr_acl(_adapter *adapter, int mode) +{ + struct sta_priv *stapriv = &adapter->stapriv; + struct wlan_acl_pool *acl = &stapriv->acl_list; + + RTW_INFO(FUNC_ADPT_FMT" mode=%d\n", FUNC_ADPT_ARG(adapter), mode); + + acl->mode = mode; + + if (mode == RTW_ACL_MODE_DISABLED) + rtw_macaddr_acl_deinit(adapter); +} + +int rtw_acl_add_sta(_adapter *adapter, const u8 *addr) +{ + _irqL irqL; + _list *list, *head; + u8 existed = 0; + int i = -1, ret = 0; + struct rtw_wlan_acl_node *acl_node; + struct sta_priv *stapriv = &adapter->stapriv; + struct wlan_acl_pool *acl = &stapriv->acl_list; + _queue *acl_node_q = &acl->acl_node_q; + + _enter_critical_bh(&(acl_node_q->lock), &irqL); + + head = get_list_head(acl_node_q); + list = get_next(head); + + /* search for existed entry */ + while (rtw_end_of_queue_search(head, list) == _FALSE) { + acl_node = LIST_CONTAINOR(list, struct rtw_wlan_acl_node, list); + list = get_next(list); + + if (_rtw_memcmp(acl_node->addr, addr, ETH_ALEN)) { + if (acl_node->valid == _TRUE) { + existed = 1; + break; + } + } + } + if (existed) + goto release_lock; + + if (acl->num >= NUM_ACL) + goto release_lock; + + /* find empty one and use */ + for (i = 0; i < NUM_ACL; i++) { + + acl_node = &acl->aclnode[i]; + if (acl_node->valid == _FALSE) { + + _rtw_init_listhead(&acl_node->list); + _rtw_memcpy(acl_node->addr, addr, ETH_ALEN); + acl_node->valid = _TRUE; + + rtw_list_insert_tail(&acl_node->list, get_list_head(acl_node_q)); + acl->num++; + break; + } + } + +release_lock: + _exit_critical_bh(&(acl_node_q->lock), &irqL); + + if (!existed && (i < 0 || i >= NUM_ACL)) + ret = -1; + + RTW_INFO(FUNC_ADPT_FMT" "MAC_FMT" %s (acl_num=%d)\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(addr) + , (existed ? "existed" : ((i < 0 || i >= NUM_ACL) ? "no room" : "added")) + , acl->num); + + return ret; +} + +int rtw_acl_remove_sta(_adapter *adapter, const u8 *addr) +{ + _irqL irqL; + _list *list, *head; + int ret = 0; + struct rtw_wlan_acl_node *acl_node; + struct sta_priv *stapriv = &adapter->stapriv; + struct wlan_acl_pool *acl = &stapriv->acl_list; + _queue *acl_node_q = &acl->acl_node_q; + u8 is_baddr = is_broadcast_mac_addr(addr); + u8 match = 0; + + _enter_critical_bh(&(acl_node_q->lock), &irqL); + + head = get_list_head(acl_node_q); + list = get_next(head); + + while (rtw_end_of_queue_search(head, list) == _FALSE) { + acl_node = LIST_CONTAINOR(list, struct rtw_wlan_acl_node, list); + list = get_next(list); + + if (is_baddr || _rtw_memcmp(acl_node->addr, addr, ETH_ALEN)) { + if (acl_node->valid == _TRUE) { + acl_node->valid = _FALSE; + rtw_list_delete(&acl_node->list); + acl->num--; + match = 1; + } + } + } + + _exit_critical_bh(&(acl_node_q->lock), &irqL); + + RTW_INFO(FUNC_ADPT_FMT" "MAC_FMT" %s (acl_num=%d)\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(addr) + , is_baddr ? "clear all" : (match ? "match" : "no found") + , acl->num); + + return ret; +} +#endif /* CONFIG_RTW_MACADDR_ACL */ + +u8 rtw_ap_set_pairwise_key(_adapter *padapter, struct sta_info *psta) +{ + struct cmd_obj *ph2c; + struct set_stakey_parm *psetstakey_para; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; + goto exit; + } + + psetstakey_para = (struct set_stakey_parm *)rtw_zmalloc(sizeof(struct set_stakey_parm)); + if (psetstakey_para == NULL) { + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); + + + psetstakey_para->algorithm = (u8)psta->dot118021XPrivacy; + + _rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN); + + _rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16); + + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + + return res; + +} + +static int rtw_ap_set_key(_adapter *padapter, u8 *key, u8 alg, int keyid, u8 set_tx) +{ + u8 keylen; + struct cmd_obj *pcmd; + struct setkey_parm *psetkeyparm; + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); + int res = _SUCCESS; + + /* RTW_INFO("%s\n", __FUNCTION__); */ + + pcmd = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmd == NULL) { + res = _FAIL; + goto exit; + } + psetkeyparm = (struct setkey_parm *)rtw_zmalloc(sizeof(struct setkey_parm)); + if (psetkeyparm == NULL) { + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); + + psetkeyparm->keyid = (u8)keyid; + if (is_wep_enc(alg)) + padapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid); + + psetkeyparm->algorithm = alg; + + psetkeyparm->set_tx = set_tx; + + switch (alg) { + case _WEP40_: + keylen = 5; + break; + case _WEP104_: + keylen = 13; + break; + case _TKIP_: + case _TKIP_WTMIC_: + case _AES_: + default: + keylen = 16; + } + + _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen); + + pcmd->cmdcode = _SetKey_CMD_; + pcmd->parmbuf = (u8 *)psetkeyparm; + pcmd->cmdsz = (sizeof(struct setkey_parm)); + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + + _rtw_init_listhead(&pcmd->list); + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + + return res; +} + +int rtw_ap_set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid) +{ + RTW_INFO("%s\n", __FUNCTION__); + + return rtw_ap_set_key(padapter, key, alg, keyid, 1); +} + +int rtw_ap_set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid, u8 set_tx) +{ + u8 alg; + + switch (keylen) { + case 5: + alg = _WEP40_; + break; + case 13: + alg = _WEP104_; + break; + default: + alg = _NO_PRIVACY_; + } + + RTW_INFO("%s\n", __FUNCTION__); + + return rtw_ap_set_key(padapter, key, alg, keyid, set_tx); +} + +u8 rtw_ap_bmc_frames_hdl(_adapter *padapter) +{ +#define HIQ_XMIT_COUNTS (6) + _irqL irqL; + struct sta_info *psta_bmc; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe = NULL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct sta_priv *pstapriv = &padapter->stapriv; + bool update_tim = _FALSE; + + + if (padapter->registrypriv.wifi_spec != 1) + return H2C_SUCCESS; + + + psta_bmc = rtw_get_bcmc_stainfo(padapter); + if (!psta_bmc) + return H2C_SUCCESS; + + + _enter_critical_bh(&pxmitpriv->lock, &irqL); + + if ((pstapriv->tim_bitmap & BIT(0)) && (psta_bmc->sleepq_len > 0)) { + int tx_counts = 0; + + _update_beacon(padapter, _TIM_IE_, NULL, _FALSE, "update TIM with TIB=1"); + + RTW_INFO("sleepq_len of bmc_sta = %d\n", psta_bmc->sleepq_len); + + xmitframe_phead = get_list_head(&psta_bmc->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + 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); + + psta_bmc->sleepq_len--; + tx_counts++; + + if (psta_bmc->sleepq_len > 0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; + + if (tx_counts == HIQ_XMIT_COUNTS) + pxmitframe->attrib.mdata = 0; + + pxmitframe->attrib.triggered = 1; + + if (xmitframe_hiq_filter(pxmitframe) == _TRUE) + pxmitframe->attrib.qsel = QSLT_HIGH;/*HIQ*/ + + rtw_hal_xmitframe_enqueue(padapter, pxmitframe); + + if (tx_counts == HIQ_XMIT_COUNTS) + break; + + } + + } else { + if (psta_bmc->sleepq_len == 0) { + + /*RTW_INFO("sleepq_len of bmc_sta = %d\n", psta_bmc->sleepq_len);*/ + + if (pstapriv->tim_bitmap & BIT(0)) + update_tim = _TRUE; + + pstapriv->tim_bitmap &= ~BIT(0); + pstapriv->sta_dz_bitmap &= ~BIT(0); + + if (update_tim == _TRUE) { + RTW_INFO("clear TIB\n"); + _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "bmc sleepq and HIQ empty"); + } + } + } + + _exit_critical_bh(&pxmitpriv->lock, &irqL); + +#if 0 + /* HIQ Check */ + rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty); + + while (_FALSE == empty && rtw_get_passing_time_ms(start) < 3000) { + rtw_msleep_os(100); + rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty); + } + + + printk("check if hiq empty=%d\n", empty); +#endif + + return H2C_SUCCESS; +} + +#ifdef CONFIG_NATIVEAP_MLME + +static void associated_stainfo_update(_adapter *padapter, struct sta_info *psta, u32 sta_info_type) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + RTW_INFO("%s: "MAC_FMT", updated_type=0x%x\n", __func__, MAC_ARG(psta->hwaddr), sta_info_type); + + if (sta_info_type & STA_INFO_UPDATE_BW) { + + if ((psta->flags & WLAN_STA_HT) && !psta->ht_20mhz_set) { + if (pmlmepriv->sw_to_20mhz) { + psta->bw_mode = CHANNEL_WIDTH_20; + /*psta->htpriv.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;*/ + psta->htpriv.sgi_40m = _FALSE; + } else { + /*TODO: Switch back to 40MHZ?80MHZ*/ + } + } + } + + /* + if (sta_info_type & STA_INFO_UPDATE_RATE) { + + } + */ + + if (sta_info_type & STA_INFO_UPDATE_PROTECTION_MODE) + VCS_update(padapter, psta); + + /* + if (sta_info_type & STA_INFO_UPDATE_CAP) { + + } + + if (sta_info_type & STA_INFO_UPDATE_HT_CAP) { + + } + + if (sta_info_type & STA_INFO_UPDATE_VHT_CAP) { + + } + */ + +} + +static void update_bcn_ext_capab_ie(_adapter *padapter) +{ + sint ie_len = 0; + unsigned char *pbuf; + 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 = &(pmlmeinfo->network); + u8 *ie = pnetwork->IEs; + u8 null_extcap_data[8] = {0}; + + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_CAP_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if (pbuf && ie_len > 0) + rtw_remove_bcn_ie(padapter, pnetwork, _EXT_CAP_IE_); + + if ((pmlmepriv->ext_capab_ie_len > 0) && + (_rtw_memcmp(pmlmepriv->ext_capab_ie_data, null_extcap_data, sizeof(null_extcap_data)) == _FALSE)) + rtw_add_bcn_ie(padapter, pnetwork, _EXT_CAP_IE_, pmlmepriv->ext_capab_ie_data, pmlmepriv->ext_capab_ie_len); + +} + +static void update_bcn_fixed_ie(_adapter *padapter) +{ + RTW_INFO("%s\n", __FUNCTION__); + +} + +static void update_bcn_erpinfo_ie(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); + unsigned char *p, *ie = pnetwork->IEs; + u32 len = 0; + + RTW_INFO("%s, ERP_enable=%d\n", __FUNCTION__, pmlmeinfo->ERP_enable); + + if (!pmlmeinfo->ERP_enable) + return; + + /* parsing ERP_IE */ + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if (p && len > 0) { + PNDIS_802_11_VARIABLE_IEs pIE = (PNDIS_802_11_VARIABLE_IEs)p; + + if (pmlmepriv->num_sta_non_erp == 1) + pIE->data[0] |= RTW_ERP_INFO_NON_ERP_PRESENT | RTW_ERP_INFO_USE_PROTECTION; + else + pIE->data[0] &= ~(RTW_ERP_INFO_NON_ERP_PRESENT | RTW_ERP_INFO_USE_PROTECTION); + + if (pmlmepriv->num_sta_no_short_preamble > 0) + pIE->data[0] |= RTW_ERP_INFO_BARKER_PREAMBLE_MODE; + else + pIE->data[0] &= ~(RTW_ERP_INFO_BARKER_PREAMBLE_MODE); + + ERP_IE_handler(padapter, pIE); + } + +} + +static void update_bcn_htcap_ie(_adapter *padapter) +{ + RTW_INFO("%s\n", __FUNCTION__); + +} + +static void update_bcn_htinfo_ie(_adapter *padapter) +{ + /* + u8 beacon_updated = _FALSE; + u32 sta_info_update_type = STA_INFO_UPDATE_NONE; + */ + 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 = &(pmlmeinfo->network); + unsigned char *p, *ie = pnetwork->IEs; + u32 len = 0; + + if (pmlmepriv->htpriv.ht_option == _FALSE) + return; + + if (pmlmeinfo->HT_info_enable != 1) + return; + + + RTW_INFO("%s current operation mode=0x%X\n", + __FUNCTION__, pmlmepriv->ht_op_mode); + + RTW_INFO("num_sta_40mhz_intolerant(%d), 20mhz_width_req(%d), intolerant_ch_rpt(%d), olbc(%d)\n", + pmlmepriv->num_sta_40mhz_intolerant, pmlmepriv->ht_20mhz_width_req, pmlmepriv->ht_intolerant_ch_reported, ATOMIC_READ(&pmlmepriv->olbc)); + + /*parsing HT_INFO_IE, currently only update ht_op_mode - pht_info->infos[1] & pht_info->infos[2] for wifi logo test*/ + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if (p && len > 0) { + struct HT_info_element *pht_info = NULL; + + pht_info = (struct HT_info_element *)(p + 2); + + /* for STA Channel Width/Secondary Channel Offset*/ + if ((pmlmepriv->sw_to_20mhz == 0) && (pmlmeext->cur_channel <= 14)) { + if ((pmlmepriv->num_sta_40mhz_intolerant > 0) || (pmlmepriv->ht_20mhz_width_req == _TRUE) + || (pmlmepriv->ht_intolerant_ch_reported == _TRUE) || (ATOMIC_READ(&pmlmepriv->olbc) == _TRUE)) { + SET_HT_OP_ELE_2ND_CHL_OFFSET(pht_info, 0); + SET_HT_OP_ELE_STA_CHL_WIDTH(pht_info, 0); + + pmlmepriv->sw_to_20mhz = 1; + /* + sta_info_update_type |= STA_INFO_UPDATE_BW; + beacon_updated = _TRUE; + */ + + RTW_INFO("%s:switching to 20Mhz\n", __FUNCTION__); + + /*TODO : cur_bwmode/cur_ch_offset switches to 20Mhz*/ + } + } else { + + if ((pmlmepriv->num_sta_40mhz_intolerant == 0) && (pmlmepriv->ht_20mhz_width_req == _FALSE) + && (pmlmepriv->ht_intolerant_ch_reported == _FALSE) && (ATOMIC_READ(&pmlmepriv->olbc) == _FALSE)) { + + if (pmlmeext->cur_bwmode >= CHANNEL_WIDTH_40) { + + SET_HT_OP_ELE_STA_CHL_WIDTH(pht_info, 1); + + SET_HT_OP_ELE_2ND_CHL_OFFSET(pht_info, + (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) ? + HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE : HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW); + + pmlmepriv->sw_to_20mhz = 0; + /* + sta_info_update_type |= STA_INFO_UPDATE_BW; + beacon_updated = _TRUE; + */ + + RTW_INFO("%s:switching back to 40Mhz\n", __FUNCTION__); + } + } + } + + /* to update ht_op_mode*/ + *(u16 *)(pht_info->infos + 1) = cpu_to_le16(pmlmepriv->ht_op_mode); + + } + + /*associated_clients_update(padapter, beacon_updated, sta_info_update_type);*/ + +} + +static void update_bcn_rsn_ie(_adapter *padapter) +{ + RTW_INFO("%s\n", __FUNCTION__); + +} + +static void update_bcn_wpa_ie(_adapter *padapter) +{ + RTW_INFO("%s\n", __FUNCTION__); + +} + +static void update_bcn_wmm_ie(_adapter *padapter) +{ + RTW_INFO("%s\n", __FUNCTION__); + +} + +static void update_bcn_wps_ie(_adapter *padapter) +{ + u8 *pwps_ie = NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie = NULL; + uint wps_ielen = 0, wps_offset, remainder_ielen; + 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 = &(pmlmeinfo->network); + unsigned char *ie = pnetwork->IEs; + u32 ielen = pnetwork->IELength; + + + RTW_INFO("%s\n", __FUNCTION__); + + pwps_ie = rtw_get_wps_ie(ie + _FIXED_IE_LENGTH_, ielen - _FIXED_IE_LENGTH_, NULL, &wps_ielen); + + if (pwps_ie == NULL || wps_ielen == 0) + return; + + pwps_ie_src = pmlmepriv->wps_beacon_ie; + if (pwps_ie_src == NULL) + return; + + wps_offset = (uint)(pwps_ie - ie); + + premainder_ie = pwps_ie + wps_ielen; + + remainder_ielen = ielen - wps_offset - wps_ielen; + + if (remainder_ielen > 0) { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if (pbackup_remainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + wps_ielen = (uint)pwps_ie_src[1];/* to get ie data len */ + if ((wps_offset + wps_ielen + 2 + remainder_ielen) <= MAX_IE_SZ) { + _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen + 2); + pwps_ie += (wps_ielen + 2); + + if (pbackup_remainder_ie) + _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); + + /* update IELength */ + pnetwork->IELength = wps_offset + (wps_ielen + 2) + remainder_ielen; + } + + if (pbackup_remainder_ie) + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + + /* deal with the case without set_tx_beacon_cmd() in update_beacon() */ +#if defined(CONFIG_INTERRUPT_BASED_TXBCN) || defined(CONFIG_PCI_HCI) + if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { + u8 sr = 0; + rtw_get_wps_attr_content(pwps_ie_src, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8 *)(&sr), NULL); + + if (sr) { + set_fwstate(pmlmepriv, WIFI_UNDER_WPS); + RTW_INFO("%s, set WIFI_UNDER_WPS\n", __func__); + } + } +#endif +} + +static void update_bcn_p2p_ie(_adapter *padapter) +{ + +} + +static void update_bcn_vendor_spec_ie(_adapter *padapter, u8 *oui) +{ + RTW_INFO("%s\n", __FUNCTION__); + + if (_rtw_memcmp(RTW_WPA_OUI, oui, 4)) + update_bcn_wpa_ie(padapter); + else if (_rtw_memcmp(WMM_OUI, oui, 4)) + update_bcn_wmm_ie(padapter); + else if (_rtw_memcmp(WPS_OUI, oui, 4)) + update_bcn_wps_ie(padapter); + else if (_rtw_memcmp(P2P_OUI, oui, 4)) + update_bcn_p2p_ie(padapter); + else + RTW_INFO("unknown OUI type!\n"); + + +} + +void _update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx, const char *tag) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv; + struct mlme_ext_priv *pmlmeext; + /* struct mlme_ext_info *pmlmeinfo; */ + + /* RTW_INFO("%s\n", __FUNCTION__); */ + + if (!padapter) + return; + + pmlmepriv = &(padapter->mlmepriv); + pmlmeext = &(padapter->mlmeextpriv); + /* pmlmeinfo = &(pmlmeext->mlmext_info); */ + + if (_FALSE == pmlmeext->bstart_bss) + return; + + _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + + switch (ie_id) { + case 0xFF: + + update_bcn_fixed_ie(padapter);/* 8: TimeStamp, 2: Beacon Interval 2:Capability */ + + break; + + case _TIM_IE_: + + update_BCNTIM(padapter); + + break; + + case _ERPINFO_IE_: + + update_bcn_erpinfo_ie(padapter); + + break; + + case _HT_CAPABILITY_IE_: + + update_bcn_htcap_ie(padapter); + + break; + + case _RSN_IE_2_: + + update_bcn_rsn_ie(padapter); + + break; + + case _HT_ADD_INFO_IE_: + + update_bcn_htinfo_ie(padapter); + + break; + + case _EXT_CAP_IE_: + + update_bcn_ext_capab_ie(padapter); + + break; + + case _VENDOR_SPECIFIC_IE_: + + update_bcn_vendor_spec_ie(padapter, oui); + + break; + + default: + break; + } + + pmlmepriv->update_bcn = _TRUE; + + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + +#ifndef CONFIG_INTERRUPT_BASED_TXBCN +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + if (tx) { + /* send_beacon(padapter); */ /* send_beacon must execute on TSR level */ + if (0) + RTW_INFO(FUNC_ADPT_FMT" ie_id:%u - %s\n", FUNC_ADPT_ARG(padapter), ie_id, tag); + set_tx_beacon_cmd(padapter); + } +#else + { + /* PCI will issue beacon when BCN interrupt occurs. */ + } +#endif +#endif /* !CONFIG_INTERRUPT_BASED_TXBCN */ + +} + +#ifdef CONFIG_80211N_HT + +void rtw_process_public_act_bsscoex(_adapter *padapter, u8 *pframe, uint frame_len) +{ + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); + uint frame_body_len = frame_len - sizeof(struct rtw_ieee80211_hdr_3addr); + u8 category, action; + + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta == NULL) + return; + + + category = frame_body[0]; + action = frame_body[1]; + + if (frame_body_len > 0) { + if ((frame_body[2] == EID_BSSCoexistence) && (frame_body[3] > 0)) { + u8 ie_data = frame_body[4]; + + if (ie_data & RTW_WLAN_20_40_BSS_COEX_40MHZ_INTOL) { + if (psta->ht_40mhz_intolerant == 0) { + psta->ht_40mhz_intolerant = 1; + pmlmepriv->num_sta_40mhz_intolerant++; + beacon_updated = _TRUE; + } + } else if (ie_data & RTW_WLAN_20_40_BSS_COEX_20MHZ_WIDTH_REQ) { + if (pmlmepriv->ht_20mhz_width_req == _FALSE) { + pmlmepriv->ht_20mhz_width_req = _TRUE; + beacon_updated = _TRUE; + } + } else + beacon_updated = _FALSE; + } + } + + if (frame_body_len > 8) { + /* if EID_BSSIntolerantChlReport ie exists */ + if ((frame_body[5] == EID_BSSIntolerantChlReport) && (frame_body[6] > 0)) { + /*todo:*/ + if (pmlmepriv->ht_intolerant_ch_reported == _FALSE) { + pmlmepriv->ht_intolerant_ch_reported = _TRUE; + beacon_updated = _TRUE; + } + } + } + + if (beacon_updated) { + + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + + associated_stainfo_update(padapter, psta, STA_INFO_UPDATE_BW); + } + + + +} + +void rtw_process_ht_action_smps(_adapter *padapter, u8 *ta, u8 ctrl_field) +{ + u8 e_field, m_field; + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + psta = rtw_get_stainfo(pstapriv, ta); + if (psta == NULL) + return; + + e_field = (ctrl_field & BIT(0)) ? 1 : 0; + m_field = (ctrl_field & BIT(1)) ? 1 : 0; + + if (e_field) { + + /* enable */ + /* 0:static SMPS, 1:dynamic SMPS, 3:SMPS disabled, 2:reserved*/ + + if (m_field) /*mode*/ + psta->htpriv.smps_cap = 1; + else + psta->htpriv.smps_cap = 0; + } else { + /*disable*/ + psta->htpriv.smps_cap = 3; + } + + rtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta); + +} + +/* +op_mode +Set to 0 (HT pure) under the followign conditions + - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or + - all STAs in the BSS are 20 MHz HT in 20 MHz BSS +Set to 1 (HT non-member protection) if there may be non-HT STAs + in both the primary and the secondary channel +Set to 2 if only HT STAs are associated in BSS, + however and at least one 20 MHz HT STA is associated +Set to 3 (HT mixed mode) when one or more non-HT STAs are associated + (currently non-GF HT station is considered as non-HT STA also) +*/ +int rtw_ht_operation_update(_adapter *padapter) +{ + u16 cur_op_mode, new_op_mode; + int op_mode_changes = 0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + + if (pmlmepriv->htpriv.ht_option == _FALSE) + return 0; + + /*if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) + return 0;*/ + + RTW_INFO("%s current operation mode=0x%X\n", + __FUNCTION__, pmlmepriv->ht_op_mode); + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) + && pmlmepriv->num_sta_ht_no_gf) { + pmlmepriv->ht_op_mode |= + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && + pmlmepriv->num_sta_ht_no_gf == 0) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht || ATOMIC_READ(&pmlmepriv->olbc_ht))) { + pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht == 0 && !ATOMIC_READ(&pmlmepriv->olbc_ht))) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } + + /* Note: currently we switch to the MIXED op mode if HT non-greenfield + * station is associated. Probably it's a theoretical case, since + * it looks like all known HT STAs support greenfield. + */ + new_op_mode = 0; + if (pmlmepriv->num_sta_no_ht /*|| + (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)*/) + new_op_mode = OP_MODE_MIXED; + else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH) + && pmlmepriv->num_sta_ht_20mhz) + new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; + else if (ATOMIC_READ(&pmlmepriv->olbc_ht)) + new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; + else + new_op_mode = OP_MODE_PURE; + + cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; + if (cur_op_mode != new_op_mode) { + pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; + pmlmepriv->ht_op_mode |= new_op_mode; + op_mode_changes++; + } + + RTW_INFO("%s new operation mode=0x%X changes=%d\n", + __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes); + + return op_mode_changes; + +} + +#endif /* CONFIG_80211N_HT */ + +void associated_clients_update(_adapter *padapter, u8 updated, u32 sta_info_type) +{ + /* update associcated stations cap. */ + if (updated == _TRUE) { + _irqL irqL; + _list *phead, *plist; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + /* check asoc_queue */ + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + associated_stainfo_update(padapter, psta, sta_info_type); + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + } + +} + +/* called > TSR LEVEL for USB or SDIO Interface*/ +void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta) +{ + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && + !psta->no_short_preamble_set) { + psta->no_short_preamble_set = 1; + pmlmepriv->num_sta_no_short_preamble++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + + if (!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) { + if (!psta->no_short_preamble_set) { + psta->no_short_preamble_set = 1; + + pmlmepriv->num_sta_no_short_preamble++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + } + } else { + if (psta->no_short_preamble_set) { + psta->no_short_preamble_set = 0; + + pmlmepriv->num_sta_no_short_preamble--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 0)) { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + } + } + +#if 0 + if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) { + psta->nonerp_set = 1; + pmlmepriv->num_sta_non_erp++; + if (pmlmepriv->num_sta_non_erp == 1) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if (psta->flags & WLAN_STA_NONERP) { + if (!psta->nonerp_set) { + psta->nonerp_set = 1; + + pmlmepriv->num_sta_non_erp++; + + if (pmlmepriv->num_sta_non_erp == 1) { + beacon_updated = _TRUE; + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + } + + } else { + if (psta->nonerp_set) { + psta->nonerp_set = 0; + + pmlmepriv->num_sta_non_erp--; + + if (pmlmepriv->num_sta_non_erp == 0) { + beacon_updated = _TRUE; + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + } + + } + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) && + !psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 1; + pmlmepriv->num_sta_no_short_slot_time++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) { + if (!psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 1; + + pmlmepriv->num_sta_no_short_slot_time++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + } + } else { + if (psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 0; + + pmlmepriv->num_sta_no_short_slot_time--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 0)) { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + } + +#ifdef CONFIG_80211N_HT + + if (psta->flags & WLAN_STA_HT) { + u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); + + RTW_INFO("HT: STA " MAC_FMT " HT Capabilities " + "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab); + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { + if (!psta->no_ht_gf_set) { + psta->no_ht_gf_set = 1; + pmlmepriv->num_sta_ht_no_gf++; + } + RTW_INFO("%s STA " MAC_FMT " - no " + "greenfield, num of non-gf stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_no_gf); + } + + if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) { + if (!psta->ht_20mhz_set) { + psta->ht_20mhz_set = 1; + pmlmepriv->num_sta_ht_20mhz++; + } + RTW_INFO("%s STA " MAC_FMT " - 20 MHz HT, " + "num of 20MHz HT STAs %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_20mhz); + } + + } else { + if (!psta->no_ht_set) { + psta->no_ht_set = 1; + pmlmepriv->num_sta_no_ht++; + } + if (pmlmepriv->htpriv.ht_option == _TRUE) { + RTW_INFO("%s STA " MAC_FMT + " - no HT, num of non-HT stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_no_ht); + } + } + + if (rtw_ht_operation_update(padapter) > 0) { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + /*beacon_updated = _TRUE;*/ + } + +#endif /* CONFIG_80211N_HT */ + + /* update associcated stations cap. */ + associated_clients_update(padapter, beacon_updated, STA_INFO_UPDATE_ALL); + + RTW_INFO("%s, updated=%d\n", __func__, beacon_updated); + +} + +u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta) +{ + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + if (!psta) + return beacon_updated; + + if (psta->no_short_preamble_set) { + psta->no_short_preamble_set = 0; + pmlmepriv->num_sta_no_short_preamble--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_preamble == 0) { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + + if (psta->nonerp_set) { + psta->nonerp_set = 0; + pmlmepriv->num_sta_non_erp--; + if (pmlmepriv->num_sta_non_erp == 0) { + beacon_updated = _TRUE; + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + } + + if (psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 0; + pmlmepriv->num_sta_no_short_slot_time--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_slot_time == 0) { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + +#ifdef CONFIG_80211N_HT + + if (psta->no_ht_gf_set) { + psta->no_ht_gf_set = 0; + pmlmepriv->num_sta_ht_no_gf--; + } + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if (psta->ht_20mhz_set) { + psta->ht_20mhz_set = 0; + pmlmepriv->num_sta_ht_20mhz--; + } + + + + if (rtw_ht_operation_update(padapter) > 0) { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + +#endif /* CONFIG_80211N_HT */ + +#if 0 + /* update associated stations cap. */ + associated_clients_update(padapter, beacon_updated, STA_INFO_UPDATE_ALL); /* move it to avoid deadlock */ +#endif + + RTW_INFO("%s, updated=%d\n", __func__, beacon_updated); + + return beacon_updated; + +} + +u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason, bool enqueue) +{ + _irqL irqL; + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + if (!psta) + return beacon_updated; + + if (active == _TRUE) { +#ifdef CONFIG_80211N_HT + /* tear down Rx AMPDU */ + send_delba(padapter, 0, psta->hwaddr);/* recipient */ + + /* tear down TX AMPDU */ + send_delba(padapter, 1, psta->hwaddr);/* */ /* originator */ + +#endif /* CONFIG_80211N_HT */ + + issue_deauth(padapter, psta->hwaddr, reason); + } + +#ifdef CONFIG_BEAMFORMING + beamforming_wk_cmd(padapter, BEAMFORMING_CTRL_LEAVE, psta->hwaddr, ETH_ALEN, 1); +#endif + + psta->htpriv.agg_enable_bitmap = 0x0;/* reset */ + psta->htpriv.candidate_tid_bitmap = 0x0;/* reset */ + + /* clear cam entry / key */ + rtw_clearstakey_cmd(padapter, psta, enqueue); + + + _enter_critical_bh(&psta->lock, &irqL); + psta->state &= ~_FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + +#ifdef CONFIG_IOCTL_CFG80211 + if (1) { +#ifdef COMPAT_KERNEL_RELEASE + rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) */ + /* will call rtw_cfg80211_indicate_sta_disassoc() in cmd_thread for old API context */ +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) */ + } else +#endif /* CONFIG_IOCTL_CFG80211 */ + { + rtw_indicate_sta_disassoc_event(padapter, psta); + } + + report_del_sta_event(padapter, psta->hwaddr, reason, enqueue, _FALSE); + + beacon_updated = bss_cap_update_on_sta_leave(padapter, psta); + + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + rtw_free_stainfo(padapter, psta); + /* _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + + + return beacon_updated; + +} + +int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset) +{ + _irqL irqL; + _list *phead, *plist; + int ret = 0; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) + return ret; + + RTW_INFO(FUNC_NDEV_FMT" with ch:%u, offset:%u\n", + FUNC_NDEV_ARG(padapter->pnetdev), new_ch, ch_offset); + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + /* for each sta in asoc_queue */ + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + + issue_action_spct_ch_switch(padapter, psta->hwaddr, new_ch, ch_offset); + psta->expire_to = ((pstapriv->expire_to * 2) > 5) ? 5 : (pstapriv->expire_to * 2); + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + issue_action_spct_ch_switch(padapter, bc_addr, new_ch, ch_offset); + + return ret; +} + +int rtw_sta_flush(_adapter *padapter, bool enqueue) +{ + _irqL irqL; + _list *phead, *plist; + int ret = 0; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + u8 flush_num = 0; + char flush_list[NUM_STA]; + int i; + + if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) + return ret; + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); + + /* pick sta from sta asoc_queue */ + _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); + + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + + stainfo_offset = rtw_stainfo_offset(pstapriv, psta); + if (stainfo_offset_valid(stainfo_offset)) + flush_list[flush_num++] = stainfo_offset; + else + rtw_warn_on(1); + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + /* call ap_free_sta() for each sta picked */ + for (i = 0; i < flush_num; i++) { + psta = rtw_get_stainfo_by_offset(pstapriv, flush_list[i]); + ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING, enqueue); + } + + issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); + + associated_clients_update(padapter, _TRUE, STA_INFO_UPDATE_ALL); + + return ret; +} + +/* called > TSR LEVEL for USB or SDIO Interface*/ +void sta_info_update(_adapter *padapter, struct sta_info *psta) +{ + int flags = psta->flags; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + + /* update wmm cap. */ + if (WLAN_STA_WME & flags) + psta->qos_option = 1; + else + psta->qos_option = 0; + + if (pmlmepriv->qospriv.qos_option == 0) + psta->qos_option = 0; + + +#ifdef CONFIG_80211N_HT + /* update 802.11n ht cap. */ + if (WLAN_STA_HT & flags) { + psta->htpriv.ht_option = _TRUE; + psta->qos_option = 1; + + psta->htpriv.smps_cap = (psta->htpriv.ht_cap.cap_info & IEEE80211_HT_CAP_SM_PS) >> 2; + } else + psta->htpriv.ht_option = _FALSE; + + if (pmlmepriv->htpriv.ht_option == _FALSE) + psta->htpriv.ht_option = _FALSE; +#endif + +#ifdef CONFIG_80211AC_VHT + /* update 802.11AC vht cap. */ + if (WLAN_STA_VHT & flags) + psta->vhtpriv.vht_option = _TRUE; + else + psta->vhtpriv.vht_option = _FALSE; + + if (pmlmepriv->vhtpriv.vht_option == _FALSE) + psta->vhtpriv.vht_option = _FALSE; +#endif + + update_sta_info_apmode(padapter, psta); +} + +/* called >= TSR LEVEL for USB or SDIO Interface*/ +void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta) +{ + if (psta->state & _FW_LINKED) + rtw_hal_update_ra_mask(psta, 0); /* DM_RATR_STA_INIT */ +} +/* restore hw setting from sw data structures */ +void rtw_ap_restore_network(_adapter *padapter) +{ + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta; + struct security_priv *psecuritypriv = &(padapter->securitypriv); + _irqL irqL; + _list *phead, *plist; + u8 chk_alive_num = 0; + char chk_alive_list[NUM_STA]; + int i; + + rtw_setopmode_cmd(padapter, Ndis802_11APMode, _FALSE); + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + rtw_startbss_cmd(padapter, RTW_CMDF_DIRECTLY); + + if ((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) { + /* restore group key, WEP keys is restored in ips_leave() */ + rtw_set_key(padapter, psecuritypriv, psecuritypriv->dot118021XGrpKeyid, 0, _FALSE); + } + + _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)) + chk_alive_list[chk_alive_num++] = stainfo_offset; + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + for (i = 0; i < chk_alive_num; i++) { + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); + + if (psta == NULL) + RTW_INFO(FUNC_ADPT_FMT" sta_info is null\n", FUNC_ADPT_ARG(padapter)); + else if (psta->state & _FW_LINKED) { + rtw_sta_media_status_rpt(padapter, psta, 1); + Update_RA_Entry(padapter, psta); + /* pairwise key */ + /* per sta pairwise key and settings */ + if ((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) + rtw_setstakey_cmd(padapter, psta, UNICAST_KEY, _FALSE); + } + } + +} + +void start_ap_mode(_adapter *padapter) +{ + int i; + struct sta_info *psta = NULL; + 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 security_priv *psecuritypriv = &padapter->securitypriv; + + pmlmepriv->update_bcn = _FALSE; + + /*init_mlme_ap_info(padapter);*/ + + pmlmeext->bstart_bss = _FALSE; + + pmlmepriv->num_sta_non_erp = 0; + + pmlmepriv->num_sta_no_short_slot_time = 0; + + pmlmepriv->num_sta_no_short_preamble = 0; + + pmlmepriv->num_sta_ht_no_gf = 0; +#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->num_sta_40mhz_intolerant = 0; + ATOMIC_SET(&pmlmepriv->olbc, _FALSE); + ATOMIC_SET(&pmlmepriv->olbc_ht, _FALSE); + +#ifdef CONFIG_80211N_HT + pmlmepriv->ht_20mhz_width_req = _FALSE; + pmlmepriv->ht_intolerant_ch_reported = _FALSE; + pmlmepriv->ht_op_mode = 0; + pmlmepriv->sw_to_20mhz = 0; +#endif + + _rtw_memset(pmlmepriv->ext_capab_ie_data, 0, sizeof(pmlmepriv->ext_capab_ie_data)); + pmlmepriv->ext_capab_ie_len = 0; + +#ifdef CONFIG_CONCURRENT_MODE + psecuritypriv->dot118021x_bmc_cam_id = INVALID_SEC_MAC_CAM_ID; +#endif + + for (i = 0 ; i < NUM_STA ; i++) + pstapriv->sta_aid[i] = NULL; + +#if CONFIG_RTW_MACADDR_ACL + rtw_macaddr_acl_init(padapter); +#endif + + psta = rtw_get_bcmc_stainfo(padapter); + /*_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);*/ + if (psta) + rtw_free_stainfo(padapter, psta); + /*_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);*/ + + rtw_init_bcmc_stainfo(padapter); + + if (rtw_mi_get_ap_num(padapter)) + RTW_SET_SCAN_BAND_SKIP(padapter, BAND_5G); + +} + +void stop_ap_mode(_adapter *padapter) +{ + _irqL irqL; + struct sta_info *psta = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct dvobj_priv *pdvobj = padapter->dvobj; + + RTW_INFO("%s -"ADPT_FMT"\n", __func__, ADPT_ARG(padapter)); + + pmlmepriv->update_bcn = _FALSE; + /*pmlmeext->bstart_bss = _FALSE;*/ + padapter->netif_up = _FALSE; + /* _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); */ + + /* reset and init security priv , this can refine with rtw_reset_securitypriv */ + _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof(struct security_priv)); + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; + padapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; + +#ifdef CONFIG_DFS_MASTER + rtw_dfs_master_status_apply(padapter, MLME_AP_STOPPED); +#endif + + /* free scan queue */ + rtw_free_network_queue(padapter, _TRUE); + +#if CONFIG_RTW_MACADDR_ACL + rtw_macaddr_acl_deinit(padapter); +#endif + + rtw_sta_flush(padapter, _TRUE); + + /* free_assoc_sta_resources */ + rtw_free_all_stainfo(padapter); + + psta = rtw_get_bcmc_stainfo(padapter); + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + rtw_free_stainfo(padapter, psta); + /*_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);*/ + + rtw_free_mlme_priv_ie_data(pmlmepriv); + +#ifdef CONFIG_SWTIMER_BASED_TXBCN + if (pmlmeext->bstart_bss == _TRUE) { + _enter_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + pdvobj->nr_ap_if--; + if (pdvobj->nr_ap_if > 0) + pdvobj->inter_bcn_space = DEFAULT_BCN_INTERVAL / pdvobj->nr_ap_if; + else + pdvobj->inter_bcn_space = DEFAULT_BCN_INTERVAL; + + rtw_list_delete(&padapter->list); + _exit_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + + rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pdvobj->inter_bcn_space)); + + if (pdvobj->nr_ap_if == 0) + _cancel_timer_ex(&pdvobj->txbcn_timer); + } +#endif + + pmlmeext->bstart_bss = _FALSE; + +#ifdef CONFIG_BT_COEXIST + rtw_btcoex_MediaStatusNotify(padapter, 0); /* disconnect */ +#endif + +} + +#endif /* CONFIG_NATIVEAP_MLME */ + +void rtw_ap_update_bss_chbw(_adapter *adapter, WLAN_BSSID_EX *bss, u8 ch, u8 bw, u8 offset) +{ +#define UPDATE_VHT_CAP 1 +#define UPDATE_HT_CAP 1 + +#ifdef CONFIG_80211AC_VHT + { + struct vht_priv *vhtpriv = &adapter->mlmepriv.vhtpriv; + u8 *vht_cap_ie, *vht_op_ie; + int vht_cap_ielen, vht_op_ielen; + u8 center_freq; + + vht_cap_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_VHTCapability, &vht_cap_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + vht_op_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_VHTOperation, &vht_op_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + center_freq = rtw_get_center_ch(ch, bw, offset); + + /* update vht cap ie */ + if (vht_cap_ie && vht_cap_ielen) { + #if UPDATE_VHT_CAP + /* if ((bw == CHANNEL_WIDTH_160 || bw == CHANNEL_WIDTH_80_80) && pvhtpriv->sgi_160m) + SET_VHT_CAPABILITY_ELE_SHORT_GI160M(pvht_cap_ie + 2, 1); + else */ + SET_VHT_CAPABILITY_ELE_SHORT_GI160M(vht_cap_ie + 2, 0); + + if (bw >= CHANNEL_WIDTH_80 && vhtpriv->sgi_80m) + SET_VHT_CAPABILITY_ELE_SHORT_GI80M(vht_cap_ie + 2, 1); + else + SET_VHT_CAPABILITY_ELE_SHORT_GI80M(vht_cap_ie + 2, 0); + #endif + } + + /* update vht op ie */ + if (vht_op_ie && vht_op_ielen) { + if (bw < CHANNEL_WIDTH_80) { + SET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2, 0); + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op_ie + 2, 0); + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op_ie + 2, 0); + } else if (bw == CHANNEL_WIDTH_80) { + SET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2, 1); + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op_ie + 2, center_freq); + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op_ie + 2, 0); + } else { + RTW_ERR(FUNC_ADPT_FMT" unsupported BW:%u\n", FUNC_ADPT_ARG(adapter), bw); + rtw_warn_on(1); + } + } + } +#endif /* CONFIG_80211AC_VHT */ +#ifdef CONFIG_80211N_HT + { + struct ht_priv *htpriv = &adapter->mlmepriv.htpriv; + u8 *ht_cap_ie, *ht_op_ie; + int ht_cap_ielen, ht_op_ielen; + + ht_cap_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_HTCapability, &ht_cap_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + ht_op_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_HTInfo, &ht_op_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + + /* update ht cap ie */ + if (ht_cap_ie && ht_cap_ielen) { + #if UPDATE_HT_CAP + if (bw >= CHANNEL_WIDTH_40) + SET_HT_CAP_ELE_CHL_WIDTH(ht_cap_ie + 2, 1); + else + SET_HT_CAP_ELE_CHL_WIDTH(ht_cap_ie + 2, 0); + + if (bw >= CHANNEL_WIDTH_40 && htpriv->sgi_40m) + SET_HT_CAP_ELE_SHORT_GI40M(ht_cap_ie + 2, 1); + else + SET_HT_CAP_ELE_SHORT_GI40M(ht_cap_ie + 2, 0); + + if (htpriv->sgi_20m) + SET_HT_CAP_ELE_SHORT_GI20M(ht_cap_ie + 2, 1); + else + SET_HT_CAP_ELE_SHORT_GI20M(ht_cap_ie + 2, 0); + #endif + } + + /* update ht op ie */ + if (ht_op_ie && ht_op_ielen) { + SET_HT_OP_ELE_PRI_CHL(ht_op_ie + 2, ch); + switch (offset) { + case HAL_PRIME_CHNL_OFFSET_LOWER: + SET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2, SCA); + break; + case HAL_PRIME_CHNL_OFFSET_UPPER: + SET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2, SCB); + break; + case HAL_PRIME_CHNL_OFFSET_DONT_CARE: + default: + SET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2, SCN); + break; + } + + if (bw >= CHANNEL_WIDTH_40) + SET_HT_OP_ELE_STA_CHL_WIDTH(ht_op_ie + 2, 1); + else + SET_HT_OP_ELE_STA_CHL_WIDTH(ht_op_ie + 2, 0); + } + } +#endif /* CONFIG_80211N_HT */ + + { + u8 *p; + int ie_len; + u8 old_ch = bss->Configuration.DSConfig; + bool change_band = _FALSE; + + if ((ch <= 14 && old_ch >= 36) || (ch >= 36 && old_ch <= 14)) + change_band = _TRUE; + + /* update channel in IE */ + p = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if (p && ie_len > 0) + *(p + 2) = ch; + + bss->Configuration.DSConfig = ch; + + /* band is changed, update ERP, support rate, ext support rate IE */ + if (change_band == _TRUE) + change_band_update_ie(adapter, bss, ch); + } + +} + +bool rtw_ap_chbw_decision(_adapter *adapter, s16 req_ch, s8 req_bw, s8 req_offset + , u8 *ch, u8 *bw, u8 *offset, u8 *chbw_allow) +{ + u8 cur_ie_ch, cur_ie_bw, cur_ie_offset; + u8 dec_ch, dec_bw, dec_offset; + u8 u_ch = 0, u_offset, u_bw; + bool changed = _FALSE; + struct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv); + WLAN_BSSID_EX *network = &(adapter->mlmepriv.cur_network.network); + u8 sta_num; + u8 ld_sta_num; + u8 lg_sta_num; + u8 ap_num; + u8 ld_ap_num; + bool set_u_ch = _FALSE, set_dec_ch = _FALSE; + + rtw_ies_get_chbw(network->IEs + sizeof(NDIS_802_11_FIXED_IEs) + , network->IELength - sizeof(NDIS_802_11_FIXED_IEs) + , &cur_ie_ch, &cur_ie_bw, &cur_ie_offset); + + /* use chbw of cur_ie updated with specifying req as temporary decision */ + dec_ch = (req_ch <= 0) ? cur_ie_ch : req_ch; + dec_bw = (req_bw < 0) ? cur_ie_bw : req_bw; + dec_offset = (req_offset < 0) ? cur_ie_offset : req_offset; + + rtw_mi_status_no_self(adapter, &sta_num, &ld_sta_num, &lg_sta_num, &ap_num, &ld_ap_num, NULL); + RTW_INFO(FUNC_ADPT_FMT" ld_sta_num:%u, lg_sta_num%u, ap_num:%u\n" + , FUNC_ADPT_ARG(adapter), ld_sta_num, lg_sta_num, ap_num); + + if (ld_sta_num || ap_num) { + /* has linked STA or AP mode, follow */ + + rtw_warn_on(!rtw_mi_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset)); + + RTW_INFO(FUNC_ADPT_FMT" union no self: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); + RTW_INFO(FUNC_ADPT_FMT" req: %d,%d,%d\n", FUNC_ADPT_ARG(adapter), req_ch, req_bw, req_offset); + + rtw_adjust_chbw(adapter, u_ch, &dec_bw, &dec_offset); +#ifdef CONFIG_MCC_MODE + if (MCC_EN(adapter)) { + if (!rtw_is_chbw_grouped(u_ch, u_bw, u_offset, dec_ch, dec_bw, dec_offset)) { + mlmeext->cur_channel = *ch = dec_ch; + mlmeext->cur_bwmode = *bw = dec_bw; + mlmeext->cur_ch_offset = *offset = dec_offset; + /* channel bw offset can not be allowed, need MCC */ + *chbw_allow = _FALSE; + RTW_INFO(FUNC_ADPT_FMT" enable mcc: %u,%u,%u\n", FUNC_ADPT_ARG(adapter) + , *ch, *bw, *offset); + goto exit; + } else + /* channel bw offset can be allowed, not need MCC */ + *chbw_allow = _TRUE; + } +#endif /* CONFIG_MCC_MODE */ + rtw_sync_chbw(&dec_ch, &dec_bw, &dec_offset + , &u_ch, &u_bw, &u_offset); + + rtw_ap_update_bss_chbw(adapter, &(adapter->mlmepriv.cur_network.network) + , dec_ch, dec_bw, dec_offset); + + set_u_ch = _TRUE; + } else if (lg_sta_num) { + /* has linking STA */ + + rtw_warn_on(!rtw_mi_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset)); + + RTW_INFO(FUNC_ADPT_FMT" union no self: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); + RTW_INFO(FUNC_ADPT_FMT" req: %d,%d,%d\n", FUNC_ADPT_ARG(adapter), req_ch, req_bw, req_offset); + + rtw_adjust_chbw(adapter, dec_ch, &dec_bw, &dec_offset); + + if (rtw_is_chbw_grouped(u_ch, u_bw, u_offset, dec_ch, dec_bw, dec_offset)) { + + rtw_sync_chbw(&dec_ch, &dec_bw, &dec_offset + , &u_ch, &u_bw, &u_offset); + + rtw_ap_update_bss_chbw(adapter, &(adapter->mlmepriv.cur_network.network) + , dec_ch, dec_bw, dec_offset); + + set_u_ch = _TRUE; + + /* channel bw offset can be allowed, not need MCC */ + *chbw_allow = _TRUE; + } else { +#ifdef CONFIG_MCC_MODE + if (MCC_EN(adapter)) { + mlmeext->cur_channel = *ch = dec_ch; + mlmeext->cur_bwmode = *bw = dec_bw; + mlmeext->cur_ch_offset = *offset = dec_offset; + + /* channel bw offset can not be allowed, need MCC */ + *chbw_allow = _FALSE; + RTW_INFO(FUNC_ADPT_FMT" enable mcc: %u,%u,%u\n", FUNC_ADPT_ARG(adapter) + , *ch, *bw, *offset); + goto exit; + } +#endif /* CONFIG_MCC_MODE */ + /* set this for possible ch change when join down*/ + set_fwstate(&adapter->mlmepriv, WIFI_OP_CH_SWITCHING); + } + } else { + /* single AP mode */ + + RTW_INFO(FUNC_ADPT_FMT" req: %d,%d,%d\n", FUNC_ADPT_ARG(adapter), req_ch, req_bw, req_offset); + + /* check temporary decision first */ + rtw_adjust_chbw(adapter, dec_ch, &dec_bw, &dec_offset); + if (!rtw_get_offset_by_chbw(dec_ch, dec_bw, &dec_offset)) { +#if defined(CONFIG_DFS_MASTER) + if (req_ch == -1 || req_bw == -1) + goto choose_chbw; +#endif + RTW_WARN(FUNC_ADPT_FMT" req: %u,%u has no valid offset\n", FUNC_ADPT_ARG(adapter), dec_ch, dec_bw); + *chbw_allow = _FALSE; + goto exit; + } + + if (!rtw_chset_is_chbw_valid(mlmeext->channel_set, dec_ch, dec_bw, dec_offset)) { +#if defined(CONFIG_DFS_MASTER) + if (req_ch == -1 || req_bw == -1) + goto choose_chbw; +#endif + RTW_WARN(FUNC_ADPT_FMT" req: %u,%u,%u doesn't fit in chplan\n", FUNC_ADPT_ARG(adapter), dec_ch, dec_bw, dec_offset); + *chbw_allow = _FALSE; + goto exit; + } + + if (rtw_chset_is_ch_non_ocp(mlmeext->channel_set, dec_ch, dec_bw, dec_offset) == _FALSE) + goto update_bss_chbw; + +choose_chbw: + if (req_bw < 0) + req_bw = cur_ie_bw; + +#if defined(CONFIG_DFS_MASTER) + /* choose 5G DFS channel for debug */ + if (adapter_to_rfctl(adapter)->dbg_dfs_master_choose_dfs_ch_first + && rtw_choose_shortest_waiting_ch(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_2G | RTW_CHF_NON_DFS) == _TRUE) + RTW_INFO(FUNC_ADPT_FMT" choose 5G DFS channel for debug\n", FUNC_ADPT_ARG(adapter)); + else if (adapter_to_rfctl(adapter)->dfs_ch_sel_d_flags + && rtw_choose_shortest_waiting_ch(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, adapter_to_rfctl(adapter)->dfs_ch_sel_d_flags) == _TRUE) + RTW_INFO(FUNC_ADPT_FMT" choose with dfs_ch_sel_d_flags:0x%02x for debug\n", FUNC_ADPT_ARG(adapter), adapter_to_rfctl(adapter)->dfs_ch_sel_d_flags); + else if (rtw_choose_shortest_waiting_ch(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, 0) == _FALSE) { + RTW_WARN(FUNC_ADPT_FMT" no available channel\n", FUNC_ADPT_ARG(adapter)); + *chbw_allow = _FALSE; + goto exit; + } +#endif /* defined(CONFIG_DFS_MASTER) */ + +update_bss_chbw: + rtw_ap_update_bss_chbw(adapter, &(adapter->mlmepriv.cur_network.network) + , dec_ch, dec_bw, dec_offset); + + /* channel bw offset can be allowed for single AP, not need MCC */ + *chbw_allow = _TRUE; + set_dec_ch = _TRUE; + } + + if (rtw_mi_check_fwstate(adapter, _FW_UNDER_SURVEY)) { + /* scanning, leave ch setting to scan state machine */ + set_u_ch = set_dec_ch = _FALSE; + } + + if (mlmeext->cur_channel != dec_ch + || mlmeext->cur_bwmode != dec_bw + || mlmeext->cur_ch_offset != dec_offset) + changed = _TRUE; + + if (changed == _TRUE && rtw_linked_check(adapter) == _TRUE) { +#ifdef CONFIG_SPCT_CH_SWITCH + if (1) + rtw_ap_inform_ch_switch(adapter, dec_ch, dec_offset); + else +#endif + rtw_sta_flush(adapter, _FALSE); + } + + mlmeext->cur_channel = dec_ch; + mlmeext->cur_bwmode = dec_bw; + mlmeext->cur_ch_offset = dec_offset; + + if (u_ch != 0) + RTW_INFO(FUNC_ADPT_FMT" union: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); + + RTW_INFO(FUNC_ADPT_FMT" dec: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), dec_ch, dec_bw, dec_offset); + + if (set_u_ch == _TRUE) { + *ch = u_ch; + *bw = u_bw; + *offset = u_offset; + } else if (set_dec_ch == _TRUE) { + *ch = dec_ch; + *bw = dec_bw; + *offset = dec_offset; + } +exit: + return changed; +} + +/*#define DBG_SWTIMER_BASED_TXBCN*/ + +#ifdef CONFIG_SWTIMER_BASED_TXBCN +void tx_beacon_handlder(struct dvobj_priv *pdvobj) +{ +#define BEACON_EARLY_TIME 20 /* unit:TU*/ + _irqL irqL; + _list *plist, *phead; + u32 timestamp[2]; + u32 bcn_interval_us; /* unit : usec */ + u64 time; + u32 cur_tick, time_offset; /* unit : usec */ + u32 inter_bcn_space_us; /* unit : usec */ + int nr_vap, idx, bcn_idx; + int i; + u8 val8, late = 0; + _adapter *padapter = NULL; + + i = 0; + + /* get first ap mode interface */ + _enter_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + if (rtw_is_list_empty(&pdvobj->ap_if_q.queue) || (pdvobj->nr_ap_if == 0)) { + RTW_INFO("[%s] ERROR: ap_if_q is empty!or nr_ap = %d\n", __func__, pdvobj->nr_ap_if); + _exit_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + return; + } else + padapter = LIST_CONTAINOR(get_next(&(pdvobj->ap_if_q.queue)), struct _ADAPTER, list); + _exit_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + + if (NULL == padapter) { + RTW_INFO("[%s] ERROR: no any ap interface!\n", __func__); + return; + } + + + bcn_interval_us = DEFAULT_BCN_INTERVAL * NET80211_TU_TO_US; + if (0 == bcn_interval_us) { + RTW_INFO("[%s] ERROR: beacon interval = 0\n", __func__); + return; + } + + /* read TSF */ + timestamp[1] = rtw_read32(padapter, 0x560 + 4); + timestamp[0] = rtw_read32(padapter, 0x560); + while (timestamp[1]) { + time = (0xFFFFFFFF % bcn_interval_us + 1) * timestamp[1] + timestamp[0]; + timestamp[0] = (u32)time; + timestamp[1] = (u32)(time >> 32); + } + cur_tick = timestamp[0] % bcn_interval_us; + + + _enter_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + + nr_vap = (pdvobj->nr_ap_if - 1); + if (nr_vap > 0) { + inter_bcn_space_us = pdvobj->inter_bcn_space * NET80211_TU_TO_US; /* beacon_interval / (nr_vap+1); */ + idx = cur_tick / inter_bcn_space_us; + if (idx < nr_vap) /* if (idx < (nr_vap+1))*/ + bcn_idx = idx + 1; /* bcn_idx = (idx + 1) % (nr_vap+1);*/ + else + bcn_idx = 0; + + /* to get padapter based on bcn_idx */ + padapter = NULL; + phead = get_list_head(&pdvobj->ap_if_q); + plist = get_next(phead); + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + padapter = LIST_CONTAINOR(plist, struct _ADAPTER, list); + + plist = get_next(plist); + + if (i == bcn_idx) + break; + + i++; + } + if ((NULL == padapter) || (i > pdvobj->nr_ap_if)) { + RTW_INFO("[%s] ERROR: nr_ap_if = %d, padapter=%p, bcn_idx=%d, index=%d\n", + __func__, pdvobj->nr_ap_if, padapter, bcn_idx, i); + _exit_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + return; + } +#ifdef DBG_SWTIMER_BASED_TXBCN + RTW_INFO("BCN_IDX=%d, cur_tick=%d, padapter=%p\n", bcn_idx, cur_tick, padapter); +#endif + if (((idx + 2 == nr_vap + 1) && (idx < nr_vap + 1)) || (0 == bcn_idx)) { + time_offset = bcn_interval_us - cur_tick - BEACON_EARLY_TIME * NET80211_TU_TO_US; + if ((s32)time_offset < 0) + time_offset += inter_bcn_space_us; + + } else { + time_offset = (idx + 2) * inter_bcn_space_us - cur_tick - BEACON_EARLY_TIME * NET80211_TU_TO_US; + if (time_offset > (inter_bcn_space_us + (inter_bcn_space_us >> 1))) { + time_offset -= inter_bcn_space_us; + late = 1; + } + } + } else + /*#endif*/ { /* MBSSID */ + time_offset = 2 * bcn_interval_us - cur_tick - BEACON_EARLY_TIME * NET80211_TU_TO_US; + if (time_offset > (bcn_interval_us + (bcn_interval_us >> 1))) { + time_offset -= bcn_interval_us; + late = 1; + } + } + _exit_critical_bh(&pdvobj->ap_if_q.lock, &irqL); + +#ifdef DBG_SWTIMER_BASED_TXBCN + RTW_INFO("set sw bcn timer %d us\n", time_offset); +#endif + _set_timer(&pdvobj->txbcn_timer, time_offset / NET80211_TU_TO_US); + + if (padapter) { +#ifdef DBG_SWTIMER_BASED_TXBCN + RTW_INFO("padapter=%p, PORT=%d\n", padapter, padapter->hw_port); +#endif + /*update_beacon(padapter, _TIM_IE_, NULL, _FALSE);*/ + issue_beacon(padapter, 0); + } + +#if 0 + /* handle any buffered BC/MC frames*/ + /* Don't dynamically change DIS_ATIM due to HW will auto send ACQ after HIQ empty.*/ + val8 = *((unsigned char *)priv->beaconbuf + priv->timoffset + 4); + if (val8 & 0x01) { + process_mcast_dzqueue(priv); + priv->pkt_in_dtimQ = 0; + } +#endif + +} + +void tx_beacon_timer_handlder(struct dvobj_priv *pdvobj) +{ + _adapter *padapter = pdvobj->padapters[0]; + + if (padapter) + set_tx_beacon_cmd(padapter); +} +#endif + +#endif /* CONFIG_AP_MODE */ diff --git a/core/rtw_beamforming.c b/core/rtw_beamforming.c old mode 100755 new mode 100644 index 0b52972..ca04a99 --- a/core/rtw_beamforming.c +++ b/core/rtw_beamforming.c @@ -1,1244 +1,1942 @@ -/****************************************************************************** - * - * 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 - * - * - ******************************************************************************/ -#define _RTW_BEAMFORMING_C_ - -#include -#include - -#ifdef CONFIG_BEAMFORMING - -#if (BEAMFORMING_SUPPORT == 0) /*for diver defined beamforming*/ -struct beamforming_entry *beamforming_get_entry_by_addr(struct mlme_priv *pmlmepriv, u8* ra,u8* idx) -{ - u8 i = 0; - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - - for(i = 0; i < BEAMFORMING_ENTRY_NUM; i++) - { - if( pBeamInfo->beamforming_entry[i].bUsed && - (_rtw_memcmp(ra,pBeamInfo->beamforming_entry[i].mac_addr, ETH_ALEN))) - { - *idx = i; - return &(pBeamInfo->beamforming_entry[i]); - } - } - - return NULL; -} - -BEAMFORMING_CAP beamforming_get_entry_beam_cap_by_mac_id(PVOID pmlmepriv ,u8 mac_id) -{ - u8 i = 0; - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO((struct mlme_priv *)pmlmepriv); - BEAMFORMING_CAP BeamformEntryCap = BEAMFORMING_CAP_NONE; - - for(i = 0; i < BEAMFORMING_ENTRY_NUM; i++) - { - if( pBeamInfo->beamforming_entry[i].bUsed && - (mac_id == pBeamInfo->beamforming_entry[i].mac_id)) - { - BeamformEntryCap = pBeamInfo->beamforming_entry[i].beamforming_entry_cap; - i = BEAMFORMING_ENTRY_NUM; - } - } - - return BeamformEntryCap; -} - -struct beamforming_entry *beamforming_get_free_entry(struct mlme_priv *pmlmepriv, u8* idx) -{ - u8 i = 0; - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - - for(i = 0; i < BEAMFORMING_ENTRY_NUM; i++) - { - if(pBeamInfo->beamforming_entry[i].bUsed == _FALSE) - { - *idx = i; - return &(pBeamInfo->beamforming_entry[i]); - } - } - return NULL; -} - - -struct beamforming_entry *beamforming_add_entry(PADAPTER adapter, u8* ra, u16 aid, - u16 mac_id, CHANNEL_WIDTH bw, BEAMFORMING_CAP beamfrom_cap, u8* idx) -{ - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct beamforming_entry *pEntry = beamforming_get_free_entry(pmlmepriv, idx); - - if(pEntry != NULL) - { - pEntry->bUsed = _TRUE; - pEntry->aid = aid; - pEntry->mac_id = mac_id; - pEntry->sound_bw = bw; - if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) - { - 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 - pEntry->g_id = 63; - } - else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) - { - pEntry->p_aid = 0; - pEntry->g_id = 63; - } - else - { - pEntry->p_aid = ra[5]; // BSSID[39:47] - pEntry->p_aid = (pEntry->p_aid << 1) | (ra[4] >> 7 ); - pEntry->g_id = 0; - } - _rtw_memcpy(pEntry->mac_addr, ra, ETH_ALEN); - pEntry->bSound = _FALSE; - - //3 TODO SW/FW sound period - pEntry->sound_period = 200; - pEntry->beamforming_entry_cap = beamfrom_cap; - pEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; - - - pEntry->PreLogSeq = 0; /*Modified by Jeffery @2015-04-13*/ - pEntry->LogSeq = 0; /*Modified by Jeffery @2014-10-29*/ - pEntry->LogRetryCnt = 0; /*Modified by Jeffery @2014-10-29*/ - pEntry->LogSuccess = 0; /*LogSuccess is NOT needed to be accumulated, so LogSuccessCnt->LogSuccess, 2015-04-13, Jeffery*/ - pEntry->ClockResetTimes = 0; /*Modified by Jeffery @2015-04-13*/ - pEntry->LogStatusFailCnt = 0; - - return pEntry; - } - else - return NULL; -} - -BOOLEAN beamforming_remove_entry(struct mlme_priv *pmlmepriv, u8* ra, u8* idx) -{ - struct beamforming_entry *pEntry = beamforming_get_entry_by_addr(pmlmepriv, ra, idx); - - if(pEntry != NULL) - { - pEntry->bUsed = _FALSE; - pEntry->beamforming_entry_cap = BEAMFORMING_CAP_NONE; - pEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; - return _TRUE; - } - else - return _FALSE; -} - -/* Used for BeamformingStart_V1 */ -void beamforming_dym_ndpa_rate(PADAPTER adapter) -{ - u16 NDPARate = MGN_6M; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter); - - if(pHalData->MinUndecoratedPWDBForDM > 30) // link RSSI > 30% - NDPARate = MGN_24M; - else - NDPARate = MGN_6M; - - //BW = CHANNEL_WIDTH_20; - NDPARate = NDPARate << 8; - rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_RATE, (u8 *)&NDPARate); -} - -void beamforming_dym_period(PADAPTER Adapter) -{ - u8 Idx; - BOOLEAN bChangePeriod = _FALSE; - u16 SoundPeriod_SW, SoundPeriod_FW; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter); - struct beamforming_entry *pBeamformEntry; - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(( &Adapter->mlmepriv)); - struct sounding_info *pSoundInfo = &(pBeamInfo->sounding_info); - - //3 TODO per-client throughput caculation. - - if(pdvobjpriv->traffic_stat.cur_tx_tp + pdvobjpriv->traffic_stat.cur_rx_tp > 2) - { - SoundPeriod_SW = 32*20; - SoundPeriod_FW = 2; - } - else - { - SoundPeriod_SW = 32*2000; - SoundPeriod_FW = 200; - } - - for(Idx = 0; Idx < BEAMFORMING_ENTRY_NUM; Idx++) - { - pBeamformEntry = pBeamInfo->beamforming_entry+Idx; - if(pBeamformEntry->bDefaultCSI) - { - SoundPeriod_SW = 32*2000; - SoundPeriod_FW = 200; - } - - if(pBeamformEntry->beamforming_entry_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU)) - { - if(pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER) - { - if(pBeamformEntry->sound_period != SoundPeriod_FW) - { - pBeamformEntry->sound_period = SoundPeriod_FW; - bChangePeriod = _TRUE; // Only FW sounding need to send H2C packet to change sound period. - } - } - else if(pBeamformEntry->sound_period != SoundPeriod_SW) - { - pBeamformEntry->sound_period = SoundPeriod_SW; - } - } - } - - if(bChangePeriod) - rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&Idx); -} - -BOOLEAN issue_ht_sw_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct rtw_ieee80211_hdr *pwlanhdr; - struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 ActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c}; - u8 *pframe; - u16 *fctrl; - u16 duration = 0; - u8 aSifsTime = 0; - u8 NDPTxRate = 0; - - DBG_871X("%s: issue_ht_sw_ndpa_packet!\n", __func__); - - NDPTxRate = MGN_MCS8; - DBG_871X("%s: NDPTxRate =%d\n", __func__, NDPTxRate); - pmgntframe = alloc_mgtxmitframe(pxmitpriv); - - if (pmgntframe == NULL) - return _FALSE; - - /*update attribute*/ - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(Adapter, pattrib); - pattrib->qsel = QSLT_MGNT; - pattrib->rate = NDPTxRate; - pattrib->bwmode = bw; - pattrib->order = 1; - pattrib->subtype = WIFI_ACTION_NOACK; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &pwlanhdr->frame_ctl; - *(fctrl) = 0; - - SetOrderBit(pframe); - SetFrameSubType(pframe, WIFI_ACTION_NOACK); - - _rtw_memcpy(pwlanhdr->addr1, ra, 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) - aSifsTime = 10; - else - aSifsTime = 16; - - duration = 2*aSifsTime + 40; - - if (bw == CHANNEL_WIDTH_40) - duration += 87; - else - duration += 180; - - SetDuration(pframe, duration); - - /*HT control field*/ - SET_HT_CTRL_CSI_STEERING(pframe+24, 3); - SET_HT_CTRL_NDP_ANNOUNCEMENT(pframe+24, 1); - - _rtw_memcpy(pframe+28, ActionHdr, 4); - - pattrib->pktlen = 32; - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(Adapter, pmgntframe); - - return _TRUE; - - -} -BOOLEAN issue_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct rtw_ieee80211_hdr *pwlanhdr; - struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 ActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c}; - u8 *pframe; - u16 *fctrl; - u16 duration = 0; - u8 aSifsTime = 0; - - pmgntframe = alloc_mgtxmitframe(pxmitpriv); - - if (pmgntframe == NULL) - return _FALSE; - - /*update attribute*/ - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(Adapter, pattrib); - - if (qidx == BCN_QUEUE_INX) - pattrib->qsel = QSLT_BEACON; - pattrib->rate = MGN_MCS8; - pattrib->bwmode = bw; - pattrib->order = 1; - pattrib->subtype = WIFI_ACTION_NOACK; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - pwlanhdr = (struct rtw_ieee80211_hdr*)pframe; - - fctrl = &pwlanhdr->frame_ctl; - *(fctrl) = 0; - - SetOrderBit(pframe); - SetFrameSubType(pframe, WIFI_ACTION_NOACK); - - _rtw_memcpy(pwlanhdr->addr1, ra, 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) - aSifsTime = 10; - else - aSifsTime = 16; - - duration = 2*aSifsTime + 40; - - if(bw == CHANNEL_WIDTH_40) - duration+= 87; - else - duration+= 180; - - SetDuration(pframe, duration); - - //HT control field - SET_HT_CTRL_CSI_STEERING(pframe+24, 3); - SET_HT_CTRL_NDP_ANNOUNCEMENT(pframe+24, 1); - - _rtw_memcpy(pframe+28, ActionHdr, 4); - - pattrib->pktlen = 32; - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(Adapter, pmgntframe); - - return _TRUE; -} - -BOOLEAN beamforming_send_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx) -{ - return issue_ht_ndpa_packet(Adapter, ra, bw, qidx); -} -BOOLEAN issue_vht_sw_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct rtw_ieee80211_hdr *pwlanhdr; - struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - struct rtw_ndpa_sta_info sta_info; - u8 NDPTxRate = 0; - - u8 *pframe; - u16 *fctrl; - u16 duration = 0; - u8 sequence = 0, aSifsTime = 0; - - DBG_871X("%s: issue_vht_sw_ndpa_packet!\n", __func__); - - - NDPTxRate = MGN_VHT2SS_MCS0; - DBG_871X("%s: NDPTxRate =%d\n", __func__, NDPTxRate); - pmgntframe = alloc_mgtxmitframe(pxmitpriv); - - if (pmgntframe == NULL) { - DBG_871X("%s, alloc mgnt frame fail\n", __func__); - return _FALSE; - } - - /*update attribute*/ - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(Adapter, pattrib); - pattrib->qsel = QSLT_MGNT; - pattrib->rate = NDPTxRate; - pattrib->bwmode = bw; - pattrib->subtype = WIFI_NDPA; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &pwlanhdr->frame_ctl; - *(fctrl) = 0; - - SetFrameSubType(pframe, WIFI_NDPA); - - _rtw_memcpy(pwlanhdr->addr1, ra, 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; - else - aSifsTime = 10; - - duration = 2*aSifsTime + 44; - - if (bw == CHANNEL_WIDTH_80) - duration += 40; - else if (bw == CHANNEL_WIDTH_40) - duration += 87; - else - duration += 180; - - SetDuration(pframe, duration); - - sequence = pBeamInfo->sounding_sequence << 2; - if (pBeamInfo->sounding_sequence >= 0x3f) - pBeamInfo->sounding_sequence = 0; - else - pBeamInfo->sounding_sequence++; - - _rtw_memcpy(pframe+16, &sequence, 1); - if (((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - aid = 0; - - sta_info.aid = aid; - sta_info.feedback_type = 0; - sta_info.nc_index = 0; - - _rtw_memcpy(pframe+17, (u8 *)&sta_info, 2); - - pattrib->pktlen = 19; - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(Adapter, pmgntframe); - - - return _TRUE; - -} -BOOLEAN issue_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct rtw_ieee80211_hdr *pwlanhdr; - struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - struct rtw_ndpa_sta_info sta_info; - u8 *pframe; - u16 *fctrl; - u16 duration = 0; - u8 sequence = 0, aSifsTime = 0; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - return _FALSE; - - /*update attribute*/ - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(Adapter, pattrib); - - if (qidx == BCN_QUEUE_INX) - pattrib->qsel = QSLT_BEACON; - pattrib->rate = MGN_VHT2SS_MCS0; - pattrib->bwmode = bw; - pattrib->subtype = WIFI_NDPA; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - pwlanhdr = (struct rtw_ieee80211_hdr*)pframe; - - fctrl = &pwlanhdr->frame_ctl; - *(fctrl) = 0; - - SetFrameSubType(pframe, WIFI_NDPA); - - _rtw_memcpy(pwlanhdr->addr1, ra, 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; - else - aSifsTime = 10; - - duration = 2*aSifsTime + 44; - - if(bw == CHANNEL_WIDTH_80) - duration += 40; - else if(bw == CHANNEL_WIDTH_40) - duration+= 87; - else - duration+= 180; - - SetDuration(pframe, duration); - - sequence = pBeamInfo->sounding_sequence<< 2; - if (pBeamInfo->sounding_sequence >= 0x3f) - pBeamInfo->sounding_sequence = 0; - else - pBeamInfo->sounding_sequence++; - - _rtw_memcpy(pframe+16, &sequence,1); - - if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - aid = 0; - - sta_info.aid = aid; - sta_info.feedback_type = 0; - sta_info.nc_index= 0; - - _rtw_memcpy(pframe+17, (u8 *)&sta_info, 2); - - pattrib->pktlen = 19; - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(Adapter, pmgntframe); - - return _TRUE; -} - -BOOLEAN beamforming_send_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx) -{ - return issue_vht_ndpa_packet(Adapter, ra, aid, bw, qidx); -} - -BOOLEAN beamfomring_bSounding(struct beamforming_info *pBeamInfo) -{ - BOOLEAN bSounding = _FALSE; - - if(( beamforming_get_beamform_cap(pBeamInfo) & BEAMFORMER_CAP) == 0) - bSounding = _FALSE; - else - bSounding = _TRUE; - - return bSounding; -} - -u8 beamforming_sounding_idx(struct beamforming_info *pBeamInfo) -{ - u8 idx = 0; - u8 i; - - for(i = 0; i < BEAMFORMING_ENTRY_NUM; i++) - { - if (pBeamInfo->beamforming_entry[i].bUsed && - (_FALSE == pBeamInfo->beamforming_entry[i].bSound)) - { - idx = i; - break; - } - } - - return idx; -} - -SOUNDING_MODE beamforming_sounding_mode(struct beamforming_info *pBeamInfo, u8 idx) -{ - struct beamforming_entry BeamEntry = pBeamInfo->beamforming_entry[idx]; - SOUNDING_MODE mode; - - if(BeamEntry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) - { - mode = SOUNDING_FW_VHT_TIMER; - } - else if(BeamEntry.beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT) - { - mode = SOUNDING_FW_HT_TIMER; - } - else - { - mode = SOUNDING_STOP_All_TIMER; - } - - return mode; -} - -u16 beamforming_sounding_time(struct beamforming_info *pBeamInfo, SOUNDING_MODE mode, u8 idx) -{ - u16 sounding_time = 0xffff; - struct beamforming_entry BeamEntry = pBeamInfo->beamforming_entry[idx]; - - sounding_time = BeamEntry.sound_period; - - return sounding_time; -} - -CHANNEL_WIDTH beamforming_sounding_bw(struct beamforming_info *pBeamInfo, SOUNDING_MODE mode, u8 idx) -{ - CHANNEL_WIDTH sounding_bw = CHANNEL_WIDTH_20; - struct beamforming_entry BeamEntry = pBeamInfo->beamforming_entry[idx]; - - sounding_bw = BeamEntry.sound_bw; - - return sounding_bw; -} - -BOOLEAN beamforming_select_beam_entry(struct beamforming_info *pBeamInfo) -{ - struct sounding_info *pSoundInfo = &(pBeamInfo->sounding_info); - - pSoundInfo->sound_idx = beamforming_sounding_idx(pBeamInfo); - - if(pSoundInfo->sound_idx < BEAMFORMING_ENTRY_NUM) - pSoundInfo->sound_mode = beamforming_sounding_mode(pBeamInfo, pSoundInfo->sound_idx); - else - pSoundInfo->sound_mode = SOUNDING_STOP_All_TIMER; - - if(SOUNDING_STOP_All_TIMER == pSoundInfo->sound_mode) - { - return _FALSE; - } - else - { - pSoundInfo->sound_bw = beamforming_sounding_bw(pBeamInfo, pSoundInfo->sound_mode, pSoundInfo->sound_idx ); - pSoundInfo->sound_period = beamforming_sounding_time(pBeamInfo, pSoundInfo->sound_mode, pSoundInfo->sound_idx ); - return _TRUE; - } -} - -BOOLEAN beamforming_start_fw(PADAPTER adapter, u8 idx) -{ - u8 *RA = NULL; - struct beamforming_entry *pEntry; - BOOLEAN ret = _TRUE; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - - pEntry = &(pBeamInfo->beamforming_entry[idx]); - if(pEntry->bUsed == _FALSE) - { - DBG_871X("Skip Beamforming, no entry for Idx =%d\n", idx); - return _FALSE; - } - - pEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_PROGRESSING; - pEntry->bSound = _TRUE; - rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&idx); - - return _TRUE; -} - -void beamforming_end_fw(PADAPTER adapter) -{ - u8 idx = 0; - - rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&idx); - - DBG_871X("%s\n", __FUNCTION__); -} - -BOOLEAN beamforming_start_period(PADAPTER adapter) -{ - BOOLEAN ret = _TRUE; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - struct sounding_info *pSoundInfo = &(pBeamInfo->sounding_info); - - beamforming_dym_ndpa_rate(adapter); - - beamforming_select_beam_entry(pBeamInfo); - - if(pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER) - { - ret = beamforming_start_fw(adapter, pSoundInfo->sound_idx); - } - else - { - ret = _FALSE; - } - - DBG_871X("%s Idx %d Mode %d BW %d Period %d\n", __FUNCTION__, - pSoundInfo->sound_idx, pSoundInfo->sound_mode, pSoundInfo->sound_bw, pSoundInfo->sound_period); - - return ret; -} - -void beamforming_end_period(PADAPTER adapter) -{ - u8 idx = 0; - struct beamforming_entry *pBeamformEntry; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - struct sounding_info *pSoundInfo = &(pBeamInfo->sounding_info); - - - if(pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER) - { - beamforming_end_fw(adapter); - } -} - -void beamforming_notify(PADAPTER adapter) -{ - BOOLEAN bSounding = _FALSE; - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(adapter->mlmepriv)); - - bSounding = beamfomring_bSounding(pBeamInfo); - - if(pBeamInfo->beamforming_state == BEAMFORMING_STATE_IDLE) - { - if(bSounding) - { - if(beamforming_start_period(adapter) == _TRUE) - pBeamInfo->beamforming_state = BEAMFORMING_STATE_START; - } - } - else if(pBeamInfo->beamforming_state == BEAMFORMING_STATE_START) - { - if(bSounding) - { - if(beamforming_start_period(adapter) == _FALSE) - pBeamInfo->beamforming_state = BEAMFORMING_STATE_END; - } - else - { - beamforming_end_period(adapter); - pBeamInfo->beamforming_state = BEAMFORMING_STATE_END; - } - } - else if(pBeamInfo->beamforming_state == BEAMFORMING_STATE_END) - { - if(bSounding) - { - if(beamforming_start_period(adapter) == _TRUE) - pBeamInfo->beamforming_state = BEAMFORMING_STATE_START; - } - } - else - { - DBG_871X("%s BeamformState %d\n", __FUNCTION__, pBeamInfo->beamforming_state); - } - - DBG_871X("%s BeamformState %d bSounding %d\n", __FUNCTION__, pBeamInfo->beamforming_state, bSounding); -} - -BOOLEAN beamforming_init_entry(PADAPTER adapter, struct sta_info *psta, u8* idx) -{ - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct ht_priv *phtpriv = &(pmlmepriv->htpriv); -#ifdef CONFIG_80211AC_VHT - struct vht_priv *pvhtpriv = &(pmlmepriv->vhtpriv); -#endif - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct beamforming_entry *pBeamformEntry = NULL; - u8 *ra; - u16 aid, mac_id; - u8 wireless_mode; - CHANNEL_WIDTH bw = CHANNEL_WIDTH_20; - BEAMFORMING_CAP beamform_cap = BEAMFORMING_CAP_NONE; - - // The current setting does not support Beaforming - if (0 == phtpriv->beamform_cap -#ifdef CONFIG_80211AC_VHT - && 0 == pvhtpriv->beamform_cap -#endif - ) { - DBG_871X("The configuration disabled Beamforming! Skip...\n"); - return _FALSE; - } - - aid = psta->aid; - ra = psta->hwaddr; - mac_id = psta->mac_id; - wireless_mode = psta->wireless_mode; - bw = psta->bw_mode; - - if (IsSupportedHT(wireless_mode) || IsSupportedVHT(wireless_mode)) { - //3 // HT - u8 cur_beamform; - - cur_beamform = psta->htpriv.beamform_cap; - - // We are Beamformee because the STA is Beamformer - if(TEST_FLAG(cur_beamform, BEAMFORMING_HT_BEAMFORMER_ENABLE)) - beamform_cap =(BEAMFORMING_CAP)(beamform_cap |BEAMFORMEE_CAP_HT_EXPLICIT); - - // We are Beamformer because the STA is Beamformee - if(TEST_FLAG(cur_beamform, BEAMFORMING_HT_BEAMFORMEE_ENABLE)) - beamform_cap =(BEAMFORMING_CAP)(beamform_cap | BEAMFORMER_CAP_HT_EXPLICIT); -#ifdef CONFIG_80211AC_VHT - if (IsSupportedVHT(wireless_mode)) { - //3 // VHT - cur_beamform = psta->vhtpriv.beamform_cap; - - // We are Beamformee because the STA is Beamformer - if(TEST_FLAG(cur_beamform, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) - beamform_cap =(BEAMFORMING_CAP)(beamform_cap |BEAMFORMEE_CAP_VHT_SU); - // We are Beamformer because the STA is Beamformee - if(TEST_FLAG(cur_beamform, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) - beamform_cap =(BEAMFORMING_CAP)(beamform_cap |BEAMFORMER_CAP_VHT_SU); - } -#endif //CONFIG_80211AC_VHT - - if(beamform_cap == BEAMFORMING_CAP_NONE) - return _FALSE; - - DBG_871X("Beamforming Config Capability = 0x%02X\n", beamform_cap); - - pBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ra, idx); - if (pBeamformEntry == NULL) { - pBeamformEntry = beamforming_add_entry(adapter, ra, aid, mac_id, bw, beamform_cap, idx); - if(pBeamformEntry == NULL) - return _FALSE; - else - pBeamformEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_INITIALIZEING; - } else { - // Entry has been created. If entry is initialing or progressing then errors occur. - if (pBeamformEntry->beamforming_entry_state != BEAMFORMING_ENTRY_STATE_INITIALIZED && - pBeamformEntry->beamforming_entry_state != BEAMFORMING_ENTRY_STATE_PROGRESSED) { - DBG_871X("Error State of Beamforming"); - return _FALSE; - } else { - pBeamformEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_INITIALIZEING; - } - } - - pBeamformEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_INITIALIZED; - psta->txbf_paid = pBeamformEntry->p_aid; - psta->txbf_gid = pBeamformEntry->g_id; - - DBG_871X("%s Idx %d\n", __FUNCTION__, *idx); - } else { - return _FALSE; - } - - return _SUCCESS; -} - -void beamforming_deinit_entry(PADAPTER adapter, u8* ra) -{ - u8 idx = 0; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - - if(beamforming_remove_entry(pmlmepriv, ra, &idx) == _TRUE) - { - rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_LEAVE, (u8 *)&idx); - } - - DBG_871X("%s Idx %d\n", __FUNCTION__, idx); -} - -void beamforming_reset(PADAPTER adapter) -{ - u8 idx = 0; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - - for(idx = 0; idx < BEAMFORMING_ENTRY_NUM; idx++) - { - if(pBeamInfo->beamforming_entry[idx].bUsed == _TRUE) - { - pBeamInfo->beamforming_entry[idx].bUsed = _FALSE; - pBeamInfo->beamforming_entry[idx].beamforming_entry_cap = BEAMFORMING_CAP_NONE; - pBeamInfo->beamforming_entry[idx].beamforming_entry_state= BEAMFORMING_ENTRY_STATE_UNINITIALIZE; - rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_LEAVE, (u8 *)&idx); - } - } - - DBG_871X("%s\n", __FUNCTION__); -} - -void beamforming_sounding_fail(PADAPTER Adapter) -{ - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - struct beamforming_entry *pEntry = &(pBeamInfo->beamforming_entry[pBeamInfo->beamforming_cur_idx]); - - pEntry->bSound = _FALSE; - rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&pBeamInfo->beamforming_cur_idx); - beamforming_deinit_entry(Adapter, pEntry->mac_addr); -} - -void beamforming_check_sounding_success(PADAPTER Adapter,BOOLEAN status) -{ - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - struct beamforming_entry *pEntry = &(pBeamInfo->beamforming_entry[pBeamInfo->beamforming_cur_idx]); - - if(status == 1) - { - pEntry->LogStatusFailCnt = 0; - } - else - { - pEntry->LogStatusFailCnt++; - DBG_871X("%s LogStatusFailCnt %d\n", __FUNCTION__, pEntry->LogStatusFailCnt); - } - if(pEntry->LogStatusFailCnt > 20) - { - DBG_871X("%s LogStatusFailCnt > 20, Stop SOUNDING\n", __FUNCTION__); - //pEntry->bSound = _FALSE; - //rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&pBeamInfo->beamforming_cur_idx); - //beamforming_deinit_entry(Adapter, pEntry->mac_addr); - beamforming_wk_cmd(Adapter, BEAMFORMING_CTRL_SOUNDING_FAIL, NULL, 0, 1); - } -} - -void beamforming_enter(PADAPTER adapter, PVOID psta) -{ - u8 idx = 0xff; - - if(beamforming_init_entry(adapter, (struct sta_info *)psta, &idx)) - rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_ENTER, (u8 *)&idx); - - //DBG_871X("%s Idx %d\n", __FUNCTION__, idx); -} - -void beamforming_leave(PADAPTER adapter,u8* ra) -{ - if(ra == NULL) - beamforming_reset(adapter); - else - beamforming_deinit_entry(adapter, ra); - - beamforming_notify(adapter); -} - -BEAMFORMING_CAP beamforming_get_beamform_cap(struct beamforming_info *pBeamInfo) -{ - u8 i; - BOOLEAN bSelfBeamformer = _FALSE; - BOOLEAN bSelfBeamformee = _FALSE; - struct beamforming_entry beamforming_entry; - BEAMFORMING_CAP beamform_cap = BEAMFORMING_CAP_NONE; - - for(i = 0; i < BEAMFORMING_ENTRY_NUM; i++) - { - beamforming_entry = pBeamInfo->beamforming_entry[i]; - - if(beamforming_entry.bUsed) - { - if( (beamforming_entry.beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU) || - (beamforming_entry.beamforming_entry_cap & BEAMFORMEE_CAP_HT_EXPLICIT)) - bSelfBeamformee = _TRUE; - if( (beamforming_entry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) || - (beamforming_entry.beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT)) - bSelfBeamformer = _TRUE; - } - - if(bSelfBeamformer && bSelfBeamformee) - i = BEAMFORMING_ENTRY_NUM; - } - - if(bSelfBeamformer) - beamform_cap |= BEAMFORMER_CAP; - if(bSelfBeamformee) - beamform_cap |= BEAMFORMEE_CAP; - - return beamform_cap; -} - -void beamforming_watchdog(PADAPTER Adapter) -{ - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(( &(Adapter->mlmepriv))); - - if(pBeamInfo->beamforming_state != BEAMFORMING_STATE_START) - return; - - beamforming_dym_period(Adapter); - beamforming_dym_ndpa_rate(Adapter); -} -#endif/* #if (BEAMFORMING_SUPPORT ==0) - for diver defined beamforming*/ - -u32 beamforming_get_report_frame(PADAPTER Adapter, union recv_frame *precv_frame) -{ - u32 ret = _SUCCESS; -#if (BEAMFORMING_SUPPORT == 1) - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - - ret = Beamforming_GetReportFrame(pDM_Odm, precv_frame); - -#else /*(BEAMFORMING_SUPPORT == 0)- for drv beamfoming*/ - struct beamforming_entry *pBeamformEntry = NULL; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - u8 *pframe = precv_frame->u.hdr.rx_data; - u32 frame_len = precv_frame->u.hdr.len; - u8 *ta; - u8 idx, offset; - - /*DBG_871X("beamforming_get_report_frame\n");*/ - - /*Memory comparison to see if CSI report is the same with previous one*/ - ta = GetAddr2Ptr(pframe); - pBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ta, &idx); - if (pBeamformEntry->beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) - offset = 31; /*24+(1+1+3)+2 MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)*/ - else if (pBeamformEntry->beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT) - offset = 34; /*24+(1+1+6)+2 MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)*/ - else - return ret; - - /*DBG_871X("%s MacId %d offset=%d\n", __FUNCTION__, pBeamformEntry->mac_id, offset);*/ - - if (_rtw_memcmp(pBeamformEntry->PreCsiReport + offset, pframe+offset, frame_len-offset) == _FALSE) - pBeamformEntry->DefaultCsiCnt = 0; - else - pBeamformEntry->DefaultCsiCnt++; - - _rtw_memcpy(&pBeamformEntry->PreCsiReport, pframe, frame_len); - - pBeamformEntry->bDefaultCSI = _FALSE; - - if (pBeamformEntry->DefaultCsiCnt > 20) - pBeamformEntry->bDefaultCSI = _TRUE; - else - pBeamformEntry->bDefaultCSI = _FALSE; -#endif - return ret; -} - -void beamforming_get_ndpa_frame(PADAPTER Adapter, union recv_frame *precv_frame) -{ -#if (BEAMFORMING_SUPPORT == 1) - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - - Beamforming_GetNDPAFrame(pDM_Odm, precv_frame); - -#else /*(BEAMFORMING_SUPPORT == 0)- for drv beamfoming*/ - u8 *ta; - u8 idx, Sequence; - u8 *pframe = precv_frame->u.hdr.rx_data; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct beamforming_entry *pBeamformEntry = NULL; - - /*DBG_871X("beamforming_get_ndpa_frame\n");*/ - - if (IS_HARDWARE_TYPE_8812(Adapter) == _FALSE) - return; - else if (GetFrameSubType(pframe) != WIFI_NDPA) - return; - - ta = GetAddr2Ptr(pframe); - /*Remove signaling TA. */ - ta[0] = ta[0] & 0xFE; - - pBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ta, &idx); - - if (pBeamformEntry == NULL) - return; - else if (!(pBeamformEntry->beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU)) - return; - /*LogSuccess: As long as 8812A receive NDPA and feedback CSI succeed once, clock reset is NO LONGER needed !2015-04-10, Jeffery*/ - /*ClockResetTimes: While BFer entry always doesn't receive our CSI, clock will reset again and again.So ClockResetTimes is limited to 5 times.2015-04-13, Jeffery*/ - else if ((pBeamformEntry->LogSuccess == 1) || (pBeamformEntry->ClockResetTimes == 5)) { - DBG_871X("[%s] LogSeq=%d, PreLogSeq=%d\n", __func__, pBeamformEntry->LogSeq, pBeamformEntry->PreLogSeq); - return; - } - - Sequence = (pframe[16]) >> 2; - DBG_871X("[%s] Start, Sequence=%d, LogSeq=%d, PreLogSeq=%d, LogRetryCnt=%d, ClockResetTimes=%d, LogSuccess=%d\n", - __func__, Sequence, pBeamformEntry->LogSeq, pBeamformEntry->PreLogSeq, pBeamformEntry->LogRetryCnt, pBeamformEntry->ClockResetTimes, pBeamformEntry->LogSuccess); - - if ((pBeamformEntry->LogSeq != 0) && (pBeamformEntry->PreLogSeq != 0)) { - /*Success condition*/ - if ((pBeamformEntry->LogSeq != Sequence) && (pBeamformEntry->PreLogSeq != pBeamformEntry->LogSeq)) { - /* break option for clcok reset, 2015-03-30, Jeffery */ - pBeamformEntry->LogRetryCnt = 0; - /*As long as 8812A receive NDPA and feedback CSI succeed once, clock reset is no longer needed.*/ - /*That is, LogSuccess is NOT needed to be reset to zero, 2015-04-13, Jeffery*/ - pBeamformEntry->LogSuccess = 1; - - } else {/*Fail condition*/ - - if (pBeamformEntry->LogRetryCnt == 5) { - pBeamformEntry->ClockResetTimes++; - pBeamformEntry->LogRetryCnt = 0; - - DBG_871X("[%s] Clock Reset!!! ClockResetTimes=%d\n", __func__, pBeamformEntry->ClockResetTimes); - beamforming_wk_cmd(Adapter, BEAMFORMING_CTRL_SOUNDING_CLK, NULL, 0, 1); - - } else - pBeamformEntry->LogRetryCnt++; - } - } - - /*Update LogSeq & PreLogSeq*/ - pBeamformEntry->PreLogSeq = pBeamformEntry->LogSeq; - pBeamformEntry->LogSeq = Sequence; - -#endif - -} - - - - -void beamforming_wk_hdl(_adapter *padapter, u8 type, u8 *pbuf) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); -_func_enter_; - -#if (BEAMFORMING_SUPPORT == 1) /*(BEAMFORMING_SUPPORT == 1)- for PHYDM beamfoming*/ - switch (type) { - case BEAMFORMING_CTRL_ENTER: - { - struct sta_info *psta = (PVOID)pbuf; - u16 staIdx = psta->mac_id; - - Beamforming_Enter(pDM_Odm, staIdx); - break; - } - case BEAMFORMING_CTRL_LEAVE: - Beamforming_Leave(pDM_Odm, pbuf); - break; - default: - break; - - } -#else /*(BEAMFORMING_SUPPORT == 0)- for drv beamfoming*/ - switch (type) { - case BEAMFORMING_CTRL_ENTER: - beamforming_enter(padapter, (PVOID)pbuf); - break; - - case BEAMFORMING_CTRL_LEAVE: - beamforming_leave(padapter, pbuf); - break; - - case BEAMFORMING_CTRL_SOUNDING_FAIL: - beamforming_sounding_fail(padapter); - break; - - case BEAMFORMING_CTRL_SOUNDING_CLK: - rtw_hal_set_hwreg(padapter, HW_VAR_SOUNDING_CLK, NULL); - break; - - default: - break; - } -#endif -_func_exit_; -} - -u8 beamforming_wk_cmd(_adapter*padapter, s32 type, u8 *pbuf, s32 size, u8 enqueue) -{ - struct cmd_obj *ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 res = _SUCCESS; - -_func_enter_; - - if(enqueue) - { - u8 *wk_buf; - - 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((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - if (pbuf != NULL) { - wk_buf = rtw_zmalloc(size); - if(wk_buf==NULL){ - rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj)); - rtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm)); - res= _FAIL; - goto exit; - } - - _rtw_memcpy(wk_buf, pbuf, size); - } else { - wk_buf = NULL; - size = 0; - } - - pdrvextra_cmd_parm->ec_id = BEAMFORMING_WK_CID; - pdrvextra_cmd_parm->type = type; - pdrvextra_cmd_parm->size = size; - pdrvextra_cmd_parm->pbuf = wk_buf; - - init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - } - else - { - beamforming_wk_hdl(padapter, type, pbuf); - } - -exit: - -_func_exit_; - - return res; -} - -void update_attrib_txbf_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta) -{ - if (psta) { - pattrib->txbf_g_id = psta->txbf_gid; - pattrib->txbf_p_aid = psta->txbf_paid; - } -} - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2016 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 + * + * + ******************************************************************************/ +#define _RTW_BEAMFORMING_C_ + +#include +#include + +#ifdef CONFIG_BEAMFORMING + +#if (BEAMFORMING_SUPPORT == 0) /*for diver defined beamforming*/ +#ifdef RTW_BEAMFORMING_VERSION_2 +/* + * For phydm + */ +BEAMFORMING_CAP beamforming_get_entry_beam_cap_by_mac_id(void *mlme, u8 mac_id) +{ + PADAPTER adapter; + struct beamforming_info *pBeamInfo; + struct beamformee_entry *bfee; + BEAMFORMING_CAP cap = BEAMFORMING_CAP_NONE; + u8 i = 0; + + + adapter = mlme_to_adapter((struct mlme_priv *)mlme); + pBeamInfo = GET_BEAMFORM_INFO(adapter); + + for (i = 0; i < MAX_BEAMFORMER_ENTRY_NUM; i++) { + bfee = &pBeamInfo->bfee_entry[i]; + if ((bfee->used == _TRUE) + && (bfee->mac_id == mac_id)) { + cap = bfee->cap; + break; + } + } + + return cap; +} + +struct beamformer_entry *beamforming_get_bfer_entry_by_addr(PADAPTER adapter, u8 *ra) +{ + u8 i = 0; + struct beamforming_info *bf_info; + struct beamformer_entry *entry; + + + bf_info = GET_BEAMFORM_INFO(adapter); + + for (i = 0; i < MAX_BEAMFORMER_ENTRY_NUM; i++) { + entry = &bf_info->bfer_entry[i]; + if (entry->used == _FALSE) + continue; + if (_rtw_memcmp(ra, entry->mac_addr, ETH_ALEN) == _TRUE) { + return entry; + } + } + + return NULL; +} + +struct beamformee_entry *beamforming_get_bfee_entry_by_addr(PADAPTER adapter, u8 *ra) +{ + u8 i = 0; + struct beamforming_info *bf_info; + struct beamformee_entry *entry; + + + bf_info = GET_BEAMFORM_INFO(adapter); + + for (i = 0; i < MAX_BEAMFORMEE_ENTRY_NUM; i++) { + entry = &bf_info->bfee_entry[i]; + if (entry->used == _FALSE) + continue; + if (_rtw_memcmp(ra, entry->mac_addr, ETH_ALEN) == _TRUE) + return entry; + } + + return NULL; +} + +static struct beamformer_entry *_get_bfer_free_entry(PADAPTER adapter) +{ + u8 i = 0; + struct beamforming_info *bf_info; + struct beamformer_entry *entry; + + + bf_info = GET_BEAMFORM_INFO(adapter); + + for (i = 0; i < MAX_BEAMFORMER_ENTRY_NUM; i++) { + entry = &bf_info->bfer_entry[i]; + if (entry->used == _FALSE) + return entry; + } + + return NULL; +} + +static struct beamformee_entry *_get_bfee_free_entry(PADAPTER adapter) +{ + u8 i = 0; + struct beamforming_info *bf_info; + struct beamformee_entry *entry; + + + bf_info = GET_BEAMFORM_INFO(adapter); + + for (i = 0; i < MAX_BEAMFORMEE_ENTRY_NUM; i++) { + entry = &bf_info->bfee_entry[i]; + if (entry->used == _FALSE) + return entry; + } + + return NULL; +} + +/* + * Description: + * Get the first entry index of MU Beamformee. + * + * Return Value: + * Index of the first MU sta. + * + * 2015.05.25. Created by tynli. + * + */ +static u8 _get_first_mu_bfee_entry_idx(PADAPTER adapter, struct beamformee_entry *ignore) +{ + struct beamforming_info *bf_info; + struct beamformee_entry *entry; + u8 idx = 0xFF; + u8 bFound = _FALSE; + + + bf_info = GET_BEAMFORM_INFO(adapter); + + for (idx = 0; idx < MAX_BEAMFORMEE_ENTRY_NUM; idx++) { + entry = &bf_info->bfee_entry[idx]; + if (ignore && (entry == ignore)) + continue; + if ((entry->used == _TRUE) && + TEST_FLAG(entry->cap, BEAMFORMEE_CAP_VHT_MU)) { + bFound = _TRUE; + break; + } + } + + if (bFound == _FALSE) + idx = 0xFF; + + return idx; +} + +static void _update_min_sounding_period(PADAPTER adapter, u16 period, u8 leave) +{ + struct beamforming_info *bf_info; + struct beamformee_entry *entry; + u8 i = 0; + u16 min_val = 0xFFFF; + + + bf_info = GET_BEAMFORM_INFO(adapter); + + if (_TRUE == leave) { + /* + * When a BFee left, + * we need to find the latest min sounding period + * from the remaining BFees + */ + for (i = 0; i < MAX_BEAMFORMEE_ENTRY_NUM; i++) { + entry = &bf_info->bfee_entry[i]; + if ((entry->used == _TRUE) + && (entry->sound_period < min_val)) + min_val = entry->sound_period; + } + + if (min_val == 0xFFFF) + bf_info->sounding_info.min_sounding_period = 0; + else + bf_info->sounding_info.min_sounding_period = min_val; + } else { + if ((bf_info->sounding_info.min_sounding_period == 0) + || (period < bf_info->sounding_info.min_sounding_period)) + bf_info->sounding_info.min_sounding_period = period; + } +} + +static struct beamformer_entry *_add_bfer_entry(PADAPTER adapter, + struct sta_info *sta, u8 bf_cap, u8 sounding_dim, u8 comp_steering) +{ + struct mlme_priv *mlme; + struct beamforming_info *bf_info; + struct beamformer_entry *entry; + u8 *bssid; + u16 val16; + u8 i; + + + mlme = &adapter->mlmepriv; + bf_info = GET_BEAMFORM_INFO(adapter); + + entry = beamforming_get_bfer_entry_by_addr(adapter, sta->hwaddr); + if (!entry) { + entry = _get_bfer_free_entry(adapter); + if (!entry) + return NULL; + } + + entry->used = _TRUE; + + if (check_fwstate(mlme, WIFI_AP_STATE)) { + bssid = adapter_mac_addr(adapter); + /* BSSID[44:47] xor BSSID[40:43] */ + val16 = ((bssid[5] & 0xF0) >> 4) ^ (bssid[5] & 0xF); + /* (dec(A) + dec(B)*32) mod 512 */ + entry->p_aid = (sta->aid + val16 * 32) & 0x1FF; + entry->g_id = 63; + } else if ((check_fwstate(mlme, WIFI_ADHOC_STATE) == _TRUE) + || (check_fwstate(mlme, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { + entry->p_aid = 0; + entry->g_id = 63; + } else { + bssid = sta->hwaddr; + /* BSSID[39:47] */ + entry->p_aid = (bssid[5] << 1) | (bssid[4] >> 7); + entry->g_id = 0; + } + RTW_INFO("%s: p_aid=0x%04x g_id=0x%04x aid=0x%x\n", + __FUNCTION__, entry->p_aid, entry->g_id, sta->aid); + + _rtw_memcpy(entry->mac_addr, sta->hwaddr, ETH_ALEN); + entry->cap = bf_cap; + entry->state = BEAMFORM_ENTRY_HW_STATE_ADD_INIT; + entry->NumofSoundingDim = sounding_dim; + + if (TEST_FLAG(bf_cap, BEAMFORMER_CAP_VHT_MU)) { + bf_info->beamformer_mu_cnt += 1; + entry->aid = sta->aid; + } else if (TEST_FLAG(bf_cap, BEAMFORMER_CAP_VHT_SU|BEAMFORMER_CAP_HT_EXPLICIT)) { + bf_info->beamformer_su_cnt += 1; + + /* Record HW idx info */ + for (i = 0; i < MAX_NUM_BEAMFORMER_SU; i++) { + if ((bf_info->beamformer_su_reg_maping & BIT(i)) == 0) { + bf_info->beamformer_su_reg_maping |= BIT(i); + entry->su_reg_index = i; + break; + } + } + RTW_INFO("%s: Add BFer entry beamformer_su_reg_maping=%#X, su_reg_index=%d\n", + __FUNCTION__, bf_info->beamformer_su_reg_maping, entry->su_reg_index); + } + + return entry; +} + +static struct beamformee_entry *_add_bfee_entry(PADAPTER adapter, + struct sta_info *sta, u8 bf_cap, u8 sounding_dim, u8 comp_steering) +{ + struct mlme_priv *mlme; + struct beamforming_info *bf_info; + struct beamformee_entry *entry; + u8 *bssid; + u16 val16; + u8 i; + + + mlme = &adapter->mlmepriv; + bf_info = GET_BEAMFORM_INFO(adapter); + + entry = beamforming_get_bfee_entry_by_addr(adapter, sta->hwaddr); + if (!entry) { + entry = _get_bfee_free_entry(adapter); + if (!entry) + return NULL; + } + + entry->used = _TRUE; + entry->aid = sta->aid; + entry->mac_id = sta->mac_id; + entry->sound_bw = sta->bw_mode; + + if (check_fwstate(mlme, WIFI_AP_STATE)) { + bssid = adapter_mac_addr(adapter); + /* BSSID[44:47] xor BSSID[40:43] */ + val16 = ((bssid[5] & 0xF0) >> 4) ^ (bssid[5] & 0xF); + /* (dec(A) + dec(B)*32) mod 512 */ + entry->p_aid = (sta->aid + val16 * 32) & 0x1FF; + entry->g_id = 63; + } else if (check_fwstate(mlme, WIFI_ADHOC_STATE) || check_fwstate(mlme, WIFI_ADHOC_MASTER_STATE)) { + entry->p_aid = 0; + entry->g_id = 63; + } else { + bssid = sta->hwaddr; + /* BSSID[39:47] */ + entry->p_aid = (bssid[5] << 1) | (bssid[4] >> 7); + entry->g_id = 0; + } + + _rtw_memcpy(entry->mac_addr, sta->hwaddr, ETH_ALEN); + entry->txbf = _FALSE; + entry->sounding = _FALSE; + entry->sound_period = 40; + entry->cap = bf_cap; + + _update_min_sounding_period(adapter, entry->sound_period, _FALSE); + entry->SoundCnt = GetInitSoundCnt(entry->sound_period, bf_info->sounding_info.min_sounding_period); + + entry->LogStatusFailCnt = 0; + + entry->NumofSoundingDim = sounding_dim; + entry->CompSteeringNumofBFer = comp_steering; + entry->state = BEAMFORM_ENTRY_HW_STATE_ADD_INIT; + + if (TEST_FLAG(bf_cap, BEAMFORMEE_CAP_VHT_MU)) { + bf_info->beamformee_mu_cnt += 1; + bf_info->first_mu_bfee_index = _get_first_mu_bfee_entry_idx(adapter, NULL); + + /* Record HW idx info */ + for (i = 0; i < MAX_NUM_BEAMFORMEE_MU; i++) { + if ((bf_info->beamformee_mu_reg_maping & BIT(i)) == 0) { + bf_info->beamformee_mu_reg_maping |= BIT(i); + entry->mu_reg_index = i; + break; + } + } + RTW_INFO("%s: Add BFee entry beamformee_mu_reg_maping=%#X, mu_reg_index=%d\n", + __FUNCTION__, bf_info->beamformee_mu_reg_maping, entry->mu_reg_index); + + } else if (TEST_FLAG(bf_cap, BEAMFORMEE_CAP_VHT_SU|BEAMFORMEE_CAP_HT_EXPLICIT)) { + bf_info->beamformee_su_cnt += 1; + + /* Record HW idx info */ + for (i = 0; i < MAX_NUM_BEAMFORMEE_SU; i++) { + if ((bf_info->beamformee_su_reg_maping & BIT(i)) == 0) { + bf_info->beamformee_su_reg_maping |= BIT(i); + entry->su_reg_index = i; + break; + } + } + RTW_INFO("%s: Add BFee entry beamformee_su_reg_maping=%#X, su_reg_index=%d\n", + __FUNCTION__, bf_info->beamformee_su_reg_maping, entry->su_reg_index); + } + + return entry; +} + +static void _remove_bfer_entry(PADAPTER adapter, struct beamformer_entry *entry) +{ + struct beamforming_info *bf_info; + + + bf_info = GET_BEAMFORM_INFO(adapter); + + entry->state = BEAMFORM_ENTRY_HW_STATE_DELETE_INIT; + + if (TEST_FLAG(entry->cap, BEAMFORMER_CAP_VHT_MU)) { + bf_info->beamformer_mu_cnt -= 1; + _rtw_memset(entry->gid_valid, 0, 8); + _rtw_memset(entry->user_position, 0, 16); + } else if (TEST_FLAG(entry->cap, BEAMFORMER_CAP_VHT_SU|BEAMFORMER_CAP_HT_EXPLICIT)) { + bf_info->beamformer_su_cnt -= 1; + } + + if (bf_info->beamformer_mu_cnt == 0) + bf_info->beamforming_cap &= ~BEAMFORMEE_CAP_VHT_MU; + if (bf_info->beamformer_su_cnt == 0) + bf_info->beamforming_cap &= ~(BEAMFORMEE_CAP_VHT_SU|BEAMFORMEE_CAP_HT_EXPLICIT); +} + +static void _remove_bfee_entry(PADAPTER adapter, struct beamformee_entry *entry) +{ + struct beamforming_info *bf_info; + + + bf_info = GET_BEAMFORM_INFO(adapter); + + entry->state = BEAMFORM_ENTRY_HW_STATE_DELETE_INIT; + + if (TEST_FLAG(entry->cap, BEAMFORMEE_CAP_VHT_MU)) { + bf_info->beamformee_mu_cnt -= 1; + bf_info->first_mu_bfee_index = _get_first_mu_bfee_entry_idx(adapter, entry); + } else if (TEST_FLAG(entry->cap, BEAMFORMEE_CAP_VHT_SU|BEAMFORMEE_CAP_HT_EXPLICIT)) { + bf_info->beamformee_su_cnt -= 1; + } + + if (bf_info->beamformee_mu_cnt == 0) + bf_info->beamforming_cap &= ~BEAMFORMER_CAP_VHT_MU; + if (bf_info->beamformee_su_cnt == 0) + bf_info->beamforming_cap &= ~(BEAMFORMER_CAP_VHT_SU|BEAMFORMER_CAP_HT_EXPLICIT); + + _update_min_sounding_period(adapter, 0, _TRUE); +} + +/* + * Parameters + * adapter struct _adapter* + * sta struct sta_info* + * sta_bf_cap beamforming capabe of sta + * sounding_dim Number of Sounding Dimensions + * comp_steering Compressed Steering Number of Beamformer Antennas Supported + */ +static void _get_sta_beamform_cap(PADAPTER adapter, struct sta_info *sta, + u8 *sta_bf_cap, u8 *sounding_dim, u8 *comp_steering) +{ + struct ht_priv *ht; +#ifdef CONFIG_80211AC_VHT + struct vht_priv *vht; +#endif /* CONFIG_80211AC_VHT */ + u16 bf_cap; + + + *sta_bf_cap = 0; + *sounding_dim = 0; + *comp_steering = 0; + + ht = &adapter->mlmepriv.htpriv; +#ifdef CONFIG_80211AC_VHT + vht = &adapter->mlmepriv.vhtpriv; +#endif /* CONFIG_80211AC_VHT */ + + if (IsSupportedHT(sta->wireless_mode) == _TRUE) { + /* HT */ + bf_cap = ht->beamform_cap; + + if (TEST_FLAG(bf_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE)) { + *sta_bf_cap |= BEAMFORMER_CAP_HT_EXPLICIT; + *sounding_dim = (bf_cap & BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP) >> 6; + } + if (TEST_FLAG(bf_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE)) { + *sta_bf_cap |= BEAMFORMEE_CAP_HT_EXPLICIT; + *comp_steering = (bf_cap & BEAMFORMING_HT_BEAMFORMER_STEER_NUM) >> 4; + } + } + +#ifdef CONFIG_80211AC_VHT + if (IsSupportedVHT(sta->wireless_mode) == _TRUE) { + /* VHT */ + bf_cap = vht->beamform_cap; + + /* We are SU Beamformee because the STA is SU Beamformer */ + if (TEST_FLAG(bf_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) { + *sta_bf_cap |= BEAMFORMER_CAP_VHT_SU; + + /* We are MU Beamformee because the STA is MU Beamformer */ + if (TEST_FLAG(bf_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE)) + *sta_bf_cap |= BEAMFORMER_CAP_VHT_MU; + + *sounding_dim = (bf_cap & BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM) >> 12; + } + /* We are SU Beamformer because the STA is SU Beamformee */ + if (TEST_FLAG(bf_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) { + *sta_bf_cap |= BEAMFORMEE_CAP_VHT_SU; + + /* We are MU Beamformer because the STA is MU Beamformee */ + if (TEST_FLAG(bf_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE)) + *sta_bf_cap |= BEAMFORMEE_CAP_VHT_MU; + + *comp_steering = (bf_cap & BEAMFORMING_VHT_BEAMFORMER_STS_CAP) >> 8; + } + } +#endif /* CONFIG_80211AC_VHT */ +} +/* + * Return: + * _TRUE success + * _FALSE fail + */ +static u8 _init_entry(PADAPTER adapter, struct sta_info *sta) +{ + struct mlme_priv *mlme; + struct ht_priv *htpriv; +#ifdef CONFIG_80211AC_VHT + struct vht_priv *vhtpriv; +#endif + struct mlme_ext_priv *mlme_ext; + struct sta_info *sta_real; + struct beamformer_entry *bfer = NULL; + struct beamformee_entry *bfee = NULL; + u8 *ra; + u8 wireless_mode; + u8 sta_bf_cap; + u8 sounding_dim = 0; /* number of sounding dimensions */ + u8 comp_steering_num = 0; /* compressed steering number */ + + + mlme = &adapter->mlmepriv; + htpriv = &mlme->htpriv; +#ifdef CONFIG_80211AC_VHT + vhtpriv = &mlme->vhtpriv; +#endif + mlme_ext = &adapter->mlmeextpriv; + ra = sta->hwaddr; + wireless_mode = sta->wireless_mode; + sta_real = rtw_get_stainfo(&adapter->stapriv, ra); + + /* The current setting does not support Beaforming */ + if ((IsSupportedHT(wireless_mode) == _FALSE) + && (IsSupportedVHT(wireless_mode) == _FALSE)) + return _FALSE; + + if ((0 == htpriv->beamform_cap) +#ifdef CONFIG_80211AC_VHT + && (0 == vhtpriv->beamform_cap) +#endif + ) { + RTW_INFO("The configuration disabled Beamforming! Skip...\n"); + return _FALSE; + } + + _get_sta_beamform_cap(adapter, sta, + &sta_bf_cap, &sounding_dim, &comp_steering_num); + RTW_INFO("STA Beamforming Capability=0x%02X\n", sta_bf_cap); + + if (sta_bf_cap == BEAMFORMING_CAP_NONE) + return _FALSE; + + if ((sta_bf_cap & BEAMFORMEE_CAP_HT_EXPLICIT) + || (sta_bf_cap & BEAMFORMEE_CAP_VHT_SU) + || (sta_bf_cap & BEAMFORMEE_CAP_VHT_MU)) + sta_bf_cap |= BEAMFORMEE_CAP; + else + sta_bf_cap |= BEAMFORMER_CAP; + + if (sta_bf_cap & BEAMFORMER_CAP) { + /* The other side is beamformer */ + bfer = _add_bfer_entry(adapter, sta, sta_bf_cap, sounding_dim, comp_steering_num); + if (bfer == NULL) { + RTW_ERR("%s: Fail to allocate bfer entry!\n", __FUNCTION__); + return _FALSE; + } + + sta_real->txbf_paid = bfer->p_aid; + sta_real->txbf_gid = bfer->g_id; + } else { + /* The other side is beamformee */ + bfee = _add_bfee_entry(adapter, sta, sta_bf_cap, sounding_dim, comp_steering_num); + if (bfee == NULL) { + RTW_ERR("%s: Fail to allocate bfee entry!\n", __FUNCTION__); + return _FALSE; + } + + sta_real->txbf_paid = bfee->p_aid; + sta_real->txbf_gid = bfee->g_id; + } + + return _TRUE; +} + +static void _deinit_entry(PADAPTER adapter, u8 *ra) +{ + struct beamforming_info *bf_info; + struct beamformer_entry *bfer = NULL; + struct beamformee_entry *bfee = NULL; + u8 bHwStateAddInit = _FALSE; + + + RTW_INFO("+%s\n", __FUNCTION__); + + bf_info = GET_BEAMFORM_INFO(adapter); + bfer = beamforming_get_bfer_entry_by_addr(adapter, ra); + bfee = beamforming_get_bfee_entry_by_addr(adapter, ra); + + if (!bfer && !bfee) { + RTW_WARN("%s: " MAC_FMT " is neither beamforming ee or er!!\n", + __FUNCTION__, MAC_ARG(ra)); + return; + } + + if (bfer && bfee) + RTW_ERR("%s: " MAC_FMT " is both beamforming ee & er!!\n", + __FUNCTION__, MAC_ARG(ra)); + + if (bfer) + _remove_bfer_entry(adapter, bfer); + + if (bfee) + _remove_bfee_entry(adapter, bfee); + + rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_LEAVE, ra); + + RTW_DBG("-%s\n", __FUNCTION__); +} + +void _beamforming_reset(PADAPTER adapter) +{ + RTW_ERR("%s: Not ready!!\n", __FUNCTION__); +} + +void beamforming_enter(PADAPTER adapter, void *sta) +{ + u8 ret; + + ret = _init_entry(adapter, (struct sta_info *)sta); + if (ret == _FALSE) + return; + + rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_ENTER, sta); +} + +void beamforming_leave(PADAPTER adapter, u8 *ra) +{ + if (ra == NULL) + _beamforming_reset(adapter); + else + _deinit_entry(adapter, ra); +} + +void beamforming_sounding_fail(PADAPTER adapter) +{ + RTW_ERR("+%s: not implemented yet!\n", __FUNCTION__); +} + +u8 beamforming_send_vht_gid_mgnt_packet(PADAPTER adapter, struct beamformee_entry *entry) +{ + struct xmit_priv *xmitpriv; + struct mlme_priv *mlmepriv; + struct xmit_frame *pmgntframe; + struct pkt_attrib *attrib; + struct rtw_ieee80211_hdr *wlanhdr; + u8 *pframe; + + + xmitpriv = &adapter->xmitpriv; + mlmepriv = &adapter->mlmepriv; + + pmgntframe = alloc_mgtxmitframe(xmitpriv); + if (!pmgntframe) + return _FALSE; + + /* update attribute */ + attrib = &pmgntframe->attrib; + update_mgntframe_attrib(adapter, attrib); + attrib->rate = MGN_6M; + attrib->bwmode = CHANNEL_WIDTH_20; + attrib->subtype = WIFI_ACTION; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)pmgntframe->buf_addr + TXDESC_OFFSET; + wlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + wlanhdr->frame_ctl = 0; + SetFrameSubType(pframe, attrib->subtype); + SetDuration(pframe, 0); + SetFragNum(pframe, 0); + SetSeqNum(pframe, 0); + + _rtw_memcpy(wlanhdr->addr1, entry->mac_addr, ETH_ALEN); + _rtw_memcpy(wlanhdr->addr2, adapter_mac_addr(adapter), ETH_ALEN); + _rtw_memcpy(wlanhdr->addr3, get_bssid(mlmepriv), ETH_ALEN); + + pframe[24] = RTW_WLAN_CATEGORY_VHT; + pframe[25] = RTW_WLAN_ACTION_VHT_GROUPID_MANAGEMENT; + _rtw_memcpy(&pframe[26], entry->gid_valid, 8); + _rtw_memcpy(&pframe[34], entry->user_position, 16); + + attrib->pktlen = 54; + attrib->last_txcmdsz = attrib->pktlen; + + dump_mgntframe(adapter, pmgntframe); + + return _TRUE; +} + +void beamforming_watchdog(PADAPTER adapter) +{ +} +#else /* !RTW_BEAMFORMING_VERSION_2 */ + +struct beamforming_entry *beamforming_get_entry_by_addr(struct mlme_priv *pmlmepriv, u8 *ra, u8 *idx) +{ + u8 i = 0; + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + + for (i = 0; i < BEAMFORMING_ENTRY_NUM; i++) { + if (pBeamInfo->beamforming_entry[i].bUsed && + (_rtw_memcmp(ra, pBeamInfo->beamforming_entry[i].mac_addr, ETH_ALEN))) { + *idx = i; + return &(pBeamInfo->beamforming_entry[i]); + } + } + + return NULL; +} + +BEAMFORMING_CAP beamforming_get_entry_beam_cap_by_mac_id(PVOID pmlmepriv , u8 mac_id) +{ + u8 i = 0; + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO((struct mlme_priv *)pmlmepriv); + BEAMFORMING_CAP BeamformEntryCap = BEAMFORMING_CAP_NONE; + + for (i = 0; i < BEAMFORMING_ENTRY_NUM; i++) { + if (pBeamInfo->beamforming_entry[i].bUsed && + (mac_id == pBeamInfo->beamforming_entry[i].mac_id)) { + BeamformEntryCap = pBeamInfo->beamforming_entry[i].beamforming_entry_cap; + i = BEAMFORMING_ENTRY_NUM; + } + } + + return BeamformEntryCap; +} + +struct beamforming_entry *beamforming_get_free_entry(struct mlme_priv *pmlmepriv, u8 *idx) +{ + u8 i = 0; + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + + for (i = 0; i < BEAMFORMING_ENTRY_NUM; i++) { + if (pBeamInfo->beamforming_entry[i].bUsed == _FALSE) { + *idx = i; + return &(pBeamInfo->beamforming_entry[i]); + } + } + return NULL; +} + + +struct beamforming_entry *beamforming_add_entry(PADAPTER adapter, u8 *ra, u16 aid, + u16 mac_id, CHANNEL_WIDTH bw, BEAMFORMING_CAP beamfrom_cap, u8 *idx) +{ + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct beamforming_entry *pEntry = beamforming_get_free_entry(pmlmepriv, idx); + + if (pEntry != NULL) { + pEntry->bUsed = _TRUE; + pEntry->aid = aid; + pEntry->mac_id = mac_id; + pEntry->sound_bw = bw; + if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { + 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 */ + pEntry->g_id = 63; + } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { + pEntry->p_aid = 0; + pEntry->g_id = 63; + } else { + pEntry->p_aid = ra[5]; /* BSSID[39:47] */ + pEntry->p_aid = (pEntry->p_aid << 1) | (ra[4] >> 7); + pEntry->g_id = 0; + } + _rtw_memcpy(pEntry->mac_addr, ra, ETH_ALEN); + pEntry->bSound = _FALSE; + + /* 3 TODO SW/FW sound period */ + pEntry->sound_period = 200; + pEntry->beamforming_entry_cap = beamfrom_cap; + pEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; + + + pEntry->PreLogSeq = 0; /*Modified by Jeffery @2015-04-13*/ + pEntry->LogSeq = 0; /*Modified by Jeffery @2014-10-29*/ + pEntry->LogRetryCnt = 0; /*Modified by Jeffery @2014-10-29*/ + pEntry->LogSuccess = 0; /*LogSuccess is NOT needed to be accumulated, so LogSuccessCnt->LogSuccess, 2015-04-13, Jeffery*/ + pEntry->ClockResetTimes = 0; /*Modified by Jeffery @2015-04-13*/ + pEntry->LogStatusFailCnt = 0; + + return pEntry; + } else + return NULL; +} + +BOOLEAN beamforming_remove_entry(struct mlme_priv *pmlmepriv, u8 *ra, u8 *idx) +{ + struct beamforming_entry *pEntry = beamforming_get_entry_by_addr(pmlmepriv, ra, idx); + + if (pEntry != NULL) { + pEntry->bUsed = _FALSE; + pEntry->beamforming_entry_cap = BEAMFORMING_CAP_NONE; + pEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; + return _TRUE; + } else + return _FALSE; +} + +/* Used for BeamformingStart_V1 */ +void beamforming_dym_ndpa_rate(PADAPTER adapter) +{ + u16 NDPARate = MGN_6M; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter); + + if (pHalData->MinUndecoratedPWDBForDM > 30) /* link RSSI > 30% */ + NDPARate = MGN_24M; + else + NDPARate = MGN_6M; + + /* BW = CHANNEL_WIDTH_20; */ + NDPARate = NDPARate << 8; + rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_RATE, (u8 *)&NDPARate); +} + +void beamforming_dym_period(PADAPTER Adapter) +{ + u8 Idx; + BOOLEAN bChangePeriod = _FALSE; + u16 SoundPeriod_SW, SoundPeriod_FW; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter); + struct beamforming_entry *pBeamformEntry; + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO((&Adapter->mlmepriv)); + struct sounding_info *pSoundInfo = &(pBeamInfo->sounding_info); + + /* 3 TODO per-client throughput caculation. */ + + if (pdvobjpriv->traffic_stat.cur_tx_tp + pdvobjpriv->traffic_stat.cur_rx_tp > 2) { + SoundPeriod_SW = 32 * 20; + SoundPeriod_FW = 2; + } else { + SoundPeriod_SW = 32 * 2000; + SoundPeriod_FW = 200; + } + + for (Idx = 0; Idx < BEAMFORMING_ENTRY_NUM; Idx++) { + pBeamformEntry = pBeamInfo->beamforming_entry + Idx; + if (pBeamformEntry->bDefaultCSI) { + SoundPeriod_SW = 32 * 2000; + SoundPeriod_FW = 200; + } + + if (pBeamformEntry->beamforming_entry_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU)) { + if (pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER) { + if (pBeamformEntry->sound_period != SoundPeriod_FW) { + pBeamformEntry->sound_period = SoundPeriod_FW; + bChangePeriod = _TRUE; /* Only FW sounding need to send H2C packet to change sound period. */ + } + } else if (pBeamformEntry->sound_period != SoundPeriod_SW) + pBeamformEntry->sound_period = SoundPeriod_SW; + } + } + + if (bChangePeriod) + rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&Idx); +} + +BOOLEAN issue_ht_sw_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct rtw_ieee80211_hdr *pwlanhdr; + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 ActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c}; + u8 *pframe; + u16 *fctrl; + u16 duration = 0; + u8 aSifsTime = 0; + u8 NDPTxRate = 0; + + RTW_INFO("%s: issue_ht_sw_ndpa_packet!\n", __func__); + + NDPTxRate = MGN_MCS8; + RTW_INFO("%s: NDPTxRate =%d\n", __func__, NDPTxRate); + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + + if (pmgntframe == NULL) + return _FALSE; + + /*update attribute*/ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(Adapter, pattrib); + pattrib->qsel = QSLT_MGNT; + pattrib->rate = NDPTxRate; + pattrib->bwmode = bw; + pattrib->order = 1; + pattrib->subtype = WIFI_ACTION_NOACK; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &pwlanhdr->frame_ctl; + *(fctrl) = 0; + + SetOrderBit(pframe); + SetFrameSubType(pframe, WIFI_ACTION_NOACK); + + _rtw_memcpy(pwlanhdr->addr1, ra, 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) + aSifsTime = 10; + else + aSifsTime = 16; + + duration = 2 * aSifsTime + 40; + + if (bw == CHANNEL_WIDTH_40) + duration += 87; + else + duration += 180; + + SetDuration(pframe, duration); + + /*HT control field*/ + SET_HT_CTRL_CSI_STEERING(pframe + 24, 3); + SET_HT_CTRL_NDP_ANNOUNCEMENT(pframe + 24, 1); + + _rtw_memcpy(pframe + 28, ActionHdr, 4); + + pattrib->pktlen = 32; + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(Adapter, pmgntframe); + + return _TRUE; + + +} +BOOLEAN issue_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct rtw_ieee80211_hdr *pwlanhdr; + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 ActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c}; + u8 *pframe; + u16 *fctrl; + u16 duration = 0; + u8 aSifsTime = 0; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + + if (pmgntframe == NULL) + return _FALSE; + + /*update attribute*/ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(Adapter, pattrib); + + if (qidx == BCN_QUEUE_INX) + pattrib->qsel = QSLT_BEACON; + pattrib->rate = MGN_MCS8; + pattrib->bwmode = bw; + pattrib->order = 1; + pattrib->subtype = WIFI_ACTION_NOACK; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &pwlanhdr->frame_ctl; + *(fctrl) = 0; + + SetOrderBit(pframe); + SetFrameSubType(pframe, WIFI_ACTION_NOACK); + + _rtw_memcpy(pwlanhdr->addr1, ra, 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) + aSifsTime = 10; + else + aSifsTime = 16; + + duration = 2 * aSifsTime + 40; + + if (bw == CHANNEL_WIDTH_40) + duration += 87; + else + duration += 180; + + SetDuration(pframe, duration); + + /* HT control field */ + SET_HT_CTRL_CSI_STEERING(pframe + 24, 3); + SET_HT_CTRL_NDP_ANNOUNCEMENT(pframe + 24, 1); + + _rtw_memcpy(pframe + 28, ActionHdr, 4); + + pattrib->pktlen = 32; + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(Adapter, pmgntframe); + + return _TRUE; +} + +BOOLEAN beamforming_send_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx) +{ + return issue_ht_ndpa_packet(Adapter, ra, bw, qidx); +} +BOOLEAN issue_vht_sw_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct rtw_ieee80211_hdr *pwlanhdr; + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + struct rtw_ndpa_sta_info sta_info; + u8 NDPTxRate = 0; + + u8 *pframe; + u16 *fctrl; + u16 duration = 0; + u8 sequence = 0, aSifsTime = 0; + + RTW_INFO("%s: issue_vht_sw_ndpa_packet!\n", __func__); + + + NDPTxRate = MGN_VHT2SS_MCS0; + RTW_INFO("%s: NDPTxRate =%d\n", __func__, NDPTxRate); + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + + if (pmgntframe == NULL) { + RTW_INFO("%s, alloc mgnt frame fail\n", __func__); + return _FALSE; + } + + /*update attribute*/ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(Adapter, pattrib); + pattrib->qsel = QSLT_MGNT; + pattrib->rate = NDPTxRate; + pattrib->bwmode = bw; + pattrib->subtype = WIFI_NDPA; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &pwlanhdr->frame_ctl; + *(fctrl) = 0; + + SetFrameSubType(pframe, WIFI_NDPA); + + _rtw_memcpy(pwlanhdr->addr1, ra, 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; + else + aSifsTime = 10; + + duration = 2 * aSifsTime + 44; + + if (bw == CHANNEL_WIDTH_80) + duration += 40; + else if (bw == CHANNEL_WIDTH_40) + duration += 87; + else + duration += 180; + + SetDuration(pframe, duration); + + sequence = pBeamInfo->sounding_sequence << 2; + if (pBeamInfo->sounding_sequence >= 0x3f) + pBeamInfo->sounding_sequence = 0; + else + pBeamInfo->sounding_sequence++; + + _rtw_memcpy(pframe + 16, &sequence, 1); + if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) + aid = 0; + + sta_info.aid = aid; + sta_info.feedback_type = 0; + sta_info.nc_index = 0; + + _rtw_memcpy(pframe + 17, (u8 *)&sta_info, 2); + + pattrib->pktlen = 19; + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(Adapter, pmgntframe); + + + return _TRUE; + +} +BOOLEAN issue_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct rtw_ieee80211_hdr *pwlanhdr; + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + struct rtw_ndpa_sta_info sta_info; + u8 *pframe; + u16 *fctrl; + u16 duration = 0; + u8 sequence = 0, aSifsTime = 0; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + return _FALSE; + + /*update attribute*/ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(Adapter, pattrib); + + if (qidx == BCN_QUEUE_INX) + pattrib->qsel = QSLT_BEACON; + pattrib->rate = MGN_VHT2SS_MCS0; + pattrib->bwmode = bw; + pattrib->subtype = WIFI_NDPA; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &pwlanhdr->frame_ctl; + *(fctrl) = 0; + + SetFrameSubType(pframe, WIFI_NDPA); + + _rtw_memcpy(pwlanhdr->addr1, ra, 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; + else + aSifsTime = 10; + + duration = 2 * aSifsTime + 44; + + if (bw == CHANNEL_WIDTH_80) + duration += 40; + else if (bw == CHANNEL_WIDTH_40) + duration += 87; + else + duration += 180; + + SetDuration(pframe, duration); + + sequence = pBeamInfo->sounding_sequence << 2; + if (pBeamInfo->sounding_sequence >= 0x3f) + pBeamInfo->sounding_sequence = 0; + else + pBeamInfo->sounding_sequence++; + + _rtw_memcpy(pframe + 16, &sequence, 1); + + if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) + aid = 0; + + sta_info.aid = aid; + sta_info.feedback_type = 0; + sta_info.nc_index = 0; + + _rtw_memcpy(pframe + 17, (u8 *)&sta_info, 2); + + pattrib->pktlen = 19; + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(Adapter, pmgntframe); + + return _TRUE; +} + +BOOLEAN beamforming_send_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx) +{ + return issue_vht_ndpa_packet(Adapter, ra, aid, bw, qidx); +} + +BOOLEAN beamfomring_bSounding(struct beamforming_info *pBeamInfo) +{ + BOOLEAN bSounding = _FALSE; + + if ((beamforming_get_beamform_cap(pBeamInfo) & BEAMFORMER_CAP) == 0) + bSounding = _FALSE; + else + bSounding = _TRUE; + + return bSounding; +} + +u8 beamforming_sounding_idx(struct beamforming_info *pBeamInfo) +{ + u8 idx = 0; + u8 i; + + for (i = 0; i < BEAMFORMING_ENTRY_NUM; i++) { + if (pBeamInfo->beamforming_entry[i].bUsed && + (_FALSE == pBeamInfo->beamforming_entry[i].bSound)) { + idx = i; + break; + } + } + + return idx; +} + +SOUNDING_MODE beamforming_sounding_mode(struct beamforming_info *pBeamInfo, u8 idx) +{ + struct beamforming_entry BeamEntry = pBeamInfo->beamforming_entry[idx]; + SOUNDING_MODE mode; + + if (BeamEntry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) + mode = SOUNDING_FW_VHT_TIMER; + else if (BeamEntry.beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT) + mode = SOUNDING_FW_HT_TIMER; + else + mode = SOUNDING_STOP_All_TIMER; + + return mode; +} + +u16 beamforming_sounding_time(struct beamforming_info *pBeamInfo, SOUNDING_MODE mode, u8 idx) +{ + u16 sounding_time = 0xffff; + struct beamforming_entry BeamEntry = pBeamInfo->beamforming_entry[idx]; + + sounding_time = BeamEntry.sound_period; + + return sounding_time; +} + +CHANNEL_WIDTH beamforming_sounding_bw(struct beamforming_info *pBeamInfo, SOUNDING_MODE mode, u8 idx) +{ + CHANNEL_WIDTH sounding_bw = CHANNEL_WIDTH_20; + struct beamforming_entry BeamEntry = pBeamInfo->beamforming_entry[idx]; + + sounding_bw = BeamEntry.sound_bw; + + return sounding_bw; +} + +BOOLEAN beamforming_select_beam_entry(struct beamforming_info *pBeamInfo) +{ + struct sounding_info *pSoundInfo = &(pBeamInfo->sounding_info); + + pSoundInfo->sound_idx = beamforming_sounding_idx(pBeamInfo); + + if (pSoundInfo->sound_idx < BEAMFORMING_ENTRY_NUM) + pSoundInfo->sound_mode = beamforming_sounding_mode(pBeamInfo, pSoundInfo->sound_idx); + else + pSoundInfo->sound_mode = SOUNDING_STOP_All_TIMER; + + if (SOUNDING_STOP_All_TIMER == pSoundInfo->sound_mode) + return _FALSE; + else { + pSoundInfo->sound_bw = beamforming_sounding_bw(pBeamInfo, pSoundInfo->sound_mode, pSoundInfo->sound_idx); + pSoundInfo->sound_period = beamforming_sounding_time(pBeamInfo, pSoundInfo->sound_mode, pSoundInfo->sound_idx); + return _TRUE; + } +} + +BOOLEAN beamforming_start_fw(PADAPTER adapter, u8 idx) +{ + u8 *RA = NULL; + struct beamforming_entry *pEntry; + BOOLEAN ret = _TRUE; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + + pEntry = &(pBeamInfo->beamforming_entry[idx]); + if (pEntry->bUsed == _FALSE) { + RTW_INFO("Skip Beamforming, no entry for Idx =%d\n", idx); + return _FALSE; + } + + pEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_PROGRESSING; + pEntry->bSound = _TRUE; + rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&idx); + + return _TRUE; +} + +void beamforming_end_fw(PADAPTER adapter) +{ + u8 idx = 0; + + rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&idx); + + RTW_INFO("%s\n", __FUNCTION__); +} + +BOOLEAN beamforming_start_period(PADAPTER adapter) +{ + BOOLEAN ret = _TRUE; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + struct sounding_info *pSoundInfo = &(pBeamInfo->sounding_info); + + beamforming_dym_ndpa_rate(adapter); + + beamforming_select_beam_entry(pBeamInfo); + + if (pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER) + ret = beamforming_start_fw(adapter, pSoundInfo->sound_idx); + else + ret = _FALSE; + + RTW_INFO("%s Idx %d Mode %d BW %d Period %d\n", __FUNCTION__, + pSoundInfo->sound_idx, pSoundInfo->sound_mode, pSoundInfo->sound_bw, pSoundInfo->sound_period); + + return ret; +} + +void beamforming_end_period(PADAPTER adapter) +{ + u8 idx = 0; + struct beamforming_entry *pBeamformEntry; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + struct sounding_info *pSoundInfo = &(pBeamInfo->sounding_info); + + + if (pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER) + beamforming_end_fw(adapter); +} + +void beamforming_notify(PADAPTER adapter) +{ + BOOLEAN bSounding = _FALSE; + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(adapter->mlmepriv)); + + bSounding = beamfomring_bSounding(pBeamInfo); + + if (pBeamInfo->beamforming_state == BEAMFORMING_STATE_IDLE) { + if (bSounding) { + if (beamforming_start_period(adapter) == _TRUE) + pBeamInfo->beamforming_state = BEAMFORMING_STATE_START; + } + } else if (pBeamInfo->beamforming_state == BEAMFORMING_STATE_START) { + if (bSounding) { + if (beamforming_start_period(adapter) == _FALSE) + pBeamInfo->beamforming_state = BEAMFORMING_STATE_END; + } else { + beamforming_end_period(adapter); + pBeamInfo->beamforming_state = BEAMFORMING_STATE_END; + } + } else if (pBeamInfo->beamforming_state == BEAMFORMING_STATE_END) { + if (bSounding) { + if (beamforming_start_period(adapter) == _TRUE) + pBeamInfo->beamforming_state = BEAMFORMING_STATE_START; + } + } else + RTW_INFO("%s BeamformState %d\n", __FUNCTION__, pBeamInfo->beamforming_state); + + RTW_INFO("%s BeamformState %d bSounding %d\n", __FUNCTION__, pBeamInfo->beamforming_state, bSounding); +} + +BOOLEAN beamforming_init_entry(PADAPTER adapter, struct sta_info *psta, u8 *idx) +{ + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct ht_priv *phtpriv = &(pmlmepriv->htpriv); +#ifdef CONFIG_80211AC_VHT + struct vht_priv *pvhtpriv = &(pmlmepriv->vhtpriv); +#endif + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct beamforming_entry *pBeamformEntry = NULL; + u8 *ra; + u16 aid, mac_id; + u8 wireless_mode; + CHANNEL_WIDTH bw = CHANNEL_WIDTH_20; + BEAMFORMING_CAP beamform_cap = BEAMFORMING_CAP_NONE; + + /* The current setting does not support Beaforming */ + if (0 == phtpriv->beamform_cap +#ifdef CONFIG_80211AC_VHT + && 0 == pvhtpriv->beamform_cap +#endif + ) { + RTW_INFO("The configuration disabled Beamforming! Skip...\n"); + return _FALSE; + } + + aid = psta->aid; + ra = psta->hwaddr; + mac_id = psta->mac_id; + wireless_mode = psta->wireless_mode; + bw = psta->bw_mode; + + if (IsSupportedHT(wireless_mode) || IsSupportedVHT(wireless_mode)) { + /* 3 */ /* HT */ + u8 cur_beamform; + + cur_beamform = psta->htpriv.beamform_cap; + + /* We are Beamformee because the STA is Beamformer */ + if (TEST_FLAG(cur_beamform, BEAMFORMING_HT_BEAMFORMER_ENABLE)) + beamform_cap = (BEAMFORMING_CAP)(beamform_cap | BEAMFORMEE_CAP_HT_EXPLICIT); + + /* We are Beamformer because the STA is Beamformee */ + if (TEST_FLAG(cur_beamform, BEAMFORMING_HT_BEAMFORMEE_ENABLE)) + beamform_cap = (BEAMFORMING_CAP)(beamform_cap | BEAMFORMER_CAP_HT_EXPLICIT); +#ifdef CONFIG_80211AC_VHT + if (IsSupportedVHT(wireless_mode)) { + /* 3 */ /* VHT */ + cur_beamform = psta->vhtpriv.beamform_cap; + + /* We are Beamformee because the STA is Beamformer */ + if (TEST_FLAG(cur_beamform, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) + beamform_cap = (BEAMFORMING_CAP)(beamform_cap | BEAMFORMEE_CAP_VHT_SU); + /* We are Beamformer because the STA is Beamformee */ + if (TEST_FLAG(cur_beamform, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) + beamform_cap = (BEAMFORMING_CAP)(beamform_cap | BEAMFORMER_CAP_VHT_SU); + } +#endif /* CONFIG_80211AC_VHT */ + + if (beamform_cap == BEAMFORMING_CAP_NONE) + return _FALSE; + + RTW_INFO("Beamforming Config Capability = 0x%02X\n", beamform_cap); + + pBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ra, idx); + if (pBeamformEntry == NULL) { + pBeamformEntry = beamforming_add_entry(adapter, ra, aid, mac_id, bw, beamform_cap, idx); + if (pBeamformEntry == NULL) + return _FALSE; + else + pBeamformEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_INITIALIZEING; + } else { + /* Entry has been created. If entry is initialing or progressing then errors occur. */ + if (pBeamformEntry->beamforming_entry_state != BEAMFORMING_ENTRY_STATE_INITIALIZED && + pBeamformEntry->beamforming_entry_state != BEAMFORMING_ENTRY_STATE_PROGRESSED) { + RTW_INFO("Error State of Beamforming"); + return _FALSE; + } else + pBeamformEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_INITIALIZEING; + } + + pBeamformEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_INITIALIZED; + psta->txbf_paid = pBeamformEntry->p_aid; + psta->txbf_gid = pBeamformEntry->g_id; + + RTW_INFO("%s Idx %d\n", __FUNCTION__, *idx); + } else + return _FALSE; + + return _SUCCESS; +} + +void beamforming_deinit_entry(PADAPTER adapter, u8 *ra) +{ + u8 idx = 0; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + + if (beamforming_remove_entry(pmlmepriv, ra, &idx) == _TRUE) + rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_LEAVE, (u8 *)&idx); + + RTW_INFO("%s Idx %d\n", __FUNCTION__, idx); +} + +void beamforming_reset(PADAPTER adapter) +{ + u8 idx = 0; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + + for (idx = 0; idx < BEAMFORMING_ENTRY_NUM; idx++) { + if (pBeamInfo->beamforming_entry[idx].bUsed == _TRUE) { + pBeamInfo->beamforming_entry[idx].bUsed = _FALSE; + pBeamInfo->beamforming_entry[idx].beamforming_entry_cap = BEAMFORMING_CAP_NONE; + pBeamInfo->beamforming_entry[idx].beamforming_entry_state = BEAMFORMING_ENTRY_STATE_UNINITIALIZE; + rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_LEAVE, (u8 *)&idx); + } + } + + RTW_INFO("%s\n", __FUNCTION__); +} + +void beamforming_sounding_fail(PADAPTER Adapter) +{ + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + struct beamforming_entry *pEntry = &(pBeamInfo->beamforming_entry[pBeamInfo->beamforming_cur_idx]); + + pEntry->bSound = _FALSE; + rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&pBeamInfo->beamforming_cur_idx); + beamforming_deinit_entry(Adapter, pEntry->mac_addr); +} + +void beamforming_check_sounding_success(PADAPTER Adapter, BOOLEAN status) +{ + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + struct beamforming_entry *pEntry = &(pBeamInfo->beamforming_entry[pBeamInfo->beamforming_cur_idx]); + + if (status == 1) + pEntry->LogStatusFailCnt = 0; + else { + pEntry->LogStatusFailCnt++; + RTW_INFO("%s LogStatusFailCnt %d\n", __FUNCTION__, pEntry->LogStatusFailCnt); + } + if (pEntry->LogStatusFailCnt > 20) { + RTW_INFO("%s LogStatusFailCnt > 20, Stop SOUNDING\n", __FUNCTION__); + /* pEntry->bSound = _FALSE; */ + /* rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&pBeamInfo->beamforming_cur_idx); */ + /* beamforming_deinit_entry(Adapter, pEntry->mac_addr); */ + beamforming_wk_cmd(Adapter, BEAMFORMING_CTRL_SOUNDING_FAIL, NULL, 0, 1); + } +} + +void beamforming_enter(PADAPTER adapter, PVOID psta) +{ + u8 idx = 0xff; + + if (beamforming_init_entry(adapter, (struct sta_info *)psta, &idx)) + rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_ENTER, (u8 *)&idx); + + /* RTW_INFO("%s Idx %d\n", __FUNCTION__, idx); */ +} + +void beamforming_leave(PADAPTER adapter, u8 *ra) +{ + if (ra == NULL) + beamforming_reset(adapter); + else + beamforming_deinit_entry(adapter, ra); + + beamforming_notify(adapter); +} + +BEAMFORMING_CAP beamforming_get_beamform_cap(struct beamforming_info *pBeamInfo) +{ + u8 i; + BOOLEAN bSelfBeamformer = _FALSE; + BOOLEAN bSelfBeamformee = _FALSE; + struct beamforming_entry beamforming_entry; + BEAMFORMING_CAP beamform_cap = BEAMFORMING_CAP_NONE; + + for (i = 0; i < BEAMFORMING_ENTRY_NUM; i++) { + beamforming_entry = pBeamInfo->beamforming_entry[i]; + + if (beamforming_entry.bUsed) { + if ((beamforming_entry.beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU) || + (beamforming_entry.beamforming_entry_cap & BEAMFORMEE_CAP_HT_EXPLICIT)) + bSelfBeamformee = _TRUE; + if ((beamforming_entry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) || + (beamforming_entry.beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT)) + bSelfBeamformer = _TRUE; + } + + if (bSelfBeamformer && bSelfBeamformee) + i = BEAMFORMING_ENTRY_NUM; + } + + if (bSelfBeamformer) + beamform_cap |= BEAMFORMER_CAP; + if (bSelfBeamformee) + beamform_cap |= BEAMFORMEE_CAP; + + return beamform_cap; +} + +void beamforming_watchdog(PADAPTER Adapter) +{ + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO((&(Adapter->mlmepriv))); + + if (pBeamInfo->beamforming_state != BEAMFORMING_STATE_START) + return; + + beamforming_dym_period(Adapter); + beamforming_dym_ndpa_rate(Adapter); +} +#endif /* !RTW_BEAMFORMING_VERSION_2 */ +#endif/* #if (BEAMFORMING_SUPPORT ==0) - for diver defined beamforming*/ + +u32 beamforming_get_report_frame(PADAPTER Adapter, union recv_frame *precv_frame) +{ + u32 ret = _SUCCESS; +#if (BEAMFORMING_SUPPORT == 1) + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + + ret = Beamforming_GetReportFrame(pDM_Odm, precv_frame); + +#else /*(BEAMFORMING_SUPPORT == 0)- for drv beamfoming*/ +#ifdef RTW_BEAMFORMING_VERSION_2 + struct beamformee_entry *pBeamformEntry = NULL; + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + u8 *pframe = precv_frame->u.hdr.rx_data; + u32 frame_len = precv_frame->u.hdr.len; + u8 *ta; + u8 *frame_body; + u8 category, action; + u8 *pMIMOCtrlField, *pCSIMatrix; + u8 Nc = 0, Nr = 0, CH_W = 0; + u16 CSIMatrixLen = 0; + + + RTW_DBG("+%s\n", __FUNCTION__); + + /* Memory comparison to see if CSI report is the same with previous one */ + ta = GetAddr2Ptr(pframe); + pBeamformEntry = beamforming_get_bfee_entry_by_addr(Adapter, ta); + if (!pBeamformEntry) + return _FAIL; + + frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); + category = frame_body[0]; + action = frame_body[1]; + + if ((category == RTW_WLAN_CATEGORY_VHT) + && (action == RTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING)) { + pMIMOCtrlField = pframe + 26; + Nc = ((*pMIMOCtrlField) & 0x7) + 1; + Nr = (((*pMIMOCtrlField) & 0x38) >> 3) + 1; + CH_W = (((*pMIMOCtrlField) & 0xC0) >> 6); + /* + * 24+(1+1+3)+2 + * ==> MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2) + */ + pCSIMatrix = pMIMOCtrlField + 3 + Nc; + CSIMatrixLen = frame_len - 26 - 3 - Nc; + } else if ((category == RTW_WLAN_CATEGORY_HT) + && (action == RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING)) { + pMIMOCtrlField = pframe + 26; + Nc = ((*pMIMOCtrlField) & 0x3) + 1; + Nr = (((*pMIMOCtrlField) & 0xC) >> 2) + 1; + CH_W = ((*pMIMOCtrlField) & 0x10) >> 4; + /* + * 24+(1+1+6)+2 + * ==> MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2) + */ + pCSIMatrix = pMIMOCtrlField + 6 + Nr; + CSIMatrixLen = frame_len - 26 - 6 - Nr; + } + + RTW_INFO("%s: pkt type=%d-%d, Nc=%d, Nr=%d, CH_W=%d\n", + __FUNCTION__, category, action, Nc, Nr, CH_W); +#else /* !RTW_BEAMFORMING_VERSION_2 */ + struct beamforming_entry *pBeamformEntry = NULL; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + u8 *pframe = precv_frame->u.hdr.rx_data; + u32 frame_len = precv_frame->u.hdr.len; + u8 *ta; + u8 idx, offset; + + /*RTW_INFO("beamforming_get_report_frame\n");*/ + + /*Memory comparison to see if CSI report is the same with previous one*/ + ta = GetAddr2Ptr(pframe); + pBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ta, &idx); + if (pBeamformEntry->beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) + offset = 31; /*24+(1+1+3)+2 MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)*/ + else if (pBeamformEntry->beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT) + offset = 34; /*24+(1+1+6)+2 MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)*/ + else + return ret; + + /*RTW_INFO("%s MacId %d offset=%d\n", __FUNCTION__, pBeamformEntry->mac_id, offset);*/ + + if (_rtw_memcmp(pBeamformEntry->PreCsiReport + offset, pframe + offset, frame_len - offset) == _FALSE) + pBeamformEntry->DefaultCsiCnt = 0; + else + pBeamformEntry->DefaultCsiCnt++; + + _rtw_memcpy(&pBeamformEntry->PreCsiReport, pframe, frame_len); + + pBeamformEntry->bDefaultCSI = _FALSE; + + if (pBeamformEntry->DefaultCsiCnt > 20) + pBeamformEntry->bDefaultCSI = _TRUE; + else + pBeamformEntry->bDefaultCSI = _FALSE; +#endif /* !RTW_BEAMFORMING_VERSION_2 */ +#endif + return ret; +} + +void beamforming_get_ndpa_frame(PADAPTER Adapter, union recv_frame *precv_frame) +{ +#if (BEAMFORMING_SUPPORT == 1) + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + + Beamforming_GetNDPAFrame(pDM_Odm, precv_frame); + +#else /*(BEAMFORMING_SUPPORT == 0)- for drv beamfoming*/ +#ifdef RTW_BEAMFORMING_VERSION_2 + RTW_DBG("+%s\n", __FUNCTION__); +#else /* !RTW_BEAMFORMING_VERSION_2 */ + u8 *ta; + u8 idx, Sequence; + u8 *pframe = precv_frame->u.hdr.rx_data; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct beamforming_entry *pBeamformEntry = NULL; + + /*RTW_INFO("beamforming_get_ndpa_frame\n");*/ + + if (IS_HARDWARE_TYPE_8812(Adapter) == _FALSE) + return; + else if (GetFrameSubType(pframe) != WIFI_NDPA) + return; + + ta = GetAddr2Ptr(pframe); + /*Remove signaling TA. */ + ta[0] = ta[0] & 0xFE; + + pBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ta, &idx); + + if (pBeamformEntry == NULL) + return; + else if (!(pBeamformEntry->beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU)) + return; + /*LogSuccess: As long as 8812A receive NDPA and feedback CSI succeed once, clock reset is NO LONGER needed !2015-04-10, Jeffery*/ + /*ClockResetTimes: While BFer entry always doesn't receive our CSI, clock will reset again and again.So ClockResetTimes is limited to 5 times.2015-04-13, Jeffery*/ + else if ((pBeamformEntry->LogSuccess == 1) || (pBeamformEntry->ClockResetTimes == 5)) { + RTW_INFO("[%s] LogSeq=%d, PreLogSeq=%d\n", __func__, pBeamformEntry->LogSeq, pBeamformEntry->PreLogSeq); + return; + } + + Sequence = (pframe[16]) >> 2; + RTW_INFO("[%s] Start, Sequence=%d, LogSeq=%d, PreLogSeq=%d, LogRetryCnt=%d, ClockResetTimes=%d, LogSuccess=%d\n", + __func__, Sequence, pBeamformEntry->LogSeq, pBeamformEntry->PreLogSeq, pBeamformEntry->LogRetryCnt, pBeamformEntry->ClockResetTimes, pBeamformEntry->LogSuccess); + + if ((pBeamformEntry->LogSeq != 0) && (pBeamformEntry->PreLogSeq != 0)) { + /*Success condition*/ + if ((pBeamformEntry->LogSeq != Sequence) && (pBeamformEntry->PreLogSeq != pBeamformEntry->LogSeq)) { + /* break option for clcok reset, 2015-03-30, Jeffery */ + pBeamformEntry->LogRetryCnt = 0; + /*As long as 8812A receive NDPA and feedback CSI succeed once, clock reset is no longer needed.*/ + /*That is, LogSuccess is NOT needed to be reset to zero, 2015-04-13, Jeffery*/ + pBeamformEntry->LogSuccess = 1; + + } else {/*Fail condition*/ + + if (pBeamformEntry->LogRetryCnt == 5) { + pBeamformEntry->ClockResetTimes++; + pBeamformEntry->LogRetryCnt = 0; + + RTW_INFO("[%s] Clock Reset!!! ClockResetTimes=%d\n", __func__, pBeamformEntry->ClockResetTimes); + beamforming_wk_cmd(Adapter, BEAMFORMING_CTRL_SOUNDING_CLK, NULL, 0, 1); + + } else + pBeamformEntry->LogRetryCnt++; + } + } + + /*Update LogSeq & PreLogSeq*/ + pBeamformEntry->PreLogSeq = pBeamformEntry->LogSeq; + pBeamformEntry->LogSeq = Sequence; +#endif /* !RTW_BEAMFORMING_VERSION_2 */ +#endif + +} + +/* octets in data header, no WEP */ +#define sMacHdrLng 24 +/* VHT Group ID (GID) Management Frame */ +#define FRAME_OFFSET_VHT_GID_MGNT_MEMBERSHIP_STATUS_ARRAY (sMacHdrLng + 2) +#define FRAME_OFFSET_VHT_GID_MGNT_USER_POSITION_ARRAY (sMacHdrLng + 10) +/* VHT GID Management Frame Info */ +#define GET_VHT_GID_MGNT_INFO_MEMBERSHIP_STATUS(_pStart) LE_BITS_TO_1BYTE((_pStart), 0, 8) +#define GET_VHT_GID_MGNT_INFO_USER_POSITION(_pStart) LE_BITS_TO_1BYTE((_pStart), 0, 8) +/* + * Description: + * On VHT GID management frame by an MU beamformee. + * + * 2015.05.20. Created by tynli. + */ +u32 beamforming_get_vht_gid_mgnt_frame(PADAPTER adapter, union recv_frame *precv_frame) +{ +#ifdef RTW_BEAMFORMING_VERSION_2 + u8 *ta; + u8 idx; + u8 *pframe; + u8 *pBuffer = NULL; + struct beamformer_entry *bfer = NULL; + + + RTW_DBG("+%s\n", __FUNCTION__); + + pframe = precv_frame->u.hdr.rx_data; + /* Get BFer entry by Addr2 */ + ta = GetAddr2Ptr(pframe); + /* Remove signaling TA */ + ta[0] &= 0xFE; + + bfer = beamforming_get_bfer_entry_by_addr(adapter, ta); + if (!bfer) { + RTW_INFO("%s: Cannot find BFer entry!!\n", __FUNCTION__); + return _FAIL; + } + + /* Parsing Membership Status Array */ + pBuffer = pframe + FRAME_OFFSET_VHT_GID_MGNT_MEMBERSHIP_STATUS_ARRAY; + for (idx = 0; idx < 8; idx++) + bfer->gid_valid[idx] = GET_VHT_GID_MGNT_INFO_MEMBERSHIP_STATUS(pBuffer+idx); + + /* Parsing User Position Array */ + pBuffer = pframe + FRAME_OFFSET_VHT_GID_MGNT_USER_POSITION_ARRAY; + for (idx = 0; idx < 16; idx++) + bfer->user_position[idx] = GET_VHT_GID_MGNT_INFO_USER_POSITION(pBuffer+idx); + + /* Config HW GID table */ + beamforming_wk_cmd(adapter, BEAMFORMING_CTRL_SET_GID_TABLE, (u8*)&bfer, sizeof(struct beamformer_entry *), 1); + + return _SUCCESS; +#else /* !RTW_BEAMFORMING_VERSION_2 */ + return _FAIL; +#endif /* !RTW_BEAMFORMING_VERSION_2 */ +} + +void beamforming_wk_hdl(_adapter *padapter, u8 type, u8 *pbuf) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + +#if (BEAMFORMING_SUPPORT == 1) /*(BEAMFORMING_SUPPORT == 1)- for PHYDM beamfoming*/ + switch (type) { + case BEAMFORMING_CTRL_ENTER: { + struct sta_info *psta = (PVOID)pbuf; + u16 staIdx = psta->mac_id; + + Beamforming_Enter(pDM_Odm, staIdx); + break; + } + case BEAMFORMING_CTRL_LEAVE: + Beamforming_Leave(pDM_Odm, pbuf); + break; + default: + break; + + } +#else /*(BEAMFORMING_SUPPORT == 0)- for drv beamfoming*/ + switch (type) { + case BEAMFORMING_CTRL_ENTER: + beamforming_enter(padapter, (PVOID)pbuf); + break; + + case BEAMFORMING_CTRL_LEAVE: + beamforming_leave(padapter, pbuf); + break; + + case BEAMFORMING_CTRL_SOUNDING_FAIL: + beamforming_sounding_fail(padapter); + break; + + case BEAMFORMING_CTRL_SOUNDING_CLK: + rtw_hal_set_hwreg(padapter, HW_VAR_SOUNDING_CLK, NULL); + break; + + case BEAMFORMING_CTRL_SET_GID_TABLE: + rtw_hal_set_hwreg(padapter, HW_VAR_SOUNDING_SET_GID_TABLE, *(void**)pbuf); + break; + + default: + break; + } +#endif +} + +u8 beamforming_wk_cmd(_adapter *padapter, s32 type, u8 *pbuf, s32 size, u8 enqueue) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + + + if (enqueue) { + u8 *wk_buf; + + 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((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + if (pbuf != NULL) { + wk_buf = rtw_zmalloc(size); + if (wk_buf == NULL) { + rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm)); + res = _FAIL; + goto exit; + } + + _rtw_memcpy(wk_buf, pbuf, size); + } else { + wk_buf = NULL; + size = 0; + } + + pdrvextra_cmd_parm->ec_id = BEAMFORMING_WK_CID; + pdrvextra_cmd_parm->type = type; + pdrvextra_cmd_parm->size = size; + pdrvextra_cmd_parm->pbuf = wk_buf; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } else + beamforming_wk_hdl(padapter, type, pbuf); + +exit: + + + return res; +} + +void update_attrib_txbf_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta) +{ + if (psta) { + pattrib->txbf_g_id = psta->txbf_gid; + pattrib->txbf_p_aid = psta->txbf_paid; + } +} + +#endif diff --git a/core/rtw_br_ext.c b/core/rtw_br_ext.c old mode 100755 new mode 100644 index 024049c..b330edf --- a/core/rtw_br_ext.c +++ b/core/rtw_br_ext.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. @@ -20,45 +20,45 @@ #define _RTW_BR_EXT_C_ #ifdef __KERNEL__ -#include -#include -#include -#include -#include -#include + #include + #include + #include + #include + #include + #include #endif -#if 1 // rtw_wifi_driver -#include -#else // rtw_wifi_driver -#include "./8192cd_cfg.h" +#if 1 /* rtw_wifi_driver */ + #include +#else /* rtw_wifi_driver */ + #include "./8192cd_cfg.h" -#ifndef __KERNEL__ -#include "./sys-support.h" -#endif + #ifndef __KERNEL__ + #include "./sys-support.h" + #endif -#include "./8192cd.h" -#include "./8192cd_headers.h" -#include "./8192cd_br_ext.h" -#include "./8192cd_debug.h" -#endif // rtw_wifi_driver + #include "./8192cd.h" + #include "./8192cd_headers.h" + #include "./8192cd_br_ext.h" + #include "./8192cd_debug.h" +#endif /* rtw_wifi_driver */ #ifdef CL_IPV6_PASS -#ifdef __KERNEL__ -#include -#include -#include -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)) -#include -#else -#include -#endif -#endif + #ifdef __KERNEL__ + #include + #include + #include + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)) + #include + #else + #include + #endif + #endif #endif #ifdef CONFIG_BR_EXT -//#define BR_EXT_DEBUG +/* #define BR_EXT_DEBUG */ #define NAT25_IPV4 01 #define NAT25_IPV6 02 @@ -71,7 +71,7 @@ #define MAGIC_CODE 0x8186 #define MAGIC_CODE_LEN 2 -#define WAIT_TIME_PPPOE 5 // waiting time for pppoe server in sec +#define WAIT_TIME_PPPOE 5 /* waiting time for pppoe server in sec */ /*----------------------------------------------------------------- How database records network address: @@ -85,18 +85,18 @@ -----------------------------------------------------------------*/ -//Find a tag in pppoe frame and return the pointer +/* Find a tag in pppoe frame and return the pointer */ static __inline__ unsigned char *__nat25_find_pppoe_tag(struct pppoe_hdr *ph, unsigned short type) { unsigned char *cur_ptr, *start_ptr; unsigned short tagLen, tagType; start_ptr = cur_ptr = (unsigned char *)ph->tag; - while((cur_ptr - start_ptr) < ntohs(ph->length)) { - // prevent un-alignment access + while ((cur_ptr - start_ptr) < ntohs(ph->length)) { + /* prevent un-alignment access */ tagType = (unsigned short)((cur_ptr[0] << 8) + cur_ptr[1]); tagLen = (unsigned short)((cur_ptr[2] << 8) + cur_ptr[3]); - if(tagType == type) + if (tagType == type) return cur_ptr; cur_ptr = cur_ptr + TAG_HDR_LEN + tagLen; } @@ -116,7 +116,7 @@ static __inline__ int __nat25_add_pppoe_tag(struct sk_buff *skb, struct pppoe_ta } skb_put(skb, data_len); - // have a room for new tag + /* have a room for new tag */ memmove(((unsigned char *)ph->tag + data_len), (unsigned char *)ph->tag, ntohs(ph->length)); ph->length = htons(ntohs(ph->length) + data_len); memcpy((unsigned char *)ph->tag, tag, data_len); @@ -128,19 +128,19 @@ static int skb_pull_and_merge(struct sk_buff *skb, unsigned char *src, int len) int tail_len; unsigned long end, tail; - if ((src+len) > skb_tail_pointer(skb) || skb->len < len) + if ((src + len) > skb_tail_pointer(skb) || skb->len < len) return -1; tail = (unsigned long)skb_tail_pointer(skb); - end = (unsigned long)src+len; + end = (unsigned long)src + len; if (tail < end) return -1; - tail_len = (int)(tail-end); + tail_len = (int)(tail - end); if (tail_len > 0) - memmove(src, src+len, tail_len); + memmove(src, src + len, tail_len); - skb_trim(skb, skb->len-len); + skb_trim(skb, skb->len - len); return 0; } @@ -148,16 +148,16 @@ static __inline__ unsigned long __nat25_timeout(_adapter *priv) { unsigned long timeout; - timeout = jiffies - NAT25_AGEING_TIME*HZ; + timeout = jiffies - NAT25_AGEING_TIME * HZ; return timeout; } static __inline__ int __nat25_has_expired(_adapter *priv, - struct nat25_network_db_entry *fdb) + struct nat25_network_db_entry *fdb) { - if(time_before_eq(fdb->ageing_timer, __nat25_timeout(priv))) + if (time_before_eq(fdb->ageing_timer, __nat25_timeout(priv))) return 1; return 0; @@ -165,78 +165,78 @@ static __inline__ int __nat25_has_expired(_adapter *priv, static __inline__ void __nat25_generate_ipv4_network_addr(unsigned char *networkAddr, - unsigned int *ipAddr) + unsigned int *ipAddr) { memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); networkAddr[0] = NAT25_IPV4; - memcpy(networkAddr+7, (unsigned char *)ipAddr, 4); + memcpy(networkAddr + 7, (unsigned char *)ipAddr, 4); } static __inline__ void __nat25_generate_ipx_network_addr_with_node(unsigned char *networkAddr, - unsigned int *ipxNetAddr, unsigned char *ipxNodeAddr) + unsigned int *ipxNetAddr, unsigned char *ipxNodeAddr) { memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); networkAddr[0] = NAT25_IPX; - memcpy(networkAddr+1, (unsigned char *)ipxNetAddr, 4); - memcpy(networkAddr+5, ipxNodeAddr, 6); + memcpy(networkAddr + 1, (unsigned char *)ipxNetAddr, 4); + memcpy(networkAddr + 5, ipxNodeAddr, 6); } static __inline__ void __nat25_generate_ipx_network_addr_with_socket(unsigned char *networkAddr, - unsigned int *ipxNetAddr, unsigned short *ipxSocketAddr) + unsigned int *ipxNetAddr, unsigned short *ipxSocketAddr) { memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); networkAddr[0] = NAT25_IPX; - memcpy(networkAddr+1, (unsigned char *)ipxNetAddr, 4); - memcpy(networkAddr+5, (unsigned char *)ipxSocketAddr, 2); + memcpy(networkAddr + 1, (unsigned char *)ipxNetAddr, 4); + memcpy(networkAddr + 5, (unsigned char *)ipxSocketAddr, 2); } static __inline__ void __nat25_generate_apple_network_addr(unsigned char *networkAddr, - unsigned short *network, unsigned char *node) + unsigned short *network, unsigned char *node) { memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); networkAddr[0] = NAT25_APPLE; - memcpy(networkAddr+1, (unsigned char *)network, 2); + memcpy(networkAddr + 1, (unsigned char *)network, 2); networkAddr[3] = *node; } static __inline__ void __nat25_generate_pppoe_network_addr(unsigned char *networkAddr, - unsigned char *ac_mac, unsigned short *sid) + unsigned char *ac_mac, unsigned short *sid) { memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); networkAddr[0] = NAT25_PPPOE; - memcpy(networkAddr+1, (unsigned char *)sid, 2); - memcpy(networkAddr+3, (unsigned char *)ac_mac, 6); + memcpy(networkAddr + 1, (unsigned char *)sid, 2); + memcpy(networkAddr + 3, (unsigned char *)ac_mac, 6); } #ifdef CL_IPV6_PASS static void __nat25_generate_ipv6_network_addr(unsigned char *networkAddr, - unsigned int *ipAddr) + unsigned int *ipAddr) { memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); networkAddr[0] = NAT25_IPV6; - memcpy(networkAddr+1, (unsigned char *)ipAddr, 16); + memcpy(networkAddr + 1, (unsigned char *)ipAddr, 16); } static unsigned char *scan_tlv(unsigned char *data, int len, unsigned char tag, unsigned char len8b) { while (len > 0) { - if (*data == tag && *(data+1) == len8b && len >= len8b*8) - return data+2; - - len -= (*(data+1))*8; - data += (*(data+1))*8; + if (*data == tag && *(data + 1) == len8b && len >= len8b * 8) + return data + 2; + + len -= (*(data + 1)) * 8; + data += (*(data + 1)) * 8; } return NULL; } @@ -246,119 +246,108 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char { struct icmp6hdr *icmphdr = (struct icmp6hdr *)data; unsigned char *mac; - - if (icmphdr->icmp6_type == NDISC_ROUTER_SOLICITATION) { + + if (icmphdr->icmp6_type == NDISC_ROUTER_SOLICITATION) { if (len >= 8) { - mac = scan_tlv(&data[8], len-8, 1, 1); + mac = scan_tlv(&data[8], len - 8, 1, 1); if (mac) { - DBG_871X("Router Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", - mac[0],mac[1],mac[2],mac[3],mac[4],mac[5], - replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]); - memcpy(mac, replace_mac, 6); - return 1; + RTW_INFO("Router Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], + replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); + memcpy(mac, replace_mac, 6); + return 1; + } + } + } else if (icmphdr->icmp6_type == NDISC_ROUTER_ADVERTISEMENT) { + if (len >= 16) { + mac = scan_tlv(&data[16], len - 16, 1, 1); + if (mac) { + RTW_INFO("Router Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], + replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); + memcpy(mac, replace_mac, 6); + return 1; + } + } + } else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_SOLICITATION) { + if (len >= 24) { + mac = scan_tlv(&data[24], len - 24, 1, 1); + if (mac) { + RTW_INFO("Neighbor Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], + replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); + memcpy(mac, replace_mac, 6); + return 1; + } + } + } else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_ADVERTISEMENT) { + if (len >= 24) { + mac = scan_tlv(&data[24], len - 24, 2, 1); + if (mac) { + RTW_INFO("Neighbor Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], + replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); + memcpy(mac, replace_mac, 6); + return 1; + } + } + } else if (icmphdr->icmp6_type == NDISC_REDIRECT) { + if (len >= 40) { + mac = scan_tlv(&data[40], len - 40, 2, 1); + if (mac) { + RTW_INFO("Redirect, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], + replace_mac[0], replace_mac[1], replace_mac[2], replace_mac[3], replace_mac[4], replace_mac[5]); + memcpy(mac, replace_mac, 6); + return 1; } } } - else if (icmphdr->icmp6_type == NDISC_ROUTER_ADVERTISEMENT) { - if (len >= 16) { - mac = scan_tlv(&data[16], len-16, 1, 1); - if (mac) { - DBG_871X("Router Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", - mac[0],mac[1],mac[2],mac[3],mac[4],mac[5], - replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]); - memcpy(mac, replace_mac, 6); - return 1; - } - } - } - else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_SOLICITATION) { - if (len >= 24) { - mac = scan_tlv(&data[24], len-24, 1, 1); - if (mac) { - DBG_871X("Neighbor Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", - mac[0],mac[1],mac[2],mac[3],mac[4],mac[5], - replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]); - memcpy(mac, replace_mac, 6); - return 1; - } - } - } - else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_ADVERTISEMENT) { - if (len >= 24) { - mac = scan_tlv(&data[24], len-24, 2, 1); - if (mac) { - DBG_871X("Neighbor Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", - mac[0],mac[1],mac[2],mac[3],mac[4],mac[5], - replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]); - memcpy(mac, replace_mac, 6); - return 1; - } - } - } - else if (icmphdr->icmp6_type == NDISC_REDIRECT) { - if (len >= 40) { - mac = scan_tlv(&data[40], len-40, 2, 1); - if (mac) { - DBG_871X("Redirect, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n", - mac[0],mac[1],mac[2],mac[3],mac[4],mac[5], - replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]); - memcpy(mac, replace_mac, 6); - return 1; - } - } - } return 0; } static void convert_ipv6_mac_to_mc(struct sk_buff *skb) -{ +{ struct ipv6hdr *iph = (struct ipv6hdr *)(skb->data + ETH_HLEN); unsigned char *dst_mac = skb->data; - //dst_mac[0] = 0xff; - //dst_mac[1] = 0xff; + /* dst_mac[0] = 0xff; */ + /* dst_mac[1] = 0xff; */ /*modified by qinjunjie,ipv6 multicast address ix 0x33-33-xx-xx-xx-xx*/ dst_mac[0] = 0x33; dst_mac[1] = 0x33; memcpy(&dst_mac[2], &iph->daddr.s6_addr32[3], 4); - #if defined(__LINUX_2_6__) +#if defined(__LINUX_2_6__) /*modified by qinjunjie,warning:should not remove next line*/ skb->pkt_type = PACKET_MULTICAST; - #endif +#endif } #endif /* CL_IPV6_PASS */ static __inline__ int __nat25_network_hash(unsigned char *networkAddr) { - if(networkAddr[0] == NAT25_IPV4) - { + if (networkAddr[0] == NAT25_IPV4) { unsigned long x; x = networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; return x & (NAT25_HASH_SIZE - 1); - } - else if(networkAddr[0] == NAT25_IPX) - { + } else if (networkAddr[0] == NAT25_IPX) { unsigned long x; x = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^ - networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; + networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10]; return x & (NAT25_HASH_SIZE - 1); - } - else if(networkAddr[0] == NAT25_APPLE) - { + } else if (networkAddr[0] == NAT25_APPLE) { unsigned long x; x = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3]; return x & (NAT25_HASH_SIZE - 1); - } - else if(networkAddr[0] == NAT25_PPPOE) - { + } else if (networkAddr[0] == NAT25_PPPOE) { unsigned long x; x = networkAddr[0] ^ networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^ networkAddr[6] ^ networkAddr[7] ^ networkAddr[8]; @@ -366,24 +355,22 @@ static __inline__ int __nat25_network_hash(unsigned char *networkAddr) return x & (NAT25_HASH_SIZE - 1); } #ifdef CL_IPV6_PASS - else if(networkAddr[0] == NAT25_IPV6) - { + else if (networkAddr[0] == NAT25_IPV6) { unsigned long x; x = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^ - networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10] ^ - networkAddr[11] ^ networkAddr[12] ^ networkAddr[13] ^ networkAddr[14] ^ networkAddr[15] ^ - networkAddr[16]; - + networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10] ^ + networkAddr[11] ^ networkAddr[12] ^ networkAddr[13] ^ networkAddr[14] ^ networkAddr[15] ^ + networkAddr[16]; + return x & (NAT25_HASH_SIZE - 1); } -#endif - else - { +#endif + else { unsigned long x = 0; int i; - for (i=0; ibr_ext_lock, &irqL); + /* Caller must _enter_critical_bh already! */ + /* _irqL irqL; */ + /* _enter_critical_bh(&priv->br_ext_lock, &irqL); */ ent->next_hash = priv->nethash[hash]; - if(ent->next_hash != NULL) + if (ent->next_hash != NULL) ent->next_hash->pprev_hash = &ent->next_hash; priv->nethash[hash] = ent; ent->pprev_hash = &priv->nethash[hash]; - //_exit_critical_bh(&priv->br_ext_lock, &irqL); + /* _exit_critical_bh(&priv->br_ext_lock, &irqL); */ } static __inline__ void __network_hash_unlink(struct nat25_network_db_entry *ent) { - // Caller must _enter_critical_bh already! - //_irqL irqL; - //_enter_critical_bh(&priv->br_ext_lock, &irqL); + /* Caller must _enter_critical_bh already! */ + /* _irqL irqL; */ + /* _enter_critical_bh(&priv->br_ext_lock, &irqL); */ *(ent->pprev_hash) = ent->next_hash; - if(ent->next_hash != NULL) + if (ent->next_hash != NULL) ent->next_hash->pprev_hash = ent->pprev_hash; ent->next_hash = NULL; ent->pprev_hash = NULL; - //_exit_critical_bh(&priv->br_ext_lock, &irqL); + /* _exit_critical_bh(&priv->br_ext_lock, &irqL); */ } static int __nat25_db_network_lookup_and_replace(_adapter *priv, - struct sk_buff *skb, unsigned char *networkAddr) + struct sk_buff *skb, unsigned char *networkAddr) { struct nat25_network_db_entry *db; _irqL irqL; _enter_critical_bh(&priv->br_ext_lock, &irqL); db = priv->nethash[__nat25_network_hash(networkAddr)]; - while (db != NULL) - { - if(!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) - { - if(!__nat25_has_expired(priv, db)) - { - // replace the destination mac address + while (db != NULL) { + if (!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) { + if (!__nat25_has_expired(priv, db)) { + /* replace the destination mac address */ memcpy(skb->data, db->macAddr, ETH_ALEN); atomic_inc(&db->use_count); #ifdef CL_IPV6_PASS - DBG_871X("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" - "%02x%02x%02x%02x%02x%02x\n", - db->macAddr[0], - db->macAddr[1], - db->macAddr[2], - db->macAddr[3], - db->macAddr[4], - db->macAddr[5], - db->networkAddr[0], - db->networkAddr[1], - db->networkAddr[2], - db->networkAddr[3], - db->networkAddr[4], - db->networkAddr[5], - db->networkAddr[6], - db->networkAddr[7], - db->networkAddr[8], - db->networkAddr[9], - db->networkAddr[10], - db->networkAddr[11], - db->networkAddr[12], - db->networkAddr[13], - db->networkAddr[14], - db->networkAddr[15], - db->networkAddr[16]); -#else - DBG_871X("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", - db->macAddr[0], - db->macAddr[1], - db->macAddr[2], - db->macAddr[3], - db->macAddr[4], - db->macAddr[5], - db->networkAddr[0], - db->networkAddr[1], - db->networkAddr[2], - db->networkAddr[3], - db->networkAddr[4], - db->networkAddr[5], - db->networkAddr[6], - db->networkAddr[7], - db->networkAddr[8], - db->networkAddr[9], - db->networkAddr[10]); + RTW_INFO("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" + "%02x%02x%02x%02x%02x%02x\n", + db->macAddr[0], + db->macAddr[1], + db->macAddr[2], + db->macAddr[3], + db->macAddr[4], + db->macAddr[5], + db->networkAddr[0], + db->networkAddr[1], + db->networkAddr[2], + db->networkAddr[3], + db->networkAddr[4], + db->networkAddr[5], + db->networkAddr[6], + db->networkAddr[7], + db->networkAddr[8], + db->networkAddr[9], + db->networkAddr[10], + db->networkAddr[11], + db->networkAddr[12], + db->networkAddr[13], + db->networkAddr[14], + db->networkAddr[15], + db->networkAddr[16]); +#else + RTW_INFO("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", + db->macAddr[0], + db->macAddr[1], + db->macAddr[2], + db->macAddr[3], + db->macAddr[4], + db->macAddr[5], + db->networkAddr[0], + db->networkAddr[1], + db->networkAddr[2], + db->networkAddr[3], + db->networkAddr[4], + db->networkAddr[5], + db->networkAddr[6], + db->networkAddr[7], + db->networkAddr[8], + db->networkAddr[9], + db->networkAddr[10]); #endif } _exit_critical_bh(&priv->br_ext_lock, &irqL); @@ -502,7 +486,7 @@ static int __nat25_db_network_lookup_and_replace(_adapter *priv, static void __nat25_db_network_insert(_adapter *priv, - unsigned char *macAddr, unsigned char *networkAddr) + unsigned char *macAddr, unsigned char *networkAddr) { struct nat25_network_db_entry *db; int hash; @@ -511,10 +495,8 @@ static void __nat25_db_network_insert(_adapter *priv, hash = __nat25_network_hash(networkAddr); db = priv->nethash[hash]; - while (db != NULL) - { - if(!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) - { + while (db != NULL) { + if (!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) { memcpy(db->macAddr, macAddr, ETH_ALEN); db->ageing_timer = jiffies; _exit_critical_bh(&priv->br_ext_lock, &irqL); @@ -525,7 +507,7 @@ static void __nat25_db_network_insert(_adapter *priv, } db = (struct nat25_network_db_entry *) rtw_malloc(sizeof(*db)); - if(db == NULL) { + if (db == NULL) { _exit_critical_bh(&priv->br_ext_lock, &irqL); return; } @@ -552,66 +534,64 @@ static void __nat25_db_print(_adapter *priv) struct nat25_network_db_entry *db; counter++; - if((counter % 16) != 0) + if ((counter % 16) != 0) return; - for(i=0, j=0; inethash[i]; - while (db != NULL) - { + while (db != NULL) { #ifdef CL_IPV6_PASS panic_printk("NAT25: DB(%d) H(%02d) C(%d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" - "%02x%02x%02x%02x%02x%02x\n", - j, - i, - atomic_read(&db->use_count), - db->macAddr[0], - db->macAddr[1], - db->macAddr[2], - db->macAddr[3], - db->macAddr[4], - db->macAddr[5], - db->networkAddr[0], - db->networkAddr[1], - db->networkAddr[2], - db->networkAddr[3], - db->networkAddr[4], - db->networkAddr[5], - db->networkAddr[6], - db->networkAddr[7], - db->networkAddr[8], - db->networkAddr[9], - db->networkAddr[10], - db->networkAddr[11], - db->networkAddr[12], - db->networkAddr[13], - db->networkAddr[14], - db->networkAddr[15], - db->networkAddr[16]); + "%02x%02x%02x%02x%02x%02x\n", + j, + i, + atomic_read(&db->use_count), + db->macAddr[0], + db->macAddr[1], + db->macAddr[2], + db->macAddr[3], + db->macAddr[4], + db->macAddr[5], + db->networkAddr[0], + db->networkAddr[1], + db->networkAddr[2], + db->networkAddr[3], + db->networkAddr[4], + db->networkAddr[5], + db->networkAddr[6], + db->networkAddr[7], + db->networkAddr[8], + db->networkAddr[9], + db->networkAddr[10], + db->networkAddr[11], + db->networkAddr[12], + db->networkAddr[13], + db->networkAddr[14], + db->networkAddr[15], + db->networkAddr[16]); #else panic_printk("NAT25: DB(%d) H(%02d) C(%d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", - j, - i, - atomic_read(&db->use_count), - db->macAddr[0], - db->macAddr[1], - db->macAddr[2], - db->macAddr[3], - db->macAddr[4], - db->macAddr[5], - db->networkAddr[0], - db->networkAddr[1], - db->networkAddr[2], - db->networkAddr[3], - db->networkAddr[4], - db->networkAddr[5], - db->networkAddr[6], - db->networkAddr[7], - db->networkAddr[8], - db->networkAddr[9], - db->networkAddr[10]); + j, + i, + atomic_read(&db->use_count), + db->macAddr[0], + db->macAddr[1], + db->macAddr[2], + db->macAddr[3], + db->macAddr[4], + db->macAddr[5], + db->networkAddr[0], + db->networkAddr[1], + db->networkAddr[2], + db->networkAddr[3], + db->networkAddr[4], + db->networkAddr[5], + db->networkAddr[6], + db->networkAddr[7], + db->networkAddr[8], + db->networkAddr[9], + db->networkAddr[10]); #endif j++; @@ -635,17 +615,15 @@ void nat25_db_cleanup(_adapter *priv) int i; _irqL irqL; _enter_critical_bh(&priv->br_ext_lock, &irqL); - - for(i=0; inethash[i]; while (f != NULL) { struct nat25_network_db_entry *g; g = f->next_hash; - if(priv->scdb_entry == f) - { + if (priv->scdb_entry == f) { memset(priv->scdb_mac, 0, ETH_ALEN); memset(priv->scdb_ip, 0, 4); priv->scdb_entry = NULL; @@ -666,76 +644,71 @@ void nat25_db_expire(_adapter *priv) int i; _irqL irqL; _enter_critical_bh(&priv->br_ext_lock, &irqL); - - //if(!priv->ethBrExtInfo.nat25_disable) + + /* if(!priv->ethBrExtInfo.nat25_disable) */ { - for (i=0; inethash[i]; - while (f != NULL) - { + while (f != NULL) { struct nat25_network_db_entry *g; g = f->next_hash; - if(__nat25_has_expired(priv, f)) - { - if(atomic_dec_and_test(&f->use_count)) - { + if (__nat25_has_expired(priv, f)) { + if (atomic_dec_and_test(&f->use_count)) { #ifdef BR_EXT_DEBUG #ifdef CL_IPV6_PASS panic_printk("NAT25 Expire H(%02d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" - "%02x%02x%02x%02x%02x%02x\n", - i, - f->macAddr[0], - f->macAddr[1], - f->macAddr[2], - f->macAddr[3], - f->macAddr[4], - f->macAddr[5], - f->networkAddr[0], - f->networkAddr[1], - f->networkAddr[2], - f->networkAddr[3], - f->networkAddr[4], - f->networkAddr[5], - f->networkAddr[6], - f->networkAddr[7], - f->networkAddr[8], - f->networkAddr[9], - f->networkAddr[10], - f->networkAddr[11], - f->networkAddr[12], - f->networkAddr[13], - f->networkAddr[14], - f->networkAddr[15], + "%02x%02x%02x%02x%02x%02x\n", + i, + f->macAddr[0], + f->macAddr[1], + f->macAddr[2], + f->macAddr[3], + f->macAddr[4], + f->macAddr[5], + f->networkAddr[0], + f->networkAddr[1], + f->networkAddr[2], + f->networkAddr[3], + f->networkAddr[4], + f->networkAddr[5], + f->networkAddr[6], + f->networkAddr[7], + f->networkAddr[8], + f->networkAddr[9], + f->networkAddr[10], + f->networkAddr[11], + f->networkAddr[12], + f->networkAddr[13], + f->networkAddr[14], + f->networkAddr[15], f->networkAddr[16]); #else panic_printk("NAT25 Expire H(%02d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", - i, - f->macAddr[0], - f->macAddr[1], - f->macAddr[2], - f->macAddr[3], - f->macAddr[4], - f->macAddr[5], - f->networkAddr[0], - f->networkAddr[1], - f->networkAddr[2], - f->networkAddr[3], - f->networkAddr[4], - f->networkAddr[5], - f->networkAddr[6], - f->networkAddr[7], - f->networkAddr[8], - f->networkAddr[9], + i, + f->macAddr[0], + f->macAddr[1], + f->macAddr[2], + f->macAddr[3], + f->macAddr[4], + f->macAddr[5], + f->networkAddr[0], + f->networkAddr[1], + f->networkAddr[2], + f->networkAddr[3], + f->networkAddr[4], + f->networkAddr[5], + f->networkAddr[6], + f->networkAddr[7], + f->networkAddr[8], + f->networkAddr[9], f->networkAddr[10]); #endif #endif - if(priv->scdb_entry == f) - { + if (priv->scdb_entry == f) { memset(priv->scdb_mac, 0, ETH_ALEN); memset(priv->scdb_ip, 0, 4); priv->scdb_entry = NULL; @@ -771,8 +744,8 @@ static int checkIPMcAndReplace(_adapter *priv, struct sk_buff *skb, unsigned int if (pstat->ipmc_num == 0) continue; - for (i=0; iipmc[i].used && !memcmp(&pstat->ipmc[i].mcmac[3], ((unsigned char *)dst_ip)+1, 3)) { + for (i = 0; i < MAX_IP_MC_ENTRY; i++) { + if (pstat->ipmc[i].used && !memcmp(&pstat->ipmc[i].mcmac[3], ((unsigned char *)dst_ip) + 1, 3)) { memcpy(skb->data, pstat->ipmc[i].mcmac, ETH_ALEN); return 1; } @@ -787,405 +760,354 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method) unsigned short protocol; unsigned char networkAddr[MAX_NETWORK_ADDR_LEN]; - if(skb == NULL) + if (skb == NULL) return -1; - if((method <= NAT25_MIN) || (method >= NAT25_MAX)) + if ((method <= NAT25_MIN) || (method >= NAT25_MAX)) return -1; protocol = *((unsigned short *)(skb->data + 2 * ETH_ALEN)); /*---------------------------------------------------*/ - /* Handle IP frame */ + /* Handle IP frame */ /*---------------------------------------------------*/ - if(protocol == __constant_htons(ETH_P_IP)) - { - struct iphdr* iph = (struct iphdr *)(skb->data + ETH_HLEN); + if (protocol == __constant_htons(ETH_P_IP)) { + struct iphdr *iph = (struct iphdr *)(skb->data + ETH_HLEN); - if(((unsigned char*)(iph) + (iph->ihl<<2)) >= (skb->data + ETH_HLEN + skb->len)) - { + if (((unsigned char *)(iph) + (iph->ihl << 2)) >= (skb->data + ETH_HLEN + skb->len)) { DEBUG_WARN("NAT25: malformed IP packet !\n"); return -1; } - switch(method) - { - case NAT25_CHECK: - return -1; + switch (method) { + case NAT25_CHECK: + return -1; - case NAT25_INSERT: - { - //some muticast with source IP is all zero, maybe other case is illegal - //in class A, B, C, host address is all zero or all one is illegal - if (iph->saddr == 0) - return 0; - DBG_871X("NAT25: Insert IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr); - __nat25_generate_ipv4_network_addr(networkAddr, &iph->saddr); - //record source IP address and , source mac address into db - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); - - __nat25_db_print(priv); - } + case NAT25_INSERT: { + /* some muticast with source IP is all zero, maybe other case is illegal */ + /* in class A, B, C, host address is all zero or all one is illegal */ + if (iph->saddr == 0) return 0; + RTW_INFO("NAT25: Insert IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr); + __nat25_generate_ipv4_network_addr(networkAddr, &iph->saddr); + /* record source IP address and , source mac address into db */ + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); - case NAT25_LOOKUP: - { - DBG_871X("NAT25: Lookup IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr); + __nat25_db_print(priv); + } + return 0; + + case NAT25_LOOKUP: { + RTW_INFO("NAT25: Lookup IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr); #ifdef SUPPORT_TX_MCAST2UNI - if (priv->pshare->rf_ft_var.mc2u_disable || - ((((OPMODE & (WIFI_STATION_STATE|WIFI_ASOC_STATE)) - == (WIFI_STATION_STATE|WIFI_ASOC_STATE)) && - !checkIPMcAndReplace(priv, skb, &iph->daddr)) || - (OPMODE & WIFI_ADHOC_STATE))) + if (priv->pshare->rf_ft_var.mc2u_disable || + ((((OPMODE & (WIFI_STATION_STATE | WIFI_ASOC_STATE)) + == (WIFI_STATION_STATE | WIFI_ASOC_STATE)) && + !checkIPMcAndReplace(priv, skb, &iph->daddr)) || + (OPMODE & WIFI_ADHOC_STATE))) #endif - { - __nat25_generate_ipv4_network_addr(networkAddr, &iph->daddr); + { + __nat25_generate_ipv4_network_addr(networkAddr, &iph->daddr); - if (!__nat25_db_network_lookup_and_replace(priv, skb, networkAddr)) { - if (*((unsigned char *)&iph->daddr + 3) == 0xff) { - // L2 is unicast but L3 is broadcast, make L2 bacome broadcast - DBG_871X("NAT25: Set DA as boardcast\n"); - memset(skb->data, 0xff, ETH_ALEN); - } - else { - // forward unknow IP packet to upper TCP/IP - DBG_871X("NAT25: Replace DA with BR's MAC\n"); - if ( (*(u32 *)priv->br_mac) == 0 && (*(u16 *)(priv->br_mac+4)) == 0 ) { - void netdev_br_init(struct net_device *netdev); - printk("Re-init netdev_br_init() due to br_mac==0!\n"); - netdev_br_init(priv->pnetdev); - } - memcpy(skb->data, priv->br_mac, ETH_ALEN); - } + if (!__nat25_db_network_lookup_and_replace(priv, skb, networkAddr)) { + if (*((unsigned char *)&iph->daddr + 3) == 0xff) { + /* L2 is unicast but L3 is broadcast, make L2 bacome broadcast */ + RTW_INFO("NAT25: Set DA as boardcast\n"); + memset(skb->data, 0xff, ETH_ALEN); + } else { + /* forward unknow IP packet to upper TCP/IP */ + RTW_INFO("NAT25: Replace DA with BR's MAC\n"); + if ((*(u32 *)priv->br_mac) == 0 && (*(u16 *)(priv->br_mac + 4)) == 0) { + void netdev_br_init(struct net_device *netdev); + printk("Re-init netdev_br_init() due to br_mac==0!\n"); + netdev_br_init(priv->pnetdev); } + memcpy(skb->data, priv->br_mac, ETH_ALEN); } } - return 0; + } + } + return 0; - default: - return -1; + default: + return -1; } } /*---------------------------------------------------*/ - /* Handle ARP frame */ + /* Handle ARP frame */ /*---------------------------------------------------*/ - else if(protocol == __constant_htons(ETH_P_ARP)) - { + else if (protocol == __constant_htons(ETH_P_ARP)) { struct arphdr *arp = (struct arphdr *)(skb->data + ETH_HLEN); unsigned char *arp_ptr = (unsigned char *)(arp + 1); unsigned int *sender, *target; - if(arp->ar_pro != __constant_htons(ETH_P_IP)) - { + if (arp->ar_pro != __constant_htons(ETH_P_IP)) { DEBUG_WARN("NAT25: arp protocol unknown (%4x)!\n", htons(arp->ar_pro)); return -1; } - switch(method) - { - case NAT25_CHECK: - return 0; // skb_copy for all ARP frame + switch (method) { + case NAT25_CHECK: + return 0; /* skb_copy for all ARP frame */ - case NAT25_INSERT: - { - DBG_871X("NAT25: Insert ARP, MAC=%02x%02x%02x%02x%02x%02x\n", arp_ptr[0], - arp_ptr[1], arp_ptr[2], arp_ptr[3], arp_ptr[4], arp_ptr[5]); + case NAT25_INSERT: { + RTW_INFO("NAT25: Insert ARP, MAC=%02x%02x%02x%02x%02x%02x\n", arp_ptr[0], + arp_ptr[1], arp_ptr[2], arp_ptr[3], arp_ptr[4], arp_ptr[5]); - // change to ARP sender mac address to wlan STA address - memcpy(arp_ptr, GET_MY_HWADDR(priv), ETH_ALEN); + /* change to ARP sender mac address to wlan STA address */ + memcpy(arp_ptr, GET_MY_HWADDR(priv), ETH_ALEN); - arp_ptr += arp->ar_hln; - sender = (unsigned int *)arp_ptr; + arp_ptr += arp->ar_hln; + sender = (unsigned int *)arp_ptr; - __nat25_generate_ipv4_network_addr(networkAddr, sender); + __nat25_generate_ipv4_network_addr(networkAddr, sender); - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); - __nat25_db_print(priv); - } - return 0; + __nat25_db_print(priv); + } + return 0; - case NAT25_LOOKUP: - { - DBG_871X("NAT25: Lookup ARP\n"); + case NAT25_LOOKUP: { + RTW_INFO("NAT25: Lookup ARP\n"); - arp_ptr += arp->ar_hln; - sender = (unsigned int *)arp_ptr; - arp_ptr += (arp->ar_hln + arp->ar_pln); - target = (unsigned int *)arp_ptr; + arp_ptr += arp->ar_hln; + sender = (unsigned int *)arp_ptr; + arp_ptr += (arp->ar_hln + arp->ar_pln); + target = (unsigned int *)arp_ptr; - __nat25_generate_ipv4_network_addr(networkAddr, target); + __nat25_generate_ipv4_network_addr(networkAddr, target); - __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); - // change to ARP target mac address to Lookup result - arp_ptr = (unsigned char *)(arp + 1); - arp_ptr += (arp->ar_hln + arp->ar_pln); - memcpy(arp_ptr, skb->data, ETH_ALEN); - } - return 0; + /* change to ARP target mac address to Lookup result */ + arp_ptr = (unsigned char *)(arp + 1); + arp_ptr += (arp->ar_hln + arp->ar_pln); + memcpy(arp_ptr, skb->data, ETH_ALEN); + } + return 0; - default: - return -1; + default: + return -1; } } /*---------------------------------------------------*/ - /* Handle IPX and Apple Talk frame */ + /* Handle IPX and Apple Talk frame */ /*---------------------------------------------------*/ - else if((protocol == __constant_htons(ETH_P_IPX)) || - (protocol == __constant_htons(ETH_P_ATALK)) || - (protocol == __constant_htons(ETH_P_AARP))) - { + else if ((protocol == __constant_htons(ETH_P_IPX)) || + (protocol == __constant_htons(ETH_P_ATALK)) || + (protocol == __constant_htons(ETH_P_AARP))) { unsigned char ipx_header[2] = {0xFF, 0xFF}; struct ipxhdr *ipx = NULL; struct elapaarp *ea = NULL; struct ddpehdr *ddp = NULL; unsigned char *framePtr = skb->data + ETH_HLEN; - if(protocol == __constant_htons(ETH_P_IPX)) - { - DBG_871X("NAT25: Protocol=IPX (Ethernet II)\n"); + if (protocol == __constant_htons(ETH_P_IPX)) { + RTW_INFO("NAT25: Protocol=IPX (Ethernet II)\n"); ipx = (struct ipxhdr *)framePtr; - } - else //if(protocol <= __constant_htons(ETH_FRAME_LEN)) - { - if(!memcmp(ipx_header, framePtr, 2)) - { - DBG_871X("NAT25: Protocol=IPX (Ethernet 802.3)\n"); + } else { /* if(protocol <= __constant_htons(ETH_FRAME_LEN)) */ + if (!memcmp(ipx_header, framePtr, 2)) { + RTW_INFO("NAT25: Protocol=IPX (Ethernet 802.3)\n"); ipx = (struct ipxhdr *)framePtr; - } - else - { + } else { unsigned char ipx_8022_type = 0xE0; unsigned char snap_8022_type = 0xAA; - if(*framePtr == snap_8022_type) - { - unsigned char ipx_snap_id[5] = {0x0, 0x0, 0x0, 0x81, 0x37}; // IPX SNAP ID - unsigned char aarp_snap_id[5] = {0x00, 0x00, 0x00, 0x80, 0xF3}; // Apple Talk AARP SNAP ID - unsigned char ddp_snap_id[5] = {0x08, 0x00, 0x07, 0x80, 0x9B}; // Apple Talk DDP SNAP ID + if (*framePtr == snap_8022_type) { + unsigned char ipx_snap_id[5] = {0x0, 0x0, 0x0, 0x81, 0x37}; /* IPX SNAP ID */ + unsigned char aarp_snap_id[5] = {0x00, 0x00, 0x00, 0x80, 0xF3}; /* Apple Talk AARP SNAP ID */ + unsigned char ddp_snap_id[5] = {0x08, 0x00, 0x07, 0x80, 0x9B}; /* Apple Talk DDP SNAP ID */ - framePtr += 3; // eliminate the 802.2 header + framePtr += 3; /* eliminate the 802.2 header */ - if(!memcmp(ipx_snap_id, framePtr, 5)) - { - framePtr += 5; // eliminate the SNAP header + if (!memcmp(ipx_snap_id, framePtr, 5)) { + framePtr += 5; /* eliminate the SNAP header */ - DBG_871X("NAT25: Protocol=IPX (Ethernet SNAP)\n"); + RTW_INFO("NAT25: Protocol=IPX (Ethernet SNAP)\n"); ipx = (struct ipxhdr *)framePtr; - } - else if(!memcmp(aarp_snap_id, framePtr, 5)) - { - framePtr += 5; // eliminate the SNAP header + } else if (!memcmp(aarp_snap_id, framePtr, 5)) { + framePtr += 5; /* eliminate the SNAP header */ ea = (struct elapaarp *)framePtr; - } - else if(!memcmp(ddp_snap_id, framePtr, 5)) - { - framePtr += 5; // eliminate the SNAP header + } else if (!memcmp(ddp_snap_id, framePtr, 5)) { + framePtr += 5; /* eliminate the SNAP header */ ddp = (struct ddpehdr *)framePtr; - } - else - { + } else { DEBUG_WARN("NAT25: Protocol=Ethernet SNAP %02x%02x%02x%02x%02x\n", framePtr[0], framePtr[1], framePtr[2], framePtr[3], framePtr[4]); return -1; } - } - else if(*framePtr == ipx_8022_type) - { - framePtr += 3; // eliminate the 802.2 header + } else if (*framePtr == ipx_8022_type) { + framePtr += 3; /* eliminate the 802.2 header */ - if(!memcmp(ipx_header, framePtr, 2)) - { - DBG_871X("NAT25: Protocol=IPX (Ethernet 802.2)\n"); + if (!memcmp(ipx_header, framePtr, 2)) { + RTW_INFO("NAT25: Protocol=IPX (Ethernet 802.2)\n"); ipx = (struct ipxhdr *)framePtr; - } - else + } else return -1; } } } - /* IPX */ - if(ipx != NULL) - { - switch(method) - { - case NAT25_CHECK: - if(!memcmp(skb->data+ETH_ALEN, ipx->ipx_source.node, ETH_ALEN)) - { - DBG_871X("NAT25: Check IPX skb_copy\n"); - return 0; - } - return -1; - - case NAT25_INSERT: - { - DBG_871X("NAT25: Insert IPX, Dest=%08x,%02x%02x%02x%02x%02x%02x,%04x Source=%08x,%02x%02x%02x%02x%02x%02x,%04x\n", - ipx->ipx_dest.net, - ipx->ipx_dest.node[0], - ipx->ipx_dest.node[1], - ipx->ipx_dest.node[2], - ipx->ipx_dest.node[3], - ipx->ipx_dest.node[4], - ipx->ipx_dest.node[5], - ipx->ipx_dest.sock, - ipx->ipx_source.net, - ipx->ipx_source.node[0], - ipx->ipx_source.node[1], - ipx->ipx_source.node[2], - ipx->ipx_source.node[3], - ipx->ipx_source.node[4], - ipx->ipx_source.node[5], - ipx->ipx_source.sock); - - if(!memcmp(skb->data+ETH_ALEN, ipx->ipx_source.node, ETH_ALEN)) - { - DBG_871X("NAT25: Use IPX Net, and Socket as network addr\n"); - - __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_source.net, &ipx->ipx_source.sock); - - // change IPX source node addr to wlan STA address - memcpy(ipx->ipx_source.node, GET_MY_HWADDR(priv), ETH_ALEN); - } - else - { - __nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_source.net, ipx->ipx_source.node); - } - - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); - - __nat25_db_print(priv); - } + /* IPX */ + if (ipx != NULL) { + switch (method) { + case NAT25_CHECK: + if (!memcmp(skb->data + ETH_ALEN, ipx->ipx_source.node, ETH_ALEN)) { + RTW_INFO("NAT25: Check IPX skb_copy\n"); return 0; + } + return -1; - case NAT25_LOOKUP: - { - if(!memcmp(GET_MY_HWADDR(priv), ipx->ipx_dest.node, ETH_ALEN)) - { - DBG_871X("NAT25: Lookup IPX, Modify Destination IPX Node addr\n"); + case NAT25_INSERT: { + RTW_INFO("NAT25: Insert IPX, Dest=%08x,%02x%02x%02x%02x%02x%02x,%04x Source=%08x,%02x%02x%02x%02x%02x%02x,%04x\n", + ipx->ipx_dest.net, + ipx->ipx_dest.node[0], + ipx->ipx_dest.node[1], + ipx->ipx_dest.node[2], + ipx->ipx_dest.node[3], + ipx->ipx_dest.node[4], + ipx->ipx_dest.node[5], + ipx->ipx_dest.sock, + ipx->ipx_source.net, + ipx->ipx_source.node[0], + ipx->ipx_source.node[1], + ipx->ipx_source.node[2], + ipx->ipx_source.node[3], + ipx->ipx_source.node[4], + ipx->ipx_source.node[5], + ipx->ipx_source.sock); - __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_dest.net, &ipx->ipx_dest.sock); + if (!memcmp(skb->data + ETH_ALEN, ipx->ipx_source.node, ETH_ALEN)) { + RTW_INFO("NAT25: Use IPX Net, and Socket as network addr\n"); - __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); + __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_source.net, &ipx->ipx_source.sock); - // replace IPX destination node addr with Lookup destination MAC addr - memcpy(ipx->ipx_dest.node, skb->data, ETH_ALEN); - } - else - { - __nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_dest.net, ipx->ipx_dest.node); + /* change IPX source node addr to wlan STA address */ + memcpy(ipx->ipx_source.node, GET_MY_HWADDR(priv), ETH_ALEN); + } else + __nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_source.net, ipx->ipx_source.node); - __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); - } - } - return 0; + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); - default: - return -1; + __nat25_db_print(priv); + } + return 0; + + case NAT25_LOOKUP: { + if (!memcmp(GET_MY_HWADDR(priv), ipx->ipx_dest.node, ETH_ALEN)) { + RTW_INFO("NAT25: Lookup IPX, Modify Destination IPX Node addr\n"); + + __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_dest.net, &ipx->ipx_dest.sock); + + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); + + /* replace IPX destination node addr with Lookup destination MAC addr */ + memcpy(ipx->ipx_dest.node, skb->data, ETH_ALEN); + } else { + __nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_dest.net, ipx->ipx_dest.node); + + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); + } + } + return 0; + + default: + return -1; } } - /* AARP */ - else if(ea != NULL) - { + /* AARP */ + else if (ea != NULL) { /* Sanity check fields. */ - if(ea->hw_len != ETH_ALEN || ea->pa_len != AARP_PA_ALEN) - { + if (ea->hw_len != ETH_ALEN || ea->pa_len != AARP_PA_ALEN) { DEBUG_WARN("NAT25: Appletalk AARP Sanity check fail!\n"); return -1; } - switch(method) - { - case NAT25_CHECK: - return 0; + switch (method) { + case NAT25_CHECK: + return 0; - case NAT25_INSERT: - { - // change to AARP source mac address to wlan STA address - memcpy(ea->hw_src, GET_MY_HWADDR(priv), ETH_ALEN); + case NAT25_INSERT: { + /* change to AARP source mac address to wlan STA address */ + memcpy(ea->hw_src, GET_MY_HWADDR(priv), ETH_ALEN); - DBG_871X("NAT25: Insert AARP, Source=%d,%d Destination=%d,%d\n", - ea->pa_src_net, - ea->pa_src_node, - ea->pa_dst_net, - ea->pa_dst_node); + RTW_INFO("NAT25: Insert AARP, Source=%d,%d Destination=%d,%d\n", + ea->pa_src_net, + ea->pa_src_node, + ea->pa_dst_net, + ea->pa_dst_node); - __nat25_generate_apple_network_addr(networkAddr, &ea->pa_src_net, &ea->pa_src_node); + __nat25_generate_apple_network_addr(networkAddr, &ea->pa_src_net, &ea->pa_src_node); - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); - __nat25_db_print(priv); - } - return 0; + __nat25_db_print(priv); + } + return 0; - case NAT25_LOOKUP: - { - DBG_871X("NAT25: Lookup AARP, Source=%d,%d Destination=%d,%d\n", - ea->pa_src_net, - ea->pa_src_node, - ea->pa_dst_net, - ea->pa_dst_node); + case NAT25_LOOKUP: { + RTW_INFO("NAT25: Lookup AARP, Source=%d,%d Destination=%d,%d\n", + ea->pa_src_net, + ea->pa_src_node, + ea->pa_dst_net, + ea->pa_dst_node); - __nat25_generate_apple_network_addr(networkAddr, &ea->pa_dst_net, &ea->pa_dst_node); + __nat25_generate_apple_network_addr(networkAddr, &ea->pa_dst_net, &ea->pa_dst_node); - __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); - // change to AARP destination mac address to Lookup result - memcpy(ea->hw_dst, skb->data, ETH_ALEN); - } - return 0; + /* change to AARP destination mac address to Lookup result */ + memcpy(ea->hw_dst, skb->data, ETH_ALEN); + } + return 0; - default: - return -1; + default: + return -1; } } - /* DDP */ - else if(ddp != NULL) - { - switch(method) - { - case NAT25_CHECK: - return -1; + /* DDP */ + else if (ddp != NULL) { + switch (method) { + case NAT25_CHECK: + return -1; - case NAT25_INSERT: - { - DBG_871X("NAT25: Insert DDP, Source=%d,%d Destination=%d,%d\n", - ddp->deh_snet, - ddp->deh_snode, - ddp->deh_dnet, - ddp->deh_dnode); + case NAT25_INSERT: { + RTW_INFO("NAT25: Insert DDP, Source=%d,%d Destination=%d,%d\n", + ddp->deh_snet, + ddp->deh_snode, + ddp->deh_dnet, + ddp->deh_dnode); - __nat25_generate_apple_network_addr(networkAddr, &ddp->deh_snet, &ddp->deh_snode); + __nat25_generate_apple_network_addr(networkAddr, &ddp->deh_snet, &ddp->deh_snode); - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); - __nat25_db_print(priv); - } - return 0; + __nat25_db_print(priv); + } + return 0; - case NAT25_LOOKUP: - { - DBG_871X("NAT25: Lookup DDP, Source=%d,%d Destination=%d,%d\n", - ddp->deh_snet, - ddp->deh_snode, - ddp->deh_dnet, - ddp->deh_dnode); + case NAT25_LOOKUP: { + RTW_INFO("NAT25: Lookup DDP, Source=%d,%d Destination=%d,%d\n", + ddp->deh_snet, + ddp->deh_snode, + ddp->deh_dnet, + ddp->deh_dnode); - __nat25_generate_apple_network_addr(networkAddr, &ddp->deh_dnet, &ddp->deh_dnode); + __nat25_generate_apple_network_addr(networkAddr, &ddp->deh_dnet, &ddp->deh_dnode); - __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); - } - return 0; + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); + } + return 0; - default: - return -1; + default: + return -1; } } @@ -1193,291 +1115,271 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method) } /*---------------------------------------------------*/ - /* Handle PPPoE frame */ + /* Handle PPPoE frame */ /*---------------------------------------------------*/ - else if((protocol == __constant_htons(ETH_P_PPP_DISC)) || - (protocol == __constant_htons(ETH_P_PPP_SES))) - { + else if ((protocol == __constant_htons(ETH_P_PPP_DISC)) || + (protocol == __constant_htons(ETH_P_PPP_SES))) { struct pppoe_hdr *ph = (struct pppoe_hdr *)(skb->data + ETH_HLEN); unsigned short *pMagic; - switch(method) - { - case NAT25_CHECK: - if (ph->sid == 0) - return 0; - return 1; - - case NAT25_INSERT: - if(ph->sid == 0) // Discovery phase according to tag - { - if(ph->code == PADI_CODE || ph->code == PADR_CODE) - { - if (priv->ethBrExtInfo.addPPPoETag) { - struct pppoe_tag *tag, *pOldTag; - unsigned char tag_buf[40]; - int old_tag_len=0; - - tag = (struct pppoe_tag *)tag_buf; - pOldTag = (struct pppoe_tag *)__nat25_find_pppoe_tag(ph, ntohs(PTT_RELAY_SID)); - if (pOldTag) { // if SID existed, copy old value and delete it - old_tag_len = ntohs(pOldTag->tag_len); - if (old_tag_len+TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN > sizeof(tag_buf)) { - DEBUG_ERR("SID tag length too long!\n"); - return -1; - } - - memcpy(tag->tag_data+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN, - pOldTag->tag_data, old_tag_len); - - if (skb_pull_and_merge(skb, (unsigned char *)pOldTag, TAG_HDR_LEN+old_tag_len) < 0) { - DEBUG_ERR("call skb_pull_and_merge() failed in PADI/R packet!\n"); - return -1; - } - ph->length = htons(ntohs(ph->length)-TAG_HDR_LEN-old_tag_len); - } - - tag->tag_type = PTT_RELAY_SID; - tag->tag_len = htons(MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN+old_tag_len); - - // insert the magic_code+client mac in relay tag - pMagic = (unsigned short *)tag->tag_data; - *pMagic = htons(MAGIC_CODE); - memcpy(tag->tag_data+MAGIC_CODE_LEN, skb->data+ETH_ALEN, ETH_ALEN); - - //Add relay tag - if(__nat25_add_pppoe_tag(skb, tag) < 0) - return -1; - - DBG_871X("NAT25: Insert PPPoE, forward %s packet\n", - (ph->code == PADI_CODE ? "PADI" : "PADR")); - } - else { // not add relay tag - if (priv->pppoe_connection_in_progress && - memcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN)) { - DEBUG_ERR("Discard PPPoE packet due to another PPPoE connection is in progress!\n"); - return -2; - } - - if (priv->pppoe_connection_in_progress == 0) - memcpy(priv->pppoe_addr, skb->data+ETH_ALEN, ETH_ALEN); - - priv->pppoe_connection_in_progress = WAIT_TIME_PPPOE; - } - } - else - return -1; - } - else // session phase - { - DBG_871X("NAT25: Insert PPPoE, insert session packet to %s\n", skb->dev->name); - - __nat25_generate_pppoe_network_addr(networkAddr, skb->data, &(ph->sid)); - - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); - - __nat25_db_print(priv); - - if (!priv->ethBrExtInfo.addPPPoETag && - priv->pppoe_connection_in_progress && - !memcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN)) - priv->pppoe_connection_in_progress = 0; - } + switch (method) { + case NAT25_CHECK: + if (ph->sid == 0) return 0; + return 1; - case NAT25_LOOKUP: - if(ph->code == PADO_CODE || ph->code == PADS_CODE) - { + case NAT25_INSERT: + if (ph->sid == 0) { /* Discovery phase according to tag */ + if (ph->code == PADI_CODE || ph->code == PADR_CODE) { if (priv->ethBrExtInfo.addPPPoETag) { - struct pppoe_tag *tag; - unsigned char *ptr; - unsigned short tagType, tagLen; - int offset=0; + struct pppoe_tag *tag, *pOldTag; + unsigned char tag_buf[40]; + int old_tag_len = 0; - if((ptr = __nat25_find_pppoe_tag(ph, ntohs(PTT_RELAY_SID))) == 0) { - DEBUG_ERR("Fail to find PTT_RELAY_SID in FADO!\n"); - return -1; + tag = (struct pppoe_tag *)tag_buf; + pOldTag = (struct pppoe_tag *)__nat25_find_pppoe_tag(ph, ntohs(PTT_RELAY_SID)); + if (pOldTag) { /* if SID existed, copy old value and delete it */ + old_tag_len = ntohs(pOldTag->tag_len); + if (old_tag_len + TAG_HDR_LEN + MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN > sizeof(tag_buf)) { + DEBUG_ERR("SID tag length too long!\n"); + return -1; + } + + memcpy(tag->tag_data + MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN, + pOldTag->tag_data, old_tag_len); + + if (skb_pull_and_merge(skb, (unsigned char *)pOldTag, TAG_HDR_LEN + old_tag_len) < 0) { + DEBUG_ERR("call skb_pull_and_merge() failed in PADI/R packet!\n"); + return -1; + } + ph->length = htons(ntohs(ph->length) - TAG_HDR_LEN - old_tag_len); } - tag = (struct pppoe_tag *)ptr; - tagType = (unsigned short)((ptr[0] << 8) + ptr[1]); - tagLen = (unsigned short)((ptr[2] << 8) + ptr[3]); - - if((tagType != ntohs(PTT_RELAY_SID)) || (tagLen < (MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN))) { - DEBUG_ERR("Invalid PTT_RELAY_SID tag length [%d]!\n", tagLen); - return -1; - } + tag->tag_type = PTT_RELAY_SID; + tag->tag_len = htons(MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN + old_tag_len); + /* insert the magic_code+client mac in relay tag */ pMagic = (unsigned short *)tag->tag_data; - if (ntohs(*pMagic) != MAGIC_CODE) { - DEBUG_ERR("Can't find MAGIC_CODE in %s packet!\n", - (ph->code == PADO_CODE ? "PADO" : "PADS")); + *pMagic = htons(MAGIC_CODE); + memcpy(tag->tag_data + MAGIC_CODE_LEN, skb->data + ETH_ALEN, ETH_ALEN); + + /* Add relay tag */ + if (__nat25_add_pppoe_tag(skb, tag) < 0) return -1; + + RTW_INFO("NAT25: Insert PPPoE, forward %s packet\n", + (ph->code == PADI_CODE ? "PADI" : "PADR")); + } else { /* not add relay tag */ + if (priv->pppoe_connection_in_progress && + memcmp(skb->data + ETH_ALEN, priv->pppoe_addr, ETH_ALEN)) { + DEBUG_ERR("Discard PPPoE packet due to another PPPoE connection is in progress!\n"); + return -2; } - memcpy(skb->data, tag->tag_data+MAGIC_CODE_LEN, ETH_ALEN); + if (priv->pppoe_connection_in_progress == 0) + memcpy(priv->pppoe_addr, skb->data + ETH_ALEN, ETH_ALEN); - if (tagLen > MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN) - offset = TAG_HDR_LEN; - - if (skb_pull_and_merge(skb, ptr+offset, TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN-offset) < 0) { - DEBUG_ERR("call skb_pull_and_merge() failed in PADO packet!\n"); - return -1; - } - ph->length = htons(ntohs(ph->length)-(TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN-offset)); - if (offset > 0) - tag->tag_len = htons(tagLen-MAGIC_CODE_LEN-RTL_RELAY_TAG_LEN); - - DBG_871X("NAT25: Lookup PPPoE, forward %s Packet from %s\n", - (ph->code == PADO_CODE ? "PADO" : "PADS"), skb->dev->name); - } - else { // not add relay tag - if (!priv->pppoe_connection_in_progress) { - DEBUG_ERR("Discard PPPoE packet due to no connection in progresss!\n"); - return -1; - } - memcpy(skb->data, priv->pppoe_addr, ETH_ALEN); priv->pppoe_connection_in_progress = WAIT_TIME_PPPOE; } - } - else { - if(ph->sid != 0) - { - DBG_871X("NAT25: Lookup PPPoE, lookup session packet from %s\n", skb->dev->name); - __nat25_generate_pppoe_network_addr(networkAddr, skb->data+ETH_ALEN, &(ph->sid)); + } else + return -1; + } else { /* session phase */ + RTW_INFO("NAT25: Insert PPPoE, insert session packet to %s\n", skb->dev->name); - __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); + __nat25_generate_pppoe_network_addr(networkAddr, skb->data, &(ph->sid)); - __nat25_db_print(priv); - } - else + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); + + __nat25_db_print(priv); + + if (!priv->ethBrExtInfo.addPPPoETag && + priv->pppoe_connection_in_progress && + !memcmp(skb->data + ETH_ALEN, priv->pppoe_addr, ETH_ALEN)) + priv->pppoe_connection_in_progress = 0; + } + return 0; + + case NAT25_LOOKUP: + if (ph->code == PADO_CODE || ph->code == PADS_CODE) { + if (priv->ethBrExtInfo.addPPPoETag) { + struct pppoe_tag *tag; + unsigned char *ptr; + unsigned short tagType, tagLen; + int offset = 0; + + ptr = __nat25_find_pppoe_tag(ph, ntohs(PTT_RELAY_SID)); + if (ptr == 0) { + DEBUG_ERR("Fail to find PTT_RELAY_SID in FADO!\n"); return -1; + } + tag = (struct pppoe_tag *)ptr; + tagType = (unsigned short)((ptr[0] << 8) + ptr[1]); + tagLen = (unsigned short)((ptr[2] << 8) + ptr[3]); + + if ((tagType != ntohs(PTT_RELAY_SID)) || (tagLen < (MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN))) { + DEBUG_ERR("Invalid PTT_RELAY_SID tag length [%d]!\n", tagLen); + return -1; + } + + pMagic = (unsigned short *)tag->tag_data; + if (ntohs(*pMagic) != MAGIC_CODE) { + DEBUG_ERR("Can't find MAGIC_CODE in %s packet!\n", + (ph->code == PADO_CODE ? "PADO" : "PADS")); + return -1; + } + + memcpy(skb->data, tag->tag_data + MAGIC_CODE_LEN, ETH_ALEN); + + if (tagLen > MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN) + offset = TAG_HDR_LEN; + + if (skb_pull_and_merge(skb, ptr + offset, TAG_HDR_LEN + MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN - offset) < 0) { + DEBUG_ERR("call skb_pull_and_merge() failed in PADO packet!\n"); + return -1; + } + ph->length = htons(ntohs(ph->length) - (TAG_HDR_LEN + MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN - offset)); + if (offset > 0) + tag->tag_len = htons(tagLen - MAGIC_CODE_LEN - RTL_RELAY_TAG_LEN); + + RTW_INFO("NAT25: Lookup PPPoE, forward %s Packet from %s\n", + (ph->code == PADO_CODE ? "PADO" : "PADS"), skb->dev->name); + } else { /* not add relay tag */ + if (!priv->pppoe_connection_in_progress) { + DEBUG_ERR("Discard PPPoE packet due to no connection in progresss!\n"); + return -1; + } + memcpy(skb->data, priv->pppoe_addr, ETH_ALEN); + priv->pppoe_connection_in_progress = WAIT_TIME_PPPOE; } - return 0; + } else { + if (ph->sid != 0) { + RTW_INFO("NAT25: Lookup PPPoE, lookup session packet from %s\n", skb->dev->name); + __nat25_generate_pppoe_network_addr(networkAddr, skb->data + ETH_ALEN, &(ph->sid)); - default: - return -1; + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr); + + __nat25_db_print(priv); + } else + return -1; + + } + return 0; + + default: + return -1; } } /*---------------------------------------------------*/ - /* Handle EAP frame */ + /* Handle EAP frame */ /*---------------------------------------------------*/ - else if(protocol == __constant_htons(0x888e)) - { - switch(method) - { - case NAT25_CHECK: - return -1; + else if (protocol == __constant_htons(0x888e)) { + switch (method) { + case NAT25_CHECK: + return -1; - case NAT25_INSERT: - return 0; + case NAT25_INSERT: + return 0; - case NAT25_LOOKUP: - return 0; + case NAT25_LOOKUP: + return 0; - default: - return -1; + default: + return -1; } } /*---------------------------------------------------*/ - /* Handle C-Media proprietary frame */ + /* Handle C-Media proprietary frame */ /*---------------------------------------------------*/ - else if((protocol == __constant_htons(0xe2ae)) || - (protocol == __constant_htons(0xe2af))) - { - switch(method) - { - case NAT25_CHECK: - return -1; + else if ((protocol == __constant_htons(0xe2ae)) || + (protocol == __constant_htons(0xe2af))) { + switch (method) { + case NAT25_CHECK: + return -1; - case NAT25_INSERT: - return 0; + case NAT25_INSERT: + return 0; - case NAT25_LOOKUP: - return 0; + case NAT25_LOOKUP: + return 0; - default: - return -1; + default: + return -1; } } /*---------------------------------------------------*/ - /* Handle IPV6 frame */ + /* Handle IPV6 frame */ /*---------------------------------------------------*/ #ifdef CL_IPV6_PASS - else if(protocol == __constant_htons(ETH_P_IPV6)) - { + else if (protocol == __constant_htons(ETH_P_IPV6)) { struct ipv6hdr *iph = (struct ipv6hdr *)(skb->data + ETH_HLEN); - if (sizeof(*iph) >= (skb->len - ETH_HLEN)) - { + if (sizeof(*iph) >= (skb->len - ETH_HLEN)) { DEBUG_WARN("NAT25: malformed IPv6 packet !\n"); return -1; } - switch(method) - { - case NAT25_CHECK: - if (skb->data[0] & 1) - return 0; - return -1; + switch (method) { + case NAT25_CHECK: + if (skb->data[0] & 1) + return 0; + return -1; - case NAT25_INSERT: - { - DBG_871X("NAT25: Insert IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x," - " DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\n", - iph->saddr.s6_addr16[0],iph->saddr.s6_addr16[1],iph->saddr.s6_addr16[2],iph->saddr.s6_addr16[3], - iph->saddr.s6_addr16[4],iph->saddr.s6_addr16[5],iph->saddr.s6_addr16[6],iph->saddr.s6_addr16[7], - iph->daddr.s6_addr16[0],iph->daddr.s6_addr16[1],iph->daddr.s6_addr16[2],iph->daddr.s6_addr16[3], - iph->daddr.s6_addr16[4],iph->daddr.s6_addr16[5],iph->daddr.s6_addr16[6],iph->daddr.s6_addr16[7]); + case NAT25_INSERT: { + RTW_INFO("NAT25: Insert IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x," + " DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\n", + iph->saddr.s6_addr16[0], iph->saddr.s6_addr16[1], iph->saddr.s6_addr16[2], iph->saddr.s6_addr16[3], + iph->saddr.s6_addr16[4], iph->saddr.s6_addr16[5], iph->saddr.s6_addr16[6], iph->saddr.s6_addr16[7], + iph->daddr.s6_addr16[0], iph->daddr.s6_addr16[1], iph->daddr.s6_addr16[2], iph->daddr.s6_addr16[3], + iph->daddr.s6_addr16[4], iph->daddr.s6_addr16[5], iph->daddr.s6_addr16[6], iph->daddr.s6_addr16[7]); - if (memcmp(&iph->saddr, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0", 16)) { - __nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->saddr); - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); - __nat25_db_print(priv); + if (memcmp(&iph->saddr, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0", 16)) { + __nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->saddr); + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); + __nat25_db_print(priv); - if (iph->nexthdr == IPPROTO_ICMPV6 && - skb->len > (ETH_HLEN + sizeof(*iph) + 4)) { - if (update_nd_link_layer_addr(skb->data + ETH_HLEN + sizeof(*iph), - skb->len - ETH_HLEN - sizeof(*iph), GET_MY_HWADDR(priv))) { - struct icmp6hdr *hdr = (struct icmp6hdr *)(skb->data + ETH_HLEN + sizeof(*iph)); - hdr->icmp6_cksum = 0; - hdr->icmp6_cksum = csum_ipv6_magic(&iph->saddr, &iph->daddr, - iph->payload_len, - IPPROTO_ICMPV6, - csum_partial((__u8 *)hdr, iph->payload_len, 0)); - } - } + if (iph->nexthdr == IPPROTO_ICMPV6 && + skb->len > (ETH_HLEN + sizeof(*iph) + 4)) { + if (update_nd_link_layer_addr(skb->data + ETH_HLEN + sizeof(*iph), + skb->len - ETH_HLEN - sizeof(*iph), GET_MY_HWADDR(priv))) { + struct icmp6hdr *hdr = (struct icmp6hdr *)(skb->data + ETH_HLEN + sizeof(*iph)); + hdr->icmp6_cksum = 0; + hdr->icmp6_cksum = csum_ipv6_magic(&iph->saddr, &iph->daddr, + iph->payload_len, + IPPROTO_ICMPV6, + csum_partial((__u8 *)hdr, iph->payload_len, 0)); } } - return 0; + } + } + return 0; - case NAT25_LOOKUP: - DBG_871X("NAT25: Lookup IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x," - " DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\n", - iph->saddr.s6_addr16[0],iph->saddr.s6_addr16[1],iph->saddr.s6_addr16[2],iph->saddr.s6_addr16[3], - iph->saddr.s6_addr16[4],iph->saddr.s6_addr16[5],iph->saddr.s6_addr16[6],iph->saddr.s6_addr16[7], - iph->daddr.s6_addr16[0],iph->daddr.s6_addr16[1],iph->daddr.s6_addr16[2],iph->daddr.s6_addr16[3], - iph->daddr.s6_addr16[4],iph->daddr.s6_addr16[5],iph->daddr.s6_addr16[6],iph->daddr.s6_addr16[7]); - + case NAT25_LOOKUP: + RTW_INFO("NAT25: Lookup IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x," + " DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\n", + iph->saddr.s6_addr16[0], iph->saddr.s6_addr16[1], iph->saddr.s6_addr16[2], iph->saddr.s6_addr16[3], + iph->saddr.s6_addr16[4], iph->saddr.s6_addr16[5], iph->saddr.s6_addr16[6], iph->saddr.s6_addr16[7], + iph->daddr.s6_addr16[0], iph->daddr.s6_addr16[1], iph->daddr.s6_addr16[2], iph->daddr.s6_addr16[3], + iph->daddr.s6_addr16[4], iph->daddr.s6_addr16[5], iph->daddr.s6_addr16[6], iph->daddr.s6_addr16[7]); - __nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->daddr); - if (!__nat25_db_network_lookup_and_replace(priv, skb, networkAddr)) { -#ifdef SUPPORT_RX_UNI2MCAST - if (iph->daddr.s6_addr[0] == 0xff) - convert_ipv6_mac_to_mc(skb); -#endif - } - return 0; - default: - return -1; + __nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->daddr); + if (!__nat25_db_network_lookup_and_replace(priv, skb, networkAddr)) { +#ifdef SUPPORT_RX_UNI2MCAST + if (iph->daddr.s6_addr[0] == 0xff) + convert_ipv6_mac_to_mc(skb); +#endif + } + return 0; + + default: + return -1; } } -#endif // CL_IPV6_PASS +#endif /* CL_IPV6_PASS */ return -1; } @@ -1486,39 +1388,36 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method) int nat25_handle_frame(_adapter *priv, struct sk_buff *skb) { #ifdef BR_EXT_DEBUG - if((!priv->ethBrExtInfo.nat25_disable) && (!(skb->data[0] & 1))) - { + if ((!priv->ethBrExtInfo.nat25_disable) && (!(skb->data[0] & 1))) { panic_printk("NAT25: Input Frame: DA=%02x%02x%02x%02x%02x%02x SA=%02x%02x%02x%02x%02x%02x\n", - skb->data[0], - skb->data[1], - skb->data[2], - skb->data[3], - skb->data[4], - skb->data[5], - skb->data[6], - skb->data[7], - skb->data[8], - skb->data[9], - skb->data[10], - skb->data[11]); + skb->data[0], + skb->data[1], + skb->data[2], + skb->data[3], + skb->data[4], + skb->data[5], + skb->data[6], + skb->data[7], + skb->data[8], + skb->data[9], + skb->data[10], + skb->data[11]); } #endif - if(!(skb->data[0] & 1)) - { - int is_vlan_tag=0, i, retval=0; - unsigned short vlan_hdr=0; + if (!(skb->data[0] & 1)) { + int is_vlan_tag = 0, i, retval = 0; + unsigned short vlan_hdr = 0; - if (*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_8021Q)) { + if (*((unsigned short *)(skb->data + ETH_ALEN * 2)) == __constant_htons(ETH_P_8021Q)) { is_vlan_tag = 1; - vlan_hdr = *((unsigned short *)(skb->data+ETH_ALEN*2+2)); - for (i=0; i<6; i++) - *((unsigned short *)(skb->data+ETH_ALEN*2+2-i*2)) = *((unsigned short *)(skb->data+ETH_ALEN*2-2-i*2)); + vlan_hdr = *((unsigned short *)(skb->data + ETH_ALEN * 2 + 2)); + for (i = 0; i < 6; i++) + *((unsigned short *)(skb->data + ETH_ALEN * 2 + 2 - i * 2)) = *((unsigned short *)(skb->data + ETH_ALEN * 2 - 2 - i * 2)); skb_pull(skb, 4); } - if (!priv->ethBrExtInfo.nat25_disable) - { + if (!priv->ethBrExtInfo.nat25_disable) { _irqL irqL; _enter_critical_bh(&priv->br_ext_lock, &irqL); /* @@ -1527,38 +1426,36 @@ int nat25_handle_frame(_adapter *priv, struct sk_buff *skb) * corresponding network protocol is NOT support. */ if (!priv->ethBrExtInfo.nat25sc_disable && - (*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_IP)) && - !memcmp(priv->scdb_ip, skb->data+ETH_HLEN+16, 4)) { + (*((unsigned short *)(skb->data + ETH_ALEN * 2)) == __constant_htons(ETH_P_IP)) && + !memcmp(priv->scdb_ip, skb->data + ETH_HLEN + 16, 4)) { memcpy(skb->data, priv->scdb_mac, ETH_ALEN); - + _exit_critical_bh(&priv->br_ext_lock, &irqL); - } - else { + } else { _exit_critical_bh(&priv->br_ext_lock, &irqL); - + retval = nat25_db_handle(priv, skb, NAT25_LOOKUP); } - } - else { - if (((*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_IP)) && - !memcmp(priv->br_ip, skb->data+ETH_HLEN+16, 4)) || - ((*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_ARP)) && - !memcmp(priv->br_ip, skb->data+ETH_HLEN+24, 4))) { - // for traffic to upper TCP/IP + } else { + if (((*((unsigned short *)(skb->data + ETH_ALEN * 2)) == __constant_htons(ETH_P_IP)) && + !memcmp(priv->br_ip, skb->data + ETH_HLEN + 16, 4)) || + ((*((unsigned short *)(skb->data + ETH_ALEN * 2)) == __constant_htons(ETH_P_ARP)) && + !memcmp(priv->br_ip, skb->data + ETH_HLEN + 24, 4))) { + /* for traffic to upper TCP/IP */ retval = nat25_db_handle(priv, skb, NAT25_LOOKUP); } } if (is_vlan_tag) { skb_push(skb, 4); - for (i=0; i<6; i++) - *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2)); - *((unsigned short *)(skb->data+ETH_ALEN*2)) = __constant_htons(ETH_P_8021Q); - *((unsigned short *)(skb->data+ETH_ALEN*2+2)) = vlan_hdr; + for (i = 0; i < 6; i++) + *((unsigned short *)(skb->data + i * 2)) = *((unsigned short *)(skb->data + 4 + i * 2)); + *((unsigned short *)(skb->data + ETH_ALEN * 2)) = __constant_htons(ETH_P_8021Q); + *((unsigned short *)(skb->data + ETH_ALEN * 2 + 2)) = vlan_hdr; } - if(retval == -1) { - //DEBUG_ERR("NAT25: Lookup fail!\n"); + if (retval == -1) { + /* DEBUG_ERR("NAT25: Lookup fail!\n"); */ return -1; } } @@ -1572,23 +1469,20 @@ void mac_clone(_adapter *priv, unsigned char *addr) struct sockaddr sa; memcpy(sa.sa_data, addr, ETH_ALEN); - DBG_871X("MAC Clone: Addr=%02x%02x%02x%02x%02x%02x\n", - addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); + RTW_INFO("MAC Clone: Addr=%02x%02x%02x%02x%02x%02x\n", + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); rtl8192cd_set_hwaddr(priv->dev, &sa); } int mac_clone_handle_frame(_adapter *priv, struct sk_buff *skb) { - if(priv->ethBrExtInfo.macclone_enable && !priv->macclone_completed) - { - if(!(skb->data[ETH_ALEN] & 1)) //// check any other particular MAC add - { - if(memcmp(skb->data+ETH_ALEN, GET_MY_HWADDR(priv), ETH_ALEN) && - ((priv->dev->br_port) && - memcmp(skb->data+ETH_ALEN, priv->br_mac, ETH_ALEN))) - { - mac_clone(priv, skb->data+ETH_ALEN); + if (priv->ethBrExtInfo.macclone_enable && !priv->macclone_completed) { + if (!(skb->data[ETH_ALEN] & 1)) { /* check any other particular MAC add */ + if (memcmp(skb->data + ETH_ALEN, GET_MY_HWADDR(priv), ETH_ALEN) && + ((priv->dev->br_port) && + memcmp(skb->data + ETH_ALEN, priv->br_mac, ETH_ALEN))) { + mac_clone(priv, skb->data + ETH_ALEN); priv->macclone_completed = 1; } } @@ -1596,7 +1490,7 @@ int mac_clone_handle_frame(_adapter *priv, struct sk_buff *skb) return 0; } -#endif // 0 +#endif /* 0 */ #define SERVER_PORT 67 #define CLIENT_PORT 68 @@ -1624,40 +1518,34 @@ struct dhcpMessage { void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb) { - if(skb == NULL) + if (skb == NULL) return; - if(!priv->ethBrExtInfo.dhcp_bcst_disable) - { + if (!priv->ethBrExtInfo.dhcp_bcst_disable) { unsigned short protocol = *((unsigned short *)(skb->data + 2 * ETH_ALEN)); - if(protocol == __constant_htons(ETH_P_IP)) // IP - { - struct iphdr* iph = (struct iphdr *)(skb->data + ETH_HLEN); + if (protocol == __constant_htons(ETH_P_IP)) { /* IP */ + struct iphdr *iph = (struct iphdr *)(skb->data + ETH_HLEN); - if(iph->protocol == IPPROTO_UDP) // UDP - { + if (iph->protocol == IPPROTO_UDP) { /* UDP */ struct udphdr *udph = (struct udphdr *)((SIZE_PTR)iph + (iph->ihl << 2)); - if((udph->source == __constant_htons(CLIENT_PORT)) - && (udph->dest == __constant_htons(SERVER_PORT))) // DHCP request - { + if ((udph->source == __constant_htons(CLIENT_PORT)) + && (udph->dest == __constant_htons(SERVER_PORT))) { /* DHCP request */ struct dhcpMessage *dhcph = (struct dhcpMessage *)((SIZE_PTR)udph + sizeof(struct udphdr)); - if(dhcph->cookie == __constant_htonl(DHCP_MAGIC)) // match magic word - { - if(!(dhcph->flags & htons(BROADCAST_FLAG))) // if not broadcast - { + if (dhcph->cookie == __constant_htonl(DHCP_MAGIC)) { /* match magic word */ + if (!(dhcph->flags & htons(BROADCAST_FLAG))) { /* if not broadcast */ register int sum = 0; - DBG_871X("DHCP: change flag of DHCP request to broadcast.\n"); - // or BROADCAST flag + RTW_INFO("DHCP: change flag of DHCP request to broadcast.\n"); + /* or BROADCAST flag */ dhcph->flags |= htons(BROADCAST_FLAG); - // recalculate checksum + /* recalculate checksum */ sum = ~(udph->check) & 0xffff; sum += dhcph->flags; - while(sum >> 16) + while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16); udph->check = ~sum; } @@ -1670,30 +1558,28 @@ void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb) void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, - unsigned char *ipAddr) + unsigned char *ipAddr) { unsigned char networkAddr[MAX_NETWORK_ADDR_LEN]; struct nat25_network_db_entry *db; int hash; - //_irqL irqL; - //_enter_critical_bh(&priv->br_ext_lock, &irqL); + /* _irqL irqL; */ + /* _enter_critical_bh(&priv->br_ext_lock, &irqL); */ __nat25_generate_ipv4_network_addr(networkAddr, (unsigned int *)ipAddr); hash = __nat25_network_hash(networkAddr); db = priv->nethash[hash]; - while (db != NULL) - { - if(!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) { - //_exit_critical_bh(&priv->br_ext_lock, &irqL); + while (db != NULL) { + if (!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) { + /* _exit_critical_bh(&priv->br_ext_lock, &irqL); */ return (void *)db; } db = db->next_hash; } - //_exit_critical_bh(&priv->br_ext_lock, &irqL); + /* _exit_critical_bh(&priv->br_ext_lock, &irqL); */ return NULL; } -#endif // CONFIG_BR_EXT - +#endif /* CONFIG_BR_EXT */ diff --git a/core/rtw_bt_mp.c b/core/rtw_bt_mp.c old mode 100755 new mode 100644 index 30cf14e..ee6f328 --- a/core/rtw_bt_mp.c +++ b/core/rtw_bt_mp.c @@ -1,1753 +1,1580 @@ -/****************************************************************************** - * - * 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 -#include - -#if defined(CONFIG_RTL8723B) -#include -#endif - -#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) -void MPh2c_timeout_handle(void *FunctionContext) -{ - PADAPTER pAdapter; - PMPT_CONTEXT pMptCtx; - - - DBG_8192C("[MPT], MPh2c_timeout_handle \n"); - - pAdapter = (PADAPTER)FunctionContext; - pMptCtx = &pAdapter->mppriv.MptCtx; - - pMptCtx->bMPh2c_timeout = _TRUE; - - if ((_FALSE == pMptCtx->MptH2cRspEvent) - || ((_TRUE == pMptCtx->MptH2cRspEvent) - && (_FALSE == pMptCtx->MptBtC2hEvent))) - { - _rtw_up_sema(&pMptCtx->MPh2c_Sema); - } -} - -u32 WaitC2Hevent(PADAPTER pAdapter, u8 *C2H_event, u32 delay_time) -{ - PMPT_CONTEXT pMptCtx=&(pAdapter->mppriv.MptCtx); - pMptCtx->bMPh2c_timeout=_FALSE; - - if( pAdapter->registrypriv.mp_mode == 0 ) - { - DBG_8192C("[MPT], Error!! WaitC2Hevent mp_mode == 0!!\n"); - return _FALSE; - } - - _set_timer( &pMptCtx->MPh2c_timeout_timer, delay_time ); - - _rtw_down_sema(&pMptCtx->MPh2c_Sema); - - if (pMptCtx->bMPh2c_timeout == _TRUE) - { - *C2H_event = _FALSE; - - return _FALSE; - } - - // for safty, cancel timer here again - _cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer); - - return _TRUE; -} - -BT_CTRL_STATUS -mptbt_CheckC2hFrame( - PADAPTER Adapter, - PBT_H2C pH2c, - PBT_EXT_C2H pExtC2h - ) -{ - BT_CTRL_STATUS c2hStatus = BT_STATUS_C2H_SUCCESS; - - //DBG_8192C("[MPT], MPT rsp C2H hex: %x %x %x %x %x %x \n"), pExtC2h , pExtC2h+1 ,pExtC2h+2 ,pExtC2h+3 ,pExtC2h+4 ,pExtC2h+5); - - DBG_8192C("[MPT], statusCode = 0x%x\n", pExtC2h->statusCode); - DBG_8192C("[MPT], retLen = %d\n", pExtC2h->retLen); - DBG_8192C("[MPT], opCodeVer : req/rsp=%d/%d\n", pH2c->opCodeVer, pExtC2h->opCodeVer); - DBG_8192C("[MPT], reqNum : req/rsp=%d/%d\n", pH2c->reqNum, pExtC2h->reqNum); - if(pExtC2h->reqNum != pH2c->reqNum) - { - c2hStatus = BT_STATUS_C2H_REQNUM_MISMATCH; - DBG_8192C("[MPT], Error!! C2H reqNum Mismatch!!\n"); - } - else if(pExtC2h->opCodeVer != pH2c->opCodeVer) - { - c2hStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; - DBG_8192C("[MPT], Error!! OPCode version L mismatch!!\n"); - } - - return c2hStatus; -} - -BT_CTRL_STATUS -mptbt_SendH2c( - PADAPTER Adapter, - PBT_H2C pH2c, - u2Byte h2cCmdLen - ) -{ - //KIRQL OldIrql = KeGetCurrentIrql(); - BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - u1Byte i; - - DBG_8192C("[MPT], mptbt_SendH2c()=========>\n"); - - //PlatformResetEvent(&pMptCtx->MptH2cRspEvent); - //PlatformResetEvent(&pMptCtx->MptBtC2hEvent); - -// if(OldIrql == PASSIVE_LEVEL) -// { - //RTPRINT_DATA(FMPBT, FMPBT_H2C_CONTENT, ("[MPT], MPT H2C hex: \n"), pH2c, h2cCmdLen); - - for(i=0; iMptH2cRspEvent = _FALSE; - pMptCtx->MptBtC2hEvent = _FALSE; - -#if defined(CONFIG_RTL8723B) - rtl8723b_set_FwBtMpOper_cmd(Adapter, pH2c->opCode, pH2c->opCodeVer, pH2c->reqNum, pH2c->buf); -#endif - pMptCtx->h2cReqNum++; - pMptCtx->h2cReqNum %= 16; - - if(WaitC2Hevent(Adapter, &pMptCtx->MptH2cRspEvent, 100)) - { - DBG_8192C("[MPT], Received WiFi MptH2cRspEvent!!!\n"); - if(WaitC2Hevent(Adapter, &pMptCtx->MptBtC2hEvent, 400)) - { - DBG_8192C("[MPT], Received MptBtC2hEvent!!!\n"); - break; - } - else - { - DBG_8192C("[MPT], Error!!BT MptBtC2hEvent timeout!!\n"); - h2cStatus = BT_STATUS_H2C_BT_NO_RSP; - } - } - else - { - DBG_8192C("[MPT], Error!!WiFi MptH2cRspEvent timeout!!\n"); - h2cStatus = BT_STATUS_H2C_TIMTOUT; - } - } -// } -// else -// { -// RT_ASSERT(FALSE, ("[MPT], mptbt_SendH2c() can only run under PASSIVE_LEVEL!!\n")); -// h2cStatus = BT_STATUS_WRONG_LEVEL; -// } - - DBG_8192C("[MPT], mptbt_SendH2c()<=========\n"); - return h2cStatus; -} - - - -BT_CTRL_STATUS -mptbt_CheckBtRspStatus( - PADAPTER Adapter, - PBT_EXT_C2H pExtC2h - ) -{ - BT_CTRL_STATUS retStatus=BT_OP_STATUS_SUCCESS; - - switch(pExtC2h->statusCode) - { - case BT_OP_STATUS_SUCCESS: - retStatus = BT_STATUS_BT_OP_SUCCESS; - DBG_8192C("[MPT], BT status : BT_STATUS_SUCCESS\n"); - break; - case BT_OP_STATUS_VERSION_MISMATCH: - retStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; - DBG_8192C("[MPT], BT status : BT_STATUS_OPCODE_L_VERSION_MISMATCH\n"); - break; - case BT_OP_STATUS_UNKNOWN_OPCODE: - retStatus = BT_STATUS_UNKNOWN_OPCODE_L; - DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_OPCODE_L\n"); - break; - case BT_OP_STATUS_ERROR_PARAMETER: - retStatus = BT_STATUS_PARAMETER_FORMAT_ERROR_L; - DBG_8192C("[MPT], BT status : BT_STATUS_PARAMETER_FORMAT_ERROR_L\n"); - break; - default: - retStatus = BT_STATUS_UNKNOWN_STATUS_L; - DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_STATUS_L\n"); - break; - } - - return retStatus; -} - - - -BT_CTRL_STATUS -mptbt_BtFwOpCodeProcess( - PADAPTER Adapter, - u1Byte btFwOpCode, - u1Byte opCodeVer, - pu1Byte pH2cPar, - u1Byte h2cParaLen - ) -{ - u1Byte H2C_Parameter[6] ={0}; - PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; - u2Byte paraLen=0,i; - BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS, c2hStatus=BT_STATUS_C2H_SUCCESS; - BT_CTRL_STATUS retStatus=BT_STATUS_H2C_BT_NO_RSP; - - if( Adapter->registrypriv.mp_mode == 0 ) - { - DBG_8192C("[MPT], Error!! mptbt_BtFwOpCodeProces mp_mode == 0!!\n"); - return _FALSE; - } - - pH2c->opCode = btFwOpCode; - pH2c->opCodeVer = opCodeVer; - pH2c->reqNum = pMptCtx->h2cReqNum; - //PlatformMoveMemory(&pH2c->buf[0], pH2cPar, h2cParaLen); - //_rtw_memcpy(&pH2c->buf[0], pH2cPar, h2cParaLen); - _rtw_memcpy(pH2c->buf, pH2cPar, h2cParaLen); - - DBG_8192C("[MPT], pH2c->opCode=%d\n", pH2c->opCode); - DBG_8192C("[MPT], pH2c->opCodeVer=%d\n", pH2c->opCodeVer); - DBG_8192C("[MPT], pH2c->reqNum=%d\n", pH2c->reqNum); - DBG_8192C("[MPT], h2c parameter length=%d\n", h2cParaLen); - for (i=0; ibuf[i]); - } - - h2cStatus = mptbt_SendH2c(Adapter, pH2c, h2cParaLen+2); - if(BT_STATUS_H2C_SUCCESS == h2cStatus) - { - // if reach here, it means H2C get the correct c2h response, - c2hStatus = mptbt_CheckC2hFrame(Adapter, pH2c, pExtC2h); - if(BT_STATUS_C2H_SUCCESS == c2hStatus) - { - retStatus = mptbt_CheckBtRspStatus(Adapter, pExtC2h); - } - else - { - DBG_8192C("[MPT], Error!! C2H failed for pH2c->opCode=%d\n", pH2c->opCode); - // check c2h status error, return error status code to upper layer. - retStatus = c2hStatus; - } - } - else - { - DBG_8192C("[MPT], Error!! H2C failed for pH2c->opCode=%d\n", pH2c->opCode); - // check h2c status error, return error status code to upper layer. - retStatus = h2cStatus; - } - - return retStatus; -} - - - - -u2Byte -mptbt_BtReady( - PADAPTER Adapter, - PBT_REQ_CMD pBtReq, - PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; - u1Byte i; - u1Byte btFwVer=0, bdAddr[6]={0}; - u2Byte btRealFwVer=0; - pu2Byte pu2Tmp=NULL; - - // - // check upper layer parameters - // - - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - - pBtRsp->pParamStart[0] = MP_BT_NOT_READY; - paraLen = 10; - // - // execute lower layer opcodes - // - - // Get BT FW version - // fill h2c parameters - btOpcode = BT_LO_OP_GET_BT_VERSION; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - else - { - pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; - btRealFwVer = *pu2Tmp; - btFwVer = pExtC2h->buf[1]; - DBG_8192C("[MPT], btRealFwVer=0x%x, btFwVer=0x%x\n", btRealFwVer, btFwVer); - } - - // Get BD Address - // fill h2c parameters - btOpcode = BT_LO_OP_GET_BD_ADDR_L; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - else - { - bdAddr[5] = pExtC2h->buf[0]; - bdAddr[4] = pExtC2h->buf[1]; - bdAddr[3] = pExtC2h->buf[2]; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_GET_BD_ADDR_H; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - else - { - bdAddr[2] = pExtC2h->buf[0]; - bdAddr[1] = pExtC2h->buf[1]; - bdAddr[0] = pExtC2h->buf[2]; - } - DBG_8192C("[MPT], Local BDAddr:"); - for(i=0; i<6; i++) - { - DBG_8192C(" 0x%x ", bdAddr[i]); - } - pBtRsp->status = BT_STATUS_SUCCESS; - pBtRsp->pParamStart[0] = MP_BT_READY; - pu2Tmp = (pu2Byte)&pBtRsp->pParamStart[1]; - *pu2Tmp = btRealFwVer; - pBtRsp->pParamStart[3] = btFwVer; - for(i=0; i<6; i++) - { - pBtRsp->pParamStart[4+i] = bdAddr[5-i]; - } - - return paraLen; -} - -void mptbt_close_WiFiRF(PADAPTER Adapter) -{ - PHY_SetBBReg(Adapter, 0x824, 0xF, 0x0); - PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x0); - PHY_SetRFReg(Adapter, RF_PATH_A, 0x0, 0xF0000, 0x0); -} - -void mptbt_open_WiFiRF(PADAPTER Adapter) -{ - PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x3); - PHY_SetBBReg(Adapter, 0x824, 0xF, 0x2); - PHY_SetRFReg(Adapter, RF_PATH_A, 0x0, 0xF0000, 0x3); -} - -u4Byte mptbt_switch_RF(PADAPTER Adapter, u1Byte Enter) -{ - u2Byte tmp_2byte = 0; - - //Enter test mode - if (Enter) { - ////1>. close WiFi RF - mptbt_close_WiFiRF(Adapter); - - ////2>. change ant switch to BT - tmp_2byte = rtw_read16(Adapter, 0x860); - tmp_2byte = tmp_2byte | BIT(9); - tmp_2byte = tmp_2byte & (~BIT(8)); - rtw_write16(Adapter, 0x860, tmp_2byte); - rtw_write16(Adapter, 0x870, 0x300); - } else { - ////1>. Open WiFi RF - mptbt_open_WiFiRF(Adapter); - - ////2>. change ant switch back - tmp_2byte = rtw_read16(Adapter, 0x860); - tmp_2byte = tmp_2byte | BIT(8); - tmp_2byte = tmp_2byte & (~BIT(9)); - rtw_write16(Adapter, 0x860, tmp_2byte); - rtw_write16(Adapter, 0x870, 0x300); - } - - return 0; -} - -u2Byte -mptbt_BtSetMode( - PADAPTER Adapter, - PBT_REQ_CMD pBtReq, - PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte btModeToSet=0; - - // - // check upper layer parameters - // - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // 2. check upper layer parameter length - if(1 == pBtReq->paraLength) - { - btModeToSet = pBtReq->pParamStart[0]; - DBG_8192C("[MPT], BtTestMode=%d \n", btModeToSet); - } - else - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - - // 1. fill h2c parameters - // check bt mode - btOpcode = BT_LO_OP_SET_BT_MODE; - if(btModeToSet >= MP_BT_MODE_MAX) - { - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - mptbt_switch_RF(Adapter, 1); - - h2cParaBuf[0] = btModeToSet; - h2cParaLen = 1; - // 2. execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // 3. construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS == retStatus) - { - pBtRsp->status = BT_STATUS_SUCCESS; - } - else - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - } - - return paraLen; -} - - -VOID -MPTBT_FwC2hBtMpCtrl( - PADAPTER Adapter, - pu1Byte tmpBuf, - u1Byte length - ) -{ - u32 i; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)tmpBuf; - - if(Adapter->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0 ) - { - //DBG_8192C("Ignore C2H BT MP Info since not in MP mode \n"); - return; - } - if( length > 32 || length < 3 ) - { - DBG_8192C("\n [MPT], pExtC2h->buf hex: length=%d > 32 || < 3\n",length); - return; - } - - //cancel_timeout for h2c handle - _cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer); - - for (i=0; iextendId=0x%x\n", pExtC2h->extendId); - - switch(pExtC2h->extendId) - { - case EXT_C2H_WIFI_FW_ACTIVE_RSP: - DBG_8192C("[MPT], EXT_C2H_WIFI_FW_ACTIVE_RSP\n"); -#if 0 - DBG_8192C("[MPT], pExtC2h->buf hex: \n"); - for (i=0; i<(length-3); i++) - { - DBG_8192C(" 0x%x ", pExtC2h->buf[i]); - } -#endif - if ((_FALSE == pMptCtx->bMPh2c_timeout) - && (_FALSE == pMptCtx->MptH2cRspEvent)) - { - pMptCtx->MptH2cRspEvent = _TRUE; - _rtw_up_sema(&pMptCtx->MPh2c_Sema); - } - break; - - case EXT_C2H_TRIG_BY_BT_FW: - DBG_8192C("[MPT], EXT_C2H_TRIG_BY_BT_FW\n"); - _rtw_memcpy(&pMptCtx->c2hBuf[0], tmpBuf, length); - DBG_8192C("[MPT], pExtC2h->statusCode=0x%x\n", pExtC2h->statusCode); - DBG_8192C("[MPT], pExtC2h->retLen=0x%x\n", pExtC2h->retLen); - DBG_8192C("[MPT], pExtC2h->opCodeVer=0x%x\n", pExtC2h->opCodeVer); - DBG_8192C("[MPT], pExtC2h->reqNum=0x%x\n", pExtC2h->reqNum); - for (i=0; i<(length-3); i++) - { - DBG_8192C("[MPT], pExtC2h->buf[%d]=0x%02x\n", i, pExtC2h->buf[i]); - } - - if ((_FALSE == pMptCtx->bMPh2c_timeout) - && (_TRUE == pMptCtx->MptH2cRspEvent) - && (_FALSE == pMptCtx->MptBtC2hEvent)) - { - pMptCtx->MptBtC2hEvent = _TRUE; - _rtw_up_sema(&pMptCtx->MPh2c_Sema); - } - break; - - default: - DBG_8192C("[MPT], EXT_C2H Target not found,pExtC2h->extendId =%d ,pExtC2h->reqNum=%d\n",pExtC2h->extendId,pExtC2h->reqNum); - break; - } - - - -} - - -u2Byte -mptbt_BtGetGeneral( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode, bdAddr[6]={0}; - u1Byte btOpcodeVer=0; - u1Byte getType=0, i; - u2Byte getParaLen=0, validParaLen=0; - u1Byte regType=0, reportType=0; - u4Byte regAddr=0, regValue=0; - pu4Byte pu4Tmp; - pu2Byte pu2Tmp; - pu1Byte pu1Tmp; - - // - // check upper layer parameters - // - - // check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // check upper layer parameter length - if(pBtReq->paraLength < 1) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - getParaLen = pBtReq->paraLength - 1; - getType = pBtReq->pParamStart[0]; - - DBG_8192C("[MPT], getType=%d, getParaLen=%d\n", getType, getParaLen); - - // check parameter first - switch(getType) - { - case BT_GGET_REG: - DBG_8192C("[MPT], [BT_GGET_REG]\n"); - validParaLen = 5; - if(getParaLen == validParaLen) - { - btOpcode = BT_LO_OP_READ_REG; - regType = pBtReq->pParamStart[1]; - pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; - regAddr = *pu4Tmp; - DBG_8192C("[MPT], BT_GGET_REG regType=0x%02x, regAddr=0x%08x!!\n", - regType, regAddr); - if(regType >= BT_REG_MAX) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || - ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || - ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || - ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || - ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - } - } - break; - case BT_GGET_STATUS: - DBG_8192C("[MPT], [BT_GGET_STATUS]\n"); - validParaLen = 0; - break; - case BT_GGET_REPORT: - DBG_8192C("[MPT], [BT_GGET_REPORT]\n"); - validParaLen = 1; - if(getParaLen == validParaLen) - { - reportType = pBtReq->pParamStart[1]; - DBG_8192C("[MPT], BT_GGET_REPORT reportType=0x%x!!\n", reportType); - if(reportType >= BT_REPORT_MAX) - { - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - } - break; - default: - { - DBG_8192C("[MPT], Error!! getType=%d, out of range\n", getType); - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - break; - } - if(getParaLen != validParaLen) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_GET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", - getParaLen, getType, validParaLen); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - if(BT_GGET_REG == getType) - { - // fill h2c parameters - // here we should write reg value first then write the address, adviced by Austin - btOpcode = BT_LO_OP_READ_REG; - h2cParaBuf[0] = regType; - h2cParaBuf[1] = pBtReq->pParamStart[2]; - h2cParaBuf[2] = pBtReq->pParamStart[3]; - h2cParaLen = 3; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; - regValue = *pu2Tmp; - DBG_8192C("[MPT], read reg regType=0x%02x, regAddr=0x%08x, regValue=0x%04x\n", - regType, regAddr, regValue); - - pu4Tmp = (pu4Byte)&pBtRsp->pParamStart[0]; - *pu4Tmp = regValue; - paraLen = 4; - } - else if(BT_GGET_STATUS == getType) - { - btOpcode = BT_LO_OP_GET_BT_STATUS; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - DBG_8192C("[MPT], read bt status, testMode=0x%x, testStatus=0x%x\n", - pBtRsp->pParamStart[0], pBtRsp->pParamStart[1]); - paraLen = 2; - } - else if(BT_GGET_REPORT == getType) - { - switch(reportType) - { - case BT_REPORT_RX_PACKET_CNT: - { - DBG_8192C("[MPT], [Rx Packet Counts]\n"); - btOpcode = BT_LO_OP_GET_RX_PKT_CNT_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - - btOpcode = BT_LO_OP_GET_RX_PKT_CNT_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[2] = pExtC2h->buf[0]; - pBtRsp->pParamStart[3] = pExtC2h->buf[1]; - paraLen = 4; - } - break; - case BT_REPORT_RX_ERROR_BITS: - { - DBG_8192C("[MPT], [Rx Error Bits]\n"); - btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - - btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[2] = pExtC2h->buf[0]; - pBtRsp->pParamStart[3] = pExtC2h->buf[1]; - paraLen = 4; - } - break; - case BT_REPORT_RSSI: - { - DBG_8192C("[MPT], [RSSI]\n"); - btOpcode = BT_LO_OP_GET_RSSI; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - paraLen = 2; - } - break; - case BT_REPORT_CFO_HDR_QUALITY: - { - DBG_8192C("[MPT], [CFO & Header Quality]\n"); - btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - - btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[2] = pExtC2h->buf[0]; - pBtRsp->pParamStart[3] = pExtC2h->buf[1]; - paraLen = 4; - } - break; - case BT_REPORT_CONNECT_TARGET_BD_ADDR: - { - DBG_8192C("[MPT], [Connected Target BD ADDR]\n"); - btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - bdAddr[5] = pExtC2h->buf[0]; - bdAddr[4] = pExtC2h->buf[1]; - bdAddr[3] = pExtC2h->buf[2]; - - btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - bdAddr[2] = pExtC2h->buf[0]; - bdAddr[1] = pExtC2h->buf[1]; - bdAddr[0] = pExtC2h->buf[2]; - - DBG_8192C("[MPT], Connected Target BDAddr:%s", bdAddr); - for(i=0; i<6; i++) - { - pBtRsp->pParamStart[i] = bdAddr[5-i]; - } - paraLen = 6; - } - break; - default: - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - break; - } - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - - -u2Byte -mptbt_BtSetGeneral( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte setType=0; - u2Byte setParaLen=0, validParaLen=0; - u1Byte regType=0, bdAddr[6]={0}, calVal=0; - u4Byte regAddr=0, regValue=0; - pu4Byte pu4Tmp; - pu2Byte pu2Tmp; - pu1Byte pu1Tmp; - - // - // check upper layer parameters - // - - // check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // check upper layer parameter length - if(pBtReq->paraLength < 1) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - setParaLen = pBtReq->paraLength - 1; - setType = pBtReq->pParamStart[0]; - - DBG_8192C("[MPT], setType=%d, setParaLen=%d\n", setType, setParaLen); - - // check parameter first - switch(setType) - { - case BT_GSET_REG: - DBG_8192C ("[MPT], [BT_GSET_REG]\n"); - validParaLen = 9; - if(setParaLen == validParaLen) - { - btOpcode = BT_LO_OP_WRITE_REG_VALUE; - regType = pBtReq->pParamStart[1]; - pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; - regAddr = *pu4Tmp; - pu4Tmp = (pu4Byte)&pBtReq->pParamStart[6]; - regValue = *pu4Tmp; - DBG_8192C("[MPT], BT_GSET_REG regType=0x%x, regAddr=0x%x, regValue=0x%x!!\n", - regType, regAddr, regValue); - if(regType >= BT_REG_MAX) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || - ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || - ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || - ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || - ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - } - } - break; - case BT_GSET_RESET: - DBG_8192C("[MPT], [BT_GSET_RESET]\n"); - validParaLen = 0; - break; - case BT_GSET_TARGET_BD_ADDR: - DBG_8192C("[MPT], [BT_GSET_TARGET_BD_ADDR]\n"); - validParaLen = 6; - if(setParaLen == validParaLen) - { - btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; - if( (pBtReq->pParamStart[1]==0) && - (pBtReq->pParamStart[2]==0) && - (pBtReq->pParamStart[3]==0) && - (pBtReq->pParamStart[4]==0) && - (pBtReq->pParamStart[5]==0) && - (pBtReq->pParamStart[6]==0) ) - { - DBG_8192C("[MPT], Error!! targetBDAddr=all zero\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - if( (pBtReq->pParamStart[1]==0xff) && - (pBtReq->pParamStart[2]==0xff) && - (pBtReq->pParamStart[3]==0xff) && - (pBtReq->pParamStart[4]==0xff) && - (pBtReq->pParamStart[5]==0xff) && - (pBtReq->pParamStart[6]==0xff) ) - { - DBG_8192C("[MPT], Error!! targetBDAddr=all 0xf\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - bdAddr[0] = pBtReq->pParamStart[6]; - bdAddr[1] = pBtReq->pParamStart[5]; - bdAddr[2] = pBtReq->pParamStart[4]; - bdAddr[3] = pBtReq->pParamStart[3]; - bdAddr[4] = pBtReq->pParamStart[2]; - bdAddr[5] = pBtReq->pParamStart[1]; - DBG_8192C ("[MPT], target BDAddr:%x,%x,%x,%x,%x,%x\n", - bdAddr[0],bdAddr[1],bdAddr[2],bdAddr[3],bdAddr[4],bdAddr[5]); - } - break; - case BT_GSET_TX_PWR_FINETUNE: - DBG_8192C("[MPT], [BT_GSET_TX_PWR_FINETUNE]\n"); - validParaLen = 1; - if(setParaLen == validParaLen) - { - btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; - calVal = pBtReq->pParamStart[1]; - if( (calVal<1) || (calVal>9) ) - { - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - DBG_8192C ("[MPT], calVal=%d\n", calVal); - } - break; - case BT_SET_TRACKING_INTERVAL: - DBG_871X("[MPT], [BT_SET_TRACKING_INTERVAL] setParaLen =%d \n",setParaLen); - - validParaLen = 1; - if(setParaLen == validParaLen) - calVal = pBtReq->pParamStart[1]; - break; - case BT_SET_THERMAL_METER: - DBG_871X("[MPT], [BT_SET_THERMAL_METER] setParaLen =%d \n",setParaLen); - validParaLen = 1; - if(setParaLen == validParaLen) - calVal = pBtReq->pParamStart[1]; - break; - case BT_ENABLE_CFO_TRACKING: - DBG_871X("[MPT], [BT_ENABLE_CFO_TRACKING] setParaLen =%d \n",setParaLen); - validParaLen = 1; - if(setParaLen == validParaLen) - calVal = pBtReq->pParamStart[1]; - break; - case BT_GSET_UPDATE_BT_PATCH: - - break; - default: - { - DBG_8192C ("[MPT], Error!! setType=%d, out of range\n", setType); - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - break; - } - if(setParaLen != validParaLen) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_SET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", - setParaLen, setType, validParaLen); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - if(BT_GSET_REG == setType) - { - // fill h2c parameters - // here we should write reg value first then write the address, adviced by Austin - btOpcode = BT_LO_OP_WRITE_REG_VALUE; - h2cParaBuf[0] = pBtReq->pParamStart[6]; - h2cParaBuf[1] = pBtReq->pParamStart[7]; - h2cParaBuf[2] = pBtReq->pParamStart[8]; - h2cParaLen = 3; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // write reg address - btOpcode = BT_LO_OP_WRITE_REG_ADDR; - h2cParaBuf[0] = regType; - h2cParaBuf[1] = pBtReq->pParamStart[2]; - h2cParaBuf[2] = pBtReq->pParamStart[3]; - h2cParaLen = 3; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_GSET_RESET == setType) - { - btOpcode = BT_LO_OP_RESET; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_GSET_TARGET_BD_ADDR == setType) - { - // fill h2c parameters - btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_L; - h2cParaBuf[0] = pBtReq->pParamStart[1]; - h2cParaBuf[1] = pBtReq->pParamStart[2]; - h2cParaBuf[2] = pBtReq->pParamStart[3]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; - h2cParaBuf[0] = pBtReq->pParamStart[4]; - h2cParaBuf[1] = pBtReq->pParamStart[5]; - h2cParaBuf[2] = pBtReq->pParamStart[6]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_GSET_TX_PWR_FINETUNE == setType) - { - // fill h2c parameters - btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; - h2cParaBuf[0] = calVal; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_SET_TRACKING_INTERVAL == setType) - { - // BT_LO_OP_SET_TRACKING_INTERVAL = 0x22, - // BT_LO_OP_SET_THERMAL_METER = 0x23, - // BT_LO_OP_ENABLE_CFO_TRACKING = 0x24, - btOpcode = BT_LO_OP_SET_TRACKING_INTERVAL; - h2cParaBuf[0] = calVal; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_SET_THERMAL_METER == setType) - { - btOpcode = BT_LO_OP_SET_THERMAL_METER; - h2cParaBuf[0] = calVal; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_ENABLE_CFO_TRACKING == setType) - { - btOpcode = BT_LO_OP_ENABLE_CFO_TRACKING; - h2cParaBuf[0] = calVal; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - - -u2Byte -mptbt_BtSetTxRxPars( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - PBT_TXRX_PARAMETERS pTxRxPars=(PBT_TXRX_PARAMETERS)&pBtReq->pParamStart[0]; - u2Byte lenTxRx=sizeof(BT_TXRX_PARAMETERS); - u1Byte i; - u1Byte bdAddr[6]={0}; - - // - // check upper layer parameters - // - - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // 2. check upper layer parameter length - if(pBtReq->paraLength == sizeof(BT_TXRX_PARAMETERS)) - { - DBG_8192C ("[MPT], pTxRxPars->txrxChannel=0x%x \n", pTxRxPars->txrxChannel); - DBG_8192C ("[MPT], pTxRxPars->txrxTxPktCnt=0x%8x \n", pTxRxPars->txrxTxPktCnt); - DBG_8192C ("[MPT], pTxRxPars->txrxTxPktInterval=0x%x \n", pTxRxPars->txrxTxPktInterval); - DBG_8192C ("[MPT], pTxRxPars->txrxPayloadType=0x%x \n", pTxRxPars->txrxPayloadType); - DBG_8192C ("[MPT], pTxRxPars->txrxPktType=0x%x \n", pTxRxPars->txrxPktType); - DBG_8192C ("[MPT], pTxRxPars->txrxPayloadLen=0x%x \n", pTxRxPars->txrxPayloadLen); - DBG_8192C ("[MPT], pTxRxPars->txrxPktHeader=0x%x \n", pTxRxPars->txrxPktHeader); - DBG_8192C ("[MPT], pTxRxPars->txrxWhitenCoeff=0x%x \n", pTxRxPars->txrxWhitenCoeff); - bdAddr[0] = pTxRxPars->txrxBdaddr[5]; - bdAddr[1] = pTxRxPars->txrxBdaddr[4]; - bdAddr[2] = pTxRxPars->txrxBdaddr[3]; - bdAddr[3] = pTxRxPars->txrxBdaddr[2]; - bdAddr[4] = pTxRxPars->txrxBdaddr[1]; - bdAddr[5] = pTxRxPars->txrxBdaddr[0]; - DBG_8192C ("[MPT], pTxRxPars->txrxBdaddr: %s", &bdAddr[0]); - DBG_8192C ("[MPT], pTxRxPars->txrxTxGainIndex=0x%x \n", pTxRxPars->txrxTxGainIndex); - } - else - { - DBG_8192C ("[MPT], Error!! pBtReq->paraLength=%d, correct Len=%d\n", pBtReq->paraLength, lenTxRx); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_HEADER; - if(pTxRxPars->txrxPktHeader > 0x3ffff) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPktHeader=0x%x is out of range, (should be between 0x0~0x3ffff)\n", pTxRxPars->txrxPktHeader); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = (u1Byte)(pTxRxPars->txrxPktHeader&0xff); - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff00)>>8); - h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff0000)>>16); - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_TYPE_LEN; - { - u2Byte payloadLenLimit=0; - switch(pTxRxPars->txrxPktType) - { - case MP_BT_PKT_DH1: - payloadLenLimit = 27*8; - break; - case MP_BT_PKT_DH3: - payloadLenLimit = 183*8; - break; - case MP_BT_PKT_DH5: - payloadLenLimit = 339*8; - break; - case MP_BT_PKT_2DH1: - payloadLenLimit = 54*8; - break; - case MP_BT_PKT_2DH3: - payloadLenLimit = 367*8; - break; - case MP_BT_PKT_2DH5: - payloadLenLimit = 679*8; - break; - case MP_BT_PKT_3DH1: - payloadLenLimit = 83*8; - break; - case MP_BT_PKT_3DH3: - payloadLenLimit = 552*8; - break; - case MP_BT_PKT_3DH5: - payloadLenLimit = 1021*8; - break; - case MP_BT_PKT_LE: - payloadLenLimit = 39*8; - break; - default: - { - DBG_8192C ("[MPT], Error!! Unknown pTxRxPars->txrxPktType=0x%x\n", pTxRxPars->txrxPktType); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - break; - } - - if(pTxRxPars->txrxPayloadLen > payloadLenLimit) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadLen=0x%x, (should smaller than %d)\n", - pTxRxPars->txrxPayloadLen, payloadLenLimit); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - - h2cParaBuf[0] = pTxRxPars->txrxPktType; - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff)); - h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff00)>>8); - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_CNT_L_PL_TYPE; - if(pTxRxPars->txrxPayloadType > MP_BT_PAYLOAD_MAX) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadType=0x%x, (should be between 0~4)\n", pTxRxPars->txrxPayloadType); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff)); - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff00)>>8); - h2cParaBuf[2] = pTxRxPars->txrxPayloadType; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_CNT_H_PKT_INTV; - if(pTxRxPars->txrxTxPktInterval > 15) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxPktInterval=0x%x, (should be between 0~15)\n", pTxRxPars->txrxTxPktInterval); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff0000)>>16); - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff000000)>>24); - h2cParaBuf[2] = pTxRxPars->txrxTxPktInterval; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_WHITENCOEFF; - { - h2cParaBuf[0] = pTxRxPars->txrxWhitenCoeff; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_CHNL_TX_GAIN; - if( (pTxRxPars->txrxChannel > 78) || - (pTxRxPars->txrxTxGainIndex > 7) ) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxChannel=0x%x, (should be between 0~78)\n", pTxRxPars->txrxChannel); - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxGainIndex=0x%x, (should be between 0~7)\n", pTxRxPars->txrxTxGainIndex); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = pTxRxPars->txrxChannel; - h2cParaBuf[1] = pTxRxPars->txrxTxGainIndex; - h2cParaLen = 2; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_BD_ADDR_L; - if( (pTxRxPars->txrxBdaddr[0]==0) && - (pTxRxPars->txrxBdaddr[1]==0) && - (pTxRxPars->txrxBdaddr[2]==0) && - (pTxRxPars->txrxBdaddr[3]==0) && - (pTxRxPars->txrxBdaddr[4]==0) && - (pTxRxPars->txrxBdaddr[5]==0) ) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all zero\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - if( (pTxRxPars->txrxBdaddr[0]==0xff) && - (pTxRxPars->txrxBdaddr[1]==0xff) && - (pTxRxPars->txrxBdaddr[2]==0xff) && - (pTxRxPars->txrxBdaddr[3]==0xff) && - (pTxRxPars->txrxBdaddr[4]==0xff) && - (pTxRxPars->txrxBdaddr[5]==0xff) ) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all 0xf\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - - { - h2cParaBuf[0] = pTxRxPars->txrxBdaddr[0]; - h2cParaBuf[1] = pTxRxPars->txrxBdaddr[1]; - h2cParaBuf[2] = pTxRxPars->txrxBdaddr[2]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - btOpcode = BT_LO_OP_SET_BD_ADDR_H; - { - h2cParaBuf[0] = pTxRxPars->txrxBdaddr[3]; - h2cParaBuf[1] = pTxRxPars->txrxBdaddr[4]; - h2cParaBuf[2] = pTxRxPars->txrxBdaddr[5]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - - -u2Byte -mptbt_BtTestCtrl( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte testCtrl=0; - - // - // check upper layer parameters - // - - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // 2. check upper layer parameter length - if(1 == pBtReq->paraLength) - { - testCtrl = pBtReq->pParamStart[0]; - DBG_8192C("[MPT], testCtrl=%d \n", testCtrl); - } - else - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - - // 1. fill h2c parameters - // check bt mode - btOpcode = BT_LO_OP_TEST_CTRL; - if(testCtrl >= MP_BT_TEST_MAX) - { - DBG_8192C("[MPT], Error!! testCtrl=0x%x, (should be between smaller or equal to 0x%x)\n", - testCtrl, MP_BT_TEST_MAX-1); - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = testCtrl; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // 3. construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - -u2Byte -mptbt_TestBT( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte testCtrl=0; - - // 1. fill h2c parameters - btOpcode = 0x11; - h2cParaBuf[0] = 0x11; - h2cParaBuf[1] = 0x0; - h2cParaBuf[2] = 0x0; - h2cParaBuf[3] = 0x0; - h2cParaBuf[4] = 0x0; - h2cParaLen = 1; - // retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, h2cParaBuf, h2cParaLen); - - - // 3. construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - -VOID -mptbt_BtControlProcess( - PADAPTER Adapter, - PVOID pInBuf - ) -{ - u1Byte H2C_Parameter[6] ={0}; - PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_REQ_CMD pBtReq=(PBT_REQ_CMD)pInBuf; - PBT_RSP_CMD pBtRsp; - u1Byte i; - - - DBG_8192C("[MPT], mptbt_BtControlProcess()=========>\n"); - - DBG_8192C("[MPT], input opCodeVer=%d\n", pBtReq->opCodeVer); - DBG_8192C("[MPT], input OpCode=%d\n", pBtReq->OpCode); - DBG_8192C("[MPT], paraLength=%d \n", pBtReq->paraLength); - if(pBtReq->paraLength) - { - //DBG_8192C("[MPT], parameters(hex):0x%x %d \n",&pBtReq->pParamStart[0], pBtReq->paraLength); - } - - _rtw_memset((void*)pMptCtx->mptOutBuf, 0, 100); - pMptCtx->mptOutLen = 4; //length of (BT_RSP_CMD.status+BT_RSP_CMD.paraLength) - - pBtRsp = (PBT_RSP_CMD)pMptCtx->mptOutBuf; - pBtRsp->status = BT_STATUS_SUCCESS; - pBtRsp->paraLength = 0x0; - - // The following we should maintain the User OP codes sent by upper layer - switch(pBtReq->OpCode) - { - case BT_UP_OP_BT_READY: - DBG_8192C("[MPT], OPcode : [BT_READY]\n"); - pBtRsp->paraLength = mptbt_BtReady(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_SET_MODE: - DBG_8192C("[MPT], OPcode : [BT_SET_MODE]\n"); - pBtRsp->paraLength = mptbt_BtSetMode(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_SET_TX_RX_PARAMETER: - DBG_8192C("[MPT], OPcode : [BT_SET_TXRX_PARAMETER]\n"); - pBtRsp->paraLength = mptbt_BtSetTxRxPars(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_SET_GENERAL: - DBG_8192C("[MPT], OPcode : [BT_SET_GENERAL]\n"); - pBtRsp->paraLength = mptbt_BtSetGeneral(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_GET_GENERAL: - DBG_8192C("[MPT], OPcode : [BT_GET_GENERAL]\n"); - pBtRsp->paraLength = mptbt_BtGetGeneral(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_TEST_CTRL: - DBG_8192C("[MPT], OPcode : [BT_TEST_CTRL]\n"); - pBtRsp->paraLength = mptbt_BtTestCtrl(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_TEST_BT: - DBG_8192C("[MPT], OPcode : [TEST_BT]\n"); - pBtRsp->paraLength = mptbt_TestBT(Adapter, pBtReq, pBtRsp); - break; - default: - DBG_8192C("[MPT], Error!! OPcode : UNDEFINED!!!!\n"); - pBtRsp->status = BT_STATUS_UNKNOWN_OPCODE_U; - pBtRsp->paraLength = 0x0; - break; - } - - pMptCtx->mptOutLen += pBtRsp->paraLength; - - DBG_8192C("[MPT], pMptCtx->mptOutLen=%d, pBtRsp->paraLength=%d\n", pMptCtx->mptOutLen, pBtRsp->paraLength); - DBG_8192C("[MPT], mptbt_BtControlProcess()<=========\n"); -} - -#endif - +/****************************************************************************** + * + * 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 +#include + +#if defined(CONFIG_RTL8723B) + #include +#endif + +#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) +void MPh2c_timeout_handle(void *FunctionContext) +{ + PADAPTER pAdapter; + PMPT_CONTEXT pMptCtx; + + + RTW_INFO("[MPT], MPh2c_timeout_handle\n"); + + pAdapter = (PADAPTER)FunctionContext; + pMptCtx = &pAdapter->mppriv.MptCtx; + + pMptCtx->bMPh2c_timeout = _TRUE; + + if ((_FALSE == pMptCtx->MptH2cRspEvent) + || ((_TRUE == pMptCtx->MptH2cRspEvent) + && (_FALSE == pMptCtx->MptBtC2hEvent))) + _rtw_up_sema(&pMptCtx->MPh2c_Sema); +} + +u32 WaitC2Hevent(PADAPTER pAdapter, u8 *C2H_event, u32 delay_time) +{ + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); + pMptCtx->bMPh2c_timeout = _FALSE; + + if (pAdapter->registrypriv.mp_mode == 0) { + RTW_INFO("[MPT], Error!! WaitC2Hevent mp_mode == 0!!\n"); + return _FALSE; + } + + _set_timer(&pMptCtx->MPh2c_timeout_timer, delay_time); + + _rtw_down_sema(&pMptCtx->MPh2c_Sema); + + if (pMptCtx->bMPh2c_timeout == _TRUE) { + *C2H_event = _FALSE; + + return _FALSE; + } + + /* for safty, cancel timer here again */ + _cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer); + + return _TRUE; +} + +BT_CTRL_STATUS +mptbt_CheckC2hFrame( + PADAPTER Adapter, + PBT_H2C pH2c, + PBT_EXT_C2H pExtC2h +) +{ + BT_CTRL_STATUS c2hStatus = BT_STATUS_C2H_SUCCESS; + + /* RTW_INFO("[MPT], MPT rsp C2H hex: %x %x %x %x %x %x\n"), pExtC2h , pExtC2h+1 ,pExtC2h+2 ,pExtC2h+3 ,pExtC2h+4 ,pExtC2h+5); */ + + RTW_INFO("[MPT], statusCode = 0x%x\n", pExtC2h->statusCode); + RTW_INFO("[MPT], retLen = %d\n", pExtC2h->retLen); + RTW_INFO("[MPT], opCodeVer : req/rsp=%d/%d\n", pH2c->opCodeVer, pExtC2h->opCodeVer); + RTW_INFO("[MPT], reqNum : req/rsp=%d/%d\n", pH2c->reqNum, pExtC2h->reqNum); + if (pExtC2h->reqNum != pH2c->reqNum) { + c2hStatus = BT_STATUS_C2H_REQNUM_MISMATCH; + RTW_INFO("[MPT], Error!! C2H reqNum Mismatch!!\n"); + } else if (pExtC2h->opCodeVer != pH2c->opCodeVer) { + c2hStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; + RTW_INFO("[MPT], Error!! OPCode version L mismatch!!\n"); + } + + return c2hStatus; +} + +BT_CTRL_STATUS +mptbt_SendH2c( + PADAPTER Adapter, + PBT_H2C pH2c, + u2Byte h2cCmdLen +) +{ + /* KIRQL OldIrql = KeGetCurrentIrql(); */ + BT_CTRL_STATUS h2cStatus = BT_STATUS_H2C_SUCCESS; + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + u1Byte i; + + RTW_INFO("[MPT], mptbt_SendH2c()=========>\n"); + + /* PlatformResetEvent(&pMptCtx->MptH2cRspEvent); */ + /* PlatformResetEvent(&pMptCtx->MptBtC2hEvent); */ + + /* if(OldIrql == PASSIVE_LEVEL) + * { */ + /* RTPRINT_DATA(FMPBT, FMPBT_H2C_CONTENT, ("[MPT], MPT H2C hex:\n"), pH2c, h2cCmdLen); */ + + for (i = 0; i < BT_H2C_MAX_RETRY; i++) { + RTW_INFO("[MPT], Send H2C command to wifi!!!\n"); + + pMptCtx->MptH2cRspEvent = _FALSE; + pMptCtx->MptBtC2hEvent = _FALSE; + +#if defined(CONFIG_RTL8723B) + rtl8723b_set_FwBtMpOper_cmd(Adapter, pH2c->opCode, pH2c->opCodeVer, pH2c->reqNum, pH2c->buf); +#endif + pMptCtx->h2cReqNum++; + pMptCtx->h2cReqNum %= 16; + + if (WaitC2Hevent(Adapter, &pMptCtx->MptH2cRspEvent, 100)) { + RTW_INFO("[MPT], Received WiFi MptH2cRspEvent!!!\n"); + if (WaitC2Hevent(Adapter, &pMptCtx->MptBtC2hEvent, 400)) { + RTW_INFO("[MPT], Received MptBtC2hEvent!!!\n"); + break; + } else { + RTW_INFO("[MPT], Error!!BT MptBtC2hEvent timeout!!\n"); + h2cStatus = BT_STATUS_H2C_BT_NO_RSP; + } + } else { + RTW_INFO("[MPT], Error!!WiFi MptH2cRspEvent timeout!!\n"); + h2cStatus = BT_STATUS_H2C_TIMTOUT; + } + } + /* } + * else + * { + * RT_ASSERT(FALSE, ("[MPT], mptbt_SendH2c() can only run under PASSIVE_LEVEL!!\n")); + * h2cStatus = BT_STATUS_WRONG_LEVEL; + * } */ + + RTW_INFO("[MPT], mptbt_SendH2c()<=========\n"); + return h2cStatus; +} + + + +BT_CTRL_STATUS +mptbt_CheckBtRspStatus( + PADAPTER Adapter, + PBT_EXT_C2H pExtC2h +) +{ + BT_CTRL_STATUS retStatus = BT_OP_STATUS_SUCCESS; + + switch (pExtC2h->statusCode) { + case BT_OP_STATUS_SUCCESS: + retStatus = BT_STATUS_BT_OP_SUCCESS; + RTW_INFO("[MPT], BT status : BT_STATUS_SUCCESS\n"); + break; + case BT_OP_STATUS_VERSION_MISMATCH: + retStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; + RTW_INFO("[MPT], BT status : BT_STATUS_OPCODE_L_VERSION_MISMATCH\n"); + break; + case BT_OP_STATUS_UNKNOWN_OPCODE: + retStatus = BT_STATUS_UNKNOWN_OPCODE_L; + RTW_INFO("[MPT], BT status : BT_STATUS_UNKNOWN_OPCODE_L\n"); + break; + case BT_OP_STATUS_ERROR_PARAMETER: + retStatus = BT_STATUS_PARAMETER_FORMAT_ERROR_L; + RTW_INFO("[MPT], BT status : BT_STATUS_PARAMETER_FORMAT_ERROR_L\n"); + break; + default: + retStatus = BT_STATUS_UNKNOWN_STATUS_L; + RTW_INFO("[MPT], BT status : BT_STATUS_UNKNOWN_STATUS_L\n"); + break; + } + + return retStatus; +} + + + +BT_CTRL_STATUS +mptbt_BtFwOpCodeProcess( + PADAPTER Adapter, + u1Byte btFwOpCode, + u1Byte opCodeVer, + pu1Byte pH2cPar, + u1Byte h2cParaLen +) +{ + u1Byte H2C_Parameter[6] = {0}; + PBT_H2C pH2c = (PBT_H2C)&H2C_Parameter[0]; + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h = (PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; + u2Byte paraLen = 0, i; + BT_CTRL_STATUS h2cStatus = BT_STATUS_H2C_SUCCESS, c2hStatus = BT_STATUS_C2H_SUCCESS; + BT_CTRL_STATUS retStatus = BT_STATUS_H2C_BT_NO_RSP; + + if (Adapter->registrypriv.mp_mode == 0) { + RTW_INFO("[MPT], Error!! mptbt_BtFwOpCodeProces mp_mode == 0!!\n"); + return _FALSE; + } + + pH2c->opCode = btFwOpCode; + pH2c->opCodeVer = opCodeVer; + pH2c->reqNum = pMptCtx->h2cReqNum; + /* PlatformMoveMemory(&pH2c->buf[0], pH2cPar, h2cParaLen); */ + /* _rtw_memcpy(&pH2c->buf[0], pH2cPar, h2cParaLen); */ + _rtw_memcpy(pH2c->buf, pH2cPar, h2cParaLen); + + RTW_INFO("[MPT], pH2c->opCode=%d\n", pH2c->opCode); + RTW_INFO("[MPT], pH2c->opCodeVer=%d\n", pH2c->opCodeVer); + RTW_INFO("[MPT], pH2c->reqNum=%d\n", pH2c->reqNum); + RTW_INFO("[MPT], h2c parameter length=%d\n", h2cParaLen); + for (i = 0; i < h2cParaLen; i++) + RTW_INFO("[MPT], parameter[%d]=0x%02x\n", i, pH2c->buf[i]); + + h2cStatus = mptbt_SendH2c(Adapter, pH2c, h2cParaLen + 2); + if (BT_STATUS_H2C_SUCCESS == h2cStatus) { + /* if reach here, it means H2C get the correct c2h response, */ + c2hStatus = mptbt_CheckC2hFrame(Adapter, pH2c, pExtC2h); + if (BT_STATUS_C2H_SUCCESS == c2hStatus) + retStatus = mptbt_CheckBtRspStatus(Adapter, pExtC2h); + else { + RTW_INFO("[MPT], Error!! C2H failed for pH2c->opCode=%d\n", pH2c->opCode); + /* check c2h status error, return error status code to upper layer. */ + retStatus = c2hStatus; + } + } else { + RTW_INFO("[MPT], Error!! H2C failed for pH2c->opCode=%d\n", pH2c->opCode); + /* check h2c status error, return error status code to upper layer. */ + retStatus = h2cStatus; + } + + return retStatus; +} + + + + +u2Byte +mptbt_BtReady( + PADAPTER Adapter, + PBT_REQ_CMD pBtReq, + PBT_RSP_CMD pBtRsp +) +{ + u1Byte h2cParaBuf[6] = {0}; + u1Byte h2cParaLen = 0; + u2Byte paraLen = 0; + u1Byte retStatus = BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer = 0; + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h = (PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; + u1Byte i; + u1Byte btFwVer = 0, bdAddr[6] = {0}; + u2Byte btRealFwVer = 0; + pu2Byte pu2Tmp = NULL; + + /* */ + /* check upper layer parameters */ + /* */ + + /* 1. check upper layer opcode version */ + if (pBtReq->opCodeVer != 1) { + RTW_INFO("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + + pBtRsp->pParamStart[0] = MP_BT_NOT_READY; + paraLen = 10; + /* */ + /* execute lower layer opcodes */ + /* */ + + /* Get BT FW version */ + /* fill h2c parameters */ + btOpcode = BT_LO_OP_GET_BT_VERSION; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } else { + pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; + btRealFwVer = *pu2Tmp; + btFwVer = pExtC2h->buf[1]; + RTW_INFO("[MPT], btRealFwVer=0x%x, btFwVer=0x%x\n", btRealFwVer, btFwVer); + } + + /* Get BD Address */ + /* fill h2c parameters */ + btOpcode = BT_LO_OP_GET_BD_ADDR_L; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } else { + bdAddr[5] = pExtC2h->buf[0]; + bdAddr[4] = pExtC2h->buf[1]; + bdAddr[3] = pExtC2h->buf[2]; + } + + /* fill h2c parameters */ + btOpcode = BT_LO_OP_GET_BD_ADDR_H; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } else { + bdAddr[2] = pExtC2h->buf[0]; + bdAddr[1] = pExtC2h->buf[1]; + bdAddr[0] = pExtC2h->buf[2]; + } + RTW_INFO("[MPT], Local BDAddr:"); + for (i = 0; i < 6; i++) + RTW_INFO(" 0x%x ", bdAddr[i]); + pBtRsp->status = BT_STATUS_SUCCESS; + pBtRsp->pParamStart[0] = MP_BT_READY; + pu2Tmp = (pu2Byte)&pBtRsp->pParamStart[1]; + *pu2Tmp = btRealFwVer; + pBtRsp->pParamStart[3] = btFwVer; + for (i = 0; i < 6; i++) + pBtRsp->pParamStart[4 + i] = bdAddr[5 - i]; + + return paraLen; +} + +void mptbt_close_WiFiRF(PADAPTER Adapter) +{ + PHY_SetBBReg(Adapter, 0x824, 0xF, 0x0); + PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x0); + PHY_SetRFReg(Adapter, RF_PATH_A, 0x0, 0xF0000, 0x0); +} + +void mptbt_open_WiFiRF(PADAPTER Adapter) +{ + PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x3); + PHY_SetBBReg(Adapter, 0x824, 0xF, 0x2); + PHY_SetRFReg(Adapter, RF_PATH_A, 0x0, 0xF0000, 0x3); +} + +u4Byte mptbt_switch_RF(PADAPTER Adapter, u1Byte Enter) +{ + u2Byte tmp_2byte = 0; + + /* Enter test mode */ + if (Enter) { + /* 1>. close WiFi RF */ + mptbt_close_WiFiRF(Adapter); + + /* 2>. change ant switch to BT */ + tmp_2byte = rtw_read16(Adapter, 0x860); + tmp_2byte = tmp_2byte | BIT(9); + tmp_2byte = tmp_2byte & (~BIT(8)); + rtw_write16(Adapter, 0x860, tmp_2byte); + rtw_write16(Adapter, 0x870, 0x300); + } else { + /* 1>. Open WiFi RF */ + mptbt_open_WiFiRF(Adapter); + + /* 2>. change ant switch back */ + tmp_2byte = rtw_read16(Adapter, 0x860); + tmp_2byte = tmp_2byte | BIT(8); + tmp_2byte = tmp_2byte & (~BIT(9)); + rtw_write16(Adapter, 0x860, tmp_2byte); + rtw_write16(Adapter, 0x870, 0x300); + } + + return 0; +} + +u2Byte +mptbt_BtSetMode( + PADAPTER Adapter, + PBT_REQ_CMD pBtReq, + PBT_RSP_CMD pBtRsp +) +{ + u1Byte h2cParaBuf[6] = {0}; + u1Byte h2cParaLen = 0; + u2Byte paraLen = 0; + u1Byte retStatus = BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer = 0; + u1Byte btModeToSet = 0; + + /* */ + /* check upper layer parameters */ + /* */ + /* 1. check upper layer opcode version */ + if (pBtReq->opCodeVer != 1) { + RTW_INFO("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + /* 2. check upper layer parameter length */ + if (1 == pBtReq->paraLength) { + btModeToSet = pBtReq->pParamStart[0]; + RTW_INFO("[MPT], BtTestMode=%d\n", btModeToSet); + } else { + RTW_INFO("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + /* */ + /* execute lower layer opcodes */ + /* */ + + /* 1. fill h2c parameters */ + /* check bt mode */ + btOpcode = BT_LO_OP_SET_BT_MODE; + if (btModeToSet >= MP_BT_MODE_MAX) { + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } else { + mptbt_switch_RF(Adapter, 1); + + h2cParaBuf[0] = btModeToSet; + h2cParaLen = 1; + /* 2. execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + /* 3. construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS == retStatus) + pBtRsp->status = BT_STATUS_SUCCESS; + else { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + } + + return paraLen; +} + + +VOID +MPTBT_FwC2hBtMpCtrl( + PADAPTER Adapter, + pu1Byte tmpBuf, + u1Byte length +) +{ + u32 i; + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h = (PBT_EXT_C2H)tmpBuf; + + if (Adapter->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0) { + /* RTW_INFO("Ignore C2H BT MP Info since not in MP mode\n"); */ + return; + } + if (length > 32 || length < 3) { + RTW_INFO("\n [MPT], pExtC2h->buf hex: length=%d > 32 || < 3\n", length); + return; + } + + /* cancel_timeout for h2c handle */ + _cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer); + + for (i = 0; i < length; i++) + RTW_INFO("[MPT], %s, buf[%d]=0x%02x ", __FUNCTION__, i, tmpBuf[i]); + RTW_INFO("[MPT], pExtC2h->extendId=0x%x\n", pExtC2h->extendId); + + switch (pExtC2h->extendId) { + case EXT_C2H_WIFI_FW_ACTIVE_RSP: + RTW_INFO("[MPT], EXT_C2H_WIFI_FW_ACTIVE_RSP\n"); +#if 0 + RTW_INFO("[MPT], pExtC2h->buf hex:\n"); + for (i = 0; i < (length - 3); i++) + RTW_INFO(" 0x%x ", pExtC2h->buf[i]); +#endif + if ((_FALSE == pMptCtx->bMPh2c_timeout) + && (_FALSE == pMptCtx->MptH2cRspEvent)) { + pMptCtx->MptH2cRspEvent = _TRUE; + _rtw_up_sema(&pMptCtx->MPh2c_Sema); + } + break; + + case EXT_C2H_TRIG_BY_BT_FW: + RTW_INFO("[MPT], EXT_C2H_TRIG_BY_BT_FW\n"); + _rtw_memcpy(&pMptCtx->c2hBuf[0], tmpBuf, length); + RTW_INFO("[MPT], pExtC2h->statusCode=0x%x\n", pExtC2h->statusCode); + RTW_INFO("[MPT], pExtC2h->retLen=0x%x\n", pExtC2h->retLen); + RTW_INFO("[MPT], pExtC2h->opCodeVer=0x%x\n", pExtC2h->opCodeVer); + RTW_INFO("[MPT], pExtC2h->reqNum=0x%x\n", pExtC2h->reqNum); + for (i = 0; i < (length - 3); i++) + RTW_INFO("[MPT], pExtC2h->buf[%d]=0x%02x\n", i, pExtC2h->buf[i]); + + if ((_FALSE == pMptCtx->bMPh2c_timeout) + && (_TRUE == pMptCtx->MptH2cRspEvent) + && (_FALSE == pMptCtx->MptBtC2hEvent)) { + pMptCtx->MptBtC2hEvent = _TRUE; + _rtw_up_sema(&pMptCtx->MPh2c_Sema); + } + break; + + default: + RTW_INFO("[MPT], EXT_C2H Target not found,pExtC2h->extendId =%d ,pExtC2h->reqNum=%d\n", pExtC2h->extendId, pExtC2h->reqNum); + break; + } + + + +} + + +u2Byte +mptbt_BtGetGeneral( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp +) +{ + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h = (PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; + u1Byte h2cParaBuf[6] = {0}; + u1Byte h2cParaLen = 0; + u2Byte paraLen = 0; + u1Byte retStatus = BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode, bdAddr[6] = {0}; + u1Byte btOpcodeVer = 0; + u1Byte getType = 0, i; + u2Byte getParaLen = 0, validParaLen = 0; + u1Byte regType = 0, reportType = 0; + u4Byte regAddr = 0, regValue = 0; + pu4Byte pu4Tmp; + pu2Byte pu2Tmp; + pu1Byte pu1Tmp; + + /* */ + /* check upper layer parameters */ + /* */ + + /* check upper layer opcode version */ + if (pBtReq->opCodeVer != 1) { + RTW_INFO("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + /* check upper layer parameter length */ + if (pBtReq->paraLength < 1) { + RTW_INFO("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + getParaLen = pBtReq->paraLength - 1; + getType = pBtReq->pParamStart[0]; + + RTW_INFO("[MPT], getType=%d, getParaLen=%d\n", getType, getParaLen); + + /* check parameter first */ + switch (getType) { + case BT_GGET_REG: + RTW_INFO("[MPT], [BT_GGET_REG]\n"); + validParaLen = 5; + if (getParaLen == validParaLen) { + btOpcode = BT_LO_OP_READ_REG; + regType = pBtReq->pParamStart[1]; + pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; + regAddr = *pu4Tmp; + RTW_INFO("[MPT], BT_GGET_REG regType=0x%02x, regAddr=0x%08x!!\n", + regType, regAddr); + if (regType >= BT_REG_MAX) { + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } else { + if (((BT_REG_RF == regType) && (regAddr > 0x7f)) || + ((BT_REG_MODEM == regType) && (regAddr > 0x1ff)) || + ((BT_REG_BLUEWIZE == regType) && (regAddr > 0xfff)) || + ((BT_REG_VENDOR == regType) && (regAddr > 0xfff)) || + ((BT_REG_LE == regType) && (regAddr > 0xfff))) { + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + } + } + break; + case BT_GGET_STATUS: + RTW_INFO("[MPT], [BT_GGET_STATUS]\n"); + validParaLen = 0; + break; + case BT_GGET_REPORT: + RTW_INFO("[MPT], [BT_GGET_REPORT]\n"); + validParaLen = 1; + if (getParaLen == validParaLen) { + reportType = pBtReq->pParamStart[1]; + RTW_INFO("[MPT], BT_GGET_REPORT reportType=0x%x!!\n", reportType); + if (reportType >= BT_REPORT_MAX) { + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + } + break; + default: { + RTW_INFO("[MPT], Error!! getType=%d, out of range\n", getType); + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + break; + } + if (getParaLen != validParaLen) { + RTW_INFO("[MPT], Error!! wrong parameter length=%d for BT_GET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", + getParaLen, getType, validParaLen); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + /* */ + /* execute lower layer opcodes */ + /* */ + if (BT_GGET_REG == getType) { + /* fill h2c parameters */ + /* here we should write reg value first then write the address, adviced by Austin */ + btOpcode = BT_LO_OP_READ_REG; + h2cParaBuf[0] = regType; + h2cParaBuf[1] = pBtReq->pParamStart[2]; + h2cParaBuf[2] = pBtReq->pParamStart[3]; + h2cParaLen = 3; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; + regValue = *pu2Tmp; + RTW_INFO("[MPT], read reg regType=0x%02x, regAddr=0x%08x, regValue=0x%04x\n", + regType, regAddr, regValue); + + pu4Tmp = (pu4Byte)&pBtRsp->pParamStart[0]; + *pu4Tmp = regValue; + paraLen = 4; + } else if (BT_GGET_STATUS == getType) { + btOpcode = BT_LO_OP_GET_BT_STATUS; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + RTW_INFO("[MPT], read bt status, testMode=0x%x, testStatus=0x%x\n", + pBtRsp->pParamStart[0], pBtRsp->pParamStart[1]); + paraLen = 2; + } else if (BT_GGET_REPORT == getType) { + switch (reportType) { + case BT_REPORT_RX_PACKET_CNT: { + RTW_INFO("[MPT], [Rx Packet Counts]\n"); + btOpcode = BT_LO_OP_GET_RX_PKT_CNT_L; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + + btOpcode = BT_LO_OP_GET_RX_PKT_CNT_H; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[2] = pExtC2h->buf[0]; + pBtRsp->pParamStart[3] = pExtC2h->buf[1]; + paraLen = 4; + } + break; + case BT_REPORT_RX_ERROR_BITS: { + RTW_INFO("[MPT], [Rx Error Bits]\n"); + btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_L; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + + btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_H; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[2] = pExtC2h->buf[0]; + pBtRsp->pParamStart[3] = pExtC2h->buf[1]; + paraLen = 4; + } + break; + case BT_REPORT_RSSI: { + RTW_INFO("[MPT], [RSSI]\n"); + btOpcode = BT_LO_OP_GET_RSSI; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + paraLen = 2; + } + break; + case BT_REPORT_CFO_HDR_QUALITY: { + RTW_INFO("[MPT], [CFO & Header Quality]\n"); + btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_L; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + + btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_H; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[2] = pExtC2h->buf[0]; + pBtRsp->pParamStart[3] = pExtC2h->buf[1]; + paraLen = 4; + } + break; + case BT_REPORT_CONNECT_TARGET_BD_ADDR: { + RTW_INFO("[MPT], [Connected Target BD ADDR]\n"); + btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_L; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + bdAddr[5] = pExtC2h->buf[0]; + bdAddr[4] = pExtC2h->buf[1]; + bdAddr[3] = pExtC2h->buf[2]; + + btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_H; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + bdAddr[2] = pExtC2h->buf[0]; + bdAddr[1] = pExtC2h->buf[1]; + bdAddr[0] = pExtC2h->buf[2]; + + RTW_INFO("[MPT], Connected Target BDAddr:%s", bdAddr); + for (i = 0; i < 6; i++) + pBtRsp->pParamStart[i] = bdAddr[5 - i]; + paraLen = 6; + } + break; + default: + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + break; + } + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + + +u2Byte +mptbt_BtSetGeneral( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp +) +{ + u1Byte h2cParaBuf[6] = {0}; + u1Byte h2cParaLen = 0; + u2Byte paraLen = 0; + u1Byte retStatus = BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer = 0; + u1Byte setType = 0; + u2Byte setParaLen = 0, validParaLen = 0; + u1Byte regType = 0, bdAddr[6] = {0}, calVal = 0; + u4Byte regAddr = 0, regValue = 0; + pu4Byte pu4Tmp; + pu2Byte pu2Tmp; + pu1Byte pu1Tmp; + + /* */ + /* check upper layer parameters */ + /* */ + + /* check upper layer opcode version */ + if (pBtReq->opCodeVer != 1) { + RTW_INFO("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + /* check upper layer parameter length */ + if (pBtReq->paraLength < 1) { + RTW_INFO("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + setParaLen = pBtReq->paraLength - 1; + setType = pBtReq->pParamStart[0]; + + RTW_INFO("[MPT], setType=%d, setParaLen=%d\n", setType, setParaLen); + + /* check parameter first */ + switch (setType) { + case BT_GSET_REG: + RTW_INFO("[MPT], [BT_GSET_REG]\n"); + validParaLen = 9; + if (setParaLen == validParaLen) { + btOpcode = BT_LO_OP_WRITE_REG_VALUE; + regType = pBtReq->pParamStart[1]; + pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; + regAddr = *pu4Tmp; + pu4Tmp = (pu4Byte)&pBtReq->pParamStart[6]; + regValue = *pu4Tmp; + RTW_INFO("[MPT], BT_GSET_REG regType=0x%x, regAddr=0x%x, regValue=0x%x!!\n", + regType, regAddr, regValue); + if (regType >= BT_REG_MAX) { + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } else { + if (((BT_REG_RF == regType) && (regAddr > 0x7f)) || + ((BT_REG_MODEM == regType) && (regAddr > 0x1ff)) || + ((BT_REG_BLUEWIZE == regType) && (regAddr > 0xfff)) || + ((BT_REG_VENDOR == regType) && (regAddr > 0xfff)) || + ((BT_REG_LE == regType) && (regAddr > 0xfff))) { + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + } + } + break; + case BT_GSET_RESET: + RTW_INFO("[MPT], [BT_GSET_RESET]\n"); + validParaLen = 0; + break; + case BT_GSET_TARGET_BD_ADDR: + RTW_INFO("[MPT], [BT_GSET_TARGET_BD_ADDR]\n"); + validParaLen = 6; + if (setParaLen == validParaLen) { + btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; + if ((pBtReq->pParamStart[1] == 0) && + (pBtReq->pParamStart[2] == 0) && + (pBtReq->pParamStart[3] == 0) && + (pBtReq->pParamStart[4] == 0) && + (pBtReq->pParamStart[5] == 0) && + (pBtReq->pParamStart[6] == 0)) { + RTW_INFO("[MPT], Error!! targetBDAddr=all zero\n"); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + if ((pBtReq->pParamStart[1] == 0xff) && + (pBtReq->pParamStart[2] == 0xff) && + (pBtReq->pParamStart[3] == 0xff) && + (pBtReq->pParamStart[4] == 0xff) && + (pBtReq->pParamStart[5] == 0xff) && + (pBtReq->pParamStart[6] == 0xff)) { + RTW_INFO("[MPT], Error!! targetBDAddr=all 0xf\n"); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + bdAddr[0] = pBtReq->pParamStart[6]; + bdAddr[1] = pBtReq->pParamStart[5]; + bdAddr[2] = pBtReq->pParamStart[4]; + bdAddr[3] = pBtReq->pParamStart[3]; + bdAddr[4] = pBtReq->pParamStart[2]; + bdAddr[5] = pBtReq->pParamStart[1]; + RTW_INFO("[MPT], target BDAddr:%x,%x,%x,%x,%x,%x\n", + bdAddr[0], bdAddr[1], bdAddr[2], bdAddr[3], bdAddr[4], bdAddr[5]); + } + break; + case BT_GSET_TX_PWR_FINETUNE: + RTW_INFO("[MPT], [BT_GSET_TX_PWR_FINETUNE]\n"); + validParaLen = 1; + if (setParaLen == validParaLen) { + btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; + calVal = pBtReq->pParamStart[1]; + if ((calVal < 1) || (calVal > 9)) { + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + RTW_INFO("[MPT], calVal=%d\n", calVal); + } + break; + case BT_SET_TRACKING_INTERVAL: + RTW_INFO("[MPT], [BT_SET_TRACKING_INTERVAL] setParaLen =%d\n", setParaLen); + + validParaLen = 1; + if (setParaLen == validParaLen) + calVal = pBtReq->pParamStart[1]; + break; + case BT_SET_THERMAL_METER: + RTW_INFO("[MPT], [BT_SET_THERMAL_METER] setParaLen =%d\n", setParaLen); + validParaLen = 1; + if (setParaLen == validParaLen) + calVal = pBtReq->pParamStart[1]; + break; + case BT_ENABLE_CFO_TRACKING: + RTW_INFO("[MPT], [BT_ENABLE_CFO_TRACKING] setParaLen =%d\n", setParaLen); + validParaLen = 1; + if (setParaLen == validParaLen) + calVal = pBtReq->pParamStart[1]; + break; + case BT_GSET_UPDATE_BT_PATCH: + + break; + default: { + RTW_INFO("[MPT], Error!! setType=%d, out of range\n", setType); + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + break; + } + if (setParaLen != validParaLen) { + RTW_INFO("[MPT], Error!! wrong parameter length=%d for BT_SET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", + setParaLen, setType, validParaLen); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + /* */ + /* execute lower layer opcodes */ + /* */ + if (BT_GSET_REG == setType) { + /* fill h2c parameters */ + /* here we should write reg value first then write the address, adviced by Austin */ + btOpcode = BT_LO_OP_WRITE_REG_VALUE; + h2cParaBuf[0] = pBtReq->pParamStart[6]; + h2cParaBuf[1] = pBtReq->pParamStart[7]; + h2cParaBuf[2] = pBtReq->pParamStart[8]; + h2cParaLen = 3; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + /* write reg address */ + btOpcode = BT_LO_OP_WRITE_REG_ADDR; + h2cParaBuf[0] = regType; + h2cParaBuf[1] = pBtReq->pParamStart[2]; + h2cParaBuf[2] = pBtReq->pParamStart[3]; + h2cParaLen = 3; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + } else if (BT_GSET_RESET == setType) { + btOpcode = BT_LO_OP_RESET; + h2cParaLen = 0; + /* execute h2c and check respond c2h from bt fw is correct or not */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + } else if (BT_GSET_TARGET_BD_ADDR == setType) { + /* fill h2c parameters */ + btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_L; + h2cParaBuf[0] = pBtReq->pParamStart[1]; + h2cParaBuf[1] = pBtReq->pParamStart[2]; + h2cParaBuf[2] = pBtReq->pParamStart[3]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; + h2cParaBuf[0] = pBtReq->pParamStart[4]; + h2cParaBuf[1] = pBtReq->pParamStart[5]; + h2cParaBuf[2] = pBtReq->pParamStart[6]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + } else if (BT_GSET_TX_PWR_FINETUNE == setType) { + /* fill h2c parameters */ + btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; + h2cParaBuf[0] = calVal; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + } else if (BT_SET_TRACKING_INTERVAL == setType) { + /* BT_LO_OP_SET_TRACKING_INTERVAL = 0x22, */ + /* BT_LO_OP_SET_THERMAL_METER = 0x23, */ + /* BT_LO_OP_ENABLE_CFO_TRACKING = 0x24, */ + btOpcode = BT_LO_OP_SET_TRACKING_INTERVAL; + h2cParaBuf[0] = calVal; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + } else if (BT_SET_THERMAL_METER == setType) { + btOpcode = BT_LO_OP_SET_THERMAL_METER; + h2cParaBuf[0] = calVal; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + } else if (BT_ENABLE_CFO_TRACKING == setType) { + btOpcode = BT_LO_OP_ENABLE_CFO_TRACKING; + h2cParaBuf[0] = calVal; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + + +u2Byte +mptbt_BtSetTxRxPars( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp +) +{ + u1Byte h2cParaBuf[6] = {0}; + u1Byte h2cParaLen = 0; + u2Byte paraLen = 0; + u1Byte retStatus = BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer = 0; + PBT_TXRX_PARAMETERS pTxRxPars = (PBT_TXRX_PARAMETERS)&pBtReq->pParamStart[0]; + u2Byte lenTxRx = sizeof(BT_TXRX_PARAMETERS); + u1Byte i; + u1Byte bdAddr[6] = {0}; + + /* */ + /* check upper layer parameters */ + /* */ + + /* 1. check upper layer opcode version */ + if (pBtReq->opCodeVer != 1) { + RTW_INFO("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + /* 2. check upper layer parameter length */ + if (pBtReq->paraLength == sizeof(BT_TXRX_PARAMETERS)) { + RTW_INFO("[MPT], pTxRxPars->txrxChannel=0x%x\n", pTxRxPars->txrxChannel); + RTW_INFO("[MPT], pTxRxPars->txrxTxPktCnt=0x%8x\n", pTxRxPars->txrxTxPktCnt); + RTW_INFO("[MPT], pTxRxPars->txrxTxPktInterval=0x%x\n", pTxRxPars->txrxTxPktInterval); + RTW_INFO("[MPT], pTxRxPars->txrxPayloadType=0x%x\n", pTxRxPars->txrxPayloadType); + RTW_INFO("[MPT], pTxRxPars->txrxPktType=0x%x\n", pTxRxPars->txrxPktType); + RTW_INFO("[MPT], pTxRxPars->txrxPayloadLen=0x%x\n", pTxRxPars->txrxPayloadLen); + RTW_INFO("[MPT], pTxRxPars->txrxPktHeader=0x%x\n", pTxRxPars->txrxPktHeader); + RTW_INFO("[MPT], pTxRxPars->txrxWhitenCoeff=0x%x\n", pTxRxPars->txrxWhitenCoeff); + bdAddr[0] = pTxRxPars->txrxBdaddr[5]; + bdAddr[1] = pTxRxPars->txrxBdaddr[4]; + bdAddr[2] = pTxRxPars->txrxBdaddr[3]; + bdAddr[3] = pTxRxPars->txrxBdaddr[2]; + bdAddr[4] = pTxRxPars->txrxBdaddr[1]; + bdAddr[5] = pTxRxPars->txrxBdaddr[0]; + RTW_INFO("[MPT], pTxRxPars->txrxBdaddr: %s", &bdAddr[0]); + RTW_INFO("[MPT], pTxRxPars->txrxTxGainIndex=0x%x\n", pTxRxPars->txrxTxGainIndex); + } else { + RTW_INFO("[MPT], Error!! pBtReq->paraLength=%d, correct Len=%d\n", pBtReq->paraLength, lenTxRx); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + /* */ + /* execute lower layer opcodes */ + /* */ + + /* fill h2c parameters */ + btOpcode = BT_LO_OP_SET_PKT_HEADER; + if (pTxRxPars->txrxPktHeader > 0x3ffff) { + RTW_INFO("[MPT], Error!! pTxRxPars->txrxPktHeader=0x%x is out of range, (should be between 0x0~0x3ffff)\n", pTxRxPars->txrxPktHeader); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } else { + h2cParaBuf[0] = (u1Byte)(pTxRxPars->txrxPktHeader & 0xff); + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPktHeader & 0xff00) >> 8); + h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPktHeader & 0xff0000) >> 16); + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + /* fill h2c parameters */ + btOpcode = BT_LO_OP_SET_PKT_TYPE_LEN; + { + u2Byte payloadLenLimit = 0; + switch (pTxRxPars->txrxPktType) { + case MP_BT_PKT_DH1: + payloadLenLimit = 27 * 8; + break; + case MP_BT_PKT_DH3: + payloadLenLimit = 183 * 8; + break; + case MP_BT_PKT_DH5: + payloadLenLimit = 339 * 8; + break; + case MP_BT_PKT_2DH1: + payloadLenLimit = 54 * 8; + break; + case MP_BT_PKT_2DH3: + payloadLenLimit = 367 * 8; + break; + case MP_BT_PKT_2DH5: + payloadLenLimit = 679 * 8; + break; + case MP_BT_PKT_3DH1: + payloadLenLimit = 83 * 8; + break; + case MP_BT_PKT_3DH3: + payloadLenLimit = 552 * 8; + break; + case MP_BT_PKT_3DH5: + payloadLenLimit = 1021 * 8; + break; + case MP_BT_PKT_LE: + payloadLenLimit = 39 * 8; + break; + default: { + RTW_INFO("[MPT], Error!! Unknown pTxRxPars->txrxPktType=0x%x\n", pTxRxPars->txrxPktType); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + break; + } + + if (pTxRxPars->txrxPayloadLen > payloadLenLimit) { + RTW_INFO("[MPT], Error!! pTxRxPars->txrxPayloadLen=0x%x, (should smaller than %d)\n", + pTxRxPars->txrxPayloadLen, payloadLenLimit); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + + h2cParaBuf[0] = pTxRxPars->txrxPktType; + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPayloadLen & 0xff)); + h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPayloadLen & 0xff00) >> 8); + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + /* fill h2c parameters */ + btOpcode = BT_LO_OP_SET_PKT_CNT_L_PL_TYPE; + if (pTxRxPars->txrxPayloadType > MP_BT_PAYLOAD_MAX) { + RTW_INFO("[MPT], Error!! pTxRxPars->txrxPayloadType=0x%x, (should be between 0~4)\n", pTxRxPars->txrxPayloadType); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } else { + h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt & 0xff)); + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt & 0xff00) >> 8); + h2cParaBuf[2] = pTxRxPars->txrxPayloadType; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + /* fill h2c parameters */ + btOpcode = BT_LO_OP_SET_PKT_CNT_H_PKT_INTV; + if (pTxRxPars->txrxTxPktInterval > 15) { + RTW_INFO("[MPT], Error!! pTxRxPars->txrxTxPktInterval=0x%x, (should be between 0~15)\n", pTxRxPars->txrxTxPktInterval); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } else { + h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt & 0xff0000) >> 16); + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt & 0xff000000) >> 24); + h2cParaBuf[2] = pTxRxPars->txrxTxPktInterval; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + /* fill h2c parameters */ + btOpcode = BT_LO_OP_SET_WHITENCOEFF; + { + h2cParaBuf[0] = pTxRxPars->txrxWhitenCoeff; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + + /* fill h2c parameters */ + btOpcode = BT_LO_OP_SET_CHNL_TX_GAIN; + if ((pTxRxPars->txrxChannel > 78) || + (pTxRxPars->txrxTxGainIndex > 7)) { + RTW_INFO("[MPT], Error!! pTxRxPars->txrxChannel=0x%x, (should be between 0~78)\n", pTxRxPars->txrxChannel); + RTW_INFO("[MPT], Error!! pTxRxPars->txrxTxGainIndex=0x%x, (should be between 0~7)\n", pTxRxPars->txrxTxGainIndex); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } else { + h2cParaBuf[0] = pTxRxPars->txrxChannel; + h2cParaBuf[1] = pTxRxPars->txrxTxGainIndex; + h2cParaLen = 2; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + /* fill h2c parameters */ + btOpcode = BT_LO_OP_SET_BD_ADDR_L; + if ((pTxRxPars->txrxBdaddr[0] == 0) && + (pTxRxPars->txrxBdaddr[1] == 0) && + (pTxRxPars->txrxBdaddr[2] == 0) && + (pTxRxPars->txrxBdaddr[3] == 0) && + (pTxRxPars->txrxBdaddr[4] == 0) && + (pTxRxPars->txrxBdaddr[5] == 0)) { + RTW_INFO("[MPT], Error!! pTxRxPars->txrxBdaddr=all zero\n"); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + if ((pTxRxPars->txrxBdaddr[0] == 0xff) && + (pTxRxPars->txrxBdaddr[1] == 0xff) && + (pTxRxPars->txrxBdaddr[2] == 0xff) && + (pTxRxPars->txrxBdaddr[3] == 0xff) && + (pTxRxPars->txrxBdaddr[4] == 0xff) && + (pTxRxPars->txrxBdaddr[5] == 0xff)) { + RTW_INFO("[MPT], Error!! pTxRxPars->txrxBdaddr=all 0xf\n"); + pBtRsp->status = (btOpcode << 8) | BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + + { + h2cParaBuf[0] = pTxRxPars->txrxBdaddr[0]; + h2cParaBuf[1] = pTxRxPars->txrxBdaddr[1]; + h2cParaBuf[2] = pTxRxPars->txrxBdaddr[2]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + btOpcode = BT_LO_OP_SET_BD_ADDR_H; + { + h2cParaBuf[0] = pTxRxPars->txrxBdaddr[3]; + h2cParaBuf[1] = pTxRxPars->txrxBdaddr[4]; + h2cParaBuf[2] = pTxRxPars->txrxBdaddr[5]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + /* ckeck bt return status. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + + +u2Byte +mptbt_BtTestCtrl( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp +) +{ + u1Byte h2cParaBuf[6] = {0}; + u1Byte h2cParaLen = 0; + u2Byte paraLen = 0; + u1Byte retStatus = BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer = 0; + u1Byte testCtrl = 0; + + /* */ + /* check upper layer parameters */ + /* */ + + /* 1. check upper layer opcode version */ + if (pBtReq->opCodeVer != 1) { + RTW_INFO("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + /* 2. check upper layer parameter length */ + if (1 == pBtReq->paraLength) { + testCtrl = pBtReq->pParamStart[0]; + RTW_INFO("[MPT], testCtrl=%d\n", testCtrl); + } else { + RTW_INFO("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + /* */ + /* execute lower layer opcodes */ + /* */ + + /* 1. fill h2c parameters */ + /* check bt mode */ + btOpcode = BT_LO_OP_TEST_CTRL; + if (testCtrl >= MP_BT_TEST_MAX) { + RTW_INFO("[MPT], Error!! testCtrl=0x%x, (should be between smaller or equal to 0x%x)\n", + testCtrl, MP_BT_TEST_MAX - 1); + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } else { + h2cParaBuf[0] = testCtrl; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + /* 3. construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + +u2Byte +mptbt_TestBT( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp +) +{ + + u1Byte h2cParaBuf[6] = {0}; + u1Byte h2cParaLen = 0; + u2Byte paraLen = 0; + u1Byte retStatus = BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer = 0; + u1Byte testCtrl = 0; + + /* 1. fill h2c parameters */ + btOpcode = 0x11; + h2cParaBuf[0] = 0x11; + h2cParaBuf[1] = 0x0; + h2cParaBuf[2] = 0x0; + h2cParaBuf[3] = 0x0; + h2cParaBuf[4] = 0x0; + h2cParaLen = 1; + /* retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); */ + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, h2cParaBuf, h2cParaLen); + + + /* 3. construct respond status code and data. */ + if (BT_STATUS_BT_OP_SUCCESS != retStatus) { + pBtRsp->status = ((btOpcode << 8) | retStatus); + RTW_INFO("[MPT], Error!! status code=0x%x\n", pBtRsp->status); + return paraLen; + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + +VOID +mptbt_BtControlProcess( + PADAPTER Adapter, + PVOID pInBuf +) +{ + u1Byte H2C_Parameter[6] = {0}; + PBT_H2C pH2c = (PBT_H2C)&H2C_Parameter[0]; + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + PBT_REQ_CMD pBtReq = (PBT_REQ_CMD)pInBuf; + PBT_RSP_CMD pBtRsp; + u1Byte i; + + + RTW_INFO("[MPT], mptbt_BtControlProcess()=========>\n"); + + RTW_INFO("[MPT], input opCodeVer=%d\n", pBtReq->opCodeVer); + RTW_INFO("[MPT], input OpCode=%d\n", pBtReq->OpCode); + RTW_INFO("[MPT], paraLength=%d\n", pBtReq->paraLength); + if (pBtReq->paraLength) { + /* RTW_INFO("[MPT], parameters(hex):0x%x %d\n",&pBtReq->pParamStart[0], pBtReq->paraLength); */ + } + + _rtw_memset((void *)pMptCtx->mptOutBuf, 0, 100); + pMptCtx->mptOutLen = 4; /* length of (BT_RSP_CMD.status+BT_RSP_CMD.paraLength) */ + + pBtRsp = (PBT_RSP_CMD)pMptCtx->mptOutBuf; + pBtRsp->status = BT_STATUS_SUCCESS; + pBtRsp->paraLength = 0x0; + + /* The following we should maintain the User OP codes sent by upper layer */ + switch (pBtReq->OpCode) { + case BT_UP_OP_BT_READY: + RTW_INFO("[MPT], OPcode : [BT_READY]\n"); + pBtRsp->paraLength = mptbt_BtReady(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_SET_MODE: + RTW_INFO("[MPT], OPcode : [BT_SET_MODE]\n"); + pBtRsp->paraLength = mptbt_BtSetMode(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_SET_TX_RX_PARAMETER: + RTW_INFO("[MPT], OPcode : [BT_SET_TXRX_PARAMETER]\n"); + pBtRsp->paraLength = mptbt_BtSetTxRxPars(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_SET_GENERAL: + RTW_INFO("[MPT], OPcode : [BT_SET_GENERAL]\n"); + pBtRsp->paraLength = mptbt_BtSetGeneral(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_GET_GENERAL: + RTW_INFO("[MPT], OPcode : [BT_GET_GENERAL]\n"); + pBtRsp->paraLength = mptbt_BtGetGeneral(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_TEST_CTRL: + RTW_INFO("[MPT], OPcode : [BT_TEST_CTRL]\n"); + pBtRsp->paraLength = mptbt_BtTestCtrl(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_TEST_BT: + RTW_INFO("[MPT], OPcode : [TEST_BT]\n"); + pBtRsp->paraLength = mptbt_TestBT(Adapter, pBtReq, pBtRsp); + break; + default: + RTW_INFO("[MPT], Error!! OPcode : UNDEFINED!!!!\n"); + pBtRsp->status = BT_STATUS_UNKNOWN_OPCODE_U; + pBtRsp->paraLength = 0x0; + break; + } + + pMptCtx->mptOutLen += pBtRsp->paraLength; + + RTW_INFO("[MPT], pMptCtx->mptOutLen=%d, pBtRsp->paraLength=%d\n", pMptCtx->mptOutLen, pBtRsp->paraLength); + RTW_INFO("[MPT], mptbt_BtControlProcess()<=========\n"); +} + +#endif diff --git a/core/rtw_btcoex.c b/core/rtw_btcoex.c old mode 100755 new mode 100644 index d3cbdfc..75211f0 --- a/core/rtw_btcoex.c +++ b/core/rtw_btcoex.c @@ -71,26 +71,24 @@ 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 + 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)) - { - PADAPTER pbuddy = padapter->pbuddy_adapter; - if (check_fwstate(&pbuddy->mlmepriv, WIFI_SITE_MONITOR) == _TRUE) + if (_FALSE == type) { + if (rtw_mi_buddy_check_fwstate(padapter, WIFI_SITE_MONITOR)) return; } #endif #ifdef CONFIG_BT_COEXIST_SOCKET_TRX - if(pBtMgnt->ExtConfig.bEnableWifiScanNotify) + if (pBtMgnt->ExtConfig.bEnableWifiScanNotify) rtw_btcoex_SendScanNotify(padapter, type); -#endif //CONFIG_BT_COEXIST_SOCKET_TRX +#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */ hal_btcoex_ScanNotify(padapter, type); } @@ -104,19 +102,16 @@ void rtw_btcoex_ConnectNotify(PADAPTER padapter, u8 action) return; #ifdef DBG_CONFIG_ERROR_RESET - if (_TRUE == rtw_hal_sreset_inprogress(padapter)) - { - DBG_8192C(FUNC_ADPT_FMT ": [BTCoex] under reset, skip notify!\n", - FUNC_ADPT_ARG(padapter)); + if (_TRUE == rtw_hal_sreset_inprogress(padapter)) { + RTW_INFO(FUNC_ADPT_FMT ": [BTCoex] under reset, skip notify!\n", + FUNC_ADPT_ARG(padapter)); return; } -#endif // DBG_CONFIG_ERROR_RESET - +#endif /* DBG_CONFIG_ERROR_RESET */ + #ifdef CONFIG_CONCURRENT_MODE - if ((_FALSE == action) && (padapter->pbuddy_adapter)) - { - PADAPTER pbuddy = padapter->pbuddy_adapter; - if (check_fwstate(&pbuddy->mlmepriv, WIFI_UNDER_LINKING) == _TRUE) + if (_FALSE == action) { + if (rtw_mi_buddy_check_fwstate(padapter, WIFI_UNDER_LINKING)) return; } #endif @@ -133,28 +128,23 @@ void rtw_btcoex_MediaStatusNotify(PADAPTER padapter, u8 mediaStatus) return; #ifdef DBG_CONFIG_ERROR_RESET - if (_TRUE == rtw_hal_sreset_inprogress(padapter)) - { - DBG_8192C(FUNC_ADPT_FMT ": [BTCoex] under reset, skip notify!\n", - FUNC_ADPT_ARG(padapter)); + if (_TRUE == rtw_hal_sreset_inprogress(padapter)) { + RTW_INFO(FUNC_ADPT_FMT ": [BTCoex] under reset, skip notify!\n", + FUNC_ADPT_ARG(padapter)); return; } -#endif // DBG_CONFIG_ERROR_RESET +#endif /* DBG_CONFIG_ERROR_RESET */ #ifdef CONFIG_CONCURRENT_MODE - if ((RT_MEDIA_DISCONNECT == mediaStatus) && (padapter->pbuddy_adapter)) - { - PADAPTER pbuddy = padapter->pbuddy_adapter; - if (check_fwstate(&pbuddy->mlmepriv, WIFI_ASOC_STATE) == _TRUE) + if (RT_MEDIA_DISCONNECT == mediaStatus) { + if (rtw_mi_buddy_check_fwstate(padapter, WIFI_ASOC_STATE)) return; } -#endif // CONFIG_CONCURRENT_MODE +#endif /* CONFIG_CONCURRENT_MODE */ if ((RT_MEDIA_CONNECT == mediaStatus) - && (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)) - { + && (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)) rtw_hal_set_hwreg(padapter, HW_VAR_DL_RSVD_PAGE, NULL); - } hal_btcoex_MediaStatusNotify(padapter, mediaStatus); } @@ -225,17 +215,16 @@ void rtw_btcoex_HaltNotify(PADAPTER padapter) if (_FALSE == pHalData->EEPROMBluetoothCoexist) return; - if (_FALSE == padapter->bup) - { - DBG_871X(FUNC_ADPT_FMT ": bup=%d Skip!\n", - FUNC_ADPT_ARG(padapter), padapter->bup); + if (_FALSE == padapter->bup) { + RTW_INFO(FUNC_ADPT_FMT ": bup=%d Skip!\n", + FUNC_ADPT_ARG(padapter), padapter->bup); return; } if (rtw_is_surprise_removed(padapter)) { - DBG_871X(FUNC_ADPT_FMT ": bSurpriseRemoved=%s Skip!\n", - FUNC_ADPT_ARG(padapter), rtw_is_surprise_removed(padapter)?"True":"False"); + RTW_INFO(FUNC_ADPT_FMT ": bSurpriseRemoved=%s Skip!\n", + FUNC_ADPT_ARG(padapter), rtw_is_surprise_removed(padapter) ? "True" : "False"); return; } @@ -243,9 +232,25 @@ void rtw_btcoex_HaltNotify(PADAPTER padapter) hal_btcoex_HaltNotify(padapter); } +void rtw_btcoex_ScoreBoardStatusNotify(PADAPTER padapter, u8 length, u8 *tmpBuf) +{ + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + if (_FALSE == pHalData->EEPROMBluetoothCoexist) + return; + + hal_btcoex_ScoreBoardStatusNotify(padapter, length, tmpBuf); +} + +void rtw_btcoex_switchband_notify(u8 under_scan, u8 band_type) +{ + hal_btcoex_switchband_notify(under_scan, band_type); +} + void rtw_btcoex_SwitchBtTRxMask(PADAPTER padapter) { - hal_btcoex_SwitchBtTRxMask(padapter); + hal_btcoex_SwitchBtTRxMask(padapter); } void rtw_btcoex_Switch(PADAPTER padapter, u8 enable) @@ -267,13 +272,6 @@ void rtw_btcoex_Handler(PADAPTER padapter) if (_FALSE == pHalData->EEPROMBluetoothCoexist) return; -#if defined(CONFIG_CONCURRENT_MODE) - if (padapter->adapter_type != PRIMARY_ADAPTER) - return; -#endif - - - hal_btcoex_Hanlder(padapter); } @@ -307,13 +305,9 @@ u32 rtw_btcoex_GetAMPDUSize(PADAPTER padapter) void rtw_btcoex_SetManualControl(PADAPTER padapter, u8 manual) { if (_TRUE == manual) - { hal_btcoex_SetManualControl(padapter, _TRUE); - } else - { hal_btcoex_SetManualControl(padapter, _FALSE); - } } u8 rtw_btcoex_1Ant(PADAPTER padapter) @@ -341,31 +335,6 @@ u8 rtw_btcoex_LpsVal(PADAPTER padapter) return hal_btcoex_LpsVal(padapter); } -void rtw_btcoex_SetBTCoexist(PADAPTER padapter, u8 bBtExist) -{ - hal_btcoex_SetBTCoexist(padapter, bBtExist); -} - -void rtw_btcoex_SetChipType(PADAPTER padapter, u8 chipType) -{ - hal_btcoex_SetChipType(padapter, chipType); -} - -void rtw_btcoex_SetPGAntNum(PADAPTER padapter, u8 antNum) -{ - hal_btcoex_SetPgAntNum(padapter, antNum); -} - -u8 rtw_btcoex_GetPGAntNum(PADAPTER padapter) -{ - return hal_btcoex_GetPgAntNum(padapter); -} - -void rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath) -{ - hal_btcoex_SetSingleAntPath(padapter, singleAntPath); -} - u32 rtw_btcoex_GetRaMask(PADAPTER padapter) { return hal_btcoex_GetRaMask(padapter); @@ -401,9 +370,9 @@ u8 rtw_btcoex_IsBtLinkExist(PADAPTER padapter) return hal_btcoex_IsBtLinkExist(padapter); } -void rtw_btcoex_SetBtPatchVersion(PADAPTER padapter,u16 btHciVer, u16 btPatchVer) +void rtw_btcoex_SetBtPatchVersion(PADAPTER padapter, u16 btHciVer, u16 btPatchVer) { - hal_btcoex_SetBtPatchVersion(padapter,btHciVer,btPatchVer); + hal_btcoex_SetBtPatchVersion(padapter, btHciVer, btPatchVer); } void rtw_btcoex_SetHciVersion(PADAPTER padapter, u16 hciVersion) @@ -411,19 +380,19 @@ void rtw_btcoex_SetHciVersion(PADAPTER padapter, u16 hciVersion) hal_btcoex_SetHciVersion(padapter, hciVersion); } -void rtw_btcoex_StackUpdateProfileInfo(void) +void rtw_btcoex_StackUpdateProfileInfo(void) { hal_btcoex_StackUpdateProfileInfo(); } -void rtw_btcoex_BTOffOnNotify(PADAPTER padapter, u8 bBTON) +void rtw_btcoex_pta_off_on_notify(PADAPTER padapter, u8 bBTON) { - hal_btcoex_BTOffOnNotify(padapter, bBTON); + hal_btcoex_pta_off_on_notify(padapter, bBTON); } -// ================================================== -// Below Functions are called by BT-Coex -// ================================================== +/* ================================================== + * Below Functions are called by BT-Coex + * ================================================== */ void rtw_btcoex_rx_ampdu_apply(PADAPTER padapter) { rtw_rx_ampdu_apply(padapter); @@ -449,31 +418,86 @@ void rtw_btcoex_LPS_Leave(PADAPTER padapter) pwrpriv = adapter_to_pwrctl(padapter); - if (pwrpriv->pwr_mode != PS_MODE_ACTIVE) - { + if (pwrpriv->pwr_mode != PS_MODE_ACTIVE) { rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "BTCOEX"); LPS_RF_ON_check(padapter, 100); pwrpriv->bpower_saving = _FALSE; } } -u16 rtw_btcoex_btreg_read(PADAPTER padapter, u8 type, u16 addr) +u16 rtw_btcoex_btreg_read(PADAPTER padapter, u8 type, u16 addr, u32 *data) { - return hal_btcoex_btreg_read(padapter, type, addr); + return hal_btcoex_btreg_read(padapter, type, addr, data); } -void rtw_btcoex_btreg_write(PADAPTER padapter, u8 type, u16 addr, u16 val) +u16 rtw_btcoex_btreg_write(PADAPTER padapter, u8 type, u16 addr, u16 val) { - hal_btcoex_btreg_write(padapter, type, addr, val); + return hal_btcoex_btreg_write(padapter, type, addr, val); } +u8 rtw_btcoex_get_bt_coexist(PADAPTER padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); -// ================================================== -// Below Functions are BT-Coex socket related function -// ================================================== + return pHalData->EEPROMBluetoothCoexist; +} + +u8 rtw_btcoex_get_chip_type(PADAPTER padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + return pHalData->EEPROMBluetoothType; +} + +u8 rtw_btcoex_get_pg_ant_num(PADAPTER padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + return pHalData->EEPROMBluetoothAntNum == Ant_x2 ? 2 : 1; +} + +u8 rtw_btcoex_get_pg_single_ant_path(PADAPTER padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + return pHalData->ant_path; +} + +u8 rtw_btcoex_get_pg_rfe_type(PADAPTER padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + return pHalData->RFEType; +} + +u8 rtw_btcoex_is_tfbga_package_type(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 rtw_btcoex_get_ant_div_cfg(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + + return (pHalData->AntDivCfg == 0) ? _FALSE : _TRUE; +} + +/* ================================================== + * Below Functions are BT-Coex socket related function + * ================================================== */ #ifdef CONFIG_BT_COEXIST_SOCKET_TRX -_adapter *pbtcoexadapter = NULL; +_adapter *pbtcoexadapter; /* = NULL; */ /* do not initialise globals to 0 or NULL */ u8 rtw_btcoex_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len) { struct cmd_obj *ph2c; @@ -482,23 +506,23 @@ u8 rtw_btcoex_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len) struct cmd_priv *pcmdpriv = &adapter->cmdpriv; u8 res = _SUCCESS; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + 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)); + 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)); + 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)); + rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm)); res = _FAIL; goto exit; } @@ -518,40 +542,40 @@ 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 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; + u8 len = 0, tx_event_length = 0; rtw_HCI_event *pEvent; - - pEvent = (rtw_HCI_event*)(&localBuf[0]); + + pEvent = (rtw_HCI_event *)(&localBuf[0]); pEvent->EventCode = event_code; - pEvent->Data[0] = 0x1; //packet # + 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 + /* 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) + /* 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 +#endif status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); - + return status; } -/* -Ref: +/* +Ref: Realtek Wi-Fi Driver Host Controller Interface for Bluetooth 3.0 + HS V1.4 2013/02/07 @@ -562,8 +586,8 @@ 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 - +#define BT_INFO_LENGTH 8 + u8 curPollEnable = pcmd[0]; u8 curPollTime = pcmd[1]; u8 btInfoReason = pcmd[2]; @@ -572,358 +596,338 @@ u8 rtw_btcoex_parse_BT_info_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen) u8 localBuf[6] = ""; u8 *pRetPar; - u8 len=0,tx_event_length = 0; + 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" + /* RTW_INFO("%s\n",__func__); + RTW_INFO("current Poll Enable: %d, currrent Poll Time: %d\n",curPollEnable,curPollTime); + RTW_INFO("BT Info reason: %d, BT Info length: %d\n",btInfoReason,btInfoLen); + RTW_INFO("%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) - { + 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 + RTW_INFO("Error BT Info Length: %d\n", btInfoLen); + /* return _FAIL; */ + } else #endif { - if(0x1 == btInfoReason || 0x2 == btInfoReason) - { + 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"); - } + rtw_btcoex_btinfo_cmd(padapter, btinfo, btInfoLen); + } else + RTW_INFO("Other BT info reason\n"); } - //send complete event to BT + /* send complete event to BT */ { - pEvent = (rtw_HCI_event*)(&localBuf[0]); + pEvent = (rtw_HCI_event *)(&localBuf[0]); pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; - pEvent->Data[0] = 0x1; //packet # + 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 + /* 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) + /* 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 + 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); + /* 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; - + 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; + u8 len = 0, tx_event_length = 0; rtw_HCI_event *pEvent; - btHciVer = pcmd[0] | pcmd[1]<<8; - btPatchVer = pcmd[2] | pcmd[3]<<8; + 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); + RTW_INFO("%s, cmd:%02x %02x %02x %02x\n", __func__, pcmd[0] , pcmd[1] , pcmd[2] , pcmd[3]); + RTW_INFO("%s, HCI Ver:%d, Patch Ver:%d\n", __func__, btHciVer, btPatchVer); + + rtw_btcoex_SetBtPatchVersion(padapter, btHciVer, btPatchVer); - //send complete event to BT + /* send complete event to BT */ { pEvent = (rtw_HCI_event *)(&localBuf[0]); pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; - pEvent->Data[0] = 0x1; //packet # + 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 + /* 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) + /* 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"); + 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); + /* 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; - + 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; + 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; + 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) - { + RTW_INFO("%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 + RTW_INFO("%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[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 + /* 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) + /* 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); + /* 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; + RTW_HCI_STATUS status = HCI_STATUS_SUCCESS; u8 localBuf[6] = ""; u8 *pRetPar; - u8 len=0, tx_event_length =0; + 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 + PBT_MGNT pBtMgnt = &pcoex_info->BtMgnt; + pBtMgnt->ExtConfig.bEnableWifiScanNotify = pcmd[0]; + RTW_INFO("%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[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 + /* 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) + /* 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); + /* 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; + 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; + 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"); + /* pBtDbg->dbgHciInfo.hciCmdCntLinkStatusNotify++; */ + /* RT_DISP_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "LinkStatusNotify, Hex Data :\n", */ + /* &pHciCmd->Data[0], pHciCmd->Length); */ - // Current only RTL8723 support this command. - //pBtMgnt->bSupportProfile = TRUE; + RTW_INFO("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); - + /* 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)); */ + RTW_INFO("numOfHandle = 0x%x\n", numOfHandle); + RTW_INFO("HCIExtensionVer = %d\n", pBtMgnt->ExtConfig.HCIExtensionVer); + pTriple = &pcmd[1]; - for(i=0; iExtConfig.HCIExtensionVer < 1) - { + for (i = 0; i < numOfHandle; i++) { + if (pBtMgnt->ExtConfig.HCIExtensionVer < 1) { conHandle = *((u8 *)&pTriple[0]); btProfile = pTriple[2]; btCoreSpec = pTriple[3]; - if(BT_PROFILE_SCO == btProfile) - { + if (BT_PROFILE_SCO == btProfile) pBtMgnt->ExtConfig.NumberOfSCO++; - } - else - { - pBtMgnt->ExtConfig.NumberOfACL++; + 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); + /* RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, */ + /* ("Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d\n", */ + /* conHandle, btProfile, btCoreSpec)); */ + RTW_INFO("Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d\n", conHandle, btProfile, btCoreSpec); pTriple += 4; - } - else if(pBtMgnt->ExtConfig.HCIExtensionVer >= 1) - { + } else if (pBtMgnt->ExtConfig.HCIExtensionVer >= 1) { conHandle = *((pu2Byte)&pTriple[0]); btProfile = pTriple[2]; btCoreSpec = pTriple[3]; linkRole = pTriple[4]; - if(BT_PROFILE_SCO == btProfile) - { + if (BT_PROFILE_SCO == btProfile) pBtMgnt->ExtConfig.NumberOfSCO++; - } - else - { - pBtMgnt->ExtConfig.NumberOfACL++; + 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); + /* RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, */ + RTW_INFO("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 + /* send complete event to BT */ { pEvent = (rtw_HCI_event *)(&localBuf[0]); pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; - pEvent->Data[0] = 0x1; //packet # + 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 + /* 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) + /* 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); + /* 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; + u8 len = 0, tx_event_length = 0; rtw_HCI_event *pEvent; - RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + 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[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 + /* 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) + /* 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); + /* bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); */ } } @@ -931,73 +935,72 @@ u8 rtw_btcoex_parse_HCI_BT_operation_notify_cmd(_adapter *padapter, u8 *pcmd, u1 { u8 localBuf[6] = ""; u8 *pRetPar; - u8 len=0, tx_event_length =0; + u8 len = 0, tx_event_length = 0; rtw_HCI_event *pEvent; - RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + RTW_HCI_STATUS status = HCI_STATUS_SUCCESS; - DBG_871X("%s, OP code: %d\n",__func__,pcmd[0]); + RTW_INFO("%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; + switch (pcmd[0]) { + case HCI_BT_OP_NONE: + RTW_INFO("[bt operation] : Operation None!!\n"); + break; + case HCI_BT_OP_INQUIRY_START: + RTW_INFO("[bt operation] : Inquiry start!!\n"); + break; + case HCI_BT_OP_INQUIRY_FINISH: + RTW_INFO("[bt operation] : Inquiry finished!!\n"); + break; + case HCI_BT_OP_PAGING_START: + RTW_INFO("[bt operation] : Paging is started!!\n"); + break; + case HCI_BT_OP_PAGING_SUCCESS: + RTW_INFO("[bt operation] : Paging complete successfully!!\n"); + break; + case HCI_BT_OP_PAGING_UNSUCCESS: + RTW_INFO("[bt operation] : Paging complete unsuccessfully!!\n"); + break; + case HCI_BT_OP_PAIRING_START: + RTW_INFO("[bt operation] : Pairing start!!\n"); + break; + case HCI_BT_OP_PAIRING_FINISH: + RTW_INFO("[bt operation] : Pairing finished!!\n"); + break; + case HCI_BT_OP_BT_DEV_ENABLE: + RTW_INFO("[bt operation] : BT Device is enabled!!\n"); + break; + case HCI_BT_OP_BT_DEV_DISABLE: + RTW_INFO("[bt operation] : BT Device is disabled!!\n"); + break; + default: + RTW_INFO("[bt operation] : Unknown, error!!\n"); + break; } - //send complete event to BT + /* send complete event to BT */ { pEvent = (rtw_HCI_event *)(&localBuf[0]); pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE; - pEvent->Data[0] = 0x1; //packet # + 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 + /* 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) + /* 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); + /* bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); */ } } @@ -1005,68 +1008,68 @@ u8 rtw_btcoex_parse_BT_AFH_MAP_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdl { u8 localBuf[6] = ""; u8 *pRetPar; - u8 len=0, tx_event_length =0; + u8 len = 0, tx_event_length = 0; rtw_HCI_event *pEvent; - RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + 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[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 + /* 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) + /* 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); + /* 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; + u8 len = 0, tx_event_length = 0; rtw_HCI_event *pEvent; - RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + 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[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 + /* 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) + /* 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); + /* bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); */ } } @@ -1074,33 +1077,33 @@ u8 rtw_btcoex_parse_HCI_BT_abnormal_notify_cmd(_adapter *padapter, u8 *pcmd, u16 { u8 localBuf[6] = ""; u8 *pRetPar; - u8 len=0, tx_event_length =0; + u8 len = 0, tx_event_length = 0; rtw_HCI_event *pEvent; - RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + 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[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 + /* 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) + /* 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); + /* bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); */ } } @@ -1108,126 +1111,123 @@ u8 rtw_btcoex_parse_HCI_query_RF_status_cmd(_adapter *padapter, u8 *pcmd, u16 cm { u8 localBuf[6] = ""; u8 *pRetPar; - u8 len=0, tx_event_length =0; + u8 len = 0, tx_event_length = 0; rtw_HCI_event *pEvent; - RTW_HCI_STATUS status=HCI_STATUS_SUCCESS; + 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[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 + /* 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) + /* 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); + /* bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2); */ } } /***************************************** * HCI cmd format : -*| 15 - 0 | +*| 15 - 0 | *| OPcode (OCF|OGF<<10) | *| 15 - 8 |7 - 0 | -*|Cmd para |Cmd para Length | +*|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) +/* 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; - + RTW_INFO("%s: OCF: %x\n", __func__, hci_OCF); + switch (hci_OCF) { + case HCI_EXTENSION_VERSION_NOTIFY: + RTW_INFO("HCI_EXTENSION_VERSION_NOTIFY\n"); + rtw_btcoex_parse_HCI_Ver_notify_cmd(padapter, pcmd, len); + break; + case HCI_LINK_STATUS_NOTIFY: + RTW_INFO("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 */ + RTW_INFO("HCI_BT_OPERATION_NOTIFY\n"); + rtw_btcoex_parse_HCI_BT_operation_notify_cmd(padapter, pcmd, len); + /* */ + break; + case HCI_ENABLE_WIFI_SCAN_NOTIFY: + RTW_INFO("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 */ + RTW_INFO("HCI_QUERY_RF_STATUS\n"); + rtw_btcoex_parse_HCI_query_RF_status_cmd(padapter, pcmd, len); + break; + case HCI_BT_ABNORMAL_NOTIFY: + RTW_INFO("HCI_BT_ABNORMAL_NOTIFY\n"); + rtw_btcoex_parse_HCI_BT_abnormal_notify_cmd(padapter, pcmd, len); + break; + case HCI_BT_INFO_NOTIFY: + RTW_INFO("HCI_BT_INFO_NOTIFY\n"); + rtw_btcoex_parse_BT_info_notify_cmd(padapter, pcmd, len); + break; + case HCI_BT_COEX_NOTIFY: + RTW_INFO("HCI_BT_COEX_NOTIFY\n"); + rtw_btcoex_parse_HCI_BT_coex_notify_cmd(padapter, pcmd, len); + break; + case HCI_BT_PATCH_VERSION_NOTIFY: + RTW_INFO("HCI_BT_PATCH_VERSION_NOTIFY\n"); + rtw_btcoex_parse_BT_patch_ver_info_cmd(padapter, pcmd, len); + break; + case HCI_BT_AFH_MAP_NOTIFY: + RTW_INFO("HCI_BT_AFH_MAP_NOTIFY\n"); + rtw_btcoex_parse_BT_AFH_MAP_notify_cmd(padapter, pcmd, len); + break; + case HCI_BT_REGISTER_VALUE_NOTIFY: + RTW_INFO("HCI_BT_REGISTER_VALUE_NOTIFY\n"); + rtw_btcoex_parse_BT_register_val_notify_cmd(padapter, pcmd, len); + break; + default: + RTW_INFO("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 opcode = pcmd[0] | pcmd[1] << 8; u16 hci_OGF = HCI_OGF(opcode); u16 hci_OCF = HCI_OCF(opcode); - u8 cmdlen = len -3; + 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; + RTW_INFO("%s OGF: %x,OCF: %x\n", __func__, hci_OGF, hci_OCF); + switch (hci_OGF) { + case OGF_EXTENSION: + RTW_INFO("HCI_EXTENSION_CMD_OGF\n"); + rtw_btcoex_parse_hci_extend_cmd(padapter, &pcmd[3], cmdlen, hci_OCF); + break; + default: + RTW_INFO("Other OGF: %x\n", hci_OGF); + break; } } @@ -1240,30 +1240,30 @@ u16 rtw_btcoex_parse_recv_data(u8 *msg, u8 msg_size) 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);*/ + /*RTW_INFO("%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);*/ + /*RTW_INFO("%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);*/ + /*RTW_INFO("%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);*/ + /*RTW_INFO("%s, msg:%s\n",__func__,msg);*/ res = RX_INVITE_REQ; - } else if (_rtw_memcmp(cmp_msg5, msg, msg_size) == _TRUE) { + } else if (_rtw_memcmp(cmp_msg5, msg, msg_size) == _TRUE) res = RX_ATTEND_REQ; - } else if (_rtw_memcmp(cmp_msg6, msg, msg_size) == _TRUE) { + else if (_rtw_memcmp(cmp_msg6, msg, msg_size) == _TRUE) res = RX_INVITE_RSP; - } else { - DBG_871X("%s, %s\n", __func__, msg); + else { + /*RTW_INFO("%s, %s\n", __func__, msg);*/ res = OTHER; } - - DBG_871X("%s, res:%d\n", __func__, res); - + + /*RTW_INFO("%s, res:%d\n", __func__, res);*/ + return res; } @@ -1282,11 +1282,11 @@ void rtw_btcoex_recvmsgbysocket(void *data) struct bt_coex_info *pcoex_info = NULL; struct sock *sk = NULL; struct sk_buff *skb = NULL; - - DBG_871X("%s\n",__func__); + + /*RTW_INFO("%s\n",__func__);*/ if (pbtcoexadapter == NULL) { - DBG_871X("%s: btcoexadapter NULL!\n", __func__); + RTW_INFO("%s: btcoexadapter NULL!\n", __func__); return; } @@ -1294,123 +1294,123 @@ void rtw_btcoex_recvmsgbysocket(void *data) sk = pcoex_info->sk_store; if (sk == NULL) { - DBG_871X("%s: critical error when receive socket data!\n", __func__); + RTW_INFO("%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; + recv_length = skb->len - 8; _rtw_memset(recv_data, 0, sizeof(recv_data)); - _rtw_memcpy(recv_data, skb->data+8, recv_length); - + _rtw_memcpy(recv_data, skb->data + 8, recv_length); + parse_res = rtw_btcoex_parse_recv_data(recv_data, recv_length); -/* +#if 0 if (RX_ATTEND_ACK == parse_res) { - //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); + RTW_INFO("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 + /* 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_INFO("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 + /* 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_INFO("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 + /* 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); + RTW_INFO("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 + /* 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); + RTW_INFO("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 + /* 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); + RTW_INFO("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 + /* 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); } -*/ +#endif 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); - rtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend); + RTW_INFO("RX_ATTEND_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + rtw_btcoex_pta_off_on_notify(pbtcoexadapter, 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_INFO("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); - rtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend); + rtw_btcoex_pta_off_on_notify(pbtcoexadapter, pcoex_info->BT_attend); 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_INFO("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); - rtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend); + rtw_btcoex_pta_off_on_notify(pbtcoexadapter, pcoex_info->BT_attend); break; case RX_INVITE_RSP: - /*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); - rtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend); + RTW_INFO("RX_INVITE_RSP!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + rtw_btcoex_pta_off_on_notify(pbtcoexadapter, 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); - rtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend); + RTW_INFO("RX_LEAVE_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + rtw_btcoex_pta_off_on_notify(pbtcoexadapter, 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); - rtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend); + RTW_INFO("RX_BT_LEAVE!sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend); + rtw_btcoex_pta_off_on_notify(pbtcoexadapter, 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"); + RTW_INFO("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) + void rtw_btcoex_recvmsg_init(struct sock *sk_in, s32 bytes) #else -void rtw_btcoex_recvmsg_init(struct sock *sk_in) + 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__); + RTW_INFO("%s: btcoexadapter NULL\n", __func__); return; } pcoex_info = &pbtcoexadapter->coex_info; @@ -1418,40 +1418,54 @@ void rtw_btcoex_recvmsg_init(struct sock *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__); + RTW_INFO("%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; + 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"); + /* RTW_INFO("%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"); + RTW_INFO("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); + + iov.iov_base = (void *)msg; + iov.iov_len = msg_size; + udpmsg.msg_name = &pcoex_info->bt_sockaddr; + udpmsg.msg_namelen = sizeof(struct sockaddr_in); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) + /* referece:sock_xmit in kernel code + * WRITE for sock_sendmsg, READ for sock_recvmsg + * third parameter for msg_iovlen + * last parameter for iov_len + */ + iov_iter_init(&udpmsg.msg_iter, WRITE, &iov, 1, msg_size); +#else + udpmsg.msg_iov = &iov; + udpmsg.msg_iovlen = 1; +#endif + udpmsg.msg_control = NULL; + udpmsg.msg_controllen = 0; + udpmsg.msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL; + oldfs = get_fs(); + set_fs(KERNEL_DS); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) + error = sock_sendmsg(pcoex_info->udpsock, &udpmsg); +#else + error = sock_sendmsg(pcoex_info->udpsock, &udpmsg, msg_size); +#endif + set_fs(oldfs); if (error < 0) { - DBG_871X("Error when sendimg msg, error:%d\n", error); + RTW_INFO("Error when sendimg msg, error:%d\n", error); return _FAIL; } else return _SUCCESS; @@ -1459,53 +1473,53 @@ u8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool for u8 rtw_btcoex_create_kernel_socket(_adapter *padapter) { - s8 kernel_socket_err; + 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); + + RTW_INFO("%s CONNECT_PORT %d\n", __func__, CONNECT_PORT); if (NULL == pcoex_info) { - DBG_871X("coex_info: NULL\n"); + RTW_INFO("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; + + kernel_socket_err = sock_create(PF_INET, SOCK_DGRAM, 0, &pcoex_info->udpsock); + + if (kernel_socket_err < 0) { + RTW_INFO("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); + _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); + _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"); + 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) { + RTW_INFO("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_INFO("WIFI sending attend_req\n"); rtw_btcoex_sendmsgbysocket(padapter, attend_req, sizeof(attend_req), _TRUE); status = _SUCCESS; - } else { + } 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); + RTW_INFO("Error binding socket: %d\n", kernel_socket_err); status = _FAIL; - } - + } + } return status; @@ -1515,40 +1529,40 @@ 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"); + RTW_INFO("release kernel socket\n"); sock_release(pcoex_info->udpsock); - pcoex_info->sock_open &= ~(KERNEL_SOCKET_OK); + 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); + + RTW_INFO("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__); + RTW_INFO("%s\n", __func__); if (_FALSE == pcoex_info->is_exist) { - _rtw_memset(pcoex_info,0,sizeof(struct bt_coex_info)); + _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); + (void *)rtw_btcoex_recvmsgbysocket); pbtcoexadapter = padapter; /* We expect BT is off if BT don't send ack to wifi */ - DBG_871X("We expect BT is off if BT send ack to wifi\n"); - rtw_btcoex_BTOffOnNotify(pbtcoexadapter, _FALSE); - if (rtw_btcoex_create_kernel_socket(padapter) == _SUCCESS) { + RTW_INFO("We expect BT is off if BT send ack to wifi\n"); + rtw_btcoex_pta_off_on_notify(pbtcoexadapter, _FALSE); + if (rtw_btcoex_create_kernel_socket(padapter) == _SUCCESS) pcoex_info->is_exist = _TRUE; - } else { + 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"); + + RTW_INFO("%s: pbtcoexadapter:%p, coex_info->is_exist: %s\n" + , __func__, pbtcoexadapter, pcoex_info->is_exist == _TRUE ? "TRUE" : "FALSE"); } } @@ -1556,61 +1570,61 @@ 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"); - + RTW_INFO("%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); } + + if (pcoex_info->btcoex_wq != NULL) { + flush_workqueue(pcoex_info->btcoex_wq); + destroy_workqueue(pcoex_info->btcoex_wq); + } + 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;i Msg name: %s\n", msg_name); + for (i = 0; i < len; i++) printk("%02x ", tx_msg[i]); - } printk("\n"); - DBG_871X("Msg name: %s <======\n", msg_name); + RTW_INFO("Msg name: %s <======\n", msg_name); } /* Porting from Windows team */ void rtw_btcoex_SendEventExtBtCoexControl(PADAPTER padapter, u8 bNeedDbgRsp, u8 dataLen, void *pData) { - u8 len=0, tx_event_length = 0; + u8 len = 0, tx_event_length = 0; u8 localBuf[32] = ""; u8 *pRetPar; - u8 opCode=0; - u8 *pInBuf=(pu1Byte)pData; + u8 opCode = 0; + u8 *pInBuf = (pu1Byte)pData; u8 *pOpCodeContent; rtw_HCI_event *pEvent; - opCode = pInBuf[0]; + opCode = pInBuf[0]; - DBG_871X("%s, OPCode:%02x\n",__func__,opCode); + RTW_INFO("%s, OPCode:%02x\n", __func__, opCode); - pEvent = (rtw_HCI_event*)(&localBuf[0]); + pEvent = (rtw_HCI_event *)(&localBuf[0]); - //len += bthci_ExtensionEventHeaderRtk(&localBuf[0], - // HCI_EVENT_EXT_BT_COEX_CONTROL); + /* len += bthci_ExtensionEventHeaderRtk(&localBuf[0], */ + /* HCI_EVENT_EXT_BT_COEX_CONTROL); */ pEvent->EventCode = HCI_EVENT_EXTENSION_RTK; - pEvent->Data[0] = HCI_EVENT_EXT_BT_COEX_CONTROL; //extension event code - len ++; - - // Return parameters starts from here + 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); @@ -1618,7 +1632,7 @@ void rtw_btcoex_SendEventExtBtCoexControl(PADAPTER padapter, u8 bNeedDbgRsp, u8 pEvent->Length = len; - //total tx event length + EventCode length + sizeof(length) + /* 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); @@ -1632,28 +1646,27 @@ void rtw_btcoex_SendEventExtBtInfoControl(PADAPTER padapter, u8 dataLen, void *p { rtw_HCI_event *pEvent; u8 *pRetPar; - u8 len=0, tx_event_length = 0; + 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); + + /* RTW_INFO("%s\n",__func__);*/ + if (pBtMgnt->ExtConfig.HCIExtensionVer < 4) { /* not support */ + RTW_INFO("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); + /* 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 ++; + pEvent->Data[0] = HCI_EVENT_EXT_BT_INFO_CONTROL; /* extension event code */ + len++; - // Return parameters starts from here + /* Return parameters starts from here */ pRetPar = &pEvent->Data[len]; _rtw_memcpy(&pRetPar[0], pData, dataLen); @@ -1661,18 +1674,18 @@ void rtw_btcoex_SendEventExtBtInfoControl(PADAPTER padapter, u8 dataLen, void *p pEvent->Length = len; - //total tx event length + EventCode length + sizeof(length) + /* 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 len = 0, tx_event_length = 0; u8 localBuf[7] = ""; u8 *pRetPar; u8 *pu1Temp; @@ -1680,34 +1693,33 @@ void rtw_btcoex_SendScanNotify(PADAPTER padapter, u8 scanType) struct bt_coex_info *pcoex_info = &padapter->coex_info; PBT_MGNT pBtMgnt = &pcoex_info->BtMgnt; -// if(!pBtMgnt->BtOperationOn) -// return; - + /* if(!pBtMgnt->BtOperationOn) + * return; */ + pEvent = (rtw_HCI_event *)(&localBuf[0]); -// len += bthci_ExtensionEventHeaderRtk(&localBuf[0], -// HCI_EVENT_EXT_WIFI_SCAN_NOTIFY); + /* 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 ++; + 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; + /* 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) + /* 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 +#endif rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE); } -#endif //CONFIG_BT_COEXIST_SOCKET_TRX -#endif // CONFIG_BT_COEXIST - +#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */ +#endif /* CONFIG_BT_COEXIST */ diff --git a/core/rtw_cmd.c b/core/rtw_cmd.c old mode 100755 new mode 100644 index e644657..8bff0d0 --- a/core/rtw_cmd.c +++ b/core/rtw_cmd.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -22,74 +22,75 @@ #include #include +#ifndef DBG_CMD_EXECUTE + #define DBG_CMD_EXECUTE 0 +#endif + /* Caller and the rtw_cmd_thread can protect cmd_q by spin_lock. No irqsave is necessary. */ -sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv) +sint _rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) { - sint res=_SUCCESS; - -_func_enter_; + sint res = _SUCCESS; + _rtw_init_sema(&(pcmdpriv->cmd_queue_sema), 0); - //_rtw_init_sema(&(pcmdpriv->cmd_done_sema), 0); + /* _rtw_init_sema(&(pcmdpriv->cmd_done_sema), 0); */ _rtw_init_sema(&(pcmdpriv->terminate_cmdthread_sema), 0); - - + + _rtw_init_queue(&(pcmdpriv->cmd_queue)); - - //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf - + + /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ + pcmdpriv->cmd_seq = 1; - + pcmdpriv->cmd_allocated_buf = rtw_zmalloc(MAX_CMDSZ + CMDBUFF_ALIGN_SZ); - - if (pcmdpriv->cmd_allocated_buf == NULL){ - res= _FAIL; + + if (pcmdpriv->cmd_allocated_buf == NULL) { + res = _FAIL; goto exit; } - - pcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf + CMDBUFF_ALIGN_SZ - ( (SIZE_PTR)(pcmdpriv->cmd_allocated_buf) & (CMDBUFF_ALIGN_SZ-1)); - + + pcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf + CMDBUFF_ALIGN_SZ - ((SIZE_PTR)(pcmdpriv->cmd_allocated_buf) & (CMDBUFF_ALIGN_SZ - 1)); + pcmdpriv->rsp_allocated_buf = rtw_zmalloc(MAX_RSPSZ + 4); - - if (pcmdpriv->rsp_allocated_buf == NULL){ - res= _FAIL; + + if (pcmdpriv->rsp_allocated_buf == NULL) { + res = _FAIL; goto exit; } - - pcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf + 4 - ( (SIZE_PTR)(pcmdpriv->rsp_allocated_buf) & 3); + + pcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf + 4 - ((SIZE_PTR)(pcmdpriv->rsp_allocated_buf) & 3); pcmdpriv->cmd_issued_cnt = pcmdpriv->cmd_done_cnt = pcmdpriv->rsp_cnt = 0; _rtw_mutex_init(&pcmdpriv->sctx_mutex); exit: - -_func_exit_; + return res; - -} + +} #ifdef CONFIG_C2H_WK static void c2h_wk_callback(_workitem *work); #endif sint _rtw_init_evt_priv(struct evt_priv *pevtpriv) { - sint res=_SUCCESS; + sint res = _SUCCESS; -_func_enter_; #ifdef CONFIG_H2CLBK _rtw_init_sema(&(pevtpriv->lbkevt_done), 0); pevtpriv->lbkevt_limit = 0; pevtpriv->lbkevt_num = 0; - pevtpriv->cmdevt_parm = NULL; -#endif - - //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf + pevtpriv->cmdevt_parm = NULL; +#endif + + /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ ATOMIC_SET(&pevtpriv->event_seq, 0); pevtpriv->evt_done_cnt = 0; @@ -98,57 +99,54 @@ _func_enter_; _rtw_init_sema(&(pevtpriv->evt_notify), 0); _rtw_init_sema(&(pevtpriv->terminate_evtthread_sema), 0); - pevtpriv->evt_allocated_buf = rtw_zmalloc(MAX_EVTSZ + 4); - if (pevtpriv->evt_allocated_buf == NULL){ - res= _FAIL; + pevtpriv->evt_allocated_buf = rtw_zmalloc(MAX_EVTSZ + 4); + if (pevtpriv->evt_allocated_buf == NULL) { + res = _FAIL; goto exit; - } + } pevtpriv->evt_buf = pevtpriv->evt_allocated_buf + 4 - ((unsigned int)(pevtpriv->evt_allocated_buf) & 3); - - + + #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - pevtpriv->allocated_c2h_mem = rtw_zmalloc(C2H_MEM_SZ +4); - - if (pevtpriv->allocated_c2h_mem == NULL){ - res= _FAIL; + pevtpriv->allocated_c2h_mem = rtw_zmalloc(C2H_MEM_SZ + 4); + + if (pevtpriv->allocated_c2h_mem == NULL) { + res = _FAIL; goto exit; } pevtpriv->c2h_mem = pevtpriv->allocated_c2h_mem + 4\ - - ( (u32)(pevtpriv->allocated_c2h_mem) & 3); + - ((u32)(pevtpriv->allocated_c2h_mem) & 3); #ifdef PLATFORM_OS_XP - pevtpriv->pc2h_mdl= IoAllocateMdl((u8 *)pevtpriv->c2h_mem, C2H_MEM_SZ , FALSE, FALSE, NULL); - - if(pevtpriv->pc2h_mdl == NULL){ - res= _FAIL; + pevtpriv->pc2h_mdl = IoAllocateMdl((u8 *)pevtpriv->c2h_mem, C2H_MEM_SZ , FALSE, FALSE, NULL); + + if (pevtpriv->pc2h_mdl == NULL) { + res = _FAIL; goto exit; } MmBuildMdlForNonPagedPool(pevtpriv->pc2h_mdl); #endif -#endif //end of CONFIG_SDIO_HCI +#endif /* end of CONFIG_SDIO_HCI */ _rtw_init_queue(&(pevtpriv->evt_queue)); -exit: +exit: -#endif //end of CONFIG_EVENT_THREAD_MODE +#endif /* end of CONFIG_EVENT_THREAD_MODE */ #ifdef CONFIG_C2H_WK _init_workitem(&pevtpriv->c2h_wk, c2h_wk_callback, NULL); pevtpriv->c2h_wk_alive = _FALSE; - pevtpriv->c2h_queue = rtw_cbuf_alloc(C2H_QUEUE_MAX_LEN+1); + pevtpriv->c2h_queue = rtw_cbuf_alloc(C2H_QUEUE_MAX_LEN + 1); #endif -_func_exit_; return res; } -void _rtw_free_evt_priv (struct evt_priv *pevtpriv) +void _rtw_free_evt_priv(struct evt_priv *pevtpriv) { -_func_enter_; - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("+_rtw_free_evt_priv \n")); #ifdef CONFIG_EVENT_THREAD_MODE _rtw_free_sema(&(pevtpriv->evt_notify)); @@ -161,50 +159,45 @@ _func_enter_; #ifdef CONFIG_C2H_WK _cancel_workitem_sync(&pevtpriv->c2h_wk); - while(pevtpriv->c2h_wk_alive) + while (pevtpriv->c2h_wk_alive) rtw_msleep_os(10); while (!rtw_cbuf_empty(pevtpriv->c2h_queue)) { void *c2h; - if ((c2h = rtw_cbuf_pop(pevtpriv->c2h_queue)) != NULL - && c2h != (void *)pevtpriv) { + c2h = rtw_cbuf_pop(pevtpriv->c2h_queue); + if (c2h != NULL && c2h != (void *)pevtpriv) rtw_mfree(c2h, 16); - } } rtw_cbuf_free(pevtpriv->c2h_queue); #endif - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("-_rtw_free_evt_priv \n")); -_func_exit_; } -void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv) +void _rtw_free_cmd_priv(struct cmd_priv *pcmdpriv) { -_func_enter_; - if(pcmdpriv){ + if (pcmdpriv) { _rtw_spinlock_free(&(pcmdpriv->cmd_queue.lock)); _rtw_free_sema(&(pcmdpriv->cmd_queue_sema)); - //_rtw_free_sema(&(pcmdpriv->cmd_done_sema)); + /* _rtw_free_sema(&(pcmdpriv->cmd_done_sema)); */ _rtw_free_sema(&(pcmdpriv->terminate_cmdthread_sema)); if (pcmdpriv->cmd_allocated_buf) rtw_mfree(pcmdpriv->cmd_allocated_buf, MAX_CMDSZ + CMDBUFF_ALIGN_SZ); - + if (pcmdpriv->rsp_allocated_buf) rtw_mfree(pcmdpriv->rsp_allocated_buf, MAX_RSPSZ + 4); _rtw_mutex_free(&pcmdpriv->sctx_mutex); } -_func_exit_; } /* Calling Context: -rtw_enqueue_cmd can only be called between kernel thread, +rtw_enqueue_cmd can only be called between kernel thread, since only spin_lock is used. ISR/Call-Back functions can't call this sub-function. @@ -214,67 +207,63 @@ ISR/Call-Back functions can't call this sub-function. extern u8 dump_cmd_id; #endif -sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj) +sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj, bool to_head) { _irqL irqL; -_func_enter_; if (obj == NULL) goto exit; - if(obj->cmdsz > MAX_CMDSZ ){ - DBG_871X("%s failed due to obj->cmdsz(%d) > MAX_CMDSZ(%d) \n",__FUNCTION__, obj->cmdsz,MAX_CMDSZ); - goto exit; - } - //_enter_critical_bh(&queue->lock, &irqL); - _enter_critical(&queue->lock, &irqL); + /* _enter_critical_bh(&queue->lock, &irqL); */ + _enter_critical(&queue->lock, &irqL); - rtw_list_insert_tail(&obj->list, &queue->queue); + if (to_head) + rtw_list_insert_head(&obj->list, &queue->queue); + else + rtw_list_insert_tail(&obj->list, &queue->queue); - #ifdef DBG_CMD_QUEUE - if(dump_cmd_id){ - printk("%s===> cmdcode:0x%02x\n",__FUNCTION__,obj->cmdcode); - if(obj->cmdcode == GEN_CMD_CODE(_Set_MLME_EVT)){ - if(obj->parmbuf){ +#ifdef DBG_CMD_QUEUE + if (dump_cmd_id) { + printk("%s===> cmdcode:0x%02x\n", __FUNCTION__, obj->cmdcode); + if (obj->cmdcode == GEN_CMD_CODE(_Set_MLME_EVT)) { + if (obj->parmbuf) { struct C2HEvent_Header *pc2h_evt_hdr = (struct C2HEvent_Header *)(obj->parmbuf); - printk("pc2h_evt_hdr->ID:0x%02x(%d)\n",pc2h_evt_hdr->ID,pc2h_evt_hdr->ID); + printk("pc2h_evt_hdr->ID:0x%02x(%d)\n", pc2h_evt_hdr->ID, pc2h_evt_hdr->ID); } } - if(obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)){ - if(obj->parmbuf){ - struct drvextra_cmd_parm *pdrvextra_cmd_parm =(struct drvextra_cmd_parm*)(obj->parmbuf); - printk("pdrvextra_cmd_parm->ec_id:0x%02x\n",pdrvextra_cmd_parm->ec_id); + if (obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { + if (obj->parmbuf) { + struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)(obj->parmbuf); + printk("pdrvextra_cmd_parm->ec_id:0x%02x\n", pdrvextra_cmd_parm->ec_id); } } - } - - if (queue->queue.prev->next != &queue->queue) - { - DBG_871X("[%d] head %p, tail %p, tail->prev->next %p[tail], tail->next %p[head]\n", __LINE__, - &queue->queue, queue->queue.prev, queue->queue.prev->prev->next, queue->queue.prev->next); - - DBG_871X("==========%s============\n",__FUNCTION__); - DBG_871X("head:%p,obj_addr:%p\n",&queue->queue,obj); - DBG_871X("padapter: %p\n",obj->padapter); - DBG_871X("cmdcode: 0x%02x\n",obj->cmdcode); - DBG_871X("res: %d\n",obj->res); - DBG_871X("parmbuf: %p\n",obj->parmbuf); - DBG_871X("cmdsz: %d\n",obj->cmdsz); - DBG_871X("rsp: %p\n",obj->rsp); - DBG_871X("rspsz: %d\n",obj->rspsz); - DBG_871X("sctx: %p\n",obj->sctx); - DBG_871X("list->next: %p\n",obj->list.next); - DBG_871X("list->prev: %p\n",obj->list.prev); } - #endif //DBG_CMD_QUEUE - - //_exit_critical_bh(&queue->lock, &irqL); + + if (queue->queue.prev->next != &queue->queue) { + RTW_INFO("[%d] head %p, tail %p, tail->prev->next %p[tail], tail->next %p[head]\n", __LINE__, + &queue->queue, queue->queue.prev, queue->queue.prev->prev->next, queue->queue.prev->next); + + RTW_INFO("==========%s============\n", __FUNCTION__); + RTW_INFO("head:%p,obj_addr:%p\n", &queue->queue, obj); + RTW_INFO("padapter: %p\n", obj->padapter); + RTW_INFO("cmdcode: 0x%02x\n", obj->cmdcode); + RTW_INFO("res: %d\n", obj->res); + RTW_INFO("parmbuf: %p\n", obj->parmbuf); + RTW_INFO("cmdsz: %d\n", obj->cmdsz); + RTW_INFO("rsp: %p\n", obj->rsp); + RTW_INFO("rspsz: %d\n", obj->rspsz); + RTW_INFO("sctx: %p\n", obj->sctx); + RTW_INFO("list->next: %p\n", obj->list.next); + RTW_INFO("list->prev: %p\n", obj->list.prev); + } +#endif /* DBG_CMD_QUEUE */ + + /* _exit_critical_bh(&queue->lock, &irqL); */ _exit_critical(&queue->lock, &irqL); -exit: +exit: -_func_exit_; return _SUCCESS; } @@ -284,62 +273,57 @@ struct cmd_obj *_rtw_dequeue_cmd(_queue *queue) _irqL irqL; struct cmd_obj *obj; -_func_enter_; - //_enter_critical_bh(&(queue->lock), &irqL); + /* _enter_critical_bh(&(queue->lock), &irqL); */ _enter_critical(&queue->lock, &irqL); - - #ifdef DBG_CMD_QUEUE - if (queue->queue.prev->next != &queue->queue) - { - DBG_871X("[%d] head %p, tail %p, tail->prev->next %p[tail], tail->next %p[head]\n", __LINE__, - &queue->queue, queue->queue.prev, queue->queue.prev->prev->next, queue->queue.prev->next); + +#ifdef DBG_CMD_QUEUE + if (queue->queue.prev->next != &queue->queue) { + RTW_INFO("[%d] head %p, tail %p, tail->prev->next %p[tail], tail->next %p[head]\n", __LINE__, + &queue->queue, queue->queue.prev, queue->queue.prev->prev->next, queue->queue.prev->next); } - #endif //DBG_CMD_QUEUE +#endif /* DBG_CMD_QUEUE */ - if (rtw_is_list_empty(&(queue->queue))){ + if (rtw_is_list_empty(&(queue->queue))) obj = NULL; - } - else - { + else { obj = LIST_CONTAINOR(get_next(&(queue->queue)), struct cmd_obj, list); - #ifdef DBG_CMD_QUEUE - if (queue->queue.prev->next != &queue->queue){ - DBG_871X("==========%s============\n",__FUNCTION__); - DBG_871X("head:%p,obj_addr:%p\n",&queue->queue,obj); - DBG_871X("padapter: %p\n",obj->padapter); - DBG_871X("cmdcode: 0x%02x\n",obj->cmdcode); - DBG_871X("res: %d\n",obj->res); - DBG_871X("parmbuf: %p\n",obj->parmbuf); - DBG_871X("cmdsz: %d\n",obj->cmdsz); - DBG_871X("rsp: %p\n",obj->rsp); - DBG_871X("rspsz: %d\n",obj->rspsz); - DBG_871X("sctx: %p\n",obj->sctx); - DBG_871X("list->next: %p\n",obj->list.next); - DBG_871X("list->prev: %p\n",obj->list.prev); +#ifdef DBG_CMD_QUEUE + if (queue->queue.prev->next != &queue->queue) { + RTW_INFO("==========%s============\n", __FUNCTION__); + RTW_INFO("head:%p,obj_addr:%p\n", &queue->queue, obj); + RTW_INFO("padapter: %p\n", obj->padapter); + RTW_INFO("cmdcode: 0x%02x\n", obj->cmdcode); + RTW_INFO("res: %d\n", obj->res); + RTW_INFO("parmbuf: %p\n", obj->parmbuf); + RTW_INFO("cmdsz: %d\n", obj->cmdsz); + RTW_INFO("rsp: %p\n", obj->rsp); + RTW_INFO("rspsz: %d\n", obj->rspsz); + RTW_INFO("sctx: %p\n", obj->sctx); + RTW_INFO("list->next: %p\n", obj->list.next); + RTW_INFO("list->prev: %p\n", obj->list.prev); } - - if(dump_cmd_id){ - DBG_871X("%s===> cmdcode:0x%02x\n",__FUNCTION__,obj->cmdcode); - if(obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)){ - if(obj->parmbuf){ - struct drvextra_cmd_parm *pdrvextra_cmd_parm =(struct drvextra_cmd_parm*)(obj->parmbuf); - printk("pdrvextra_cmd_parm->ec_id:0x%02x\n",pdrvextra_cmd_parm->ec_id); - } - } - } - #endif //DBG_CMD_QUEUE - + if (dump_cmd_id) { + RTW_INFO("%s===> cmdcode:0x%02x\n", __FUNCTION__, obj->cmdcode); + if (obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { + if (obj->parmbuf) { + struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)(obj->parmbuf); + printk("pdrvextra_cmd_parm->ec_id:0x%02x\n", pdrvextra_cmd_parm->ec_id); + } + } + + } +#endif /* DBG_CMD_QUEUE */ + rtw_list_delete(&obj->list); } - //_exit_critical_bh(&(queue->lock), &irqL); + /* _exit_critical_bh(&(queue->lock), &irqL); */ _exit_critical(&queue->lock, &irqL); -_func_exit_; return obj; } @@ -347,84 +331,73 @@ _func_exit_; u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) { u32 res; -_func_enter_; - res = _rtw_init_cmd_priv (pcmdpriv); -_func_exit_; - return res; -} - -u32 rtw_init_evt_priv (struct evt_priv *pevtpriv) -{ - int res; -_func_enter_; - res = _rtw_init_evt_priv(pevtpriv); -_func_exit_; + res = _rtw_init_cmd_priv(pcmdpriv); return res; } -void rtw_free_evt_priv (struct evt_priv *pevtpriv) +u32 rtw_init_evt_priv(struct evt_priv *pevtpriv) { -_func_enter_; - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_evt_priv\n")); - _rtw_free_evt_priv(pevtpriv); -_func_exit_; -} + int res; + res = _rtw_init_evt_priv(pevtpriv); + return res; +} -void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv) +void rtw_free_evt_priv(struct evt_priv *pevtpriv) +{ + _rtw_free_evt_priv(pevtpriv); +} + +void rtw_free_cmd_priv(struct cmd_priv *pcmdpriv) { -_func_enter_; - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_cmd_priv\n")); _rtw_free_cmd_priv(pcmdpriv); -_func_exit_; -} +} int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj); int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) { - u8 bAllow = _FALSE; //set to _TRUE to allow enqueuing cmd when hw_init_completed is _FALSE - - #ifdef SUPPORT_HW_RFOFF_DETECTED - //To decide allow or not - if( (adapter_to_pwrctl(pcmdpriv->padapter)->bHWPwrPindetect) - &&(!pcmdpriv->padapter->registrypriv.usbss_enable) - ) - { - if(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra) ) - { - struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; - if(pdrvextra_cmd_parm->ec_id == POWER_SAVING_CTRL_WK_CID) - { - //DBG_871X("==>enqueue POWER_SAVING_CTRL_WK_CID\n"); - bAllow = _TRUE; - } - } - } - #endif + u8 bAllow = _FALSE; /* set to _TRUE to allow enqueuing cmd when hw_init_completed is _FALSE */ -#ifndef CONFIG_C2H_PACKET_EN - /* C2H should be always allowed */ - if(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { - struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; - if(pdrvextra_cmd_parm->ec_id == C2H_WK_CID) { - bAllow = _TRUE; +#ifdef SUPPORT_HW_RFOFF_DETECTED + /* To decide allow or not */ + if ((adapter_to_pwrctl(pcmdpriv->padapter)->bHWPwrPindetect) + && (!pcmdpriv->padapter->registrypriv.usbss_enable) + ) { + if (cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { + struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; + if (pdrvextra_cmd_parm->ec_id == POWER_SAVING_CTRL_WK_CID) { + /* RTW_INFO("==>enqueue POWER_SAVING_CTRL_WK_CID\n"); */ + bAllow = _TRUE; + } } } #endif - if(cmd_obj->cmdcode == GEN_CMD_CODE(_SetChannelPlan)) +#ifndef CONFIG_C2H_PACKET_EN + /* C2H should be always allowed */ + if (cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { + struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; + if (pdrvextra_cmd_parm->ec_id == C2H_WK_CID) + bAllow = _TRUE; + } +#endif + + if (cmd_obj->cmdcode == GEN_CMD_CODE(_SetChannelPlan)) + bAllow = _TRUE; + + if (cmd_obj->no_io) bAllow = _TRUE; if ((!rtw_is_hw_init_completed(pcmdpriv->padapter) && (bAllow == _FALSE)) - || ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _FALSE //com_thread not running - ) { - /*DBG_871X("%s:%s: drop cmdcode:%u, hw_init_completed:%u, cmdthd_running:%u\n", caller_func, __FUNCTION__, - cmd_obj->cmdcode, - rtw_get_hw_init_completed(cmd_obj->padapter), - pcmdpriv->cmdthd_running - );*/ + || ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _FALSE /* com_thread not running */ + ) { + if (DBG_CMD_EXECUTE) + RTW_INFO(ADPT_FMT" drop "CMD_FMT" hw_init_completed:%u, cmdthd_running:%u\n", ADPT_ARG(cmd_obj->padapter) + , CMD_ARG(cmd_obj), rtw_get_hw_init_completed(cmd_obj->padapter), ATOMIC_READ(&pcmdpriv->cmdthd_running)); + if (0) + rtw_warn_on(1); return _FAIL; - } + } return _SUCCESS; } @@ -434,34 +407,43 @@ u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) { int res = _FAIL; PADAPTER padapter = pcmdpriv->padapter; - -_func_enter_; - - if (cmd_obj == NULL) { + + + if (cmd_obj == NULL) goto exit; - } cmd_obj->padapter = padapter; #ifdef CONFIG_CONCURRENT_MODE - //change pcmdpriv to primary's pcmdpriv - if (padapter->adapter_type != PRIMARY_ADAPTER && padapter->pbuddy_adapter) - pcmdpriv = &(padapter->pbuddy_adapter->cmdpriv); -#endif + /* change pcmdpriv to primary's pcmdpriv */ + if (padapter->adapter_type != PRIMARY_ADAPTER) + pcmdpriv = &(GET_PRIMARY_ADAPTER(padapter)->cmdpriv); +#endif - if( _FAIL == (res=rtw_cmd_filter(pcmdpriv, cmd_obj)) ) { + res = rtw_cmd_filter(pcmdpriv, cmd_obj); + if ((_FAIL == res) || (cmd_obj->cmdsz > MAX_CMDSZ)) { + if (cmd_obj->cmdsz > MAX_CMDSZ) { + RTW_INFO("%s failed due to obj->cmdsz(%d) > MAX_CMDSZ(%d)\n", __func__, cmd_obj->cmdsz, MAX_CMDSZ); + rtw_warn_on(1); + } + + if (cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { + struct drvextra_cmd_parm *extra_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; + + if (extra_parm->pbuf && extra_parm->size > 0) + rtw_mfree(extra_parm->pbuf, extra_parm->size); + } rtw_free_cmd_obj(cmd_obj); goto exit; } - res = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj); + res = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj, 0); - if(res == _SUCCESS) + if (res == _SUCCESS) _rtw_up_sema(&pcmdpriv->cmd_queue_sema); - -exit: - -_func_exit_; + +exit: + return res; } @@ -469,54 +451,45 @@ _func_exit_; struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv) { struct cmd_obj *cmd_obj; - -_func_enter_; + cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue); - -_func_exit_; + return cmd_obj; } void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv) { -_func_enter_; pcmdpriv->cmd_done_cnt++; - //_rtw_up_sema(&(pcmdpriv->cmd_done_sema)); -_func_exit_; + /* _rtw_up_sema(&(pcmdpriv->cmd_done_sema)); */ } void rtw_free_cmd_obj(struct cmd_obj *pcmd) { struct drvextra_cmd_parm *extra_parm = NULL; -_func_enter_; if (pcmd->parmbuf != NULL) { /* free parmbuf in cmd_obj */ rtw_mfree((unsigned char *)pcmd->parmbuf, pcmd->cmdsz); } - if(pcmd->rsp!=NULL) - { - if(pcmd->rspsz!= 0) - { - //free rsp in cmd_obj - rtw_mfree((unsigned char*)pcmd->rsp, pcmd->rspsz); - } - } + if (pcmd->rsp != NULL) { + if (pcmd->rspsz != 0) { + /* free rsp in cmd_obj */ + rtw_mfree((unsigned char *)pcmd->rsp, pcmd->rspsz); + } + } + + /* free cmd_obj */ + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - //free cmd_obj - rtw_mfree((unsigned char*)pcmd, sizeof(struct cmd_obj)); - -_func_exit_; } void rtw_stop_cmd_thread(_adapter *adapter) { - if(adapter->cmdThread && - ATOMIC_READ(&(adapter->cmdpriv.cmdthd_running)) == _TRUE && - adapter->cmdpriv.stop_req == 0) - { + if (adapter->cmdThread && + ATOMIC_READ(&(adapter->cmdpriv.cmdthd_running)) == _TRUE && + adapter->cmdpriv.stop_req == 0) { adapter->cmdpriv.stop_req = 1; _rtw_up_sema(&adapter->cmdpriv.cmd_queue_sema); _rtw_down_sema(&adapter->cmdpriv.terminate_cmdthread_sema); @@ -530,13 +503,12 @@ thread_return rtw_cmd_thread(thread_context context) u8 *pcmdbuf, *prspbuf; u32 cmd_start_time; u32 cmd_process_time; - u8 (*cmd_hdl)(_adapter *padapter, u8* pbuf); + u8(*cmd_hdl)(_adapter *padapter, u8 *pbuf); void (*pcmd_callback)(_adapter *dev, struct cmd_obj *pcmd); PADAPTER padapter = (PADAPTER)context; struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); struct drvextra_cmd_parm *extra_parm = NULL; _irqL irqL; -_func_enter_; thread_enter("RTW_CMD_THREAD"); @@ -547,58 +519,47 @@ _func_enter_; ATOMIC_SET(&(pcmdpriv->cmdthd_running), _TRUE); _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema); - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("start r871x rtw_cmd_thread !!!!\n")); - while(1) - { + while (1) { if (_rtw_down_sema(&pcmdpriv->cmd_queue_sema) == _FAIL) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" _rtw_down_sema(&pcmdpriv->cmd_queue_sema) return _FAIL, break\n", FUNC_ADPT_ARG(padapter)); + RTW_PRINT(FUNC_ADPT_FMT" _rtw_down_sema(&pcmdpriv->cmd_queue_sema) return _FAIL, break\n", FUNC_ADPT_ARG(padapter)); break; } if (RTW_CANNOT_RUN(padapter)) { - DBG_871X_LEVEL(_drv_always_, "%s: DriverStopped(%s) SurpriseRemoved(%s) break at line %d\n", - __func__ - , rtw_is_drv_stopped(padapter)?"True":"False" - , rtw_is_surprise_removed(padapter)?"True":"False" - , __LINE__); + RTW_PRINT("%s: DriverStopped(%s) SurpriseRemoved(%s) break at line %d\n", + __func__ + , rtw_is_drv_stopped(padapter) ? "True" : "False" + , rtw_is_surprise_removed(padapter) ? "True" : "False" + , __LINE__); break; } if (pcmdpriv->stop_req) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" stop_req:%u, break\n", FUNC_ADPT_ARG(padapter), pcmdpriv->stop_req); + RTW_PRINT(FUNC_ADPT_FMT" stop_req:%u, break\n", FUNC_ADPT_ARG(padapter), pcmdpriv->stop_req); break; } - + _enter_critical(&pcmdpriv->cmd_queue.lock, &irqL); - if(rtw_is_list_empty(&(pcmdpriv->cmd_queue.queue))) - { - //DBG_871X("%s: cmd queue is empty!\n", __func__); + if (rtw_is_list_empty(&(pcmdpriv->cmd_queue.queue))) { + /* RTW_INFO("%s: cmd queue is empty!\n", __func__); */ _exit_critical(&pcmdpriv->cmd_queue.lock, &irqL); continue; } _exit_critical(&pcmdpriv->cmd_queue.lock, &irqL); -#ifdef CONFIG_LPS_LCLK - if (rtw_register_cmd_alive(padapter) != _SUCCESS) - { - RT_TRACE(_module_hal_xmit_c_, _drv_notice_, - ("%s: wait to leave LPS_LCLK\n", __FUNCTION__)); - continue; - } -#endif - _next: if (RTW_CANNOT_RUN(padapter)) { - DBG_871X_LEVEL(_drv_always_, "%s: DriverStopped(%s) SurpriseRemoved(%s) break at line %d\n", - __func__ - , rtw_is_drv_stopped(padapter)?"True":"False" - , rtw_is_surprise_removed(padapter)?"True":"False" - , __LINE__); + RTW_PRINT("%s: DriverStopped(%s) SurpriseRemoved(%s) break at line %d\n", + __func__ + , rtw_is_drv_stopped(padapter) ? "True" : "False" + , rtw_is_surprise_removed(padapter) ? "True" : "False" + , __LINE__); break; } - if(!(pcmd = rtw_dequeue_cmd(pcmdpriv))) { + pcmd = rtw_dequeue_cmd(pcmdpriv); + if (!pcmd) { #ifdef CONFIG_LPS_LCLK rtw_unregister_cmd_alive(padapter); #endif @@ -606,9 +567,28 @@ _next: } cmd_start_time = rtw_get_current_time(); + pcmdpriv->cmd_issued_cnt++; - if( _FAIL == rtw_cmd_filter(pcmdpriv, pcmd) ) - { + if (pcmd->cmdsz > MAX_CMDSZ) { + RTW_ERR("%s cmdsz:%d > MAX_CMDSZ:%d\n", __func__, pcmd->cmdsz, MAX_CMDSZ); + pcmd->res = H2C_PARAMETERS_ERROR; + goto post_process; + } + + if (pcmd->cmdcode >= (sizeof(wlancmds) / sizeof(struct cmd_hdl))) { + RTW_ERR("%s undefined cmdcode:%d\n", __func__, pcmd->cmdcode); + pcmd->res = H2C_PARAMETERS_ERROR; + goto post_process; + } + + cmd_hdl = wlancmds[pcmd->cmdcode].h2cfuns; + if (!cmd_hdl) { + RTW_ERR("%s no cmd_hdl for cmdcode:%d\n", __func__, pcmd->cmdcode); + pcmd->res = H2C_PARAMETERS_ERROR; + goto post_process; + } + + if (_FAIL == rtw_cmd_filter(pcmdpriv, pcmd)) { pcmd->res = H2C_DROPPED; if (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { extra_parm = (struct drvextra_cmd_parm *)pcmd->parmbuf; @@ -618,40 +598,46 @@ _next: goto post_process; } - pcmdpriv->cmd_issued_cnt++; +#ifdef CONFIG_LPS_LCLK + if (pcmd->no_io) + rtw_unregister_cmd_alive(padapter); + else { + if (rtw_register_cmd_alive(padapter) != _SUCCESS) { + if (DBG_CMD_EXECUTE) + RTW_PRINT("%s: wait to leave LPS_LCLK\n", __func__); - if(pcmd->cmdsz > MAX_CMDSZ ){ - DBG_871X("%s cmdsz:%d > MAX_CMDSZ:%d\n",__FUNCTION__,pcmd->cmdsz,MAX_CMDSZ); + pcmd->res = H2C_ENQ_HEAD; + ret = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, pcmd, 1); + if (ret == _SUCCESS) { + if (DBG_CMD_EXECUTE) + RTW_INFO(ADPT_FMT" "CMD_FMT" ENQ_HEAD\n", ADPT_ARG(pcmd->padapter), CMD_ARG(pcmd)); + continue; + } + + RTW_INFO(ADPT_FMT" "CMD_FMT" ENQ_HEAD_FAIL\n", ADPT_ARG(pcmd->padapter), CMD_ARG(pcmd)); + pcmd->res = H2C_ENQ_HEAD_FAIL; + rtw_warn_on(1); + } } +#endif /* CONFIG_LPS_LCLK */ + + if (DBG_CMD_EXECUTE) + RTW_INFO(ADPT_FMT" "CMD_FMT" %sexecute\n", ADPT_ARG(pcmd->padapter), CMD_ARG(pcmd) + , pcmd->res == H2C_ENQ_HEAD ? "ENQ_HEAD " : (pcmd->res == H2C_ENQ_HEAD_FAIL ? "ENQ_HEAD_FAIL " : "")); _rtw_memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz); + ret = cmd_hdl(pcmd->padapter, pcmdbuf); + pcmd->res = ret; - if(pcmd->cmdcode < (sizeof(wlancmds) /sizeof(struct cmd_hdl))) - { - cmd_hdl = wlancmds[pcmd->cmdcode].h2cfuns; - - if (cmd_hdl) - { - ret = cmd_hdl(pcmd->padapter, pcmdbuf); - pcmd->res = ret; - } - - pcmdpriv->cmd_seq++; - } - else - { - pcmd->res = H2C_PARAMETERS_ERROR; - } - - cmd_hdl = NULL; + pcmdpriv->cmd_seq++; 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)); + RTW_PRINT(FUNC_ADPT_FMT" pcmd->sctx\n", + FUNC_ADPT_ARG(pcmd->padapter)); if (pcmd->res == H2C_SUCCESS) rtw_sctx_done(&pcmd->sctx); else @@ -659,44 +645,23 @@ post_process: } _exit_critical_mutex(&(pcmd->padapter->cmdpriv.sctx_mutex), NULL); - - if((cmd_process_time = rtw_get_passing_time_ms(cmd_start_time)) > 1000) - { - if (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { - struct drvextra_cmd_parm *drvextra_parm = (struct drvextra_cmd_parm *)pcmdbuf; - DBG_871X(ADPT_FMT" cmd=%d,%d,%d process_time=%d > 1 sec\n", - ADPT_ARG(pcmd->padapter), pcmd->cmdcode, drvextra_parm->ec_id, drvextra_parm->type, cmd_process_time); - //rtw_warn_on(1); - } else if(pcmd->cmdcode == GEN_CMD_CODE(_Set_MLME_EVT)){ - struct C2HEvent_Header *pc2h_evt_hdr = (struct C2HEvent_Header *)pcmdbuf; - DBG_871X(ADPT_FMT" cmd=%d,%d, process_time=%d > 1 sec\n", - ADPT_ARG(pcmd->padapter), pcmd->cmdcode, pc2h_evt_hdr->ID, cmd_process_time); - //rtw_warn_on(1); - } else { - DBG_871X(ADPT_FMT" cmd=%d, process_time=%d > 1 sec\n", - ADPT_ARG(pcmd->padapter), pcmd->cmdcode, cmd_process_time); - //rtw_warn_on(1); - } + cmd_process_time = rtw_get_passing_time_ms(cmd_start_time); + if (cmd_process_time > 1000) { + RTW_INFO(ADPT_FMT" "CMD_FMT" process_time=%d\n", ADPT_ARG(pcmd->padapter), CMD_ARG(pcmd), cmd_process_time); + if (0) + rtw_warn_on(1); } - //call callback function for post-processed - if(pcmd->cmdcode < (sizeof(rtw_cmd_callback) /sizeof(struct _cmd_callback))) - { + /* call callback function for post-processed */ + if (pcmd->cmdcode < (sizeof(rtw_cmd_callback) / sizeof(struct _cmd_callback))) { pcmd_callback = rtw_cmd_callback[pcmd->cmdcode].callback; - if(pcmd_callback == NULL) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("mlme_cmd_hdl(): pcmd_callback=0x%p, cmdcode=0x%x\n", pcmd_callback, pcmd->cmdcode)); + if (pcmd_callback == NULL) { rtw_free_cmd_obj(pcmd); + } else { + /* todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!=NULL) */ + pcmd_callback(pcmd->padapter, pcmd);/* need conider that free cmd_obj in rtw_cmd_callback */ } - else - { - //todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!=NULL) - pcmd_callback(pcmd->padapter, pcmd);//need conider that free cmd_obj in rtw_cmd_callback - } - } - else - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("%s: cmdcode=0x%x callback not defined!\n", __FUNCTION__, pcmd->cmdcode)); + } else { rtw_free_cmd_obj(pcmd); } @@ -706,31 +671,33 @@ post_process: } - // free all cmd_obj resources - do{ - pcmd = rtw_dequeue_cmd(pcmdpriv); - if(pcmd==NULL){ #ifdef CONFIG_LPS_LCLK - rtw_unregister_cmd_alive(padapter); + rtw_unregister_cmd_alive(padapter); #endif + + /* to avoid enqueue cmd after free all cmd_obj */ + ATOMIC_SET(&(pcmdpriv->cmdthd_running), _FALSE); + + /* free all cmd_obj resources */ + do { + pcmd = rtw_dequeue_cmd(pcmdpriv); + if (pcmd == NULL) break; - } - //DBG_871X("%s: leaving... drop cmdcode:%u size:%d\n", __FUNCTION__, pcmd->cmdcode, pcmd->cmdsz); + + if (0) + RTW_INFO("%s: leaving... drop "CMD_FMT"\n", __func__, CMD_ARG(pcmd)); if (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { extra_parm = (struct drvextra_cmd_parm *)pcmd->parmbuf; - if(extra_parm->pbuf && extra_parm->size > 0) { + if (extra_parm->pbuf && extra_parm->size > 0) rtw_mfree(extra_parm->pbuf, extra_parm->size); - } } - rtw_free_cmd_obj(pcmd); - }while(1); + rtw_free_cmd_obj(pcmd); + } while (1); _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema); - ATOMIC_SET(&(pcmdpriv->cmdthd_running), _FALSE); -_func_exit_; thread_exit(); @@ -743,97 +710,87 @@ u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj) _irqL irqL; int res; _queue *queue = &pevtpriv->evt_queue; - -_func_enter_; - res = _SUCCESS; + + res = _SUCCESS; if (obj == NULL) { res = _FAIL; goto exit; - } + } _enter_critical_bh(&queue->lock, &irqL); rtw_list_insert_tail(&obj->list, &queue->queue); - + _exit_critical_bh(&queue->lock, &irqL); - //rtw_evt_notify_isr(pevtpriv); + /* rtw_evt_notify_isr(pevtpriv); */ exit: - -_func_exit_; - return res; + + return res; } struct evt_obj *rtw_dequeue_evt(_queue *queue) { _irqL irqL; struct evt_obj *pevtobj; - -_func_enter_; + _enter_critical_bh(&queue->lock, &irqL); if (rtw_is_list_empty(&(queue->queue))) pevtobj = NULL; - else - { + else { pevtobj = LIST_CONTAINOR(get_next(&(queue->queue)), struct evt_obj, list); rtw_list_delete(&pevtobj->list); } _exit_critical_bh(&queue->lock, &irqL); - -_func_exit_; - return pevtobj; + + return pevtobj; } void rtw_free_evt_obj(struct evt_obj *pevtobj) { -_func_enter_; - if(pevtobj->parmbuf) - rtw_mfree((unsigned char*)pevtobj->parmbuf, pevtobj->evtsz); - - rtw_mfree((unsigned char*)pevtobj, sizeof(struct evt_obj)); - -_func_exit_; + if (pevtobj->parmbuf) + rtw_mfree((unsigned char *)pevtobj->parmbuf, pevtobj->evtsz); + + rtw_mfree((unsigned char *)pevtobj, sizeof(struct evt_obj)); + } void rtw_evt_notify_isr(struct evt_priv *pevtpriv) { -_func_enter_; pevtpriv->evt_done_cnt++; _rtw_up_sema(&(pevtpriv->evt_notify)); -_func_exit_; } #endif /* -u8 rtw_setstandby_cmd(unsigned char *adapter) +u8 rtw_setstandby_cmd(unsigned char *adapter) */ u8 rtw_setstandby_cmd(_adapter *padapter, uint action) { - struct cmd_obj* ph2c; - struct usb_suspend_parm* psetusbsuspend; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct cmd_obj *ph2c; + struct usb_suspend_parm *psetusbsuspend; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 ret = _SUCCESS; - -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); if (ph2c == NULL) { ret = _FAIL; goto exit; } - - psetusbsuspend = (struct usb_suspend_parm*)rtw_zmalloc(sizeof(struct usb_suspend_parm)); + + psetusbsuspend = (struct usb_suspend_parm *)rtw_zmalloc(sizeof(struct usb_suspend_parm)); if (psetusbsuspend == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); ret = _FAIL; @@ -844,11 +801,10 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(ph2c, psetusbsuspend, GEN_CMD_CODE(_SetUsbSuspend)); - ret = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - -_func_exit_; + ret = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + return ret; } @@ -859,44 +815,40 @@ rtw_sitesurvey_cmd(~) MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock */ u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *ssid, int ssid_num, - struct rtw_ieee80211_channel *ch, int ch_num) + struct rtw_ieee80211_channel *ch, int ch_num) { u8 res = _FAIL; struct cmd_obj *ph2c; struct sitesurvey_parm *psurveyPara; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif //CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif /* CONFIG_P2P */ -_func_enter_; #ifdef CONFIG_LPS - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE){ + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1); - } #endif #ifdef CONFIG_P2P_PS - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) p2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1); - } -#endif //CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); if (ph2c == NULL) return _FAIL; - psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm)); + psurveyPara = (struct sitesurvey_parm *)rtw_zmalloc(sizeof(struct sitesurvey_parm)); if (psurveyPara == NULL) { - rtw_mfree((unsigned char*) ph2c, sizeof(struct cmd_obj)); + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); return _FAIL; } rtw_free_network_queue(padapter, _FALSE); - RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("%s: flush network queue\n", __FUNCTION__)); init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); @@ -906,12 +858,12 @@ _func_enter_; /* prepare ssid list */ if (ssid) { int i; - for (i=0; issid[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), + RTW_INFO(FUNC_ADPT_FMT" ssid:(%s, %d)\n", FUNC_ADPT_ARG(padapter), psurveyPara->ssid[i].Ssid, psurveyPara->ssid[i].SsidLength); } } @@ -920,13 +872,13 @@ _func_enter_; /* prepare channel list */ if (ch) { int i; - for (i=0; ich[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); + RTW_INFO(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter), + psurveyPara->ch[i].hw_value); } } } @@ -935,49 +887,44 @@ _func_enter_; res = rtw_enqueue_cmd(pcmdpriv, ph2c); - if(res == _SUCCESS) { + if (res == _SUCCESS) { pmlmepriv->scan_start_time = rtw_get_current_time(); #ifdef CONFIG_SCAN_BACKOP - if((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE) - { - if(IsSupported5G(padapter->registrypriv.wireless_mode) - && IsSupported24G(padapter->registrypriv.wireless_mode)) //dual band + if (rtw_mi_buddy_check_mlmeinfo_state(padapter, WIFI_FW_AP_STATE)) { + 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 + else /* single band */ mlme_set_scan_to_timer(pmlmepriv, CONC_SCANNING_TIMEOUT_SINGLE_BAND); - } - else + } else #endif /* CONFIG_SCAN_BACKOP */ mlme_set_scan_to_timer(pmlmepriv, SCANNING_TIMEOUT); rtw_led_control(padapter, LED_CTL_SITE_SURVEY); - } else { + } else _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); - } -_func_exit_; return res; } u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset) { - struct cmd_obj* ph2c; - struct setdatarate_parm* pbsetdataratepara; - struct cmd_priv* pcmdpriv = &padapter->cmdpriv; + struct cmd_obj *ph2c; + struct setdatarate_parm *pbsetdataratepara; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); if (ph2c == NULL) { res = _FAIL; goto exit; } - pbsetdataratepara = (struct setdatarate_parm*)rtw_zmalloc(sizeof(struct setdatarate_parm)); + pbsetdataratepara = (struct setdatarate_parm *)rtw_zmalloc(sizeof(struct setdatarate_parm)); if (pbsetdataratepara == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); res = _FAIL; @@ -986,8 +933,8 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(ph2c, pbsetdataratepara, GEN_CMD_CODE(_SetDataRate)); #ifdef MP_FIRMWARE_OFFLOAD - pbsetdataratepara->curr_rateidx = *(u32*)rateset; -// _rtw_memcpy(pbsetdataratepara, rateset, sizeof(u32)); + pbsetdataratepara->curr_rateidx = *(u32 *)rateset; + /* _rtw_memcpy(pbsetdataratepara, rateset, sizeof(u32)); */ #else pbsetdataratepara->mac_id = 5; _rtw_memcpy(pbsetdataratepara->datarates, rateset, NumRates); @@ -995,48 +942,45 @@ _func_enter_; res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; } u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset) { - struct cmd_obj* ph2c; - struct setbasicrate_parm* pssetbasicratepara; - struct cmd_priv* pcmdpriv=&padapter->cmdpriv; + struct cmd_obj *ph2c; + struct setbasicrate_parm *pssetbasicratepara; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); if (ph2c == NULL) { - res= _FAIL; + res = _FAIL; goto exit; } - pssetbasicratepara = (struct setbasicrate_parm*)rtw_zmalloc(sizeof(struct setbasicrate_parm)); + pssetbasicratepara = (struct setbasicrate_parm *)rtw_zmalloc(sizeof(struct setbasicrate_parm)); if (pssetbasicratepara == NULL) { - rtw_mfree((u8*) ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); res = _FAIL; goto exit; } init_h2fwcmd_w_parm_no_rsp(ph2c, pssetbasicratepara, _SetBasicRate_CMD_); - _rtw_memcpy(pssetbasicratepara->basicrates, rateset, NumRates); + _rtw_memcpy(pssetbasicratepara->basicrates, rateset, NumRates); - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: -_func_exit_; return res; } /* -unsigned char rtw_setphy_cmd(unsigned char *adapter) +unsigned char rtw_setphy_cmd(unsigned char *adapter) 1. be called only after rtw_update_registrypriv_dev_network( ~) or mp testing program 2. for AdHoc/Ap mode or mp mode? @@ -1044,38 +988,35 @@ unsigned char rtw_setphy_cmd(unsigned char *adapter) */ u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch) { - struct cmd_obj* ph2c; - struct setphy_parm* psetphypara; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; -// struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -// struct registry_priv* pregistry_priv = &padapter->registrypriv; - u8 res=_SUCCESS; + struct cmd_obj *ph2c; + struct setphy_parm *psetphypara; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + /* struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + * struct registry_priv* pregistry_priv = &padapter->registrypriv; */ + u8 res = _SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; - } - psetphypara = (struct setphy_parm*)rtw_zmalloc(sizeof(struct setphy_parm)); + } + psetphypara = (struct setphy_parm *)rtw_zmalloc(sizeof(struct setphy_parm)); - if(psetphypara==NULL){ + if (psetphypara == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } init_h2fwcmd_w_parm_no_rsp(ph2c, psetphypara, _SetPhy_CMD_); - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("CH=%d, modem=%d", ch, modem)); psetphypara->modem = modem; psetphypara->rfchannel = ch; - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: -_func_exit_; + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: return res; } @@ -1086,7 +1027,6 @@ u8 rtw_getmacreg_cmd(_adapter *padapter, u8 len, u32 addr) struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; -_func_enter_; ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); if (ph2c == NULL) { res = _FAIL; @@ -1108,185 +1048,172 @@ _func_enter_; res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; } void rtw_usb_catc_trigger_cmd(_adapter *padapter, const char *caller) { - DBG_871X("%s caller:%s\n", __func__, caller); + RTW_INFO("%s caller:%s\n", __func__, caller); rtw_getmacreg_cmd(padapter, 1, 0x1c4); } -u8 rtw_setbbreg_cmd(_adapter*padapter, u8 offset, u8 val) -{ - struct cmd_obj* ph2c; - struct writeBB_parm* pwritebbparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; +u8 rtw_setbbreg_cmd(_adapter *padapter, u8 offset, u8 val) +{ + struct cmd_obj *ph2c; + struct writeBB_parm *pwritebbparm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; - } - pwritebbparm = (struct writeBB_parm*)rtw_zmalloc(sizeof(struct writeBB_parm)); + } + pwritebbparm = (struct writeBB_parm *)rtw_zmalloc(sizeof(struct writeBB_parm)); - if(pwritebbparm==NULL){ + if (pwritebbparm == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } - init_h2fwcmd_w_parm_no_rsp(ph2c, pwritebbparm, GEN_CMD_CODE(_SetBBReg)); + init_h2fwcmd_w_parm_no_rsp(ph2c, pwritebbparm, GEN_CMD_CODE(_SetBBReg)); pwritebbparm->offset = offset; pwritebbparm->value = val; - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: -_func_exit_; + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: return res; } u8 rtw_getbbreg_cmd(_adapter *padapter, u8 offset, u8 *pval) -{ - struct cmd_obj* ph2c; - struct readBB_parm* prdbbparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res=_FAIL; - goto exit; - } - prdbbparm = (struct readBB_parm*)rtw_zmalloc(sizeof(struct readBB_parm)); +{ + struct cmd_obj *ph2c; + struct readBB_parm *prdbbparm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; - if(prdbbparm ==NULL){ + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; + goto exit; + } + prdbbparm = (struct readBB_parm *)rtw_zmalloc(sizeof(struct readBB_parm)); + + if (prdbbparm == NULL) { rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); return _FAIL; } _rtw_init_listhead(&ph2c->list); - ph2c->cmdcode =GEN_CMD_CODE(_GetBBReg); + ph2c->cmdcode = GEN_CMD_CODE(_GetBBReg); ph2c->parmbuf = (unsigned char *)prdbbparm; ph2c->cmdsz = sizeof(struct readBB_parm); ph2c->rsp = pval; ph2c->rspsz = sizeof(struct readBB_rsp); - - prdbbparm ->offset = offset; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); + + prdbbparm->offset = offset; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; } u8 rtw_setrfreg_cmd(_adapter *padapter, u8 offset, u32 val) -{ - struct cmd_obj* ph2c; - struct writeRF_parm* pwriterfparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; +{ + struct cmd_obj *ph2c; + struct writeRF_parm *pwriterfparm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; } - pwriterfparm = (struct writeRF_parm*)rtw_zmalloc(sizeof(struct writeRF_parm)); + pwriterfparm = (struct writeRF_parm *)rtw_zmalloc(sizeof(struct writeRF_parm)); - if(pwriterfparm==NULL){ + if (pwriterfparm == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } - init_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg)); + init_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg)); pwriterfparm->offset = offset; pwriterfparm->value = val; - res = rtw_enqueue_cmd(pcmdpriv, ph2c); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; } u8 rtw_getrfreg_cmd(_adapter *padapter, u8 offset, u8 *pval) -{ - struct cmd_obj* ph2c; - struct readRF_parm* prdrfparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; +{ + struct cmd_obj *ph2c; + struct readRF_parm *prdrfparm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; } - prdrfparm = (struct readRF_parm*)rtw_zmalloc(sizeof(struct readRF_parm)); - if(prdrfparm ==NULL){ + prdrfparm = (struct readRF_parm *)rtw_zmalloc(sizeof(struct readRF_parm)); + if (prdrfparm == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } _rtw_init_listhead(&ph2c->list); - ph2c->cmdcode =GEN_CMD_CODE(_GetRFReg); + ph2c->cmdcode = GEN_CMD_CODE(_GetRFReg); ph2c->parmbuf = (unsigned char *)prdrfparm; ph2c->cmdsz = sizeof(struct readRF_parm); ph2c->rsp = pval; ph2c->rspsz = sizeof(struct readRF_rsp); - - prdrfparm ->offset = offset; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); + + prdrfparm->offset = offset; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; } -void rtw_getbbrfreg_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) -{ - _func_enter_; - - //rtw_free_cmd_obj(pcmd); - rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz); - rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj)); - +void rtw_getbbrfreg_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd) +{ + + /* rtw_free_cmd_obj(pcmd); */ + rtw_mfree((unsigned char *) pcmd->parmbuf, pcmd->cmdsz); + rtw_mfree((unsigned char *) pcmd, sizeof(struct cmd_obj)); + #ifdef CONFIG_MP_INCLUDED if (padapter->registrypriv.mp_mode == 1) - padapter->mppriv.workparam.bcompleted= _TRUE; -#endif -_func_exit_; + padapter->mppriv.workparam.bcompleted = _TRUE; +#endif } -void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +void rtw_readtssi_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd) { - _func_enter_; - rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz); - rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj)); - + rtw_mfree((unsigned char *) pcmd->parmbuf, pcmd->cmdsz); + rtw_mfree((unsigned char *) pcmd, sizeof(struct cmd_obj)); + #ifdef CONFIG_MP_INCLUDED if (padapter->registrypriv.mp_mode == 1) - padapter->mppriv.workparam.bcompleted= _TRUE; + padapter->mppriv.workparam.bcompleted = _TRUE; #endif -_func_exit_; } static u8 rtw_createbss_cmd(_adapter *adapter, int flags, bool adhoc - , s16 req_ch, u8 req_bw, u8 req_offset) + , s16 req_ch, s8 req_bw, s8 req_offset) { struct cmd_obj *cmdobj; struct createbss_parm *parm; @@ -1295,6 +1222,13 @@ static u8 rtw_createbss_cmd(_adapter *adapter, int flags, bool adhoc struct submit_ctx sctx; u8 res = _SUCCESS; + if (req_ch > 0 && req_bw >= 0 && req_offset >= 0) { + if (!rtw_chset_is_chbw_valid(adapter->mlmeextpriv.channel_set, req_ch, req_bw, req_offset)) { + res = _FAIL; + goto exit; + } + } + /* prepare cmd parameter */ parm = (struct createbss_parm *)rtw_zmalloc(sizeof(*parm)); if (parm == NULL) { @@ -1352,7 +1286,7 @@ inline u8 rtw_create_ibss_cmd(_adapter *adapter, int flags) { return rtw_createbss_cmd(adapter, flags , 1 - , -1, 0, 0 /* for now, adhoc doesn't support ch,bw,offset request */ + , 0, -1, -1 /* for now, adhoc doesn't support ch,bw,offset request */ ); } @@ -1360,11 +1294,11 @@ inline u8 rtw_startbss_cmd(_adapter *adapter, int flags) { return rtw_createbss_cmd(adapter, flags , 0 - , -1, 0, 0 /* doesn't request ch, bw, offset */ + , 0, -1, -1 /* excute entire AP setup cmd */ ); } -inline u8 rtw_change_bss_chbw_cmd(_adapter *adapter, int flags, u8 req_ch, u8 req_bw, u8 req_offset) +inline u8 rtw_change_bss_chbw_cmd(_adapter *adapter, int flags, s16 req_ch, s8 req_bw, s8 req_offset) { return rtw_createbss_cmd(adapter, flags , 0 @@ -1372,212 +1306,192 @@ inline u8 rtw_change_bss_chbw_cmd(_adapter *adapter, int flags, u8 req_ch, u8 re ); } -u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork) +u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network *pnetwork) { u8 *auth, res = _SUCCESS; uint t_len = 0; WLAN_BSSID_EX *psecnetwork; struct cmd_obj *pcmd; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv= &pmlmepriv->qospriv; - struct security_priv *psecuritypriv=&padapter->securitypriv; + struct qos_priv *pqospriv = &pmlmepriv->qospriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; struct registry_priv *pregistrypriv = &padapter->registrypriv; #ifdef CONFIG_80211N_HT struct ht_priv *phtpriv = &pmlmepriv->htpriv; -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ #ifdef CONFIG_80211AC_VHT struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -#endif //CONFIG_80211AC_VHT +#endif /* CONFIG_80211AC_VHT */ NDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->network.InfrastructureMode; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u32 tmp_len; - u8 *ptmp=NULL; -_func_enter_; + u8 *ptmp = NULL; rtw_led_control(padapter, LED_CTL_START_TO_LINK); - if (pmlmepriv->assoc_ssid.SsidLength == 0){ - RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("+Join cmd: Any SSid\n")); - } else { - RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+Join cmd: SSid=[%s]\n", pmlmepriv->assoc_ssid.Ssid)); - } - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res=_FAIL; - RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd: memory allocate for cmd_obj fail!!!\n")); + pcmd = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmd == NULL) { + res = _FAIL; goto exit; } - /* // for IEs is pointer - t_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + - sizeof (NDIS_802_11_SSID) + sizeof (ULONG) + - sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + - sizeof (NDIS_802_11_CONFIGURATION) + - sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) + - sizeof (NDIS_802_11_RATES_EX)+ sizeof(WLAN_PHY_INFO)+ sizeof (ULONG) + MAX_IE_SZ; - */ - //for IEs is fix buf size +#if 0 + /* for IEs is pointer */ + t_len = sizeof(ULONG) + sizeof(NDIS_802_11_MAC_ADDRESS) + 2 + + sizeof(NDIS_802_11_SSID) + sizeof(ULONG) + + sizeof(NDIS_802_11_RSSI) + sizeof(NDIS_802_11_NETWORK_TYPE) + + sizeof(NDIS_802_11_CONFIGURATION) + + sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE) + + sizeof(NDIS_802_11_RATES_EX) + sizeof(WLAN_PHY_INFO) + sizeof(ULONG) + MAX_IE_SZ; +#endif + /* for IEs is fix buf size */ t_len = sizeof(WLAN_BSSID_EX); - //for hidden ap to set fw_state here - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) != _TRUE) - { - switch(ndis_network_mode) - { - case Ndis802_11IBSS: - set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - break; + /* for hidden ap to set fw_state here */ + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE) != _TRUE) { + switch (ndis_network_mode) { + case Ndis802_11IBSS: + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + break; - case Ndis802_11Infrastructure: - set_fwstate(pmlmepriv, WIFI_STATION_STATE); - break; + case Ndis802_11Infrastructure: + set_fwstate(pmlmepriv, WIFI_STATION_STATE); + break; - case Ndis802_11APMode: - case Ndis802_11AutoUnknown: - case Ndis802_11InfrastructureMax: - case Ndis802_11Monitor: - break; + case Ndis802_11APMode: + case Ndis802_11AutoUnknown: + case Ndis802_11InfrastructureMax: + case Ndis802_11Monitor: + break; } } pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->network.IEs, pnetwork->network.IELength); - /* + /* Modified by Arvin 2015/05/13 - Solution for allocating a new WLAN_BSSID_EX to avoid race condition issue between disconnect and joinbss + Solution for allocating a new WLAN_BSSID_EX to avoid race condition issue between disconnect and joinbss */ psecnetwork = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX)); - if(psecnetwork==NULL) - { - if(pcmd !=NULL) + if (psecnetwork == NULL) { + if (pcmd != NULL) rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - - res=_FAIL; - - RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd :psecnetwork==NULL!!!\n")); - + + res = _FAIL; + + goto exit; } _rtw_memset(psecnetwork, 0, t_len); _rtw_memcpy(psecnetwork, &pnetwork->network, get_WLAN_BSSID_EX_sz(&pnetwork->network)); - - auth=&psecuritypriv->authenticator_ie[0]; - psecuritypriv->authenticator_ie[0]=(unsigned char)psecnetwork->IELength; - if((psecnetwork->IELength-12) < (256-1)) { - _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength-12); - } else { - _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256-1)); - } - + auth = &psecuritypriv->authenticator_ie[0]; + psecuritypriv->authenticator_ie[0] = (unsigned char)psecnetwork->IELength; + + if ((psecnetwork->IELength - 12) < (256 - 1)) + _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength - 12); + else + _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256 - 1)); + psecnetwork->IELength = 0; - // Added by Albert 2009/02/18 - // If the the driver wants to use the bssid to create the connection. - // If not, we have to copy the connecting AP's MAC address to it so that - // the driver just has the bssid information for PMKIDList searching. - - if ( pmlmepriv->assoc_by_bssid == _FALSE ) - { - _rtw_memcpy( &pmlmepriv->assoc_bssid[ 0 ], &pnetwork->network.MacAddress[ 0 ], ETH_ALEN ); - } + /* Added by Albert 2009/02/18 */ + /* If the the driver wants to use the bssid to create the connection. */ + /* If not, we have to copy the connecting AP's MAC address to it so that */ + /* the driver just has the bssid information for PMKIDList searching. */ + + if (pmlmepriv->assoc_by_bssid == _FALSE) + _rtw_memcpy(&pmlmepriv->assoc_bssid[0], &pnetwork->network.MacAddress[0], ETH_ALEN); psecnetwork->IELength = rtw_restruct_sec_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength); pqospriv->qos_option = 0; - - if(pregistrypriv->wmm_enable) - { - tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength); - if (psecnetwork->IELength != tmp_len) - { + if (pregistrypriv->wmm_enable) { + tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength); + + if (psecnetwork->IELength != tmp_len) { psecnetwork->IELength = tmp_len; - pqospriv->qos_option = 1; //There is WMM IE in this corresp. beacon + pqospriv->qos_option = 1; /* There is WMM IE in this corresp. beacon */ + } else { + pqospriv->qos_option = 0;/* There is no WMM IE in this corresp. beacon */ } - else - { - pqospriv->qos_option = 0;//There is no WMM IE in this corresp. beacon - } - } + } #ifdef CONFIG_80211N_HT phtpriv->ht_option = _FALSE; - ptmp = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &tmp_len, pnetwork->network.IELength-12); - if(pregistrypriv->ht_enable && ptmp && tmp_len>0) - { - // Added by Albert 2010/06/23 - // For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. - // Especially for Realtek 8192u SoftAP. - if ( ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_ ) && - ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_ ) && - ( padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_ )) - { + ptmp = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &tmp_len, pnetwork->network.IELength - 12); + if (pregistrypriv->ht_enable && ptmp && tmp_len > 0) { + /* Added by Albert 2010/06/23 */ + /* For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. */ + /* Especially for Realtek 8192u SoftAP. */ + if ((padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_) && + (padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_) && + (padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_)) { rtw_ht_use_default_setting(padapter); rtw_build_wmm_ie_ht(padapter, &psecnetwork->IEs[0], &psecnetwork->IELength); - //rtw_restructure_ht_ie - rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[12], &psecnetwork->IEs[0], - pnetwork->network.IELength-12, &psecnetwork->IELength, - pnetwork->network.Configuration.DSConfig); + /* rtw_restructure_ht_ie */ + rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[12], &psecnetwork->IEs[0], + pnetwork->network.IELength - 12, &psecnetwork->IELength, + pnetwork->network.Configuration.DSConfig); } } #ifdef CONFIG_80211AC_VHT pvhtpriv->vht_option = _FALSE; - if (phtpriv->ht_option && pregistrypriv->vht_enable) { - rtw_restructure_vht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], - pnetwork->network.IELength, &psecnetwork->IELength); + if (phtpriv->ht_option + && REGSTY_IS_11AC_ENABLE(pregistrypriv) + && hal_chk_proto_cap(padapter, PROTO_CAP_11AC) + && (!pmlmepriv->country_ent || COUNTRY_CHPLAN_EN_11AC(pmlmepriv->country_ent)) + ) { + rtw_restructure_vht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], + pnetwork->network.IELength, &psecnetwork->IELength); } #endif rtw_append_exented_cap(padapter, &psecnetwork->IEs[0], &psecnetwork->IELength); -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ - #if 0 - psecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength; +#if 0 + psecuritypriv->supplicant_ie[0] = (u8)psecnetwork->IELength; - if(psecnetwork->IELength < (256-1)) - { + if (psecnetwork->IELength < (256 - 1)) _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], psecnetwork->IELength); - } else - { - _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], (256-1)); - } - #endif - + _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], (256 - 1)); +#endif + pcmd->cmdsz = sizeof(WLAN_BSSID_EX); #ifdef CONFIG_RTL8712 - //wlan_network endian conversion + /* wlan_network endian conversion */ psecnetwork->Length = cpu_to_le32(psecnetwork->Length); - psecnetwork->Ssid.SsidLength= cpu_to_le32(psecnetwork->Ssid.SsidLength); + psecnetwork->Ssid.SsidLength = cpu_to_le32(psecnetwork->Ssid.SsidLength); psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy); psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi); psecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse); psecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow); psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod); psecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig); - psecnetwork->Configuration.FHConfig.DwellTime=cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime); - psecnetwork->Configuration.FHConfig.HopPattern=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern); - psecnetwork->Configuration.FHConfig.HopSet=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet); - psecnetwork->Configuration.FHConfig.Length=cpu_to_le32(psecnetwork->Configuration.FHConfig.Length); + psecnetwork->Configuration.FHConfig.DwellTime = cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime); + psecnetwork->Configuration.FHConfig.HopPattern = cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern); + psecnetwork->Configuration.FHConfig.HopSet = cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet); + psecnetwork->Configuration.FHConfig.Length = cpu_to_le32(psecnetwork->Configuration.FHConfig.Length); psecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length); psecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode); - psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength); + psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength); #endif _rtw_init_listhead(&pcmd->list); - pcmd->cmdcode = _JoinBss_CMD_;//GEN_CMD_CODE(_JoinBss) + pcmd->cmdcode = _JoinBss_CMD_;/* GEN_CMD_CODE(_JoinBss) */ pcmd->parmbuf = (unsigned char *)psecnetwork; pcmd->rsp = NULL; pcmd->rspsz = 0; @@ -1585,22 +1499,19 @@ _func_enter_; res = rtw_enqueue_cmd(pcmdpriv, pcmd); exit: - -_func_exit_; + return res; } -u8 rtw_disassoc_cmd(_adapter*padapter, u32 deauth_timeout_ms, bool enqueue) /* for sta_mode */ +u8 rtw_disassoc_cmd(_adapter *padapter, u32 deauth_timeout_ms, bool enqueue) /* for sta_mode */ { struct cmd_obj *cmdobj = NULL; struct disconnect_parm *param = NULL; struct cmd_priv *cmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; -_func_enter_; - RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_disassoc_cmd\n")); /* prepare cmd parameter */ param = (struct disconnect_parm *)rtw_zmalloc(sizeof(*param)); @@ -1629,167 +1540,152 @@ _func_enter_; exit: -_func_exit_; return res; } u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype, bool enqueue) { - struct cmd_obj* ph2c; - struct setopmode_parm* psetop; + struct cmd_obj *ph2c; + struct setopmode_parm *psetop; - struct cmd_priv *pcmdpriv= &padapter->cmdpriv; - u8 res=_SUCCESS; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; -_func_enter_; - psetop = (struct setopmode_parm*)rtw_zmalloc(sizeof(struct setopmode_parm)); + psetop = (struct setopmode_parm *)rtw_zmalloc(sizeof(struct setopmode_parm)); - if(psetop==NULL){ - res=_FAIL; + if (psetop == NULL) { + res = _FAIL; goto exit; } psetop->mode = (u8)networktype; - - if(enqueue){ - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ + + if (enqueue) { + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { rtw_mfree((u8 *)psetop, sizeof(*psetop)); - res= _FAIL; + res = _FAIL; goto exit; - } + } init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_); res = rtw_enqueue_cmd(pcmdpriv, ph2c); - } - else{ + } else { setopmode_hdl(padapter, (u8 *)psetop); rtw_mfree((u8 *)psetop, sizeof(*psetop)); } exit: -_func_exit_; return res; } u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 key_type, bool enqueue) { - struct cmd_obj* ph2c; + struct cmd_obj *ph2c; struct set_stakey_parm *psetstakey_para; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; struct set_stakey_rsp *psetstakey_rsp = NULL; - + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - u8 res=_SUCCESS; + struct security_priv *psecuritypriv = &padapter->securitypriv; + u8 res = _SUCCESS; -_func_enter_; - psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); - if(psetstakey_para==NULL){ - res=_FAIL; + psetstakey_para = (struct set_stakey_parm *)rtw_zmalloc(sizeof(struct set_stakey_parm)); + if (psetstakey_para == NULL) { + res = _FAIL; goto exit; } - - _rtw_memcpy(psetstakey_para->addr, sta->hwaddr,ETH_ALEN); - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)){ - psetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm; - }else{ - GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE); - } - if (key_type == GROUP_KEY) { + _rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN); + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) + psetstakey_para->algorithm = (unsigned char) psecuritypriv->dot11PrivacyAlgrthm; + else + GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE); + + if (key_type == GROUP_KEY) _rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16); - } - else if (key_type == UNICAST_KEY) { + else if (key_type == UNICAST_KEY) _rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16); - } #ifdef CONFIG_TDLS - else if(key_type == TDLS_KEY){ - _rtw_memcpy(&psetstakey_para->key, sta->tpk.tk, 16); - psetstakey_para->algorithm=(u8)sta->dot118021XPrivacy; - } + else if (key_type == TDLS_KEY) { + _rtw_memcpy(&psetstakey_para->key, sta->tpk.tk, 16); + psetstakey_para->algorithm = (u8)sta->dot118021XPrivacy; + } #endif /* CONFIG_TDLS */ - //jeff: set this becasue at least sw key is ready - padapter->securitypriv.busetkipkey=_TRUE; + /* jeff: set this becasue at least sw key is ready */ + padapter->securitypriv.busetkipkey = _TRUE; - if(enqueue) - { - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if ( ph2c == NULL){ + if (enqueue) { + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); - res= _FAIL; + res = _FAIL; goto exit; - } + } - psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp)); - if(psetstakey_rsp == NULL){ + psetstakey_rsp = (struct set_stakey_rsp *)rtw_zmalloc(sizeof(struct set_stakey_rsp)); + if (psetstakey_rsp == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); - res=_FAIL; + res = _FAIL; goto exit; } init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); ph2c->rsp = (u8 *) psetstakey_rsp; ph2c->rspsz = sizeof(struct set_stakey_rsp); - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - } - else{ + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } else { set_stakey_hdl(padapter, (u8 *)psetstakey_para); rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); } exit: -_func_exit_; return res; } u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue) { - struct cmd_obj* ph2c; + struct cmd_obj *ph2c; struct set_stakey_parm *psetstakey_para; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - struct set_stakey_rsp *psetstakey_rsp = NULL; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct set_stakey_rsp *psetstakey_rsp = NULL; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; s16 cam_id = 0; - u8 res=_SUCCESS; + u8 res = _SUCCESS; -_func_enter_; - if(!enqueue) - { + if (!enqueue) { while ((cam_id = rtw_camid_search(padapter, sta->hwaddr, -1, -1)) >= 0) { - DBG_871X_LEVEL(_drv_always_, "clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(sta->hwaddr), cam_id); + RTW_PRINT("clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(sta->hwaddr), cam_id); clear_cam_entry(padapter, cam_id); rtw_camid_free(padapter, cam_id); } - } - else - { - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if ( ph2c == NULL){ - res= _FAIL; + } else { + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; } - psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); - if(psetstakey_para==NULL){ + psetstakey_para = (struct set_stakey_parm *)rtw_zmalloc(sizeof(struct set_stakey_parm)); + if (psetstakey_para == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FAIL; + res = _FAIL; goto exit; } - psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp)); - if(psetstakey_rsp == NULL){ + psetstakey_rsp = (struct set_stakey_rsp *)rtw_zmalloc(sizeof(struct set_stakey_rsp)); + if (psetstakey_rsp == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); - res=_FAIL; + res = _FAIL; goto exit; } @@ -1800,115 +1696,109 @@ _func_enter_; _rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN); psetstakey_para->algorithm = _NO_PRIVACY_; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } - + exit: -_func_exit_; return res; } u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table) { - struct cmd_obj* ph2c; - struct setratable_parm * psetrttblparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; -_func_enter_; + struct cmd_obj *ph2c; + struct setratable_parm *psetrttblparm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; - } - psetrttblparm = (struct setratable_parm*)rtw_zmalloc(sizeof(struct setratable_parm)); + } + psetrttblparm = (struct setratable_parm *)rtw_zmalloc(sizeof(struct setratable_parm)); - if(psetrttblparm==NULL){ + if (psetrttblparm == NULL) { rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); - _rtw_memcpy(psetrttblparm,prate_table,sizeof(struct setratable_parm)); + _rtw_memcpy(psetrttblparm, prate_table, sizeof(struct setratable_parm)); - res = rtw_enqueue_cmd(pcmdpriv, ph2c); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; } u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval) { - struct cmd_obj* ph2c; - struct getratable_parm * pgetrttblparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; -_func_enter_; + struct cmd_obj *ph2c; + struct getratable_parm *pgetrttblparm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; } - pgetrttblparm = (struct getratable_parm*)rtw_zmalloc(sizeof(struct getratable_parm)); + pgetrttblparm = (struct getratable_parm *)rtw_zmalloc(sizeof(struct getratable_parm)); - if(pgetrttblparm==NULL){ + if (pgetrttblparm == NULL) { rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } -// init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); + /* init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); */ _rtw_init_listhead(&ph2c->list); - ph2c->cmdcode =GEN_CMD_CODE(_GetRaTable); + ph2c->cmdcode = GEN_CMD_CODE(_GetRaTable); ph2c->parmbuf = (unsigned char *)pgetrttblparm; ph2c->cmdsz = sizeof(struct getratable_parm); - ph2c->rsp = (u8*)pval; + ph2c->rsp = (u8 *)pval; ph2c->rspsz = sizeof(struct getratable_rsp); - - pgetrttblparm ->rsvd = 0x0; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); + + pgetrttblparm->rsvd = 0x0; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; } u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr) { - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - struct cmd_obj* ph2c; - struct set_assocsta_parm *psetassocsta_para; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct cmd_obj *ph2c; + struct set_assocsta_parm *psetassocsta_para; struct set_stakey_rsp *psetassocsta_rsp = NULL; - u8 res=_SUCCESS; + u8 res = _SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; } - psetassocsta_para = (struct set_assocsta_parm*)rtw_zmalloc(sizeof(struct set_assocsta_parm)); - if(psetassocsta_para==NULL){ + psetassocsta_para = (struct set_assocsta_parm *)rtw_zmalloc(sizeof(struct set_assocsta_parm)); + if (psetassocsta_para == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FAIL; + res = _FAIL; goto exit; } - psetassocsta_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_assocsta_rsp)); - if(psetassocsta_rsp==NULL){ + psetassocsta_rsp = (struct set_stakey_rsp *)rtw_zmalloc(sizeof(struct set_assocsta_rsp)); + if (psetassocsta_rsp == NULL) { rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); rtw_mfree((u8 *) psetassocsta_para, sizeof(struct set_assocsta_parm)); return _FAIL; @@ -1918,37 +1808,35 @@ _func_enter_; ph2c->rsp = (u8 *) psetassocsta_rsp; ph2c->rspsz = sizeof(struct set_assocsta_rsp); - _rtw_memcpy(psetassocsta_para->addr, mac_addr,ETH_ALEN); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); + _rtw_memcpy(psetassocsta_para->addr, mac_addr, ETH_ALEN); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; - } +} -u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr) +u8 rtw_addbareq_cmd(_adapter *padapter, u8 tid, u8 *addr) { struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - struct cmd_obj* ph2c; + struct cmd_obj *ph2c; struct addBaReq_parm *paddbareq_parm; - u8 res=_SUCCESS; - -_func_enter_; + u8 res = _SUCCESS; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; } - - paddbareq_parm = (struct addBaReq_parm*)rtw_zmalloc(sizeof(struct addBaReq_parm)); - if(paddbareq_parm==NULL){ + + paddbareq_parm = (struct addBaReq_parm *)rtw_zmalloc(sizeof(struct addBaReq_parm)); + if (paddbareq_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -1957,37 +1845,73 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm, GEN_CMD_CODE(_AddBAReq)); - //DBG_871X("rtw_addbareq_cmd, tid=%d\n", tid); + /* RTW_INFO("rtw_addbareq_cmd, tid=%d\n", tid); */ - //rtw_enqueue_cmd(pcmdpriv, ph2c); + /* rtw_enqueue_cmd(pcmdpriv, ph2c); */ res = rtw_enqueue_cmd(pcmdpriv, ph2c); - + exit: - -_func_exit_; + return res; } -//add for CONFIG_IEEE80211W, none 11w can use it -u8 rtw_reset_securitypriv_cmd(_adapter*padapter) -{ - struct cmd_obj* ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; +u8 rtw_addbarsp_cmd(_adapter *padapter, u8 *addr, u16 tid, u8 status, u8 size, u16 start_seq) +{ + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct cmd_obj *ph2c; + struct addBaRsp_parm *paddBaRsp_parm; + 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){ + + paddBaRsp_parm = (struct addBaRsp_parm *)rtw_zmalloc(sizeof(struct addBaRsp_parm)); + + if (paddBaRsp_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; + goto exit; + } + + _rtw_memcpy(paddBaRsp_parm->addr, addr, ETH_ALEN); + paddBaRsp_parm->tid = tid; + paddBaRsp_parm->status = status; + paddBaRsp_parm->size = size; + paddBaRsp_parm->start_seq = start_seq; + + init_h2fwcmd_w_parm_no_rsp(ph2c, paddBaRsp_parm, GEN_CMD_CODE(_AddBARsp)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + + + return res; +} +/* add for CONFIG_IEEE80211W, none 11w can use it */ +u8 rtw_reset_securitypriv_cmd(_adapter *padapter) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->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((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res = _FAIL; goto exit; } @@ -1998,37 +1922,35 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - //rtw_enqueue_cmd(pcmdpriv, ph2c); + + /* rtw_enqueue_cmd(pcmdpriv, ph2c); */ res = rtw_enqueue_cmd(pcmdpriv, ph2c); - + exit: - -_func_exit_; + return res; } -u8 rtw_free_assoc_resources_cmd(_adapter*padapter) +u8 rtw_free_assoc_resources_cmd(_adapter *padapter) { - struct cmd_obj* ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - -_func_enter_; + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + + 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){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -2039,45 +1961,37 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - //rtw_enqueue_cmd(pcmdpriv, ph2c); + + /* rtw_enqueue_cmd(pcmdpriv, ph2c); */ res = rtw_enqueue_cmd(pcmdpriv, ph2c); - + exit: - -_func_exit_; + return res; } -u8 rtw_dynamic_chk_wk_cmd(_adapter*padapter) +u8 rtw_dynamic_chk_wk_cmd(_adapter *padapter) { - struct cmd_obj* ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - -_func_enter_; + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; - //only primary padapter does this cmd -/* -#ifdef CONFIG_CONCURRENT_MODE - if (padapter->adapter_type != PRIMARY_ADAPTER && padapter->pbuddy_adapter) - pcmdpriv = &(padapter->pbuddy_adapter->cmdpriv); -#endif -*/ - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + /* only primary padapter does this cmd */ + + 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){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -2087,37 +2001,35 @@ _func_enter_; pdrvextra_cmd_parm->pbuf = NULL; init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - //rtw_enqueue_cmd(pcmdpriv, ph2c); + + /* rtw_enqueue_cmd(pcmdpriv, ph2c); */ res = rtw_enqueue_cmd(pcmdpriv, ph2c); - + exit: - -_func_exit_; + return res; } -u8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue) +u8 rtw_set_ch_cmd(_adapter *padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue) { struct cmd_obj *pcmdobj; struct set_ch_parm *set_ch_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 res=_SUCCESS; + u8 res = _SUCCESS; -_func_enter_; - DBG_871X(FUNC_NDEV_FMT" ch:%u, bw:%u, ch_offset:%u\n", - FUNC_NDEV_ARG(padapter->pnetdev), ch, bw, ch_offset); + RTW_INFO(FUNC_NDEV_FMT" ch:%u, bw:%u, ch_offset:%u\n", + FUNC_NDEV_ARG(padapter->pnetdev), ch, bw, ch_offset); /* check input parameter */ /* prepare cmd parameter */ set_ch_parm = (struct set_ch_parm *)rtw_zmalloc(sizeof(*set_ch_parm)); if (set_ch_parm == NULL) { - res= _FAIL; + res = _FAIL; goto exit; } set_ch_parm->ch = ch; @@ -2126,10 +2038,10 @@ _func_enter_; if (enqueue) { /* need enqueue, prepare cmd_obj and enqueue */ - pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmdobj == NULL){ + pcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmdobj == NULL) { rtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm)); - res=_FAIL; + res = _FAIL; goto exit; } @@ -2137,9 +2049,9 @@ _func_enter_; res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); } else { /* no need to enqueue, do the cmd hdl directly and free cmd parameter */ - if( H2C_SUCCESS !=set_ch_hdl(padapter, (u8 *)set_ch_parm) ) + if (H2C_SUCCESS != set_ch_hdl(padapter, (u8 *)set_ch_parm)) res = _FAIL; - + rtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm)); } @@ -2147,14 +2059,13 @@ _func_enter_; exit: - DBG_871X(FUNC_NDEV_FMT" res:%u\n", FUNC_NDEV_ARG(padapter->pnetdev), res); + RTW_INFO(FUNC_NDEV_FMT" res:%u\n", FUNC_NDEV_ARG(padapter->pnetdev), res); -_func_exit_; return res; } -u8 rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, u8 swconfig) +u8 _rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, const struct country_chplan *country_ent, u8 swconfig) { struct cmd_obj *cmdobj; struct SetChannelPlan_param *parm; @@ -2163,7 +2074,6 @@ u8 rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, u8 swconfig) struct submit_ctx sctx; u8 res = _SUCCESS; -_func_enter_; /* check if allow software config */ if (swconfig && rtw_hal_is_disable_sw_channel_plan(adapter) == _TRUE) { @@ -2171,23 +2081,23 @@ _func_enter_; goto exit; } + /* if country_entry is provided, replace chplan */ + if (country_ent) + chplan = country_ent->chplan; + /* check input parameter */ if (!rtw_is_channel_plan_valid(chplan)) { res = _FAIL; goto exit; } - if (rtw_chplan_is_empty(chplan) == _TRUE) { - res = _FAIL; - goto exit; - } - /* prepare cmd parameter */ parm = (struct SetChannelPlan_param *)rtw_zmalloc(sizeof(*parm)); if (parm == NULL) { res = _FAIL; goto exit; } + parm->country_ent = country_ent; parm->channel_plan = chplan; if (flags & RTW_CMDF_DIRECTLY) { @@ -2221,114 +2131,133 @@ _func_enter_; _exit_critical_mutex(&pcmdpriv->sctx_mutex, NULL); } } - + exit: -_func_exit_; return res; } -u8 rtw_led_blink_cmd(_adapter*padapter, PVOID pLed) +inline u8 rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, u8 swconfig) { - struct cmd_obj* pcmdobj; + return _rtw_set_chplan_cmd(adapter, flags, chplan, NULL, swconfig); +} + +inline u8 rtw_set_country_cmd(_adapter *adapter, int flags, const char *country_code, u8 swconfig) +{ + const struct country_chplan *ent; + + if (is_alpha(country_code[0]) == _FALSE + || is_alpha(country_code[1]) == _FALSE + ) { + RTW_PRINT("%s input country_code is not alpha2\n", __func__); + return _FAIL; + } + + ent = rtw_get_chplan_from_country(country_code); + + if (ent == NULL) { + RTW_PRINT("%s unsupported country_code:\"%c%c\"\n", __func__, country_code[0], country_code[1]); + return _FAIL; + } + + RTW_PRINT("%s country_code:\"%c%c\" mapping to chplan:0x%02x\n", __func__, country_code[0], country_code[1], ent->chplan); + + return _rtw_set_chplan_cmd(adapter, flags, RTW_CHPLAN_MAX, ent, swconfig); +} + +u8 rtw_led_blink_cmd(_adapter *padapter, PVOID pLed) +{ + struct cmd_obj *pcmdobj; struct LedBlink_param *ledBlink_param; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 res=_SUCCESS; + u8 res = _SUCCESS; -_func_enter_; - RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_led_blink_cmd\n")); - - pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmdobj == NULL){ - res=_FAIL; + + pcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmdobj == NULL) { + res = _FAIL; goto exit; } ledBlink_param = (struct LedBlink_param *)rtw_zmalloc(sizeof(struct LedBlink_param)); - if(ledBlink_param == NULL) { + if (ledBlink_param == NULL) { rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } - ledBlink_param->pLed=pLed; - + ledBlink_param->pLed = pLed; + init_h2fwcmd_w_parm_no_rsp(pcmdobj, ledBlink_param, GEN_CMD_CODE(_LedBlink)); res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); - + exit: -_func_exit_; return res; } -u8 rtw_set_csa_cmd(_adapter*padapter, u8 new_ch_no) +u8 rtw_set_csa_cmd(_adapter *padapter, u8 new_ch_no) { - struct cmd_obj* pcmdobj; - struct SetChannelSwitch_param*setChannelSwitch_param; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct cmd_obj *pcmdobj; + struct SetChannelSwitch_param *setChannelSwitch_param; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 res=_SUCCESS; + u8 res = _SUCCESS; -_func_enter_; - RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_csa_cmd\n")); - - pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmdobj == NULL){ - res=_FAIL; + + pcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmdobj == NULL) { + res = _FAIL; goto exit; } setChannelSwitch_param = (struct SetChannelSwitch_param *)rtw_zmalloc(sizeof(struct SetChannelSwitch_param)); - if(setChannelSwitch_param == NULL) { + if (setChannelSwitch_param == NULL) { rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } - setChannelSwitch_param->new_ch_no=new_ch_no; - + setChannelSwitch_param->new_ch_no = new_ch_no; + init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelSwitch_param, GEN_CMD_CODE(_SetChannelSwitch)); res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); - + exit: -_func_exit_; return res; } u8 rtw_tdls_cmd(_adapter *padapter, u8 *addr, u8 option) { - struct cmd_obj* pcmdobj; + struct cmd_obj *pcmdobj; struct TDLSoption_param *TDLSoption; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 res=_SUCCESS; + u8 res = _SUCCESS; -_func_enter_; #ifdef CONFIG_TDLS - RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_tdls_cmd\n")); - pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmdobj == NULL){ - res=_FAIL; + pcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmdobj == NULL) { + res = _FAIL; goto exit; } - TDLSoption= (struct TDLSoption_param *)rtw_zmalloc(sizeof(struct TDLSoption_param)); - if(TDLSoption == NULL) { + TDLSoption = (struct TDLSoption_param *)rtw_zmalloc(sizeof(struct TDLSoption_param)); + if (TDLSoption == NULL) { rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -2340,62 +2269,50 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(pcmdobj, TDLSoption, GEN_CMD_CODE(_TDLS)); res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); -#endif //CONFIG_TDLS - +#endif /* CONFIG_TDLS */ + exit: -_func_exit_; return res; } -static void collect_traffic_statistics(_adapter *padapter) +u8 rtw_enable_hw_update_tsf_cmd(_adapter *padapter) { - struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; -#ifdef CONFIG_CONCURRENT_MODE - if (padapter->adapter_type != PRIMARY_ADAPTER) - return; -#endif - // Tx - pdvobjpriv->traffic_stat.tx_bytes = padapter->xmitpriv.tx_bytes; - pdvobjpriv->traffic_stat.tx_pkts = padapter->xmitpriv.tx_pkts; - pdvobjpriv->traffic_stat.tx_drop = padapter->xmitpriv.tx_drop; - - // Rx - pdvobjpriv->traffic_stat.rx_bytes = padapter->recvpriv.rx_bytes; - pdvobjpriv->traffic_stat.rx_pkts = padapter->recvpriv.rx_pkts; - pdvobjpriv->traffic_stat.rx_drop = padapter->recvpriv.rx_drop; - -#ifdef CONFIG_CONCURRENT_MODE - // Add secondary adapter statistics - if(rtw_buddy_adapter_up(padapter)) - { - // Tx - pdvobjpriv->traffic_stat.tx_bytes += padapter->pbuddy_adapter->xmitpriv.tx_bytes; - pdvobjpriv->traffic_stat.tx_pkts += padapter->pbuddy_adapter->xmitpriv.tx_pkts; - pdvobjpriv->traffic_stat.tx_drop += padapter->pbuddy_adapter->xmitpriv.tx_drop; - - // Rx - pdvobjpriv->traffic_stat.rx_bytes += padapter->pbuddy_adapter->recvpriv.rx_bytes; - pdvobjpriv->traffic_stat.rx_pkts += padapter->pbuddy_adapter->recvpriv.rx_pkts; - pdvobjpriv->traffic_stat.rx_drop += padapter->pbuddy_adapter->recvpriv.rx_drop; + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; + goto exit; } -#endif - // Calculate throughput in last interval - pdvobjpriv->traffic_stat.cur_tx_bytes = pdvobjpriv->traffic_stat.tx_bytes - pdvobjpriv->traffic_stat.last_tx_bytes; - pdvobjpriv->traffic_stat.cur_rx_bytes = pdvobjpriv->traffic_stat.rx_bytes - pdvobjpriv->traffic_stat.last_rx_bytes; - pdvobjpriv->traffic_stat.last_tx_bytes = pdvobjpriv->traffic_stat.tx_bytes; - pdvobjpriv->traffic_stat.last_rx_bytes = pdvobjpriv->traffic_stat.rx_bytes; + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } - pdvobjpriv->traffic_stat.cur_tx_tp = (u32)(pdvobjpriv->traffic_stat.cur_tx_bytes *8/2/1024/1024); - pdvobjpriv->traffic_stat.cur_rx_tp = (u32)(pdvobjpriv->traffic_stat.cur_rx_bytes *8/2/1024/1024); + pdrvextra_cmd_parm->ec_id = EN_HW_UPDATE_TSF_WK_CID; + pdrvextra_cmd_parm->type = 0; + pdrvextra_cmd_parm->size = 0; + pdrvextra_cmd_parm->pbuf = NULL; + + 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; } -//from_timer == 1 means driver is in LPS +/* from_timer == 1 means driver is in LPS */ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) { u8 bEnterPS = _FALSE; @@ -2410,9 +2327,9 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) struct tdls_info *ptdlsinfo = &(padapter->tdlsinfo); struct tdls_txmgmt txmgmt; u8 baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ - RT_LINK_DETECT_T * link_detect = &pmlmepriv->LinkDetectInfo; + RT_LINK_DETECT_T *link_detect = &pmlmepriv->LinkDetectInfo; #ifdef CONFIG_BT_COEXIST if (padapter->registrypriv.wifi_spec != 1) { @@ -2426,21 +2343,18 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) } BusyThreshold = BusyThresholdHigh; - collect_traffic_statistics(padapter); - // - // Determine if our traffic is busy now - // - if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - /*&& !MgntInitAdapterInProgress(pMgntInfo)*/) - { - // if we raise bBusyTraffic in last watchdog, using lower threshold. + /* */ + /* Determine if our traffic is busy now */ + /* */ + if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + /*&& !MgntInitAdapterInProgress(pMgntInfo)*/) { + /* if we raise bBusyTraffic in last watchdog, using lower threshold. */ if (pmlmepriv->LinkDetectInfo.bBusyTraffic) - BusyThreshold = BusyThresholdLow; + BusyThreshold = BusyThresholdLow; - if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold || - pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold ) - { + if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold || + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold) { bBusyTraffic = _TRUE; if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) @@ -2449,10 +2363,9 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) bTxBusyTraffic = _TRUE; } - // Higher Tx/Rx data. - if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 4000 || - pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 4000 ) - { + /* Higher Tx/Rx data. */ + if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 4000 || + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 4000) { bHigherBusyTraffic = _TRUE; if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) @@ -2466,142 +2379,123 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) #define RX_ACTIVE_TH 20 #define TRAFFIC_PROTECT_PERIOD_MS 4500 - if (link_detect->NumTxOkInPeriod > TX_ACTIVE_TH - || link_detect->NumRxUnicastOkInPeriod > RX_ACTIVE_TH) { - - DBG_871X_LEVEL(_drv_info_, FUNC_ADPT_FMT" acqiure wake_lock for %u ms(tx:%d,rx_unicast:%d)\n", - FUNC_ADPT_ARG(padapter), - TRAFFIC_PROTECT_PERIOD_MS, - link_detect->NumTxOkInPeriod, - link_detect->NumRxUnicastOkInPeriod); + if (link_detect->NumTxOkInPeriod > TX_ACTIVE_TH + || link_detect->NumRxUnicastOkInPeriod > RX_ACTIVE_TH) { - rtw_lock_traffic_suspend_timeout(TRAFFIC_PROTECT_PERIOD_MS); - } + RTW_INFO(FUNC_ADPT_FMT" acqiure wake_lock for %u ms(tx:%d,rx_unicast:%d)\n", + FUNC_ADPT_ARG(padapter), + TRAFFIC_PROTECT_PERIOD_MS, + link_detect->NumTxOkInPeriod, + link_detect->NumRxUnicastOkInPeriod); + + rtw_lock_traffic_suspend_timeout(TRAFFIC_PROTECT_PERIOD_MS); + } #endif - + #ifdef CONFIG_TDLS #ifdef CONFIG_TDLS_AUTOSETUP /* 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 ); + if (hal_chk_wl_func(padapter, WL_FUNC_TDLS) == _TRUE) { + if ((ptdlsinfo->watchdog_count % TDLS_WATCHDOG_PERIOD) == 0) { + _rtw_memcpy(txmgmt.peer, baddr, ETH_ALEN); + issue_tdls_dis_req(padapter, &txmgmt); + } + ptdlsinfo->watchdog_count++; } - ptdlsinfo->watchdog_count++; -#endif //CONFIG_TDLS_AUTOSETUP -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS_AUTOSETUP */ +#endif /* CONFIG_TDLS */ #ifdef CONFIG_LPS - // check traffic for powersaving. - if( ((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8 ) || -#ifdef CONFIG_LPS_SLOW_TRANSITION - (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) -#else //CONFIG_LPS_SLOW_TRANSITION - (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 4) -#endif //CONFIG_LPS_SLOW_TRANSITION - ) - { -#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; + /* check traffic for powersaving. */ + if (((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8) || #ifdef CONFIG_LPS_SLOW_TRANSITION - if(bBusyTraffic == _TRUE) - { - if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount <= 4) + (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) +#else /* CONFIG_LPS_SLOW_TRANSITION */ + (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 4) +#endif /* CONFIG_LPS_SLOW_TRANSITION */ + ) { +#ifdef DBG_RX_COUNTER_DUMP + if (padapter->dump_rx_cnt_mode & DUMP_DRV_TRX_COUNTER_DATA) + RTW_INFO("(-)Tx = %d, Rx = %d\n", pmlmepriv->LinkDetectInfo.NumTxOkInPeriod, pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); +#endif + bEnterPS = _FALSE; +#ifdef CONFIG_LPS_SLOW_TRANSITION + if (bBusyTraffic == _TRUE) { + if (pmlmepriv->LinkDetectInfo.TrafficTransitionCount <= 4) pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 4; pmlmepriv->LinkDetectInfo.TrafficTransitionCount++; - //DBG_871X("Set TrafficTransitionCount to %d\n", pmlmepriv->LinkDetectInfo.TrafficTransitionCount); - - if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount > 30/*TrafficTransitionLevel*/) - { + /* RTW_INFO("Set TrafficTransitionCount to %d\n", pmlmepriv->LinkDetectInfo.TrafficTransitionCount); */ + + if (pmlmepriv->LinkDetectInfo.TrafficTransitionCount > 30/*TrafficTransitionLevel*/) pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 30; - } } -#endif //CONFIG_LPS_SLOW_TRANSITION - - } - else - { -#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 +#endif /* CONFIG_LPS_SLOW_TRANSITION */ + + } else { +#ifdef DBG_RX_COUNTER_DUMP + if (padapter->dump_rx_cnt_mode & DUMP_DRV_TRX_COUNTER_DATA) + RTW_INFO("(+)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; + if (pmlmepriv->LinkDetectInfo.TrafficTransitionCount >= 2) + pmlmepriv->LinkDetectInfo.TrafficTransitionCount -= 2; else pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0; - if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount == 0) - bEnterPS= _TRUE; -#else //CONFIG_LPS_SLOW_TRANSITION - bEnterPS= _TRUE; -#endif //CONFIG_LPS_SLOW_TRANSITION + if (pmlmepriv->LinkDetectInfo.TrafficTransitionCount == 0) + bEnterPS = _TRUE; +#else /* CONFIG_LPS_SLOW_TRANSITION */ + bEnterPS = _TRUE; +#endif /* CONFIG_LPS_SLOW_TRANSITION */ } #ifdef CONFIG_DYNAMIC_DTIM - if(pmlmepriv->LinkDetectInfo.LowPowerTransitionCount == 8) - bEnterPS= _FALSE; + if (pmlmepriv->LinkDetectInfo.LowPowerTransitionCount == 8) + bEnterPS = _FALSE; - DBG_871X("LowPowerTransitionCount=%d\n", pmlmepriv->LinkDetectInfo.LowPowerTransitionCount); -#endif //CONFIG_DYNAMIC_DTIM + RTW_INFO("LowPowerTransitionCount=%d\n", pmlmepriv->LinkDetectInfo.LowPowerTransitionCount); +#endif /* CONFIG_DYNAMIC_DTIM */ - // LeisurePS only work in infra mode. - if(bEnterPS) - { - if(!from_timer) - { + /* LeisurePS only work in infra mode. */ + if (bEnterPS) { + if (!from_timer) { #ifdef CONFIG_DYNAMIC_DTIM - if(pmlmepriv->LinkDetectInfo.LowPowerTransitionCount < 8) - { + if (pmlmepriv->LinkDetectInfo.LowPowerTransitionCount < 8) adapter_to_pwrctl(padapter)->dtim = 1; - } else - { adapter_to_pwrctl(padapter)->dtim = 3; - } -#endif //CONFIG_DYNAMIC_DTIM +#endif /* CONFIG_DYNAMIC_DTIM */ LPS_Enter(padapter, "TRAFFIC_IDLE"); - } - else - { - //do this at caller - //rtw_lps_ctrl_wk_cmd(adapter, LPS_CTRL_ENTER, 1); - //rtw_hal_dm_watchdog_in_lps(padapter); - } + } else { + /* do this at caller */ + /* rtw_lps_ctrl_wk_cmd(adapter, LPS_CTRL_ENTER, 1); */ + /* rtw_hal_dm_watchdog_in_lps(padapter); */ + } #ifdef CONFIG_DYNAMIC_DTIM - if (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode ==_TRUE ) + if (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode == _TRUE) pmlmepriv->LinkDetectInfo.LowPowerTransitionCount++; -#endif //CONFIG_DYNAMIC_DTIM - } - else - { +#endif /* CONFIG_DYNAMIC_DTIM */ + } else { #ifdef CONFIG_DYNAMIC_DTIM - if(pmlmepriv->LinkDetectInfo.LowPowerTransitionCount != 8) + if (pmlmepriv->LinkDetectInfo.LowPowerTransitionCount != 8) pmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0; else pmlmepriv->LinkDetectInfo.LowPowerTransitionCount++; -#endif //CONFIG_DYNAMIC_DTIM - if(!from_timer) - { +#endif /* CONFIG_DYNAMIC_DTIM */ + if (!from_timer) LPS_Leave(padapter, "TRAFFIC_BUSY"); - } - else - { + else { #ifdef CONFIG_CONCURRENT_MODE - if(padapter->iface_type == IFACE_PORT0) + if (padapter->hw_port == HW_PORT0) #endif rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_TRAFFIC_BUSY, 1); } } - -#endif // CONFIG_LPS - } - else - { + +#endif /* CONFIG_LPS */ + } else { #ifdef CONFIG_LPS struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); int n_assoc_iface = 0; @@ -2612,11 +2506,13 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) n_assoc_iface++; } - if(!from_timer && n_assoc_iface == 0) + if (!from_timer && n_assoc_iface == 0) LPS_Leave(padapter, "NON_LINKED"); #endif } + session_tracker_chk_cmd(padapter, NULL); + pmlmepriv->LinkDetectInfo.NumRxOkInPeriod = 0; pmlmepriv->LinkDetectInfo.NumTxOkInPeriod = 0; pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod = 0; @@ -2628,65 +2524,118 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer) pmlmepriv->LinkDetectInfo.bHigherBusyTxTraffic = bHigherBusyTxTraffic; return bEnterPS; - + } -void dynamic_chk_wk_hdl(_adapter *padapter) + +/* for 11n Logo 4.2.31/4.2.32 */ +static void dynamic_update_bcn_check(_adapter *padapter) { - struct mlme_priv *pmlmepriv; - pmlmepriv = &(padapter->mlmepriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; -#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK -#ifdef CONFIG_AP_MODE - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - expire_timeout_chk(padapter); + if (!padapter->registrypriv.wifi_spec) + return; + + if (!MLME_IS_AP(padapter)) + return; + + if (pmlmeext->bstart_bss) { + /* In 10 * 2 = 20s, there are no legacy AP, update HT info */ + static u8 count = 1; + + if (count % 10 == 0) { + count = 1; + + if (_FALSE == ATOMIC_READ(&pmlmepriv->olbc) + && _FALSE == ATOMIC_READ(&pmlmepriv->olbc_ht)) { + + if (rtw_ht_operation_update(padapter) > 0) { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + } + } + + /* In 2s, there are any legacy AP, update HT info, and then reset count */ + + if (_FALSE != ATOMIC_READ(&pmlmepriv->olbc) + && _FALSE != ATOMIC_READ(&pmlmepriv->olbc_ht)) { + + if (rtw_ht_operation_update(padapter) > 0) { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + + } + ATOMIC_SET(&pmlmepriv->olbc, _FALSE); + ATOMIC_SET(&pmlmepriv->olbc_ht, _FALSE); + count = 0; + } + + count ++; } -#endif -#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK +} +void rtw_iface_dynamic_chk_wk_hdl(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); -#ifdef DBG_CONFIG_ERROR_DETECT - rtw_hal_sreset_xmit_status_check(padapter); - rtw_hal_sreset_linked_status_check(padapter); -#endif + #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK + #ifdef CONFIG_AP_MODE + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + expire_timeout_chk(padapter); + #endif + #endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + dynamic_update_bcn_check(padapter); - //for debug purpose + linked_status_chk(padapter, 0); + traffic_status_watchdog(padapter, 0); + + /* for debug purpose */ _linked_info_dump(padapter); + #ifdef CONFIG_BEAMFORMING + #ifndef RTW_BEAMFORMING_VERSION_2 + #if (BEAMFORMING_SUPPORT == 0) /*for diver defined beamforming*/ + beamforming_watchdog(padapter); + #endif + #endif /* !RTW_BEAMFORMING_VERSION_2 */ + #endif - //if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE) +} +void rtw_dynamic_chk_wk_hdl(_adapter *padapter) +{ + rtw_mi_dynamic_chk_wk_hdl(padapter); + +#ifdef DBG_CONFIG_ERROR_DETECT + rtw_hal_sreset_xmit_status_check(padapter); + rtw_hal_sreset_linked_status_check(padapter); +#endif + + /* if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE) */ { - linked_status_chk(padapter, 0); - traffic_status_watchdog(padapter, 0); - #ifdef DBG_RX_COUNTER_DUMP +#ifdef DBG_RX_COUNTER_DUMP rtw_dump_rx_counters(padapter); - #endif +#endif dm_DynamicUsbTxAgg(padapter, 0); } - -#ifdef CONFIG_BEAMFORMING -#if (BEAMFORMING_SUPPORT == 0) /*for diver defined beamforming*/ - beamforming_watchdog(padapter); -#endif -#endif - rtw_hal_dm_watchdog(padapter); - //check_hw_pbc(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type); + /* check_hw_pbc(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type); */ #ifdef CONFIG_BT_COEXIST - // - // BT-Coexist - // + /* BT-Coexist */ rtw_btcoex_Handler(padapter); #endif - #ifdef CONFIG_IPS_CHECK_IN_WD - //always call rtw_ps_processor() at last one. - if (is_primary_adapter(padapter)) - rtw_ps_processor(padapter); + /* always call rtw_ps_processor() at last one. */ + rtw_ps_processor(padapter); #endif + +#ifdef CONFIG_MCC_MODE + rtw_hal_mcc_sw_status_check(padapter); +#endif /* CONFIG_MCC_MODE */ + } #ifdef CONFIG_LPS @@ -2697,107 +2646,101 @@ void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type) struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); u8 mstatus; - -_func_enter_; - if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) - || (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) - { + + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) + || (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) return; + + switch (lps_ctrl_type) { + case LPS_CTRL_SCAN: + /* RTW_INFO("LPS_CTRL_SCAN\n"); */ +#ifdef CONFIG_BT_COEXIST + rtw_btcoex_ScanNotify(padapter, _TRUE); +#endif /* CONFIG_BT_COEXIST */ + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { + /* connect */ + LPS_Leave(padapter, "LPS_CTRL_SCAN"); + } + break; + case LPS_CTRL_JOINBSS: + /* RTW_INFO("LPS_CTRL_JOINBSS\n"); */ + LPS_Leave(padapter, "LPS_CTRL_JOINBSS"); + break; + case LPS_CTRL_CONNECT: + /* RTW_INFO("LPS_CTRL_CONNECT\n"); */ + mstatus = 1;/* connect */ + /* Reset LPS Setting */ + pwrpriv->LpsIdleCount = 0; + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); +#ifdef CONFIG_BT_COEXIST + rtw_btcoex_MediaStatusNotify(padapter, mstatus); +#endif /* CONFIG_BT_COEXIST */ + break; + case LPS_CTRL_DISCONNECT: + /* RTW_INFO("LPS_CTRL_DISCONNECT\n"); */ + mstatus = 0;/* disconnect */ +#ifdef CONFIG_BT_COEXIST + rtw_btcoex_MediaStatusNotify(padapter, mstatus); +#endif /* CONFIG_BT_COEXIST */ + LPS_Leave(padapter, "LPS_CTRL_DISCONNECT"); + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); + break; + case LPS_CTRL_SPECIAL_PACKET: + /* RTW_INFO("LPS_CTRL_SPECIAL_PACKET\n"); */ + pwrpriv->DelayLPSLastTimeStamp = rtw_get_current_time(); +#ifdef CONFIG_BT_COEXIST + rtw_btcoex_SpecialPacketNotify(padapter, PACKET_DHCP); +#endif /* CONFIG_BT_COEXIST */ + LPS_Leave(padapter, "LPS_CTRL_SPECIAL_PACKET"); + break; + case LPS_CTRL_LEAVE: + LPS_Leave(padapter, "LPS_CTRL_LEAVE"); + break; + case LPS_CTRL_LEAVE_CFG80211_PWRMGMT: + LPS_Leave(padapter, "CFG80211_PWRMGMT"); + break; + case LPS_CTRL_TRAFFIC_BUSY: + LPS_Leave(padapter, "LPS_CTRL_TRAFFIC_BUSY"); + break; + case LPS_CTRL_TX_TRAFFIC_LEAVE: + LPS_Leave(padapter, "LPS_CTRL_TX_TRAFFIC_LEAVE"); + break; + case LPS_CTRL_RX_TRAFFIC_LEAVE: + LPS_Leave(padapter, "LPS_CTRL_RX_TRAFFIC_LEAVE"); + break; + case LPS_CTRL_ENTER: + LPS_Enter(padapter, "TRAFFIC_IDLE_1"); + break; + default: + break; } - switch(lps_ctrl_type) - { - case LPS_CTRL_SCAN: - //DBG_871X("LPS_CTRL_SCAN \n"); -#ifdef CONFIG_BT_COEXIST - rtw_btcoex_ScanNotify(padapter, _TRUE); -#endif // CONFIG_BT_COEXIST - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - // connect - LPS_Leave(padapter, "LPS_CTRL_SCAN"); - } - break; - case LPS_CTRL_JOINBSS: - //DBG_871X("LPS_CTRL_JOINBSS \n"); - LPS_Leave(padapter, "LPS_CTRL_JOINBSS"); - break; - case LPS_CTRL_CONNECT: - //DBG_871X("LPS_CTRL_CONNECT \n"); - mstatus = 1;//connect - // Reset LPS Setting - pwrpriv->LpsIdleCount = 0; - rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); -#ifdef CONFIG_BT_COEXIST - rtw_btcoex_MediaStatusNotify(padapter, mstatus); -#endif // CONFIG_BT_COEXIST - break; - case LPS_CTRL_DISCONNECT: - //DBG_871X("LPS_CTRL_DISCONNECT \n"); - mstatus = 0;//disconnect -#ifdef CONFIG_BT_COEXIST - rtw_btcoex_MediaStatusNotify(padapter, mstatus); -#endif // CONFIG_BT_COEXIST - LPS_Leave(padapter, "LPS_CTRL_DISCONNECT"); - rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); - break; - case LPS_CTRL_SPECIAL_PACKET: - //DBG_871X("LPS_CTRL_SPECIAL_PACKET \n"); - pwrpriv->DelayLPSLastTimeStamp = rtw_get_current_time(); -#ifdef CONFIG_BT_COEXIST - rtw_btcoex_SpecialPacketNotify(padapter, PACKET_DHCP); -#endif // CONFIG_BT_COEXIST - LPS_Leave(padapter, "LPS_CTRL_SPECIAL_PACKET"); - break; - case LPS_CTRL_LEAVE: - //DBG_871X("LPS_CTRL_LEAVE \n"); - LPS_Leave(padapter, "LPS_CTRL_LEAVE"); - break; - case LPS_CTRL_TRAFFIC_BUSY: - LPS_Leave(padapter, "LPS_CTRL_TRAFFIC_BUSY"); - break; - case LPS_CTRL_TX_TRAFFIC_LEAVE: - LPS_Leave(padapter, "LPS_CTRL_TX_TRAFFIC_LEAVE"); - break; - case LPS_CTRL_RX_TRAFFIC_LEAVE: - LPS_Leave(padapter, "LPS_CTRL_RX_TRAFFIC_LEAVE"); - break; - case LPS_CTRL_ENTER: - LPS_Enter(padapter, "TRAFFIC_IDLE_1"); - break; - default: - break; - } - -_func_exit_; } -u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue) +u8 rtw_lps_ctrl_wk_cmd(_adapter *padapter, u8 lps_ctrl_type, u8 enqueue) { struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - //struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); + /* struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); */ u8 res = _SUCCESS; - -_func_enter_; - //if(!pwrctrlpriv->bLeisurePs) - // return res; - if(enqueue) - { - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + /* if(!pwrctrlpriv->bLeisurePs) */ + /* return res; */ + + if (enqueue) { + 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){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -2809,43 +2752,39 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); res = rtw_enqueue_cmd(pcmdpriv, ph2c); - } - else - { + } else lps_ctrl_wk_hdl(padapter, lps_ctrl_type); - } - + exit: - -_func_exit_; + return res; } -void rtw_dm_in_lps_hdl(_adapter*padapter) +void rtw_dm_in_lps_hdl(_adapter *padapter) { rtw_hal_set_hwreg(padapter, HW_VAR_DM_IN_LPS, NULL); } -u8 rtw_dm_in_lps_wk_cmd(_adapter*padapter) +u8 rtw_dm_in_lps_wk_cmd(_adapter *padapter) { struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + + 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){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -2857,9 +2796,9 @@ u8 rtw_dm_in_lps_wk_cmd(_adapter*padapter) 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; } @@ -2868,7 +2807,7 @@ void rtw_lps_change_dtim_hdl(_adapter *padapter, u8 dtim) { struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - if(dtim <=0 || dtim > 16) + if (dtim <= 0 || dtim > 16) return; #ifdef CONFIG_BT_COEXIST @@ -2880,23 +2819,21 @@ void rtw_lps_change_dtim_hdl(_adapter *padapter, u8 dtim) _enter_pwrlock(&pwrpriv->lock); #endif - if(pwrpriv->dtim!=dtim) - { - DBG_871X("change DTIM from %d to %d, bFwCurrentInPSMode=%d, ps_mode=%d\n", pwrpriv->dtim, dtim, - pwrpriv->bFwCurrentInPSMode, pwrpriv->pwr_mode); - - pwrpriv->dtim = dtim; - } + if (pwrpriv->dtim != dtim) { + RTW_INFO("change DTIM from %d to %d, bFwCurrentInPSMode=%d, ps_mode=%d\n", pwrpriv->dtim, dtim, + pwrpriv->bFwCurrentInPSMode, pwrpriv->pwr_mode); - if((pwrpriv->bFwCurrentInPSMode ==_TRUE) && (pwrpriv->pwr_mode > PS_MODE_ACTIVE)) - { + pwrpriv->dtim = dtim; + } + + if ((pwrpriv->bFwCurrentInPSMode == _TRUE) && (pwrpriv->pwr_mode > PS_MODE_ACTIVE)) { u8 ps_mode = pwrpriv->pwr_mode; - //DBG_871X("change DTIM from %d to %d, ps_mode=%d\n", pwrpriv->dtim, dtim, ps_mode); - + /* RTW_INFO("change DTIM from %d to %d, ps_mode=%d\n", pwrpriv->dtim, dtim, ps_mode); */ + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); } - + #ifdef CONFIG_LPS_LCLK _exit_pwrlock(&pwrpriv->lock); #endif @@ -2905,29 +2842,29 @@ void rtw_lps_change_dtim_hdl(_adapter *padapter, u8 dtim) #endif -u8 rtw_lps_change_dtim_cmd(_adapter*padapter, u8 dtim) +u8 rtw_lps_change_dtim_cmd(_adapter *padapter, u8 dtim) { struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; -/* -#ifdef CONFIG_CONCURRENT_MODE - if (padapter->iface_type != IFACE_PORT0) - return res; -#endif -*/ + /* + #ifdef CONFIG_CONCURRENT_MODE + if (padapter->hw_port != HW_PORT0) + return res; + #endif + */ { - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + 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){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -2940,38 +2877,37 @@ u8 rtw_lps_change_dtim_cmd(_adapter*padapter, u8 dtim) res = rtw_enqueue_cmd(pcmdpriv, ph2c); } - + exit: - + return res; } -#if (RATE_ADAPTIVE_SUPPORT==1) +#if (RATE_ADAPTIVE_SUPPORT == 1) void rpt_timer_setting_wk_hdl(_adapter *padapter, u16 minRptTime) { rtw_hal_set_hwreg(padapter, HW_VAR_RPT_TIMER_SETTING, (u8 *)(&minRptTime)); } -u8 rtw_rpt_timer_cfg_cmd(_adapter*padapter, u16 minRptTime) +u8 rtw_rpt_timer_cfg_cmd(_adapter *padapter, u16 minRptTime) { struct cmd_obj *ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + 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){ + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -2983,7 +2919,6 @@ _func_enter_; res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; @@ -2994,33 +2929,39 @@ _func_exit_; #ifdef CONFIG_ANTENNA_DIVERSITY void antenna_select_wk_hdl(_adapter *padapter, u8 antenna) { - rtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna)); + rtw_hal_set_odm_var(padapter, HAL_ODM_ANTDIV_SELECT, &antenna, _TRUE); } -u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue) +u8 rtw_antenna_select_cmd(_adapter *padapter, u8 antenna, u8 enqueue) { struct cmd_obj *ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 bSupportAntDiv = _FALSE; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + u8 bSupportAntDiv = _FALSE; u8 res = _SUCCESS; + int i; -_func_enter_; rtw_hal_get_def_var(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv)); - if(_FALSE == bSupportAntDiv ) return res; + if (_FALSE == bSupportAntDiv) + return _FAIL; - if(_TRUE == enqueue) - { - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + for (i = 0; i < dvobj->iface_nums; i++) { + if (rtw_linked_check(dvobj->padapters[i])) + return _FAIL; + } + + if (_TRUE == enqueue) { + 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){ + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -3031,13 +2972,10 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); res = rtw_enqueue_cmd(pcmdpriv, ph2c); - } - else{ - antenna_select_wk_hdl(padapter,antenna ); - } + } else + antenna_select_wk_hdl(padapter, antenna); exit: -_func_exit_; return res; @@ -3046,29 +2984,28 @@ _func_exit_; void rtw_dm_ra_mask_hdl(_adapter *padapter, struct sta_info *psta) { - if (psta) { + if (psta) set_sta_rate(padapter, psta); - } } -u8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter, u8 *psta) +u8 rtw_dm_ra_mask_wk_cmd(_adapter *padapter, u8 *psta) { struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + + 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){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -3080,100 +3017,95 @@ u8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter, u8 *psta) 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; } void power_saving_wk_hdl(_adapter *padapter) { - rtw_ps_processor(padapter); + rtw_ps_processor(padapter); } -//add for CONFIG_IEEE80211W, none 11w can use it +/* add for CONFIG_IEEE80211W, none 11w can use it */ void reset_securitypriv_hdl(_adapter *padapter) { - rtw_reset_securitypriv(padapter); + rtw_reset_securitypriv(padapter); } void free_assoc_resources_hdl(_adapter *padapter) { - rtw_free_assoc_resources(padapter, 1); + rtw_free_assoc_resources(padapter, 1); } #ifdef CONFIG_P2P -u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType ) +u8 p2p_protocol_wk_cmd(_adapter *padapter, int intCmdType) { struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - -_func_enter_; - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) return res; - } - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + 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){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID; - pdrvextra_cmd_parm->type = intCmdType; // As the command tppe. + pdrvextra_cmd_parm->type = intCmdType; /* As the command tppe. */ pdrvextra_cmd_parm->size = 0; - pdrvextra_cmd_parm->pbuf = NULL; // Must be NULL here + pdrvextra_cmd_parm->pbuf = NULL; /* Must be NULL here */ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); res = rtw_enqueue_cmd(pcmdpriv, ph2c); - + exit: - -_func_exit_; + return res; } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ -u8 rtw_ps_cmd(_adapter*padapter) +u8 rtw_ps_cmd(_adapter *padapter) { struct cmd_obj *ppscmd; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - + u8 res = _SUCCESS; -_func_enter_; #ifdef CONFIG_CONCURRENT_MODE if (padapter->adapter_type != PRIMARY_ADAPTER) goto exit; #endif - - ppscmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ppscmd==NULL){ - res= _FAIL; + + ppscmd = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ppscmd == NULL) { + res = _FAIL; goto exit; } - - pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); - if(pdrvextra_cmd_parm==NULL){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ppscmd, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -3184,10 +3116,9 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(ppscmd, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); res = rtw_enqueue_cmd(pcmdpriv, ppscmd); - + exit: - -_func_exit_; + return res; @@ -3203,21 +3134,18 @@ static void rtw_chk_hi_queue_hdl(_adapter *padapter) u8 empty = _FALSE; psta_bmc = rtw_get_bcmc_stainfo(padapter); - if(!psta_bmc) + if (!psta_bmc) return; rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty); - while(_FALSE == empty && rtw_get_passing_time_ms(start) < rtw_get_wait_hiq_empty_ms()) - { + while (_FALSE == empty && rtw_get_passing_time_ms(start) < rtw_get_wait_hiq_empty_ms()) { rtw_msleep_os(100); rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty); } - if(psta_bmc->sleepq_len==0) - { - if(empty == _SUCCESS) - { + if (psta_bmc->sleepq_len == 0) { + if (empty == _SUCCESS) { bool update_tim = _FALSE; if (pstapriv->tim_bitmap & BIT(0)) @@ -3228,33 +3156,30 @@ static void rtw_chk_hi_queue_hdl(_adapter *padapter) if (update_tim == _TRUE) _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "bmc sleepq and HIQ empty"); - } - else //re check again - { + } else /* re check again */ rtw_chk_hi_queue_cmd(padapter); - } - - } - + + } + } -u8 rtw_chk_hi_queue_cmd(_adapter*padapter) +u8 rtw_chk_hi_queue_cmd(_adapter *padapter) { struct cmd_obj *ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + + 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){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -3266,9 +3191,9 @@ u8 rtw_chk_hi_queue_cmd(_adapter*padapter) 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; } @@ -3285,59 +3210,66 @@ u8 rtw_dfs_master_hdl(_adapter *adapter) if (rtw_get_on_cur_ch_time(adapter) == 0 || rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) < 300 ) { - /* offchannel , by pass radar detect */ + /* offchannel , bypass radar detect */ goto cac_status_chk; } - if (rfctl->dbg_dfs_master_fake_radar_detect_cnt - || rtw_odm_radar_detect(adapter) == _TRUE - ) { - if (rfctl->dbg_dfs_master_fake_radar_detect_cnt != 0) { - DBG_871X(FUNC_ADPT_FMT" fake radar detect, cnt:%d\n", FUNC_ADPT_ARG(adapter) - , rfctl->dbg_dfs_master_fake_radar_detect_cnt); - rfctl->dbg_dfs_master_fake_radar_detect_cnt--; + if (IS_CH_WAITING(rfctl) && !IS_UNDER_CAC(rfctl)) { + /* non_ocp, bypass radar detect */ + goto cac_status_chk; + } + + if (!rfctl->dbg_dfs_master_fake_radar_detect_cnt + && rtw_odm_radar_detect(adapter) != _TRUE) + goto cac_status_chk; + + if (rfctl->dbg_dfs_master_fake_radar_detect_cnt != 0) { + RTW_INFO(FUNC_ADPT_FMT" fake radar detect, cnt:%d\n", FUNC_ADPT_ARG(adapter) + , rfctl->dbg_dfs_master_fake_radar_detect_cnt); + rfctl->dbg_dfs_master_fake_radar_detect_cnt--; + } + + if (rfctl->dbg_dfs_master_radar_detect_trigger_non) { + /* radar detect debug mode, trigger no mlme flow */ + if (0) + RTW_INFO(FUNC_ADPT_FMT" radar detected, trigger no mlme flow for debug\n", FUNC_ADPT_ARG(adapter)); + } else { + /* TODO: move timer to rfctl */ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + int i; + + for (i = 0; i < dvobj->iface_nums; i++) { + if (!dvobj->padapters[i]) + continue; + if (check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_AP_STATE) + && check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_ASOC_STATE)) + break; } - - if (rfctl->dbg_dfs_master_radar_detect_trigger_non) { - /* radar detect debug mode, trigger no mlme flow */ - DBG_871X(FUNC_ADPT_FMT" radar detected, trigger no mlme flow for debug\n", FUNC_ADPT_ARG(adapter)); + + if (i >= dvobj->iface_nums) { + /* what? */ + rtw_warn_on(1); } else { - /* TODO: move timer to rfctl */ - struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); - int i; + rtw_chset_update_non_ocp(dvobj->padapters[i]->mlmeextpriv.channel_set + , rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset); + rfctl->radar_detected = 1; - for (i = 0; i < dvobj->iface_nums; i++) { - if (!dvobj->padapters[i]) - continue; - if (check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_AP_STATE) - && check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_AP_STATE)) - break; - } - - if (i >= dvobj->iface_nums) { - /* what? */ - rtw_warn_on(1); - } else { - rtw_chset_update_non_ocp(dvobj->padapters[i]->mlmeextpriv.channel_set - , rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset); - - /* change op ch, inform ch switch */ - rtw_change_bss_chbw_cmd(dvobj->padapters[i], RTW_CMDF_DIRECTLY, 0, 0, 0); - } - - if (rfctl->dfs_master_enabled) - goto set_timer; - goto exit; + /* trigger channel selection */ + rtw_change_bss_chbw_cmd(dvobj->padapters[i], RTW_CMDF_DIRECTLY, -1, dvobj->padapters[i]->mlmepriv.ori_bw, -1); } + + if (rfctl->dfs_master_enabled) + goto set_timer; + goto exit; } cac_status_chk: - if (!IS_UNDER_CAC(rfctl) && !IS_CAC_STOPPED(rfctl)) { + if (!IS_CH_WAITING(rfctl) && !IS_CAC_STOPPED(rfctl)) { u8 pause = 0x00; rtw_hal_set_hwreg(adapter, HW_VAR_TXPAUSE, &pause); - rfctl->cac_end_time = RTW_CAC_STOPPED; + rfctl->cac_start_time = rfctl->cac_end_time = RTW_CAC_STOPPED; } set_timer: @@ -3355,11 +3287,11 @@ u8 rtw_dfs_master_cmd(_adapter *adapter, bool enqueue) u8 res = _FAIL; if (enqueue) { - cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); if (cmdobj == NULL) goto exit; - pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); if (pdrvextra_cmd_parm == NULL) { rtw_mfree((u8 *)cmdobj, sizeof(struct cmd_obj)); goto exit; @@ -3395,28 +3327,25 @@ void rtw_dfs_master_enable(_adapter *adapter, u8 ch, u8 bw, u8 offset) /* TODO: move timer to rfctl */ adapter = GET_PRIMARY_ADAPTER(adapter); - DBG_871X(FUNC_ADPT_FMT" on %u,%u,%u\n", FUNC_ADPT_ARG(adapter), ch, bw, offset); + RTW_INFO(FUNC_ADPT_FMT" on %u,%u,%u\n", FUNC_ADPT_ARG(adapter), ch, bw, offset); - rfctl->pre_radar_detect_by_sta_link = rfctl->radar_detect_by_sta_link; - rfctl->radar_detect_by_sta_link = _FALSE; + if (rtw_is_cac_reset_needed(adapter, ch, bw, offset) == _TRUE) + rtw_reset_cac(adapter, ch, bw, offset); - rfctl->pre_radar_detect_ch = rfctl->radar_detect_ch; - rfctl->pre_radar_detect_bw = rfctl->radar_detect_bw; - rfctl->pre_radar_detect_offset = rfctl->radar_detect_offset; + rfctl->radar_detect_by_others = _FALSE; rfctl->radar_detect_ch = ch; rfctl->radar_detect_bw = bw; rfctl->radar_detect_offset = offset; - if (rtw_is_cac_reset_needed(adapter) == _TRUE) - rtw_rfctl_reset_cac(adapter_to_rfctl(adapter)); + rfctl->radar_detected = 0; if (!rfctl->dfs_master_enabled) { - DBG_871X(FUNC_ADPT_FMT" set dfs_master_enabled\n", FUNC_ADPT_ARG(adapter)); + RTW_INFO(FUNC_ADPT_FMT" set dfs_master_enabled\n", FUNC_ADPT_ARG(adapter)); rfctl->dfs_master_enabled = 1; _set_timer(&adapter->mlmepriv.dfs_master_timer, DFS_MASTER_TIMER_MS); if (rtw_rfctl_overlap_radar_detect_ch(rfctl)) { - if (IS_UNDER_CAC(rfctl)) { + if (IS_CH_WAITING(rfctl)) { u8 pause = 0xFF; rtw_hal_set_hwreg(adapter, HW_VAR_TXPAUSE, &pause); @@ -3426,26 +3355,26 @@ void rtw_dfs_master_enable(_adapter *adapter, u8 ch, u8 bw, u8 offset) } } -void rtw_dfs_master_disable(_adapter *adapter, bool ld_sta_in_dfs) +void rtw_dfs_master_disable(_adapter *adapter, u8 ch, u8 bw, u8 offset, bool by_others) { struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); - + /* TODO: move timer to rfctl */ adapter = GET_PRIMARY_ADAPTER(adapter); - rfctl->pre_radar_detect_by_sta_link = rfctl->radar_detect_by_sta_link; - rfctl->radar_detect_by_sta_link = ld_sta_in_dfs; + rfctl->radar_detect_by_others = by_others; if (rfctl->dfs_master_enabled) { bool overlap_radar_detect_ch = rtw_rfctl_overlap_radar_detect_ch(rfctl); - DBG_871X(FUNC_ADPT_FMT" clear dfs_master_enabled\n", FUNC_ADPT_ARG(adapter)); + RTW_INFO(FUNC_ADPT_FMT" clear dfs_master_enabled\n", FUNC_ADPT_ARG(adapter)); rfctl->dfs_master_enabled = 0; - rfctl->radar_detect_ch = rfctl->pre_radar_detect_ch = 0; - rfctl->radar_detect_bw = rfctl->pre_radar_detect_bw = 0; - rfctl->radar_detect_offset = rfctl->pre_radar_detect_offset = 0; - rfctl->cac_end_time = RTW_CAC_STOPPED; + rfctl->radar_detected = 0; + rfctl->radar_detect_ch = 0; + rfctl->radar_detect_bw = 0; + rfctl->radar_detect_offset = 0; + rfctl->cac_start_time = rfctl->cac_end_time = RTW_CAC_STOPPED; _cancel_timer_ex(&adapter->mlmepriv.dfs_master_timer); if (overlap_radar_detect_ch) { @@ -3455,6 +3384,12 @@ void rtw_dfs_master_disable(_adapter *adapter, bool ld_sta_in_dfs) rtw_odm_radar_detect_disable(adapter); } } + + if (by_others) { + rfctl->radar_detect_ch = ch; + rfctl->radar_detect_bw = bw; + rfctl->radar_detect_offset = offset; + } } void rtw_dfs_master_status_apply(_adapter *adapter, u8 self_action) @@ -3466,8 +3401,8 @@ void rtw_dfs_master_status_apply(_adapter *adapter, u8 self_action) bool sync_ch = _FALSE; /* _FALSE: asign channel directly */ bool needed = _FALSE; - rtw_dev_iface_status_no_self(adapter, NULL, &ld_sta_num, &lg_sta_num, &ap_num, NULL); - rtw_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset); + rtw_mi_status_no_self(adapter, NULL, &ld_sta_num, &lg_sta_num, &ap_num, NULL, NULL); + rtw_mi_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset); if (u_ch != 0) sync_ch = _TRUE; @@ -3489,7 +3424,7 @@ void rtw_dfs_master_status_apply(_adapter *adapter, u8 self_action) if (sync_ch == _TRUE) { if (!rtw_is_chbw_grouped(mlmeext->cur_channel, mlmeext->cur_bwmode, mlmeext->cur_ch_offset, u_ch, u_bw, u_offset)) { - DBG_871X(FUNC_ADPT_FMT" can't sync %u,%u,%u with %u,%u,%u\n", FUNC_ADPT_ARG(adapter) + RTW_INFO(FUNC_ADPT_FMT" can't sync %u,%u,%u with %u,%u,%u\n", FUNC_ADPT_ARG(adapter) , mlmeext->cur_channel, mlmeext->cur_bwmode, mlmeext->cur_ch_offset, u_ch, u_bw, u_offset); goto apply; } @@ -3524,15 +3459,15 @@ void rtw_dfs_master_status_apply(_adapter *adapter, u8 self_action) apply: - DBG_871X(FUNC_ADPT_FMT" needed:%d, self_action:%u\n" + RTW_INFO(FUNC_ADPT_FMT" needed:%d, self_action:%u\n" , FUNC_ADPT_ARG(adapter), needed, self_action); - DBG_871X(FUNC_ADPT_FMT" ld_sta_num:%u, lg_sta_num:%u, ap_num:%u, %u,%u,%u\n" + RTW_INFO(FUNC_ADPT_FMT" ld_sta_num:%u, lg_sta_num:%u, ap_num:%u, %u,%u,%u\n" , FUNC_ADPT_ARG(adapter), ld_sta_num, lg_sta_num, ap_num, u_ch, u_bw, u_offset); if (needed == _TRUE) rtw_dfs_master_enable(adapter, u_ch, u_bw, u_offset); else - rtw_dfs_master_disable(adapter, ld_sta_in_dfs); + rtw_dfs_master_disable(adapter, u_ch, u_bw, u_offset, ld_sta_in_dfs); } #endif /* CONFIG_DFS_MASTER */ @@ -3576,64 +3511,63 @@ struct btinfo { void btinfo_evt_dump(void *sel, void *buf) { struct btinfo *info = (struct btinfo *)buf; - - DBG_871X_SEL_NL(sel, "cid:0x%02x, len:%u\n", info->cid, info->len); + + RTW_PRINT_SEL(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":"" - ); + RTW_PRINT_SEL(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); + RTW_PRINT_SEL(sel, "retry_cnt:%u\n", info->retry_cnt); if (info->len > 4) - DBG_871X_SEL_NL(sel, "rssi:%u\n", info->rssi); + RTW_PRINT_SEL(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 ":"" - ); + RTW_PRINT_SEL(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 +#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 +#else /* !CONFIG_BT_COEXIST_SOCKET_TRX */ struct btinfo *info = (struct btinfo *)buf; -#endif //CONFIG_BT_COEXIST_SOCKET_TRX +#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */ u8 cmd_idx; u8 len; cmd_idx = info->cid; - if (info->len > buf_len-2) { + if (info->len > buf_len - 2) { rtw_warn_on(1); - len = buf_len-2; - } else { + len = buf_len - 2; + } else len = info->len; - } -//#define DBG_PROC_SET_BTINFO_EVT + /* #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 + RTW_INFO("%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 //CONFIG_BT_COEXIST_SOCKET_TRX -#endif // DBG_PROC_SET_BTINFO_EVT +#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) @@ -3641,10 +3575,10 @@ static void rtw_btinfo_hdl(_adapter *adapter, u8 *buf, u16 buf_len) 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) + 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]); +#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */ + rtw_btcoex_BtInfoNotify(adapter , len + 1, &buf[1]); } u8 rtw_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len) @@ -3655,23 +3589,23 @@ u8 rtw_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len) struct cmd_priv *pcmdpriv = &adapter->cmdpriv; u8 res = _SUCCESS; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + 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)); + 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)); + 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)); + rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm)); res = _FAIL; goto exit; } @@ -3690,33 +3624,87 @@ u8 rtw_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len) exit: return res; } -#endif //CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ -//#ifdef CONFIG_C2H_PACKET_EN +u8 rtw_test_h2c_cmd(_adapter *adapter, u8 *buf, u8 len) +{ + struct cmd_obj *pcmdobj; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + u8 *ph2c_content; + struct cmd_priv *pcmdpriv = &adapter->cmdpriv; + u8 res = _SUCCESS; + + pcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmdobj == 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 *)pcmdobj, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + ph2c_content = rtw_zmalloc(len); + if (ph2c_content == NULL) { + rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm)); + res = _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = TEST_H2C_CID; + pdrvextra_cmd_parm->type = 0; + pdrvextra_cmd_parm->size = len; + pdrvextra_cmd_parm->pbuf = ph2c_content; + + _rtw_memcpy(ph2c_content, buf, len); + + init_h2fwcmd_w_parm_no_rsp(pcmdobj, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); + +exit: + return res; +} + +/* #ifdef CONFIG_C2H_PACKET_EN */ u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length) { struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 *extra_cmd_buf; u8 res = _SUCCESS; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + 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)); + 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)); + rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj)); res = _FAIL; goto exit; } + extra_cmd_buf = rtw_zmalloc(length); + if (extra_cmd_buf == NULL) { + rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm)); + res = _FAIL; + goto exit; + } + + _rtw_memcpy(extra_cmd_buf, pbuf, length); pdrvextra_cmd_parm->ec_id = C2H_WK_CID; pdrvextra_cmd_parm->type = 0; pdrvextra_cmd_parm->size = length; - pdrvextra_cmd_parm->pbuf = pbuf; + pdrvextra_cmd_parm->pbuf = extra_cmd_buf; init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); @@ -3726,9 +3714,9 @@ exit: return res; } -//#else //CONFIG_C2H_PACKET_EN -/* dont call R/W in this function, beucase SDIO interrupt have claim host */ -/* or deadlock will happen and cause special-systemserver-died in android */ +/* #else */ /* CONFIG_C2H_PACKET_EN */ +/* dont call R/W in this function, beucase SDIO interrupt have claim host + * or deadlock will happen and cause special-systemserver-died in android */ u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *c2h_evt) { @@ -3737,54 +3725,53 @@ u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *c2h_evt) struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + 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)); + 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)); + rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj)); res = _FAIL; goto exit; } pdrvextra_cmd_parm->ec_id = C2H_WK_CID; pdrvextra_cmd_parm->type = 0; - pdrvextra_cmd_parm->size = c2h_evt?16:0; + pdrvextra_cmd_parm->size = c2h_evt ? 16 : 0; pdrvextra_cmd_parm->pbuf = c2h_evt; init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); res = rtw_enqueue_cmd(pcmdpriv, ph2c); - + exit: - + return res; } -//#endif //CONFIG_C2H_PACKET_EN +/* #endif */ /* CONFIG_C2H_PACKET_EN */ -u8 rtw_run_in_thread_cmd(PADAPTER padapter, void (*func)(void*), void* context) +u8 rtw_run_in_thread_cmd(PADAPTER padapter, void (*func)(void *), void *context) { struct cmd_priv *pcmdpriv; struct cmd_obj *ph2c; struct RunInThread_param *parm; s32 res = _SUCCESS; -_func_enter_; pcmdpriv = &padapter->cmdpriv; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); if (NULL == ph2c) { res = _FAIL; goto exit; } - parm = (struct RunInThread_param*)rtw_zmalloc(sizeof(struct RunInThread_param)); + parm = (struct RunInThread_param *)rtw_zmalloc(sizeof(struct RunInThread_param)); if (NULL == parm) { - rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj)); res = _FAIL; goto exit; } @@ -3796,7 +3783,6 @@ _func_enter_; res = rtw_enqueue_cmd(pcmdpriv, ph2c); exit: -_func_exit_; return res; } @@ -3810,7 +3796,7 @@ s32 c2h_evt_hdl(_adapter *adapter, u8 *c2h_evt, c2h_id_filter filter) /* No c2h event in cmd_obj, read c2h event before handling*/ if (rtw_hal_c2h_evt_read(adapter, buf) == _SUCCESS) { c2h_evt = buf; - + if (filter && filter(c2h_evt) == _FALSE) goto exit; @@ -3838,18 +3824,22 @@ static void c2h_wk_callback(_workitem *work) evtpriv->c2h_wk_alive = _TRUE; while (!rtw_cbuf_empty(evtpriv->c2h_queue)) { - if ((c2h_evt = (u8 *)rtw_cbuf_pop(evtpriv->c2h_queue)) != NULL) { + c2h_evt = (u8 *)rtw_cbuf_pop(evtpriv->c2h_queue); + if (c2h_evt != NULL) { /* This C2H event is read, clear it */ c2h_evt_clear(adapter); - } else if ((c2h_evt = (u8 *)rtw_malloc(16)) != NULL) { + } else { + c2h_evt = (u8 *)rtw_malloc(16); + if (c2h_evt == NULL) { + rtw_warn_on(1); + continue; + } + /* This C2H event is not read, read & clear now */ if (rtw_hal_c2h_evt_read(adapter, c2h_evt) != _SUCCESS) { rtw_mfree(c2h_evt, 16); continue; } - } else { - rtw_warn_on(1); - continue; } /* Special pointer to trigger c2h_evt_clear only */ @@ -3860,7 +3850,7 @@ static void c2h_wk_callback(_workitem *work) rtw_mfree(c2h_evt, 16); continue; } - + if (ccx_id_filter(c2h_evt) == _TRUE) { /* Handle CCX report here */ rtw_hal_c2h_handler(adapter, c2h_evt); @@ -3875,208 +3865,473 @@ static void c2h_wk_callback(_workitem *work) } #endif +u8 session_tracker_cmd(_adapter *adapter, u8 cmd, struct sta_info *sta, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port) +{ + struct cmd_priv *cmdpriv = &adapter->cmdpriv; + struct cmd_obj *cmdobj; + struct drvextra_cmd_parm *cmd_parm; + struct st_cmd_parm *st_parm; + u8 res = _SUCCESS; + + cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (cmdobj == NULL) { + res = _FAIL; + goto exit; + } + + cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (cmd_parm == NULL) { + rtw_mfree((u8 *)cmdobj, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + st_parm = (struct st_cmd_parm *)rtw_zmalloc(sizeof(struct st_cmd_parm)); + if (st_parm == NULL) { + rtw_mfree((u8 *)cmdobj, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)cmd_parm, sizeof(struct drvextra_cmd_parm)); + res = _FAIL; + goto exit; + } + + st_parm->cmd = cmd; + st_parm->sta = sta; + if (cmd != ST_CMD_CHK) { + _rtw_memcpy(&st_parm->local_naddr, local_naddr, 4); + _rtw_memcpy(&st_parm->local_port, local_port, 2); + _rtw_memcpy(&st_parm->remote_naddr, remote_naddr, 4); + _rtw_memcpy(&st_parm->remote_port, remote_port, 2); + } + + cmd_parm->ec_id = SESSION_TRACKER_WK_CID; + cmd_parm->type = 0; + cmd_parm->size = sizeof(struct st_cmd_parm); + cmd_parm->pbuf = (u8 *)st_parm; + init_h2fwcmd_w_parm_no_rsp(cmdobj, cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + cmdobj->no_io = 1; + + res = rtw_enqueue_cmd(cmdpriv, cmdobj); + +exit: + return res; +} + +inline u8 session_tracker_chk_cmd(_adapter *adapter, struct sta_info *sta) +{ + return session_tracker_cmd(adapter, ST_CMD_CHK, sta, NULL, NULL, NULL, NULL); +} + +inline u8 session_tracker_add_cmd(_adapter *adapter, struct sta_info *sta, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port) +{ + return session_tracker_cmd(adapter, ST_CMD_ADD, sta, local_naddr, local_port, remote_naddr, remote_port); +} + +inline u8 session_tracker_del_cmd(_adapter *adapter, struct sta_info *sta, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port) +{ + return session_tracker_cmd(adapter, ST_CMD_DEL, sta, local_naddr, local_port, remote_naddr, remote_port); +} + +void session_tracker_chk_for_sta(_adapter *adapter, struct sta_info *sta) +{ + struct st_ctl_t *st_ctl = &sta->st_ctl; + int i; + _irqL irqL; + _list *plist, *phead, *pnext; + _list dlist; + struct session_tracker *st = NULL; + u8 op_wfd_mode = MIRACAST_DISABLED; + + if (DBG_SESSION_TRACKER) + RTW_INFO(FUNC_ADPT_FMT" sta:%p\n", FUNC_ADPT_ARG(adapter), sta); + + if (!(sta->state & _FW_LINKED)) + goto exit; + + for (i = 0; i < SESSION_TRACKER_REG_ID_NUM; i++) { + if (st_ctl->reg[i].s_proto != 0) + break; + } + if (i >= SESSION_TRACKER_REG_ID_NUM) + goto chk_sta; + + _rtw_init_listhead(&dlist); + + _enter_critical_bh(&st_ctl->tracker_q.lock, &irqL); + + phead = &st_ctl->tracker_q.queue; + plist = get_next(phead); + pnext = get_next(plist); + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { + st = LIST_CONTAINOR(plist, struct session_tracker, list); + plist = pnext; + pnext = get_next(pnext); + + if (st->status != ST_STATUS_ESTABLISH + && rtw_get_passing_time_ms(st->set_time) > ST_EXPIRE_MS + ) { + rtw_list_delete(&st->list); + rtw_list_insert_tail(&st->list, &dlist); + } + + /* TODO: check OS for status update */ + if (st->status == ST_STATUS_CHECK) + st->status = ST_STATUS_ESTABLISH; + + if (st->status != ST_STATUS_ESTABLISH) + continue; + + #ifdef CONFIG_WFD + if (0) + RTW_INFO(FUNC_ADPT_FMT" local:%u, remote:%u, rtsp:%u, %u, %u\n", FUNC_ADPT_ARG(adapter) + , ntohs(st->local_port), ntohs(st->remote_port), adapter->wfd_info.rtsp_ctrlport, adapter->wfd_info.tdls_rtsp_ctrlport + , adapter->wfd_info.peer_rtsp_ctrlport); + if (ntohs(st->local_port) == adapter->wfd_info.rtsp_ctrlport) + op_wfd_mode |= MIRACAST_SINK; + if (ntohs(st->local_port) == adapter->wfd_info.tdls_rtsp_ctrlport) + op_wfd_mode |= MIRACAST_SINK; + if (ntohs(st->remote_port) == adapter->wfd_info.peer_rtsp_ctrlport) + op_wfd_mode |= MIRACAST_SOURCE; + #endif + } + + _exit_critical_bh(&st_ctl->tracker_q.lock, &irqL); + + plist = get_next(&dlist); + while (rtw_end_of_queue_search(&dlist, plist) == _FALSE) { + st = LIST_CONTAINOR(plist, struct session_tracker, list); + plist = get_next(plist); + rtw_mfree((u8 *)st, sizeof(struct session_tracker)); + } + +chk_sta: + if (STA_OP_WFD_MODE(sta) != op_wfd_mode) { + STA_SET_OP_WFD_MODE(sta, op_wfd_mode); + rtw_sta_media_status_rpt_cmd(adapter, sta, 1); + } + +exit: + return; +} + +void session_tracker_chk_for_adapter(_adapter *adapter) +{ + struct sta_priv *stapriv = &adapter->stapriv; + struct sta_info *sta; + int i; + _irqL irqL; + _list *plist, *phead; + u8 op_wfd_mode = MIRACAST_DISABLED; + + _enter_critical_bh(&stapriv->sta_hash_lock, &irqL); + + for (i = 0; i < NUM_STA; i++) { + phead = &(stapriv->sta_hash[i]); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + sta = LIST_CONTAINOR(plist, struct sta_info, hash_list); + plist = get_next(plist); + + session_tracker_chk_for_sta(adapter, sta); + + op_wfd_mode |= STA_OP_WFD_MODE(sta); + } + } + + _exit_critical_bh(&stapriv->sta_hash_lock, &irqL); + +#ifdef CONFIG_WFD + adapter->wfd_info.op_wfd_mode = MIRACAST_MODE_REVERSE(op_wfd_mode); +#endif +} + +void session_tracker_cmd_hdl(_adapter *adapter, struct st_cmd_parm *parm) +{ + u8 cmd = parm->cmd; + struct sta_info *sta = parm->sta; + + if (cmd == ST_CMD_CHK) { + if (sta) + session_tracker_chk_for_sta(adapter, sta); + else + session_tracker_chk_for_adapter(adapter); + + goto exit; + + } else if (cmd == ST_CMD_ADD || cmd == ST_CMD_DEL) { + struct st_ctl_t *st_ctl; + u32 local_naddr = parm->local_naddr; + u16 local_port = parm->local_port; + u32 remote_naddr = parm->remote_naddr; + u16 remote_port = parm->remote_port; + struct session_tracker *st = NULL; + _irqL irqL; + _list *plist, *phead; + u8 free_st = 0; + u8 alloc_st = 0; + + if (DBG_SESSION_TRACKER) + RTW_INFO(FUNC_ADPT_FMT" cmd:%u, sta:%p, local:"IP_FMT":"PORT_FMT", remote:"IP_FMT":"PORT_FMT"\n" + , FUNC_ADPT_ARG(adapter), cmd, sta + , IP_ARG(&local_naddr), PORT_ARG(&local_port) + , IP_ARG(&remote_naddr), PORT_ARG(&remote_port) + ); + + if (!(sta->state & _FW_LINKED)) + goto exit; + + st_ctl = &sta->st_ctl; + + _enter_critical_bh(&st_ctl->tracker_q.lock, &irqL); + + phead = &st_ctl->tracker_q.queue; + plist = get_next(phead); + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { + st = LIST_CONTAINOR(plist, struct session_tracker, list); + + if (st->local_naddr == local_naddr + && st->local_port == local_port + && st->remote_naddr == remote_naddr + && st->remote_port == remote_port) + break; + + plist = get_next(plist); + } + + if (rtw_end_of_queue_search(phead, plist) == _TRUE) + st = NULL; + + switch (cmd) { + case ST_CMD_DEL: + if (st) { + rtw_list_delete(plist); + free_st = 1; + } + goto unlock; + case ST_CMD_ADD: + if (!st) + alloc_st = 1; + } + +unlock: + _exit_critical_bh(&st_ctl->tracker_q.lock, &irqL); + + if (free_st) { + rtw_mfree((u8 *)st, sizeof(struct session_tracker)); + goto exit; + } + + if (alloc_st) { + st = (struct session_tracker *)rtw_zmalloc(sizeof(struct session_tracker)); + if (!st) + goto exit; + + st->local_naddr = local_naddr; + st->local_port = local_port; + st->remote_naddr = remote_naddr; + st->remote_port = remote_port; + st->set_time = rtw_get_current_time(); + st->status = ST_STATUS_CHECK; + + _enter_critical_bh(&st_ctl->tracker_q.lock, &irqL); + rtw_list_insert_tail(&st->list, phead); + _exit_critical_bh(&st_ctl->tracker_q.lock, &irqL); + } + } + +exit: + return; +} + u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf) { struct drvextra_cmd_parm *pdrvextra_cmd; - if(!pbuf) + if (!pbuf) return H2C_PARAMETERS_ERROR; - pdrvextra_cmd = (struct drvextra_cmd_parm*)pbuf; - - switch(pdrvextra_cmd->ec_id) - { - case DYNAMIC_CHK_WK_CID://only primary padapter go to this cmd, but execute dynamic_chk_wk_hdl() for two interfaces -#ifdef CONFIG_CONCURRENT_MODE - if(padapter->pbuddy_adapter) - { - dynamic_chk_wk_hdl(padapter->pbuddy_adapter); - } -#endif //CONFIG_CONCURRENT_MODE - dynamic_chk_wk_hdl(padapter); - break; - case POWER_SAVING_CTRL_WK_CID: - power_saving_wk_hdl(padapter); - break; + pdrvextra_cmd = (struct drvextra_cmd_parm *)pbuf; + + switch (pdrvextra_cmd->ec_id) { + case STA_MSTATUS_RPT_WK_CID: + rtw_sta_media_status_rpt_cmd_hdl(padapter, (struct sta_media_status_rpt_cmd_parm *)pdrvextra_cmd->pbuf); + break; + + case DYNAMIC_CHK_WK_CID:/*only primary padapter go to this cmd, but execute dynamic_chk_wk_hdl() for two interfaces */ + rtw_dynamic_chk_wk_hdl(padapter); + break; + case POWER_SAVING_CTRL_WK_CID: + power_saving_wk_hdl(padapter); + break; #ifdef CONFIG_LPS - case LPS_CTRL_WK_CID: - lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type); - break; - case DM_IN_LPS_WK_CID: - rtw_dm_in_lps_hdl(padapter); - break; - case LPS_CHANGE_DTIM_CID: - rtw_lps_change_dtim_hdl(padapter, (u8)pdrvextra_cmd->type); - break; + case LPS_CTRL_WK_CID: + lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type); + break; + case DM_IN_LPS_WK_CID: + rtw_dm_in_lps_hdl(padapter); + break; + case LPS_CHANGE_DTIM_CID: + rtw_lps_change_dtim_hdl(padapter, (u8)pdrvextra_cmd->type); + break; #endif -#if (RATE_ADAPTIVE_SUPPORT==1) - case RTP_TIMER_CFG_WK_CID: - rpt_timer_setting_wk_hdl(padapter, pdrvextra_cmd->type); - break; +#if (RATE_ADAPTIVE_SUPPORT == 1) + case RTP_TIMER_CFG_WK_CID: + rpt_timer_setting_wk_hdl(padapter, pdrvextra_cmd->type); + break; #endif #ifdef CONFIG_ANTENNA_DIVERSITY - case ANT_SELECT_WK_CID: - antenna_select_wk_hdl(padapter, pdrvextra_cmd->type); - break; + case ANT_SELECT_WK_CID: + antenna_select_wk_hdl(padapter, pdrvextra_cmd->type); + break; #endif #ifdef CONFIG_P2P_PS - case P2P_PS_WK_CID: - p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type); - break; -#endif //CONFIG_P2P_PS -#ifdef CONFIG_P2P - case P2P_PROTO_WK_CID: - // Commented by Albert 2011/07/01 - // I used the type_size as the type command - p2p_protocol_wk_hdl( padapter, pdrvextra_cmd->type ); - break; -#endif //CONFIG_P2P -#ifdef CONFIG_AP_MODE - case CHECK_HIQ_WK_CID: - rtw_chk_hi_queue_hdl(padapter); - break; -#endif //CONFIG_AP_MODE -#ifdef CONFIG_INTEL_WIDI - case INTEl_WIDI_WK_CID: - intel_widi_wk_hdl(padapter, pdrvextra_cmd->type, pdrvextra_cmd->pbuf); - break; -#endif //CONFIG_INTEL_WIDI - //add for CONFIG_IEEE80211W, none 11w can use it - case RESET_SECURITYPRIV: - reset_securitypriv_hdl(padapter); - break; - case FREE_ASSOC_RESOURCES: - free_assoc_resources_hdl(padapter); - break; - case C2H_WK_CID: -#ifdef CONFIG_C2H_PACKET_EN - rtw_hal_set_hwreg_with_buf(padapter, HW_VAR_C2H_HANDLE, pdrvextra_cmd->pbuf, pdrvextra_cmd->size); -#else - c2h_evt_hdl(padapter, pdrvextra_cmd->pbuf, NULL); + case P2P_PS_WK_CID: + p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type); + break; #endif - break; +#ifdef CONFIG_P2P + case P2P_PROTO_WK_CID: + /* + * Commented by Albert 2011/07/01 + * I used the type_size as the type command + */ + p2p_protocol_wk_hdl(padapter, pdrvextra_cmd->type); + break; +#endif +#ifdef CONFIG_AP_MODE + case CHECK_HIQ_WK_CID: + rtw_chk_hi_queue_hdl(padapter); + break; +#endif +#ifdef CONFIG_INTEL_WIDI + case INTEl_WIDI_WK_CID: + intel_widi_wk_hdl(padapter, pdrvextra_cmd->type, pdrvextra_cmd->pbuf); + break; +#endif + /* add for CONFIG_IEEE80211W, none 11w can use it */ + case RESET_SECURITYPRIV: + reset_securitypriv_hdl(padapter); + break; + case FREE_ASSOC_RESOURCES: + free_assoc_resources_hdl(padapter); + break; + case C2H_WK_CID: +#ifdef CONFIG_C2H_PACKET_EN + rtw_hal_set_hwreg_with_buf(padapter, HW_VAR_C2H_HANDLE, pdrvextra_cmd->pbuf, pdrvextra_cmd->size); +#else + c2h_evt_hdl(padapter, pdrvextra_cmd->pbuf, NULL); +#endif + break; #ifdef CONFIG_BEAMFORMING - case BEAMFORMING_WK_CID: - beamforming_wk_hdl(padapter, pdrvextra_cmd->type, pdrvextra_cmd->pbuf); - break; -#endif /*CONFIG_BEAMFORMING*/ - case DM_RA_MSK_WK_CID: - rtw_dm_ra_mask_hdl(padapter, (struct sta_info *)pdrvextra_cmd->pbuf); - break; + case BEAMFORMING_WK_CID: + beamforming_wk_hdl(padapter, pdrvextra_cmd->type, pdrvextra_cmd->pbuf); + break; +#endif + case DM_RA_MSK_WK_CID: + rtw_dm_ra_mask_hdl(padapter, (struct sta_info *)pdrvextra_cmd->pbuf); + break; #ifdef CONFIG_BT_COEXIST - case BTINFO_WK_CID: - rtw_btinfo_hdl(padapter ,pdrvextra_cmd->pbuf, pdrvextra_cmd->size); - break; + case BTINFO_WK_CID: + rtw_btinfo_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->size); + break; #endif #ifdef CONFIG_DFS_MASTER - case DFS_MASTER_WK_CID: - rtw_dfs_master_hdl(padapter); - break; + case DFS_MASTER_WK_CID: + rtw_dfs_master_hdl(padapter); + break; #endif - default: - break; + case SESSION_TRACKER_WK_CID: + session_tracker_cmd_hdl(padapter, (struct st_cmd_parm *)pdrvextra_cmd->pbuf); + break; + case EN_HW_UPDATE_TSF_WK_CID: + rtw_hal_set_hwreg(padapter, HW_VAR_EN_HW_UPDATE_TSF, NULL); + break; + case TEST_H2C_CID: + rtw_hal_fill_h2c_cmd(padapter, pdrvextra_cmd->pbuf[0], pdrvextra_cmd->size - 1, &pdrvextra_cmd->pbuf[1]); + break; + default: + break; } - if (pdrvextra_cmd->pbuf && pdrvextra_cmd->size>0) - { + if (pdrvextra_cmd->pbuf && pdrvextra_cmd->size > 0) rtw_mfree(pdrvextra_cmd->pbuf, pdrvextra_cmd->size); - } return H2C_SUCCESS; } -void rtw_survey_cmd_callback(_adapter* padapter , struct cmd_obj *pcmd) +void rtw_survey_cmd_callback(_adapter *padapter , struct cmd_obj *pcmd) { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -_func_enter_; - if(pcmd->res == H2C_DROPPED) - { - //TODO: cancel timer and do timeout handler directly... - //need to make timeout handlerOS independent + if (pcmd->res == H2C_DROPPED) { + /* TODO: cancel timer and do timeout handler directly... */ + /* need to make timeout handlerOS independent */ + mlme_set_scan_to_timer(pmlmepriv, 1); + } else if (pcmd->res != H2C_SUCCESS) { mlme_set_scan_to_timer(pmlmepriv, 1); } - else if (pcmd->res != H2C_SUCCESS) { - 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.")); - } - // free cmd + /* free cmd */ rtw_free_cmd_obj(pcmd); -_func_exit_; } -void rtw_disassoc_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd) +void rtw_disassoc_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd) { _irqL irqL; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - -_func_enter_; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - if (pcmd->res != H2C_SUCCESS) - { + + if (pcmd->res != H2C_SUCCESS) { _enter_critical_bh(&pmlmepriv->lock, &irqL); set_fwstate(pmlmepriv, _FW_LINKED); _exit_critical_bh(&pmlmepriv->lock, &irqL); - - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ***Error: disconnect_cmd_callback Fail ***\n.")); - goto exit; } #ifdef CONFIG_BR_EXT - else //clear bridge database + else /* clear bridge database */ nat25_db_cleanup(padapter); -#endif //CONFIG_BR_EXT +#endif /* CONFIG_BR_EXT */ - // free cmd + /* free cmd */ rtw_free_cmd_obj(pcmd); - + exit: - -_func_exit_; + return; } void rtw_getmacreg_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd) { -_func_enter_; rtw_free_cmd_obj(pcmd); -_func_exit_; } -void rtw_joinbss_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd) +void rtw_joinbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd) { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -_func_enter_; - if(pcmd->res == H2C_DROPPED) - { - //TODO: cancel timer and do timeout handler directly... - //need to make timeout handlerOS independent + if (pcmd->res == H2C_DROPPED) { + /* TODO: cancel timer and do timeout handler directly... */ + /* need to make timeout handlerOS independent */ _set_timer(&pmlmepriv->assoc_timer, 1); - } - else if(pcmd->res != H2C_SUCCESS) - { + } else if (pcmd->res != H2C_SUCCESS) _set_timer(&pmlmepriv->assoc_timer, 1); - } rtw_free_cmd_obj(pcmd); - -_func_exit_; + } void rtw_create_ibss_post_hdl(_adapter *padapter, int status) -{ +{ _irqL irqL; u8 timer_cancelled; struct sta_info *psta = NULL; - struct wlan_network *pwlan = NULL; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *pwlan = NULL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; WLAN_BSSID_EX *pdev_network = &padapter->registrypriv.dev_network; struct wlan_network *mlme_cur_network = &(pmlmepriv->cur_network); @@ -4087,7 +4342,7 @@ void rtw_create_ibss_post_hdl(_adapter *padapter, int status) _enter_critical_bh(&pmlmepriv->lock, &irqL); - { + { _irqL irqL; pwlan = _rtw_alloc_network(pmlmepriv); @@ -4095,29 +4350,26 @@ void rtw_create_ibss_post_hdl(_adapter *padapter, int status) if (pwlan == NULL) { pwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue); if (pwlan == NULL) { - RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("Error: can't get pwlan in rtw_joinbss_event_callback\n")); _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); goto createbss_cmd_fail; } pwlan->last_scanned = rtw_get_current_time(); - } else { + } else rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue); - } pdev_network->Length = get_WLAN_BSSID_EX_sz(pdev_network); _rtw_memcpy(&(pwlan->network), pdev_network, pdev_network->Length); - //pwlan->fixed = _TRUE; + /* pwlan->fixed = _TRUE; */ /* copy pdev_network information to pmlmepriv->cur_network */ _rtw_memcpy(&mlme_cur_network->network, pdev_network, (get_WLAN_BSSID_EX_sz(pdev_network))); - #if 0 +#if 0 /* reset DSConfig */ mlme_cur_network->network.Configuration.DSConfig = (u32)rtw_ch2freq(pdev_network->Configuration.DSConfig); - #endif +#endif _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); /* we will set _FW_LINKED when there is one more sat to join us (rtw_stassoc_event_callback) */ } @@ -4130,52 +4382,45 @@ exit: -void rtw_setstaKey_cmdrsp_callback(_adapter* padapter , struct cmd_obj *pcmd) +void rtw_setstaKey_cmdrsp_callback(_adapter *padapter , struct cmd_obj *pcmd) { - - struct sta_priv * pstapriv = &padapter->stapriv; - struct set_stakey_rsp* psetstakey_rsp = (struct set_stakey_rsp*) (pcmd->rsp); - struct sta_info* psta = rtw_get_stainfo(pstapriv, psetstakey_rsp->addr); -_func_enter_; + struct sta_priv *pstapriv = &padapter->stapriv; + struct set_stakey_rsp *psetstakey_rsp = (struct set_stakey_rsp *)(pcmd->rsp); + struct sta_info *psta = rtw_get_stainfo(pstapriv, psetstakey_rsp->addr); - if(psta==NULL) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: rtw_setstaKey_cmdrsp_callback => can't get sta_info \n\n")); + + if (psta == NULL) { goto exit; } - - //psta->aid = psta->mac_id = psetstakey_rsp->keyid; //CAM_ID(CAM_ENTRY) - -exit: + + /* psta->aid = psta->mac_id = psetstakey_rsp->keyid; */ /* CAM_ID(CAM_ENTRY) */ + +exit: rtw_free_cmd_obj(pcmd); - -_func_exit_; + } -void rtw_setassocsta_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +void rtw_setassocsta_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd) { _irqL irqL; - struct sta_priv * pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct set_assocsta_parm* passocsta_parm = (struct set_assocsta_parm*)(pcmd->parmbuf); - struct set_assocsta_rsp* passocsta_rsp = (struct set_assocsta_rsp*) (pcmd->rsp); - struct sta_info* psta = rtw_get_stainfo(pstapriv, passocsta_parm->addr); + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct set_assocsta_parm *passocsta_parm = (struct set_assocsta_parm *)(pcmd->parmbuf); + struct set_assocsta_rsp *passocsta_rsp = (struct set_assocsta_rsp *)(pcmd->rsp); + struct sta_info *psta = rtw_get_stainfo(pstapriv, passocsta_parm->addr); -_func_enter_; - - if(psta==NULL) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: setassocsta_cmdrsp_callbac => can't get sta_info \n\n")); + + if (psta == NULL) { goto exit; } - + psta->aid = psta->mac_id = passocsta_rsp->cam_id; _enter_critical_bh(&pmlmepriv->lock, &irqL); - if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)) + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)) _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); set_fwstate(pmlmepriv, _FW_LINKED); @@ -4184,21 +4429,17 @@ _func_enter_; exit: rtw_free_cmd_obj(pcmd); -_func_exit_; } -void rtw_getrttbl_cmd_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd); -void rtw_getrttbl_cmd_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +void rtw_getrttbl_cmd_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +void rtw_getrttbl_cmd_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd) { -_func_enter_; rtw_free_cmd_obj(pcmd); #ifdef CONFIG_MP_INCLUDED if (padapter->registrypriv.mp_mode == 1) - padapter->mppriv.workparam.bcompleted=_TRUE; + padapter->mppriv.workparam.bcompleted = _TRUE; #endif -_func_exit_; } - diff --git a/core/rtw_debug.c b/core/rtw_debug.c old mode 100755 new mode 100644 index b321ea6..f32ba0b --- a/core/rtw_debug.c +++ b/core/rtw_debug.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -22,162 +22,159 @@ #include #include -u32 GlobalDebugLevel = _drv_err_; +#ifdef CONFIG_RTW_DEBUG +const char *rtw_log_level_str[] = { + "_DRV_NONE_ = 0", + "_DRV_ALWAYS_ = 1", + "_DRV_ERR_ = 2", + "_DRV_WARNING_ = 3", + "_DRV_INFO_ = 4", + "_DRV_DEBUG_ = 5", + "_DRV_MAX_ = 6", +}; +#endif #ifdef CONFIG_DEBUG_RTL871X - - u64 GlobalDebugComponents = \ - _module_rtl871x_xmit_c_ | - _module_xmit_osdep_c_ | - _module_rtl871x_recv_c_ | - _module_recv_osdep_c_ | - _module_rtl871x_mlme_c_ | - _module_mlme_osdep_c_ | - _module_rtl871x_sta_mgt_c_ | - _module_rtl871x_cmd_c_ | - _module_cmd_osdep_c_ | - _module_rtl871x_io_c_ | - _module_io_osdep_c_ | - _module_os_intfs_c_| - _module_rtl871x_security_c_| - _module_rtl871x_eeprom_c_| - _module_hal_init_c_| - _module_hci_hal_init_c_| - _module_rtl871x_ioctl_c_| - _module_rtl871x_ioctl_set_c_| - _module_rtl871x_ioctl_query_c_| - _module_rtl871x_pwrctrl_c_| - _module_hci_intfs_c_| - _module_hci_ops_c_| - _module_hci_ops_os_c_| - _module_rtl871x_ioctl_os_c| - _module_rtl8712_cmd_c_| - _module_hal_xmit_c_| - _module_rtl8712_recv_c_ | - _module_mp_ | - _module_efuse_; - + u64 GlobalDebugComponents = 0; #endif /* CONFIG_DEBUG_RTL871X */ #include #ifdef CONFIG_TDLS -#define TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE 41 + #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); - DBG_871X_SEL_NL(sel, "build time: %s %s\n", __DATE__, __TIME__); + RTW_PRINT_SEL(sel, "%s %s\n", DRV_NAME, DRIVERVERSION); + RTW_PRINT_SEL(sel, "build time: %s %s\n", __DATE__, __TIME__); } void dump_drv_cfg(void *sel) { char *kernel_version = utsname()->release; - - DBG_871X_SEL_NL(sel, "\nKernel Version: %s\n", kernel_version); - DBG_871X_SEL_NL(sel, "Driver Version: %s\n", DRIVERVERSION); - DBG_871X_SEL_NL(sel, "------------------------------------------------\n"); + + RTW_PRINT_SEL(sel, "\nKernel Version: %s\n", kernel_version); + RTW_PRINT_SEL(sel, "Driver Version: %s\n", DRIVERVERSION); + RTW_PRINT_SEL(sel, "------------------------------------------------\n"); #ifdef CONFIG_IOCTL_CFG80211 - DBG_871X_SEL_NL(sel, "CFG80211\n"); - #ifdef RTW_USE_CFG80211_STA_EVENT - DBG_871X_SEL_NL(sel, "RTW_USE_CFG80211_STA_EVENT\n"); - #endif + RTW_PRINT_SEL(sel, "CFG80211\n"); +#ifdef RTW_USE_CFG80211_STA_EVENT + RTW_PRINT_SEL(sel, "RTW_USE_CFG80211_STA_EVENT\n"); +#endif #else - DBG_871X_SEL_NL(sel, "WEXT\n"); + RTW_PRINT_SEL(sel, "WEXT\n"); #endif - DBG_871X_SEL_NL(sel, "DBG:%d\n", DBG); -#ifdef CONFIG_DEBUG - DBG_871X_SEL_NL(sel, "CONFIG_DEBUG\n"); + RTW_PRINT_SEL(sel, "DBG:%d\n", DBG); +#ifdef CONFIG_RTW_DEBUG + RTW_PRINT_SEL(sel, "CONFIG_RTW_DEBUG\n"); #endif #ifdef CONFIG_CONCURRENT_MODE - DBG_871X_SEL_NL(sel, "CONFIG_CONCURRENT_MODE\n"); + RTW_PRINT_SEL(sel, "CONFIG_CONCURRENT_MODE\n"); #endif #ifdef CONFIG_POWER_SAVING - DBG_871X_SEL_NL(sel, "CONFIG_POWER_SAVING\n"); + RTW_PRINT_SEL(sel, "CONFIG_POWER_SAVING\n"); #endif #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - DBG_871X_SEL_NL(sel, "LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH=%s\n", REALTEK_CONFIG_PATH); - #ifdef CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY - DBG_871X_SEL_NL(sel, "CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY\n"); - #endif - #ifdef CONFIG_CALIBRATE_TX_POWER_TO_MAX - DBG_871X_SEL_NL(sel, "CONFIG_CALIBRATE_TX_POWER_TO_MAX\n"); + RTW_PRINT_SEL(sel, "LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH=%s\n", REALTEK_CONFIG_PATH); + #if defined(CONFIG_MULTIDRV) || defined(REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER) + RTW_PRINT_SEL(sel, "LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER\n"); #endif +#ifdef CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY + RTW_PRINT_SEL(sel, "CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY\n"); +#endif +#ifdef CONFIG_CALIBRATE_TX_POWER_TO_MAX + RTW_PRINT_SEL(sel, "CONFIG_CALIBRATE_TX_POWER_TO_MAX\n"); +#endif #endif #ifdef CONFIG_DISABLE_ODM - DBG_871X_SEL_NL(sel, "CONFIG_DISABLE_ODM\n"); + RTW_PRINT_SEL(sel, "CONFIG_DISABLE_ODM\n"); #endif #ifdef CONFIG_MINIMAL_MEMORY_USAGE - DBG_871X_SEL_NL(sel, "CONFIG_MINIMAL_MEMORY_USAGE\n"); + RTW_PRINT_SEL(sel, "CONFIG_MINIMAL_MEMORY_USAGE\n"); #endif - DBG_871X_SEL_NL(sel, "CONFIG_RTW_ADAPTIVITY_EN = %d\n", CONFIG_RTW_ADAPTIVITY_EN); + RTW_PRINT_SEL(sel, "CONFIG_RTW_ADAPTIVITY_EN = %d\n", CONFIG_RTW_ADAPTIVITY_EN); #if (CONFIG_RTW_ADAPTIVITY_EN) - DBG_871X_SEL_NL(sel, "ADAPTIVITY_MODE = %s\n", (CONFIG_RTW_ADAPTIVITY_MODE) ? "carrier_sense" : "normal"); + RTW_PRINT_SEL(sel, "ADAPTIVITY_MODE = %s\n", (CONFIG_RTW_ADAPTIVITY_MODE) ? "carrier_sense" : "normal"); #endif #ifdef CONFIG_WOWLAN - DBG_871X_SEL_NL(sel, "CONFIG_WOWLAN - "); + RTW_PRINT_SEL(sel, "CONFIG_WOWLAN - "); - #ifdef CONFIG_GPIO_WAKEUP - DBG_871X_SEL_NL(sel, "CONFIG_GPIO_WAKEUP - WAKEUP_GPIO_IDX:%d\n", WAKEUP_GPIO_IDX); - #endif -#endif +#ifdef CONFIG_GPIO_WAKEUP + RTW_PRINT_SEL(sel, "CONFIG_GPIO_WAKEUP - WAKEUP_GPIO_IDX:%d\n", WAKEUP_GPIO_IDX); +#endif +#endif + +#ifdef CONFIG_TDLS + RTW_PRINT_SEL(sel, "CONFIG_TDLS\n"); +#endif #ifdef CONFIG_USB_HCI - #ifdef CONFIG_SUPPORT_USB_INT - DBG_871X_SEL_NL(sel, "CONFIG_SUPPORT_USB_INT\n"); - #endif - #ifdef CONFIG_USB_INTERRUPT_IN_PIPE - DBG_871X_SEL_NL(sel, "CONFIG_USB_INTERRUPT_IN_PIPE\n"); - #endif - #ifdef CONFIG_USB_TX_AGGREGATION - DBG_871X_SEL_NL(sel, "CONFIG_USB_TX_AGGREGATION\n"); - #endif - #ifdef CONFIG_USB_RX_AGGREGATION - DBG_871X_SEL_NL(sel, "CONFIG_USB_RX_AGGREGATION\n"); - #endif - #ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX - DBG_871X_SEL_NL(sel, "CONFIG_USE_USB_BUFFER_ALLOC_TX\n"); - #endif - #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX - DBG_871X_SEL_NL(sel, "CONFIG_USE_USB_BUFFER_ALLOC_RX\n"); - #endif - #ifdef CONFIG_PREALLOC_RECV_SKB - DBG_871X_SEL_NL(sel, "CONFIG_PREALLOC_RECV_SKB\n"); - #endif - #ifdef CONFIG_FIX_NR_BULKIN_BUFFER - DBG_871X_SEL_NL(sel, "CONFIG_FIX_NR_BULKIN_BUFFER\n"); - #endif +#ifdef CONFIG_SUPPORT_USB_INT + RTW_PRINT_SEL(sel, "CONFIG_SUPPORT_USB_INT\n"); +#endif +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + RTW_PRINT_SEL(sel, "CONFIG_USB_INTERRUPT_IN_PIPE\n"); +#endif +#ifdef CONFIG_USB_TX_AGGREGATION + RTW_PRINT_SEL(sel, "CONFIG_USB_TX_AGGREGATION\n"); +#endif +#ifdef CONFIG_USB_RX_AGGREGATION + RTW_PRINT_SEL(sel, "CONFIG_USB_RX_AGGREGATION\n"); +#endif +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX + RTW_PRINT_SEL(sel, "CONFIG_USE_USB_BUFFER_ALLOC_TX\n"); +#endif +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + RTW_PRINT_SEL(sel, "CONFIG_USE_USB_BUFFER_ALLOC_RX\n"); +#endif +#ifdef CONFIG_PREALLOC_RECV_SKB + RTW_PRINT_SEL(sel, "CONFIG_PREALLOC_RECV_SKB\n"); +#endif +#ifdef CONFIG_FIX_NR_BULKIN_BUFFER + RTW_PRINT_SEL(sel, "CONFIG_FIX_NR_BULKIN_BUFFER\n"); +#endif #endif /*CONFIG_USB_HCI*/ - + #ifdef CONFIG_SDIO_HCI - #ifdef CONFIG_TX_AGGREGATION - DBG_871X_SEL_NL(sel, "CONFIG_TX_AGGREGATION\n"); - #endif - #ifdef CONFIG_RX_AGGREGATION - DBG_871X_SEL_NL(sel, "CONFIG_RX_AGGREGATION\n"); - #endif +#ifdef CONFIG_TX_AGGREGATION + RTW_PRINT_SEL(sel, "CONFIG_TX_AGGREGATION\n"); +#endif +#ifdef CONFIG_RX_AGGREGATION + RTW_PRINT_SEL(sel, "CONFIG_RX_AGGREGATION\n"); +#endif #endif /*CONFIG_SDIO_HCI*/ #ifdef CONFIG_PCI_HCI #endif - - DBG_871X_SEL_NL(sel, "MAX_XMITBUF_SZ = %d\n", MAX_XMITBUF_SZ); - DBG_871X_SEL_NL(sel, "MAX_RECVBUF_SZ = %d\n", MAX_RECVBUF_SZ); - + + RTW_PRINT_SEL(sel, "MAX_XMITBUF_SZ = %d\n", MAX_XMITBUF_SZ); + RTW_PRINT_SEL(sel, "MAX_RECVBUF_SZ = %d\n", MAX_RECVBUF_SZ); + } void dump_log_level(void *sel) { - DBG_871X_SEL_NL(sel, "log_level:%d\n", GlobalDebugLevel); +#ifdef CONFIG_RTW_DEBUG + int i; + + RTW_PRINT_SEL(sel, "drv_log_level:%d\n", rtw_drv_log_level); + for (i = 0; i <= _DRV_MAX_; i++) { + if (rtw_log_level_str[i]) + RTW_PRINT_SEL(sel, "%c %s = %d\n", + (rtw_drv_log_level == i) ? '+' : ' ', rtw_log_level_str[i], i); + } +#else + RTW_PRINT_SEL(sel, "CONFIG_RTW_DEBUG is disabled\n"); +#endif } #ifdef CONFIG_SDIO_HCI @@ -185,17 +182,16 @@ void sd_f0_reg_dump(void *sel, _adapter *adapter) { int i; - for(i=0x0;i<=0xff;i++) - { - if(i%16==0) - DBG_871X_SEL_NL(sel, "0x%02x ",i); + for (i = 0x0; i <= 0xff; i++) { + if (i % 16 == 0) + RTW_PRINT_SEL(sel, "0x%02x ", i); - DBG_871X_SEL(sel, "%02x ", rtw_sd_f0_read8(adapter, i)); + _RTW_PRINT_SEL(sel, "%02x ", rtw_sd_f0_read8(adapter, i)); - if(i%16==15) - DBG_871X_SEL(sel, "\n"); - else if(i%8==7) - DBG_871X_SEL(sel, "\t"); + if (i % 16 == 15) + _RTW_PRINT_SEL(sel, "\n"); + else if (i % 8 == 7) + _RTW_PRINT_SEL(sel, "\t"); } } @@ -205,10 +201,10 @@ void sdio_local_reg_dump(void *sel, _adapter *adapter) for (i = 0x0; i < 0x100; i += 4) { if (j % 4 == 1) - DBG_871X_SEL_NL(sel, "0x%02x", i); - DBG_871X_SEL(sel, " 0x%08x ", rtw_read32(adapter, (0x1025 << 16) | i)); + RTW_PRINT_SEL(sel, "0x%02x", i); + _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, (0x1025 << 16) | i)); if ((j++) % 4 == 0) - DBG_871X_SEL(sel, "\n"); + _RTW_PRINT_SEL(sel, "\n"); } } #endif /* CONFIG_SDIO_HCI */ @@ -217,44 +213,61 @@ void mac_reg_dump(void *sel, _adapter *adapter) { int i, j = 1; - DBG_871X_SEL_NL(sel, "======= MAC REG =======\n"); + RTW_PRINT_SEL(sel, "======= MAC REG =======\n"); - for(i=0x0;i<0x800;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"); + for (i = 0x0; i < 0x800; i += 4) { + if (j % 4 == 1) + RTW_PRINT_SEL(sel, "0x%03x", i); + _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i)); + if ((j++) % 4 == 0) + _RTW_PRINT_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"); + for (i = 0x1000; i < 0x1650; i += 4) { + if (j % 4 == 1) + RTW_PRINT_SEL(sel, "0x%03x", i); + _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i)); + if ((j++) % 4 == 0) + _RTW_PRINT_SEL(sel, "\n"); } } #endif /* CONFIG_RTL8814A */ + +#ifdef CONFIG_RTL8822B + for (i = 0x1000; i < 0x1800; i += 4) { + if (j % 4 == 1) + RTW_PRINT_SEL(sel, "0x%03x", i); + _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i)); + if ((j++) % 4 == 0) + _RTW_PRINT_SEL(sel, "\n"); + } +#endif /* CONFIG_RTL8822B */ } void bb_reg_dump(void *sel, _adapter *adapter) { int i, j = 1; - DBG_871X_SEL_NL(sel, "======= BB REG =======\n"); - for(i=0x800;i<0x1000;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"); + RTW_PRINT_SEL(sel, "======= BB REG =======\n"); + for (i = 0x800; i < 0x1000; i += 4) { + if (j % 4 == 1) + RTW_PRINT_SEL(sel, "0x%03x", i); + _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i)); + if ((j++) % 4 == 0) + _RTW_PRINT_SEL(sel, "\n"); } + +#ifdef CONFIG_RTL8822B + for (i = 0x1800; i < 0x2000; i += 4) { + if (j % 4 == 1) + RTW_PRINT_SEL(sel, "0x%03x", i); + _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i)); + if ((j++) % 4 == 0) + _RTW_PRINT_SEL(sel, "\n"); + } +#endif /* CONFIG_RTL8822B */ } void rf_reg_dump(void *sel, _adapter *adapter) @@ -265,22 +278,22 @@ void rf_reg_dump(void *sel, _adapter *adapter) u8 path_nums = 0; rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - if((RF_1T2R == rf_type) ||(RF_1T1R ==rf_type )) + if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type)) path_nums = 1; else path_nums = 2; - DBG_871X_SEL_NL(sel, "======= RF REG =======\n"); + RTW_PRINT_SEL(sel, "======= RF REG =======\n"); - for (path=0;pathrecvpriv); - if( precvpriv->sink_udpport > 0) - { - if(*((u16*)((pkt->data)+0x24)) == cpu_to_be16(precvpriv->sink_udpport)) - { - precvpriv->pre_rtp_rxseq= precvpriv->cur_rtp_rxseq; - precvpriv->cur_rtp_rxseq = be16_to_cpu(*((u16*)((pkt->data)+0x2C))); - if( precvpriv->pre_rtp_rxseq+1 != precvpriv->cur_rtp_rxseq) - DBG_871X("%s : RTP Seq num from %d to %d\n",__FUNCTION__,precvpriv->pre_rtp_rxseq,precvpriv->cur_rtp_rxseq); + if (precvpriv->sink_udpport > 0) { + if (*((u16 *)((pkt->data) + 0x24)) == cpu_to_be16(precvpriv->sink_udpport)) { + precvpriv->pre_rtp_rxseq = precvpriv->cur_rtp_rxseq; + precvpriv->cur_rtp_rxseq = be16_to_cpu(*((u16 *)((pkt->data) + 0x2C))); + if (precvpriv->pre_rtp_rxseq + 1 != precvpriv->cur_rtp_rxseq) + RTW_INFO("%s : RTP Seq num from %d to %d\n", __FUNCTION__, precvpriv->pre_rtp_rxseq, precvpriv->cur_rtp_rxseq); } } } @@ -350,10 +361,49 @@ void sta_rx_reorder_ctl_dump(void *sel, struct sta_info *sta) 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" + RTW_PRINT_SEL(sel, "tid=%d, enable=%d, ampdu_size=%u, indicate_seq=%u\n" , i, reorder_ctl->enable, reorder_ctl->ampdu_size, reorder_ctl->indicate_seq + ); + } + } +} + +void dump_tx_rate_bmp(void *sel, struct dvobj_priv *dvobj) +{ + _adapter *adapter = dvobj_get_primary_adapter(dvobj); + struct rf_ctl_t *rfctl = dvobj_to_rfctl(dvobj); + u8 bw; + + RTW_PRINT_SEL(sel, "%-6s", "bw"); + if (hal_chk_proto_cap(adapter, PROTO_CAP_11AC)) + _RTW_PRINT_SEL(sel, " %-11s", "vht"); + + _RTW_PRINT_SEL(sel, " %-11s %-4s %-3s\n", "ht", "ofdm", "cck"); + + for (bw = CHANNEL_WIDTH_20; bw <= CHANNEL_WIDTH_160; bw++) { + if (!hal_is_bw_support(adapter, bw)) + continue; + + RTW_PRINT_SEL(sel, "%6s", ch_width_str(bw)); + if (hal_chk_proto_cap(adapter, PROTO_CAP_11AC)) { + _RTW_PRINT_SEL(sel, " %03x %03x %03x" + , RATE_BMP_GET_VHT_3SS(rfctl->rate_bmp_vht_by_bw[bw]) + , RATE_BMP_GET_VHT_2SS(rfctl->rate_bmp_vht_by_bw[bw]) + , RATE_BMP_GET_VHT_1SS(rfctl->rate_bmp_vht_by_bw[bw]) ); } + + _RTW_PRINT_SEL(sel, " %02x %02x %02x %02x" + , bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_4SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0 + , bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_3SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0 + , bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_2SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0 + , bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_1SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0 + ); + + _RTW_PRINT_SEL(sel, " %03x %01x\n" + , bw <= CHANNEL_WIDTH_20 ? RATE_BMP_GET_OFDM(rfctl->rate_bmp_cck_ofdm) : 0 + , bw <= CHANNEL_WIDTH_20 ? RATE_BMP_GET_CCK(rfctl->rate_bmp_cck_ofdm) : 0 + ); } } @@ -364,58 +414,118 @@ void dump_adapters_status(void *sel, struct dvobj_priv *dvobj) _adapter *iface; u8 u_ch, u_bw, u_offset; - DBG_871X_SEL_NL(sel, "%-2s %-8s %-17s %-4s %-7s %s\n" + dump_mi_status(sel, dvobj); + + RTW_PRINT_SEL(sel, "%-2s %-8s %-17s %-4s %-7s %s\n" , "id", "ifname", "macaddr", "port", "ch", "status"); - DBG_871X_SEL_NL(sel, "------------------------------------------\n"); + RTW_PRINT_SEL(sel, "------------------------------------------\n"); for (i = 0; i < dvobj->iface_nums; i++) { iface = dvobj->padapters[i]; if (iface) { - DBG_871X_SEL_NL(sel, "%2d %-8s "MAC_FMT" %4hhu %3u,%u,%u "MLME_STATE_FMT" %s%s\n" + RTW_PRINT_SEL(sel, "%2d %-8s "MAC_FMT" %4hhu %3u,%u,%u "MLME_STATE_FMT" %s%s\n" , i, ADPT_ARG(iface) , MAC_ARG(adapter_mac_addr(iface)) - , get_iface_type(iface) + , get_hw_port(iface) , iface->mlmeextpriv.cur_channel , iface->mlmeextpriv.cur_bwmode , iface->mlmeextpriv.cur_ch_offset - , ADPT_MLME_S_ARG(iface) - , rtw_is_surprise_removed(iface)?" SR":"" - , rtw_is_drv_stopped(iface)?" DS":"" + , MLME_STATE_ARG(iface) + , rtw_is_surprise_removed(iface) ? " SR" : "" + , rtw_is_drv_stopped(iface) ? " DS" : "" ); } } - DBG_871X_SEL_NL(sel, "------------------------------------------\n"); + RTW_PRINT_SEL(sel, "------------------------------------------\n"); - rtw_get_ch_setting_union(dvobj->padapters[IFACE_ID0], &u_ch, &u_bw, &u_offset); - DBG_871X_SEL_NL(sel, "%34s %3u,%u,%u\n" + rtw_mi_get_ch_setting_union(dvobj_get_primary_adapter(dvobj), &u_ch, &u_bw, &u_offset); + RTW_PRINT_SEL(sel, "%34s %3u,%u,%u\n" , "union:" , u_ch, u_bw, u_offset ); - DBG_871X_SEL_NL(sel, "%34s %3u,%u,%u\n" + RTW_PRINT_SEL(sel, "%34s %3u,%u,%u\n" , "oper:" , dvobj->oper_channel , dvobj->oper_bwmode , dvobj->oper_ch_offset ); - #ifdef CONFIG_DFS_MASTER +#ifdef CONFIG_DFS_MASTER if (rfctl->radar_detect_ch != 0) { - DBG_871X_SEL_NL(sel, "%34s %3u,%u,%u" + u32 non_ocp_ms; + u32 cac_ms; + + for (i = 0; i < dvobj->iface_nums; i++) { + if (!dvobj->padapters[i]) + continue; + if (check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_AP_STATE) + && check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_ASOC_STATE)) + break; + } + + if (i >= dvobj->iface_nums) { + RTW_PRINT_SEL(sel, "DFS master enable without AP mode???"); + goto end_dfs_master; + } + + RTW_PRINT_SEL(sel, "%34s %3u,%u,%u" , "radar_detect:" , rfctl->radar_detect_ch , rfctl->radar_detect_bw , rfctl->radar_detect_offset ); - if (IS_UNDER_CAC(rfctl)) - DBG_871X_SEL(sel, ", cac:%d\n", rtw_systime_to_ms(rfctl->cac_end_time - rtw_get_current_time())); - else - DBG_871X_SEL(sel, "\n"); + _RTW_PRINT_SEL(sel, ", domain:%u", rtw_odm_get_dfs_domain(dvobj->padapters[IFACE_ID0])); + + rtw_get_ch_waiting_ms(dvobj->padapters[i] + , rfctl->radar_detect_ch + , rfctl->radar_detect_bw + , rfctl->radar_detect_offset + , &non_ocp_ms + , &cac_ms + ); + + if (non_ocp_ms) + _RTW_PRINT_SEL(sel, ", non_ocp:%d", non_ocp_ms); + if (cac_ms) + _RTW_PRINT_SEL(sel, ", cac:%d", cac_ms); +end_dfs_master: + _RTW_PRINT_SEL(sel, "\n"); } - #endif +#endif /* CONFIG_DFS_MASTER */ +} + +void dump_adapters_info(void *sel, struct dvobj_priv *dvobj) +{ + int i; + _adapter *iface; + u8 u_ch, u_bw, u_offset; + + RTW_PRINT_SEL(sel, "%-8s %-8s %-4s %-4s %-8s %-8s\n" + , "iface_id", "ifname", "port", "bup ", "netif_up", "net_closed"); + + RTW_PRINT_SEL(sel, "------------------------\n"); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if (iface) { + RTW_PRINT_SEL(sel, "%2d %-8s %u %s,%s,%s %s%s\n" + , iface->iface_id + , ADPT_ARG(iface) + , get_hw_port(iface) + , (iface->bup) ? " TRUE" : " FALSE" + , (iface->netif_up) ? " TRUE" : " FALSE" + , (iface->net_closed) ? " TRUE" : " FALSE" + , rtw_is_surprise_removed(iface) ? " SR" : "" + , rtw_is_drv_stopped(iface) ? " DS" : "" + ); + } + } + + RTW_PRINT_SEL(sel, "------------------------\n"); } #define SEC_CAM_ENT_ID_TITLE_FMT "%-2s" @@ -439,21 +549,19 @@ void dump_adapters_status(void *sel, struct dvobj_priv *dvobj) void dump_sec_cam_ent(void *sel, struct sec_cam_ent *ent, int id) { if (id >= 0) { - DBG_871X_SEL_NL(sel, SEC_CAM_ENT_ID_VALUE_FMT " " SEC_CAM_ENT_VALUE_FMT"\n" + RTW_PRINT_SEL(sel, SEC_CAM_ENT_ID_VALUE_FMT " " SEC_CAM_ENT_VALUE_FMT"\n" , SEC_CAM_ENT_ID_VALUE_ARG(id), SEC_CAM_ENT_VALUE_ARG(ent)); - } else { - DBG_871X_SEL_NL(sel, SEC_CAM_ENT_VALUE_FMT"\n", SEC_CAM_ENT_VALUE_ARG(ent)); - } + } else + RTW_PRINT_SEL(sel, SEC_CAM_ENT_VALUE_FMT"\n", SEC_CAM_ENT_VALUE_ARG(ent)); } void dump_sec_cam_ent_title(void *sel, u8 has_id) { if (has_id) { - DBG_871X_SEL_NL(sel, SEC_CAM_ENT_ID_TITLE_FMT " " SEC_CAM_ENT_TITLE_FMT"\n" + RTW_PRINT_SEL(sel, SEC_CAM_ENT_ID_TITLE_FMT " " SEC_CAM_ENT_TITLE_FMT"\n" , SEC_CAM_ENT_ID_TITLE_ARG, SEC_CAM_ENT_TITLE_ARG); - } else { - DBG_871X_SEL_NL(sel, SEC_CAM_ENT_TITLE_FMT"\n", SEC_CAM_ENT_TITLE_ARG); - } + } else + RTW_PRINT_SEL(sel, SEC_CAM_ENT_TITLE_FMT"\n", SEC_CAM_ENT_TITLE_ARG); } void dump_sec_cam(void *sel, _adapter *adapter) @@ -463,7 +571,7 @@ void dump_sec_cam(void *sel, _adapter *adapter) struct sec_cam_ent ent; int i; - DBG_871X_SEL_NL(sel, "HW sec cam:\n"); + RTW_PRINT_SEL(sel, "HW sec cam:\n"); dump_sec_cam_ent_title(sel, 1); for (i = 0; i < cam_ctl->num; i++) { rtw_sec_read_cam_ent(adapter, i, (u8 *)(&ent.ctrl), ent.mac, ent.key); @@ -471,6 +579,21 @@ void dump_sec_cam(void *sel, _adapter *adapter) } } +void dump_sec_cam_cache(void *sel, _adapter *adapter) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl; + int i; + + RTW_PRINT_SEL(sel, "SW sec cam cache:\n"); + dump_sec_cam_ent_title(sel, 1); + for (i = 0; i < cam_ctl->num; i++) { + if (dvobj->cam_cache[i].ctrl != 0) + dump_sec_cam_ent(sel, &dvobj->cam_cache[i], i); + } + +} + #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) { @@ -479,11 +602,10 @@ ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t char tmp[32]; u32 addr, val, len; - if (count < 3) - { - DBG_871X("argument size is less than 3\n"); + if (count < 3) { + RTW_INFO("argument size is less than 3\n"); return -EFAULT; - } + } if (count > sizeof(tmp)) { rtw_warn_on(1); @@ -495,59 +617,57 @@ ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t int num = sscanf(tmp, "%x %x %x", &addr, &val, &len); if (num != 3) { - DBG_871X("invalid write_reg parameter!\n"); + RTW_INFO("invalid write_reg parameter!\n"); return count; } - switch(len) - { - case 1: - rtw_write8(padapter, addr, (u8)val); - break; - case 2: - rtw_write16(padapter, addr, (u16)val); - break; - case 4: - rtw_write32(padapter, addr, val); - break; - default: - DBG_871X("error write length=%d", len); - break; - } - + switch (len) { + case 1: + rtw_write8(padapter, addr, (u8)val); + break; + case 2: + rtw_write16(padapter, addr, (u16)val); + break; + case 4: + rtw_write32(padapter, addr, val); + break; + default: + RTW_INFO("error write length=%d", len); + break; + } + } - + return count; - + } -static u32 proc_get_read_addr=0xeeeeeeee; -static u32 proc_get_read_len=0x4; +static u32 proc_get_read_addr = 0xeeeeeeee; +static u32 proc_get_read_len = 0x4; int proc_get_read_reg(struct seq_file *m, void *v) { struct net_device *dev = m->private; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - if (proc_get_read_addr==0xeeeeeeee) { - DBG_871X_SEL_NL(m, "address not initialized\n"); + if (proc_get_read_addr == 0xeeeeeeee) { + RTW_PRINT_SEL(m, "address not initialized\n"); return 0; - } + } - switch(proc_get_read_len) - { - case 1: - DBG_871X_SEL_NL(m, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr)); - break; - case 2: - DBG_871X_SEL_NL(m, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr)); - break; - case 4: - DBG_871X_SEL_NL(m, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr)); - break; - default: - DBG_871X_SEL_NL(m, "error read length=%d\n", proc_get_read_len); - break; + switch (proc_get_read_len) { + case 1: + RTW_PRINT_SEL(m, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr)); + break; + case 2: + RTW_PRINT_SEL(m, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr)); + break; + case 4: + RTW_PRINT_SEL(m, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr)); + break; + default: + RTW_PRINT_SEL(m, "error read length=%d\n", proc_get_read_len); + break; } return 0; @@ -559,11 +679,10 @@ ssize_t proc_set_read_reg(struct file *file, const char __user *buffer, size_t c char tmp[16]; u32 addr, len; - if (count < 2) - { - DBG_871X("argument size is less than 2\n"); + if (count < 2) { + RTW_INFO("argument size is less than 2\n"); return -EFAULT; - } + } if (count > sizeof(tmp)) { rtw_warn_on(1); @@ -575,15 +694,15 @@ ssize_t proc_set_read_reg(struct file *file, const char __user *buffer, size_t c int num = sscanf(tmp, "%x %x", &addr, &len); if (num != 2) { - DBG_871X("invalid read_reg parameter!\n"); + RTW_INFO("invalid read_reg parameter!\n"); return count; } proc_get_read_addr = addr; - + proc_get_read_len = len; } - + return count; } @@ -594,7 +713,7 @@ int proc_get_fwstate(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - DBG_871X_SEL_NL(m, "fwstate=0x%x\n", get_fwstate(pmlmepriv)); + RTW_PRINT_SEL(m, "fwstate=0x%x\n", get_fwstate(pmlmepriv)); return 0; } @@ -602,29 +721,29 @@ int proc_get_fwstate(struct seq_file *m, void *v) int proc_get_sec_info(struct seq_file *m, void *v) { struct net_device *dev = m->private; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct security_priv *sec = &padapter->securitypriv; - DBG_871X_SEL_NL(m, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n", - sec->dot11AuthAlgrthm, sec->dot11PrivacyAlgrthm, - sec->ndisauthtype, sec->ndisencryptstatus); + RTW_PRINT_SEL(m, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n", + sec->dot11AuthAlgrthm, sec->dot11PrivacyAlgrthm, + sec->ndisauthtype, sec->ndisencryptstatus); - DBG_871X_SEL_NL(m, "hw_decrypted=%d\n", sec->hw_decrypted); + RTW_PRINT_SEL(m, "hw_decrypted=%d\n", sec->hw_decrypted); #ifdef DBG_SW_SEC_CNT - DBG_871X_SEL_NL(m, "wep_sw_enc_cnt=%llu, %llu, %llu\n" + RTW_PRINT_SEL(m, "wep_sw_enc_cnt=%llu, %llu, %llu\n" , sec->wep_sw_enc_cnt_bc , sec->wep_sw_enc_cnt_mc, sec->wep_sw_enc_cnt_uc); - DBG_871X_SEL_NL(m, "wep_sw_dec_cnt=%llu, %llu, %llu\n" + RTW_PRINT_SEL(m, "wep_sw_dec_cnt=%llu, %llu, %llu\n" , sec->wep_sw_dec_cnt_bc , sec->wep_sw_dec_cnt_mc, sec->wep_sw_dec_cnt_uc); - DBG_871X_SEL_NL(m, "tkip_sw_enc_cnt=%llu, %llu, %llu\n" - , sec->tkip_sw_enc_cnt_bc , sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc); - DBG_871X_SEL_NL(m, "tkip_sw_dec_cnt=%llu, %llu, %llu\n" + RTW_PRINT_SEL(m, "tkip_sw_enc_cnt=%llu, %llu, %llu\n" + , sec->tkip_sw_enc_cnt_bc , sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc); + RTW_PRINT_SEL(m, "tkip_sw_dec_cnt=%llu, %llu, %llu\n" , sec->tkip_sw_dec_cnt_bc , sec->tkip_sw_dec_cnt_mc, sec->tkip_sw_dec_cnt_uc); - DBG_871X_SEL_NL(m, "aes_sw_enc_cnt=%llu, %llu, %llu\n" + RTW_PRINT_SEL(m, "aes_sw_enc_cnt=%llu, %llu, %llu\n" , sec->aes_sw_enc_cnt_bc , sec->aes_sw_enc_cnt_mc, sec->aes_sw_enc_cnt_uc); - DBG_871X_SEL_NL(m, "aes_sw_dec_cnt=%llu, %llu, %llu\n" + RTW_PRINT_SEL(m, "aes_sw_dec_cnt=%llu, %llu, %llu\n" , sec->aes_sw_dec_cnt_bc , sec->aes_sw_dec_cnt_mc, sec->aes_sw_dec_cnt_uc); #endif /* DBG_SW_SEC_CNT */ @@ -634,11 +753,11 @@ int proc_get_sec_info(struct seq_file *m, void *v) int proc_get_mlmext_state(struct seq_file *m, void *v) { struct net_device *dev = m->private; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - DBG_871X_SEL_NL(m, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state); + RTW_PRINT_SEL(m, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state); return 0; } @@ -649,7 +768,7 @@ int proc_get_roam_flags(struct seq_file *m, void *v) struct net_device *dev = m->private; _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); - DBG_871X_SEL_NL(m, "0x%02x\n", rtw_roam_flags(adapter)); + RTW_PRINT_SEL(m, "0x%02x\n", rtw_roam_flags(adapter)); return 0; } @@ -677,9 +796,9 @@ ssize_t proc_set_roam_flags(struct file *file, const char __user *buffer, size_t if (num == 1) rtw_assign_roam_flags(adapter, flags); } - + return count; - + } int proc_get_roam_param(struct seq_file *m, void *v) @@ -688,8 +807,8 @@ int proc_get_roam_param(struct seq_file *m, void *v) _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); struct mlme_priv *mlme = &adapter->mlmepriv; - DBG_871X_SEL_NL(m, "%12s %12s %11s\n", "rssi_diff_th", "scanr_exp_ms", "scan_int_ms"); - DBG_871X_SEL_NL(m, "%-12u %-12u %-11u\n" + RTW_PRINT_SEL(m, "%12s %12s %11s\n", "rssi_diff_th", "scanr_exp_ms", "scan_int_ms"); + RTW_PRINT_SEL(m, "%-12u %-12u %-11u\n" , mlme->roam_rssi_diff_th , mlme->roam_scanr_exp_ms , mlme->roam_scan_int_ms @@ -728,9 +847,9 @@ ssize_t proc_set_roam_param(struct file *file, const char __user *buffer, size_t if (num >= 3) mlme->roam_scan_int_ms = scan_int_ms; } - + return count; - + } ssize_t proc_set_roam_tgt_addr(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) @@ -751,11 +870,11 @@ ssize_t proc_set_roam_tgt_addr(struct file *file, const char __user *buffer, siz if (buffer && !copy_from_user(tmp, buffer, count)) { - int num = sscanf(tmp, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", addr, addr+1, addr+2, addr+3, addr+4, addr+5); + int num = sscanf(tmp, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", addr, addr + 1, addr + 2, addr + 3, addr + 4, addr + 5); if (num == 6) _rtw_memcpy(adapter->mlmepriv.roam_tgt_addr, addr, ETH_ALEN); - DBG_871X("set roam_tgt_addr to "MAC_FMT"\n", MAC_ARG(adapter->mlmepriv.roam_tgt_addr)); + RTW_INFO("set roam_tgt_addr to "MAC_FMT"\n", MAC_ARG(adapter->mlmepriv.roam_tgt_addr)); } return count; @@ -768,7 +887,7 @@ int proc_get_qos_option(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - DBG_871X_SEL_NL(m, "qos_option=%d\n", pmlmepriv->qospriv.qos_option); + RTW_PRINT_SEL(m, "qos_option=%d\n", pmlmepriv->qospriv.qos_option); return 0; } @@ -778,10 +897,10 @@ int proc_get_ht_option(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); - + #ifdef CONFIG_80211N_HT - DBG_871X_SEL_NL(m, "ht_option=%d\n", pmlmepriv->htpriv.ht_option); -#endif //CONFIG_80211N_HT + RTW_PRINT_SEL(m, "ht_option=%d\n", pmlmepriv->htpriv.ht_option); +#endif /* CONFIG_80211N_HT */ return 0; } @@ -789,14 +908,14 @@ int proc_get_ht_option(struct seq_file *m, void *v) int proc_get_rf_info(struct seq_file *m, void *v) { struct net_device *dev = m->private; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - DBG_871X_SEL_NL(m, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n", - pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); - - DBG_871X_SEL_NL(m, "oper_ch=%d, oper_bw=%d, oper_ch_offet=%d\n", - rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter)); + RTW_PRINT_SEL(m, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n", + pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); + + RTW_PRINT_SEL(m, "oper_ch=%d, oper_bw=%d, oper_ch_offet=%d\n", + rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter)); return 0; } @@ -813,29 +932,29 @@ int proc_get_scan_param(struct seq_file *m, void *v) #define SCAN_PARAM_TITLE_ARG , "scan_ch_ms" #define SCAN_PARAM_VALUE_ARG , ss->scan_ch_ms #ifdef CONFIG_80211N_HT - #define SCAN_PARAM_TITLE_FMT_HT " %15s %13s" - #define SCAN_PARAM_VALUE_FMT_HT " %-15u %-13u" - #define SCAN_PARAM_TITLE_ARG_HT , "rx_ampdu_accept", "rx_ampdu_size" - #define SCAN_PARAM_VALUE_ARG_HT , ss->rx_ampdu_accept, ss->rx_ampdu_size +#define SCAN_PARAM_TITLE_FMT_HT " %15s %13s" +#define SCAN_PARAM_VALUE_FMT_HT " %-15u %-13u" +#define SCAN_PARAM_TITLE_ARG_HT , "rx_ampdu_accept", "rx_ampdu_size" +#define SCAN_PARAM_VALUE_ARG_HT , ss->rx_ampdu_accept, ss->rx_ampdu_size #else - #define SCAN_PARAM_TITLE_FMT_HT "" - #define SCAN_PARAM_VALUE_FMT_HT "" - #define SCAN_PARAM_TITLE_ARG_HT - #define SCAN_PARAM_VALUE_ARG_HT +#define SCAN_PARAM_TITLE_FMT_HT "" +#define SCAN_PARAM_VALUE_FMT_HT "" +#define SCAN_PARAM_TITLE_ARG_HT +#define SCAN_PARAM_VALUE_ARG_HT #endif #ifdef CONFIG_SCAN_BACKOP - #define SCAN_PARAM_TITLE_FMT_BACKOP " %9s %12s" - #define SCAN_PARAM_VALUE_FMT_BACKOP " %-9u %-12u" - #define SCAN_PARAM_TITLE_ARG_BACKOP , "backop_ms", "scan_cnt_max" - #define SCAN_PARAM_VALUE_ARG_BACKOP , ss->backop_ms, ss->scan_cnt_max +#define SCAN_PARAM_TITLE_FMT_BACKOP " %9s %12s" +#define SCAN_PARAM_VALUE_FMT_BACKOP " %-9u %-12u" +#define SCAN_PARAM_TITLE_ARG_BACKOP , "backop_ms", "scan_cnt_max" +#define SCAN_PARAM_VALUE_ARG_BACKOP , ss->backop_ms, ss->scan_cnt_max #else - #define SCAN_PARAM_TITLE_FMT_BACKOP "" - #define SCAN_PARAM_VALUE_FMT_BACKOP "" - #define SCAN_PARAM_TITLE_ARG_BACKOP - #define SCAN_PARAM_VALUE_ARG_BACKOP +#define SCAN_PARAM_TITLE_FMT_BACKOP "" +#define SCAN_PARAM_VALUE_FMT_BACKOP "" +#define SCAN_PARAM_TITLE_ARG_BACKOP +#define SCAN_PARAM_VALUE_ARG_BACKOP #endif - DBG_871X_SEL_NL(m, + RTW_PRINT_SEL(m, SCAN_PARAM_TITLE_FMT SCAN_PARAM_TITLE_FMT_HT SCAN_PARAM_TITLE_FMT_BACKOP @@ -845,7 +964,7 @@ int proc_get_scan_param(struct seq_file *m, void *v) SCAN_PARAM_TITLE_ARG_BACKOP ); - DBG_871X_SEL_NL(m, + RTW_PRINT_SEL(m, SCAN_PARAM_VALUE_FMT SCAN_PARAM_VALUE_FMT_HT SCAN_PARAM_VALUE_FMT_BACKOP @@ -867,26 +986,26 @@ ssize_t proc_set_scan_param(struct file *file, const char __user *buffer, size_t char tmp[32] = {0}; -u16 scan_ch_ms; + u16 scan_ch_ms; #define SCAN_PARAM_INPUT_FMT "%hu" #define SCAN_PARAM_INPUT_ARG , &scan_ch_ms #ifdef CONFIG_80211N_HT u8 rx_ampdu_accept; u8 rx_ampdu_size; - #define SCAN_PARAM_INPUT_FMT_HT " %hhu %hhu" - #define SCAN_PARAM_INPUT_ARG_HT , &rx_ampdu_accept, &rx_ampdu_size +#define SCAN_PARAM_INPUT_FMT_HT " %hhu %hhu" +#define SCAN_PARAM_INPUT_ARG_HT , &rx_ampdu_accept, &rx_ampdu_size #else - #define SCAN_PARAM_INPUT_FMT_HT "" - #define SCAN_PARAM_INPUT_ARG_HT +#define SCAN_PARAM_INPUT_FMT_HT "" +#define SCAN_PARAM_INPUT_ARG_HT #endif #ifdef CONFIG_SCAN_BACKOP u16 backop_ms; u8 scan_cnt_max; - #define SCAN_PARAM_INPUT_FMT_BACKOP " %hu %hhu" - #define SCAN_PARAM_INPUT_ARG_BACKOP , &backop_ms, &scan_cnt_max +#define SCAN_PARAM_INPUT_FMT_BACKOP " %hu %hhu" +#define SCAN_PARAM_INPUT_ARG_BACKOP , &backop_ms, &scan_cnt_max #else - #define SCAN_PARAM_INPUT_FMT_BACKOP "" - #define SCAN_PARAM_INPUT_ARG_BACKOP +#define SCAN_PARAM_INPUT_FMT_BACKOP "" +#define SCAN_PARAM_INPUT_ARG_BACKOP #endif if (count < 1) @@ -910,21 +1029,21 @@ u16 scan_ch_ms; if (num-- > 0) ss->scan_ch_ms = scan_ch_ms; - #ifdef CONFIG_80211N_HT +#ifdef CONFIG_80211N_HT if (num-- > 0) ss->rx_ampdu_accept = rx_ampdu_accept; if (num-- > 0) ss->rx_ampdu_size = rx_ampdu_size; - #endif - #ifdef CONFIG_SCAN_BACKOP +#endif +#ifdef CONFIG_SCAN_BACKOP if (num-- > 0) ss->backop_ms = backop_ms; if (num-- > 0) ss->scan_cnt_max = scan_cnt_max; - #endif +#endif } - - return count; + + return count; } int proc_get_scan_abort(struct seq_file *m, void *v) @@ -935,7 +1054,7 @@ int proc_get_scan_abort(struct seq_file *m, void *v) pass_ms = rtw_scan_abort_timeout(adapter, 10000); - DBG_871X_SEL_NL(m, "%u\n", pass_ms); + RTW_PRINT_SEL(m, "%u\n", pass_ms); return 0; } @@ -947,7 +1066,7 @@ int proc_get_backop_flags_sta(struct seq_file *m, void *v) _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; - DBG_871X_SEL_NL(m, "0x%02x\n", mlmeext_scan_backop_flags_sta(mlmeext)); + RTW_PRINT_SEL(m, "0x%02x\n", mlmeext_scan_backop_flags_sta(mlmeext)); return 0; } @@ -976,7 +1095,7 @@ ssize_t proc_set_backop_flags_sta(struct file *file, const char __user *buffer, if (num == 1) mlmeext_assign_scan_backop_flags_sta(mlmeext, flags); } - + return count; } @@ -986,7 +1105,7 @@ int proc_get_backop_flags_ap(struct seq_file *m, void *v) _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; - DBG_871X_SEL_NL(m, "0x%02x\n", mlmeext_scan_backop_flags_ap(mlmeext)); + RTW_PRINT_SEL(m, "0x%02x\n", mlmeext_scan_backop_flags_ap(mlmeext)); return 0; } @@ -1015,7 +1134,7 @@ ssize_t proc_set_backop_flags_ap(struct file *file, const char __user *buffer, s if (num == 1) mlmeext_assign_scan_backop_flags_ap(mlmeext, flags); } - + return count; } @@ -1039,59 +1158,58 @@ int proc_get_survey_info(struct seq_file *m, void *v) int ielen = 0; u32 wpsielen = 0; - _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); phead = get_list_head(queue); - if(!phead) + if (!phead) return 0; plist = get_next(phead); if (!plist) return 0; - DBG_871X_SEL_NL(m, "%5s %-17s %3s %-3s %-4s %-4s %5s %32s %32s\n", "index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "flag", "ssid"); - while(1) - { - if (rtw_end_of_queue_search(phead,plist)== _TRUE) + RTW_PRINT_SEL(m, "%5s %-17s %3s %-3s %-4s %-4s %5s %32s %32s\n", "index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "flag", "ssid"); + while (1) { + if (rtw_end_of_queue_search(phead, plist) == _TRUE) break; pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); - if (!pnetwork) + if (!pnetwork) break; - - if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE && - is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) { - notify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm + + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && + is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) { + notify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);/* dbm */ } else { - notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm + notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);/* dbm */ } - #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR) - rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(notify_noise)); - #endif - - ie_wpa = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength-12); - ie_wpa2 = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength-12); +#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR) + rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR, &(pnetwork->network.Configuration.DSConfig), &(notify_noise)); +#endif + + ie_wpa = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength - 12); + ie_wpa2 = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength - 12); ie_cap = rtw_get_capability(&pnetwork->network); - ie_wps = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength-12, NULL, &wpsielen); - ie_p2p = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength-12, NULL, &ielen); + ie_wps = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsielen); + ie_p2p = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &ielen); ssid = pnetwork->network.Ssid.Ssid; sprintf(flag_str, "%s%s%s%s%s%s%s", - (ie_wpa) ? "[WPA]":"", - (ie_wpa2) ? "[WPA2]":"", - (!ie_wpa && !ie_wpa && ie_cap & BIT(4)) ? "[WEP]":"", - (ie_wps) ? "[WPS]":"", - (pnetwork->network.InfrastructureMode == Ndis802_11IBSS) ? "[IBSS]":"", - (ie_cap & BIT(0)) ? "[ESS]":"", - (ie_p2p) ? "[P2P]":""); - DBG_871X_SEL_NL(m, "%5d "MAC_FMT" %3d %3d %4d %4d %5d %32s %32s\n", - ++index, - MAC_ARG(pnetwork->network.MacAddress), - pnetwork->network.Configuration.DSConfig, - (int)pnetwork->network.Rssi, - notify_signal, - notify_noise, + (ie_wpa) ? "[WPA]" : "", + (ie_wpa2) ? "[WPA2]" : "", + (!ie_wpa && !ie_wpa && ie_cap & BIT(4)) ? "[WEP]" : "", + (ie_wps) ? "[WPS]" : "", + (pnetwork->network.InfrastructureMode == Ndis802_11IBSS) ? "[IBSS]" : "", + (ie_cap & BIT(0)) ? "[ESS]" : "", + (ie_p2p) ? "[P2P]" : ""); + RTW_PRINT_SEL(m, "%5d "MAC_FMT" %3d %3d %4d %4d %5d %32s %32s\n", + ++index, + MAC_ARG(pnetwork->network.MacAddress), + pnetwork->network.Configuration.DSConfig, + (int)pnetwork->network.Rssi, + notify_signal, + notify_noise, rtw_get_passing_time_ms((u32)pnetwork->last_scanned), - flag_str, - pnetwork->network.Ssid.Ssid); + flag_str, + pnetwork->network.Ssid.Ssid); plist = get_next(plist); } _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); @@ -1113,65 +1231,51 @@ ssize_t proc_set_survey_info(struct file *file, const char __user *buffer, size_ return -EFAULT; #ifdef CONFIG_MP_INCLUDED - if ((padapter->registrypriv.mp_mode == 1) -#ifdef CONFIG_CONCURRENT_MODE - || ((padapter->pbuddy_adapter) && (padapter->pbuddy_adapter->registrypriv.mp_mode == 1)) -#endif - ){ - DBG_871X(FUNC_ADPT_FMT ": MP mode block Scan request\n", FUNC_ADPT_ARG(padapter)); - goto exit; - } + if (rtw_mi_mp_mode_check(padapter)) { + RTW_INFO("MP mode block Scan request\n"); + goto exit; + } #endif + if (rtw_is_scan_deny(padapter)) { + RTW_INFO(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter)); + goto exit; + } + rtw_ps_deny(padapter, PS_DENY_SCAN); if (_FAIL == rtw_pwr_wakeup(padapter)) - goto exit; + goto cancel_ps_deny; - if (rtw_is_drv_stopped(padapter)) { - DBG_871X("scan abort!! bDriverStopped=_TRUE\n"); - goto exit; - } - - if (!padapter->bup) { - DBG_871X("scan abort!! bup=%d\n", padapter->bup); - goto exit; - } - - if (!rtw_is_hw_init_completed(padapter)) { - DBG_871X("scan abort!! hw_init_completed=FALSE\n"); - goto exit; - } - - if (rtw_is_scan_deny(padapter)) { - DBG_871X(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter)); - goto exit; - } - - if ((pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) -#ifdef CONFIG_CONCURRENT_MODE - || (rtw_get_buddy_bBusyTraffic(padapter) == _TRUE) -#endif - ) { - DBG_871X("scan abort!! BusyTraffic == _TRUE\n"); - goto exit; + if (!rtw_is_adapter_up(padapter)) { + RTW_INFO("scan abort!! adapter cannot use\n"); + goto cancel_ps_deny; } - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) { - DBG_8192C("scan abort!! fwstate=0x%x\n", pmlmepriv->fw_state); - goto exit; + if (rtw_mi_busy_traffic_check(padapter, _FALSE)) { + RTW_INFO("scan abort!! BusyTraffic == _TRUE\n"); + goto cancel_ps_deny; + } + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) && check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) { + RTW_INFO("scan abort!! AP mode process WPS\n"); + goto cancel_ps_deny; + } + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING) == _TRUE) { + RTW_INFO("scan abort!! fwstate=0x%x\n", pmlmepriv->fw_state); + goto cancel_ps_deny; } #ifdef CONFIG_CONCURRENT_MODE - if (check_buddy_fwstate(padapter, - _FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE) { - DBG_871X("scan abort!! buddy_fwstate=0x%x\n", - get_fwstate(&(padapter->pbuddy_adapter->mlmepriv))); - goto exit; + if (rtw_mi_buddy_check_fwstate(padapter, + _FW_UNDER_SURVEY | _FW_UNDER_LINKING | WIFI_UNDER_WPS)) { + RTW_INFO("scan abort!! buddy_fwstate check failed\n"); + goto cancel_ps_deny; } #endif - _status = rtw_set_802_11_bssid_list_scan(padapter, NULL, 0); + _status = rtw_set_802_11_bssid_list_scan(padapter, NULL, 0, NULL, 0); -exit: +cancel_ps_deny: rtw_ps_deny_cancel(padapter, PS_DENY_SCAN); +exit: return count; } @@ -1186,35 +1290,31 @@ int proc_get_ap_info(struct seq_file *m, void *v) struct sta_priv *pstapriv = &padapter->stapriv; psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); - if(psta) - { + if (psta) { int i; struct recv_reorder_ctrl *preorder_ctrl; - - DBG_871X_SEL_NL(m, "SSID=%s\n", cur_network->network.Ssid.Ssid); - DBG_871X_SEL_NL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); - DBG_871X_SEL_NL(m, "cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); - DBG_871X_SEL_NL(m, "wireless_mode=0x%x, rtsen=%d, cts2slef=%d\n", psta->wireless_mode, psta->rtsen, psta->cts2self); - DBG_871X_SEL_NL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); + + RTW_PRINT_SEL(m, "SSID=%s\n", cur_network->network.Ssid.Ssid); + RTW_PRINT_SEL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); + RTW_PRINT_SEL(m, "cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); + RTW_PRINT_SEL(m, "wireless_mode=0x%x, rtsen=%d, cts2slef=%d\n", psta->wireless_mode, psta->rtsen, psta->cts2self); + RTW_PRINT_SEL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); #ifdef CONFIG_80211N_HT - DBG_871X_SEL_NL(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); - DBG_871X_SEL_NL(m, "bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\n", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m); - DBG_871X_SEL_NL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); - DBG_871X_SEL_NL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); - DBG_871X_SEL_NL(m, "ldpc_cap=0x%x, stbc_cap=0x%x, beamform_cap=0x%x\n", psta->htpriv.ldpc_cap, psta->htpriv.stbc_cap, psta->htpriv.beamform_cap); -#endif //CONFIG_80211N_HT + RTW_PRINT_SEL(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); + RTW_PRINT_SEL(m, "bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\n", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m); + RTW_PRINT_SEL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); + RTW_PRINT_SEL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); + RTW_PRINT_SEL(m, "ldpc_cap=0x%x, stbc_cap=0x%x, beamform_cap=0x%x\n", psta->htpriv.ldpc_cap, psta->htpriv.stbc_cap, psta->htpriv.beamform_cap); +#endif /* CONFIG_80211N_HT */ #ifdef CONFIG_80211AC_VHT - DBG_871X_SEL_NL(m, "vht_en=%d, vht_sgi_80m=%d\n", psta->vhtpriv.vht_option, psta->vhtpriv.sgi_80m); - 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); + RTW_PRINT_SEL(m, "vht_en=%d, vht_sgi_80m=%d\n", psta->vhtpriv.vht_option, psta->vhtpriv.sgi_80m); + RTW_PRINT_SEL(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); + RTW_PRINT_SEL(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 sta_rx_reorder_ctl_dump(m, psta); - } - else - { - DBG_871X_SEL_NL(m, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress)); - } + } else + RTW_PRINT_SEL(m, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress)); return 0; } @@ -1248,7 +1348,7 @@ ssize_t proc_reset_trx_info(struct file *file, const char __user *buffer, size_t return count; } - + int proc_get_trx_info(struct seq_file *m, void *v) { struct net_device *dev = m->private; @@ -1262,34 +1362,33 @@ int proc_get_trx_info(struct seq_file *m, void *v) dump_os_queue(m, padapter); - DBG_871X_SEL_NL(m, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n" + RTW_PRINT_SEL(m, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n" , pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt); - DBG_871X_SEL_NL(m, "free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d\n" + RTW_PRINT_SEL(m, "free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d\n" , pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt); - DBG_871X_SEL_NL(m, "free_recvframe_cnt=%d\n" - , precvpriv->free_recvframe_cnt); + RTW_PRINT_SEL(m, "free_recvframe_cnt=%d\n" + , precvpriv->free_recvframe_cnt); - for(i = 0; i < 4; i++) - { + for (i = 0; i < 4; i++) { phwxmit = pxmitpriv->hwxmits + i; - DBG_871X_SEL_NL(m, "%d, hwq.accnt=%d\n", i, phwxmit->accnt); + RTW_PRINT_SEL(m, "%d, hwq.accnt=%d\n", i, phwxmit->accnt); } #ifdef CONFIG_USB_HCI - DBG_871X_SEL_NL(m, "rx_urb_pending_cn=%d\n", ATOMIC_READ(&(precvpriv->rx_pending_cnt))); + RTW_PRINT_SEL(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); + /* 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 */ + RTW_PRINT_SEL(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. */ + RTW_PRINT_SEL(m, "Rx: Reorder Time-out Trigger Counts: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_ampdu_forced_indicate_count); + /* Total counts of packets loss */ + RTW_PRINT_SEL(m, "Rx: Packet Loss Counts: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_ampdu_loss_count); + RTW_PRINT_SEL(m, "Rx: Duplicate Management Frame Drop Count: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_dup_mgt_frame_drop_count); + RTW_PRINT_SEL(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); + RTW_PRINT_SEL(m, "Rx: Conflict MAC Address Frames Count: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_conflic_mac_addr_cnt); return 0; } @@ -1299,16 +1398,16 @@ int proc_get_dis_pwt(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); u8 dis_pwt = 0; rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt)); - DBG_871X_SEL_NL(m, " Tx Power training mode:%s \n",(dis_pwt==_TRUE)?"Disable":"Enable"); + RTW_PRINT_SEL(m, " Tx Power training mode:%s\n", (dis_pwt == _TRUE) ? "Disable" : "Enable"); return 0; } ssize_t proc_set_dis_pwt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) { struct net_device *dev = data; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - char tmp[4]={0}; + char tmp[4] = {0}; u8 dis_pwt = 0; - + if (count < 1) return -EFAULT; @@ -1320,14 +1419,14 @@ ssize_t proc_set_dis_pwt(struct file *file, const char __user *buffer, size_t co if (buffer && !copy_from_user(tmp, buffer, count)) { int num = sscanf(tmp, "%hhx", &dis_pwt); - DBG_871X("Set Tx Power training mode:%s\n", (dis_pwt == _TRUE)?"Disable":"Enable"); - + RTW_INFO("Set Tx Power training mode:%s\n", (dis_pwt == _TRUE) ? "Disable" : "Enable"); + if (num >= 1) rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt)); } return count; - + } int proc_get_rate_ctl(struct seq_file *m, void *v) @@ -1335,21 +1434,20 @@ int proc_get_rate_ctl(struct seq_file *m, void *v) struct net_device *dev = m->private; int i; _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); - u8 data_rate = 0, sgi=0, data_fb = 0; - + u8 data_rate = 0, sgi = 0, data_fb = 0; + if (adapter->fix_rate != 0xff) { data_rate = adapter->fix_rate & 0x7F; - sgi = adapter->fix_rate >>7; - data_fb = adapter->data_fb?1:0; - DBG_871X_SEL_NL(m, "FIXED %s%s%s\n" + sgi = adapter->fix_rate >> 7; + data_fb = adapter->data_fb ? 1 : 0; + RTW_PRINT_SEL(m, "FIXED %s%s%s\n" , HDATA_RATE(data_rate) - , data_rate>DESC_RATE54M?(sgi?" SGI":" LGI"):"" - , data_fb?" FB":"" + , 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); - } else { - DBG_871X_SEL_NL(m, "RA\n"); - } + RTW_PRINT_SEL(m, "0x%02x %u\n", adapter->fix_rate, adapter->data_fb); + } else + RTW_PRINT_SEL(m, "RA\n"); return 0; } @@ -1374,14 +1472,65 @@ ssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t c int num = sscanf(tmp, "%hhx %hhu", &fix_rate, &data_fb); - if (num >= 1) + if (num >= 1) { + u8 fix_rate_ori = adapter->fix_rate; + adapter->fix_rate = fix_rate; + if (adapter->fix_bw != 0xFF && fix_rate_ori != fix_rate) + rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter)); + } if (num >= 2) - adapter->data_fb = data_fb?1:0; + adapter->data_fb = data_fb ? 1 : 0; } return count; } +int proc_get_bw_ctl(struct seq_file *m, void *v) +{ + struct net_device *dev = m->private; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + u8 data_bw = 0; + + if (adapter->fix_bw != 0xff) { + data_bw = adapter->fix_bw; + RTW_PRINT_SEL(m, "FIXED %s\n", HDATA_BW(data_bw)); + } else + RTW_PRINT_SEL(m, "Auto\n"); + + return 0; +} + +ssize_t proc_set_bw_ctl(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 fix_bw; + + if (count < 1) + return -EFAULT; + + if (count > sizeof(tmp)) { + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + int num = sscanf(tmp, "%hhu", &fix_bw); + + if (num >= 1) { + u8 fix_bw_ori = adapter->fix_bw; + + adapter->fix_bw = fix_bw; + + if (adapter->fix_rate != 0xFF && fix_bw_ori != fix_bw) + rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter)); + } + } + + return count; +} + #ifdef DBG_RX_COUNTER_DUMP int proc_get_rx_cnt_dump(struct seq_file *m, void *v) { @@ -1389,11 +1538,11 @@ int proc_get_rx_cnt_dump(struct seq_file *m, void *v) 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); + RTW_PRINT_SEL(m, "BIT0- Dump RX counters of DRV\n"); + RTW_PRINT_SEL(m, "BIT1- Dump RX counters of MAC\n"); + RTW_PRINT_SEL(m, "BIT2- Dump RX counters of PHY\n"); + RTW_PRINT_SEL(m, "BIT3- Dump TRX data frame of DRV\n"); + RTW_PRINT_SEL(m, "dump_rx_cnt_mode = 0x%02x\n", adapter->dump_rx_cnt_mode); return 0; } @@ -1416,9 +1565,9 @@ ssize_t proc_set_rx_cnt_dump(struct file *file, const char __user *buffer, size_ int num = sscanf(tmp, "%hhx", &dump_rx_cnt_mode); - rtw_dump_phy_rxcnts_preprocess(adapter,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; @@ -1473,8 +1622,8 @@ int proc_get_dfs_master_test_case(struct seq_file *m, void *v) _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); - DBG_871X_SEL_NL(m, "%-24s %-19s\n", "radar_detect_trigger_non", "choose_dfs_ch_first"); - DBG_871X_SEL_NL(m, "%24hhu %19hhu\n" + RTW_PRINT_SEL(m, "%-24s %-19s\n", "radar_detect_trigger_non", "choose_dfs_ch_first"); + RTW_PRINT_SEL(m, "%24hhu %19hhu\n" , rfctl->dbg_dfs_master_radar_detect_trigger_non , rfctl->dbg_dfs_master_choose_dfs_ch_first ); @@ -1540,34 +1689,34 @@ int proc_get_suspend_resume_info(struct seq_file *m, void *v) struct dvobj_priv *dvobj = padapter->dvobj; struct debug_priv *pdbgpriv = &dvobj->drv_dbg; - DBG_871X_SEL_NL(m, "dbg_sdio_alloc_irq_cnt=%d\n", pdbgpriv->dbg_sdio_alloc_irq_cnt); - DBG_871X_SEL_NL(m, "dbg_sdio_free_irq_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_cnt); - DBG_871X_SEL_NL(m, "dbg_sdio_alloc_irq_error_cnt=%d\n",pdbgpriv->dbg_sdio_alloc_irq_error_cnt); - DBG_871X_SEL_NL(m, "dbg_sdio_free_irq_error_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_error_cnt); - DBG_871X_SEL_NL(m, "dbg_sdio_init_error_cnt=%d\n",pdbgpriv->dbg_sdio_init_error_cnt); - DBG_871X_SEL_NL(m, "dbg_sdio_deinit_error_cnt=%d\n", pdbgpriv->dbg_sdio_deinit_error_cnt); - DBG_871X_SEL_NL(m, "dbg_suspend_error_cnt=%d\n", pdbgpriv->dbg_suspend_error_cnt); - DBG_871X_SEL_NL(m, "dbg_suspend_cnt=%d\n",pdbgpriv->dbg_suspend_cnt); - DBG_871X_SEL_NL(m, "dbg_resume_cnt=%d\n", pdbgpriv->dbg_resume_cnt); - DBG_871X_SEL_NL(m, "dbg_resume_error_cnt=%d\n", pdbgpriv->dbg_resume_error_cnt); - DBG_871X_SEL_NL(m, "dbg_deinit_fail_cnt=%d\n",pdbgpriv->dbg_deinit_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_carddisable_cnt=%d\n", pdbgpriv->dbg_carddisable_cnt); - DBG_871X_SEL_NL(m, "dbg_ps_insuspend_cnt=%d\n",pdbgpriv->dbg_ps_insuspend_cnt); - DBG_871X_SEL_NL(m, "dbg_dev_unload_inIPS_cnt=%d\n", pdbgpriv->dbg_dev_unload_inIPS_cnt); - DBG_871X_SEL_NL(m, "dbg_scan_pwr_state_cnt=%d\n", pdbgpriv->dbg_scan_pwr_state_cnt); - DBG_871X_SEL_NL(m, "dbg_downloadfw_pwr_state_cnt=%d\n", pdbgpriv->dbg_downloadfw_pwr_state_cnt); - DBG_871X_SEL_NL(m, "dbg_carddisable_error_cnt=%d\n", pdbgpriv->dbg_carddisable_error_cnt); - DBG_871X_SEL_NL(m, "dbg_fw_read_ps_state_fail_cnt=%d\n", pdbgpriv->dbg_fw_read_ps_state_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_leave_ips_fail_cnt=%d\n", pdbgpriv->dbg_leave_ips_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_leave_lps_fail_cnt=%d\n", pdbgpriv->dbg_leave_lps_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_h2c_leave32k_fail_cnt=%d\n", pdbgpriv->dbg_h2c_leave32k_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_diswow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_diswow_dload_fw_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_enwow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_enwow_dload_fw_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_ips_drvopen_fail_cnt=%d\n", pdbgpriv->dbg_ips_drvopen_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_poll_fail_cnt=%d\n", pdbgpriv->dbg_poll_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_rpwm_toogle_cnt=%d\n", pdbgpriv->dbg_rpwm_toogle_cnt); - DBG_871X_SEL_NL(m, "dbg_rpwm_timeout_fail_cnt=%d\n", pdbgpriv->dbg_rpwm_timeout_fail_cnt); - DBG_871X_SEL_NL(m, "dbg_sreset_cnt=%d\n", pdbgpriv->dbg_sreset_cnt); + RTW_PRINT_SEL(m, "dbg_sdio_alloc_irq_cnt=%d\n", pdbgpriv->dbg_sdio_alloc_irq_cnt); + RTW_PRINT_SEL(m, "dbg_sdio_free_irq_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_cnt); + RTW_PRINT_SEL(m, "dbg_sdio_alloc_irq_error_cnt=%d\n", pdbgpriv->dbg_sdio_alloc_irq_error_cnt); + RTW_PRINT_SEL(m, "dbg_sdio_free_irq_error_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_error_cnt); + RTW_PRINT_SEL(m, "dbg_sdio_init_error_cnt=%d\n", pdbgpriv->dbg_sdio_init_error_cnt); + RTW_PRINT_SEL(m, "dbg_sdio_deinit_error_cnt=%d\n", pdbgpriv->dbg_sdio_deinit_error_cnt); + RTW_PRINT_SEL(m, "dbg_suspend_error_cnt=%d\n", pdbgpriv->dbg_suspend_error_cnt); + RTW_PRINT_SEL(m, "dbg_suspend_cnt=%d\n", pdbgpriv->dbg_suspend_cnt); + RTW_PRINT_SEL(m, "dbg_resume_cnt=%d\n", pdbgpriv->dbg_resume_cnt); + RTW_PRINT_SEL(m, "dbg_resume_error_cnt=%d\n", pdbgpriv->dbg_resume_error_cnt); + RTW_PRINT_SEL(m, "dbg_deinit_fail_cnt=%d\n", pdbgpriv->dbg_deinit_fail_cnt); + RTW_PRINT_SEL(m, "dbg_carddisable_cnt=%d\n", pdbgpriv->dbg_carddisable_cnt); + RTW_PRINT_SEL(m, "dbg_ps_insuspend_cnt=%d\n", pdbgpriv->dbg_ps_insuspend_cnt); + RTW_PRINT_SEL(m, "dbg_dev_unload_inIPS_cnt=%d\n", pdbgpriv->dbg_dev_unload_inIPS_cnt); + RTW_PRINT_SEL(m, "dbg_scan_pwr_state_cnt=%d\n", pdbgpriv->dbg_scan_pwr_state_cnt); + RTW_PRINT_SEL(m, "dbg_downloadfw_pwr_state_cnt=%d\n", pdbgpriv->dbg_downloadfw_pwr_state_cnt); + RTW_PRINT_SEL(m, "dbg_carddisable_error_cnt=%d\n", pdbgpriv->dbg_carddisable_error_cnt); + RTW_PRINT_SEL(m, "dbg_fw_read_ps_state_fail_cnt=%d\n", pdbgpriv->dbg_fw_read_ps_state_fail_cnt); + RTW_PRINT_SEL(m, "dbg_leave_ips_fail_cnt=%d\n", pdbgpriv->dbg_leave_ips_fail_cnt); + RTW_PRINT_SEL(m, "dbg_leave_lps_fail_cnt=%d\n", pdbgpriv->dbg_leave_lps_fail_cnt); + RTW_PRINT_SEL(m, "dbg_h2c_leave32k_fail_cnt=%d\n", pdbgpriv->dbg_h2c_leave32k_fail_cnt); + RTW_PRINT_SEL(m, "dbg_diswow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_diswow_dload_fw_fail_cnt); + RTW_PRINT_SEL(m, "dbg_enwow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_enwow_dload_fw_fail_cnt); + RTW_PRINT_SEL(m, "dbg_ips_drvopen_fail_cnt=%d\n", pdbgpriv->dbg_ips_drvopen_fail_cnt); + RTW_PRINT_SEL(m, "dbg_poll_fail_cnt=%d\n", pdbgpriv->dbg_poll_fail_cnt); + RTW_PRINT_SEL(m, "dbg_rpwm_toogle_cnt=%d\n", pdbgpriv->dbg_rpwm_toogle_cnt); + RTW_PRINT_SEL(m, "dbg_rpwm_timeout_fail_cnt=%d\n", pdbgpriv->dbg_rpwm_timeout_fail_cnt); + RTW_PRINT_SEL(m, "dbg_sreset_cnt=%d\n", pdbgpriv->dbg_sreset_cnt); return 0; } @@ -1580,94 +1729,94 @@ int proc_get_rx_logs(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct rx_logs *rx_logs = &padapter->rx_logs; - DBG_871X_SEL_NL(m, - "intf_rx=%d\n" - "intf_rx_err_recvframe=%d\n" - "intf_rx_err_skb=%d\n" - "intf_rx_report=%d\n" - "core_rx=%d\n" - "core_rx_pre=%d\n" - "core_rx_pre_ver_err=%d\n" - "core_rx_pre_mgmt=%d\n" - "core_rx_pre_mgmt_err_80211w=%d\n" - "core_rx_pre_mgmt_err=%d\n" - "core_rx_pre_ctrl=%d\n" - "core_rx_pre_ctrl_err=%d\n" - "core_rx_pre_data=%d\n" - "core_rx_pre_data_wapi_seq_err=%d\n" - "core_rx_pre_data_wapi_key_err=%d\n" - "core_rx_pre_data_handled=%d\n" - "core_rx_pre_data_err=%d\n" - "core_rx_pre_data_unknown=%d\n" - "core_rx_pre_unknown=%d\n" - "core_rx_enqueue=%d\n" - "core_rx_dequeue=%d\n" - "core_rx_post=%d\n" - "core_rx_post_decrypt=%d\n" - "core_rx_post_decrypt_wep=%d\n" - "core_rx_post_decrypt_tkip=%d\n" - "core_rx_post_decrypt_aes=%d\n" - "core_rx_post_decrypt_wapi=%d\n" - "core_rx_post_decrypt_hw=%d\n" - "core_rx_post_decrypt_unknown=%d\n" - "core_rx_post_decrypt_err=%d\n" - "core_rx_post_defrag_err=%d\n" - "core_rx_post_portctrl_err=%d\n" - "core_rx_post_indicate=%d\n" - "core_rx_post_indicate_in_oder=%d\n" - "core_rx_post_indicate_reoder=%d\n" - "core_rx_post_indicate_err=%d\n" - "os_indicate=%d\n" - "os_indicate_ap_mcast=%d\n" - "os_indicate_ap_forward=%d\n" - "os_indicate_ap_self=%d\n" - "os_indicate_err=%d\n" - "os_netif_ok=%d\n" - "os_netif_err=%d\n", - rx_logs->intf_rx, - rx_logs->intf_rx_err_recvframe, - rx_logs->intf_rx_err_skb, - rx_logs->intf_rx_report, - rx_logs->core_rx, - rx_logs->core_rx_pre, - rx_logs->core_rx_pre_ver_err, - rx_logs->core_rx_pre_mgmt, - rx_logs->core_rx_pre_mgmt_err_80211w, - rx_logs->core_rx_pre_mgmt_err, - rx_logs->core_rx_pre_ctrl, - rx_logs->core_rx_pre_ctrl_err, - rx_logs->core_rx_pre_data, - rx_logs->core_rx_pre_data_wapi_seq_err, - rx_logs->core_rx_pre_data_wapi_key_err, - rx_logs->core_rx_pre_data_handled, - rx_logs->core_rx_pre_data_err, - rx_logs->core_rx_pre_data_unknown, - rx_logs->core_rx_pre_unknown, - rx_logs->core_rx_enqueue, - rx_logs->core_rx_dequeue, - rx_logs->core_rx_post, - rx_logs->core_rx_post_decrypt, - rx_logs->core_rx_post_decrypt_wep, - rx_logs->core_rx_post_decrypt_tkip, - rx_logs->core_rx_post_decrypt_aes, - rx_logs->core_rx_post_decrypt_wapi, - rx_logs->core_rx_post_decrypt_hw, - rx_logs->core_rx_post_decrypt_unknown, - rx_logs->core_rx_post_decrypt_err, - rx_logs->core_rx_post_defrag_err, - rx_logs->core_rx_post_portctrl_err, - rx_logs->core_rx_post_indicate, - rx_logs->core_rx_post_indicate_in_oder, - rx_logs->core_rx_post_indicate_reoder, - rx_logs->core_rx_post_indicate_err, - rx_logs->os_indicate, - rx_logs->os_indicate_ap_mcast, - rx_logs->os_indicate_ap_forward, - rx_logs->os_indicate_ap_self, - rx_logs->os_indicate_err, - rx_logs->os_netif_ok, - rx_logs->os_netif_err - ); + RTW_PRINT_SEL(m, + "intf_rx=%d\n" + "intf_rx_err_recvframe=%d\n" + "intf_rx_err_skb=%d\n" + "intf_rx_report=%d\n" + "core_rx=%d\n" + "core_rx_pre=%d\n" + "core_rx_pre_ver_err=%d\n" + "core_rx_pre_mgmt=%d\n" + "core_rx_pre_mgmt_err_80211w=%d\n" + "core_rx_pre_mgmt_err=%d\n" + "core_rx_pre_ctrl=%d\n" + "core_rx_pre_ctrl_err=%d\n" + "core_rx_pre_data=%d\n" + "core_rx_pre_data_wapi_seq_err=%d\n" + "core_rx_pre_data_wapi_key_err=%d\n" + "core_rx_pre_data_handled=%d\n" + "core_rx_pre_data_err=%d\n" + "core_rx_pre_data_unknown=%d\n" + "core_rx_pre_unknown=%d\n" + "core_rx_enqueue=%d\n" + "core_rx_dequeue=%d\n" + "core_rx_post=%d\n" + "core_rx_post_decrypt=%d\n" + "core_rx_post_decrypt_wep=%d\n" + "core_rx_post_decrypt_tkip=%d\n" + "core_rx_post_decrypt_aes=%d\n" + "core_rx_post_decrypt_wapi=%d\n" + "core_rx_post_decrypt_hw=%d\n" + "core_rx_post_decrypt_unknown=%d\n" + "core_rx_post_decrypt_err=%d\n" + "core_rx_post_defrag_err=%d\n" + "core_rx_post_portctrl_err=%d\n" + "core_rx_post_indicate=%d\n" + "core_rx_post_indicate_in_oder=%d\n" + "core_rx_post_indicate_reoder=%d\n" + "core_rx_post_indicate_err=%d\n" + "os_indicate=%d\n" + "os_indicate_ap_mcast=%d\n" + "os_indicate_ap_forward=%d\n" + "os_indicate_ap_self=%d\n" + "os_indicate_err=%d\n" + "os_netif_ok=%d\n" + "os_netif_err=%d\n", + rx_logs->intf_rx, + rx_logs->intf_rx_err_recvframe, + rx_logs->intf_rx_err_skb, + rx_logs->intf_rx_report, + rx_logs->core_rx, + rx_logs->core_rx_pre, + rx_logs->core_rx_pre_ver_err, + rx_logs->core_rx_pre_mgmt, + rx_logs->core_rx_pre_mgmt_err_80211w, + rx_logs->core_rx_pre_mgmt_err, + rx_logs->core_rx_pre_ctrl, + rx_logs->core_rx_pre_ctrl_err, + rx_logs->core_rx_pre_data, + rx_logs->core_rx_pre_data_wapi_seq_err, + rx_logs->core_rx_pre_data_wapi_key_err, + rx_logs->core_rx_pre_data_handled, + rx_logs->core_rx_pre_data_err, + rx_logs->core_rx_pre_data_unknown, + rx_logs->core_rx_pre_unknown, + rx_logs->core_rx_enqueue, + rx_logs->core_rx_dequeue, + rx_logs->core_rx_post, + rx_logs->core_rx_post_decrypt, + rx_logs->core_rx_post_decrypt_wep, + rx_logs->core_rx_post_decrypt_tkip, + rx_logs->core_rx_post_decrypt_aes, + rx_logs->core_rx_post_decrypt_wapi, + rx_logs->core_rx_post_decrypt_hw, + rx_logs->core_rx_post_decrypt_unknown, + rx_logs->core_rx_post_decrypt_err, + rx_logs->core_rx_post_defrag_err, + rx_logs->core_rx_post_portctrl_err, + rx_logs->core_rx_post_indicate, + rx_logs->core_rx_post_indicate_in_oder, + rx_logs->core_rx_post_indicate_reoder, + rx_logs->core_rx_post_indicate_err, + rx_logs->os_indicate, + rx_logs->os_indicate_ap_mcast, + rx_logs->os_indicate_ap_forward, + rx_logs->os_indicate_ap_self, + rx_logs->os_indicate_err, + rx_logs->os_netif_ok, + rx_logs->os_netif_err + ); return 0; } @@ -1677,113 +1826,113 @@ int proc_get_tx_logs(struct seq_file *m, void *v) struct net_device *dev = m->private; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct tx_logs *tx_logs = &padapter->tx_logs; - - DBG_871X_SEL_NL(m, - "os_tx=%d\n" - "os_tx_err_up=%d\n" - "os_tx_err_xmit=%d\n" - "os_tx_m2u=%d\n" - "os_tx_m2u_ignore_fw_linked=%d\n" - "os_tx_m2u_ignore_self=%d\n" - "os_tx_m2u_entry=%d\n" - "os_tx_m2u_entry_err_xmit=%d\n" - "os_tx_m2u_entry_err_skb=%d\n" - "os_tx_m2u_stop=%d\n" - "core_tx=%d\n" - "core_tx_err_pxmitframe=%d\n" - "core_tx_err_brtx=%d\n" - "core_tx_upd_attrib=%d\n" - "core_tx_upd_attrib_adhoc=%d\n" - "core_tx_upd_attrib_sta=%d\n" - "core_tx_upd_attrib_ap=%d\n" - "core_tx_upd_attrib_unknown=%d\n" - "core_tx_upd_attrib_dhcp=%d\n" - "core_tx_upd_attrib_icmp=%d\n" - "core_tx_upd_attrib_active=%d\n" - "core_tx_upd_attrib_err_ucast_sta=%d\n" - "core_tx_upd_attrib_err_ucast_ap_link=%d\n" - "core_tx_upd_attrib_err_sta=%d\n" - "core_tx_upd_attrib_err_link=%d\n" - "core_tx_upd_attrib_err_sec=%d\n" - "core_tx_ap_enqueue_warn_fwstate=%d\n" - "core_tx_ap_enqueue_warn_sta=%d\n" - "core_tx_ap_enqueue_warn_nosta=%d\n" - "core_tx_ap_enqueue_warn_link=%d\n" - "core_tx_ap_enqueue_warn_trigger=%d\n" - "core_tx_ap_enqueue_mcast=%d\n" - "core_tx_ap_enqueue_ucast=%d\n" - "core_tx_ap_enqueue=%d\n" - "intf_tx=%d\n" - "intf_tx_pending_ac=%d\n" - "intf_tx_pending_fw_under_survey=%d\n" - "intf_tx_pending_fw_under_linking=%d\n" - "intf_tx_pending_xmitbuf=%d\n" - "intf_tx_enqueue=%d\n" - "core_tx_enqueue=%d\n" - "core_tx_enqueue_class=%d\n" - "core_tx_enqueue_class_err_sta=%d\n" - "core_tx_enqueue_class_err_nosta=%d\n" - "core_tx_enqueue_class_err_fwlink=%d\n" - "intf_tx_direct=%d\n" - "intf_tx_direct_err_coalesce=%d\n" - "intf_tx_dequeue=%d\n" - "intf_tx_dequeue_err_coalesce=%d\n" - "intf_tx_dump_xframe=%d\n" - "intf_tx_dump_xframe_err_txdesc=%d\n" - "intf_tx_dump_xframe_err_port=%d\n", - tx_logs->os_tx, - tx_logs->os_tx_err_up, - tx_logs->os_tx_err_xmit, - tx_logs->os_tx_m2u, - tx_logs->os_tx_m2u_ignore_fw_linked, - tx_logs->os_tx_m2u_ignore_self, - tx_logs->os_tx_m2u_entry, - tx_logs->os_tx_m2u_entry_err_xmit, - tx_logs->os_tx_m2u_entry_err_skb, - tx_logs->os_tx_m2u_stop, - tx_logs->core_tx, - tx_logs->core_tx_err_pxmitframe, - tx_logs->core_tx_err_brtx, - tx_logs->core_tx_upd_attrib, - tx_logs->core_tx_upd_attrib_adhoc, - tx_logs->core_tx_upd_attrib_sta, - tx_logs->core_tx_upd_attrib_ap, - tx_logs->core_tx_upd_attrib_unknown, - tx_logs->core_tx_upd_attrib_dhcp, - tx_logs->core_tx_upd_attrib_icmp, - tx_logs->core_tx_upd_attrib_active, - tx_logs->core_tx_upd_attrib_err_ucast_sta, - tx_logs->core_tx_upd_attrib_err_ucast_ap_link, - tx_logs->core_tx_upd_attrib_err_sta, - tx_logs->core_tx_upd_attrib_err_link, - tx_logs->core_tx_upd_attrib_err_sec, - tx_logs->core_tx_ap_enqueue_warn_fwstate, - tx_logs->core_tx_ap_enqueue_warn_sta, - tx_logs->core_tx_ap_enqueue_warn_nosta, - tx_logs->core_tx_ap_enqueue_warn_link, - tx_logs->core_tx_ap_enqueue_warn_trigger, - tx_logs->core_tx_ap_enqueue_mcast, - tx_logs->core_tx_ap_enqueue_ucast, - tx_logs->core_tx_ap_enqueue, - tx_logs->intf_tx, - tx_logs->intf_tx_pending_ac, - tx_logs->intf_tx_pending_fw_under_survey, - tx_logs->intf_tx_pending_fw_under_linking, - tx_logs->intf_tx_pending_xmitbuf, - tx_logs->intf_tx_enqueue, - tx_logs->core_tx_enqueue, - tx_logs->core_tx_enqueue_class, - tx_logs->core_tx_enqueue_class_err_sta, - tx_logs->core_tx_enqueue_class_err_nosta, - tx_logs->core_tx_enqueue_class_err_fwlink, - tx_logs->intf_tx_direct, - tx_logs->intf_tx_direct_err_coalesce, - tx_logs->intf_tx_dequeue, - tx_logs->intf_tx_dequeue_err_coalesce, - tx_logs->intf_tx_dump_xframe, - tx_logs->intf_tx_dump_xframe_err_txdesc, - tx_logs->intf_tx_dump_xframe_err_port - ); + + RTW_PRINT_SEL(m, + "os_tx=%d\n" + "os_tx_err_up=%d\n" + "os_tx_err_xmit=%d\n" + "os_tx_m2u=%d\n" + "os_tx_m2u_ignore_fw_linked=%d\n" + "os_tx_m2u_ignore_self=%d\n" + "os_tx_m2u_entry=%d\n" + "os_tx_m2u_entry_err_xmit=%d\n" + "os_tx_m2u_entry_err_skb=%d\n" + "os_tx_m2u_stop=%d\n" + "core_tx=%d\n" + "core_tx_err_pxmitframe=%d\n" + "core_tx_err_brtx=%d\n" + "core_tx_upd_attrib=%d\n" + "core_tx_upd_attrib_adhoc=%d\n" + "core_tx_upd_attrib_sta=%d\n" + "core_tx_upd_attrib_ap=%d\n" + "core_tx_upd_attrib_unknown=%d\n" + "core_tx_upd_attrib_dhcp=%d\n" + "core_tx_upd_attrib_icmp=%d\n" + "core_tx_upd_attrib_active=%d\n" + "core_tx_upd_attrib_err_ucast_sta=%d\n" + "core_tx_upd_attrib_err_ucast_ap_link=%d\n" + "core_tx_upd_attrib_err_sta=%d\n" + "core_tx_upd_attrib_err_link=%d\n" + "core_tx_upd_attrib_err_sec=%d\n" + "core_tx_ap_enqueue_warn_fwstate=%d\n" + "core_tx_ap_enqueue_warn_sta=%d\n" + "core_tx_ap_enqueue_warn_nosta=%d\n" + "core_tx_ap_enqueue_warn_link=%d\n" + "core_tx_ap_enqueue_warn_trigger=%d\n" + "core_tx_ap_enqueue_mcast=%d\n" + "core_tx_ap_enqueue_ucast=%d\n" + "core_tx_ap_enqueue=%d\n" + "intf_tx=%d\n" + "intf_tx_pending_ac=%d\n" + "intf_tx_pending_fw_under_survey=%d\n" + "intf_tx_pending_fw_under_linking=%d\n" + "intf_tx_pending_xmitbuf=%d\n" + "intf_tx_enqueue=%d\n" + "core_tx_enqueue=%d\n" + "core_tx_enqueue_class=%d\n" + "core_tx_enqueue_class_err_sta=%d\n" + "core_tx_enqueue_class_err_nosta=%d\n" + "core_tx_enqueue_class_err_fwlink=%d\n" + "intf_tx_direct=%d\n" + "intf_tx_direct_err_coalesce=%d\n" + "intf_tx_dequeue=%d\n" + "intf_tx_dequeue_err_coalesce=%d\n" + "intf_tx_dump_xframe=%d\n" + "intf_tx_dump_xframe_err_txdesc=%d\n" + "intf_tx_dump_xframe_err_port=%d\n", + tx_logs->os_tx, + tx_logs->os_tx_err_up, + tx_logs->os_tx_err_xmit, + tx_logs->os_tx_m2u, + tx_logs->os_tx_m2u_ignore_fw_linked, + tx_logs->os_tx_m2u_ignore_self, + tx_logs->os_tx_m2u_entry, + tx_logs->os_tx_m2u_entry_err_xmit, + tx_logs->os_tx_m2u_entry_err_skb, + tx_logs->os_tx_m2u_stop, + tx_logs->core_tx, + tx_logs->core_tx_err_pxmitframe, + tx_logs->core_tx_err_brtx, + tx_logs->core_tx_upd_attrib, + tx_logs->core_tx_upd_attrib_adhoc, + tx_logs->core_tx_upd_attrib_sta, + tx_logs->core_tx_upd_attrib_ap, + tx_logs->core_tx_upd_attrib_unknown, + tx_logs->core_tx_upd_attrib_dhcp, + tx_logs->core_tx_upd_attrib_icmp, + tx_logs->core_tx_upd_attrib_active, + tx_logs->core_tx_upd_attrib_err_ucast_sta, + tx_logs->core_tx_upd_attrib_err_ucast_ap_link, + tx_logs->core_tx_upd_attrib_err_sta, + tx_logs->core_tx_upd_attrib_err_link, + tx_logs->core_tx_upd_attrib_err_sec, + tx_logs->core_tx_ap_enqueue_warn_fwstate, + tx_logs->core_tx_ap_enqueue_warn_sta, + tx_logs->core_tx_ap_enqueue_warn_nosta, + tx_logs->core_tx_ap_enqueue_warn_link, + tx_logs->core_tx_ap_enqueue_warn_trigger, + tx_logs->core_tx_ap_enqueue_mcast, + tx_logs->core_tx_ap_enqueue_ucast, + tx_logs->core_tx_ap_enqueue, + tx_logs->intf_tx, + tx_logs->intf_tx_pending_ac, + tx_logs->intf_tx_pending_fw_under_survey, + tx_logs->intf_tx_pending_fw_under_linking, + tx_logs->intf_tx_pending_xmitbuf, + tx_logs->intf_tx_enqueue, + tx_logs->core_tx_enqueue, + tx_logs->core_tx_enqueue_class, + tx_logs->core_tx_enqueue_class_err_sta, + tx_logs->core_tx_enqueue_class_err_nosta, + tx_logs->core_tx_enqueue_class_err_fwlink, + tx_logs->intf_tx_direct, + tx_logs->intf_tx_direct_err_coalesce, + tx_logs->intf_tx_dequeue, + tx_logs->intf_tx_dequeue_err_coalesce, + tx_logs->intf_tx_dump_xframe, + tx_logs->intf_tx_dump_xframe_err_txdesc, + tx_logs->intf_tx_dump_xframe_err_port + ); return 0; } @@ -1793,47 +1942,47 @@ int proc_get_int_logs(struct seq_file *m, void *v) struct net_device *dev = m->private; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - DBG_871X_SEL_NL(m, - "all=%d\n" - "err=%d\n" - "tbdok=%d\n" - "tbder=%d\n" - "bcnderr=%d\n" - "bcndma=%d\n" - "bcndma_e=%d\n" - "rx=%d\n" - "rx_rdu=%d\n" - "rx_fovw=%d\n" - "txfovw=%d\n" - "mgntok=%d\n" - "highdok=%d\n" - "bkdok=%d\n" - "bedok=%d\n" - "vidok=%d\n" - "vodok=%d\n", - padapter->int_logs.all, - padapter->int_logs.err, - padapter->int_logs.tbdok, - padapter->int_logs.tbder, - padapter->int_logs.bcnderr, - padapter->int_logs.bcndma, - padapter->int_logs.bcndma_e, - padapter->int_logs.rx, - padapter->int_logs.rx_rdu, - padapter->int_logs.rx_fovw, - padapter->int_logs.txfovw, - padapter->int_logs.mgntok, - padapter->int_logs.highdok, - padapter->int_logs.bkdok, - padapter->int_logs.bedok, - padapter->int_logs.vidok, - padapter->int_logs.vodok - ); + RTW_PRINT_SEL(m, + "all=%d\n" + "err=%d\n" + "tbdok=%d\n" + "tbder=%d\n" + "bcnderr=%d\n" + "bcndma=%d\n" + "bcndma_e=%d\n" + "rx=%d\n" + "rx_rdu=%d\n" + "rx_fovw=%d\n" + "txfovw=%d\n" + "mgntok=%d\n" + "highdok=%d\n" + "bkdok=%d\n" + "bedok=%d\n" + "vidok=%d\n" + "vodok=%d\n", + padapter->int_logs.all, + padapter->int_logs.err, + padapter->int_logs.tbdok, + padapter->int_logs.tbder, + padapter->int_logs.bcnderr, + padapter->int_logs.bcndma, + padapter->int_logs.bcndma_e, + padapter->int_logs.rx, + padapter->int_logs.rx_rdu, + padapter->int_logs.rx_fovw, + padapter->int_logs.txfovw, + padapter->int_logs.mgntok, + padapter->int_logs.highdok, + padapter->int_logs.bkdok, + padapter->int_logs.bedok, + padapter->int_logs.vidok, + padapter->int_logs.vodok + ); return 0; } -#endif // CONFIG_DBG_COUNTER +#endif /* CONFIG_DBG_COUNTER */ int proc_get_hw_status(struct seq_file *m, void *v) { @@ -1841,37 +1990,108 @@ int proc_get_hw_status(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct dvobj_priv *dvobj = padapter->dvobj; struct debug_priv *pdbgpriv = &dvobj->drv_dbg; + struct registry_priv *regsty = dvobj_to_regsty(dvobj); - if (pdbgpriv->dbg_rx_fifo_last_overflow == 1 - && pdbgpriv->dbg_rx_fifo_curr_overflow == 1 - && pdbgpriv->dbg_rx_fifo_diff_overflow == 1 - ) { - DBG_871X_SEL_NL(m, "RX FIFO full count: no implementation\n"); - } else { - DBG_871X_SEL_NL(m, "RX FIFO full count: last_time=%llu, current_time=%llu, differential=%llu\n" + if (regsty->check_hw_status == 0) + RTW_PRINT_SEL(m, "RX FIFO full count: not check in watch dog\n"); + else if (pdbgpriv->dbg_rx_fifo_last_overflow == 1 + && pdbgpriv->dbg_rx_fifo_curr_overflow == 1 + && pdbgpriv->dbg_rx_fifo_diff_overflow == 1 + ) + RTW_PRINT_SEL(m, "RX FIFO full count: no implementation\n"); + else { + RTW_PRINT_SEL(m, "RX FIFO full count: last_time=%llu, current_time=%llu, differential=%llu\n" , pdbgpriv->dbg_rx_fifo_last_overflow, pdbgpriv->dbg_rx_fifo_curr_overflow, pdbgpriv->dbg_rx_fifo_diff_overflow); } return 0; } +ssize_t proc_set_hw_status(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 *dvobj = padapter->dvobj; + struct registry_priv *regsty = dvobj_to_regsty(dvobj); + char tmp[32]; + u32 enable; + + if (count < 1) + return -EFAULT; + + if (count > sizeof(tmp)) { + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + + int num = sscanf(tmp, "%d ", &enable); + + if (regsty && enable <= 1) { + regsty->check_hw_status = enable; + RTW_INFO("check_hw_status=%d\n", regsty->check_hw_status); + } + } + + return count; +} + +int proc_get_trx_info_debug(struct seq_file *m, void *v) +{ + struct net_device *dev = m->private; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + int i; + + + /*============ tx info ============ */ + rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, m); + + /*============ rx info ============ */ + rtw_hal_set_odm_var(padapter, HAL_ODM_RX_INFO_DUMP, m, _FALSE); + + + return 0; +} + int proc_get_rx_signal(struct seq_file *m, void *v) { struct net_device *dev = m->private; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - DBG_871X_SEL_NL(m, "rssi:%d\n", padapter->recvpriv.rssi); - //DBG_871X_SEL_NL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb); - DBG_871X_SEL_NL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength); - DBG_871X_SEL_NL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual); + RTW_PRINT_SEL(m, "rssi:%d\n", padapter->recvpriv.rssi); + /* RTW_PRINT_SEL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb); */ + RTW_PRINT_SEL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength); + RTW_PRINT_SEL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual); + if (padapter->registrypriv.mp_mode == 1) { + if (padapter->mppriv.antenna_rx == ANTENNA_A) + RTW_PRINT_SEL(m, "Antenna: A\n"); + else if (padapter->mppriv.antenna_rx == ANTENNA_B) + RTW_PRINT_SEL(m, "Antenna: B\n"); + else if (padapter->mppriv.antenna_rx == ANTENNA_C) + RTW_PRINT_SEL(m, "Antenna: C\n"); + else if (padapter->mppriv.antenna_rx == ANTENNA_D) + RTW_PRINT_SEL(m, "Antenna: D\n"); + else if (padapter->mppriv.antenna_rx == ANTENNA_AB) + RTW_PRINT_SEL(m, "Antenna: AB\n"); + else if (padapter->mppriv.antenna_rx == ANTENNA_BC) + RTW_PRINT_SEL(m, "Antenna: BC\n"); + else if (padapter->mppriv.antenna_rx == ANTENNA_CD) + RTW_PRINT_SEL(m, "Antenna: CD\n"); + else + RTW_PRINT_SEL(m, "Antenna: __\n"); + return 0; + } rtw_get_noise(padapter); - DBG_871X_SEL_NL(m, "noise:%d\n", padapter->recvpriv.noise); - #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA - rtw_odm_get_perpkt_rssi(m,padapter); - rtw_get_raw_rssi_info(m,padapter); - #endif + RTW_PRINT_SEL(m, "noise:%d\n", padapter->recvpriv.noise); +#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA + rtw_odm_get_perpkt_rssi(m, padapter); + rtw_get_raw_rssi_info(m, padapter); +#endif return 0; } @@ -1894,25 +2114,25 @@ ssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength); - is_signal_dbg = is_signal_dbg==0?0:1; - - if(is_signal_dbg && num!=2) + is_signal_dbg = is_signal_dbg == 0 ? 0 : 1; + + if (is_signal_dbg && num != 2) return count; - - signal_strength = signal_strength>100?100:signal_strength; + + signal_strength = signal_strength > 100 ? 100 : signal_strength; padapter->recvpriv.is_signal_dbg = is_signal_dbg; - padapter->recvpriv.signal_strength_dbg=signal_strength; + padapter->recvpriv.signal_strength_dbg = signal_strength; - if(is_signal_dbg) - DBG_871X("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength); + if (is_signal_dbg) + RTW_INFO("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength); else - DBG_871X("set %s\n", "HW_SIGNAL_STRENGTH"); - + RTW_INFO("set %s\n", "HW_SIGNAL_STRENGTH"); + } - + return count; - + } #ifdef CONFIG_80211N_HT @@ -1922,8 +2142,8 @@ int proc_get_ht_enable(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct registry_priv *pregpriv = &padapter->registrypriv; - if(pregpriv) - DBG_871X_SEL_NL(m, "%d\n", pregpriv->ht_enable); + if (pregpriv) + RTW_PRINT_SEL(m, "%d\n", pregpriv->ht_enable); return 0; } @@ -1948,15 +2168,14 @@ ssize_t proc_set_ht_enable(struct file *file, const char __user *buffer, size_t int num = sscanf(tmp, "%d ", &mode); - if( pregpriv && mode < 2 ) - { - pregpriv->ht_enable= mode; - DBG_871X("ht_enable=%d\n", pregpriv->ht_enable); + if (pregpriv && mode < 2) { + pregpriv->ht_enable = mode; + RTW_INFO("ht_enable=%d\n", pregpriv->ht_enable); } } - + return count; - + } int proc_get_bw_mode(struct seq_file *m, void *v) @@ -1965,8 +2184,8 @@ int proc_get_bw_mode(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct registry_priv *pregpriv = &padapter->registrypriv; - if(pregpriv) - DBG_871X_SEL_NL(m, "0x%02x\n", pregpriv->bw_mode); + if (pregpriv) + RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->bw_mode); return 0; } @@ -1978,6 +2197,8 @@ ssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t co struct registry_priv *pregpriv = &padapter->registrypriv; char tmp[32]; u32 mode; + u8 bw_2g; + u8 bw_5g; if (count < 1) return -EFAULT; @@ -1989,19 +2210,20 @@ ssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t co if (buffer && !copy_from_user(tmp, buffer, count)) { - int num = sscanf(tmp, "%d ", &mode); + int num = sscanf(tmp, "%x ", &mode); + bw_5g = mode >> 4; + bw_2g = mode & 0x0f; - if( pregpriv && mode < 2 ) - { + if (pregpriv && bw_2g <= 4 && bw_5g <= 4) { pregpriv->bw_mode = mode; - printk("bw_mode=%d\n", mode); + printk("bw_mode=0x%x\n", mode); } } - + return count; - + } int proc_get_ampdu_enable(struct seq_file *m, void *v) @@ -2010,8 +2232,8 @@ int proc_get_ampdu_enable(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct registry_priv *pregpriv = &padapter->registrypriv; - if(pregpriv) - DBG_871X_SEL_NL(m, "%d\n", pregpriv->ampdu_enable); + if (pregpriv) + RTW_PRINT_SEL(m, "%d\n", pregpriv->ampdu_enable); return 0; } @@ -2036,16 +2258,15 @@ ssize_t proc_set_ampdu_enable(struct file *file, const char __user *buffer, size int num = sscanf(tmp, "%d ", &mode); - if( pregpriv && mode < 3 ) - { - pregpriv->ampdu_enable= mode; + if (pregpriv && mode < 2) { + pregpriv->ampdu_enable = mode; printk("ampdu_enable=%d\n", mode); } } - + return count; - + } int proc_get_mac_rptbuf(struct seq_file *m, void *v) @@ -2057,20 +2278,20 @@ int proc_get_mac_rptbuf(struct seq_file *m, void *v) u32 shcut_addr = 0; u32 read_addr = 0; #ifdef CONFIG_RTL8814A - DBG_871X_SEL_NL(m, "TX ShortCut:\n"); + RTW_PRINT_SEL(m, "TX ShortCut:\n"); for (mac_id = 0; mac_id < 64; mac_id++) { - rtw_write16(padapter, 0x140, 0x662 | ((mac_id & BIT5)>>5)); + rtw_write16(padapter, 0x140, 0x662 | ((mac_id & BIT5) >> 5)); shcut_addr = 0x8000; - shcut_addr = shcut_addr | ((mac_id&0x1f) << 7); - DBG_871X_SEL_NL(m, "mac_id=%d, 0x140=%x =>\n", mac_id, 0x662 | ((mac_id & BIT5)>>5)); + shcut_addr = shcut_addr | ((mac_id & 0x1f) << 7); + RTW_PRINT_SEL(m, "mac_id=%d, 0x140=%x =>\n", mac_id, 0x662 | ((mac_id & BIT5) >> 5)); for (i = 0; i < 30; i++) { read_addr = 0; - read_addr = shcut_addr | (i<<2); - DBG_871X_SEL_NL(m, "i=%02d: MAC_%04x= %08x ", i, read_addr, rtw_read32(padapter, read_addr)); - if (!((i+1) % 4)) - DBG_871X_SEL_NL(m, "\n"); + read_addr = shcut_addr | (i << 2); + RTW_PRINT_SEL(m, "i=%02d: MAC_%04x= %08x ", i, read_addr, rtw_read32(padapter, read_addr)); + if (!((i + 1) % 4)) + RTW_PRINT_SEL(m, "\n"); if (i == 29) - DBG_871X_SEL_NL(m, "\n"); + RTW_PRINT_SEL(m, "\n"); } } #endif /* CONFIG_RTL8814A */ @@ -2083,21 +2304,21 @@ int proc_get_rx_ampdu(struct seq_file *m, void *v) struct net_device *dev = m->private; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - DBG_871X_SEL(m, "accept: "); + _RTW_PRINT_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)"); + RTW_PRINT_SEL(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)"); + RTW_PRINT_SEL(m, "%u%s\n", padapter->fix_rx_ampdu_accept, "(fixed)"); - DBG_871X_SEL(m, "size: "); + _RTW_PRINT_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)"); + RTW_PRINT_SEL(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)"); + RTW_PRINT_SEL(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"); + RTW_PRINT_SEL(m, "%19s %17s\n", "fix_rx_ampdu_accept", "fix_rx_ampdu_size"); - DBG_871X_SEL(m, "%-19d %-17u\n" + _RTW_PRINT_SEL(m, "%-19d %-17u\n" , padapter->fix_rx_ampdu_accept , padapter->fix_rx_ampdu_size); @@ -2144,16 +2365,14 @@ int proc_get_rx_ampdu_factor(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - if(padapter) - { - DBG_871X_SEL_NL(m,"rx ampdu factor = %x\n",padapter->driver_rx_ampdu_factor); - } - + if (padapter) + RTW_PRINT_SEL(m, "rx ampdu factor = %x\n", padapter->driver_rx_ampdu_factor); + return 0; } ssize_t proc_set_rx_ampdu_factor(struct file *file, const char __user *buffer - , size_t count, loff_t *pos, void *data) + , size_t count, loff_t *pos, void *data) { struct net_device *dev = data; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); @@ -2172,14 +2391,13 @@ ssize_t proc_set_rx_ampdu_factor(struct file *file, const char __user *buffer int num = sscanf(tmp, "%d ", &factor); - if( padapter && (num == 1) ) - { - DBG_871X("padapter->driver_rx_ampdu_factor = %x\n", factor); + if (padapter && (num == 1)) { + RTW_INFO("padapter->driver_rx_ampdu_factor = %x\n", factor); - if(factor > 0x03) + if (factor > 0x03) padapter->driver_rx_ampdu_factor = 0xFF; else - padapter->driver_rx_ampdu_factor = factor; + padapter->driver_rx_ampdu_factor = factor; } } @@ -2192,10 +2410,8 @@ int proc_get_rx_ampdu_density(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - if(padapter) - { - DBG_871X_SEL_NL(m,"rx ampdu densityg = %x\n",padapter->driver_rx_ampdu_spacing); - } + if (padapter) + RTW_PRINT_SEL(m, "rx ampdu densityg = %x\n", padapter->driver_rx_ampdu_spacing); return 0; } @@ -2219,11 +2435,10 @@ ssize_t proc_set_rx_ampdu_density(struct file *file, const char __user *buffer, int num = sscanf(tmp, "%d ", &density); - if( padapter && (num == 1) ) - { - DBG_871X("padapter->driver_rx_ampdu_spacing = %x\n", density); + if (padapter && (num == 1)) { + RTW_INFO("padapter->driver_rx_ampdu_spacing = %x\n", density); - if(density > 0x07) + if (density > 0x07) padapter->driver_rx_ampdu_spacing = 0xFF; else padapter->driver_rx_ampdu_spacing = density; @@ -2239,10 +2454,8 @@ int proc_get_tx_ampdu_density(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - if(padapter) - { - DBG_871X_SEL_NL(m,"tx ampdu density = %x\n",padapter->driver_ampdu_spacing); - } + if (padapter) + RTW_PRINT_SEL(m, "tx ampdu density = %x\n", padapter->driver_ampdu_spacing); return 0; } @@ -2266,11 +2479,10 @@ ssize_t proc_set_tx_ampdu_density(struct file *file, const char __user *buffer, int num = sscanf(tmp, "%d ", &density); - if( padapter && (num == 1) ) - { - DBG_871X("padapter->driver_ampdu_spacing = %x\n", density); + if (padapter && (num == 1)) { + RTW_INFO("padapter->driver_ampdu_spacing = %x\n", density); - if(density > 0x07) + if (density > 0x07) padapter->driver_ampdu_spacing = 0xFF; else padapter->driver_ampdu_spacing = density; @@ -2279,7 +2491,7 @@ ssize_t proc_set_tx_ampdu_density(struct file *file, const char __user *buffer, return count; } -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ int proc_get_en_fwps(struct seq_file *m, void *v) { @@ -2289,9 +2501,9 @@ int proc_get_en_fwps(struct seq_file *m, void *v) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - if(pregpriv) - DBG_871X_SEL_NL(m, "check_fw_ps = %d , 1:enable get FW PS state , 0: disable get FW PS state\n" - , pregpriv->check_fw_ps); + if (pregpriv) + RTW_PRINT_SEL(m, "check_fw_ps = %d , 1:enable get FW PS state , 0: disable get FW PS state\n" + , pregpriv->check_fw_ps); return 0; } @@ -2318,10 +2530,9 @@ ssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t co int num = sscanf(tmp, "%d ", &mode); - if( pregpriv && mode < 2 ) - { + if (pregpriv && mode < 2) { pregpriv->check_fw_ps = mode; - DBG_871X("pregpriv->check_fw_ps=%d \n",pregpriv->check_fw_ps); + RTW_INFO("pregpriv->check_fw_ps=%d\n", pregpriv->check_fw_ps); } } @@ -2336,21 +2547,156 @@ int proc_get_two_path_rssi(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); if(padapter) - DBG_871X_SEL_NL(m, "%d %d\n", + RTW_PRINT_SEL(m, "%d %d\n", padapter->recvpriv.RxRssi[0], padapter->recvpriv.RxRssi[1]); return 0; } */ #ifdef CONFIG_80211N_HT +void rtw_dump_dft_phy_cap(void *sel, _adapter *adapter) +{ + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + #ifdef CONFIG_80211AC_VHT + struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; + #endif + + #ifdef CONFIG_80211AC_VHT + RTW_PRINT_SEL(sel, "[DFT CAP] VHT STBC Tx : %s\n", (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DFT CAP] VHT STBC Rx : %s\n", (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX)) ? "V" : "X"); + #endif + RTW_PRINT_SEL(sel, "[DFT CAP] HT STBC Tx : %s\n", (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DFT CAP] HT STBC Rx : %s\n\n", (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX)) ? "V" : "X"); + + #ifdef CONFIG_80211AC_VHT + RTW_PRINT_SEL(sel, "[DFT CAP] VHT LDPC Tx : %s\n", (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DFT CAP] VHT LDPC Rx : %s\n", (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX)) ? "V" : "X"); + #endif + RTW_PRINT_SEL(sel, "[DFT CAP] HT LDPC Tx : %s\n", (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DFT CAP] HT LDPC Rx : %s\n\n", (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX)) ? "V" : "X"); + + #ifdef CONFIG_BEAMFORMING + #ifdef CONFIG_80211AC_VHT + RTW_PRINT_SEL(sel, "[DFT CAP] VHT MU Bfer : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DFT CAP] VHT MU Bfee : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DFT CAP] VHT SU Bfer : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DFT CAP] VHT SU Bfee : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) ? "V" : "X"); + #endif + RTW_PRINT_SEL(sel, "[DFT CAP] HT Bfer : %s\n", (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DFT CAP] HT Bfee : %s\n", (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE)) ? "V" : "X"); + #endif +} + +void rtw_get_dft_phy_cap(void *sel, _adapter *adapter) +{ + rtw_ht_use_default_setting(adapter); + #ifdef CONFIG_80211AC_VHT + rtw_vht_use_default_setting(adapter); + #endif + rtw_dump_dft_phy_cap(sel, adapter); +} + +void rtw_dump_drv_phy_cap(void *sel, _adapter *adapter) +{ + struct registry_priv *pregistry_priv = &adapter->registrypriv; + + #if 0 + RTW_PRINT_SEL(sel, "[DRV CAP] TRx Capability : 0x%08x\n", phy_spec->trx_cap); + RTW_PRINT_SEL(sel, "[DRV CAP] Tx Stream Num Index : %d\n", (phy_spec->trx_cap >> 24) & 0xFF); /*Tx Stream Num Index [31:24]*/ + RTW_PRINT_SEL(sel, "[DRV CAP] Rx Stream Num Index : %d\n", (phy_spec->trx_cap >> 16) & 0xFF); /*Rx Stream Num Index [23:16]*/ + RTW_PRINT_SEL(sel, "[DRV CAP] Tx Path Num Index : %d\n", (phy_spec->trx_cap >> 8) & 0xFF);/*Tx Path Num Index [15:8]*/ + RTW_PRINT_SEL(sel, "[DRV CAP] Rx Path Num Index : %d\n", (phy_spec->trx_cap & 0xFF));/*Rx Path Num Index [7:0]*/ + #endif + + RTW_PRINT_SEL(sel, "[DRV CAP] STBC Capability : 0x%02x\n", pregistry_priv->stbc_cap); + RTW_PRINT_SEL(sel, "[DRV CAP] VHT STBC Tx : %s\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT1)) ? "V" : "X"); /*BIT1: Enable VHT STBC Tx*/ + RTW_PRINT_SEL(sel, "[DRV CAP] VHT STBC Rx : %s\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT0)) ? "V" : "X"); /*BIT0: Enable VHT STBC Rx*/ + RTW_PRINT_SEL(sel, "[DRV CAP] HT STBC Tx : %s\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT5)) ? "V" : "X"); /*BIT5: Enable HT STBC Tx*/ + RTW_PRINT_SEL(sel, "[DRV CAP] HT STBC Rx : %s\n\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT4)) ? "V" : "X"); /*BIT4: Enable HT STBC Rx*/ + + RTW_PRINT_SEL(sel, "[DRV CAP] LDPC Capability : 0x%02x\n", pregistry_priv->ldpc_cap); + RTW_PRINT_SEL(sel, "[DRV CAP] VHT LDPC Tx : %s\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT1)) ? "V" : "X"); /*BIT1: Enable VHT LDPC Tx*/ + RTW_PRINT_SEL(sel, "[DRV CAP] VHT LDPC Rx : %s\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT0)) ? "V" : "X"); /*BIT0: Enable VHT LDPC Rx*/ + RTW_PRINT_SEL(sel, "[DRV CAP] HT LDPC Tx : %s\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT5)) ? "V" : "X"); /*BIT5: Enable HT LDPC Tx*/ + RTW_PRINT_SEL(sel, "[DRV CAP] HT LDPC Rx : %s\n\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT4)) ? "V" : "X"); /*BIT4: Enable HT LDPC Rx*/ + + #if 0 + RTW_PRINT_SEL(sel, "[DRV CAP] TxBF parameter : 0x%08x\n", phy_spec->txbf_param); + RTW_PRINT_SEL(sel, "[DRV CAP] VHT Sounding Dim : %d\n", (phy_spec->txbf_param >> 24) & 0xFF); /*VHT Sounding Dim [31:24]*/ + RTW_PRINT_SEL(sel, "[DRV CAP] VHT Steering Ant : %d\n", (phy_spec->txbf_param >> 16) & 0xFF); /*VHT Steering Ant [23:16]*/ + RTW_PRINT_SEL(sel, "[DRV CAP] HT Sounding Dim : %d\n", (phy_spec->txbf_param >> 8) & 0xFF); /*HT Sounding Dim [15:8]*/ + RTW_PRINT_SEL(sel, "[DRV CAP] HT Steering Ant : %d\n", phy_spec->txbf_param & 0xFF); /*HT Steering Ant [7:0]*/ + #endif + + /* + * BIT0: Enable VHT SU Beamformer + * BIT1: Enable VHT SU Beamformee + * BIT2: Enable VHT MU Beamformer, depend on VHT SU Beamformer + * BIT3: Enable VHT MU Beamformee, depend on VHT SU Beamformee + * BIT4: Enable HT Beamformer + * BIT5: Enable HT Beamformee + */ + RTW_PRINT_SEL(sel, "[DRV CAP] TxBF Capability : 0x%02x\n", pregistry_priv->beamform_cap); + RTW_PRINT_SEL(sel, "[DRV CAP] VHT MU Bfer : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT2)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DRV CAP] VHT MU Bfee : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT3)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DRV CAP] VHT SU Bfer : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT0)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DRV CAP] VHT SU Bfee : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT1)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DRV CAP] HT Bfer : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT4)) ? "V" : "X"); + RTW_PRINT_SEL(sel, "[DRV CAP] HT Bfee : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT5)) ? "V" : "X"); + + RTW_PRINT_SEL(sel, "[DRV CAP] Tx Bfer rf_num : %d\n", pregistry_priv->beamformer_rf_num); + RTW_PRINT_SEL(sel, "[DRV CAP] Tx Bfee rf_num : %d\n", pregistry_priv->beamformee_rf_num); +} + +int proc_get_stbc_cap(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; + + if (pregpriv) + RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->stbc_cap); + + return 0; +} + +ssize_t proc_set_stbc_cap(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 registry_priv *pregpriv = &padapter->registrypriv; + char tmp[32]; + u32 mode; + + if (count < 1) + return -EFAULT; + + if (count > sizeof(tmp)) { + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + + int num = sscanf(tmp, "%d ", &mode); + + if (pregpriv) { + pregpriv->stbc_cap = mode; + RTW_INFO("stbc_cap = 0x%02x\n", mode); + } + } + + return count; +} int proc_get_rx_stbc(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; - if(pregpriv) - DBG_871X_SEL_NL(m, "%d\n", pregpriv->rx_stbc); + if (pregpriv) + RTW_PRINT_SEL(m, "%d\n", pregpriv->rx_stbc); return 0; } @@ -2375,17 +2721,98 @@ ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t co int num = sscanf(tmp, "%d ", &mode); - if( pregpriv && (mode == 0 || mode == 1|| mode == 2|| mode == 3)) - { - pregpriv->rx_stbc= mode; + if (pregpriv && (mode == 0 || mode == 1 || mode == 2 || mode == 3)) { + pregpriv->rx_stbc = mode; printk("rx_stbc=%d\n", mode); } } - + return count; - + } -#endif //CONFIG_80211N_HT +int proc_get_ldpc_cap(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; + + if (pregpriv) + RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->ldpc_cap); + + return 0; +} + +ssize_t proc_set_ldpc_cap(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 registry_priv *pregpriv = &padapter->registrypriv; + char tmp[32]; + u32 mode; + + if (count < 1) + return -EFAULT; + + if (count > sizeof(tmp)) { + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + + int num = sscanf(tmp, "%d ", &mode); + + if (pregpriv) { + pregpriv->ldpc_cap = mode; + RTW_INFO("ldpc_cap = 0x%02x\n", mode); + } + } + + return count; +} +#ifdef CONFIG_BEAMFORMING +int proc_get_txbf_cap(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; + + if (pregpriv) + RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->beamform_cap); + + return 0; +} + +ssize_t proc_set_txbf_cap(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 registry_priv *pregpriv = &padapter->registrypriv; + char tmp[32]; + u32 mode; + + if (count < 1) + return -EFAULT; + + if (count > sizeof(tmp)) { + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + + int num = sscanf(tmp, "%d ", &mode); + + if (pregpriv) { + pregpriv->beamform_cap = mode; + RTW_INFO("beamform_cap = 0x%02x\n", mode); + } + } + + return count; +} +#endif +#endif /* CONFIG_80211N_HT */ /*int proc_get_rssi_disp(struct seq_file *m, void *v) { @@ -2403,9 +2830,9 @@ ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t co if (count < 1) { - DBG_8192C("argument size is less than 1\n"); + RTW_INFO("argument size is less than 1\n"); return -EFAULT; - } + } if (count > sizeof(tmp)) { rtw_warn_on(1); @@ -2417,28 +2844,28 @@ ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t co int num = sscanf(tmp, "%x", &enable); if (num != 1) { - DBG_8192C("invalid set_rssi_disp parameter!\n"); + RTW_INFO("invalid set_rssi_disp parameter!\n"); return count; } - + if(enable) - { - DBG_8192C("Linked info Function Enable\n"); - padapter->bLinkInfoDump = enable ; + { + RTW_INFO("Linked info Function Enable\n"); + padapter->bLinkInfoDump = enable ; } else { - DBG_8192C("Linked info Function Disable\n"); + RTW_INFO("Linked info Function Disable\n"); padapter->bLinkInfoDump = 0 ; } - - } - - return count; - -} -*/ + } + + return count; + +} + +*/ #ifdef CONFIG_AP_MODE int proc_get_all_sta_info(struct seq_file *m, void *v) @@ -2451,58 +2878,62 @@ int proc_get_all_sta_info(struct seq_file *m, void *v) int i; _list *plist, *phead; - DBG_871X_SEL_NL(m, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap); + RTW_PRINT_SEL(m, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap); _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - for(i=0; i< NUM_STA; i++) - { + 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) - { + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); plist = get_next(plist); - //if(extra_arg == psta->aid) + /* if(extra_arg == psta->aid) */ { - DBG_871X_SEL_NL(m, "==============================\n"); - DBG_871X_SEL_NL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); - DBG_871X_SEL_NL(m, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); - DBG_871X_SEL_NL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); + RTW_PRINT_SEL(m, "==============================\n"); + RTW_PRINT_SEL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); + RTW_PRINT_SEL(m, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); + RTW_PRINT_SEL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); #ifdef CONFIG_80211N_HT - DBG_871X_SEL_NL(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); - DBG_871X_SEL_NL(m, "bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\n", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m); - DBG_871X_SEL_NL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); - DBG_871X_SEL_NL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); -#endif //CONFIG_80211N_HT - DBG_871X_SEL_NL(m, "sleepq_len=%d\n", psta->sleepq_len); - DBG_871X_SEL_NL(m, "sta_xmitpriv.vo_q_qcnt=%d\n", psta->sta_xmitpriv.vo_q.qcnt); - DBG_871X_SEL_NL(m, "sta_xmitpriv.vi_q_qcnt=%d\n", psta->sta_xmitpriv.vi_q.qcnt); - DBG_871X_SEL_NL(m, "sta_xmitpriv.be_q_qcnt=%d\n", psta->sta_xmitpriv.be_q.qcnt); - DBG_871X_SEL_NL(m, "sta_xmitpriv.bk_q_qcnt=%d\n", psta->sta_xmitpriv.bk_q.qcnt); + RTW_PRINT_SEL(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); + RTW_PRINT_SEL(m, "bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\n", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m); + RTW_PRINT_SEL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); + RTW_PRINT_SEL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); +#endif /* CONFIG_80211N_HT */ + RTW_PRINT_SEL(m, "sleepq_len=%d\n", psta->sleepq_len); + RTW_PRINT_SEL(m, "sta_xmitpriv.vo_q_qcnt=%d\n", psta->sta_xmitpriv.vo_q.qcnt); + RTW_PRINT_SEL(m, "sta_xmitpriv.vi_q_qcnt=%d\n", psta->sta_xmitpriv.vi_q.qcnt); + RTW_PRINT_SEL(m, "sta_xmitpriv.be_q_qcnt=%d\n", psta->sta_xmitpriv.be_q.qcnt); + RTW_PRINT_SEL(m, "sta_xmitpriv.bk_q_qcnt=%d\n", psta->sta_xmitpriv.bk_q.qcnt); - DBG_871X_SEL_NL(m, "capability=0x%x\n", psta->capability); - DBG_871X_SEL_NL(m, "flags=0x%x\n", psta->flags); - DBG_871X_SEL_NL(m, "wpa_psk=0x%x\n", psta->wpa_psk); - DBG_871X_SEL_NL(m, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher); - 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); + RTW_PRINT_SEL(m, "capability=0x%x\n", psta->capability); + RTW_PRINT_SEL(m, "flags=0x%x\n", psta->flags); + RTW_PRINT_SEL(m, "wpa_psk=0x%x\n", psta->wpa_psk); + RTW_PRINT_SEL(m, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher); + RTW_PRINT_SEL(m, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher); + RTW_PRINT_SEL(m, "qos_info=0x%x\n", psta->qos_info); + RTW_PRINT_SEL(m, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy); 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); - DBG_871X_SEL_NL(m, "PeerKey_Lifetime=%d\n", psta->TDLS_PeerKey_Lifetime); - DBG_871X_SEL_NL(m, "rx_data_pkts=%llu\n", psta->sta_stats.rx_data_pkts); - DBG_871X_SEL_NL(m, "rx_bytes=%llu\n", psta->sta_stats.rx_bytes); - DBG_871X_SEL_NL(m, "tx_data_pkts=%llu\n", psta->sta_stats.tx_pkts); - DBG_871X_SEL_NL(m, "tx_bytes=%llu\n", psta->sta_stats.tx_bytes); -#endif //CONFIG_TDLS - DBG_871X_SEL_NL(m, "==============================\n"); + RTW_PRINT_SEL(m, "tdls_sta_state=0x%08x\n", psta->tdls_sta_state); + RTW_PRINT_SEL(m, "PeerKey_Lifetime=%d\n", psta->TDLS_PeerKey_Lifetime); + RTW_PRINT_SEL(m, "rx_data_pkts=%llu\n", psta->sta_stats.rx_data_pkts); + RTW_PRINT_SEL(m, "rx_bytes=%llu\n", psta->sta_stats.rx_bytes); + RTW_PRINT_SEL(m, "tx_data_pkts=%llu\n", psta->sta_stats.tx_pkts); + RTW_PRINT_SEL(m, "tx_bytes=%llu\n", psta->sta_stats.tx_bytes); +#endif /* CONFIG_TDLS */ + + dump_st_ctl(m, &psta->st_ctl); + + if (STA_OP_WFD_MODE(psta)) + RTW_PRINT_SEL(m, "op_wfd_mode:0x%02x\n", STA_OP_WFD_MODE(psta)); + + RTW_PRINT_SEL(m, "==============================\n"); } } @@ -2514,7 +2945,7 @@ int proc_get_all_sta_info(struct seq_file *m, void *v) return 0; } -#endif +#endif #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER int proc_get_rtkm_info(struct seq_file *m, void *v) @@ -2523,16 +2954,16 @@ int proc_get_rtkm_info(struct seq_file *m, void *v) _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct recv_priv *precvpriv = &padapter->recvpriv; struct recv_buf *precvbuf; - + precvbuf = (struct recv_buf *)precvpriv->precv_buf; - DBG_871X_SEL_NL(m, "============[RTKM Info]============\n"); - DBG_871X_SEL_NL(m, "MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", rtw_rtkm_get_nr_recv_skb()); - DBG_871X_SEL_NL(m, "MAX_RTKM_RECVBUF_SZ: %d\n", rtw_rtkm_get_buff_size()); + RTW_PRINT_SEL(m, "============[RTKM Info]============\n"); + RTW_PRINT_SEL(m, "MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", rtw_rtkm_get_nr_recv_skb()); + RTW_PRINT_SEL(m, "MAX_RTKM_RECVBUF_SZ: %d\n", rtw_rtkm_get_buff_size()); - DBG_871X_SEL_NL(m, "============[Driver Info]============\n"); - DBG_871X_SEL_NL(m, "NR_PREALLOC_RECV_SKB: %d\n", NR_PREALLOC_RECV_SKB); - DBG_871X_SEL_NL(m, "MAX_RECVBUF_SZ: %d\n", precvbuf->alloc_sz); + RTW_PRINT_SEL(m, "============[Driver Info]============\n"); + RTW_PRINT_SEL(m, "NR_PREALLOC_RECV_SKB: %d\n", NR_PREALLOC_RECV_SKB); + RTW_PRINT_SEL(m, "MAX_RECVBUF_SZ: %d\n", precvbuf->alloc_sz); return 0; } @@ -2545,8 +2976,8 @@ extern atomic_t _malloc_size;; int proc_get_malloc_cnt(struct seq_file *m, void *v) { - DBG_871X_SEL_NL(m, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt)); - DBG_871X_SEL_NL(m, "_malloc_size=%d\n", atomic_read(&_malloc_size)); + RTW_PRINT_SEL(m, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt)); + RTW_PRINT_SEL(m, "_malloc_size=%d\n", atomic_read(&_malloc_size)); return 0; } @@ -2560,50 +2991,50 @@ int proc_get_best_channel(struct seq_file *m, void *v) 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) + 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) + if (pmlmeext->channel_set[i].ChannelNum == 36) index_5G = i; - } - - for (i=0; (i < MAX_CHANNEL_NUM) && (pmlmeext->channel_set[i].ChannelNum !=0) ; i++) { - // 2.4G - if ( pmlmeext->channel_set[i].ChannelNum == 6 ) { - if ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) { + } + + for (i = 0; (i < MAX_CHANNEL_NUM) && (pmlmeext->channel_set[i].ChannelNum != 0) ; i++) { + /* 2.4G */ + if (pmlmeext->channel_set[i].ChannelNum == 6) { + if (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count) { 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) ) { + /* 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) ) { + 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_SEL_NL(m, "The rx cnt of channel %3d = %d\n", - pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count); +#if 1 /* debug */ + RTW_PRINT_SEL(m, "The rx cnt of channel %3d = %d\n", + pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count); #endif } - - DBG_871X_SEL_NL(m, "best_channel_5G = %d\n", best_channel_5G); - DBG_871X_SEL_NL(m, "best_channel_24G = %d\n", best_channel_24G); + + RTW_PRINT_SEL(m, "best_channel_5G = %d\n", best_channel_5G); + RTW_PRINT_SEL(m, "best_channel_24G = %d\n", best_channel_24G); return 0; } @@ -2615,7 +3046,7 @@ ssize_t proc_set_best_channel(struct file *file, const char __user *buffer, size struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; char tmp[32]; - if(count < 1) + if (count < 1) return -EFAULT; if (count > sizeof(tmp)) { @@ -2625,12 +3056,10 @@ ssize_t proc_set_best_channel(struct file *file, const char __user *buffer, size if (buffer && !copy_from_user(tmp, buffer, count)) { int i; - for(i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++) - { + for (i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++) pmlmeext->channel_set[i].rx_count = 0; - } - DBG_871X("set %s\n", "Clean Best Channel Count"); + RTW_INFO("set %s\n", "Clean Best Channel Count"); } return count; @@ -2647,7 +3076,7 @@ int proc_get_btcoex_dbg(struct seq_file *m, void *v) rtw_btcoex_GetDBG(padapter, buf, 512); - DBG_871X_SEL(m, "%s", buf); + _RTW_PRINT_SEL(m, "%s", buf); return 0; } @@ -2662,20 +3091,18 @@ ssize_t proc_set_btcoex_dbg(struct file *file, const char __user *buffer, size_t padapter = (PADAPTER)rtw_netdev_priv(dev); -// DBG_871X("+" FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter)); + /* RTW_INFO("+" FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter)); */ + + if (NULL == buffer) { + RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", + FUNC_ADPT_ARG(padapter)); - if (NULL == buffer) - { - DBG_871X(FUNC_ADPT_FMT ": input buffer is NULL!\n", - FUNC_ADPT_ARG(padapter)); - return -EFAULT; } - if (count < 1) - { - DBG_871X(FUNC_ADPT_FMT ": input length is 0!\n", - FUNC_ADPT_ARG(padapter)); + if (count < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", + FUNC_ADPT_ARG(padapter)); return -EFAULT; } @@ -2684,33 +3111,29 @@ ssize_t proc_set_btcoex_dbg(struct file *file, const char __user *buffer, size_t if (num > (sizeof(tmp) - 1)) num = (sizeof(tmp) - 1); - if (copy_from_user(tmp, buffer, num)) - { - DBG_871X(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n", - FUNC_ADPT_ARG(padapter)); + if (copy_from_user(tmp, buffer, num)) { + RTW_INFO(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n", + FUNC_ADPT_ARG(padapter)); return -EFAULT; } - num = sscanf(tmp, "%x %x", module, module+1); - if (1 == num) - { + num = sscanf(tmp, "%x %x", module, module + 1); + if (1 == num) { if (0 == module[0]) _rtw_memset(module, 0, sizeof(module)); else _rtw_memset(module, 0xFF, sizeof(module)); - } - else if (2 != num) - { - DBG_871X(FUNC_ADPT_FMT ": input(\"%s\") format incorrect!\n", - FUNC_ADPT_ARG(padapter), tmp); + } else if (2 != num) { + RTW_INFO(FUNC_ADPT_FMT ": input(\"%s\") format incorrect!\n", + FUNC_ADPT_ARG(padapter), tmp); if (0 == num) return -EFAULT; } - DBG_871X(FUNC_ADPT_FMT ": input 0x%08X 0x%08X\n", - FUNC_ADPT_ARG(padapter), module[0], module[1]); + RTW_INFO(FUNC_ADPT_FMT ": input 0x%08X 0x%08X\n", + FUNC_ADPT_ARG(padapter), module[0], module[1]); rtw_btcoex_SetDBG(padapter, module); return count; @@ -2720,20 +3143,19 @@ int proc_get_btcoex_info(struct seq_file *m, void *v) { struct net_device *dev = m->private; PADAPTER padapter; - const u32 bufsize = 30*100; + const u32 bufsize = 30 * 100; u8 *pbuf = NULL; padapter = (PADAPTER)rtw_netdev_priv(dev); pbuf = rtw_zmalloc(bufsize); - if (NULL == pbuf) { + if (NULL == pbuf) return -ENOMEM; - } rtw_btcoex_DisplayBtCoexInfo(padapter, pbuf, bufsize); - DBG_871X_SEL(m, "%s\n", pbuf); - + _RTW_PRINT_SEL(m, "%s\n", pbuf); + rtw_mfree(pbuf, bufsize); return 0; @@ -2774,9 +3196,9 @@ ssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t cou else sreset_set_trigger_point(padapter, trigger_point); } - + return count; - + } #endif /* DBG_CONFIG_ERROR_DETECT */ @@ -2792,28 +3214,30 @@ int proc_get_rx_ring(struct seq_file *m, void *v) struct rtw_rx_ring *rx_ring = &precvpriv->rx_ring[RX_MPDU_QUEUE]; int i, j; - DBG_871X_SEL_NL(m, "rx ring (%p)\n", rx_ring); - DBG_871X_SEL_NL(m, " dma: 0x%08x\n", (int) rx_ring->dma); - DBG_871X_SEL_NL(m, " idx: %d\n", rx_ring->idx); + RTW_PRINT_SEL(m, "rx ring (%p)\n", rx_ring); + RTW_PRINT_SEL(m, " dma: 0x%08x\n", (int) rx_ring->dma); + RTW_PRINT_SEL(m, " idx: %d\n", rx_ring->idx); _enter_critical(&pdvobjpriv->irq_th_lock, &irqL); - for (i=0; irxringcount; i++) - { + for (i = 0; i < precvpriv->rxringcount; i++) { +#ifdef CONFIG_TRX_BD_ARCH + struct rx_buf_desc *entry = &rx_ring->buf_desc[i]; +#else struct recv_stat *entry = &rx_ring->desc[i]; +#endif struct sk_buff *skb = rx_ring->rx_buf[i]; - DBG_871X_SEL_NL(m, " desc[%03d]: %p, rx_buf[%03d]: 0x%08x\n", + RTW_PRINT_SEL(m, " desc[%03d]: %p, rx_buf[%03d]: 0x%08x\n", i, entry, i, cpu_to_le32(*((dma_addr_t *)skb->cb))); - for (j=0; jirq_th_lock, &irqL); @@ -2831,31 +3255,32 @@ int proc_get_tx_ring(struct seq_file *m, void *v) int i, j, k; _enter_critical(&pdvobjpriv->irq_th_lock, &irqL); - for (i = 0; i < PCI_MAX_TX_QUEUE_COUNT; i++) - { + for (i = 0; i < PCI_MAX_TX_QUEUE_COUNT; i++) { struct rtw_tx_ring *tx_ring = &pxmitpriv->tx_ring[i]; - DBG_871X_SEL_NL(m, "tx ring[%d] (%p)\n", i, tx_ring); - DBG_871X_SEL_NL(m, " dma: 0x%08x\n", (int) tx_ring->dma); - DBG_871X_SEL_NL(m, " idx: %d\n", tx_ring->idx); - DBG_871X_SEL_NL(m, " entries: %d\n", tx_ring->entries); -// DBG_871X_SEL_NL(m, " queue: %d\n", tx_ring->queue); - DBG_871X_SEL_NL(m, " qlen: %d\n", tx_ring->qlen); + RTW_PRINT_SEL(m, "tx ring[%d] (%p)\n", i, tx_ring); + RTW_PRINT_SEL(m, " dma: 0x%08x\n", (int) tx_ring->dma); + RTW_PRINT_SEL(m, " idx: %d\n", tx_ring->idx); + RTW_PRINT_SEL(m, " entries: %d\n", tx_ring->entries); + /* RTW_PRINT_SEL(m, " queue: %d\n", tx_ring->queue); */ + RTW_PRINT_SEL(m, " qlen: %d\n", tx_ring->qlen); - for (j=0; j < pxmitpriv->txringcount[i]; j++) - { + for (j = 0; j < pxmitpriv->txringcount[i]; j++) { +#ifdef CONFIG_TRX_BD_ARCH + struct tx_buf_desc *entry = &tx_ring->buf_desc[j]; +#else struct tx_desc *entry = &tx_ring->desc[j]; +#endif - DBG_871X_SEL_NL(m, " desc[%03d]: %p\n", j, entry); - for (k=0; k < sizeof(*entry)/4; k++) - { + RTW_PRINT_SEL(m, " desc[%03d]: %p\n", j, entry); + for (k = 0; k < sizeof(*entry) / 4; k++) { if ((k % 4) == 0) - DBG_871X_SEL_NL(m, " 0x%03x", k); + RTW_PRINT_SEL(m, " 0x%03x", k); - DBG_871X_SEL_NL(m, " 0x%08x ", ((int *) entry)[k]); + RTW_PRINT_SEL(m, " 0x%08x ", ((int *) entry)[k]); if ((k % 4) == 3) - DBG_871X_SEL_NL(m, "\n"); + RTW_PRINT_SEL(m, "\n"); } } } @@ -2865,6 +3290,126 @@ int proc_get_tx_ring(struct seq_file *m, void *v) } #endif +#ifdef CONFIG_WOWLAN +int proc_get_pattern_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); + struct registry_priv *pregistrypriv = &padapter->registrypriv; + u8 pattern_num = 0, val8; + char str_1[128]; + char *p_str; + int i = 0 , j = 0, k = 0; + int len = 0, max_len = 0, total = 0; + + p_str = str_1; + max_len = sizeof(str_1); + + total = pwrpriv->wowlan_pattern_idx; + + rtw_set_default_pattern(padapter); + + /*show pattern*/ + RTW_PRINT_SEL(m, "\n======[Pattern Info.]======\n"); + RTW_PRINT_SEL(m, "pattern number: %d\n", total); + RTW_PRINT_SEL(m, "support default patterns: %c\n", + (pregistrypriv->default_patterns_en) ? 'Y' : 'N'); + + for (k = 0; k < total ; k++) { + RTW_PRINT_SEL(m, "\npattern idx: %d\n", k); + RTW_PRINT_SEL(m, "pattern content:\n"); + + p_str = str_1; + max_len = sizeof(str_1); + for (i = 0 ; i < MAX_WKFM_PATTERN_SIZE / 8 ; i++) { + _rtw_memset(p_str, 0, max_len); + len = 0; + for (j = 0 ; j < 8 ; j++) { + val8 = pwrpriv->patterns[k].content[i * 8 + j]; + len += snprintf(p_str + len, max_len - len, + "%02x ", val8); + } + RTW_PRINT_SEL(m, "%s\n", p_str); + } + RTW_PRINT_SEL(m, "\npattern mask:\n"); + for (i = 0 ; i < MAX_WKFM_SIZE / 8 ; i++) { + _rtw_memset(p_str, 0, max_len); + len = 0; + for (j = 0 ; j < 8 ; j++) { + val8 = pwrpriv->patterns[k].mask[i * 8 + j]; + len += snprintf(p_str + len, max_len - len, + "%02x ", val8); + } + RTW_PRINT_SEL(m, "%s\n", p_str); + } + + RTW_PRINT_SEL(m, "\npriv_pattern_len:\n"); + RTW_PRINT_SEL(m, "pattern_len: %d\n", pwrpriv->patterns[k].len); + RTW_PRINT_SEL(m, "*****************\n"); + } + + return 0; +} +ssize_t proc_set_pattern_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 pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct wowlan_ioctl_param poidparam; + u8 tmp[MAX_WKFM_PATTERN_SIZE] = {0}; + int ret = 0, num = 0; + u8 index = 0; + + poidparam.subcode = 0; + + if (count < 1) + return -EFAULT; + + if (count > sizeof(tmp)) { + rtw_warn_on(1); + return -EFAULT; + } + + if (pwrpriv->wowlan_pattern_idx >= MAX_WKFM_CAM_NUM) { + RTW_INFO("WARNING: priv-pattern is full(idx: %d)\n", + pwrpriv->wowlan_pattern_idx); + RTW_INFO("WARNING: please clean priv-pattern first\n"); + return -ENOMEM; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + if (strncmp(tmp, "clean", 5) == 0) { + poidparam.subcode = WOWLAN_PATTERN_CLEAN; + rtw_hal_set_hwreg(padapter, + HW_VAR_WOWLAN, (u8 *)&poidparam); + } else { + index = pwrpriv->wowlan_pattern_idx; + ret = rtw_wowlan_parser_pattern_cmd(tmp, + pwrpriv->patterns[index].content, + &pwrpriv->patterns[index].len, + pwrpriv->patterns[index].mask); + if (ret == _TRUE) + pwrpriv->wowlan_pattern_idx++; + } + } + + return count; +} + +int proc_get_wakeup_reason(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 val = pwrpriv->wowlan_last_wake_reason; + + RTW_PRINT_SEL(m, "last wake reason: %#02x\n", val); + return 0; +} +#endif /*CONFIG_WOWLAN*/ + #ifdef CONFIG_GPIO_WAKEUP int proc_get_wowlan_gpio_info(struct seq_file *m, void *v) { @@ -2873,14 +3418,14 @@ int proc_get_wowlan_gpio_info(struct seq_file *m, void *v) struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); u8 val = pwrpriv->is_high_active; - DBG_871X_SEL_NL(m, "wakeup_gpio_idx: %d\n", WAKEUP_GPIO_IDX); - DBG_871X_SEL_NL(m, "high_active: %d\n", val); + RTW_PRINT_SEL(m, "wakeup_gpio_idx: %d\n", WAKEUP_GPIO_IDX); + RTW_PRINT_SEL(m, "high_active: %d\n", val); return 0; } ssize_t proc_set_wowlan_gpio_info(struct file *file, const char __user *buffer, - size_t count, loff_t *pos, void *data) + size_t count, loff_t *pos, void *data) { struct net_device *dev = data; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); @@ -2912,12 +3457,12 @@ ssize_t proc_set_wowlan_gpio_info(struct file *file, const char __user *buffer, rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, val8); rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL); - DBG_871X("set %s %d\n", "gpio_high_active", - pwrpriv->is_high_active); - DBG_871X("%s: set GPIO_%d %d as default.\n", + RTW_INFO("set %s %d\n", "gpio_high_active", + pwrpriv->is_high_active); + RTW_INFO("%s: set GPIO_%d %d as default.\n", __func__, WAKEUP_GPIO_IDX, val8); } - + return count; } #endif /* CONFIG_GPIO_WAKEUP */ @@ -2927,34 +3472,29 @@ int proc_get_p2p_wowlan_info(struct seq_file *m, void *v) { struct net_device *dev = m->private; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); struct p2p_wowlan_info peerinfo = pwdinfo->p2p_wow_info; - if(_TRUE == peerinfo.is_trigger) - { - DBG_871X_SEL_NL(m,"is_trigger: TRUE\n"); - switch(peerinfo.wowlan_recv_frame_type) - { - case P2P_WOWLAN_RECV_NEGO_REQ: - DBG_871X_SEL_NL(m,"Frame Type: Nego Request\n"); - break; - case P2P_WOWLAN_RECV_INVITE_REQ: - DBG_871X_SEL_NL(m,"Frame Type: Invitation Request\n"); - break; - case P2P_WOWLAN_RECV_PROVISION_REQ: - DBG_871X_SEL_NL(m,"Frame Type: Provision Request\n"); - break; - default: - break; + if (_TRUE == peerinfo.is_trigger) { + RTW_PRINT_SEL(m, "is_trigger: TRUE\n"); + switch (peerinfo.wowlan_recv_frame_type) { + case P2P_WOWLAN_RECV_NEGO_REQ: + RTW_PRINT_SEL(m, "Frame Type: Nego Request\n"); + break; + case P2P_WOWLAN_RECV_INVITE_REQ: + RTW_PRINT_SEL(m, "Frame Type: Invitation Request\n"); + break; + case P2P_WOWLAN_RECV_PROVISION_REQ: + RTW_PRINT_SEL(m, "Frame Type: Provision Request\n"); + break; + default: + break; } - DBG_871X_SEL_NL(m,"Peer Addr: "MAC_FMT"\n", MAC_ARG(peerinfo.wowlan_peer_addr)); - DBG_871X_SEL_NL(m,"Peer WPS Config: %x\n", peerinfo.wowlan_peer_wpsconfig); - DBG_871X_SEL_NL(m,"Persistent Group: %d\n", peerinfo.wowlan_peer_is_persistent); - DBG_871X_SEL_NL(m,"Intivation Type: %d\n", peerinfo.wowlan_peer_invitation_type); - } - else - { - DBG_871X_SEL_NL(m,"is_trigger: False\n"); - } + RTW_PRINT_SEL(m, "Peer Addr: "MAC_FMT"\n", MAC_ARG(peerinfo.wowlan_peer_addr)); + RTW_PRINT_SEL(m, "Peer WPS Config: %x\n", peerinfo.wowlan_peer_wpsconfig); + RTW_PRINT_SEL(m, "Persistent Group: %d\n", peerinfo.wowlan_peer_is_persistent); + RTW_PRINT_SEL(m, "Intivation Type: %d\n", peerinfo.wowlan_peer_invitation_type); + } else + RTW_PRINT_SEL(m, "is_trigger: False\n"); return 0; } #endif /* CONFIG_P2P_WOWLAN */ @@ -2963,7 +3503,7 @@ int proc_get_new_bcn_max(struct seq_file *m, void *v) { extern int new_bcn_max; - DBG_871X_SEL_NL(m, "%d", new_bcn_max); + RTW_PRINT_SEL(m, "%d", new_bcn_max); return 0; } @@ -2972,7 +3512,7 @@ ssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_ char tmp[32]; extern int new_bcn_max; - if(count < 1) + if (count < 1) return -EFAULT; if (count > sizeof(tmp)) { @@ -2988,7 +3528,7 @@ ssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_ #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); @@ -2996,8 +3536,8 @@ int proc_get_ps_info(struct seq_file *m, void *v) u8 lps_mode = pwrpriv->power_mgnt; char *str = ""; - DBG_871X_SEL_NL(m, "======Power Saving Info:======\n"); - DBG_871X_SEL_NL(m, "*IPS:\n"); + RTW_PRINT_SEL(m, "======Power Saving Info:======\n"); + RTW_PRINT_SEL(m, "*IPS:\n"); if (ips_mode == IPS_NORMAL) { #ifdef CONFIG_FWLPS_IN_IPS @@ -3005,42 +3545,40 @@ int proc_get_ps_info(struct seq_file *m, void *v) #else str = "Card Disable"; #endif - } else if (ips_mode == IPS_NONE) { + } else if (ips_mode == IPS_NONE) str = "NO IPS"; - } else if (ips_mode == IPS_LEVEL_2) { + else if (ips_mode == IPS_LEVEL_2) str = "IPS_LEVEL_2"; - } else { + 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"); + RTW_PRINT_SEL(m, " IPS mode: %s\n", str); + RTW_PRINT_SEL(m, " IPS enter count:%d, IPS leave count:%d\n", + pwrpriv->ips_enter_cnts, pwrpriv->ips_leave_cnts); + RTW_PRINT_SEL(m, "------------------------------\n"); + RTW_PRINT_SEL(m, "*LPS:\n"); - if (lps_mode == PS_MODE_ACTIVE) { + if (lps_mode == PS_MODE_ACTIVE) str = "NO LPS"; - } else if (lps_mode == PS_MODE_MIN) { + else if (lps_mode == PS_MODE_MIN) str = "MIN"; - } else if (lps_mode == PS_MODE_MAX) { + else if (lps_mode == PS_MODE_MAX) str = "MAX"; - } else if (lps_mode == PS_MODE_DTIM) { + else if (lps_mode == PS_MODE_DTIM) str = "DTIM"; - } else { + else sprintf(str, "%d", lps_mode); - } - DBG_871X_SEL_NL(m, " LPS mode: %s\n", str); + RTW_PRINT_SEL(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"); + RTW_PRINT_SEL(m, " DTIM: %d\n", pwrpriv->dtim); + RTW_PRINT_SEL(m, " LPS enter count:%d, LPS leave count:%d\n", + pwrpriv->lps_enter_cnts, pwrpriv->lps_leave_cnts); + RTW_PRINT_SEL(m, "=============================\n"); return 0; } -#endif //CONFIG_POWER_SAVING +#endif /* CONFIG_POWER_SAVING */ #ifdef CONFIG_TDLS static int proc_tdls_display_tdls_function_info(struct seq_file *m) @@ -3051,85 +3589,75 @@ static int proc_tdls_display_tdls_function_info(struct seq_file *m) 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"); + int j = 0; + + RTW_PRINT_SEL(m, "============[TDLS Function Info]============\n"); + RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Prohibited", (ptdlsinfo->ap_prohibited == _TRUE) ? "_TRUE" : "_FALSE"); + RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Channel Switch Prohibited", (ptdlsinfo->ch_switch_prohibited == _TRUE) ? "_TRUE" : "_FALSE"); + RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Link Established", (ptdlsinfo->link_established == _TRUE) ? "_TRUE" : "_FALSE"); + RTW_PRINT_SEL(m, "%-*s = %d/%d\n", SpaceBtwnItemAndValue, "TDLS STA Num (Linked/Allowed)", ptdlsinfo->sta_cnt, MAX_ALLOWED_TDLS_STA_NUM); + RTW_PRINT_SEL(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"); + RTW_PRINT_SEL(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) - { + RTW_PRINT_SEL(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 - { + } 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; + switch (BIT(j)) { + case TDLS_INITIATOR_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_INITIATOR_STATE"); + break; + case TDLS_RESPONDER_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_RESPONDER_STATE"); + break; + case TDLS_LINKED_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_LINKED_STATE"); + break; + case TDLS_WAIT_PTR_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_WAIT_PTR_STATE"); + break; + case TDLS_ALIVE_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_ALIVE_STATE"); + break; + case TDLS_CH_SWITCH_ON_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SWITCH_ON_STATE"); + break; + case TDLS_PEER_AT_OFF_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_PEER_AT_OFF_STATE"); + break; + case TDLS_CH_SW_INITIATOR_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SW_INITIATOR_STATE"); + break; + case TDLS_WAIT_CH_RSP_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValue, " ", "TDLS_WAIT_CH_RSP_STATE"); + break; + default: + RTW_PRINT_SEL(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); + RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS CH SW On", (ATOMIC_READ(&ptdlsinfo->chsw_info.chsw_on) == _TRUE) ? "_TRUE" : "_FALSE"); + RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Off-Channel Num", ptdlsinfo->chsw_info.off_ch_num); + RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Channel Offset", ptdlsinfo->chsw_info.ch_offset); + RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Current Time", ptdlsinfo->chsw_info.cur_time); + RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS CH SW Delay Switch Back", (ptdlsinfo->chsw_info.delay_switch_back == _TRUE) ? "_TRUE" : "_FALSE"); + RTW_PRINT_SEL(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"); - + RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Device Discovered", (ptdlsinfo->dev_discovered == _TRUE) ? "_TRUE" : "_FALSE"); + RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Enable", (ptdlsinfo->tdls_enable == _TRUE) ? "_TRUE" : "_FALSE"); + RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Driver Setup", (ptdlsinfo->driver_setup == _TRUE) ? "_TRUE" : "_FALSE"); + return 0; } @@ -3144,119 +3672,109 @@ static int proc_tdls_display_network_info(struct seq_file *m) 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; + RTW_PRINT_SEL(m, "============[Associated AP/GO Info]============\n"); + + if ((pmlmepriv->fw_state & WIFI_STATION_STATE) && (pmlmepriv->fw_state & _FW_LINKED)) { + RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "BSSID", cur_network->network.Ssid.Ssid); + RTW_PRINT_SEL(m, "%-*s = "MAC_FMT"\n", SpaceBtwnItemAndValue, "Mac Address", MAC_ARG(cur_network->network.MacAddress)); + + RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Wireless Mode"); + for (i = 0; i < 8; i++) { + if (pmlmeext->cur_wireless_mode & BIT(i)) { + switch (BIT(i)) { + case WIRELESS_11B: + RTW_PRINT_SEL(m, "%4s", "11B "); + break; + case WIRELESS_11G: + RTW_PRINT_SEL(m, "%4s", "11G "); + break; + case WIRELESS_11A: + RTW_PRINT_SEL(m, "%4s", "11A "); + break; + case WIRELESS_11_24N: + RTW_PRINT_SEL(m, "%7s", "11_24N "); + break; + case WIRELESS_11_5N: + RTW_PRINT_SEL(m, "%6s", "11_5N "); + break; + case WIRELESS_AUTO: + RTW_PRINT_SEL(m, "%5s", "AUTO "); + break; + case WIRELESS_11AC: + RTW_PRINT_SEL(m, "%5s", "11AC "); + break; } } } - DBG_871X_SEL_NL(m, "\n"); + RTW_PRINT_SEL(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; + RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Privacy"); + switch (padapter->securitypriv.dot11PrivacyAlgrthm) { + case _NO_PRIVACY_: + RTW_PRINT_SEL(m, "%s\n", "NO PRIVACY"); + break; + case _WEP40_: + RTW_PRINT_SEL(m, "%s\n", "WEP 40"); + break; + case _TKIP_: + RTW_PRINT_SEL(m, "%s\n", "TKIP"); + break; + case _TKIP_WTMIC_: + RTW_PRINT_SEL(m, "%s\n", "TKIP WTMIC"); + break; + case _AES_: + RTW_PRINT_SEL(m, "%s\n", "AES"); + break; + case _WEP104_: + RTW_PRINT_SEL(m, "%s\n", "WEP 104"); + break; + case _WEP_WPA_MIXED_: + RTW_PRINT_SEL(m, "%s\n", "WEP/WPA Mixed"); + break; + case _SMS4_: + RTW_PRINT_SEL(m, "%s\n", "SMS4"); + break; #ifdef CONFIG_IEEE80211W - case _BIP_: - DBG_871X_SEL_NL(m, "%s\n", "BIP"); - break; -#endif //CONFIG_IEEE80211W + case _BIP_: + RTW_PRINT_SEL(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; + + RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "Channel", pmlmeext->cur_channel); + RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Channel Offset"); + switch (pmlmeext->cur_ch_offset) { + case HAL_PRIME_CHNL_OFFSET_DONT_CARE: + RTW_PRINT_SEL(m, "%s\n", "N/A"); + break; + case HAL_PRIME_CHNL_OFFSET_LOWER: + RTW_PRINT_SEL(m, "%s\n", "Lower"); + break; + case HAL_PRIME_CHNL_OFFSET_UPPER: + RTW_PRINT_SEL(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; + + RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Bandwidth Mode"); + switch (pmlmeext->cur_bwmode) { + case CHANNEL_WIDTH_20: + RTW_PRINT_SEL(m, "%s\n", "20MHz"); + break; + case CHANNEL_WIDTH_40: + RTW_PRINT_SEL(m, "%s\n", "40MHz"); + break; + case CHANNEL_WIDTH_80: + RTW_PRINT_SEL(m, "%s\n", "80MHz"); + break; + case CHANNEL_WIDTH_160: + RTW_PRINT_SEL(m, "%s\n", "160MHz"); + break; + case CHANNEL_WIDTH_80_80: + RTW_PRINT_SEL(m, "%s\n", "80MHz + 80MHz"); + break; } - } - else - { - DBG_871X_SEL_NL(m, "No association with AP/GO exists!\n"); - } + } else + RTW_PRINT_SEL(m, "No association with AP/GO exists!\n"); return 0; } @@ -3275,172 +3793,156 @@ static int proc_tdls_display_tdls_sta_info(struct seq_file *m) 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++) - { + 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; - } + 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 */ + RTW_PRINT_SEL(m, "============[TDLS Peer STA Info: STA %d]============\n", ++NumOfTdlsStaToShow); + RTW_PRINT_SEL(m, "%-*s = "MAC_FMT"\n", SpaceBtwnItemAndValue, "Mac Address", MAC_ARG(psta->hwaddr)); + RTW_PRINT_SEL(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: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_INITIATOR_STATE"); + break; + case TDLS_RESPONDER_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_RESPONDER_STATE"); + break; + case TDLS_LINKED_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_LINKED_STATE"); + break; + case TDLS_WAIT_PTR_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_WAIT_PTR_STATE"); + break; + case TDLS_ALIVE_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_ALIVE_STATE"); + break; + case TDLS_CH_SWITCH_ON_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SWITCH_ON_STATE"); + break; + case TDLS_PEER_AT_OFF_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_PEER_AT_OFF_STATE"); + break; + case TDLS_CH_SW_INITIATOR_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SW_INITIATOR_STATE"); + break; + case TDLS_WAIT_CH_RSP_STATE: + RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValue, " ", "TDLS_WAIT_CH_RSP_STATE"); + break; + default: + RTW_PRINT_SEL(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); } + + RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Wireless Mode"); + for (j = 0; j < 8; j++) { + if (psta->wireless_mode & BIT(j)) { + switch (BIT(j)) { + case WIRELESS_11B: + RTW_PRINT_SEL(m, "%4s", "11B "); + break; + case WIRELESS_11G: + RTW_PRINT_SEL(m, "%4s", "11G "); + break; + case WIRELESS_11A: + RTW_PRINT_SEL(m, "%4s", "11A "); + break; + case WIRELESS_11_24N: + RTW_PRINT_SEL(m, "%7s", "11_24N "); + break; + case WIRELESS_11_5N: + RTW_PRINT_SEL(m, "%6s", "11_5N "); + break; + case WIRELESS_AUTO: + RTW_PRINT_SEL(m, "%5s", "AUTO "); + break; + case WIRELESS_11AC: + RTW_PRINT_SEL(m, "%5s", "11AC "); + break; + } + } + } + RTW_PRINT_SEL(m, "\n"); + + RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Bandwidth Mode"); + switch (psta->bw_mode) { + case CHANNEL_WIDTH_20: + RTW_PRINT_SEL(m, "%s\n", "20MHz"); + break; + case CHANNEL_WIDTH_40: + RTW_PRINT_SEL(m, "%s\n", "40MHz"); + break; + case CHANNEL_WIDTH_80: + RTW_PRINT_SEL(m, "%s\n", "80MHz"); + break; + case CHANNEL_WIDTH_160: + RTW_PRINT_SEL(m, "%s\n", "160MHz"); + break; + case CHANNEL_WIDTH_80_80: + RTW_PRINT_SEL(m, "%s\n", "80MHz + 80MHz"); + break; + } + + RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Privacy"); + switch (psta->dot118021XPrivacy) { + case _NO_PRIVACY_: + RTW_PRINT_SEL(m, "%s\n", "NO PRIVACY"); + break; + case _WEP40_: + RTW_PRINT_SEL(m, "%s\n", "WEP 40"); + break; + case _TKIP_: + RTW_PRINT_SEL(m, "%s\n", "TKIP"); + break; + case _TKIP_WTMIC_: + RTW_PRINT_SEL(m, "%s\n", "TKIP WTMIC"); + break; + case _AES_: + RTW_PRINT_SEL(m, "%s\n", "AES"); + break; + case _WEP104_: + RTW_PRINT_SEL(m, "%s\n", "WEP 104"); + break; + case _WEP_WPA_MIXED_: + RTW_PRINT_SEL(m, "%s\n", "WEP/WPA Mixed"); + break; + case _SMS4_: + RTW_PRINT_SEL(m, "%s\n", "SMS4"); + break; +#ifdef CONFIG_IEEE80211W + case _BIP_: + RTW_PRINT_SEL(m, "%s\n", "BIP"); + break; +#endif /* CONFIG_IEEE80211W */ + } + + RTW_PRINT_SEL(m, "%-*s = %d sec/%d sec\n", SpaceBtwnItemAndValue, "TPK Lifetime (Current/Expire)", psta->TPK_count, psta->TDLS_PeerKey_Lifetime); + RTW_PRINT_SEL(m, "%-*s = %llu\n", SpaceBtwnItemAndValue, "Tx Packets Over Direct Link", psta->sta_stats.tx_pkts); + RTW_PRINT_SEL(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"); + if (NumOfTdlsStaToShow == 0) { + RTW_PRINT_SEL(m, "============[TDLS Peer STA Info]============\n"); + RTW_PRINT_SEL(m, "No TDLS direct link exists!\n"); } return 0; @@ -3464,9 +3966,14 @@ int proc_get_tdls_info(struct seq_file *m, void *v) u8 NumOfTdlsStaToShow = 0; BOOLEAN FirstMatchFound = _FALSE; + if (hal_chk_wl_func(padapter, WL_FUNC_TDLS) == _FALSE) { + RTW_PRINT_SEL(m, "No tdls info can be shown since hal doesn't support tdls\n"); + return 0; + } + proc_tdls_display_tdls_function_info(m); proc_tdls_display_network_info(m); - proc_tdls_display_tdls_sta_info(m); + proc_tdls_display_tdls_sta_info(m); return 0; } @@ -3480,13 +3987,12 @@ int proc_get_monitor(struct seq_file *m, void *v) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; if (WIFI_MONITOR_STATE == get_fwstate(pmlmepriv)) { - DBG_871X_SEL_NL(m, "Monitor mode : Enable\n"); + RTW_PRINT_SEL(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"); - } + RTW_PRINT_SEL(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 + RTW_PRINT_SEL(m, "Monitor mode : Disable\n"); return 0; } @@ -3499,7 +4005,7 @@ ssize_t proc_set_monitor(struct file *file, const char __user *buffer, size_t co u8 target_chan, target_offset, target_bw; if (count < 3) { - DBG_871X("argument size is less than 3\n"); + RTW_INFO("argument size is less than 3\n"); return -EFAULT; } @@ -3512,7 +4018,7 @@ ssize_t proc_set_monitor(struct file *file, const char __user *buffer, size_t co int num = sscanf(tmp, "%hhu %hhu %hhu", &target_chan, &target_offset, &target_bw); if (num != 3) { - DBG_871X("invalid write_reg parameter!\n"); + RTW_INFO("invalid write_reg parameter!\n"); return count; } @@ -3532,27 +4038,31 @@ int proc_get_efuse_map(struct seq_file *m, void *v) struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); PEFUSE_HAL pEfuseHal = &pHalData->EfuseHal; int i, j; - u8 ips_mode = IPS_NUM; - int mapLen = EFUSE_MAP_SIZE; + u8 ips_mode = IPS_NUM; + u16 mapLen; + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, _FALSE); + if (mapLen > EFUSE_MAX_MAP_LEN) + mapLen = EFUSE_MAX_MAP_LEN; ips_mode = pwrctrlpriv->ips_mode; rtw_pm_set_ips(padapter, IPS_NONE); - if (rtw_efuse_map_read(padapter, EFUSE_WIFI, mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL) - DBG_871X_SEL_NL(m, "WARN - Read Realmap Failed\n"); - - DBG_871X_SEL_NL(m, "\n"); - for (i = 0; i < EFUSE_MAP_SIZE; i += 16) { - DBG_871X_SEL_NL(m, "0x%02x\t", i); - for (j = 0; j < 8; j++) - DBG_871X_SEL_NL(m, "%02X ", pEfuseHal->fakeEfuseInitMap[i+j]); - - DBG_871X_SEL_NL(m, "\t"); - + if (rtw_efuse_map_read(padapter, 0, mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL) + RTW_PRINT_SEL(m, "WARN - Read Realmap Failed\n"); + + RTW_PRINT_SEL(m, "\n"); + for (i = 0; i < mapLen; i += 16) { + RTW_PRINT_SEL(m, "0x%02x\t", i); + for (j = 0; j < 8; j++) + RTW_PRINT_SEL(m, "%02X ", pEfuseHal->fakeEfuseInitMap[i + j]); + + RTW_PRINT_SEL(m, "\t"); + for (; j < 16; j++) - DBG_871X_SEL_NL(m, "%02X ", pEfuseHal->fakeEfuseInitMap[i+j]); - - DBG_871X_SEL_NL(m, "\n"); - + RTW_PRINT_SEL(m, "%02X ", pEfuseHal->fakeEfuseInitMap[i + j]); + + RTW_PRINT_SEL(m, "\n"); + } rtw_pm_set_ips(padapter, ips_mode); return 0; @@ -3564,39 +4074,39 @@ ssize_t proc_set_efuse_map(struct file *file, const char __user *buffer, size_t char tmp[256] = {0}; u32 addr, cnts; u8 efuse_data; - + int jj, kk; struct net_device *dev = data; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); u8 ips_mode = IPS_NUM; - + if (count < 3) { - DBG_871X("argument size is less than 3\n"); + RTW_INFO("argument size is less than 3\n"); return -EFAULT; } - + if (count > sizeof(tmp)) { rtw_warn_on(1); return -EFAULT; } - + if (buffer && !copy_from_user(tmp, buffer, count)) { int num = sscanf(tmp, "%x %d %x", &addr, &cnts, &efuse_data); - + if (num != 3) { - DBG_871X("invalid write_reg parameter!\n"); + RTW_INFO("invalid write_reg parameter!\n"); return count; } } ips_mode = pwrctrlpriv->ips_mode; rtw_pm_set_ips(padapter, IPS_NONE); - if (rtw_efuse_map_write(padapter, addr, cnts, &efuse_data) == _FAIL) - DBG_871X("WARN - rtw_efuse_map_write error!!\n"); + if (rtw_efuse_map_write(padapter, addr, cnts, &efuse_data) == _FAIL) + RTW_INFO("WARN - rtw_efuse_map_write error!!\n"); rtw_pm_set_ips(padapter, ips_mode); -#endif +#endif return count; } @@ -3620,24 +4130,24 @@ ssize_t proc_set_tx_sa_query(struct file *file, const char __user *buffer, size_ u8 index; if (count > 2) { - DBG_871X("argument size is more than 2\n"); + RTW_INFO("argument size is more than 2\n"); return -EFAULT; - } + } - if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { int num = sscanf(tmp, "%x", &key_type); if (num != 1) { - DBG_871X("invalid read_reg parameter!\n"); + RTW_INFO("invalid read_reg parameter!\n"); return count; } - DBG_871X("0: set sa query request , key_type=%d\n", key_type); + RTW_INFO("0: set sa query request , key_type=%d\n", key_type); } - + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) && padapter->securitypriv.binstallBIPkey == _TRUE) { - DBG_871X("STA:"MAC_FMT"\n", MAC_ARG(get_my_bssid(&(pmlmeinfo->network)))); + && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) && padapter->securitypriv.binstallBIPkey == _TRUE) { + RTW_INFO("STA:"MAC_FMT"\n", MAC_ARG(get_my_bssid(&(pmlmeinfo->network)))); /* TX unicast sa_query to AP */ issue_action_SA_Query(padapter, get_my_bssid(&(pmlmeinfo->network)), 0, 0, (u8)key_type); } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE && padapter->securitypriv.binstallBIPkey == _TRUE) { @@ -3645,10 +4155,10 @@ ssize_t proc_set_tx_sa_query(struct file *file, const char __user *buffer, size_ _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); for (index = 0; index < NUM_STA; index++) { psta = NULL; - + phead = &(pstapriv->sta_hash[index]); 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); @@ -3656,18 +4166,18 @@ ssize_t proc_set_tx_sa_query(struct file *file, const char __user *buffer, size_ } } _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - + for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) { if (rtw_macid_is_used(macid_ctl, index) && !rtw_macid_is_bmc(macid_ctl, index)) { - if (!_rtw_memcmp(get_my_bssid(&(pmlmeinfo->network)), &mac_addr[index][0], ETH_ALEN) - && !IS_MCAST(&mac_addr[index][0])) { + if (!_rtw_memcmp(get_my_bssid(&(pmlmeinfo->network)), &mac_addr[index][0], ETH_ALEN) + && !IS_MCAST(&mac_addr[index][0])) { issue_action_SA_Query(padapter, &mac_addr[index][0], 0, 0, (u8)key_type); - DBG_871X("STA[%u]:"MAC_FMT"\n", index , MAC_ARG(&mac_addr[index][0])); + RTW_INFO("STA[%u]:"MAC_FMT"\n", index , MAC_ARG(&mac_addr[index][0])); } } } } - + return count; } @@ -3675,8 +4185,8 @@ int proc_get_tx_sa_query(struct seq_file *m, void *v) { struct net_device *dev = m->private; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - - DBG_871X_SEL_NL(m, "%s\n", __func__); + + RTW_PRINT_SEL(m, "%s\n", __func__); return 0; } @@ -3698,45 +4208,45 @@ ssize_t proc_set_tx_deauth(struct file *file, const char __user *buffer, size_t u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; u32 key_type; u8 index; - + if (count > 2) { - DBG_871X("argument size is more than 2\n"); + RTW_INFO("argument size is more than 2\n"); return -EFAULT; - } + } - if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { int num = sscanf(tmp, "%x", &key_type); if (num != 1) { - DBG_871X("invalid read_reg parameter!\n"); + RTW_INFO("invalid read_reg parameter!\n"); return count; } - DBG_871X("key_type=%d\n", key_type); + RTW_INFO("key_type=%d\n", key_type); } if (key_type < 0 || key_type > 4) return count; - + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) { + && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) { if (key_type == 3) /* key_type 3 only for AP mode */ return count; /* TX unicast deauth to AP */ issue_deauth_11w(padapter, get_my_bssid(&(pmlmeinfo->network)), 0, (u8)key_type); } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { - + if (key_type == 3) issue_deauth_11w(padapter, bc_addr, 0, IEEE80211W_RIGHT_KEY); - + /* TX unicast deauth to every client STA */ _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); for (index = 0; index < NUM_STA; index++) { psta = NULL; - + phead = &(pstapriv->sta_hash[index]); 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); @@ -3744,35 +4254,35 @@ ssize_t proc_set_tx_deauth(struct file *file, const char __user *buffer, size_t } } _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - + for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) { if (rtw_macid_is_used(macid_ctl, index) && !rtw_macid_is_bmc(macid_ctl, index)) { if (!_rtw_memcmp(get_my_bssid(&(pmlmeinfo->network)), &mac_addr[index][0], ETH_ALEN)) { if (key_type != 3) issue_deauth_11w(padapter, &mac_addr[index][0], 0, (u8)key_type); - - psta = rtw_get_stainfo(pstapriv, &mac_addr[index][0]); + + psta = rtw_get_stainfo(pstapriv, &mac_addr[index][0]); if (psta && key_type != IEEE80211W_WRONG_KEY && key_type != IEEE80211W_NO_KEY) { u8 updated = _FALSE; - + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - if (rtw_is_list_empty(&psta->asoc_list) == _FALSE) { + if (rtw_is_list_empty(&psta->asoc_list) == _FALSE) { rtw_list_delete(&psta->asoc_list); pstapriv->asoc_list_cnt--; updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_PREV_AUTH_NOT_VALID, _TRUE); - + } _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - + associated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL); } - - DBG_871X("STA[%u]:"MAC_FMT"\n", index , MAC_ARG(&mac_addr[index][0])); + + RTW_INFO("STA[%u]:"MAC_FMT"\n", index , MAC_ARG(&mac_addr[index][0])); } } } } - + return count; } @@ -3780,8 +4290,8 @@ int proc_get_tx_deauth(struct seq_file *m, void *v) { struct net_device *dev = m->private; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - - DBG_871X_SEL_NL(m, "%s\n", __func__); + + RTW_PRINT_SEL(m, "%s\n", __func__); return 0; } @@ -3803,26 +4313,26 @@ ssize_t proc_set_tx_auth(struct file *file, const char __user *buffer, size_t co u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; u32 tx_auth; u8 index; - + if (count > 2) { - DBG_871X("argument size is more than 2\n"); + RTW_INFO("argument size is more than 2\n"); return -EFAULT; - } + } - if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { int num = sscanf(tmp, "%x", &tx_auth); if (num != 1) { - DBG_871X("invalid read_reg parameter!\n"); + RTW_INFO("invalid read_reg parameter!\n"); return count; } - DBG_871X("1: setnd auth, 2: send assoc request. tx_auth=%d\n", tx_auth); + RTW_INFO("1: setnd auth, 2: send assoc request. tx_auth=%d\n", tx_auth); } - + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) { + && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) { if (tx_auth == 1) { /* TX unicast auth to AP */ issue_auth(padapter, NULL, 0); @@ -3830,8 +4340,8 @@ ssize_t proc_set_tx_auth(struct file *file, const char __user *buffer, size_t co /* TX unicast auth to AP */ issue_assocreq(padapter); } - } - + } + return count; } @@ -3839,11 +4349,365 @@ int proc_get_tx_auth(struct seq_file *m, void *v) { struct net_device *dev = m->private; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - - DBG_871X_SEL_NL(m, "%s\n", __func__); + + RTW_PRINT_SEL(m, "%s\n", __func__); return 0; } #endif /* CONFIG_IEEE80211W */ -#endif /* CONFIG_PROC_DEBUG */ +#ifdef CONFIG_MCC_MODE +int proc_get_mcc_info(struct seq_file *m, void *v) +{ + struct net_device *dev = m->private; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + dump_adapters_status(m, adapter_to_dvobj(adapter)); + rtw_hal_dump_mcc_info(m, adapter_to_dvobj(adapter)); + return 0; +} + +ssize_t proc_set_mcc_enable(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[255]; + u32 en_mcc = 0; + + if (NULL == buffer) { + RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count > sizeof(tmp)) { + RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter)); + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + _adapter *iface = NULL; + u8 i = 0; + int num = sscanf(tmp, "%u", &en_mcc); + + if (num < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter)); + return -EINVAL; + } + + RTW_INFO("%s: en_mcc = %d\n", __func__, en_mcc); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if (!iface) + continue; + iface->registrypriv.en_mcc = en_mcc; + } + } + + return count; +} + +ssize_t proc_set_mcc_single_tx_criteria(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[255]; + u32 mcc_single_tx_criteria = 0; + + if (NULL == buffer) { + RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count > sizeof(tmp)) { + RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter)); + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + _adapter *iface = NULL; + u8 i = 0; + int num = sscanf(tmp, "%u", &mcc_single_tx_criteria); + + if (num < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter)); + return -EINVAL; + } + + RTW_INFO("%s: mcc_single_tx_criteria = %d\n", __func__, mcc_single_tx_criteria); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if (!iface) + continue; + iface->registrypriv.rtw_mcc_single_tx_cri = mcc_single_tx_criteria; + } + + + } + + return count; +} + + +ssize_t proc_set_mcc_ap_bw20_target_tp(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[255]; + u32 mcc_ap_bw20_target_tp = 0; + + if (NULL == buffer) { + RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count > sizeof(tmp)) { + RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter)); + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + int num = sscanf(tmp, "%u", &mcc_ap_bw20_target_tp); + + if (num < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter)); + return -EINVAL; + } + + RTW_INFO("%s: mcc_ap_bw20_target_tp = %d\n", __func__, mcc_ap_bw20_target_tp); + + padapter->registrypriv.rtw_mcc_ap_bw20_target_tx_tp = mcc_ap_bw20_target_tp; + + + } + + return count; +} + +ssize_t proc_set_mcc_ap_bw40_target_tp(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[255]; + u32 mcc_ap_bw40_target_tp = 0; + + if (NULL == buffer) { + RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count > sizeof(tmp)) { + RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter)); + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + int num = sscanf(tmp, "%u", &mcc_ap_bw40_target_tp); + + if (num < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter)); + return -EINVAL; + } + + RTW_INFO("%s: mcc_ap_bw40_target_tp = %d\n", __func__, mcc_ap_bw40_target_tp); + + padapter->registrypriv.rtw_mcc_ap_bw40_target_tx_tp = mcc_ap_bw40_target_tp; + + + } + + return count; +} + +ssize_t proc_set_mcc_ap_bw80_target_tp(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[255]; + u32 mcc_ap_bw80_target_tp = 0; + + if (NULL == buffer) { + RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count > sizeof(tmp)) { + RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter)); + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + int num = sscanf(tmp, "%u", &mcc_ap_bw80_target_tp); + + if (num < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter)); + return -EINVAL; + } + + RTW_INFO("%s: mcc_ap_bw80_target_tp = %d\n", __func__, mcc_ap_bw80_target_tp); + + padapter->registrypriv.rtw_mcc_ap_bw80_target_tx_tp = mcc_ap_bw80_target_tp; + + + } + + return count; +} + +ssize_t proc_set_mcc_sta_bw20_target_tp(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[255]; + u32 mcc_sta_bw20_target_tp = 0; + + if (NULL == buffer) { + RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count > sizeof(tmp)) { + RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter)); + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + int num = sscanf(tmp, "%u", &mcc_sta_bw20_target_tp); + + if (num < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter)); + return -EINVAL; + } + + RTW_INFO("%s: mcc_sta_bw20_target_tp = %d\n", __func__, mcc_sta_bw20_target_tp); + + padapter->registrypriv.rtw_mcc_sta_bw20_target_tx_tp = mcc_sta_bw20_target_tp; + + + } + + return count; +} + +ssize_t proc_set_mcc_sta_bw40_target_tp(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[255]; + u32 mcc_sta_bw40_target_tp = 0; + + if (NULL == buffer) { + RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count > sizeof(tmp)) { + RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter)); + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + int num = sscanf(tmp, "%u", &mcc_sta_bw40_target_tp); + + if (num < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter)); + return -EINVAL; + } + + RTW_INFO("%s: mcc_sta_bw40_target_tp = %d\n", __func__, mcc_sta_bw40_target_tp); + + padapter->registrypriv.rtw_mcc_sta_bw40_target_tx_tp = mcc_sta_bw40_target_tp; + + + } + + return count; +} + +ssize_t proc_set_mcc_sta_bw80_target_tp(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[255]; + u32 mcc_sta_bw80_target_tp = 0; + + if (NULL == buffer) { + RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter)); + return -EFAULT; + } + + if (count > sizeof(tmp)) { + RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter)); + rtw_warn_on(1); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, count)) { + int num = sscanf(tmp, "%u", &mcc_sta_bw80_target_tp); + + if (num < 1) { + RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter)); + return -EINVAL; + } + + RTW_INFO("%s: mcc_sta_bw80_target_tp = %d\n", __func__, mcc_sta_bw80_target_tp); + + padapter->registrypriv.rtw_mcc_sta_bw80_target_tx_tp = mcc_sta_bw80_target_tp; + + + } + + return count; +} +#endif /* CONFIG_MCC_MODE */ + +#endif /* CONFIG_PROC_DEBUG */ diff --git a/core/rtw_eeprom.c b/core/rtw_eeprom.c old mode 100755 new mode 100644 index e83c090..d7bca03 --- a/core/rtw_eeprom.c +++ b/core/rtw_eeprom.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. @@ -23,33 +23,27 @@ #include #include -void up_clk(_adapter* padapter, u16 *x) +void up_clk(_adapter *padapter, u16 *x) { -_func_enter_; *x = *x | _EESK; rtw_write8(padapter, EE_9346CR, (u8)*x); rtw_udelay_os(CLOCK_RATE); -_func_exit_; - + } -void down_clk(_adapter * padapter, u16 *x ) +void down_clk(_adapter *padapter, u16 *x) { -_func_enter_; *x = *x & ~_EESK; rtw_write8(padapter, EE_9346CR, (u8)*x); rtw_udelay_os(CLOCK_RATE); -_func_exit_; } -void shift_out_bits(_adapter * padapter, u16 data, u16 count) +void shift_out_bits(_adapter *padapter, u16 data, u16 count) { - u16 x,mask; -_func_enter_; + u16 x, mask; if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } mask = 0x01 << (count - 1); @@ -57,13 +51,11 @@ _func_enter_; x &= ~(_EEDO | _EEDI); - do - { + do { x &= ~_EEDI; - if(data & mask) + if (data & mask) x |= _EEDI; if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } rtw_write8(padapter, EE_9346CR, (u8)x); @@ -71,137 +63,118 @@ _func_enter_; up_clk(padapter, &x); down_clk(padapter, &x); mask = mask >> 1; - } while(mask); + } while (mask); if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } x &= ~_EEDI; rtw_write8(padapter, EE_9346CR, (u8)x); -out: -_func_exit_; +out: + return; } -u16 shift_in_bits (_adapter * padapter) +u16 shift_in_bits(_adapter *padapter) { - u16 x,d=0,i; -_func_enter_; + u16 x, d = 0, i; if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } x = rtw_read8(padapter, EE_9346CR); - x &= ~( _EEDO | _EEDI); + x &= ~(_EEDO | _EEDI); d = 0; - for(i=0; i<16; i++) - { + for (i = 0; i < 16; i++) { d = d << 1; up_clk(padapter, &x); - if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } + if (rtw_is_surprise_removed(padapter)) { + goto out; + } x = rtw_read8(padapter, EE_9346CR); x &= ~(_EEDI); - if(x & _EEDO) - d |= 1; + if (x & _EEDO) + d |= 1; down_clk(padapter, &x); } -out: -_func_exit_; +out: return d; } -void standby(_adapter * padapter ) +void standby(_adapter *padapter) { u8 x; -_func_enter_; x = rtw_read8(padapter, EE_9346CR); x &= ~(_EECS | _EESK); - rtw_write8(padapter, EE_9346CR,x); + rtw_write8(padapter, EE_9346CR, x); rtw_udelay_os(CLOCK_RATE); x |= _EECS; rtw_write8(padapter, EE_9346CR, x); rtw_udelay_os(CLOCK_RATE); -_func_exit_; } -u16 wait_eeprom_cmd_done(_adapter* padapter) +u16 wait_eeprom_cmd_done(_adapter *padapter) { - u8 x; - u16 i,res=_FALSE; -_func_enter_; - standby(padapter ); - for (i=0; i<200; i++) - { + u8 x; + u16 i, res = _FALSE; + standby(padapter); + for (i = 0; i < 200; i++) { x = rtw_read8(padapter, EE_9346CR); - if (x & _EEDO){ - res=_TRUE; + if (x & _EEDO) { + res = _TRUE; goto exit; - } + } rtw_udelay_os(CLOCK_RATE); } -exit: -_func_exit_; +exit: return res; } -void eeprom_clean(_adapter * padapter) +void eeprom_clean(_adapter *padapter) { u16 x; -_func_enter_; if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } x = rtw_read8(padapter, EE_9346CR); if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } x &= ~(_EECS | _EEDI); rtw_write8(padapter, EE_9346CR, (u8)x); if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } up_clk(padapter, &x); if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } down_clk(padapter, &x); -out: -_func_exit_; +out: + return; } -void eeprom_write16(_adapter * padapter, u16 reg, u16 data) +void eeprom_write16(_adapter *padapter, u16 reg, u16 data) { u8 x; #ifdef CONFIG_RTL8712 - u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new; - tmp8_ori=rtw_read8(padapter, 0x102502f1); - tmp8_new=tmp8_ori & 0xf7; - if(tmp8_ori != tmp8_new){ + u8 tmp8_ori, tmp8_new, tmp8_clk_ori, tmp8_clk_new; + tmp8_ori = rtw_read8(padapter, 0x102502f1); + tmp8_new = tmp8_ori & 0xf7; + if (tmp8_ori != tmp8_new) { rtw_write8(padapter, 0x102502f1, tmp8_new); - RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n")); } - tmp8_clk_ori=rtw_read8(padapter,0x10250003); - tmp8_clk_new=tmp8_clk_ori|0x20; - if(tmp8_clk_new!=tmp8_clk_ori){ - RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n")); + tmp8_clk_ori = rtw_read8(padapter, 0x10250003); + tmp8_clk_new = tmp8_clk_ori | 0x20; + if (tmp8_clk_new != tmp8_clk_ori) { rtw_write8(padapter, 0x10250003, tmp8_clk_new); - } + } #endif -_func_enter_; - + x = rtw_read8(padapter, EE_9346CR); x &= ~(_EEDI | _EEDO | _EESK | _EEM0); @@ -209,94 +182,86 @@ _func_enter_; rtw_write8(padapter, EE_9346CR, x); shift_out_bits(padapter, EEPROM_EWEN_OPCODE, 5); - - if(padapter->EepromAddressSize==8) //CF+ and SDIO + + if (padapter->EepromAddressSize == 8) /* CF+ and SDIO */ shift_out_bits(padapter, 0, 6); - else //USB + else /* USB */ shift_out_bits(padapter, 0, 4); - - standby( padapter); -// Commented out by rcnjko, 2004.0 -// // Erase this particular word. Write the erase opcode and register -// // number in that order. The opcode is 3bits in length; reg is 6 bits long. -// shift_out_bits(Adapter, EEPROM_ERASE_OPCODE, 3); -// shift_out_bits(Adapter, reg, Adapter->EepromAddressSize); -// -// if (wait_eeprom_cmd_done(Adapter ) == FALSE) -// { -// return; -// } + standby(padapter); + + /* Commented out by rcnjko, 2004.0 + * Erase this particular word. Write the erase opcode and register + * number in that order. The opcode is 3bits in length; reg is 6 bits long. */ +/* shift_out_bits(Adapter, EEPROM_ERASE_OPCODE, 3); + * shift_out_bits(Adapter, reg, Adapter->EepromAddressSize); + * + * if (wait_eeprom_cmd_done(Adapter ) == FALSE) + * { + * return; + * } */ - standby(padapter ); + standby(padapter); - // write the new word to the EEPROM + /* write the new word to the EEPROM */ - // send the write opcode the EEPORM + /* send the write opcode the EEPORM */ shift_out_bits(padapter, EEPROM_WRITE_OPCODE, 3); - // select which word in the EEPROM that we are writing to. + /* select which word in the EEPROM that we are writing to. */ shift_out_bits(padapter, reg, padapter->EepromAddressSize); - // write the data to the selected EEPROM word. + /* write the data to the selected EEPROM word. */ shift_out_bits(padapter, data, 16); - if (wait_eeprom_cmd_done(padapter ) == _FALSE) - { + if (wait_eeprom_cmd_done(padapter) == _FALSE) goto exit; - } - standby(padapter ); + standby(padapter); shift_out_bits(padapter, EEPROM_EWDS_OPCODE, 5); shift_out_bits(padapter, reg, 4); - eeprom_clean(padapter ); -exit: + eeprom_clean(padapter); +exit: #ifdef CONFIG_RTL8712 - if(tmp8_clk_new!=tmp8_clk_ori) + if (tmp8_clk_new != tmp8_clk_ori) rtw_write8(padapter, 0x10250003, tmp8_clk_ori); - if(tmp8_new!=tmp8_ori) + if (tmp8_new != tmp8_ori) rtw_write8(padapter, 0x102502f1, tmp8_ori); #endif -_func_exit_; return; } -u16 eeprom_read16(_adapter * padapter, u16 reg) //ReadEEprom +u16 eeprom_read16(_adapter *padapter, u16 reg) /* ReadEEprom */ { u16 x; - u16 data=0; + u16 data = 0; #ifdef CONFIG_RTL8712 - u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new; - tmp8_ori= rtw_read8(padapter, 0x102502f1); + u8 tmp8_ori, tmp8_new, tmp8_clk_ori, tmp8_clk_new; + tmp8_ori = rtw_read8(padapter, 0x102502f1); tmp8_new = tmp8_ori & 0xf7; - if(tmp8_ori != tmp8_new){ + if (tmp8_ori != tmp8_new) { rtw_write8(padapter, 0x102502f1, tmp8_new); - RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n")); } - tmp8_clk_ori=rtw_read8(padapter,0x10250003); - tmp8_clk_new=tmp8_clk_ori|0x20; - if(tmp8_clk_new!=tmp8_clk_ori){ - RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n")); + tmp8_clk_ori = rtw_read8(padapter, 0x10250003); + tmp8_clk_new = tmp8_clk_ori | 0x20; + if (tmp8_clk_new != tmp8_clk_ori) { rtw_write8(padapter, 0x10250003, tmp8_clk_new); - } + } #endif -_func_enter_; if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } - // select EEPROM, reset bits, set _EECS + /* select EEPROM, reset bits, set _EECS */ x = rtw_read8(padapter, EE_9346CR); if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } @@ -304,24 +269,23 @@ _func_enter_; x |= _EEM1 | _EECS; rtw_write8(padapter, EE_9346CR, (unsigned char)x); - // write the read opcode and register number in that order - // The opcode is 3bits in length, reg is 6 bits long + /* write the read opcode and register number in that order */ + /* The opcode is 3bits in length, reg is 6 bits long */ shift_out_bits(padapter, EEPROM_READ_OPCODE, 3); shift_out_bits(padapter, reg, padapter->EepromAddressSize); - // Now read the data (16 bits) in from the selected EEPROM word + /* Now read the data (16 bits) in from the selected EEPROM word */ data = shift_in_bits(padapter); eeprom_clean(padapter); -out: +out: #ifdef CONFIG_RTL8712 - if(tmp8_clk_new!=tmp8_clk_ori) + if (tmp8_clk_new != tmp8_clk_ori) rtw_write8(padapter, 0x10250003, tmp8_clk_ori); - if(tmp8_new!=tmp8_ori) + if (tmp8_new != tmp8_ori) rtw_write8(padapter, 0x102502f1, tmp8_ori); #endif -_func_exit_; return data; @@ -330,22 +294,19 @@ _func_exit_; -//From even offset -void eeprom_read_sz(_adapter * padapter, u16 reg, u8* data, u32 sz) +/* From even offset */ +void eeprom_read_sz(_adapter *padapter, u16 reg, u8 *data, u32 sz) { u16 x, data16; u32 i; -_func_enter_; if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } - // select EEPROM, reset bits, set _EECS + /* select EEPROM, reset bits, set _EECS */ x = rtw_read8(padapter, EE_9346CR); if (rtw_is_surprise_removed(padapter)) { - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, ("padapter->bSurpriseRemoved==_TRUE")); goto out; } @@ -353,71 +314,61 @@ _func_enter_; x |= _EEM1 | _EECS; rtw_write8(padapter, EE_9346CR, (unsigned char)x); - // write the read opcode and register number in that order - // The opcode is 3bits in length, reg is 6 bits long + /* write the read opcode and register number in that order */ + /* The opcode is 3bits in length, reg is 6 bits long */ shift_out_bits(padapter, EEPROM_READ_OPCODE, 3); shift_out_bits(padapter, reg, padapter->EepromAddressSize); - for(i=0; i>8; + data[i + 1] = data16 >> 8; } eeprom_clean(padapter); -out: -_func_exit_; - - - +out: + return; } -//addr_off : address offset of the entry in eeprom (not the tuple number of eeprom (reg); that is addr_off !=reg) -u8 eeprom_read(_adapter * padapter, u32 addr_off, u8 sz, u8* rbuf) +/* addr_off : address offset of the entry in eeprom (not the tuple number of eeprom (reg); that is addr_off !=reg) */ +u8 eeprom_read(_adapter *padapter, u32 addr_off, u8 sz, u8 *rbuf) { u8 quotient, remainder, addr_2align_odd; - u16 reg, stmp , i=0, idx = 0; -_func_enter_; + u16 reg, stmp , i = 0, idx = 0; reg = (u16)(addr_off >> 1); addr_2align_odd = (u8)(addr_off & 0x1); - if(addr_2align_odd) //read that start at high part: e.g 1,3,5,7,9,... - { + if (addr_2align_odd) { /* read that start at high part: e.g 1,3,5,7,9,... */ stmp = eeprom_read16(padapter, reg); - rbuf[idx++] = (u8) ((stmp>>8)&0xff); //return hogh-part of the short - reg++; sz--; + rbuf[idx++] = (u8)((stmp >> 8) & 0xff); /* return hogh-part of the short */ + reg++; + sz--; } - + quotient = sz >> 1; remainder = sz & 0x1; - for( i=0 ; i < quotient; i++) - { - stmp = eeprom_read16(padapter, reg+i); - rbuf[idx++] = (u8) (stmp&0xff); - rbuf[idx++] = (u8) ((stmp>>8)&0xff); + for (i = 0 ; i < quotient; i++) { + stmp = eeprom_read16(padapter, reg + i); + rbuf[idx++] = (u8)(stmp & 0xff); + rbuf[idx++] = (u8)((stmp >> 8) & 0xff); } - - reg = reg+i; - if(remainder){ //end of read at lower part of short : 0,2,4,6,... + + reg = reg + i; + if (remainder) { /* end of read at lower part of short : 0,2,4,6,... */ stmp = eeprom_read16(padapter, reg); - rbuf[idx] = (u8)(stmp & 0xff); + rbuf[idx] = (u8)(stmp & 0xff); } -_func_exit_; return _TRUE; } -VOID read_eeprom_content(_adapter * padapter) +VOID read_eeprom_content(_adapter *padapter) { -_func_enter_; -_func_exit_; } - diff --git a/core/rtw_ieee80211.c b/core/rtw_ieee80211.c old mode 100755 new mode 100644 index 39d4b0e..e443945 --- a/core/rtw_ieee80211.c +++ b/core/rtw_ieee80211.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. @@ -20,8 +20,8 @@ #define _IEEE80211_C #ifdef CONFIG_PLATFORM_INTEL_BYT -#include -#endif + #include +#endif #include @@ -46,25 +46,27 @@ u8 RSN_CIPHER_SUITE_TKIP[] = { 0x00, 0x0f, 0xac, 2 }; u8 RSN_CIPHER_SUITE_WRAP[] = { 0x00, 0x0f, 0xac, 3 }; u8 RSN_CIPHER_SUITE_CCMP[] = { 0x00, 0x0f, 0xac, 4 }; u8 RSN_CIPHER_SUITE_WEP104[] = { 0x00, 0x0f, 0xac, 5 }; -//----------------------------------------------------------- -// for adhoc-master to generate ie and provide supported-rate to fw -//----------------------------------------------------------- +/* ----------------------------------------------------------- + * for adhoc-master to generate ie and provide supported-rate to fw + * ----------------------------------------------------------- */ -static u8 WIFI_CCKRATES[] = -{(IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK), - (IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK), - (IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK), - (IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK)}; +static u8 WIFI_CCKRATES[] = { + (IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK), + (IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK), + (IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK), + (IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK) +}; -static u8 WIFI_OFDMRATES[] = -{(IEEE80211_OFDM_RATE_6MB), - (IEEE80211_OFDM_RATE_9MB), - (IEEE80211_OFDM_RATE_12MB), - (IEEE80211_OFDM_RATE_18MB), - (IEEE80211_OFDM_RATE_24MB), - IEEE80211_OFDM_RATE_36MB, - IEEE80211_OFDM_RATE_48MB, - IEEE80211_OFDM_RATE_54MB}; +static u8 WIFI_OFDMRATES[] = { + (IEEE80211_OFDM_RATE_6MB), + (IEEE80211_OFDM_RATE_9MB), + (IEEE80211_OFDM_RATE_12MB), + (IEEE80211_OFDM_RATE_18MB), + (IEEE80211_OFDM_RATE_24MB), + IEEE80211_OFDM_RATE_36MB, + IEEE80211_OFDM_RATE_48MB, + IEEE80211_OFDM_RATE_54MB +}; u8 mgn_rates_cck[4] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M}; u8 mgn_rates_ofdm[8] = {MGN_6M, MGN_9M, MGN_12M, MGN_18M, MGN_24M, MGN_36M, MGN_48M, MGN_54M}; @@ -73,15 +75,19 @@ u8 mgn_rates_mcs8_15[8] = {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11, MGN_MCS12, u8 mgn_rates_mcs16_23[8] = {MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19, MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23}; u8 mgn_rates_mcs24_31[8] = {MGN_MCS24, MGN_MCS25, MGN_MCS26, MGN_MCS27, MGN_MCS28, MGN_MCS29, MGN_MCS30, MGN_MCS31}; u8 mgn_rates_vht1ss[10] = {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4 - , MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9}; + , MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9 + }; u8 mgn_rates_vht2ss[10] = {MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4 - , MGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9}; + , MGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9 + }; u8 mgn_rates_vht3ss[10] = {MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3, MGN_VHT3SS_MCS4 - , MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7, MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9}; + , MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7, MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9 + }; u8 mgn_rates_vht4ss[10] = {MGN_VHT4SS_MCS0, MGN_VHT4SS_MCS1, MGN_VHT4SS_MCS2, MGN_VHT4SS_MCS3, MGN_VHT4SS_MCS4 - , MGN_VHT4SS_MCS5, MGN_VHT4SS_MCS6, MGN_VHT4SS_MCS7, MGN_VHT4SS_MCS8, MGN_VHT4SS_MCS9}; + , MGN_VHT4SS_MCS5, MGN_VHT4SS_MCS6, MGN_VHT4SS_MCS7, MGN_VHT4SS_MCS8, MGN_VHT4SS_MCS9 + }; -static const char * const _rate_section_str[] = { +static const char *const _rate_section_str[] = { "CCK", "OFDM", "HT_1SS", @@ -116,10 +122,10 @@ struct rate_section_ent rates_by_sections[RATE_SECTION_NUM] = { int rtw_get_bit_value_from_ieee_value(u8 val) { - unsigned char dot11_rate_table[]={2,4,11,22,12,18,24,36,48,72,96,108,0}; // last element must be zero!! + unsigned char dot11_rate_table[] = {2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 0}; /* last element must be zero!! */ - int i=0; - while(dot11_rate_table[i] != 0) { + int i = 0; + while (dot11_rate_table[i] != 0) { if (dot11_rate_table[i] == val) return BIT(i); i++; @@ -128,18 +134,17 @@ int rtw_get_bit_value_from_ieee_value(u8 val) } uint rtw_is_cckrates_included(u8 *rate) -{ - u32 i = 0; +{ + u32 i = 0; - while(rate[i]!=0) - { - if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || - (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) - return _TRUE; - i++; - } - - return _FALSE; + while (rate[i] != 0) { + if ((((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || + (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22)) + return _TRUE; + i++; + } + + return _FALSE; } uint rtw_is_cckratesonly_included(u8 *rate) @@ -147,56 +152,52 @@ uint rtw_is_cckratesonly_included(u8 *rate) u32 i = 0; - while(rate[i]!=0) - { - if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && - (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) - return _FALSE; + while (rate[i] != 0) { + if ((((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && + (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22)) + return _FALSE; - i++; + i++; } - + return _TRUE; } int rtw_check_network_type(unsigned char *rate, int ratelen, int channel) { - if (channel > 14) - { + if (channel > 14) { if ((rtw_is_cckrates_included(rate)) == _TRUE) return WIRELESS_INVALID; else return WIRELESS_11A; - } - else // could be pure B, pure G, or B/G - { - if ((rtw_is_cckratesonly_included(rate)) == _TRUE) + } else { /* could be pure B, pure G, or B/G */ + if ((rtw_is_cckratesonly_included(rate)) == _TRUE) return WIRELESS_11B; - else if((rtw_is_cckrates_included(rate)) == _TRUE) - return WIRELESS_11BG; + else if ((rtw_is_cckrates_included(rate)) == _TRUE) + return WIRELESS_11BG; else return WIRELESS_11G; } - + } u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, - unsigned int *frlen) + unsigned int *frlen) { _rtw_memcpy((void *)pbuf, (void *)source, len); *frlen = *frlen + len; - return (pbuf + len); + return pbuf + len; } -// rtw_set_ie will update frame length +/* rtw_set_ie will update frame length */ u8 *rtw_set_ie ( - u8 *pbuf, - sint index, + u8 *pbuf, + sint index, uint len, - u8 *source, - uint *frlen //frame length + u8 *source, + uint *frlen /* frame length */ ) { *pbuf = (u8)index; @@ -205,14 +206,14 @@ u8 *rtw_set_ie if (len > 0) _rtw_memcpy((void *)(pbuf + 2), (void *)source, len); - + *frlen = *frlen + (len + 2); - - return (pbuf + len + 2); + + return pbuf + len + 2; } inline u8 *rtw_set_ie_ch_switch(u8 *buf, u32 *buf_len, u8 ch_switch_mode, - u8 new_ch, u8 ch_switch_cnt) + u8 new_ch, u8 ch_switch_cnt) { u8 ie_data[3]; @@ -226,9 +227,9 @@ inline u8 secondary_ch_offset_to_hal_ch_offset(u8 ch_offset) { if (ch_offset == SCN) return HAL_PRIME_CHNL_OFFSET_DONT_CARE; - else if(ch_offset == SCA) + else if (ch_offset == SCA) return HAL_PRIME_CHNL_OFFSET_UPPER; - else if(ch_offset == SCB) + else if (ch_offset == SCB) return HAL_PRIME_CHNL_OFFSET_LOWER; return HAL_PRIME_CHNL_OFFSET_DONT_CARE; @@ -238,9 +239,9 @@ inline u8 hal_ch_offset_to_secondary_ch_offset(u8 ch_offset) { if (ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) return SCN; - else if(ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) + else if (ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) return SCB; - else if(ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER) + else if (ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER) return SCA; return SCN; @@ -252,14 +253,14 @@ inline u8 *rtw_set_ie_secondary_ch_offset(u8 *buf, u32 *buf_len, u8 secondary_ch } inline u8 *rtw_set_ie_mesh_ch_switch_parm(u8 *buf, u32 *buf_len, u8 ttl, - u8 flags, u16 reason, u16 precedence) + u8 flags, u16 reason, u16 precedence) { u8 ie_data[6]; ie_data[0] = ttl; ie_data[1] = flags; - RTW_PUT_LE16((u8*)&ie_data[2], reason); - RTW_PUT_LE16((u8*)&ie_data[4], precedence); + RTW_PUT_LE16((u8 *)&ie_data[2], reason); + RTW_PUT_LE16((u8 *)&ie_data[4], precedence); return rtw_set_ie(buf, 0x118, 6, ie_data, buf_len); } @@ -269,26 +270,20 @@ index: the information element id index, limit is the limit for search -----------------------------------------------------------------------------*/ u8 *rtw_get_ie(u8 *pbuf, sint index, sint *len, sint limit) { - sint tmp,i; + sint tmp, i; u8 *p; -_func_enter_; - if (limit < 1){ - _func_exit_; + if (limit < 1) { return NULL; } p = pbuf; i = 0; *len = 0; - while(1) - { - if (*p == index) - { + while (1) { + if (*p == index) { *len = *(p + 1); - return (p); - } - else - { + return p; + } else { tmp = *(p + 1); p += (tmp + 2); i += (tmp + 2); @@ -296,7 +291,6 @@ _func_enter_; if (i >= limit) break; } -_func_exit_; return NULL; } @@ -318,35 +312,31 @@ u8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, u u8 *target_ie = NULL; - if(ielen) + if (ielen) *ielen = 0; - if(!in_ie || in_len<=0) + if (!in_ie || in_len <= 0) return target_ie; cnt = 0; - while(cnt 12) break; - - i++; + + i++; } -_func_exit_; return i; } int rtw_generate_ie(struct registry_priv *pregistrypriv) { u8 wireless_mode; - int sz = 0, rateLen; - WLAN_BSSID_EX* pdev_network = &pregistrypriv->dev_network; - u8* ie = pdev_network->IEs; - -_func_enter_; + int sz = 0, rateLen; + WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; + u8 *ie = pdev_network->IEs; - //timestamp will be inserted by hardware - sz += 8; + + /* timestamp will be inserted by hardware */ + sz += 8; ie += sz; - - //beacon interval : 2bytes - *(u16*)ie = cpu_to_le16((u16)pdev_network->Configuration.BeaconPeriod);//BCN_INTERVAL; - sz += 2; - ie += 2; - - //capability info - *(u16*)ie = 0; - - *(u16*)ie |= cpu_to_le16(cap_IBSS); - if(pregistrypriv->preamble == PREAMBLE_SHORT) - *(u16*)ie |= cpu_to_le16(cap_ShortPremble); - - if (pdev_network->Privacy) - *(u16*)ie |= cpu_to_le16(cap_Privacy); - + /* beacon interval : 2bytes */ + *(u16 *)ie = cpu_to_le16((u16)pdev_network->Configuration.BeaconPeriod); /* BCN_INTERVAL; */ sz += 2; ie += 2; - - //SSID + + /* capability info */ + *(u16 *)ie = 0; + + *(u16 *)ie |= cpu_to_le16(cap_IBSS); + + if (pregistrypriv->preamble == PREAMBLE_SHORT) + *(u16 *)ie |= cpu_to_le16(cap_ShortPremble); + + if (pdev_network->Privacy) + *(u16 *)ie |= cpu_to_le16(cap_Privacy); + + sz += 2; + ie += 2; + + /* SSID */ ie = rtw_set_ie(ie, _SSID_IE_, pdev_network->Ssid.SsidLength, pdev_network->Ssid.Ssid, &sz); - - //supported rates - if(pregistrypriv->wireless_mode == WIRELESS_11ABGN) - { - if(pdev_network->Configuration.DSConfig > 14) + + /* supported rates */ + if (pregistrypriv->wireless_mode == WIRELESS_11ABGN) { + if (pdev_network->Configuration.DSConfig > 14) wireless_mode = WIRELESS_11A_5N; else wireless_mode = WIRELESS_11BG_24N; - } - else - { + } else if (pregistrypriv->wireless_mode == WIRELESS_MODE_MAX) { /* WIRELESS_11ABGN | WIRELESS_11AC */ + if (pdev_network->Configuration.DSConfig > 14) + wireless_mode = WIRELESS_11_5AC; + else + wireless_mode = WIRELESS_11BG_24N; + } else wireless_mode = pregistrypriv->wireless_mode; - } - + rtw_set_supported_rate(pdev_network->SupportedRates, wireless_mode) ; - + rateLen = rtw_get_rateset_len(pdev_network->SupportedRates); - if (rateLen > 8) - { + if (rateLen > 8) { ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, pdev_network->SupportedRates, &sz); - //ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); - } - else - { + /* ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); */ + } else ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, pdev_network->SupportedRates, &sz); - } - //DS parameter set + /* DS parameter set */ ie = rtw_set_ie(ie, _DSSET_IE_, 1, (u8 *)&(pdev_network->Configuration.DSConfig), &sz); - //IBSS Parameter Set - + /* IBSS Parameter Set */ + ie = rtw_set_ie(ie, _IBSS_PARA_IE_, 2, (u8 *)&(pdev_network->Configuration.ATIMWindow), &sz); if (rateLen > 8) - { ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); - } - + #ifdef CONFIG_80211N_HT - //HT Cap. - if(((pregistrypriv->wireless_mode&WIRELESS_11_5N)||(pregistrypriv->wireless_mode&WIRELESS_11_24N)) - && (pregistrypriv->ht_enable==_TRUE)) - { - //todo: + /* HT Cap. */ + if (((pregistrypriv->wireless_mode & WIRELESS_11_5N) || (pregistrypriv->wireless_mode & WIRELESS_11_24N)) + && (pregistrypriv->ht_enable == _TRUE)) { + /* todo: */ } -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ - //pdev_network->IELength = sz; //update IELength + /* pdev_network->IELength = sz; */ /* update IELength */ -_func_exit_; - //return _SUCCESS; + /* return _SUCCESS; */ return sz; @@ -550,19 +523,17 @@ unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit) u8 *pbuf = pie; int limit_new = limit; - while(1) - { + while (1) { pbuf = rtw_get_ie(pbuf, _WPA_IE_ID_, &len, limit_new); if (pbuf) { - //check if oui matches... - if (_rtw_memcmp((pbuf + 2), wpa_oui_type, sizeof (wpa_oui_type)) == _FALSE) { + /* check if oui matches... */ + if (_rtw_memcmp((pbuf + 2), wpa_oui_type, sizeof(wpa_oui_type)) == _FALSE) goto check_next_ie; - } - //check version... + /* check version... */ _rtw_memcpy((u8 *)&val16, (pbuf + 6), sizeof(val16)); val16 = le16_to_cpu(val16); @@ -573,8 +544,7 @@ unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit) return pbuf; - } - else { + } else { *wpa_ie_len = 0; return NULL; @@ -598,9 +568,9 @@ check_next_ie: } unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit) -{ +{ - return rtw_get_ie(pie, _WPA2_IE_ID_,rsn_ie_len, limit); + return rtw_get_ie(pie, _WPA2_IE_ID_, rsn_ie_len, limit); } @@ -637,9 +607,9 @@ int rtw_get_wpa2_cipher_suite(u8 *s) } -int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x) +int rtw_parse_wpa_ie(u8 *wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x) { - int i, ret=_SUCCESS; + int i, ret = _SUCCESS; int left, count; u8 *pos; u8 SUITE_1X[4] = {0x00, 0x50, 0xf2, 1}; @@ -649,62 +619,50 @@ int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwis return _FAIL; } - - if ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie+1) != (u8)(wpa_ie_len - 2)) || - (_rtw_memcmp(wpa_ie+2, RTW_WPA_OUI_TYPE, WPA_SELECTOR_LEN) != _TRUE) ) - { + + if ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie + 1) != (u8)(wpa_ie_len - 2)) || + (_rtw_memcmp(wpa_ie + 2, RTW_WPA_OUI_TYPE, WPA_SELECTOR_LEN) != _TRUE)) return _FAIL; - } pos = wpa_ie; pos += 8; - left = wpa_ie_len - 8; + left = wpa_ie_len - 8; - //group_cipher + /* group_cipher */ if (left >= WPA_SELECTOR_LEN) { *group_cipher = rtw_get_wpa_cipher_suite(pos); - + pos += WPA_SELECTOR_LEN; left -= WPA_SELECTOR_LEN; - - } - else if (left > 0) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left)); - + + } else if (left > 0) { + return _FAIL; } - //pairwise_cipher - if (left >= 2) - { - //count = le16_to_cpu(*(u16*)pos); + /* pairwise_cipher */ + if (left >= 2) { + /* count = le16_to_cpu(*(u16*)pos); */ count = RTW_GET_LE16(pos); pos += 2; left -= 2; - + if (count == 0 || left < count * WPA_SELECTOR_LEN) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), " - "count %u left %u", __FUNCTION__, count, left)); return _FAIL; } - - for (i = 0; i < count; i++) - { + + for (i = 0; i < count; i++) { *pairwise_cipher |= rtw_get_wpa_cipher_suite(pos); - + pos += WPA_SELECTOR_LEN; left -= WPA_SELECTOR_LEN; } - - } - else if (left == 1) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__)); + + } else if (left == 1) { return _FAIL; } @@ -712,22 +670,21 @@ int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwis if (left >= 6) { pos += 2; if (_rtw_memcmp(pos, SUITE_1X, 4) == 1) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("%s : there has 802.1x auth\n", __FUNCTION__)); *is_8021x = 1; } } } - + return ret; - + } -int rtw_parse_wpa2_ie(u8* rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x) +int rtw_parse_wpa2_ie(u8 *rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x) { - int i, ret=_SUCCESS; + int i, ret = _SUCCESS; int left, count; u8 *pos; - u8 SUITE_1X[4] = {0x00,0x0f, 0xac, 0x01}; + u8 SUITE_1X[4] = {0x00, 0x0f, 0xac, 0x01}; if (rsn_ie_len <= 0) { /* No RSN IE - fail silently */ @@ -735,55 +692,45 @@ int rtw_parse_wpa2_ie(u8* rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwi } - if ((*rsn_ie!= _WPA2_IE_ID_) || (*(rsn_ie+1) != (u8)(rsn_ie_len - 2))) - { + if ((*rsn_ie != _WPA2_IE_ID_) || (*(rsn_ie + 1) != (u8)(rsn_ie_len - 2))) return _FAIL; - } - + pos = rsn_ie; pos += 4; - left = rsn_ie_len - 4; + left = rsn_ie_len - 4; - //group_cipher + /* group_cipher */ if (left >= RSN_SELECTOR_LEN) { *group_cipher = rtw_get_wpa2_cipher_suite(pos); - + pos += RSN_SELECTOR_LEN; left -= RSN_SELECTOR_LEN; - + } else if (left > 0) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left)); return _FAIL; } - //pairwise_cipher - if (left >= 2) - { - //count = le16_to_cpu(*(u16*)pos); + /* pairwise_cipher */ + if (left >= 2) { + /* count = le16_to_cpu(*(u16*)pos); */ count = RTW_GET_LE16(pos); pos += 2; left -= 2; if (count == 0 || left < count * RSN_SELECTOR_LEN) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), " - "count %u left %u", __FUNCTION__, count, left)); return _FAIL; } - - for (i = 0; i < count; i++) - { + + for (i = 0; i < count; i++) { *pairwise_cipher |= rtw_get_wpa2_cipher_suite(pos); - + pos += RSN_SELECTOR_LEN; left -= RSN_SELECTOR_LEN; } - } - else if (left == 1) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__)); - + } else if (left == 1) { + return _FAIL; } @@ -791,178 +738,138 @@ int rtw_parse_wpa2_ie(u8* rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwi if (left >= 6) { pos += 2; if (_rtw_memcmp(pos, SUITE_1X, 4) == 1) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("%s (): there has 802.1x auth\n", __FUNCTION__)); *is_8021x = 1; } } } return ret; - + } -//#ifdef CONFIG_WAPI_SUPPORT -int rtw_get_wapi_ie(u8 *in_ie,uint in_len,u8 *wapi_ie,u16 *wapi_len) +/* #ifdef CONFIG_WAPI_SUPPORT */ +int rtw_get_wapi_ie(u8 *in_ie, uint in_len, u8 *wapi_ie, u16 *wapi_len) { int len = 0; u8 authmode, i; - uint cnt; - u8 wapi_oui1[4]={0x0,0x14,0x72,0x01}; - u8 wapi_oui2[4]={0x0,0x14,0x72,0x02}; + uint cnt; + u8 wapi_oui1[4] = {0x0, 0x14, 0x72, 0x01}; + u8 wapi_oui2[4] = {0x0, 0x14, 0x72, 0x02}; -_func_enter_; - if(wapi_len) + if (wapi_len) *wapi_len = 0; - if(!in_ie || in_len<=0) + if (!in_ie || in_len <= 0) return len; cnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_); - - while(cnt found WPS_IE.....\n"); - *wps_ielen = ie_ptr[1]+2; - match=_TRUE; - } + + if ((eid == _WPA_IE_ID_) && (_rtw_memcmp(&ie_ptr[2], wps_oui, 4) == _TRUE)) { + /* RTW_INFO("==> found WPS_IE.....\n"); */ + *wps_ielen = ie_ptr[1] + 2; + match = _TRUE; + } return match; } u8 *rtw_get_wps_ie_from_scan_queue(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen, u8 frame_type) { - u8* wps = NULL; + u8 *wps = NULL; - DBG_871X( "[%s] frame_type = %d\n", __FUNCTION__, frame_type ); - switch( frame_type ) - { - case 1: - case 3: - { // Beacon or Probe Response - wps = rtw_get_wps_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, wps_ie, wps_ielen); - break; - } - case 2: - { // Probe Request - wps = rtw_get_wps_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , wps_ie, wps_ielen); - break; - } + RTW_INFO("[%s] frame_type = %d\n", __FUNCTION__, frame_type); + switch (frame_type) { + case 1: + case 3: { + /* Beacon or Probe Response */ + wps = rtw_get_wps_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, wps_ie, wps_ielen); + break; + } + case 2: { + /* Probe Request */ + wps = rtw_get_wps_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , wps_ie, wps_ielen); + break; + } } return wps; } @@ -1013,9 +920,8 @@ u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) *wps_ielen = in_ie[cnt + 1] + 2; break; - } else { + } else cnt += in_ie[cnt + 1] + 2; - } } @@ -1032,50 +938,44 @@ u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) * * Returns: the address of the specific WPS attribute found, or NULL */ -u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_attr, u32 *len_attr) +u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id , u8 *buf_attr, u32 *len_attr) { u8 *attr_ptr = NULL; - u8 * target_attr_ptr = NULL; - u8 wps_oui[4]={0x00,0x50,0xF2,0x04}; + u8 *target_attr_ptr = NULL; + u8 wps_oui[4] = {0x00, 0x50, 0xF2, 0x04}; - if(len_attr) + if (len_attr) *len_attr = 0; - if ( ( wps_ie[0] != _VENDOR_SPECIFIC_IE_ ) || - ( _rtw_memcmp( wps_ie + 2, wps_oui , 4 ) != _TRUE ) ) - { + if ((wps_ie[0] != _VENDOR_SPECIFIC_IE_) || + (_rtw_memcmp(wps_ie + 2, wps_oui , 4) != _TRUE)) return attr_ptr; - } - // 6 = 1(Element ID) + 1(Length) + 4(WPS OUI) - attr_ptr = wps_ie + 6; //goto first attr - - while(attr_ptr - wps_ie < wps_ielen) - { - // 4 = 2(Attribute ID) + 2(Length) + /* 6 = 1(Element ID) + 1(Length) + 4(WPS OUI) */ + attr_ptr = wps_ie + 6; /* goto first attr */ + + while (attr_ptr - wps_ie < wps_ielen) { + /* 4 = 2(Attribute ID) + 2(Length) */ u16 attr_id = RTW_GET_BE16(attr_ptr); u16 attr_data_len = RTW_GET_BE16(attr_ptr + 2); u16 attr_len = attr_data_len + 4; - - //DBG_871X("%s attr_ptr:%p, id:%u, length:%u\n", __FUNCTION__, attr_ptr, attr_id, attr_data_len); - if( attr_id == target_attr_id ) - { + + /* RTW_INFO("%s attr_ptr:%p, id:%u, length:%u\n", __FUNCTION__, attr_ptr, attr_id, attr_data_len); */ + if (attr_id == target_attr_id) { target_attr_ptr = attr_ptr; - - if(buf_attr) + + if (buf_attr) _rtw_memcpy(buf_attr, attr_ptr, attr_len); - - if(len_attr) + + if (len_attr) *len_attr = attr_len; - + break; + } else { + attr_ptr += attr_len; /* goto next */ } - else - { - attr_ptr += attr_len; //goto next - } - - } + + } return target_attr_ptr; } @@ -1090,33 +990,32 @@ u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_att * * Returns: the address of the specific WPS attribute content found, or NULL */ -u8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_content, uint *len_content) +u8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id , u8 *buf_content, uint *len_content) { u8 *attr_ptr; u32 attr_len; - if(len_content) + if (len_content) *len_content = 0; - + attr_ptr = rtw_get_wps_attr(wps_ie, wps_ielen, target_attr_id, NULL, &attr_len); - if(attr_ptr && attr_len) - { - if(buf_content) - _rtw_memcpy(buf_content, attr_ptr+4, attr_len-4); + if (attr_ptr && attr_len) { + if (buf_content) + _rtw_memcpy(buf_content, attr_ptr + 4, attr_len - 4); - if(len_content) - *len_content = attr_len-4; + if (len_content) + *len_content = attr_len - 4; - return attr_ptr+4; + return attr_ptr + 4; } return NULL; } static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen, - struct rtw_ieee802_11_elems *elems, - int show_errors) + struct rtw_ieee802_11_elems *elems, + int show_errors) { unsigned int oui; @@ -1125,9 +1024,9 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen, * sub-type. */ if (elen < 4) { if (show_errors) { - DBG_871X("short vendor specific " - "information element ignored (len=%lu)\n", - (unsigned long) elen); + RTW_INFO("short vendor specific " + "information element ignored (len=%lu)\n", + (unsigned long) elen); } return -1; } @@ -1146,10 +1045,10 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen, break; case WME_OUI_TYPE: /* this is a Wi-Fi WME info. element */ if (elen < 5) { - DBG_871X("short WME " - "information element ignored " - "(len=%lu)\n", - (unsigned long) elen); + RTW_DBG("short WME " + "information element ignored " + "(len=%lu)\n", + (unsigned long) elen); return -1; } switch (pos[4]) { @@ -1163,10 +1062,10 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen, elems->wme_tspec_len = elen; break; default: - DBG_871X_LEVEL(_drv_warning_, "unknown WME " - "information element ignored " - "(subtype=%d len=%lu)\n", - pos[4], (unsigned long) elen); + RTW_DBG("unknown WME " + "information element ignored " + "(subtype=%d len=%lu)\n", + pos[4], (unsigned long) elen); return -1; } break; @@ -1176,10 +1075,10 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen, elems->wps_ie_len = elen; break; default: - DBG_871X_LEVEL(_drv_warning_, "Unknown Microsoft " - "information element ignored " - "(type=%d len=%lu)\n", - pos[3], (unsigned long) elen); + RTW_DBG("Unknown Microsoft " + "information element ignored " + "(type=%d len=%lu)\n", + pos[3], (unsigned long) elen); return -1; } break; @@ -1191,24 +1090,24 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen, elems->vendor_ht_cap_len = elen; break; default: - DBG_871X_LEVEL(_drv_warning_, "Unknown Broadcom " - "information element ignored " - "(type=%d len=%lu)\n", - pos[3], (unsigned long) elen); + RTW_DBG("Unknown Broadcom " + "information element ignored " + "(type=%d len=%lu)\n", + pos[3], (unsigned long) elen); return -1; } break; default: - DBG_871X_LEVEL(_drv_warning_, "unknown vendor specific information " - "element ignored (vendor OUI %02x:%02x:%02x " - "len=%lu)\n", - pos[0], pos[1], pos[2], (unsigned long) elen); + RTW_DBG("unknown vendor specific information " + "element ignored (vendor OUI %02x:%02x:%02x " + "len=%lu)\n", + pos[0], pos[1], pos[2], (unsigned long) elen); return -1; } return 0; - + } /** @@ -1220,8 +1119,8 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen, * Returns: Parsing result */ ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, - struct rtw_ieee802_11_elems *elems, - int show_errors) + struct rtw_ieee802_11_elems *elems, + int show_errors) { uint left = len; u8 *pos = start; @@ -1238,10 +1137,10 @@ ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, if (elen > left) { if (show_errors) { - DBG_871X("IEEE 802.11 element " - "parse failed (id=%d elen=%d " - "left=%lu)\n", - id, elen, (unsigned long) left); + RTW_INFO("IEEE 802.11 element " + "parse failed (id=%d elen=%d " + "left=%lu)\n", + id, elen, (unsigned long) left); } return ParseFailed; } @@ -1289,8 +1188,8 @@ ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, break; case WLAN_EID_VENDOR_SPECIFIC: if (rtw_ieee802_11_parse_vendor_specific(pos, elen, - elems, - show_errors)) + elems, + show_errors)) unknown++; break; case WLAN_EID_RSN: @@ -1341,8 +1240,7 @@ ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, unknown++; if (!show_errors) break; - DBG_871X_LEVEL(_drv_warning_, - "IEEE 802.11 element parse " + RTW_DBG("IEEE 802.11 element parse " "ignored unknown element (id=%d elen=%d)\n", id, elen); break; @@ -1356,32 +1254,32 @@ ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, return ParseFailed; return unknown ? ParseUnknown : ParseOK; - + } static u8 key_char2num(u8 ch); static u8 key_char2num(u8 ch) { - if((ch>='0')&&(ch<='9')) - return ch - '0'; - else if ((ch>='a')&&(ch<='f')) - return ch - 'a' + 10; - else if ((ch>='A')&&(ch<='F')) - return ch - 'A' + 10; - else - return 0xff; + if ((ch >= '0') && (ch <= '9')) + return ch - '0'; + else if ((ch >= 'a') && (ch <= 'f')) + return ch - 'a' + 10; + else if ((ch >= 'A') && (ch <= 'F')) + return ch - 'A' + 10; + else + return 0xff; } u8 str_2char2num(u8 hch, u8 lch); u8 str_2char2num(u8 hch, u8 lch) { - return ((key_char2num(hch) * 10 ) + key_char2num(lch)); + return (key_char2num(hch) * 10) + key_char2num(lch); } u8 key_2char2num(u8 hch, u8 lch); u8 key_2char2num(u8 hch, u8 lch) { - return ((key_char2num(hch) << 4) | key_char2num(lch)); + return (key_char2num(hch) << 4) | key_char2num(lch); } void macstr2num(u8 *dst, u8 *src); @@ -1389,14 +1287,12 @@ void macstr2num(u8 *dst, u8 *src) { int jj, kk; for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - { dst[jj] = key_2char2num(src[kk], src[kk + 1]); - } } u8 convert_ip_addr(u8 hch, u8 mch, u8 lch) { - return ((key_char2num(hch) * 100) + (key_char2num(mch) * 10 ) + key_char2num(lch)); + return (key_char2num(hch) * 100) + (key_char2num(mch) * 10) + key_char2num(lch); } #ifdef CONFIG_PLATFORM_INTEL_BYT @@ -1409,32 +1305,28 @@ int rtw_get_mac_addr_intel(unsigned char *buf) struct file *fp = NULL; mm_segment_t oldfs; unsigned char c_mac[MAC_ADDRESS_LEN]; - char fname[]="/config/wifi/mac.txt"; - int jj,kk; + char fname[] = "/config/wifi/mac.txt"; + int jj, kk; - DBG_871X("%s Enter\n", __FUNCTION__); + RTW_INFO("%s Enter\n", __FUNCTION__); ret = rtw_retrieve_from_file(fname, c_mac, MAC_ADDRESS_LEN); - if(ret < MAC_ADDRESS_LEN) - { + if (ret < MAC_ADDRESS_LEN) return -1; - } - for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 2 ) - { - buf[jj] = key_2char2num(c_mac[kk], c_mac[kk+ 1]); - } + for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 2) + buf[jj] = key_2char2num(c_mac[kk], c_mac[kk + 1]); - DBG_871X("%s: read from file mac address: "MAC_FMT"\n", + RTW_INFO("%s: read from file mac address: "MAC_FMT"\n", __FUNCTION__, MAC_ARG(buf)); return 0; } -#endif //CONFIG_PLATFORM_INTEL_BYT +#endif /* CONFIG_PLATFORM_INTEL_BYT */ /* * Description: - * rtw_check_invalid_mac_address: + * rtw_check_invalid_mac_address: * This is only used for checking mac address valid or not. * * Input: @@ -1479,7 +1371,7 @@ func_exit: return res; } -extern char* rtw_initmac; +extern char *rtw_initmac; /** * rtw_macaddr_cfg - Decide the mac address used * @out: buf to store mac address decided @@ -1497,7 +1389,7 @@ void rtw_macaddr_cfg(u8 *out, const u8 *hw_mac_addr) /* Users specify the mac address */ if (rtw_initmac) { - int jj,kk; + 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]); @@ -1519,45 +1411,45 @@ void rtw_macaddr_cfg(u8 *out, const u8 *hw_mac_addr) err_chk: if (rtw_check_invalid_mac_address(mac, _TRUE) == _TRUE) { - #if DEFAULT_RANDOM_MACADDR - DBG_871X_LEVEL(_drv_err_, "invalid mac addr:"MAC_FMT", assign random MAC\n", MAC_ARG(mac)); +#if DEFAULT_RANDOM_MACADDR + RTW_ERR("invalid mac addr:"MAC_FMT", assign random MAC\n", MAC_ARG(mac)); *((u32 *)(&mac[2])) = rtw_random32(); mac[0] = 0x00; mac[1] = 0xe0; mac[2] = 0x4c; - #else - DBG_871X_LEVEL(_drv_err_, "invalid mac addr:"MAC_FMT", assign default one\n", MAC_ARG(mac)); +#else + RTW_ERR("invalid mac addr:"MAC_FMT", assign default one\n", MAC_ARG(mac)); mac[0] = 0x00; mac[1] = 0xe0; mac[2] = 0x4c; mac[3] = 0x87; mac[4] = 0x00; mac[5] = 0x00; - #endif +#endif } _rtw_memcpy(out, mac, ETH_ALEN); - DBG_871X("%s mac addr:"MAC_FMT"\n", __func__, MAC_ARG(out)); + RTW_INFO("%s mac addr:"MAC_FMT"\n", __func__, MAC_ARG(out)); } #ifdef CONFIG_80211N_HT void dump_ht_cap_ie_content(void *sel, u8 *buf, u32 buf_len) { if (buf_len != 26) { - DBG_871X_SEL_NL(sel, "Invalid HT capability IE len:%d != %d\n", buf_len, 26); + RTW_PRINT_SEL(sel, "Invalid HT capability IE len:%d != %d\n", buf_len, 26); return; } - DBG_871X_SEL_NL(sel, "HT Capabilities Info:%02x%02x\n", *(buf), *(buf+1)); - DBG_871X_SEL_NL(sel, "A-MPDU Parameters:"HT_AMPDU_PARA_FMT"\n" - , HT_AMPDU_PARA_ARG(HT_CAP_ELE_AMPDU_PARA(buf))); - DBG_871X_SEL_NL(sel, "Supported MCS Set:"HT_SUP_MCS_SET_FMT"\n" - , HT_SUP_MCS_SET_ARG(HT_CAP_ELE_SUP_MCS_SET(buf))); + RTW_PRINT_SEL(sel, "HT Capabilities Info:%02x%02x\n", *(buf), *(buf + 1)); + RTW_PRINT_SEL(sel, "A-MPDU Parameters:"HT_AMPDU_PARA_FMT"\n" + , HT_AMPDU_PARA_ARG(HT_CAP_ELE_AMPDU_PARA(buf))); + RTW_PRINT_SEL(sel, "Supported MCS Set:"HT_SUP_MCS_SET_FMT"\n" + , HT_SUP_MCS_SET_ARG(HT_CAP_ELE_SUP_MCS_SET(buf))); } void dump_ht_cap_ie(void *sel, u8 *ie, u32 ie_len) { - u8* pos = (u8*)ie; + u8 *pos = (u8 *)ie; u16 id; u16 len; @@ -1565,41 +1457,41 @@ void dump_ht_cap_ie(void *sel, u8 *ie, u32 ie_len) sint ht_cap_ielen; ht_cap_ie = rtw_get_ie(ie, _HT_CAPABILITY_IE_, &ht_cap_ielen, ie_len); - if(!ie || ht_cap_ie != ie) + if (!ie || ht_cap_ie != ie) return; - dump_ht_cap_ie_content(sel, ht_cap_ie+2, ht_cap_ielen); + dump_ht_cap_ie_content(sel, ht_cap_ie + 2, ht_cap_ielen); } #endif /* CONFIG_80211N_HT */ void dump_ies(void *sel, u8 *buf, u32 buf_len) { - u8* pos = (u8*)buf; + u8 *pos = (u8 *)buf; u8 id, len; - while(pos-buf+1= 1) - *bw = CHANNEL_WIDTH_80; + vht_op_ie = rtw_get_ie(ies, EID_VHTOperation, &vht_op_ielen, ies_len); + if (vht_op_ie && vht_op_ielen) { + /* enable VHT 80 before check enable HT40 or not */ + if (GET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2) >= 1) { + /* for HT40, enable VHT80 */ + if (*bw == CHANNEL_WIDTH_40) + *bw = CHANNEL_WIDTH_80; + /* for HT20, enable VHT20 */ + else if (*bw == CHANNEL_WIDTH_20) { + /* modify VHT OP IE */ + SET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2, 0); + /* reset to 0 for VHT20 */ + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op_ie + 2, 0); + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op_ie + 2, 0); + } + } else { + /* + VHT OP WIDTH = 0 under HT20/HT40 + if REGSTY_BW_5G(pregistrypriv) < CHANNEL_WIDTH_80 in rtw_build_vht_operation_ie + */ + } + } } -} #endif } @@ -1698,11 +1608,11 @@ void rtw_bss_get_chbw(WLAN_BSSID_EX *bss, u8 *ch, u8 *bw, u8 *offset) , bss->IELength - sizeof(NDIS_802_11_FIXED_IEs) , ch, bw, offset); - if (*ch == 0) { + if (*ch == 0) *ch = bss->Configuration.DSConfig; - } else if (*ch != bss->Configuration.DSConfig) { - DBG_871X("inconsistent ch - ies:%u bss->Configuration.DSConfig:%u\n" - , *ch, bss->Configuration.DSConfig); + else if (*ch != bss->Configuration.DSConfig) { + RTW_INFO("inconsistent ch - ies:%u bss->Configuration.DSConfig:%u\n" + , *ch, bss->Configuration.DSConfig); *ch = bss->Configuration.DSConfig; rtw_warn_on(1); } @@ -1718,7 +1628,7 @@ void rtw_bss_get_chbw(WLAN_BSSID_EX *bss, u8 *ch, u8 *bw, u8 *offset) * @offset_b: offset of set b */ bool rtw_is_chbw_grouped(u8 ch_a, u8 bw_a, u8 offset_a - , u8 ch_b, u8 bw_b, u8 offset_b) + , u8 ch_b, u8 bw_b, u8 offset_b) { bool is_grouped = _FALSE; @@ -1726,8 +1636,8 @@ bool rtw_is_chbw_grouped(u8 ch_a, u8 bw_a, u8 offset_a /* ch is different */ goto exit; } else if ((bw_a == CHANNEL_WIDTH_40 || bw_a == CHANNEL_WIDTH_80) - && (bw_b == CHANNEL_WIDTH_40 || bw_b == CHANNEL_WIDTH_80) - ) { + && (bw_b == CHANNEL_WIDTH_40 || bw_b == CHANNEL_WIDTH_80) + ) { if (offset_a != offset_b) goto exit; } @@ -1748,7 +1658,7 @@ exit: * @g_offset: pointer of the ongoing group offset, may be modified further */ void rtw_sync_chbw(u8 *req_ch, u8 *req_bw, u8 *req_offset - , u8 *g_ch, u8 *g_bw, u8 *g_offset) + , u8 *g_ch, u8 *g_bw, u8 *g_offset) { *req_ch = *g_ch; @@ -1766,7 +1676,7 @@ void rtw_sync_chbw(u8 *req_ch, u8 *req_bw, u8 *req_offset *req_offset = rtw_get_offset_by_ch(*req_ch); if (*req_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) { - DBG_871X_LEVEL(_drv_err_, "%s req 80MHz BW without offset, down to 20MHz\n", __func__); + RTW_ERR("%s req 80MHz BW without offset, down to 20MHz\n", __func__); rtw_warn_on(1); *req_bw = CHANNEL_WIDTH_20; } @@ -1778,7 +1688,7 @@ void rtw_sync_chbw(u8 *req_ch, u8 *req_bw, u8 *req_offset *req_offset = rtw_get_offset_by_ch(*req_ch); if (*req_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) { - DBG_871X_LEVEL(_drv_err_, "%s req 40MHz BW without offset, down to 20MHz\n", __func__); + RTW_ERR("%s req 40MHz BW without offset, down to 20MHz\n", __func__); rtw_warn_on(1); *req_bw = CHANNEL_WIDTH_20; } @@ -1787,7 +1697,7 @@ void rtw_sync_chbw(u8 *req_ch, u8 *req_bw, u8 *req_offset *req_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; break; default: - DBG_871X_LEVEL(_drv_err_, "%s req unsupported BW:%u\n", __func__, *req_bw); + RTW_ERR("%s req unsupported BW:%u\n", __func__, *req_bw); rtw_warn_on(1); } @@ -1797,7 +1707,6 @@ void rtw_sync_chbw(u8 *req_ch, u8 *req_bw, u8 *req_offset } } -#ifdef CONFIG_P2P /** * rtw_get_p2p_merged_len - Get merged ie length from muitiple p2p ies. * @in_ie: Pointer of the first p2p ie @@ -1808,22 +1717,20 @@ u32 rtw_get_p2p_merged_ies_len(u8 *in_ie, u32 in_len) { PNDIS_802_11_VARIABLE_IEs pIE; u8 OUI[4] = { 0x50, 0x6f, 0x9a, 0x09 }; - int i=0; - int j=0, len=0; + int i = 0; + int j = 0, len = 0; - while( i < in_len) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie+ i); + while (i < in_len) { + pIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie + i); - if( pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4) ) - { - len += pIE->Length-4; // 4 is P2P OUI length, don't count it in this loop + if (pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4)) { + len += pIE->Length - 4; /* 4 is P2P OUI length, don't count it in this loop */ } i += (pIE->Length + 2); } - return len + 4; // Append P2P OUI length at last. + return len + 4; /* Append P2P OUI length at last. */ } /** @@ -1838,80 +1745,57 @@ int rtw_p2p_merge_ies(u8 *in_ie, u32 in_len, u8 *merge_ie) PNDIS_802_11_VARIABLE_IEs pIE; u8 len = 0; u8 OUI[4] = { 0x50, 0x6f, 0x9a, 0x09 }; - u8 ELOUI[6] = { 0xDD, 0x00, 0x50, 0x6f, 0x9a, 0x09 }; //EID;Len;OUI, Len would copy at the end of function - int i=0; + u8 ELOUI[6] = { 0xDD, 0x00, 0x50, 0x6f, 0x9a, 0x09 }; /* EID;Len;OUI, Len would copy at the end of function */ + int i = 0; - if( merge_ie != NULL) - { - //Set first P2P OUI + if (merge_ie != NULL) { + /* Set first P2P OUI */ _rtw_memcpy(merge_ie, ELOUI, 6); merge_ie += 6; - while( i < in_len) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie+ i); + while (i < in_len) { + pIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie + i); - // Take out the rest of P2P OUIs - if( pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4) ) - { - _rtw_memcpy( merge_ie, pIE->data +4, pIE->Length -4); - len += pIE->Length-4; - merge_ie += pIE->Length-4; + /* Take out the rest of P2P OUIs */ + if (pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4)) { + _rtw_memcpy(merge_ie, pIE->data + 4, pIE->Length - 4); + len += pIE->Length - 4; + merge_ie += pIE->Length - 4; } i += (pIE->Length + 2); } - return len + 4; // 4 is for P2P OUI + return len + 4; /* 4 is for P2P OUI */ } return 0; } -void dump_p2p_ie(void *sel, u8 *ie, u32 ie_len) { - u8* pos = (u8*)ie; +void dump_p2p_ie(void *sel, u8 *ie, u32 ie_len) +{ + u8 *pos = (u8 *)ie; u8 id; u16 len; u8 *p2p_ie; uint p2p_ielen; - + p2p_ie = rtw_get_p2p_ie(ie, ie_len, NULL, &p2p_ielen); - if(p2p_ie != ie || p2p_ielen == 0) + if (p2p_ie != ie || p2p_ielen == 0) return; - pos+=6; - while(pos-ie < ie_len){ + pos += 6; + while (pos - ie + 3 <= ie_len) { id = *pos; - len = RTW_GET_LE16(pos+1); + len = RTW_GET_LE16(pos + 1); - DBG_871X_SEL_NL(sel, "%s ID:%u, LEN:%u\n", __FUNCTION__, id, len); + RTW_PRINT_SEL(sel, "%s ID:%u, LEN:%u%s\n", __func__, id, len + , ((pos - ie + 3 + len) <= ie_len) ? "" : "(exceed ie_len)"); - pos+=(3+len); - } -} - -u8 *rtw_get_p2p_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen, u8 frame_type) -{ - u8* p2p = NULL; - - DBG_871X( "[%s] frame_type = %d\n", __FUNCTION__, frame_type ); - switch( frame_type ) - { - case 1: - case 3: - { // Beacon or Probe Response - p2p = rtw_get_p2p_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, p2p_ie, p2p_ielen); - break; - } - case 2: - { // Probe Request - p2p = rtw_get_p2p_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , p2p_ie, p2p_ielen); - break; - } + pos += (3 + len); } - return p2p; } /** @@ -1960,9 +1844,8 @@ u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen) *p2p_ielen = in_ie[cnt + 1] + 2; break; - } else { + } else cnt += in_ie[cnt + 1] + 2; - } } @@ -1979,50 +1862,49 @@ u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen) * * Returns: the address of the specific WPS attribute found, or NULL */ -u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr) +u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id , u8 *buf_attr, u32 *len_attr) { u8 *attr_ptr = NULL; u8 *target_attr_ptr = NULL; - u8 p2p_oui[4]={0x50,0x6F,0x9A,0x09}; + u8 p2p_oui[4] = {0x50, 0x6F, 0x9A, 0x09}; - if(len_attr) + if (len_attr) *len_attr = 0; - if ( !p2p_ie || ( p2p_ie[0] != _VENDOR_SPECIFIC_IE_ ) || - ( _rtw_memcmp( p2p_ie + 2, p2p_oui , 4 ) != _TRUE ) ) - { + if (!p2p_ie + || p2p_ielen <= 6 + || (p2p_ie[0] != WLAN_EID_VENDOR_SPECIFIC) + || (_rtw_memcmp(p2p_ie + 2, p2p_oui, 4) != _TRUE)) return attr_ptr; - } - // 6 = 1(Element ID) + 1(Length) + 3 (OUI) + 1(OUI Type) - attr_ptr = p2p_ie + 6; //goto first attr - - while(attr_ptr - p2p_ie < p2p_ielen) - { - // 3 = 1(Attribute ID) + 2(Length) + /* 6 = 1(Element ID) + 1(Length) + 3 (OUI) + 1(OUI Type) */ + attr_ptr = p2p_ie + 6; /* goto first attr */ + + while ((attr_ptr - p2p_ie + 3) <= p2p_ielen) { + /* 3 = 1(Attribute ID) + 2(Length) */ u8 attr_id = *attr_ptr; u16 attr_data_len = RTW_GET_LE16(attr_ptr + 1); u16 attr_len = attr_data_len + 3; - - //DBG_871X("%s attr_ptr:%p, id:%u, length:%u\n", __FUNCTION__, attr_ptr, attr_id, attr_data_len); - if( attr_id == target_attr_id ) - { - target_attr_ptr = attr_ptr; - - if(buf_attr) - _rtw_memcpy(buf_attr, attr_ptr, attr_len); - - if(len_attr) - *len_attr = attr_len; - + + if (0) + RTW_INFO("%s attr_ptr:%p, id:%u, length:%u\n", __func__, attr_ptr, attr_id, attr_data_len); + + if ((attr_ptr - p2p_ie + attr_len) > p2p_ielen) break; - } - else - { - attr_ptr += attr_len; //goto next - } - - } + + if (attr_id == target_attr_id) { + target_attr_ptr = attr_ptr; + + if (buf_attr) + _rtw_memcpy(buf_attr, attr_ptr, attr_len); + + if (len_attr) + *len_attr = attr_len; + + break; + } else + attr_ptr += attr_len; + } return target_attr_ptr; } @@ -2037,282 +1919,531 @@ u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr * * Returns: the address of the specific P2P attribute content found, or NULL */ -u8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_content, uint *len_content) +u8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id , u8 *buf_content, uint *len_content) { u8 *attr_ptr; u32 attr_len; - if(len_content) + if (len_content) *len_content = 0; - + attr_ptr = rtw_get_p2p_attr(p2p_ie, p2p_ielen, target_attr_id, NULL, &attr_len); - if(attr_ptr && attr_len) - { - if(buf_content) - _rtw_memcpy(buf_content, attr_ptr+3, attr_len-3); + if (attr_ptr && attr_len) { + if (buf_content) + _rtw_memcpy(buf_content, attr_ptr + 3, attr_len - 3); - if(len_content) - *len_content = attr_len-3; + if (len_content) + *len_content = attr_len - 3; - return attr_ptr+3; + return attr_ptr + 3; } return NULL; } u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr) -{ +{ u32 a_len; *pbuf = attr_id; - - //*(u16*)(pbuf + 1) = cpu_to_le16(attr_len); + + /* *(u16*)(pbuf + 1) = cpu_to_le16(attr_len); */ RTW_PUT_LE16(pbuf + 1, attr_len); - if(pdata_attr) - _rtw_memcpy(pbuf + 3, pdata_attr, attr_len); - + if (pdata_attr) + _rtw_memcpy(pbuf + 3, pdata_attr, attr_len); + a_len = attr_len + 3; - + return a_len; } -static uint rtw_p2p_attr_remove(u8 *ie, uint ielen_ori, u8 attr_id) +uint rtw_del_p2p_ie(u8 *ies, uint ies_len_ori, const char *msg) { +#define DBG_DEL_P2P_IE 0 + + u8 *target_ie; + u32 target_ie_len; + uint ies_len = ies_len_ori; + int index = 0; + + while (1) { + target_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &target_ie_len); + if (target_ie && target_ie_len) { + u8 *next_ie = target_ie + target_ie_len; + uint remain_len = ies_len - (next_ie - ies); + + if (DBG_DEL_P2P_IE && msg) { + RTW_INFO("%s %d before\n", __func__, index); + dump_ies(RTW_DBGDUMP, ies, ies_len); + + RTW_INFO("ies:%p, ies_len:%u\n", ies, ies_len); + RTW_INFO("target_ie:%p, target_ie_len:%u\n", target_ie, target_ie_len); + RTW_INFO("next_ie:%p, remain_len:%u\n", next_ie, remain_len); + } + + _rtw_memmove(target_ie, next_ie, remain_len); + _rtw_memset(target_ie + remain_len, 0, target_ie_len); + ies_len -= target_ie_len; + + if (DBG_DEL_P2P_IE && msg) { + RTW_INFO("%s %d after\n", __func__, index); + dump_ies(RTW_DBGDUMP, ies, ies_len); + } + + index++; + } else + break; + } + + return ies_len; +} + +uint rtw_del_p2p_attr(u8 *ie, uint ielen_ori, u8 attr_id) +{ +#define DBG_DEL_P2P_ATTR 0 + u8 *target_attr; u32 target_attr_len; uint ielen = ielen_ori; - int index=0; + int index = 0; - while(1) { - target_attr=rtw_get_p2p_attr(ie, ielen, attr_id, NULL, &target_attr_len); - if(target_attr && target_attr_len) - { - u8 *next_attr = target_attr+target_attr_len; - uint remain_len = ielen-(next_attr-ie); - //dump_ies(RTW_DBGDUMP, ie, ielen); - #if 0 - DBG_871X("[%d] ie:%p, ielen:%u\n" - "target_attr:%p, target_attr_len:%u\n" - "next_attr:%p, remain_len:%u\n" - , index++ - , ie, ielen - , target_attr, target_attr_len - , next_attr, remain_len - ); - #endif + while (1) { + target_attr = rtw_get_p2p_attr(ie, ielen, attr_id, NULL, &target_attr_len); + if (target_attr && target_attr_len) { + u8 *next_attr = target_attr + target_attr_len; + uint remain_len = ielen - (next_attr - ie); - _rtw_memset(target_attr, 0, target_attr_len); - _rtw_memcpy(target_attr, next_attr, remain_len); - _rtw_memset(target_attr+remain_len, 0, target_attr_len); - *(ie+1) -= target_attr_len; - ielen-=target_attr_len; - } - else - { - //if(index>0) - // dump_ies(RTW_DBGDUMP, ie, ielen); + if (DBG_DEL_P2P_ATTR) { + RTW_INFO("%s %d before\n", __func__, index); + dump_ies(RTW_DBGDUMP, ie, ielen); + + RTW_INFO("ie:%p, ielen:%u\n", ie, ielen); + RTW_INFO("target_attr:%p, target_attr_len:%u\n", target_attr, target_attr_len); + RTW_INFO("next_attr:%p, remain_len:%u\n", next_attr, remain_len); + } + + _rtw_memmove(target_attr, next_attr, remain_len); + _rtw_memset(target_attr + remain_len, 0, target_attr_len); + *(ie + 1) -= target_attr_len; + ielen -= target_attr_len; + + if (DBG_DEL_P2P_ATTR) { + RTW_INFO("%s %d after\n", __func__, index); + dump_ies(RTW_DBGDUMP, ie, ielen); + } + + index++; + } else break; - } } return ielen; } -void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id) +inline u8 *rtw_bss_ex_get_p2p_ie(WLAN_BSSID_EX *bss_ex, u8 *p2p_ie, uint *p2p_ielen) { - u8 *p2p_ie; - uint p2p_ielen, p2p_ielen_ori; - int cnt; - - 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_); + return rtw_get_p2p_ie(BSS_EX_TLV_IES(bss_ex), BSS_EX_TLV_IES_LEN(bss_ex), p2p_ie, p2p_ielen); +} + +void rtw_bss_ex_del_p2p_ie(WLAN_BSSID_EX *bss_ex) +{ +#define DBG_BSS_EX_DEL_P2P_IE 0 + + u8 *ies = BSS_EX_TLV_IES(bss_ex); + uint ies_len_ori = BSS_EX_TLV_IES_LEN(bss_ex); + uint ies_len; + + ies_len = rtw_del_p2p_ie(ies, ies_len_ori, DBG_BSS_EX_DEL_P2P_IE ? __func__ : NULL); + bss_ex->IELength -= ies_len_ori - ies_len; +} + +void rtw_bss_ex_del_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id) +{ +#define DBG_BSS_EX_DEL_P2P_ATTR 0 + + u8 *ies = BSS_EX_TLV_IES(bss_ex); + uint ies_len = BSS_EX_TLV_IES_LEN(bss_ex); + + u8 *ie; + uint ie_len, ie_len_ori; + + int index = 0; + + while (1) { + ie = rtw_get_p2p_ie(ies, ies_len, NULL, &ie_len_ori); + if (ie) { + u8 *next_ie_ori = ie + ie_len_ori; + uint remain_len = bss_ex->IELength - (next_ie_ori - bss_ex->IEs); + u8 has_target_attr = 0; + + if (DBG_BSS_EX_DEL_P2P_ATTR) { + if (rtw_get_p2p_attr(ie, ie_len_ori, attr_id, NULL, NULL)) { + RTW_INFO("%s %d before\n", __func__, index); + dump_ies(RTW_DBGDUMP, BSS_EX_TLV_IES(bss_ex), BSS_EX_TLV_IES_LEN(bss_ex)); + + RTW_INFO("ies:%p, ies_len:%u\n", ies, ies_len); + RTW_INFO("ie:%p, ie_len_ori:%u\n", ie, ie_len_ori); + RTW_INFO("next_ie_ori:%p, remain_len:%u\n", next_ie_ori, remain_len); + has_target_attr = 1; + } } - p2p_ielen=rtw_p2p_attr_remove(p2p_ie, p2p_ielen_ori, attr_id); - if(p2p_ielen != p2p_ielen_ori) { - - u8 *next_ie_ori = p2p_ie+p2p_ielen_ori; - u8 *next_ie = p2p_ie+p2p_ielen; - uint remain_len = bss_ex->IELength-(next_ie_ori-bss_ex->IEs); + ie_len = rtw_del_p2p_attr(ie, ie_len_ori, attr_id); + if (ie_len != ie_len_ori) { + u8 *next_ie = ie + ie_len; - _rtw_memcpy(next_ie, next_ie_ori, remain_len); - _rtw_memset(next_ie+remain_len, 0, p2p_ielen_ori-p2p_ielen); - bss_ex->IELength -= p2p_ielen_ori-p2p_ielen; + _rtw_memmove(next_ie, next_ie_ori, remain_len); + _rtw_memset(next_ie + remain_len, 0, ie_len_ori - ie_len); + bss_ex->IELength -= ie_len_ori - ie_len; - if (0) { - DBG_871X("remove P2P_ATTR:%u!\n", attr_id); - dump_ies(RTW_DBGDUMP, bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_); + ies = next_ie; + } else + ies = next_ie_ori; + + if (DBG_BSS_EX_DEL_P2P_ATTR) { + if (has_target_attr) { + RTW_INFO("%s %d after\n", __func__, index); + dump_ies(RTW_DBGDUMP, BSS_EX_TLV_IES(bss_ex), BSS_EX_TLV_IES_LEN(bss_ex)); + } } - } + + ies_len = remain_len; + + index++; + } else + break; } } -#endif //CONFIG_P2P - -#ifdef CONFIG_WFD void dump_wfd_ie(void *sel, u8 *ie, u32 ie_len) { - u8* pos = (u8*)ie; + u8 *pos = (u8 *)ie; u8 id; u16 len; u8 *wfd_ie; uint wfd_ielen; - if(rtw_get_wfd_ie(ie, ie_len, NULL, &wfd_ielen) == _FALSE) + wfd_ie = rtw_get_wfd_ie(ie, ie_len, NULL, &wfd_ielen); + if (wfd_ie != ie || wfd_ielen == 0) return; - pos+=6; - while(pos-ie < ie_len){ + pos += 6; + while (pos - ie + 3 <= ie_len) { id = *pos; - len = RTW_GET_BE16(pos+1); + len = RTW_GET_BE16(pos + 1); - DBG_871X_SEL_NL(sel, "%s ID:%u, LEN:%u\n", __FUNCTION__, id, len); + RTW_PRINT_SEL(sel, "%s ID:%u, LEN:%u%s\n", __func__, id, len + , ((pos - ie + 3 + len) <= ie_len) ? "" : "(exceed ie_len)"); - pos+=(3+len); + pos += (3 + len); } } -int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen) +/** + * rtw_get_wfd_ie - Search WFD IE from a series of IEs + * @in_ie: Address of IEs to search + * @in_len: Length limit from in_ie + * @wfd_ie: If not NULL and WFD IE is found, WFD IE will be copied to the buf starting from wfd_ie + * @wfd_ielen: If not NULL and WFD IE is found, will set to the length of the entire WFD IE + * + * Returns: The address of the P2P IE found, or NULL + */ +u8 *rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen) { - int match; - uint cnt = 0; - u8 eid, wfd_oui[4]={0x50,0x6F,0x9A,0x0A}; + uint cnt; + u8 *wfd_ie_ptr = NULL; + u8 eid, wfd_oui[4] = {0x50, 0x6F, 0x9A, 0x0A}; + if (wfd_ielen) + *wfd_ielen = 0; - match=_FALSE; - - if ( in_len < 0 ) - { - return match; + if (!in_ie || in_len < 0) { + rtw_warn_on(1); + return wfd_ie_ptr; } - while(cnt= MAX_IE_SZ) { + rtw_warn_on(1); + return NULL; + } + + if (eid == WLAN_EID_VENDOR_SPECIFIC && _rtw_memcmp(&in_ie[cnt + 2], wfd_oui, 4) == _TRUE) { + wfd_ie_ptr = in_ie + cnt; + + if (wfd_ie) + _rtw_memcpy(wfd_ie, &in_ie[cnt], in_ie[cnt + 1] + 2); + + if (wfd_ielen) + *wfd_ielen = in_ie[cnt + 1] + 2; + + break; + } else + cnt += in_ie[cnt + 1] + 2; + + } + + return wfd_ie_ptr; +} + +/** + * rtw_get_wfd_attr - Search a specific WFD attribute from a given WFD IE + * @wfd_ie: Address of WFD IE to search + * @wfd_ielen: Length limit from wfd_ie + * @target_attr_id: The attribute ID of WFD attribute to search + * @buf_attr: If not NULL and the WFD attribute is found, WFD attribute will be copied to the buf starting from buf_attr + * @len_attr: If not NULL and the WFD attribute is found, will set to the length of the entire WFD attribute + * + * Returns: the address of the specific WPS attribute found, or NULL + */ +u8 *rtw_get_wfd_attr(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id, u8 *buf_attr, u32 *len_attr) +{ + u8 *attr_ptr = NULL; + u8 *target_attr_ptr = NULL; + u8 wfd_oui[4] = {0x50, 0x6F, 0x9A, 0x0A}; + + if (len_attr) + *len_attr = 0; + + if (!wfd_ie + || wfd_ielen <= 6 + || (wfd_ie[0] != WLAN_EID_VENDOR_SPECIFIC) + || (_rtw_memcmp(wfd_ie + 2, wfd_oui, 4) != _TRUE)) + return attr_ptr; + + /* 6 = 1(Element ID) + 1(Length) + 3 (OUI) + 1(OUI Type) */ + attr_ptr = wfd_ie + 6; /* goto first attr */ + + while ((attr_ptr - wfd_ie + 3) <= wfd_ielen) { + /* 3 = 1(Attribute ID) + 2(Length) */ + u8 attr_id = *attr_ptr; + u16 attr_data_len = RTW_GET_BE16(attr_ptr + 1); + u16 attr_len = attr_data_len + 3; + + if (0) + RTW_INFO("%s attr_ptr:%p, id:%u, length:%u\n", __func__, attr_ptr, attr_id, attr_data_len); + + if ((attr_ptr - wfd_ie + attr_len) > wfd_ielen) + break; + + if (attr_id == target_attr_id) { + target_attr_ptr = attr_ptr; + + if (buf_attr) + _rtw_memcpy(buf_attr, attr_ptr, attr_len); + + if (len_attr) + *len_attr = attr_len; + + break; + } else + attr_ptr += attr_len; + } + + return target_attr_ptr; +} + +/** + * rtw_get_wfd_attr_content - Search a specific WFD attribute content from a given WFD IE + * @wfd_ie: Address of WFD IE to search + * @wfd_ielen: Length limit from wfd_ie + * @target_attr_id: The attribute ID of WFD attribute to search + * @buf_content: If not NULL and the WFD attribute is found, WFD attribute content will be copied to the buf starting from buf_content + * @len_content: If not NULL and the WFD attribute is found, will set to the length of the WFD attribute content + * + * Returns: the address of the specific WFD attribute content found, or NULL + */ +u8 *rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id, u8 *buf_content, uint *len_content) +{ + u8 *attr_ptr; + u32 attr_len; + + if (len_content) + *len_content = 0; + + attr_ptr = rtw_get_wfd_attr(wfd_ie, wfd_ielen, target_attr_id, NULL, &attr_len); + + if (attr_ptr && attr_len) { + if (buf_content) + _rtw_memcpy(buf_content, attr_ptr + 3, attr_len - 3); + + if (len_content) + *len_content = attr_len - 3; + + return attr_ptr + 3; + } + + return NULL; +} + +uint rtw_del_wfd_ie(u8 *ies, uint ies_len_ori, const char *msg) +{ +#define DBG_DEL_WFD_IE 0 + + u8 *target_ie; + u32 target_ie_len; + uint ies_len = ies_len_ori; + int index = 0; + + while (1) { + target_ie = rtw_get_wfd_ie(ies, ies_len, NULL, &target_ie_len); + if (target_ie && target_ie_len) { + u8 *next_ie = target_ie + target_ie_len; + uint remain_len = ies_len - (next_ie - ies); + + if (DBG_DEL_WFD_IE && msg) { + RTW_INFO("%s %d before\n", __func__, index); + dump_ies(RTW_DBGDUMP, ies, ies_len); + + RTW_INFO("ies:%p, ies_len:%u\n", ies, ies_len); + RTW_INFO("target_ie:%p, target_ie_len:%u\n", target_ie, target_ie_len); + RTW_INFO("next_ie:%p, remain_len:%u\n", next_ie, remain_len); } - else - { - if ( wfd_ielen != NULL ) - { - *wfd_ielen = 0; + + _rtw_memmove(target_ie, next_ie, remain_len); + _rtw_memset(target_ie + remain_len, 0, target_ie_len); + ies_len -= target_ie_len; + + if (DBG_DEL_WFD_IE && msg) { + RTW_INFO("%s %d after\n", __func__, index); + dump_ies(RTW_DBGDUMP, ies, ies_len); + } + + index++; + } else + break; + } + + return ies_len; +} + +uint rtw_del_wfd_attr(u8 *ie, uint ielen_ori, u8 attr_id) +{ +#define DBG_DEL_WFD_ATTR 0 + + u8 *target_attr; + u32 target_attr_len; + uint ielen = ielen_ori; + int index = 0; + + while (1) { + target_attr = rtw_get_wfd_attr(ie, ielen, attr_id, NULL, &target_attr_len); + if (target_attr && target_attr_len) { + u8 *next_attr = target_attr + target_attr_len; + uint remain_len = ielen - (next_attr - ie); + + if (DBG_DEL_WFD_ATTR) { + RTW_INFO("%s %d before\n", __func__, index); + dump_ies(RTW_DBGDUMP, ie, ielen); + + RTW_INFO("ie:%p, ielen:%u\n", ie, ielen); + RTW_INFO("target_attr:%p, target_attr_len:%u\n", target_attr, target_attr_len); + RTW_INFO("next_attr:%p, remain_len:%u\n", next_attr, remain_len); + } + + _rtw_memmove(target_attr, next_attr, remain_len); + _rtw_memset(target_attr + remain_len, 0, target_attr_len); + *(ie + 1) -= target_attr_len; + ielen -= target_attr_len; + + if (DBG_DEL_WFD_ATTR) { + RTW_INFO("%s %d after\n", __func__, index); + dump_ies(RTW_DBGDUMP, ie, ielen); + } + + index++; + } else + break; + } + + return ielen; +} + +inline u8 *rtw_bss_ex_get_wfd_ie(WLAN_BSSID_EX *bss_ex, u8 *wfd_ie, uint *wfd_ielen) +{ + return rtw_get_wfd_ie(BSS_EX_TLV_IES(bss_ex), BSS_EX_TLV_IES_LEN(bss_ex), wfd_ie, wfd_ielen); +} + +void rtw_bss_ex_del_wfd_ie(WLAN_BSSID_EX *bss_ex) +{ +#define DBG_BSS_EX_DEL_WFD_IE 0 + u8 *ies = BSS_EX_TLV_IES(bss_ex); + uint ies_len_ori = BSS_EX_TLV_IES_LEN(bss_ex); + uint ies_len; + + ies_len = rtw_del_wfd_ie(ies, ies_len_ori, DBG_BSS_EX_DEL_WFD_IE ? __func__ : NULL); + bss_ex->IELength -= ies_len_ori - ies_len; +} + +void rtw_bss_ex_del_wfd_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id) +{ +#define DBG_BSS_EX_DEL_WFD_ATTR 0 + + u8 *ies = BSS_EX_TLV_IES(bss_ex); + uint ies_len = BSS_EX_TLV_IES_LEN(bss_ex); + + u8 *ie; + uint ie_len, ie_len_ori; + + int index = 0; + + while (1) { + ie = rtw_get_wfd_ie(ies, ies_len, NULL, &ie_len_ori); + if (ie) { + u8 *next_ie_ori = ie + ie_len_ori; + uint remain_len = bss_ex->IELength - (next_ie_ori - bss_ex->IEs); + u8 has_target_attr = 0; + + if (DBG_BSS_EX_DEL_WFD_ATTR) { + if (rtw_get_wfd_attr(ie, ie_len_ori, attr_id, NULL, NULL)) { + RTW_INFO("%s %d before\n", __func__, index); + dump_ies(RTW_DBGDUMP, BSS_EX_TLV_IES(bss_ex), BSS_EX_TLV_IES_LEN(bss_ex)); + + RTW_INFO("ies:%p, ies_len:%u\n", ies, ies_len); + RTW_INFO("ie:%p, ie_len_ori:%u\n", ie, ie_len_ori); + RTW_INFO("next_ie_ori:%p, remain_len:%u\n", next_ie_ori, remain_len); + has_target_attr = 1; } } - - if ( wfd_ielen != NULL ) - { - *wfd_ielen = in_ie[ cnt + 1 ] + 2; + + ie_len = rtw_del_wfd_attr(ie, ie_len_ori, attr_id); + if (ie_len != ie_len_ori) { + u8 *next_ie = ie + ie_len; + + _rtw_memmove(next_ie, next_ie_ori, remain_len); + _rtw_memset(next_ie + remain_len, 0, ie_len_ori - ie_len); + bss_ex->IELength -= ie_len_ori - ie_len; + + ies = next_ie; + } else + ies = next_ie_ori; + + if (DBG_BSS_EX_DEL_WFD_ATTR) { + if (has_target_attr) { + RTW_INFO("%s %d after\n", __func__, index); + dump_ies(RTW_DBGDUMP, BSS_EX_TLV_IES(bss_ex), BSS_EX_TLV_IES_LEN(bss_ex)); + } } - - cnt += in_ie[ cnt + 1 ] + 2; - match = _TRUE; + ies_len = remain_len; + + index++; + } else break; - } - else - { - cnt += in_ie[ cnt + 1 ] +2; //goto next - } - - } - - if ( match == _TRUE ) - { - match = cnt; } - - return match; - } -int rtw_get_wfd_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen, u8 frame_type) -{ - int match; - - match=_FALSE; - - DBG_871X( "[%s] frame_type = %d\n", __FUNCTION__, frame_type ); - switch( frame_type ) - { - case 1: - case 3: - { // Beacon or Probe Response - match = rtw_get_wfd_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, wfd_ie, wfd_ielen); - break; - } - case 2: - { // Probe Request - match = rtw_get_wfd_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , wfd_ie, wfd_ielen); - break; - } - } - return match; -} - -// attr_content: The output buffer, contains the "body field" of WFD attribute. -// attr_contentlen: The data length of the "body field" of WFD attribute. -int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen) -{ - int match; - uint cnt = 0; - u8 attr_id, wfd_oui[4]={0x50,0x6F,0x9A,0x0A}; - - - match=_FALSE; - - if ( ( wfd_ie[ 0 ] != _VENDOR_SPECIFIC_IE_ ) || - ( _rtw_memcmp( wfd_ie + 2, wfd_oui , 4 ) != _TRUE ) ) - { - return( match ); - } - - // 1 ( WFD IE ) + 1 ( Length ) + 3 ( OUI ) + 1 ( OUI Type ) - cnt = 6; - while( cnt < wfd_ielen ) - { - u16 attrlen = RTW_GET_BE16(wfd_ie + cnt + 1); - - attr_id = wfd_ie[cnt]; - if( attr_id == target_attr_id ) - { - // 3 -> 1 byte for attribute ID field, 2 bytes for length field - if(attr_content) - _rtw_memcpy( attr_content, &wfd_ie[ cnt + 3 ], attrlen ); - - if(attr_contentlen) - *attr_contentlen = attrlen; - - cnt += attrlen + 3; - - match = _TRUE; - break; - } - else - { - cnt += attrlen + 3; //goto next - } - - } - - return match; - -} -#endif // CONFIG_WFD - -//Baron adds to avoid FreeBSD warning +/* Baron adds to avoid FreeBSD warning */ int ieee80211_is_empty_essid(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ @@ -2362,33 +2493,25 @@ int rtw_get_cipher_info(struct wlan_network *pnetwork) unsigned char *pbuf; int group_cipher = 0, pairwise_cipher = 0, is8021x = 0; int ret = _FAIL; - pbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength-12); + pbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12); - if(pbuf && (wpa_ielen>0)) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_get_cipher_info: wpa_ielen: %d", wpa_ielen)); - if (_SUCCESS == rtw_parse_wpa_ie(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is8021x)) { + if (pbuf && (wpa_ielen > 0)) { + if (_SUCCESS == rtw_parse_wpa_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x)) { pnetwork->BcnInfo.pairwise_cipher = pairwise_cipher; pnetwork->BcnInfo.group_cipher = group_cipher; pnetwork->BcnInfo.is_8021x = is8021x; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("%s: pnetwork->pairwise_cipher: %d, is_8021x is %d", - __func__, pnetwork->BcnInfo.pairwise_cipher, pnetwork->BcnInfo.is_8021x)); ret = _SUCCESS; } } else { - pbuf = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength-12); + pbuf = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12); - if(pbuf && (wpa_ielen>0)) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("get RSN IE\n")); - if (_SUCCESS == rtw_parse_wpa2_ie(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is8021x)) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("get RSN IE OK!!!\n")); + if (pbuf && (wpa_ielen > 0)) { + if (_SUCCESS == rtw_parse_wpa2_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x)) { pnetwork->BcnInfo.pairwise_cipher = pairwise_cipher; pnetwork->BcnInfo.group_cipher = group_cipher; pnetwork->BcnInfo.is_8021x = is8021x; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("%s: pnetwork->pairwise_cipher: %d," - "pnetwork->group_cipher is %d, is_8021x is %d", __func__, pnetwork->BcnInfo.pairwise_cipher, - pnetwork->BcnInfo.group_cipher,pnetwork->BcnInfo.is_8021x)); ret = _SUCCESS; } } @@ -2401,8 +2524,8 @@ void rtw_get_bcn_info(struct wlan_network *pnetwork) { unsigned short cap = 0; u8 bencrypt = 0; - //u8 wpa_ie[255],rsn_ie[255]; - u16 wpa_len=0,rsn_len=0; + /* u8 wpa_ie[255],rsn_ie[255]; */ + u16 wpa_len = 0, rsn_len = 0; struct HT_info_element *pht_info = NULL; struct rtw_ieee80211_ht_cap *pht_cap = NULL; unsigned int len; @@ -2413,52 +2536,41 @@ void rtw_get_bcn_info(struct wlan_network *pnetwork) if (cap & WLAN_CAPABILITY_PRIVACY) { bencrypt = 1; pnetwork->network.Privacy = 1; - } else { + } else pnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_OPENSYS; - } - rtw_get_sec_ie(pnetwork->network.IEs ,pnetwork->network.IELength,NULL,&rsn_len,NULL,&wpa_len); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_get_bcn_info: ssid=%s\n",pnetwork->network.Ssid.Ssid)); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_get_bcn_info: wpa_len=%d rsn_len=%d\n",wpa_len,rsn_len)); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_get_bcn_info: ssid=%s\n",pnetwork->network.Ssid.Ssid)); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_get_bcn_info: wpa_len=%d rsn_len=%d\n",wpa_len,rsn_len)); + rtw_get_sec_ie(pnetwork->network.IEs , pnetwork->network.IELength, NULL, &rsn_len, NULL, &wpa_len); - if (rsn_len > 0) { + if (rsn_len > 0) pnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_WPA2; - } else if (wpa_len > 0) { + else if (wpa_len > 0) pnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_WPA; - } else { + else { if (bencrypt) pnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_WEP; } - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_get_bcn_info: pnetwork->encryp_protocol is %x\n", - pnetwork->BcnInfo.encryp_protocol)); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_get_bcn_info: pnetwork->encryp_protocol is %x\n", - pnetwork->BcnInfo.encryp_protocol)); rtw_get_cipher_info(pnetwork); /* get bwmode and ch_offset */ /* parsing HT_CAP_IE */ p = rtw_get_ie(pnetwork->network.IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pnetwork->network.IELength - _FIXED_IE_LENGTH_); - if(p && len>0) { - pht_cap = (struct rtw_ieee80211_ht_cap *)(p + 2); - pnetwork->BcnInfo.ht_cap_info = pht_cap->cap_info; - } else { - pnetwork->BcnInfo.ht_cap_info = 0; - } + if (p && len > 0) { + pht_cap = (struct rtw_ieee80211_ht_cap *)(p + 2); + pnetwork->BcnInfo.ht_cap_info = pht_cap->cap_info; + } else + pnetwork->BcnInfo.ht_cap_info = 0; /* parsing HT_INFO_IE */ p = rtw_get_ie(pnetwork->network.IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, pnetwork->network.IELength - _FIXED_IE_LENGTH_); - if(p && len>0) { - pht_info = (struct HT_info_element *)(p + 2); - pnetwork->BcnInfo.ht_info_infos_0 = pht_info->infos[0]; - } else { - pnetwork->BcnInfo.ht_info_infos_0 = 0; - } + if (p && len > 0) { + pht_info = (struct HT_info_element *)(p + 2); + pnetwork->BcnInfo.ht_info_infos_0 = pht_info->infos[0]; + } else + pnetwork->BcnInfo.ht_info_infos_0 = 0; } u8 rtw_ht_mcsset_to_nss(u8 *supp_mcs_set) { u8 nss = 1; - + if (supp_mcs_set[3]) nss = 4; else if (supp_mcs_set[2]) @@ -2468,74 +2580,74 @@ u8 rtw_ht_mcsset_to_nss(u8 *supp_mcs_set) else if (supp_mcs_set[0]) nss = 1; else - DBG_871X("%s,%d, warning! supp_mcs_set is zero\n", __func__, __LINE__); - /* DBG_871X("%s HT: %dSS\n", __FUNCTION__, nss); */ + RTW_INFO("%s,%d, warning! supp_mcs_set is zero\n", __func__, __LINE__); + /* RTW_INFO("%s HT: %dSS\n", __FUNCTION__, nss); */ return nss; } -//show MCS rate, unit: 100Kbps -u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI, unsigned char * MCS_rate) +/* show MCS rate, unit: 100Kbps */ +u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI, unsigned char *MCS_rate) { u16 max_rate = 0; /*MCS_rate[2] = 3T3R , MCS_rate[1] = 2T2R , MCS_rate[0] = 1T1R*/ if (MCS_rate[2]) { if (MCS_rate[2] & BIT(7)) - max_rate = (bw_40MHz) ? ((short_GI)?4500:4050):((short_GI)?2167:1950); + max_rate = (bw_40MHz) ? ((short_GI) ? 4500 : 4050) : ((short_GI) ? 2167 : 1950); else if (MCS_rate[2] & BIT(6)) - max_rate = (bw_40MHz) ? ((short_GI)?4050:3645):((short_GI)?1950:1750); + max_rate = (bw_40MHz) ? ((short_GI) ? 4050 : 3645) : ((short_GI) ? 1950 : 1750); else if (MCS_rate[2] & BIT(5)) - max_rate = (bw_40MHz) ? ((short_GI)?3600:3240):((short_GI)?1733:1560); + max_rate = (bw_40MHz) ? ((short_GI) ? 3600 : 3240) : ((short_GI) ? 1733 : 1560); else if (MCS_rate[2] & BIT(4)) - max_rate = (bw_40MHz) ? ((short_GI)?2700:2430):((short_GI)?1300:1170); + max_rate = (bw_40MHz) ? ((short_GI) ? 2700 : 2430) : ((short_GI) ? 1300 : 1170); else if (MCS_rate[2] & BIT(3)) - max_rate = (bw_40MHz) ? ((short_GI)?1800:1620):((short_GI)?867:780); + max_rate = (bw_40MHz) ? ((short_GI) ? 1800 : 1620) : ((short_GI) ? 867 : 780); else if (MCS_rate[2] & BIT(2)) - max_rate = (bw_40MHz) ? ((short_GI)?1350:1215):((short_GI)?650:585); + max_rate = (bw_40MHz) ? ((short_GI) ? 1350 : 1215) : ((short_GI) ? 650 : 585); else if (MCS_rate[2] & BIT(1)) - max_rate = (bw_40MHz) ? ((short_GI)?900:810):((short_GI)?433:390); + max_rate = (bw_40MHz) ? ((short_GI) ? 900 : 810) : ((short_GI) ? 433 : 390); else if (MCS_rate[2] & BIT(0)) - max_rate = (bw_40MHz) ? ((short_GI)?450:405):((short_GI)?217:195); + max_rate = (bw_40MHz) ? ((short_GI) ? 450 : 405) : ((short_GI) ? 217 : 195); } else if (MCS_rate[1]) { - if(MCS_rate[1] & BIT(7)) - max_rate = (bw_40MHz) ? ((short_GI)?3000:2700):((short_GI)?1444:1300); - else if(MCS_rate[1] & BIT(6)) - max_rate = (bw_40MHz) ? ((short_GI)?2700:2430):((short_GI)?1300:1170); - else if(MCS_rate[1] & BIT(5)) - max_rate = (bw_40MHz) ? ((short_GI)?2400:2160):((short_GI)?1156:1040); - else if(MCS_rate[1] & BIT(4)) - max_rate = (bw_40MHz) ? ((short_GI)?1800:1620):((short_GI)?867:780); - else if(MCS_rate[1] & BIT(3)) - max_rate = (bw_40MHz) ? ((short_GI)?1200:1080):((short_GI)?578:520); - else if(MCS_rate[1] & BIT(2)) - max_rate = (bw_40MHz) ? ((short_GI)?900:810):((short_GI)?433:390); - else if(MCS_rate[1] & BIT(1)) - max_rate = (bw_40MHz) ? ((short_GI)?600:540):((short_GI)?289:260); - else if(MCS_rate[1] & BIT(0)) - max_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130); + if (MCS_rate[1] & BIT(7)) + max_rate = (bw_40MHz) ? ((short_GI) ? 3000 : 2700) : ((short_GI) ? 1444 : 1300); + else if (MCS_rate[1] & BIT(6)) + max_rate = (bw_40MHz) ? ((short_GI) ? 2700 : 2430) : ((short_GI) ? 1300 : 1170); + else if (MCS_rate[1] & BIT(5)) + max_rate = (bw_40MHz) ? ((short_GI) ? 2400 : 2160) : ((short_GI) ? 1156 : 1040); + else if (MCS_rate[1] & BIT(4)) + max_rate = (bw_40MHz) ? ((short_GI) ? 1800 : 1620) : ((short_GI) ? 867 : 780); + else if (MCS_rate[1] & BIT(3)) + max_rate = (bw_40MHz) ? ((short_GI) ? 1200 : 1080) : ((short_GI) ? 578 : 520); + else if (MCS_rate[1] & BIT(2)) + max_rate = (bw_40MHz) ? ((short_GI) ? 900 : 810) : ((short_GI) ? 433 : 390); + else if (MCS_rate[1] & BIT(1)) + max_rate = (bw_40MHz) ? ((short_GI) ? 600 : 540) : ((short_GI) ? 289 : 260); + else if (MCS_rate[1] & BIT(0)) + max_rate = (bw_40MHz) ? ((short_GI) ? 300 : 270) : ((short_GI) ? 144 : 130); } else { - if(MCS_rate[0] & BIT(7)) - max_rate = (bw_40MHz) ? ((short_GI)?1500:1350):((short_GI)?722:650); - else if(MCS_rate[0] & BIT(6)) - max_rate = (bw_40MHz) ? ((short_GI)?1350:1215):((short_GI)?650:585); - else if(MCS_rate[0] & BIT(5)) - max_rate = (bw_40MHz) ? ((short_GI)?1200:1080):((short_GI)?578:520); - else if(MCS_rate[0] & BIT(4)) - max_rate = (bw_40MHz) ? ((short_GI)?900:810):((short_GI)?433:390); - else if(MCS_rate[0] & BIT(3)) - max_rate = (bw_40MHz) ? ((short_GI)?600:540):((short_GI)?289:260); - else if(MCS_rate[0] & BIT(2)) - max_rate = (bw_40MHz) ? ((short_GI)?450:405):((short_GI)?217:195); - else if(MCS_rate[0] & BIT(1)) - max_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130); - else if(MCS_rate[0] & BIT(0)) - max_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65); - } + if (MCS_rate[0] & BIT(7)) + max_rate = (bw_40MHz) ? ((short_GI) ? 1500 : 1350) : ((short_GI) ? 722 : 650); + else if (MCS_rate[0] & BIT(6)) + max_rate = (bw_40MHz) ? ((short_GI) ? 1350 : 1215) : ((short_GI) ? 650 : 585); + else if (MCS_rate[0] & BIT(5)) + max_rate = (bw_40MHz) ? ((short_GI) ? 1200 : 1080) : ((short_GI) ? 578 : 520); + else if (MCS_rate[0] & BIT(4)) + max_rate = (bw_40MHz) ? ((short_GI) ? 900 : 810) : ((short_GI) ? 433 : 390); + else if (MCS_rate[0] & BIT(3)) + max_rate = (bw_40MHz) ? ((short_GI) ? 600 : 540) : ((short_GI) ? 289 : 260); + else if (MCS_rate[0] & BIT(2)) + max_rate = (bw_40MHz) ? ((short_GI) ? 450 : 405) : ((short_GI) ? 217 : 195); + else if (MCS_rate[0] & BIT(1)) + max_rate = (bw_40MHz) ? ((short_GI) ? 300 : 270) : ((short_GI) ? 144 : 130); + else if (MCS_rate[0] & BIT(0)) + max_rate = (bw_40MHz) ? ((short_GI) ? 150 : 135) : ((short_GI) ? 72 : 65); + } return max_rate; } -int rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8* category, u8 *action) +int rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8 *category, u8 *action) { const u8 *frame_body = frame + sizeof(struct rtw_ieee80211_hdr_3addr); u16 fc; @@ -2544,16 +2656,14 @@ int rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8* category, u8 *act fc = le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)frame)->frame_ctl); - if ((fc & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)) - != (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION) - ) - { + if ((fc & (RTW_IEEE80211_FCTL_FTYPE | RTW_IEEE80211_FCTL_STYPE)) + != (RTW_IEEE80211_FTYPE_MGMT | RTW_IEEE80211_STYPE_ACTION) + ) return _FALSE; - } c = frame_body[0]; - switch(c) { + switch (c) { case RTW_WLAN_CATEGORY_P2P: /* vendor-specific */ break; default: @@ -2593,4 +2703,3 @@ const char *action_public_str(u8 action) action = (action >= ACT_PUBLIC_MAX) ? ACT_PUBLIC_MAX : action; return _action_public_str[action]; } - diff --git a/core/rtw_io.c b/core/rtw_io.c old mode 100755 new mode 100644 index d08c16d..683da16 --- a/core/rtw_io.c +++ b/core/rtw_io.c @@ -52,129 +52,115 @@ jackson@realtek.com.tw #include #include -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) -#error "Shall be Linux or Windows, but not both!\n" +#if defined(PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + #error "Shall be Linux or Windows, but not both!\n" #endif #ifdef CONFIG_SDIO_HCI -#define rtw_le16_to_cpu(val) val -#define rtw_le32_to_cpu(val) val -#define rtw_cpu_to_le16(val) val -#define rtw_cpu_to_le32(val) val + #define rtw_le16_to_cpu(val) val + #define rtw_le32_to_cpu(val) val + #define rtw_cpu_to_le16(val) val + #define rtw_cpu_to_le32(val) val #else -#define rtw_le16_to_cpu(val) le16_to_cpu(val) -#define rtw_le32_to_cpu(val) le32_to_cpu(val) -#define rtw_cpu_to_le16(val) cpu_to_le16(val) -#define rtw_cpu_to_le32(val) cpu_to_le32(val) + #define rtw_le16_to_cpu(val) le16_to_cpu(val) + #define rtw_le32_to_cpu(val) le32_to_cpu(val) + #define rtw_cpu_to_le16(val) cpu_to_le16(val) + #define rtw_cpu_to_le32(val) cpu_to_le32(val) #endif u8 _rtw_read8(_adapter *adapter, u32 addr) { u8 r_val; - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); - _func_enter_; + u8(*_read8)(struct intf_hdl *pintfhdl, u32 addr); _read8 = pintfhdl->io_ops._read8; r_val = _read8(pintfhdl, addr); - _func_exit_; return r_val; } u16 _rtw_read16(_adapter *adapter, u32 addr) { u16 r_val; - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); - _func_enter_; + u16(*_read16)(struct intf_hdl *pintfhdl, u32 addr); _read16 = pintfhdl->io_ops._read16; r_val = _read16(pintfhdl, addr); - _func_exit_; return rtw_le16_to_cpu(r_val); } u32 _rtw_read32(_adapter *adapter, u32 addr) { u32 r_val; - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); - _func_enter_; + u32(*_read32)(struct intf_hdl *pintfhdl, u32 addr); _read32 = pintfhdl->io_ops._read32; r_val = _read32(pintfhdl, addr); - _func_exit_; return rtw_le32_to_cpu(r_val); } int _rtw_write8(_adapter *adapter, u32 addr, u8 val) { - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); int ret; - _func_enter_; _write8 = pintfhdl->io_ops._write8; ret = _write8(pintfhdl, addr, val); - _func_exit_; - + return RTW_STATUS_CODE(ret); } int _rtw_write16(_adapter *adapter, u32 addr, u16 val) { - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); int ret; - _func_enter_; _write16 = pintfhdl->io_ops._write16; val = rtw_cpu_to_le16(val); ret = _write16(pintfhdl, addr, val); - _func_exit_; return RTW_STATUS_CODE(ret); } int _rtw_write32(_adapter *adapter, u32 addr, u32 val) { - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); int ret; - _func_enter_; _write32 = pintfhdl->io_ops._write32; - + val = rtw_cpu_to_le32(val); ret = _write32(pintfhdl, addr, val); - _func_exit_; return RTW_STATUS_CODE(ret); } -int _rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *pdata) +int _rtw_writeN(_adapter *adapter, u32 addr , u32 length , u8 *pdata) { - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = (struct intf_hdl*)(&(pio_priv->intf)); - int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr,u32 length, u8 *pdata); + struct intf_hdl *pintfhdl = (struct intf_hdl *)(&(pio_priv->intf)); + int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata); int ret; - _func_enter_; _writeN = pintfhdl->io_ops._writeN; - ret = _writeN(pintfhdl, addr,length,pdata); - _func_exit_; + ret = _writeN(pintfhdl, addr, length, pdata); return RTW_STATUS_CODE(ret); } @@ -185,17 +171,15 @@ u8 _rtw_sd_f0_read8(_adapter *adapter, u32 addr) u8 r_val = 0x00; struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - u8 (*_sd_f0_read8)(struct intf_hdl *pintfhdl, u32 addr); + u8(*_sd_f0_read8)(struct intf_hdl *pintfhdl, u32 addr); - _func_enter_; _sd_f0_read8 = pintfhdl->io_ops._sd_f0_read8; if (_sd_f0_read8) r_val = _sd_f0_read8(pintfhdl, addr); else - DBG_871X_LEVEL(_drv_warning_, FUNC_ADPT_FMT" _sd_f0_read8 callback is NULL\n", FUNC_ADPT_ARG(adapter)); + RTW_WARN(FUNC_ADPT_FMT" _sd_f0_read8 callback is NULL\n", FUNC_ADPT_ARG(adapter)); - _func_exit_; return r_val; } @@ -205,14 +189,14 @@ u8 _rtw_sd_iread8(_adapter *adapter, u32 addr) u8 r_val = 0x00; struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - u8 (*_sd_iread8)(struct intf_hdl *pintfhdl, u32 addr); + u8(*_sd_iread8)(struct intf_hdl *pintfhdl, u32 addr); _sd_iread8 = pintfhdl->io_ops._sd_iread8; if (_sd_iread8) r_val = _sd_iread8(pintfhdl, addr); else - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" _sd_iread8 callback is NULL\n", FUNC_ADPT_ARG(adapter)); + RTW_ERR(FUNC_ADPT_FMT" _sd_iread8 callback is NULL\n", FUNC_ADPT_ARG(adapter)); return r_val; } @@ -222,14 +206,14 @@ u16 _rtw_sd_iread16(_adapter *adapter, u32 addr) u16 r_val = 0x00; struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - u16 (*_sd_iread16)(struct intf_hdl *pintfhdl, u32 addr); + u16(*_sd_iread16)(struct intf_hdl *pintfhdl, u32 addr); _sd_iread16 = pintfhdl->io_ops._sd_iread16; if (_sd_iread16) r_val = _sd_iread16(pintfhdl, addr); else - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" _sd_iread16 callback is NULL\n", FUNC_ADPT_ARG(adapter)); + RTW_ERR(FUNC_ADPT_FMT" _sd_iread16 callback is NULL\n", FUNC_ADPT_ARG(adapter)); return r_val; } @@ -239,14 +223,14 @@ u32 _rtw_sd_iread32(_adapter *adapter, u32 addr) u32 r_val = 0x00; struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - u32 (*_sd_iread32)(struct intf_hdl *pintfhdl, u32 addr); + u32(*_sd_iread32)(struct intf_hdl *pintfhdl, u32 addr); _sd_iread32 = pintfhdl->io_ops._sd_iread32; if (_sd_iread32) r_val = _sd_iread32(pintfhdl, addr); else - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" _sd_iread32 callback is NULL\n", FUNC_ADPT_ARG(adapter)); + RTW_ERR(FUNC_ADPT_FMT" _sd_iread32 callback is NULL\n", FUNC_ADPT_ARG(adapter)); return r_val; } @@ -263,7 +247,7 @@ int _rtw_sd_iwrite8(_adapter *adapter, u32 addr, u8 val) if (_sd_iwrite8) ret = _sd_iwrite8(pintfhdl, addr, val); else - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" _sd_iwrite8 callback is NULL\n", FUNC_ADPT_ARG(adapter)); + RTW_ERR(FUNC_ADPT_FMT" _sd_iwrite8 callback is NULL\n", FUNC_ADPT_ARG(adapter)); return RTW_STATUS_CODE(ret); } @@ -280,7 +264,7 @@ int _rtw_sd_iwrite16(_adapter *adapter, u32 addr, u16 val) if (_sd_iwrite16) ret = _sd_iwrite16(pintfhdl, addr, val); else - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" _sd_iwrite16 callback is NULL\n", FUNC_ADPT_ARG(adapter)); + RTW_ERR(FUNC_ADPT_FMT" _sd_iwrite16 callback is NULL\n", FUNC_ADPT_ARG(adapter)); return RTW_STATUS_CODE(ret); } @@ -296,7 +280,7 @@ int _rtw_sd_iwrite32(_adapter *adapter, u32 addr, u32 val) if (_sd_iwrite32) ret = _sd_iwrite32(pintfhdl, addr, val); else - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" _sd_iwrite32 callback is NULL\n", FUNC_ADPT_ARG(adapter)); + RTW_ERR(FUNC_ADPT_FMT" _sd_iwrite32 callback is NULL\n", FUNC_ADPT_ARG(adapter)); return RTW_STATUS_CODE(ret); } @@ -307,46 +291,40 @@ int _rtw_sd_iwrite32(_adapter *adapter, u32 addr, u32 val) int _rtw_write8_async(_adapter *adapter, u32 addr, u8 val) { - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); int ret; - _func_enter_; _write8_async = pintfhdl->io_ops._write8_async; ret = _write8_async(pintfhdl, addr, val); - _func_exit_; return RTW_STATUS_CODE(ret); } int _rtw_write16_async(_adapter *adapter, u32 addr, u16 val) { - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); int ret; - _func_enter_; _write16_async = pintfhdl->io_ops._write16_async; val = rtw_cpu_to_le16(val); ret = _write16_async(pintfhdl, addr, val); - _func_exit_; return RTW_STATUS_CODE(ret); } int _rtw_write32_async(_adapter *adapter, u32 addr, u32 val) { - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); int ret; - _func_enter_; _write32_async = pintfhdl->io_ops._write32_async; val = rtw_cpu_to_le32(val); ret = _write32_async(pintfhdl, addr, val); - _func_exit_; return RTW_STATUS_CODE(ret); } @@ -354,16 +332,12 @@ int _rtw_write32_async(_adapter *adapter, u32 addr, u32 val) void _rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) { void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - _func_enter_; if (RTW_CANNOT_RUN(adapter)) { - RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_mem:bDriverStopped(%s) OR bSurpriseRemoved(%s)" - , rtw_is_drv_stopped(adapter)?"True":"False" - , rtw_is_surprise_removed(adapter)?"True":"False")); return; } @@ -371,48 +345,40 @@ void _rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) _read_mem(pintfhdl, addr, cnt, pmem); - _func_exit_; } void _rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) { void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - _func_enter_; _write_mem = pintfhdl->io_ops._write_mem; _write_mem(pintfhdl, addr, cnt, pmem); - _func_exit_; } void _rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) { - u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + u32(*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); - _func_enter_; if (RTW_CANNOT_RUN(adapter)) { - RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_port:bDriverStopped(%s) OR bSurpriseRemoved(%s)" - , rtw_is_drv_stopped(adapter)?"True":"False" - , rtw_is_surprise_removed(adapter)?"True":"False")); - return; + return; } _read_port = pintfhdl->io_ops._read_port; _read_port(pintfhdl, addr, cnt, pmem); - _func_exit_; } @@ -426,25 +392,23 @@ void _rtw_read_port_cancel(_adapter *adapter) RTW_DISABLE_FUNC(adapter, DF_RX_BIT); - if(_read_port_cancel) + if (_read_port_cancel) _read_port_cancel(pintfhdl); } u32 _rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) { - u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + u32(*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + /* struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; */ struct io_priv *pio_priv = &adapter->iopriv; struct intf_hdl *pintfhdl = &(pio_priv->intf); u32 ret = _SUCCESS; - _func_enter_; _write_port = pintfhdl->io_ops._write_port; - + ret = _write_port(pintfhdl, addr, cnt, pmem); - _func_exit_; return ret; } @@ -463,7 +427,7 @@ u32 _rtw_write_port_and_wait(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem, int if (ret == _SUCCESS) ret = rtw_sctx_wait(&sctx, __func__); - return ret; + return ret; } void _rtw_write_port_cancel(_adapter *adapter) @@ -476,10 +440,10 @@ void _rtw_write_port_cancel(_adapter *adapter) RTW_DISABLE_FUNC(adapter, DF_TX_BIT); - if(_write_port_cancel) + if (_write_port_cancel) _write_port_cancel(pintfhdl); } -int rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(_adapter *padapter,struct _io_ops *pops)) +int rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(_adapter *padapter, struct _io_ops *pops)) { struct io_priv *piopriv = &padapter->iopriv; struct intf_hdl *pintf = &piopriv->intf; @@ -490,8 +454,8 @@ int rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(_adapter *padapter piopriv->padapter = padapter; pintf->padapter = padapter; pintf->pintf_dev = adapter_to_dvobj(padapter); - - set_intf_ops(padapter,&pintf->io_ops); + + set_intf_ops(padapter, &pintf->io_ops); return _SUCCESS; } @@ -505,11 +469,13 @@ int rtw_inc_and_chk_continual_io_error(struct dvobj_priv *dvobj) { int ret = _FALSE; int value; - if( (value=ATOMIC_INC_RETURN(&dvobj->continual_io_error)) > MAX_CONTINUAL_IO_ERR) { - DBG_871X("[dvobj:%p][ERROR] continual_io_error:%d > %d\n", dvobj, value, MAX_CONTINUAL_IO_ERR); + + value = ATOMIC_INC_RETURN(&dvobj->continual_io_error); + if (value > MAX_CONTINUAL_IO_ERR) { + RTW_INFO("[dvobj:%p][ERROR] continual_io_error:%d > %d\n", dvobj, value, MAX_CONTINUAL_IO_ERR); ret = _TRUE; } else { - //DBG_871X("[dvobj:%p] continual_io_error:%d\n", dvobj, value); + /* RTW_INFO("[dvobj:%p] continual_io_error:%d\n", dvobj, value); */ } return ret; } @@ -519,42 +485,42 @@ int rtw_inc_and_chk_continual_io_error(struct dvobj_priv *dvobj) */ void rtw_reset_continual_io_error(struct dvobj_priv *dvobj) { - ATOMIC_SET(&dvobj->continual_io_error, 0); + ATOMIC_SET(&dvobj->continual_io_error, 0); } #ifdef DBG_IO u32 read_sniff_ranges[][2] = { - //{0x520, 0x523}, -}; + /* {0x520, 0x523}, */ +}; u32 write_sniff_ranges[][2] = { - //{0x520, 0x523}, - //{0x4c, 0x4c}, -}; + /* {0x520, 0x523}, */ + /* {0x4c, 0x4c}, */ +}; -int read_sniff_num = sizeof(read_sniff_ranges)/sizeof(u32)/2; -int write_sniff_num = sizeof(write_sniff_ranges)/sizeof(u32)/2; +int read_sniff_num = sizeof(read_sniff_ranges) / sizeof(u32) / 2; +int write_sniff_num = sizeof(write_sniff_ranges) / sizeof(u32) / 2; bool match_read_sniff_ranges(u32 addr, u16 len) { int i; - for (i = 0; i read_sniff_ranges[i][0] && addr <= read_sniff_ranges[i][1]) return _TRUE; } - + return _FALSE; } bool match_write_sniff_ranges(u32 addr, u16 len) { int i; - for (i = 0; i write_sniff_ranges[i][0] && addr <= write_sniff_ranges[i][1]) return _TRUE; } - + return _FALSE; } @@ -574,8 +540,8 @@ struct rf_sniff_ent rf_write_sniff_ranges[] = { /* {MAX_RF_PATH, 0x55, bRFRegOffsetMask}, */ }; -int rf_read_sniff_num = sizeof(rf_read_sniff_ranges)/sizeof(struct rf_sniff_ent); -int rf_write_sniff_num = sizeof(rf_write_sniff_ranges)/sizeof(struct rf_sniff_ent); +int rf_read_sniff_num = sizeof(rf_read_sniff_ranges) / sizeof(struct rf_sniff_ent); +int rf_write_sniff_num = sizeof(rf_write_sniff_ranges) / sizeof(struct rf_sniff_ent); bool match_rf_read_sniff_ranges(u8 path, u32 addr, u32 mask) { @@ -608,7 +574,7 @@ u8 dbg_rtw_read8(_adapter *adapter, u32 addr, const char *caller, const int line u8 val = _rtw_read8(adapter, addr); if (match_read_sniff_ranges(addr, 1)) - DBG_871X("DBG_IO %s:%d rtw_read8(0x%04x) return 0x%02x\n", caller, line, addr, val); + RTW_INFO("DBG_IO %s:%d rtw_read8(0x%04x) return 0x%02x\n", caller, line, addr, val); return val; } @@ -616,9 +582,9 @@ u8 dbg_rtw_read8(_adapter *adapter, u32 addr, const char *caller, const int line u16 dbg_rtw_read16(_adapter *adapter, u32 addr, const char *caller, const int line) { u16 val = _rtw_read16(adapter, addr); - + if (match_read_sniff_ranges(addr, 2)) - DBG_871X("DBG_IO %s:%d rtw_read16(0x%04x) return 0x%04x\n", caller, line, addr, val); + RTW_INFO("DBG_IO %s:%d rtw_read16(0x%04x) return 0x%04x\n", caller, line, addr, val); return val; } @@ -626,9 +592,9 @@ u16 dbg_rtw_read16(_adapter *adapter, u32 addr, const char *caller, const int li u32 dbg_rtw_read32(_adapter *adapter, u32 addr, const char *caller, const int line) { u32 val = _rtw_read32(adapter, addr); - + if (match_read_sniff_ranges(addr, 4)) - DBG_871X("DBG_IO %s:%d rtw_read32(0x%04x) return 0x%08x\n", caller, line, addr, val); + RTW_INFO("DBG_IO %s:%d rtw_read32(0x%04x) return 0x%08x\n", caller, line, addr, val); return val; } @@ -636,28 +602,28 @@ u32 dbg_rtw_read32(_adapter *adapter, u32 addr, const char *caller, const int li int dbg_rtw_write8(_adapter *adapter, u32 addr, u8 val, const char *caller, const int line) { if (match_write_sniff_ranges(addr, 1)) - DBG_871X("DBG_IO %s:%d rtw_write8(0x%04x, 0x%02x)\n", caller, line, addr, val); - + RTW_INFO("DBG_IO %s:%d rtw_write8(0x%04x, 0x%02x)\n", caller, line, addr, val); + return _rtw_write8(adapter, addr, val); } int dbg_rtw_write16(_adapter *adapter, u32 addr, u16 val, const char *caller, const int line) { if (match_write_sniff_ranges(addr, 2)) - DBG_871X("DBG_IO %s:%d rtw_write16(0x%04x, 0x%04x)\n", caller, line, addr, val); - + RTW_INFO("DBG_IO %s:%d rtw_write16(0x%04x, 0x%04x)\n", caller, line, addr, val); + return _rtw_write16(adapter, addr, val); } int dbg_rtw_write32(_adapter *adapter, u32 addr, u32 val, const char *caller, const int line) { if (match_write_sniff_ranges(addr, 4)) - DBG_871X("DBG_IO %s:%d rtw_write32(0x%04x, 0x%08x)\n", caller, line, addr, val); - + RTW_INFO("DBG_IO %s:%d rtw_write32(0x%04x, 0x%08x)\n", caller, line, addr, val); + return _rtw_write32(adapter, addr, val); } -int dbg_rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *data, const char *caller, const int line) +int dbg_rtw_writeN(_adapter *adapter, u32 addr , u32 length , u8 *data, const char *caller, const int line) { if (match_write_sniff_ranges(addr, length)) - DBG_871X("DBG_IO %s:%d rtw_writeN(0x%04x, %u)\n", caller, line, addr, length); + RTW_INFO("DBG_IO %s:%d rtw_writeN(0x%04x, %u)\n", caller, line, addr, length); return _rtw_writeN(adapter, addr, length, data); } @@ -667,10 +633,10 @@ u8 dbg_rtw_sd_f0_read8(_adapter *adapter, u32 addr, const char *caller, const in { u8 val = _rtw_sd_f0_read8(adapter, addr); - #if 0 +#if 0 if (match_read_sniff_ranges(addr, 1)) - DBG_871X("DBG_IO %s:%d rtw_sd_f0_read8(0x%04x) return 0x%02x\n", caller, line, addr, val); - #endif + RTW_INFO("DBG_IO %s:%d rtw_sd_f0_read8(0x%04x) return 0x%02x\n", caller, line, addr, val); +#endif return val; } @@ -681,7 +647,7 @@ u8 dbg_rtw_sd_iread8(_adapter *adapter, u32 addr, const char *caller, const int u8 val = rtw_sd_iread8(adapter, addr); if (match_read_sniff_ranges(addr, 1)) - DBG_871X("DBG_IO %s:%d rtw_sd_iread8(0x%04x) return 0x%02x\n", caller, line, addr, val); + RTW_INFO("DBG_IO %s:%d rtw_sd_iread8(0x%04x) return 0x%02x\n", caller, line, addr, val); return val; } @@ -689,9 +655,9 @@ u8 dbg_rtw_sd_iread8(_adapter *adapter, u32 addr, const char *caller, const int u16 dbg_rtw_sd_iread16(_adapter *adapter, u32 addr, const char *caller, const int line) { u16 val = _rtw_sd_iread16(adapter, addr); - + if (match_read_sniff_ranges(addr, 2)) - DBG_871X("DBG_IO %s:%d rtw_sd_iread16(0x%04x) return 0x%04x\n", caller, line, addr, val); + RTW_INFO("DBG_IO %s:%d rtw_sd_iread16(0x%04x) return 0x%04x\n", caller, line, addr, val); return val; } @@ -699,9 +665,9 @@ u16 dbg_rtw_sd_iread16(_adapter *adapter, u32 addr, const char *caller, const in u32 dbg_rtw_sd_iread32(_adapter *adapter, u32 addr, const char *caller, const int line) { u32 val = _rtw_sd_iread32(adapter, addr); - + if (match_read_sniff_ranges(addr, 4)) - DBG_871X("DBG_IO %s:%d rtw_sd_iread32(0x%04x) return 0x%08x\n", caller, line, addr, val); + RTW_INFO("DBG_IO %s:%d rtw_sd_iread32(0x%04x) return 0x%08x\n", caller, line, addr, val); return val; } @@ -709,22 +675,22 @@ u32 dbg_rtw_sd_iread32(_adapter *adapter, u32 addr, const char *caller, const in int dbg_rtw_sd_iwrite8(_adapter *adapter, u32 addr, u8 val, const char *caller, const int line) { if (match_write_sniff_ranges(addr, 1)) - DBG_871X("DBG_IO %s:%d rtw_sd_iwrite8(0x%04x, 0x%02x)\n", caller, line, addr, val); - + RTW_INFO("DBG_IO %s:%d rtw_sd_iwrite8(0x%04x, 0x%02x)\n", caller, line, addr, val); + return _rtw_sd_iwrite8(adapter, addr, val); } int dbg_rtw_sd_iwrite16(_adapter *adapter, u32 addr, u16 val, const char *caller, const int line) { if (match_write_sniff_ranges(addr, 2)) - DBG_871X("DBG_IO %s:%d rtw_sd_iwrite16(0x%04x, 0x%04x)\n", caller, line, addr, val); - + RTW_INFO("DBG_IO %s:%d rtw_sd_iwrite16(0x%04x, 0x%04x)\n", caller, line, addr, val); + return _rtw_sd_iwrite16(adapter, addr, val); } int dbg_rtw_sd_iwrite32(_adapter *adapter, u32 addr, u32 val, const char *caller, const int line) { if (match_write_sniff_ranges(addr, 4)) - DBG_871X("DBG_IO %s:%d rtw_sd_iwrite32(0x%04x, 0x%08x)\n", caller, line, addr, val); - + RTW_INFO("DBG_IO %s:%d rtw_sd_iwrite32(0x%04x, 0x%08x)\n", caller, line, addr, val); + return _rtw_sd_iwrite32(adapter, addr, val); } @@ -733,5 +699,3 @@ int dbg_rtw_sd_iwrite32(_adapter *adapter, u32 addr, u32 val, const char *caller #endif /* CONFIG_SDIO_HCI */ #endif - - diff --git a/core/rtw_ioctl_query.c b/core/rtw_ioctl_query.c old mode 100755 new mode 100644 index d7cd885..4f8232d --- a/core/rtw_ioctl_query.c +++ b/core/rtw_ioctl_query.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. @@ -23,170 +23,149 @@ #ifdef PLATFORM_WINDOWS -// -// Added for WPA2-PSK, by Annie, 2005-09-20. -// +/* + * Added for WPA2-PSK, by Annie, 2005-09-20. + * */ u8 query_802_11_capability( - _adapter* Adapter, - u8* pucBuf, - u32 * pulOutLen + _adapter *Adapter, + u8 *pucBuf, + u32 *pulOutLen ) { - static NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] = - { - {Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled}, + static NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] = { + {Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled}, {Ndis802_11AuthModeOpen, Ndis802_11Encryption1Enabled}, - {Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled}, + {Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled}, {Ndis802_11AuthModeShared, Ndis802_11Encryption1Enabled}, - {Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled}, {Ndis802_11AuthModeWPA, Ndis802_11Encryption3Enabled}, - {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled}, {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption3Enabled}, - {Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled}, {Ndis802_11AuthModeWPANone, Ndis802_11Encryption3Enabled}, - {Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled}, {Ndis802_11AuthModeWPA2, Ndis802_11Encryption3Enabled}, - {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled}, {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled} - }; - static ULONG ulNumOfPairSupported = sizeof(szAuthEnc)/sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); - NDIS_802_11_CAPABILITY * pCap = (NDIS_802_11_CAPABILITY *)pucBuf; - u8* pucAuthEncryptionSupported = (u8*) pCap->AuthenticationEncryptionSupported; + }; + static ULONG ulNumOfPairSupported = sizeof(szAuthEnc) / sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); + NDIS_802_11_CAPABILITY *pCap = (NDIS_802_11_CAPABILITY *)pucBuf; + u8 *pucAuthEncryptionSupported = (u8 *) pCap->AuthenticationEncryptionSupported; pCap->Length = sizeof(NDIS_802_11_CAPABILITY); - if(ulNumOfPairSupported > 1 ) - pCap->Length += (ulNumOfPairSupported-1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); - - pCap->Version = 2; - pCap->NoOfPMKIDs = NUM_PMKID_CACHE; + if (ulNumOfPairSupported > 1) + pCap->Length += (ulNumOfPairSupported - 1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); + + pCap->Version = 2; + pCap->NoOfPMKIDs = NUM_PMKID_CACHE; pCap->NoOfAuthEncryptPairsSupported = ulNumOfPairSupported; - if( sizeof (szAuthEnc) <= 240 ) // 240 = 256 - 4*4 // SecurityInfo.szCapability: only 256 bytes in size. - { - _rtw_memcpy( pucAuthEncryptionSupported, (u8*)szAuthEnc, sizeof (szAuthEnc) ); + if (sizeof(szAuthEnc) <= 240) /* 240 = 256 - 4*4 */ { /* SecurityInfo.szCapability: only 256 bytes in size. */ + _rtw_memcpy(pucAuthEncryptionSupported, (u8 *)szAuthEnc, sizeof(szAuthEnc)); *pulOutLen = pCap->Length; return _TRUE; - } - else - { + } else { *pulOutLen = 0; - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("_query_802_11_capability(): szAuthEnc size is too large.\n")); return _FALSE; } } -u8 query_802_11_association_information( _adapter *padapter,PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo) +u8 query_802_11_association_information(_adapter *padapter, PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo) { struct wlan_network *tgt_network; struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv *psecuritypriv=&(padapter->securitypriv); - WLAN_BSSID_EX *psecnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - u8 * pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); - unsigned char i,*auth_ie,*supp_ie; + struct security_priv *psecuritypriv = &(padapter->securitypriv); + WLAN_BSSID_EX *psecnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + u8 *pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + unsigned char i, *auth_ie, *supp_ie; - //NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); + /* NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); */ _rtw_memset(pAssocInfo, 0, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); - //pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + /* pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); */ - //------------------------------------------------------ - // Association Request related information - //------------------------------------------------------ - // Req_1. AvailableRequestFixedIEs - if(psecnetwork!=NULL){ - - pAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES|NDIS_802_11_AI_REQFI_CURRENTAPADDRESS; - pAssocInfo->RequestFixedIEs.Capabilities = (unsigned short)* & psecnetwork->IEs[10]; - _rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress, - & psecnetwork->MacAddress, 6); + /* ------------------------------------------------------ */ + /* Association Request related information */ + /* ------------------------------------------------------ */ + /* Req_1. AvailableRequestFixedIEs */ + if (psecnetwork != NULL) { - pAssocInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + pAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES | NDIS_802_11_AI_REQFI_CURRENTAPADDRESS; + pAssocInfo->RequestFixedIEs.Capabilities = (unsigned short) *&psecnetwork->IEs[10]; + _rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress, + &psecnetwork->MacAddress, 6); - if(check_fwstate( pmlmepriv, _FW_UNDER_LINKING|_FW_LINKED)==_TRUE) - { - - if(psecuritypriv->ndisauthtype>=Ndis802_11AuthModeWPA2) - pDest[0] =48; //RSN Information Element - else - pDest[0] =221; //WPA(SSN) Information Element - - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n Adapter->ndisauthtype==Ndis802_11AuthModeWPA)?0xdd:0x30 [%d]",pDest[0])); - supp_ie=&psecuritypriv->supplicant_ie[0]; - for(i=0;iOffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING | _FW_LINKED) == _TRUE) { + + if (psecuritypriv->ndisauthtype >= Ndis802_11AuthModeWPA2) + pDest[0] = 48; /* RSN Information Element */ + else + pDest[0] = 221; /* WPA(SSN) Information Element */ + + supp_ie = &psecuritypriv->supplicant_ie[0]; + + i = 13; /* 0~11 is fixed information element */ + while ((i < supp_ie[0]) && (i < 256)) { + if ((unsigned char)supp_ie[i] == pDest[0]) { + _rtw_memcpy((u8 *)(pDest), + &supp_ie[i], + supp_ie[1 + i] + 2); + + break; + } + + i = i + supp_ie[i + 1] + 2; + if (supp_ie[1 + i] == 0) + i = i + 1; - i=13; //0~11 is fixed information element - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("i= %d tgt_network->network.IELength=%d\n\n", i,(int)psecnetwork->IELength)); - while((iRequestIELength += (2 + supp_ie[1 + i]); /* (2 + psecnetwork->IEs[1+i]+4); */ + } - - pAssocInfo->RequestIELength += (2 + supp_ie[1+i]);// (2 + psecnetwork->IEs[1+i]+4); + } - - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n psecnetwork != NULL,fwstate==_FW_UNDER_LINKING \n")); - } - + /* ------------------------------------------------------ */ + /* Association Response related information */ + /* ------------------------------------------------------ */ - //------------------------------------------------------ - // Association Response related information - //------------------------------------------------------ - - if(check_fwstate( pmlmepriv, _FW_LINKED)==_TRUE) - { - tgt_network =&(pmlmepriv->cur_network); - if(tgt_network!=NULL){ - pAssocInfo->AvailableResponseFixedIEs = + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { + tgt_network = &(pmlmepriv->cur_network); + if (tgt_network != NULL) { + pAssocInfo->AvailableResponseFixedIEs = NDIS_802_11_AI_RESFI_CAPABILITIES - |NDIS_802_11_AI_RESFI_ASSOCIATIONID + | NDIS_802_11_AI_RESFI_ASSOCIATIONID ; - pAssocInfo->ResponseFixedIEs.Capabilities =(unsigned short)* & tgt_network->network.IEs[10]; - pAssocInfo->ResponseFixedIEs.StatusCode = 0; - pAssocInfo->ResponseFixedIEs.AssociationId =(unsigned short) tgt_network->aid; + pAssocInfo->ResponseFixedIEs.Capabilities = (unsigned short) *&tgt_network->network.IEs[10]; + pAssocInfo->ResponseFixedIEs.StatusCode = 0; + pAssocInfo->ResponseFixedIEs.AssociationId = (unsigned short) tgt_network->aid; - pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)+pAssocInfo->RequestIELength; - auth_ie=&psecuritypriv->authenticator_ie[0]; + pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength; + auth_ie = &psecuritypriv->authenticator_ie[0]; + + + i = auth_ie[0] - 12; + if (i > 0) { + _rtw_memcpy((u8 *)&pDest[0], &auth_ie[1], i); + pAssocInfo->ResponseIELength = i; + } + + + pAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength; - for(i=0;i0){ - _rtw_memcpy((u8 *)&pDest[0],&auth_ie[1],i); - pAssocInfo->ResponseIELength =i; } - - - pAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength; - - - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n tgt_network != NULL,fwstate==_FW_LINKED \n")); - } - } - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n exit query_802_11_association_information \n")); -_func_exit_; + } return _TRUE; } #endif - diff --git a/core/rtw_ioctl_rtl.c b/core/rtw_ioctl_rtl.c old mode 100755 new mode 100644 index 9989659..ab4a387 --- a/core/rtw_ioctl_rtl.c +++ b/core/rtw_ioctl_rtl.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. @@ -22,939 +22,827 @@ #include #ifdef CONFIG_MP_INCLUDED -#include + #include #endif -struct oid_obj_priv oid_rtl_seg_01_01[] = -{ - {1, &oid_null_function}, //0x80 - {1, &oid_null_function}, //0x81 - {1, &oid_null_function}, //0x82 - {1, &oid_null_function}, //0x83//OID_RT_SET_SNIFFER_MODE - {1, &oid_rt_get_signal_quality_hdl}, //0x84 - {1, &oid_rt_get_small_packet_crc_hdl}, //0x85 - {1, &oid_rt_get_middle_packet_crc_hdl}, //0x86 - {1, &oid_rt_get_large_packet_crc_hdl}, //0x87 - {1, &oid_rt_get_tx_retry_hdl}, //0x88 - {1, &oid_rt_get_rx_retry_hdl}, //0x89 - {1, &oid_rt_pro_set_fw_dig_state_hdl}, //0x8A - {1, &oid_rt_pro_set_fw_ra_state_hdl} , //0x8B - {1, &oid_null_function}, //0x8C - {1, &oid_null_function}, //0x8D - {1, &oid_null_function}, //0x8E - {1, &oid_null_function}, //0x8F - {1, &oid_rt_get_rx_total_packet_hdl}, //0x90 - {1, &oid_rt_get_tx_beacon_ok_hdl}, //0x91 - {1, &oid_rt_get_tx_beacon_err_hdl}, //0x92 - {1, &oid_rt_get_rx_icv_err_hdl}, //0x93 - {1, &oid_rt_set_encryption_algorithm_hdl}, //0x94 - {1, &oid_null_function}, //0x95 - {1, &oid_rt_get_preamble_mode_hdl}, //0x96 - {1, &oid_null_function}, //0x97 - {1, &oid_rt_get_ap_ip_hdl}, //0x98 - {1, &oid_rt_get_channelplan_hdl}, //0x99 - {1, &oid_rt_set_preamble_mode_hdl}, //0x9A - {1, &oid_rt_set_bcn_intvl_hdl}, //0x9B - {1, &oid_null_function}, //0x9C - {1, &oid_rt_dedicate_probe_hdl}, //0x9D - {1, &oid_null_function}, //0x9E - {1, &oid_null_function}, //0x9F - {1, &oid_null_function}, //0xA0 - {1, &oid_null_function}, //0xA1 - {1, &oid_null_function}, //0xA2 - {1, &oid_null_function}, //0xA3 - {1, &oid_null_function}, //0xA4 - {1, &oid_null_function}, //0xA5 - {1, &oid_null_function}, //0xA6 - {1, &oid_rt_get_total_tx_bytes_hdl}, //0xA7 - {1, &oid_rt_get_total_rx_bytes_hdl}, //0xA8 - {1, &oid_rt_current_tx_power_level_hdl}, //0xA9 - {1, &oid_rt_get_enc_key_mismatch_count_hdl}, //0xAA - {1, &oid_rt_get_enc_key_match_count_hdl}, //0xAB - {1, &oid_rt_get_channel_hdl}, //0xAC - {1, &oid_rt_set_channelplan_hdl}, //0xAD - {1, &oid_rt_get_hardware_radio_off_hdl}, //0xAE - {1, &oid_null_function}, //0xAF - {1, &oid_null_function}, //0xB0 - {1, &oid_null_function}, //0xB1 - {1, &oid_null_function}, //0xB2 - {1, &oid_null_function}, //0xB3 - {1, &oid_rt_get_key_mismatch_hdl}, //0xB4 - {1, &oid_null_function}, //0xB5 - {1, &oid_null_function}, //0xB6 - {1, &oid_null_function}, //0xB7 - {1, &oid_null_function}, //0xB8 - {1, &oid_null_function}, //0xB9 - {1, &oid_null_function}, //0xBA - {1, &oid_rt_supported_wireless_mode_hdl}, //0xBB - {1, &oid_rt_get_channel_list_hdl}, //0xBC - {1, &oid_rt_get_scan_in_progress_hdl}, //0xBD - {1, &oid_null_function}, //0xBE - {1, &oid_null_function}, //0xBF - {1, &oid_null_function}, //0xC0 - {1, &oid_rt_forced_data_rate_hdl}, //0xC1 - {1, &oid_rt_wireless_mode_for_scan_list_hdl}, //0xC2 - {1, &oid_rt_get_bss_wireless_mode_hdl}, //0xC3 - {1, &oid_rt_scan_with_magic_packet_hdl}, //0xC4 - {1, &oid_null_function}, //0xC5 - {1, &oid_null_function}, //0xC6 - {1, &oid_null_function}, //0xC7 - {1, &oid_null_function}, //0xC8 - {1, &oid_null_function}, //0xC9 - {1, &oid_null_function}, //0xCA - {1, &oid_null_function}, //0xCB - {1, &oid_null_function}, //0xCC - {1, &oid_null_function}, //0xCD - {1, &oid_null_function}, //0xCE - {1, &oid_null_function}, //0xCF - -}; - -struct oid_obj_priv oid_rtl_seg_01_03[] = -{ - {1, &oid_rt_ap_get_associated_station_list_hdl}, //0x00 - {1, &oid_null_function}, //0x01 - {1, &oid_rt_ap_switch_into_ap_mode_hdl}, //0x02 - {1, &oid_null_function}, //0x03 - {1, &oid_rt_ap_supported_hdl}, //0x04 - {1, &oid_rt_ap_set_passphrase_hdl}, //0x05 +struct oid_obj_priv oid_rtl_seg_01_01[] = { + {1, &oid_null_function}, /* 0x80 */ + {1, &oid_null_function}, /* 0x81 */ + {1, &oid_null_function}, /* 0x82 */ + {1, &oid_null_function}, /* 0x83 */ /* OID_RT_SET_SNIFFER_MODE */ + {1, &oid_rt_get_signal_quality_hdl}, /* 0x84 */ + {1, &oid_rt_get_small_packet_crc_hdl}, /* 0x85 */ + {1, &oid_rt_get_middle_packet_crc_hdl}, /* 0x86 */ + {1, &oid_rt_get_large_packet_crc_hdl}, /* 0x87 */ + {1, &oid_rt_get_tx_retry_hdl}, /* 0x88 */ + {1, &oid_rt_get_rx_retry_hdl}, /* 0x89 */ + {1, &oid_rt_pro_set_fw_dig_state_hdl}, /* 0x8A */ + {1, &oid_rt_pro_set_fw_ra_state_hdl} , /* 0x8B */ + {1, &oid_null_function}, /* 0x8C */ + {1, &oid_null_function}, /* 0x8D */ + {1, &oid_null_function}, /* 0x8E */ + {1, &oid_null_function}, /* 0x8F */ + {1, &oid_rt_get_rx_total_packet_hdl}, /* 0x90 */ + {1, &oid_rt_get_tx_beacon_ok_hdl}, /* 0x91 */ + {1, &oid_rt_get_tx_beacon_err_hdl}, /* 0x92 */ + {1, &oid_rt_get_rx_icv_err_hdl}, /* 0x93 */ + {1, &oid_rt_set_encryption_algorithm_hdl}, /* 0x94 */ + {1, &oid_null_function}, /* 0x95 */ + {1, &oid_rt_get_preamble_mode_hdl}, /* 0x96 */ + {1, &oid_null_function}, /* 0x97 */ + {1, &oid_rt_get_ap_ip_hdl}, /* 0x98 */ + {1, &oid_rt_get_channelplan_hdl}, /* 0x99 */ + {1, &oid_rt_set_preamble_mode_hdl}, /* 0x9A */ + {1, &oid_rt_set_bcn_intvl_hdl}, /* 0x9B */ + {1, &oid_null_function}, /* 0x9C */ + {1, &oid_rt_dedicate_probe_hdl}, /* 0x9D */ + {1, &oid_null_function}, /* 0x9E */ + {1, &oid_null_function}, /* 0x9F */ + {1, &oid_null_function}, /* 0xA0 */ + {1, &oid_null_function}, /* 0xA1 */ + {1, &oid_null_function}, /* 0xA2 */ + {1, &oid_null_function}, /* 0xA3 */ + {1, &oid_null_function}, /* 0xA4 */ + {1, &oid_null_function}, /* 0xA5 */ + {1, &oid_null_function}, /* 0xA6 */ + {1, &oid_rt_get_total_tx_bytes_hdl}, /* 0xA7 */ + {1, &oid_rt_get_total_rx_bytes_hdl}, /* 0xA8 */ + {1, &oid_rt_current_tx_power_level_hdl}, /* 0xA9 */ + {1, &oid_rt_get_enc_key_mismatch_count_hdl}, /* 0xAA */ + {1, &oid_rt_get_enc_key_match_count_hdl}, /* 0xAB */ + {1, &oid_rt_get_channel_hdl}, /* 0xAC */ + {1, &oid_rt_set_channelplan_hdl}, /* 0xAD */ + {1, &oid_rt_get_hardware_radio_off_hdl}, /* 0xAE */ + {1, &oid_null_function}, /* 0xAF */ + {1, &oid_null_function}, /* 0xB0 */ + {1, &oid_null_function}, /* 0xB1 */ + {1, &oid_null_function}, /* 0xB2 */ + {1, &oid_null_function}, /* 0xB3 */ + {1, &oid_rt_get_key_mismatch_hdl}, /* 0xB4 */ + {1, &oid_null_function}, /* 0xB5 */ + {1, &oid_null_function}, /* 0xB6 */ + {1, &oid_null_function}, /* 0xB7 */ + {1, &oid_null_function}, /* 0xB8 */ + {1, &oid_null_function}, /* 0xB9 */ + {1, &oid_null_function}, /* 0xBA */ + {1, &oid_rt_supported_wireless_mode_hdl}, /* 0xBB */ + {1, &oid_rt_get_channel_list_hdl}, /* 0xBC */ + {1, &oid_rt_get_scan_in_progress_hdl}, /* 0xBD */ + {1, &oid_null_function}, /* 0xBE */ + {1, &oid_null_function}, /* 0xBF */ + {1, &oid_null_function}, /* 0xC0 */ + {1, &oid_rt_forced_data_rate_hdl}, /* 0xC1 */ + {1, &oid_rt_wireless_mode_for_scan_list_hdl}, /* 0xC2 */ + {1, &oid_rt_get_bss_wireless_mode_hdl}, /* 0xC3 */ + {1, &oid_rt_scan_with_magic_packet_hdl}, /* 0xC4 */ + {1, &oid_null_function}, /* 0xC5 */ + {1, &oid_null_function}, /* 0xC6 */ + {1, &oid_null_function}, /* 0xC7 */ + {1, &oid_null_function}, /* 0xC8 */ + {1, &oid_null_function}, /* 0xC9 */ + {1, &oid_null_function}, /* 0xCA */ + {1, &oid_null_function}, /* 0xCB */ + {1, &oid_null_function}, /* 0xCC */ + {1, &oid_null_function}, /* 0xCD */ + {1, &oid_null_function}, /* 0xCE */ + {1, &oid_null_function}, /* 0xCF */ }; -struct oid_obj_priv oid_rtl_seg_01_11[] = -{ - {1, &oid_null_function}, //0xC0 OID_RT_PRO_RX_FILTER - {1, &oid_null_function}, //0xC1 OID_CE_USB_WRITE_REGISTRY - {1, &oid_null_function}, //0xC2 OID_CE_USB_READ_REGISTRY - {1, &oid_null_function}, //0xC3 OID_RT_PRO_SET_INITIAL_GAIN - {1, &oid_null_function}, //0xC4 OID_RT_PRO_SET_BB_RF_STANDBY_MODE - {1, &oid_null_function}, //0xC5 OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE - {1, &oid_null_function}, //0xC6 OID_RT_PRO_SET_TX_CHARGE_PUMP - {1, &oid_null_function}, //0xC7 OID_RT_PRO_SET_RX_CHARGE_PUMP - {1, &oid_rt_pro_rf_write_registry_hdl}, //0xC8 - {1, &oid_rt_pro_rf_read_registry_hdl}, //0xC9 - {1, &oid_null_function} //0xCA OID_RT_PRO_QUERY_RF_TYPE - +struct oid_obj_priv oid_rtl_seg_01_03[] = { + {1, &oid_rt_ap_get_associated_station_list_hdl}, /* 0x00 */ + {1, &oid_null_function}, /* 0x01 */ + {1, &oid_rt_ap_switch_into_ap_mode_hdl}, /* 0x02 */ + {1, &oid_null_function}, /* 0x03 */ + {1, &oid_rt_ap_supported_hdl}, /* 0x04 */ + {1, &oid_rt_ap_set_passphrase_hdl}, /* 0x05 */ + }; -struct oid_obj_priv oid_rtl_seg_03_00[] = -{ - {1, &oid_null_function}, //0x00 - {1, &oid_rt_get_connect_state_hdl}, //0x01 - {1, &oid_null_function}, //0x02 - {1, &oid_null_function}, //0x03 - {1, &oid_rt_set_default_key_id_hdl}, //0x04 +struct oid_obj_priv oid_rtl_seg_01_11[] = { + {1, &oid_null_function}, /* 0xC0 OID_RT_PRO_RX_FILTER */ + {1, &oid_null_function}, /* 0xC1 OID_CE_USB_WRITE_REGISTRY */ + {1, &oid_null_function}, /* 0xC2 OID_CE_USB_READ_REGISTRY */ + {1, &oid_null_function}, /* 0xC3 OID_RT_PRO_SET_INITIAL_GAIN */ + {1, &oid_null_function}, /* 0xC4 OID_RT_PRO_SET_BB_RF_STANDBY_MODE */ + {1, &oid_null_function}, /* 0xC5 OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE */ + {1, &oid_null_function}, /* 0xC6 OID_RT_PRO_SET_TX_CHARGE_PUMP */ + {1, &oid_null_function}, /* 0xC7 OID_RT_PRO_SET_RX_CHARGE_PUMP */ + {1, &oid_rt_pro_rf_write_registry_hdl}, /* 0xC8 */ + {1, &oid_rt_pro_rf_read_registry_hdl}, /* 0xC9 */ + {1, &oid_null_function} /* 0xCA OID_RT_PRO_QUERY_RF_TYPE */ + +}; + +struct oid_obj_priv oid_rtl_seg_03_00[] = { + {1, &oid_null_function}, /* 0x00 */ + {1, &oid_rt_get_connect_state_hdl}, /* 0x01 */ + {1, &oid_null_function}, /* 0x02 */ + {1, &oid_null_function}, /* 0x03 */ + {1, &oid_rt_set_default_key_id_hdl}, /* 0x04 */ + - }; -//************** oid_rtl_seg_01_01 section start ************** +/* ************** oid_rtl_seg_01_01 section start ************** */ -NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; #if 0 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); _irqL oldirql; - - _func_enter_; - - if(poid_par_priv->type_of_oid != SET_OID) - { + + + if (poid_par_priv->type_of_oid != SET_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } - - _irqlevel_changed_(&oldirql,LOWER); - if(poid_par_priv->information_buf_len >= sizeof(struct setdig_parm)) - { - //DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); - if(!rtw_setfwdig_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf ))) - { + + _irqlevel_changed_(&oldirql, LOWER); + if (poid_par_priv->information_buf_len >= sizeof(struct setdig_parm)) { + /* DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); */ + if (!rtw_setfwdig_cmd(Adapter, *((unsigned char *)poid_par_priv->information_buf))) status = NDIS_STATUS_NOT_ACCEPTED; - } - - } - else{ + + } else status = NDIS_STATUS_NOT_ACCEPTED; - } - _irqlevel_changed_(&oldirql,RAISE); - _func_exit_; + _irqlevel_changed_(&oldirql, RAISE); #endif return status; } -//----------------------------------------------------------------------------- -NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv) +/* ----------------------------------------------------------------------------- */ +NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; #if 0 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); _irqL oldirql; - - _func_enter_; - if(poid_par_priv->type_of_oid != SET_OID) - { + + if (poid_par_priv->type_of_oid != SET_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } - - _irqlevel_changed_(&oldirql,LOWER); - - if(poid_par_priv->information_buf_len >= sizeof(struct setra_parm)) - { - //DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); - if(!rtw_setfwra_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf ))) - { + + _irqlevel_changed_(&oldirql, LOWER); + + if (poid_par_priv->information_buf_len >= sizeof(struct setra_parm)) { + /* DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); */ + if (!rtw_setfwra_cmd(Adapter, *((unsigned char *)poid_par_priv->information_buf))) status = NDIS_STATUS_NOT_ACCEPTED; - } - - } - else{ + + } else status = NDIS_STATUS_NOT_ACCEPTED; - } - _irqlevel_changed_(&oldirql,RAISE); - _func_exit_; + _irqlevel_changed_(&oldirql, RAISE); #endif return status; } -//----------------------------------------------------------------------------- -NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv) +/* ----------------------------------------------------------------------------- */ +NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - //DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl \n")); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + /* DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl\n")); */ + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } #if 0 - if(pMgntInfo->mAssoc || pMgntInfo->mIbss) - { - ulInfo = pAdapter->RxStats.SignalQuality; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - ulInfo = 0xffffffff; // It stands for -1 in 4-byte integer. - } - break; + if (pMgntInfo->mAssoc || pMgntInfo->mIbss) { + ulInfo = pAdapter->RxStats.SignalQuality; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else { + ulInfo = 0xffffffff; /* It stands for -1 in 4-byte integer. */ + } + break; #endif return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } - - if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) - { + } + + if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else status = NDIS_STATUS_INVALID_LENGTH; - } return status; } -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv) +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } - if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) - { + if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else status = NDIS_STATUS_INVALID_LENGTH; - } return status; } -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv) +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } - if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) - { + if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else status = NDIS_STATUS_INVALID_LENGTH; + + + return status; +} + +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; } - return status; } - -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } + } *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; return status; } -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv) +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } - if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) - { + } + if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else status = NDIS_STATUS_INVALID_LENGTH; - } return status; } -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv) +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } - if(poid_par_priv->information_buf_len>= sizeof(u32)) - { - //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); + + return status; +} +NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if (poid_par_priv->information_buf_len >= sizeof(u32)) { + /* _rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); */ *(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { + } else status = NDIS_STATUS_INVALID_LENGTH ; + + + return status; +} +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != SET_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; } - return status; } -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv) +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + ULONG preamblemode = 0 ; - if(poid_par_priv->type_of_oid != SET_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - ULONG preamblemode = 0 ; - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if(poid_par_priv->information_buf_len>= sizeof(ULONG)) - { - if(padapter->registrypriv.preamble == PREAMBLE_LONG) + } + if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { + if (padapter->registrypriv.preamble == PREAMBLE_LONG) preamblemode = 0; else if (padapter->registrypriv.preamble == PREAMBLE_AUTO) preamblemode = 1; else if (padapter->registrypriv.preamble == PREAMBLE_SHORT) preamblemode = 2; - - + + *(ULONG *)poid_par_priv->information_buf = preamblemode ; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { + } else status = NDIS_STATUS_INVALID_LENGTH ; + return status; +} +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; } - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } return status; } -NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; *(u16 *)poid_par_priv->information_buf = padapter->mlmepriv.ChannelPlan ; return status; } -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); - - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - padapter->mlmepriv.ChannelPlan = *(u16 *)poid_par_priv->information_buf ; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - ULONG preamblemode = 0; - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if(poid_par_priv->information_buf_len>= sizeof(ULONG)) - { - preamblemode = *(ULONG *)poid_par_priv->information_buf ; - if( preamblemode == 0) - padapter->registrypriv.preamble = PREAMBLE_LONG; - else if (preamblemode==1 ) - padapter->registrypriv.preamble = PREAMBLE_AUTO; - else if ( preamblemode==2 ) - padapter->registrypriv.preamble = PREAMBLE_SHORT; - - *(ULONG *)poid_par_priv->information_buf = preamblemode ; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH ; - } - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if(poid_par_priv->information_buf_len>= sizeof(ULONG)) - { - *(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH ; - } - - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv) +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); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != SET_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } - if(poid_par_priv->information_buf_len>= sizeof(ULONG)) - { - //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); + + padapter->mlmepriv.ChannelPlan = *(u16 *)poid_par_priv->information_buf ; + + return status; +} +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + ULONG preamblemode = 0; + if (poid_par_priv->type_of_oid != SET_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { + preamblemode = *(ULONG *)poid_par_priv->information_buf ; + if (preamblemode == 0) + padapter->registrypriv.preamble = PREAMBLE_LONG; + else if (preamblemode == 1) + padapter->registrypriv.preamble = PREAMBLE_AUTO; + else if (preamblemode == 2) + padapter->registrypriv.preamble = PREAMBLE_SHORT; + + *(ULONG *)poid_par_priv->information_buf = preamblemode ; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else + status = NDIS_STATUS_INVALID_LENGTH ; + + return status; +} +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != SET_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { + *(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else + status = NDIS_STATUS_INVALID_LENGTH ; + + + return status; +} +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { + /* _rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); */ *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { + } else status = NDIS_STATUS_INVALID_LENGTH ; + return status; +} +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; } - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); return status; } -NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } return status; } -NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); struct mlme_priv *pmlmepriv = &padapter->mlmepriv; NDIS_802_11_CONFIGURATION *pnic_Config; ULONG channelnum; - _func_enter_; - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } - if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) + if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) pnic_Config = &pmlmepriv->cur_network.network.Configuration; else pnic_Config = &padapter->registrypriv.dev_network.Configuration; channelnum = pnic_Config->DSConfig; *(ULONG *)poid_par_priv->information_buf = channelnum; - + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - _func_exit_; return status; } -NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - ULONG ulInfo = 0 ; - //DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl \n")); - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if(poid_par_priv->information_buf_len >= sizeof(ULONG)){ - ulInfo |= 0x0100; //WIRELESS_MODE_B - ulInfo |= 0x0200; //WIRELESS_MODE_G - ulInfo |= 0x0400; //WIRELESS_MODE_A - - *(ULONG *) poid_par_priv->information_buf = ulInfo; - //DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo)); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; } - else{ + + return status; +} +NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + ULONG ulInfo = 0 ; + /* DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl\n")); */ + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { + ulInfo |= 0x0100; /* WIRELESS_MODE_B */ + ulInfo |= 0x0200; /* WIRELESS_MODE_G */ + ulInfo |= 0x0400; /* WIRELESS_MODE_A */ + + *(ULONG *) poid_par_priv->information_buf = ulInfo; + /* DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo)); */ + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else status = NDIS_STATUS_INVALID_LENGTH; - } return status; } -NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } return status; } -NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } return status; } -NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); return status; } -NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); return status; } -NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } return status; } -NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); return status; } -//************** oid_rtl_seg_01_01 section end ************** +/* ************** oid_rtl_seg_01_01 section end ************** */ -//************** oid_rtl_seg_01_03 section start ************** -NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv) +/* ************** oid_rtl_seg_01_03 section start ************** */ +NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != QUERY_OID) - { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } return status; } -NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); return status; } -NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); return status; } -NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != SET_OID) - { + if (poid_par_priv->type_of_oid != SET_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } return status; } -//************** oid_rtl_seg_01_03 section end ************** +/* ************** oid_rtl_seg_01_03 section end ************** */ -//**************** oid_rtl_seg_01_11 section start **************** -NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv) +/* **************** oid_rtl_seg_01_11 section start **************** */ +NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); _irqL oldirql; - _func_enter_; - //DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl \n")); - if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID - { + /* DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl\n")); */ + if (poid_par_priv->type_of_oid != SET_OID) { /* QUERY_OID */ status = NDIS_STATUS_NOT_ACCEPTED; return status; } - - _irqlevel_changed_(&oldirql,LOWER); - if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3)) - { - //RegOffsetValue - The offset of RF register to write. - //RegDataWidth - The data width of RF register to write. - //RegDataValue - The value to write. - //RegOffsetValue = *((unsigned long*)InformationBuffer); - //RegDataWidth = *((unsigned long*)InformationBuffer+1); - //RegDataValue = *((unsigned long*)InformationBuffer+2); - if(!rtw_setrfreg_cmd(Adapter, - *(unsigned char*)poid_par_priv->information_buf, - (unsigned long)(*((unsigned long*)poid_par_priv->information_buf+2)))) - { + + _irqlevel_changed_(&oldirql, LOWER); + if (poid_par_priv->information_buf_len == (sizeof(unsigned long) * 3)) { + /* RegOffsetValue - The offset of RF register to write. */ + /* RegDataWidth - The data width of RF register to write. */ + /* RegDataValue - The value to write. */ + /* RegOffsetValue = *((unsigned long*)InformationBuffer); */ + /* RegDataWidth = *((unsigned long*)InformationBuffer+1); */ + /* RegDataValue = *((unsigned long*)InformationBuffer+2); */ + if (!rtw_setrfreg_cmd(Adapter, + *(unsigned char *)poid_par_priv->information_buf, + (unsigned long)(*((unsigned long *)poid_par_priv->information_buf + 2)))) status = NDIS_STATUS_NOT_ACCEPTED; - } - - } - else{ + + } else status = NDIS_STATUS_INVALID_LENGTH; - } - _irqlevel_changed_(&oldirql,RAISE); - _func_exit_; + _irqlevel_changed_(&oldirql, RAISE); return status; } -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv) +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; #if 0 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); _irqL oldirql; - _func_enter_; - //DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl \n")); - if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID - { + /* DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl\n")); */ + if (poid_par_priv->type_of_oid != SET_OID) { /* QUERY_OID */ status = NDIS_STATUS_NOT_ACCEPTED; return status; - } - - _irqlevel_changed_(&oldirql,LOWER); - if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3)) - { - if(Adapter->mppriv.act_in_progress == _TRUE) - { + } + + _irqlevel_changed_(&oldirql, LOWER); + if (poid_par_priv->information_buf_len == (sizeof(unsigned long) * 3)) { + if (Adapter->mppriv.act_in_progress == _TRUE) status = NDIS_STATUS_NOT_ACCEPTED; - } - else - { - //init workparam + else { + /* init workparam */ Adapter->mppriv.act_in_progress = _TRUE; - Adapter->mppriv.workparam.bcompleted= _FALSE; + Adapter->mppriv.workparam.bcompleted = _FALSE; Adapter->mppriv.workparam.act_type = MPT_READ_RF; - Adapter->mppriv.workparam.io_offset = *(unsigned long*)poid_par_priv->information_buf; + Adapter->mppriv.workparam.io_offset = *(unsigned long *)poid_par_priv->information_buf; Adapter->mppriv.workparam.io_value = 0xcccccccc; - - //RegOffsetValue - The offset of RF register to read. - //RegDataWidth - The data width of RF register to read. - //RegDataValue - The value to read. - //RegOffsetValue = *((unsigned long*)InformationBuffer); - //RegDataWidth = *((unsigned long*)InformationBuffer+1); - //RegDataValue = *((unsigned long*)InformationBuffer+2); - if(!rtw_getrfreg_cmd(Adapter, - *(unsigned char*)poid_par_priv->information_buf, - (unsigned char*)&Adapter->mppriv.workparam.io_value)) - { + + /* RegOffsetValue - The offset of RF register to read. */ + /* RegDataWidth - The data width of RF register to read. */ + /* RegDataValue - The value to read. */ + /* RegOffsetValue = *((unsigned long*)InformationBuffer); */ + /* RegDataWidth = *((unsigned long*)InformationBuffer+1); */ + /* RegDataValue = *((unsigned long*)InformationBuffer+2); */ + if (!rtw_getrfreg_cmd(Adapter, + *(unsigned char *)poid_par_priv->information_buf, + (unsigned char *)&Adapter->mppriv.workparam.io_value)) status = NDIS_STATUS_NOT_ACCEPTED; - } } - - - } - else { + + + } else status = NDIS_STATUS_INVALID_LENGTH; - } - _irqlevel_changed_(&oldirql,RAISE); - _func_exit_; + _irqlevel_changed_(&oldirql, RAISE); #endif return status; } -//**************** oid_rtl_seg_01_11 section end**************** +/* **************** oid_rtl_seg_01_11 section end**************** */ -//************** oid_rtl_seg_03_00 section start ************** -enum _CONNECT_STATE_{ +/* ************** oid_rtl_seg_03_00 section start ************** */ +enum _CONNECT_STATE_ { CHECKINGSTATUS, ASSOCIATED, ADHOCMODE, NOTASSOCIATED }; -NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -962,23 +850,22 @@ NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv) struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); ULONG ulInfo; - - if(poid_par_priv->type_of_oid != QUERY_OID) - { + + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; - } + } - // nStatus==0 CheckingStatus - // nStatus==1 Associated - // nStatus==2 AdHocMode - // nStatus==3 NotAssociated - - if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) + /* nStatus==0 CheckingStatus */ + /* nStatus==1 Associated */ + /* nStatus==2 AdHocMode */ + /* nStatus==3 NotAssociated */ + + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) ulInfo = CHECKINGSTATUS; - else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + else if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ulInfo = ASSOCIATED; - else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)== _TRUE) + else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ulInfo = ADHOCMODE; else ulInfo = NOTASSOCIATED ; @@ -987,35 +874,31 @@ NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv) *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; #if 0 - // Rearrange the order to let the UI still shows connection when scan is in progress - RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("===> Query OID_RT_GET_CONNECT_STATE.\n")); - if(pMgntInfo->mAssoc) + /* Rearrange the order to let the UI still shows connection when scan is in progress */ + if (pMgntInfo->mAssoc) ulInfo = 1; - else if(pMgntInfo->mIbss) + else if (pMgntInfo->mIbss) ulInfo = 2; - else if(pMgntInfo->bScanInProgress) + else if (pMgntInfo->bScanInProgress) ulInfo = 0; else ulInfo = 3; ulInfoLen = sizeof(ULONG); - RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("<=== Query OID_RT_GET_CONNECT_STATE: %d\n", ulInfo)); #endif return status; } -NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv) { - NDIS_STATUS status = NDIS_STATUS_SUCCESS; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - if(poid_par_priv->type_of_oid != SET_OID) - { + if (poid_par_priv->type_of_oid != SET_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } - + return status; } -//************** oid_rtl_seg_03_00 section end ************** - +/* ************** oid_rtl_seg_03_00 section end ************** */ diff --git a/core/rtw_ioctl_set.c b/core/rtw_ioctl_set.c old mode 100755 new mode 100644 index 93f0641..934dc95 --- a/core/rtw_ioctl_set.c +++ b/core/rtw_ioctl_set.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -26,22 +26,21 @@ extern void indicate_wx_scan_complete_event(_adapter *padapter); #define IS_MAC_ADDRESS_BROADCAST(addr) \ -( \ - ( (addr[0] == 0xff) && (addr[1] == 0xff) && \ - (addr[2] == 0xff) && (addr[3] == 0xff) && \ - (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \ -) + (\ + ((addr[0] == 0xff) && (addr[1] == 0xff) && \ + (addr[2] == 0xff) && (addr[3] == 0xff) && \ + (addr[4] == 0xff) && (addr[5] == 0xff)) ? _TRUE : _FALSE \ + ) u8 rtw_validate_bssid(u8 *bssid) { u8 ret = _TRUE; if (is_zero_mac_addr(bssid) - || is_broadcast_mac_addr(bssid) - || is_multicast_mac_addr(bssid) - ) { + || is_broadcast_mac_addr(bssid) + || is_multicast_mac_addr(bssid) + ) ret = _FALSE; - } return ret; } @@ -49,162 +48,136 @@ u8 rtw_validate_bssid(u8 *bssid) u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid) { u8 i; - u8 ret=_TRUE; + u8 ret = _TRUE; -_func_enter_; if (ssid->SsidLength > 32) { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid length >32\n")); - ret= _FALSE; + ret = _FALSE; goto exit; } #ifdef CONFIG_VALIDATE_SSID - for(i = 0; i < ssid->SsidLength; i++) - { - //wifi, printable ascii code must be supported - if(!( (ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e) )){ - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid has nonprintabl ascii\n")); - ret= _FALSE; + for (i = 0; i < ssid->SsidLength; i++) { + /* wifi, printable ascii code must be supported */ + if (!((ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e))) { + ret = _FALSE; break; } } #endif /* CONFIG_VALIDATE_SSID */ -exit: +exit: -_func_exit_; return ret; } -u8 rtw_do_join(_adapter * padapter); -u8 rtw_do_join(_adapter * padapter) +u8 rtw_do_join(_adapter *padapter); +u8 rtw_do_join(_adapter *padapter) { _irqL irqL; _list *plist, *phead; - u8* pibss = NULL; + u8 *pibss = NULL; struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); _queue *queue = &(pmlmepriv->scanned_queue); - u8 ret=_SUCCESS; + u8 ret = _SUCCESS; -_func_enter_; _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); phead = get_list_head(queue); plist = get_next(phead); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("\n rtw_do_join: phead = %p; plist = %p \n\n\n", phead, plist)); pmlmepriv->cur_network.join_res = -2; - + set_fwstate(pmlmepriv, _FW_UNDER_LINKING); pmlmepriv->pscanned = plist; pmlmepriv->to_join = _TRUE; - if(_rtw_queue_empty(queue)== _TRUE) - { + if (_rtw_queue_empty(queue) == _TRUE) { _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - - //when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty - //we try to issue sitesurvey firstly - - if (pmlmepriv->LinkDetectInfo.bBusyTraffic ==_FALSE - || rtw_to_roam(padapter) > 0 - ) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_do_join(): site survey if scanned_queue is empty\n.")); - // submit site_survey_cmd - if(_SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)) ) { + + /* when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty */ + /* we try to issue sitesurvey firstly */ + + if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _FALSE + || rtw_to_roam(padapter) > 0 + ) { + /* submit site_survey_cmd */ + ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0); + if (_SUCCESS != ret) { pmlmepriv->to_join = _FALSE; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_do_join(): site survey return error\n.")); } - } - else - { + } else { pmlmepriv->to_join = _FALSE; ret = _FAIL; } - + goto exit; - } - else - { + } else { int select_ret; _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - if((select_ret=rtw_select_and_join_from_scanned_queue(pmlmepriv))==_SUCCESS) - { + select_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv); + if (select_ret == _SUCCESS) { pmlmepriv->to_join = _FALSE; _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); - } - else - { - if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE) - { - // submit createbss_cmd to change to a ADHOC_MASTER + } else { + if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) { + /* submit createbss_cmd to change to a ADHOC_MASTER */ - //pmlmepriv->lock has been acquired by caller... + /* pmlmepriv->lock has been acquired by caller... */ WLAN_BSSID_EX *pdev_network = &(padapter->registrypriv.dev_network); - pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; - + /*pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;*/ + init_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE); + pibss = padapter->registrypriv.dev_network.MacAddress; _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); - + rtw_update_registrypriv_dev_network(padapter); rtw_generate_random_ibss(pibss); - + if (rtw_create_ibss_cmd(padapter, 0) != _SUCCESS) { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("***Error=>do_goin: rtw_create_ibss_cmd status FAIL***\n")); ret = _FALSE; goto exit; } - pmlmepriv->to_join = _FALSE; + pmlmepriv->to_join = _FALSE; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("***Error=> rtw_select_and_join_from_scanned_queue FAIL under STA_Mode*** \n ")); - } - else - { - // can't associate ; reset under-linking + } else { + /* can't associate ; reset under-linking */ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); -#if 0 - if((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) - { - if(_rtw_memcmp(pmlmepriv->cur_network.network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength)) - { - // for funk to do roaming - // funk will reconnect, but funk will not sitesurvey before reconnect - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("for funk to do roaming")); - if(pmlmepriv->sitesurveyctrl.traffic_busy==_FALSE) +#if 0 + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) { + if (_rtw_memcmp(pmlmepriv->cur_network.network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength)) { + /* for funk to do roaming */ + /* funk will reconnect, but funk will not sitesurvey before reconnect */ + if (pmlmepriv->sitesurveyctrl.traffic_busy == _FALSE) rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0); } - - } + + } #endif - //when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue - //we try to issue sitesurvey firstly - if(pmlmepriv->LinkDetectInfo.bBusyTraffic==_FALSE - || rtw_to_roam(padapter) > 0 - ) - { - //DBG_871X("rtw_do_join() when no desired bss in scanning queue \n"); - if( _SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)) ){ + /* when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue */ + /* we try to issue sitesurvey firstly */ + if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _FALSE + || rtw_to_roam(padapter) > 0 + ) { + /* RTW_INFO("rtw_do_join() when no desired bss in scanning queue\n"); */ + ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0); + if (_SUCCESS != ret) { pmlmepriv->to_join = _FALSE; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("do_join(): site survey return error\n.")); } - } - else - { + } else { ret = _FAIL; pmlmepriv->to_join = _FALSE; } @@ -213,162 +186,133 @@ _func_enter_; } } - -exit: - -_func_exit_; - return ret; +exit: + + return ret; } #ifdef PLATFORM_WINDOWS -u8 rtw_pnp_set_power_wakeup(_adapter* padapter) +u8 rtw_pnp_set_power_wakeup(_adapter *padapter) { - u8 res=_SUCCESS; + u8 res = _SUCCESS; + -_func_enter_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("==>rtw_pnp_set_power_wakeup!!!\n")); - res = rtw_setstandby_cmd(padapter, 0); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<==rtw_pnp_set_power_wakeup!!!\n")); -_func_exit_; - + return res; } -u8 rtw_pnp_set_power_sleep(_adapter* padapter) +u8 rtw_pnp_set_power_sleep(_adapter *padapter) { - u8 res=_SUCCESS; - -_func_enter_; + u8 res = _SUCCESS; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("==>rtw_pnp_set_power_sleep!!!\n")); - //DbgPrint("+rtw_pnp_set_power_sleep\n"); + + /* DbgPrint("+rtw_pnp_set_power_sleep\n"); */ res = rtw_setstandby_cmd(padapter, 1); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<==rtw_pnp_set_power_sleep!!!\n")); -_func_exit_; return res; } -u8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults) +u8 rtw_set_802_11_reload_defaults(_adapter *padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults) { -_func_enter_; - switch( reloadDefaults) - { - case Ndis802_11ReloadWEPKeys: - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("SetInfo OID_802_11_RELOAD_DEFAULTS : Ndis802_11ReloadWEPKeys\n")); - break; - } - // SecClearAllKeys(Adapter); - // 8711 CAM was not for En/Decrypt only - // so, we can't clear all keys. - // should we disable WPAcfg (ox0088) bit 1-2, instead of clear all CAM - - //TO DO... -_func_exit_; - + /* SecClearAllKeys(Adapter); */ + /* 8711 CAM was not for En/Decrypt only */ + /* so, we can't clear all keys. */ + /* should we disable WPAcfg (ox0088) bit 1-2, instead of clear all CAM */ + + /* TO DO... */ + + return _TRUE; } -u8 set_802_11_test(_adapter* padapter, NDIS_802_11_TEST *test) +u8 set_802_11_test(_adapter *padapter, NDIS_802_11_TEST *test) { - u8 ret=_TRUE; - -_func_enter_; + u8 ret = _TRUE; - switch(test->Type) - { - case 1: - NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->AuthenticationEvent, test->Length - 8); - NdisMIndicateStatusComplete(padapter->hndis_adapter); - break; - case 2: - NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->RssiTrigger, sizeof(NDIS_802_11_RSSI)); - NdisMIndicateStatusComplete(padapter->hndis_adapter); - break; + switch (test->Type) { + case 1: + NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->AuthenticationEvent, test->Length - 8); + NdisMIndicateStatusComplete(padapter->hndis_adapter); + break; - default: - ret=_FALSE; - break; + case 2: + NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->RssiTrigger, sizeof(NDIS_802_11_RSSI)); + NdisMIndicateStatusComplete(padapter->hndis_adapter); + break; + + default: + ret = _FALSE; + break; } -_func_exit_; - return ret; + return ret; } -u8 rtw_set_802_11_pmkid(_adapter* padapter, NDIS_802_11_PMKID *pmkid) +u8 rtw_set_802_11_pmkid(_adapter *padapter, NDIS_802_11_PMKID *pmkid) { - u8 ret=_SUCCESS; + u8 ret = _SUCCESS; return ret; } #endif -u8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid) -{ - _irqL irqL; - u8 status=_SUCCESS; +u8 rtw_set_802_11_bssid(_adapter *padapter, u8 *bssid) +{ + _irqL irqL; + u8 status = _SUCCESS; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - -_func_enter_; - - DBG_871X_LEVEL(_drv_always_, "set bssid:%pM\n", bssid); - if ((bssid[0]==0x00 && bssid[1]==0x00 && bssid[2]==0x00 && bssid[3]==0x00 && bssid[4]==0x00 &&bssid[5]==0x00) || - (bssid[0]==0xFF && bssid[1]==0xFF && bssid[2]==0xFF && bssid[3]==0xFF && bssid[4]==0xFF &&bssid[5]==0xFF)) - { + + RTW_PRINT("set bssid:%pM\n", bssid); + + if ((bssid[0] == 0x00 && bssid[1] == 0x00 && bssid[2] == 0x00 && bssid[3] == 0x00 && bssid[4] == 0x00 && bssid[5] == 0x00) || + (bssid[0] == 0xFF && bssid[1] == 0xFF && bssid[2] == 0xFF && bssid[3] == 0xFF && bssid[4] == 0xFF && bssid[5] == 0xFF)) { status = _FAIL; goto exit; } - + _enter_critical_bh(&pmlmepriv->lock, &irqL); - DBG_871X("Set BSSID under fw_state=0x%08x\n", get_fwstate(pmlmepriv)); - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { + RTW_INFO("Set BSSID under fw_state=0x%08x\n", get_fwstate(pmlmepriv)); + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) goto handle_tkip_countermeasure; - } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) goto release_mlme_lock; - } - if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_bssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n")); + if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE) == _TRUE) { - if (_rtw_memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN) == _TRUE) - { + if (_rtw_memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN) == _TRUE) { if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE) - goto release_mlme_lock;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. + goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */ } else { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("Set BSSID not the same bssid\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_bssid="MAC_FMT"\n", MAC_ARG(bssid) )); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("cur_bssid="MAC_FMT"\n", MAC_ARG(pmlmepriv->cur_network.network.MacAddress) )); rtw_disassoc_cmd(padapter, 0, _TRUE); if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - } + } } } @@ -380,115 +324,89 @@ handle_tkip_countermeasure: _rtw_memset(&pmlmepriv->assoc_ssid, 0, sizeof(NDIS_802_11_SSID)); _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN); - pmlmepriv->assoc_by_bssid=_TRUE; + pmlmepriv->assoc_by_bssid = _TRUE; - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { - pmlmepriv->to_join = _TRUE; - } - else { + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + pmlmepriv->to_join = _TRUE; + else status = rtw_do_join(padapter); - } release_mlme_lock: _exit_critical_bh(&pmlmepriv->lock, &irqL); - + exit: - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - ("rtw_set_802_11_bssid: status=%d\n", status)); - -_func_exit_; + return status; } -u8 rtw_set_802_11_ssid(_adapter* padapter, NDIS_802_11_SSID *ssid) -{ +u8 rtw_set_802_11_ssid(_adapter *padapter, NDIS_802_11_SSID *ssid) +{ _irqL irqL; u8 status = _SUCCESS; u32 cur_time = 0; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct wlan_network *pnetwork = &pmlmepriv->cur_network; - -_func_enter_; - - DBG_871X_LEVEL(_drv_always_, "set ssid [%s] fw_state=0x%08x\n", - ssid->Ssid, get_fwstate(pmlmepriv)); + + + RTW_PRINT("set ssid [%s] fw_state=0x%08x\n", + ssid->Ssid, get_fwstate(pmlmepriv)); if (!rtw_is_hw_init_completed(padapter)) { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - ("set_ssid: hw_init_completed==_FALSE=>exit!!!\n")); status = _FAIL; goto exit; } - + _enter_critical_bh(&pmlmepriv->lock, &irqL); - DBG_871X("Set SSID under fw_state=0x%08x\n", get_fwstate(pmlmepriv)); - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { + RTW_INFO("Set SSID under fw_state=0x%08x\n", get_fwstate(pmlmepriv)); + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) goto handle_tkip_countermeasure; - } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) goto release_mlme_lock; - } - if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - ("set_ssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n")); + if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE) == _TRUE) { if ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) && - (_rtw_memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength) == _TRUE)) - { - if((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE)) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - ("Set SSID is the same ssid, fw_state=0x%08x\n", - get_fwstate(pmlmepriv))); + (_rtw_memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength) == _TRUE)) { + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE)) { - if(rtw_is_same_ibss(padapter, pnetwork) == _FALSE) - { - //if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again + if (rtw_is_same_ibss(padapter, pnetwork) == _FALSE) { + /* if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again */ rtw_disassoc_cmd(padapter, 0, _TRUE); if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - rtw_indicate_disconnect(padapter); - + rtw_indicate_disconnect(padapter, 0, _FALSE); + rtw_free_assoc_resources(padapter, 1); if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) { _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); } - } - else - { - goto release_mlme_lock;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. + } else { + goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */ } } #ifdef CONFIG_LPS - else { + else rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_JOINBSS, 1); - } #endif - } - else - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("Set SSID not the same ssid\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_ssid=[%s] len=0x%x\n", ssid->Ssid, (unsigned int)ssid->SsidLength)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("assoc_ssid=[%s] len=0x%x\n", pmlmepriv->assoc_ssid.Ssid, (unsigned int)pmlmepriv->assoc_ssid.SsidLength)); + } else { rtw_disassoc_cmd(padapter, 0, _TRUE); if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - rtw_indicate_disconnect(padapter); - + rtw_indicate_disconnect(padapter, 0, _FALSE); + rtw_free_assoc_resources(padapter, 1); if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) { _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); } - } + } } handle_tkip_countermeasure: @@ -503,29 +421,24 @@ handle_tkip_countermeasure: } _rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID)); - pmlmepriv->assoc_by_bssid=_FALSE; + pmlmepriv->assoc_by_bssid = _FALSE; - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { - pmlmepriv->to_join = _TRUE; - } - else { + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + pmlmepriv->to_join = _TRUE; + else status = rtw_do_join(padapter); - } release_mlme_lock: _exit_critical_bh(&pmlmepriv->lock, &irqL); exit: - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - ("-rtw_set_802_11_ssid: status=%d\n", status)); - -_func_exit_; + return status; - + } -u8 rtw_set_802_11_connect(_adapter* padapter, u8 *bssid, NDIS_802_11_SSID *ssid) +u8 rtw_set_802_11_connect(_adapter *padapter, u8 *bssid, NDIS_802_11_SSID *ssid) { _irqL irqL; u8 status = _SUCCESS; @@ -534,7 +447,6 @@ u8 rtw_set_802_11_connect(_adapter* padapter, u8 *bssid, NDIS_802_11_SSID *ssid) bool ssid_valid = _TRUE; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -_func_enter_; if (!ssid || rtw_validate_ssid(ssid) == _FALSE) ssid_valid = _FALSE; @@ -543,29 +455,26 @@ _func_enter_; bssid_valid = _FALSE; if (ssid_valid == _FALSE && bssid_valid == _FALSE) { - DBG_871X(FUNC_ADPT_FMT" ssid:%p, ssid_valid:%d, bssid:%p, bssid_valid:%d\n", + RTW_INFO(FUNC_ADPT_FMT" ssid:%p, ssid_valid:%d, bssid:%p, bssid_valid:%d\n", FUNC_ADPT_ARG(padapter), ssid, ssid_valid, bssid, bssid_valid); status = _FAIL; goto exit; } if (!rtw_is_hw_init_completed(padapter)) { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - ("set_ssid: hw_init_completed==_FALSE=>exit!!!\n")); status = _FAIL; goto exit; } _enter_critical_bh(&pmlmepriv->lock, &irqL); - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" fw_state=0x%08x\n", - FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv)); + RTW_PRINT(FUNC_ADPT_FMT" fw_state=0x%08x\n", + FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv)); - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) goto handle_tkip_countermeasure; - } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) goto release_mlme_lock; - } handle_tkip_countermeasure: if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) { @@ -581,113 +490,96 @@ handle_tkip_countermeasure: if (bssid && bssid_valid) { _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN); pmlmepriv->assoc_by_bssid = _TRUE; - } else { + } else pmlmepriv->assoc_by_bssid = _FALSE; - } - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { - pmlmepriv->to_join = _TRUE; - } - else { + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + pmlmepriv->to_join = _TRUE; + else status = rtw_do_join(padapter); - } release_mlme_lock: _exit_critical_bh(&pmlmepriv->lock, &irqL); exit: - -_func_exit_; + return status; } -u8 rtw_set_802_11_infrastructure_mode(_adapter* padapter, - NDIS_802_11_NETWORK_INFRASTRUCTURE networktype) +u8 rtw_set_802_11_infrastructure_mode(_adapter *padapter, + NDIS_802_11_NETWORK_INFRASTRUCTURE networktype) { _irqL irqL; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct wlan_network *cur_network = &pmlmepriv->cur_network; - NDIS_802_11_NETWORK_INFRASTRUCTURE* pold_state = &(cur_network->network.InfrastructureMode); - -_func_enter_; + NDIS_802_11_NETWORK_INFRASTRUCTURE *pold_state = &(cur_network->network.InfrastructureMode); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_notice_, - ("+rtw_set_802_11_infrastructure_mode: old=%d new=%d fw_state=0x%08x\n", - *pold_state, networktype, get_fwstate(pmlmepriv))); - - if(*pold_state != networktype) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(" change mode!")); - //DBG_871X("change mode, old_mode=%d, new_mode=%d, fw_state=0x%x\n", *pold_state, networktype, get_fwstate(pmlmepriv)); - if(*pold_state==Ndis802_11APMode) - { - //change to other mode from Ndis802_11APMode + + if (*pold_state != networktype) { + /* RTW_INFO("change mode, old_mode=%d, new_mode=%d, fw_state=0x%x\n", *pold_state, networktype, get_fwstate(pmlmepriv)); */ + + if (*pold_state == Ndis802_11APMode) { + /* change to other mode from Ndis802_11APMode */ cur_network->join_res = -1; - + #ifdef CONFIG_NATIVEAP_MLME stop_ap_mode(padapter); #endif } _enter_critical_bh(&pmlmepriv->lock, &irqL); - - if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) ||(*pold_state==Ndis802_11IBSS)) + + if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) || (*pold_state == Ndis802_11IBSS)) rtw_disassoc_cmd(padapter, 0, _TRUE); - if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)== _TRUE) ) + if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) rtw_free_assoc_resources(padapter, 1); - if((*pold_state == Ndis802_11Infrastructure) ||(*pold_state == Ndis802_11IBSS)) - { - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - rtw_indicate_disconnect(padapter); //will clr Linked_state; before this function, we must have chked whether issue dis-assoc_cmd or not + if ((*pold_state == Ndis802_11Infrastructure) || (*pold_state == Ndis802_11IBSS)) { + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { + rtw_indicate_disconnect(padapter, 0, _FALSE); /*will clr Linked_state; before this function, we must have checked whether issue dis-assoc_cmd or not*/ } - } - + } + *pold_state = networktype; _clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE); - - switch(networktype) - { - case Ndis802_11IBSS: - set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - break; - - case Ndis802_11Infrastructure: - set_fwstate(pmlmepriv, WIFI_STATION_STATE); - break; - - case Ndis802_11APMode: - set_fwstate(pmlmepriv, WIFI_AP_STATE); -#ifdef CONFIG_NATIVEAP_MLME - start_ap_mode(padapter); - //rtw_indicate_connect(padapter); -#endif - - break; - case Ndis802_11AutoUnknown: - case Ndis802_11InfrastructureMax: - break; - case Ndis802_11Monitor: - set_fwstate(pmlmepriv, WIFI_MONITOR_STATE); - break; + switch (networktype) { + case Ndis802_11IBSS: + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + break; + + case Ndis802_11Infrastructure: + set_fwstate(pmlmepriv, WIFI_STATION_STATE); + break; + + case Ndis802_11APMode: + set_fwstate(pmlmepriv, WIFI_AP_STATE); +#ifdef CONFIG_NATIVEAP_MLME + start_ap_mode(padapter); + /* rtw_indicate_connect(padapter); */ +#endif + + break; + + case Ndis802_11AutoUnknown: + case Ndis802_11InfrastructureMax: + break; + case Ndis802_11Monitor: + set_fwstate(pmlmepriv, WIFI_MONITOR_STATE); + break; } - //SecClearAllKeys(adapter); - - //RT_TRACE(COMP_OID_SET, DBG_LOUD, ("set_infrastructure: fw_state:%x after changing mode\n", - // get_fwstate(pmlmepriv) )); + /* SecClearAllKeys(adapter); */ + _exit_critical_bh(&pmlmepriv->lock, &irqL); } -_func_exit_; return _TRUE; } @@ -696,548 +588,445 @@ _func_exit_; u8 rtw_set_802_11_disassociate(_adapter *padapter) { _irqL irqL; - struct mlme_priv * pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -_func_enter_; _enter_critical_bh(&pmlmepriv->lock, &irqL); - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_disassociate: rtw_indicate_disconnect\n")); + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { rtw_disassoc_cmd(padapter, 0, _TRUE); - rtw_indicate_disconnect(padapter); - //modify for CONFIG_IEEE80211W, none 11w can use it + rtw_indicate_disconnect(padapter, 0, _FALSE); + /* modify for CONFIG_IEEE80211W, none 11w can use it */ rtw_free_assoc_resources_cmd(padapter); if (_FAIL == rtw_pwr_wakeup(padapter)) - DBG_871X("%s(): rtw_pwr_wakeup fail !!!\n",__FUNCTION__); + RTW_INFO("%s(): rtw_pwr_wakeup fail !!!\n", __FUNCTION__); } _exit_critical_bh(&pmlmepriv->lock, &irqL); - -_func_exit_; - return _TRUE; + + return _TRUE; } -u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter, NDIS_802_11_SSID *pssid, int ssid_max_num) -{ +#if 1 +u8 rtw_set_802_11_bssid_list_scan(_adapter *padapter, NDIS_802_11_SSID *pssid, int ssid_max_num, struct rtw_ieee80211_channel *ch, int ch_num) +{ _irqL irqL; - struct mlme_priv *pmlmepriv= &padapter->mlmepriv; - u8 res=_TRUE; - -_func_enter_; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 res = _TRUE; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + res = rtw_sitesurvey_cmd(padapter, pssid, ssid_max_num, ch, ch_num); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + return res; +} + +#else +u8 rtw_set_802_11_bssid_list_scan(_adapter *padapter, NDIS_802_11_SSID *pssid, int ssid_max_num, struct rtw_ieee80211_channel *ch, int ch_num) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 res = _TRUE; + - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("+rtw_set_802_11_bssid_list_scan(), fw_state=%x\n", get_fwstate(pmlmepriv))); if (padapter == NULL) { - res=_FALSE; + res = _FALSE; goto exit; } if (!rtw_is_hw_init_completed(padapter)) { res = _FALSE; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n===rtw_set_802_11_bssid_list_scan:hw_init_completed==_FALSE===\n")); goto exit; } - - if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) || - (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)) - { - // Scan or linking is in progress, do nothing. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_bssid_list_scan fail since fw_state = %x\n", get_fwstate(pmlmepriv))); + + if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING) == _TRUE) || + (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)) { + /* Scan or linking is in progress, do nothing. */ res = _TRUE; - if(check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE){ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n###_FW_UNDER_SURVEY|_FW_UNDER_LINKING\n\n")); - } else { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n###pmlmepriv->sitesurveyctrl.traffic_busy==_TRUE\n\n")); - } - } else { + + } else { if (rtw_is_scan_deny(padapter)) { - DBG_871X(FUNC_ADPT_FMT": scan deny\n", FUNC_ADPT_ARG(padapter)); + RTW_INFO(FUNC_ADPT_FMT": scan deny\n", FUNC_ADPT_ARG(padapter)); indicate_wx_scan_complete_event(padapter); return _SUCCESS; } - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - res = rtw_sitesurvey_cmd(padapter, pssid, ssid_max_num, NULL, 0); - + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + res = rtw_sitesurvey_cmd(padapter, pssid, ssid_max_num, NULL, 0, ch, ch_num); + _exit_critical_bh(&pmlmepriv->lock, &irqL); } exit: - -_func_exit_; - return res; + + return res; } - -u8 rtw_set_802_11_authentication_mode(_adapter* padapter, NDIS_802_11_AUTHENTICATION_MODE authmode) +#endif +u8 rtw_set_802_11_authentication_mode(_adapter *padapter, NDIS_802_11_AUTHENTICATION_MODE authmode) { struct security_priv *psecuritypriv = &padapter->securitypriv; int res; u8 ret; - -_func_enter_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_802_11_auth.mode(): mode=%x\n", authmode)); - psecuritypriv->ndisauthtype=authmode; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_authentication_mode:psecuritypriv->ndisauthtype=%d", psecuritypriv->ndisauthtype)); - - if(psecuritypriv->ndisauthtype>3) - psecuritypriv->dot11AuthAlgrthm=dot11AuthAlgrthm_8021X; - + + psecuritypriv->ndisauthtype = authmode; + + + if (psecuritypriv->ndisauthtype > 3) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + #ifdef CONFIG_WAPI_SUPPORT - if(psecuritypriv->ndisauthtype == 6) - psecuritypriv->dot11AuthAlgrthm=dot11AuthAlgrthm_WAPI; + if (psecuritypriv->ndisauthtype == 6) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; #endif - res=rtw_set_auth(padapter,psecuritypriv); - - if(res==_SUCCESS) - ret=_TRUE; + res = rtw_set_auth(padapter, psecuritypriv); + + if (res == _SUCCESS) + ret = _TRUE; else - ret=_FALSE; - -_func_exit_; + ret = _FALSE; + return ret; } -u8 rtw_set_802_11_add_wep(_adapter* padapter, NDIS_802_11_WEP *wep){ +u8 rtw_set_802_11_add_wep(_adapter *padapter, NDIS_802_11_WEP *wep) +{ u8 bdefaultkey; u8 btransmitkey; - sint keyid,res; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - u8 ret=_SUCCESS; + sint keyid, res; + struct security_priv *psecuritypriv = &(padapter->securitypriv); + u8 ret = _SUCCESS; -_func_enter_; - bdefaultkey=(wep->KeyIndex & 0x40000000) > 0 ? _FALSE : _TRUE; //for ??? - btransmitkey= (wep->KeyIndex & 0x80000000) > 0 ? _TRUE : _FALSE; //for ??? - keyid=wep->KeyIndex & 0x3fffffff; + bdefaultkey = (wep->KeyIndex & 0x40000000) > 0 ? _FALSE : _TRUE; /* for ??? */ + btransmitkey = (wep->KeyIndex & 0x80000000) > 0 ? _TRUE : _FALSE; /* for ??? */ + keyid = wep->KeyIndex & 0x3fffffff; - if(keyid>=4) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("MgntActrtw_set_802_11_add_wep:keyid>4=>fail\n")); - ret=_FALSE; + if (keyid >= 4) { + ret = _FALSE; goto exit; } - - switch(wep->KeyLength) - { - case 5: - psecuritypriv->dot11PrivacyAlgrthm=_WEP40_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength=5\n")); - break; - case 13: - psecuritypriv->dot11PrivacyAlgrthm=_WEP104_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength=13\n")); - break; - default: - psecuritypriv->dot11PrivacyAlgrthm=_NO_PRIVACY_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength!=5 or 13\n")); - break; + + switch (wep->KeyLength) { + case 5: + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; + break; + case 13: + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; + break; + default: + psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + break; } - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_wep:befor memcpy, wep->KeyLength=0x%x wep->KeyIndex=0x%x keyid =%x\n",wep->KeyLength,wep->KeyIndex,keyid)); - _rtw_memcpy(&(psecuritypriv->dot11DefKey[keyid].skey[0]),&(wep->KeyMaterial),wep->KeyLength); - psecuritypriv->dot11DefKeylen[keyid]=wep->KeyLength; + _rtw_memcpy(&(psecuritypriv->dot11DefKey[keyid].skey[0]), &(wep->KeyMaterial), wep->KeyLength); - psecuritypriv->dot11PrivacyKeyIndex=keyid; + psecuritypriv->dot11DefKeylen[keyid] = wep->KeyLength; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_wep:security key material : %x %x %x %x %x %x %x %x %x %x %x %x %x \n", - psecuritypriv->dot11DefKey[keyid].skey[0],psecuritypriv->dot11DefKey[keyid].skey[1],psecuritypriv->dot11DefKey[keyid].skey[2], - psecuritypriv->dot11DefKey[keyid].skey[3],psecuritypriv->dot11DefKey[keyid].skey[4],psecuritypriv->dot11DefKey[keyid].skey[5], - psecuritypriv->dot11DefKey[keyid].skey[6],psecuritypriv->dot11DefKey[keyid].skey[7],psecuritypriv->dot11DefKey[keyid].skey[8], - psecuritypriv->dot11DefKey[keyid].skey[9],psecuritypriv->dot11DefKey[keyid].skey[10],psecuritypriv->dot11DefKey[keyid].skey[11], - psecuritypriv->dot11DefKey[keyid].skey[12])); + psecuritypriv->dot11PrivacyKeyIndex = keyid; - res=rtw_set_key(padapter,psecuritypriv, keyid, 1, _TRUE); - - if(res==_FAIL) - ret= _FALSE; + + res = rtw_set_key(padapter, psecuritypriv, keyid, 1, _TRUE); + + if (res == _FAIL) + ret = _FALSE; exit: - -_func_exit_; + return ret; - + } -u8 rtw_set_802_11_remove_wep(_adapter* padapter, u32 keyindex){ - - u8 ret=_SUCCESS; - -_func_enter_; +u8 rtw_set_802_11_remove_wep(_adapter *padapter, u32 keyindex) +{ - if (keyindex >= 0x80000000 || padapter == NULL){ - - ret=_FALSE; + u8 ret = _SUCCESS; + + + if (keyindex >= 0x80000000 || padapter == NULL) { + + ret = _FALSE; goto exit; - } - else - { + } else { int res; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - if( keyindex < 4 ){ - + struct security_priv *psecuritypriv = &(padapter->securitypriv); + if (keyindex < 4) { + _rtw_memset(&psecuritypriv->dot11DefKey[keyindex], 0, 16); - - res=rtw_set_key(padapter,psecuritypriv,keyindex, 0, _TRUE); - - psecuritypriv->dot11DefKeylen[keyindex]=0; - - if(res==_FAIL) - ret=_FAIL; - - } - else - { - ret=_FAIL; - } - + + res = rtw_set_key(padapter, psecuritypriv, keyindex, 0, _TRUE); + + psecuritypriv->dot11DefKeylen[keyindex] = 0; + + if (res == _FAIL) + ret = _FAIL; + + } else + ret = _FAIL; + } - -exit: - -_func_exit_; + +exit: + return ret; - + } -u8 rtw_set_802_11_add_key(_adapter* padapter, NDIS_802_11_KEY *key){ +u8 rtw_set_802_11_add_key(_adapter *padapter, NDIS_802_11_KEY *key) +{ uint encryptionalgo; - u8 * pbssid; + u8 *pbssid; struct sta_info *stainfo; u8 bgroup = _FALSE; - u8 bgrouptkey = _FALSE;//can be remove later - u8 ret=_SUCCESS; - -_func_enter_; + u8 bgrouptkey = _FALSE;/* can be remove later */ + u8 ret = _SUCCESS; - if (((key->KeyIndex & 0x80000000) == 0) && ((key->KeyIndex & 0x40000000) > 0)){ - // It is invalid to clear bit 31 and set bit 30. If the miniport driver encounters this combination, - // it must fail the request and return NDIS_STATUS_INVALID_DATA. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key: ((key->KeyIndex & 0x80000000) == 0)[=%d] ",(int)(key->KeyIndex & 0x80000000) == 0)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key:((key->KeyIndex & 0x40000000) > 0)[=%d]" , (int)(key->KeyIndex & 0x40000000) > 0)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key: key->KeyIndex=%d \n" ,(int)key->KeyIndex)); - ret= _FAIL; + if (((key->KeyIndex & 0x80000000) == 0) && ((key->KeyIndex & 0x40000000) > 0)) { + + /* It is invalid to clear bit 31 and set bit 30. If the miniport driver encounters this combination, */ + /* it must fail the request and return NDIS_STATUS_INVALID_DATA. */ + ret = _FAIL; goto exit; } - if(key->KeyIndex & 0x40000000) - { - // Pairwise key + if (key->KeyIndex & 0x40000000) { + /* Pairwise key */ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ Pairwise key +++++\n")); - - pbssid=get_bssid(&padapter->mlmepriv); - stainfo=rtw_get_stainfo(&padapter->stapriv, pbssid); - if((stainfo!=NULL)&&(padapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)){ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY:( stainfo!=NULL)&&(Adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)\n")); - encryptionalgo=stainfo->dot118021XPrivacy; - } - else{ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: stainfo==NULL)||(Adapter->securitypriv.dot11AuthAlgrthm!=dot11AuthAlgrthm_8021X)\n")); - encryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm; + pbssid = get_bssid(&padapter->mlmepriv); + stainfo = rtw_get_stainfo(&padapter->stapriv, pbssid); + + if ((stainfo != NULL) && (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)) { + encryptionalgo = stainfo->dot118021XPrivacy; + } else { + encryptionalgo = padapter->securitypriv.dot11PrivacyAlgrthm; } - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (encryptionalgo ==%d)!\n",encryptionalgo )); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11PrivacyAlgrthm ==%d)!\n",padapter->securitypriv.dot11PrivacyAlgrthm)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11AuthAlgrthm ==%d)!\n",padapter->securitypriv.dot11AuthAlgrthm)); - if((stainfo!=NULL)){ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (stainfo->dot118021XPrivacy ==%d)!\n", stainfo->dot118021XPrivacy)); - } - - if(key->KeyIndex & 0x000000FF){ - // The key index is specified in the lower 8 bits by values of zero to 255. - // The key index should be set to zero for a Pairwise key, and the driver should fail with - // NDIS_STATUS_INVALID_DATA if the lower 8 bits is not zero - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" key->KeyIndex & 0x000000FF.\n")); - ret= _FAIL; + + + if (key->KeyIndex & 0x000000FF) { + /* The key index is specified in the lower 8 bits by values of zero to 255. */ + /* The key index should be set to zero for a Pairwise key, and the driver should fail with */ + /* NDIS_STATUS_INVALID_DATA if the lower 8 bits is not zero */ + ret = _FAIL; goto exit; } - // check BSSID - if (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _TRUE){ + /* check BSSID */ + if (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _TRUE) { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("MacAddr_isBcst(key->BSSID)\n")); - ret= _FALSE; + ret = _FALSE; goto exit; } - // Check key length for TKIP. - //if(encryptionAlgorithm == RT_ENC_TKIP_ENCRYPTION && key->KeyLength != 32) - if((encryptionalgo== _TKIP_)&& (key->KeyLength != 32)){ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("TKIP KeyLength:0x%x != 32\n", key->KeyLength)); - ret=_FAIL; + /* Check key length for TKIP. */ + /* if(encryptionAlgorithm == RT_ENC_TKIP_ENCRYPTION && key->KeyLength != 32) */ + if ((encryptionalgo == _TKIP_) && (key->KeyLength != 32)) { + ret = _FAIL; goto exit; } - // Check key length for AES. - if((encryptionalgo== _AES_)&& (key->KeyLength != 16)) { - // For our supplicant, EAPPkt9x.vxd, cannot differentiate TKIP and AES case. - if(key->KeyLength == 32) { - key->KeyLength = 16; - } else { - ret= _FAIL; + /* Check key length for AES. */ + if ((encryptionalgo == _AES_) && (key->KeyLength != 16)) { + /* For our supplicant, EAPPkt9x.vxd, cannot differentiate TKIP and AES case. */ + if (key->KeyLength == 32) + key->KeyLength = 16; + else { + ret = _FAIL; goto exit; } } /* 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; + ret = _FAIL; goto exit; } bgroup = _FALSE; - // Check the pairwise key. Added by Annie, 2005-07-06. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("[Pairwise Key set]\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key index: 0x%8x(0x%8x)\n", key->KeyIndex,(key->KeyIndex&0x3))); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key Length: %d\n", key->KeyLength)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); - - } - else - { - // Group key - KeyIndex(BIT30==0) - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ Group key +++++\n")); + /* Check the pairwise key. Added by Annie, 2005-07-06. */ + + } else { + /* Group key - KeyIndex(BIT30==0) */ - // when add wep key through add key and didn't assigned encryption type before - if((padapter->securitypriv.ndisauthtype<=3)&&(padapter->securitypriv.dot118021XGrpPrivacy==0)) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("keylen=%d( Adapter->securitypriv.dot11PrivacyAlgrthm=%x )padapter->securitypriv.dot118021XGrpPrivacy(%x)\n", key->KeyLength,padapter->securitypriv.dot11PrivacyAlgrthm,padapter->securitypriv.dot118021XGrpPrivacy)); + /* when add wep key through add key and didn't assigned encryption type before */ + if ((padapter->securitypriv.ndisauthtype <= 3) && (padapter->securitypriv.dot118021XGrpPrivacy == 0)) { - switch(key->KeyLength) - { - case 5: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength)); - break; - case 13: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength)); - break; - default: - padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u \n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength)); - break; + switch (key->KeyLength) { + case 5: + padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_; + break; + case 13: + padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_; + break; + default: + padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; + break; } - - encryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" Adapter->securitypriv.dot11PrivacyAlgrthm=%x\n", padapter->securitypriv.dot11PrivacyAlgrthm)); - - } - else - { - encryptionalgo=padapter->securitypriv.dot118021XGrpPrivacy; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("( Adapter->securitypriv.dot11PrivacyAlgrthm=%x )encryptionalgo(%x)=padapter->securitypriv.dot118021XGrpPrivacy(%x)keylen=%d\n", padapter->securitypriv.dot11PrivacyAlgrthm,encryptionalgo,padapter->securitypriv.dot118021XGrpPrivacy,key->KeyLength)); + + encryptionalgo = padapter->securitypriv.dot11PrivacyAlgrthm; + + + } else { + encryptionalgo = padapter->securitypriv.dot118021XGrpPrivacy; } - - if((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE) && (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _FALSE)) { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" IBSS but BSSID is not Broadcast Address.\n")); - ret= _FAIL; + + if ((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE) == _TRUE) && (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _FALSE)) { + ret = _FAIL; goto exit; } - // Check key length for TKIP - if((encryptionalgo== _TKIP_) && (key->KeyLength != 32)) { + /* Check key length for TKIP */ + if ((encryptionalgo == _TKIP_) && (key->KeyLength != 32)) { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" TKIP GTK KeyLength:%u != 32\n", key->KeyLength)); - ret= _FAIL; + ret = _FAIL; goto exit; - } else if(encryptionalgo== _AES_ && (key->KeyLength != 16 && key->KeyLength != 32) ) { - - // Check key length for AES - // For NDTEST, we allow keylen=32 in this case. 2005.01.27, by rcnjko. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<=== SetInfo, OID_802_11_ADD_KEY: AES GTK KeyLength:%u != 16 or 32\n", key->KeyLength)); - ret= _FAIL; + } else if (encryptionalgo == _AES_ && (key->KeyLength != 16 && key->KeyLength != 32)) { + + /* Check key length for AES */ + /* For NDTEST, we allow keylen=32 in this case. 2005.01.27, by rcnjko. */ + ret = _FAIL; goto exit; } - // Change the key length for EAPPkt9x.vxd. Added by Annie, 2005-11-03. - if((encryptionalgo== _AES_) && (key->KeyLength == 32) ) { - key->KeyLength = 16; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("AES key length changed: %u\n", key->KeyLength) ); + /* Change the key length for EAPPkt9x.vxd. Added by Annie, 2005-11-03. */ + if ((encryptionalgo == _AES_) && (key->KeyLength == 32)) { + key->KeyLength = 16; } - if(key->KeyIndex & 0x8000000) {//error ??? 0x8000_0000 + if (key->KeyIndex & 0x8000000) /* error ??? 0x8000_0000 */ bgrouptkey = _TRUE; - } - if((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE)&&(check_fwstate(&padapter->mlmepriv, _FW_LINKED)==_TRUE)) - { + if ((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE) == _TRUE) && (check_fwstate(&padapter->mlmepriv, _FW_LINKED) == _TRUE)) bgrouptkey = _TRUE; - } bgroup = _TRUE; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n") ); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("[Group Key set]\n") ); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")) ; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key index: 0x%8x(0x%8x)\n", key->KeyIndex,(key->KeyIndex&0x3))); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key Length: %d\n", key->KeyLength)) ; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); - - } - // If WEP encryption algorithm, just call rtw_set_802_11_add_wep(). - if((padapter->securitypriv.dot11AuthAlgrthm !=dot11AuthAlgrthm_8021X)&&(encryptionalgo== _WEP40_ || encryptionalgo== _WEP104_)) - { - u8 ret; - u32 keyindex; + } + + /* If WEP encryption algorithm, just call rtw_set_802_11_add_wep(). */ + if ((padapter->securitypriv.dot11AuthAlgrthm != dot11AuthAlgrthm_8021X) && (encryptionalgo == _WEP40_ || encryptionalgo == _WEP104_)) { + u8 ret; + u32 keyindex; u32 len = FIELD_OFFSET(NDIS_802_11_KEY, KeyMaterial) + key->KeyLength; NDIS_802_11_WEP *wep = &padapter->securitypriv.ndiswep; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ WEP key +++++\n")); + wep->Length = len; - keyindex = key->KeyIndex&0x7fffffff; + keyindex = key->KeyIndex & 0x7fffffff; wep->KeyIndex = keyindex ; wep->KeyLength = key->KeyLength; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY:Before memcpy \n")); - _rtw_memcpy(wep->KeyMaterial, key->KeyMaterial, key->KeyLength); + + _rtw_memcpy(wep->KeyMaterial, key->KeyMaterial, key->KeyLength); _rtw_memcpy(&(padapter->securitypriv.dot11DefKey[keyindex].skey[0]), key->KeyMaterial, key->KeyLength); - padapter->securitypriv.dot11DefKeylen[keyindex]=key->KeyLength; - padapter->securitypriv.dot11PrivacyKeyIndex=keyindex; - + padapter->securitypriv.dot11DefKeylen[keyindex] = key->KeyLength; + padapter->securitypriv.dot11PrivacyKeyIndex = keyindex; + ret = rtw_set_802_11_add_wep(padapter, wep); - + goto exit; - + } - if(key->KeyIndex & 0x20000000){ - // SetRSC - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ SetRSC+++++\n")); - if(bgroup == _TRUE) - { - NDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL; - _rtw_memcpy(&padapter->securitypriv.dot11Grprxpn, &keysrc, 8); - } - else - { - NDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL; - _rtw_memcpy(&padapter->securitypriv.dot11Grptxpn, &keysrc, 8); + if (key->KeyIndex & 0x20000000) { + /* SetRSC */ + if (bgroup == _TRUE) { + NDIS_802_11_KEY_RSC keysrc = key->KeyRSC & 0x00FFFFFFFFFFFFULL; + _rtw_memcpy(&padapter->securitypriv.dot11Grprxpn, &keysrc, 8); + } else { + NDIS_802_11_KEY_RSC keysrc = key->KeyRSC & 0x00FFFFFFFFFFFFULL; + _rtw_memcpy(&padapter->securitypriv.dot11Grptxpn, &keysrc, 8); } - + } - // Indicate this key idx is used for TX - // Save the key in KeyMaterial - if(bgroup == _TRUE) // Group transmit key - { + /* Indicate this key idx is used for TX */ + /* Save the key in KeyMaterial */ + if (bgroup == _TRUE) { /* Group transmit key */ int res; - - if(bgrouptkey == _TRUE) - { - padapter->securitypriv.dot118021XGrpKeyid=(u8)key->KeyIndex; - } - - if((key->KeyIndex&0x3) == 0){ + + if (bgrouptkey == _TRUE) + padapter->securitypriv.dot118021XGrpKeyid = (u8)key->KeyIndex; + + if ((key->KeyIndex & 0x3) == 0) { ret = _FAIL; goto exit; - } - + } + _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], 0, 16); _rtw_memset(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16); _rtw_memset(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16); - - if((key->KeyIndex & 0x10000000)) - { + + if ((key->KeyIndex & 0x10000000)) { _rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8); _rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8); - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7])); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n")); - } - else - { + + } else { _rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8); _rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8); - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7])); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n")); - + + } - //set group key by index + /* set group key by index */ _rtw_memcpy(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial, key->KeyLength); - - key->KeyIndex=key->KeyIndex & 0x03; - - padapter->securitypriv.binstallGrpkey=_TRUE; - - padapter->securitypriv.bcheck_grpkey=_FALSE; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("reset group key")); - - res=rtw_set_key(padapter,&padapter->securitypriv, key->KeyIndex, 1, _TRUE); - if(res==_FAIL) - ret= _FAIL; + key->KeyIndex = key->KeyIndex & 0x03; + + padapter->securitypriv.binstallGrpkey = _TRUE; + + padapter->securitypriv.bcheck_grpkey = _FALSE; + + + res = rtw_set_key(padapter, &padapter->securitypriv, key->KeyIndex, 1, _TRUE); + + if (res == _FAIL) + ret = _FAIL; goto exit; - - } - else // Pairwise Key - { + + } else { /* Pairwise Key */ u8 res; - - pbssid=get_bssid(&padapter->mlmepriv); - stainfo=rtw_get_stainfo(&padapter->stapriv , pbssid ); - - if(stainfo!=NULL) - { - _rtw_memset( &stainfo->dot118021x_UncstKey, 0, 16);// clear keybuffer - + + pbssid = get_bssid(&padapter->mlmepriv); + stainfo = rtw_get_stainfo(&padapter->stapriv , pbssid); + + if (stainfo != NULL) { + _rtw_memset(&stainfo->dot118021x_UncstKey, 0, 16); /* clear keybuffer */ + _rtw_memcpy(&stainfo->dot118021x_UncstKey, key->KeyMaterial, 16); - - if(encryptionalgo== _TKIP_) - { - padapter->securitypriv.busetkipkey=_FALSE; - - //_set_timer(&padapter->securitypriv.tkip_timer, 50); - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n ==========_set_timer\n")); - - // if TKIP, save the Receive/Transmit MIC key in KeyMaterial[128-255] - if((key->KeyIndex & 0x10000000)){ + + if (encryptionalgo == _TKIP_) { + padapter->securitypriv.busetkipkey = _FALSE; + + /* _set_timer(&padapter->securitypriv.tkip_timer, 50); */ + + + /* if TKIP, save the Receive/Transmit MIC key in KeyMaterial[128-255] */ + if ((key->KeyIndex & 0x10000000)) { _rtw_memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 16, 8); _rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 24, 8); @@ -1246,102 +1035,92 @@ _func_enter_; _rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 16, 8); } - - } - else if(encryptionalgo == _AES_) - { - + + } else if (encryptionalgo == _AES_) { + } - - //Set key to CAM through H2C command - #if 0 - if(bgrouptkey)//never go to here - { - 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")); + + /* Set key to CAM through H2C command */ +#if 0 + if (bgrouptkey) { /* never go to here */ + res = rtw_setstakey_cmd(padapter, stainfo, GROUP_KEY, _TRUE); + } else { + res = rtw_setstakey_cmd(padapter, stainfo, UNICAST_KEY, _TRUE); } - 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")); - } - #else - +#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 +#endif + + if (res == _FALSE) + ret = _FAIL; - if(res ==_FALSE) - ret= _FAIL; - } } exit: - -_func_exit_; - return ret; + + return ret; } -u8 rtw_set_802_11_remove_key(_adapter* padapter, NDIS_802_11_REMOVE_KEY *key){ - +u8 rtw_set_802_11_remove_key(_adapter *padapter, NDIS_802_11_REMOVE_KEY *key) +{ + uint encryptionalgo; - u8 * pbssid; + u8 *pbssid; struct sta_info *stainfo; - u8 bgroup = (key->KeyIndex & 0x4000000) > 0 ? _FALSE: _TRUE; + u8 bgroup = (key->KeyIndex & 0x4000000) > 0 ? _FALSE : _TRUE; u8 keyIndex = (u8)key->KeyIndex & 0x03; - u8 ret=_SUCCESS; - -_func_enter_; + u8 ret = _SUCCESS; + if ((key->KeyIndex & 0xbffffffc) > 0) { - ret=_FAIL; + ret = _FAIL; goto exit; } if (bgroup == _TRUE) { - encryptionalgo= padapter->securitypriv.dot118021XGrpPrivacy; - // clear group key by index - //NdisZeroMemory(Adapter->MgntInfo.SecurityInfo.KeyBuf[keyIndex], MAX_WEP_KEY_LEN); - //Adapter->MgntInfo.SecurityInfo.KeyLen[keyIndex] = 0; - + encryptionalgo = padapter->securitypriv.dot118021XGrpPrivacy; + /* clear group key by index */ + /* NdisZeroMemory(Adapter->MgntInfo.SecurityInfo.KeyBuf[keyIndex], MAX_WEP_KEY_LEN); */ + /* Adapter->MgntInfo.SecurityInfo.KeyLen[keyIndex] = 0; */ + _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[keyIndex], 0, 16); - - //! \todo Send a H2C Command to Firmware for removing this Key in CAM Entry. - + + /* ! \todo Send a H2C Command to Firmware for removing this Key in CAM Entry. */ + } else { - - pbssid=get_bssid(&padapter->mlmepriv); - stainfo=rtw_get_stainfo(&padapter->stapriv , pbssid ); - if(stainfo !=NULL){ - encryptionalgo=stainfo->dot118021XPrivacy; - // clear key by BSSID - _rtw_memset(&stainfo->dot118021x_UncstKey, 0, 16); - - //! \todo Send a H2C Command to Firmware for disable this Key in CAM Entry. + pbssid = get_bssid(&padapter->mlmepriv); + stainfo = rtw_get_stainfo(&padapter->stapriv , pbssid); + if (stainfo != NULL) { + encryptionalgo = stainfo->dot118021XPrivacy; - } - else{ - ret= _FAIL; + /* clear key by BSSID */ + _rtw_memset(&stainfo->dot118021x_UncstKey, 0, 16); + + /* ! \todo Send a H2C Command to Firmware for disable this Key in CAM Entry. */ + + } else { + ret = _FAIL; goto exit; } } exit: - -_func_exit_; + return _TRUE; - + } /* -* rtw_get_cur_max_rate - +* rtw_get_cur_max_rate - * @adapter: pointer to _adapter structure -* +* * Return 0 or 100Kbps */ u16 rtw_get_cur_max_rate(_adapter *adapter) @@ -1351,84 +1130,81 @@ u16 rtw_get_cur_max_rate(_adapter *adapter) struct mlme_priv *pmlmepriv = &adapter->mlmepriv; WLAN_BSSID_EX *pcur_bss = &pmlmepriv->cur_network.network; struct sta_info *psta = NULL; - u8 short_GI=0; + u8 short_GI = 0; #ifdef CONFIG_80211N_HT u8 rf_type = 0; #endif #ifdef CONFIG_MP_INCLUDED - if (adapter->registrypriv.mp_mode == 1) - { + if (adapter->registrypriv.mp_mode == 1) { if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) return 0; } #endif - if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) - && (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) != _TRUE)) + if ((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) + && (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) != _TRUE)) return 0; psta = rtw_get_stainfo(&adapter->stapriv, get_bssid(pmlmepriv)); if (psta == NULL) return 0; - short_GI = query_ra_short_GI(psta); + short_GI = query_ra_short_GI(psta, psta->bw_mode); #ifdef CONFIG_80211N_HT if (IsSupportedHT(psta->wireless_mode)) { rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); max_rate = rtw_mcs_rate( - rf_type, - ((psta->bw_mode == CHANNEL_WIDTH_40)?1:0), - short_GI, - psta->htpriv.ht_cap.supp_mcs_set - ); + rf_type, + ((psta->bw_mode == CHANNEL_WIDTH_40) ? 1 : 0), + short_GI, + psta->htpriv.ht_cap.supp_mcs_set + ); } #ifdef CONFIG_80211AC_VHT - else if (IsSupportedVHT(psta->wireless_mode)) { + else if (IsSupportedVHT(psta->wireless_mode)) max_rate = ((rtw_vht_mcs_to_data_rate(psta->bw_mode, short_GI, pmlmepriv->vhtpriv.vht_highest_rate) + 1) >> 1) * 10; - } -#endif //CONFIG_80211AC_VHT - else -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211AC_VHT */ + else +#endif /* CONFIG_80211N_HT */ { - while( (pcur_bss->SupportedRates[i]!=0) && (pcur_bss->SupportedRates[i]!=0xFF)) - { - rate = pcur_bss->SupportedRates[i]&0x7F; - if(rate>max_rate) + while ((pcur_bss->SupportedRates[i] != 0) && (pcur_bss->SupportedRates[i] != 0xFF)) { + rate = pcur_bss->SupportedRates[i] & 0x7F; + if (rate > max_rate) max_rate = rate; i++; } - - max_rate = max_rate*10/2; + + max_rate = max_rate * 10 / 2; } return max_rate; } /* -* rtw_set_scan_mode - +* rtw_set_scan_mode - * @adapter: pointer to _adapter structure -* @scan_mode: -* +* @scan_mode: +* * Return _SUCCESS or _FAIL */ int rtw_set_scan_mode(_adapter *adapter, RT_SCAN_TYPE scan_mode) { - if(scan_mode != SCAN_ACTIVE && scan_mode != SCAN_PASSIVE) + if (scan_mode != SCAN_ACTIVE && scan_mode != SCAN_PASSIVE) return _FAIL; - + adapter->mlmepriv.scan_mode = scan_mode; return _SUCCESS; } /* -* rtw_set_channel_plan - +* rtw_set_channel_plan - * @adapter: pointer to _adapter structure -* @channel_plan: -* +* @channel_plan: +* * Return _SUCCESS or _FAIL */ int rtw_set_channel_plan(_adapter *adapter, u8 channel_plan) @@ -1436,48 +1212,41 @@ int rtw_set_channel_plan(_adapter *adapter, u8 channel_plan) struct registry_priv *pregistrypriv = &adapter->registrypriv; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - //handle by cmd_thread to sync with scan operation + /* handle by cmd_thread to sync with scan operation */ return rtw_set_chplan_cmd(adapter, RTW_CMDF_WAIT_ACK, channel_plan, 1); } /* -* rtw_set_country - +* rtw_set_country - * @adapter: pointer to _adapter structure * @country_code: string of country code -* +* * Return _SUCCESS or _FAIL */ int rtw_set_country(_adapter *adapter, const char *country_code) { - int channel_plan; - - channel_plan = rtw_get_chplan_from_country(country_code); - - if (channel_plan == -1) { - DBG_871X_LEVEL(_drv_always_, "%s unsupported country_code:%s\n", __func__, country_code); - return _FAIL; - } - - DBG_871X_LEVEL(_drv_always_, "%s country_code:%s mapping to chplan:0x%02x\n", __func__, country_code, channel_plan); - return rtw_set_channel_plan(adapter, channel_plan); +#ifdef CONFIG_RTW_IOCTL_SET_COUNTRY + return rtw_set_country_cmd(adapter, RTW_CMDF_WAIT_ACK, country_code, 1); +#else + return _FAIL; +#endif } /* -* rtw_set_band - +* rtw_set_band - * @adapter: pointer to _adapter structure * @band: band to set -* +* * Return _SUCCESS or _FAIL */ 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); + RTW_INFO(FUNC_ADPT_FMT" band:%d\n", FUNC_ADPT_ARG(adapter), band); adapter->setband = band; return _SUCCESS; } - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" band:%d fail\n", FUNC_ADPT_ARG(adapter), band); + RTW_PRINT(FUNC_ADPT_FMT" band:%d fail\n", FUNC_ADPT_ARG(adapter), band); return _FAIL; } - diff --git a/core/rtw_iol.c b/core/rtw_iol.c old mode 100755 new mode 100644 index 3524e1c..42d0b6b --- a/core/rtw_iol.c +++ b/core/rtw_iol.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. @@ -29,20 +29,20 @@ struct xmit_frame *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter) struct xmit_priv *pxmitpriv = &(adapter->xmitpriv); #if 1 - if ((xmit_frame = rtw_alloc_xmitframe(pxmitpriv)) == NULL) - { - DBG_871X("%s rtw_alloc_xmitframe return null\n", __FUNCTION__); + xmit_frame = rtw_alloc_xmitframe(pxmitpriv); + if (xmit_frame == NULL) { + RTW_INFO("%s rtw_alloc_xmitframe return null\n", __FUNCTION__); goto exit; } - - if ((xmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL) - { - DBG_871X("%s rtw_alloc_xmitbuf return null\n", __FUNCTION__); + + xmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if (xmitbuf == NULL) { + RTW_INFO("%s rtw_alloc_xmitbuf return null\n", __FUNCTION__); rtw_free_xmitframe(pxmitpriv, xmit_frame); - xmit_frame=NULL; + xmit_frame = NULL; goto exit; } - + xmit_frame->frame_tag = MGNT_FRAMETAG; xmit_frame->pxmitbuf = xmitbuf; xmit_frame->buf_addr = xmitbuf->pbuf; @@ -50,15 +50,14 @@ struct xmit_frame *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter) pattrib = &xmit_frame->attrib; update_mgntframe_attrib(adapter, pattrib); - pattrib->qsel = QSLT_BEACON;//Beacon - pattrib->subtype = WIFI_BEACON; + pattrib->qsel = QSLT_BEACON;/* Beacon */ + pattrib->subtype = WIFI_BEACON; pattrib->pktlen = pattrib->last_txcmdsz = 0; #else - if ((xmit_frame = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - DBG_871X("%s alloc_mgtxmitframe return null\n", __FUNCTION__); - } + xmit_frame = alloc_mgtxmitframe(pxmitpriv); + if (xmit_frame == NULL) + RTW_INFO("%s alloc_mgtxmitframe return null\n", __FUNCTION__); else { pattrib = &xmit_frame->attrib; update_mgntframe_attrib(adapter, pattrib); @@ -79,12 +78,12 @@ int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len u32 ori_len; buf_offset = TXDESC_OFFSET; - ori_len = buf_offset+pattrib->pktlen; + ori_len = buf_offset + pattrib->pktlen; - //check if the io_buf can accommodate new cmds - if(ori_len + cmd_len + 8 > MAX_XMITBUF_SZ) { - DBG_871X("%s %u is large than MAX_XMITBUF_SZ:%u, can't accommodate new cmds\n", __FUNCTION__ - , ori_len + cmd_len + 8, MAX_XMITBUF_SZ); + /* check if the io_buf can accommodate new cmds */ + if (ori_len + cmd_len + 8 > MAX_XMITBUF_SZ) { + RTW_INFO("%s %u is large than MAX_XMITBUF_SZ:%u, can't accommodate new cmds\n", __FUNCTION__ + , ori_len + cmd_len + 8, MAX_XMITBUF_SZ); return _FAIL; } @@ -92,18 +91,18 @@ int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len pattrib->pktlen += cmd_len; pattrib->last_txcmdsz += cmd_len; - //DBG_871X("%s ori:%u + cmd_len:%u = %u\n", __FUNCTION__, ori_len, cmd_len, buf_offset+pattrib->pktlen); - + /* RTW_INFO("%s ori:%u + cmd_len:%u = %u\n", __FUNCTION__, ori_len, cmd_len, buf_offset+pattrib->pktlen); */ + return _SUCCESS; } bool rtw_IOL_applied(ADAPTER *adapter) -{ - if(1 == adapter->registrypriv.fw_iol) +{ + if (1 == adapter->registrypriv.fw_iol) return _TRUE; #ifdef CONFIG_USB_HCI - if((2 == adapter->registrypriv.fw_iol) && (IS_FULL_SPEED_USB(adapter))) + if ((2 == adapter->registrypriv.fw_iol) && (IS_FULL_SPEED_USB(adapter))) return _TRUE; #endif @@ -112,7 +111,7 @@ bool rtw_IOL_applied(ADAPTER *adapter) int rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt) { - return rtw_hal_iol_cmd(adapter, xmit_frame, max_wating_ms,bndy_cnt); + return rtw_hal_iol_cmd(adapter, xmit_frame, max_wating_ms, bndy_cnt); } #ifdef CONFIG_IOL_NEW_GENERATION @@ -122,195 +121,193 @@ int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary) } int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask) { - struct ioreg_cfg cmd = {8,IOREG_CMD_WB_REG,0x0, 0x0,0x0}; + struct ioreg_cfg cmd = {8, IOREG_CMD_WB_REG, 0x0, 0x0, 0x0}; - //RTW_PUT_LE16((u8*)&cmd.address, addr); - //RTW_PUT_LE32((u8*)&cmd.value, (u32)value); - cmd.address = cpu_to_le16(addr); + /* RTW_PUT_LE16((u8*)&cmd.address, addr); */ + /* RTW_PUT_LE32((u8*)&cmd.value, (u32)value); */ + cmd.address = cpu_to_le16(addr); cmd.data = cpu_to_le32(value); - - if(mask!=0xFF) - { - cmd.length = 12; - //RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask); - cmd.mask = cpu_to_le32(mask); - } - - //DBG_871X("%s addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FUNCTION__, addr,value,mask); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length); + if (mask != 0xFF) { + cmd.length = 12; + /* RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask); */ + cmd.mask = cpu_to_le32(mask); + } + + /* RTW_INFO("%s addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FUNCTION__, addr,value,mask); */ + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); } int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask) { - struct ioreg_cfg cmd = {8,IOREG_CMD_WW_REG,0x0, 0x0,0x0}; + struct ioreg_cfg cmd = {8, IOREG_CMD_WW_REG, 0x0, 0x0, 0x0}; - //RTW_PUT_LE16((u8*)&cmd.address, addr); - //RTW_PUT_LE32((u8*)&cmd.value, (u32)value); - cmd.address = cpu_to_le16(addr); + /* RTW_PUT_LE16((u8*)&cmd.address, addr); */ + /* RTW_PUT_LE32((u8*)&cmd.value, (u32)value); */ + cmd.address = cpu_to_le16(addr); cmd.data = cpu_to_le32(value); - - if(mask!=0xFFFF) - { - cmd.length = 12; - //RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask); - cmd.mask = cpu_to_le32(mask); - } - - //DBG_871X("%s addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FUNCTION__, addr,value,mask); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length); - + if (mask != 0xFFFF) { + cmd.length = 12; + /* RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask); */ + cmd.mask = cpu_to_le32(mask); + } + + /* RTW_INFO("%s addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FUNCTION__, addr,value,mask); */ + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); + } int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask) { - struct ioreg_cfg cmd = {8,IOREG_CMD_WD_REG,0x0, 0x0,0x0}; + struct ioreg_cfg cmd = {8, IOREG_CMD_WD_REG, 0x0, 0x0, 0x0}; - //RTW_PUT_LE16((u8*)&cmd.address, addr); - //RTW_PUT_LE32((u8*)&cmd.value, (u32)value); - cmd.address = cpu_to_le16(addr); + /* RTW_PUT_LE16((u8*)&cmd.address, addr); */ + /* RTW_PUT_LE32((u8*)&cmd.value, (u32)value); */ + cmd.address = cpu_to_le16(addr); cmd.data = cpu_to_le32(value); - - if(mask!=0xFFFFFFFF) - { - cmd.length = 12; - //RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask); - cmd.mask = cpu_to_le32(mask); - } - - //DBG_871X("%s addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FU2NCTION__, addr,value,mask); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length); - + if (mask != 0xFFFFFFFF) { + cmd.length = 12; + /* RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask); */ + cmd.mask = cpu_to_le32(mask); + } + + /* RTW_INFO("%s addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FU2NCTION__, addr,value,mask); */ + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); + } int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask) { - struct ioreg_cfg cmd = {8,IOREG_CMD_W_RF,0x0, 0x0,0x0}; + struct ioreg_cfg cmd = {8, IOREG_CMD_W_RF, 0x0, 0x0, 0x0}; - //RTW_PUT_LE16((u8*)&cmd.address, addr); - //RTW_PUT_LE32((u8*)&cmd.value, (u32)value); - cmd.address = (rf_path<<8) |((addr) &0xFF); + /* RTW_PUT_LE16((u8*)&cmd.address, addr); */ + /* RTW_PUT_LE32((u8*)&cmd.value, (u32)value); */ + cmd.address = (rf_path << 8) | ((addr) & 0xFF); cmd.data = cpu_to_le32(value); - - if(mask!=0x000FFFFF) - { - cmd.length = 12; - //RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask); - cmd.mask = cpu_to_le32(mask); - } - - //DBG_871X("%s rf_path:0x%02x addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FU2NCTION__,rf_path, addr,value,mask); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length); - + if (mask != 0x000FFFFF) { + cmd.length = 12; + /* RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask); */ + cmd.mask = cpu_to_le32(mask); + } + + /* RTW_INFO("%s rf_path:0x%02x addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FU2NCTION__,rf_path, addr,value,mask); */ + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); + } int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us) { - struct ioreg_cfg cmd = {4,IOREG_CMD_DELAY_US,0x0, 0x0,0x0}; - //RTW_PUT_LE16((u8*)&cmd.address, us); - cmd.address = cpu_to_le16(us); + struct ioreg_cfg cmd = {4, IOREG_CMD_DELAY_US, 0x0, 0x0, 0x0}; + /* RTW_PUT_LE16((u8*)&cmd.address, us); */ + cmd.address = cpu_to_le16(us); - //DBG_871X("%s %u\n", __FUNCTION__, us); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 4); + /* RTW_INFO("%s %u\n", __FUNCTION__, us); */ + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 4); } int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms) { - struct ioreg_cfg cmd = {4,IOREG_CMD_DELAY_US,0x0, 0x0,0x0}; + struct ioreg_cfg cmd = {4, IOREG_CMD_DELAY_US, 0x0, 0x0, 0x0}; - //RTW_PUT_LE16((u8*)&cmd.address, ms); - cmd.address = cpu_to_le16(ms); + /* RTW_PUT_LE16((u8*)&cmd.address, ms); */ + cmd.address = cpu_to_le16(ms); - //DBG_871X("%s %u\n", __FUNCTION__, ms); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 4); + /* RTW_INFO("%s %u\n", __FUNCTION__, ms); */ + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 4); } int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame) -{ - struct ioreg_cfg cmd = {4,IOREG_CMD_END,0xFFFF, 0xFF,0x0}; - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 4); +{ + struct ioreg_cfg cmd = {4, IOREG_CMD_END, 0xFFFF, 0xFF, 0x0}; + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 4); } u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame) -{ +{ u8 is_cmd_bndy = _FALSE; - if(((pxmit_frame->attrib.pktlen+32)%256) + 8 >= 256){ + if (((pxmit_frame->attrib.pktlen + 32) % 256) + 8 >= 256) { rtw_IOL_append_END_cmd(pxmit_frame); - pxmit_frame->attrib.pktlen = ((((pxmit_frame->attrib.pktlen+32)/256)+1)*256 ); - - //printk("==> %s, pktlen(%d)\n",__FUNCTION__,pxmit_frame->attrib.pktlen); + pxmit_frame->attrib.pktlen = ((((pxmit_frame->attrib.pktlen + 32) / 256) + 1) * 256); + + /* printk("==> %s, pktlen(%d)\n",__FUNCTION__,pxmit_frame->attrib.pktlen); */ pxmit_frame->attrib.last_txcmdsz = pxmit_frame->attrib.pktlen; - is_cmd_bndy = _TRUE; + is_cmd_bndy = _TRUE; } return is_cmd_bndy; } -void rtw_IOL_cmd_buf_dump(ADAPTER *Adapter,int buf_len,u8 *pbuf) +void rtw_IOL_cmd_buf_dump(ADAPTER *Adapter, int buf_len, u8 *pbuf) { int i; - int j=1; - - printk("###### %s ######\n",__FUNCTION__); - for(i=0;i< buf_len;i++){ - printk("%02x-",*(pbuf+i)); - - if(j%32 ==0) printk("\n");j++; + int j = 1; + + printk("###### %s ######\n", __FUNCTION__); + for (i = 0; i < buf_len; i++) { + printk("%02x-", *(pbuf + i)); + + if (j % 32 == 0) + printk("\n"); + j++; } printk("\n"); - printk("============= ioreg_cmd len = %d =============== \n",buf_len); + printk("============= ioreg_cmd len = %d ===============\n", buf_len); } -#else //CONFIG_IOL_NEW_GENERATION +#else /* CONFIG_IOL_NEW_GENERATION */ int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary) -{ +{ IOL_CMD cmd = {0x0, IOL_CMD_LLT, 0x0, 0x0}; - - RTW_PUT_BE32((u8*)&cmd.value, (u32)page_boundary); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8); + RTW_PUT_BE32((u8 *)&cmd.value, (u32)page_boundary); + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 8); } int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value) { IOL_CMD cmd = {0x0, IOL_CMD_WB_REG, 0x0, 0x0}; - - RTW_PUT_BE16((u8*)&cmd.address, (u16)addr); - RTW_PUT_BE32((u8*)&cmd.value, (u32)value); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8); + RTW_PUT_BE16((u8 *)&cmd.address, (u16)addr); + RTW_PUT_BE32((u8 *)&cmd.value, (u32)value); + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 8); } int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value) { IOL_CMD cmd = {0x0, IOL_CMD_WW_REG, 0x0, 0x0}; - - RTW_PUT_BE16((u8*)&cmd.address, (u16)addr); - RTW_PUT_BE32((u8*)&cmd.value, (u32)value); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8); + RTW_PUT_BE16((u8 *)&cmd.address, (u16)addr); + RTW_PUT_BE32((u8 *)&cmd.value, (u32)value); + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 8); } int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value) { IOL_CMD cmd = {0x0, IOL_CMD_WD_REG, 0x0, 0x0}; - u8* pos = (u8 *)&cmd; - - RTW_PUT_BE16((u8*)&cmd.address, (u16)addr); - RTW_PUT_BE32((u8*)&cmd.value, (u32)value); + u8 *pos = (u8 *)&cmd; - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8); + RTW_PUT_BE16((u8 *)&cmd.address, (u16)addr); + RTW_PUT_BE32((u8 *)&cmd.value, (u32)value); + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 8); } #ifdef DBG_IO int dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line) { if (match_write_sniff_ranges(addr, 1)) - DBG_871X("DBG_IO %s:%d IOL_WB(0x%04x, 0x%02x)\n", caller, line, addr, value); + RTW_INFO("DBG_IO %s:%d IOL_WB(0x%04x, 0x%02x)\n", caller, line, addr, value); return _rtw_IOL_append_WB_cmd(xmit_frame, addr, value); } @@ -318,7 +315,7 @@ int dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, int dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line) { if (match_write_sniff_ranges(addr, 2)) - DBG_871X("DBG_IO %s:%d IOL_WW(0x%04x, 0x%04x)\n", caller, line, addr, value); + RTW_INFO("DBG_IO %s:%d IOL_WW(0x%04x, 0x%04x)\n", caller, line, addr, value); return _rtw_IOL_append_WW_cmd(xmit_frame, addr, value); } @@ -326,7 +323,7 @@ int dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value int dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line) { if (match_write_sniff_ranges(addr, 4)) - DBG_871X("DBG_IO %s:%d IOL_WD(0x%04x, 0x%08x)\n", caller, line, addr, value); + RTW_INFO("DBG_IO %s:%d IOL_WD(0x%04x, 0x%08x)\n", caller, line, addr, value); return _rtw_IOL_append_WD_cmd(xmit_frame, addr, value); } @@ -335,31 +332,31 @@ int dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us) { IOL_CMD cmd = {0x0, IOL_CMD_DELAY_US, 0x0, 0x0}; - - RTW_PUT_BE32((u8*)&cmd.value, (u32)us); - //DBG_871X("%s %u\n", __FUNCTION__, us); + RTW_PUT_BE32((u8 *)&cmd.value, (u32)us); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8); + /* RTW_INFO("%s %u\n", __FUNCTION__, us); */ + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 8); } int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms) { IOL_CMD cmd = {0x0, IOL_CMD_DELAY_MS, 0x0, 0x0}; - - RTW_PUT_BE32((u8*)&cmd.value, (u32)ms); - //DBG_871X("%s %u\n", __FUNCTION__, ms); + RTW_PUT_BE32((u8 *)&cmd.value, (u32)ms); - return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8); + /* RTW_INFO("%s %u\n", __FUNCTION__, ms); */ + + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 8); } int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame) -{ +{ IOL_CMD end_cmd = {0x0, IOL_CMD_END, 0x0, 0x0}; - return rtw_IOL_append_cmds(xmit_frame, (u8*)&end_cmd, 8); + return rtw_IOL_append_cmds(xmit_frame, (u8 *)&end_cmd, 8); } @@ -367,24 +364,24 @@ int rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 { struct xmit_frame *xmit_frame; - if((xmit_frame=rtw_IOL_accquire_xmit_frame(adapter)) == NULL) + xmit_frame = rtw_IOL_accquire_xmit_frame(adapter); + if (xmit_frame == NULL) return _FAIL; - if(rtw_IOL_append_cmds(xmit_frame, IOL_cmds, cmd_num<<3) == _FAIL) + if (rtw_IOL_append_cmds(xmit_frame, IOL_cmds, cmd_num << 3) == _FAIL) return _FAIL; - return rtw_IOL_exec_cmds_sync(adapter, xmit_frame, max_wating_ms,0); + return rtw_IOL_exec_cmds_sync(adapter, xmit_frame, max_wating_ms, 0); } int rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms) { IOL_CMD end_cmd = {0x0, IOL_CMD_END, 0x0, 0x0}; - return rtw_IOL_exec_cmd_array_sync(adapter, (u8*)&end_cmd, 1, max_wating_ms); + return rtw_IOL_exec_cmd_array_sync(adapter, (u8 *)&end_cmd, 1, max_wating_ms); } -#endif //CONFIG_IOL_NEW_GENERATION +#endif /* CONFIG_IOL_NEW_GENERATION */ -#endif //CONFIG_IOL - +#endif /* CONFIG_IOL */ diff --git a/core/rtw_mem.c b/core/rtw_mem.c old mode 100755 new mode 100644 index d05e3af..b68a456 --- a/core/rtw_mem.c +++ b/core/rtw_mem.c @@ -1,122 +1,114 @@ - -#include -#include - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Realtek Wireless Lan Driver"); -MODULE_AUTHOR("Realtek Semiconductor Corp."); -MODULE_VERSION("DRIVERVERSION"); - -struct sk_buff_head rtk_skb_mem_q; -struct u8* rtk_buf_mem[NR_RECVBUFF]; - -struct u8 * rtw_get_buf_premem(int index) -{ - printk("%s, rtk_buf_mem index : %d\n", __func__, index); - return rtk_buf_mem[index]; -} - -u16 rtw_rtkm_get_buff_size(void) -{ - return MAX_RTKM_RECVBUF_SZ; -} -EXPORT_SYMBOL(rtw_rtkm_get_buff_size); - -u8 rtw_rtkm_get_nr_recv_skb(void) -{ - return MAX_RTKM_NR_PREALLOC_RECV_SKB; -} -EXPORT_SYMBOL(rtw_rtkm_get_nr_recv_skb); - -struct sk_buff *rtw_alloc_skb_premem(u16 in_size) -{ - struct sk_buff *skb = NULL; - - if (in_size > MAX_RTKM_RECVBUF_SZ) { - pr_info("warning %s: driver buffer size(%d) > rtkm buffer size(%d)\n", __func__, in_size, MAX_RTKM_RECVBUF_SZ); - WARN_ON(1); - return skb; - } - - skb = skb_dequeue(&rtk_skb_mem_q); - - printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q)); - - return skb; -} -EXPORT_SYMBOL(rtw_alloc_skb_premem); - -int rtw_free_skb_premem(struct sk_buff *pskb) -{ - if(!pskb) - return -1; - - if (skb_queue_len(&rtk_skb_mem_q) >= MAX_RTKM_NR_PREALLOC_RECV_SKB) - return -1; - - skb_queue_tail(&rtk_skb_mem_q, pskb); - - printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q)); - - return 0; -} -EXPORT_SYMBOL(rtw_free_skb_premem); - -static int __init rtw_mem_init(void) -{ - int i; - SIZE_PTR tmpaddr=0; - SIZE_PTR alignment=0; - struct sk_buff *pskb=NULL; - - printk("%s\n", __func__); - pr_info("MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", MAX_RTKM_NR_PREALLOC_RECV_SKB); - pr_info("MAX_RTKM_RECVBUF_SZ: %d\n", MAX_RTKM_RECVBUF_SZ); - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX - for(i=0; idata; - alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); - skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment)); - - skb_queue_tail(&rtk_skb_mem_q, pskb); - } - else - { - printk("%s, alloc skb memory fail!\n", __func__); - } - - pskb=NULL; - } - - printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q)); - - return 0; - -} - -static void __exit rtw_mem_exit(void) -{ - if (skb_queue_len(&rtk_skb_mem_q)) { - printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q)); - } - - skb_queue_purge(&rtk_skb_mem_q); - - printk("%s\n", __func__); -} - -module_init(rtw_mem_init); -module_exit(rtw_mem_exit); + +#include +#include + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Realtek Wireless Lan Driver"); +MODULE_AUTHOR("Realtek Semiconductor Corp."); +MODULE_VERSION("DRIVERVERSION"); + +struct sk_buff_head rtk_skb_mem_q; +struct u8 *rtk_buf_mem[NR_RECVBUFF]; + +struct u8 *rtw_get_buf_premem(int index) +{ + printk("%s, rtk_buf_mem index : %d\n", __func__, index); + return rtk_buf_mem[index]; +} + +u16 rtw_rtkm_get_buff_size(void) +{ + return MAX_RTKM_RECVBUF_SZ; +} +EXPORT_SYMBOL(rtw_rtkm_get_buff_size); + +u8 rtw_rtkm_get_nr_recv_skb(void) +{ + return MAX_RTKM_NR_PREALLOC_RECV_SKB; +} +EXPORT_SYMBOL(rtw_rtkm_get_nr_recv_skb); + +struct sk_buff *rtw_alloc_skb_premem(u16 in_size) +{ + struct sk_buff *skb = NULL; + + if (in_size > MAX_RTKM_RECVBUF_SZ) { + pr_info("warning %s: driver buffer size(%d) > rtkm buffer size(%d)\n", __func__, in_size, MAX_RTKM_RECVBUF_SZ); + WARN_ON(1); + return skb; + } + + skb = skb_dequeue(&rtk_skb_mem_q); + + printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q)); + + return skb; +} +EXPORT_SYMBOL(rtw_alloc_skb_premem); + +int rtw_free_skb_premem(struct sk_buff *pskb) +{ + if (!pskb) + return -1; + + if (skb_queue_len(&rtk_skb_mem_q) >= MAX_RTKM_NR_PREALLOC_RECV_SKB) + return -1; + + skb_queue_tail(&rtk_skb_mem_q, pskb); + + printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q)); + + return 0; +} +EXPORT_SYMBOL(rtw_free_skb_premem); + +static int __init rtw_mem_init(void) +{ + int i; + SIZE_PTR tmpaddr = 0; + SIZE_PTR alignment = 0; + struct sk_buff *pskb = NULL; + + printk("%s\n", __func__); + pr_info("MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", MAX_RTKM_NR_PREALLOC_RECV_SKB); + pr_info("MAX_RTKM_RECVBUF_SZ: %d\n", MAX_RTKM_RECVBUF_SZ); + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + for (i = 0; i < NR_RECVBUFF; i++) + rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma); +#endif /* CONFIG_USE_USB_BUFFER_ALLOC_RX */ + + skb_queue_head_init(&rtk_skb_mem_q); + + for (i = 0; i < MAX_RTKM_NR_PREALLOC_RECV_SKB; i++) { + pskb = __dev_alloc_skb(MAX_RTKM_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL); + if (pskb) { + tmpaddr = (SIZE_PTR)pskb->data; + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1); + skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment)); + + skb_queue_tail(&rtk_skb_mem_q, pskb); + } else + printk("%s, alloc skb memory fail!\n", __func__); + + pskb = NULL; + } + + printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q)); + + return 0; + +} + +static void __exit rtw_mem_exit(void) +{ + if (skb_queue_len(&rtk_skb_mem_q)) + printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q)); + + skb_queue_purge(&rtk_skb_mem_q); + + printk("%s\n", __func__); +} + +module_init(rtw_mem_init); +module_exit(rtw_mem_exit); diff --git a/core/rtw_mi.c b/core/rtw_mi.c new file mode 100644 index 0000000..eb3c8d1 --- /dev/null +++ b/core/rtw_mi.c @@ -0,0 +1,1464 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2015 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 + * + * + ******************************************************************************/ +#define _RTW_MI_C_ + +#include +#include + +void rtw_mi_update_union_chan_inf(_adapter *adapter, u8 ch, u8 offset , u8 bw) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct mi_state *iface_state = &dvobj->iface_state; + + iface_state->union_ch = ch; + iface_state->union_bw = bw; + iface_state->union_offset = offset; +} + +/* Find union about ch, bw, ch_offset of all linked/linking interfaces */ +int _rtw_mi_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset, bool include_self) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + _adapter *iface; + struct mlme_ext_priv *mlmeext; + int i; + u8 ch_ret = 0; + u8 bw_ret = CHANNEL_WIDTH_20; + u8 offset_ret = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + int num = 0; + + if (ch) + *ch = 0; + if (bw) + *bw = CHANNEL_WIDTH_20; + if (offset) + *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + mlmeext = &iface->mlmeextpriv; + + if (!check_fwstate(&iface->mlmepriv, _FW_LINKED | _FW_UNDER_LINKING)) + continue; + + if (check_fwstate(&iface->mlmepriv, WIFI_OP_CH_SWITCHING)) + continue; + + if (include_self == _FALSE && adapter == iface) + continue; + + if (num == 0) { + ch_ret = mlmeext->cur_channel; + bw_ret = mlmeext->cur_bwmode; + offset_ret = mlmeext->cur_ch_offset; + num++; + continue; + } + + if (ch_ret != mlmeext->cur_channel) { + num = 0; + break; + } + + if (bw_ret < mlmeext->cur_bwmode) { + bw_ret = mlmeext->cur_bwmode; + offset_ret = mlmeext->cur_ch_offset; + } else if (bw_ret == mlmeext->cur_bwmode && offset_ret != mlmeext->cur_ch_offset) { + num = 0; + break; + } + + num++; + } + + if (num) { + if (ch) + *ch = ch_ret; + if (bw) + *bw = bw_ret; + if (offset) + *offset = offset_ret; + } + + return num; +} + +inline int rtw_mi_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset) +{ + return _rtw_mi_get_ch_setting_union(adapter, ch, bw, offset, 1); +} + +inline int rtw_mi_get_ch_setting_union_no_self(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset) +{ + return _rtw_mi_get_ch_setting_union(adapter, ch, bw, offset, 0); +} + +void _rtw_mi_status(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num + , u8 *ap_num, u8 *ld_ap_num, u8 *uw_num, bool include_self) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + _adapter *iface; + struct mlme_ext_priv *mlmeext; + + int i; + u8 sta_num_ret = 0; + u8 ld_sta_num_ret = 0; + u8 lg_sta_num_ret = 0; + u8 ap_num_ret = 0; + u8 ld_ap_num_ret = 0; + u8 uw_num_ret = 0; + + if (sta_num) + *sta_num = 0; + if (ld_sta_num) + *ld_sta_num = 0; + if (lg_sta_num) + *lg_sta_num = 0; + if (ap_num) + *ap_num = 0; + if (ld_ap_num) + *ld_ap_num = 0; + if (uw_num) + *uw_num = 0; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + + if (include_self == _FALSE && iface == adapter) + continue; + + /*mlmeext = &iface->mlmeextpriv; + + if (mlmeext_msr(mlmeext) == WIFI_FW_STATION_STATE) {*/ + if (check_fwstate(&iface->mlmepriv, WIFI_STATION_STATE)) { + sta_num_ret++; + if (check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE) + ld_sta_num_ret++; + if (check_fwstate(&iface->mlmepriv, _FW_UNDER_LINKING) == _TRUE) + lg_sta_num_ret++; + } + + /*if (mlmeext_msr(mlmeext) == WIFI_FW_AP_STATE*/ + if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) + && check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE + ) { + ap_num_ret++; + if (iface->stapriv.asoc_sta_count > 2) + ld_ap_num_ret++; + } + + if (check_fwstate(&iface->mlmepriv, WIFI_UNDER_WPS) == _TRUE) + uw_num_ret++; + + } + + if (sta_num) + *sta_num = sta_num_ret; + if (ld_sta_num) + *ld_sta_num = ld_sta_num_ret; + if (lg_sta_num) + *lg_sta_num = lg_sta_num_ret; + if (ap_num) + *ap_num = ap_num_ret; + if (ld_ap_num) + *ld_ap_num = ld_ap_num_ret; + if (uw_num) + *uw_num = uw_num_ret; +} + +inline void rtw_mi_status(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num + , u8 *ap_num, u8 *ld_ap_num, u8 *uw_num) +{ + return _rtw_mi_status(adapter, sta_num, ld_sta_num, lg_sta_num, ap_num, ld_ap_num, uw_num, 1); +} +inline void rtw_mi_status_no_self(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num + , u8 *ap_num, u8 *ld_ap_num, u8 *uw_num) +{ + return _rtw_mi_status(adapter, sta_num, ld_sta_num, lg_sta_num, ap_num, ld_ap_num, uw_num, 0); +} +void dump_mi_status(void *sel, struct dvobj_priv *dvobj) +{ + RTW_PRINT_SEL(sel, "== dvobj-iface_state ==\n"); + RTW_PRINT_SEL(sel, "sta_num:%d\n", dvobj->iface_state.sta_num); + RTW_PRINT_SEL(sel, "linking_sta_num:%d\n", dvobj->iface_state.lg_sta_num); + RTW_PRINT_SEL(sel, "linked_sta_num:%d\n", dvobj->iface_state.ld_sta_num); + RTW_PRINT_SEL(sel, "ap_num:%d\n", dvobj->iface_state.ap_num); + RTW_PRINT_SEL(sel, "linked_ap_num:%d\n", dvobj->iface_state.ld_ap_num); + RTW_PRINT_SEL(sel, "adhoc_num:%d\n", dvobj->iface_state.adhoc_num); + RTW_PRINT_SEL(sel, "linked_adhoc_num:%d\n", dvobj->iface_state.ld_adhoc_num); +#ifdef CONFIG_P2P + RTW_PRINT_SEL(sel, "p2p_device_num:%d\n", rtw_mi_stay_in_p2p_mode(dvobj->padapters[IFACE_ID0])); +#endif + RTW_PRINT_SEL(sel, "under_wps_num:%d\n", dvobj->iface_state.uwps_num); + RTW_PRINT_SEL(sel, "union_ch:%d\n", dvobj->iface_state.union_ch); + RTW_PRINT_SEL(sel, "union_bw:%d\n", dvobj->iface_state.union_bw); + RTW_PRINT_SEL(sel, "union_offset:%d\n", dvobj->iface_state.union_offset); + RTW_PRINT_SEL(sel, "================\n\n"); +} + +void dump_dvobj_mi_status(void *sel, const char *fun_name, _adapter *adapter) +{ + RTW_INFO("\n[ %s ] call %s\n", fun_name, __func__); + dump_mi_status(sel, adapter_to_dvobj(adapter)); +} + +inline void rtw_mi_update_iface_status(struct mlme_priv *pmlmepriv, sint state) +{ + _adapter *adapter = container_of(pmlmepriv, _adapter, mlmepriv); + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct mi_state *iface_state = &dvobj->iface_state; + u8 i; + u8 u_ch, u_offset, u_bw; + _adapter *iface; + struct mlme_ext_priv *mlmeext; + + if ((state == WIFI_MONITOR_STATE) || /* (state == WIFI_OP_CH_SWITCHING) || */ + (state == WIFI_ADHOC_MASTER_STATE) || (state == WIFI_ADHOC_STATE) || + (state == WIFI_SITE_MONITOR) || (state == 0xFFFFFFFF) || + (state == WIFI_UNDER_WPS) + ) + return; + + if (0) + RTW_INFO("%s => will change or clean state to 0x%08x\n", __func__, state); + _rtw_memset(iface_state, 0, sizeof(struct mi_state)); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + mlmeext = &iface->mlmeextpriv; + + if (check_fwstate(&iface->mlmepriv, WIFI_STATION_STATE) == _TRUE) { + iface_state->sta_num++; + if (check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE) + iface_state->ld_sta_num++; + + if (check_fwstate(&iface->mlmepriv, _FW_UNDER_LINKING) == _TRUE) + iface_state->lg_sta_num++; + } else if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE + && check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE + ) { + iface_state->ap_num++; + if (iface->stapriv.asoc_sta_count > 2) + iface_state->ld_ap_num++; + } else if (check_fwstate(&iface->mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE) == _TRUE + && check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE + ) { + iface_state->adhoc_num++; + if (iface->stapriv.asoc_sta_count > 2) + iface_state->ld_adhoc_num++; + } + + if (check_fwstate(&iface->mlmepriv, WIFI_UNDER_WPS) == _TRUE) + iface_state->uwps_num++; + + } + + if (rtw_mi_get_ch_setting_union(adapter, &u_ch, &u_bw, &u_offset)) + rtw_mi_update_union_chan_inf(adapter , u_ch, u_offset , u_bw); + else { + if (0) { + dump_adapters_status(RTW_DBGDUMP , dvobj); + RTW_INFO("%s-[ERROR] cannot get union channel\n", __func__); + rtw_warn_on(1); + } + } + +#ifdef DBG_IFACE_STATUS + DBG_IFACE_STATUS_DUMP(adapter); +#endif +} +u8 rtw_mi_check_status(_adapter *adapter, u8 type) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct mi_state *iface_state = &dvobj->iface_state; + u8 ret = _FALSE; + +#ifdef DBG_IFACE_STATUS + DBG_IFACE_STATUS_DUMP(adapter); + RTW_INFO("%s-"ADPT_FMT" check type:%d\n", __func__, ADPT_ARG(adapter), type); +#endif + + switch (type) { + case MI_LINKED: + if (iface_state->ld_sta_num || iface_state->ap_num || iface_state->adhoc_num) /*check_fwstate(&iface->mlmepriv, _FW_LINKED)*/ + ret = _TRUE; + break; + case MI_ASSOC: + if (iface_state->ld_sta_num || iface_state->ld_ap_num || iface_state->ld_adhoc_num) + ret = _TRUE; + break; + case MI_UNDER_WPS: + if (iface_state->uwps_num) + ret = _TRUE; + break; + + case MI_AP_MODE: + if (iface_state->ap_num) + ret = _TRUE; + break; + case MI_AP_ASSOC: + if (iface_state->ld_ap_num) + ret = _TRUE; + break; + + case MI_ADHOC: + if (iface_state->adhoc_num) + ret = _TRUE; + break; + case MI_ADHOC_ASSOC: + if (iface_state->ld_adhoc_num) + ret = _TRUE; + break; + + case MI_STA_NOLINK: /* this is misleading, but not used now */ + if (iface_state->sta_num && (!(iface_state->ld_sta_num || iface_state->lg_sta_num))) + ret = _TRUE; + break; + case MI_STA_LINKED: + if (iface_state->ld_sta_num) + ret = _TRUE; + break; + case MI_STA_LINKING: + if (iface_state->lg_sta_num) + ret = _TRUE; + break; + + default: + break; + } + return ret; +} + +#if 0 +inline void rtw_mi_update_fwstate(struct mlme_priv *pmlmepriv, sint state, u8 bset) +{ + _adapter *adapter = container_of(pmlmepriv, _adapter, mlmepriv); + + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct mi_state *iface_state = &dvobj->iface_state; + struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; + + if (!(state & (_FW_LINKED | _FW_UNDER_LINKING | WIFI_UNDER_WPS))) + return; + + if (mlmeext_msr(mlmeext) == WIFI_FW_STATION_STATE) { + /*ATOMIC_INC(&(iface_state->sta_num_ret));*/ + + if (state & _FW_LINKED) + (bset) ? ATOMIC_INC(&(iface_state->ld_sta_num_ret)) + : ATOMIC_DEC(&(iface_state->ld_sta_num_ret)); + + if (state & _FW_UNDER_LINKING) + (bset) ? ATOMIC_INC(&(iface_state->lg_sta_num_ret)) + : ATOMIC_DEC(&(iface_state->lg_sta_num_ret)); + } + + if (mlmeext_msr(mlmeext) == WIFI_FW_AP_STATE + && check_fwstate(&adapter->mlmepriv, _FW_LINKED) == _TRUE + ) { + /*ATOMIC_INC(&(iface_state->ap_num_ret));*/ + if (adapter->stapriv.asoc_sta_count > 2) + ld_ap_num_ret++; + } + + if (state & WIFI_UNDER_WPS) + (bset) ? ATOMIC_INC(&(iface_state->uw_num_ret)) + : ATOMIC_DEC(&(iface_state->uw_num_ret)); + + _rtw_mi_status(adapter, &iface_state->sta_num, &iface_state->ld_sta_num, &iface_state->lg_sta_num + , &iface_state->ap_num, &iface_state->ld_ap_num, &iface_state->uwps_num, 1); +} +#endif + +u8 rtw_mi_mp_mode_check(_adapter *padapter) +{ +#ifdef CONFIG_MP_INCLUDED +#ifdef CONFIG_CONCURRENT_MODE + int i; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + _adapter *iface = NULL; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + + if ((iface) && (iface->registrypriv.mp_mode == 1)) + return _TRUE; + } +#else + if (padapter->registrypriv.mp_mode == 1) + return _TRUE; +#endif +#endif /* CONFIG_MP_INCLUDED */ + return _FALSE; +} + +#ifdef CONFIG_CONCURRENT_MODE +u8 rtw_mi_buddy_under_survey(_adapter *padapter) +{ + int i; + u8 ret = 0; + _adapter *iface = NULL; + _irqL irqL; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + +#ifdef CONFIG_IOCTL_CFG80211 + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); +#endif + + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + struct mlme_priv *buddy_mlmepriv; + struct rtw_wdev_priv *buddy_wdev_priv; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + + if (iface == padapter) + continue; + + buddy_mlmepriv = &iface->mlmepriv; + if (check_fwstate(buddy_mlmepriv, _FW_UNDER_SURVEY)) { + ret = UNDER_SURVEY_T1; + +#ifdef CONFIG_IOCTL_CFG80211 + buddy_wdev_priv = adapter_wdev_data(iface); + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + _enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL); + if (buddy_wdev_priv->scan_request) { + pmlmepriv->scanning_via_buddy_intf = _TRUE; + _enter_critical_bh(&pmlmepriv->lock, &irqL); + set_fwstate(pmlmepriv, _FW_UNDER_SURVEY); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + ret = UNDER_SURVEY_T2; + } + _exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL); + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); +#endif + + RTW_INFO(ADPT_FMT"_FW_UNDER_SURVEY\n", ADPT_ARG(iface)); + return ret; + } + } + } + return ret; +} +void rtw_mi_buddy_indicate_scan_done(_adapter *padapter, bool bscan_aborted) +{ +#if defined(CONFIG_IOCTL_CFG80211) + int i; + u8 ret = 0; + _adapter *iface = NULL; + _irqL irqL; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct mlme_priv *mlmepriv; + struct rtw_wdev_priv *wdev_priv; + bool indicate_buddy_scan = _FALSE; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + + if (iface == padapter) + continue; + + mlmepriv = &(iface->mlmepriv); + wdev_priv = adapter_wdev_data(iface); + + _enter_critical_bh(&wdev_priv->scan_req_lock, &irqL); + if (wdev_priv->scan_request && mlmepriv->scanning_via_buddy_intf == _TRUE) { + mlmepriv->scanning_via_buddy_intf = _FALSE; + clr_fwstate(mlmepriv, _FW_UNDER_SURVEY); + indicate_buddy_scan = _TRUE; + } + _exit_critical_bh(&wdev_priv->scan_req_lock, &irqL); + + if (indicate_buddy_scan == _TRUE) { + rtw_cfg80211_surveydone_event_callback(iface); + rtw_indicate_scan_done(iface, bscan_aborted); + } + + } + } +#endif + +} +#endif + +/* +* return value : 0 is failed or have not interface meet condition +* return value : !0 is success or interface numbers which meet condition +* return value of ops_func must be _TRUE or _FALSE +*/ +static u8 _rtw_mi_process(_adapter *padapter, bool exclude_self, + void *data, u8(*ops_func)(_adapter *padapter, void *data)) +{ + int i; + _adapter *iface; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + + u8 ret = 0; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + + if ((exclude_self) && (iface == padapter)) + continue; + + if (ops_func) + if (_TRUE == ops_func(iface, data)) + ret++; + } + } + return ret; +} +static u8 _rtw_mi_netif_stop_queue(_adapter *padapter, void *data) +{ + bool carrier_off = *(bool *)data; + struct net_device *pnetdev = padapter->pnetdev; + + if (carrier_off) + netif_carrier_off(pnetdev); + rtw_netif_stop_queue(pnetdev); + return _TRUE; +} +u8 rtw_mi_netif_stop_queue(_adapter *padapter, bool carrier_off) +{ + bool in_data = carrier_off; + + return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_netif_stop_queue); +} +u8 rtw_mi_buddy_netif_stop_queue(_adapter *padapter, bool carrier_off) +{ + bool in_data = carrier_off; + + return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_netif_stop_queue); +} + +static u8 _rtw_mi_netif_wake_queue(_adapter *padapter, void *data) +{ + struct net_device *pnetdev = padapter->pnetdev; + + if (pnetdev) + rtw_netif_wake_queue(pnetdev); + return _TRUE; +} +u8 rtw_mi_netif_wake_queue(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_wake_queue); +} +u8 rtw_mi_buddy_netif_wake_queue(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_wake_queue); +} + +static u8 _rtw_mi_netif_carrier_on(_adapter *padapter, void *data) +{ + struct net_device *pnetdev = padapter->pnetdev; + + if (pnetdev) + rtw_netif_carrier_on(pnetdev); + return _TRUE; +} +u8 rtw_mi_netif_carrier_on(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_carrier_on); +} +u8 rtw_mi_buddy_netif_carrier_on(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_carrier_on); +} + +static u8 _rtw_mi_scan_abort(_adapter *adapter, void *data) +{ + bool bwait = *(bool *)data; + + if (bwait) + rtw_scan_abort(adapter); + else + rtw_scan_abort_no_wait(adapter); + + return _TRUE; +} +void rtw_mi_scan_abort(_adapter *adapter, bool bwait) +{ + bool in_data = bwait; + + _rtw_mi_process(adapter, _FALSE, &in_data, _rtw_mi_scan_abort); + +} +void rtw_mi_buddy_scan_abort(_adapter *adapter, bool bwait) +{ + bool in_data = bwait; + + _rtw_mi_process(adapter, _TRUE, &in_data, _rtw_mi_scan_abort); +} + +static u8 _rtw_mi_start_drv_threads(_adapter *adapter, void *data) +{ + rtw_start_drv_threads(adapter); + return _TRUE; +} +void rtw_mi_start_drv_threads(_adapter *adapter) +{ + _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_start_drv_threads); +} +void rtw_mi_buddy_start_drv_threads(_adapter *adapter) +{ + _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_start_drv_threads); +} + +static u8 _rtw_mi_stop_drv_threads(_adapter *adapter, void *data) +{ + rtw_stop_drv_threads(adapter); + return _TRUE; +} +void rtw_mi_stop_drv_threads(_adapter *adapter) +{ + _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_stop_drv_threads); +} +void rtw_mi_buddy_stop_drv_threads(_adapter *adapter) +{ + _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_stop_drv_threads); +} + +static u8 _rtw_mi_cancel_all_timer(_adapter *adapter, void *data) +{ + rtw_cancel_all_timer(adapter); + return _TRUE; +} +void rtw_mi_cancel_all_timer(_adapter *adapter) +{ + _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_cancel_all_timer); +} +void rtw_mi_buddy_cancel_all_timer(_adapter *adapter) +{ + _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_cancel_all_timer); +} + +static u8 _rtw_mi_reset_drv_sw(_adapter *adapter, void *data) +{ + rtw_reset_drv_sw(adapter); + return _TRUE; +} +void rtw_mi_reset_drv_sw(_adapter *adapter) +{ + _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_reset_drv_sw); +} +void rtw_mi_buddy_reset_drv_sw(_adapter *adapter) +{ + _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_reset_drv_sw); +} + +static u8 _rtw_mi_intf_start(_adapter *adapter, void *data) +{ + rtw_intf_start(adapter); + return _TRUE; +} +void rtw_mi_intf_start(_adapter *adapter) +{ + _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_intf_start); +} +void rtw_mi_buddy_intf_start(_adapter *adapter) +{ + _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_intf_start); +} + +static u8 _rtw_mi_intf_stop(_adapter *adapter, void *data) +{ + rtw_intf_stop(adapter); + return _TRUE; +} +void rtw_mi_intf_stop(_adapter *adapter) +{ + _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_intf_stop); +} +void rtw_mi_buddy_intf_stop(_adapter *adapter) +{ + _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_intf_stop); +} + +static u8 _rtw_mi_suspend_free_assoc_resource(_adapter *padapter, void *data) +{ + return rtw_suspend_free_assoc_resource(padapter); +} +void rtw_mi_suspend_free_assoc_resource(_adapter *adapter) +{ + _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_suspend_free_assoc_resource); +} +void rtw_mi_buddy_suspend_free_assoc_resource(_adapter *adapter) +{ + _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_suspend_free_assoc_resource); +} + +static u8 _rtw_mi_is_scan_deny(_adapter *adapter, void *data) +{ + return rtw_is_scan_deny(adapter); +} + +u8 rtw_mi_is_scan_deny(_adapter *adapter) +{ + return _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_is_scan_deny); + +} +u8 rtw_mi_buddy_is_scan_deny(_adapter *adapter) +{ + return _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_is_scan_deny); +} + +#ifdef CONFIG_SET_SCAN_DENY_TIMER +static u8 _rtw_mi_set_scan_deny(_adapter *adapter, void *data) +{ + u32 ms = *(u32 *)data; + + rtw_set_scan_deny(adapter, ms); + return _TRUE; +} +void rtw_mi_set_scan_deny(_adapter *adapter, u32 ms) +{ + u32 in_data = ms; + + _rtw_mi_process(adapter, _FALSE, &in_data, _rtw_mi_set_scan_deny); +} +void rtw_mi_buddy_set_scan_deny(_adapter *adapter, u32 ms) +{ + u32 in_data = ms; + + _rtw_mi_process(adapter, _TRUE, &in_data, _rtw_mi_set_scan_deny); +} +#endif + +struct nulldata_param { + unsigned char *da; + unsigned int power_mode; + int try_cnt; + int wait_ms; +}; + +static u8 _rtw_mi_issue_nulldata(_adapter *padapter, void *data) +{ + struct nulldata_param *pnulldata_param = (struct nulldata_param *)data; + + if (is_client_associated_to_ap(padapter) == _TRUE) { + /* TODO: TDLS peers */ + issue_nulldata(padapter, pnulldata_param->da, pnulldata_param->power_mode, pnulldata_param->try_cnt, pnulldata_param->wait_ms); + return _TRUE; + } + return _FALSE; +} + +u8 rtw_mi_issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms) +{ + struct nulldata_param nparam; + + nparam.da = da; + nparam.power_mode = power_mode;/*0 or 1*/ + nparam.try_cnt = try_cnt; + nparam.wait_ms = wait_ms; + + return _rtw_mi_process(padapter, _FALSE, &nparam, _rtw_mi_issue_nulldata); +} +u8 rtw_mi_buddy_issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms) +{ + struct nulldata_param nparam; + + nparam.da = da; + nparam.power_mode = power_mode; + nparam.try_cnt = try_cnt; + nparam.wait_ms = wait_ms; + + return _rtw_mi_process(padapter, _TRUE, &nparam, _rtw_mi_issue_nulldata); +} + +static u8 _rtw_mi_beacon_update(_adapter *padapter, void *data) +{ + struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv; + + if (mlmeext_msr(mlmeext) == WIFI_FW_AP_STATE + && check_fwstate(&padapter->mlmepriv, _FW_LINKED) == _TRUE) { + RTW_INFO(ADPT_FMT"-WIFI_FW_AP_STATE - update_beacon\n", ADPT_ARG(padapter)); + update_beacon(padapter, 0, NULL, _TRUE); + } + return _TRUE; +} + +void rtw_mi_beacon_update(_adapter *padapter) +{ + _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_beacon_update); +} + +void rtw_mi_buddy_beacon_update(_adapter *padapter) +{ + _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_beacon_update); +} + +static u8 _rtw_mi_hal_dump_macaddr(_adapter *padapter, void *data) +{ + u8 mac_addr[ETH_ALEN] = {0}; + + rtw_hal_get_macaddr_port(padapter, mac_addr); + RTW_INFO(ADPT_FMT"MAC Address ="MAC_FMT"\n", ADPT_ARG(padapter), MAC_ARG(mac_addr)); + return _TRUE; +} +void rtw_mi_hal_dump_macaddr(_adapter *padapter) +{ + _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_hal_dump_macaddr); +} +void rtw_mi_buddy_hal_dump_macaddr(_adapter *padapter) +{ + _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_hal_dump_macaddr); +} + +#ifdef CONFIG_PCI_HCI +static u8 _rtw_mi_xmit_tasklet_schedule(_adapter *padapter, void *data) +{ + if (rtw_txframes_pending(padapter)) { + /* try to deal with the pending packets */ + tasklet_hi_schedule(&(padapter->xmitpriv.xmit_tasklet)); + } + return _TRUE; +} +void rtw_mi_xmit_tasklet_schedule(_adapter *padapter) +{ + _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_xmit_tasklet_schedule); +} +void rtw_mi_buddy_xmit_tasklet_schedule(_adapter *padapter) +{ + _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_xmit_tasklet_schedule); +} +#endif + +u8 _rtw_mi_busy_traffic_check(_adapter *padapter, void *data) +{ + u32 passtime; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + bool check_sc_interval = *(bool *)data; + + if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) { + if (check_sc_interval) { + /* Miracast can't do AP scan*/ + passtime = rtw_get_passing_time_ms(pmlmepriv->lastscantime); + pmlmepriv->lastscantime = rtw_get_current_time(); + if (passtime > BUSY_TRAFFIC_SCAN_DENY_PERIOD) { + RTW_INFO(ADPT_FMT" bBusyTraffic == _TRUE\n", ADPT_ARG(padapter)); + return _TRUE; + } + } else + return _TRUE; + } + + return _FALSE; +} + +u8 rtw_mi_busy_traffic_check(_adapter *padapter, bool check_sc_interval) +{ + bool in_data = check_sc_interval; + + return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_busy_traffic_check); +} +u8 rtw_mi_buddy_busy_traffic_check(_adapter *padapter, bool check_sc_interval) +{ + bool in_data = check_sc_interval; + + return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_busy_traffic_check); +} +static u8 _rtw_mi_check_mlmeinfo_state(_adapter *padapter, void *data) +{ + u32 state = *(u32 *)data; + struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv; + + /*if (mlmeext_msr(mlmeext) == state)*/ + if (check_mlmeinfo_state(mlmeext, state)) + return _TRUE; + else + return _FALSE; +} + +u8 rtw_mi_check_mlmeinfo_state(_adapter *padapter, u32 state) +{ + u32 in_data = state; + + return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_check_mlmeinfo_state); +} + +u8 rtw_mi_buddy_check_mlmeinfo_state(_adapter *padapter, u32 state) +{ + u32 in_data = state; + + return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_check_mlmeinfo_state); +} + +/*#define DBG_DUMP_FW_STATE*/ +#ifdef DBG_DUMP_FW_STATE +static void rtw_dbg_dump_fwstate(_adapter *padapter, sint state) +{ + u8 buf[32] = {0}; + + if (state & WIFI_FW_NULL_STATE) { + _rtw_memset(buf, 0, 32); + sprintf(buf, "WIFI_FW_NULL_STATE"); + RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf); + } + + if (state & _FW_LINKED) { + _rtw_memset(buf, 0, 32); + sprintf(buf, "_FW_LINKED"); + RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf); + } + + if (state & _FW_UNDER_LINKING) { + _rtw_memset(buf, 0, 32); + sprintf(buf, "_FW_UNDER_LINKING"); + RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf); + } + + if (state & _FW_UNDER_SURVEY) { + _rtw_memset(buf, 0, 32); + sprintf(buf, "_FW_UNDER_SURVEY"); + RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf); + } +} +#endif + +static u8 _rtw_mi_check_fwstate(_adapter *padapter, void *data) +{ + u8 ret = _FALSE; + + sint state = *(sint *)data; + + if ((state == WIFI_FW_NULL_STATE) && + (padapter->mlmepriv.fw_state == WIFI_FW_NULL_STATE)) + ret = _TRUE; + else if (_TRUE == check_fwstate(&padapter->mlmepriv, state)) + ret = _TRUE; +#ifdef DBG_DUMP_FW_STATE + if (ret) + rtw_dbg_dump_fwstate(padapter, state); +#endif + return ret; +} +u8 rtw_mi_check_fwstate(_adapter *padapter, sint state) +{ + sint in_data = state; + + return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_check_fwstate); +} +u8 rtw_mi_buddy_check_fwstate(_adapter *padapter, sint state) +{ + sint in_data = state; + + return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_check_fwstate); +} + +static u8 _rtw_mi_traffic_statistics(_adapter *padapter , void *data) +{ + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); + + /* Tx */ + pdvobjpriv->traffic_stat.tx_bytes += padapter->xmitpriv.tx_bytes; + pdvobjpriv->traffic_stat.tx_pkts += padapter->xmitpriv.tx_pkts; + pdvobjpriv->traffic_stat.tx_drop += padapter->xmitpriv.tx_drop; + + /* Rx */ + pdvobjpriv->traffic_stat.rx_bytes += padapter->recvpriv.rx_bytes; + pdvobjpriv->traffic_stat.rx_pkts += padapter->recvpriv.rx_pkts; + pdvobjpriv->traffic_stat.rx_drop += padapter->recvpriv.rx_drop; + return _TRUE; +} +u8 rtw_mi_traffic_statistics(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_traffic_statistics); +} + +static u8 _rtw_mi_check_miracast_enabled(_adapter *padapter , void *data) +{ + return is_miracast_enabled(padapter); +} +u8 rtw_mi_check_miracast_enabled(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_check_miracast_enabled); +} + +#ifdef CONFIG_XMIT_THREAD_MODE +static u8 _rtw_mi_check_pending_xmitbuf(_adapter *padapter , void *data) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + return check_pending_xmitbuf(pxmitpriv); +} +u8 rtw_mi_check_pending_xmitbuf(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_check_pending_xmitbuf); +} +u8 rtw_mi_buddy_check_pending_xmitbuf(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_check_pending_xmitbuf); +} +#endif + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) +static u8 _rtw_mi_dequeue_writeport(_adapter *padapter , bool exclude_self) +{ + int i; + u8 queue_empty = _TRUE; + _adapter *iface; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + + if ((exclude_self) && (iface == padapter)) + continue; + + queue_empty &= _dequeue_writeport(iface); + } + } + return queue_empty; +} +u8 rtw_mi_dequeue_writeport(_adapter *padapter) +{ + return _rtw_mi_dequeue_writeport(padapter, _FALSE); +} +u8 rtw_mi_buddy_dequeue_writeport(_adapter *padapter) +{ + return _rtw_mi_dequeue_writeport(padapter, _TRUE); +} +#endif +static void _rtw_mi_adapter_reset(_adapter *padapter , u8 exclude_self) +{ + int i; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + + for (i = 0; i < dvobj->iface_nums; i++) { + if (dvobj->padapters[i]) { + if ((exclude_self) && (dvobj->padapters[i] == padapter)) + continue; + dvobj->padapters[i] = NULL; + } + } +} + +void rtw_mi_adapter_reset(_adapter *padapter) +{ + _rtw_mi_adapter_reset(padapter, _FALSE); +} + +void rtw_mi_buddy_adapter_reset(_adapter *padapter) +{ + _rtw_mi_adapter_reset(padapter, _TRUE); +} + +static u8 _rtw_mi_dynamic_check_timer_handlder(_adapter *adapter, void *data) +{ + rtw_iface_dynamic_check_timer_handlder(adapter); + return _TRUE; +} +u8 rtw_mi_dynamic_check_timer_handlder(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dynamic_check_timer_handlder); +} +u8 rtw_mi_buddy_dynamic_check_timer_handlder(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dynamic_check_timer_handlder); +} + +static u8 _rtw_mi_dev_unload(_adapter *adapter, void *data) +{ + rtw_dev_unload(adapter); + return _TRUE; +} +u8 rtw_mi_dev_unload(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dev_unload); +} +u8 rtw_mi_buddy_dev_unload(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dev_unload); +} + +static u8 _rtw_mi_dynamic_chk_wk_hdl(_adapter *adapter, void *data) +{ + rtw_iface_dynamic_chk_wk_hdl(adapter); + return _TRUE; +} +u8 rtw_mi_dynamic_chk_wk_hdl(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dynamic_chk_wk_hdl); +} +u8 rtw_mi_buddy_dynamic_chk_wk_hdl(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dynamic_chk_wk_hdl); +} + +static u8 _rtw_mi_os_xmit_schedule(_adapter *adapter, void *data) +{ + rtw_os_xmit_schedule(adapter); + return _TRUE; +} +u8 rtw_mi_os_xmit_schedule(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_os_xmit_schedule); +} +u8 rtw_mi_buddy_os_xmit_schedule(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_os_xmit_schedule); +} + +static u8 _rtw_mi_report_survey_event(_adapter *adapter, void *data) +{ + union recv_frame *precv_frame = (union recv_frame *)data; + + report_survey_event(adapter, precv_frame); + return _TRUE; +} +u8 rtw_mi_report_survey_event(_adapter *padapter, union recv_frame *precv_frame) +{ + return _rtw_mi_process(padapter, _FALSE, precv_frame, _rtw_mi_report_survey_event); +} +u8 rtw_mi_buddy_report_survey_event(_adapter *padapter, union recv_frame *precv_frame) +{ + return _rtw_mi_process(padapter, _TRUE, precv_frame, _rtw_mi_report_survey_event); +} + +static u8 _rtw_mi_sreset_adapter_hdl(_adapter *adapter, void *data) +{ + u8 bstart = *(u8 *)data; + + if (bstart) + sreset_start_adapter(adapter); + else + sreset_stop_adapter(adapter); + return _TRUE; +} +u8 rtw_mi_sreset_adapter_hdl(_adapter *padapter, u8 bstart) +{ + u8 in_data = bstart; + + return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_sreset_adapter_hdl); +} +u8 rtw_mi_buddy_sreset_adapter_hdl(_adapter *padapter, u8 bstart) +{ + u8 in_data = bstart; + + return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_sreset_adapter_hdl); +} +static u8 _rtw_mi_tx_beacon_hdl(_adapter *adapter, void *data) +{ + if (check_fwstate(&adapter->mlmepriv, WIFI_AP_STATE) == _TRUE + && check_fwstate(&adapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE + ) { + adapter->mlmepriv.update_bcn = _TRUE; +#ifndef CONFIG_INTERRUPT_BASED_TXBCN +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + tx_beacon_hdl(adapter, NULL); +#endif +#endif + } + return _TRUE; +} +u8 rtw_mi_tx_beacon_hdl(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_tx_beacon_hdl); +} +u8 rtw_mi_buddy_tx_beacon_hdl(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_sreset_adapter_hdl); +} + +static u8 _rtw_mi_set_tx_beacon_cmd(_adapter *adapter, void *data) +{ + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { + if (pmlmepriv->update_bcn == _TRUE) + set_tx_beacon_cmd(adapter); + } + return _TRUE; +} +u8 rtw_mi_set_tx_beacon_cmd(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_set_tx_beacon_cmd); +} +u8 rtw_mi_buddy_set_tx_beacon_cmd(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_set_tx_beacon_cmd); +} + +#ifdef CONFIG_P2P +static u8 _rtw_mi_p2p_chk_state(_adapter *adapter, void *data) +{ + struct wifidirect_info *pwdinfo = &(adapter->wdinfo); + enum P2P_STATE state = *(enum P2P_STATE *)data; + + return rtw_p2p_chk_state(pwdinfo, state); +} +u8 rtw_mi_p2p_chk_state(_adapter *padapter, enum P2P_STATE p2p_state) +{ + u8 in_data = p2p_state; + + return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_p2p_chk_state); +} +u8 rtw_mi_buddy_p2p_chk_state(_adapter *padapter, enum P2P_STATE p2p_state) +{ + u8 in_data = p2p_state; + + return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_p2p_chk_state); +} +static u8 _rtw_mi_stay_in_p2p_mode(_adapter *adapter, void *data) +{ + struct wifidirect_info *pwdinfo = &(adapter->wdinfo); + + if (rtw_p2p_role(pwdinfo) != P2P_ROLE_DISABLE) + return _TRUE; + return _FALSE; +} +u8 rtw_mi_stay_in_p2p_mode(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_stay_in_p2p_mode); +} +u8 rtw_mi_buddy_stay_in_p2p_mode(_adapter *padapter) +{ + return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_stay_in_p2p_mode); +} +#endif /*CONFIG_P2P*/ + +_adapter *rtw_get_iface_by_id(_adapter *padapter, u8 iface_id) +{ + _adapter *iface = NULL; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + + if ((padapter == NULL) || (iface_id >= CONFIG_IFACE_NUMBER)) { + rtw_warn_on(1); + return iface; + } + + return dvobj->padapters[iface_id]; +} + +_adapter *rtw_get_iface_by_macddr(_adapter *padapter, u8 *mac_addr) +{ + int i; + _adapter *iface = NULL; + u8 bmatch = _FALSE; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && (_rtw_memcmp(mac_addr, adapter_mac_addr(iface), ETH_ALEN))) { + bmatch = _TRUE; + break; + } + } + if (bmatch) + return iface; + else + return NULL; +} + +_adapter *rtw_get_iface_by_hwport(_adapter *padapter, u8 hw_port) +{ + int i; + _adapter *iface = NULL; + u8 bmatch = _FALSE; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && (hw_port == iface->hw_port)) { + bmatch = _TRUE; + break; + } + } + if (bmatch) + return iface; + else + return NULL; +} + +/*#define CONFIG_SKB_ALLOCATED*/ +#define DBG_SKB_PROCESS +#ifdef DBG_SKB_PROCESS +void rtw_dbg_skb_process(_adapter *padapter, union recv_frame *precvframe, union recv_frame *pcloneframe) +{ + _pkt *pkt_copy, *pkt_org; + + pkt_org = precvframe->u.hdr.pkt; + pkt_copy = pcloneframe->u.hdr.pkt; + /* + RTW_INFO("%s ===== ORG SKB =====\n", __func__); + RTW_INFO(" SKB head(%p)\n", pkt_org->head); + RTW_INFO(" SKB data(%p)\n", pkt_org->data); + RTW_INFO(" SKB tail(%p)\n", pkt_org->tail); + RTW_INFO(" SKB end(%p)\n", pkt_org->end); + + RTW_INFO(" recv frame head(%p)\n", precvframe->u.hdr.rx_head); + RTW_INFO(" recv frame data(%p)\n", precvframe->u.hdr.rx_data); + RTW_INFO(" recv frame tail(%p)\n", precvframe->u.hdr.rx_tail); + RTW_INFO(" recv frame end(%p)\n", precvframe->u.hdr.rx_end); + + RTW_INFO("%s ===== COPY SKB =====\n", __func__); + RTW_INFO(" SKB head(%p)\n", pkt_copy->head); + RTW_INFO(" SKB data(%p)\n", pkt_copy->data); + RTW_INFO(" SKB tail(%p)\n", pkt_copy->tail); + RTW_INFO(" SKB end(%p)\n", pkt_copy->end); + + RTW_INFO(" recv frame head(%p)\n", pcloneframe->u.hdr.rx_head); + RTW_INFO(" recv frame data(%p)\n", pcloneframe->u.hdr.rx_data); + RTW_INFO(" recv frame tail(%p)\n", pcloneframe->u.hdr.rx_tail); + RTW_INFO(" recv frame end(%p)\n", pcloneframe->u.hdr.rx_end); + */ + /* + RTW_INFO("%s => recv_frame adapter(%p,%p)\n", __func__, precvframe->u.hdr.adapter, pcloneframe->u.hdr.adapter); + RTW_INFO("%s => recv_frame dev(%p,%p)\n", __func__, pkt_org->dev , pkt_copy->dev); + RTW_INFO("%s => recv_frame len(%d,%d)\n", __func__, precvframe->u.hdr.len, pcloneframe->u.hdr.len); + */ + if (precvframe->u.hdr.len != pcloneframe->u.hdr.len) + RTW_INFO("%s [WARN] recv_frame length(%d:%d) compare failed\n", __func__, precvframe->u.hdr.len, pcloneframe->u.hdr.len); + + if (_rtw_memcmp(&precvframe->u.hdr.attrib, &pcloneframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib)) == _FALSE) + RTW_INFO("%s [WARN] recv_frame attrib compare failed\n", __func__); + + if (_rtw_memcmp(precvframe->u.hdr.rx_data, pcloneframe->u.hdr.rx_data, precvframe->u.hdr.len) == _FALSE) + RTW_INFO("%s [WARN] recv_frame rx_data compare failed\n", __func__); + +} +#endif + +static s32 _rtw_mi_buddy_clone_bcmc_packet(_adapter *adapter, union recv_frame *precvframe, u8 *pphy_status, union recv_frame *pcloneframe) +{ + s32 ret = _SUCCESS; + u8 *pbuf = precvframe->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = NULL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); + + if (pcloneframe) { + pcloneframe->u.hdr.adapter = adapter; + + _rtw_init_listhead(&pcloneframe->u.hdr.list); + pcloneframe->u.hdr.precvbuf = NULL; /*can't access the precvbuf for new arch.*/ + pcloneframe->u.hdr.len = 0; + + _rtw_memcpy(&pcloneframe->u.hdr.attrib, &precvframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib)); + + pattrib = &pcloneframe->u.hdr.attrib; +#ifdef CONFIG_SKB_ALLOCATED + if (rtw_os_alloc_recvframe(adapter, pcloneframe, pbuf, NULL) == _SUCCESS) +#else + if (rtw_os_recvframe_duplicate_skb(adapter, pcloneframe, precvframe->u.hdr.pkt) == _SUCCESS) +#endif + { +#ifdef CONFIG_SKB_ALLOCATED + recvframe_put(pcloneframe, pattrib->pkt_len); +#endif + +#ifdef DBG_SKB_PROCESS + rtw_dbg_skb_process(adapter, precvframe, pcloneframe); +#endif + + if (pattrib->physt && pphy_status) + rx_query_phy_status(pcloneframe, pphy_status); + + ret = rtw_recv_entry(pcloneframe); + } else { + ret = -1; + RTW_INFO("%s()-%d: rtw_os_alloc_recvframe() failed!\n", __func__, __LINE__); + } + + } + return ret; +} + +void rtw_mi_buddy_clone_bcmc_packet(_adapter *padapter, union recv_frame *precvframe, u8 *pphy_status) +{ + int i; + s32 ret = _SUCCESS; + _adapter *iface = NULL; + union recv_frame *pcloneframe = NULL; + struct recv_priv *precvpriv = &padapter->recvpriv;/*primary_padapter*/ + _queue *pfree_recv_queue = &precvpriv->free_recv_queue; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + if (iface == padapter) + continue; + pcloneframe = rtw_alloc_recvframe(pfree_recv_queue); + if (pcloneframe) { + ret = _rtw_mi_buddy_clone_bcmc_packet(iface, precvframe, pphy_status, pcloneframe); + if (_SUCCESS != ret) { + if (ret == -1) + rtw_free_recvframe(pcloneframe, pfree_recv_queue); + /*RTW_INFO(ADPT_FMT"-clone BC/MC frame failed\n", ADPT_ARG(iface));*/ + } + } + } + } + +} + +#ifdef CONFIG_PCI_HCI +/*API be created temporary for MI, caller is interrupt-handler, PCIE's interrupt handler cannot apply to multi-AP*/ +_adapter *rtw_mi_get_ap_adapter(_adapter *padapter) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + int i; + _adapter *iface = NULL; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if (!iface) + continue; + + if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE + && check_fwstate(&iface->mlmepriv, WIFI_ASOC_STATE) == _TRUE) + break; + + } + return iface; +} +#endif + +void rtw_mi_update_ap_bmc_camid(_adapter *padapter, u8 camid_a, u8 camid_b) +{ +#ifdef CONFIG_CONCURRENT_MODE + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + + int i; + _adapter *iface = NULL; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if (!iface) + continue; + + if (macid_ctl->iface_bmc[iface->iface_id] != INVALID_SEC_MAC_CAM_ID) { + if (macid_ctl->iface_bmc[iface->iface_id] == camid_a) + macid_ctl->iface_bmc[iface->iface_id] = camid_b; + else if (macid_ctl->iface_bmc[iface->iface_id] == camid_b) + macid_ctl->iface_bmc[iface->iface_id] = camid_a; + iface->securitypriv.dot118021x_bmc_cam_id = macid_ctl->iface_bmc[iface->iface_id]; + } + } +#endif +} diff --git a/core/rtw_mlme.c b/core/rtw_mlme.c old mode 100755 new mode 100644 index 7eb77c0..71ffc2a --- a/core/rtw_mlme.c +++ b/core/rtw_mlme.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. @@ -22,10 +22,10 @@ #include extern void indicate_wx_scan_complete_event(_adapter *padapter); -extern u8 rtw_do_join(_adapter * padapter); +extern u8 rtw_do_join(_adapter *padapter); -sint _rtw_init_mlme_priv (_adapter* padapter) +sint _rtw_init_mlme_priv(_adapter *padapter) { sint i; u8 *pbuf; @@ -33,39 +33,49 @@ sint _rtw_init_mlme_priv (_adapter* padapter) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; sint res = _SUCCESS; -_func_enter_; - // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). - //_rtw_memset((u8 *)pmlmepriv, 0, sizeof(struct mlme_priv)); + /* We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */ + /* _rtw_memset((u8 *)pmlmepriv, 0, sizeof(struct mlme_priv)); */ + + + /*qos_priv*/ + /*pmlmepriv->qospriv.qos_option = pregistrypriv->wmm_enable;*/ + + /*ht_priv*/ +#ifdef CONFIG_80211N_HT + pmlmepriv->htpriv.ampdu_enable = _FALSE;/*set to disabled*/ +#endif pmlmepriv->nic_hdl = (u8 *)padapter; pmlmepriv->pscanned = NULL; - pmlmepriv->fw_state = WIFI_STATION_STATE; // Must sync with rtw_wdev_alloc() - // wdev->iftype = NL80211_IFTYPE_STATION - pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown; - pmlmepriv->scan_mode=SCAN_ACTIVE;// 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) + /*pmlmepriv->fw_state = WIFI_STATION_STATE; */ /*Must sync with rtw_wdev_alloc()*/ + /*init_fwstate(pmlmepriv, WIFI_STATION_STATE);*/ + init_fwstate(pmlmepriv, WIFI_NULL_STATE);/*assigned interface role(STA/AP) must after execute set_opmode*/ - _rtw_spinlock_init(&(pmlmepriv->lock)); + /* wdev->iftype = NL80211_IFTYPE_STATION*/ + pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown; + pmlmepriv->scan_mode = SCAN_ACTIVE; /* 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) */ + + _rtw_spinlock_init(&(pmlmepriv->lock)); _rtw_init_queue(&(pmlmepriv->free_bss_pool)); _rtw_init_queue(&(pmlmepriv->scanned_queue)); set_scanned_network_val(pmlmepriv, 0); - - _rtw_memset(&pmlmepriv->assoc_ssid,0,sizeof(NDIS_802_11_SSID)); + + _rtw_memset(&pmlmepriv->assoc_ssid, 0, sizeof(NDIS_802_11_SSID)); pbuf = rtw_zvmalloc(MAX_BSS_CNT * (sizeof(struct wlan_network))); - - if (pbuf == NULL){ - res=_FAIL; + + if (pbuf == NULL) { + res = _FAIL; goto exit; } pmlmepriv->free_bss_buf = pbuf; - + pnetwork = (struct wlan_network *)pbuf; - - for(i = 0; i < MAX_BSS_CNT; i++) - { + + for (i = 0; i < MAX_BSS_CNT; i++) { _rtw_init_listhead(&(pnetwork->list)); rtw_list_insert_tail(&(pnetwork->list), &(pmlmepriv->free_bss_pool.queue)); @@ -73,7 +83,7 @@ _func_enter_; pnetwork++; } - //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf + /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ rtw_clear_scan_deny(padapter); #ifdef CONFIG_ARP_KEEP_ALIVE @@ -81,19 +91,19 @@ _func_enter_; #endif #ifdef CONFIG_LAYER2_ROAMING - #define RTW_ROAM_SCAN_RESULT_EXP_MS 5*1000 - #define RTW_ROAM_RSSI_DIFF_TH 10 - #define RTW_ROAM_SCAN_INTERVAL_MS 10*1000 +#define RTW_ROAM_SCAN_RESULT_EXP_MS (5*1000) +#define RTW_ROAM_RSSI_DIFF_TH 10 +#define RTW_ROAM_SCAN_INTERVAL_MS (10*1000) pmlmepriv->roam_flags = 0 - | RTW_ROAM_ON_EXPIRED - #ifdef CONFIG_LAYER2_ROAMING_RESUME - | RTW_ROAM_ON_RESUME - #endif - #ifdef CONFIG_LAYER2_ROAMING_ACTIVE - | RTW_ROAM_ACTIVE - #endif - ; + | RTW_ROAM_ON_EXPIRED +#ifdef CONFIG_LAYER2_ROAMING_RESUME + | RTW_ROAM_ON_RESUME +#endif +#ifdef CONFIG_LAYER2_ROAMING_ACTIVE + | RTW_ROAM_ACTIVE +#endif + ; pmlmepriv->roam_scanr_exp_ms = RTW_ROAM_SCAN_RESULT_EXP_MS; pmlmepriv->roam_rssi_diff_th = RTW_ROAM_RSSI_DIFF_TH; @@ -104,13 +114,12 @@ _func_enter_; exit: -_func_exit_; return res; -} +} -void rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv); -void rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv) +void rtw_mfree_mlme_priv_lock(struct mlme_priv *pmlmepriv); +void rtw_mfree_mlme_priv_lock(struct mlme_priv *pmlmepriv) { _rtw_spinlock_free(&pmlmepriv->lock); _rtw_spinlock_free(&(pmlmepriv->free_bss_pool.lock)); @@ -119,79 +128,173 @@ void rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv) static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen) { - if(*ppie) - { + if (*ppie) { rtw_mfree(*ppie, *plen); *plen = 0; - *ppie=NULL; - } + *ppie = NULL; + } } void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv) { -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) +#if defined(CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) rtw_buf_free(&pmlmepriv->assoc_req, &pmlmepriv->assoc_req_len); rtw_buf_free(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len); rtw_free_mlme_ie_data(&pmlmepriv->wps_beacon_ie, &pmlmepriv->wps_beacon_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_req_ie, &pmlmepriv->wps_probe_req_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_resp_ie, &pmlmepriv->wps_probe_resp_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->wps_assoc_resp_ie, &pmlmepriv->wps_assoc_resp_ie_len); - + rtw_free_mlme_ie_data(&pmlmepriv->p2p_beacon_ie, &pmlmepriv->p2p_beacon_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_req_ie, &pmlmepriv->p2p_probe_req_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_resp_ie, &pmlmepriv->p2p_probe_resp_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->p2p_go_probe_resp_ie, &pmlmepriv->p2p_go_probe_resp_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie, &pmlmepriv->p2p_assoc_req_ie_len); + rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_resp_ie, &pmlmepriv->p2p_assoc_resp_ie_len); #endif -#if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211) +#if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211) rtw_free_mlme_ie_data(&pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->wfd_go_probe_resp_ie, &pmlmepriv->wfd_go_probe_resp_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len); + rtw_free_mlme_ie_data(&pmlmepriv->wfd_assoc_resp_ie, &pmlmepriv->wfd_assoc_resp_ie_len); #endif } -void _rtw_free_mlme_priv (struct mlme_priv *pmlmepriv) +#if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211) +int rtw_mlme_update_wfd_ie_data(struct mlme_priv *mlme, u8 type, u8 *ie, u32 ie_len) { -_func_enter_; - if (NULL == pmlmepriv){ + _adapter *adapter = mlme_to_adapter(mlme); + struct wifi_display_info *wfd_info = &adapter->wfd_info; + u8 clear = 0; + u8 **t_ie = NULL; + u32 *t_ie_len = NULL; + int ret = _FAIL; + + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + goto success; + + if (wfd_info->wfd_enable == _TRUE) + goto success; /* WFD IE is build by self */ + + if (!ie && !ie_len) + clear = 1; + else if (!ie || !ie_len) { + RTW_PRINT(FUNC_ADPT_FMT" type:%u, ie:%p, ie_len:%u" + , FUNC_ADPT_ARG(adapter), type, ie, ie_len); + rtw_warn_on(1); + goto exit; + } + + switch (type) { + case MLME_BEACON_IE: + t_ie = &mlme->wfd_beacon_ie; + t_ie_len = &mlme->wfd_beacon_ie_len; + break; + case MLME_PROBE_REQ_IE: + t_ie = &mlme->wfd_probe_req_ie; + t_ie_len = &mlme->wfd_probe_req_ie_len; + break; + case MLME_PROBE_RESP_IE: + t_ie = &mlme->wfd_probe_resp_ie; + t_ie_len = &mlme->wfd_probe_resp_ie_len; + break; + case MLME_GO_PROBE_RESP_IE: + t_ie = &mlme->wfd_go_probe_resp_ie; + t_ie_len = &mlme->wfd_go_probe_resp_ie_len; + break; + case MLME_ASSOC_REQ_IE: + t_ie = &mlme->wfd_assoc_req_ie; + t_ie_len = &mlme->wfd_assoc_req_ie_len; + break; + case MLME_ASSOC_RESP_IE: + t_ie = &mlme->wfd_assoc_resp_ie; + t_ie_len = &mlme->wfd_assoc_resp_ie_len; + break; + default: + RTW_PRINT(FUNC_ADPT_FMT" unsupported type:%u" + , FUNC_ADPT_ARG(adapter), type); + rtw_warn_on(1); + goto exit; + } + + if (*t_ie) { + u32 free_len = *t_ie_len; + *t_ie_len = 0; + rtw_mfree(*t_ie, free_len); + *t_ie = NULL; + } + + if (!clear) { + *t_ie = rtw_malloc(ie_len); + if (*t_ie == NULL) { + RTW_ERR(FUNC_ADPT_FMT" type:%u, rtw_malloc() fail\n" + , FUNC_ADPT_ARG(adapter), type); + goto exit; + } + _rtw_memcpy(*t_ie, ie, ie_len); + *t_ie_len = ie_len; + } + + if (*t_ie && *t_ie_len) { + u8 *attr_content; + u32 attr_contentlen = 0; + + attr_content = rtw_get_wfd_attr_content(*t_ie, *t_ie_len, WFD_ATTR_DEVICE_INFO, NULL, &attr_contentlen); + if (attr_content && attr_contentlen) { + if (RTW_GET_BE16(attr_content + 2) != wfd_info->rtsp_ctrlport) { + wfd_info->rtsp_ctrlport = RTW_GET_BE16(attr_content + 2); + RTW_INFO(FUNC_ADPT_FMT" type:%u, RTSP CTRL port = %u\n" + , FUNC_ADPT_ARG(adapter), type, wfd_info->rtsp_ctrlport); + } + } + } + +success: + ret = _SUCCESS; + +exit: + return ret; +} +#endif /* defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211) */ + +void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) +{ + if (NULL == pmlmepriv) { rtw_warn_on(1); goto exit; } rtw_free_mlme_priv_ie_data(pmlmepriv); - if(pmlmepriv){ - rtw_mfree_mlme_priv_lock (pmlmepriv); + if (pmlmepriv) { + rtw_mfree_mlme_priv_lock(pmlmepriv); - if (pmlmepriv->free_bss_buf) { + if (pmlmepriv->free_bss_buf) rtw_vmfree(pmlmepriv->free_bss_buf, MAX_BSS_CNT * sizeof(struct wlan_network)); - } } exit: -_func_exit_; + return; } sint _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork) { _irqL irqL; -_func_enter_; if (pnetwork == NULL) goto exit; - + _enter_critical_bh(&queue->lock, &irqL); rtw_list_insert_tail(&pnetwork->list, &queue->queue); _exit_critical_bh(&queue->lock, &irqL); -exit: +exit: -_func_exit_; return _SUCCESS; } @@ -203,75 +306,69 @@ struct wlan_network *_rtw_dequeue_network(_queue *queue) struct wlan_network *pnetwork; -_func_enter_; _enter_critical_bh(&queue->lock, &irqL); if (_rtw_queue_empty(queue) == _TRUE) pnetwork = NULL; - + else { pnetwork = LIST_CONTAINOR(get_next(&queue->queue), struct wlan_network, list); - + rtw_list_delete(&(pnetwork->list)); } - + _exit_critical_bh(&queue->lock, &irqL); -_func_exit_; return pnetwork; } */ -struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue) +struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv) /* (_queue *free_queue) */ { _irqL irqL; - struct wlan_network *pnetwork; + struct wlan_network *pnetwork; _queue *free_queue = &pmlmepriv->free_bss_pool; - _list* plist = NULL; - -_func_enter_; + _list *plist = NULL; + _enter_critical_bh(&free_queue->lock, &irqL); - + if (_rtw_queue_empty(free_queue) == _TRUE) { - pnetwork=NULL; + pnetwork = NULL; goto exit; } plist = get_next(&(free_queue->queue)); - + pnetwork = LIST_CONTAINOR(plist , struct wlan_network, list); - + rtw_list_delete(&pnetwork->list); - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("_rtw_alloc_network: ptr=%p\n", plist)); + pnetwork->network_type = 0; pnetwork->fixed = _FALSE; pnetwork->last_scanned = rtw_get_current_time(); - pnetwork->aid=0; - pnetwork->join_res=0; + pnetwork->aid = 0; + pnetwork->join_res = 0; + + pmlmepriv->num_of_scanned++; - pmlmepriv->num_of_scanned ++; - exit: _exit_critical_bh(&free_queue->lock, &irqL); -_func_exit_; - return pnetwork; + return pnetwork; } -void _rtw_free_network(struct mlme_priv *pmlmepriv ,struct wlan_network *pnetwork, u8 isfreeall) +void _rtw_free_network(struct mlme_priv *pmlmepriv , struct wlan_network *pnetwork, u8 isfreeall) { u32 delta_time; u32 lifetime = SCANQUEUE_LIFETIME; - _irqL irqL; + _irqL irqL; _queue *free_queue = &(pmlmepriv->free_bss_pool); - -_func_enter_; + if (pnetwork == NULL) goto exit; @@ -279,34 +376,31 @@ _func_enter_; if (pnetwork->fixed == _TRUE) goto exit; - if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) ) + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) lifetime = 1; - if(!isfreeall) - { + if (!isfreeall) { delta_time = (u32) rtw_get_passing_time_ms(pnetwork->last_scanned); - if(delta_time < lifetime)// unit:msec + if (delta_time < lifetime) /* unit:msec */ goto exit; } _enter_critical_bh(&free_queue->lock, &irqL); - + rtw_list_delete(&(pnetwork->list)); - rtw_list_insert_tail(&(pnetwork->list),&(free_queue->queue)); - - pmlmepriv->num_of_scanned --; - + rtw_list_insert_tail(&(pnetwork->list), &(free_queue->queue)); + + pmlmepriv->num_of_scanned--; + + + /* RTW_INFO("_rtw_free_network:SSID=%s\n", pnetwork->network.Ssid.Ssid); */ - //DBG_871X("_rtw_free_network:SSID=%s\n", pnetwork->network.Ssid.Ssid); - _exit_critical_bh(&free_queue->lock, &irqL); - -exit: - -_func_exit_; +exit: + return; } void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork) @@ -314,7 +408,6 @@ void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network * _queue *free_queue = &(pmlmepriv->free_bss_pool); -_func_enter_; if (pnetwork == NULL) goto exit; @@ -322,20 +415,18 @@ _func_enter_; if (pnetwork->fixed == _TRUE) goto exit; - //_enter_critical(&free_queue->lock, &irqL); - + /* _enter_critical(&free_queue->lock, &irqL); */ + rtw_list_delete(&(pnetwork->list)); rtw_list_insert_tail(&(pnetwork->list), get_list_head(free_queue)); - - pmlmepriv->num_of_scanned --; - - //_exit_critical(&free_queue->lock, &irqL); - -exit: -_func_exit_; + pmlmepriv->num_of_scanned--; + /* _exit_critical(&free_queue->lock, &irqL); */ + +exit: + return; } @@ -347,44 +438,41 @@ _func_exit_; struct wlan_network *_rtw_find_network(_queue *scanned_queue, u8 *addr) { - //_irqL irqL; + /* _irqL irqL; */ _list *phead, *plist; struct wlan_network *pnetwork = NULL; - u8 zero_addr[ETH_ALEN] = {0,0,0,0,0,0}; - -_func_enter_; + u8 zero_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; - if(_rtw_memcmp(zero_addr, addr, ETH_ALEN)){ - pnetwork=NULL; + + if (_rtw_memcmp(zero_addr, addr, ETH_ALEN)) { + pnetwork = NULL; goto exit; } - - //_enter_critical_bh(&scanned_queue->lock, &irqL); - + + /* _enter_critical_bh(&scanned_queue->lock, &irqL); */ + phead = get_list_head(scanned_queue); plist = get_next(phead); - - while (plist != phead) - { - pnetwork = LIST_CONTAINOR(plist, struct wlan_network ,list); + + while (plist != phead) { + pnetwork = LIST_CONTAINOR(plist, struct wlan_network , list); if (_rtw_memcmp(addr, pnetwork->network.MacAddress, ETH_ALEN) == _TRUE) - break; - - plist = get_next(plist); - } + break; - if(plist == phead) + plist = get_next(plist); + } + + if (plist == phead) pnetwork = NULL; - //_exit_critical_bh(&scanned_queue->lock, &irqL); - -exit: - -_func_exit_; + /* _exit_critical_bh(&scanned_queue->lock, &irqL); */ + +exit: + return pnetwork; - + } @@ -393,124 +481,100 @@ void _rtw_free_network_queue(_adapter *padapter, u8 isfreeall) _irqL irqL; _list *phead, *plist; struct wlan_network *pnetwork; - struct mlme_priv* pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; _queue *scanned_queue = &pmlmepriv->scanned_queue; -_func_enter_; - + _enter_critical_bh(&scanned_queue->lock, &irqL); phead = get_list_head(scanned_queue); plist = get_next(phead); - while (rtw_end_of_queue_search(phead, plist) == _FALSE) - { + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); plist = get_next(plist); - _rtw_free_network(pmlmepriv,pnetwork, isfreeall); - + _rtw_free_network(pmlmepriv, pnetwork, isfreeall); + } _exit_critical_bh(&scanned_queue->lock, &irqL); - -_func_exit_; + } -sint rtw_if_up(_adapter *padapter) { +sint rtw_if_up(_adapter *padapter) +{ sint res; -_func_enter_; if (RTW_CANNOT_RUN(padapter) || - (check_fwstate(&padapter->mlmepriv, _FW_LINKED) == _FALSE)) { - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_if_up:bDriverStopped(%s) OR bSurpriseRemoved(%s)" - , rtw_is_drv_stopped(padapter)?"True":"False" - , rtw_is_surprise_removed(padapter)?"True":"False")); - res=_FALSE; - } - else - res= _TRUE; - -_func_exit_; + (check_fwstate(&padapter->mlmepriv, _FW_LINKED) == _FALSE)) { + res = _FALSE; + } else + res = _TRUE; + return res; } -void rtw_generate_random_ibss(u8* pibss) +void rtw_generate_random_ibss(u8 *pibss) { - u32 curtime = rtw_get_current_time(); - -_func_enter_; - pibss[0] = 0x02; //in ad-hoc mode bit1 must set to 1 + *((u32 *)(&pibss[2])) = rtw_random32(); + pibss[0] = 0x02; /* in ad-hoc mode local bit must set to 1 */ pibss[1] = 0x11; pibss[2] = 0x87; - pibss[3] = (u8)(curtime & 0xff) ;//p[0]; - pibss[4] = (u8)((curtime>>8) & 0xff) ;//p[1]; - pibss[5] = (u8)((curtime>>16) & 0xff) ;//p[2]; -_func_exit_; - return; } u8 *rtw_get_capability_from_ie(u8 *ie) { - return (ie + 8 + 2); + return ie + 8 + 2; } u16 rtw_get_capability(WLAN_BSSID_EX *bss) { u16 val; -_func_enter_; - _rtw_memcpy((u8 *)&val, rtw_get_capability_from_ie(bss->IEs), 2); + _rtw_memcpy((u8 *)&val, rtw_get_capability_from_ie(bss->IEs), 2); -_func_exit_; return le16_to_cpu(val); } u8 *rtw_get_timestampe_from_ie(u8 *ie) { - return (ie + 0); + return ie + 0; } u8 *rtw_get_beacon_interval_from_ie(u8 *ie) { - return (ie + 8); + return ie + 8; } -int rtw_init_mlme_priv (_adapter *padapter)//(struct mlme_priv *pmlmepriv) +int rtw_init_mlme_priv(_adapter *padapter) /* (struct mlme_priv *pmlmepriv) */ { int res; -_func_enter_; - res = _rtw_init_mlme_priv(padapter);// (pmlmepriv); -_func_exit_; + res = _rtw_init_mlme_priv(padapter);/* (pmlmepriv); */ return res; } -void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv) +void rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) { -_func_enter_; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_mlme_priv\n")); - _rtw_free_mlme_priv (pmlmepriv); -_func_exit_; + _rtw_free_mlme_priv(pmlmepriv); } int rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork); int rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork) { int res; -_func_enter_; res = _rtw_enqueue_network(queue, pnetwork); -_func_exit_; return res; } @@ -518,50 +582,38 @@ _func_exit_; static struct wlan_network *rtw_dequeue_network(_queue *queue) { struct wlan_network *pnetwork; -_func_enter_; pnetwork = _rtw_dequeue_network(queue); -_func_exit_; return pnetwork; } */ -struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv ); -struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue) +struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv); +struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv) /* (_queue *free_queue) */ { struct wlan_network *pnetwork; -_func_enter_; pnetwork = _rtw_alloc_network(pmlmepriv); -_func_exit_; return pnetwork; } void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 is_freeall); -void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 is_freeall)//(struct wlan_network *pnetwork, _queue *free_queue) +void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 is_freeall)/* (struct wlan_network *pnetwork, _queue *free_queue) */ { -_func_enter_; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid)); _rtw_free_network(pmlmepriv, pnetwork, is_freeall); -_func_exit_; } -void rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork ); -void rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork ) +void rtw_free_network_nolock(_adapter *padapter, struct wlan_network *pnetwork); +void rtw_free_network_nolock(_adapter *padapter, struct wlan_network *pnetwork) { -_func_enter_; - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid)); _rtw_free_network_nolock(&(padapter->mlmepriv), pnetwork); #ifdef CONFIG_IOCTL_CFG80211 rtw_cfg80211_unlink_bss(padapter, pnetwork); -#endif //CONFIG_IOCTL_CFG80211 -_func_exit_; +#endif /* CONFIG_IOCTL_CFG80211 */ } -void rtw_free_network_queue(_adapter* dev, u8 isfreeall) +void rtw_free_network_queue(_adapter *dev, u8 isfreeall) { -_func_enter_; _rtw_free_network_queue(dev, isfreeall); -_func_exit_; } /* @@ -578,71 +630,60 @@ struct wlan_network *rtw_find_network(_queue *scanned_queue, u8 *addr) int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork) { - int ret=_TRUE; + int ret = _TRUE; struct security_priv *psecuritypriv = &adapter->securitypriv; - if ( (psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ ) && - ( pnetwork->network.Privacy == 0 ) ) - { - ret=_FALSE; - } - else if((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_ ) && - ( pnetwork->network.Privacy == 1 ) ) - { - ret=_FALSE; - } + if ((psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_) && + (pnetwork->network.Privacy == 0)) + ret = _FALSE; + else if ((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_) && + (pnetwork->network.Privacy == 1)) + ret = _FALSE; else - { - ret=_TRUE; - } - + ret = _TRUE; + return ret; - + } inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b) { - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(%s,%d)(%s,%d)\n", - // a->Ssid.Ssid,a->Ssid.SsidLength,b->Ssid.Ssid,b->Ssid.SsidLength)); - return (a->Ssid.SsidLength == b->Ssid.SsidLength) - && _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength)==_TRUE; + return (a->Ssid.SsidLength == b->Ssid.SsidLength) + && _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength) == _TRUE; } int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst, u8 feature) { - u16 s_cap, d_cap; - -_func_enter_; + u16 s_cap, d_cap; - if(rtw_bug_check(dst, src, &s_cap, &d_cap)==_FALSE) - return _FALSE; + + if (rtw_bug_check(dst, src, &s_cap, &d_cap) == _FALSE) + return _FALSE; _rtw_memcpy((u8 *)&s_cap, rtw_get_capability_from_ie(src->IEs), 2); _rtw_memcpy((u8 *)&d_cap, rtw_get_capability_from_ie(dst->IEs), 2); - + s_cap = le16_to_cpu(s_cap); d_cap = le16_to_cpu(d_cap); - -_func_exit_; + #ifdef CONFIG_P2P - if ((feature == 1) && // 1: P2P supported - (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN) == _TRUE) - ) { + if ((feature == 1) && /* 1: P2P supported */ + (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN) == _TRUE) + ) return _TRUE; - } #endif return ((src->Ssid.SsidLength == dst->Ssid.SsidLength) && - // (src->Configuration.DSConfig == dst->Configuration.DSConfig) && - ( (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) && - ( (_rtw_memcmp(src->Ssid.Ssid, dst->Ssid.Ssid, src->Ssid.SsidLength)) == _TRUE) && - ((s_cap & WLAN_CAPABILITY_IBSS) == - (d_cap & WLAN_CAPABILITY_IBSS)) && - ((s_cap & WLAN_CAPABILITY_BSS) == - (d_cap & WLAN_CAPABILITY_BSS))); - + /* (src->Configuration.DSConfig == dst->Configuration.DSConfig) && */ + ((_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) && + ((_rtw_memcmp(src->Ssid.Ssid, dst->Ssid.Ssid, src->Ssid.SsidLength)) == _TRUE) && + ((s_cap & WLAN_CAPABILITY_IBSS) == + (d_cap & WLAN_CAPABILITY_IBSS)) && + ((s_cap & WLAN_CAPABILITY_BSS) == + (d_cap & WLAN_CAPABILITY_BSS))); + } struct wlan_network *_rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network) @@ -654,17 +695,17 @@ struct wlan_network *_rtw_find_same_network(_queue *scanned_queue, struct wlan_n plist = get_next(phead); while (plist != phead) { - found = LIST_CONTAINOR(plist, struct wlan_network ,list); + found = LIST_CONTAINOR(plist, struct wlan_network , list); - if (is_same_network(&network->network, &found->network,0)) + if (is_same_network(&network->network, &found->network, 0)) break; plist = get_next(plist); } - if(plist == phead) + if (plist == phead) found = NULL; -exit: +exit: return found; } @@ -674,7 +715,7 @@ struct wlan_network *rtw_find_same_network(_queue *scanned_queue, struct wlan_ne struct wlan_network *found = NULL; if (scanned_queue == NULL || network == NULL) - goto exit; + goto exit; _enter_critical_bh(&scanned_queue->lock, &irqL); found = _rtw_find_same_network(scanned_queue, network); @@ -684,41 +725,37 @@ exit: return found; } -struct wlan_network * rtw_get_oldest_wlan_network(_queue *scanned_queue) +struct wlan_network *rtw_get_oldest_wlan_network(_queue *scanned_queue) { _list *plist, *phead; - + struct wlan_network *pwlan = NULL; struct wlan_network *oldest = NULL; -_func_enter_; phead = get_list_head(scanned_queue); - + plist = get_next(phead); - while(1) - { - - if (rtw_end_of_queue_search(phead,plist)== _TRUE) - break; - - pwlan= LIST_CONTAINOR(plist, struct wlan_network, list); + while (1) { - if(pwlan->fixed!=_TRUE) - { - if (oldest == NULL ||time_after(oldest->last_scanned, pwlan->last_scanned)) + if (rtw_end_of_queue_search(phead, plist) == _TRUE) + break; + + pwlan = LIST_CONTAINOR(plist, struct wlan_network, list); + + if (pwlan->fixed != _TRUE) { + if (oldest == NULL || time_after(oldest->last_scanned, pwlan->last_scanned)) oldest = pwlan; } - + plist = get_next(plist); } -_func_exit_; return oldest; - + } void update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src, - _adapter * padapter, bool update_ie) + _adapter *padapter, bool update_ie) { u8 ss_ori = dst->PhyInfo.SignalStrength; u8 sq_ori = dst->PhyInfo.SignalQuality; @@ -732,22 +769,21 @@ void update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src, u8 sq_final; long rssi_final; -_func_enter_; #ifdef CONFIG_ANTENNA_DIVERSITY - rtw_hal_antdiv_rssi_compared(padapter, dst, src); //this will update src.Rssi, need consider again + rtw_hal_antdiv_rssi_compared(padapter, dst, src); /* this will update src.Rssi, need consider again */ #endif - #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1 - if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { - DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n" - , FUNC_ADPT_ARG(padapter) +#if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1 + if (strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { + RTW_INFO(FUNC_ADPT_FMT" %s("MAC_FMT", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n" + , FUNC_ADPT_ARG(padapter) , src->Ssid.Ssid, MAC_ARG(src->MacAddress), src->Configuration.DSConfig - ,ss_ori, sq_ori, rssi_ori - ,ss_smp, sq_smp, rssi_smp - ); + , ss_ori, sq_ori, rssi_ori + , ss_smp, sq_smp, rssi_smp + ); } - #endif +#endif /* The rule below is 1/5 for sample value, 4/5 for history value */ if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src, 0)) { @@ -755,23 +791,22 @@ _func_enter_; ss_final = padapter->recvpriv.signal_strength; sq_final = padapter->recvpriv.signal_qual; /* the rssi value here is undecorated, and will be used for antenna diversity */ - if(sq_smp != 101) /* from the right channel */ - rssi_final = (src->Rssi+dst->Rssi*4)/5; + if (sq_smp != 101) /* from the right channel */ + rssi_final = (src->Rssi + dst->Rssi * 4) / 5; else rssi_final = rssi_ori; - } - else { - if(sq_smp != 101) { /* from the right channel */ - ss_final = ((u32)(src->PhyInfo.SignalStrength)+(u32)(dst->PhyInfo.SignalStrength)*4)/5; - sq_final = ((u32)(src->PhyInfo.SignalQuality)+(u32)(dst->PhyInfo.SignalQuality)*4)/5; - rssi_final = (src->Rssi+dst->Rssi*4)/5; + } else { + if (sq_smp != 101) { /* from the right channel */ + ss_final = ((u32)(src->PhyInfo.SignalStrength) + (u32)(dst->PhyInfo.SignalStrength) * 4) / 5; + sq_final = ((u32)(src->PhyInfo.SignalQuality) + (u32)(dst->PhyInfo.SignalQuality) * 4) / 5; + rssi_final = (src->Rssi + dst->Rssi * 4) / 5; } else { /* bss info not receving from the right channel, use the original RX signal infos */ ss_final = dst->PhyInfo.SignalStrength; sq_final = dst->PhyInfo.SignalQuality; rssi_final = dst->Rssi; } - + } if (update_ie) { @@ -784,76 +819,68 @@ _func_enter_; dst->PhyInfo.SignalQuality = sq_final; dst->Rssi = rssi_final; - #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1 - if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { - DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n" - , FUNC_ADPT_ARG(padapter) +#if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1 + if (strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { + RTW_INFO(FUNC_ADPT_FMT" %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n" + , FUNC_ADPT_ARG(padapter) , dst->Ssid.Ssid, MAC_ARG(dst->MacAddress), dst->PhyInfo.SignalStrength, dst->PhyInfo.SignalQuality, dst->Rssi); } - #endif +#endif -#if 0 // old codes, may be useful one day... -// DBG_871X("update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi); - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) - { - - //DBG_871X("b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal); - 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 += query_rx_pwr_percentage(src->Rssi); +#if 0 /* old codes, may be useful one day... + * RTW_INFO("update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi); */ + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) { - padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = query_rx_pwr_percentage(src->Rssi); - if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) - padapter->recvpriv.signal_qual_data.index = 0; + /* RTW_INFO("b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal); */ + 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 += query_rx_pwr_percentage(src->Rssi); - //DBG_871X("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, src->Rssi); + padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = query_rx_pwr_percentage(src->Rssi); + if (padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) + padapter->recvpriv.signal_qual_data.index = 0; - // <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=(u8)tmpVal;//Link quality + /* RTW_INFO("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, src->Rssi); */ - src->Rssi= translate_percentage_to_dbm(padapter->recvpriv.signal) ; + /* <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 = (u8)tmpVal; /* Link quality */ + + src->Rssi = translate_percentage_to_dbm(padapter->recvpriv.signal) ; + } else { + /* RTW_INFO("ELSE:ssid=%s update_network: src->rssi=0x%d dst->rssi=%d\n",src->Ssid.Ssid,src->Rssi,dst->Rssi); */ + src->Rssi = (src->Rssi + dst->Rssi) / 2; /* dBM */ } - else{ -// DBG_871X("ELSE:ssid=%s update_network: src->rssi=0x%d dst->rssi=%d\n",src->Ssid.Ssid,src->Rssi,dst->Rssi); - src->Rssi=(src->Rssi +dst->Rssi)/2;//dBM - } -// DBG_871X("a:update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Rssi,padapter->recvpriv.signal); + /* RTW_INFO("a:update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Rssi,padapter->recvpriv.signal); */ #endif -_func_exit_; } static void update_current_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork) { struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - -_func_enter_; - rtw_bug_check(&(pmlmepriv->cur_network.network), - &(pmlmepriv->cur_network.network), - &(pmlmepriv->cur_network.network), - &(pmlmepriv->cur_network.network)); - if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork, 0))) - { - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"Same Network\n"); + rtw_bug_check(&(pmlmepriv->cur_network.network), + &(pmlmepriv->cur_network.network), + &(pmlmepriv->cur_network.network), + &(pmlmepriv->cur_network.network)); - //if(pmlmepriv->cur_network.network.IELength<= pnetwork->IELength) + if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork, 0))) { + + /* if(pmlmepriv->cur_network.network.IELength<= pnetwork->IELength) */ { - update_network(&(pmlmepriv->cur_network.network), pnetwork,adapter, _TRUE); - rtw_update_protection(adapter, (pmlmepriv->cur_network.network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), - pmlmepriv->cur_network.network.IELength); + update_network(&(pmlmepriv->cur_network.network), pnetwork, adapter, _TRUE); + rtw_update_protection(adapter, (pmlmepriv->cur_network.network.IEs) + sizeof(NDIS_802_11_FIXED_IEs), + pmlmepriv->cur_network.network.IELength); } } -_func_exit_; } @@ -872,15 +899,14 @@ void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target) struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(adapter->wdinfo); -#endif // CONFIG_P2P + struct wifidirect_info *pwdinfo = &(adapter->wdinfo); +#endif /* CONFIG_P2P */ _queue *queue = &(pmlmepriv->scanned_queue); struct wlan_network *pnetwork = NULL; struct wlan_network *oldest = NULL; int target_find = 0; - u8 feature = 0; + u8 feature = 0; -_func_enter_; _enter_critical_bh(&queue->lock, &irqL); phead = get_list_head(queue); @@ -888,12 +914,11 @@ _func_enter_; #ifdef CONFIG_P2P if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - feature = 1; // p2p enable + feature = 1; /* p2p enable */ #endif - while(1) - { - if (rtw_end_of_queue_search(phead,plist)== _TRUE) + while (1) { + if (rtw_end_of_queue_search(phead, plist) == _TRUE) break; pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); @@ -902,15 +927,13 @@ _func_enter_; #ifdef CONFIG_P2P if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && - (_rtw_memcmp(pnetwork->network.MacAddress, target->MacAddress, ETH_ALEN) == _TRUE)) - { + (_rtw_memcmp(pnetwork->network.MacAddress, target->MacAddress, ETH_ALEN) == _TRUE)) { target_find = 1; break; } #endif - if (is_same_network(&(pnetwork->network), target, feature)) - { + if (is_same_network(&(pnetwork->network), target, feature)) { target_find = 1; break; } @@ -925,55 +948,50 @@ _func_enter_; plist = get_next(plist); } - - + + /* If we didn't find a match, then get a new network slot to initialize * with this beacon's information */ - //if (rtw_end_of_queue_search(phead,plist)== _TRUE) { - if (!target_find) { + /* if (rtw_end_of_queue_search(phead,plist)== _TRUE) { */ + if (!target_find) { if (_rtw_queue_empty(&(pmlmepriv->free_bss_pool)) == _TRUE) { /* If there are no more slots, expire the oldest */ - //list_del_init(&oldest->list); + /* list_del_init(&oldest->list); */ pnetwork = oldest; - if(pnetwork==NULL){ - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n\nsomething wrong here\n\n\n")); + if (pnetwork == NULL) { goto exit; } #ifdef CONFIG_ANTENNA_DIVERSITY - //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;//optimum_antenna=>For antenna diversity - rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); + rtw_hal_get_odm_var(adapter, HAL_ODM_ANTDIV_SELECT, &(target->PhyInfo.Optimum_antenna), NULL); #endif _rtw_memcpy(&(pnetwork->network), target, get_WLAN_BSSID_EX_sz(target)); - //pnetwork->last_scanned = rtw_get_current_time(); - // variable initialize + /* pnetwork->last_scanned = rtw_get_current_time(); */ + /* variable initialize */ pnetwork->fixed = _FALSE; pnetwork->last_scanned = rtw_get_current_time(); - pnetwork->network_type = 0; - pnetwork->aid=0; - pnetwork->join_res=0; + pnetwork->network_type = 0; + pnetwork->aid = 0; + pnetwork->join_res = 0; /* bss info not receving from the right channel */ if (pnetwork->network.PhyInfo.SignalQuality == 101) pnetwork->network.PhyInfo.SignalQuality = 0; - } - else { + } else { /* Otherwise just pull from the free list */ - pnetwork = rtw_alloc_network(pmlmepriv); // will update scan_time + pnetwork = rtw_alloc_network(pmlmepriv); /* will update scan_time */ - if(pnetwork==NULL){ - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n\nsomething wrong here\n\n\n")); + if (pnetwork == NULL) { goto exit; } bssid_ex_sz = get_WLAN_BSSID_EX_sz(target); target->Length = bssid_ex_sz; #ifdef CONFIG_ANTENNA_DIVERSITY - //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna; - rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); + rtw_hal_get_odm_var(adapter, HAL_ODM_ANTDIV_SELECT, &(target->PhyInfo.Optimum_antenna), NULL); #endif - _rtw_memcpy(&(pnetwork->network), target, bssid_ex_sz ); + _rtw_memcpy(&(pnetwork->network), target, bssid_ex_sz); pnetwork->last_scanned = rtw_get_current_time(); @@ -981,40 +999,36 @@ _func_enter_; if (pnetwork->network.PhyInfo.SignalQuality == 101) pnetwork->network.PhyInfo.SignalQuality = 0; - rtw_list_insert_tail(&(pnetwork->list),&(queue->queue)); + rtw_list_insert_tail(&(pnetwork->list), &(queue->queue)); } - } - else { + } else { /* we have an entry and we are going to update it. But this entry may - * be already expired. In this case we do the same as we found a new + * be already expired. In this case we do the same as we found a new * net and call the new_net handler */ bool update_ie = _TRUE; pnetwork->last_scanned = rtw_get_current_time(); - //target.Reserved[0]==1, means that scaned network is a bcn frame. - if((pnetwork->network.IELength>target->IELength) && (target->Reserved[0]==1)) + /* target.Reserved[0]==1, means that scaned network is a bcn frame. */ + if ((pnetwork->network.IELength > target->IELength) && (target->Reserved[0] == 1)) update_ie = _FALSE; - // probe resp(3) > beacon(1) > probe req(2) + /* probe resp(3) > beacon(1) > probe req(2) */ if ((target->Reserved[0] != 2) && - (target->Reserved[0] >= pnetwork->network.Reserved[0]) - ) { + (target->Reserved[0] >= pnetwork->network.Reserved[0]) + ) update_ie = _TRUE; - } - else { + else update_ie = _FALSE; - } - update_network(&(pnetwork->network), target,adapter, update_ie); + update_network(&(pnetwork->network), target, adapter, update_ie); } exit: _exit_critical_bh(&queue->lock, &irqL); -_func_exit_; } void rtw_add_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork); @@ -1022,32 +1036,33 @@ void rtw_add_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork) { _irqL irqL; struct mlme_priv *pmlmepriv = &(((_adapter *)adapter)->mlmepriv); - //_queue *queue = &(pmlmepriv->scanned_queue); + /* _queue *queue = &(pmlmepriv->scanned_queue); */ -_func_enter_; - //_enter_critical_bh(&queue->lock, &irqL); + /* _enter_critical_bh(&queue->lock, &irqL); */ - #if defined(CONFIG_P2P) && defined(CONFIG_P2P_REMOVE_GROUP_INFO) +#if defined(CONFIG_P2P) && defined(CONFIG_P2P_REMOVE_GROUP_INFO) if (adapter->registrypriv.wifi_spec == 0) - rtw_WLAN_BSSID_EX_remove_p2p_attr(pnetwork, P2P_ATTR_GROUP_INFO); - #endif - + rtw_bss_ex_del_p2p_attr(pnetwork, P2P_ATTR_GROUP_INFO); +#endif + + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + rtw_bss_ex_del_wfd_ie(pnetwork); + update_current_network(adapter, pnetwork); - + rtw_update_scanned_network(adapter, pnetwork); - //_exit_critical_bh(&queue->lock, &irqL); - -_func_exit_; + /* _exit_critical_bh(&queue->lock, &irqL); */ + } -//select the desired network based on the capability of the (i)bss. -// check items: (1) security -// (2) network_type -// (3) WMM -// (4) HT -// (5) others +/* select the desired network based on the capability of the (i)bss. + * check items: (1) security + * (2) network_type + * (3) WMM + * (4) HT + * (5) others */ int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork); int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork) { @@ -1056,55 +1071,47 @@ int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork) u32 desired_encmode; u32 privacy; - //u8 wps_ie[512]; + /* u8 wps_ie[512]; */ uint wps_ielen; int bselected = _TRUE; - + desired_encmode = psecuritypriv->ndisencryptstatus; privacy = pnetwork->network.Privacy; - if(check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) - { - if(rtw_get_wps_ie(pnetwork->network.IEs+_FIXED_IE_LENGTH_, pnetwork->network.IELength-_FIXED_IE_LENGTH_, NULL, &wps_ielen)!=NULL) - { + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) { + if (rtw_get_wps_ie(pnetwork->network.IEs + _FIXED_IE_LENGTH_, pnetwork->network.IELength - _FIXED_IE_LENGTH_, NULL, &wps_ielen) != NULL) return _TRUE; - } else - { return _FALSE; - } } - if (adapter->registrypriv.wifi_spec == 1) //for correct flow of 8021X to do.... - { - u8 *p=NULL; - uint ie_len=0; + if (adapter->registrypriv.wifi_spec == 1) { /* for correct flow of 8021X to do.... */ + u8 *p = NULL; + uint ie_len = 0; if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0)) - bselected = _FALSE; + bselected = _FALSE; - if ( psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) { + if (psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) { p = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pnetwork->network.IELength - _BEACON_IE_OFFSET_)); - if (p && ie_len>0) { + if (p && ie_len > 0) bselected = _TRUE; - } else { + else bselected = _FALSE; - } } } - - if ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) { - DBG_871X("desired_encmode: %d, privacy: %d\n", desired_encmode, privacy); + + if ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) { + RTW_INFO("desired_encmode: %d, privacy: %d\n", desired_encmode, privacy); bselected = _FALSE; - } + } - if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) - { - if(pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode) + if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) { + if (pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode) bselected = _FALSE; - } - + } + return bselected; } @@ -1113,10 +1120,7 @@ int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork) void rtw_atimdone_event_callback(_adapter *adapter , u8 *pbuf) { -_func_enter_; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("receive atimdone_evet\n")); -_func_exit_; - return; + return; } @@ -1127,80 +1131,68 @@ void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf) WLAN_BSSID_EX *pnetwork; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); -_func_enter_; pnetwork = (WLAN_BSSID_EX *)pbuf; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_survey_event_callback, ssid=%s\n", pnetwork->Ssid.Ssid)); #ifdef CONFIG_RTL8712 - //endian_convert - pnetwork->Length = le32_to_cpu(pnetwork->Length); - pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength); - pnetwork->Privacy =le32_to_cpu( pnetwork->Privacy); + /* endian_convert */ + pnetwork->Length = le32_to_cpu(pnetwork->Length); + pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength); + pnetwork->Privacy = le32_to_cpu(pnetwork->Privacy); pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi); - pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse); + pnetwork->NetworkTypeInUse = le32_to_cpu(pnetwork->NetworkTypeInUse); pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow); pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod); - pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig); - pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime); - pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern); - pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet); - pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length); + pnetwork->Configuration.DSConfig = le32_to_cpu(pnetwork->Configuration.DSConfig); + pnetwork->Configuration.FHConfig.DwellTime = le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime); + pnetwork->Configuration.FHConfig.HopPattern = le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern); + pnetwork->Configuration.FHConfig.HopSet = le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet); + pnetwork->Configuration.FHConfig.Length = le32_to_cpu(pnetwork->Configuration.FHConfig.Length); pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length); pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode); pnetwork->IELength = le32_to_cpu(pnetwork->IELength); -#endif +#endif len = get_WLAN_BSSID_EX_sz(pnetwork); - if(len > (sizeof(WLAN_BSSID_EX))) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n ****rtw_survey_event_callback: return a wrong bss ***\n")); + if (len > (sizeof(WLAN_BSSID_EX))) { return; } _enter_critical_bh(&pmlmepriv->lock, &irqL); - // update IBSS_network 's timestamp - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE) - { - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"rtw_survey_event_callback : WIFI_ADHOC_MASTER_STATE \n\n"); - if(_rtw_memcmp(&(pmlmepriv->cur_network.network.MacAddress), pnetwork->MacAddress, ETH_ALEN)) - { - struct wlan_network* ibss_wlan = NULL; + /* update IBSS_network 's timestamp */ + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE) { + if (_rtw_memcmp(&(pmlmepriv->cur_network.network.MacAddress), pnetwork->MacAddress, ETH_ALEN)) { + struct wlan_network *ibss_wlan = NULL; _irqL irqL; - + _rtw_memcpy(pmlmepriv->cur_network.network.IEs, pnetwork->IEs, 8); _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); ibss_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->MacAddress); - if(ibss_wlan) - { - _rtw_memcpy(ibss_wlan->network.IEs , pnetwork->IEs, 8); - _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + if (ibss_wlan) { + _rtw_memcpy(ibss_wlan->network.IEs , pnetwork->IEs, 8); + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); goto exit; } _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); } } - // lock pmlmepriv->lock when you accessing network_q - if ((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _FALSE) - { - if( pnetwork->Ssid.Ssid[0] == 0 ) - { + /* lock pmlmepriv->lock when you accessing network_q */ + if ((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _FALSE) { + if (pnetwork->Ssid.Ssid[0] == 0) pnetwork->Ssid.SsidLength = 0; - } rtw_add_network(adapter, pnetwork); - } + } + +exit: -exit: - _exit_critical_bh(&pmlmepriv->lock, &irqL); -_func_exit_; - return; + return; } void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) @@ -1213,7 +1205,6 @@ void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) mlmeext_surveydone_event_callback(adapter); #endif -_func_enter_; _enter_critical_bh(&pmlmepriv->lock, &irqL); if (pmlmepriv->wps_probe_req_ie) { @@ -1223,11 +1214,10 @@ _func_enter_; 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) == _FALSE) { - DBG_871X(FUNC_ADPT_FMT" fw_state:0x%x\n", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv)); - //rtw_warn_on(1); + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _FALSE) { + RTW_INFO(FUNC_ADPT_FMT" fw_state:0x%x\n", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv)); + /* rtw_warn_on(1); */ } _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); @@ -1237,119 +1227,96 @@ _func_enter_; _enter_critical_bh(&pmlmepriv->lock, &irqL); - #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS rtw_set_signal_stat_timer(&adapter->recvpriv); - #endif +#endif - if(pmlmepriv->to_join == _TRUE) - { - if((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE) ) - { - if(check_fwstate(pmlmepriv, _FW_LINKED)==_FALSE) - { - set_fwstate(pmlmepriv, _FW_UNDER_LINKING); - - if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS) - { + if (pmlmepriv->to_join == _TRUE) { + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) { + if (check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) { + 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 - { - WLAN_BSSID_EX *pdev_network = &(adapter->registrypriv.dev_network); + else { + WLAN_BSSID_EX *pdev_network = &(adapter->registrypriv.dev_network); u8 *pibss = adapter->registrypriv.dev_network.MacAddress; - //pmlmepriv->fw_state ^= _FW_UNDER_SURVEY;//because don't set assoc_timer + /* pmlmepriv->fw_state ^= _FW_UNDER_SURVEY; */ /* because don't set assoc_timer */ _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("switching to adhoc master\n")); - + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); - + rtw_update_registrypriv_dev_network(adapter); rtw_generate_random_ibss(pibss); - - pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; - - if (rtw_create_ibss_cmd(adapter, 0) != _SUCCESS) - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("Error=>rtw_create_ibss_cmd status FAIL\n")); + /*pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;*/ + init_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE); - pmlmepriv->to_join = _FALSE; - } - } - } - else - { + if (rtw_create_ibss_cmd(adapter, 0) != _SUCCESS) + RTW_ERR("rtw_create_ibss_cmd FAIL\n"); + + pmlmepriv->to_join = _FALSE; + } + } + } else { int s_ret; set_fwstate(pmlmepriv, _FW_UNDER_LINKING); pmlmepriv->to_join = _FALSE; - if(_SUCCESS == (s_ret=rtw_select_and_join_from_scanned_queue(pmlmepriv))) - { - _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); - } - else if(s_ret == 2)//there is no need to wait for join - { + s_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv); + if (_SUCCESS == s_ret) + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); + else if (s_ret == 2) { /* there is no need to wait for join */ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); rtw_indicate_connect(adapter); - } - else - { - DBG_871X("try_to_join, but select scanning queue fail, to_roam:%d\n", rtw_to_roam(adapter)); + } else { + RTW_INFO("try_to_join, but select scanning queue fail, to_roam:%d\n", rtw_to_roam(adapter)); if (rtw_to_roam(adapter) != 0) { - if(rtw_dec_to_roam(adapter) == 0 - || _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0) - ) { + if (rtw_dec_to_roam(adapter) == 0 + || _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0) + ) { rtw_set_to_roam(adapter, 0); #ifdef CONFIG_INTEL_WIDI - if(adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING) - { + if (adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING) { _rtw_memset(pmlmepriv->sa_ext, 0x00, L2SDTA_SERVICE_VE_LEN); intel_widi_wk_cmd(adapter, INTEL_WIDI_LISTEN_WK, NULL, 0); - DBG_871X("change to widi listen\n"); + RTW_INFO("change to widi listen\n"); } -#endif // CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ rtw_free_assoc_resources(adapter, 1); - rtw_indicate_disconnect(adapter); - } else { + rtw_indicate_disconnect(adapter, 0, _FALSE); + } else pmlmepriv->to_join = _TRUE; - } - } - else - { - rtw_indicate_disconnect(adapter); - } + } else + rtw_indicate_disconnect(adapter, 0, _FALSE); _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); } } } else { if (rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) { if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) - && check_fwstate(pmlmepriv, _FW_LINKED)) - { + && check_fwstate(pmlmepriv, _FW_LINKED)) { if (rtw_select_roaming_candidate(pmlmepriv) == _SUCCESS) { receive_disconnect(adapter, pmlmepriv->cur_network.network.MacAddress - , WLAN_REASON_ACTIVE_ROAM); + , WLAN_REASON_ACTIVE_ROAM, _FALSE); } } } } - - //DBG_871X("scan complete in %dms\n",rtw_get_passing_time_ms(pmlmepriv->scan_start_time)); + + /* RTW_INFO("scan complete in %dms\n",rtw_get_passing_time_ms(pmlmepriv->scan_start_time)); */ _exit_critical_bh(&pmlmepriv->lock, &irqL); #ifdef CONFIG_P2P_PS - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) p2p_ps_wk_cmd(adapter, P2P_PS_SCAN_DONE, 0); - } -#endif // CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ - rtw_os_xmit_schedule(adapter); -#ifdef CONFIG_CONCURRENT_MODE - rtw_os_xmit_schedule(adapter->pbuddy_adapter); -#endif + rtw_mi_os_xmit_schedule(adapter); #ifdef CONFIG_DRVEXT_MODULE_WSC drvext_surveydone_callback(&adapter->drvextpriv); @@ -1357,44 +1324,21 @@ _func_enter_; #ifdef DBG_CONFIG_ERROR_DETECT { - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - if(pmlmeext->sitesurvey_res.bss_cnt == 0){ - //rtw_hal_sreset_reset(adapter); + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + if (pmlmeext->sitesurvey_res.bss_cnt == 0) { + /* rtw_hal_sreset_reset(adapter); */ } } #endif #ifdef CONFIG_IOCTL_CFG80211 rtw_cfg80211_surveydone_event_callback(adapter); -#endif //CONFIG_IOCTL_CFG80211 +#endif /* CONFIG_IOCTL_CFG80211 */ rtw_indicate_scan_done(adapter, _FALSE); - -#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_IOCTL_CFG80211) - if (adapter->pbuddy_adapter) { - _adapter *buddy_adapter = adapter->pbuddy_adapter; - struct mlme_priv *buddy_mlme = &(buddy_adapter->mlmepriv); - struct rtw_wdev_priv *buddy_wdev_priv = adapter_wdev_data(buddy_adapter); - bool indicate_buddy_scan = _FALSE; - - _enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL); - if (buddy_wdev_priv->scan_request && buddy_mlme->scanning_via_buddy_intf == _TRUE) { - buddy_mlme->scanning_via_buddy_intf = _FALSE; - clr_fwstate(buddy_mlme, _FW_UNDER_SURVEY); - indicate_buddy_scan = _TRUE; - } - _exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL); - - if (indicate_buddy_scan == _TRUE) { - #ifdef CONFIG_IOCTL_CFG80211 - rtw_cfg80211_surveydone_event_callback(buddy_adapter); - #endif - rtw_indicate_scan_done(buddy_adapter, _FALSE); - } - } -#endif /* CONFIG_CONCURRENT_MODE */ - -_func_exit_; +#ifdef CONFIG_CONCURRENT_MODE + rtw_mi_buddy_indicate_scan_done(adapter, _FALSE);/*scanning_via_buddy_intf*/ +#endif } @@ -1414,65 +1358,61 @@ static void free_scanqueue(struct mlme_priv *pmlmepriv) _queue *free_queue = &pmlmepriv->free_bss_pool; _queue *scan_queue = &pmlmepriv->scanned_queue; _list *plist, *phead, *ptemp; - -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+free_scanqueue\n")); + + _enter_critical_bh(&scan_queue->lock, &irqL0); _enter_critical_bh(&free_queue->lock, &irqL); phead = get_list_head(scan_queue); plist = get_next(phead); - while (plist != phead) - { + while (plist != phead) { ptemp = get_next(plist); rtw_list_delete(plist); rtw_list_insert_tail(plist, &free_queue->queue); - plist =ptemp; - pmlmepriv->num_of_scanned --; - } - + plist = ptemp; + pmlmepriv->num_of_scanned--; + } + _exit_critical_bh(&free_queue->lock, &irqL); _exit_critical_bh(&scan_queue->lock, &irqL0); - -_func_exit_; + } -void rtw_reset_rx_info(struct debug_priv *pdbgpriv){ +void rtw_reset_rx_info(struct debug_priv *pdbgpriv) +{ pdbgpriv->dbg_rx_ampdu_drop_count = 0; pdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0; pdbgpriv->dbg_rx_ampdu_loss_count = 0; pdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0; pdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0; } - + /* *rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock */ void rtw_free_assoc_resources(_adapter *adapter, int lock_scanned_queue) { _irqL irqL; - struct wlan_network* pwlan = NULL; + struct wlan_network *pwlan = NULL; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; struct sta_priv *pstapriv = &adapter->stapriv; struct wlan_network *tgt_network = &pmlmepriv->cur_network; struct dvobj_priv *psdpriv = adapter->dvobj; - struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; + struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; + - #ifdef CONFIG_TDLS struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; -#endif //CONFIG_TDLS -_func_enter_; +#endif /* CONFIG_TDLS */ - RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+rtw_free_assoc_resources\n")); - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("tgt_network->network.MacAddress="MAC_FMT" ssid=%s\n", - MAC_ARG(tgt_network->network.MacAddress), tgt_network->network.Ssid.Ssid)); + + RTW_INFO("%s-"ADPT_FMT" tgt_network MacAddress=" MAC_FMT"ssid=%s\n", + __func__, ADPT_ARG(adapter), MAC_ARG(tgt_network->network.MacAddress), tgt_network->network.Ssid.Ssid); if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { - struct sta_info* psta; - + struct sta_info *psta; + psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress); #ifdef CONFIG_TDLS @@ -1480,72 +1420,68 @@ _func_enter_; 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); - } - else -#endif //CONFIG_TDLS + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + } else +#endif /* CONFIG_TDLS */ { - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ rtw_free_stainfo(adapter, psta); } - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - + /* _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + } - if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) { - struct sta_info* psta; - + if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) { + struct sta_info *psta; + rtw_free_all_stainfo(adapter); psta = rtw_get_bcmc_stainfo(adapter); - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ rtw_free_stainfo(adapter, psta); - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + /* _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ - rtw_init_bcmc_stainfo(adapter); + rtw_init_bcmc_stainfo(adapter); } - if(lock_scanned_queue) + if (lock_scanned_queue) _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - + pwlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, tgt_network); - if(pwlan) - { + if ((pwlan) && (!check_fwstate(pmlmepriv, WIFI_UNDER_WPS))) { pwlan->fixed = _FALSE; - DBG_871X("free disconnecting network\n"); + RTW_INFO("free disconnecting network of scanned_queue\n"); rtw_free_network_nolock(adapter, pwlan); #ifdef CONFIG_P2P - if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) - { - rtw_set_scan_deny(adapter, 2000); - //rtw_clear_scan_deny(adapter); + if (!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) { + rtw_mi_set_scan_deny(adapter, 2000); + /* rtw_clear_scan_deny(adapter); */ } -#endif //CONFIG_P2P - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_assoc_resources : pwlan== NULL \n\n")); +#endif /* CONFIG_P2P */ + } else { + if (pwlan == NULL) + RTW_INFO("free disconnecting network of scanned_queue failed due to pwlan== NULL\n\n"); + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) + RTW_INFO("donot free disconnecting network of scanned_queue when WIFI_UNDER_WPS\n\n"); } - if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count== 1)) - /*||check_fwstate(pmlmepriv, WIFI_STATION_STATE)*/) - { + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count == 1)) + /*||check_fwstate(pmlmepriv, WIFI_STATION_STATE)*/) { if (pwlan) rtw_free_network_nolock(adapter, pwlan); } - if(lock_scanned_queue) + if (lock_scanned_queue) _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - + adapter->securitypriv.key_mask = 0; rtw_reset_rx_info(pdbgpriv); -_func_exit_; - + } /* @@ -1555,30 +1491,21 @@ void rtw_indicate_connect(_adapter *padapter) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - -_func_enter_; - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_connect\n")); - + + pmlmepriv->to_join = _FALSE; - if(!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) - { - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - rtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_LINK, 0); -#endif + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) { set_fwstate(pmlmepriv, _FW_LINKED); rtw_led_control(padapter, LED_CTL_LINK); - + #ifdef CONFIG_DRVEXT_MODULE - if(padapter->drvextpriv.enable_wpa) - { + if (padapter->drvextpriv.enable_wpa) indicate_l2_connect(padapter); - } else #endif { @@ -1589,19 +1516,15 @@ _func_enter_; rtw_set_to_roam(padapter, 0); #ifdef CONFIG_INTEL_WIDI - if(padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING) - { + if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING) { _rtw_memset(pmlmepriv->sa_ext, 0x00, L2SDTA_SERVICE_VE_LEN); intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_WK, NULL, 0); - DBG_871X("change to widi listen\n"); + RTW_INFO("change to widi listen\n"); } -#endif // CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ + if (!check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE)) + rtw_mi_set_scan_deny(padapter, 3000); - rtw_set_scan_deny(padapter, 3000); - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("-rtw_indicate_connect: fw_state=0x%08x\n", get_fwstate(pmlmepriv))); - -_func_exit_; } @@ -1609,67 +1532,61 @@ _func_exit_; /* *rtw_indicate_disconnect: the caller has to lock pmlmepriv->lock */ -void rtw_indicate_disconnect( _adapter *padapter ) +void rtw_indicate_disconnect(_adapter *padapter, u16 reason, u8 locally_generated) { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); struct sta_info *psta; struct sta_priv *pstapriv = &padapter->stapriv; - u8 *wps_ie=NULL; - uint wpsie_len=0; + u8 *wps_ie = NULL; + uint wpsie_len = 0; -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_disconnect\n")); - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING|WIFI_UNDER_WPS); - // force to clear cur_network_scanned's SELECTED REGISTRAR + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING | WIFI_UNDER_WPS); + + /* force to clear cur_network_scanned's SELECTED REGISTRAR */ if (pmlmepriv->cur_network_scanned) { WLAN_BSSID_EX *current_joined_bss = &(pmlmepriv->cur_network_scanned->network); if (current_joined_bss) { - wps_ie=rtw_get_wps_ie(current_joined_bss->IEs +_FIXED_IE_LENGTH_, - current_joined_bss->IELength-_FIXED_IE_LENGTH_, NULL, &wpsie_len); - if (wps_ie && wpsie_len>0) { + wps_ie = rtw_get_wps_ie(current_joined_bss->IEs + _FIXED_IE_LENGTH_, + current_joined_bss->IELength - _FIXED_IE_LENGTH_, NULL, &wpsie_len); + if (wps_ie && wpsie_len > 0) { u8 *attr = NULL; u32 attr_len; - attr=rtw_get_wps_attr(wps_ie, wpsie_len, WPS_ATTR_SELECTED_REGISTRAR, - NULL, &attr_len); + attr = rtw_get_wps_attr(wps_ie, wpsie_len, WPS_ATTR_SELECTED_REGISTRAR, + NULL, &attr_len); if (attr) *(attr + 4) = 0; } } } - //DBG_871X("clear wps when %s\n", __func__); + /* RTW_INFO("clear wps when %s\n", __func__); */ - if(rtw_to_roam(padapter) > 0) + if (rtw_to_roam(padapter) > 0) _clr_fwstate_(pmlmepriv, _FW_LINKED); #ifdef CONFIG_WAPI_SUPPORT - psta = rtw_get_stainfo(pstapriv,cur_network->MacAddress); + psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) - { rtw_wapi_return_one_sta_info(padapter, psta->hwaddr); - } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || - check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) - { + check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) rtw_wapi_return_all_sta_info(padapter); - } #endif - if(check_fwstate(&padapter->mlmepriv, _FW_LINKED) - || (rtw_to_roam(padapter) <= 0) - ) - { - rtw_os_indicate_disconnect(padapter); + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) + || (rtw_to_roam(padapter) <= 0) + ) { - //set ips_deny_time to avoid enter IPS before LPS leave + rtw_os_indicate_disconnect(padapter, reason, locally_generated); + + /* set ips_deny_time to avoid enter IPS before LPS leave */ rtw_set_ips_deny(padapter, 3000); - _clr_fwstate_(pmlmepriv, _FW_LINKED); + _clr_fwstate_(pmlmepriv, _FW_LINKED); rtw_led_control(padapter, LED_CTL_NO_LINK); @@ -1678,7 +1595,7 @@ _func_enter_; #ifdef CONFIG_P2P_PS p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); -#endif // CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ #ifdef CONFIG_LPS rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1); @@ -1688,31 +1605,29 @@ _func_enter_; beamforming_wk_cmd(padapter, BEAMFORMING_CTRL_LEAVE, cur_network->MacAddress, ETH_ALEN, 1); #endif /*CONFIG_BEAMFORMING*/ -_func_exit_; } -inline void rtw_indicate_scan_done( _adapter *padapter, bool aborted) +inline void rtw_indicate_scan_done(_adapter *padapter, bool aborted) { - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); rtw_os_indicate_scan_done(padapter, aborted); #ifdef CONFIG_IPS if (is_primary_adapter(padapter) - && (_FALSE == adapter_to_pwrctl(padapter)->bInSuspend) - && (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_UNDER_LINKING) == _FALSE)) - { + && (_FALSE == adapter_to_pwrctl(padapter)->bInSuspend) + && (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE | WIFI_UNDER_LINKING) == _FALSE)) { struct pwrctrl_priv *pwrpriv; pwrpriv = adapter_to_pwrctl(padapter); rtw_set_ips_deny(padapter, 0); #ifdef CONFIG_IPS_CHECK_IN_WD - _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 1); -#else // !CONFIG_IPS_CHECK_IN_WD + _set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 1); +#else /* !CONFIG_IPS_CHECK_IN_WD */ _rtw_set_pwr_state_check_timer(pwrpriv, 1); -#endif // !CONFIG_IPS_CHECK_IN_WD +#endif /* !CONFIG_IPS_CHECK_IN_WD */ } -#endif // CONFIG_IPS +#endif /* CONFIG_IPS */ } static u32 _rtw_wait_scan_done(_adapter *adapter, u8 abort, u32 timeout_ms) @@ -1723,32 +1638,32 @@ static u32 _rtw_wait_scan_done(_adapter *adapter, u8 abort, u32 timeout_ms) struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); start = rtw_get_current_time(); - + pmlmeext->scan_abort = abort; - + while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) - && rtw_get_passing_time_ms(start) <= timeout_ms) { + && rtw_get_passing_time_ms(start) <= timeout_ms) { if (RTW_CANNOT_RUN(adapter)) break; - DBG_871X(FUNC_NDEV_FMT"fw_state=_FW_UNDER_SURVEY!\n", FUNC_NDEV_ARG(adapter->pnetdev)); + RTW_INFO(FUNC_NDEV_FMT"fw_state=_FW_UNDER_SURVEY!\n", FUNC_NDEV_ARG(adapter->pnetdev)); rtw_msleep_os(20); } if (_TRUE == abort) { if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { if (!RTW_CANNOT_RUN(adapter)) - DBG_871X(FUNC_NDEV_FMT"waiting for scan_abort time out!\n", FUNC_NDEV_ARG(adapter->pnetdev)); - #ifdef CONFIG_PLATFORM_MSTAR + RTW_INFO(FUNC_NDEV_FMT"waiting for scan_abort time out!\n", FUNC_NDEV_ARG(adapter->pnetdev)); +#ifdef CONFIG_PLATFORM_MSTAR /*_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);*/ set_survey_timer(pmlmeext, 0); mlme_set_scan_to_timer(pmlmepriv, 50); - #endif +#endif rtw_indicate_scan_done(adapter, _TRUE); } } - + pmlmeext->scan_abort = _FALSE; pass_ms = rtw_get_passing_time_ms(start); @@ -1761,8 +1676,8 @@ void rtw_scan_wait_completed(_adapter *adapter) u32 scan_to = SCANNING_TIMEOUT; #ifdef CONFIG_SCAN_BACKOP - if (IsSupported5G(adapter->registrypriv.wireless_mode) - && IsSupported24G(adapter->registrypriv.wireless_mode)) /*dual band*/ + if (IsSupported5G(adapter->registrypriv.wireless_mode) + && IsSupported24G(adapter->registrypriv.wireless_mode)) /*dual band*/ scan_to = CONC_SCANNING_TIMEOUT_DUAL_BAND; else /*single band*/ scan_to = CONC_SCANNING_TIMEOUT_SINGLE_BAND; @@ -1793,626 +1708,592 @@ void rtw_scan_abort(_adapter *adapter) static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wlan_network *pnetwork) { int i; - struct sta_info *bmc_sta, *psta=NULL; + struct sta_info *bmc_sta, *psta = NULL; struct recv_reorder_ctrl *preorder_ctrl; struct sta_priv *pstapriv = &padapter->stapriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; psta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress); - if(psta==NULL) { + if (psta == NULL) psta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress); - } - if(psta) //update ptarget_sta - { - DBG_871X("%s\n", __FUNCTION__); - + if (psta) { /* update ptarget_sta */ + RTW_INFO("%s\n", __FUNCTION__); + psta->aid = pnetwork->join_res; -#if 0 //alloc macid when call rtw_alloc_stainfo(), and release macid when call rtw_free_stainfo() -#ifdef CONFIG_CONCURRENT_MODE +#if 0 /* alloc macid when call rtw_alloc_stainfo(), and release macid when call rtw_free_stainfo() */ +#ifdef CONFIG_CONCURRENT_MODE - if(PRIMARY_ADAPTER == padapter->adapter_type) - psta->mac_id=0; + if (PRIMARY_ADAPTER == padapter->adapter_type) + psta->mac_id = 0; else - psta->mac_id=2; + psta->mac_id = 2; #else - psta->mac_id=0; + psta->mac_id = 0; #endif -#endif //removed +#endif /* removed */ update_sta_info(padapter, psta); - //update station supportRate + /* update station supportRate */ psta->bssratelen = rtw_get_rateset_len(pnetwork->network.SupportedRates); _rtw_memcpy(psta->bssrateset, pnetwork->network.SupportedRates, psta->bssratelen); rtw_hal_update_sta_rate_mask(padapter, psta); psta->wireless_mode = pmlmeext->cur_wireless_mode; - psta->raid = rtw_hal_networktype_to_raid(padapter,psta); + psta->raid = rtw_hal_networktype_to_raid(padapter, psta); - //sta mode - rtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,psta,_TRUE); + /* sta mode */ + rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE); - //security related - if(padapter->securitypriv.dot11AuthAlgrthm== dot11AuthAlgrthm_8021X) - { - padapter->securitypriv.binstallGrpkey=_FALSE; - padapter->securitypriv.busetkipkey=_FALSE; - padapter->securitypriv.bgrpkey_handshake=_FALSE; + /* security related */ + if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { + padapter->securitypriv.binstallGrpkey = _FALSE; + padapter->securitypriv.busetkipkey = _FALSE; + padapter->securitypriv.bgrpkey_handshake = _FALSE; - psta->ieee8021x_blocked=_TRUE; - psta->dot118021XPrivacy=padapter->securitypriv.dot11PrivacyAlgrthm; - - _rtw_memset((u8 *)&psta->dot118021x_UncstKey, 0, sizeof (union Keytype)); - - _rtw_memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof (union Keytype)); - _rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype)); - - _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48)); + psta->ieee8021x_blocked = _TRUE; + psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; + + _rtw_memset((u8 *)&psta->dot118021x_UncstKey, 0, sizeof(union Keytype)); + + _rtw_memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof(union Keytype)); + _rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof(union Keytype)); + + _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof(union pn48)); psta->dot11txpn.val = psta->dot11txpn.val + 1; #ifdef CONFIG_IEEE80211W - _rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof (union pn48)); -#endif //CONFIG_IEEE80211W - _rtw_memset((u8 *)&psta->dot11rxpn, 0, sizeof (union pn48)); + _rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof(union pn48)); +#endif /* CONFIG_IEEE80211W */ + _rtw_memset((u8 *)&psta->dot11rxpn, 0, sizeof(union pn48)); } - // Commented by Albert 2012/07/21 - // When doing the WPS, the wps_ie_len won't equal to 0 - // And the Wi-Fi driver shouldn't allow the data packet to be tramsmitted. - if ( padapter->securitypriv.wps_ie_len != 0 ) - { - psta->ieee8021x_blocked=_TRUE; + /* Commented by Albert 2012/07/21 */ + /* When doing the WPS, the wps_ie_len won't equal to 0 */ + /* And the Wi-Fi driver shouldn't allow the data packet to be tramsmitted. */ + if (padapter->securitypriv.wps_ie_len != 0) { + psta->ieee8021x_blocked = _TRUE; padapter->securitypriv.wps_ie_len = 0; } - //for A-MPDU Rx reordering buffer control for bmc_sta & sta_info - //if A-MPDU Rx is enabled, reseting rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff - //todo: check if AP can send A-MPDU packets - for(i=0; i < 16 ; i++) - { - //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; + /* for A-MPDU Rx reordering buffer control for bmc_sta & sta_info */ + /* if A-MPDU Rx is enabled, reseting rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff */ + /* todo: check if AP can send A-MPDU packets */ + for (i = 0; i < 16 ; i++) { + /* preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; */ preorder_ctrl = &psta->recvreorder_ctrl[i]; 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->wend_b= 0xffff; - preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d indicate_seq:%u\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); +#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; } - + bmc_sta = rtw_get_bcmc_stainfo(padapter); - if(bmc_sta) - { - for(i=0; i < 16 ; i++) - { - //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; + if (bmc_sta) { + for (i = 0; i < 16 ; i++) { + /* preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; */ preorder_ctrl = &bmc_sta->recvreorder_ctrl[i]; 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->wend_b= 0xffff; - preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d indicate_seq:%u\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); +#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; } } } - + return psta; - + } -//pnetwork : returns from rtw_joinbss_event_callback -//ptarget_wlan: found from scanned_queue +/* pnetwork : returns from rtw_joinbss_event_callback + * ptarget_wlan: found from scanned_queue */ static void rtw_joinbss_update_network(_adapter *padapter, struct wlan_network *ptarget_wlan, struct wlan_network *pnetwork) { - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); struct wlan_network *cur_network = &(pmlmepriv->cur_network); - DBG_871X("%s\n", __FUNCTION__); - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\nfw_state:%x, BSSID:"MAC_FMT"\n" - ,get_fwstate(pmlmepriv), MAC_ARG(pnetwork->network.MacAddress))); + RTW_INFO("%s\n", __FUNCTION__); - - // why not use ptarget_wlan?? + + + /* why not use ptarget_wlan?? */ _rtw_memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length); - // some IEs in pnetwork is wrong, so we should use ptarget_wlan IEs + /* some IEs in pnetwork is wrong, so we should use ptarget_wlan IEs */ cur_network->network.IELength = ptarget_wlan->network.IELength; _rtw_memcpy(&cur_network->network.IEs[0], &ptarget_wlan->network.IEs[0], MAX_IE_SZ); cur_network->aid = pnetwork->join_res; - + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS rtw_set_signal_stat_timer(&padapter->recvpriv); #endif padapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength; padapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality; - //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) + /* the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) */ padapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); - #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 - DBG_871X(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u" - "\n" - , FUNC_ADPT_ARG(padapter) - , padapter->recvpriv.signal_strength - , padapter->recvpriv.rssi - , padapter->recvpriv.signal_qual - ); - #endif +#if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 + RTW_INFO(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u" + "\n" + , FUNC_ADPT_ARG(padapter) + , padapter->recvpriv.signal_strength + , padapter->recvpriv.rssi + , padapter->recvpriv.signal_qual + ); +#endif #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS rtw_set_signal_stat_timer(&padapter->recvpriv); #endif - - //update fw_state //will clr _FW_UNDER_LINKING here indirectly - switch(pnetwork->network.InfrastructureMode) - { - case Ndis802_11Infrastructure: - - if(pmlmepriv->fw_state&WIFI_UNDER_WPS) - pmlmepriv->fw_state = WIFI_STATION_STATE|WIFI_UNDER_WPS; - else - pmlmepriv->fw_state = WIFI_STATION_STATE; - - break; - case Ndis802_11IBSS: - pmlmepriv->fw_state = WIFI_ADHOC_STATE; - break; - default: - pmlmepriv->fw_state = WIFI_NULL_STATE; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Invalid network_mode\n")); - break; + + /* update fw_state */ /* will clr _FW_UNDER_LINKING here indirectly */ + + switch (pnetwork->network.InfrastructureMode) { + case Ndis802_11Infrastructure: + + if (pmlmepriv->fw_state & WIFI_UNDER_WPS) + /*pmlmepriv->fw_state = WIFI_STATION_STATE|WIFI_UNDER_WPS;*/ + init_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_UNDER_WPS); + else + /*pmlmepriv->fw_state = WIFI_STATION_STATE;*/ + init_fwstate(pmlmepriv, WIFI_STATION_STATE); + break; + case Ndis802_11IBSS: + /*pmlmepriv->fw_state = WIFI_ADHOC_STATE;*/ + init_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + break; + default: + /*pmlmepriv->fw_state = WIFI_NULL_STATE;*/ + init_fwstate(pmlmepriv, WIFI_NULL_STATE); + break; } - rtw_update_protection(padapter, (cur_network->network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), - (cur_network->network.IELength)); + rtw_update_protection(padapter, (cur_network->network.IEs) + sizeof(NDIS_802_11_FIXED_IEs), + (cur_network->network.IELength)); -#ifdef CONFIG_80211N_HT +#ifdef CONFIG_80211N_HT rtw_update_ht_cap(padapter, cur_network->network.IEs, cur_network->network.IELength, (u8) cur_network->network.Configuration.DSConfig); #endif } -//Notes: the fucntion could be > passive_level (the same context as Rx tasklet) -//pnetwork : returns from rtw_joinbss_event_callback -//ptarget_wlan: found from scanned_queue -//if join_res > 0, for (fw_state==WIFI_STATION_STATE), we check if "ptarget_sta" & "ptarget_wlan" exist. -//if join_res > 0, for (fw_state==WIFI_ADHOC_STATE), we only check if "ptarget_wlan" exist. -//if join_res > 0, update "cur_network->network" from "pnetwork->network" if (ptarget_wlan !=NULL). -// -//#define REJOIN +/* Notes: the fucntion could be > passive_level (the same context as Rx tasklet) + * pnetwork : returns from rtw_joinbss_event_callback + * ptarget_wlan: found from scanned_queue + * if join_res > 0, for (fw_state==WIFI_STATION_STATE), we check if "ptarget_sta" & "ptarget_wlan" exist. + * if join_res > 0, for (fw_state==WIFI_ADHOC_STATE), we only check if "ptarget_wlan" exist. + * if join_res > 0, update "cur_network->network" from "pnetwork->network" if (ptarget_wlan !=NULL). + */ +/* #define REJOIN */ void rtw_joinbss_event_prehandle(_adapter *adapter, u8 *pbuf) { - _irqL irqL,irqL2; - static u8 retry=0; + _irqL irqL, irqL2; + static u8 retry = 0; u8 timer_cancelled; - struct sta_info *ptarget_sta= NULL, *pcur_sta = NULL; - struct sta_priv *pstapriv = &adapter->stapriv; + struct sta_info *ptarget_sta = NULL, *pcur_sta = NULL; + struct sta_priv *pstapriv = &adapter->stapriv; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct wlan_network *pnetwork = (struct wlan_network *)pbuf; - struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wlan_network *pnetwork = (struct wlan_network *)pbuf; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL; - unsigned int the_same_macaddr = _FALSE; + unsigned int the_same_macaddr = _FALSE; -_func_enter_; #ifdef CONFIG_RTL8712 - //endian_convert + /* endian_convert */ pnetwork->join_res = le32_to_cpu(pnetwork->join_res); pnetwork->network_type = le32_to_cpu(pnetwork->network_type); pnetwork->network.Length = le32_to_cpu(pnetwork->network.Length); pnetwork->network.Ssid.SsidLength = le32_to_cpu(pnetwork->network.Ssid.SsidLength); - pnetwork->network.Privacy =le32_to_cpu( pnetwork->network.Privacy); + pnetwork->network.Privacy = le32_to_cpu(pnetwork->network.Privacy); pnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi); - pnetwork->network.NetworkTypeInUse =le32_to_cpu(pnetwork->network.NetworkTypeInUse) ; + pnetwork->network.NetworkTypeInUse = le32_to_cpu(pnetwork->network.NetworkTypeInUse) ; pnetwork->network.Configuration.ATIMWindow = le32_to_cpu(pnetwork->network.Configuration.ATIMWindow); pnetwork->network.Configuration.BeaconPeriod = le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod); pnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig); - pnetwork->network.Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime); - pnetwork->network.Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern); - pnetwork->network.Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet); - pnetwork->network.Configuration.FHConfig.Length=le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length); + pnetwork->network.Configuration.FHConfig.DwellTime = le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime); + pnetwork->network.Configuration.FHConfig.HopPattern = le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern); + pnetwork->network.Configuration.FHConfig.HopSet = le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet); + pnetwork->network.Configuration.FHConfig.Length = le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length); pnetwork->network.Configuration.Length = le32_to_cpu(pnetwork->network.Configuration.Length); pnetwork->network.InfrastructureMode = le32_to_cpu(pnetwork->network.InfrastructureMode); - pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength ); + pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength); #endif - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("joinbss event call back received with res=%d\n", pnetwork->join_res)); rtw_get_encrypt_decrypt_from_registrypriv(adapter); - - if (pmlmepriv->assoc_ssid.SsidLength == 0) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ joinbss event call back for Any SSid\n")); - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ rtw_joinbss_event_callback for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); - } - + + the_same_macaddr = _rtw_memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN); pnetwork->network.Length = get_WLAN_BSSID_EX_sz(&pnetwork->network); - if(pnetwork->network.Length > sizeof(WLAN_BSSID_EX)) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n ***joinbss_evt_callback return a wrong bss ***\n\n")); + if (pnetwork->network.Length > sizeof(WLAN_BSSID_EX)) { goto ignore_joinbss_callback; } - + _enter_critical_bh(&pmlmepriv->lock, &irqL); - + pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0; pmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0; - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw_joinbss_event_callback !! _enter_critical \n")); - if(pnetwork->join_res > 0) - { + + if (pnetwork->join_res > 0) { _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); retry = 0; - if (check_fwstate(pmlmepriv,_FW_UNDER_LINKING) ) - { - //s1. find ptarget_wlan - if(check_fwstate(pmlmepriv, _FW_LINKED) ) - { - if(the_same_macaddr == _TRUE) - { - ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); - } - else - { + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) { + /* s1. find ptarget_wlan */ + if (check_fwstate(pmlmepriv, _FW_LINKED)) { + if (the_same_macaddr == _TRUE) + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + else { pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); - if(pcur_wlan) pcur_wlan->fixed = _FALSE; + if (pcur_wlan) + pcur_wlan->fixed = _FALSE; pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); - if(pcur_sta){ - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + if (pcur_sta) { + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); */ rtw_free_stainfo(adapter, pcur_sta); - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + /* _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); */ } ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ - if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) { + if (ptarget_wlan) + ptarget_wlan->fixed = _TRUE; } } - } - else - { + } else { ptarget_wlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, pnetwork); - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ - if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) { + if (ptarget_wlan) + ptarget_wlan->fixed = _TRUE; } } - - //s2. update cur_network - if(ptarget_wlan) - { + + /* s2. update cur_network */ + if (ptarget_wlan) rtw_joinbss_update_network(adapter, ptarget_wlan, pnetwork); - } - else - { - DBG_871X_LEVEL(_drv_always_, "Can't find ptarget_wlan when joinbss_event callback\n"); + else { + RTW_PRINT("Can't find ptarget_wlan when joinbss_event callback\n"); _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); goto ignore_joinbss_callback; } - - - //s3. find ptarget_sta & update ptarget_sta after update cur_network only for station mode - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { + + + /* s3. find ptarget_sta & update ptarget_sta after update cur_network only for station mode */ + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) { ptarget_sta = rtw_joinbss_update_stainfo(adapter, pnetwork); - if(ptarget_sta==NULL) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't update stainfo when joinbss_event callback\n")); + if (ptarget_sta == NULL) { + RTW_ERR("Can't update stainfo when joinbss_event callback\n"); _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); goto ignore_joinbss_callback; } } - //s4. indicate connect - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { + /* s4. indicate connect */ + if (MLME_IS_STA(adapter) || MLME_IS_ADHOC(adapter)) { pmlmepriv->cur_network_scanned = ptarget_wlan; rtw_indicate_connect(adapter); } - else - { - //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); - } - - //s5. Cancle assoc_timer + /* s5. Cancle assoc_timer */ _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("Cancle assoc_timer \n")); - - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_joinbss_event_callback err: fw_state:%x", get_fwstate(pmlmepriv))); + + + } else { _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); goto ignore_joinbss_callback; } - - _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - } - else if(pnetwork->join_res == -4) - { + + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + } else if (pnetwork->join_res == -4) { rtw_reset_securitypriv(adapter); - _set_timer(&pmlmepriv->assoc_timer, 1); + _set_timer(&pmlmepriv->assoc_timer, 1); - //rtw_free_assoc_resources(adapter, 1); + /* rtw_free_assoc_resources(adapter, 1); */ - if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + if ((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) { _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - } - - } - else //if join_res < 0 (join fails), then try again - { - - #ifdef REJOIN - res = _FAIL; - if(retry < 2) { - res = rtw_select_and_join_from_scanned_queue(pmlmepriv); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_select_and_join_from_scanned_queue again! res:%d\n",res)); } - if(res == _SUCCESS) - { - //extend time of assoc_timer + } else { /* if join_res < 0 (join fails), then try again */ + +#ifdef REJOIN + res = _FAIL; + if (retry < 2) { + res = rtw_select_and_join_from_scanned_queue(pmlmepriv); + } + + if (res == _SUCCESS) { + /* extend time of assoc_timer */ _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); retry++; - } - else if(res == 2)//there is no need to wait for join - { + } else if (res == 2) { /* there is no need to wait for join */ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); rtw_indicate_connect(adapter); - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Set Assoc_Timer = 1; can't find match ssid in scanned_q \n")); - #endif - + } else { +#endif + _set_timer(&pmlmepriv->assoc_timer, 1); - //rtw_free_assoc_resources(adapter, 1); + /* rtw_free_assoc_resources(adapter, 1); */ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - - #ifdef REJOIN - retry = 0; + +#ifdef REJOIN + retry = 0; } - #endif +#endif } ignore_joinbss_callback: - _exit_critical_bh(&pmlmepriv->lock, &irqL); - _func_exit_; } void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf) { - struct wlan_network *pnetwork = (struct wlan_network *)pbuf; + struct wlan_network *pnetwork = (struct wlan_network *)pbuf; -_func_enter_; mlmeext_joinbss_event_callback(adapter, pnetwork->join_res); - rtw_os_xmit_schedule(adapter); + rtw_mi_os_xmit_schedule(adapter); -#ifdef CONFIG_CONCURRENT_MODE - rtw_os_xmit_schedule(adapter->pbuddy_adapter); -#endif - -_func_exit_; } -#if 0 -//#if (RATE_ADAPTIVE_SUPPORT==1) //for 88E RA -u8 search_max_mac_id(_adapter *padapter) +void rtw_sta_media_status_rpt(_adapter *adapter, struct sta_info *sta, bool connected) { - u8 mac_id, aid; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; + struct macid_ctl_t *macid_ctl = &adapter->dvobj->macid_ctl; + bool miracast_enabled = 0; + bool miracast_sink = 0; + u8 role = H2C_MSR_ROLE_RSVD; -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)){ - -#if 1 - _irqL irqL; - struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); + if (sta == NULL) { + RTW_PRINT(FUNC_ADPT_FMT" sta is NULL\n" + , FUNC_ADPT_ARG(adapter)); + rtw_warn_on(1); + return; + } - _enter_critical_bh(&pdvobj->lock, &irqL); - for(mac_id=(NUM_STA-1); mac_id>0; mac_id--) - if(pdvobj->macid[mac_id] == _TRUE) - break; - _exit_critical_bh(&pdvobj->lock, &irqL); + if (sta->mac_id >= macid_ctl->num) { + RTW_PRINT(FUNC_ADPT_FMT" invalid macid:%u\n" + , FUNC_ADPT_ARG(adapter), sta->mac_id); + rtw_warn_on(1); + return; + } -#else - for (aid = (pstapriv->max_num_sta); aid > 0; aid--) - { - if (pstapriv->sta_aid[aid-1] != NULL) - { - psta = pstapriv->sta_aid[aid-1]; - break; - } + if (!rtw_macid_is_used(macid_ctl, sta->mac_id)) { + RTW_PRINT(FUNC_ADPT_FMT" macid:%u not is used, set connected to 0\n" + , FUNC_ADPT_ARG(adapter), sta->mac_id); + connected = 0; + rtw_warn_on(1); + } + + if (connected && !rtw_macid_is_bmc(macid_ctl, sta->mac_id)) { + miracast_enabled = STA_OP_WFD_MODE(sta) != 0 && is_miracast_enabled(adapter); + miracast_sink = miracast_enabled && (STA_OP_WFD_MODE(sta) & MIRACAST_SINK); + +#ifdef CONFIG_TDLS + if (sta->tdls_sta_state & TDLS_LINKED_STATE) + role = H2C_MSR_ROLE_TDLS; + else +#endif + if (MLME_IS_STA(adapter)) { + if (MLME_IS_GC(adapter)) + role = H2C_MSR_ROLE_GO; + else + role = H2C_MSR_ROLE_AP; + } else if (MLME_IS_AP(adapter)) { + if (MLME_IS_GO(adapter)) + role = H2C_MSR_ROLE_GC; + else + role = H2C_MSR_ROLE_STA; + } else if (MLME_IS_ADHOC(adapter) || MLME_IS_ADHOC_MASTER(adapter)) + role = H2C_MSR_ROLE_ADHOC; + +#ifdef CONFIG_WFD + if (role == H2C_MSR_ROLE_GC + || role == H2C_MSR_ROLE_GO + || role == H2C_MSR_ROLE_TDLS + ) { + if (adapter->wfd_info.rtsp_ctrlport + || adapter->wfd_info.tdls_rtsp_ctrlport + || adapter->wfd_info.peer_rtsp_ctrlport) + rtw_wfd_st_switch(sta, 1); } -/* - for (mac_id = (pstapriv->max_num_sta-1); mac_id >= 0; mac_id--) - { - if (pstapriv->sta_aid[mac_id] != NULL) - break; - } -*/ - mac_id = aid + 1; #endif } - else -#endif - {//adhoc id = 31~2 - for (mac_id = (NUM_STA-1); mac_id >= IBSS_START_MAC_ID ; mac_id--) - { - if (pmlmeinfo->FW_sta_info[mac_id].status == 1) - { - break; - } - } - } - DBG_871X("max mac_id=%d\n", mac_id); + rtw_hal_set_FwMediaStatusRpt_single_cmd(adapter + , connected + , miracast_enabled + , miracast_sink + , role + , sta->mac_id + ); +} - return mac_id; - -} -#endif - -//FOR STA, AP ,AD-HOC mode -void rtw_sta_media_status_rpt(_adapter *adapter,struct sta_info *psta, u32 mstatus) +u8 rtw_sta_media_status_rpt_cmd(_adapter *adapter, struct sta_info *sta, bool connected) { - u16 media_status_rpt; + struct cmd_priv *cmdpriv = &adapter->cmdpriv; + struct cmd_obj *cmdobj; + struct drvextra_cmd_parm *cmd_parm; + struct sta_media_status_rpt_cmd_parm *rpt_parm; + u8 res = _SUCCESS; - if(psta==NULL) return; - - #if (RATE_ADAPTIVE_SUPPORT==1) //for 88E RA - { - u8 macid = rtw_search_max_mac_id(adapter); - rtw_hal_set_hwreg(adapter,HW_VAR_TX_RPT_MAX_MACID, (u8*)&macid); + cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (cmdobj == NULL) { + res = _FAIL; + goto exit; } - #endif - media_status_rpt = (u16)((psta->mac_id<<8)|mstatus); // MACID|OPMODE:1 connect - rtw_hal_set_hwreg(adapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status_rpt); + + cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (cmd_parm == NULL) { + rtw_mfree((u8 *)cmdobj, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + rpt_parm = (struct sta_media_status_rpt_cmd_parm *)rtw_zmalloc(sizeof(struct sta_media_status_rpt_cmd_parm)); + if (rpt_parm == NULL) { + rtw_mfree((u8 *)cmdobj, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)cmd_parm, sizeof(struct drvextra_cmd_parm)); + res = _FAIL; + goto exit; + } + + rpt_parm->sta = sta; + rpt_parm->connected = connected; + + cmd_parm->ec_id = STA_MSTATUS_RPT_WK_CID; + cmd_parm->type = 0; + cmd_parm->size = sizeof(struct sta_media_status_rpt_cmd_parm); + cmd_parm->pbuf = (u8 *)rpt_parm; + init_h2fwcmd_w_parm_no_rsp(cmdobj, cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(cmdpriv, cmdobj); + +exit: + return res; +} + +inline void rtw_sta_media_status_rpt_cmd_hdl(_adapter *adapter, struct sta_media_status_rpt_cmd_parm *parm) +{ + rtw_sta_media_status_rpt(adapter, parm->sta, parm->connected); } void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf) { - _irqL irqL; + _irqL irqL; struct sta_info *psta; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct stassoc_event *pstassoc = (struct stassoc_event*)pbuf; - struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct stassoc_event *pstassoc = (struct stassoc_event *)pbuf; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); struct wlan_network *ptarget_wlan = NULL; - -_func_enter_; - - if(rtw_access_ctrl(adapter, pstassoc->macaddr) == _FALSE) - return; -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) - { - psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); - if(psta) - { + +#if CONFIG_RTW_MACADDR_ACL + if (rtw_access_ctrl(adapter, pstassoc->macaddr) == _FALSE) + return; +#endif + +#if defined(CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { + psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); + if (psta) { u8 *passoc_req = NULL; u32 assoc_req_len = 0; - + rtw_sta_media_status_rpt(adapter, psta, 1); - + #ifndef CONFIG_AUTO_AP_MODE ap_sta_info_defer_update(adapter, psta); - //report to upper layer - DBG_871X("indicate_sta_assoc_event to upper layer - hostapd\n"); + /* report to upper layer */ + RTW_INFO("indicate_sta_assoc_event to upper layer - hostapd\n"); #ifdef CONFIG_IOCTL_CFG80211 _enter_critical_bh(&psta->lock, &irqL); - if(psta->passoc_req && psta->assoc_req_len>0) - { + if (psta->passoc_req && psta->assoc_req_len > 0) { passoc_req = rtw_zmalloc(psta->assoc_req_len); - if(passoc_req) - { + if (passoc_req) { assoc_req_len = psta->assoc_req_len; _rtw_memcpy(passoc_req, psta->passoc_req, assoc_req_len); - + rtw_mfree(psta->passoc_req , psta->assoc_req_len); psta->passoc_req = NULL; psta->assoc_req_len = 0; } - } + } _exit_critical_bh(&psta->lock, &irqL); - if(passoc_req && assoc_req_len>0) - { + if (passoc_req && assoc_req_len > 0) { rtw_cfg80211_indicate_sta_assoc(adapter, passoc_req, assoc_req_len); rtw_mfree(passoc_req, assoc_req_len); - } -#else //!CONFIG_IOCTL_CFG80211 + } +#else /* !CONFIG_IOCTL_CFG80211 */ rtw_indicate_sta_assoc_event(adapter, psta); -#endif //!CONFIG_IOCTL_CFG80211 -#endif //!CONFIG_AUTO_AP_MODE +#endif /* !CONFIG_IOCTL_CFG80211 */ +#endif /* !CONFIG_AUTO_AP_MODE */ #ifdef CONFIG_BEAMFORMING beamforming_wk_cmd(adapter, BEAMFORMING_CTRL_ENTER, (u8 *)psta, sizeof(struct sta_info), 0); #endif/*CONFIG_BEAMFORMING*/ - } - goto exit; - } -#endif //defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + if (is_wep_enc(adapter->securitypriv.dot11PrivacyAlgrthm)) + rtw_ap_wep_pk_setting(adapter, psta); - //for AD-HOC mode - psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); - if( psta != NULL) - { - //the sta have been in sta_info_queue => do nothing - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error: rtw_stassoc_event_callback: sta has been in sta_hash_queue \n")); - - goto exit; //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY) + rtw_mi_update_iface_status(pmlmepriv, WIFI_AP_STATE); + } + goto exit; + } +#endif /* defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) */ + + /* for AD-HOC mode */ + psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); + if (psta == NULL) { + RTW_ERR(FUNC_ADPT_FMT" get no sta_info with "MAC_FMT"\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(pstassoc->macaddr)); + rtw_warn_on(1); + goto exit; } - psta = rtw_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr); - if (psta == NULL) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't alloc sta_info when rtw_stassoc_event_callback\n")); - goto exit; - } - - //to do : init sta_info variable - psta->qos_option = 0; - psta->mac_id = (uint)pstassoc->cam_id; - //psta->aid = (uint)pstassoc->cam_id; - DBG_871X("%s\n",__FUNCTION__); - //for ad-hoc mode - rtw_hal_set_odm_var(adapter,HAL_ODM_STA_INFO,psta,_TRUE); + rtw_hal_set_odm_var(adapter, HAL_ODM_STA_INFO, psta, _TRUE); rtw_sta_media_status_rpt(adapter, psta, 1); - - if(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) - psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm; - - psta->ieee8021x_blocked = _FALSE; - + if (adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) + psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm; + + + psta->ieee8021x_blocked = _FALSE; + _enter_critical_bh(&pmlmepriv->lock, &irqL); - if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) ) - { - if(adapter->stapriv.asoc_sta_count== 2) - { + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) { + if (adapter->stapriv.asoc_sta_count == 2) { _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); pmlmepriv->cur_network_scanned = ptarget_wlan; - if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + if (ptarget_wlan) + ptarget_wlan->fixed = _TRUE; _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - // a sta + bc/mc_stainfo (not Ibss_stainfo) + /* a sta + bc/mc_stainfo (not Ibss_stainfo) */ rtw_indicate_connect(adapter); } } @@ -2421,16 +2302,14 @@ _func_enter_; mlmeext_sta_add_event_callback(adapter, psta); - + #ifdef CONFIG_RTL8711 - //submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta + /* submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta */ rtw_setstakey_cmd(adapter, psta, GROUP_KEY, _TRUE); #endif - -exit: - -_func_exit_; +exit: + return; } #ifdef CONFIG_IEEE80211W @@ -2440,14 +2319,13 @@ void rtw_sta_timeout_event_callback(_adapter *adapter, u8 *pbuf) struct sta_info *psta; struct stadel_event *pstadel = (struct stadel_event *)pbuf; struct sta_priv *pstapriv = &adapter->stapriv; - -_func_enter_; - + + psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr); if (psta) { u8 updated = _FALSE; - + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); if (rtw_is_list_empty(&psta->asoc_list) == _FALSE) { rtw_list_delete(&psta->asoc_list); @@ -2459,167 +2337,193 @@ _func_enter_; associated_clients_update(adapter, updated, STA_INFO_UPDATE_ALL); } - -_func_exit_; + } #endif /* CONFIG_IEEE80211W */ +void rtw_sta_mstatus_disc_rpt(_adapter *adapter, u8 mac_id) +{ + struct macid_ctl_t *macid_ctl = &adapter->dvobj->macid_ctl; + + RTW_INFO("%s "ADPT_FMT" - mac_id=%d\n", __func__, ADPT_ARG(adapter), mac_id); + + if (mac_id >= 0 && mac_id < macid_ctl->num) { + rtw_hal_set_FwMediaStatusRpt_single_cmd(adapter, 0, 0, 0, 0, mac_id); + /* + * For safety, prevent from keeping macid sleep. + * If we can sure all power mode enter/leave are paired, + * this check can be removed. + * Lucas@20131113 + */ + /* wakeup macid after disconnect. */ + /*if (MLME_IS_STA(adapter))*/ + rtw_hal_macid_wakeup(adapter, mac_id); + } else { + RTW_PRINT(FUNC_ADPT_FMT" invalid macid:%u\n" + , FUNC_ADPT_ARG(adapter), mac_id); + rtw_warn_on(1); + } +} +void rtw_sta_mstatus_report(_adapter *adapter) +{ + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + struct wlan_network *tgt_network = &pmlmepriv->cur_network; + struct sta_info *psta = NULL; + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { + psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress); + if (psta) + rtw_sta_mstatus_disc_rpt(adapter, psta->mac_id); + else { + RTW_INFO("%s "ADPT_FMT" - mac_addr: "MAC_FMT" psta == NULL\n", __func__, ADPT_ARG(adapter), MAC_ARG(tgt_network->network.MacAddress)); + rtw_warn_on(1); + } + } +} + void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf) { - _irqL irqL,irqL2; - int mac_id = (-1); + _irqL irqL, irqL2; + struct sta_info *psta; - struct wlan_network* pwlan = NULL; - WLAN_BSSID_EX *pdev_network=NULL; - u8* pibss = NULL; + struct wlan_network *pwlan = NULL; + WLAN_BSSID_EX *pdev_network = NULL; + u8 *pibss = NULL; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct stadel_event *pstadel = (struct stadel_event*)pbuf; - struct sta_priv *pstapriv = &adapter->stapriv; + struct stadel_event *pstadel = (struct stadel_event *)pbuf; + struct sta_priv *pstapriv = &adapter->stapriv; struct wlan_network *tgt_network = &(pmlmepriv->cur_network); struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - -_func_enter_; - + + + RTW_INFO("%s(mac_id=%d)=" MAC_FMT "\n", __func__, pstadel->mac_id, MAC_ARG(pstadel->macaddr)); + rtw_sta_mstatus_disc_rpt(adapter, pstadel->mac_id); + psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr); - if(psta) - mac_id = psta->mac_id; - else - mac_id = pstadel->mac_id; - DBG_871X("%s(mac_id=%d)=" MAC_FMT "\n", __func__, mac_id, MAC_ARG(pstadel->macaddr)); + if (psta == NULL) { + RTW_INFO("%s(mac_id=%d)=" MAC_FMT " psta == NULL\n", __func__, pstadel->mac_id, MAC_ARG(pstadel->macaddr)); + /*rtw_warn_on(1);*/ + } - if(mac_id>=0){ - u16 media_status; - media_status = (mac_id<<8)|0; // MACID|OPMODE:0 means disconnect - //for STA,AP,ADHOC mode, report disconnect stauts to FW - rtw_hal_set_hwreg(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status); - } + if (psta) + rtw_wfd_st_switch(psta, 0); - //if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) - if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { + /* if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) */ + if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { #ifdef CONFIG_IOCTL_CFG80211 - #ifdef COMPAT_KERNEL_RELEASE +#ifdef COMPAT_KERNEL_RELEASE - #elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_indicate_sta_disassoc(adapter, pstadel->macaddr, *(u16*)pstadel->rsvd); - #endif //(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) -#endif //CONFIG_IOCTL_CFG80211 +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_indicate_sta_disassoc(adapter, pstadel->macaddr, *(u16 *)pstadel->rsvd); +#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) */ +#endif /* CONFIG_IOCTL_CFG80211 */ return; } - mlmeext_sta_del_event_callback(adapter); _enter_critical_bh(&pmlmepriv->lock, &irqL2); - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) - { + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { u16 reason = *((unsigned short *)(pstadel->rsvd)); bool roam = _FALSE; struct wlan_network *roam_target = NULL; - #ifdef CONFIG_LAYER2_ROAMING - if(adapter->registrypriv.wifi_spec==1) { +#ifdef CONFIG_LAYER2_ROAMING + if (adapter->registrypriv.wifi_spec == 1) roam = _FALSE; - } else if (reason == WLAN_REASON_EXPIRATION_CHK && rtw_chk_roam_flags(adapter, RTW_ROAM_ON_EXPIRED)) { + else if (reason == WLAN_REASON_EXPIRATION_CHK && rtw_chk_roam_flags(adapter, RTW_ROAM_ON_EXPIRED)) roam = _TRUE; - } else if (reason == WLAN_REASON_ACTIVE_ROAM && rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) { + else if (reason == WLAN_REASON_ACTIVE_ROAM && rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) { roam = _TRUE; roam_target = pmlmepriv->roam_network; } #ifdef CONFIG_INTEL_WIDI - else if (adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_CONNECTED) { + else if (adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_CONNECTED) roam = _TRUE; - } -#endif // CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ if (roam == _TRUE) { if (rtw_to_roam(adapter) > 0) rtw_dec_to_roam(adapter); /* this stadel_event is caused by roaming, decrease to_roam */ else if (rtw_to_roam(adapter) == 0) rtw_set_to_roam(adapter, adapter->registrypriv.max_roaming_times); - } else { + } else rtw_set_to_roam(adapter, 0); - } - #endif /* CONFIG_LAYER2_ROAMING */ +#endif /* CONFIG_LAYER2_ROAMING */ rtw_free_uc_swdec_pending_queue(adapter); rtw_free_assoc_resources(adapter, 1); - rtw_indicate_disconnect(adapter); rtw_free_mlme_priv_ie_data(pmlmepriv); _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - // remove the network entry in scanned_queue - pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); - if (pwlan) { + /* remove the network entry in scanned_queue */ + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); + if ((pwlan) && (!check_fwstate(pmlmepriv, WIFI_UNDER_WPS))) { pwlan->fixed = _FALSE; rtw_free_network_nolock(adapter, pwlan); } _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + rtw_indicate_disconnect(adapter, *(u16 *)pstadel->rsvd, pstadel->locally_generated); #ifdef CONFIG_INTEL_WIDI if (!rtw_to_roam(adapter)) process_intel_widi_disconnect(adapter, 1); -#endif // CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ _rtw_roaming(adapter, roam_target); } - if ( check_fwstate(pmlmepriv,WIFI_ADHOC_MASTER_STATE) || - check_fwstate(pmlmepriv,WIFI_ADHOC_STATE)) - { - - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || + check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { + + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ rtw_free_stainfo(adapter, psta); - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - if(adapter->stapriv.asoc_sta_count== 1) //a sta + bc/mc_stainfo (not Ibss_stainfo) - { - //rtw_indicate_disconnect(adapter);//removed@20091105 + /* _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + + if (adapter->stapriv.asoc_sta_count == 1) { /* a sta + bc/mc_stainfo (not Ibss_stainfo) */ + /* rtw_indicate_disconnect(adapter); */ /* removed@20091105 */ _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - //free old ibss network - //pwlan = rtw_find_network(&pmlmepriv->scanned_queue, pstadel->macaddr); + /* free old ibss network */ + /* pwlan = rtw_find_network(&pmlmepriv->scanned_queue, pstadel->macaddr); */ pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); - if(pwlan) - { + if (pwlan) { pwlan->fixed = _FALSE; - rtw_free_network_nolock(adapter, pwlan); + rtw_free_network_nolock(adapter, pwlan); } _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - //re-create ibss - pdev_network = &(adapter->registrypriv.dev_network); + /* re-create ibss */ + pdev_network = &(adapter->registrypriv.dev_network); pibss = adapter->registrypriv.dev_network.MacAddress; _rtw_memcpy(pdev_network, &tgt_network->network, get_WLAN_BSSID_EX_sz(&tgt_network->network)); - + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); - - rtw_update_registrypriv_dev_network(adapter); + + rtw_update_registrypriv_dev_network(adapter); rtw_generate_random_ibss(pibss); - - if(check_fwstate(pmlmepriv,WIFI_ADHOC_STATE)) - { + + if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE); _clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE); } if (rtw_create_ibss_cmd(adapter, 0) != _SUCCESS) - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("***Error=>stadel_event_callback: rtw_create_ibss_cmd status FAIL***\n")); + RTW_ERR("rtw_create_ibss_cmd FAIL\n"); } - + } - + _exit_critical_bh(&pmlmepriv->lock, &irqL2); - -_func_exit_; + } @@ -2630,27 +2534,22 @@ void rtw_cpwm_event_callback(PADAPTER padapter, u8 *pbuf) struct reportpwrstate_parm *preportpwrstate; #endif -_func_enter_; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+rtw_cpwm_event_callback !!!\n")); #ifdef CONFIG_LPS_LCLK - preportpwrstate = (struct reportpwrstate_parm*)pbuf; + preportpwrstate = (struct reportpwrstate_parm *)pbuf; preportpwrstate->state |= (u8)(adapter_to_pwrctl(padapter)->cpwm_tog + 0x80); cpwm_int_hdl(padapter, preportpwrstate); #endif -_func_exit_; } void rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf) { -_func_enter_; WMMOnAssocRsp(padapter); -_func_exit_; } @@ -2658,7 +2557,7 @@ _func_exit_; * _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss * @adapter: pointer to _adapter structure */ -void _rtw_join_timeout_handler (_adapter *adapter) +void _rtw_join_timeout_handler(_adapter *adapter) { _irqL irqL; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; @@ -2668,68 +2567,66 @@ void _rtw_join_timeout_handler (_adapter *adapter) _rtw_up_sema(&pmlmepriv->assoc_terminate); return; } -#endif - -_func_enter_; +#endif - DBG_871X("%s, fw_state=%x\n", __FUNCTION__, get_fwstate(pmlmepriv)); - + + RTW_INFO("%s, fw_state=%x\n", __FUNCTION__, get_fwstate(pmlmepriv)); + if (RTW_CANNOT_RUN(adapter)) return; - + _enter_critical_bh(&pmlmepriv->lock, &irqL); - #ifdef CONFIG_LAYER2_ROAMING +#ifdef CONFIG_LAYER2_ROAMING if (rtw_to_roam(adapter) > 0) { /* join timeout caused by roaming */ - while(1) { + while (1) { rtw_dec_to_roam(adapter); if (rtw_to_roam(adapter) != 0) { /* try another */ int do_join_r; - DBG_871X("%s try another roaming\n", __FUNCTION__); - if( _SUCCESS!=(do_join_r=rtw_do_join(adapter)) ) { - DBG_871X("%s roaming do_join return %d\n", __FUNCTION__ ,do_join_r); + RTW_INFO("%s try another roaming\n", __FUNCTION__); + do_join_r = rtw_do_join(adapter); + if (_SUCCESS != do_join_r) { + RTW_INFO("%s roaming do_join return %d\n", __FUNCTION__ , do_join_r); continue; } break; } else { #ifdef CONFIG_INTEL_WIDI - if(adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING) - { + if (adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING) { _rtw_memset(pmlmepriv->sa_ext, 0x00, L2SDTA_SERVICE_VE_LEN); intel_widi_wk_cmd(adapter, INTEL_WIDI_LISTEN_WK, NULL, 0); - DBG_871X("change to widi listen\n"); + RTW_INFO("change to widi listen\n"); } -#endif // CONFIG_INTEL_WIDI - DBG_871X("%s We've try roaming but fail\n", __FUNCTION__); - rtw_indicate_disconnect(adapter); +#endif /* CONFIG_INTEL_WIDI */ + RTW_INFO("%s We've try roaming but fail\n", __FUNCTION__); + rtw_indicate_disconnect(adapter, 0, _FALSE); break; } } - - } else - #endif + + } else +#endif { - rtw_indicate_disconnect(adapter); - free_scanqueue(pmlmepriv);//??? + rtw_indicate_disconnect(adapter, 0, _FALSE); + free_scanqueue(pmlmepriv);/* ??? */ #ifdef CONFIG_IOCTL_CFG80211 - //indicate disconnect for the case that join_timeout and check_fwstate != FW_LINKED - rtw_cfg80211_indicate_disconnect(adapter); -#endif //CONFIG_IOCTL_CFG80211 + /* indicate disconnect for the case that join_timeout and check_fwstate != FW_LINKED */ + rtw_cfg80211_indicate_disconnect(adapter, 0, _FALSE); +#endif /* CONFIG_IOCTL_CFG80211 */ - } + } _exit_critical_bh(&pmlmepriv->lock, &irqL); - -#ifdef CONFIG_DRVEXT_MODULE_WSC - drvext_assoc_fail_indicate(&adapter->drvextpriv); -#endif - -_func_exit_; +#ifdef CONFIG_DRVEXT_MODULE_WSC + drvext_assoc_fail_indicate(&adapter->drvextpriv); +#endif + + } @@ -2737,134 +2634,276 @@ _func_exit_; * rtw_scan_timeout_handler - Timeout/Faliure handler for CMD SiteSurvey * @adapter: pointer to _adapter structure */ -void rtw_scan_timeout_handler (_adapter *adapter) -{ +void rtw_scan_timeout_handler(_adapter *adapter) +{ _irqL irqL; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - DBG_871X(FUNC_ADPT_FMT" fw_state=%x\n", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv)); + RTW_INFO(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 - +#endif /* CONFIG_IOCTL_CFG80211 */ + rtw_indicate_scan_done(adapter, _TRUE); - -#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_IOCTL_CFG80211) - if (adapter->pbuddy_adapter) { - _adapter *buddy_adapter = adapter->pbuddy_adapter; - struct mlme_priv *buddy_mlme = &(buddy_adapter->mlmepriv); - struct rtw_wdev_priv *buddy_wdev_priv = adapter_wdev_data(buddy_adapter); - bool indicate_buddy_scan = _FALSE; - - _enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL); - if (buddy_wdev_priv->scan_request && buddy_mlme->scanning_via_buddy_intf == _TRUE) { - buddy_mlme->scanning_via_buddy_intf = _FALSE; - clr_fwstate(buddy_mlme, _FW_UNDER_SURVEY); - indicate_buddy_scan = _TRUE; - } - _exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL); - - if (indicate_buddy_scan == _TRUE) { - rtw_indicate_scan_done(buddy_adapter, _TRUE); - } - } -#endif /* CONFIG_CONCURRENT_MODE */ +#ifdef CONFIG_CONCURRENT_MODE + rtw_mi_buddy_indicate_scan_done(adapter, _TRUE);/*scanning_via_buddy_intf */ +#endif } -void rtw_mlme_reset_auto_scan_int(_adapter *adapter) +void rtw_mlme_reset_auto_scan_int(_adapter *adapter, u8 *reason) { struct mlme_priv *mlme = &adapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 u_ch; + u32 interval_ms = 0xffffffff; /* 0xffffffff: special value to make min() works well, also means no auto scan */ -#ifdef CONFIG_P2P - if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) { - mlme->auto_scan_int_ms = 0; /* disabled */ - goto exit; + *reason = RTW_AUTO_SCAN_REASON_UNSPECIFIED; + rtw_mi_get_ch_setting_union(adapter, &u_ch, NULL, NULL); + + if (hal_chk_bw_cap(adapter, BW_CAP_40M) + && is_client_associated_to_ap(adapter) == _TRUE + && u_ch >= 1 && u_ch <= 14 + && adapter->registrypriv.wifi_spec + /* TODO: AP Connected is 40MHz capability? */ + ) { + interval_ms = rtw_min(interval_ms, 60 * 1000); + *reason |= RTW_AUTO_SCAN_REASON_2040_BSS; } -#endif - if(pmlmeinfo->VHT_enable) //disable auto scan when connect to 11AC AP - { - mlme->auto_scan_int_ms = 0; - } - else if(adapter->registrypriv.wifi_spec && is_client_associated_to_ap(adapter) == _TRUE) { - mlme->auto_scan_int_ms = 60*1000; #ifdef CONFIG_LAYER2_ROAMING - } else if(rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) { - if (check_fwstate(mlme, WIFI_STATION_STATE) && check_fwstate(mlme, _FW_LINKED)) - mlme->auto_scan_int_ms = mlme->roam_scan_int_ms; -#endif - } else { - mlme->auto_scan_int_ms = 0; /* disabled */ + if (rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE) + && is_client_associated_to_ap(adapter) == _TRUE + ) { + interval_ms = rtw_min(interval_ms, mlme->roam_scan_int_ms); + *reason |= RTW_AUTO_SCAN_REASON_ROAM; } +#endif + exit: + if (interval_ms == 0xffffffff) + interval_ms = 0; + + rtw_mlme_set_auto_scan_int(adapter, interval_ms); return; } -void rtw_drv_scan_by_self(_adapter *padapter) +void rtw_drv_scan_by_self(_adapter *padapter, u8 reason) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct rtw_ieee80211_channel ch_for_2040_bss[14] = { + {1, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {2, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {3, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {4, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {5, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {6, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {7, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {8, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {9, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {10, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {11, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {12, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {13, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + {14, RTW_IEEE80211_CHAN_PASSIVE_SCAN}, + }; + struct rtw_ieee80211_channel *ch_sel = NULL; + int ch_num = 0; - if (!padapter->registrypriv.wifi_spec) { - if (check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY | _FW_UNDER_LINKING)) == _TRUE) { - DBG_871X(FUNC_ADPT_FMT" _FW_UNDER_SURVEY|_FW_UNDER_LINKING\n", FUNC_ADPT_ARG(padapter)); - goto exit; - } - - if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) { - DBG_871X(FUNC_ADPT_FMT" exit BusyTraffic\n", FUNC_ADPT_ARG(padapter)); - goto exit; - } + if (rtw_is_scan_deny(padapter)) + goto exit; + + if (!rtw_is_adapter_up(padapter)) + goto exit; + + if (rtw_mi_busy_traffic_check(padapter, _FALSE)) { + RTW_INFO(FUNC_ADPT_FMT" exit due to BusyTraffic\n", FUNC_ADPT_ARG(padapter)); + goto exit; + } + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) && check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) { + RTW_INFO(FUNC_ADPT_FMT" WIFI_AP_STATE && WIFI_UNDER_WPS\n", FUNC_ADPT_ARG(padapter)); + goto exit; + } + if (check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY | _FW_UNDER_LINKING)) == _TRUE) { + RTW_INFO(FUNC_ADPT_FMT" _FW_UNDER_SURVEY|_FW_UNDER_LINKING\n", FUNC_ADPT_ARG(padapter)); + goto exit; } #ifdef CONFIG_CONCURRENT_MODE - if (rtw_buddy_adapter_up(padapter)) { - if ((check_buddy_fwstate(padapter, (_FW_UNDER_SURVEY | _FW_UNDER_LINKING)) == _TRUE) || - (padapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE)) { - DBG_871X(FUNC_ADPT_FMT", but buddy_intf is under scanning or linking or BusyTraffic\n", FUNC_ADPT_ARG(padapter)); - goto exit; - } + if (rtw_mi_buddy_check_fwstate(padapter, (_FW_UNDER_SURVEY | _FW_UNDER_LINKING | WIFI_UNDER_WPS))) { + RTW_INFO(FUNC_ADPT_FMT", but buddy_intf is under scanning or linking or wps_phase\n", FUNC_ADPT_ARG(padapter)); + goto exit; } #endif - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + RTW_INFO(FUNC_ADPT_FMT" reason:0x%02x\n", FUNC_ADPT_ARG(padapter), reason); - rtw_set_802_11_bssid_list_scan(padapter, NULL, 0); + /* only for 20/40 BSS */ + if (reason == RTW_AUTO_SCAN_REASON_2040_BSS) { + ch_sel = ch_for_2040_bss; + ch_num = 14; + } + rtw_set_802_11_bssid_list_scan(padapter, NULL, 0, ch_sel, ch_num); exit: - return; + return; } static void rtw_auto_scan_handler(_adapter *padapter) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 reason = RTW_AUTO_SCAN_REASON_UNSPECIFIED; - rtw_mlme_reset_auto_scan_int(padapter); + rtw_mlme_reset_auto_scan_int(padapter, &reason); - if (pmlmepriv->auto_scan_int_ms != 0 - && rtw_get_passing_time_ms(pmlmepriv->scan_start_time) > pmlmepriv->auto_scan_int_ms) - rtw_drv_scan_by_self(padapter); - +#ifdef CONFIG_P2P + if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE)) + goto exit; +#endif + +#ifdef CONFIG_TDLS + if (padapter->tdlsinfo.link_established == _TRUE) + goto exit; +#endif + + if (pmlmepriv->auto_scan_int_ms == 0 + || rtw_get_passing_time_ms(pmlmepriv->scan_start_time) < pmlmepriv->auto_scan_int_ms) + goto exit; + + rtw_drv_scan_by_self(padapter, reason); + +exit: + return; +} +static u8 is_drv_in_lps(_adapter *adapter) +{ + u8 is_in_lps = _FALSE; + + #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) + #endif + ) + is_in_lps = _TRUE; + #endif /* CONFIG_LPS_LCLK_WD_TIMER*/ + return is_in_lps; +} +void rtw_iface_dynamic_check_timer_handlder(_adapter *adapter) +{ +#ifdef CONFIG_AP_MODE + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; +#endif /* CONFIG_AP_MODE */ + + if (adapter->net_closed == _TRUE) + return; + #ifdef CONFIG_LPS_LCLK_WD_TIMER /* to avoid leaving lps 32k frequently*/ + if (is_drv_in_lps(adapter)) { + u8 bEnterPS; + + linked_status_chk(adapter, 1); + + bEnterPS = traffic_status_watchdog(adapter, 1); + if (bEnterPS) { + /* rtw_lps_ctrl_wk_cmd(adapter, LPS_CTRL_ENTER, 1); */ + rtw_hal_dm_watchdog_in_lps(adapter); + } else { + /* call rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1) in traffic_status_watchdog() */ + } + } + #endif /* CONFIG_LPS_LCLK_WD_TIMER */ + + /* auto site survey */ + rtw_auto_scan_handler(adapter); + +#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK +#ifdef CONFIG_AP_MODE + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + expire_timeout_chk(adapter); +#endif +#endif /* !CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + +#ifdef CONFIG_BR_EXT + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35)) + rcu_read_lock(); +#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35)) */ + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) + if (adapter->pnetdev->br_port +#else /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */ + if (rcu_dereference(adapter->pnetdev->rx_handler_data) +#endif /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */ + && (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE) == _TRUE)) { + /* expire NAT2.5 entry */ + void nat25_db_expire(_adapter *priv); + nat25_db_expire(adapter); + + if (adapter->pppoe_connection_in_progress > 0) + adapter->pppoe_connection_in_progress--; + /* due to rtw_dynamic_check_timer_handlder() is called every 2 seconds */ + if (adapter->pppoe_connection_in_progress > 0) + adapter->pppoe_connection_in_progress--; + } + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35)) + rcu_read_unlock(); +#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35)) */ + +#endif /* CONFIG_BR_EXT */ + +} + +/*#define DBG_TRAFFIC_STATISTIC*/ +static void collect_traffic_statistics(_adapter *padapter) +{ + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); + + /*_rtw_memset(&pdvobjpriv->traffic_stat, 0, sizeof(struct rtw_traffic_statistics));*/ + + /* Tx bytes reset*/ + pdvobjpriv->traffic_stat.tx_bytes = 0; + pdvobjpriv->traffic_stat.tx_pkts = 0; + pdvobjpriv->traffic_stat.tx_drop = 0; + + /* Rx bytes reset*/ + pdvobjpriv->traffic_stat.rx_bytes = 0; + pdvobjpriv->traffic_stat.rx_pkts = 0; + pdvobjpriv->traffic_stat.rx_drop = 0; + + rtw_mi_traffic_statistics(padapter); + + /* Calculate throughput in last interval */ + pdvobjpriv->traffic_stat.cur_tx_bytes = pdvobjpriv->traffic_stat.tx_bytes - pdvobjpriv->traffic_stat.last_tx_bytes; + pdvobjpriv->traffic_stat.cur_rx_bytes = pdvobjpriv->traffic_stat.rx_bytes - pdvobjpriv->traffic_stat.last_rx_bytes; + pdvobjpriv->traffic_stat.last_tx_bytes = pdvobjpriv->traffic_stat.tx_bytes; + pdvobjpriv->traffic_stat.last_rx_bytes = pdvobjpriv->traffic_stat.rx_bytes; + + pdvobjpriv->traffic_stat.cur_tx_tp = (u32)(pdvobjpriv->traffic_stat.cur_tx_bytes * 8 / 2 / 1024 / 1024); + pdvobjpriv->traffic_stat.cur_rx_tp = (u32)(pdvobjpriv->traffic_stat.cur_rx_bytes * 8 / 2 / 1024 / 1024); + + #ifdef DBG_TRAFFIC_STATISTIC + RTW_INFO("\n========================\n"); + RTW_INFO("cur_tx_bytes:%lld\n", pdvobjpriv->traffic_stat.cur_tx_bytes); + RTW_INFO("cur_rx_bytes:%lld\n", pdvobjpriv->traffic_stat.cur_rx_bytes); + + RTW_INFO("last_tx_bytes:%lld\n", pdvobjpriv->traffic_stat.last_tx_bytes); + RTW_INFO("last_rx_bytes:%lld\n", pdvobjpriv->traffic_stat.last_rx_bytes); + + RTW_INFO("cur_tx_tp:%d\n", pdvobjpriv->traffic_stat.cur_tx_tp); + RTW_INFO("cur_rx_tp:%d\n", pdvobjpriv->traffic_stat.cur_rx_tp); + #endif } void rtw_dynamic_check_timer_handlder(_adapter *adapter) { -#ifdef CONFIG_AP_MODE - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; -#endif //CONFIG_AP_MODE - struct registry_priv *pregistrypriv = &adapter->registrypriv; -#ifdef CONFIG_CONCURRENT_MODE - PADAPTER pbuddy_adapter = adapter->pbuddy_adapter; -#endif - - if(!adapter) - return; + if (!adapter) + return; if (!rtw_is_hw_init_completed(adapter)) return; @@ -2872,106 +2911,12 @@ void rtw_dynamic_check_timer_handlder(_adapter *adapter) if (RTW_CANNOT_RUN(adapter)) return; - -#ifdef CONFIG_CONCURRENT_MODE - if(pbuddy_adapter) - { - if(adapter->net_closed == _TRUE && pbuddy_adapter->net_closed == _TRUE) - { - return; - } - } - else -#endif //CONFIG_CONCURRENT_MODE - if(adapter->net_closed == _TRUE) - { - return; - } + collect_traffic_statistics(adapter); -#ifdef CONFIG_BT_COEXIST - if (is_primary_adapter(adapter)) { - if (GET_HAL_DATA(adapter)->EEPROMBluetoothCoexist == 1) - DBG_871X("IsBtDisabled=%d, IsBtControlLps=%d\n" , rtw_btcoex_IsBtDisabled(adapter) , rtw_btcoex_IsBtControlLps(adapter)); - } -#endif + rtw_mi_dynamic_check_timer_handlder(adapter); -#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) -#endif - ) - { - u8 bEnterPS; - - linked_status_chk(adapter, 1); - - bEnterPS = traffic_status_watchdog(adapter, 1); - if(bEnterPS) - { - //rtw_lps_ctrl_wk_cmd(adapter, LPS_CTRL_ENTER, 1); - rtw_hal_dm_watchdog_in_lps(adapter); - } - else - { - //call rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1) in traffic_status_watchdog() - } - - } - else -#endif //CONFIG_LPS_LCLK_WD_TIMER - { - if(is_primary_adapter(adapter)) - { - rtw_dynamic_chk_wk_cmd(adapter); - } - } - - /* auto site survey */ - rtw_auto_scan_handler(adapter); - -#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK -#ifdef CONFIG_AP_MODE - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - expire_timeout_chk(adapter); - } -#endif -#endif //!CONFIG_ACTIVE_KEEP_ALIVE_CHECK - -#ifdef CONFIG_BR_EXT - -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35)) - rcu_read_lock(); -#endif // (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35)) - -#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) - if( adapter->pnetdev->br_port -#else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) - if( rcu_dereference(adapter->pnetdev->rx_handler_data) -#endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) - && (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) ) - { - // expire NAT2.5 entry - void nat25_db_expire(_adapter *priv); - nat25_db_expire(adapter); - - if (adapter->pppoe_connection_in_progress > 0) { - adapter->pppoe_connection_in_progress--; - } - - // due to rtw_dynamic_check_timer_handlder() is called every 2 seconds - if (adapter->pppoe_connection_in_progress > 0) { - adapter->pppoe_connection_in_progress--; - } - } - -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35)) - rcu_read_unlock(); -#endif // (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35)) - -#endif // CONFIG_BR_EXT - + if (!is_drv_in_lps(adapter)) + rtw_dynamic_chk_wk_cmd(adapter); } @@ -2987,37 +2932,20 @@ 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)); + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); } void rtw_set_scan_deny_timer_hdl(_adapter *adapter) { rtw_clear_scan_deny(adapter); } - void rtw_set_scan_deny(_adapter *adapter, u32 ms) { struct mlme_priv *mlmepriv = &adapter->mlmepriv; -#ifdef CONFIG_CONCURRENT_MODE - struct mlme_priv *b_mlmepriv; -#endif - if (0) - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); ATOMIC_SET(&mlmepriv->set_scan_deny, 1); _set_timer(&mlmepriv->set_scan_deny_timer, ms); - -#ifdef CONFIG_CONCURRENT_MODE - if (!adapter->pbuddy_adapter) - return; - - if (0) - 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); -#endif - } #endif @@ -3033,40 +2961,40 @@ static int rtw_check_roaming_candidate(struct mlme_priv *mlme int updated = _FALSE; _adapter *adapter = container_of(mlme, _adapter, mlmepriv); - if(is_same_ess(&competitor->network, &mlme->cur_network.network) == _FALSE) + if (is_same_ess(&competitor->network, &mlme->cur_network.network) == _FALSE) goto exit; - if(rtw_is_desired_network(adapter, competitor) == _FALSE) + if (rtw_is_desired_network(adapter, competitor) == _FALSE) goto exit; - DBG_871X("roam candidate:%s %s("MAC_FMT", ch%3u) rssi:%d, age:%5d\n", - (competitor == mlme->cur_network_scanned)?"*":" " , - competitor->network.Ssid.Ssid, - MAC_ARG(competitor->network.MacAddress), - competitor->network.Configuration.DSConfig, - (int)competitor->network.Rssi, - rtw_get_passing_time_ms(competitor->last_scanned) - ); + RTW_INFO("roam candidate:%s %s("MAC_FMT", ch%3u) rssi:%d, age:%5d\n", + (competitor == mlme->cur_network_scanned) ? "*" : " " , + competitor->network.Ssid.Ssid, + MAC_ARG(competitor->network.MacAddress), + competitor->network.Configuration.DSConfig, + (int)competitor->network.Rssi, + rtw_get_passing_time_ms(competitor->last_scanned) + ); /* got specific addr to roam */ if (!is_zero_mac_addr(mlme->roam_tgt_addr)) { - if(_rtw_memcmp(mlme->roam_tgt_addr, competitor->network.MacAddress, ETH_ALEN) == _TRUE) + if (_rtw_memcmp(mlme->roam_tgt_addr, competitor->network.MacAddress, ETH_ALEN) == _TRUE) goto update; else goto exit; } - #if 1 - if(rtw_get_passing_time_ms((u32)competitor->last_scanned) >= mlme->roam_scanr_exp_ms) +#if 1 + if (rtw_get_passing_time_ms((u32)competitor->last_scanned) >= mlme->roam_scanr_exp_ms) goto exit; if (competitor->network.Rssi - mlme->cur_network_scanned->network.Rssi < mlme->roam_rssi_diff_th) goto exit; - if(*candidate != NULL && (*candidate)->network.Rssi>=competitor->network.Rssi) + if (*candidate != NULL && (*candidate)->network.Rssi >= competitor->network.Rssi) goto exit; - #else +#else goto exit; - #endif +#endif update: *candidate = competitor; @@ -3081,13 +3009,12 @@ int rtw_select_roaming_candidate(struct mlme_priv *mlme) _irqL irqL; int ret = _FAIL; _list *phead; - _adapter *adapter; + _adapter *adapter; _queue *queue = &(mlme->scanned_queue); struct wlan_network *pnetwork = NULL; struct wlan_network *candidate = NULL; - u8 bSupportAntDiv = _FALSE; + u8 bSupportAntDiv = _FALSE; -_func_enter_; if (mlme->cur_network_scanned == NULL) { rtw_warn_on(1); @@ -3095,7 +3022,7 @@ _func_enter_; } _enter_critical_bh(&(mlme->scanned_queue.lock), &irqL); - phead = get_list_head(queue); + phead = get_list_head(queue); adapter = (_adapter *)mlme->nic_hdl; mlme->pscanned = get_next(phead); @@ -3103,38 +3030,37 @@ _func_enter_; while (!rtw_end_of_queue_search(phead, mlme->pscanned)) { pnetwork = LIST_CONTAINOR(mlme->pscanned, struct wlan_network, list); - if(pnetwork==NULL){ - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s return _FAIL:(pnetwork==NULL)\n", __FUNCTION__)); + if (pnetwork == NULL) { ret = _FAIL; goto exit; } - + 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); + RTW_INFO("%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); - - } - if(candidate == NULL) { - DBG_871X("%s: return _FAIL(candidate == NULL)\n", __FUNCTION__); + } + + if (candidate == NULL) { + RTW_INFO("%s: return _FAIL(candidate == NULL)\n", __FUNCTION__); ret = _FAIL; goto exit; } else { - DBG_871X("%s: candidate: %s("MAC_FMT", ch:%u)\n", __FUNCTION__, + RTW_INFO("%s: candidate: %s("MAC_FMT", ch:%u)\n", __FUNCTION__, candidate->network.Ssid.Ssid, MAC_ARG(candidate->network.MacAddress), - candidate->network.Configuration.DSConfig); + candidate->network.Configuration.DSConfig); mlme->roam_network = candidate; if (_rtw_memcmp(candidate->network.MacAddress, mlme->roam_tgt_addr, ETH_ALEN) == _TRUE) - _rtw_memset(mlme->roam_tgt_addr,0, ETH_ALEN); + _rtw_memset(mlme->roam_tgt_addr, 0, ETH_ALEN); } ret = _SUCCESS; @@ -3151,55 +3077,54 @@ exit: * @return _FALSE: candidate is not updated */ static int rtw_check_join_candidate(struct mlme_priv *mlme - , struct wlan_network **candidate, struct wlan_network *competitor) + , struct wlan_network **candidate, struct wlan_network *competitor) { int updated = _FALSE; _adapter *adapter = container_of(mlme, _adapter, mlmepriv); - //check bssid, if needed - if(mlme->assoc_by_bssid==_TRUE) { - if(_rtw_memcmp(competitor->network.MacAddress, mlme->assoc_bssid, ETH_ALEN) ==_FALSE) + /* check bssid, if needed */ + if (mlme->assoc_by_bssid == _TRUE) { + if (_rtw_memcmp(competitor->network.MacAddress, mlme->assoc_bssid, ETH_ALEN) == _FALSE) goto exit; } - //check ssid, if needed - if(mlme->assoc_ssid.Ssid[0] && mlme->assoc_ssid.SsidLength) { - if( competitor->network.Ssid.SsidLength != mlme->assoc_ssid.SsidLength - || _rtw_memcmp(competitor->network.Ssid.Ssid, mlme->assoc_ssid.Ssid, mlme->assoc_ssid.SsidLength) == _FALSE - ) + /* check ssid, if needed */ + if (mlme->assoc_ssid.Ssid[0] && mlme->assoc_ssid.SsidLength) { + if (competitor->network.Ssid.SsidLength != mlme->assoc_ssid.SsidLength + || _rtw_memcmp(competitor->network.Ssid.Ssid, mlme->assoc_ssid.Ssid, mlme->assoc_ssid.SsidLength) == _FALSE + ) goto exit; } - if(rtw_is_desired_network(adapter, competitor) == _FALSE) + if (rtw_is_desired_network(adapter, competitor) == _FALSE) goto exit; -#ifdef CONFIG_LAYER2_ROAMING - if(rtw_to_roam(adapter) > 0) { - if( rtw_get_passing_time_ms((u32)competitor->last_scanned) >= mlme->roam_scanr_exp_ms - || is_same_ess(&competitor->network, &mlme->cur_network.network) == _FALSE - ) +#ifdef CONFIG_LAYER2_ROAMING + if (rtw_to_roam(adapter) > 0) { + if (rtw_get_passing_time_ms((u32)competitor->last_scanned) >= mlme->roam_scanr_exp_ms + || is_same_ess(&competitor->network, &mlme->cur_network.network) == _FALSE + ) goto exit; } #endif - - if(*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) - { + + if (*candidate == NULL || (*candidate)->network.Rssi < competitor->network.Rssi) { *candidate = competitor; updated = _TRUE; } - if(updated){ - 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, - rtw_to_roam(adapter), - (*candidate)->network.Ssid.Ssid, - MAC_ARG((*candidate)->network.MacAddress), - (*candidate)->network.Configuration.DSConfig, - (int)(*candidate)->network.Rssi - ); + if (updated) { + RTW_INFO("[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, + rtw_to_roam(adapter), + (*candidate)->network.Ssid.Ssid, + MAC_ARG((*candidate)->network.MacAddress), + (*candidate)->network.Configuration.DSConfig, + (int)(*candidate)->network.Rssi + ); } exit: @@ -3217,30 +3142,29 @@ pmlmepriv->lock */ -int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv ) +int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv) { _irqL irqL; int ret; _list *phead; - _adapter *adapter; + _adapter *adapter; _queue *queue = &(pmlmepriv->scanned_queue); struct wlan_network *pnetwork = NULL; struct wlan_network *candidate = NULL; - u8 bSupportAntDiv = _FALSE; + u8 bSupportAntDiv = _FALSE; -_func_enter_; adapter = (_adapter *)pmlmepriv->nic_hdl; _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - #ifdef CONFIG_LAYER2_ROAMING +#ifdef CONFIG_LAYER2_ROAMING if (pmlmepriv->roam_network) { candidate = pmlmepriv->roam_network; pmlmepriv->roam_network = NULL; goto candidate_exist; } - #endif +#endif phead = get_list_head(queue); pmlmepriv->pscanned = get_next(phead); @@ -3248,353 +3172,325 @@ _func_enter_; while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) { pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); - if(pnetwork==NULL){ - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s return _FAIL:(pnetwork==NULL)\n", __FUNCTION__)); + if (pnetwork == NULL) { ret = _FAIL; goto exit; } - + 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); + RTW_INFO("%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); - - } - if(candidate == NULL) { - DBG_871X("%s: return _FAIL(candidate == NULL)\n", __FUNCTION__); + } + + if (candidate == NULL) { + RTW_INFO("%s: return _FAIL(candidate == NULL)\n", __FUNCTION__); #ifdef CONFIG_WOWLAN - _clr_fwstate_(pmlmepriv, _FW_LINKED|_FW_UNDER_LINKING); + _clr_fwstate_(pmlmepriv, _FW_LINKED | _FW_UNDER_LINKING); #endif ret = _FAIL; goto exit; } else { - DBG_871X("%s: candidate: %s("MAC_FMT", ch:%u)\n", __FUNCTION__, + RTW_INFO("%s: candidate: %s("MAC_FMT", ch:%u)\n", __FUNCTION__, candidate->network.Ssid.Ssid, MAC_ARG(candidate->network.MacAddress), - candidate->network.Configuration.DSConfig); + candidate->network.Configuration.DSConfig); goto candidate_exist; } - + candidate_exist: - // check for situation of _FW_LINKED - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - DBG_871X("%s: _FW_LINKED while ask_for_joinbss!!!\n", __FUNCTION__); + /* check for situation of _FW_LINKED */ + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { + RTW_INFO("%s: _FW_LINKED while ask_for_joinbss!!!\n", __FUNCTION__); - #if 0 // for WPA/WPA2 authentication, wpa_supplicant will expect authentication from AP, it is needed to reconnect AP... - if(is_same_network(&pmlmepriv->cur_network.network, &candidate->network)) - { - DBG_871X("%s: _FW_LINKED and is same network, it needn't join again\n", __FUNCTION__); +#if 0 /* for WPA/WPA2 authentication, wpa_supplicant will expect authentication from AP, it is needed to reconnect AP... */ + if (is_same_network(&pmlmepriv->cur_network.network, &candidate->network)) { + RTW_INFO("%s: _FW_LINKED and is same network, it needn't join again\n", __FUNCTION__); + + rtw_indicate_connect(adapter);/* rtw_indicate_connect again */ - rtw_indicate_connect(adapter);//rtw_indicate_connect again - ret = 2; goto exit; - } - else - #endif + } else +#endif { rtw_disassoc_cmd(adapter, 0, _TRUE); - rtw_indicate_disconnect(adapter); + rtw_indicate_disconnect(adapter, 0, _FALSE); rtw_free_assoc_resources(adapter, 0); } } - - #ifdef CONFIG_ANTENNA_DIVERSITY + +#ifdef CONFIG_ANTENNA_DIVERSITY rtw_hal_get_def_var(adapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv)); - if(_TRUE == bSupportAntDiv) - { + if (_TRUE == bSupportAntDiv) { u8 CurrentAntenna; - rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna)); - DBG_871X("#### Opt_Ant_(%s) , cur_Ant(%s)\n", - (2==candidate->network.PhyInfo.Optimum_antenna)?"A":"B", - (2==CurrentAntenna)?"A":"B" - ); + rtw_hal_get_odm_var(adapter, HAL_ODM_ANTDIV_SELECT, &(CurrentAntenna), NULL); + RTW_INFO("#### Opt_Ant_(%s) , cur_Ant(%s)\n", + (MAIN_ANT == candidate->network.PhyInfo.Optimum_antenna) ? "MAIN_ANT" : "AUX_ANT", + (MAIN_ANT == CurrentAntenna) ? "MAIN_ANT" : "AUX_ANT" + ); } - #endif +#endif set_fwstate(pmlmepriv, _FW_UNDER_LINKING); ret = rtw_joinbss_cmd(adapter, candidate); - + exit: _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); -_func_exit_; return ret; } -sint rtw_set_auth(_adapter * adapter,struct security_priv *psecuritypriv) +sint rtw_set_auth(_adapter *adapter, struct security_priv *psecuritypriv) { - struct cmd_obj* pcmd; - struct setauth_parm *psetauthparm; - struct cmd_priv *pcmdpriv=&(adapter->cmdpriv); - sint res=_SUCCESS; - -_func_enter_; + struct cmd_obj *pcmd; + struct setauth_parm *psetauthparm; + struct cmd_priv *pcmdpriv = &(adapter->cmdpriv); + sint res = _SUCCESS; - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; //try again + + pcmd = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmd == NULL) { + res = _FAIL; /* try again */ goto exit; } - - psetauthparm=(struct setauth_parm*)rtw_zmalloc(sizeof(struct setauth_parm)); - if(psetauthparm==NULL){ + + psetauthparm = (struct setauth_parm *)rtw_zmalloc(sizeof(struct setauth_parm)); + if (psetauthparm == NULL) { rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } _rtw_memset(psetauthparm, 0, sizeof(struct setauth_parm)); - psetauthparm->mode=(unsigned char)psecuritypriv->dot11AuthAlgrthm; - + psetauthparm->mode = (unsigned char)psecuritypriv->dot11AuthAlgrthm; + pcmd->cmdcode = _SetAuth_CMD_; - pcmd->parmbuf = (unsigned char *)psetauthparm; - pcmd->cmdsz = (sizeof(struct setauth_parm)); + pcmd->parmbuf = (unsigned char *)psetauthparm; + pcmd->cmdsz = (sizeof(struct setauth_parm)); pcmd->rsp = NULL; pcmd->rspsz = 0; _rtw_init_listhead(&pcmd->list); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("after enqueue set_auth_cmd, auth_mode=%x\n", psecuritypriv->dot11AuthAlgrthm)); res = rtw_enqueue_cmd(pcmdpriv, pcmd); exit: -_func_exit_; return res; } -sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx, bool enqueue) +sint rtw_set_key(_adapter *adapter, struct security_priv *psecuritypriv, sint keyid, u8 set_tx, bool enqueue) { u8 keylen; struct cmd_obj *pcmd; struct setkey_parm *psetkeyparm; struct cmd_priv *pcmdpriv = &(adapter->cmdpriv); struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - sint res=_SUCCESS; - -_func_enter_; + sint res = _SUCCESS; - psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); - if(psetkeyparm==NULL){ - res= _FAIL; + + psetkeyparm = (struct setkey_parm *)rtw_zmalloc(sizeof(struct setkey_parm)); + if (psetkeyparm == NULL) { + res = _FAIL; goto exit; } _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); - if(psecuritypriv->dot11AuthAlgrthm ==dot11AuthAlgrthm_8021X){ - psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy=%d \n", psetkeyparm->algorithm)); - } - else{ - psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm=%d \n", psetkeyparm->algorithm)); + if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { + psetkeyparm->algorithm = (unsigned char)psecuritypriv->dot118021XGrpPrivacy; + } else { + psetkeyparm->algorithm = (u8)psecuritypriv->dot11PrivacyAlgrthm; } - psetkeyparm->keyid = (u8)keyid;//0~3 + psetkeyparm->keyid = (u8)keyid;/* 0~3 */ psetkeyparm->set_tx = set_tx; if (is_wep_enc(psetkeyparm->algorithm)) adapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid); - DBG_871X("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid, adapter->securitypriv.key_mask); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=%d psetkeyparm->keyid=(u8)keyid=%d \n",psetkeyparm->algorithm, keyid)); + RTW_INFO("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n", psetkeyparm->algorithm, psetkeyparm->keyid, adapter->securitypriv.key_mask); - switch(psetkeyparm->algorithm){ - - case _WEP40_: - keylen=5; - _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); - break; - case _WEP104_: - keylen=13; - _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); - break; - case _TKIP_: - keylen=16; - _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); - psetkeyparm->grpkey=1; - break; - case _AES_: - keylen=16; - _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); - psetkeyparm->grpkey=1; - break; - default: - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key:psecuritypriv->dot11PrivacyAlgrthm = %x (must be 1 or 2 or 4 or 5)\n",psecuritypriv->dot11PrivacyAlgrthm)); - res= _FAIL; - rtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm)); - goto exit; + switch (psetkeyparm->algorithm) { + + case _WEP40_: + keylen = 5; + _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); + break; + case _WEP104_: + keylen = 13; + _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); + break; + case _TKIP_: + keylen = 16; + _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); + psetkeyparm->grpkey = 1; + break; + case _AES_: + keylen = 16; + _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); + psetkeyparm->grpkey = 1; + break; + default: + res = _FAIL; + rtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm)); + goto exit; } - - - if(enqueue){ - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ + + + if (enqueue) { + pcmd = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmd == NULL) { rtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm)); - res= _FAIL; //try again + res = _FAIL; /* try again */ goto exit; } - + pcmd->cmdcode = _SetKey_CMD_; - pcmd->parmbuf = (u8 *)psetkeyparm; - pcmd->cmdsz = (sizeof(struct setkey_parm)); + pcmd->parmbuf = (u8 *)psetkeyparm; + pcmd->cmdsz = (sizeof(struct setkey_parm)); pcmd->rsp = NULL; pcmd->rspsz = 0; _rtw_init_listhead(&pcmd->list); - //_rtw_init_sema(&(pcmd->cmd_sem), 0); + /* _rtw_init_sema(&(pcmd->cmd_sem), 0); */ res = rtw_enqueue_cmd(pcmdpriv, pcmd); - } - else{ + } else { setkey_hdl(adapter, (u8 *)psetkeyparm); rtw_mfree((u8 *) psetkeyparm, sizeof(struct setkey_parm)); } exit: -_func_exit_; return res; } -//adjust IEs for rtw_joinbss_cmd in WMM +/* adjust IEs for rtw_joinbss_cmd in WMM */ int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len) { - unsigned int ielength=0; + unsigned int ielength = 0; unsigned int i, j; - i = 12; //after the fixed IE - while(i=0 :if there is pre-auth key, and return the entry id -// -// +/* + * Ported from 8185: IsInPreAuthKeyList(). (Renamed from SecIsInPreAuthKeyList(), 2006-10-13.) + * Added by Annie, 2006-05-07. + * + * Search by BSSID, + * Return Value: + * -1 :if there is no pre-auth key in the table + * >=0 :if there is pre-auth key, and return the entry id + * + * */ static int SecIsInPMKIDList(_adapter *Adapter, u8 *bssid) { - struct security_priv *psecuritypriv=&Adapter->securitypriv; - int i=0; + struct security_priv *psecuritypriv = &Adapter->securitypriv; + int i = 0; - do - { - if( ( psecuritypriv->PMKIDList[i].bUsed ) && - ( _rtw_memcmp( psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN ) == _TRUE ) ) - { + do { + if ((psecuritypriv->PMKIDList[i].bUsed) && + (_rtw_memcmp(psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN) == _TRUE)) break; - } - else - { + else { i++; - //continue; + /* continue; */ } - - }while(isecuritypriv; + struct security_priv *sec = &adapter->securitypriv; if (ie[13] > 20) { int i; - u16 pmkid_cnt = RTW_GET_LE16(ie+14+20); - if (pmkid_cnt == 1 && _rtw_memcmp(ie+14+20+2, &sec->PMKIDList[iEntry].PMKID, 16)) { - DBG_871X(FUNC_ADPT_FMT" has carried the same PMKID:"KEY_FMT"\n" + u16 pmkid_cnt = RTW_GET_LE16(ie + 14 + 20); + if (pmkid_cnt == 1 && _rtw_memcmp(ie + 14 + 20 + 2, &sec->PMKIDList[iEntry].PMKID, 16)) { + RTW_INFO(FUNC_ADPT_FMT" has carried the same PMKID:"KEY_FMT"\n" , FUNC_ADPT_ARG(adapter), KEY_ARG(&sec->PMKIDList[iEntry].PMKID)); goto exit; } - DBG_871X(FUNC_ADPT_FMT" remove original PMKID, count:%u\n" - , FUNC_ADPT_ARG(adapter), pmkid_cnt); + RTW_INFO(FUNC_ADPT_FMT" remove original PMKID, count:%u\n" + , FUNC_ADPT_ARG(adapter), pmkid_cnt); - for (i=0;iPMKIDList[iEntry].PMKID)); + RTW_INFO(FUNC_ADPT_FMT" append PMKID:"KEY_FMT"\n" + , FUNC_ADPT_ARG(adapter), KEY_ARG(&sec->PMKIDList[iEntry].PMKID)); RTW_PUT_LE16(&ie[ie_len], 1); ie_len += 2; @@ -3602,72 +3498,65 @@ static int rtw_append_pmkid(_adapter *adapter,int iEntry, u8 *ie, uint ie_len) _rtw_memcpy(&ie[ie_len], &sec->PMKIDList[iEntry].PMKID, 16); ie_len += 16; - ie[13] += 18;//PMKID length = 2+16 + ie[13] += 18;/* PMKID length = 2+16 */ } exit: - return (ie_len); + return ie_len; } static int rtw_remove_pmkid(_adapter *adapter, u8 *ie, uint ie_len) { - struct security_priv *sec=&adapter->securitypriv; + struct security_priv *sec = &adapter->securitypriv; int i; - u16 pmkid_cnt = RTW_GET_LE16(ie+14+20); + u16 pmkid_cnt = RTW_GET_LE16(ie + 14 + 20); if (ie[13] <= 20) goto exit; - DBG_871X(FUNC_ADPT_FMT" remove original PMKID, count:%u\n" - , FUNC_ADPT_ARG(adapter), pmkid_cnt); + RTW_INFO(FUNC_ADPT_FMT" remove original PMKID, count:%u\n" + , FUNC_ADPT_ARG(adapter), pmkid_cnt); - for (i=0;imlmepriv; - struct security_priv *psecuritypriv=&adapter->securitypriv; - uint ndisauthmode=psecuritypriv->ndisauthtype; + struct security_priv *psecuritypriv = &adapter->securitypriv; + uint ndisauthmode = psecuritypriv->ndisauthtype; uint ndissecuritytype = psecuritypriv->ndisencryptstatus; - -_func_enter_; - RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, - ("+rtw_restruct_sec_ie: ndisauthmode=%d ndissecuritytype=%d\n", - ndisauthmode, ndissecuritytype)); - - //copy fixed ie only - _rtw_memcpy(out_ie, in_ie,12); - ielength=12; - if((ndisauthmode==Ndis802_11AuthModeWPA)||(ndisauthmode==Ndis802_11AuthModeWPAPSK)) - authmode=_WPA_IE_ID_; - if((ndisauthmode==Ndis802_11AuthModeWPA2)||(ndisauthmode==Ndis802_11AuthModeWPA2PSK)) - authmode=_WPA2_IE_ID_; - if(check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) - { - _rtw_memcpy(out_ie+ielength, psecuritypriv->wps_ie, psecuritypriv->wps_ie_len); - + + /* copy fixed ie only */ + _rtw_memcpy(out_ie, in_ie, 12); + ielength = 12; + if ((ndisauthmode == Ndis802_11AuthModeWPA) || (ndisauthmode == Ndis802_11AuthModeWPAPSK)) + authmode = _WPA_IE_ID_; + if ((ndisauthmode == Ndis802_11AuthModeWPA2) || (ndisauthmode == Ndis802_11AuthModeWPA2PSK)) + authmode = _WPA2_IE_ID_; + + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) { + _rtw_memcpy(out_ie + ielength, psecuritypriv->wps_ie, psecuritypriv->wps_ie_len); + ielength += psecuritypriv->wps_ie_len; - } - else if((authmode==_WPA_IE_ID_)||(authmode==_WPA2_IE_ID_)) - { - //copy RSN or SSN - _rtw_memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0], psecuritypriv->supplicant_ie[1]+2); + } else if ((authmode == _WPA_IE_ID_) || (authmode == _WPA2_IE_ID_)) { + /* copy RSN or SSN */ + _rtw_memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0], psecuritypriv->supplicant_ie[1] + 2); /* debug for CONFIG_IEEE80211W { int jj; @@ -3676,183 +3565,168 @@ _func_enter_; printk(" %02x ", psecuritypriv->supplicant_ie[jj]); printk("\n"); }*/ - ielength+=psecuritypriv->supplicant_ie[1]+2; + ielength += psecuritypriv->supplicant_ie[1] + 2; rtw_report_sec_ie(adapter, authmode, psecuritypriv->supplicant_ie); - + #ifdef CONFIG_DRVEXT_MODULE - drvext_report_sec_ie(&adapter->drvextpriv, authmode, sec_ie); + drvext_report_sec_ie(&adapter->drvextpriv, authmode, sec_ie); #endif } iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid); - if(iEntry<0) - { - if(authmode == _WPA2_IE_ID_) + if (iEntry < 0) { + if (authmode == _WPA2_IE_ID_) ielength = rtw_remove_pmkid(adapter, out_ie, ielength); - } - else - { - if(authmode == _WPA2_IE_ID_) - ielength=rtw_append_pmkid(adapter, iEntry, out_ie, ielength); + } else { + if (authmode == _WPA2_IE_ID_) + ielength = rtw_append_pmkid(adapter, iEntry, out_ie, ielength); } -_func_exit_; - - return ielength; + + return ielength; } -void rtw_init_registrypriv_dev_network( _adapter* adapter) +void rtw_init_registrypriv_dev_network(_adapter *adapter) { - struct registry_priv* pregistrypriv = &adapter->registrypriv; + struct registry_priv *pregistrypriv = &adapter->registrypriv; WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; u8 *myhwaddr = adapter_mac_addr(adapter); - -_func_enter_; + _rtw_memcpy(pdev_network->MacAddress, myhwaddr, ETH_ALEN); _rtw_memcpy(&pdev_network->Ssid, &pregistrypriv->ssid, sizeof(NDIS_802_11_SSID)); - - pdev_network->Configuration.Length=sizeof(NDIS_802_11_CONFIGURATION); - pdev_network->Configuration.BeaconPeriod = 100; + + pdev_network->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION); + pdev_network->Configuration.BeaconPeriod = 100; pdev_network->Configuration.FHConfig.Length = 0; pdev_network->Configuration.FHConfig.HopPattern = 0; pdev_network->Configuration.FHConfig.HopSet = 0; pdev_network->Configuration.FHConfig.DwellTime = 0; - - -_func_exit_; - + + + } -void rtw_update_registrypriv_dev_network(_adapter* adapter) +void rtw_update_registrypriv_dev_network(_adapter *adapter) { - int sz=0; - struct registry_priv* pregistrypriv = &adapter->registrypriv; + int sz = 0; + struct registry_priv *pregistrypriv = &adapter->registrypriv; WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; - struct security_priv* psecuritypriv = &adapter->securitypriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; struct wlan_network *cur_network = &adapter->mlmepriv.cur_network; - //struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + /* struct xmit_priv *pxmitpriv = &adapter->xmitpriv; */ struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; -_func_enter_; #if 0 pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; pxmitpriv->vcs = pregistrypriv->vcs_type; pxmitpriv->vcs_type = pregistrypriv->vcs_type; - //pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; + /* pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; */ pxmitpriv->frag_len = pregistrypriv->frag_thresh; - - adapter->qospriv.qos_option = pregistrypriv->wmm_enable; -#endif - pdev_network->Privacy = (psecuritypriv->dot11PrivacyAlgrthm > 0 ? 1 : 0) ; // adhoc no 802.1x + adapter->qospriv.qos_option = pregistrypriv->wmm_enable; +#endif + + pdev_network->Privacy = (psecuritypriv->dot11PrivacyAlgrthm > 0 ? 1 : 0) ; /* adhoc no 802.1x */ pdev_network->Rssi = 0; - switch(pregistrypriv->wireless_mode) - { - case WIRELESS_11B: - pdev_network->NetworkTypeInUse = (Ndis802_11DS); - break; - case WIRELESS_11G: - case WIRELESS_11BG: - case WIRELESS_11_24N: - case WIRELESS_11G_24N: - case WIRELESS_11BG_24N: - pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); - break; - case WIRELESS_11A: - case WIRELESS_11A_5N: + switch (pregistrypriv->wireless_mode) { + case WIRELESS_11B: + pdev_network->NetworkTypeInUse = (Ndis802_11DS); + break; + case WIRELESS_11G: + case WIRELESS_11BG: + case WIRELESS_11_24N: + case WIRELESS_11G_24N: + case WIRELESS_11BG_24N: + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); + break; + case WIRELESS_11A: + case WIRELESS_11A_5N: + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5); + break; + case WIRELESS_11ABGN: + if (pregistrypriv->channel > 14) pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5); - break; - case WIRELESS_11ABGN: - if(pregistrypriv->channel > 14) - pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5); - else - pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); - break; - default : - // TODO - break; + else + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); + break; + default: + /* TODO */ + break; } - + 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) { pdev_network->Configuration.ATIMWindow = (0); if (pmlmeext->cur_channel != 0) pdev_network->Configuration.DSConfig = pmlmeext->cur_channel; - else + else pdev_network->Configuration.DSConfig = 1; } pdev_network->InfrastructureMode = (cur_network->network.InfrastructureMode); - // 1. Supported rates - // 2. IE + /* 1. Supported rates */ + /* 2. IE */ - //rtw_set_supported_rate(pdev_network->SupportedRates, pregistrypriv->wireless_mode) ; // will be called in rtw_generate_ie + /* rtw_set_supported_rate(pdev_network->SupportedRates, pregistrypriv->wireless_mode) ; */ /* will be called in rtw_generate_ie */ sz = rtw_generate_ie(pregistrypriv); pdev_network->IELength = sz; - pdev_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pdev_network); + pdev_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pdev_network); + + /* notes: translate IELength & Length after assign the Length to cmdsz in createbss_cmd(); */ + /* pdev_network->IELength = cpu_to_le32(sz); */ - //notes: translate IELength & Length after assign the Length to cmdsz in createbss_cmd(); - //pdev_network->IELength = cpu_to_le32(sz); - -_func_exit_; } -void rtw_get_encrypt_decrypt_from_registrypriv(_adapter* adapter) +void rtw_get_encrypt_decrypt_from_registrypriv(_adapter *adapter) { -_func_enter_; -_func_exit_; - + } -//the fucntion is at passive_level +/* the fucntion is at passive_level */ void rtw_joinbss_reset(_adapter *padapter) { u8 threshold; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - //todo: if you want to do something io/reg/hw setting before join_bss, please add code here - -#ifdef CONFIG_80211N_HT - struct ht_priv *phtpriv = &pmlmepriv->htpriv; + /* todo: if you want to do something io/reg/hw setting before join_bss, please add code here */ + +#ifdef CONFIG_80211N_HT + struct ht_priv *phtpriv = &pmlmepriv->htpriv; pmlmepriv->num_FortyMHzIntolerant = 0; pmlmepriv->num_sta_no_ht = 0; - phtpriv->ampdu_enable = _FALSE;//reset to disabled + phtpriv->ampdu_enable = _FALSE;/* reset to disabled */ -#if defined( CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI) - // TH=1 => means that invalidate usb rx aggregation - // TH=0 => means that validate usb rx aggregation, use init value. - if(phtpriv->ht_option) - { - if(padapter->registrypriv.wifi_spec==1) +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + /* TH=1 => means that invalidate usb rx aggregation */ + /* TH=0 => means that validate usb rx aggregation, use init value. */ + if (phtpriv->ht_option) { + if (padapter->registrypriv.wifi_spec == 1) threshold = 1; else - threshold = 0; + threshold = 0; rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } - else - { + } else { threshold = 1; rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); } -#endif//#if defined( CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI) +#endif/* #if defined( CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI) */ -#endif//#ifdef CONFIG_80211N_HT +#endif/* #ifdef CONFIG_80211N_HT */ } @@ -3860,11 +3734,13 @@ void rtw_joinbss_reset(_adapter *padapter) #ifdef CONFIG_80211N_HT void rtw_ht_use_default_setting(_adapter *padapter) { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; struct registry_priv *pregistrypriv = &padapter->registrypriv; BOOLEAN bHwLDPCSupport = _FALSE, bHwSTBCSupport = _FALSE; +#ifdef CONFIG_BEAMFORMING BOOLEAN bHwSupportBeamformer = _FALSE, bHwSupportBeamformee = _FALSE; +#endif /* CONFIG_BEAMFORMING */ if (pregistrypriv->wifi_spec) phtpriv->bss_coexist = 1; @@ -3874,54 +3750,50 @@ void rtw_ht_use_default_setting(_adapter *padapter) phtpriv->sgi_40m = TEST_FLAG(pregistrypriv->short_gi, BIT1) ? _TRUE : _FALSE; phtpriv->sgi_20m = TEST_FLAG(pregistrypriv->short_gi, BIT0) ? _TRUE : _FALSE; - // LDPC support + /* LDPC support */ rtw_hal_get_def_var(padapter, HAL_DEF_RX_LDPC, (u8 *)&bHwLDPCSupport); CLEAR_FLAGS(phtpriv->ldpc_cap); - if(bHwLDPCSupport) - { - if(TEST_FLAG(pregistrypriv->ldpc_cap, BIT4)) + if (bHwLDPCSupport) { + if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT4)) SET_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX); } rtw_hal_get_def_var(padapter, HAL_DEF_TX_LDPC, (u8 *)&bHwLDPCSupport); - if(bHwLDPCSupport) - { - if(TEST_FLAG(pregistrypriv->ldpc_cap, BIT5)) + if (bHwLDPCSupport) { + if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT5)) SET_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX); } if (phtpriv->ldpc_cap) - DBG_871X("[HT] HAL Support LDPC = 0x%02X\n", phtpriv->ldpc_cap); + RTW_INFO("[HT] HAL Support LDPC = 0x%02X\n", phtpriv->ldpc_cap); - // STBC + /* STBC */ rtw_hal_get_def_var(padapter, HAL_DEF_TX_STBC, (u8 *)&bHwSTBCSupport); CLEAR_FLAGS(phtpriv->stbc_cap); - if(bHwSTBCSupport) - { - if(TEST_FLAG(pregistrypriv->stbc_cap, BIT5)) + if (bHwSTBCSupport) { + if (TEST_FLAG(pregistrypriv->stbc_cap, BIT5)) SET_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX); } rtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)&bHwSTBCSupport); - if(bHwSTBCSupport) - { - if(TEST_FLAG(pregistrypriv->stbc_cap, BIT4)) + if (bHwSTBCSupport) { + if (TEST_FLAG(pregistrypriv->stbc_cap, BIT4)) SET_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX); } if (phtpriv->stbc_cap) - DBG_871X("[HT] HAL Support STBC = 0x%02X\n", phtpriv->stbc_cap); + RTW_INFO("[HT] HAL Support STBC = 0x%02X\n", phtpriv->stbc_cap); - // Beamforming setting + /* Beamforming setting */ + CLEAR_FLAGS(phtpriv->beamform_cap); +#ifdef CONFIG_BEAMFORMING rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMER, (u8 *)&bHwSupportBeamformer); rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMEE, (u8 *)&bHwSupportBeamformee); - CLEAR_FLAGS(phtpriv->beamform_cap); - if(TEST_FLAG(pregistrypriv->beamform_cap, BIT4) && bHwSupportBeamformer) - { + if (TEST_FLAG(pregistrypriv->beamform_cap, BIT4) && bHwSupportBeamformer) { SET_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE); - DBG_871X("[HT] HAL Support Beamformer\n"); + RTW_INFO("[HT] HAL Support Beamformer\n"); } - if(TEST_FLAG(pregistrypriv->beamform_cap, BIT5) && bHwSupportBeamformee) - { + if (TEST_FLAG(pregistrypriv->beamform_cap, BIT5) && bHwSupportBeamformee) { SET_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE); - DBG_871X("[HT] HAL Support Beamformee\n"); + RTW_INFO("[HT] HAL Support Beamformee\n"); } +#endif /* CONFIG_BEAMFORMING */ } void rtw_build_wmm_ie_ht(_adapter *padapter, u8 *out_ie, uint *pout_len) { @@ -3929,11 +3801,10 @@ void rtw_build_wmm_ie_ht(_adapter *padapter, u8 *out_ie, uint *pout_len) int out_len; u8 *pframe; - if(padapter->mlmepriv.qospriv.qos_option == 0) - { + if (padapter->mlmepriv.qospriv.qos_option == 0) { out_len = *pout_len; - pframe = rtw_set_ie(out_ie+out_len, _VENDOR_SPECIFIC_IE_, - _WMM_IE_Length_, WMM_IE, pout_len); + pframe = rtw_set_ie(out_ie + out_len, _VENDOR_SPECIFIC_IE_, + _WMM_IE_Length_, WMM_IE, pout_len); padapter->mlmepriv.qospriv.qos_option = 1; } @@ -3943,11 +3814,12 @@ void rtw_build_wmm_ie_ht(_adapter *padapter, u8 *out_ie, uint *pout_len) unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel) { u32 ielen, out_len; + u32 rx_packet_offset, max_recvbuf_sz; HT_CAP_AMPDU_FACTOR max_rx_ampdu_factor; HT_CAP_AMPDU_DENSITY best_ampdu_density; unsigned char *p, *pframe; struct rtw_ieee80211_ht_cap ht_capie; - u8 cbw40_enable = 0, stbc_rx_enable = 0, rf_type = 0, operation_bw = 0, rf_num = 0; + u8 cbw40_enable = 0, rf_type = 0, operation_bw = 0, rf_num = 0, rx_stbc_nss = 0; struct registry_priv *pregistrypriv = &padapter->registrypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; @@ -3977,7 +3849,7 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui } else { p = rtw_get_ie(in_ie, _HT_ADD_INFO_IE_, &ielen, in_len); if (p && (ielen == sizeof(struct ieee80211_ht_addt_info))) { - struct HT_info_element *pht_info = (struct HT_info_element *)(p+2); + struct HT_info_element *pht_info = (struct HT_info_element *)(p + 2); if (pht_info->infos[0] & BIT(2)) { switch (pht_info->infos[0] & 0x3) { case 1: @@ -3988,9 +3860,8 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui operation_bw = CHANNEL_WIDTH_20; break; } - } else { + } else operation_bw = CHANNEL_WIDTH_20; - } } } @@ -4017,110 +3888,89 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui /* 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"); + RTW_INFO("[HT] Declare supporting RX LDPC\n"); } /* TX STBC */ if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX)) { ht_capie.cap_info |= IEEE80211_HT_CAP_TX_STBC; - DBG_871X("[HT] Declare supporting TX STBC\n"); + RTW_INFO("[HT] Declare supporting TX STBC\n"); } /* RX STBC */ 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 */ - ((channel > 14) && (pregistrypriv->rx_stbc == 0x2)) || /* enable for 5GHz */ - (pregistrypriv->wifi_spec == 1)) { - stbc_rx_enable = 1; + if ((pregistrypriv->rx_stbc == 0x3) || /* enable for 2.4/5 GHz */ + ((channel <= 14) && (pregistrypriv->rx_stbc == 0x1)) || /* enable for 2.4GHz */ + ((channel > 14) && (pregistrypriv->rx_stbc == 0x2)) || /* enable for 5GHz */ + (pregistrypriv->wifi_spec == 1)) { + /* HAL_DEF_RX_STBC means STBC RX spatial stream, todo: VHT 4 streams */ + rtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)(&rx_stbc_nss)); + SET_HT_CAP_ELE_RX_STBC(&ht_capie, rx_stbc_nss); + RTW_INFO("[HT] Declare supporting RX STBC = %d\n", rx_stbc_nss); } } - //fill default supported_mcs_set + /* fill default supported_mcs_set */ _rtw_memcpy(ht_capie.supp_mcs_set, pmlmeext->default_supported_mcs_set, 16); - //update default supported_mcs_set + /* update default supported_mcs_set */ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - switch(rf_type) - { + switch (rf_type) { case RF_1T1R: - - if (stbc_rx_enable) { - ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_1R;//RX STBC One spatial stream - DBG_871X("[HT] Declare supporting RX STBC_1R\n"); - } - - set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_1R); - break; + set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_1R); + break; case RF_2T2R: case RF_1T2R: - if (stbc_rx_enable) { - ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_1R;/* RX STBC one spatial stream */ - DBG_871X("[HT] Declare supporting RX STBC_1R\n"); - } - - #ifdef CONFIG_DISABLE_MCS13TO15 - if(((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) && (pregistrypriv->wifi_spec!=1)) - set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R_13TO15_OFF); +#ifdef CONFIG_DISABLE_MCS13TO15 + if (((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) && (pregistrypriv->wifi_spec != 1)) + set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R_13TO15_OFF); 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); - #endif //CONFIG_DISABLE_MCS13TO15 +#else /* CONFIG_DISABLE_MCS13TO15 */ + set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R); +#endif /* CONFIG_DISABLE_MCS13TO15 */ break; case RF_3T3R: - if (stbc_rx_enable) { - ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_1R;/* RX STBC one spatial stream */ - DBG_871X("[HT] Declare supporting RX STBC_1R\n"); - } set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_3R); break; default: - if (stbc_rx_enable) { - ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_1R;/* RX STBC one spatial stream */ - DBG_871X("[HT] Declare supporting RX STBC_1R\n"); - } - DBG_871X("[warning] rf_type %d is not expected\n", rf_type); + RTW_INFO("[warning] rf_type %d is not expected\n", rf_type); } { - u32 rx_packet_offset, max_recvbuf_sz; rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); - //if(max_recvbuf_sz-rx_packet_offset>(8191-256)) { - // DBG_871X("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__); - // ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; - //} + if (max_recvbuf_sz - rx_packet_offset >= (8191 - 256)) { + RTW_INFO("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__); + ht_capie.cap_info = ht_capie.cap_info | IEEE80211_HT_CAP_MAX_AMSDU; + } } - /* + /* AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k - AMPDU_para [4:2]:Min MPDU Start Spacing + AMPDU_para [4:2]:Min MPDU Start Spacing */ /* - #if defined(CONFIG_RTL8188E )&& defined (CONFIG_SDIO_HCI) + #if defined(CONFIG_RTL8188E) && defined(CONFIG_SDIO_HCI) ht_capie.ampdu_params_info = 2; #else ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03); #endif */ - if(padapter->driver_rx_ampdu_factor != 0xFF) + if (padapter->driver_rx_ampdu_factor != 0xFF) max_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)padapter->driver_rx_ampdu_factor; else rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor); - - //rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor); - ht_capie.ampdu_params_info = (max_rx_ampdu_factor&0x03); - if(padapter->driver_rx_ampdu_spacing != 0xFF) - { - ht_capie.ampdu_params_info |= (( padapter->driver_rx_ampdu_spacing&0x07) <<2); - } - else - { + /* rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor); */ + ht_capie.ampdu_params_info = (max_rx_ampdu_factor & 0x03); + + if (padapter->driver_rx_ampdu_spacing != 0xFF) + ht_capie.ampdu_params_info |= ((padapter->driver_rx_ampdu_spacing & 0x07) << 2); + else { if (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) { /* * Todo : Each chip must to ask DD , this chip best ampdu_density setting @@ -4130,8 +3980,8 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & (best_ampdu_density << 2)); - } else - ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00); + } else + ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & 0x00); } #ifdef CONFIG_BEAMFORMING ht_capie.tx_BF_cap_info = 0; @@ -4159,94 +4009,80 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui } #endif/*CONFIG_BEAMFORMING*/ - pframe = rtw_set_ie(out_ie+out_len, _HT_CAPABILITY_IE_, - sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, pout_len); + pframe = rtw_set_ie(out_ie + out_len, _HT_CAPABILITY_IE_, + sizeof(struct rtw_ieee80211_ht_cap), (unsigned char *)&ht_capie, pout_len); phtpriv->ht_option = _TRUE; - if(in_ie!=NULL) - { + if (in_ie != NULL) { p = rtw_get_ie(in_ie, _HT_ADD_INFO_IE_, &ielen, in_len); - if(p && (ielen==sizeof(struct ieee80211_ht_addt_info))) - { - out_len = *pout_len; - pframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len); + if (p && (ielen == sizeof(struct ieee80211_ht_addt_info))) { + out_len = *pout_len; + pframe = rtw_set_ie(out_ie + out_len, _HT_ADD_INFO_IE_, ielen, p + 2 , pout_len); } } - return (phtpriv->ht_option); - + return phtpriv->ht_option; + } -//the fucntion is > passive_level (in critical_section) +/* the fucntion is > passive_level (in critical_section) */ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel) -{ +{ u8 *p, max_ampdu_sz; - int len; - //struct sta_info *bmc_sta, *psta; + int len; + /* struct sta_info *bmc_sta, *psta; */ struct rtw_ieee80211_ht_cap *pht_capie; struct ieee80211_ht_addt_info *pht_addtinfo; - //struct recv_reorder_ctrl *preorder_ctrl; + /* struct recv_reorder_ctrl *preorder_ctrl; */ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; - //struct recv_priv *precvpriv = &padapter->recvpriv; + /* struct recv_priv *precvpriv = &padapter->recvpriv; */ struct registry_priv *pregistrypriv = &padapter->registrypriv; - //struct wlan_network *pcur_network = &(pmlmepriv->cur_network);; + /* struct wlan_network *pcur_network = &(pmlmepriv->cur_network);; */ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 cbw40_enable=0; - + u8 cbw40_enable = 0; - if(!phtpriv->ht_option) + + if (!phtpriv->ht_option) return; if ((!pmlmeinfo->HT_info_enable) || (!pmlmeinfo->HT_caps_enable)) return; - DBG_871X("+rtw_update_ht_cap()\n"); + RTW_INFO("+rtw_update_ht_cap()\n"); - //maybe needs check if ap supports rx ampdu. - if((phtpriv->ampdu_enable==_FALSE) &&(pregistrypriv->ampdu_enable==1)) - { - if(pregistrypriv->wifi_spec==1) - { - //remove this part because testbed AP should disable RX AMPDU - //phtpriv->ampdu_enable = _FALSE; + /* maybe needs check if ap supports rx ampdu. */ + if ((phtpriv->ampdu_enable == _FALSE) && (pregistrypriv->ampdu_enable == 1)) { + if (pregistrypriv->wifi_spec == 1) { + /* remove this part because testbed AP should disable RX AMPDU */ + /* phtpriv->ampdu_enable = _FALSE; */ phtpriv->ampdu_enable = _TRUE; - } - else - { + } else phtpriv->ampdu_enable = _TRUE; - } - } - else if(pregistrypriv->ampdu_enable==2) - { - //remove this part because testbed AP should disable RX AMPDU - //phtpriv->ampdu_enable = _TRUE; - } + } - - //check Max Rx A-MPDU Size + + /* check Max Rx A-MPDU Size */ len = 0; - p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_CAPABILITY_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs)); - if(p && len>0) - { - pht_capie = (struct rtw_ieee80211_ht_cap *)(p+2); + p = rtw_get_ie(pie + sizeof(NDIS_802_11_FIXED_IEs), _HT_CAPABILITY_IE_, &len, ie_len - sizeof(NDIS_802_11_FIXED_IEs)); + if (p && len > 0) { + pht_capie = (struct rtw_ieee80211_ht_cap *)(p + 2); max_ampdu_sz = (pht_capie->ampdu_params_info & IEEE80211_HT_CAP_AMPDU_FACTOR); - max_ampdu_sz = 1 << (max_ampdu_sz+3); // max_ampdu_sz (kbytes); - - //DBG_871X("rtw_update_ht_cap(): max_ampdu_sz=%d\n", max_ampdu_sz); + max_ampdu_sz = 1 << (max_ampdu_sz + 3); /* max_ampdu_sz (kbytes); */ + + /* RTW_INFO("rtw_update_ht_cap(): max_ampdu_sz=%d\n", max_ampdu_sz); */ phtpriv->rx_ampdu_maxlen = max_ampdu_sz; - + } - len=0; - p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_ADD_INFO_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs)); - if(p && len>0) - { - pht_addtinfo = (struct ieee80211_ht_addt_info *)(p+2); - //todo: + len = 0; + p = rtw_get_ie(pie + sizeof(NDIS_802_11_FIXED_IEs), _HT_ADD_INFO_IE_, &len, ie_len - sizeof(NDIS_802_11_FIXED_IEs)); + if (p && len > 0) { + pht_addtinfo = (struct ieee80211_ht_addt_info *)(p + 2); + /* todo: */ } if (hal_chk_bw_cap(padapter, BW_CAP_40M)) { @@ -4259,131 +4095,123 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel) } } - //update cur_bwmode & cur_ch_offset + /* update cur_bwmode & cur_ch_offset */ if ((cbw40_enable) && - (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) && - (pmlmeinfo->HT_info.infos[0] & BIT(2))) - { + (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) && + (pmlmeinfo->HT_info.infos[0] & BIT(2))) { int i; u8 rf_type = RF_1T1R; rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - //update the MCS set + /* update the MCS set */ for (i = 0; i < 16; i++) pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i]; - //update the MCS rates - switch(rf_type) - { - case RF_1T1R: - case RF_1T2R: - set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R); - break; - case RF_2T2R: - #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 - set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R); -#else //CONFIG_DISABLE_MCS13TO15 + /* update the MCS rates */ + switch (rf_type) { + case RF_1T1R: + case RF_1T2R: + set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R); + break; + case RF_2T2R: +#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 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); +#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: + RTW_INFO("[warning] rf_type %d is not expected\n", rf_type); } - //switch to the 40M Hz mode accoring to the AP - //pmlmeext->cur_bwmode = CHANNEL_WIDTH_40; - switch ((pmlmeinfo->HT_info.infos[0] & 0x3)) - { - case EXTCHNL_OFFSET_UPPER: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - - case EXTCHNL_OFFSET_LOWER: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - - default: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; - } + /* switch to the 40M Hz mode accoring to the AP */ + /* pmlmeext->cur_bwmode = CHANNEL_WIDTH_40; */ + switch ((pmlmeinfo->HT_info.infos[0] & 0x3)) { + case EXTCHNL_OFFSET_UPPER: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case EXTCHNL_OFFSET_LOWER: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } } - // - // Config SM Power Save setting - // + /* */ + /* Config SM Power Save setting */ + /* */ pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2; - if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) - { - /*u8 i; - //update the MCS rates + if (pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) { +#if 0 + u8 i; + /* update the MCS rates */ for (i = 0; i < 16; i++) - { pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; - }*/ - DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); +#endif + RTW_INFO("%s(): WLAN_HT_CAP_SM_PS_STATIC\n", __FUNCTION__); } - // - // Config current HT Protection mode. - // + /* */ + /* Config current HT Protection mode. */ + /* */ pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; - - -#if 0 //move to rtw_update_sta_info_client() - //for A-MPDU Rx reordering buffer control for bmc_sta & sta_info - //if A-MPDU Rx is enabled, reseting rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff - //todo: check if AP can send A-MPDU packets + + +#if 0 /* move to rtw_update_sta_info_client() */ + /* for A-MPDU Rx reordering buffer control for bmc_sta & sta_info */ + /* if A-MPDU Rx is enabled, reseting rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff */ + /* todo: check if AP can send A-MPDU packets */ bmc_sta = rtw_get_bcmc_stainfo(padapter); - if(bmc_sta) - { - for(i=0; i < 16 ; i++) - { - //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; + if (bmc_sta) { + for (i = 0; i < 16 ; i++) { + /* preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; */ preorder_ctrl = &bmc_sta->recvreorder_ctrl[i]; 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->wend_b= 0xffff; - preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d indicate_seq:%u\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); +#endif + preorder_ctrl->wend_b = 0xffff; + preorder_ctrl->wsize_b = 64;/* max_ampdu_sz; */ /* ex. 32(kbytes) -> wsize_b=32 */ } } psta = rtw_get_stainfo(&padapter->stapriv, pcur_network->network.MacAddress); - if(psta) - { - for(i=0; i < 16 ; i++) - { - //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; + if (psta) { + for (i = 0; i < 16 ; i++) { + /* preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; */ preorder_ctrl = &psta->recvreorder_ctrl[i]; 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->wend_b= 0xffff; - preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d indicate_seq:%u\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); +#endif + preorder_ctrl->wend_b = 0xffff; + preorder_ctrl->wsize_b = 64;/* max_ampdu_sz; */ /* ex. 32(kbytes) -> wsize_b=32 */ } } -#endif +#endif } #ifdef CONFIG_TDLS void rtw_issue_addbareq_cmd_tdls(_adapter *padapter, struct xmit_frame *pxmitframe) { - struct pkt_attrib *pattrib =&pxmitframe->attrib; + struct pkt_attrib *pattrib = &pxmitframe->attrib; struct sta_info *ptdls_sta = NULL; u8 issued; int priority; @@ -4397,71 +4225,66 @@ void rtw_issue_addbareq_cmd_tdls(_adapter *padapter, struct xmit_frame *pxmitfra phtpriv = &ptdls_sta->htpriv; if ((phtpriv->ht_option == _TRUE) && (phtpriv->ampdu_enable == _TRUE)) { - issued = (phtpriv->agg_enable_bitmap>>priority)&0x1; - issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1; + issued = (phtpriv->agg_enable_bitmap >> priority) & 0x1; + issued |= (phtpriv->candidate_tid_bitmap >> priority) & 0x1; if (0 == issued) { - DBG_871X("[%s], p=%d\n", __FUNCTION__, priority); + RTW_INFO("[%s], p=%d\n", __FUNCTION__, priority); ptdls_sta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); - rtw_addbareq_cmd(padapter,(u8)priority, pattrib->dst); + rtw_addbareq_cmd(padapter, (u8)priority, pattrib->dst); } } } } } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe) { u8 issued; int priority; - struct sta_info *psta=NULL; + struct sta_info *psta = NULL; struct ht_priv *phtpriv; - struct pkt_attrib *pattrib =&pxmitframe->attrib; + struct pkt_attrib *pattrib = &pxmitframe->attrib; s32 bmcst = IS_MCAST(pattrib->ra); - //if(bmcst || (padapter->mlmepriv.LinkDetectInfo.bTxBusyTraffic == _FALSE)) - if(bmcst || (padapter->mlmepriv.LinkDetectInfo.NumTxOkInPeriod<100)) + /* if(bmcst || (padapter->mlmepriv.LinkDetectInfo.bTxBusyTraffic == _FALSE)) */ + if (bmcst || (padapter->mlmepriv.LinkDetectInfo.NumTxOkInPeriod < 100)) return; - + priority = pattrib->priority; #ifdef CONFIG_TDLS rtw_issue_addbareq_cmd_tdls(padapter, pxmitframe); -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - if(pattrib->psta != psta) - { - DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); - return; - } - - if(psta==NULL) - { - DBG_871X("%s, psta==NUL\n", __func__); + if (pattrib->psta != psta) { + RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); return; } - if(!(psta->state &_FW_LINKED)) - { - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); + if (psta == NULL) { + RTW_INFO("%s, psta==NUL\n", __func__); return; - } + } + + if (!(psta->state & _FW_LINKED)) { + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); + return; + } phtpriv = &psta->htpriv; - if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) - { - issued = (phtpriv->agg_enable_bitmap>>priority)&0x1; - issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1; + 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) { + RTW_INFO("rtw_issue_addbareq_cmd, p=%d\n", priority); psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); - rtw_addbareq_cmd(padapter,(u8) priority, pattrib->ra); + rtw_addbareq_cmd(padapter, (u8) priority, pattrib->ra); } } @@ -4469,28 +4292,26 @@ void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe) void rtw_append_exented_cap(_adapter *padapter, u8 *out_ie, uint *pout_len) { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; #ifdef CONFIG_80211AC_VHT struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; -#endif //CONFIG_80211AC_VHT +#endif /* CONFIG_80211AC_VHT */ u8 cap_content[8] = { 0 }; u8 *pframe; u8 null_content[8] = {0}; - if (phtpriv->bss_coexist) { + if (phtpriv->bss_coexist) SET_EXT_CAPABILITY_ELE_BSS_COEXIST(cap_content, 1); - } #ifdef CONFIG_80211AC_VHT - if (pvhtpriv->vht_option) { + if (pvhtpriv->vht_option) SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(cap_content, 1); - } -#endif //CONFIG_80211AC_VHT +#endif /* CONFIG_80211AC_VHT */ /* 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. + 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); @@ -4530,11 +4351,11 @@ void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct wlan_network *cur_network = &pmlmepriv->cur_network; int do_join_r; - - if(0 < rtw_to_roam(padapter)) { - DBG_871X("roaming from %s("MAC_FMT"), length:%d\n", - cur_network->network.Ssid.Ssid, MAC_ARG(cur_network->network.MacAddress), - cur_network->network.Ssid.SsidLength); + + if (0 < rtw_to_roam(padapter)) { + RTW_INFO("roaming from %s("MAC_FMT"), length:%d\n", + cur_network->network.Ssid.Ssid, MAC_ARG(cur_network->network.MacAddress), + cur_network->network.Ssid.SsidLength); _rtw_memcpy(&pmlmepriv->assoc_ssid, &cur_network->network.Ssid, sizeof(NDIS_802_11_SSID)); pmlmepriv->assoc_by_bssid = _FALSE; @@ -4543,24 +4364,25 @@ void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network) rtw_wapi_return_all_sta_info(padapter); #endif - while(1) { - if( _SUCCESS==(do_join_r=rtw_do_join(padapter)) ) { + while (1) { + do_join_r = rtw_do_join(padapter); + if (_SUCCESS == do_join_r) break; - } else { - DBG_871X("roaming do_join return %d\n", do_join_r); + else { + RTW_INFO("roaming do_join return %d\n", do_join_r); rtw_dec_to_roam(padapter); - - if(rtw_to_roam(padapter) > 0) { + + if (rtw_to_roam(padapter) > 0) continue; - } else { - DBG_871X("%s(%d) -to roaming fail, indicate_disconnect\n", __FUNCTION__,__LINE__); - rtw_indicate_disconnect(padapter); + else { + RTW_INFO("%s(%d) -to roaming fail, indicate_disconnect\n", __FUNCTION__, __LINE__); + rtw_indicate_disconnect(padapter, 0, _FALSE); break; } } } } - + } #endif /* CONFIG_LAYER2_ROAMING */ @@ -4591,84 +4413,103 @@ bool rtw_adjust_chbw(_adapter *adapter, u8 req_ch, u8 *req_bw, u8 *req_offset) sint rtw_linked_check(_adapter *padapter) { - if( (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) || - (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)) - { - if(padapter->stapriv.asoc_sta_count > 2) + if ((check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) || + (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE) == _TRUE)) { + if (padapter->stapriv.asoc_sta_count > 2) return _TRUE; - } - else - { //Station mode - if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)== _TRUE) + } else { + /* Station mode */ + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) == _TRUE) return _TRUE; } return _FALSE; } - -#ifdef CONFIG_CONCURRENT_MODE -sint rtw_buddy_adapter_up(_adapter *padapter) -{ - sint res = _FALSE; - - if(padapter == NULL) - return res; - - - if(padapter->pbuddy_adapter == NULL) - res = _FALSE; - else if (RTW_CANNOT_RUN(padapter) || - (padapter->pbuddy_adapter->bup == _FALSE) || (!rtw_is_hw_init_completed(padapter))) - res = _FALSE; - else - res = _TRUE; - - return res; - -} - -sint check_buddy_fwstate(_adapter *padapter, sint state) +u8 rtw_is_adapter_up(_adapter *padapter) { - if(padapter == NULL) - return _FALSE; - - if(padapter->pbuddy_adapter == NULL) - return _FALSE; - - if ((state == WIFI_FW_NULL_STATE) && - (padapter->pbuddy_adapter->mlmepriv.fw_state == WIFI_FW_NULL_STATE)) - return _TRUE; - - if (padapter->pbuddy_adapter->mlmepriv.fw_state & state) - return _TRUE; + if (padapter == NULL) + return _FALSE; - return _FALSE; + if (RTW_CANNOT_RUN(padapter)) { + RTW_INFO(FUNC_ADPT_FMT "-(bSurpriseRemoved == _TRUE) || ( bDriverStopped == _TRUE)\n", FUNC_ADPT_ARG(padapter)); + return _FALSE; + } + + if (!rtw_is_hw_init_completed(padapter)) { + /*RTW_INFO(FUNC_ADPT_FMT "-(hw_init_completed == _FALSE)\n", FUNC_ADPT_ARG(padapter));*/ + return _FALSE; + } + + if (padapter->bup == _FALSE) { + /*RTW_INFO(FUNC_ADPT_FMT "-(bup == _FALSE)\n", FUNC_ADPT_ARG(padapter));*/ + return _FALSE; + } + + return _TRUE; } -u8 rtw_get_buddy_bBusyTraffic(_adapter *padapter) +bool is_miracast_enabled(_adapter *adapter) { - if(padapter == NULL) - return _FALSE; - - if(padapter->pbuddy_adapter == NULL) - return _FALSE; - - return padapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic; + bool enabled = 0; +#ifdef CONFIG_WFD + struct wifi_display_info *wfdinfo = &adapter->wfd_info; + + enabled = (wfdinfo->stack_wfd_mode & (MIRACAST_SOURCE | MIRACAST_SINK)) + || (wfdinfo->op_wfd_mode & (MIRACAST_SOURCE | MIRACAST_SINK)); +#endif + + return enabled; } -#endif //CONFIG_CONCURRENT_MODE +bool rtw_chk_miracast_mode(_adapter *adapter, u8 mode) +{ + bool ret = 0; +#ifdef CONFIG_WFD + struct wifi_display_info *wfdinfo = &adapter->wfd_info; -static const char *miracast_mode_str[] = { - "DISABLED", - "SOURCE", - "SINK", - "INVALID", -}; + ret = (wfdinfo->stack_wfd_mode & mode) || (wfdinfo->op_wfd_mode & mode); +#endif + + return ret; +} const char *get_miracast_mode_str(int mode) { - if (mode < MIRACAST_DISABLED || mode >= MIRACAST_INVALID) - mode = MIRACAST_INVALID; - - return miracast_mode_str[mode]; + if (mode == MIRACAST_SOURCE) + return "SOURCE"; + else if (mode == MIRACAST_SINK) + return "SINK"; + else if (mode == (MIRACAST_SOURCE | MIRACAST_SINK)) + return "SOURCE&SINK"; + else if (mode == MIRACAST_DISABLED) + return "DISABLED"; + else + return "INVALID"; } +#ifdef CONFIG_WFD +static bool wfd_st_match_rule(_adapter *adapter, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port) +{ + struct wifi_display_info *wfdinfo = &adapter->wfd_info; + + if (ntohs(*((u16 *)local_port)) == wfdinfo->rtsp_ctrlport + || ntohs(*((u16 *)local_port)) == wfdinfo->tdls_rtsp_ctrlport + || ntohs(*((u16 *)remote_port)) == wfdinfo->peer_rtsp_ctrlport) + return _TRUE; + return _FALSE; +} + +static struct st_register wfd_st_reg = { + .s_proto = 0x06, + .rule = wfd_st_match_rule, +}; +#endif /* CONFIG_WFD */ + +inline void rtw_wfd_st_switch(struct sta_info *sta, bool on) +{ +#ifdef CONFIG_WFD + if (on) + rtw_st_ctl_register(&sta->st_ctl, SESSION_TRACKER_REG_ID_WFD, &wfd_st_reg); + else + rtw_st_ctl_unregister(&sta->st_ctl, SESSION_TRACKER_REG_ID_WFD); +#endif +} diff --git a/core/rtw_mlme_ext.c b/core/rtw_mlme_ext.c index 8bace5d..5a39673 100755 --- a/core/rtw_mlme_ext.c +++ b/core/rtw_mlme_ext.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -21,12 +21,12 @@ #include #ifdef CONFIG_IOCTL_CFG80211 -#include -#endif //CONFIG_IOCTL_CFG80211 + #include +#endif /* CONFIG_IOCTL_CFG80211 */ #include -struct mlme_handler mlme_sta_tbl[]={ +struct mlme_handler mlme_sta_tbl[] = { {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, @@ -45,11 +45,11 @@ struct mlme_handler mlme_sta_tbl[]={ {WIFI_AUTH, "OnAuth", &OnAuthClient}, {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, {WIFI_ACTION, "OnAction", &OnAction}, - {WIFI_ACTION_NOACK,"OnActionNoAck", &OnAction}, + {WIFI_ACTION_NOACK, "OnActionNoAck", &OnAction}, }; #ifdef _CONFIG_NATIVEAP_MLME_ -struct mlme_handler mlme_ap_tbl[]={ +struct mlme_handler mlme_ap_tbl[] = { {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, @@ -68,11 +68,11 @@ struct mlme_handler mlme_ap_tbl[]={ {WIFI_AUTH, "OnAuth", &OnAuth}, {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, {WIFI_ACTION, "OnAction", &OnAction}, - {WIFI_ACTION_NOACK,"OnActionNoAck", &OnAction}, + {WIFI_ACTION_NOACK, "OnActionNoAck", &OnAction}, }; #endif -struct action_handler OnAction_tbl[]={ +struct action_handler OnAction_tbl[] = { {RTW_WLAN_CATEGORY_SPECTRUM_MGMT, "ACTION_SPECTRUM_MGMT", on_action_spct}, {RTW_WLAN_CATEGORY_QOS, "ACTION_QOS", &OnAction_qos}, {RTW_WLAN_CATEGORY_DLS, "ACTION_DLS", &OnAction_dls}, @@ -85,17 +85,17 @@ struct action_handler OnAction_tbl[]={ {RTW_WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &OnAction_sa_query}, #else {RTW_WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &DoReserved}, -#endif //CONFIG_IEEE80211W - //add for CONFIG_IEEE80211W +#endif /* CONFIG_IEEE80211W */ + /* add for CONFIG_IEEE80211W */ {RTW_WLAN_CATEGORY_UNPROTECTED_WNM, "ACTION_UNPROTECTED_WNM", &DoReserved}, {RTW_WLAN_CATEGORY_SELF_PROTECTED, "ACTION_SELF_PROTECTED", &DoReserved}, {RTW_WLAN_CATEGORY_WMM, "ACTION_WMM", &OnAction_wmm}, {RTW_WLAN_CATEGORY_VHT, "ACTION_VHT", &OnAction_vht}, - {RTW_WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p}, + {RTW_WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p}, }; -u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0}; +u8 null_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; /************************************************** OUI definitions for the vendor specific IE @@ -103,8 +103,8 @@ OUI definitions for the vendor specific IE unsigned char RTW_WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01}; unsigned char WMM_OUI[] = {0x00, 0x50, 0xf2, 0x02}; unsigned char WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04}; -unsigned char P2P_OUI[] = {0x50,0x6F,0x9A,0x09}; -unsigned char WFD_OUI[] = {0x50,0x6F,0x9A,0x0A}; +unsigned char P2P_OUI[] = {0x50, 0x6F, 0x9A, 0x09}; +unsigned char WFD_OUI[] = {0x50, 0x6F, 0x9A, 0x0A}; unsigned char WMM_INFO_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; unsigned char WMM_PARA_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; @@ -152,6 +152,7 @@ static RT_CHANNEL_PLAN_2G RTW_ChannelPlan2G[] = { /* 5, RTW_RD_2G_ETSI2 */ {{10, 11, 12, 13}, 4}, /* 6, RTW_RD_2G_GLOBAL */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14}, /* 7, RTW_RD_2G_MKK2 */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, + /* 8, RTW_RD_2G_FCC2 */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, }; static RT_CHANNEL_PLAN_5G RTW_ChannelPlan5G[] = { @@ -242,7 +243,7 @@ static RT_CHANNEL_PLAN_MAP RTW_ChannelPlanMap[] = { {RTW_RD_2G_MKK1, RTW_RD_5G_MKK1, TXPWR_LMT_MKK}, /* 0x27, RTW_CHPLAN_MKK1_MKK1 */ {RTW_RD_2G_WORLD, RTW_RD_5G_KCC1, TXPWR_LMT_ETSI}, /* 0x28, RTW_CHPLAN_WORLD_KCC1 */ {RTW_RD_2G_WORLD, RTW_RD_5G_FCC2, TXPWR_LMT_FCC}, /* 0x29, RTW_CHPLAN_WORLD_FCC2 */ - {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x2A, */ + {RTW_RD_2G_FCC2, RTW_RD_5G_NULL, TXPWR_LMT_FCC}, /* 0x2A, RTW_CHPLAN_FCC2_NULL */ {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x2B, */ {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x2C, */ {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x2D, */ @@ -290,6 +291,13 @@ static RT_CHANNEL_PLAN_MAP RTW_ChannelPlanMap[] = { {RTW_RD_2G_FCC1, RTW_RD_5G_FCC10, TXPWR_LMT_FCC}, /* 0x57, RTW_CHPLAN_FCC1_FCC10 */ {RTW_RD_2G_MKK2, RTW_RD_5G_MKK4, TXPWR_LMT_MKK}, /* 0x58, RTW_CHPLAN_MKK2_MKK4 */ {RTW_RD_2G_WORLD, RTW_RD_5G_ETSI14, TXPWR_LMT_ETSI}, /* 0x59, RTW_CHPLAN_WORLD_ETSI14 */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5A, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5B, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5C, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5D, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5E, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5F, */ + {RTW_RD_2G_FCC1, RTW_RD_5G_FCC5, TXPWR_LMT_FCC}, /* 0x60, RTW_CHPLAN_FCC1_FCC5 */ }; static RT_CHANNEL_PLAN_MAP RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = { @@ -300,11 +308,6 @@ bool rtw_chplan_is_empty(u8 id) { RT_CHANNEL_PLAN_MAP *chplan_map; - if (!rtw_is_channel_plan_valid(id)) { - rtw_warn_on(1); - return _FALSE; - } - if (id == RTW_CHPLAN_REALTEK_DEFINE) chplan_map = &RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE; else @@ -317,84 +320,73 @@ bool rtw_chplan_is_empty(u8 id) return _FALSE; } -#ifdef CONFIG_DFS_MASTER -void rtw_rfctl_reset_cac(struct rf_ctl_t *rfctl) +void rtw_rfctl_init(_adapter *adapter) { - if (rtw_is_long_cac_ch(rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset)) - rfctl->cac_end_time = rtw_get_current_time() + rtw_ms_to_systime(CAC_TIME_CE_MS); - else - rfctl->cac_end_time = rtw_get_current_time() + rtw_ms_to_systime(CAC_TIME_MS); + struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); + + _rtw_memset(rfctl, 0, sizeof(*rfctl)); + +#ifdef CONFIG_DFS_MASTER + rfctl->cac_start_time = rfctl->cac_end_time = RTW_CAC_STOPPED; + + /* TODO: dfs_master_timer */ +#endif } +#ifdef CONFIG_DFS_MASTER /* -* check if channel coverage includes new range and the new range is in DFS range -* called after radar_detect_ch,bw,offset is updated +* called in rtw_dfs_master_enable() +* assume the request channel coverage is DFS range +* base on the current status and the request channel coverage to check if need to reset complete CAC time */ -bool rtw_is_cac_reset_needed(_adapter *adapter) +bool rtw_is_cac_reset_needed(_adapter *adapter, u8 ch, u8 bw, u8 offset) { struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); bool needed = _FALSE; - u32 pre_hi, pre_lo, hi, lo; + u32 cur_hi, cur_lo, hi, lo; - if (0) - DBG_871X("pre_radar_detect_ch:%d, pre_radar_detect_by_sta_link:%d\n" - , rfctl->pre_radar_detect_ch, rfctl->pre_radar_detect_by_sta_link); - - if (rfctl->pre_radar_detect_by_sta_link == _TRUE) - goto exit; - - if (rfctl->pre_radar_detect_ch == 0) { + if (rfctl->radar_detected == 1) { needed = _TRUE; goto exit; } - if (rtw_chbw_to_freq_range(rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset, &hi, &lo) == _FALSE) + if (rfctl->radar_detect_ch == 0) { + needed = _TRUE; + goto exit; + } + + if (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE) { + RTW_ERR("request detection range ch:%u, bw:%u, offset:%u\n", ch, bw, offset); rtw_warn_on(1); - if (rtw_chbw_to_freq_range(rfctl->pre_radar_detect_ch, rfctl->pre_radar_detect_bw, rfctl->pre_radar_detect_offset, &pre_hi, &pre_lo) == _FALSE) + } + + if (rtw_chbw_to_freq_range(rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset, &cur_hi, &cur_lo) == _FALSE) { + RTW_ERR("cur detection range ch:%u, bw:%u, offset:%u\n", rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset); rtw_warn_on(1); + } - if (!rtw_is_range_a_in_b(hi, lo, pre_hi, pre_lo)) { - if (rtw_is_range_a_in_b(pre_hi, pre_lo, hi, lo)) { - /* currrent is supper set of previous */ - if (rtw_is_dfs_range(hi, lo)) - needed = _TRUE; - } else if (rtw_is_range_overlap(hi, lo, pre_hi, pre_lo)) { - /* currrent is not supper set of previous, but has overlap */ - u32 new_hi, new_lo; + if (hi <= lo || cur_hi <= cur_lo) { + RTW_ERR("hi:%u, lo:%u, cur_hi:%u, cur_lo:%u\n", hi, lo, cur_hi, cur_lo); + rtw_warn_on(1); + } - if (lo < pre_lo) { - new_hi = pre_lo; - new_lo = lo; - if (hi <= pre_lo || hi >= pre_hi) { - DBG_871X_LEVEL(_drv_err_, "hi:%u, lo:%u, pre_hi:%u, pre_lo:%u\n" - , hi, lo, pre_hi, pre_lo); - rtw_warn_on(1); - goto exit; - } - } else if (hi > pre_hi) { - new_hi = hi; - new_lo = pre_hi; - if (lo >= pre_hi && lo <= pre_lo) { - DBG_871X_LEVEL(_drv_err_, "hi:%u, lo:%u, pre_hi:%u, pre_lo:%u\n" - , hi, lo, pre_hi, pre_lo); - rtw_warn_on(1); - goto exit; - } - } else { - DBG_871X_LEVEL(_drv_err_, "hi:%u, lo:%u, pre_hi:%u, pre_lo:%u\n" - , hi, lo, pre_hi, pre_lo); - rtw_warn_on(1); - goto exit; - } + if (rtw_is_range_a_in_b(hi, lo, cur_hi, cur_lo)) { + /* request is in current detect range */ + goto exit; + } - if (rtw_is_dfs_range(new_hi, new_lo)) - needed = _TRUE; - - } else { - /* no overlap */ - if (rtw_is_dfs_range(hi, lo)) - needed = _TRUE; - } + /* check if request channel coverage has new range and the new range is in DFS range */ + if (!rtw_is_range_overlap(hi, lo, cur_hi, cur_lo)) { + /* request has no overlap with current */ + needed = _TRUE; + } else if (rtw_is_range_a_in_b(cur_hi, cur_lo, hi, lo)) { + /* request is supper set of current */ + if ((hi != cur_hi && rtw_is_dfs_range(hi, cur_hi)) || (lo != cur_lo && rtw_is_dfs_range(cur_lo, lo))) + needed = _TRUE; + } else { + /* request is not supper set of current, but has overlap */ + if ((lo < cur_lo && rtw_is_dfs_range(cur_lo, lo)) || (hi > cur_hi && rtw_is_dfs_range(hi, cur_hi))) + needed = _TRUE; } exit: @@ -408,6 +400,9 @@ bool _rtw_rfctl_overlap_radar_detect_ch(struct rf_ctl_t *rfctl, u8 ch, u8 bw, u8 u32 r_hi = 0, r_lo = 0; int i; + if (rfctl->radar_detect_by_others) + goto exit; + if (rfctl->radar_detect_ch == 0) goto exit; @@ -438,9 +433,9 @@ bool rtw_rfctl_overlap_radar_detect_ch(struct rf_ctl_t *rfctl) , rfctl_to_dvobj(rfctl)->oper_ch_offset); } -bool rtw_rfctl_is_tx_blocked_by_cac(struct rf_ctl_t *rfctl) +bool rtw_rfctl_is_tx_blocked_by_ch_waiting(struct rf_ctl_t *rfctl) { - return (rtw_rfctl_overlap_radar_detect_ch(rfctl) && IS_UNDER_CAC(rfctl)); + return rtw_rfctl_overlap_radar_detect_ch(rfctl) && IS_CH_WAITING(rfctl); } bool rtw_chset_is_ch_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset) @@ -473,6 +468,39 @@ exit: return ret; } +u32 rtw_chset_get_ch_non_ocp_ms(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset) +{ + int ms = 0; + u32 current_time; + u32 hi = 0, lo = 0; + int i; + + if (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE) + goto exit; + + current_time = rtw_get_current_time(); + + for (i = 0; ch_set[i].ChannelNum != 0; i++) { + if (!rtw_ch2freq(ch_set[i].ChannelNum)) { + rtw_warn_on(1); + continue; + } + + if (!CH_IS_NON_OCP(&ch_set[i])) + continue; + + if (lo <= rtw_ch2freq(ch_set[i].ChannelNum) + && rtw_ch2freq(ch_set[i].ChannelNum) <= hi + ) { + if (rtw_systime_to_ms(ch_set[i].non_ocp_end_time - current_time) > ms) + ms = rtw_systime_to_ms(ch_set[i].non_ocp_end_time - current_time); + } + } + +exit: + return ms; +} + /** * rtw_chset_update_non_ocp - update non_ocp_end_time according to the given @ch, @bw, @offset into @ch_set * @ch_set: the given channel set @@ -503,7 +531,7 @@ static void _rtw_chset_update_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 else ch_set[i].non_ocp_end_time = rtw_get_current_time() + rtw_ms_to_systime(NON_OCP_TIME_MS); } - } + } exit: return; @@ -518,52 +546,214 @@ inline void rtw_chset_update_non_ocp_ms(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u { _rtw_chset_update_non_ocp(ch_set, ch, bw, offset, ms); } -#endif /* CONFIG_DFS_MASTER */ -bool rtw_choose_available_chbw(_adapter *adapter, u8 req_bw, u8 *dec_ch, u8 *dec_bw, u8 *dec_offset, u8 d_flags) +u32 rtw_get_ch_waiting_ms(_adapter *adapter, u8 ch, u8 bw, u8 offset, u32 *r_non_ocp_ms, u32 *r_cac_ms) { + struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; + u32 non_ocp_ms; + u32 cac_ms; + u8 in_rd_range = 0; /* if in current radar detection range*/ + + if (rtw_chset_is_ch_non_ocp(mlmeext->channel_set, ch, bw, offset)) + non_ocp_ms = rtw_chset_get_ch_non_ocp_ms(mlmeext->channel_set, ch, bw, offset); + else + non_ocp_ms = 0; + + if (rfctl->dfs_master_enabled) { + u32 cur_hi, cur_lo, hi, lo; + + if (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE) { + RTW_ERR("input range ch:%u, bw:%u, offset:%u\n", ch, bw, offset); + rtw_warn_on(1); + } + + if (rtw_chbw_to_freq_range(rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset, &cur_hi, &cur_lo) == _FALSE) { + RTW_ERR("cur detection range ch:%u, bw:%u, offset:%u\n", rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset); + rtw_warn_on(1); + } + + if (rtw_is_range_a_in_b(hi, lo, cur_hi, cur_lo)) + in_rd_range = 1; + } + + if (!rtw_is_dfs_ch(ch, bw, offset)) + cac_ms = 0; + else if (in_rd_range && !non_ocp_ms) { + if (IS_CH_WAITING(rfctl)) + cac_ms = rtw_systime_to_ms(rfctl->cac_end_time - rtw_get_current_time()); + else + cac_ms = 0; + } else if (rtw_is_long_cac_ch(ch, bw, offset, rtw_odm_get_dfs_domain(adapter))) + cac_ms = CAC_TIME_CE_MS; + else + cac_ms = CAC_TIME_MS; + + if (r_non_ocp_ms) + *r_non_ocp_ms = non_ocp_ms; + if (r_cac_ms) + *r_cac_ms = cac_ms; + + return non_ocp_ms + cac_ms; +} + +void rtw_reset_cac(_adapter *adapter, u8 ch, u8 bw, u8 offset) +{ + struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); + u32 non_ocp_ms; + u32 cac_ms; + + rtw_get_ch_waiting_ms(adapter + , ch + , bw + , offset + , &non_ocp_ms + , &cac_ms + ); + + rfctl->cac_start_time = rtw_get_current_time() + rtw_ms_to_systime(non_ocp_ms); + rfctl->cac_end_time = rfctl->cac_start_time + rtw_ms_to_systime(cac_ms); + + /* skip special value */ + if (rfctl->cac_start_time == RTW_CAC_STOPPED) { + rfctl->cac_start_time++; + rfctl->cac_end_time++; + } + if (rfctl->cac_end_time == RTW_CAC_STOPPED) + rfctl->cac_end_time++; +} + +/* choose channel with shortest waiting (non ocp + cac) time */ +bool rtw_choose_shortest_waiting_ch(_adapter *adapter, u8 req_bw, u8 *dec_ch, u8 *dec_bw, u8 *dec_offset, u8 d_flags) +{ +#ifndef DBG_CHOOSE_SHORTEST_WAITING_CH +#define DBG_CHOOSE_SHORTEST_WAITING_CH 0 +#endif + + struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; + struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); + struct registry_priv *regsty = adapter_to_regsty(adapter); + u8 ch, bw, offset; + u8 ch_c = 0, bw_c = 0, offset_c = 0; int i; + u32 min_waiting_ms = 0; if (!dec_ch || !dec_bw || !dec_offset) { rtw_warn_on(1); - return _FAIL; + return _FALSE; } - for (i = 0; i < mlmeext->max_chan_nums; i++) { - - *dec_ch = mlmeext->channel_set[i].ChannelNum; - *dec_bw = req_bw; - if (*dec_bw == CHANNEL_WIDTH_20) - *dec_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - else - *dec_offset = rtw_get_offset_by_ch(*dec_ch); - - if ((d_flags & RTW_CHF_2G) && *dec_ch <= 14) + /* full search and narrow bw judegement first to avoid potetial judegement timing issue */ + for (bw = CHANNEL_WIDTH_20; bw <= req_bw; bw++) { + if (!hal_is_bw_support(adapter, bw)) continue; - if ((d_flags & RTW_CHF_5G) && *dec_ch > 14) - continue; + for (i = 0; i < mlmeext->max_chan_nums; i++) { + u32 non_ocp_ms; + u32 cac_ms; + u32 waiting_ms; - rtw_adjust_chbw(adapter, *dec_ch, dec_bw, dec_offset); + ch = mlmeext->channel_set[i].ChannelNum; - if ((d_flags & RTW_CHF_DFS) && rtw_is_dfs_ch(*dec_ch, *dec_bw, *dec_offset)) - continue; + if ((d_flags & RTW_CHF_2G) && ch <= 14) + continue; - if ((d_flags & RTW_CHF_LONG_CAC) && rtw_is_long_cac_ch(*dec_ch, *dec_bw, *dec_offset)) - continue; + if ((d_flags & RTW_CHF_5G) && ch > 14) + continue; - if ((d_flags & RTW_CHF_NON_DFS) && !rtw_is_dfs_ch(*dec_ch, *dec_bw, *dec_offset)) - continue; + if (ch > 14) { + if (bw > REGSTY_BW_5G(regsty)) + continue; + } else { + if (bw > REGSTY_BW_2G(regsty)) + continue; + } - if ((d_flags & RTW_CHF_NON_LONG_CAC) && !rtw_is_long_cac_ch(*dec_ch, *dec_bw, *dec_offset)) - continue; + if (!rtw_get_offset_by_chbw(ch, bw, &offset)) + continue; - if (!rtw_chset_is_ch_non_ocp(mlmeext->channel_set, *dec_ch, *dec_bw, *dec_offset)) - break; + if (!rtw_chset_is_chbw_valid(mlmeext->channel_set, ch, bw, offset)) + continue; + + if ((d_flags & RTW_CHF_NON_OCP) && rtw_chset_is_ch_non_ocp(mlmeext->channel_set, ch, bw, offset)) + continue; + + if ((d_flags & RTW_CHF_DFS) && rtw_is_dfs_ch(ch, bw, offset)) + continue; + + if ((d_flags & RTW_CHF_LONG_CAC) && rtw_is_long_cac_ch(ch, bw, offset, rtw_odm_get_dfs_domain(adapter))) + continue; + + if ((d_flags & RTW_CHF_NON_DFS) && !rtw_is_dfs_ch(ch, bw, offset)) + continue; + + if ((d_flags & RTW_CHF_NON_LONG_CAC) && !rtw_is_long_cac_ch(ch, bw, offset, rtw_odm_get_dfs_domain(adapter))) + continue; + + waiting_ms = rtw_get_ch_waiting_ms(adapter, ch, bw, offset, &non_ocp_ms, &cac_ms); + + if (DBG_CHOOSE_SHORTEST_WAITING_CH) + RTW_INFO(FUNC_ADPT_FMT":%u,%u,%u %u(non_ocp:%u, cac:%u)\n" + , FUNC_ADPT_ARG(adapter), ch, bw, offset, waiting_ms, non_ocp_ms, cac_ms); + + if (ch_c == 0 + || min_waiting_ms > waiting_ms + || (min_waiting_ms == waiting_ms && bw > bw_c) /* wider bw first */ + ) { + ch_c = ch; + bw_c = bw; + offset_c = offset; + min_waiting_ms = waiting_ms; + } + } } - return (i < mlmeext->max_chan_nums)?_TRUE:_FALSE; + if (ch_c != 0) { + RTW_INFO(FUNC_ADPT_FMT": d_flags:0x%02x %u,%u,%u waiting_ms:%u\n" + , FUNC_ADPT_ARG(adapter), d_flags, ch_c, bw_c, offset_c, min_waiting_ms); + + *dec_ch = ch_c; + *dec_bw = bw_c; + *dec_offset = offset_c; + return _TRUE; + } + + if (d_flags == 0) + rtw_warn_on(1); + + return _FALSE; +} +#endif /* CONFIG_DFS_MASTER */ + +void dump_country_chplan(void *sel, const struct country_chplan *ent) +{ + _RTW_PRINT_SEL(sel, "\"%c%c\", 0x%02X%s\n" + , ent->alpha2[0], ent->alpha2[1], ent->chplan + , COUNTRY_CHPLAN_EN_11AC(ent) ? " ac" : "" + ); +} + +void dump_country_chplan_map(void *sel) +{ + const struct country_chplan *ent; + u8 code[2]; + +#if RTW_DEF_MODULE_REGULATORY_CERT + _RTW_PRINT_SEL(sel, "RTW_DEF_MODULE_REGULATORY_CERT:0x%x\n", RTW_DEF_MODULE_REGULATORY_CERT); +#endif +#ifdef CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP + _RTW_PRINT_SEL(sel, "CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP\n"); +#endif + + for (code[0] = 'A'; code[0] <= 'Z'; code[0]++) { + for (code[1] = 'A'; code[1] <= 'Z'; code[1]++) { + ent = rtw_get_chplan_from_country(code); + if (!ent) + continue; + + dump_country_chplan(sel, ent); + } + } } void dump_chplan_id_list(void *sel) @@ -571,13 +761,13 @@ void dump_chplan_id_list(void *sel) int i; for (i = 0; i < RTW_CHPLAN_MAX; i++) { - if (rtw_chplan_is_empty(i)) + if (!rtw_is_channel_plan_valid(i)) continue; - DBG_871X_SEL(sel, "0x%02X ", i); + _RTW_PRINT_SEL(sel, "0x%02X ", i); } - DBG_871X_SEL_NL(sel, "0x7F\n"); + RTW_PRINT_SEL(sel, "0x7F\n"); } void dump_chplan_test(void *sel) @@ -588,14 +778,14 @@ void dump_chplan_test(void *sel) for (i = 0; i < RTW_RD_2G_MAX; i++) { for (j = 0; j < RTW_ChannelPlan2G[i].Len; j++) { if (rtw_ch2freq(RTW_ChannelPlan2G[i].Channel[j]) == 0) - DBG_871X_SEL_NL(sel, "invalid ch:%u at (%d,%d)\n", RTW_ChannelPlan2G[i].Channel[j], i, j); + RTW_PRINT_SEL(sel, "invalid ch:%u at (%d,%d)\n", RTW_ChannelPlan2G[i].Channel[j], i, j); } } for (i = 0; i < RTW_RD_5G_MAX; i++) { for (j = 0; j < RTW_ChannelPlan5G[i].Len; j++) { if (rtw_ch2freq(RTW_ChannelPlan5G[i].Channel[j]) == 0) - DBG_871X_SEL_NL(sel, "invalid ch:%u at (%d,%d)\n", RTW_ChannelPlan5G[i].Channel[j], i, j); + RTW_PRINT_SEL(sel, "invalid ch:%u at (%d,%d)\n", RTW_ChannelPlan5G[i].Channel[j], i, j); } } } @@ -605,37 +795,59 @@ void dump_chset(void *sel, RT_CHANNEL_INFO *ch_set) u8 i; for (i = 0; ch_set[i].ChannelNum != 0; i++) { - DBG_871X_SEL_NL(sel, "ch:%3u, freq:%u, scan_type:%d" + RTW_PRINT_SEL(sel, "ch:%3u, freq:%u, scan_type:%d" , ch_set[i].ChannelNum, rtw_ch2freq(ch_set[i].ChannelNum), ch_set[i].ScanType); - - #ifdef CONFIG_FIND_BEST_CHANNEL - DBG_871X_SEL(sel, ", rx_count:%u", ch_set[i].rx_count); - #endif - - #ifdef CONFIG_DFS_MASTER + +#ifdef CONFIG_FIND_BEST_CHANNEL + _RTW_PRINT_SEL(sel, ", rx_count:%u", ch_set[i].rx_count); +#endif + +#ifdef CONFIG_DFS_MASTER if (rtw_is_dfs_ch(ch_set[i].ChannelNum, CHANNEL_WIDTH_20, HAL_PRIME_CHNL_OFFSET_DONT_CARE)) { if (CH_IS_NON_OCP(&ch_set[i])) - DBG_871X_SEL(sel, ", non_ocp:%d" + _RTW_PRINT_SEL(sel, ", non_ocp:%d" , rtw_systime_to_ms(ch_set[i].non_ocp_end_time - rtw_get_current_time())); else - DBG_871X_SEL(sel, ", non_ocp:N/A"); + _RTW_PRINT_SEL(sel, ", non_ocp:N/A"); } - #endif +#endif - DBG_871X_SEL(sel, "\n"); + _RTW_PRINT_SEL(sel, "\n"); } - DBG_871X_SEL_NL(sel, "total ch number:%d\n", i); + RTW_PRINT_SEL(sel, "total ch number:%d\n", i); } void dump_cur_chset(void *sel, _adapter *adapter) { struct mlme_priv *mlme = &adapter->mlmepriv; struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; + struct registry_priv *regsty = adapter_to_regsty(adapter); HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); + int i; + + if (mlme->country_ent) + dump_country_chplan(sel, mlme->country_ent); + else + RTW_PRINT_SEL(sel, "chplan:0x%02X\n", mlme->ChannelPlan); + + RTW_PRINT_SEL(sel, "2G_PLS:%u, 5G_PLS:%u\n" + , hal_data->Regulation2_4G, hal_data->Regulation5G); + + for (i = 0; i < MAX_CHANNEL_NUM; i++) + if (regsty->excl_chs[i] != 0) + break; + + if (i < MAX_CHANNEL_NUM) { + _RTW_PRINT_SEL(sel, "excl_chs:"); + for (i = 0; i < MAX_CHANNEL_NUM; i++) { + if (regsty->excl_chs[i] == 0) + break; + _RTW_PRINT_SEL(sel, "%u ", regsty->excl_chs[i]); + } + RTW_PRINT_SEL(sel, "\n"); + } - DBG_871X_SEL_NL(sel, "Channel plan ID:0x%02X, 2G_PLS:%u, 5G_PLS:%u\n" - , mlme->ChannelPlan, hal_data->Regulation2_4G, hal_data->Regulation5G); dump_chset(sel, mlmeext->channel_set); } @@ -643,27 +855,63 @@ void dump_cur_chset(void *sel, _adapter *adapter) * Search the @param ch in given @param ch_set * @ch_set: the given channel set * @ch: the given channel number - * + * * return the index of channel_num in channel_set, -1 if not found */ int rtw_ch_set_search_ch(RT_CHANNEL_INFO *ch_set, const u32 ch) { int i; - for(i=0;ch_set[i].ChannelNum!=0;i++){ - if(ch == ch_set[i].ChannelNum) + for (i = 0; ch_set[i].ChannelNum != 0; i++) { + if (ch == ch_set[i].ChannelNum) break; } - - if(i >= ch_set[i].ChannelNum) + + if (i >= ch_set[i].ChannelNum) return -1; return i; } +/* + * Check if the @param ch, bw, offset is valid for the given @param ch_set + * @ch_set: the given channel set + * @ch: the given channel number + * @bw: the given bandwidth + * @offset: the given channel offset + * + * return valid (1) or not (0) + */ +u8 rtw_chset_is_chbw_valid(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset) +{ + u8 cch; + u8 *op_chs; + u8 op_ch_num; + u8 valid = 0; + int i; + + cch = rtw_get_center_ch(ch, bw, offset); + + if (!rtw_get_op_chs_by_cch_bw(cch, bw, &op_chs, &op_ch_num)) + goto exit; + + for (i = 0; i < op_ch_num; i++) { + if (0) + RTW_INFO("%u,%u,%u - cch:%u, bw:%u, op_ch:%u\n", ch, bw, offset, cch, bw, *(op_chs + i)); + if (rtw_ch_set_search_ch(ch_set, *(op_chs + i)) == -1) + break; + } + + if (op_ch_num != 0 && i == op_ch_num) + valid = 1; + +exit: + return valid; +} + /* * Check the @param ch is fit with setband setting of @param adapter * @adapter: the given adapter * @ch: the given channel number - * + * * return _TRUE when check valid, _FALSE not valid */ bool rtw_mlme_band_check(_adapter *adapter, const u32 ch) @@ -671,11 +919,42 @@ bool rtw_mlme_band_check(_adapter *adapter, const u32 ch) 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; - } return _FALSE; } +inline void RTW_SET_SCAN_BAND_SKIP(_adapter *padapter, int skip_band) +{ + int bs = ATOMIC_READ(&padapter->bandskip); + + bs |= skip_band; + ATOMIC_SET(&padapter->bandskip, bs); +} + +inline void RTW_CLR_SCAN_BAND_SKIP(_adapter *padapter, int skip_band) +{ + int bs = ATOMIC_READ(&padapter->bandskip); + + bs &= ~(skip_band); + ATOMIC_SET(&padapter->bandskip, bs); +} +inline int RTW_GET_SCAN_BAND_SKIP(_adapter *padapter) +{ + return ATOMIC_READ(&padapter->bandskip); +} + +#define RTW_IS_SCAN_BAND_SKIP(padapter, skip_band) (ATOMIC_READ(&padapter->bandskip) & (skip_band)) + +bool rtw_mlme_ignore_chan(_adapter *adapter, const u32 ch) +{ + if (RTW_IS_SCAN_BAND_SKIP(adapter, BAND_24G) && ch < 35) /* SKIP 2.4G Band channel */ + return _TRUE; + if (RTW_IS_SCAN_BAND_SKIP(adapter, BAND_5G) && ch > 35) /* SKIP 5G Band channel */ + return _TRUE; + + return _FALSE; +} + /**************************************************************************** @@ -687,19 +966,19 @@ int init_hw_mlme_ext(_adapter *padapter) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - //set_opmode_cmd(padapter, infra_client_with_mlme);//removed + /* set_opmode_cmd(padapter, infra_client_with_mlme); */ /* removed */ set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); return _SUCCESS; } -void init_mlme_default_rate_set(_adapter* padapter) +void init_mlme_default_rate_set(_adapter *padapter) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - 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 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, 0xff, 0x00, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates); @@ -708,29 +987,29 @@ void init_mlme_default_rate_set(_adapter* padapter) _rtw_memcpy(pmlmeext->default_supported_mcs_set, supported_mcs_set, sizeof(pmlmeext->default_supported_mcs_set)); } -static void init_mlme_ext_priv_value(_adapter* padapter) +static void init_mlme_ext_priv_value(_adapter *padapter) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); ATOMIC_SET(&pmlmeext->event_seq, 0); - pmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode + pmlmeext->mgnt_seq = 0;/* reset to zero when disconnect at client mode */ #ifdef CONFIG_IEEE80211W pmlmeext->sa_query_seq = 0; - pmlmeext->mgnt_80211w_IPN=0; - pmlmeext->mgnt_80211w_IPN_rx=0; -#endif //CONFIG_IEEE80211W + pmlmeext->mgnt_80211w_IPN = 0; + pmlmeext->mgnt_80211w_IPN_rx = 0; +#endif /* CONFIG_IEEE80211W */ pmlmeext->cur_channel = padapter->registrypriv.channel; pmlmeext->cur_bwmode = CHANNEL_WIDTH_20; pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - + pmlmeext->retry = 0; pmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode; init_mlme_default_rate_set(padapter); - if(pmlmeext->cur_channel > 14) + if (pmlmeext->cur_channel > 14) pmlmeext->tx_rate = IEEE80211_OFDM_RATE_6MB; else pmlmeext->tx_rate = IEEE80211_CCK_RATE_1MB; @@ -741,16 +1020,16 @@ static void init_mlme_ext_priv_value(_adapter* padapter) pmlmeext->sitesurvey_res.scan_ch_ms = SURVEY_TO; pmlmeext->sitesurvey_res.rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID; pmlmeext->sitesurvey_res.rx_ampdu_size = RX_AMPDU_SIZE_INVALID; - #ifdef CONFIG_SCAN_BACKOP - mlmeext_assign_scan_backop_flags_sta(pmlmeext, /*SS_BACKOP_EN|*/SS_BACKOP_PS_ANNC|SS_BACKOP_TX_RESUME); - mlmeext_assign_scan_backop_flags_ap(pmlmeext, SS_BACKOP_EN|SS_BACKOP_PS_ANNC|SS_BACKOP_TX_RESUME); +#ifdef CONFIG_SCAN_BACKOP + mlmeext_assign_scan_backop_flags_sta(pmlmeext, /*SS_BACKOP_EN|*/SS_BACKOP_PS_ANNC | SS_BACKOP_TX_RESUME); + mlmeext_assign_scan_backop_flags_ap(pmlmeext, SS_BACKOP_EN | SS_BACKOP_PS_ANNC | SS_BACKOP_TX_RESUME); pmlmeext->sitesurvey_res.scan_cnt = 0; pmlmeext->sitesurvey_res.scan_cnt_max = RTW_SCAN_NUM_OF_CH; pmlmeext->sitesurvey_res.backop_ms = RTW_BACK_OP_CH_MS; - #endif - #if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL) +#endif +#if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL) pmlmeext->sitesurvey_res.is_sw_antdiv_bl_scan = 0; - #endif +#endif pmlmeext->scan_abort = _FALSE; pmlmeinfo->state = WIFI_FW_NULL_STATE; @@ -777,22 +1056,23 @@ static void init_mlme_ext_priv_value(_adapter* padapter) } static int has_channel(RT_CHANNEL_INFO *channel_set, - u8 chanset_size, - u8 chan) { + u8 chanset_size, + u8 chan) +{ int i; for (i = 0; i < chanset_size; i++) { - if (channel_set[i].ChannelNum == chan) { + if (channel_set[i].ChannelNum == chan) return 1; - } } return 0; } static void init_channel_list(_adapter *padapter, RT_CHANNEL_INFO *channel_set, - u8 chanset_size, - struct p2p_channels *channel_list) { + u8 chanset_size, + struct p2p_channels *channel_list) +{ struct registry_priv *regsty = adapter_to_regsty(padapter); struct p2p_oper_class_map op_class[] = { @@ -822,15 +1102,14 @@ static void init_channel_list(_adapter *padapter, RT_CHANNEL_INFO *channel_set, struct p2p_reg_class *reg = NULL; for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) { - if (!has_channel(channel_set, chanset_size, ch)) { + if (!has_channel(channel_set, chanset_size, ch)) continue; - } if ((0 == padapter->registrypriv.ht_enable) && (8 == o->inc)) continue; if ((REGSTY_IS_BW_5G_SUPPORT(regsty, CHANNEL_WIDTH_40)) && - ((BW40MINUS == o->bw) || (BW40PLUS == o->bw))) + ((BW40MINUS == o->bw) || (BW40PLUS == o->bw))) continue; if (reg == NULL) { @@ -847,19 +1126,34 @@ static void init_channel_list(_adapter *padapter, RT_CHANNEL_INFO *channel_set, } -static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO *channel_set) +bool rtw_regsty_is_excl_chs(struct registry_priv *regsty, u8 ch) { - u8 index,chanset_size = 0; + int i; + + for (i = 0; i < MAX_CHANNEL_NUM; i++) { + if (regsty->excl_chs[i] == 0) + break; + if (regsty->excl_chs[i] == ch) + return _TRUE; + } + return _FALSE; +} + +static u8 init_channel_set(_adapter *padapter, u8 ChannelPlan, RT_CHANNEL_INFO *channel_set) +{ + struct registry_priv *regsty = adapter_to_regsty(padapter); + u8 index, chanset_size = 0; u8 b5GBand = _FALSE, b2_4GBand = _FALSE; - u8 Index2G = 0, Index5G=0; + u8 Index2G = 0, Index5G = 0; HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter); + int i; if (!rtw_is_channel_plan_valid(ChannelPlan)) { - DBG_871X("ChannelPlan ID %x error !!!!!\n",ChannelPlan); + RTW_ERR("ChannelPlan ID 0x%02X error !!!!!\n", ChannelPlan); return chanset_size; } - _rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO)*MAX_CHANNEL_NUM); + _rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO) * MAX_CHANNEL_NUM); if (IsSupported24G(padapter->registrypriv.wireless_mode)) b2_4GBand = _TRUE; @@ -874,28 +1168,30 @@ static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO * Index2G = RTW_ChannelPlanMap[ChannelPlan].Index2G; for (index = 0; index < RTW_ChannelPlan2G[Index2G].Len; index++) { + if (rtw_regsty_is_excl_chs(regsty, RTW_ChannelPlan2G[Index2G].Channel[index]) == _TRUE) + continue; + channel_set[chanset_size].ChannelNum = RTW_ChannelPlan2G[Index2G].Channel[index]; if (RTW_CHPLAN_GLOBAL_DOAMIN == ChannelPlan || RTW_CHPLAN_GLOBAL_NULL == ChannelPlan ) { /* Channel 1~11 is active, and 12~14 is passive */ - if(channel_set[chanset_size].ChannelNum >= 1 && channel_set[chanset_size].ChannelNum <= 11) + if (channel_set[chanset_size].ChannelNum >= 1 && channel_set[chanset_size].ChannelNum <= 11) channel_set[chanset_size].ScanType = SCAN_ACTIVE; - else if((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14)) - channel_set[chanset_size].ScanType = SCAN_PASSIVE; + else if ((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14)) + channel_set[chanset_size].ScanType = SCAN_PASSIVE; } else if (RTW_CHPLAN_WORLD_WIDE_13 == ChannelPlan || RTW_CHPLAN_WORLD_WIDE_5G == ChannelPlan || RTW_RD_2G_WORLD == Index2G ) { /* channel 12~13, passive scan */ - if(channel_set[chanset_size].ChannelNum <= 11) + if (channel_set[chanset_size].ChannelNum <= 11) channel_set[chanset_size].ScanType = SCAN_ACTIVE; else channel_set[chanset_size].ScanType = SCAN_PASSIVE; - } else { + } else channel_set[chanset_size].ScanType = SCAN_ACTIVE; - } chanset_size++; } @@ -908,20 +1204,19 @@ static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO * Index5G = RTW_ChannelPlanMap[ChannelPlan].Index5G; for (index = 0; index < RTW_ChannelPlan5G[Index5G].Len; index++) { + if (rtw_regsty_is_excl_chs(regsty, RTW_ChannelPlan5G[Index5G].Channel[index]) == _TRUE) + continue; #ifdef CONFIG_DFS channel_set[chanset_size].ChannelNum = RTW_ChannelPlan5G[Index5G].Channel[index]; - if ( channel_set[chanset_size].ChannelNum <= 48 - || channel_set[chanset_size].ChannelNum >= 149 ) - { + if (channel_set[chanset_size].ChannelNum <= 48 + || channel_set[chanset_size].ChannelNum >= 149 + ) { if (RTW_CHPLAN_WORLD_WIDE_5G == ChannelPlan) /* passive scan for all 5G channels */ channel_set[chanset_size].ScanType = SCAN_PASSIVE; else channel_set[chanset_size].ScanType = SCAN_ACTIVE; - } - else - { + } else channel_set[chanset_size].ScanType = SCAN_PASSIVE; - } chanset_size++; #else /* CONFIG_DFS */ if (RTW_ChannelPlan5G[Index5G].Channel[index] <= 48 @@ -932,7 +1227,7 @@ static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO * channel_set[chanset_size].ScanType = SCAN_PASSIVE; else channel_set[chanset_size].ScanType = SCAN_ACTIVE; - DBG_871X("%s(): channel_set[%d].ChannelNum = %d\n", __FUNCTION__, chanset_size, channel_set[chanset_size].ChannelNum); + RTW_INFO("%s(): channel_set[%d].ChannelNum = %d\n", __FUNCTION__, chanset_size, channel_set[chanset_size].ChannelNum); chanset_size++; } #endif /* CONFIG_DFS */ @@ -947,57 +1242,62 @@ static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO * hal_data->Regulation5G = RTW_ChannelPlanMap[ChannelPlan].regd; } - DBG_871X(FUNC_ADPT_FMT" ChannelPlan ID:0x%02x, ch num:%d\n" +#ifdef CONFIG_DFS_MASTER + for (i = 0; i < chanset_size; i++) + channel_set[i].non_ocp_end_time = rtw_get_current_time(); +#endif + + RTW_INFO(FUNC_ADPT_FMT" ChannelPlan ID:0x%02x, ch num:%d\n" , FUNC_ADPT_ARG(padapter), ChannelPlan, chanset_size); return chanset_size; } -int init_mlme_ext_priv(_adapter* padapter) +int init_mlme_ext_priv(_adapter *padapter) { int res = _SUCCESS; - struct registry_priv* pregistrypriv = &padapter->registrypriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). - //_rtw_memset((u8 *)pmlmeext, 0, sizeof(struct mlme_ext_priv)); + /* We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */ + /* _rtw_memset((u8 *)pmlmeext, 0, sizeof(struct mlme_ext_priv)); */ pmlmeext->padapter = padapter; - //fill_fwpriv(padapter, &(pmlmeext->fwpriv)); + /* fill_fwpriv(padapter, &(pmlmeext->fwpriv)); */ init_mlme_ext_priv_value(padapter); pmlmeinfo->bAcceptAddbaReq = pregistrypriv->bAcceptAddbaReq; - + init_mlme_ext_timer(padapter); #ifdef CONFIG_AP_MODE - init_mlme_ap_info(padapter); + init_mlme_ap_info(padapter); #endif - pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan,pmlmeext->channel_set); + pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan, pmlmeext->channel_set); init_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list); pmlmeext->last_scan_time = 0; pmlmeext->mlmeext_init = _TRUE; -#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK pmlmeext->active_keep_alive_check = _TRUE; #else pmlmeext->active_keep_alive_check = _FALSE; #endif -#ifdef DBG_FIXED_CHAN - pmlmeext->fixed_chan = 0xFF; +#ifdef DBG_FIXED_CHAN + pmlmeext->fixed_chan = 0xFF; #endif return res; } -void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext) +void free_mlme_ext_priv(struct mlme_ext_priv *pmlmeext) { _adapter *padapter = pmlmeext->padapter; @@ -1007,51 +1307,41 @@ void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext) if (rtw_is_drv_stopped(padapter)) { _cancel_timer_ex(&pmlmeext->survey_timer); _cancel_timer_ex(&pmlmeext->link_timer); - //_cancel_timer_ex(&pmlmeext->ADDBA_timer); + /* _cancel_timer_ex(&pmlmeext->ADDBA_timer); */ } } -static u8 cmp_pkt_chnl_diff(_adapter *padapter,u8* pframe,uint packet_len) -{ // if the channel is same, return 0. else return channel differential +static u8 cmp_pkt_chnl_diff(_adapter *padapter, u8 *pframe, uint packet_len) +{ + /* if the channel is same, return 0. else return channel differential */ uint len; - u8 channel; - u8 *p; - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_, _DSSET_IE_, &len, packet_len - _BEACON_IE_OFFSET_); - if (p) - { - channel = *(p + 2); - if(padapter->mlmeextpriv.cur_channel >= channel) - { - return (padapter->mlmeextpriv.cur_channel - channel); - } - else - { - return (channel-padapter->mlmeextpriv.cur_channel); - } - } - else - { - return 0; - } + u8 channel; + u8 *p; + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_, _DSSET_IE_, &len, packet_len - _BEACON_IE_OFFSET_); + if (p) { + channel = *(p + 2); + if (padapter->mlmeextpriv.cur_channel >= channel) + return padapter->mlmeextpriv.cur_channel - channel; + else + return channel - padapter->mlmeextpriv.cur_channel; + } else + return 0; } static void _mgt_dispatcher(_adapter *padapter, struct mlme_handler *ptable, union recv_frame *precv_frame) { - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - u8 *pframe = precv_frame->u.hdr.rx_data; + u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + u8 *pframe = precv_frame->u.hdr.rx_data; - if(ptable->func) - { - //receive the frames that ra(a1) is my address or ra(a1) is bc address. + if (ptable->func) { + /* receive the frames that ra(a1) is my address or ra(a1) is bc address. */ if (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN) && - !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) - { + !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) return; - } - + ptable->func(padapter, precv_frame); - } - + } + } void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) @@ -1060,73 +1350,61 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) struct mlme_handler *ptable; #ifdef CONFIG_AP_MODE struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -#endif //CONFIG_AP_MODE - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; +#endif /* CONFIG_AP_MODE */ + u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; u8 *pframe = precv_frame->u.hdr.rx_data; struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe)); struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, - ("+mgt_dispatcher: type(0x%x) subtype(0x%x)\n", - GetFrameType(pframe), GetFrameSubType(pframe))); #if 0 { u8 *pbuf; pbuf = GetAddr1Ptr(pframe); - DBG_871X("A1-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); + RTW_INFO("A1-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf + 1), *(pbuf + 2), *(pbuf + 3), *(pbuf + 4), *(pbuf + 5)); pbuf = GetAddr2Ptr(pframe); - DBG_871X("A2-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); + RTW_INFO("A2-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf + 1), *(pbuf + 2), *(pbuf + 3), *(pbuf + 4), *(pbuf + 5)); pbuf = GetAddr3Ptr(pframe); - DBG_871X("A3-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); + RTW_INFO("A3-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf + 1), *(pbuf + 2), *(pbuf + 3), *(pbuf + 4), *(pbuf + 5)); } #endif - if (GetFrameType(pframe) != WIFI_MGT_TYPE) - { - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("mgt_dispatcher: type(0x%x) error!\n", GetFrameType(pframe))); + if (GetFrameType(pframe) != WIFI_MGT_TYPE) { return; } - //receive the frames that ra(a1) is my address or ra(a1) is bc address. + /* receive the frames that ra(a1) is my address or ra(a1) is bc address. */ if (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN) && - !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) - { + !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) return; - } ptable = mlme_sta_tbl; index = GetFrameSubType(pframe) >> 4; #ifdef CONFIG_TDLS - if((index << 4)==WIFI_ACTION){ + if ((index << 4) == WIFI_ACTION) { /* 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))); + if (*(pframe + 24) == RTW_WLAN_CATEGORY_PUBLIC && *(pframe + 25) == TDLS_DISCOVERY_RESPONSE) { + RTW_INFO("[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); } } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ - if (index >= (sizeof(mlme_sta_tbl) /sizeof(struct mlme_handler))) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Currently we do not support reserved sub-fr-type=%d\n", index)); + if (index >= (sizeof(mlme_sta_tbl) / sizeof(struct mlme_handler))) { return; } ptable += index; #if 1 - if (psta != NULL) - { - if (GetRetry(pframe)) - { - if (precv_frame->u.hdr.attrib.seq_num == psta->RxMgmtFrameSeqNum) - { + if (psta != NULL) { + if (GetRetry(pframe)) { + if (precv_frame->u.hdr.attrib.seq_num == psta->RxMgmtFrameSeqNum) { /* drop the duplicate management frame */ pdbgpriv->dbg_rx_dup_mgt_frame_drop_count++; - DBG_871X("Drop duplicate management frame with seq_num = %d.\n", precv_frame->u.hdr.attrib.seq_num); + RTW_INFO("Drop duplicate management frame with seq_num = %d.\n", precv_frame->u.hdr.attrib.seq_num); return; } } @@ -1134,59 +1412,54 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) } #else - if(GetRetry(pframe)) - { - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("drop due to decache!\n")); - //return; + if (GetRetry(pframe)) { + /* return; */ } #endif #ifdef CONFIG_AP_MODE - switch (GetFrameSubType(pframe)) - { - case WIFI_AUTH: - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - ptable->func = &OnAuth; - else - ptable->func = &OnAuthClient; - //pass through - case WIFI_ASSOCREQ: - case WIFI_REASSOCREQ: - _mgt_dispatcher(padapter, ptable, precv_frame); -#ifdef CONFIG_HOSTAPD_MLME - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - rtw_hostapd_mlme_rx(padapter, precv_frame); -#endif - break; - case WIFI_PROBEREQ: - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { -#ifdef CONFIG_HOSTAPD_MLME - rtw_hostapd_mlme_rx(padapter, precv_frame); -#else - _mgt_dispatcher(padapter, ptable, precv_frame); + switch (GetFrameSubType(pframe)) { + case WIFI_AUTH: + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + ptable->func = &OnAuth; + else + ptable->func = &OnAuthClient; + /* pass through */ + case WIFI_ASSOCREQ: + case WIFI_REASSOCREQ: + _mgt_dispatcher(padapter, ptable, precv_frame); +#ifdef CONFIG_HOSTAPD_MLME + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + rtw_hostapd_mlme_rx(padapter, precv_frame); #endif - } - else - _mgt_dispatcher(padapter, ptable, precv_frame); - break; - case WIFI_BEACON: + break; + case WIFI_PROBEREQ: + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { +#ifdef CONFIG_HOSTAPD_MLME + rtw_hostapd_mlme_rx(padapter, precv_frame); +#else _mgt_dispatcher(padapter, ptable, precv_frame); - break; - case WIFI_ACTION: - //if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - _mgt_dispatcher(padapter, ptable, precv_frame); - break; - default: - _mgt_dispatcher(padapter, ptable, precv_frame); - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - rtw_hostapd_mlme_rx(padapter, precv_frame); - break; +#endif + } else + _mgt_dispatcher(padapter, ptable, precv_frame); + break; + case WIFI_BEACON: + _mgt_dispatcher(padapter, ptable, precv_frame); + break; + case WIFI_ACTION: + /* if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) */ + _mgt_dispatcher(padapter, ptable, precv_frame); + break; + default: + _mgt_dispatcher(padapter, ptable, precv_frame); + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + rtw_hostapd_mlme_rx(padapter, precv_frame); + break; } #else - _mgt_dispatcher(padapter, ptable, precv_frame); - + _mgt_dispatcher(padapter, ptable, precv_frame); + #endif } @@ -1197,45 +1470,39 @@ u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da) bool response = _TRUE; #ifdef CONFIG_IOCTL_CFG80211 - if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 ) - { - if(padapter->cfg80211_wdinfo.is_ro_ch == _FALSE - || rtw_get_oper_ch(padapter) != padapter->wdinfo.listen_channel - || adapter_wdev_data(padapter)->p2p_enabled == _FALSE - || padapter->mlmepriv.wps_probe_resp_ie == NULL - || padapter->mlmepriv.p2p_probe_resp_ie == NULL - ) - { + if (padapter->wdinfo.driver_interface == DRIVER_CFG80211) { + if (padapter->cfg80211_wdinfo.is_ro_ch == _FALSE + || rtw_get_oper_ch(padapter) != padapter->wdinfo.listen_channel + || adapter_wdev_data(padapter)->p2p_enabled == _FALSE + || padapter->mlmepriv.wps_probe_resp_ie == NULL + || padapter->mlmepriv.p2p_probe_resp_ie == NULL + ) { #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("DON'T issue_probersp_p2p: p2p_enabled:%d, wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p, ", - adapter_wdev_data(padapter)->p2p_enabled, - padapter->mlmepriv.wps_probe_resp_ie, - padapter->mlmepriv.p2p_probe_resp_ie); - DBG_871X("is_ro_ch:%d, op_ch:%d, p2p_listen_channel:%d\n", - padapter->cfg80211_wdinfo.is_ro_ch, - rtw_get_oper_ch(padapter), - padapter->wdinfo.listen_channel); + RTW_INFO("DON'T issue_probersp_p2p: p2p_enabled:%d, wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p, ", + adapter_wdev_data(padapter)->p2p_enabled, + padapter->mlmepriv.wps_probe_resp_ie, + padapter->mlmepriv.p2p_probe_resp_ie); + RTW_INFO("is_ro_ch:%d, op_ch:%d, p2p_listen_channel:%d\n", + padapter->cfg80211_wdinfo.is_ro_ch, + rtw_get_oper_ch(padapter), + padapter->wdinfo.listen_channel); #endif response = _FALSE; } - } - else -#endif //CONFIG_IOCTL_CFG80211 - if( padapter->wdinfo.driver_interface == DRIVER_WEXT ) - { - // do nothing if the device name is empty - if ( !padapter->wdinfo.device_name_len ) - { - response = _FALSE; + } else +#endif /* CONFIG_IOCTL_CFG80211 */ + if (padapter->wdinfo.driver_interface == DRIVER_WEXT) { + /* do nothing if the device name is empty */ + if (!padapter->wdinfo.device_name_len) + response = _FALSE; } - } if (response == _TRUE) - issue_probersp_p2p( padapter, da); - + issue_probersp_p2p(padapter, da); + return _SUCCESS; } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ /**************************************************************************** @@ -1251,13 +1518,13 @@ unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur = &(pmlmeinfo->network); + WLAN_BSSID_EX *cur = &(pmlmeinfo->network); u8 *pframe = precv_frame->u.hdr.rx_data; uint len = precv_frame->u.hdr.len; u8 is_valid_p2p_probereq = _FALSE; #ifdef CONFIG_ATMEL_RC_PATCH - u8 *target_ie=NULL, *wps_ie=NULL; + u8 *target_ie = NULL, *wps_ie = NULL; u8 *start; uint search_len = 0, wps_ielen = 0, target_ielen = 0; struct sta_info *psta; @@ -1272,178 +1539,158 @@ unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_IOCTL_CFG80211 if ((pwdinfo->driver_interface == DRIVER_CFG80211) - && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) - && (GET_CFG80211_REPORT_MGMT(adapter_wdev_data(padapter), IEEE80211_STYPE_PROBE_REQ) == _TRUE) - ) { + && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) + && (GET_CFG80211_REPORT_MGMT(adapter_wdev_data(padapter), IEEE80211_STYPE_PROBE_REQ) == _TRUE) + ) { rtw_cfg80211_rx_probe_request(padapter, pframe, len); return _SUCCESS; } #endif /* CONFIG_IOCTL_CFG80211 */ - if ( !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && - !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) && - !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && - !rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) && - !rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) - ) - { - // Commented by Albert 2011/03/17 - // mcs_rate = 0 -> CCK 1M rate - // mcs_rate = 1 -> CCK 2M rate - // mcs_rate = 2 -> CCK 5.5M rate - // mcs_rate = 3 -> CCK 11M rate - // In the P2P mode, the driver should not support the CCK rate + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && + !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) && + !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && + !rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) && + !rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) + ) { + /* Commented by Albert 2011/03/17 */ + /* mcs_rate = 0->CCK 1M rate */ + /* mcs_rate = 1->CCK 2M rate */ + /* mcs_rate = 2->CCK 5.5M rate */ + /* mcs_rate = 3->CCK 11M rate */ + /* In the P2P mode, the driver should not support the CCK rate */ - // Commented by Kurt 2012/10/16 - // IOT issue: Google Nexus7 use 1M rate to send p2p_probe_req after GO nego completed and Nexus7 is client - if (padapter->registrypriv.wifi_spec == 1) - { - if ( pattrib->data_rate <= 3 ) - { - wifi_test_chk_rate = 0; - } - } + /* Commented by Kurt 2012/10/16 */ + /* IOT issue: Google Nexus7 use 1M rate to send p2p_probe_req after GO nego completed and Nexus7 is client */ + if (padapter->registrypriv.wifi_spec == 1) { + if (pattrib->data_rate <= 3) + wifi_test_chk_rate = 0; + } - if( wifi_test_chk_rate == 1 ) - { - if((is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len)) == _TRUE) - { - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) - { - // FIXME - if( padapter->wdinfo.driver_interface == DRIVER_WEXT ) + if (wifi_test_chk_rate == 1) { + is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len); + if (is_valid_p2p_probereq == _TRUE) { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) { + /* FIXME */ + if (padapter->wdinfo.driver_interface == DRIVER_WEXT) report_survey_event(padapter, precv_frame); - p2p_listen_state_process( padapter, get_sa(pframe)); + p2p_listen_state_process(padapter, get_sa(pframe)); - return _SUCCESS; + return _SUCCESS; } - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) goto _continue; - } } } } _continue: -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) - { + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) return _SUCCESS; - } - if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE && - check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)==_FALSE) - { + if (check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE && + check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE | WIFI_AP_STATE) == _FALSE) return _SUCCESS; - } - //DBG_871X("+OnProbeReq\n"); + /* RTW_INFO("+OnProbeReq\n"); */ #ifdef CONFIG_ATMEL_RC_PATCH - if ((wps_ie = rtw_get_wps_ie( - pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, - len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_, - NULL, &wps_ielen))) { - - target_ie = rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_MANUFACTURER, NULL, &target_ielen); - } - if ((target_ie && (target_ielen == 4)) && (_TRUE ==_rtw_memcmp((void *)target_ie, "Ozmo",4 ))) { - //psta->flag_atmel_rc = 1; - unsigned char *sa_addr = get_sa(pframe); - printk("%s: Find Ozmo RC -- %02x:%02x:%02x:%02x:%02x:%02x \n\n", - __func__, *sa_addr, *(sa_addr+1), *(sa_addr+2), *(sa_addr+3), *(sa_addr+4), *(sa_addr+5)); - _rtw_memcpy( pstapriv->atmel_rc_pattern, get_sa(pframe), ETH_ALEN); - } + wps_ie = rtw_get_wps_ie( + pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_, + NULL, &wps_ielen); + if (wps_ie) + target_ie = rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_MANUFACTURER, NULL, &target_ielen); + if ((target_ie && (target_ielen == 4)) && (_TRUE == _rtw_memcmp((void *)target_ie, "Ozmo", 4))) { + /* psta->flag_atmel_rc = 1; */ + unsigned char *sa_addr = get_sa(pframe); + printk("%s: Find Ozmo RC -- %02x:%02x:%02x:%02x:%02x:%02x \n\n", + __func__, *sa_addr, *(sa_addr + 1), *(sa_addr + 2), *(sa_addr + 3), *(sa_addr + 4), *(sa_addr + 5)); + _rtw_memcpy(pstapriv->atmel_rc_pattern, get_sa(pframe), ETH_ALEN); + } #endif #ifdef CONFIG_AUTO_AP_MODE - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && - pmlmepriv->cur_network.join_res == _TRUE) - { + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && + pmlmepriv->cur_network.join_res == _TRUE) { _irqL irqL; struct sta_info *psta; u8 *mac_addr, *peer_addr; struct sta_priv *pstapriv = &padapter->stapriv; - u8 RC_OUI[4]={0x00,0xE0,0x4C,0x0A}; - //EID[1] + EID_LEN[1] + RC_OUI[4] + MAC[6] + PairingID[2] + ChannelNum[2] + u8 RC_OUI[4] = {0x00, 0xE0, 0x4C, 0x0A}; + /* EID[1] + EID_LEN[1] + RC_OUI[4] + MAC[6] + PairingID[2] + ChannelNum[2] */ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, (int *)&ielen, - len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); - if(!p || ielen !=14) + if (!p || ielen != 14) goto _non_rc_device; - if(!_rtw_memcmp(p+2, RC_OUI, sizeof(RC_OUI))) + if (!_rtw_memcmp(p + 2, RC_OUI, sizeof(RC_OUI))) goto _non_rc_device; - if(!_rtw_memcmp(p+6, get_sa(pframe), ETH_ALEN)) - { - DBG_871X("%s, do rc pairing ("MAC_FMT"), but mac addr mismatch!("MAC_FMT")\n", __FUNCTION__, - MAC_ARG(get_sa(pframe)), MAC_ARG(p+6)); + if (!_rtw_memcmp(p + 6, get_sa(pframe), ETH_ALEN)) { + RTW_INFO("%s, do rc pairing ("MAC_FMT"), but mac addr mismatch!("MAC_FMT")\n", __FUNCTION__, + MAC_ARG(get_sa(pframe)), MAC_ARG(p + 6)); goto _non_rc_device; } - DBG_871X("%s, got the pairing device("MAC_FMT")\n", __FUNCTION__, MAC_ARG(get_sa(pframe))); + RTW_INFO("%s, got the pairing device("MAC_FMT")\n", __FUNCTION__, MAC_ARG(get_sa(pframe))); - //new a station + /* new a station */ psta = rtw_get_stainfo(pstapriv, get_sa(pframe)); - if (psta == NULL) - { - // allocate a new one - DBG_871X("going to alloc stainfo for rc="MAC_FMT"\n", MAC_ARG(get_sa(pframe))); + if (psta == NULL) { + /* allocate a new one */ + RTW_INFO("going to alloc stainfo for rc="MAC_FMT"\n", MAC_ARG(get_sa(pframe))); psta = rtw_alloc_stainfo(pstapriv, get_sa(pframe)); - if (psta == NULL) - { - //TODO: - DBG_871X(" Exceed the upper limit of supported clients...\n"); + if (psta == NULL) { + /* TODO: */ + RTW_INFO(" Exceed the upper limit of supported clients...\n"); return _SUCCESS; } _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - if (rtw_is_list_empty(&psta->asoc_list)) - { + if (rtw_is_list_empty(&psta->asoc_list)) { psta->expire_to = pstapriv->expire_to; rtw_list_insert_tail(&psta->asoc_list, &pstapriv->asoc_list); pstapriv->asoc_list_cnt++; } _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - //generate pairing ID + /* generate pairing ID */ 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])); + psta->pid = (u16)(((mac_addr[4] << 8) + mac_addr[5]) + ((peer_addr[4] << 8) + peer_addr[5])); - //update peer stainfo + /* update peer stainfo */ psta->isrc = _TRUE; - //psta->aid = 0; - //psta->mac_id = 2; /* get a unique AID */ - if (psta->aid > 0) { - DBG_871X("old AID %d\n", psta->aid); - } else { + if (psta->aid > 0) + RTW_INFO("old AID %d\n", psta->aid); + else { for (psta->aid = 1; psta->aid <= NUM_STA; psta->aid++) if (pstapriv->sta_aid[psta->aid - 1] == NULL) break; if (psta->aid > pstapriv->max_num_sta) { psta->aid = 0; - DBG_871X("no room for more AIDs\n"); + RTW_INFO("no room for more AIDs\n"); return _SUCCESS; } else { pstapriv->sta_aid[psta->aid - 1] = psta; - DBG_871X("allocate new AID = (%d)\n", psta->aid); + RTW_INFO("allocate new AID = (%d)\n", psta->aid); } } - + psta->qos_option = 1; psta->bw_mode = CHANNEL_WIDTH_20; psta->ieee8021x_blocked = _FALSE; @@ -1453,19 +1700,19 @@ _continue: psta->htpriv.sgi_20m = _FALSE; psta->htpriv.sgi_40m = _FALSE; psta->htpriv.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset + psta->htpriv.agg_enable_bitmap = 0x0;/* reset */ + psta->htpriv.candidate_tid_bitmap = 0x0;/* reset */ #endif rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE); - _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + _rtw_memset((void *)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); _enter_critical_bh(&psta->lock, &irqL); psta->state |= _FW_LINKED; _exit_critical_bh(&psta->lock, &irqL); - report_add_sta_event(padapter, psta->hwaddr, psta->aid); + report_add_sta_event(padapter, psta->hwaddr); } @@ -1479,43 +1726,36 @@ _non_rc_device: return _SUCCESS; -#endif //CONFIG_AUTO_AP_MODE - +#endif /* CONFIG_AUTO_AP_MODE */ + #ifdef CONFIG_CONCURRENT_MODE - if(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) && - check_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)) - { - //don't process probe req + if (((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) && + rtw_mi_buddy_check_fwstate(padapter, _FW_UNDER_LINKING | _FW_UNDER_SURVEY)) { + /* don't process probe req */ return _SUCCESS; } -#endif +#endif p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ielen, - len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); - //check (wildcard) SSID - if (p != NULL) - { - if(is_valid_p2p_probereq == _TRUE) - { + /* check (wildcard) SSID */ + if (p != NULL) { + if (is_valid_p2p_probereq == _TRUE) goto _issue_probersp; - } - if ( (ielen != 0 && _FALSE ==_rtw_memcmp((void *)(p+2), (void *)cur->Ssid.Ssid, cur->Ssid.SsidLength)) - || (ielen == 0 && pmlmeinfo->hidden_ssid_mode) - ) - { + if ((ielen != 0 && _FALSE == _rtw_memcmp((void *)(p + 2), (void *)cur->Ssid.Ssid, cur->Ssid.SsidLength)) + || (ielen == 0 && pmlmeinfo->hidden_ssid_mode) + ) return _SUCCESS; - } _issue_probersp: - if(((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && - pmlmepriv->cur_network.join_res == _TRUE)) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) - { - //DBG_871X("+issue_probersp during ap mode\n"); - issue_probersp(padapter, get_sa(pframe), is_valid_p2p_probereq); + if (((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && + pmlmepriv->cur_network.join_res == _TRUE)) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { + /* RTW_INFO("+issue_probersp during ap mode\n"); */ + issue_probersp(padapter, get_sa(pframe), is_valid_p2p_probereq); } } @@ -1537,53 +1777,39 @@ unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_P2P - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) - { - if ( _TRUE == pwdinfo->tx_prov_disc_info.benable ) - { - if( _rtw_memcmp( pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr2Ptr(pframe), ETH_ALEN ) ) - { - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) - { + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) { + if (_TRUE == pwdinfo->tx_prov_disc_info.benable) { + if (_rtw_memcmp(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr2Ptr(pframe), ETH_ALEN)) { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { pwdinfo->tx_prov_disc_info.benable = _FALSE; - issue_p2p_provision_request( padapter, - pwdinfo->tx_prov_disc_info.ssid.Ssid, - pwdinfo->tx_prov_disc_info.ssid.SsidLength, - pwdinfo->tx_prov_disc_info.peerDevAddr ); - } - else if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) ) - { + issue_p2p_provision_request(padapter, + pwdinfo->tx_prov_disc_info.ssid.Ssid, + pwdinfo->tx_prov_disc_info.ssid.SsidLength, + pwdinfo->tx_prov_disc_info.peerDevAddr); + } else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { pwdinfo->tx_prov_disc_info.benable = _FALSE; - issue_p2p_provision_request( padapter, - NULL, - 0, - pwdinfo->tx_prov_disc_info.peerDevAddr ); + issue_p2p_provision_request(padapter, + NULL, + 0, + pwdinfo->tx_prov_disc_info.peerDevAddr); } - } - } - return _SUCCESS; - } - else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) - { - if ( _TRUE == pwdinfo->nego_req_info.benable ) - { - DBG_871X( "[%s] P2P State is GONEGO ING!\n", __FUNCTION__ ); - if( _rtw_memcmp( pwdinfo->nego_req_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN ) ) - { - pwdinfo->nego_req_info.benable = _FALSE; - issue_p2p_GO_request( padapter, pwdinfo->nego_req_info.peerDevAddr); } } - } - else if( rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) ) - { - if ( _TRUE == pwdinfo->invitereq_info.benable ) - { - DBG_871X( "[%s] P2P_STATE_TX_INVITE_REQ!\n", __FUNCTION__ ); - if( _rtw_memcmp( pwdinfo->invitereq_info.peer_macaddr, GetAddr2Ptr(pframe), ETH_ALEN ) ) - { + return _SUCCESS; + } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) { + if (_TRUE == pwdinfo->nego_req_info.benable) { + RTW_INFO("[%s] P2P State is GONEGO ING!\n", __FUNCTION__); + if (_rtw_memcmp(pwdinfo->nego_req_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN)) { + pwdinfo->nego_req_info.benable = _FALSE; + issue_p2p_GO_request(padapter, pwdinfo->nego_req_info.peerDevAddr); + } + } + } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ)) { + if (_TRUE == pwdinfo->invitereq_info.benable) { + RTW_INFO("[%s] P2P_STATE_TX_INVITE_REQ!\n", __FUNCTION__); + if (_rtw_memcmp(pwdinfo->invitereq_info.peer_macaddr, GetAddr2Ptr(pframe), ETH_ALEN)) { pwdinfo->invitereq_info.benable = _FALSE; - issue_p2p_invitation_request( padapter, pwdinfo->invitereq_info.peer_macaddr ); + issue_p2p_invitation_request(padapter, pwdinfo->invitereq_info.peer_macaddr); } } } @@ -1591,33 +1817,71 @@ unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame) if (mlmeext_chk_scan_state(pmlmeext, SCAN_PROCESS)) { - report_survey_event(padapter, precv_frame); -#ifdef CONFIG_CONCURRENT_MODE - report_survey_event(padapter->pbuddy_adapter, precv_frame); -#endif + rtw_mi_report_survey_event(padapter, precv_frame); return _SUCCESS; } - #if 0 //move to validate_recv_mgnt_frame - if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) - { - if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - { - if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) - { +#if 0 /* move to validate_recv_mgnt_frame */ + if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) { + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) { + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta != NULL) psta->sta_stats.rx_mgnt_pkts++; - } } } - #endif - +#endif + return _SUCCESS; + +} + +/* for 11n Logo 4.2.31/4.2.32 */ +static void rtw_check_legacy_ap(_adapter *padapter, u8 *pframe, u32 len) +{ + + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + if (!padapter->registrypriv.wifi_spec) + return; + if(!MLME_IS_AP(padapter)) + return; + + + if (pmlmeext->bstart_bss == _TRUE) { + int left; + u16 capability; + unsigned char *pos; + struct rtw_ieee802_11_elems elems; + struct HT_info_element *pht_info = NULL; + u16 cur_op_mode; + + /* checking IEs */ + left = len - sizeof(struct rtw_ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_; + pos = pframe + sizeof(struct rtw_ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_; + if (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed) { + RTW_INFO("%s: parse fail for "MAC_FMT"\n", __func__, MAC_ARG(GetAddr3Ptr(pframe))); + return; + } + + cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; + + /* for legacy ap */ + if (elems.ht_capabilities == NULL && elems.ht_capabilities_len == 0) { + + if (0) + RTW_INFO("%s: "MAC_FMT" is legacy ap\n", __func__, MAC_ARG(GetAddr3Ptr(pframe))); + + ATOMIC_SET(&pmlmepriv->olbc, _TRUE); + ATOMIC_SET(&pmlmepriv->olbc_ht, _TRUE); + } + + } } unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) { - int cam_idx; struct sta_info *psta; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -1632,35 +1896,35 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_TDLS struct sta_info *ptdls_sta; struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; +#ifdef CONFIG_TDLS_CH_SW + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; +#endif #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_); - if ((p != NULL) && (ielen > 0)) - { - if ((*(p + 1 + ielen) == 0x2D) && (*(p + 2 + ielen) != 0x2D)) - { - /* Invalid value 0x2D is detected in Extended Supported Rates (ESR) IE. Try to fix the IE length to avoid failed Beacon parsing. */ - DBG_871X("[WIFIDBG] Error in ESR IE is detected in Beacon of BSSID:"MAC_FMT". Fix the length of ESR IE to avoid failed Beacon parsing.\n", MAC_ARG(GetAddr3Ptr(pframe))); - *(p + 1) = ielen - 1; + 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_); + if ((p != NULL) && (ielen > 0)) { + if ((*(p + 1 + ielen) == 0x2D) && (*(p + 2 + ielen) != 0x2D)) { + /* Invalid value 0x2D is detected in Extended Supported Rates (ESR) IE. Try to fix the IE length to avoid failed Beacon parsing. */ + RTW_INFO("[WIFIDBG] Error in ESR IE is detected in Beacon of BSSID:"MAC_FMT". Fix the length of ESR IE to avoid failed Beacon parsing.\n", MAC_ARG(GetAddr3Ptr(pframe))); + *(p + 1) = ielen - 1; } } #endif if (mlmeext_chk_scan_state(pmlmeext, SCAN_PROCESS)) { - report_survey_event(padapter, precv_frame); -#ifdef CONFIG_CONCURRENT_MODE - report_survey_event(padapter->pbuddy_adapter, precv_frame); -#endif + rtw_mi_report_survey_event(padapter, precv_frame); return _SUCCESS; } - if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) - { - if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) - { - //we should update current network before auth, or some IE is wrong - pbss = (WLAN_BSSID_EX*)rtw_malloc(sizeof(WLAN_BSSID_EX)); + + rtw_check_legacy_ap(padapter, pframe, len); + + if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) { + if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) { + /* we should update current network before auth, or some IE is wrong */ + pbss = (WLAN_BSSID_EX *)rtw_malloc(sizeof(WLAN_BSSID_EX)); if (pbss) { if (collect_bss_info(padapter, precv_frame, pbss) == _SUCCESS) { struct beacon_keys recv_beacon; @@ -1668,29 +1932,28 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) update_network(&(pmlmepriv->cur_network.network), pbss, padapter, _TRUE); rtw_get_bcn_info(&(pmlmepriv->cur_network)); - // update bcn keys + /* update bcn keys */ if (rtw_get_bcn_keys(padapter, pframe, len, &recv_beacon) == _TRUE) { - DBG_871X("%s: beacon keys ready\n", __func__); + RTW_INFO("%s: beacon keys ready\n", __func__); _rtw_memcpy(&pmlmepriv->cur_beacon_keys, &recv_beacon, sizeof(recv_beacon)); pmlmepriv->new_beacon_cnts = 0; - } - else { - DBG_871X_LEVEL(_drv_err_, "%s: get beacon keys failed\n", __func__); + } else { + RTW_ERR("%s: get beacon keys failed\n", __func__); _rtw_memset(&pmlmepriv->cur_beacon_keys, 0, sizeof(recv_beacon)); pmlmepriv->new_beacon_cnts = 0; } } - rtw_mfree((u8*)pbss, sizeof(WLAN_BSSID_EX)); + rtw_mfree((u8 *)pbss, sizeof(WLAN_BSSID_EX)); } - //check the vendor of the assoc AP - pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe+sizeof(struct rtw_ieee80211_hdr_3addr), len-sizeof(struct rtw_ieee80211_hdr_3addr)); + /* check the vendor of the assoc AP */ + pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe + sizeof(struct rtw_ieee80211_hdr_3addr), len - sizeof(struct rtw_ieee80211_hdr_3addr)); - //update TSF Value + /* update TSF Value */ update_TSF(pmlmeext, pframe, len); - //reset for adaptive_early_32k + /* reset for adaptive_early_32k */ pmlmeext->adaptive_tsf_done = _FALSE; pmlmeext->DrvBcnEarly = 0xff; pmlmeext->DrvBcnTimeOut = 0xff; @@ -1700,124 +1963,126 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_P2P_PS process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN)); -#endif //CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ -#if defined(CONFIG_P2P)&&defined(CONFIG_CONCURRENT_MODE) +#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 "); + if (rtw_mi_buddy_check_mlmeinfo_state(padapter, WIFI_FW_AP_STATE)) { + RTW_PRINT("no issue auth, P2P cross-connect does not permit\n "); return _SUCCESS; } } } -#endif // CONFIG_P2P CONFIG_P2P and CONFIG_CONCURRENT_MODE +#endif /* CONFIG_P2P CONFIG_P2P and CONFIG_CONCURRENT_MODE */ - //start auth + /* start auth */ start_clnt_auth(padapter); return _SUCCESS; } - if(((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) && (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) - { - if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) - { - #ifdef CONFIG_PATCH_JOIN_WRONG_CHANNEL - //Merge from 8712 FW code - if (cmp_pkt_chnl_diff(padapter,pframe,len) != 0) - { // join wrong channel, deauth and reconnect + if (((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) && (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) { + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta != NULL) { +#ifdef CONFIG_PATCH_JOIN_WRONG_CHANNEL + /* Merge from 8712 FW code */ + if (cmp_pkt_chnl_diff(padapter, pframe, len) != 0) { + /* join wrong channel, deauth and reconnect */ issue_deauth(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_DEAUTH_LEAVING); - report_del_sta_event(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_JOIN_WRONG_CHANNEL, _TRUE); - pmlmeinfo->state &= (~WIFI_FW_ASSOC_SUCCESS); + report_del_sta_event(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_JOIN_WRONG_CHANNEL, _TRUE, _FALSE); + pmlmeinfo->state &= (~WIFI_FW_ASSOC_SUCCESS); return _SUCCESS; - } - #endif //CONFIG_PATCH_JOIN_WRONG_CHANNEL + } +#endif /* CONFIG_PATCH_JOIN_WRONG_CHANNEL */ ret = rtw_check_bcn_info(padapter, pframe, len); if (!ret) { - DBG_871X_LEVEL(_drv_always_, "ap has changed, disconnect now\n "); - receive_disconnect(padapter, pmlmeinfo->network.MacAddress , 0); - return _SUCCESS; + RTW_PRINT("ap has changed, disconnect now\n "); + receive_disconnect(padapter, pmlmeinfo->network.MacAddress , 0, _FALSE); + return _SUCCESS; } - //update WMM, ERP in the beacon - //todo: the timer is used instead of the number of the beacon received - if ((sta_rx_pkts(psta) & 0xf) == 0) - { - //DBG_871X("update_bcn_info\n"); + /* update WMM, ERP in the beacon */ + /* todo: the timer is used instead of the number of the beacon received */ + if ((sta_rx_pkts(psta) & 0xf) == 0) { + /* RTW_INFO("update_bcn_info\n"); */ update_beacon_info(padapter, pframe, len, psta); } - adaptive_early_32k(pmlmeext, pframe, len); - + adaptive_early_32k(pmlmeext, pframe, len); + #ifdef CONFIG_TDLS #ifdef CONFIG_TDLS_CH_SW - if (padapter->tdlsinfo.ch_switch_prohibited == _FALSE) - { + if (rtw_tdls_is_chsw_allowed(padapter) == _TRUE) { /* 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)); */ + if ((padapter->tdlsinfo.chsw_info.ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) && (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) + && (pmlmeext->cur_channel == rtw_get_oper_ch(padapter))) { 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); + _set_timer(&ptdls_sta->stay_on_base_chnl_timer, TDLS_CH_SW_STAY_ON_BASE_CHNL_TIMEOUT); } } } -#endif +#endif #endif /* CONFIG_TDLS */ #ifdef CONFIG_DFS - process_csa_ie(padapter, pframe, len); //channel switch announcement -#endif //CONFIG_DFS + process_csa_ie(padapter, pframe, len); /* channel switch announcement */ +#endif /* CONFIG_DFS */ #ifdef CONFIG_P2P_PS process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN)); -#endif //CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ - #if 0 //move to validate_recv_mgnt_frame + if (pmlmeext->en_hw_update_tsf) + rtw_enable_hw_update_tsf_cmd(padapter); + +#if 0 /* move to validate_recv_mgnt_frame */ psta->sta_stats.rx_mgnt_pkts++; - #endif +#endif } - } - else if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) - { - //update WMM, ERP in the beacon - //todo: the timer is used instead of the number of the beacon received + + } else if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { + _irqL irqL; + u8 rate_set[16]; + u8 rate_num = 0; + + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta != NULL) { + /* + * update WMM, ERP in the beacon + * todo: the timer is used instead of the number of the beacon received + */ if ((sta_rx_pkts(psta) & 0xf) == 0) - { - //DBG_871X("update_bcn_info\n"); update_beacon_info(padapter, pframe, len, psta); - } - #if 0 //move to validate_recv_mgnt_frame - psta->sta_stats.rx_mgnt_pkts++; - #endif - } - else - { - //allocate a new CAM entry for IBSS station - if ((cam_idx = allocate_fw_sta_entry(padapter)) == NUM_STA) - { + if (pmlmeext->en_hw_update_tsf) + rtw_enable_hw_update_tsf_cmd(padapter); + } else { + rtw_ies_get_supported_rate(pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_, len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_, rate_set, &rate_num); + if (rate_num == 0) { + RTW_INFO(FUNC_ADPT_FMT" RX beacon with no supported rate\n", FUNC_ADPT_ARG(padapter)); goto _END_ONBEACON_; } - //get supported rate - if (update_sta_support_rate(padapter, (pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_), (len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_), cam_idx) == _FAIL) - { - pmlmeinfo->FW_sta_info[cam_idx].status = 0; + psta = rtw_alloc_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta == NULL) { + RTW_INFO(FUNC_ADPT_FMT" Exceed the upper limit of supported clients\n", FUNC_ADPT_ARG(padapter)); goto _END_ONBEACON_; } - //update TSF Value - update_TSF(pmlmeext, pframe, len); + psta->expire_to = pstapriv->adhoc_expire_to; - //report sta add event - report_add_sta_event(padapter, GetAddr2Ptr(pframe), cam_idx); + _rtw_memcpy(psta->bssrateset, rate_set, rate_num); + psta->bssratelen = rate_num; + + /* update TSF Value */ + update_TSF(pmlmeext, pframe, len); + + /* report sta add event */ + report_add_sta_event(padapter, GetAddr2Ptr(pframe)); } } } @@ -1833,48 +2098,46 @@ unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_AP_MODE _irqL irqL; unsigned int auth_mode, seq, ie_len; - unsigned char *sa, *p; + unsigned char *sa, *p; u16 algorithm; int status; - static struct sta_info stat; - struct sta_info *pstat=NULL; + static struct sta_info stat; + struct sta_info *pstat = NULL; struct sta_priv *pstapriv = &padapter->stapriv; struct security_priv *psecuritypriv = &padapter->securitypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 *pframe = precv_frame->u.hdr.rx_data; + u8 *pframe = precv_frame->u.hdr.rx_data; uint len = precv_frame->u.hdr.len; u8 offset = 0; - -#ifdef CONFIG_CONCURRENT_MODE - if(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) && - check_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)) - { - //don't process auth request; + +#ifdef CONFIG_CONCURRENT_MODE + if (((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) && + rtw_mi_buddy_check_fwstate(padapter, _FW_UNDER_LINKING | _FW_UNDER_SURVEY)) { + /* don't process auth request; */ return _SUCCESS; } -#endif //CONFIG_CONCURRENT_MODE +#endif /* CONFIG_CONCURRENT_MODE */ - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) return _FAIL; - DBG_871X("+OnAuth\n"); + RTW_INFO("+OnAuth\n"); sa = GetAddr2Ptr(pframe); auth_mode = psecuritypriv->dot11AuthAlgrthm; - if (GetPrivacy(pframe)) - { + if (GetPrivacy(pframe)) { u8 *iv; - struct rx_pkt_attrib *prxattrib = &(precv_frame->u.hdr.attrib); + struct rx_pkt_attrib *prxattrib = &(precv_frame->u.hdr.attrib); prxattrib->hdrlen = WLAN_HDR_A3_LEN; prxattrib->encrypt = _WEP40_; - iv = pframe+prxattrib->hdrlen; - prxattrib->key_index = ((iv[3]>>6)&0x3); + iv = pframe + prxattrib->hdrlen; + prxattrib->key_index = ((iv[3] >> 6) & 0x3); prxattrib->iv_len = 4; prxattrib->icv_len = 4; @@ -1884,83 +2147,50 @@ unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) offset = 4; } - algorithm = le16_to_cpu(*(u16*)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset)); - seq = le16_to_cpu(*(u16*)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2)); + algorithm = le16_to_cpu(*(u16 *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset)); + seq = le16_to_cpu(*(u16 *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2)); - DBG_871X("auth alg=%x, seq=%X\n", algorithm, seq); + RTW_INFO("auth alg=%x, seq=%X\n", algorithm, seq); if (auth_mode == 2 && - psecuritypriv->dot11PrivacyAlgrthm != _WEP40_ && - psecuritypriv->dot11PrivacyAlgrthm != _WEP104_) + psecuritypriv->dot11PrivacyAlgrthm != _WEP40_ && + psecuritypriv->dot11PrivacyAlgrthm != _WEP104_) auth_mode = 0; - if ((algorithm > 0 && auth_mode == 0) || // rx a shared-key auth but shared not enabled - (algorithm == 0 && auth_mode == 1) ) // rx a open-system auth but shared-key is enabled - { - DBG_871X("auth rejected due to bad alg [alg=%d, auth_mib=%d] %02X%02X%02X%02X%02X%02X\n", + if ((algorithm > 0 && auth_mode == 0) || /* rx a shared-key auth but shared not enabled */ + (algorithm == 0 && auth_mode == 1)) { /* rx a open-system auth but shared-key is enabled */ + RTW_INFO("auth rejected due to bad alg [alg=%d, auth_mib=%d] %02X%02X%02X%02X%02X%02X\n", algorithm, auth_mode, sa[0], sa[1], sa[2], sa[3], sa[4], sa[5]); - + status = _STATS_NO_SUPP_ALG_; - + goto auth_fail; } - -#if 0 //ACL control - phead = &priv->wlan_acl_list; - plist = phead->next; - //check sa - if (acl_mode == 1) // 1: positive check, only those on acl_list can be connected. - res = FAIL; - else - res = SUCCESS; - while(plist != phead) - { - paclnode = list_entry(plist, struct rtw_wlan_acl_node, list); - plist = plist->next; - if (!memcmp((void *)sa, paclnode->addr, 6)) { - if (paclnode->mode & 2) { // deny - res = FAIL; - break; - } - else { - res = SUCCESS; - break; - } - } - } - - if (res != SUCCESS) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"auth abort because ACL!\n"); - return FAIL; - } -#else - if(rtw_access_ctrl(padapter, sa) == _FALSE) - { +#if CONFIG_RTW_MACADDR_ACL + if (rtw_access_ctrl(padapter, sa) == _FALSE) { status = _STATS_UNABLE_HANDLE_STA_; goto auth_fail; - } + } #endif pstat = rtw_get_stainfo(pstapriv, sa); - if (pstat == NULL) - { + if (pstat == NULL) { - // allocate a new one - DBG_871X("going to alloc stainfo for sa="MAC_FMT"\n", MAC_ARG(sa)); + /* allocate a new one */ + RTW_INFO("going to alloc stainfo for sa="MAC_FMT"\n", MAC_ARG(sa)); pstat = rtw_alloc_stainfo(pstapriv, sa); - if (pstat == NULL) - { - DBG_871X(" Exceed the upper limit of supported clients...\n"); + if (pstat == NULL) { + RTW_INFO(" Exceed the upper limit of supported clients...\n"); status = _STATS_UNABLE_HANDLE_STA_; goto auth_fail; } - + pstat->state = WIFI_FW_AUTH_NULL; pstat->auth_seq = 0; - - //pstat->flags = 0; - //pstat->capability = 0; + + /* pstat->flags = 0; */ + /* pstat->capability = 0; */ } else { #ifdef CONFIG_IEEE80211W if (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) @@ -1968,7 +2198,7 @@ unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) { _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - if (rtw_is_list_empty(&pstat->asoc_list) == _FALSE) { + if (rtw_is_list_empty(&pstat->asoc_list) == _FALSE) { rtw_list_delete(&pstat->asoc_list); pstapriv->asoc_list_cnt--; if (pstat->expire_to > 0) @@ -1983,15 +2213,15 @@ unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) } #ifdef CONFIG_IEEE80211W - if (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) + if (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) #endif /* CONFIG_IEEE80211W */ { _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); - if (rtw_is_list_empty(&pstat->auth_list)) { - + if (rtw_is_list_empty(&pstat->auth_list)) { + rtw_list_insert_tail(&pstat->auth_list, &pstapriv->auth_list); pstapriv->auth_list_cnt++; - } + } _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); } @@ -1999,20 +2229,17 @@ unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) pstat->expire_to = pstapriv->auth_to; - if ((pstat->auth_seq + 1) != seq) - { - DBG_871X("(1)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", - seq, pstat->auth_seq+1); + if ((pstat->auth_seq + 1) != seq) { + RTW_INFO("(1)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", + seq, pstat->auth_seq + 1); status = _STATS_OUT_OF_AUTH_SEQ_; goto auth_fail; } - if (algorithm==0 && (auth_mode == 0 || auth_mode == 2 || auth_mode == 3)) - { - if (seq == 1) - { + if (algorithm == 0 && (auth_mode == 0 || auth_mode == 2 || auth_mode == 3)) { + if (seq == 1) { #ifdef CONFIG_IEEE80211W - if (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) + if (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) #endif /* CONFIG_IEEE80211W */ { pstat->state &= ~WIFI_FW_AUTH_NULL; @@ -2020,25 +2247,20 @@ unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) pstat->expire_to = pstapriv->assoc_to; } pstat->authalg = algorithm; - } - else - { - DBG_871X("(2)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", - seq, pstat->auth_seq+1); + } else { + RTW_INFO("(2)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", + seq, pstat->auth_seq + 1); status = _STATS_OUT_OF_AUTH_SEQ_; goto auth_fail; } - } - else // shared system or auto authentication - { - if (seq == 1) - { - //prepare for the challenging txt... + } else { /* shared system or auto authentication */ + if (seq == 1) { + /* prepare for the challenging txt... */ - //get_random_bytes((void *)pstat->chg_txt, 128);//TODO: + /* get_random_bytes((void *)pstat->chg_txt, 128); */ /* TODO: */ _rtw_memset((void *)pstat->chg_txt, 78, 128); #ifdef CONFIG_IEEE80211W - if (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) + if (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) #endif /* CONFIG_IEEE80211W */ { pstat->state &= ~WIFI_FW_AUTH_NULL; @@ -2046,26 +2268,22 @@ unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) } pstat->authalg = algorithm; pstat->auth_seq = 2; - } - else if (seq == 3) - { - //checking for challenging txt... - DBG_871X("checking for challenging txt...\n"); - - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + 4 + _AUTH_IE_OFFSET_ , _CHLGETXT_IE_, (int *)&ie_len, - len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_ - 4); + } else if (seq == 3) { + /* checking for challenging txt... */ + RTW_INFO("checking for challenging txt...\n"); - if((p==NULL) || (ie_len<=0)) - { - DBG_871X("auth rejected because challenge failure!(1)\n"); + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + 4 + _AUTH_IE_OFFSET_ , _CHLGETXT_IE_, (int *)&ie_len, + len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_ - 4); + + if ((p == NULL) || (ie_len <= 0)) { + RTW_INFO("auth rejected because challenge failure!(1)\n"); status = _STATS_CHALLENGE_FAIL_; goto auth_fail; } - - if (_rtw_memcmp((void *)(p + 2), pstat->chg_txt, 128)) - { + + if (_rtw_memcmp((void *)(p + 2), pstat->chg_txt, 128)) { #ifdef CONFIG_IEEE80211W - if (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) + if (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) #endif /* CONFIG_IEEE80211W */ { pstat->state &= (~WIFI_FW_AUTH_STATE); @@ -2073,27 +2291,23 @@ unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) /* challenging txt is correct... */ pstat->expire_to = pstapriv->assoc_to; } - } - else - { - DBG_871X("auth rejected because challenge failure!\n"); + } else { + RTW_INFO("auth rejected because challenge failure!\n"); status = _STATS_CHALLENGE_FAIL_; goto auth_fail; } - } - else - { - DBG_871X("(3)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", - seq, pstat->auth_seq+1); + } else { + RTW_INFO("(3)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", + seq, pstat->auth_seq + 1); status = _STATS_OUT_OF_AUTH_SEQ_; goto auth_fail; } } - // Now, we are going to issue_auth... - pstat->auth_seq = seq + 1; - + /* Now, we are going to issue_auth... */ + pstat->auth_seq = seq + 1; + #ifdef CONFIG_NATIVEAP_MLME issue_auth(padapter, pstat, (unsigned short)(_STATS_SUCCESSFUL_)); #endif @@ -2101,21 +2315,21 @@ unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) if ((pstat->state & WIFI_FW_AUTH_SUCCESS) || (pstat->state & WIFI_FW_ASSOC_SUCCESS)) pstat->auth_seq = 0; - + return _SUCCESS; auth_fail: - if(pstat) + if (pstat) rtw_free_stainfo(padapter , pstat); - + pstat = &stat; _rtw_memset((char *)pstat, '\0', sizeof(stat)); pstat->auth_seq = 2; - _rtw_memcpy(pstat->hwaddr, sa, 6); - + _rtw_memcpy(pstat->hwaddr, sa, 6); + #ifdef CONFIG_NATIVEAP_MLME - issue_auth(padapter, pstat, (unsigned short)status); + issue_auth(padapter, pstat, (unsigned short)status); #endif #endif @@ -2133,48 +2347,43 @@ unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame) u8 *pframe = precv_frame->u.hdr.rx_data; uint pkt_len = precv_frame->u.hdr.len; - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); - //check A1 matches or not + /* check A1 matches or not */ if (!_rtw_memcmp(adapter_mac_addr(padapter), get_da(pframe), ETH_ALEN)) return _SUCCESS; if (!(pmlmeinfo->state & WIFI_FW_AUTH_STATE)) return _SUCCESS; - offset = (GetPrivacy(pframe))? 4: 0; + offset = (GetPrivacy(pframe)) ? 4 : 0; - algthm = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset)); - seq = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2)); - status = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 4)); + algthm = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset)); + seq = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2)); + status = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 4)); - if (status != 0) - { - DBG_871X("clnt auth fail, status: %d\n", status); - if(status == 13)//&& pmlmeinfo->auth_algo == dot11AuthAlgrthm_Auto) - { - if(pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) + if (status != 0) { + RTW_INFO("clnt auth fail, status: %d\n", status); + if (status == 13) { /* && pmlmeinfo->auth_algo == dot11AuthAlgrthm_Auto) */ + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) pmlmeinfo->auth_algo = dot11AuthAlgrthm_Open; else pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared; - //pmlmeinfo->reauth_count = 0; + /* pmlmeinfo->reauth_count = 0; */ } - + set_link_timer(pmlmeext, 1); goto authclnt_fail; } - if (seq == 2) - { - if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) - { - // legendary shared system + if (seq == 2) { + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) { + /* legendary shared system */ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _AUTH_IE_OFFSET_, _CHLGETXT_IE_, (int *)&len, pkt_len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_); - if (p == NULL) - { - //DBG_871X("marc: no challenge text?\n"); + if (p == NULL) { + /* RTW_INFO("marc: no challenge text?\n"); */ goto authclnt_fail; } @@ -2184,41 +2393,30 @@ unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame) set_link_timer(pmlmeext, REAUTH_TO); return _SUCCESS; - } - else - { - // open system + } else { + /* open system */ go2asoc = 1; } - } - else if (seq == 4) - { + } else if (seq == 4) { if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) - { go2asoc = 1; - } else - { goto authclnt_fail; - } - } - else - { - // this is also illegal - //DBG_871X("marc: clnt auth failed due to illegal seq=%x\n", seq); + } else { + /* this is also illegal */ + /* RTW_INFO("marc: clnt auth failed due to illegal seq=%x\n", seq); */ goto authclnt_fail; } - if (go2asoc) - { - DBG_871X_LEVEL(_drv_always_, "auth success, start assoc\n"); + if (go2asoc) { + RTW_PRINT("auth success, start assoc\n"); start_clnt_assoc(padapter); return _SUCCESS; } authclnt_fail: - //pmlmeinfo->state &= ~(WIFI_FW_AUTH_STATE); + /* pmlmeinfo->state &= ~(WIFI_FW_AUTH_STATE); */ return _FAIL; @@ -2229,20 +2427,20 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_AP_MODE _irqL irqL; u16 capab_info, listen_interval; - struct rtw_ieee802_11_elems elems; + struct rtw_ieee802_11_elems elems; struct sta_info *pstat; unsigned char reassoc, *p, *pos, *wpa_ie; unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; int i, ie_len, wpa_ie_len, left; - unsigned char supportRate[16]; - int supportRateNum; + u8 rate_set[16]; + u8 rate_num; unsigned short status = _STATS_SUCCESSFUL_; - unsigned short frame_type, ie_offset=0; + unsigned short frame_type, ie_offset = 0; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct security_priv *psecuritypriv = &padapter->securitypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur = &(pmlmeinfo->network); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur = &(pmlmeinfo->network); struct sta_priv *pstapriv = &padapter->stapriv; u8 *pframe = precv_frame->u.hdr.rx_data; uint pkt_len = precv_frame->u.hdr.len; @@ -2251,83 +2449,68 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) u8 p2p_status_code = P2P_STATUS_SUCCESS; u8 *p2pie; u32 p2pielen = 0; -#ifdef CONFIG_WFD - u8 wfd_ie[ 128 ] = { 0x00 }; - u32 wfd_ielen = 0; -#endif // CONFIG_WFD -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ #ifdef CONFIG_CONCURRENT_MODE - if(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) && - check_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)) - { - //don't process assoc request; + if (((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) && + rtw_mi_buddy_check_fwstate(padapter, _FW_UNDER_LINKING | _FW_UNDER_SURVEY)) { + /* don't process assoc request; */ return _SUCCESS; } -#endif //CONFIG_CONCURRENT_MODE +#endif /* CONFIG_CONCURRENT_MODE */ - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) return _FAIL; - + frame_type = GetFrameSubType(pframe); - if (frame_type == WIFI_ASSOCREQ) - { + if (frame_type == WIFI_ASSOCREQ) { reassoc = 0; ie_offset = _ASOCREQ_IE_OFFSET_; - } - else // WIFI_REASSOCREQ - { + } else { /* WIFI_REASSOCREQ */ reassoc = 1; ie_offset = _REASOCREQ_IE_OFFSET_; } - + if (pkt_len < IEEE80211_3ADDR_LEN + ie_offset) { - DBG_871X("handle_assoc(reassoc=%d) - too short payload (len=%lu)" - "\n", reassoc, (unsigned long)pkt_len); + RTW_INFO("handle_assoc(reassoc=%d) - too short payload (len=%lu)" + "\n", reassoc, (unsigned long)pkt_len); return _FAIL; } - + pstat = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - if (pstat == (struct sta_info *)NULL) - { + if (pstat == (struct sta_info *)NULL) { status = _RSON_CLS2_; goto asoc_class2_error; } capab_info = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN); - //capab_info = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); - //listen_interval = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN+2)); - listen_interval = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN+2); + /* capab_info = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); */ + /* listen_interval = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN+2)); */ + listen_interval = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN + 2); left = pkt_len - (IEEE80211_3ADDR_LEN + ie_offset); pos = pframe + (IEEE80211_3ADDR_LEN + ie_offset); - - DBG_871X("%s\n", __FUNCTION__); - // check if this stat has been successfully authenticated/assocated - if (!((pstat->state) & WIFI_FW_AUTH_SUCCESS)) - { - if (!((pstat->state) & WIFI_FW_ASSOC_SUCCESS)) - { + RTW_INFO("%s\n", __FUNCTION__); + + /* check if this stat has been successfully authenticated/assocated */ + if (!((pstat->state) & WIFI_FW_AUTH_SUCCESS)) { + if (!((pstat->state) & WIFI_FW_ASSOC_SUCCESS)) { status = _RSON_CLS2_; goto asoc_class2_error; - } - else - { + } else { pstat->state &= (~WIFI_FW_ASSOC_SUCCESS); - pstat->state |= WIFI_FW_ASSOC_STATE; + pstat->state |= WIFI_FW_ASSOC_STATE; } - } - else - { + } else { pstat->state &= (~WIFI_FW_AUTH_SUCCESS); pstat->state |= WIFI_FW_ASSOC_STATE; } -#if 0// todo:tkip_countermeasures +#if 0/* todo:tkip_countermeasures */ if (hapd->tkip_countermeasures) { resp = WLAN_REASON_MICHAEL_MIC_FAILURE; goto fail; @@ -2336,8 +2519,8 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) pstat->capability = capab_info; -#if 0//todo: - //check listen_interval +#if 0/* todo: */ + /* check listen_interval */ if (listen_interval > hapd->conf->max_listen_interval) { hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, @@ -2346,225 +2529,180 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) resp = WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE; goto fail; } - + pstat->listen_interval = listen_interval; #endif - //now parse all ieee802_11 ie to point to elems + /* now parse all ieee802_11 ie to point to elems */ if (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed || !elems.ssid) { - DBG_871X("STA " MAC_FMT " sent invalid association request\n", - MAC_ARG(pstat->hwaddr)); - status = _STATS_FAILURE_; + RTW_INFO("STA " MAC_FMT " sent invalid association request\n", + MAC_ARG(pstat->hwaddr)); + status = _STATS_FAILURE_; goto OnAssocReqFail; } - // now we should check all the fields... - // checking SSID + /* now we should check all the fields... */ + /* checking SSID */ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SSID_IE_, &ie_len, - pkt_len - WLAN_HDR_A3_LEN - ie_offset); + pkt_len - WLAN_HDR_A3_LEN - ie_offset); if (p == NULL) - { - status = _STATS_FAILURE_; - } - - if (ie_len == 0) // broadcast ssid, however it is not allowed in assocreq status = _STATS_FAILURE_; - else - { - // check if ssid match - if (!_rtw_memcmp((void *)(p+2), cur->Ssid.Ssid, cur->Ssid.SsidLength)) + + if (ie_len == 0) /* broadcast ssid, however it is not allowed in assocreq */ + status = _STATS_FAILURE_; + else { + /* check if ssid match */ + if (!_rtw_memcmp((void *)(p + 2), cur->Ssid.Ssid, cur->Ssid.SsidLength)) status = _STATS_FAILURE_; if (ie_len != cur->Ssid.SsidLength) status = _STATS_FAILURE_; } - if(_STATS_SUCCESSFUL_ != status) + if (_STATS_SUCCESSFUL_ != status) goto OnAssocReqFail; - // check if the supported rate is ok - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); - if (p == NULL) { - DBG_871X("Rx a sta assoc-req which supported rate is empty!\n"); - // use our own rate set as statoin used - //_rtw_memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN); - //supportRateNum = AP_BSSRATE_LEN; - + rtw_ies_get_supported_rate(pframe + WLAN_HDR_A3_LEN + ie_offset, pkt_len - WLAN_HDR_A3_LEN - ie_offset, rate_set, &rate_num); + if (rate_num == 0) { + RTW_INFO(FUNC_ADPT_FMT" RX assoc-req with no supported rate\n", FUNC_ADPT_ARG(padapter)); status = _STATS_FAILURE_; goto OnAssocReqFail; } - else { - _rtw_memcpy(supportRate, p+2, ie_len); - supportRateNum = ie_len; - - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _EXT_SUPPORTEDRATES_IE_ , &ie_len, - pkt_len - WLAN_HDR_A3_LEN - ie_offset); - if (p != NULL) { - - if(supportRateNum<=sizeof(supportRate)) - { - _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); - supportRateNum += ie_len; - } - } - } - - //todo: mask supportRate between AP & STA -> move to update raid - //get_matched_rate(pmlmeext, supportRate, &supportRateNum, 0); - - //update station supportRate - pstat->bssratelen = supportRateNum; - _rtw_memcpy(pstat->bssrateset, supportRate, supportRateNum); + _rtw_memcpy(pstat->bssrateset, rate_set, rate_num); + pstat->bssratelen = rate_num; UpdateBrateTblForSoftAP(pstat->bssrateset, pstat->bssratelen); - //check RSN/WPA/WPS + /* check RSN/WPA/WPS */ pstat->dot8021xalg = 0; - pstat->wpa_psk = 0; + pstat->wpa_psk = 0; pstat->wpa_group_cipher = 0; pstat->wpa2_group_cipher = 0; pstat->wpa_pairwise_cipher = 0; pstat->wpa2_pairwise_cipher = 0; _rtw_memset(pstat->wpa_ie, 0, sizeof(pstat->wpa_ie)); - if((psecuritypriv->wpa_psk & BIT(1)) && elems.rsn_ie) { + if ((psecuritypriv->wpa_psk & BIT(1)) && elems.rsn_ie) { + + int group_cipher = 0, pairwise_cipher = 0; - int group_cipher=0, pairwise_cipher=0; - wpa_ie = elems.rsn_ie; wpa_ie_len = elems.rsn_ie_len; - if(rtw_parse_wpa2_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - pstat->dot8021xalg = 1;//psk, todo:802.1x + if (rtw_parse_wpa2_ie(wpa_ie - 2, wpa_ie_len + 2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { + pstat->dot8021xalg = 1;/* psk, todo:802.1x */ pstat->wpa_psk |= BIT(1); - pstat->wpa2_group_cipher = group_cipher&psecuritypriv->wpa2_group_cipher; - pstat->wpa2_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa2_pairwise_cipher; - - if(!pstat->wpa2_group_cipher) + pstat->wpa2_group_cipher = group_cipher & psecuritypriv->wpa2_group_cipher; + pstat->wpa2_pairwise_cipher = pairwise_cipher & psecuritypriv->wpa2_pairwise_cipher; + + if (!pstat->wpa2_group_cipher) status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; - if(!pstat->wpa2_pairwise_cipher) + if (!pstat->wpa2_pairwise_cipher) status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; - } - else - { + } else status = WLAN_STATUS_INVALID_IE; - } - + } else if ((psecuritypriv->wpa_psk & BIT(0)) && elems.wpa_ie) { - int group_cipher=0, pairwise_cipher=0; - + int group_cipher = 0, pairwise_cipher = 0; + wpa_ie = elems.wpa_ie; wpa_ie_len = elems.wpa_ie_len; - if(rtw_parse_wpa_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - pstat->dot8021xalg = 1;//psk, todo:802.1x + if (rtw_parse_wpa_ie(wpa_ie - 2, wpa_ie_len + 2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { + pstat->dot8021xalg = 1;/* psk, todo:802.1x */ pstat->wpa_psk |= BIT(0); - pstat->wpa_group_cipher = group_cipher&psecuritypriv->wpa_group_cipher; - pstat->wpa_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa_pairwise_cipher; - - if(!pstat->wpa_group_cipher) + pstat->wpa_group_cipher = group_cipher & psecuritypriv->wpa_group_cipher; + pstat->wpa_pairwise_cipher = pairwise_cipher & psecuritypriv->wpa_pairwise_cipher; + + if (!pstat->wpa_group_cipher) status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; - if(!pstat->wpa_pairwise_cipher) + if (!pstat->wpa_pairwise_cipher) status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; - - } - else - { + + } else status = WLAN_STATUS_INVALID_IE; - } - + } else { wpa_ie = NULL; wpa_ie_len = 0; } - if(_STATS_SUCCESSFUL_ != status) + if (_STATS_SUCCESSFUL_ != status) goto OnAssocReqFail; pstat->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS); - //if (hapd->conf->wps_state && wpa_ie == NULL) { //todo: to check ap if supporting WPS - if(wpa_ie == NULL) { + /* if (hapd->conf->wps_state && wpa_ie == NULL) { */ /* todo: to check ap if supporting WPS */ + if (wpa_ie == NULL) { if (elems.wps_ie) { - DBG_871X("STA included WPS IE in " - "(Re)Association Request - assume WPS is " - "used\n"); + RTW_INFO("STA included WPS IE in " + "(Re)Association Request - assume WPS is " + "used\n"); pstat->flags |= WLAN_STA_WPS; - //wpabuf_free(sta->wps_ie); - //sta->wps_ie = wpabuf_alloc_copy(elems.wps_ie + 4, - // elems.wps_ie_len - 4); + /* wpabuf_free(sta->wps_ie); */ + /* sta->wps_ie = wpabuf_alloc_copy(elems.wps_ie + 4, */ + /* elems.wps_ie_len - 4); */ } else { - DBG_871X("STA did not include WPA/RSN IE " - "in (Re)Association Request - possible WPS " - "use\n"); + RTW_INFO("STA did not include WPA/RSN IE " + "in (Re)Association Request - possible WPS " + "use\n"); pstat->flags |= WLAN_STA_MAYBE_WPS; } - // AP support WPA/RSN, and sta is going to do WPS, but AP is not ready - // that the selected registrar of AP is _FLASE - if((psecuritypriv->wpa_psk >0) - && (pstat->flags & (WLAN_STA_WPS|WLAN_STA_MAYBE_WPS))) - { - if(pmlmepriv->wps_beacon_ie) - { + /* AP support WPA/RSN, and sta is going to do WPS, but AP is not ready */ + /* that the selected registrar of AP is _FLASE */ + if ((psecuritypriv->wpa_psk > 0) + && (pstat->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS))) { + if (pmlmepriv->wps_beacon_ie) { u8 selected_registrar = 0; - + rtw_get_wps_attr_content(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len, WPS_ATTR_SELECTED_REGISTRAR , &selected_registrar, NULL); - if(!selected_registrar) - { - DBG_871X("selected_registrar is _FALSE , or AP is not ready to do WPS\n"); - + if (!selected_registrar) { + RTW_INFO("selected_registrar is _FALSE , or AP is not ready to do WPS\n"); + status = _STATS_UNABLE_HANDLE_STA_; - + goto OnAssocReqFail; - } - } + } + } } - - } - else - { + + } else { int copy_len; - if(psecuritypriv->wpa_psk == 0) - { - DBG_871X("STA " MAC_FMT ": WPA/RSN IE in association " - "request, but AP don't support WPA/RSN\n", MAC_ARG(pstat->hwaddr)); - + if (psecuritypriv->wpa_psk == 0) { + RTW_INFO("STA " MAC_FMT ": WPA/RSN IE in association " + "request, but AP don't support WPA/RSN\n", MAC_ARG(pstat->hwaddr)); + status = WLAN_STATUS_INVALID_IE; - + goto OnAssocReqFail; } if (elems.wps_ie) { - DBG_871X("STA included WPS IE in " - "(Re)Association Request - WPS is " - "used\n"); + RTW_INFO("STA included WPS IE in " + "(Re)Association Request - WPS is " + "used\n"); pstat->flags |= WLAN_STA_WPS; - copy_len=0; - } - else - { - copy_len = ((wpa_ie_len+2) > sizeof(pstat->wpa_ie)) ? (sizeof(pstat->wpa_ie)):(wpa_ie_len+2); - } + copy_len = 0; + } else + copy_len = ((wpa_ie_len + 2) > sizeof(pstat->wpa_ie)) ? (sizeof(pstat->wpa_ie)) : (wpa_ie_len + 2); + + + if (copy_len > 0) + _rtw_memcpy(pstat->wpa_ie, wpa_ie - 2, copy_len); - - if(copy_len>0) - _rtw_memcpy(pstat->wpa_ie, wpa_ie-2, copy_len); - } - // check if there is WMM IE & support WWM-PS + /* check if there is WMM IE & support WWM-PS */ pstat->flags &= ~WLAN_STA_WME; pstat->qos_option = 0; pstat->qos_info = 0; @@ -2573,116 +2711,112 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) pstat->uapsd_vi = 0; pstat->uapsd_be = 0; pstat->uapsd_bk = 0; - if (pmlmepriv->qospriv.qos_option) - { - p = pframe + WLAN_HDR_A3_LEN + ie_offset; ie_len = 0; - for (;;) - { + if (pmlmepriv->qospriv.qos_option) { + p = pframe + WLAN_HDR_A3_LEN + ie_offset; + ie_len = 0; + for (;;) { p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); if (p != NULL) { - if (_rtw_memcmp(p+2, WMM_IE, 6)) { + if (_rtw_memcmp(p + 2, WMM_IE, 6)) { pstat->flags |= WLAN_STA_WME; - - pstat->qos_option = 1; - pstat->qos_info = *(p+8); - - pstat->max_sp_len = (pstat->qos_info>>5)&0x3; - if((pstat->qos_info&0xf) !=0xf) + pstat->qos_option = 1; + pstat->qos_info = *(p + 8); + + pstat->max_sp_len = (pstat->qos_info >> 5) & 0x3; + + if ((pstat->qos_info & 0xf) != 0xf) pstat->has_legacy_ac = _TRUE; else pstat->has_legacy_ac = _FALSE; - - if(pstat->qos_info&0xf) - { - if(pstat->qos_info&BIT(0)) - pstat->uapsd_vo = BIT(0)|BIT(1); + + if (pstat->qos_info & 0xf) { + if (pstat->qos_info & BIT(0)) + pstat->uapsd_vo = BIT(0) | BIT(1); else pstat->uapsd_vo = 0; - - if(pstat->qos_info&BIT(1)) - pstat->uapsd_vi = BIT(0)|BIT(1); + + if (pstat->qos_info & BIT(1)) + pstat->uapsd_vi = BIT(0) | BIT(1); else pstat->uapsd_vi = 0; - - if(pstat->qos_info&BIT(2)) - pstat->uapsd_bk = BIT(0)|BIT(1); + + if (pstat->qos_info & BIT(2)) + pstat->uapsd_bk = BIT(0) | BIT(1); else pstat->uapsd_bk = 0; - - if(pstat->qos_info&BIT(3)) - pstat->uapsd_be = BIT(0)|BIT(1); + + if (pstat->qos_info & BIT(3)) + pstat->uapsd_be = BIT(0) | BIT(1); else pstat->uapsd_be = 0; - + } - + break; } - } - else { + } else break; - } p = p + ie_len + 2; } } #ifdef CONFIG_80211N_HT + if (pmlmepriv->htpriv.ht_option == _FALSE) + goto bypass_ht_chk; + /* save HT capabilities in the sta object */ _rtw_memset(&pstat->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap)); - if (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct rtw_ieee80211_ht_cap)) - { + if (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct rtw_ieee80211_ht_cap)) { pstat->flags |= WLAN_STA_HT; - + pstat->flags |= WLAN_STA_WME; - - _rtw_memcpy(&pstat->htpriv.ht_cap, elems.ht_capabilities, sizeof(struct rtw_ieee80211_ht_cap)); - + + _rtw_memcpy(&pstat->htpriv.ht_cap, elems.ht_capabilities, sizeof(struct rtw_ieee80211_ht_cap)); + } else pstat->flags &= ~WLAN_STA_HT; +bypass_ht_chk: - - if((pmlmepriv->htpriv.ht_option == _FALSE) && (pstat->flags&WLAN_STA_HT)) - { + if ((pmlmepriv->htpriv.ht_option == _FALSE) && (pstat->flags & WLAN_STA_HT)) { + rtw_warn_on(1); status = _STATS_FAILURE_; goto OnAssocReqFail; } - #endif /* CONFIG_80211N_HT */ #ifdef CONFIG_80211AC_VHT + if (pmlmepriv->vhtpriv.vht_option == _FALSE) + goto bypass_vht_chk; + _rtw_memset(&pstat->vhtpriv, 0, sizeof(struct vht_priv)); if (elems.vht_capabilities && elems.vht_capabilities_len == 12) { pstat->flags |= WLAN_STA_VHT; _rtw_memcpy(pstat->vhtpriv.vht_cap, elems.vht_capabilities, 12); - if (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1) { + if (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1) _rtw_memcpy(&pstat->vhtpriv.vht_op_mode_notify, elems.vht_op_mode_notify, 1); - } - else // for Frame without Operating Mode notify ie; default: 80M - { + else /* for Frame without Operating Mode notify ie; default: 80M */ pstat->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80; - } - } - else { + } else pstat->flags &= ~WLAN_STA_VHT; - } +bypass_vht_chk: - if((pmlmepriv->vhtpriv.vht_option == _FALSE) && (pstat->flags&WLAN_STA_VHT)) - { + if ((pmlmepriv->vhtpriv.vht_option == _FALSE) && (pstat->flags & WLAN_STA_VHT)) { + rtw_warn_on(1); status = _STATS_FAILURE_; goto OnAssocReqFail; } #endif /* CONFIG_80211AC_VHT */ - if (((pstat->flags & WLAN_STA_HT) || (pstat->flags & WLAN_STA_VHT)) && - ((pstat->wpa2_pairwise_cipher & WPA_CIPHER_TKIP) || - (pstat->wpa_pairwise_cipher & WPA_CIPHER_TKIP))) { + if (((pstat->flags & WLAN_STA_HT) || (pstat->flags & WLAN_STA_VHT)) && + ((pstat->wpa2_pairwise_cipher & WPA_CIPHER_TKIP) || + (pstat->wpa_pairwise_cipher & WPA_CIPHER_TKIP))) { - DBG_871X("(V)HT: " MAC_FMT " tried to use TKIP with (V)HT association\n", MAC_ARG(pstat->hwaddr)); + RTW_INFO("(V)HT: " MAC_FMT " tried to use TKIP with (V)HT association\n", MAC_ARG(pstat->hwaddr)); pstat->flags &= ~WLAN_STA_HT; pstat->flags &= ~WLAN_STA_VHT; @@ -2692,9 +2826,9 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) } - // - //if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)//? - pstat->flags |= WLAN_STA_NONERP; + /* + * if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G) */ /* ? */ + pstat->flags |= WLAN_STA_NONERP; for (i = 0; i < pstat->bssratelen; i++) { if ((pstat->bssrateset[i] & 0x7f) > 22) { pstat->flags &= ~WLAN_STA_NONERP; @@ -2707,81 +2841,68 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) else pstat->flags &= ~WLAN_STA_SHORT_PREAMBLE; - - + + if (status != _STATS_SUCCESSFUL_) goto OnAssocReqFail; #ifdef CONFIG_P2P pstat->is_p2p_device = _FALSE; - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - if( (p2pie=rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , NULL, &p2pielen))) - { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + p2pie = rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , NULL, &p2pielen); + if (p2pie) { pstat->is_p2p_device = _TRUE; - if((p2p_status_code=(u8)process_assoc_req_p2p_ie(pwdinfo, pframe, pkt_len, pstat))>0) - { + p2p_status_code = (u8)process_assoc_req_p2p_ie(pwdinfo, pframe, pkt_len, pstat); + if (p2p_status_code > 0) { pstat->p2p_status_code = p2p_status_code; status = _STATS_CAP_FAIL_; goto OnAssocReqFail; } } #ifdef CONFIG_WFD - if(rtw_get_wfd_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , wfd_ie, &wfd_ielen )) - { - u8 attr_content[ 10 ] = { 0x00 }; - u32 attr_contentlen = 0; - - DBG_8192C( "[%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 ) - { - pwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); - DBG_8192C( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport ); - } - } + rtw_process_wfd_ies(padapter, pframe + WLAN_HDR_A3_LEN + ie_offset, pkt_len - WLAN_HDR_A3_LEN - ie_offset, __func__); #endif } pstat->p2p_status_code = p2p_status_code; -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ + + /* TODO: identify_proprietary_vendor_ie(); */ + /* Realtek proprietary IE */ + /* identify if this is Broadcom sta */ + /* identify if this is ralink sta */ + /* Customer proprietary IE */ - //TODO: identify_proprietary_vendor_ie(); - // Realtek proprietary IE - // identify if this is Broadcom sta - // identify if this is ralink sta - // Customer proprietary IE - /* get a unique AID */ - if (pstat->aid > 0) { - DBG_871X(" old AID %d\n", pstat->aid); - } else { + if (pstat->aid > 0) + RTW_INFO(" 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) { if (pstat->aid > pstapriv->max_num_sta) { pstat->aid = 0; - - DBG_871X(" no room for more AIDs\n"); + + RTW_INFO(" no room for more AIDs\n"); status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA; - + goto OnAssocReqFail; - - + + } else { pstapriv->sta_aid[pstat->aid - 1] = pstat; - DBG_871X("allocate new AID = (%d)\n", pstat->aid); + RTW_INFO("allocate new AID = (%d)\n", pstat->aid); break; - } + } } - } + } } - pstat->state &= (~WIFI_FW_ASSOC_STATE); + pstat->state &= (~WIFI_FW_ASSOC_STATE); pstat->state |= WIFI_FW_ASSOC_SUCCESS; - /* DBG_871X("==================%s, %d, (%x), bpairwise_key_installed=%d, MAC:"MAC_FMT"\n" + /* RTW_INFO("==================%s, %d, (%x), bpairwise_key_installed=%d, MAC:"MAC_FMT"\n" , __func__, __LINE__, pstat->state, pstat->bpairwise_key_installed, MAC_ARG(pstat->hwaddr)); */ #ifdef CONFIG_IEEE80211W if (pstat->bpairwise_key_installed != _TRUE) @@ -2793,8 +2914,8 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) pstapriv->auth_list_cnt--; } _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); if (rtw_is_list_empty(&pstat->asoc_list)) { pstat->expire_to = pstapriv->expire_to; rtw_list_insert_tail(&pstat->asoc_list, &pstapriv->asoc_list); @@ -2803,9 +2924,8 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); } - // now the station is qualified to join our BSS... - if(pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (_STATS_SUCCESSFUL_==status)) - { + /* now the station is qualified to join our BSS... */ + if (pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (_STATS_SUCCESSFUL_ == status)) { #ifdef CONFIG_NATIVEAP_MLME #ifdef CONFIG_IEEE80211W if (pstat->bpairwise_key_installed != _TRUE) @@ -2819,7 +2939,7 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) if (pstat->bpairwise_key_installed == _TRUE) status = _STATS_REFUSED_TEMPORARILY_; #endif /* CONFIG_IEEE80211W */ - //.2 issue assoc rsp before notify station join event. + /* .2 issue assoc rsp before notify station join event. */ if (frame_type == WIFI_ASSOCREQ) issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); else @@ -2827,35 +2947,33 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_IOCTL_CFG80211 _enter_critical_bh(&pstat->lock, &irqL); - if(pstat->passoc_req) - { + if (pstat->passoc_req) { rtw_mfree(pstat->passoc_req, pstat->assoc_req_len); pstat->passoc_req = NULL; pstat->assoc_req_len = 0; } pstat->passoc_req = rtw_zmalloc(pkt_len); - if(pstat->passoc_req) - { + if (pstat->passoc_req) { _rtw_memcpy(pstat->passoc_req, pframe, pkt_len); pstat->assoc_req_len = pkt_len; } _exit_critical_bh(&pstat->lock, &irqL); -#endif //CONFIG_IOCTL_CFG80211 +#endif /* CONFIG_IOCTL_CFG80211 */ #ifdef CONFIG_IEEE80211W if (pstat->bpairwise_key_installed != _TRUE) #endif /* CONFIG_IEEE80211W */ { /* .3-(1) report sta add event */ - report_add_sta_event(padapter, pstat->hwaddr, pstat->aid); + report_add_sta_event(padapter, pstat->hwaddr); } #ifdef CONFIG_IEEE80211W if (pstat->bpairwise_key_installed == _TRUE && padapter->securitypriv.binstallBIPkey == _TRUE) { - DBG_871X(MAC_FMT"\n", MAC_ARG(pstat->hwaddr)); + RTW_INFO(MAC_FMT"\n", MAC_ARG(pstat->hwaddr)); issue_action_SA_Query(padapter, pstat->hwaddr, 0, 0, IEEE80211W_RIGHT_KEY); } #endif /* CONFIG_IEEE80211W */ -#endif //CONFIG_NATIVEAP_MLME +#endif /* CONFIG_NATIVEAP_MLME */ } return _SUCCESS; @@ -2866,7 +2984,7 @@ asoc_class2_error: issue_deauth(padapter, (void *)GetAddr2Ptr(pframe), status); #endif - return _FAIL; + return _FAIL; OnAssocReqFail: @@ -2882,7 +3000,7 @@ OnAssocReqFail: #endif /* CONFIG_AP_MODE */ - return _FAIL; + return _FAIL; } @@ -2895,14 +3013,14 @@ unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + /* WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); */ u8 *pframe = precv_frame->u.hdr.rx_data; uint pkt_len = precv_frame->u.hdr.len; PNDIS_802_11_VARIABLE_IEs pWapiIE = NULL; - DBG_871X("%s\n", __FUNCTION__); - - //check A1 matches or not + RTW_INFO("%s\n", __FUNCTION__); + + /* check A1 matches or not */ if (!_rtw_memcmp(adapter_mac_addr(padapter), get_da(pframe), ETH_ALEN)) return _SUCCESS; @@ -2914,84 +3032,77 @@ unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame) _cancel_timer_ex(&pmlmeext->link_timer); - //status - if ((status = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 2))) > 0) - { - DBG_871X("assoc reject, status code: %d\n", status); + /* status */ + status = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 2)); + if (status > 0) { + RTW_INFO("assoc reject, status code: %d\n", status); pmlmeinfo->state = WIFI_FW_NULL_STATE; res = -4; goto report_assoc_result; } - //get capabilities + /* get capabilities */ pmlmeinfo->capability = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); - //set slot time - pmlmeinfo->slotTime = (pmlmeinfo->capability & BIT(10))? 9: 20; + /* set slot time */ + pmlmeinfo->slotTime = (pmlmeinfo->capability & BIT(10)) ? 9 : 20; - //AID - res = pmlmeinfo->aid = (int)(le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 4))&0x3fff); + /* AID */ + res = pmlmeinfo->aid = (int)(le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 4)) & 0x3fff); - //following are moved to join event callback function - //to handle HT, WMM, rate adaptive, update MAC reg - //for not to handle the synchronous IO in the tasklet - for (i = (6 + WLAN_HDR_A3_LEN); i < pkt_len;) - { + /* following are moved to join event callback function */ + /* to handle HT, WMM, rate adaptive, update MAC reg */ + /* for not to handle the synchronous IO in the tasklet */ + for (i = (6 + WLAN_HDR_A3_LEN); i < pkt_len;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i); - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM - { - WMM_param_handler(padapter, pIE); - } + switch (pIE->ElementID) { + case _VENDOR_SPECIFIC_IE_: + if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) /* WMM */ + WMM_param_handler(padapter, pIE); #if defined(CONFIG_P2P) && defined(CONFIG_WFD) - else if ( _rtw_memcmp(pIE->data, WFD_OUI, 4)) //WFD - { - DBG_871X( "[%s] Found WFD IE\n", __FUNCTION__ ); - WFD_info_handler( padapter, pIE ); - } -#endif - break; + else if (_rtw_memcmp(pIE->data, WFD_OUI, 4)) /* WFD */ + rtw_process_wfd_ie(padapter, (u8 *)pIE, pIE->Length, __func__); +#endif + break; #ifdef CONFIG_WAPI_SUPPORT - case _WAPI_IE_: - pWapiIE = pIE; - break; + case _WAPI_IE_: + pWapiIE = pIE; + break; #endif - case _HT_CAPABILITY_IE_: //HT caps - HT_caps_handler(padapter, pIE); - break; + case _HT_CAPABILITY_IE_: /* HT caps */ + HT_caps_handler(padapter, pIE); + break; - case _HT_EXTRA_INFO_IE_: //HT info - HT_info_handler(padapter, pIE); - break; + case _HT_EXTRA_INFO_IE_: /* HT info */ + HT_info_handler(padapter, pIE); + break; #ifdef CONFIG_80211AC_VHT - case EID_VHTCapability: - VHT_caps_handler(padapter, pIE); - break; + case EID_VHTCapability: + VHT_caps_handler(padapter, pIE); + break; - case EID_VHTOperation: - VHT_operation_handler(padapter, pIE); - break; + case EID_VHTOperation: + VHT_operation_handler(padapter, pIE); + break; #endif - case _ERPINFO_IE_: - ERP_IE_handler(padapter, pIE); - break; + 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; + 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; + default: + break; } i += (pIE->Length + 2); @@ -3004,15 +3115,14 @@ unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame) pmlmeinfo->state &= (~WIFI_FW_ASSOC_STATE); pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; - //Update Basic Rate Table for spec, 2010-12-28 , by thomas + /* Update Basic Rate Table for spec, 2010-12-28 , by thomas */ UpdateBrateTbl(padapter, pmlmeinfo->network.SupportedRates); report_assoc_result: - if (res > 0) { + if (res > 0) rtw_buf_update(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len, pframe, pkt_len); - } else { + else rtw_buf_free(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len); - } report_join_res(padapter, res); @@ -3027,49 +3137,45 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 *pframe = precv_frame->u.hdr.rx_data; #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif //CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif /* CONFIG_P2P */ - //check A3 + /* check A3 */ if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) return _SUCCESS; - DBG_871X(FUNC_ADPT_FMT" - Start to Disconnect\n", FUNC_ADPT_ARG(padapter)); + RTW_INFO(FUNC_ADPT_FMT" - Start to Disconnect\n", FUNC_ADPT_ARG(padapter)); #ifdef CONFIG_P2P - if ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) - { - _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey ); - _set_timer( &pwdinfo->reset_ch_sitesurvey, 10 ); + if (pwdinfo->rx_invitereq_info.scan_op_ch_only) { + _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); + _set_timer(&pwdinfo->reset_ch_sitesurvey, 10); } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); rtw_lock_rx_suspend_timeout(8000); #ifdef CONFIG_AP_MODE - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { _irqL irqL; struct sta_info *psta; struct sta_priv *pstapriv = &padapter->stapriv; - - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - //rtw_free_stainfo(padapter, psta); - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n" + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + /* rtw_free_stainfo(padapter, psta); */ + /* _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + + RTW_PRINT(FUNC_ADPT_FMT" reason=%u, ta=%pM\n" , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe)); - psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - if(psta) - { + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta) { u8 updated = _FALSE; - + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - if(rtw_is_list_empty(&psta->asoc_list)==_FALSE) - { + if (rtw_is_list_empty(&psta->asoc_list) == _FALSE) { rtw_list_delete(&psta->asoc_list); pstapriv->asoc_list_cnt--; updated = ap_free_sta(padapter, psta, _FALSE, reason, _TRUE); @@ -3079,40 +3185,35 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) associated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL); } - + return _SUCCESS; - } - else + } else #endif { int ignore_received_deauth = 0; - // Commented by Albert 20130604 - // Before sending the auth frame to start the STA/GC mode connection with AP/GO, - // we will send the deauth first. - // However, the Win8.1 with BRCM Wi-Fi will send the deauth with reason code 6 to us after receieving our deauth. - // Added the following code to avoid this case. - if ( ( pmlmeinfo->state & WIFI_FW_AUTH_STATE ) || - ( pmlmeinfo->state & WIFI_FW_ASSOC_STATE ) ) - { - if ( reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA ) - { + /* Commented by Albert 20130604 */ + /* Before sending the auth frame to start the STA/GC mode connection with AP/GO, */ + /* we will send the deauth first. */ + /* However, the Win8.1 with BRCM Wi-Fi will send the deauth with reason code 6 to us after receieving our deauth. */ + /* Added the following code to avoid this case. */ + if ((pmlmeinfo->state & WIFI_FW_AUTH_STATE) || + (pmlmeinfo->state & WIFI_FW_ASSOC_STATE)) { + if (reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA) ignore_received_deauth = 1; - } else if (WLAN_REASON_PREV_AUTH_NOT_VALID == reason) { - // TODO: 802.11r + else if (WLAN_REASON_PREV_AUTH_NOT_VALID == reason) { + /* TODO: 802.11r */ ignore_received_deauth = 1; } } - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM, ignore=%d\n" + RTW_PRINT(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, GetAddr2Ptr(pframe), reason); - } - } + if (0 == ignore_received_deauth) + receive_disconnect(padapter, GetAddr2Ptr(pframe), reason, _FALSE); + } pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; return _SUCCESS; @@ -3126,53 +3227,49 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 *pframe = precv_frame->u.hdr.rx_data; #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif //CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif /* CONFIG_P2P */ - //check A3 + /* check A3 */ if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) return _SUCCESS; - DBG_871X(FUNC_ADPT_FMT" - Start to Disconnect\n", FUNC_ADPT_ARG(padapter)); + RTW_INFO(FUNC_ADPT_FMT" - Start to Disconnect\n", FUNC_ADPT_ARG(padapter)); #ifdef CONFIG_P2P - if ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) - { - _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey ); - _set_timer( &pwdinfo->reset_ch_sitesurvey, 10 ); + if (pwdinfo->rx_invitereq_info.scan_op_ch_only) { + _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); + _set_timer(&pwdinfo->reset_ch_sitesurvey, 10); } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); rtw_lock_rx_suspend_timeout(8000); - + #ifdef CONFIG_AP_MODE - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { _irqL irqL; struct sta_info *psta; struct sta_priv *pstapriv = &padapter->stapriv; - - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - //rtw_free_stainfo(padapter, psta); - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n" + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + /* rtw_free_stainfo(padapter, psta); */ + /* _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); */ + + RTW_PRINT(FUNC_ADPT_FMT" reason=%u, ta=%pM\n" , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe)); - psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - if(psta) - { + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta) { u8 updated = _FALSE; - + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - if(rtw_is_list_empty(&psta->asoc_list)==_FALSE) - { + if (rtw_is_list_empty(&psta->asoc_list) == _FALSE) { rtw_list_delete(&psta->asoc_list); pstapriv->asoc_list_cnt--; updated = ap_free_sta(padapter, psta, _FALSE, reason, _TRUE); - + } _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); @@ -3180,15 +3277,14 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) } return _SUCCESS; - } - else + } else #endif { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n" + RTW_PRINT(FUNC_ADPT_FMT" reason=%u, ta=%pM\n" , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe)); - receive_disconnect(padapter, GetAddr2Ptr(pframe), reason); - } + receive_disconnect(padapter, GetAddr2Ptr(pframe), reason, _FALSE); + } pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; return _SUCCESS; @@ -3196,7 +3292,7 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame) { - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); return _SUCCESS; } @@ -3207,18 +3303,18 @@ unsigned int on_action_spct_ch_switch(_adapter *padapter, struct sta_info *psta, struct mlme_ext_info *pmlmeinfo = &(mlmeext->mlmext_info); if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) { - ret = _SUCCESS; + ret = _SUCCESS; goto exit; } if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { - + int ch_switch_mode = -1, ch = -1, ch_switch_cnt = -1; int ch_offset = -1; u8 bwmode; struct ieee80211_info_element *ie; - DBG_871X(FUNC_NDEV_FMT" from "MAC_FMT"\n", + RTW_INFO(FUNC_NDEV_FMT" from "MAC_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev), MAC_ARG(psta->hwaddr)); for_each_ie(ie, ies, ies_len) { @@ -3226,12 +3322,11 @@ unsigned int on_action_spct_ch_switch(_adapter *padapter, struct sta_info *psta, ch_switch_mode = ie->data[0]; ch = ie->data[1]; ch_switch_cnt = ie->data[2]; - DBG_871X("ch_switch_mode:%d, ch:%d, ch_switch_cnt:%d\n", - ch_switch_mode, ch, ch_switch_cnt); - } - else if (ie->id == WLAN_EID_SECONDARY_CHANNEL_OFFSET) { + RTW_INFO("ch_switch_mode:%d, ch:%d, ch_switch_cnt:%d\n", + ch_switch_mode, ch, ch_switch_cnt); + } else if (ie->id == WLAN_EID_SECONDARY_CHANNEL_OFFSET) { ch_offset = secondary_ch_offset_to_hal_ch_offset(ie->data[0]); - DBG_871X("ch_offset:%d\n", ch_offset); + RTW_INFO("ch_offset:%d\n", ch_offset); } } @@ -3242,7 +3337,7 @@ unsigned int on_action_spct_ch_switch(_adapter *padapter, struct sta_info *psta, bwmode = mlmeext->cur_bwmode; else bwmode = (ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) ? - CHANNEL_WIDTH_20 : CHANNEL_WIDTH_40; + CHANNEL_WIDTH_20 : CHANNEL_WIDTH_40; ch_offset = (ch_offset == -1) ? mlmeext->cur_ch_offset : ch_offset; @@ -3269,7 +3364,7 @@ unsigned int on_action_spct(_adapter *padapter, union recv_frame *precv_frame) u8 category; u8 action; - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); @@ -3277,7 +3372,7 @@ unsigned int on_action_spct(_adapter *padapter, union recv_frame *precv_frame) goto exit; category = frame_body[0]; - if(category != RTW_WLAN_CATEGORY_SPECTRUM_MGMT) + if (category != RTW_WLAN_CATEGORY_SPECTRUM_MGMT) goto exit; action = frame_body[1]; @@ -3288,10 +3383,10 @@ unsigned int on_action_spct(_adapter *padapter, union recv_frame *precv_frame) case RTW_WLAN_ACTION_SPCT_TPC_RPRT: break; case RTW_WLAN_ACTION_SPCT_CHL_SWITCH: - #ifdef CONFIG_SPCT_CH_SWITCH +#ifdef CONFIG_SPCT_CH_SWITCH ret = on_action_spct_ch_switch(padapter, psta, &frame_body[2], - frame_len-(frame_body-pframe)-2); - #endif + frame_len - (frame_body - pframe) - 2); +#endif break; default: break; @@ -3336,9 +3431,9 @@ u8 rtw_rx_ampdu_size(_adapter *adapter) /* for scan */ if (!mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_DISABLE) - && !mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_COMPLETE) - && adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_size != RX_AMPDU_SIZE_INVALID - ) { + && !mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_COMPLETE) + && adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_size != RX_AMPDU_SIZE_INVALID + ) { size = adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_size; goto exit; } @@ -3348,7 +3443,14 @@ u8 rtw_rx_ampdu_size(_adapter *adapter) 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); - + + /* In Maximum A-MPDU Length Exponent subfield of A-MPDU Parameters field of HT Capabilities element, + the unit of max_rx_ampdu_factor are octets. 8K, 16K, 32K, 64K is right. + But the buffer size subfield of Block Ack Parameter Set field in ADDBA action frame indicates + the number of buffers available for this particular TID. Each buffer is equal to max. size of + MSDU or AMSDU. + The size variable means how many MSDUs or AMSDUs, it's not Kbytes. + */ if (MAX_AMPDU_FACTOR_64K == max_rx_ampdu_factor) size = 64; else if (MAX_AMPDU_FACTOR_32K == max_rx_ampdu_factor) @@ -3392,9 +3494,9 @@ bool rtw_rx_ampdu_is_accept(_adapter *adapter) /* for scan */ if (!mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_DISABLE) - && !mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_COMPLETE) - && adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_accept != RX_AMPDU_ACCEPT_INVALID - ) { + && !mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_COMPLETE) + && adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_accept != RX_AMPDU_ACCEPT_INVALID + ) { accept = adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_accept; goto exit; } @@ -3427,7 +3529,7 @@ bool rtw_rx_ampdu_set_size(_adapter *adapter, u8 size, u8 reason) 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); + RTW_INFO(FUNC_ADPT_FMT" fix_rx_ampdu_size:%u\n", FUNC_ADPT_ARG(adapter), size); } } else if (reason == RX_AMPDU_DRV_SCAN) { struct ss_res *ss = &adapter->mlmeextpriv.sitesurvey_res; @@ -3435,7 +3537,7 @@ bool rtw_rx_ampdu_set_size(_adapter *adapter, u8 size, u8 reason) if (ss->rx_ampdu_size != size) { ss->rx_ampdu_size = size; is_adj = _TRUE; - DBG_871X(FUNC_ADPT_FMT" ss.rx_ampdu_size:%u\n", FUNC_ADPT_ARG(adapter), size); + RTW_INFO(FUNC_ADPT_FMT" ss.rx_ampdu_size:%u\n", FUNC_ADPT_ARG(adapter), size); } } @@ -3463,13 +3565,13 @@ bool rtw_rx_ampdu_set_accept(_adapter *adapter, u8 accept, u8 reason) 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); + RTW_INFO(FUNC_ADPT_FMT" fix_rx_ampdu_accept:%u\n", FUNC_ADPT_ARG(adapter), accept); } } else if (reason == RX_AMPDU_DRV_SCAN) { if (adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_accept != accept) { adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_accept = accept; is_adj = _TRUE; - DBG_871X(FUNC_ADPT_FMT" ss.rx_ampdu_accept:%u\n", FUNC_ADPT_ARG(adapter), accept); + RTW_INFO(FUNC_ADPT_FMT" ss.rx_ampdu_accept:%u\n", FUNC_ADPT_ARG(adapter), accept); } } @@ -3601,7 +3703,7 @@ u16 rtw_rx_ampdu_apply(_adapter *adapter) unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame) { u8 *addr; - struct sta_info *psta=NULL; + struct sta_info *psta = NULL; struct recv_reorder_ctrl *preorder_ctrl; unsigned char *frame_body; unsigned char category, action; @@ -3612,1984 +3714,153 @@ unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame) struct sta_priv *pstapriv = &padapter->stapriv; #ifdef CONFIG_80211N_HT - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); - //check RA matches or not + /* check RA matches or not */ if (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN)) return _SUCCESS; -/* - //check A1 matches or not +#if 0 + /* check A1 matches or not */ if (!_rtw_memcmp(adapter_mac_addr(padapter), get_da(pframe), ETH_ALEN)) return _SUCCESS; -*/ +#endif - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) return _SUCCESS; addr = GetAddr2Ptr(pframe); psta = rtw_get_stainfo(pstapriv, addr); - if(psta==NULL) + if (psta == NULL) return _SUCCESS; frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); category = frame_body[0]; - if (category == RTW_WLAN_CATEGORY_BACK)// representing Block Ack - { + if (category == RTW_WLAN_CATEGORY_BACK) { /* representing Block Ack */ #ifdef CONFIG_TDLS - if((psta->tdls_sta_state & TDLS_LINKED_STATE) && - (psta->htpriv.ht_option==_TRUE) && - (psta->htpriv.ampdu_enable==_TRUE)) - { - DBG_871X("Recv [%s] from direc link\n", __FUNCTION__); - } + if ((psta->tdls_sta_state & TDLS_LINKED_STATE) && + (psta->htpriv.ht_option == _TRUE) && + (psta->htpriv.ampdu_enable == _TRUE)) + RTW_INFO("Recv [%s] from direc link\n", __FUNCTION__); else -#endif //CONFIG_TDLS - if (!pmlmeinfo->HT_enable) - { - return _SUCCESS; - } +#endif /* CONFIG_TDLS */ + if (!pmlmeinfo->HT_enable) + return _SUCCESS; action = frame_body[1]; - DBG_871X("%s, action=%d\n", __FUNCTION__, action); - switch (action) - { - case RTW_WLAN_ACTION_ADDBA_REQ: //ADDBA request + RTW_INFO("%s, action=%d\n", __FUNCTION__, action); + switch (action) { + case RTW_WLAN_ACTION_ADDBA_REQ: /* ADDBA request */ - _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); - - break; + _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); - case RTW_WLAN_ACTION_ADDBA_RESP: //ADDBA response + break; - //status = frame_body[3] | (frame_body[4] << 8); //endian issue - status = RTW_GET_LE16(&frame_body[3]); - tid = ((frame_body[5] >> 2) & 0x7); + case RTW_WLAN_ACTION_ADDBA_RESP: /* ADDBA response */ - if (status == 0) - { //successful - DBG_871X("agg_enable for TID=%d\n", tid); - psta->htpriv.agg_enable_bitmap |= 1 << tid; - psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); - } - else - { - psta->htpriv.agg_enable_bitmap &= ~BIT(tid); - } + /* status = frame_body[3] | (frame_body[4] << 8); */ /* endian issue */ + status = RTW_GET_LE16(&frame_body[3]); + tid = ((frame_body[5] >> 2) & 0x7); - if(psta->state & WIFI_STA_ALIVE_CHK_STATE) - { - DBG_871X("%s alive check - rx ADDBA response\n", __func__); - psta->htpriv.agg_enable_bitmap &= ~BIT(tid); - psta->expire_to = pstapriv->expire_to; - psta->state ^= WIFI_STA_ALIVE_CHK_STATE; - } + if (status == 0) { + /* successful */ + RTW_INFO("agg_enable for TID=%d\n", tid); + psta->htpriv.agg_enable_bitmap |= 1 << tid; + psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); + } else + psta->htpriv.agg_enable_bitmap &= ~BIT(tid); - //DBG_871X("marc: ADDBA RSP: %x\n", pmlmeinfo->agg_enable_bitmap); - break; + if (psta->state & WIFI_STA_ALIVE_CHK_STATE) { + RTW_INFO("%s alive check - rx ADDBA response\n", __func__); + psta->htpriv.agg_enable_bitmap &= ~BIT(tid); + psta->expire_to = pstapriv->expire_to; + psta->state ^= WIFI_STA_ALIVE_CHK_STATE; + } - case RTW_WLAN_ACTION_DELBA: //DELBA - if ((frame_body[3] & BIT(3)) == 0) - { - psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); - psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); - - //reason_code = frame_body[4] | (frame_body[5] << 8); - reason_code = RTW_GET_LE16(&frame_body[4]); - } - else if((frame_body[3] & BIT(3)) == BIT(3)) - { - tid = (frame_body[3] >> 4) & 0x0F; - - preorder_ctrl = &psta->recvreorder_ctrl[tid]; - preorder_ctrl->enable = _FALSE; - preorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID; - } - - DBG_871X("%s(): DELBA: %x(%x)\n", __FUNCTION__,pmlmeinfo->agg_enable_bitmap, reason_code); - //todo: how to notify the host while receiving DELETE BA - break; + /* RTW_INFO("marc: ADDBA RSP: %x\n", pmlmeinfo->agg_enable_bitmap); */ + break; - default: - break; + case RTW_WLAN_ACTION_DELBA: /* DELBA */ + if ((frame_body[3] & BIT(3)) == 0) { + psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); + psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); + + /* reason_code = frame_body[4] | (frame_body[5] << 8); */ + reason_code = RTW_GET_LE16(&frame_body[4]); + } else if ((frame_body[3] & BIT(3)) == BIT(3)) { + tid = (frame_body[3] >> 4) & 0x0F; + + preorder_ctrl = &psta->recvreorder_ctrl[tid]; + preorder_ctrl->enable = _FALSE; + preorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID; + } + + RTW_INFO("%s(): DELBA: %x(%x)\n", __FUNCTION__, pmlmeinfo->agg_enable_bitmap, reason_code); + /* todo: how to notify the host while receiving DELETE BA */ + break; + + default: + break; } } -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ return _SUCCESS; } #ifdef CONFIG_P2P -static int get_reg_classes_full_count(struct p2p_channels channel_list) { +static int get_reg_classes_full_count(struct p2p_channels channel_list) +{ int cnt = 0; int i; - for (i = 0; i < channel_list.reg_classes; i++) { + for (i = 0; i < channel_list.reg_classes; i++) cnt += channel_list.reg_class[i].channels; - } return cnt; } -static void get_channel_cnt_24g_5gl_5gh( struct mlme_ext_priv *pmlmeext, u8* p24g_cnt, u8* p5gl_cnt, u8* p5gh_cnt ) +static void get_channel_cnt_24g_5gl_5gh(struct mlme_ext_priv *pmlmeext, u8 *p24g_cnt, u8 *p5gl_cnt, u8 *p5gh_cnt) { int i = 0; *p24g_cnt = 0; *p5gl_cnt = 0; - *p5gh_cnt = 0; - - for( i = 0; i < pmlmeext->max_chan_nums; i++ ) - { - if ( pmlmeext->channel_set[ i ].ChannelNum <= 14 ) - { + *p5gh_cnt = 0; + + for (i = 0; i < pmlmeext->max_chan_nums; i++) { + if (pmlmeext->channel_set[i].ChannelNum <= 14) (*p24g_cnt)++; - } - else if ( ( pmlmeext->channel_set[ i ].ChannelNum > 14 ) && ( pmlmeext->channel_set[ i ].ChannelNum <= 48 ) ) - { - // Just include the channel 36, 40, 44, 48 channels for 5G low + else if ((pmlmeext->channel_set[i].ChannelNum > 14) && (pmlmeext->channel_set[i].ChannelNum <= 48)) { + /* Just include the channel 36, 40, 44, 48 channels for 5G low */ (*p5gl_cnt)++; - } - else if ( ( pmlmeext->channel_set[ i ].ChannelNum >= 149 ) && ( pmlmeext->channel_set[ i ].ChannelNum <= 161 ) ) - { - // Just include the channel 149, 153, 157, 161 channels for 5G high + } else if ((pmlmeext->channel_set[i].ChannelNum >= 149) && (pmlmeext->channel_set[i].ChannelNum <= 161)) { + /* Just include the channel 149, 153, 157, 161 channels for 5G high */ (*p5gh_cnt)++; } } } -void issue_p2p_GO_request(_adapter *padapter, u8* raddr) +void issue_p2p_GO_request(_adapter *padapter, u8 *raddr) { unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; u32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_GO_NEGO_REQ; - u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 }; u8 wpsielen = 0, p2pielen = 0, i; u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0; u16 len_channellist_attr = 0; #ifdef CONFIG_WFD u32 wfdielen = 0; -#endif //CONFIG_WFD - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - DBG_871X( "[%s] In\n", __FUNCTION__ ); - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _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++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pwdinfo->negotiation_dialog_token = 1; // Initialize the dialog value - pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &(pattrib->pktlen)); - - - - // WPS Section - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // Device Password ID - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - // Value: - - if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC ); - } - else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); - } - else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC ); - } - - wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20110306 - // According to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes - // 1. P2P Capability - // 2. Group Owner Intent - // 3. Configuration Timeout - // 4. Listen Channel - // 5. Extended Listen Timing - // 6. Intended P2P Interface Address - // 7. Channel List - // 8. P2P Device Info - // 9. Operating Channel - - - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; - - // Group Capability Bitmap, 1 byte - if ( pwdinfo->persistent_supported ) - { - p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP; - } - else - { - p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN; - } - - - // Group Owner Intent - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - // Todo the tie breaker bit. - p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) & 0xFE ); - - // Configuration Timeout - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client - - - // Listen Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listening channel number - - - // Extended Listen Timing ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); - p2pielen += 2; - - // Value: - // Availability Period - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - // Availability Interval - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - - // Intended P2P Interface Address - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); - p2pielen += 2; - - // Value: - _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); - p2pielen += ETH_ALEN; - - - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - // Length: - // Country String(3) - // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?) - // + number of channels in all classes - len_channellist_attr = 3 - + (1 + 1) * (u16)(pmlmeext->channel_list.reg_classes) - + get_reg_classes_full_count(pmlmeext->channel_list); - -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 ); - } - else - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr ); - } -#else - - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr ); - -#endif - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Channel Entry List - -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - // Operating Class - if ( pbuddy_mlmeext->cur_channel > 14 ) - { - if ( pbuddy_mlmeext->cur_channel >= 149 ) - { - p2pie[ p2pielen++ ] = 0x7c; - } - else - { - p2pie[ p2pielen++ ] = 0x73; - } - } - else - { - p2pie[ p2pielen++ ] = 0x51; - } - - // Number of Channels - // Just support 1 channel and this channel is AP's channel - p2pie[ p2pielen++ ] = 1; - - // Channel List - p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel; - } - else - { - int i,j; - for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { - // Operating Class - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; - - // Number of Channels - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; - - // Channel List - for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; - } - } - } -#else // CONFIG_CONCURRENT_MODE - { - int i,j; - for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { - // Operating Class - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; - - // Number of Channels - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; - - // Channel List - for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; - } - } - } -#endif // CONFIG_CONCURRENT_MODE - - // Device Info - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - // P2P Device Address - _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); - p2pielen += ETH_ALEN; - - // Config Method - // This field should be big endian. Noted by P2P specification. - - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); - - p2pielen += 2; - - // Primary Device Type - // Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); - p2pielen += 2; - - // OUI - *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - p2pielen += 4; - - // Sub Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); - p2pielen += 2; - - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List - - // Device Name - // Type: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - p2pielen += 2; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - - // Operating Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - if ( pwdinfo->operating_channel <= 14 ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x51; - } - else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x73; - } - else - { - // Operating Class - p2pie[ p2pielen++ ] = 0x7c; - } - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - -#ifdef CONFIG_WFD - wfdielen = build_nego_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - - -void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint len, u8 result) -{ - - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_GO_NEGO_RESP; - u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; - u8 p2pielen = 0, i; - uint wpsielen = 0; - u16 wps_devicepassword_id = 0x0000; - uint wps_devicepassword_id_len = 0; - u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh; - u16 len_channellist_attr = 0; - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); - -#ifdef CONFIG_WFD - u32 wfdielen = 0; -#endif //CONFIG_WFD - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - DBG_871X( "[%s] In, result = %d\n", __FUNCTION__, result ); - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _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++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pwdinfo->negotiation_dialog_token = frame_body[7]; // The Dialog Token of provisioning discovery request frame. - pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); - - // Commented by Albert 20110328 - // Try to get the device password ID from the WPS IE of group negotiation request frame - // WiFi Direct test plan 5.1.15 - rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); - rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); - wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); - - _rtw_memset( wpsie, 0x00, 255 ); - wpsielen = 0; - - // WPS Section - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // Device Password ID - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - // Value: - if ( wps_devicepassword_id == WPS_DPID_USER_SPEC ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); - } - else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC ); - } - else - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC ); - } - wpsielen += 2; - - // Commented by Kurt 20120113 - // If some device wants to do p2p handshake without sending prov_disc_req - // We have to get peer_req_cm from here. - if(_rtw_memcmp( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3) ) - { - if ( wps_devicepassword_id == WPS_DPID_USER_SPEC ) - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3 ); - } - else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC ) - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3 ); - } - else - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3 ); - } - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20100908 - // According to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes - // 1. Status - // 2. P2P Capability - // 3. Group Owner Intent - // 4. Configuration Timeout - // 5. Operating Channel - // 6. Intended P2P Interface Address - // 7. Channel List - // 8. Device Info - // 9. Group ID ( Only GO ) - - - // ToDo: - - // P2P Status - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = result; - - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - - if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) ) - { - // Commented by Albert 2011/03/08 - // According to the P2P specification - // if the sending device will be client, the P2P Capability should be reserved of group negotation response frame - p2pie[ p2pielen++ ] = 0; - } - else - { - // Be group owner or meet the error case - p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; - } - - // Group Capability Bitmap, 1 byte - if ( pwdinfo->persistent_supported ) - { - p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP; - } - else - { - p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN; - } - - // Group Owner Intent - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - if ( pwdinfo->peer_intent & 0x01 ) - { - // Peer's tie breaker bit is 1, our tie breaker bit should be 0 - p2pie[ p2pielen++ ] = ( pwdinfo->intent << 1 ); - } - else - { - // Peer's tie breaker bit is 0, our tie breaker bit should be 1 - p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) ); - } - - - // Configuration Timeout - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client - - // Operating Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - if ( pwdinfo->operating_channel <= 14 ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x51; - } - else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x73; - } - else - { - // Operating Class - p2pie[ p2pielen++ ] = 0x7c; - } - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number - - // Intended P2P Interface Address - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); - p2pielen += 2; - - // Value: - _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); - p2pielen += ETH_ALEN; - - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - // Country String(3) - // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?) - // + number of channels in all classes - len_channellist_attr = 3 - + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes - + get_reg_classes_full_count(pmlmeext->channel_list); - -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 ); - } - else - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr ); - } -#else - - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr ); - - #endif - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Channel Entry List - -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - // Operating Class - if ( pbuddy_mlmeext->cur_channel > 14 ) - { - if ( pbuddy_mlmeext->cur_channel >= 149 ) - { - p2pie[ p2pielen++ ] = 0x7c; - } - else - { - p2pie[ p2pielen++ ] = 0x73; - } - } - else - { - p2pie[ p2pielen++ ] = 0x51; - } - - // Number of Channels - // Just support 1 channel and this channel is AP's channel - p2pie[ p2pielen++ ] = 1; - - // Channel List - p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel; - } - else - { - int i, j; - for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { - // Operating Class - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; - - // Number of Channels - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; - - // Channel List - for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; - } - } - } -#else // CONFIG_CONCURRENT_MODE - { - int i, j; - for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { - // Operating Class - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; - - // Number of Channels - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; - - // Channel List - for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; - } - } - } -#endif // CONFIG_CONCURRENT_MODE - - - // Device Info - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - // P2P Device Address - _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); - p2pielen += ETH_ALEN; - - // Config Method - // This field should be big endian. Noted by P2P specification. - - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); - - p2pielen += 2; - - // Primary Device Type - // Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); - p2pielen += 2; - - // OUI - *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - p2pielen += 4; - - // Sub Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); - p2pielen += 2; - - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List - - // Device Name - // Type: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - p2pielen += 2; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) ) - { - // Group ID Attribute - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen ); - p2pielen += 2; - - // Value: - // p2P Device Address - _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN ); - p2pielen += ETH_ALEN; - - // SSID - _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); - p2pielen += pwdinfo->nego_ssidlen; - - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - -#ifdef CONFIG_WFD - wfdielen = build_nego_resp_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_p2p_GO_confirm(_adapter *padapter, u8* raddr, u8 result) -{ - - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_GO_NEGO_CONF; - u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; - u8 wpsielen = 0, p2pielen = 0; - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); -#ifdef CONFIG_WFD - u32 wfdielen = 0; -#endif //CONFIG_WFD - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - DBG_871X( "[%s] In\n", __FUNCTION__ ); - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _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++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); - - - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20110306 - // According to the P2P Specification, the group negoitation request frame should contain 5 P2P attributes - // 1. Status - // 2. P2P Capability - // 3. Operating Channel - // 4. Channel List - // 5. Group ID ( if this WiFi is GO ) - - // P2P Status - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = result; - - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; - - // Group Capability Bitmap, 1 byte - if ( pwdinfo->persistent_supported ) - { - p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP; - } - else - { - p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN; - } - - - // Operating Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - - if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) ) - { - if ( pwdinfo->peer_operating_ch <= 14 ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x51; - } - else if ( ( pwdinfo->peer_operating_ch >= 36 ) && ( pwdinfo->peer_operating_ch <= 48 ) ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x73; - } - else - { - // Operating Class - p2pie[ p2pielen++ ] = 0x7c; - } - - p2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch; - } - else - { - if ( pwdinfo->operating_channel <= 14 ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x51; - } - else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x73; - } - else - { - // Operating Class - p2pie[ p2pielen++ ] = 0x7c; - } - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // Use the listen channel as the operating channel - } - - - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - *(u16*) ( p2pie + p2pielen ) = 6; - p2pielen += 2; - - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Value: - if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) ) - { - if ( pwdinfo->peer_operating_ch <= 14 ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x51; - } - else if ( ( pwdinfo->peer_operating_ch >= 36 ) && ( pwdinfo->peer_operating_ch <= 48 ) ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x73; - } - else - { - // Operating Class - p2pie[ p2pielen++ ] = 0x7c; - } - p2pie[ p2pielen++ ] = 1; - p2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch; - } - else - { - if ( pwdinfo->operating_channel <= 14 ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x51; - } - else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) ) - { - // Operating Class - p2pie[ p2pielen++ ] = 0x73; - } - else - { - // Operating Class - p2pie[ p2pielen++ ] = 0x7c; - } - - // Channel Number - p2pie[ p2pielen++ ] = 1; - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // Use the listen channel as the operating channel - } - - if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) ) - { - // Group ID Attribute - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen ); - p2pielen += 2; - - // Value: - // p2P Device Address - _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN ); - p2pielen += ETH_ALEN; - - // SSID - _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); - p2pielen += pwdinfo->nego_ssidlen; - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - -#ifdef CONFIG_WFD - wfdielen = build_nego_confirm_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ) -{ - - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_INVIT_REQ; - u8 p2pie[ 255 ] = { 0x00 }; - u8 p2pielen = 0, i; - u8 dialogToken = 3; - u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0; - u16 len_channellist_attr = 0; -#ifdef CONFIG_WFD - u32 wfdielen = 0; -#endif //CONFIG_WFD -#ifdef CONFIG_CONCURRENT_MODE - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo; - struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; #endif - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20101011 - // According to the P2P Specification, the P2P Invitation request frame should contain 7 P2P attributes - // 1. Configuration Timeout - // 2. Invitation Flags - // 3. Operating Channel ( Only GO ) - // 4. P2P Group BSSID ( Should be included if I am the GO ) - // 5. Channel List - // 6. P2P Group ID - // 7. P2P Device Info - - // Configuration Timeout - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client - - // Invitation Flags - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_INVITATION_FLAGS; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = P2P_INVITATION_FLAGS_PERSISTENT; - - - // Operating Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - if ( pwdinfo->invitereq_info.operating_ch <= 14 ) - p2pie[ p2pielen++ ] = 0x51; - else if ( ( pwdinfo->invitereq_info.operating_ch >= 36 ) && ( pwdinfo->invitereq_info.operating_ch <= 48 ) ) - p2pie[ p2pielen++ ] = 0x73; - else - p2pie[ p2pielen++ ] = 0x7c; - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->invitereq_info.operating_ch; // operating channel number - - if (_rtw_memcmp(adapter_mac_addr(padapter), pwdinfo->invitereq_info.go_bssid, ETH_ALEN)) - { - // P2P Group BSSID - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_BSSID; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); - p2pielen += 2; - - // Value: - // P2P Device Address for GO - _rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN ); - p2pielen += ETH_ALEN; - } - - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - - // Length: - // Country String(3) - // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?) - // + number of channels in all classes - len_channellist_attr = 3 - + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes - + get_reg_classes_full_count(pmlmeext->channel_list); - -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 ); - } - else - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr ); - } -#else - - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr ); - - #endif - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Channel Entry List -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - // Operating Class - if ( pbuddy_mlmeext->cur_channel > 14 ) - { - if ( pbuddy_mlmeext->cur_channel >= 149 ) - { - p2pie[ p2pielen++ ] = 0x7c; - } - else - { - p2pie[ p2pielen++ ] = 0x73; - } - } - else - { - p2pie[ p2pielen++ ] = 0x51; - } - - // Number of Channels - // Just support 1 channel and this channel is AP's channel - p2pie[ p2pielen++ ] = 1; - - // Channel List - p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel; - } - else - { - int i, j; - for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { - // Operating Class - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; - - // Number of Channels - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; - - // Channel List - for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; - } - } - } -#else // CONFIG_CONCURRENT_MODE - { - int i, j; - for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { - // Operating Class - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; - - // Number of Channels - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; - - // Channel List - for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; - } - } - } -#endif // CONFIG_CONCURRENT_MODE - - - // P2P Group ID - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 6 + pwdinfo->invitereq_info.ssidlen ); - p2pielen += 2; - - // Value: - // P2P Device Address for GO - _rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN ); - p2pielen += ETH_ALEN; - - // SSID - _rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.go_ssid, pwdinfo->invitereq_info.ssidlen ); - p2pielen += pwdinfo->invitereq_info.ssidlen; - - - // Device Info - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - // P2P Device Address - _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); - p2pielen += ETH_ALEN; - - // Config Method - // This field should be big endian. Noted by P2P specification. - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); - p2pielen += 2; - - // Primary Device Type - // Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); - p2pielen += 2; - - // OUI - *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - p2pielen += 4; - - // Sub Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); - p2pielen += 2; - - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List - - // Device Name - // Type: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - p2pielen += 2; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - -#ifdef CONFIG_WFD - wfdielen = build_invitation_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 status_code) -{ - - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_INVIT_RESP; - u8 p2pie[ 255 ] = { 0x00 }; - u8 p2pielen = 0, i; - u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0; - u16 len_channellist_attr = 0; -#ifdef CONFIG_CONCURRENT_MODE - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo; - struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; -#endif -#ifdef CONFIG_WFD - u32 wfdielen = 0; -#endif //CONFIG_WFD - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20101005 - // According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes - // 1. Status - // 2. Configuration Timeout - // 3. Operating Channel ( Only GO ) - // 4. P2P Group BSSID ( Only GO ) - // 5. Channel List - - // P2P Status - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - // When status code is P2P_STATUS_FAIL_INFO_UNAVAILABLE. - // Sent the event receiving the P2P Invitation Req frame to DMP UI. - // DMP had to compare the MAC address to find out the profile. - // So, the WiFi driver will send the P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB. - // If the UI found the corresponding profile, the WiFi driver sends the P2P Invitation Req - // to NB to rebuild the persistent group. - p2pie[ p2pielen++ ] = status_code; - - // Configuration Timeout - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client - - if( status_code == P2P_STATUS_SUCCESS ) - { - if( rtw_p2p_chk_role( pwdinfo, P2P_ROLE_GO ) ) - { - // The P2P Invitation request frame asks this Wi-Fi device to be the P2P GO - // In this case, the P2P Invitation response frame should carry the two more P2P attributes. - // First one is operating channel attribute. - // Second one is P2P Group BSSID attribute. - - // Operating Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number - - - // P2P Group BSSID - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_BSSID; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); - p2pielen += 2; - - // Value: - // P2P Device Address for GO - _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); - p2pielen += ETH_ALEN; - - } - - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - // Length: - // Country String(3) - // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?) - // + number of channels in all classes - len_channellist_attr = 3 - + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes - + get_reg_classes_full_count(pmlmeext->channel_list); - -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 ); - } - else - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr ); - } -#else - - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr ); - -#endif - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Channel Entry List -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - // Operating Class - if ( pbuddy_mlmeext->cur_channel > 14 ) - { - if ( pbuddy_mlmeext->cur_channel >= 149 ) - { - p2pie[ p2pielen++ ] = 0x7c; - } - else - { - p2pie[ p2pielen++ ] = 0x73; - } - } - else - { - p2pie[ p2pielen++ ] = 0x51; - } - - // Number of Channels - // Just support 1 channel and this channel is AP's channel - p2pie[ p2pielen++ ] = 1; - - // Channel List - p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel; - } - else - { - int i, j; - for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { - // Operating Class - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; - - // Number of Channels - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; - - // Channel List - for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; - } - } - } -#else // CONFIG_CONCURRENT_MODE - { - int i, j; - for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { - // Operating Class - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; - - // Number of Channels - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; - - // Channel List - for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) { - p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; - } - } - } -#endif // CONFIG_CONCURRENT_MODE - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - -#ifdef CONFIG_WFD - wfdielen = build_invitation_resp_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_p2p_provision_request(_adapter *padapter, u8* pssid, u8 ussidlen, u8* pdev_raddr ) -{ - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u8 dialogToken = 1; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_PROVISION_DISC_REQ; - u8 wpsie[ 100 ] = { 0x00 }; - u8 wpsielen = 0; - u32 p2pielen = 0; -#ifdef CONFIG_WFD - u32 wfdielen = 0; -#endif //CONFIG_WFD - struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; @@ -5601,13 +3872,1657 @@ void issue_p2p_provision_request(_adapter *padapter, u8* pssid, u8 ussidlen, u8* struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; + + RTW_INFO("[%s] In\n", __FUNCTION__); + /* update attribute */ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _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++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pwdinfo->negotiation_dialog_token = 1; /* Initialize the dialog value */ + pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &(pattrib->pktlen)); + + + + /* WPS Section */ + wpsielen = 0; + /* WPS OUI */ + *(u32 *)(wpsie) = cpu_to_be32(WPSOUI); + wpsielen += 4; + + /* WPS version */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); + wpsielen += 2; + + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); + wpsielen += 2; + + /* Value: */ + wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ + + /* Device Password ID */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID); + wpsielen += 2; + + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); + wpsielen += 2; + + /* Value: */ + + if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN) + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC); + else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN) + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC); + else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC) + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC); + + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen); + + + /* P2P IE Section. */ + + /* P2P OUI */ + p2pielen = 0; + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ + + /* Commented by Albert 20110306 */ + /* According to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes */ + /* 1. P2P Capability */ + /* 2. Group Owner Intent */ + /* 3. Configuration Timeout */ + /* 4. Listen Channel */ + /* 5. Extended Listen Timing */ + /* 6. Intended P2P Interface Address */ + /* 7. Channel List */ + /* 8. P2P Device Info */ + /* 9. Operating Channel */ + + + /* P2P Capability */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); + p2pielen += 2; + + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; + + /* Group Capability Bitmap, 1 byte */ + if (pwdinfo->persistent_supported) + p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP; + else + p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN; + + + /* Group Owner Intent */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_GO_INTENT; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); + p2pielen += 2; + + /* Value: */ + /* Todo the tie breaker bit. */ + p2pie[p2pielen++] = ((pwdinfo->intent << 1) & 0xFE); + + /* Configuration Timeout */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); + p2pielen += 2; + + /* Value: */ + p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */ + p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */ + + + /* Listen Channel */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Operating Class */ + p2pie[p2pielen++] = 0x51; /* Copy from SD7 */ + + /* Channel Number */ + p2pie[p2pielen++] = pwdinfo->listen_channel; /* listening channel number */ + + + /* Extended Listen Timing ATTR */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0004); + p2pielen += 2; + + /* Value: */ + /* Availability Period */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); + p2pielen += 2; + + /* Availability Interval */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); + p2pielen += 2; + + + /* Intended P2P Interface Address */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN); + p2pielen += 2; + + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); + p2pielen += ETH_ALEN; + + + /* Channel List */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CH_LIST; + + /* Length: */ + /* Country String(3) */ + /* + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?) */ + /* + number of channels in all classes */ + len_channellist_attr = 3 + + (1 + 1) * (u16)(pmlmeext->channel_list.reg_classes) + + get_reg_classes_full_count(pmlmeext->channel_list); + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(5 + 1); + else + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); +#else + + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); + +#endif + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Channel Entry List */ + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + u8 union_ch = rtw_mi_get_union_chan(padapter); + + /* Operating Class */ + if (union_ch > 14) { + if (union_ch >= 149) + p2pie[p2pielen++] = 0x7c; + else + p2pie[p2pielen++] = 0x73; + } else + p2pie[p2pielen++] = 0x51; + + + /* Number of Channels */ + /* Just support 1 channel and this channel is AP's channel */ + p2pie[p2pielen++] = 1; + + /* Channel List */ + p2pie[p2pielen++] = union_ch; + } else { + int i, j; + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { + /* Operating Class */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; + + /* Number of Channels */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; + + /* Channel List */ + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; + } + } +#else /* CONFIG_CONCURRENT_MODE */ + { + int i, j; + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { + /* Operating Class */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; + + /* Number of Channels */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; + + /* Channel List */ + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; + } + } +#endif /* CONFIG_CONCURRENT_MODE */ + + /* Device Info */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; + + /* Length: */ + /* 21->P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ + /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); + p2pielen += 2; + + /* Value: */ + /* P2P Device Address */ + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); + p2pielen += ETH_ALEN; + + /* Config Method */ + /* This field should be big endian. Noted by P2P specification. */ + + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm); + + p2pielen += 2; + + /* Primary Device Type */ + /* Category ID */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); + p2pielen += 2; + + /* OUI */ + *(u32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI); + p2pielen += 4; + + /* Sub Category ID */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); + p2pielen += 2; + + /* Number of Secondary Device Types */ + p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ + + /* Device Name */ + /* Type: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); + p2pielen += 2; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); + p2pielen += 2; + + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len); + p2pielen += pwdinfo->device_name_len; + + + /* Operating Channel */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Operating Class */ + if (pwdinfo->operating_channel <= 14) { + /* Operating Class */ + p2pie[p2pielen++] = 0x51; + } else if ((pwdinfo->operating_channel >= 36) && (pwdinfo->operating_channel <= 48)) { + /* Operating Class */ + p2pie[p2pielen++] = 0x73; + } else { + /* Operating Class */ + p2pie[p2pielen++] = 0x7c; } - DBG_871X( "[%s] In\n", __FUNCTION__ ); - //update attribute + /* Channel Number */ + p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */ + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen); + +#ifdef CONFIG_WFD + wfdielen = build_nego_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + + +void issue_p2p_GO_response(_adapter *padapter, u8 *raddr, u8 *frame_body, uint len, u8 result) +{ + + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_NEGO_RESP; + u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 }; + u8 p2pielen = 0, i; + uint wpsielen = 0; + u16 wps_devicepassword_id = 0x0000; + uint wps_devicepassword_id_len = 0; + u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh; + u16 len_channellist_attr = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + return; + + RTW_INFO("[%s] In, result = %d\n", __FUNCTION__, result); + /* update attribute */ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _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++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pwdinfo->negotiation_dialog_token = frame_body[7]; /* The Dialog Token of provisioning discovery request frame. */ + pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); + + /* Commented by Albert 20110328 */ + /* Try to get the device password ID from the WPS IE of group negotiation request frame */ + /* WiFi Direct test plan 5.1.15 */ + rtw_get_wps_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); + rtw_get_wps_attr_content(wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8 *) &wps_devicepassword_id, &wps_devicepassword_id_len); + wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id); + + _rtw_memset(wpsie, 0x00, 255); + wpsielen = 0; + + /* WPS Section */ + wpsielen = 0; + /* WPS OUI */ + *(u32 *)(wpsie) = cpu_to_be32(WPSOUI); + wpsielen += 4; + + /* WPS version */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); + wpsielen += 2; + + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); + wpsielen += 2; + + /* Value: */ + wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ + + /* Device Password ID */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID); + wpsielen += 2; + + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); + wpsielen += 2; + + /* Value: */ + if (wps_devicepassword_id == WPS_DPID_USER_SPEC) + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC); + else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC); + else + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC); + wpsielen += 2; + + /* Commented by Kurt 20120113 */ + /* If some device wants to do p2p handshake without sending prov_disc_req */ + /* We have to get peer_req_cm from here. */ + if (_rtw_memcmp(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3)) { + if (wps_devicepassword_id == WPS_DPID_USER_SPEC) + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3); + else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3); + else + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3); + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen); + + + /* P2P IE Section. */ + + /* P2P OUI */ + p2pielen = 0; + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ + + /* Commented by Albert 20100908 */ + /* According to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes */ + /* 1. Status */ + /* 2. P2P Capability */ + /* 3. Group Owner Intent */ + /* 4. Configuration Timeout */ + /* 5. Operating Channel */ + /* 6. Intended P2P Interface Address */ + /* 7. Channel List */ + /* 8. Device Info */ + /* 9. Group ID ( Only GO ) */ + + + /* ToDo: */ + + /* P2P Status */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_STATUS; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); + p2pielen += 2; + + /* Value: */ + p2pie[p2pielen++] = result; + + /* P2P Capability */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); + p2pielen += 2; + + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { + /* Commented by Albert 2011/03/08 */ + /* According to the P2P specification */ + /* if the sending device will be client, the P2P Capability should be reserved of group negotation response frame */ + p2pie[p2pielen++] = 0; + } else { + /* Be group owner or meet the error case */ + p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; + } + + /* Group Capability Bitmap, 1 byte */ + if (pwdinfo->persistent_supported) + p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP; + else + p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN; + + /* Group Owner Intent */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_GO_INTENT; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); + p2pielen += 2; + + /* Value: */ + if (pwdinfo->peer_intent & 0x01) { + /* Peer's tie breaker bit is 1, our tie breaker bit should be 0 */ + p2pie[p2pielen++] = (pwdinfo->intent << 1); + } else { + /* Peer's tie breaker bit is 0, our tie breaker bit should be 1 */ + p2pie[p2pielen++] = ((pwdinfo->intent << 1) | BIT(0)); + } + + + /* Configuration Timeout */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); + p2pielen += 2; + + /* Value: */ + p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */ + p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */ + + /* Operating Channel */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Operating Class */ + if (pwdinfo->operating_channel <= 14) { + /* Operating Class */ + p2pie[p2pielen++] = 0x51; + } else if ((pwdinfo->operating_channel >= 36) && (pwdinfo->operating_channel <= 48)) { + /* Operating Class */ + p2pie[p2pielen++] = 0x73; + } else { + /* Operating Class */ + p2pie[p2pielen++] = 0x7c; + } + + /* Channel Number */ + p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */ + + /* Intended P2P Interface Address */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN); + p2pielen += 2; + + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); + p2pielen += ETH_ALEN; + + /* Channel List */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CH_LIST; + + /* Country String(3) */ + /* + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?) */ + /* + number of channels in all classes */ + len_channellist_attr = 3 + + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes + + get_reg_classes_full_count(pmlmeext->channel_list); + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(5 + 1); + else + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); +#else + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); + +#endif + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Channel Entry List */ + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + + u8 union_chan = rtw_mi_get_union_chan(padapter); + + /*Operating Class*/ + if (union_chan > 14) { + if (union_chan >= 149) + p2pie[p2pielen++] = 0x7c; + else + p2pie[p2pielen++] = 0x73; + + } else + p2pie[p2pielen++] = 0x51; + + /* Number of Channels + Just support 1 channel and this channel is AP's channel*/ + p2pie[p2pielen++] = 1; + + /*Channel List*/ + p2pie[p2pielen++] = union_chan; + } else { + int i, j; + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { + /* Operating Class */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; + + /* Number of Channels */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; + + /* Channel List */ + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; + } + } +#else /* CONFIG_CONCURRENT_MODE */ + { + int i, j; + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { + /* Operating Class */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; + + /* Number of Channels */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; + + /* Channel List */ + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; + } + } +#endif /* CONFIG_CONCURRENT_MODE */ + + + /* Device Info */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; + + /* Length: */ + /* 21->P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ + /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); + p2pielen += 2; + + /* Value: */ + /* P2P Device Address */ + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); + p2pielen += ETH_ALEN; + + /* Config Method */ + /* This field should be big endian. Noted by P2P specification. */ + + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm); + + p2pielen += 2; + + /* Primary Device Type */ + /* Category ID */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); + p2pielen += 2; + + /* OUI */ + *(u32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI); + p2pielen += 4; + + /* Sub Category ID */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); + p2pielen += 2; + + /* Number of Secondary Device Types */ + p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ + + /* Device Name */ + /* Type: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); + p2pielen += 2; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); + p2pielen += 2; + + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len); + p2pielen += pwdinfo->device_name_len; + + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + /* Group ID Attribute */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_GROUP_ID; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen); + p2pielen += 2; + + /* Value: */ + /* p2P Device Address */ + _rtw_memcpy(p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN); + p2pielen += ETH_ALEN; + + /* SSID */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen); + p2pielen += pwdinfo->nego_ssidlen; + + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen); + +#ifdef CONFIG_WFD + wfdielen = build_nego_resp_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_GO_confirm(_adapter *padapter, u8 *raddr, u8 result) +{ + + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_NEGO_CONF; + u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 }; + u8 wpsielen = 0, p2pielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + return; + + RTW_INFO("[%s] In\n", __FUNCTION__); + /* update attribute */ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _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++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); + + + + /* P2P IE Section. */ + + /* P2P OUI */ + p2pielen = 0; + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ + + /* Commented by Albert 20110306 */ + /* According to the P2P Specification, the group negoitation request frame should contain 5 P2P attributes */ + /* 1. Status */ + /* 2. P2P Capability */ + /* 3. Operating Channel */ + /* 4. Channel List */ + /* 5. Group ID ( if this WiFi is GO ) */ + + /* P2P Status */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_STATUS; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); + p2pielen += 2; + + /* Value: */ + p2pie[p2pielen++] = result; + + /* P2P Capability */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); + p2pielen += 2; + + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; + + /* Group Capability Bitmap, 1 byte */ + if (pwdinfo->persistent_supported) + p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP; + else + p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN; + + + /* Operating Channel */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { + if (pwdinfo->peer_operating_ch <= 14) { + /* Operating Class */ + p2pie[p2pielen++] = 0x51; + } else if ((pwdinfo->peer_operating_ch >= 36) && (pwdinfo->peer_operating_ch <= 48)) { + /* Operating Class */ + p2pie[p2pielen++] = 0x73; + } else { + /* Operating Class */ + p2pie[p2pielen++] = 0x7c; + } + + p2pie[p2pielen++] = pwdinfo->peer_operating_ch; + } else { + if (pwdinfo->operating_channel <= 14) { + /* Operating Class */ + p2pie[p2pielen++] = 0x51; + } else if ((pwdinfo->operating_channel >= 36) && (pwdinfo->operating_channel <= 48)) { + /* Operating Class */ + p2pie[p2pielen++] = 0x73; + } else { + /* Operating Class */ + p2pie[p2pielen++] = 0x7c; + } + + /* Channel Number */ + p2pie[p2pielen++] = pwdinfo->operating_channel; /* Use the listen channel as the operating channel */ + } + + + /* Channel List */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CH_LIST; + + *(u16 *)(p2pie + p2pielen) = 6; + p2pielen += 2; + + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Value: */ + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { + if (pwdinfo->peer_operating_ch <= 14) { + /* Operating Class */ + p2pie[p2pielen++] = 0x51; + } else if ((pwdinfo->peer_operating_ch >= 36) && (pwdinfo->peer_operating_ch <= 48)) { + /* Operating Class */ + p2pie[p2pielen++] = 0x73; + } else { + /* Operating Class */ + p2pie[p2pielen++] = 0x7c; + } + p2pie[p2pielen++] = 1; + p2pie[p2pielen++] = pwdinfo->peer_operating_ch; + } else { + if (pwdinfo->operating_channel <= 14) { + /* Operating Class */ + p2pie[p2pielen++] = 0x51; + } else if ((pwdinfo->operating_channel >= 36) && (pwdinfo->operating_channel <= 48)) { + /* Operating Class */ + p2pie[p2pielen++] = 0x73; + } else { + /* Operating Class */ + p2pie[p2pielen++] = 0x7c; + } + + /* Channel Number */ + p2pie[p2pielen++] = 1; + p2pie[p2pielen++] = pwdinfo->operating_channel; /* Use the listen channel as the operating channel */ + } + + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + /* Group ID Attribute */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_GROUP_ID; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen); + p2pielen += 2; + + /* Value: */ + /* p2P Device Address */ + _rtw_memcpy(p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN); + p2pielen += ETH_ALEN; + + /* SSID */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen); + p2pielen += pwdinfo->nego_ssidlen; + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen); + +#ifdef CONFIG_WFD + wfdielen = build_nego_confirm_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_invitation_request(_adapter *padapter, u8 *raddr) +{ + + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_INVIT_REQ; + u8 p2pie[255] = { 0x00 }; + u8 p2pielen = 0, i; + u8 dialogToken = 3; + u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0; + u16 len_channellist_attr = 0; +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + return; + + /* update attribute */ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + /* P2P IE Section. */ + + /* P2P OUI */ + p2pielen = 0; + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ + + /* Commented by Albert 20101011 */ + /* According to the P2P Specification, the P2P Invitation request frame should contain 7 P2P attributes */ + /* 1. Configuration Timeout */ + /* 2. Invitation Flags */ + /* 3. Operating Channel ( Only GO ) */ + /* 4. P2P Group BSSID ( Should be included if I am the GO ) */ + /* 5. Channel List */ + /* 6. P2P Group ID */ + /* 7. P2P Device Info */ + + /* Configuration Timeout */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); + p2pielen += 2; + + /* Value: */ + p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */ + p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */ + + /* Invitation Flags */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_INVITATION_FLAGS; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); + p2pielen += 2; + + /* Value: */ + p2pie[p2pielen++] = P2P_INVITATION_FLAGS_PERSISTENT; + + + /* Operating Channel */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Operating Class */ + if (pwdinfo->invitereq_info.operating_ch <= 14) + p2pie[p2pielen++] = 0x51; + else if ((pwdinfo->invitereq_info.operating_ch >= 36) && (pwdinfo->invitereq_info.operating_ch <= 48)) + p2pie[p2pielen++] = 0x73; + else + p2pie[p2pielen++] = 0x7c; + + /* Channel Number */ + p2pie[p2pielen++] = pwdinfo->invitereq_info.operating_ch; /* operating channel number */ + + if (_rtw_memcmp(adapter_mac_addr(padapter), pwdinfo->invitereq_info.go_bssid, ETH_ALEN)) { + /* P2P Group BSSID */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN); + p2pielen += 2; + + /* Value: */ + /* P2P Device Address for GO */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN); + p2pielen += ETH_ALEN; + } + + /* Channel List */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CH_LIST; + + + /* Length: */ + /* Country String(3) */ + /* + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?) */ + /* + number of channels in all classes */ + len_channellist_attr = 3 + + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes + + get_reg_classes_full_count(pmlmeext->channel_list); + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(5 + 1); + else + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); +#else + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); +#endif + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Channel Entry List */ +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + u8 union_ch = rtw_mi_get_union_chan(padapter); + + /* Operating Class */ + if (union_ch > 14) { + if (union_ch >= 149) + p2pie[p2pielen++] = 0x7c; + else + p2pie[p2pielen++] = 0x73; + } else + p2pie[p2pielen++] = 0x51; + + + /* Number of Channels */ + /* Just support 1 channel and this channel is AP's channel */ + p2pie[p2pielen++] = 1; + + /* Channel List */ + p2pie[p2pielen++] = union_ch; + } else { + int i, j; + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { + /* Operating Class */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; + + /* Number of Channels */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; + + /* Channel List */ + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; + } + } +#else /* CONFIG_CONCURRENT_MODE */ + { + int i, j; + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { + /* Operating Class */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; + + /* Number of Channels */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; + + /* Channel List */ + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; + } + } +#endif /* CONFIG_CONCURRENT_MODE */ + + + /* P2P Group ID */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_GROUP_ID; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(6 + pwdinfo->invitereq_info.ssidlen); + p2pielen += 2; + + /* Value: */ + /* P2P Device Address for GO */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN); + p2pielen += ETH_ALEN; + + /* SSID */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_ssid, pwdinfo->invitereq_info.ssidlen); + p2pielen += pwdinfo->invitereq_info.ssidlen; + + + /* Device Info */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; + + /* Length: */ + /* 21->P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ + /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); + p2pielen += 2; + + /* Value: */ + /* P2P Device Address */ + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); + p2pielen += ETH_ALEN; + + /* Config Method */ + /* This field should be big endian. Noted by P2P specification. */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY); + p2pielen += 2; + + /* Primary Device Type */ + /* Category ID */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); + p2pielen += 2; + + /* OUI */ + *(u32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI); + p2pielen += 4; + + /* Sub Category ID */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); + p2pielen += 2; + + /* Number of Secondary Device Types */ + p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ + + /* Device Name */ + /* Type: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); + p2pielen += 2; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); + p2pielen += 2; + + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); + p2pielen += pwdinfo->device_name_len; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen); + +#ifdef CONFIG_WFD + wfdielen = build_invitation_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_invitation_response(_adapter *padapter, u8 *raddr, u8 dialogToken, u8 status_code) +{ + + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_INVIT_RESP; + u8 p2pie[255] = { 0x00 }; + u8 p2pielen = 0, i; + u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0; + u16 len_channellist_attr = 0; +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + return; + + /* update attribute */ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + /* P2P IE Section. */ + + /* P2P OUI */ + p2pielen = 0; + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ + + /* Commented by Albert 20101005 */ + /* According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes */ + /* 1. Status */ + /* 2. Configuration Timeout */ + /* 3. Operating Channel ( Only GO ) */ + /* 4. P2P Group BSSID ( Only GO ) */ + /* 5. Channel List */ + + /* P2P Status */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_STATUS; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0001); + p2pielen += 2; + + /* Value: */ + /* When status code is P2P_STATUS_FAIL_INFO_UNAVAILABLE. */ + /* Sent the event receiving the P2P Invitation Req frame to DMP UI. */ + /* DMP had to compare the MAC address to find out the profile. */ + /* So, the WiFi driver will send the P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB. */ + /* If the UI found the corresponding profile, the WiFi driver sends the P2P Invitation Req */ + /* to NB to rebuild the persistent group. */ + p2pie[p2pielen++] = status_code; + + /* Configuration Timeout */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); + p2pielen += 2; + + /* Value: */ + p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P GO */ + p2pie[p2pielen++] = 200; /* 2 seconds needed to be the P2P Client */ + + if (status_code == P2P_STATUS_SUCCESS) { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + /* The P2P Invitation request frame asks this Wi-Fi device to be the P2P GO */ + /* In this case, the P2P Invitation response frame should carry the two more P2P attributes. */ + /* First one is operating channel attribute. */ + /* Second one is P2P Group BSSID attribute. */ + + /* Operating Channel */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Operating Class */ + p2pie[p2pielen++] = 0x51; /* Copy from SD7 */ + + /* Channel Number */ + p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */ + + + /* P2P Group BSSID */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(ETH_ALEN); + p2pielen += 2; + + /* Value: */ + /* P2P Device Address for GO */ + _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); + p2pielen += ETH_ALEN; + + } + + /* Channel List */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CH_LIST; + + /* Length: */ + /* Country String(3) */ + /* + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?) */ + /* + number of channels in all classes */ + len_channellist_attr = 3 + + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes + + get_reg_classes_full_count(pmlmeext->channel_list); + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(5 + 1); + else + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); +#else + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(len_channellist_attr); +#endif + p2pielen += 2; + + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Channel Entry List */ +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + u8 union_ch = rtw_mi_get_union_chan(padapter); + + /* Operating Class */ + if (union_ch > 14) { + if (union_ch >= 149) + p2pie[p2pielen++] = 0x7c; + else + p2pie[p2pielen++] = 0x73; + } else + p2pie[p2pielen++] = 0x51; + + + /* Number of Channels */ + /* Just support 1 channel and this channel is AP's channel */ + p2pie[p2pielen++] = 1; + + /* Channel List */ + p2pie[p2pielen++] = union_ch; + } else { + int i, j; + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { + /* Operating Class */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; + + /* Number of Channels */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; + + /* Channel List */ + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; + } + } +#else /* CONFIG_CONCURRENT_MODE */ + { + int i, j; + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) { + /* Operating Class */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class; + + /* Number of Channels */ + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels; + + /* Channel List */ + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i]; + } + } +#endif /* CONFIG_CONCURRENT_MODE */ + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen); + +#ifdef CONFIG_WFD + wfdielen = build_invitation_resp_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_provision_request(_adapter *padapter, u8 *pssid, u8 ussidlen, u8 *pdev_raddr) +{ + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u8 dialogToken = 1; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PROVISION_DISC_REQ; + u8 wpsie[100] = { 0x00 }; + u8 wpsielen = 0; + u32 p2pielen = 0; +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + return; + + RTW_INFO("[%s] In\n", __FUNCTION__); + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -5633,52 +5548,52 @@ void issue_p2p_provision_request(_adapter *padapter, u8* pssid, u8 ussidlen, u8* 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, pssid, ussidlen, pdev_raddr ); + p2pielen = build_prov_disc_request_p2p_ie(pwdinfo, pframe, pssid, ussidlen, pdev_raddr); pframe += p2pielen; pattrib->pktlen += p2pielen; wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + /* WPS OUI */ + *(u32 *)(wpsie) = cpu_to_be32(WPSOUI); wpsielen += 4; - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + /* WPS version */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); wpsielen += 2; - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + /* Value: */ + wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ - // Config Method - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + /* Config Method */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); wpsielen += 2; - // Value: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request ); + /* Value: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->tx_prov_disc_info.wps_config_method_request); wpsielen += 2; - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen); #ifdef CONFIG_WFD wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe); pframe += wfdielen; pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD +#endif pattrib->last_txcmdsz = pattrib->pktlen; @@ -5689,26 +5604,24 @@ void issue_p2p_provision_request(_adapter *padapter, u8* pssid, u8 ussidlen, u8* } -u8 is_matched_in_profilelist( u8* peermacaddr, struct profile_info* profileinfo ) +u8 is_matched_in_profilelist(u8 *peermacaddr, struct profile_info *profileinfo) { u8 i, match_result = 0; - DBG_871X( "[%s] peermac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, - peermacaddr[0], peermacaddr[1],peermacaddr[2],peermacaddr[3],peermacaddr[4],peermacaddr[5]); - - for( i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++ ) - { - DBG_871X( "[%s] profileinfo_mac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, - profileinfo->peermac[0], profileinfo->peermac[1],profileinfo->peermac[2],profileinfo->peermac[3],profileinfo->peermac[4],profileinfo->peermac[5]); - if ( _rtw_memcmp( peermacaddr, profileinfo->peermac, ETH_ALEN ) ) - { + RTW_INFO("[%s] peermac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, + peermacaddr[0], peermacaddr[1], peermacaddr[2], peermacaddr[3], peermacaddr[4], peermacaddr[5]); + + for (i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++) { + RTW_INFO("[%s] profileinfo_mac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, + profileinfo->peermac[0], profileinfo->peermac[1], profileinfo->peermac[2], profileinfo->peermac[3], profileinfo->peermac[4], profileinfo->peermac[5]); + if (_rtw_memcmp(peermacaddr, profileinfo->peermac, ETH_ALEN)) { match_result = 1; - DBG_871X( "[%s] Match!\n", __FUNCTION__ ); + RTW_INFO("[%s] Match!\n", __FUNCTION__); break; } } - - return (match_result ); + + return match_result ; } void issue_probersp_p2p(_adapter *padapter, unsigned char *da) @@ -5717,13 +5630,13 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) struct pkt_attrib *pattrib; unsigned char *pframe; struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; + unsigned short *fctrl; unsigned char *mac; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + /* WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); */ u16 beacon_interval = 100; u16 capInfo = 0; struct wifidirect_info *pwdinfo = &(padapter->wdinfo); @@ -5731,294 +5644,287 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) u32 wpsielen = 0, p2pielen = 0; #ifdef CONFIG_WFD u32 wfdielen = 0; -#endif //CONFIG_WFD +#endif #ifdef CONFIG_INTEL_WIDI u8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 }; -#endif //CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ - //DBG_871X("%s\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + /* RTW_INFO("%s\n", __FUNCTION__); */ + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; - } - - //update attribute + + /* update attribute */ pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - + update_mgntframe_attrib(padapter, pattrib); + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + mac = adapter_mac_addr(padapter); - + fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); - - // Use the device address for BSSID field. + + /* Use the device address for BSSID field. */ _rtw_memcpy(pwlanhdr->addr3, mac, ETH_ALEN); SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; SetFrameSubType(fctrl, WIFI_PROBERSP); - + pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); pattrib->pktlen = pattrib->hdrlen; pframe += pattrib->hdrlen; - //timestamp will be inserted by hardware + /* timestamp will be inserted by hardware */ pframe += 8; pattrib->pktlen += 8; - // beacon interval: 2 bytes - _rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2); + /* beacon interval: 2 bytes */ + _rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2); pframe += 2; pattrib->pktlen += 2; - // capability info: 2 bytes - // ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec) + /* capability info: 2 bytes */ + /* ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec) */ capInfo |= cap_ShortPremble; capInfo |= cap_ShortSlot; - + _rtw_memcpy(pframe, (unsigned char *) &capInfo, 2); pframe += 2; pattrib->pktlen += 2; - // SSID + /* SSID */ pframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen); - // supported rates... - // Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 ) + /* supported rates... */ + /* Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 ) */ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); - // DS parameter set + /* DS parameter set */ pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen); #ifdef CONFIG_IOCTL_CFG80211 - if(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if( pmlmepriv->wps_probe_resp_ie != NULL && pmlmepriv->p2p_probe_resp_ie != NULL ) - { - //WPS IE + if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211) { + if (pmlmepriv->wps_probe_resp_ie != NULL && pmlmepriv->p2p_probe_resp_ie != NULL) { + /* WPS IE */ _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len); pattrib->pktlen += pmlmepriv->wps_probe_resp_ie_len; pframe += pmlmepriv->wps_probe_resp_ie_len; - //P2P IE + /* P2P IE */ _rtw_memcpy(pframe, pmlmepriv->p2p_probe_resp_ie, pmlmepriv->p2p_probe_resp_ie_len); pattrib->pktlen += pmlmepriv->p2p_probe_resp_ie_len; pframe += pmlmepriv->p2p_probe_resp_ie_len; } - } - else -#endif //CONFIG_IOCTL_CFG80211 + } else +#endif /* CONFIG_IOCTL_CFG80211 */ { - // Todo: WPS IE - // Noted by Albert 20100907 - // According to the WPS specification, all the WPS attribute is presented by Big Endian. + /* Todo: WPS IE */ + /* Noted by Albert 20100907 */ + /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */ wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + /* WPS OUI */ + *(u32 *)(wpsie) = cpu_to_be32(WPSOUI); wpsielen += 4; - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + /* WPS version */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); wpsielen += 2; - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + /* Value: */ + wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ #ifdef CONFIG_INTEL_WIDI - // Commented by Kurt - // Appended WiDi info. only if we did issued_probereq_widi(), and then we saved ven. ext. in pmlmepriv->sa_ext. - if( _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE - || pmlmepriv->num_p2p_sdt != 0 ) - { - //Sec dev type - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SEC_DEV_TYPE_LIST ); + /* Commented by Kurt */ + /* Appended WiDi info. only if we did issued_probereq_widi(), and then we saved ven. ext. in pmlmepriv->sa_ext. */ + if (_rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE + || pmlmepriv->num_p2p_sdt != 0) { + /* Sec dev type */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_SEC_DEV_TYPE_LIST); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0008); wpsielen += 2; - // Value: - // Category ID - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_DISPLAYS ); + /* Value: */ + /* Category ID */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_CID_DISPLAYS); wpsielen += 2; - // OUI - *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( INTEL_DEV_TYPE_OUI ); + /* OUI */ + *(u32 *)(wpsie + wpsielen) = cpu_to_be32(INTEL_DEV_TYPE_OUI); wpsielen += 4; - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_WIDI_CONSUMER_SINK ); + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_SCID_WIDI_CONSUMER_SINK); wpsielen += 2; - if( _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE ) - { - // Vendor Extension - _rtw_memcpy( wpsie + wpsielen, pmlmepriv->sa_ext, L2SDTA_SERVICE_VE_LEN ); + if (_rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE) { + /* Vendor Extension */ + _rtw_memcpy(wpsie + wpsielen, pmlmepriv->sa_ext, L2SDTA_SERVICE_VE_LEN); wpsielen += L2SDTA_SERVICE_VE_LEN; } } -#endif //CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ - // WiFi Simple Config State - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE ); + /* WiFi Simple Config State */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_SIMPLE_CONF_STATE); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); wpsielen += 2; - // Value: - wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; // Not Configured. + /* Value: */ + wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; /* Not Configured. */ - // Response Type - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE ); + /* Response Type */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_RESP_TYPE); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); wpsielen += 2; - // Value: + /* Value: */ wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X; - // UUID-E - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); + /* UUID-E */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_UUID_E); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0010); wpsielen += 2; - // Value: + /* Value: */ if (pwdinfo->external_uuid == 0) { - _rtw_memset( wpsie + wpsielen, 0x0, 16 ); + _rtw_memset(wpsie + wpsielen, 0x0, 16); _rtw_memcpy(wpsie + wpsielen, mac, ETH_ALEN); - } else { - _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 ); - } + } else + _rtw_memcpy(wpsie + wpsielen, pwdinfo->uuid, 0x10); wpsielen += 0x10; - // Manufacturer - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER ); + /* Manufacturer */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MANUFACTURER); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0007); wpsielen += 2; - // Value: - _rtw_memcpy( wpsie + wpsielen, "Realtek", 7 ); + /* Value: */ + _rtw_memcpy(wpsie + wpsielen, "Realtek", 7); wpsielen += 7; - // Model Name - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME ); + /* Model Name */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NAME); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 ); - wpsielen += 2; + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0006); + wpsielen += 2; - // Value: - _rtw_memcpy( wpsie + wpsielen, "8192CU", 6 ); + /* Value: */ + _rtw_memcpy(wpsie + wpsielen, "8192CU", 6); wpsielen += 6; - // Model Number - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER ); + /* Model Number */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NUMBER); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); wpsielen += 2; - // Value: - wpsie[ wpsielen++ ] = 0x31; // character 1 + /* Value: */ + wpsie[wpsielen++] = 0x31; /* character 1 */ - // Serial Number - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER ); + /* Serial Number */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_SERIAL_NUMBER); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(ETH_ALEN); wpsielen += 2; - // Value: - _rtw_memcpy( wpsie + wpsielen, "123456" , ETH_ALEN ); + /* Value: */ + _rtw_memcpy(wpsie + wpsielen, "123456" , ETH_ALEN); wpsielen += ETH_ALEN; - // Primary Device Type - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + /* Primary Device Type */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0008); wpsielen += 2; - // Value: - // Category ID - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + /* Value: */ + /* Category ID */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); wpsielen += 2; - // OUI - *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); + /* OUI */ + *(u32 *)(wpsie + wpsielen) = cpu_to_be32(WPSOUI); wpsielen += 4; - // Sub Category ID - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + /* Sub Category ID */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); wpsielen += 2; - // Device Name - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + /* Device Name */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->device_name_len); wpsielen += 2; - // Value: - _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); + /* Value: */ + _rtw_memcpy(wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len); wpsielen += pwdinfo->device_name_len; - // Config Method - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + /* Config Method */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); wpsielen += 2; - // Value: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + /* Value: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->supported_wps_cm); wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen); + p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe); pframe += p2pielen; @@ -6026,30 +5932,16 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) } #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if ( _TRUE == pwdinfo->wfd_info->wfd_enable ) -#endif //CONFIG_IOCTL_CFG80211 - { - wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } -#ifdef CONFIG_IOCTL_CFG80211 - else if (pmlmepriv->wfd_probe_resp_ie != NULL && pmlmepriv->wfd_probe_resp_ie_len>0) - { - //WFD IE - _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, pmlmepriv->wfd_probe_resp_ie_len); - pattrib->pktlen += pmlmepriv->wfd_probe_resp_ie_len; - pframe += pmlmepriv->wfd_probe_resp_ie_len; - } -#endif //CONFIG_IOCTL_CFG80211 -#endif //CONFIG_WFD + wfdielen = rtw_append_probe_resp_wfd_ie(padapter, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif pattrib->last_txcmdsz = pattrib->pktlen; - + dump_mgntframe(padapter, pmgntframe); - + return; } @@ -6069,22 +5961,21 @@ int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); int bssrate_len = 0; u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - u8 wpsie[255] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 }; u16 wpsielen = 0, p2pielen = 0; #ifdef CONFIG_WFD u32 wfdielen = 0; -#endif //CONFIG_WFD +#endif struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) goto exit; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -6103,15 +5994,12 @@ int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, da, ETH_ALEN); } else { - if ( ( pwdinfo->p2p_info.scan_op_ch_only ) || ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) ) - { - // This two flags will be set when this is only the P2P client mode. + if ((pwdinfo->p2p_info.scan_op_ch_only) || (pwdinfo->rx_invitereq_info.scan_op_ch_only)) { + /* This two flags will be set when this is only the P2P client mode. */ _rtw_memcpy(pwlanhdr->addr1, pwdinfo->p2p_peer_interface_addr, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, pwdinfo->p2p_peer_interface_addr, ETH_ALEN); - } - else - { - // broadcast probe request frame + } else { + /* broadcast probe request frame */ _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); } @@ -6122,277 +6010,252 @@ int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_PROBEREQ); - pframe += sizeof (struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) - { + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) pframe = rtw_set_ie(pframe, _SSID_IE_, pwdinfo->tx_prov_disc_info.ssid.SsidLength, pwdinfo->tx_prov_disc_info.ssid.Ssid, &(pattrib->pktlen)); - } else - { pframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &(pattrib->pktlen)); - } - // Use the OFDM rate in the P2P probe request frame. ( 6(B), 9(B), 12(B), 24(B), 36, 48, 54 ) + /* Use the OFDM rate in the P2P probe request frame. ( 6(B), 9(B), 12(B), 24(B), 36, 48, 54 ) */ pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); #ifdef CONFIG_IOCTL_CFG80211 - if(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if( pmlmepriv->wps_probe_req_ie != NULL && pmlmepriv->p2p_probe_req_ie != NULL ) - { - //WPS IE + if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211) { + if (pmlmepriv->wps_probe_req_ie != NULL && pmlmepriv->p2p_probe_req_ie != NULL) { + /* WPS IE */ _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len); pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len; pframe += pmlmepriv->wps_probe_req_ie_len; - //P2P IE + /* P2P IE */ _rtw_memcpy(pframe, pmlmepriv->p2p_probe_req_ie, pmlmepriv->p2p_probe_req_ie_len); pattrib->pktlen += pmlmepriv->p2p_probe_req_ie_len; pframe += pmlmepriv->p2p_probe_req_ie_len; } - } - else -#endif //CONFIG_IOCTL_CFG80211 + } else +#endif /* CONFIG_IOCTL_CFG80211 */ { - // WPS IE - // Noted by Albert 20110221 - // According to the WPS specification, all the WPS attribute is presented by Big Endian. + /* WPS IE */ + /* Noted by Albert 20110221 */ + /* According to the WPS specification, all the WPS attribute is presented by Big Endian. */ wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + /* WPS OUI */ + *(u32 *)(wpsie) = cpu_to_be32(WPSOUI); wpsielen += 4; - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + /* WPS version */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); wpsielen += 2; - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + /* Value: */ + wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ - if( pmlmepriv->wps_probe_req_ie == NULL ) - { - // UUID-E - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); + if (pmlmepriv->wps_probe_req_ie == NULL) { + /* UUID-E */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_UUID_E); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0010); wpsielen += 2; - // Value: + /* Value: */ if (pwdinfo->external_uuid == 0) { - _rtw_memset( wpsie + wpsielen, 0x0, 16 ); + _rtw_memset(wpsie + wpsielen, 0x0, 16); _rtw_memcpy(wpsie + wpsielen, mac, ETH_ALEN); - } else { - _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 ); - } + } else + _rtw_memcpy(wpsie + wpsielen, pwdinfo->uuid, 0x10); wpsielen += 0x10; - // Config Method - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + /* Config Method */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); wpsielen += 2; - // Value: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + /* Value: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->supported_wps_cm); wpsielen += 2; } - // Device Name - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + /* Device Name */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->device_name_len); wpsielen += 2; - // Value: - _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); + /* Value: */ + _rtw_memcpy(wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len); wpsielen += pwdinfo->device_name_len; - // Primary Device Type - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + /* Primary Device Type */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0008); wpsielen += 2; - // Value: - // Category ID - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + /* Value: */ + /* Category ID */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_CID_RTK_WIDI); wpsielen += 2; - // OUI - *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); + /* OUI */ + *(u32 *)(wpsie + wpsielen) = cpu_to_be32(WPSOUI); wpsielen += 4; - // Sub Category ID - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + /* Sub Category ID */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_PDT_SCID_RTK_DMP); wpsielen += 2; - // Device Password ID - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); + /* Device Password ID */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); wpsielen += 2; - // Value: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); // Registrar-specified - wpsielen += 2; + /* Value: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC); /* Registrar-specified */ + wpsielen += 2; - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - // P2P OUI + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen); + + /* P2P OUI */ p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ - // Commented by Albert 20110221 - // According to the P2P Specification, the probe request frame should contain 5 P2P attributes - // 1. P2P Capability - // 2. P2P Device ID if this probe request wants to find the specific P2P device - // 3. Listen Channel - // 4. Extended Listen Timing - // 5. Operating Channel if this WiFi is working as the group owner now + /* Commented by Albert 20110221 */ + /* According to the P2P Specification, the probe request frame should contain 5 P2P attributes */ + /* 1. P2P Capability */ + /* 2. P2P Device ID if this probe request wants to find the specific P2P device */ + /* 3. Listen Channel */ + /* 4. Extended Listen Timing */ + /* 5. Operating Channel if this WiFi is working as the group owner now */ - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + /* P2P Capability */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); p2pielen += 2; - // Value: - // Device Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; - - // Group Capability Bitmap, 1 byte - if ( pwdinfo->persistent_supported ) - p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; + + /* Group Capability Bitmap, 1 byte */ + if (pwdinfo->persistent_supported) + p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; else - p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT; + p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT; - // Listen Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; + /* Listen Channel */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH; - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); p2pielen += 2; - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listen channel - + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; - // Extended Listen Timing - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + /* Operating Class */ + p2pie[p2pielen++] = 0x51; /* Copy from SD7 */ - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + /* Channel Number */ + p2pie[p2pielen++] = pwdinfo->listen_channel; /* listen channel */ + + + /* Extended Listen Timing */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0004); p2pielen += 2; - // Value: - // Availability Period - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + /* Value: */ + /* Availability Period */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); p2pielen += 2; - // Availability Interval - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + /* Availability Interval */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); p2pielen += 2; - if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) ) - { - // Operating Channel (if this WiFi is working as the group owner now) - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + /* Operating Channel (if this WiFi is working as the group owner now) */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH; - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0005); p2pielen += 2; - // Value: - // Country String - p2pie[ p2pielen++ ] = 'X'; - p2pie[ p2pielen++ ] = 'X'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; + /* Value: */ + /* Country String */ + p2pie[p2pielen++] = 'X'; + p2pie[p2pielen++] = 'X'; + + /* The third byte should be set to 0x04. */ + /* Described in the "Operating Channel Attribute" section. */ + p2pie[p2pielen++] = 0x04; + + /* Operating Class */ + p2pie[p2pielen++] = 0x51; /* Copy from SD7 */ + + /* Channel Number */ + p2pie[p2pielen++] = pwdinfo->operating_channel; /* operating channel number */ - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen); } #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if ( _TRUE == pwdinfo->wfd_info->wfd_enable ) + wfdielen = rtw_append_probe_req_wfd_ie(padapter, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; #endif - { - wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } -#ifdef CONFIG_IOCTL_CFG80211 - else if (pmlmepriv->wfd_probe_req_ie != NULL && pmlmepriv->wfd_probe_req_ie_len>0) - { - //WFD IE - _rtw_memcpy(pframe, pmlmepriv->wfd_probe_req_ie, pmlmepriv->wfd_probe_req_ie_len); - pattrib->pktlen += pmlmepriv->wfd_probe_req_ie_len; - pframe += pmlmepriv->wfd_probe_req_ie_len; - } -#endif //CONFIG_IOCTL_CFG80211 -#endif //CONFIG_WFD pattrib->last_txcmdsz = pattrib->pktlen; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz)); - if (wait_ack) { + if (wait_ack) ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); - } else { + else { dump_mgntframe(padapter, pmgntframe); ret = _SUCCESS; } @@ -6417,73 +6280,63 @@ int issue_probereq_p2p_ex(_adapter *adapter, u8 *da, int try_cnt, int wait_ms) int i = 0; u32 start = rtw_get_current_time(); - do - { - ret = _issue_probereq_p2p(adapter, da, wait_ms>0?_TRUE:_FALSE); + do { + ret = _issue_probereq_p2p(adapter, da, wait_ms > 0 ? _TRUE : _FALSE); i++; if (RTW_CANNOT_RUN(adapter)) 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((iu.hdr.adapter; + _adapter *adapter = rframe->u.hdr.adapter; struct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv); - u8 *frame = recv_frame->u.hdr.rx_data; - u16 seq_ctrl = ( (recv_frame->u.hdr.attrib.seq_num&0xffff) << 4) | - (recv_frame->u.hdr.attrib.frag_num & 0xf); - + u8 *frame = rframe->u.hdr.rx_data; + u16 seq_ctrl = ((rframe->u.hdr.attrib.seq_num & 0xffff) << 4) | (rframe->u.hdr.attrib.frag_num & 0xf); + u8 token = *(rframe->u.hdr.rx_data + sizeof(struct rtw_ieee80211_hdr_3addr) + token_offset); + if (GetRetry(frame)) { - if (token >= 0) { - if ((seq_ctrl == mlmeext->action_public_rxseq) - && (token == mlmeext->action_public_dialog_token)) - { - DBG_871X(FUNC_ADPT_FMT" seq_ctrl=0x%x, rxseq=0x%x, token:%d\n", - FUNC_ADPT_ARG(adapter), seq_ctrl, mlmeext->action_public_rxseq, token); - return _FAIL; - } - } else { - if (seq_ctrl == mlmeext->action_public_rxseq) { - DBG_871X(FUNC_ADPT_FMT" seq_ctrl=0x%x, rxseq=0x%x\n", - FUNC_ADPT_ARG(adapter), seq_ctrl, mlmeext->action_public_rxseq); - return _FAIL; - } + if ((seq_ctrl == mlmeext->action_public_rxseq) + && (token == mlmeext->action_public_dialog_token) + ) { + RTW_INFO(FUNC_ADPT_FMT" seq_ctrl=0x%x, rxseq=0x%x, token:%d\n", + FUNC_ADPT_ARG(adapter), seq_ctrl, mlmeext->action_public_rxseq, token); + return _FAIL; } } - + + /* TODO: per sta seq & token */ mlmeext->action_public_rxseq = seq_ctrl; - - if (token >= 0) - mlmeext->action_public_dialog_token = token; + mlmeext->action_public_dialog_token = token; return _SUCCESS; } @@ -6494,431 +6347,364 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) u8 *pframe = precv_frame->u.hdr.rx_data; uint len = precv_frame->u.hdr.len; u8 *frame_body; - u8 dialogToken=0; #ifdef CONFIG_P2P u8 *p2p_ie; u32 p2p_ielen, wps_ielen; - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); u8 result = P2P_STATUS_SUCCESS; u8 empty_addr[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; u8 *merged_p2pie = NULL; - u32 merged_p2p_ielen= 0; -#endif //CONFIG_P2P + u32 merged_p2p_ielen = 0; +#endif /* CONFIG_P2P */ frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); - dialogToken = frame_body[7]; - - if (rtw_action_public_decache(precv_frame, dialogToken) == _FAIL) - return _FAIL; - #ifdef CONFIG_P2P - _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey ); + _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); #ifdef CONFIG_IOCTL_CFG80211 - if(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211) - { + if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211) rtw_cfg80211_rx_p2p_action_public(padapter, pframe, len); - } else -#endif //CONFIG_IOCTL_CFG80211 +#endif /* CONFIG_IOCTL_CFG80211 */ { - // Do nothing if the driver doesn't enable the P2P function. - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) + /* Do nothing if the driver doesn't enable the P2P function. */ + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) return _SUCCESS; len -= sizeof(struct rtw_ieee80211_hdr_3addr); - switch( frame_body[ 6 ] )//OUI Subtype - { - case P2P_GO_NEGO_REQ: - { - DBG_871X( "[%s] Got GO Nego Req Frame\n", __FUNCTION__); - _rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) ); + switch (frame_body[6]) { /* OUI Subtype */ + case P2P_GO_NEGO_REQ: { + RTW_INFO("[%s] Got GO Nego Req Frame\n", __FUNCTION__); + _rtw_memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info)); - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) - { - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - } + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) - { - // Commented by Albert 20110526 - // In this case, this means the previous nego fail doesn't be reset yet. - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - // Restore the previous p2p state - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - DBG_871X( "[%s] Restore the previous p2p state to %d\n", __FUNCTION__, rtw_p2p_state(pwdinfo) ); - } + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) { + /* Commented by Albert 20110526 */ + /* In this case, this means the previous nego fail doesn't be reset yet. */ + _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); + /* Restore the previous p2p state */ + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); + RTW_INFO("[%s] Restore the previous p2p state to %d\n", __FUNCTION__, rtw_p2p_state(pwdinfo)); + } #ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - _cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer ); - } -#endif // CONFIG_CONCURRENT_MODE + if (rtw_mi_buddy_check_fwstate(padapter, _FW_LINKED)) + _cancel_timer_ex(&pwdinfo->ap_p2p_switch_timer); +#endif /* CONFIG_CONCURRENT_MODE */ - // Commented by Kurt 20110902 - //Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + /* Commented by Kurt 20110902 */ + /* Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */ + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - // Commented by Kurt 20120113 - // Get peer_dev_addr here if peer doesn't issue prov_disc frame. - if( _rtw_memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr, ETH_ALEN) ) - _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); - - result = process_p2p_group_negotation_req( pwdinfo, frame_body, len ); - issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result ); -#ifdef CONFIG_INTEL_WIDI - if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) { - padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION; - _cancel_timer_ex(&(padapter->mlmepriv.listen_timer)); - intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0); - } -#endif //CONFIG_INTEL_WIDI - - // Commented by Albert 20110718 - // No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. -#ifdef CONFIG_CONCURRENT_MODE - // Commented by Albert 20120107 - _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 ); -#else // CONFIG_CONCURRENT_MODE - _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); -#endif // CONFIG_CONCURRENT_MODE - break; - } - case P2P_GO_NEGO_RESP: - { - DBG_871X( "[%s] Got GO Nego Resp Frame\n", __FUNCTION__); - - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) - { - // Commented by Albert 20110425 - // The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - pwdinfo->nego_req_info.benable = _FALSE; - result = process_p2p_group_negotation_resp( pwdinfo, frame_body, len); - issue_p2p_GO_confirm( pwdinfo->padapter, GetAddr2Ptr(pframe), result); - if ( P2P_STATUS_SUCCESS == result ) - { - if ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT ) - { - pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch; - #ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH - pwdinfo->p2p_info.operation_ch[ 1 ] = 1; //Check whether GO is operating in channel 1; - pwdinfo->p2p_info.operation_ch[ 2 ] = 6; //Check whether GO is operating in channel 6; - pwdinfo->p2p_info.operation_ch[ 3 ] = 11; //Check whether GO is operating in channel 11; - #endif //CONFIG_P2P_OP_CHK_SOCIAL_CH - pwdinfo->p2p_info.scan_op_ch_only = 1; - _set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH ); - } - } - - // Reset the dialog token for group negotiation frames. - pwdinfo->negotiation_dialog_token = 1; - - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) - { - _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); - } - } - else - { - DBG_871X( "[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __FUNCTION__); - } - - break; - } - case P2P_GO_NEGO_CONF: - { - DBG_871X( "[%s] Got GO Nego Confirm Frame\n", __FUNCTION__); - result = process_p2p_group_negotation_confirm( pwdinfo, frame_body, len); - if ( P2P_STATUS_SUCCESS == result ) - { - if ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT ) - { - pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch; - #ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH - pwdinfo->p2p_info.operation_ch[ 1 ] = 1; //Check whether GO is operating in channel 1; - pwdinfo->p2p_info.operation_ch[ 2 ] = 6; //Check whether GO is operating in channel 6; - pwdinfo->p2p_info.operation_ch[ 3 ] = 11; //Check whether GO is operating in channel 11; - #endif //CONFIG_P2P_OP_CHK_SOCIAL_CH - pwdinfo->p2p_info.scan_op_ch_only = 1; - _set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH ); - } - } - break; - } - case P2P_INVIT_REQ: - { - // Added by Albert 2010/10/05 - // Received the P2P Invite Request frame. - - DBG_871X( "[%s] Got invite request frame!\n", __FUNCTION__ ); - if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) ) - { - // Parse the necessary information from the P2P Invitation Request frame. - // For example: The MAC address of sending this P2P Invitation Request frame. - u32 attr_contentlen = 0; - u8 status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - struct group_id_info group_id; - u8 invitation_flag = 0; - int j=0; - - merged_p2p_ielen = rtw_get_p2p_merged_ies_len(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_); - - merged_p2pie = rtw_zmalloc(merged_p2p_ielen + 2); // 2 is for EID and Length - if (merged_p2pie == NULL) - { - DBG_871X( "[%s] Malloc p2p ie fail\n", __FUNCTION__); - goto exit; - } - _rtw_memset(merged_p2pie, 0x00, merged_p2p_ielen); - - merged_p2p_ielen = rtw_p2p_merge_ies(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, merged_p2pie); - - rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen); - if ( attr_contentlen ) - { - - rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen); - // Commented by Albert 20120510 - // Copy to the pwdinfo->p2p_peer_interface_addr. - // So that the WFD UI ( or Sigma ) can get the peer interface address by using the following command. - // #> iwpriv wlan0 p2p_get peer_ifa - // After having the peer interface address, the sigma can find the correct conf file for wpa_supplicant. - - if ( attr_contentlen ) - { - DBG_871X( "[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, - pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1], - pwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3], - pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5] ); - } - - if ( invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT ) - { - // Re-invoke the persistent group. - - _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) ); - 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, 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 ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_GO ); - status_code = P2P_STATUS_SUCCESS; - } - else - { - // The p2p device sending this p2p invitation request wants to be the persistent GO. - if ( is_matched_in_profilelist( pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ] ) ) - { - u8 operatingch_info[5] = { 0x00 }; - if ( rtw_get_p2p_attr_content(merged_p2pie, merged_p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) ) - { - if( rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4] ) >= 0 ) - { - // The operating channel is acceptable for this device. - pwdinfo->rx_invitereq_info.operation_ch[0]= operatingch_info[4]; - #ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH - pwdinfo->rx_invitereq_info.operation_ch[1]= 1; //Check whether GO is operating in channel 1; - pwdinfo->rx_invitereq_info.operation_ch[2]= 6; //Check whether GO is operating in channel 6; - pwdinfo->rx_invitereq_info.operation_ch[3]= 11; //Check whether GO is operating in channel 11; - #endif //CONFIG_P2P_OP_CHK_SOCIAL_CH - pwdinfo->rx_invitereq_info.scan_op_ch_only = 1; - _set_timer( &pwdinfo->reset_ch_sitesurvey, P2P_RESET_SCAN_CH ); - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); - status_code = P2P_STATUS_SUCCESS; - } - else - { - // The operating channel isn't supported by this device. - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_DEVICE ); - status_code = P2P_STATUS_FAIL_NO_COMMON_CH; - _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 ); - } - } - else - { - // Commented by Albert 20121130 - // Intel will use the different P2P IE to store the operating channel information - // Workaround for Intel WiDi 3.5 - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); - status_code = P2P_STATUS_SUCCESS; - } - } - else - { - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH ); - #ifdef CONFIG_INTEL_WIDI - _rtw_memcpy( pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); - #endif //CONFIG_INTEL_WIDI - - status_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; - } - } - } - else - { - DBG_871X( "[%s] P2P Group ID Attribute NOT FOUND!\n", __FUNCTION__ ); - status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } - } - else - { - // Received the invitation to join a P2P group. - - _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) ); - 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, 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 ); - status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } - else - { - // The p2p device sending this p2p invitation request wants to join an existing P2P group - // Commented by Albert 2012/06/28 - // In this case, this Wi-Fi device should use the iwpriv command to get the peer device address. - // The peer device address should be the destination address for the provisioning discovery request. - // Then, this Wi-Fi device should use the iwpriv command to get the peer interface address. - // The peer interface address should be the address for WPS mac address - _rtw_memcpy( pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN ); - rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); - rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN ); - status_code = P2P_STATUS_SUCCESS; - } - } - else - { - DBG_871X( "[%s] P2P Group ID Attribute NOT FOUND!\n", __FUNCTION__ ); - status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } - } - } - else - { - DBG_871X( "[%s] P2P Invitation Flags Attribute NOT FOUND!\n", __FUNCTION__ ); - status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } - - DBG_871X( "[%s] status_code = %d\n", __FUNCTION__, status_code ); - - pwdinfo->inviteresp_info.token = frame_body[ 7 ]; - issue_p2p_invitation_response( padapter, GetAddr2Ptr(pframe), pwdinfo->inviteresp_info.token, status_code ); - _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 ); - } -#ifdef CONFIG_INTEL_WIDI - if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) { - padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION; - _cancel_timer_ex(&(padapter->mlmepriv.listen_timer)); - intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0); - } -#endif //CONFIG_INTEL_WIDI - break; - } - case P2P_INVIT_RESP: - { - u8 attr_content = 0x00; - u32 attr_contentlen = 0; - - DBG_871X( "[%s] Got invite response frame!\n", __FUNCTION__ ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) ) - { - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); - - if ( attr_contentlen == 1 ) - { - DBG_871X( "[%s] Status = %d\n", __FUNCTION__, attr_content ); - pwdinfo->invitereq_info.benable = _FALSE; - - if ( attr_content == P2P_STATUS_SUCCESS ) - { - 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 - { - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ); - } - } - else - { - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ); - } - } - else - { - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ); - } - - if ( rtw_p2p_chk_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ) ) - { - _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); - } - break; - } - case P2P_DEVDISC_REQ: - - process_p2p_devdisc_req(pwdinfo, pframe, len); - - break; - - case P2P_DEVDISC_RESP: - - process_p2p_devdisc_resp(pwdinfo, pframe, len); - - break; - - case P2P_PROVISION_DISC_REQ: - DBG_871X( "[%s] Got Provisioning Discovery Request Frame\n", __FUNCTION__ ); - process_p2p_provdisc_req(pwdinfo, pframe, len); + /* Commented by Kurt 20120113 */ + /* Get peer_dev_addr here if peer doesn't issue prov_disc frame. */ + if (_rtw_memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr, ETH_ALEN)) _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); - //20110902 Kurt - //Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - - rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ); - _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); + result = process_p2p_group_negotation_req(pwdinfo, frame_body, len); + issue_p2p_GO_response(padapter, GetAddr2Ptr(pframe), frame_body, len, result); #ifdef CONFIG_INTEL_WIDI - if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) { - padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION; - _cancel_timer_ex(&(padapter->mlmepriv.listen_timer)); - intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0); - } -#endif //CONFIG_INTEL_WIDI - break; + if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) { + padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION; + _cancel_timer_ex(&(padapter->mlmepriv.listen_timer)); + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0); + } +#endif /* CONFIG_INTEL_WIDI */ - case P2P_PROVISION_DISC_RESP: - // Commented by Albert 20110707 - // Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? - DBG_871X( "[%s] Got Provisioning Discovery Response Frame\n", __FUNCTION__ ); - // Commented by Albert 20110426 - // The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP); - process_p2p_provdisc_resp(pwdinfo, pframe); - _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); - break; + /* Commented by Albert 20110718 */ + /* No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. */ +#ifdef CONFIG_CONCURRENT_MODE + /* Commented by Albert 20120107 */ + _set_timer(&pwdinfo->restore_p2p_state_timer, 3000); +#else /* CONFIG_CONCURRENT_MODE */ + _set_timer(&pwdinfo->restore_p2p_state_timer, 5000); +#endif /* CONFIG_CONCURRENT_MODE */ + break; + } + case P2P_GO_NEGO_RESP: { + RTW_INFO("[%s] Got GO Nego Resp Frame\n", __FUNCTION__); + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) { + /* Commented by Albert 20110425 */ + /* The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. */ + _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); + pwdinfo->nego_req_info.benable = _FALSE; + result = process_p2p_group_negotation_resp(pwdinfo, frame_body, len); + issue_p2p_GO_confirm(pwdinfo->padapter, GetAddr2Ptr(pframe), result); + if (P2P_STATUS_SUCCESS == result) { + if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT) { + pwdinfo->p2p_info.operation_ch[0] = pwdinfo->peer_operating_ch; +#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH + pwdinfo->p2p_info.operation_ch[1] = 1; /* Check whether GO is operating in channel 1; */ + pwdinfo->p2p_info.operation_ch[2] = 6; /* Check whether GO is operating in channel 6; */ + pwdinfo->p2p_info.operation_ch[3] = 11; /* Check whether GO is operating in channel 11; */ +#endif /* CONFIG_P2P_OP_CHK_SOCIAL_CH */ + pwdinfo->p2p_info.scan_op_ch_only = 1; + _set_timer(&pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH); + } + } + + /* Reset the dialog token for group negotiation frames. */ + pwdinfo->negotiation_dialog_token = 1; + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) + _set_timer(&pwdinfo->restore_p2p_state_timer, 5000); + } else + RTW_INFO("[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __FUNCTION__); + + break; + } + case P2P_GO_NEGO_CONF: { + RTW_INFO("[%s] Got GO Nego Confirm Frame\n", __FUNCTION__); + result = process_p2p_group_negotation_confirm(pwdinfo, frame_body, len); + if (P2P_STATUS_SUCCESS == result) { + if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT) { + pwdinfo->p2p_info.operation_ch[0] = pwdinfo->peer_operating_ch; +#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH + pwdinfo->p2p_info.operation_ch[1] = 1; /* Check whether GO is operating in channel 1; */ + pwdinfo->p2p_info.operation_ch[2] = 6; /* Check whether GO is operating in channel 6; */ + pwdinfo->p2p_info.operation_ch[3] = 11; /* Check whether GO is operating in channel 11; */ +#endif /* CONFIG_P2P_OP_CHK_SOCIAL_CH */ + pwdinfo->p2p_info.scan_op_ch_only = 1; + _set_timer(&pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH); + } + } + break; + } + case P2P_INVIT_REQ: { + /* Added by Albert 2010/10/05 */ + /* Received the P2P Invite Request frame. */ + + RTW_INFO("[%s] Got invite request frame!\n", __FUNCTION__); + p2p_ie = rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen); + if (p2p_ie) { + /* Parse the necessary information from the P2P Invitation Request frame. */ + /* For example: The MAC address of sending this P2P Invitation Request frame. */ + u32 attr_contentlen = 0; + u8 status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + struct group_id_info group_id; + u8 invitation_flag = 0; + int j = 0; + + merged_p2p_ielen = rtw_get_p2p_merged_ies_len(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_); + + merged_p2pie = rtw_zmalloc(merged_p2p_ielen + 2); /* 2 is for EID and Length */ + if (merged_p2pie == NULL) { + RTW_INFO("[%s] Malloc p2p ie fail\n", __FUNCTION__); + goto exit; + } + _rtw_memset(merged_p2pie, 0x00, merged_p2p_ielen); + + merged_p2p_ielen = rtw_p2p_merge_ies(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, merged_p2pie); + + rtw_get_p2p_attr_content(merged_p2pie, merged_p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen); + if (attr_contentlen) { + + rtw_get_p2p_attr_content(merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen); + /* Commented by Albert 20120510 */ + /* Copy to the pwdinfo->p2p_peer_interface_addr. */ + /* So that the WFD UI ( or Sigma ) can get the peer interface address by using the following command. */ + /* #> iwpriv wlan0 p2p_get peer_ifa */ + /* After having the peer interface address, the sigma can find the correct conf file for wpa_supplicant. */ + + if (attr_contentlen) { + RTW_INFO("[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, + pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1], + pwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3], + pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5]); + } + + if (invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT) { + /* Re-invoke the persistent group. */ + + _rtw_memset(&group_id, 0x00, sizeof(struct group_id_info)); + 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, 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); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); + status_code = P2P_STATUS_SUCCESS; + } else { + /* The p2p device sending this p2p invitation request wants to be the persistent GO. */ + if (is_matched_in_profilelist(pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[0])) { + u8 operatingch_info[5] = { 0x00 }; + if (rtw_get_p2p_attr_content(merged_p2pie, merged_p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, + &attr_contentlen)) { + if (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4]) >= 0) { + /* The operating channel is acceptable for this device. */ + pwdinfo->rx_invitereq_info.operation_ch[0] = operatingch_info[4]; +#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH + pwdinfo->rx_invitereq_info.operation_ch[1] = 1; /* Check whether GO is operating in channel 1; */ + pwdinfo->rx_invitereq_info.operation_ch[2] = 6; /* Check whether GO is operating in channel 6; */ + pwdinfo->rx_invitereq_info.operation_ch[3] = 11; /* Check whether GO is operating in channel 11; */ +#endif /* CONFIG_P2P_OP_CHK_SOCIAL_CH */ + pwdinfo->rx_invitereq_info.scan_op_ch_only = 1; + _set_timer(&pwdinfo->reset_ch_sitesurvey, P2P_RESET_SCAN_CH); + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); + status_code = P2P_STATUS_SUCCESS; + } else { + /* The operating channel isn't supported by this device. */ + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + status_code = P2P_STATUS_FAIL_NO_COMMON_CH; + _set_timer(&pwdinfo->restore_p2p_state_timer, 3000); + } + } else { + /* Commented by Albert 20121130 */ + /* Intel will use the different P2P IE to store the operating channel information */ + /* Workaround for Intel WiDi 3.5 */ + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); + status_code = P2P_STATUS_SUCCESS; + } + } else { + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH); +#ifdef CONFIG_INTEL_WIDI + _rtw_memcpy(pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); +#endif /* CONFIG_INTEL_WIDI */ + + status_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; + } + } + } else { + RTW_INFO("[%s] P2P Group ID Attribute NOT FOUND!\n", __FUNCTION__); + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + } + } else { + /* Received the invitation to join a P2P group. */ + + _rtw_memset(&group_id, 0x00, sizeof(struct group_id_info)); + 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, 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); + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + } else { + /* The p2p device sending this p2p invitation request wants to join an existing P2P group */ + /* Commented by Albert 2012/06/28 */ + /* In this case, this Wi-Fi device should use the iwpriv command to get the peer device address. */ + /* The peer device address should be the destination address for the provisioning discovery request. */ + /* Then, this Wi-Fi device should use the iwpriv command to get the peer interface address. */ + /* The peer interface address should be the address for WPS mac address */ + _rtw_memcpy(pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN); + status_code = P2P_STATUS_SUCCESS; + } + } else { + RTW_INFO("[%s] P2P Group ID Attribute NOT FOUND!\n", __FUNCTION__); + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + } + } + } else { + RTW_INFO("[%s] P2P Invitation Flags Attribute NOT FOUND!\n", __FUNCTION__); + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + } + + RTW_INFO("[%s] status_code = %d\n", __FUNCTION__, status_code); + + pwdinfo->inviteresp_info.token = frame_body[7]; + issue_p2p_invitation_response(padapter, GetAddr2Ptr(pframe), pwdinfo->inviteresp_info.token, status_code); + _set_timer(&pwdinfo->restore_p2p_state_timer, 3000); + } +#ifdef CONFIG_INTEL_WIDI + if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) { + padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION; + _cancel_timer_ex(&(padapter->mlmepriv.listen_timer)); + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0); + } +#endif /* CONFIG_INTEL_WIDI */ + break; + } + case P2P_INVIT_RESP: { + u8 attr_content = 0x00; + u32 attr_contentlen = 0; + + RTW_INFO("[%s] Got invite response frame!\n", __FUNCTION__); + _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); + p2p_ie = rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen); + if (p2p_ie) { + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); + + if (attr_contentlen == 1) { + RTW_INFO("[%s] Status = %d\n", __FUNCTION__, attr_content); + pwdinfo->invitereq_info.benable = _FALSE; + + if (attr_content == P2P_STATUS_SUCCESS) { + 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 { + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL); + } + } else { + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL); + } + } else { + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL); + } + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL)) + _set_timer(&pwdinfo->restore_p2p_state_timer, 5000); + break; + } + case P2P_DEVDISC_REQ: + + process_p2p_devdisc_req(pwdinfo, pframe, len); + + break; + + case P2P_DEVDISC_RESP: + + process_p2p_devdisc_resp(pwdinfo, pframe, len); + + break; + + case P2P_PROVISION_DISC_REQ: + RTW_INFO("[%s] Got Provisioning Discovery Request Frame\n", __FUNCTION__); + process_p2p_provdisc_req(pwdinfo, pframe, len); + _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); + + /* 20110902 Kurt */ + /* Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */ + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ); + _set_timer(&pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT); +#ifdef CONFIG_INTEL_WIDI + if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) { + padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION; + _cancel_timer_ex(&(padapter->mlmepriv.listen_timer)); + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0); + } +#endif /* CONFIG_INTEL_WIDI */ + break; + + case P2P_PROVISION_DISC_RESP: + /* Commented by Albert 20110707 */ + /* Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? */ + RTW_INFO("[%s] Got Provisioning Discovery Response Frame\n", __FUNCTION__); + /* Commented by Albert 20110426 */ + /* The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. */ + _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP); + process_p2p_provdisc_resp(pwdinfo, pframe); + _set_timer(&pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT); + break; } } @@ -6926,11 +6712,9 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) exit: - if(merged_p2pie) - { + if (merged_p2pie) rtw_mfree(merged_p2pie, merged_p2p_ielen + 2); - } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ return _SUCCESS; } @@ -6942,9 +6726,16 @@ unsigned int on_action_public_vendor(union recv_frame *precv_frame) u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); if (_rtw_memcmp(frame_body + 2, P2P_OUI, 4) == _TRUE) { + if (rtw_action_public_decache(precv_frame, 7) == _FAIL) + goto exit; + + if (!hal_chk_wl_func(precv_frame->u.hdr.adapter, WL_FUNC_MIRACAST)) + rtw_rframe_del_wfd_ie(precv_frame, 8); + ret = on_action_public_p2p(precv_frame); } +exit: return ret; } @@ -6961,16 +6752,16 @@ unsigned int on_action_public_default(union recv_frame *precv_frame, u8 action) token = frame_body[2]; - if (rtw_action_public_decache(precv_frame, token) == _FAIL) + if (rtw_action_public_decache(precv_frame, 2) == _FAIL) goto exit; - #ifdef CONFIG_IOCTL_CFG80211 - cnt += sprintf((msg+cnt), "%s(token:%u)", action_public_str(action), token); +#ifdef CONFIG_IOCTL_CFG80211 + cnt += sprintf((msg + cnt), "%s(token:%u)", action_public_str(action), token); rtw_cfg80211_rx_action(adapter, pframe, frame_len, msg); - #endif +#endif ret = _SUCCESS; - + exit: return ret; } @@ -7037,11 +6828,11 @@ unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame) if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) rtw_process_ht_action_smps(padapter, GetAddr2Ptr(pframe), frame_body[2]); #endif /*CONFIG_AP_MODE*/ -#endif /*CONFIG_80211N_HT*/ - break; +#endif /*CONFIG_80211N_HT*/ + break; case RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING: #ifdef CONFIG_BEAMFORMING - /*DBG_871X("RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING\n");*/ + /*RTW_INFO("RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING\n");*/ beamforming_get_report_frame(padapter, precv_frame); #endif /*CONFIG_BEAMFORMING*/ break; @@ -7064,42 +6855,40 @@ unsigned int OnAction_sa_query(_adapter *padapter, union recv_frame *precv_frame struct sta_priv *pstapriv = &padapter->stapriv; struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); u16 tid; - //Baron - - DBG_871X("OnAction_sa_query\n"); - - switch (pframe[WLAN_HDR_A3_LEN+1]) - { - case 0: //SA Query req - _rtw_memcpy(&tid, &pframe[WLAN_HDR_A3_LEN+2], sizeof(u16)); - DBG_871X("OnAction_sa_query request,action=%d, tid=%04x, pframe=%02x-%02x\n" - , pframe[WLAN_HDR_A3_LEN+1], tid, pframe[WLAN_HDR_A3_LEN+2], pframe[WLAN_HDR_A3_LEN+3]); - issue_action_SA_Query(padapter, GetAddr2Ptr(pframe), 1, tid, IEEE80211W_RIGHT_KEY); - break; + /* Baron */ - case 1: //SA Query rsp - psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - if (psta != NULL) - _cancel_timer_ex(&psta->dot11w_expire_timer); - - _rtw_memcpy(&tid, &pframe[WLAN_HDR_A3_LEN+2], sizeof(u16)); - DBG_871X("OnAction_sa_query response,action=%d, tid=%04x, cancel timer\n", pframe[WLAN_HDR_A3_LEN+1], tid); - break; - default: - break; + RTW_INFO("OnAction_sa_query\n"); + + switch (pframe[WLAN_HDR_A3_LEN + 1]) { + case 0: /* SA Query req */ + _rtw_memcpy(&tid, &pframe[WLAN_HDR_A3_LEN + 2], sizeof(u16)); + RTW_INFO("OnAction_sa_query request,action=%d, tid=%04x, pframe=%02x-%02x\n" + , pframe[WLAN_HDR_A3_LEN + 1], tid, pframe[WLAN_HDR_A3_LEN + 2], pframe[WLAN_HDR_A3_LEN + 3]); + issue_action_SA_Query(padapter, GetAddr2Ptr(pframe), 1, tid, IEEE80211W_RIGHT_KEY); + break; + + case 1: /* SA Query rsp */ + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta != NULL) + _cancel_timer_ex(&psta->dot11w_expire_timer); + + _rtw_memcpy(&tid, &pframe[WLAN_HDR_A3_LEN + 2], sizeof(u16)); + RTW_INFO("OnAction_sa_query response,action=%d, tid=%04x, cancel timer\n", pframe[WLAN_HDR_A3_LEN + 1], tid); + break; + default: + break; } - if(0) - { + if (0) { int pp; printk("pattrib->pktlen = %d =>", pattrib->pkt_len); - for(pp=0;pp< pattrib->pkt_len; pp++) + for (pp = 0; pp < pattrib->pkt_len; pp++) printk(" %02x ", pframe[pp]); printk("\n"); - } - + } + return _SUCCESS; } -#endif //CONFIG_IEEE80211W +#endif /* CONFIG_IEEE80211W */ unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame) { @@ -7122,30 +6911,35 @@ unsigned int OnAction_vht(_adapter *padapter, union recv_frame *precv_frame) goto exit; category = frame_body[0]; - if(category != RTW_WLAN_CATEGORY_VHT) + if (category != RTW_WLAN_CATEGORY_VHT) goto exit; action = frame_body[1]; switch (action) { case RTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING: #ifdef CONFIG_BEAMFORMING - /*DBG_871X("RTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING\n");*/ + /*RTW_INFO("RTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING\n");*/ beamforming_get_report_frame(padapter, precv_frame); #endif /*CONFIG_BEAMFORMING*/ break; case RTW_WLAN_ACTION_VHT_OPMODE_NOTIFICATION: - // CategoryCode(1) + ActionCode(1) + OpModeNotification(1) - //DBG_871X("RTW_WLAN_ACTION_VHT_OPMODE_NOTIFICATION\n"); + /* CategoryCode(1) + ActionCode(1) + OpModeNotification(1) */ + /* RTW_INFO("RTW_WLAN_ACTION_VHT_OPMODE_NOTIFICATION\n"); */ psta = rtw_get_stainfo(&padapter->stapriv, whdr->addr2); if (psta) rtw_process_vht_op_mode_notify(padapter, &frame_body[2], psta); break; + case RTW_WLAN_ACTION_VHT_GROUPID_MANAGEMENT: +#ifdef CONFIG_BEAMFORMING + beamforming_get_vht_gid_mgnt_frame(padapter, precv_frame); +#endif /* CONFIG_BEAMFORMING */ + break; default: break; } exit: -#endif //CONFIG_80211AC_VHT +#endif /* CONFIG_80211AC_VHT */ return _SUCCESS; } @@ -7154,64 +6948,62 @@ unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame) { #ifdef CONFIG_P2P u8 *frame_body; - u8 category, OUI_Subtype, dialogToken=0; + u8 category, OUI_Subtype, dialogToken = 0; u8 *pframe = precv_frame->u.hdr.rx_data; uint len = precv_frame->u.hdr.len; - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - //check RA matches or not + /* check RA matches or not */ if (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN)) return _SUCCESS; frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); category = frame_body[0]; - if(category != RTW_WLAN_CATEGORY_P2P) + if (category != RTW_WLAN_CATEGORY_P2P) return _SUCCESS; - if ( cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ) != P2POUI ) + if (cpu_to_be32(*((u32 *)(frame_body + 1))) != P2POUI) return _SUCCESS; #ifdef CONFIG_IOCTL_CFG80211 if (adapter_wdev_data(padapter)->p2p_enabled - && pwdinfo->driver_interface == DRIVER_CFG80211 - ) { + && pwdinfo->driver_interface == DRIVER_CFG80211 + ) { rtw_cfg80211_rx_action_p2p(padapter, pframe, len); return _SUCCESS; - } - else -#endif //CONFIG_IOCTL_CFG80211 + } else +#endif /* CONFIG_IOCTL_CFG80211 */ { len -= sizeof(struct rtw_ieee80211_hdr_3addr); OUI_Subtype = frame_body[5]; dialogToken = frame_body[6]; - switch(OUI_Subtype) - { - case P2P_NOTICE_OF_ABSENCE: - - break; - - case P2P_PRESENCE_REQUEST: + switch (OUI_Subtype) { + case P2P_NOTICE_OF_ABSENCE: + + break; + + case P2P_PRESENCE_REQUEST: + + process_p2p_presence_req(pwdinfo, pframe, len); + + break; + + case P2P_PRESENCE_RESPONSE: + + break; + + case P2P_GO_DISC_REQUEST: + + break; + + default: + break; - process_p2p_presence_req(pwdinfo, pframe, len); - - break; - - case P2P_PRESENCE_RESPONSE: - - break; - - case P2P_GO_DISC_REQUEST: - - break; - - default: - break; - } } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ return _SUCCESS; @@ -7223,19 +7015,18 @@ unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame) unsigned char category; struct action_handler *ptable; unsigned char *frame_body; - u8 *pframe = precv_frame->u.hdr.rx_data; + u8 *pframe = precv_frame->u.hdr.rx_data; frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); - + category = frame_body[0]; - - for(i = 0; i < sizeof(OnAction_tbl)/sizeof(struct action_handler); i++) - { + + for (i = 0; i < sizeof(OnAction_tbl) / sizeof(struct action_handler); i++) { ptable = &OnAction_tbl[i]; - - if(category == ptable->num) + + if (category == ptable->num) ptable->func(padapter, precv_frame); - + } return _SUCCESS; @@ -7245,7 +7036,7 @@ unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame) unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame) { - //DBG_871X("rcvd mgt frame(%x, %x)\n", (GetFrameSubType(pframe) >> 4), *(unsigned int *)GetAddr1Ptr(pframe)); + /* RTW_INFO("rcvd mgt frame(%x, %x)\n", (GetFrameSubType(pframe) >> 4), *(unsigned int *)GetAddr1Ptr(pframe)); */ return _SUCCESS; } @@ -7260,12 +7051,13 @@ struct xmit_frame *_alloc_mgtxmitframe(struct xmit_priv *pxmitpriv, bool once) pmgntframe = rtw_alloc_xmitframe_ext(pxmitpriv); if (pmgntframe == NULL) { - DBG_871X(FUNC_ADPT_FMT" alloc xmitframe fail, once:%d\n", FUNC_ADPT_ARG(pxmitpriv->adapter), once); + RTW_INFO(FUNC_ADPT_FMT" alloc xmitframe fail, once:%d\n", FUNC_ADPT_ARG(pxmitpriv->adapter), once); goto exit; } - if ((pxmitbuf = rtw_alloc_xmitbuf_ext(pxmitpriv)) == NULL) { - DBG_871X(FUNC_ADPT_FMT" alloc xmitbuf fail\n", FUNC_ADPT_ARG(pxmitpriv->adapter)); + pxmitbuf = rtw_alloc_xmitbuf_ext(pxmitpriv); + if (pxmitbuf == NULL) { + RTW_INFO(FUNC_ADPT_FMT" alloc xmitbuf fail\n", FUNC_ADPT_ARG(pxmitpriv->adapter)); rtw_free_xmitframe(pxmitpriv, pmgntframe); pmgntframe = NULL; goto exit; @@ -7303,7 +7095,7 @@ void update_mgnt_tx_rate(_adapter *padapter, u8 rate) struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); pmlmeext->tx_rate = rate; - //DBG_871X("%s(): rate = %x\n",__FUNCTION__, rate); + /* RTW_INFO("%s(): rate = %x\n",__FUNCTION__, rate); */ } @@ -7312,10 +7104,11 @@ void update_monitor_frame_attrib(_adapter *padapter, struct pkt_attrib *pattrib) HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); u8 wireless_mode; struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct sta_info *psta = NULL; struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info *pbcmc_sta = NULL; + psta = rtw_get_stainfo(pstapriv, pattrib->ra); pbcmc_sta = rtw_get_bcmc_stainfo(padapter); @@ -7327,7 +7120,7 @@ void update_monitor_frame_attrib(_adapter *padapter, struct pkt_attrib *pattrib) pattrib->mac_id = pbcmc_sta->mac_id; else { pattrib->mac_id = 0; - DBG_871X("mgmt use mac_id 0 will affect RA\n"); + RTW_INFO("mgmt use mac_id 0 will affect RA\n"); } pattrib->qsel = QSLT_MGNT; @@ -7339,25 +7132,25 @@ void update_monitor_frame_attrib(_adapter *padapter, struct pkt_attrib *pattrib) wireless_mode = WIRELESS_11G; pattrib->raid = rtw_get_mgntframe_raid(padapter, wireless_mode); - #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 +#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 - #ifdef CONFIG_80211AC_VHT - pattrib->rate = MGN_VHT1SS_MCS9; - #else - pattrib->rate = MGN_MCS7; - #endif +#ifdef CONFIG_80211AC_VHT + pattrib->rate = MGN_VHT1SS_MCS9; +#else + pattrib->rate = MGN_MCS7; +#endif pattrib->encrypt = _NO_PRIVACY_; - pattrib->bswenc = _FALSE; + pattrib->bswenc = _FALSE; pattrib->qos_en = _FALSE; pattrib->ht_en = 1; @@ -7379,11 +7172,9 @@ void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib) { u8 wireless_mode; struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct sta_info *pbcmc_sta = NULL; - //_rtw_memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib)); + /* _rtw_memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib)); */ pbcmc_sta = rtw_get_bcmc_stainfo(padapter); @@ -7394,11 +7185,17 @@ void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib) if (pbcmc_sta) pattrib->mac_id = pbcmc_sta->mac_id; else { - pattrib->mac_id = 0; - DBG_871X("mgmt use mac_id 0 will affect RA\n"); + pattrib->mac_id = 1; /* use STA's BCMC sta-info macid */ + + if (MLME_IS_AP(padapter) || MLME_IS_GO(padapter)) + RTW_INFO("%s-"ADPT_FMT" get bcmc sta_info fail,use MACID=1\n", __func__, ADPT_ARG(padapter)); } pattrib->qsel = QSLT_MGNT; +#ifdef CONFIG_MCC_MODE + update_mcc_mgntframe_attrib(padapter, pattrib); +#endif + pattrib->pktlen = 0; if (pmlmeext->tx_rate == IEEE80211_CCK_RATE_1MB) @@ -7409,7 +7206,7 @@ void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib) pattrib->rate = pmlmeext->tx_rate; pattrib->encrypt = _NO_PRIVACY_; - pattrib->bswenc = _FALSE; + pattrib->bswenc = _FALSE; pattrib->qos_en = _FALSE; pattrib->ht_en = _FALSE; @@ -7423,24 +7220,30 @@ void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib) pattrib->mbssid = 0; pattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no; - - #ifdef CONFIG_BEAMFORMING - psta = rtw_get_stainfo(pstapriv, pattrib->ra); - if (psta) - update_attrib_txbf_info(padapter, pattrib, psta); - #endif - } void update_mgntframe_attrib_addr(_adapter *padapter, struct xmit_frame *pmgntframe) { u8 *pframe; struct pkt_attrib *pattrib = &pmgntframe->attrib; +#ifdef CONFIG_BEAMFORMING + struct sta_info *sta = NULL; +#endif /* CONFIG_BEAMFORMING */ pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; _rtw_memcpy(pattrib->ra, GetAddr1Ptr(pframe), ETH_ALEN); _rtw_memcpy(pattrib->ta, GetAddr2Ptr(pframe), ETH_ALEN); + +#ifdef CONFIG_BEAMFORMING + sta = pattrib->psta; + if (!sta) { + sta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + pattrib->psta = sta; + } + if (sta) + update_attrib_txbf_info(padapter, pattrib, sta); +#endif /* CONFIG_BEAMFORMING */ } void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe) @@ -7458,7 +7261,7 @@ s32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, i { s32 ret = _FAIL; _irqL irqL; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct xmit_buf *pxmitbuf = pmgntframe->pxmitbuf; struct submit_ctx sctx; @@ -7480,20 +7283,15 @@ s32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, i pxmitbuf->sctx = NULL; _exit_critical(&pxmitpriv->lock_sctx, &irqL); - return ret; + return ret; } -s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntframe) +s32 dump_mgntframe_and_wait_ack_timeout(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms) { #ifdef CONFIG_XMIT_ACK static u8 seq_no = 0; s32 ret = _FAIL; - u32 timeout_ms = 500;// 500ms - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - #ifdef CONFIG_CONCURRENT_MODE - if (padapter->pbuddy_adapter && !padapter->isprimary) - pxmitpriv = &(padapter->pbuddy_adapter->xmitpriv); - #endif + struct xmit_priv *pxmitpriv = &(GET_PRIMARY_ADAPTER(padapter))->xmitpriv; if (RTW_CANNOT_RUN(padapter)) { rtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf); @@ -7517,52 +7315,75 @@ s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntfram pxmitpriv->ack_tx = _FALSE; _exit_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL); - return ret; -#else //!CONFIG_XMIT_ACK + return ret; +#else /* !CONFIG_XMIT_ACK */ dump_mgntframe(padapter, pmgntframe); rtw_msleep_os(50); return _SUCCESS; -#endif //!CONFIG_XMIT_ACK +#endif /* !CONFIG_XMIT_ACK */ } +s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntframe) +{ + /* In this case, use 500 ms as the default wait_ack timeout */ + return dump_mgntframe_and_wait_ack_timeout(padapter, pmgntframe, 500); +} + + int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode) { u8 *ssid_ie; sint ssid_len_ori; int len_diff = 0; - + ssid_ie = rtw_get_ie(ies, WLAN_EID_SSID, &ssid_len_ori, ies_len); - //DBG_871X("%s hidden_ssid_mode:%u, ssid_ie:%p, ssid_len_ori:%d\n", __FUNCTION__, hidden_ssid_mode, ssid_ie, ssid_len_ori); - - if(ssid_ie && ssid_len_ori>0) - { - switch(hidden_ssid_mode) - { - case 1: - { - u8 *next_ie = ssid_ie + 2 + ssid_len_ori; - u32 remain_len = 0; - - remain_len = ies_len -(next_ie-ies); - - ssid_ie[1] = 0; - _rtw_memcpy(ssid_ie+2, next_ie, remain_len); - len_diff -= ssid_len_ori; - - break; - } - case 2: - _rtw_memset(&ssid_ie[2], 0, ssid_len_ori); - break; - default: - break; + /* RTW_INFO("%s hidden_ssid_mode:%u, ssid_ie:%p, ssid_len_ori:%d\n", __FUNCTION__, hidden_ssid_mode, ssid_ie, ssid_len_ori); */ + + if (ssid_ie && ssid_len_ori > 0) { + switch (hidden_ssid_mode) { + case 1: { + u8 *next_ie = ssid_ie + 2 + ssid_len_ori; + u32 remain_len = 0; + + remain_len = ies_len - (next_ie - ies); + + ssid_ie[1] = 0; + _rtw_memcpy(ssid_ie + 2, next_ie, remain_len); + len_diff -= ssid_len_ori; + + break; + } + case 2: + _rtw_memset(&ssid_ie[2], 0, ssid_len_ori); + break; + default: + break; } } return len_diff; } +#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE +u32 rtw_build_vendor_ie(_adapter *padapter , unsigned char *pframe , u8 mgmt_frame_tyte) +{ + int vendor_ie_num = 0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u32 len = 0; + + for (vendor_ie_num = 0 ; vendor_ie_num < WLAN_MAX_VENDOR_IE_NUM ; vendor_ie_num++) { + if (pmlmepriv->vendor_ielen[vendor_ie_num] > 0 && pmlmepriv->vendor_ie_mask[vendor_ie_num] & mgmt_frame_tyte) { + _rtw_memcpy(pframe , pmlmepriv->vendor_ie[vendor_ie_num] , pmlmepriv->vendor_ielen[vendor_ie_num]); + pframe += pmlmepriv->vendor_ielen[vendor_ie_num]; + len += pmlmepriv->vendor_ielen[vendor_ie_num]; + } + } + + return len; +} +#endif + void issue_beacon(_adapter *padapter, int timeout_ms) { struct xmit_frame *pmgntframe; @@ -7572,77 +7393,78 @@ void issue_beacon(_adapter *padapter, int timeout_ms) unsigned short *fctrl; unsigned int rate_len; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) +#if defined(CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) _irqL irqL; struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); -#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) +#endif /* #if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) */ struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &(padapter->wdinfo); -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ - //DBG_871X("%s\n", __FUNCTION__); + /* RTW_INFO("%s\n", __FUNCTION__); */ #ifdef CONFIG_BCN_ICF - if ((pmgntframe = rtw_alloc_bcnxmitframe(pxmitpriv)) == NULL) + pmgntframe = rtw_alloc_bcnxmitframe(pxmitpriv); + if (pmgntframe == NULL) #else - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) #endif { - DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__); + RTW_INFO("%s, alloc mgnt frame fail\n", __FUNCTION__); return; } -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) +#if defined(CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); -#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) +#endif /* #if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) */ - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); pattrib->qsel = QSLT_BEACON; - #ifdef CONFIG_CONCURRENT_MODE - if(padapter->iface_type == IFACE_PORT1) + +#if defined(CONFIG_CONCURRENT_MODE) && (!defined(CONFIG_SWTIMER_BASED_TXBCN)) + if (padapter->hw_port == HW_PORT1) pattrib->mbssid = 1; - #endif - +#endif + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - + _rtw_memcpy(pwlanhdr->addr1, bc_addr, 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*/); - //pmlmeext->mgnt_seq++; + /* pmlmeext->mgnt_seq++; */ SetFrameSubType(pframe, WIFI_BEACON); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); - - if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - //DBG_871X("ie len=%d\n", cur_network->IELength); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { + /* RTW_INFO("ie len=%d\n", cur_network->IELength); */ #ifdef CONFIG_P2P - // for P2P : Primary Device Type & Device Name - u32 wpsielen=0, insert_len=0; - u8 *wpsie=NULL; - wpsie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen); - - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wpsie && wpsielen>0) - { + /* for P2P : Primary Device Type & Device Name */ + u32 wpsielen = 0, insert_len = 0; + u8 *wpsie = NULL; + wpsie = rtw_get_wps_ie(cur_network->IEs + _FIXED_IE_LENGTH_, cur_network->IELength - _FIXED_IE_LENGTH_, NULL, &wpsielen); + + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wpsie && wpsielen > 0) { uint wps_offset, remainder_ielen; u8 *premainder_ie, *pframe_wscie; - + wps_offset = (uint)(wpsie - cur_network->IEs); premainder_ie = wpsie + wpsielen; @@ -7650,10 +7472,8 @@ void issue_beacon(_adapter *padapter, int timeout_ms) remainder_ielen = cur_network->IELength - wps_offset - wpsielen; #ifdef CONFIG_IOCTL_CFG80211 - if(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if(pmlmepriv->wps_beacon_ie && pmlmepriv->wps_beacon_ie_len>0) - { + if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211) { + if (pmlmepriv->wps_beacon_ie && pmlmepriv->wps_beacon_ie_len > 0) { _rtw_memcpy(pframe, cur_network->IEs, wps_offset); pframe += wps_offset; pattrib->pktlen += wps_offset; @@ -7662,100 +7482,95 @@ void issue_beacon(_adapter *padapter, int timeout_ms) pframe += pmlmepriv->wps_beacon_ie_len; pattrib->pktlen += pmlmepriv->wps_beacon_ie_len; - //copy remainder_ie to pframe + /* copy remainder_ie to pframe */ _rtw_memcpy(pframe, premainder_ie, remainder_ielen); - pframe += remainder_ielen; + pframe += remainder_ielen; pattrib->pktlen += remainder_ielen; - } - else - { + } else { _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); pframe += cur_network->IELength; pattrib->pktlen += cur_network->IELength; } - } - else -#endif //CONFIG_IOCTL_CFG80211 + } else +#endif /* CONFIG_IOCTL_CFG80211 */ { pframe_wscie = pframe + wps_offset; - _rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen); - pframe += (wps_offset + wpsielen); + _rtw_memcpy(pframe, cur_network->IEs, wps_offset + wpsielen); + pframe += (wps_offset + wpsielen); pattrib->pktlen += (wps_offset + wpsielen); - //now pframe is end of wsc ie, insert Primary Device Type & Device Name - // Primary Device Type - // Type: - *(u16*) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); - insert_len += 2; - - // Length: - *(u16*) ( pframe + insert_len ) = cpu_to_be16( 0x0008 ); - insert_len += 2; - - // Value: - // Category ID - *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + /* now pframe is end of wsc ie, insert Primary Device Type & Device Name */ + /* Primary Device Type */ + /* Type: */ + *(u16 *)(pframe + insert_len) = cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE); insert_len += 2; - // OUI - *(u32*) ( pframe + insert_len ) = cpu_to_be32( WPSOUI ); + /* Length: */ + *(u16 *)(pframe + insert_len) = cpu_to_be16(0x0008); + insert_len += 2; + + /* Value: */ + /* Category ID */ + *(u16 *)(pframe + insert_len) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); + insert_len += 2; + + /* OUI */ + *(u32 *)(pframe + insert_len) = cpu_to_be32(WPSOUI); insert_len += 4; - // Sub Category ID - *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + /* Sub Category ID */ + *(u16 *)(pframe + insert_len) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); insert_len += 2; - // Device Name - // Type: - *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + /* Device Name */ + /* Type: */ + *(u16 *)(pframe + insert_len) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); insert_len += 2; - // Length: - *(u16*) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len ); + /* Length: */ + *(u16 *)(pframe + insert_len) = cpu_to_be16(pwdinfo->device_name_len); insert_len += 2; - // Value: - _rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len ); + /* Value: */ + _rtw_memcpy(pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len); insert_len += pwdinfo->device_name_len; - //update wsc ie length - *(pframe_wscie+1) = (wpsielen -2) + insert_len; + /* update wsc ie length */ + *(pframe_wscie + 1) = (wpsielen - 2) + insert_len; - //pframe move to end - pframe+=insert_len; + /* pframe move to end */ + pframe += insert_len; pattrib->pktlen += insert_len; - //copy remainder_ie to pframe + /* copy remainder_ie to pframe */ _rtw_memcpy(pframe, premainder_ie, remainder_ielen); - pframe += remainder_ielen; + pframe += remainder_ielen; pattrib->pktlen += remainder_ielen; } - } - else -#endif //CONFIG_P2P + } else +#endif /* CONFIG_P2P */ { int len_diff; _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); len_diff = update_hidden_ssid( - pframe+_BEACON_IE_OFFSET_ - , cur_network->IELength-_BEACON_IE_OFFSET_ - , pmlmeinfo->hidden_ssid_mode - ); - pframe += (cur_network->IELength+len_diff); - pattrib->pktlen += (cur_network->IELength+len_diff); + pframe + _BEACON_IE_OFFSET_ + , cur_network->IELength - _BEACON_IE_OFFSET_ + , pmlmeinfo->hidden_ssid_mode + ); + pframe += (cur_network->IELength + len_diff); + pattrib->pktlen += (cur_network->IELength + len_diff); } { u8 *wps_ie; uint wps_ielen; u8 sr = 0; - wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr+TXDESC_OFFSET+sizeof (struct rtw_ieee80211_hdr_3addr)+_BEACON_IE_OFFSET_, - pattrib->pktlen-sizeof (struct rtw_ieee80211_hdr_3addr)-_BEACON_IE_OFFSET_, NULL, &wps_ielen); - if (wps_ie && wps_ielen>0) { - rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL); - } + wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr + TXDESC_OFFSET + sizeof(struct rtw_ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_, + pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_, NULL, &wps_ielen); + if (wps_ie && wps_ielen > 0) + rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8 *)(&sr), NULL); if (sr != 0) set_fwstate(pmlmepriv, WIFI_UNDER_WPS); else @@ -7763,123 +7578,105 @@ void issue_beacon(_adapter *padapter, int timeout_ms) } #ifdef CONFIG_P2P - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { u32 len; #ifdef CONFIG_IOCTL_CFG80211 - if(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) - { + if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211) { len = pmlmepriv->p2p_beacon_ie_len; - if(pmlmepriv->p2p_beacon_ie && len>0) + if (pmlmepriv->p2p_beacon_ie && len > 0) _rtw_memcpy(pframe, pmlmepriv->p2p_beacon_ie, len); - } - else -#endif //CONFIG_IOCTL_CFG80211 + } else +#endif /* CONFIG_IOCTL_CFG80211 */ { len = build_beacon_p2p_ie(pwdinfo, pframe); } pframe += len; pattrib->pktlen += len; + #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if(_TRUE == pwdinfo->wfd_info->wfd_enable) -#endif //CONFIG_IOCTL_CFG80211 - { - len = build_beacon_wfd_ie( pwdinfo, pframe ); - } -#ifdef CONFIG_IOCTL_CFG80211 - else - { - len = 0; - if(pmlmepriv->wfd_beacon_ie && pmlmepriv->wfd_beacon_ie_len>0) - { - len = pmlmepriv->wfd_beacon_ie_len; - _rtw_memcpy(pframe, pmlmepriv->wfd_beacon_ie, len); - } - } -#endif //CONFIG_IOCTL_CFG80211 + len = rtw_append_beacon_wfd_ie(padapter, pframe); pframe += len; pattrib->pktlen += len; -#endif //CONFIG_WFD +#endif } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ +#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE + pattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_BEACON_VENDOR_IE_BIT); +#endif goto _issue_bcn; } - //below for ad-hoc mode + /* below for ad-hoc mode */ - //timestamp will be inserted by hardware + /* timestamp will be inserted by hardware */ pframe += 8; pattrib->pktlen += 8; - // beacon interval: 2 bytes + /* beacon interval: 2 bytes */ - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); pframe += 2; pattrib->pktlen += 2; - // capability info: 2 bytes + /* capability info: 2 bytes */ _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); pframe += 2; pattrib->pktlen += 2; - // SSID + /* SSID */ pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); - // supported rates... + /* supported rates... */ rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8) ? 8 : rate_len), cur_network->SupportedRates, &pattrib->pktlen); - // DS parameter set + /* DS parameter set */ pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen); - //if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + /* if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) */ { - u8 erpinfo=0; + u8 erpinfo = 0; u32 ATIMWindow; - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; + /* IBSS Parameter Set... */ + /* ATIMWindow = cur->Configuration.ATIMWindow; */ ATIMWindow = 0; pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); - //ERP IE + /* ERP IE */ pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); - } - - - // EXTERNDED SUPPORTED RATE - if (rate_len > 8) - { - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); } - //todo:HT for adhoc + /* EXTERNDED SUPPORTED RATE */ + if (rate_len > 8) + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); + + + /* todo:HT for adhoc */ _issue_bcn: -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) +#if defined(CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) pmlmepriv->update_bcn = _FALSE; - - _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); -#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) - if ((pattrib->pktlen + TXDESC_SIZE) > 512) - { - DBG_871X("beacon frame too large\n"); + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); +#endif /* #if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) */ + + if ((pattrib->pktlen + TXDESC_SIZE) > 512) { + RTW_INFO("beacon frame too large\n"); return; } - + pattrib->last_txcmdsz = pattrib->pktlen; - //DBG_871X("issue bcn_sz=%d\n", pattrib->last_txcmdsz); - if(timeout_ms > 0) + /* RTW_INFO("issue bcn_sz=%d\n", pattrib->last_txcmdsz); */ + if (timeout_ms > 0) dump_mgntframe_and_wait(padapter, pmgntframe, timeout_ms); else dump_mgntframe(padapter, pmgntframe); @@ -7892,52 +7689,52 @@ void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probe struct pkt_attrib *pattrib; unsigned char *pframe; struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; + unsigned short *fctrl; unsigned char *mac, *bssid; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) +#if defined(CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) u8 *pwps_ie; uint wps_ielen; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) +#endif /* #if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) */ struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); unsigned int rate_len; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &(padapter->wdinfo); #ifdef CONFIG_WFD u32 wfdielen = 0; -#endif //CONFIG_WFD -#endif //CONFIG_P2P +#endif +#endif /* CONFIG_P2P */ - //DBG_871X("%s\n", __FUNCTION__); + /* RTW_INFO("%s\n", __FUNCTION__); */ - if(da == NULL) + if (da == NULL) return; - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) return; - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__); + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) { + RTW_INFO("%s, alloc mgnt frame fail\n", __FUNCTION__); return; } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - + update_mgntframe_attrib(padapter, pattrib); + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - + 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, da, ETH_ALEN); @@ -7947,53 +7744,47 @@ void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probe SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; SetFrameSubType(fctrl, WIFI_PROBERSP); - + pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); pattrib->pktlen = pattrib->hdrlen; pframe += pattrib->hdrlen; - if(cur_network->IELength>MAX_IE_SZ) + if (cur_network->IELength > MAX_IE_SZ) return; - -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) - if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - pwps_ie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wps_ielen); - - //inerset & update wps_probe_resp_ie - if((pmlmepriv->wps_probe_resp_ie!=NULL) && pwps_ie && (wps_ielen>0)) - { + +#if defined(CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { + pwps_ie = rtw_get_wps_ie(cur_network->IEs + _FIXED_IE_LENGTH_, cur_network->IELength - _FIXED_IE_LENGTH_, NULL, &wps_ielen); + + /* inerset & update wps_probe_resp_ie */ + if ((pmlmepriv->wps_probe_resp_ie != NULL) && pwps_ie && (wps_ielen > 0)) { uint wps_offset, remainder_ielen; - u8 *premainder_ie; - + u8 *premainder_ie; + wps_offset = (uint)(pwps_ie - cur_network->IEs); premainder_ie = pwps_ie + wps_ielen; remainder_ielen = cur_network->IELength - wps_offset - wps_ielen; - _rtw_memcpy(pframe, cur_network->IEs, wps_offset); - pframe += wps_offset; - pattrib->pktlen += wps_offset; + _rtw_memcpy(pframe, cur_network->IEs, wps_offset); + pframe += wps_offset; + pattrib->pktlen += wps_offset; - wps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];//to get ie data len - if((wps_offset+wps_ielen+2)<=MAX_IE_SZ) - { - _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, wps_ielen+2); - pframe += wps_ielen+2; - pattrib->pktlen += wps_ielen+2; + wps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];/* to get ie data len */ + if ((wps_offset + wps_ielen + 2) <= MAX_IE_SZ) { + _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, wps_ielen + 2); + pframe += wps_ielen + 2; + pattrib->pktlen += wps_ielen + 2; } - if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) - { + if ((wps_offset + wps_ielen + 2 + remainder_ielen) <= MAX_IE_SZ) { _rtw_memcpy(pframe, premainder_ie, remainder_ielen); - pframe += remainder_ielen; - pattrib->pktlen += remainder_ielen; + pframe += remainder_ielen; + pattrib->pktlen += remainder_ielen; } - } - else - { + } else { _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); pframe += cur_network->IELength; pattrib->pktlen += cur_network->IELength; @@ -8005,178 +7796,156 @@ void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probe sint ssid_ielen; sint ssid_ielen_diff; u8 buf[MAX_IE_SZ]; - u8 *ies = pmgntframe->buf_addr+TXDESC_OFFSET+sizeof(struct rtw_ieee80211_hdr_3addr); + u8 *ies = pmgntframe->buf_addr + TXDESC_OFFSET + sizeof(struct rtw_ieee80211_hdr_3addr); - ssid_ie = rtw_get_ie(ies+_FIXED_IE_LENGTH_, _SSID_IE_, &ssid_ielen, - (pframe-ies)-_FIXED_IE_LENGTH_); + ssid_ie = rtw_get_ie(ies + _FIXED_IE_LENGTH_, _SSID_IE_, &ssid_ielen, + (pframe - ies) - _FIXED_IE_LENGTH_); ssid_ielen_diff = cur_network->Ssid.SsidLength - ssid_ielen; if (ssid_ie && cur_network->Ssid.SsidLength) { uint remainder_ielen; u8 *remainder_ie; - remainder_ie = ssid_ie+2; - remainder_ielen = (pframe-remainder_ie); + remainder_ie = ssid_ie + 2; + remainder_ielen = (pframe - remainder_ie); if (remainder_ielen > MAX_IE_SZ) { - DBG_871X_LEVEL(_drv_warning_, FUNC_ADPT_FMT" remainder_ielen > MAX_IE_SZ\n", FUNC_ADPT_ARG(padapter)); + RTW_WARN(FUNC_ADPT_FMT" remainder_ielen > MAX_IE_SZ\n", FUNC_ADPT_ARG(padapter)); remainder_ielen = MAX_IE_SZ; } _rtw_memcpy(buf, remainder_ie, remainder_ielen); - _rtw_memcpy(remainder_ie+ssid_ielen_diff, buf, remainder_ielen); - *(ssid_ie+1) = cur_network->Ssid.SsidLength; - _rtw_memcpy(ssid_ie+2, cur_network->Ssid.Ssid, cur_network->Ssid.SsidLength); + _rtw_memcpy(remainder_ie + ssid_ielen_diff, buf, remainder_ielen); + *(ssid_ie + 1) = cur_network->Ssid.SsidLength; + _rtw_memcpy(ssid_ie + 2, cur_network->Ssid.Ssid, cur_network->Ssid.SsidLength); pframe += ssid_ielen_diff; pattrib->pktlen += ssid_ielen_diff; } } - } - else -#endif +#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE + pattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_PROBERESP_VENDOR_IE_BIT); +#endif + } else +#endif { - - //timestamp will be inserted by hardware + + /* timestamp will be inserted by hardware */ pframe += 8; pattrib->pktlen += 8; - // beacon interval: 2 bytes + /* beacon interval: 2 bytes */ - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); pframe += 2; pattrib->pktlen += 2; - // capability info: 2 bytes + /* capability info: 2 bytes */ _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); pframe += 2; pattrib->pktlen += 2; - //below for ad-hoc mode + /* below for ad-hoc mode */ - // SSID + /* SSID */ pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); - // supported rates... + /* supported rates... */ rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8) ? 8 : rate_len), cur_network->SupportedRates, &pattrib->pktlen); - // DS parameter set - pframe =rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen); + /* DS parameter set */ + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen); - if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - u8 erpinfo=0; + if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { + u8 erpinfo = 0; u32 ATIMWindow; - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; + /* IBSS Parameter Set... */ + /* ATIMWindow = cur->Configuration.ATIMWindow; */ ATIMWindow = 0; pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); - //ERP IE + /* ERP IE */ pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); } - - // EXTERNDED SUPPORTED RATE + + /* EXTERNDED SUPPORTED RATE */ if (rate_len > 8) - { pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); - } - //todo:HT for adhoc + /* todo:HT for adhoc */ - } + } #ifdef CONFIG_P2P - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) - /* IOT issue, When wifi_spec is not set, send probe_resp with P2P IE even if probe_req has no P2P IE */ - && (is_valid_p2p_probereq || !padapter->registrypriv.wifi_spec)) - { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) + /* IOT issue, When wifi_spec is not set, send probe_resp with P2P IE even if probe_req has no P2P IE */ + && (is_valid_p2p_probereq || !padapter->registrypriv.wifi_spec)) { u32 len; #ifdef CONFIG_IOCTL_CFG80211 - if(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - //if pwdinfo->role == P2P_ROLE_DEVICE will call issue_probersp_p2p() + if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211) { + /* if pwdinfo->role == P2P_ROLE_DEVICE will call issue_probersp_p2p() */ len = pmlmepriv->p2p_go_probe_resp_ie_len; - if(pmlmepriv->p2p_go_probe_resp_ie && len>0) + if (pmlmepriv->p2p_go_probe_resp_ie && len > 0) _rtw_memcpy(pframe, pmlmepriv->p2p_go_probe_resp_ie, len); - } - else -#endif //CONFIG_IOCTL_CFG80211 + } else +#endif /* CONFIG_IOCTL_CFG80211 */ { len = build_probe_resp_p2p_ie(pwdinfo, pframe); } pframe += len; pattrib->pktlen += len; - + #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if(_TRUE == pwdinfo->wfd_info->wfd_enable) -#endif //CONFIG_IOCTL_CFG80211 - { - len = build_probe_resp_wfd_ie(pwdinfo, pframe, 0); - } -#ifdef CONFIG_IOCTL_CFG80211 - else - { - len = 0; - if(pmlmepriv->wfd_probe_resp_ie && pmlmepriv->wfd_probe_resp_ie_len>0) - { - len = pmlmepriv->wfd_probe_resp_ie_len; - _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, len); - } - } -#endif //CONFIG_IOCTL_CFG80211 + len = rtw_append_probe_resp_wfd_ie(padapter, pframe); pframe += len; pattrib->pktlen += len; -#endif //CONFIG_WFD - +#endif } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ #ifdef CONFIG_AUTO_AP_MODE -{ - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_871X("(%s)\n", __FUNCTION__); - - //check rc station - psta = rtw_get_stainfo(pstapriv, da); - if (psta && psta->isrc && psta->pid>0) { - u8 RC_OUI[4]={0x00,0xE0,0x4C,0x0A}; - u8 RC_INFO[14] = {0}; - //EID[1] + EID_LEN[1] + RC_OUI[4] + MAC[6] + PairingID[2] + ChannelNum[2] - u16 cu_ch = (u16)cur_network->Configuration.DSConfig; + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; - DBG_871X("%s, reply rc(pid=0x%x) device "MAC_FMT" in ch=%d\n", __FUNCTION__, - psta->pid, MAC_ARG(psta->hwaddr), cu_ch); + RTW_INFO("(%s)\n", __FUNCTION__); - //append vendor specific ie - _rtw_memcpy(RC_INFO, RC_OUI, sizeof(RC_OUI)); - _rtw_memcpy(&RC_INFO[4], mac, ETH_ALEN); - _rtw_memcpy(&RC_INFO[10], (u8*)&psta->pid, 2); - _rtw_memcpy(&RC_INFO[12], (u8*)&cu_ch, 2); + /* check rc station */ + psta = rtw_get_stainfo(pstapriv, da); + if (psta && psta->isrc && psta->pid > 0) { + u8 RC_OUI[4] = {0x00, 0xE0, 0x4C, 0x0A}; + u8 RC_INFO[14] = {0}; + /* EID[1] + EID_LEN[1] + RC_OUI[4] + MAC[6] + PairingID[2] + ChannelNum[2] */ + u16 cu_ch = (u16)cur_network->Configuration.DSConfig; - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(RC_INFO), RC_INFO, &pattrib->pktlen); + RTW_INFO("%s, reply rc(pid=0x%x) device "MAC_FMT" in ch=%d\n", __FUNCTION__, + psta->pid, MAC_ARG(psta->hwaddr), cu_ch); + + /* append vendor specific ie */ + _rtw_memcpy(RC_INFO, RC_OUI, sizeof(RC_OUI)); + _rtw_memcpy(&RC_INFO[4], mac, ETH_ALEN); + _rtw_memcpy(&RC_INFO[10], (u8 *)&psta->pid, 2); + _rtw_memcpy(&RC_INFO[12], (u8 *)&cu_ch, 2); + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(RC_INFO), RC_INFO, &pattrib->pktlen); + } } -} -#endif //CONFIG_AUTO_AP_MODE +#endif /* CONFIG_AUTO_AP_MODE */ pattrib->last_txcmdsz = pattrib->pktlen; - + dump_mgntframe(padapter, pmgntframe); - + return; } @@ -8198,15 +7967,14 @@ int _issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, u8 ch, int bssrate_len = 0; u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) goto exit; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -8221,15 +7989,12 @@ int _issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, u8 ch, fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - if (da) - { - // unicast probe request frame + if (da) { + /* unicast probe request frame */ _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, da, ETH_ALEN); - } - else - { - // broadcast probe request frame + } else { + /* broadcast probe request frame */ _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); } @@ -8240,47 +8005,44 @@ int _issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, u8 ch, pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_PROBEREQ); - pframe += sizeof (struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - if(pssid) + if (pssid) pframe = rtw_set_ie(pframe, _SSID_IE_, pssid->SsidLength, pssid->Ssid, &(pattrib->pktlen)); else pframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &(pattrib->pktlen)); get_rate_set(padapter, bssrate, &bssrate_len); - if (bssrate_len > 8) - { + if (bssrate_len > 8) { pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - else - { + } else pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } if (ch) pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, &ch, &pattrib->pktlen); if (append_wps) { - //add wps_ie for wps2.0 - if(pmlmepriv->wps_probe_req_ie_len>0 && pmlmepriv->wps_probe_req_ie) - { + /* add wps_ie for wps2.0 */ + if (pmlmepriv->wps_probe_req_ie_len > 0 && pmlmepriv->wps_probe_req_ie) { _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len); pframe += pmlmepriv->wps_probe_req_ie_len; pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len; - //pmlmepriv->wps_probe_req_ie_len = 0 ;//reset to zero + /* pmlmepriv->wps_probe_req_ie_len = 0 ; */ /* reset to zero */ } } +#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE + pattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_PROBEREQ_VENDOR_IE_BIT); +#endif pattrib->last_txcmdsz = pattrib->pktlen; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_notice_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz)); - if (wait_ack) { + if (wait_ack) ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); - } else { + else { dump_mgntframe(padapter, pmgntframe); ret = _SUCCESS; } @@ -8300,51 +8062,50 @@ inline void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da) * try_cnt means the maximal TX count to try */ int issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, u8 ch, bool append_wps, - int try_cnt, int wait_ms) + int try_cnt, int wait_ms) { int ret = _FAIL; int i = 0; u32 start = rtw_get_current_time(); - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; - do - { - ret = _issue_probereq(padapter, pssid, da, ch, append_wps, wait_ms>0?_TRUE:_FALSE); + do { + ret = _issue_probereq(padapter, pssid, da, ch, append_wps, wait_ms > 0 ? _TRUE : _FALSE); i++; if (RTW_CANNOT_RUN(padapter)) 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((imlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) return; - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -8387,63 +8147,57 @@ void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - if(psta)// for AP mode - { + if (psta) { /* for AP mode */ #ifdef CONFIG_NATIVEAP_MLME - _rtw_memcpy(pwlanhdr->addr1, psta->hwaddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr1, psta->hwaddr, 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 + + /* setting auth algo number */ val16 = (u16)psta->authalg; - if(status != _STATS_SUCCESSFUL_) + if (status != _STATS_SUCCESSFUL_) val16 = 0; if (val16) { - val16 = cpu_to_le16(val16); + val16 = cpu_to_le16(val16); use_shared_key = 1; } pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); - // setting auth seq number - val16 =(u16)psta->auth_seq; - val16 = cpu_to_le16(val16); + /* setting auth seq number */ + val16 = (u16)psta->auth_seq; + val16 = cpu_to_le16(val16); pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); - // setting status code... + /* setting status code... */ val16 = status; - val16 = cpu_to_le16(val16); + val16 = cpu_to_le16(val16); pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen)); - // added challenging text... - if ((psta->auth_seq == 2) && (psta->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) - { + /* added challenging text... */ + if ((psta->auth_seq == 2) && (psta->state & WIFI_FW_AUTH_STATE) && (use_shared_key == 1)) pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, psta->chg_txt, &(pattrib->pktlen)); - } #endif - } - else - { + } else { _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), 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 - val16 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)? 1: 0;// 0:OPEN System, 1:Shared key + + /* setting auth algo number */ + val16 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) ? 1 : 0; /* 0:OPEN System, 1:Shared key */ if (val16) { - val16 = cpu_to_le16(val16); + val16 = cpu_to_le16(val16); use_shared_key = 1; - } - //DBG_871X("%s auth_algo= %s auth_seq=%d\n",__FUNCTION__,(pmlmeinfo->auth_algo==0)?"OPEN":"SHARED",pmlmeinfo->auth_seq); - - //setting IV for auth seq #3 - if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) - { - //DBG_871X("==> iv(%d),key_index(%d)\n",pmlmeinfo->iv,pmlmeinfo->key_index); + } + /* RTW_INFO("%s auth_algo= %s auth_seq=%d\n",__FUNCTION__,(pmlmeinfo->auth_algo==0)?"OPEN":"SHARED",pmlmeinfo->auth_seq); */ + + /* setting IV for auth seq #3 */ + if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key == 1)) { + /* RTW_INFO("==> iv(%d),key_index(%d)\n",pmlmeinfo->iv,pmlmeinfo->key_index); */ val32 = ((pmlmeinfo->iv++) | (pmlmeinfo->key_index << 30)); val32 = cpu_to_le32(val32); pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&val32, &(pattrib->pktlen)); @@ -8452,41 +8206,40 @@ void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status } pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); - - // setting auth seq number + + /* setting auth seq number */ val16 = pmlmeinfo->auth_seq; - val16 = cpu_to_le16(val16); + val16 = cpu_to_le16(val16); pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); - - // setting status code... + + /* setting status code... */ val16 = status; - val16 = cpu_to_le16(val16); + val16 = cpu_to_le16(val16); pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen)); - // then checking to see if sending challenging text... - if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) - { + /* then checking to see if sending challenging text... */ + if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key == 1)) { pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, pmlmeinfo->chg_txt, &(pattrib->pktlen)); SetPrivacy(fctrl); - - pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); - + + pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->encrypt = _WEP40_; pattrib->icv_len = 4; - - pattrib->pktlen += pattrib->icv_len; - + + pattrib->pktlen += pattrib->icv_len; + } - + } pattrib->last_txcmdsz = pattrib->pktlen; rtw_wep_encrypt(padapter, (u8 *)pmgntframe); - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); dump_mgntframe(padapter, pmgntframe); return; @@ -8500,33 +8253,32 @@ void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *p struct rtw_ieee80211_hdr *pwlanhdr; struct pkt_attrib *pattrib; unsigned char *pbuf, *pframe; - unsigned short val, ie_status; + unsigned short val, ie_status; unsigned short *fctrl; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); - u8 *ie = pnetwork->IEs; + u8 *ie = pnetwork->IEs; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &(padapter->wdinfo); #ifdef CONFIG_WFD u32 wfdielen = 0; -#endif //CONFIG_WFD +#endif -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) return; - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -8547,7 +8299,7 @@ void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *p SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; if ((pkt_type == WIFI_ASSOCRSP) || (pkt_type == WIFI_REASSOCRSP)) - SetFrameSubType(pwlanhdr, pkt_type); + SetFrameSubType(pwlanhdr, pkt_type); else return; @@ -8555,178 +8307,162 @@ void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *p pattrib->pktlen += pattrib->hdrlen; pframe += pattrib->hdrlen; - //capability + /* capability */ val = *(unsigned short *)rtw_get_capability_from_ie(ie); pframe = rtw_set_fixed_ie(pframe, _CAPABILITY_ , (unsigned char *)&val, &(pattrib->pktlen)); ie_status = cpu_to_le16(status); pframe = rtw_set_fixed_ie(pframe , _STATUS_CODE_ , (unsigned char *)&ie_status, &(pattrib->pktlen)); - + val = cpu_to_le16(pstat->aid | BIT(14) | BIT(15)); pframe = rtw_set_fixed_ie(pframe, _ASOC_ID_ , (unsigned char *)&val, &(pattrib->pktlen)); if (pstat->bssratelen <= 8) - { pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, pstat->bssratelen, pstat->bssrateset, &(pattrib->pktlen)); - } - else - { + else { pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pstat->bssrateset, &(pattrib->pktlen)); - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (pstat->bssratelen-8), pstat->bssrateset+8, &(pattrib->pktlen)); + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (pstat->bssratelen - 8), pstat->bssrateset + 8, &(pattrib->pktlen)); } -#ifdef CONFIG_IEEE80211W +#ifdef CONFIG_IEEE80211W if (status == _STATS_REFUSED_TEMPORARILY_) { u8 timeout_itvl[5]; u32 timeout_interval = 3000; /* Association Comeback time */ timeout_itvl[0] = 0x03; timeout_interval = cpu_to_le32(timeout_interval); - _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); + _rtw_memcpy(timeout_itvl + 1, &timeout_interval, 4); pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); } #endif /* CONFIG_IEEE80211W */ #ifdef CONFIG_80211N_HT - if ((pstat->flags & WLAN_STA_HT) && (pmlmepriv->htpriv.ht_option)) - { - uint ie_len=0; - - //FILL HT CAP INFO IE - //p = hostapd_eid_ht_capabilities_info(hapd, p); + if ((pstat->flags & WLAN_STA_HT) && (pmlmepriv->htpriv.ht_option)) { + uint ie_len = 0; + + /* FILL HT CAP INFO IE */ + /* p = hostapd_eid_ht_capabilities_info(hapd, p); */ pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if(pbuf && ie_len>0) - { - _rtw_memcpy(pframe, pbuf, ie_len+2); - pframe += (ie_len+2); - pattrib->pktlen +=(ie_len+2); + if (pbuf && ie_len > 0) { + _rtw_memcpy(pframe, pbuf, ie_len + 2); + pframe += (ie_len + 2); + pattrib->pktlen += (ie_len + 2); } - //FILL HT ADD INFO IE - //p = hostapd_eid_ht_operation(hapd, p); + /* FILL HT ADD INFO IE */ + /* p = hostapd_eid_ht_operation(hapd, p); */ pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if(pbuf && ie_len>0) - { - _rtw_memcpy(pframe, pbuf, ie_len+2); - pframe += (ie_len+2); - pattrib->pktlen +=(ie_len+2); + if (pbuf && ie_len > 0) { + _rtw_memcpy(pframe, pbuf, ie_len + 2); + pframe += (ie_len + 2); + pattrib->pktlen += (ie_len + 2); } - - } + + } #endif /*adding EXT_CAPAB_IE */ if (pmlmepriv->ext_capab_ie_len > 0) { uint ie_len = 0; - + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_CAP_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); if (pbuf && ie_len > 0) { - _rtw_memcpy(pframe, pbuf, ie_len+2); - pframe += (ie_len+2); - pattrib->pktlen += (ie_len+2); - } - } - -#ifdef CONFIG_80211AC_VHT - if ((pstat->flags & WLAN_STA_VHT) && (pmlmepriv->vhtpriv.vht_option) - && (pstat->wpa_pairwise_cipher != WPA_CIPHER_TKIP) - && (pstat->wpa2_pairwise_cipher != WPA_CIPHER_TKIP)) - { - u32 ie_len=0; - - //FILL VHT CAP IE - pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, EID_VHTCapability, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if(pbuf && ie_len>0) - { - _rtw_memcpy(pframe, pbuf, ie_len+2); - pframe += (ie_len+2); - pattrib->pktlen +=(ie_len+2); - } - - //FILL VHT OPERATION IE - pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, EID_VHTOperation, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if(pbuf && ie_len>0) - { - _rtw_memcpy(pframe, pbuf, ie_len+2); - pframe += (ie_len+2); - pattrib->pktlen +=(ie_len+2); + _rtw_memcpy(pframe, pbuf, ie_len + 2); + pframe += (ie_len + 2); + pattrib->pktlen += (ie_len + 2); } } -#endif //CONFIG_80211AC_VHT - //FILL WMM IE - if ((pstat->flags & WLAN_STA_WME) && (pmlmepriv->qospriv.qos_option)) - { - uint ie_len=0; - unsigned char WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; - - for (pbuf = ie + _BEACON_IE_OFFSET_; ;pbuf+= (ie_len + 2)) - { - pbuf = rtw_get_ie(pbuf, _VENDOR_SPECIFIC_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); - if(pbuf && _rtw_memcmp(pbuf+2, WMM_PARA_IE, 6)) - { - _rtw_memcpy(pframe, pbuf, ie_len+2); - pframe += (ie_len+2); - pattrib->pktlen +=(ie_len+2); - - break; - } - - if ((pbuf == NULL) || (ie_len == 0)) - { - break; - } +#ifdef CONFIG_80211AC_VHT + if ((pstat->flags & WLAN_STA_VHT) && (pmlmepriv->vhtpriv.vht_option) + && (pstat->wpa_pairwise_cipher != WPA_CIPHER_TKIP) + && (pstat->wpa2_pairwise_cipher != WPA_CIPHER_TKIP)) { + u32 ie_len = 0; + + /* FILL VHT CAP IE */ + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, EID_VHTCapability, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if (pbuf && ie_len > 0) { + _rtw_memcpy(pframe, pbuf, ie_len + 2); + pframe += (ie_len + 2); + pattrib->pktlen += (ie_len + 2); } - + + /* FILL VHT OPERATION IE */ + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, EID_VHTOperation, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if (pbuf && ie_len > 0) { + _rtw_memcpy(pframe, pbuf, ie_len + 2); + pframe += (ie_len + 2); + pattrib->pktlen += (ie_len + 2); + } + } +#endif /* CONFIG_80211AC_VHT */ + + /* FILL WMM IE */ + if ((pstat->flags & WLAN_STA_WME) && (pmlmepriv->qospriv.qos_option)) { + uint ie_len = 0; + unsigned char WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; + + for (pbuf = ie + _BEACON_IE_OFFSET_; ; pbuf += (ie_len + 2)) { + pbuf = rtw_get_ie(pbuf, _VENDOR_SPECIFIC_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if (pbuf && _rtw_memcmp(pbuf + 2, WMM_PARA_IE, 6)) { + _rtw_memcpy(pframe, pbuf, ie_len + 2); + pframe += (ie_len + 2); + pattrib->pktlen += (ie_len + 2); + + break; + } + + if ((pbuf == NULL) || (ie_len == 0)) + break; + } + } if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK) - { pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen)); - } - //add WPS IE ie for wps 2.0 - if(pmlmepriv->wps_assoc_resp_ie && pmlmepriv->wps_assoc_resp_ie_len>0) - { + /* add WPS IE ie for wps 2.0 */ + if (pmlmepriv->wps_assoc_resp_ie && pmlmepriv->wps_assoc_resp_ie_len > 0) { _rtw_memcpy(pframe, pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len); - + pframe += pmlmepriv->wps_assoc_resp_ie_len; pattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len; } #ifdef CONFIG_P2P - if( padapter->wdinfo.driver_interface == DRIVER_WEXT ) - { - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && (pstat->is_p2p_device == _TRUE)) - { - u32 len; + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && (pstat->is_p2p_device == _TRUE)) { + u32 len; + if (padapter->wdinfo.driver_interface == DRIVER_CFG80211) { + len = 0; + if (pmlmepriv->p2p_assoc_resp_ie && pmlmepriv->p2p_assoc_resp_ie_len > 0) { + len = pmlmepriv->p2p_assoc_resp_ie_len; + _rtw_memcpy(pframe, pmlmepriv->p2p_assoc_resp_ie, len); + } + } else len = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code); - - pframe += len; - pattrib->pktlen += len; - } + pframe += len; + pattrib->pktlen += len; } + #ifdef CONFIG_WFD - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) -#ifdef CONFIG_IOCTL_CFG80211 - && (_TRUE == pwdinfo->wfd_info->wfd_enable) -#endif //CONFIG_IOCTL_CFG80211 - ) - { - wfdielen = build_assoc_resp_wfd_ie(pwdinfo, pframe); + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + wfdielen = rtw_append_assoc_resp_wfd_ie(padapter, pframe); pframe += wfdielen; pattrib->pktlen += wfdielen; } -#endif //CONFIG_WFD -#endif //CONFIG_P2P +#endif +#endif /* CONFIG_P2P */ +#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE + pattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_ASSOCRESP_VENDOR_IE_BIT); +#endif pattrib->last_txcmdsz = pattrib->pktlen; - + dump_mgntframe(padapter, pmgntframe); - + #endif } @@ -8739,7 +8475,7 @@ void issue_assocreq(_adapter *padapter) struct rtw_ieee80211_hdr *pwlanhdr; unsigned short *fctrl; unsigned short val16; - unsigned int i, j, ie_len, index=0; + unsigned int i, j, ie_len, index = 0; unsigned char rf_type, bssrate[NumRates], sta_bssrate[NumRates]; PNDIS_802_11_VARIABLE_IEs pIE; struct registry_priv *pregpriv = &padapter->registrypriv; @@ -8751,28 +8487,29 @@ void issue_assocreq(_adapter *padapter) u8 vs_ie_length = 0; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - u8 p2pie[ 255 ] = { 0x00 }; - u16 p2pielen = 0; + u8 p2pie[255] = { 0x00 }; + u16 p2pielen = 0; #ifdef CONFIG_WFD u32 wfdielen = 0; -#endif //CONFIG_WFD -#endif //CONFIG_P2P +#endif +#endif /* CONFIG_P2P */ #ifdef CONFIG_DFS u16 cap; /* Dot H */ u8 pow_cap_ele[2] = { 0x00 }; - u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel -#endif //CONFIG_DFS + u8 sup_ch[30 * 2] = {0x00 }, sup_ch_idx = 0, idx_5g = 2; /* For supported channel */ +#endif /* CONFIG_DFS */ - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) goto exit; - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -8795,7 +8532,7 @@ void issue_assocreq(_adapter *padapter) pframe += sizeof(struct rtw_ieee80211_hdr_3addr); pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - //caps + /* caps */ #ifdef CONFIG_DFS _rtw_memcpy(&cap, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); @@ -8803,205 +8540,187 @@ void issue_assocreq(_adapter *padapter) _rtw_memcpy(pframe, &cap, 2); #else _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); -#endif //CONFIG_DFS +#endif /* CONFIG_DFS */ pframe += 2; pattrib->pktlen += 2; - //listen interval - //todo: listen interval for power saving + /* listen interval */ + /* todo: listen interval for power saving */ val16 = cpu_to_le16(3); - _rtw_memcpy(pframe ,(unsigned char *)&val16, 2); + _rtw_memcpy(pframe , (unsigned char *)&val16, 2); pframe += 2; pattrib->pktlen += 2; - //SSID + /* SSID */ pframe = rtw_set_ie(pframe, _SSID_IE_, pmlmeinfo->network.Ssid.SsidLength, pmlmeinfo->network.Ssid.Ssid, &(pattrib->pktlen)); #ifdef CONFIG_DFS /* Dot H */ - if(pmlmeext->cur_channel > 14) - { - pow_cap_ele[0] = 13; // Minimum transmit power capability - pow_cap_ele[1] = 21; // Maximum transmit power capability + if (pmlmeext->cur_channel > 14) { + pow_cap_ele[0] = 13; /* Minimum transmit power capability */ + pow_cap_ele[1] = 21; /* Maximum transmit power capability */ pframe = rtw_set_ie(pframe, EID_PowerCap, 2, pow_cap_ele, &(pattrib->pktlen)); - //supported channels - do{ - if( pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14 ) - { - sup_ch[0] = 1; //First channel number - sup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; //Number of channel - } - else - { + /* supported channels */ + do { + if (pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14) { + sup_ch[0] = 1; /* First channel number */ + sup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; /* Number of channel */ + } else { sup_ch[idx_5g++] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; sup_ch[idx_5g++] = 1; } sup_ch_idx++; - } - while( pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0 ); + } while (pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0); pframe = rtw_set_ie(pframe, EID_SupportedChannels, idx_5g, sup_ch, &(pattrib->pktlen)); } -#endif //CONFIG_DFS +#endif /* CONFIG_DFS */ - //supported rate & extended supported rate + /* supported rate & extended supported rate */ -#if 1 // Check if the AP's supported rates are also supported by STA. +#if 1 /* Check if the AP's supported rates are also supported by STA. */ get_rate_set(padapter, sta_bssrate, &sta_bssrate_len); - //DBG_871X("sta_bssrate_len=%d\n", sta_bssrate_len); - - if(pmlmeext->cur_channel == 14)// for JAPAN, channel 14 can only uses B Mode(CCK) - { + /* RTW_INFO("sta_bssrate_len=%d\n", sta_bssrate_len); */ + + if (pmlmeext->cur_channel == 14) /* for JAPAN, channel 14 can only uses B Mode(CCK) */ sta_bssrate_len = 4; - } - - //for (i = 0; i < sta_bssrate_len; i++) { - // DBG_871X("sta_bssrate[%d]=%02X\n", i, sta_bssrate[i]); - //} + + /* for (i = 0; i < sta_bssrate_len; i++) { */ + /* RTW_INFO("sta_bssrate[%d]=%02X\n", i, sta_bssrate[i]); */ + /* } */ for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) { - if (pmlmeinfo->network.SupportedRates[i] == 0) break; - DBG_871X("network.SupportedRates[%d]=%02X\n", i, pmlmeinfo->network.SupportedRates[i]); + if (pmlmeinfo->network.SupportedRates[i] == 0) + break; + RTW_INFO("network.SupportedRates[%d]=%02X\n", i, pmlmeinfo->network.SupportedRates[i]); } - + for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) { - if (pmlmeinfo->network.SupportedRates[i] == 0) break; + if (pmlmeinfo->network.SupportedRates[i] == 0) + break; - - // Check if the AP's supported rates are also supported by STA. - for (j=0; j < sta_bssrate_len; j++) { - // Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP - if ( (pmlmeinfo->network.SupportedRates[i]|IEEE80211_BASIC_RATE_MASK) - == (sta_bssrate[j]|IEEE80211_BASIC_RATE_MASK)) { - //DBG_871X("match i = %d, j=%d\n", i, j); + + /* Check if the AP's supported rates are also supported by STA. */ + for (j = 0; j < sta_bssrate_len; j++) { + /* Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP */ + if ((pmlmeinfo->network.SupportedRates[i] | IEEE80211_BASIC_RATE_MASK) + == (sta_bssrate[j] | IEEE80211_BASIC_RATE_MASK)) { + /* RTW_INFO("match i = %d, j=%d\n", i, j); */ break; } else { - //DBG_871X("not match: %02X != %02X\n", (pmlmeinfo->network.SupportedRates[i]|IEEE80211_BASIC_RATE_MASK), (sta_bssrate[j]|IEEE80211_BASIC_RATE_MASK)); + /* RTW_INFO("not match: %02X != %02X\n", (pmlmeinfo->network.SupportedRates[i]|IEEE80211_BASIC_RATE_MASK), (sta_bssrate[j]|IEEE80211_BASIC_RATE_MASK)); */ } } - + if (j == sta_bssrate_len) { - // the rate is not supported by STA - DBG_871X("%s(): the rate[%d]=%02X is not supported by STA!\n",__FUNCTION__, i, pmlmeinfo->network.SupportedRates[i]); + /* the rate is not supported by STA */ + RTW_INFO("%s(): the rate[%d]=%02X is not supported by STA!\n", __FUNCTION__, i, pmlmeinfo->network.SupportedRates[i]); } else { - // the rate is supported by STA + /* the rate is supported by STA */ bssrate[index++] = pmlmeinfo->network.SupportedRates[i]; } } - - bssrate_len = index; - DBG_871X("bssrate_len = %d\n", bssrate_len); -#else // Check if the AP's supported rates are also supported by STA. + bssrate_len = index; + RTW_INFO("bssrate_len = %d\n", bssrate_len); + +#else /* Check if the AP's supported rates are also supported by STA. */ #if 0 get_rate_set(padapter, bssrate, &bssrate_len); #else for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { - if (pmlmeinfo->network.SupportedRates[bssrate_len] == 0) break; + if (pmlmeinfo->network.SupportedRates[bssrate_len] == 0) + break; - if (pmlmeinfo->network.SupportedRates[bssrate_len] == 0x2C) // Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP + if (pmlmeinfo->network.SupportedRates[bssrate_len] == 0x2C) /* Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP */ break; bssrate[bssrate_len] = pmlmeinfo->network.SupportedRates[bssrate_len]; } #endif -#endif // Check if the AP's supported rates are also supported by STA. +#endif /* Check if the AP's supported rates are also supported by STA. */ if ((bssrate_len == 0) && (pmlmeinfo->network.SupportedRates[0] != 0)) { rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; //don't connect to AP if no joint supported rate + goto exit; /* don't connect to AP if no joint supported rate */ } - if (bssrate_len > 8) - { + if (bssrate_len > 8) { pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - else 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__); - } + else + RTW_INFO("%s: Connect to AP without 11b and 11g data rate!\n", __FUNCTION__); - //vendor specific IE, such as WPA, WMM, WPS - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) - { + /* vendor specific IE, such as WPA, WMM, WPS */ + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i); - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) || - (_rtw_memcmp(pIE->data, WMM_OUI, 4)) || - (_rtw_memcmp(pIE->data, WPS_OUI, 4))) - { - vs_ie_length = pIE->Length; - if((!padapter->registrypriv.wifi_spec) && (_rtw_memcmp(pIE->data, WPS_OUI, 4))) - { - //Commented by Kurt 20110629 - //In some older APs, WPS handshake - //would be fail if we append vender extensions informations to AP + switch (pIE->ElementID) { + case _VENDOR_SPECIFIC_IE_: + if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) || + (_rtw_memcmp(pIE->data, WMM_OUI, 4)) || + (_rtw_memcmp(pIE->data, WPS_OUI, 4))) { + vs_ie_length = pIE->Length; + if ((!padapter->registrypriv.wifi_spec) && (_rtw_memcmp(pIE->data, WPS_OUI, 4))) { + /* Commented by Kurt 20110629 */ + /* In some older APs, WPS handshake */ + /* would be fail if we append vender extensions informations to AP */ - vs_ie_length = 14; - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, vs_ie_length, pIE->data, &(pattrib->pktlen)); + vs_ie_length = 14; } - break; - case EID_WPA2: - pframe = rtw_set_ie(pframe, EID_WPA2, pIE->Length, pIE->data, &(pattrib->pktlen)); - break; + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, vs_ie_length, pIE->data, &(pattrib->pktlen)); + } + break; + + case EID_WPA2: + pframe = rtw_set_ie(pframe, EID_WPA2, pIE->Length, pIE->data, &(pattrib->pktlen)); + break; #ifdef CONFIG_80211N_HT - case EID_HTCapability: - if(padapter->mlmepriv.htpriv.ht_option==_TRUE) { - if (!(is_ap_in_tkip(padapter))) - { - _rtw_memcpy(&(pmlmeinfo->HT_caps), pIE->data, sizeof(struct HT_caps_element)); + case EID_HTCapability: + if (padapter->mlmepriv.htpriv.ht_option == _TRUE) { + if (!(is_ap_in_tkip(padapter))) { + _rtw_memcpy(&(pmlmeinfo->HT_caps), pIE->data, sizeof(struct HT_caps_element)); - pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = cpu_to_le16(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info); + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = cpu_to_le16(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info); - pframe = rtw_set_ie(pframe, EID_HTCapability, pIE->Length , (u8 *)(&(pmlmeinfo->HT_caps)), &(pattrib->pktlen)); - } + pframe = rtw_set_ie(pframe, EID_HTCapability, pIE->Length , (u8 *)(&(pmlmeinfo->HT_caps)), &(pattrib->pktlen)); } - break; + } + break; - case EID_EXTCapability: - if(padapter->mlmepriv.htpriv.ht_option==_TRUE) { - pframe = rtw_set_ie(pframe, EID_EXTCapability, pIE->Length, pIE->data, &(pattrib->pktlen)); - } - break; -#endif //CONFIG_80211N_HT + case EID_EXTCapability: + if (padapter->mlmepriv.htpriv.ht_option == _TRUE) + pframe = rtw_set_ie(pframe, EID_EXTCapability, pIE->Length, pIE->data, &(pattrib->pktlen)); + break; +#endif /* CONFIG_80211N_HT */ #ifdef CONFIG_80211AC_VHT - case EID_VHTCapability: - if (padapter->mlmepriv.vhtpriv.vht_option ==_TRUE) { - pframe = rtw_set_ie(pframe, EID_VHTCapability, pIE->Length, pIE->data, &(pattrib->pktlen)); - } - break; + case EID_VHTCapability: + if (padapter->mlmepriv.vhtpriv.vht_option == _TRUE) + pframe = rtw_set_ie(pframe, EID_VHTCapability, pIE->Length, pIE->data, &(pattrib->pktlen)); + break; - case EID_OpModeNotification: - if (padapter->mlmepriv.vhtpriv.vht_option ==_TRUE) { - pframe = rtw_set_ie(pframe, EID_OpModeNotification, pIE->Length, pIE->data, &(pattrib->pktlen)); - } - break; -#endif // CONFIG_80211AC_VHT - default: - break; + case EID_OpModeNotification: + if (padapter->mlmepriv.vhtpriv.vht_option == _TRUE) + pframe = rtw_set_ie(pframe, EID_OpModeNotification, pIE->Length, pIE->data, &(pattrib->pktlen)); + break; +#endif /* CONFIG_80211AC_VHT */ + default: + break; } i += (pIE->Length + 2); } if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK) - { pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen)); - } #ifdef CONFIG_WAPI_SUPPORT @@ -9012,179 +8731,153 @@ void issue_assocreq(_adapter *padapter) #ifdef CONFIG_P2P #ifdef CONFIG_IOCTL_CFG80211 - if(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if(pmlmepriv->p2p_assoc_req_ie && pmlmepriv->p2p_assoc_req_ie_len>0) - { + if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211) { + if (pmlmepriv->p2p_assoc_req_ie && pmlmepriv->p2p_assoc_req_ie_len > 0) { _rtw_memcpy(pframe, pmlmepriv->p2p_assoc_req_ie, pmlmepriv->p2p_assoc_req_ie_len); pframe += pmlmepriv->p2p_assoc_req_ie_len; pattrib->pktlen += pmlmepriv->p2p_assoc_req_ie_len; } - } - else -#endif //CONFIG_IOCTL_CFG80211 + } else +#endif /* CONFIG_IOCTL_CFG80211 */ { - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) - { - // Should add the P2P IE in the association request frame. - // P2P OUI - + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) { + /* Should add the P2P IE in the association request frame. */ + /* P2P OUI */ + p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ - // Commented by Albert 20101109 - // According to the P2P Specification, the association request frame should contain 3 P2P attributes - // 1. P2P Capability - // 2. Extended Listen Timing - // 3. Device Info - // Commented by Albert 20110516 - // 4. P2P Interface + /* Commented by Albert 20101109 */ + /* According to the P2P Specification, the association request frame should contain 3 P2P attributes */ + /* 1. P2P Capability */ + /* 2. Extended Listen Timing */ + /* 3. Device Info */ + /* Commented by Albert 20110516 */ + /* 4. P2P Interface */ - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + /* P2P Capability */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0002); p2pielen += 2; - // Value: - // Device Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; - // Group Capability Bitmap, 1 byte - if ( pwdinfo->persistent_supported ) - p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; + /* Group Capability Bitmap, 1 byte */ + if (pwdinfo->persistent_supported) + p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; else - p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT; + p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT; - // Extended Listen Timing - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + /* Extended Listen Timing */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING; - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x0004); p2pielen += 2; - // Value: - // Availability Period - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + /* Value: */ + /* Availability Period */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); p2pielen += 2; - // Availability Interval - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + /* Availability Interval */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0xFFFF); p2pielen += 2; - // Device Info - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + /* Device Info */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + /* Length: */ + /* 21->P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ + /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); p2pielen += 2; - // Value: - // P2P Device Address + /* Value: */ + /* P2P Device Address */ _rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN); p2pielen += ETH_ALEN; - // Config Method - // This field should be big endian. Noted by P2P specification. - if ( ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) || - ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) ) - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); - } + /* Config Method */ + /* This field should be big endian. Noted by P2P specification. */ + if ((pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN) || + (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN)) + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY); else - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); - } + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_PBC); p2pielen += 2; - // Primary Device Type - // Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + /* Primary Device Type */ + /* Category ID */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); p2pielen += 2; - // OUI - *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + /* OUI */ + *(u32 *)(p2pie + p2pielen) = cpu_to_be32(WPSOUI); p2pielen += 4; - // Sub Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + /* Sub Category ID */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); p2pielen += 2; - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + /* Number of Secondary Device Types */ + p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ - // Device Name - // Type: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + /* Device Name */ + /* Type: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); p2pielen += 2; - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); p2pielen += 2; - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); p2pielen += pwdinfo->device_name_len; - - // P2P Interface - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_INTERFACE; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x000D ); + + /* P2P Interface */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_INTERFACE; + + /* Length: */ + *(u16 *)(p2pie + p2pielen) = cpu_to_le16(0x000D); p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Device Address + + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); /* P2P Device Address */ p2pielen += ETH_ALEN; - p2pie[ p2pielen++ ] = 1; // P2P Interface Address Count - - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Interface Address List - p2pielen += ETH_ALEN; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + p2pie[p2pielen++] = 1; /* P2P Interface Address Count */ -#ifdef CONFIG_WFD - //wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe); - //pframe += wfdielen; - //pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); /* P2P Interface Address List */ + p2pielen += ETH_ALEN; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen); } } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ #ifdef CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - if ( _TRUE == pwdinfo->wfd_info->wfd_enable ) -#endif //CONFIG_IOCTL_CFG80211 - { - wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } -#ifdef CONFIG_IOCTL_CFG80211 - else if (pmlmepriv->wfd_assoc_req_ie != NULL && pmlmepriv->wfd_assoc_req_ie_len>0) - { - //WFD IE - _rtw_memcpy(pframe, pmlmepriv->wfd_assoc_req_ie, pmlmepriv->wfd_assoc_req_ie_len); - pattrib->pktlen += pmlmepriv->wfd_assoc_req_ie_len; - pframe += pmlmepriv->wfd_assoc_req_ie_len; - } -#endif //CONFIG_IOCTL_CFG80211 -#endif //CONFIG_WFD - + wfdielen = rtw_append_assoc_req_wfd_ie(padapter, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif +#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE + pattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_ASSOCREQ_VENDOR_IE_BIT); +#endif pattrib->last_txcmdsz = pattrib->pktlen; dump_mgntframe(padapter, pmgntframe); @@ -9199,7 +8892,7 @@ exit: return; } -//when wait_ack is ture, this function shoule be called at process context +/* when wait_ack is ture, this function shoule be called at process context */ static int _issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ack) { int ret = _FAIL; @@ -9212,24 +8905,23 @@ static int _issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int p struct mlme_ext_priv *pmlmeext; struct mlme_ext_info *pmlmeinfo; - //DBG_871X("%s:%d\n", __FUNCTION__, power_mode); + /* RTW_INFO("%s:%d\n", __FUNCTION__, power_mode); */ - if(!padapter) + if (!padapter) goto exit; - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; pxmitpriv = &(padapter->xmitpriv); pmlmeext = &(padapter->mlmeextpriv); pmlmeinfo = &(pmlmeext->mlmext_info); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) goto exit; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); pattrib->retry_ctrl = _FALSE; @@ -9242,19 +8934,13 @@ static int _issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int p fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { + if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) SetFrDs(fctrl); - } - else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) - { + else if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) SetToDs(fctrl); - } - + if (power_mode) - { SetPwrMgt(fctrl); - } _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); @@ -9269,12 +8955,9 @@ static int _issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int p 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; } @@ -9300,8 +8983,24 @@ int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mod struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct sta_info *psta; + u8 macid_sleep_reg_access = _TRUE; - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) +#ifdef CONFIG_MCC_MODE + if (MCC_EN(padapter)) { + /* driver doesn't access macid sleep reg under MCC */ + if (rtw_hal_check_mcc_status(padapter, MCC_STATUS_DOING_MCC)) { + macid_sleep_reg_access = _FALSE; + + if (da == NULL) { + RTW_INFO("Warning: Do not tx null data to AP under MCC mode\n"); + rtw_warn_on(1); + } + + } + } +#endif + + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; /* da == NULL, assum it's null data for sta to ap*/ @@ -9310,45 +9009,47 @@ int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mod psta = rtw_get_stainfo(&padapter->stapriv, da); if (psta) { - if (power_mode) - rtw_hal_macid_sleep(padapter, psta->mac_id); - else - rtw_hal_macid_wakeup(padapter, psta->mac_id); + if (macid_sleep_reg_access) { + if (power_mode) + rtw_hal_macid_sleep(padapter, psta->mac_id); + else + rtw_hal_macid_wakeup(padapter, psta->mac_id); + } } else { - DBG_871X(FUNC_ADPT_FMT ": Can't find sta info for " MAC_FMT ", skip macid %s!!\n", - FUNC_ADPT_ARG(padapter), MAC_ARG(da), power_mode?"sleep":"wakeup"); + RTW_INFO(FUNC_ADPT_FMT ": Can't find sta info for " MAC_FMT ", skip macid %s!!\n", + FUNC_ADPT_ARG(padapter), MAC_ARG(da), power_mode ? "sleep" : "wakeup"); rtw_warn_on(1); } do { - ret = _issue_nulldata(padapter, da, power_mode, wait_ms>0?_TRUE:_FALSE); + ret = _issue_nulldata(padapter, da, power_mode, wait_ms > 0 ? _TRUE : _FALSE); i++; if (RTW_CANNOT_RUN(padapter)) 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((imlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) goto exit; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); - pattrib->hdrlen +=2; + pattrib->hdrlen += 2; pattrib->qos_en = _TRUE; pattrib->eosp = 1; pattrib->ack_policy = 0; @@ -9420,20 +9120,16 @@ static int _issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, i fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { + if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) SetFrDs(fctrl); - } - else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) - { + else if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) SetToDs(fctrl); - } - if(pattrib->mdata) + if (pattrib->mdata) SetMData(fctrl); qc = (unsigned short *)(pframe + pattrib->hdrlen - 2); - + SetPriority(qc, tid); SetEOSP(qc, pattrib->eosp); @@ -9452,13 +9148,10 @@ static int _issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, i 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; } @@ -9482,43 +9175,42 @@ int issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int try_c struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; /* da == NULL, assum it's null data for sta to ap*/ if (da == NULL) da = get_my_bssid(&(pmlmeinfo->network)); - - do - { - ret = _issue_qos_nulldata(padapter, da, tid, wait_ms>0?_TRUE:_FALSE); + + do { + ret = _issue_qos_nulldata(padapter, da, tid, wait_ms > 0 ? _TRUE : _FALSE); i++; if (RTW_CANNOT_RUN(padapter)) 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((imlmext_info); int ret = _FAIL; #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif //CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif /* CONFIG_P2P */ - //DBG_871X("%s to "MAC_FMT"\n", __func__, MAC_ARG(da)); + /* RTW_INFO("%s to "MAC_FMT"\n", __func__, MAC_ARG(da)); */ #ifdef CONFIG_P2P - if ( !( rtw_p2p_chk_state( pwdinfo, P2P_STATE_NONE ) ) && ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) ) - { - _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey ); - _set_timer( &pwdinfo->reset_ch_sitesurvey, 10 ); + if (!(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) && (pwdinfo->rx_invitereq_info.scan_op_ch_only)) { + _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); + _set_timer(&pwdinfo->reset_ch_sitesurvey, 10); } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) goto exit; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); pattrib->retry_ctrl = _FALSE; @@ -9587,12 +9277,9 @@ static int _issue_deauth(_adapter *padapter, unsigned char *da, unsigned short r 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; } @@ -9603,14 +9290,14 @@ exit: int issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason) { - DBG_871X("%s to "MAC_FMT"\n", __func__, MAC_ARG(da)); + RTW_INFO("%s to "MAC_FMT"\n", __func__, MAC_ARG(da)); return _issue_deauth(padapter, da, reason, _FALSE, IEEE80211W_RIGHT_KEY); } #ifdef CONFIG_IEEE80211W int issue_deauth_11w(_adapter *padapter, unsigned char *da, unsigned short reason, u8 key_type) { - DBG_871X("%s to "MAC_FMT"\n", __func__, MAC_ARG(da)); + RTW_INFO("%s to "MAC_FMT"\n", __func__, MAC_ARG(da)); return _issue_deauth(padapter, da, reason, _FALSE, key_type); } #endif /* CONFIG_IEEE80211W */ @@ -9621,52 +9308,51 @@ int issue_deauth_11w(_adapter *padapter, unsigned char *da, unsigned short reaso * try_cnt means the maximal TX count to try */ int issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_cnt, - int wait_ms) + int wait_ms) { int ret = _FAIL; int i = 0; u32 start = rtw_get_current_time(); - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; - do - { - ret = _issue_deauth(padapter, da, reason, wait_ms > 0 ? _TRUE:_FALSE, IEEE80211W_RIGHT_KEY); + do { + ret = _issue_deauth(padapter, da, reason, wait_ms > 0 ? _TRUE : _FALSE, IEEE80211W_RIGHT_KEY); i++; if (RTW_CANNOT_RUN(padapter)) 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((imlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) return; - DBG_871X(FUNC_NDEV_FMT" ra="MAC_FMT", ch:%u, offset:%u\n", + RTW_INFO(FUNC_NDEV_FMT" ra="MAC_FMT", ch:%u, offset:%u\n", FUNC_NDEV_ARG(padapter->pnetdev), MAC_ARG(ra), new_ch, ch_offset); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -9723,7 +9410,7 @@ void issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_of pframe = rtw_set_ie_ch_switch(pframe, &(pattrib->pktlen), 0, new_ch, 0); pframe = rtw_set_ie_secondary_ch_offset(pframe, &(pattrib->pktlen), - hal_ch_offset_to_secondary_ch_offset(ch_offset)); + hal_ch_offset_to_secondary_ch_offset(ch_offset)); pattrib->last_txcmdsz = pattrib->pktlen; @@ -9746,21 +9433,21 @@ void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned ch struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct sta_info *psta; struct sta_priv *pstapriv = &padapter->stapriv; - struct registry_priv *pregpriv = &padapter->registrypriv; + struct registry_priv *pregpriv = &padapter->registrypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) return; - DBG_871X("%s, %04x\n", __FUNCTION__, tid); + RTW_INFO("%s, %04x\n", __FUNCTION__, tid); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - DBG_871X("%s: alloc_mgtxmitframe fail\n", __FUNCTION__); + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) { + RTW_INFO("%s: alloc_mgtxmitframe fail\n", __FUNCTION__); return; } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); pattrib->key_type = key_type; @@ -9772,7 +9459,7 @@ void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned ch fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - if(raddr) + if (raddr) _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); else _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); @@ -9789,35 +9476,34 @@ void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned ch pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); - switch (action) - { - case 0: //SA Query req - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&pmlmeext->sa_query_seq, &pattrib->pktlen); - pmlmeext->sa_query_seq++; - /* send sa query request to AP, AP should reply sa query response in 1 second */ - if (pattrib->key_type == IEEE80211W_RIGHT_KEY) { - psta = rtw_get_stainfo(pstapriv, raddr); - if (psta != NULL) { - /* DBG_871X("%s, %d, set dot11w_expire_timer\n", __func__, __LINE__); */ - _set_timer(&psta->dot11w_expire_timer, 1000); - } + switch (action) { + case 0: /* SA Query req */ + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&pmlmeext->sa_query_seq, &pattrib->pktlen); + pmlmeext->sa_query_seq++; + /* send sa query request to AP, AP should reply sa query response in 1 second */ + if (pattrib->key_type == IEEE80211W_RIGHT_KEY) { + psta = rtw_get_stainfo(pstapriv, raddr); + if (psta != NULL) { + /* RTW_INFO("%s, %d, set dot11w_expire_timer\n", __func__, __LINE__); */ + _set_timer(&psta->dot11w_expire_timer, 1000); } - break; + } + break; - case 1: //SA Query rsp - tid = cpu_to_le16(tid); - /* DBG_871X("rtw_set_fixed_ie, %04x\n", tid); */ - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&tid, &pattrib->pktlen); - break; - default: - break; + case 1: /* SA Query rsp */ + tid = cpu_to_le16(tid); + /* RTW_INFO("rtw_set_fixed_ie, %04x\n", tid); */ + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&tid, &pattrib->pktlen); + break; + default: + break; } pattrib->last_txcmdsz = pattrib->pktlen; dump_mgntframe(padapter, pmgntframe); } -#endif //CONFIG_IEEE80211W +#endif /* CONFIG_IEEE80211W */ /** * issue_action_ba - internal function to TX Block Ack action frame @@ -9835,7 +9521,7 @@ void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned ch * _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) + , u8 tid, u8 size, u16 status, u8 initiator, int wait_ack) { int ret = _FAIL; u8 category = RTW_WLAN_CATEGORY_BACK; @@ -9853,17 +9539,18 @@ static int issue_action_ba(_adapter *padapter, unsigned char *raddr, unsigned ch struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct sta_info *psta; struct sta_priv *pstapriv = &padapter->stapriv; - struct registry_priv *pregpriv = &padapter->registrypriv; + struct registry_priv *pregpriv = &padapter->registrypriv; #ifdef CONFIG_80211N_HT - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) goto exit; - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -9875,7 +9562,7 @@ static int issue_action_ba(_adapter *padapter, unsigned char *raddr, unsigned ch fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - //_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + /* _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); */ _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); @@ -9890,98 +9577,96 @@ static int issue_action_ba(_adapter *padapter, unsigned char *raddr, unsigned ch pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - if (category == 3) - { - switch (action) - { - 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 (category == 3) { + switch (action) { + 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 | ((tid & 0xf) << 2)); /* immediate ack & 16 buffer size */ - #else - BA_para_set = (0x1002 | ((tid & 0xf) << 2)); /* immediate ack & 64 buffer size */ - #endif +#if defined(CONFIG_RTL8188E) && defined(CONFIG_SDIO_HCI) + BA_para_set = (0x0802 | ((tid & 0xf) << 2)); /* immediate ack & 16 buffer size */ +#else + BA_para_set = (0x1002 | ((tid & 0xf) << 2)); /* immediate ack & 64 buffer size */ +#endif - BA_para_set = cpu_to_le16(BA_para_set); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); + BA_para_set = cpu_to_le16(BA_para_set); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); - //BA_timeout_value = 0xffff;//max: 65535 TUs(~ 65 ms) - BA_timeout_value = 5000;//~ 5ms - BA_timeout_value = cpu_to_le16(BA_timeout_value); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_timeout_value)), &(pattrib->pktlen)); + /* BA_timeout_value = 0xffff; */ /* max: 65535 TUs(~ 65 ms) */ + BA_timeout_value = 5000;/* ~ 5ms */ + BA_timeout_value = cpu_to_le16(BA_timeout_value); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_timeout_value)), &(pattrib->pktlen)); - //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[tid & 0x07]&0xfff) + 1; + /* if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) */ + psta = rtw_get_stainfo(pstapriv, raddr); + if (psta != NULL) { + start_seq = (psta->sta_xmitpriv.txseq_tid[tid & 0x07] & 0xfff) + 1; - DBG_871X("BA_starting_seqctrl = %d for TID=%d\n", start_seq, tid & 0x07); - - 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)); - break; + RTW_INFO("BA_starting_seqctrl = %d for TID=%d\n", start_seq, tid & 0x07); - 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)); + psta->BA_starting_seqctrl[tid & 0x07] = start_seq; - BA_para_set = le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set); + BA_starting_seqctrl = start_seq << 4; + } - BA_para_set &= ~IEEE80211_ADDBA_PARAM_TID_MASK; - BA_para_set |= (tid << 2) & IEEE80211_ADDBA_PARAM_TID_MASK; + BA_starting_seqctrl = cpu_to_le16(BA_starting_seqctrl); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_starting_seqctrl)), &(pattrib->pktlen)); + break; - BA_para_set &= ~RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK; - BA_para_set |= (size << 6) & RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK; + 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)); - if (!padapter->registrypriv.wifi_spec) { - if(pregpriv->ampdu_amsdu==0)//disabled - BA_para_set &= ~BIT(0); - else if(pregpriv->ampdu_amsdu==1)//enabled - BA_para_set |= BIT(0); - } + BA_para_set = le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set); - BA_para_set = cpu_to_le16(BA_para_set); + BA_para_set &= ~IEEE80211_ADDBA_PARAM_TID_MASK; + BA_para_set |= (tid << 2) & IEEE80211_ADDBA_PARAM_TID_MASK; - 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)); - break; + BA_para_set &= ~RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK; + BA_para_set |= (size << 6) & RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK; - 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; + if (!padapter->registrypriv.wifi_spec) { + if (pregpriv->ampdu_amsdu == 0) /* disabled */ + BA_para_set &= ~BIT(0); + else if (pregpriv->ampdu_amsdu == 1) /* enabled */ + BA_para_set |= BIT(0); + } - BA_para_set = cpu_to_le16(BA_para_set); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); - status = cpu_to_le16(status); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(status)), &(pattrib->pktlen)); - break; - default: - break; + BA_para_set = cpu_to_le16(BA_para_set); + + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(pmlmeinfo->ADDBA_req.BA_timeout_value)), &(pattrib->pktlen)); + break; + + 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)); + status = cpu_to_le16(status); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(status)), &(pattrib->pktlen)); + break; + default: + break; } } 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; } exit: -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ return ret; } @@ -9994,14 +9679,14 @@ exit: 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); + , tid + , 0 /* unused */ + , 0 /* unused */ + , 0 /* unused */ + , _FALSE + ); + RTW_INFO(FUNC_ADPT_FMT" ra="MAC_FMT" tid=%u\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(ra), tid); } @@ -10016,14 +9701,70 @@ inline void issue_addba_req(_adapter *adapter, unsigned char *ra, u8 tid) 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); + , tid + , size + , status + , 0 /* unused */ + , _FALSE + ); + RTW_INFO(FUNC_ADPT_FMT" ra="MAC_FMT" status=%u, tid=%u, size=%u\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(ra), status, tid, size); +} + +/** + * issue_addba_rsp_wait_ack - TX ADDBA_RESP and wait ack + * @adapter: the adapter to TX + * @ra: receiver address + * @tid: tid + * @status: status code + * @size: the announced AMPDU buffer size + * @try_cnt: the maximal TX count to try + * @wait_ms: == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT + * > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX + */ +inline u8 issue_addba_rsp_wait_ack(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size, int try_cnt, int wait_ms) +{ + int ret = _FAIL; + int i = 0; + u32 start = rtw_get_current_time(); + + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(adapter))) + goto exit; + + do { + ret = issue_action_ba(adapter, ra, RTW_WLAN_ACTION_ADDBA_RESP + , tid + , size + , status + , 0 /* unused */ + , _TRUE + ); + + i++; + + if (RTW_CANNOT_RUN(adapter)) + 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) { + RTW_INFO(FUNC_ADPT_FMT" ra="MAC_FMT" tid=%u%s, %d/%d in %u ms\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(ra), tid + , ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); + } + +exit: + return ret; } /** @@ -10037,14 +9778,14 @@ inline void issue_addba_rsp(_adapter *adapter, unsigned char *ra, u8 tid, u16 st 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); + , tid + , 0 /* unused */ + , reason + , initiator + , _FALSE + ); + RTW_INFO(FUNC_ADPT_FMT" ra="MAC_FMT" reason=%u, tid=%u, initiator=%u\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(ra), reason, tid, initiator); } /** @@ -10059,23 +9800,23 @@ inline void issue_del_ba(_adapter *adapter, unsigned char *ra, u8 tid, u16 reaso * > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX */ int issue_del_ba_ex(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator - , int try_cnt, int wait_ms) + , int try_cnt, int wait_ms) { int ret = _FAIL; int i = 0; u32 start = rtw_get_current_time(); - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(adapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(adapter))) goto exit; do { ret = issue_action_ba(adapter, ra, RTW_WLAN_ACTION_DELBA - , tid - , 0 /* unused */ - , reason - , initiator - , wait_ms > 0?_TRUE:_FALSE - ); + , tid + , 0 /* unused */ + , reason + , initiator + , wait_ms > 0 ? _TRUE : _FALSE + ); i++; @@ -10089,22 +9830,22 @@ int issue_del_ba_ex(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 if (ret != _FAIL) { ret = _SUCCESS; - #ifndef DBG_XMIT_ACK +#ifndef DBG_XMIT_ACK /* goto exit; */ - #endif +#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" + RTW_INFO(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)); + , ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); } exit: return ret; } static void issue_action_BSSCoexistPacket(_adapter *padapter) -{ +{ _irqL irqL; _list *plist, *phead; unsigned char category, action; @@ -10121,28 +9862,27 @@ static void issue_action_BSSCoexistPacket(_adapter *padapter) _queue *queue = &(pmlmepriv->scanned_queue); u8 InfoContent[16] = {0}; u8 ICS[8][15]; -#ifdef CONFIG_80211N_HT - if((pmlmepriv->num_FortyMHzIntolerant==0) || (pmlmepriv->num_sta_no_ht==0)) +#ifdef CONFIG_80211N_HT + if ((pmlmepriv->num_FortyMHzIntolerant == 0) || (pmlmepriv->num_sta_no_ht == 0)) return; - if(_TRUE == pmlmeinfo->bwmode_updated) + if (_TRUE == pmlmeinfo->bwmode_updated) return; - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) - return; + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) + return; - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); category = RTW_WLAN_CATEGORY_PUBLIC; action = ACT_PUBLIC_BSSCOEXIST; - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -10169,108 +9909,99 @@ static void issue_action_BSSCoexistPacket(_adapter *padapter) pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - // - if(pmlmepriv->num_FortyMHzIntolerant>0) - { - u8 iedata=0; - - iedata |= BIT(2);//20 MHz BSS Width Request + /* */ + if (pmlmepriv->num_FortyMHzIntolerant > 0) { + u8 iedata = 0; + + iedata |= BIT(2);/* 20 MHz BSS Width Request */ pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - } - - // + } + + + /* */ _rtw_memset(ICS, 0, sizeof(ICS)); - if(pmlmepriv->num_sta_no_ht>0) - { + if (pmlmepriv->num_sta_no_ht > 0) { int i; - + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); phead = get_list_head(queue); plist = get_next(phead); - - while(1) - { + + while (1) { int len; u8 *p; WLAN_BSSID_EX *pbss_network; - - if (rtw_end_of_queue_search(phead,plist)== _TRUE) - break; - pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); - + if (rtw_end_of_queue_search(phead, plist) == _TRUE) + break; + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + plist = get_next(plist); pbss_network = (WLAN_BSSID_EX *)&pnetwork->network; p = rtw_get_ie(pbss_network->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pbss_network->IELength - _FIXED_IE_LENGTH_); - if((p==NULL) || (len==0))//non-HT - { - if((pbss_network->Configuration.DSConfig<=0) || (pbss_network->Configuration.DSConfig>14)) + if ((p == NULL) || (len == 0)) { /* non-HT */ + if ((pbss_network->Configuration.DSConfig <= 0) || (pbss_network->Configuration.DSConfig > 14)) continue; - - ICS[0][pbss_network->Configuration.DSConfig]=1; - - if(ICS[0][0] == 0) - ICS[0][0] = 1; - } - - } + + ICS[0][pbss_network->Configuration.DSConfig] = 1; + + if (ICS[0][0] == 0) + ICS[0][0] = 1; + } + + } _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - for(i= 0;i<8;i++) - { - if(ICS[i][0] == 1) - { + for (i = 0; i < 8; i++) { + if (ICS[i][0] == 1) { int j, k = 0; - - InfoContent[k] = i; - //SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent,i); + + InfoContent[k] = i; + /* SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent,i); */ k++; - - for(j=1;j<=14;j++) - { - if(ICS[i][j]==1) - { - if(k<16) - { - InfoContent[k] = j; //channel number - //SET_BSS_INTOLERANT_ELE_CHANNEL(InfoContent+k, j); + + for (j = 1; j <= 14; j++) { + if (ICS[i][j] == 1) { + if (k < 16) { + InfoContent[k] = j; /* channel number */ + /* SET_BSS_INTOLERANT_ELE_CHANNEL(InfoContent+k, j); */ k++; - } - } - } + } + } + } pframe = rtw_set_ie(pframe, EID_BSSIntolerantChlReport, k, InfoContent, &(pattrib->pktlen)); - + } - + } - + } - + pattrib->last_txcmdsz = pattrib->pktlen; dump_mgntframe(padapter, pmgntframe); -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ } -// Spatial Multiplexing Powersave (SMPS) action frame +/* Spatial Multiplexing Powersave (SMPS) action frame */ int _issue_action_SM_PS(_adapter *padapter , unsigned char *raddr , u8 NewMimoPsMode , u8 wait_ack) { int ret = _FAIL; unsigned char category = RTW_WLAN_CATEGORY_HT; - u8 action = RTW_WLAN_ACTION_HT_SM_PS; - u8 sm_power_control=0; + u8 action = RTW_WLAN_ACTION_HT_SM_PS; + u8 sm_power_control = 0; struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; @@ -10281,32 +10012,27 @@ int _issue_action_SM_PS(_adapter *padapter , unsigned char *raddr , u8 NewMimoP struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - if(NewMimoPsMode==WLAN_HT_CAP_SM_PS_DISABLED) - { - sm_power_control = sm_power_control & ~(BIT(0)); // SM Power Save Enable = 0 SM Power Save Disable - } - else if(NewMimoPsMode==WLAN_HT_CAP_SM_PS_STATIC) - { - sm_power_control = sm_power_control | BIT(0); // SM Power Save Enable = 1 SM Power Save Enable - sm_power_control = sm_power_control & ~(BIT(1)); // SM Mode = 0 Static Mode - } - else if(NewMimoPsMode==WLAN_HT_CAP_SM_PS_DYNAMIC) - { - sm_power_control = sm_power_control | BIT(0); // SM Power Save Enable = 1 SM Power Save Enable - sm_power_control = sm_power_control | BIT(1); // SM Mode = 1 Dynamic Mode - } - else + if (NewMimoPsMode == WLAN_HT_CAP_SM_PS_DISABLED) { + sm_power_control = sm_power_control & ~(BIT(0)); /* SM Power Save Enable = 0 SM Power Save Disable */ + } else if (NewMimoPsMode == WLAN_HT_CAP_SM_PS_STATIC) { + sm_power_control = sm_power_control | BIT(0); /* SM Power Save Enable = 1 SM Power Save Enable */ + sm_power_control = sm_power_control & ~(BIT(1)); /* SM Mode = 0 Static Mode */ + } else if (NewMimoPsMode == WLAN_HT_CAP_SM_PS_DYNAMIC) { + sm_power_control = sm_power_control | BIT(0); /* SM Power Save Enable = 1 SM Power Save Enable */ + sm_power_control = sm_power_control | BIT(1); /* SM Mode = 1 Dynamic Mode */ + } else return ret; - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) return ret; - DBG_871X("%s, sm_power_control=%u, NewMimoPsMode=%u\n", __FUNCTION__ , sm_power_control , NewMimoPsMode ); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + RTW_INFO("%s, sm_power_control=%u, NewMimoPsMode=%u\n", __FUNCTION__ , sm_power_control , NewMimoPsMode); + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return ret; - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -10337,18 +10063,15 @@ int _issue_action_SM_PS(_adapter *padapter , unsigned char *raddr , u8 NewMimoP 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; } - if (ret != _SUCCESS) - DBG_8192C("%s, ack to\n", __func__); + if (ret != _SUCCESS) + RTW_INFO("%s, ack to\n", __func__); return ret; } @@ -10364,48 +10087,48 @@ int issue_action_SM_PS_wait_ack(_adapter *padapter, unsigned char *raddr, u8 New int i = 0; u32 start = rtw_get_current_time(); - if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter))) + if (rtw_rfctl_is_tx_blocked_by_ch_waiting(adapter_to_rfctl(padapter))) goto exit; do { - ret = _issue_action_SM_PS(padapter, raddr, NewMimoPsMode , wait_ms>0?_TRUE:_FALSE ); + ret = _issue_action_SM_PS(padapter, raddr, NewMimoPsMode , wait_ms > 0 ? _TRUE : _FALSE); i++; if (RTW_CANNOT_RUN(padapter)) 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((imlmext_info); u16 tid; - if ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + 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) + if (psta == NULL) return _SUCCESS; - #if 0 - DBG_871X("%s:%s\n", __func__, (initiator == 0)?"RX_DIR":"TX_DIR"); +#if 0 + RTW_INFO("%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 + RTW_INFO("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); @@ -10508,17 +10231,14 @@ unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr) unsigned int send_beacon(_adapter *padapter) { u8 bxmitok = _FALSE; - int issue=0; + int issue = 0; int poll = 0; -//#ifdef CONFIG_CONCURRENT_MODE - //struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - //struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - //_adapter *pbuddy_adapter = padapter->pbuddy_adapter; - //struct mlme_priv *pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); -//#endif +#if defined(CONFIG_PCI_HCI) && defined(RTL8814AE_SW_BCN) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#endif #ifdef CONFIG_PCI_HCI - //DBG_871X("%s\n", __FUNCTION__); + /* RTW_INFO("%s\n", __FUNCTION__); */ rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); @@ -10527,6 +10247,12 @@ unsigned int send_beacon(_adapter *padapter) issue_beacon(padapter, 0); +#ifdef RTL8814AE_SW_BCN + if (pHalData->bCorrectBCN != 0) + RTW_INFO("%s, line%d, Warnning, pHalData->bCorrectBCN != 0\n", __func__, __LINE__); + pHalData->bCorrectBCN = 1; +#endif + return _SUCCESS; #endif @@ -10535,35 +10261,32 @@ unsigned int send_beacon(_adapter *padapter) rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); rtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL); - do{ + do { issue_beacon(padapter, 100); issue++; do { rtw_yield_os(); rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8 *)(&bxmitok)); poll++; - } while ((poll%10) != 0 && _FALSE == bxmitok && !RTW_CANNOT_RUN(padapter)); + } while ((poll % 10) != 0 && _FALSE == bxmitok && !RTW_CANNOT_RUN(padapter)); } while (_FALSE == bxmitok && issue < 100 && !RTW_CANNOT_RUN(padapter)); if (RTW_CANNOT_RUN(padapter)) return _FAIL; - - if(_FALSE == bxmitok) - { - DBG_871X("%s fail! %u ms\n", __FUNCTION__, rtw_get_passing_time_ms(start)); + + if (_FALSE == bxmitok) { + RTW_INFO("%s fail! %u ms\n", __FUNCTION__, rtw_get_passing_time_ms(start)); return _FAIL; - } - else - { + } else { u32 passing_time = rtw_get_passing_time_ms(start); - if(passing_time > 100 || issue > 3) - DBG_871X("%s success, issue:%d, poll:%d, %u ms\n", __FUNCTION__, issue, poll, rtw_get_passing_time_ms(start)); - //else - // DBG_871X("%s success, issue:%d, poll:%d, %u ms\n", __FUNCTION__, issue, poll, rtw_get_passing_time_ms(start)); - + if (passing_time > 100 || issue > 3) + RTW_INFO("%s success, issue:%d, poll:%d, %u ms\n", __FUNCTION__, issue, poll, rtw_get_passing_time_ms(start)); + else if (0) + RTW_INFO("%s success, issue:%d, poll:%d, %u ms\n", __FUNCTION__, issue, poll, rtw_get_passing_time_ms(start)); + rtw_hal_fw_correct_bcn(padapter); return _SUCCESS; @@ -10583,19 +10306,20 @@ BOOLEAN IsLegal5GChannel( IN PADAPTER Adapter, IN u8 channel) { - - int i=0; - u8 Channel_5G[45] = {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}; - for(i=0;iu.hdr.rx_data; u32 packet_len = precv_frame->u.hdr.len; u8 ie_offset; - struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); len = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr); - if (len > MAX_IE_SZ) - { - //DBG_871X("IE too long for survey event\n"); + if (len > MAX_IE_SZ) { + /* RTW_INFO("IE too long for survey event\n"); */ return _FAIL; } @@ -10621,73 +10344,63 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI subtype = GetFrameSubType(pframe); - if(subtype==WIFI_BEACON) { + if (subtype == WIFI_BEACON) { bssid->Reserved[0] = 1; ie_offset = _BEACON_IE_OFFSET_; } else { - // FIXME : more type + /* FIXME : more type */ if (subtype == WIFI_PROBERSP) { ie_offset = _PROBERSP_IE_OFFSET_; bssid->Reserved[0] = 3; - } - else if (subtype == WIFI_PROBEREQ) { + } else if (subtype == WIFI_PROBEREQ) { ie_offset = _PROBEREQ_IE_OFFSET_; bssid->Reserved[0] = 2; - } - else { + } else { bssid->Reserved[0] = 0; ie_offset = _FIXED_IE_LENGTH_; } } - + bssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len; - //below is to copy the information element + /* below is to copy the information element */ bssid->IELength = len; _rtw_memcpy(bssid->IEs, (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)), bssid->IELength); - //get the signal strength - //bssid->Rssi = precv_frame->u.hdr.attrib.SignalStrength; // 0-100 index. - bssid->Rssi = precv_frame->u.hdr.attrib.phy_info.RecvSignalPower; // in dBM.raw data - bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.phy_info.SignalQuality;//in percentage - bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.phy_info.SignalStrength;//in percentage + /* get the signal strength */ + /* bssid->Rssi = precv_frame->u.hdr.attrib.SignalStrength; */ /* 0-100 index. */ + bssid->Rssi = precv_frame->u.hdr.attrib.phy_info.RecvSignalPower; /* in dBM.raw data */ + bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.phy_info.SignalQuality;/* in percentage */ + bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.phy_info.SignalStrength;/* in percentage */ #ifdef CONFIG_ANTENNA_DIVERSITY - //rtw_hal_get_hwreg(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna)); - rtw_hal_get_def_var(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); + rtw_hal_get_odm_var(padapter, HAL_ODM_ANTDIV_SELECT, &(bssid->PhyInfo.Optimum_antenna), NULL); #endif - // checking SSID - if ((p = rtw_get_ie(bssid->IEs + ie_offset, _SSID_IE_, &len, bssid->IELength - ie_offset)) == NULL) - { - DBG_871X("marc: cannot find SSID for survey event\n"); + /* checking SSID */ + p = rtw_get_ie(bssid->IEs + ie_offset, _SSID_IE_, &len, bssid->IELength - ie_offset); + if (p == NULL) { + RTW_INFO("marc: cannot find SSID for survey event\n"); return _FAIL; } - if (*(p + 1)) - { - if (len > NDIS_802_11_LENGTH_SSID) - { - DBG_871X("%s()-%d: IE too long (%d) for survey event\n", __FUNCTION__, __LINE__, len); + if (*(p + 1)) { + if (len > NDIS_802_11_LENGTH_SSID) { + RTW_INFO("%s()-%d: IE too long (%d) for survey event\n", __FUNCTION__, __LINE__, len); return _FAIL; } _rtw_memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1)); bssid->Ssid.SsidLength = *(p + 1); - } - else - { + } else bssid->Ssid.SsidLength = 0; - } _rtw_memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); - //checking rate info... + /* checking rate info... */ i = 0; p = rtw_get_ie(bssid->IEs + ie_offset, _SUPPORTEDRATES_IE_, &len, bssid->IELength - ie_offset); - if (p != NULL) - { - if (len > NDIS_802_11_LENGTH_RATES_EX) - { - DBG_871X("%s()-%d: IE too long (%d) for survey event\n", __FUNCTION__, __LINE__, len); + if (p != NULL) { + if (len > NDIS_802_11_LENGTH_RATES_EX) { + RTW_INFO("%s()-%d: IE too long (%d) for survey event\n", __FUNCTION__, __LINE__, len); return _FAIL; } _rtw_memcpy(bssid->SupportedRates, (p + 2), len); @@ -10695,22 +10408,18 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI } p = rtw_get_ie(bssid->IEs + ie_offset, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - ie_offset); - if (p != NULL) - { - if (len > (NDIS_802_11_LENGTH_RATES_EX-i)) - { - DBG_871X("%s()-%d: IE too long (%d) for survey event\n", __FUNCTION__, __LINE__, len); + if (p != NULL) { + if (len > (NDIS_802_11_LENGTH_RATES_EX - i)) { + RTW_INFO("%s()-%d: IE too long (%d) for survey event\n", __FUNCTION__, __LINE__, len); return _FAIL; } _rtw_memcpy(bssid->SupportedRates + i, (p + 2), len); } - //todo: + /* todo: */ #if 0 if (judge_network_type(bssid->SupportedRates, (len + i)) == WIRELESS_11B) - { bssid->NetworkTypeInUse = Ndis802_11DS; - } else #endif { @@ -10718,56 +10427,51 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI } #ifdef CONFIG_P2P - if (subtype == WIFI_PROBEREQ) - { + if (subtype == WIFI_PROBEREQ) { u8 *p2p_ie; u32 p2p_ielen; - // Set Listion Channel - if ((p2p_ie = rtw_get_p2p_ie(bssid->IEs, bssid->IELength, NULL, &p2p_ielen))) - { + /* Set Listion Channel */ + p2p_ie = rtw_get_p2p_ie(bssid->IEs, bssid->IELength, NULL, &p2p_ielen); + if (p2p_ie) { u32 attr_contentlen = 0; u8 listen_ch[5] = { 0x00 }; rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, listen_ch, &attr_contentlen); bssid->Configuration.DSConfig = listen_ch[4]; - } else - { // use current channel + } else { + /* use current channel */ bssid->Configuration.DSConfig = padapter->mlmeextpriv.cur_channel; - DBG_871X("%s()-%d: Cannot get p2p_ie. set DSconfig to op_ch(%d)\n", __FUNCTION__, __LINE__, bssid->Configuration.DSConfig); + RTW_INFO("%s()-%d: Cannot get p2p_ie. set DSconfig to op_ch(%d)\n", __FUNCTION__, __LINE__, bssid->Configuration.DSConfig); } - // FIXME + /* FIXME */ bssid->InfrastructureMode = Ndis802_11Infrastructure; _rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN); bssid->Privacy = 1; return _SUCCESS; } -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ if (bssid->IELength < 12) return _FAIL; - // Checking for DSConfig + /* Checking for DSConfig */ p = rtw_get_ie(bssid->IEs + ie_offset, _DSSET_IE_, &len, bssid->IELength - ie_offset); bssid->Configuration.DSConfig = 0; bssid->Configuration.Length = 0; if (p) - { bssid->Configuration.DSConfig = *(p + 2); - } - else - {// In 5G, some ap do not have DSSET IE - // checking HT info for channel + else { + /* In 5G, some ap do not have DSSET IE */ + /* checking HT info for channel */ p = rtw_get_ie(bssid->IEs + ie_offset, _HT_ADD_INFO_IE_, &len, bssid->IELength - ie_offset); - if(p) - { + if (p) { struct HT_info_element *HT_info = (struct HT_info_element *)(p + 2); bssid->Configuration.DSConfig = HT_info->primary_channel; - } - else - { // use current channel + } else { + /* use current channel */ bssid->Configuration.DSConfig = rtw_get_oper_ch(padapter); } } @@ -10777,13 +10481,10 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI val16 = rtw_get_capability((WLAN_BSSID_EX *)bssid); - if (val16 & BIT(0)) - { + if (val16 & BIT(0)) { bssid->InfrastructureMode = Ndis802_11Infrastructure; _rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN); - } - else - { + } else { bssid->InfrastructureMode = Ndis802_11IBSS; _rtw_memcpy(bssid->MacAddress, GetAddr3Ptr(pframe), ETH_ALEN); } @@ -10795,103 +10496,91 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI bssid->Configuration.ATIMWindow = 0; - //20/40 BSS Coexistence check - if((pregistrypriv->wifi_spec==1) && (_FALSE == pmlmeinfo->bwmode_updated)) - { + /* 20/40 BSS Coexistence check */ + if ((pregistrypriv->wifi_spec == 1) && (_FALSE == pmlmeinfo->bwmode_updated)) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; #ifdef CONFIG_80211N_HT p = rtw_get_ie(bssid->IEs + ie_offset, _HT_CAPABILITY_IE_, &len, bssid->IELength - ie_offset); - if(p && len>0) - { + if (p && len > 0) { struct HT_caps_element *pHT_caps; - pHT_caps = (struct HT_caps_element *)(p + 2); - - if(pHT_caps->u.HT_cap_element.HT_caps_info&BIT(14)) - { + pHT_caps = (struct HT_caps_element *)(p + 2); + + if (pHT_caps->u.HT_cap_element.HT_caps_info & BIT(14)) pmlmepriv->num_FortyMHzIntolerant++; - } - } - else - { + } else pmlmepriv->num_sta_no_ht++; - } -#endif //CONFIG_80211N_HT - +#endif /* CONFIG_80211N_HT */ + } #ifdef CONFIG_INTEL_WIDI - //process_intel_widi_query_or_tigger(padapter, bssid); - if(process_intel_widi_query_or_tigger(padapter, bssid)) - { + /* process_intel_widi_query_or_tigger(padapter, bssid); */ + if (process_intel_widi_query_or_tigger(padapter, bssid)) return _FAIL; - } -#endif // CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ - #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) & 1 - if(strcmp(bssid->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { - DBG_871X("Receiving %s("MAC_FMT", DSConfig:%u) from ch%u with ss:%3u, sq:%3u, RawRSSI:%3ld\n" +#if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) & 1 + if (strcmp(bssid->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { + RTW_INFO("Receiving %s("MAC_FMT", DSConfig:%u) from ch%u with ss:%3u, sq:%3u, RawRSSI:%3ld\n" , bssid->Ssid.Ssid, MAC_ARG(bssid->MacAddress), bssid->Configuration.DSConfig - , rtw_get_oper_ch(padapter) + , rtw_get_oper_ch(padapter) , bssid->PhyInfo.SignalStrength, bssid->PhyInfo.SignalQuality, bssid->Rssi - ); + ); } - #endif +#endif - // mark bss info receving from nearby channel as SignalQuality 101 - if(bssid->Configuration.DSConfig != rtw_get_oper_ch(padapter)) - { - bssid->PhyInfo.SignalQuality= 101; - } + /* mark bss info receving from nearby channel as SignalQuality 101 */ + if (bssid->Configuration.DSConfig != rtw_get_oper_ch(padapter)) + bssid->PhyInfo.SignalQuality = 101; return _SUCCESS; } -void start_create_ibss(_adapter* padapter) +void start_create_ibss(_adapter *padapter) { unsigned short caps; u8 val8; u8 join_type; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network)); + u8 doiqk = _FALSE; pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); - //update wireless mode + /* update wireless mode */ update_wireless_mode(padapter); - //udpate capability + /* udpate capability */ caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork); update_capinfo(padapter, caps); - if(caps&cap_IBSS)//adhoc master - { - //set_opmode_cmd(padapter, adhoc);//removed + if (caps & cap_IBSS) { /* adhoc master */ + /* set_opmode_cmd(padapter, adhoc); */ /* removed */ val8 = 0xcf; rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, NULL); + doiqk = _TRUE; + rtw_hal_set_hwreg(padapter , HW_VAR_DO_IQK , &doiqk); - //switch channel - //SelectChannel(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE); + /* switch channel */ set_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + doiqk = _FALSE; + rtw_hal_set_hwreg(padapter , HW_VAR_DO_IQK , &doiqk); + beacon_timing_control(padapter); - //set msr to WIFI_FW_ADHOC_STATE + /* set msr to WIFI_FW_ADHOC_STATE */ pmlmeinfo->state = WIFI_FW_ADHOC_STATE; Set_MSR(padapter, (pmlmeinfo->state & 0x3)); - //issue beacon - if(send_beacon(padapter)==_FAIL) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing beacon frame fail....\n")); + /* issue beacon */ + if (send_beacon(padapter) == _FAIL) { report_join_res(padapter, -1); pmlmeinfo->state = WIFI_FW_NULL_STATE; - } - else - { + } else { rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress); join_type = 0; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); @@ -10900,64 +10589,60 @@ void start_create_ibss(_adapter* padapter) pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; rtw_indicate_connect(padapter); } - } - else - { - DBG_871X("start_create_ibss, invalid cap:%x\n", caps); + } else { + RTW_INFO("start_create_ibss, invalid cap:%x\n", caps); return; } - //update bc/mc sta_info + /* update bc/mc sta_info */ update_bmc_sta(padapter); } -void start_clnt_join(_adapter* padapter) +void start_clnt_join(_adapter *padapter) { unsigned short caps; u8 val8; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network)); int beacon_timeout; - u8 ASIX_ID[]= {0x00, 0x0E, 0xC6}; + u8 ASIX_ID[] = {0x00, 0x0E, 0xC6}; - //update wireless mode + /* update wireless mode */ update_wireless_mode(padapter); - //udpate capability + /* udpate capability */ caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork); update_capinfo(padapter, caps); - - //check if sta is ASIX peer and fix IOT issue if it is. - if (_rtw_memcmp(get_my_bssid(&pmlmeinfo->network) ,ASIX_ID ,3)) { + + /* check if sta is ASIX peer and fix IOT issue if it is. */ + if (_rtw_memcmp(get_my_bssid(&pmlmeinfo->network) , ASIX_ID , 3)) { u8 iot_flag = _TRUE; rtw_hal_set_hwreg(padapter, HW_VAR_ASIX_IOT, (u8 *)(&iot_flag)); } - - if (caps&cap_ESS) - { + + if (caps & cap_ESS) { Set_MSR(padapter, WIFI_FW_STATION_STATE); - val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; + val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) ? 0xcc : 0xcf; #ifdef CONFIG_WAPI_SUPPORT - if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) - { - //Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. + if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) { + /* Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. */ val8 = 0x4c; } #endif rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - #ifdef CONFIG_DEAUTH_BEFORE_CONNECT - // Because of AP's not receiving deauth before - // AP may: 1)not response auth or 2)deauth us after link is complete - // issue deauth before issuing auth to deal with the situation +#ifdef CONFIG_DEAUTH_BEFORE_CONNECT + /* Because of AP's not receiving deauth before */ + /* AP may: 1)not response auth or 2)deauth us after link is complete */ + /* issue deauth before issuing auth to deal with the situation */ - // Commented by Albert 2012/07/21 - // For the Win8 P2P connection, it will be hard to have a successful connection if this Wi-Fi doesn't connect to it. + /* Commented by Albert 2012/07/21 */ + /* For the Win8 P2P connection, it will be hard to have a successful connection if this Wi-Fi doesn't connect to it. */ { - #ifdef CONFIG_P2P +#ifdef CONFIG_P2P _queue *queue = &(padapter->mlmepriv.scanned_queue); _list *head = get_list_head(queue); _list *pos = get_next(head); @@ -10968,40 +10653,38 @@ void start_clnt_join(_adapter* padapter) _enter_critical_bh(&(padapter->mlmepriv.scanned_queue.lock), &irqL); - for (pos = get_next(head);!rtw_end_of_queue_search(head, pos); pos = get_next(pos)) { - + 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 (_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 - ) { - ie_offset = (scanned->network.Reserved[0] == 2? 0:12); - if (rtw_get_p2p_ie(scanned->network.IEs+ie_offset, scanned->network.IELength-ie_offset, NULL, NULL)) + && _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE + ) { + ie_offset = (scanned->network.Reserved[0] == 2 ? 0 : 12); + if (rtw_get_p2p_ie(scanned->network.IEs + ie_offset, scanned->network.IELength - ie_offset, NULL, NULL)) has_p2p_ie = _TRUE; break; } } - + _exit_critical_bh(&(padapter->mlmepriv.scanned_queue.lock), &irqL); if (scanned == NULL || rtw_end_of_queue_search(head, pos) || has_p2p_ie == _FALSE) - #endif /* CONFIG_P2P */ - //To avoid connecting to AP fail during resume process, change retry count from 5 to 1 +#endif /* CONFIG_P2P */ + /* To avoid connecting to AP fail during resume process, change retry count from 5 to 1 */ issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 1, 100); } - #endif /* CONFIG_DEAUTH_BEFORE_CONNECT */ +#endif /* CONFIG_DEAUTH_BEFORE_CONNECT */ - //here wait for receiving the beacon to start auth - //and enable a timer + /* here wait for receiving the beacon to start auth */ + /* and enable a timer */ beacon_timeout = decide_wait_for_beacon_timeout(pmlmeinfo->bcn_interval); - set_link_timer(pmlmeext, beacon_timeout); - _set_timer( &padapter->mlmepriv.assoc_timer, - (REAUTH_TO * REAUTH_LIMIT) + (REASSOC_TO*REASSOC_LIMIT) +beacon_timeout); - + set_link_timer(pmlmeext, beacon_timeout); + _set_timer(&padapter->mlmepriv.assoc_timer, + (REAUTH_TO * REAUTH_LIMIT) + (REASSOC_TO * REASSOC_LIMIT) + beacon_timeout); + pmlmeinfo->state = WIFI_FW_AUTH_NULL | WIFI_FW_STATION_STATE; - } - else if (caps&cap_IBSS) //adhoc client - { + } else if (caps & cap_IBSS) { /* adhoc client */ Set_MSR(padapter, WIFI_FW_ADHOC_STATE); val8 = 0xcf; @@ -11012,16 +10695,14 @@ void start_clnt_join(_adapter* padapter) pmlmeinfo->state = WIFI_FW_ADHOC_STATE; report_join_res(padapter, 1); - } - else - { - //DBG_871X("marc: invalid cap:%x\n", caps); + } else { + /* RTW_INFO("marc: invalid cap:%x\n", caps); */ return; } } -void start_clnt_auth(_adapter* padapter) +void start_clnt_auth(_adapter *padapter) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -11038,7 +10719,7 @@ void start_clnt_auth(_adapter* padapter) pmlmeext->retry = 0; - DBG_871X_LEVEL(_drv_always_, "start auth\n"); + RTW_PRINT("start auth\n"); issue_auth(padapter, NULL, 0); set_link_timer(pmlmeext, REAUTH_TO); @@ -11046,7 +10727,7 @@ void start_clnt_auth(_adapter* padapter) } -void start_clnt_assoc(_adapter* padapter) +void start_clnt_assoc(_adapter *padapter) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -11061,7 +10742,7 @@ void start_clnt_assoc(_adapter* padapter) set_link_timer(pmlmeext, REASSOC_TO); } -unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason) +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, u8 locally_generated) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -11069,22 +10750,17 @@ unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsi if (!(_rtw_memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) return _SUCCESS; - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); - if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) - { - if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - { - pmlmeinfo->state = WIFI_FW_NULL_STATE; - report_del_sta_event(padapter, MacAddr, reason, _TRUE); - - } - else if (pmlmeinfo->state & WIFI_FW_LINKING_STATE) - { - pmlmeinfo->state = WIFI_FW_NULL_STATE; - report_join_res(padapter, -2); + if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) { + if (report_del_sta_event(padapter, MacAddr, reason, _TRUE, locally_generated) != _FAIL) + pmlmeinfo->state = WIFI_FW_NULL_STATE; + } else if (pmlmeinfo->state & WIFI_FW_LINKING_STATE) { + if (report_join_res(padapter, -2) != _FAIL) + pmlmeinfo->state = WIFI_FW_NULL_STATE; } else - DBG_871X(FUNC_ADPT_FMT" - End to Disconnect\n", FUNC_ADPT_ARG(padapter)); + RTW_INFO(FUNC_ADPT_FMT" - End to Disconnect\n", FUNC_ADPT_ARG(padapter)); } return _SUCCESS; @@ -11103,22 +10779,23 @@ static void process_80211d(PADAPTER padapter, WLAN_BSSID_EX *bssid) pregistrypriv = &padapter->registrypriv; pmlmeext = &padapter->mlmeextpriv; - // Adjust channel plan by AP Country IE - if (pregistrypriv->enable80211d && - (!pmlmeext->update_channel_plan_by_ap_done)) - { + /* Adjust channel plan by AP Country IE */ + if (pregistrypriv->enable80211d + && (!pmlmeext->update_channel_plan_by_ap_done)) { u8 *ie, *p; u32 len; RT_CHANNEL_PLAN chplan_ap; RT_CHANNEL_INFO chplan_sta[MAX_CHANNEL_NUM]; u8 country[4]; - u8 fcn; // first channel number - u8 noc; // number of channel + u8 fcn; /* first channel number */ + u8 noc; /* number of channel */ u8 j, k; ie = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _COUNTRY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - if (!ie) return; - if (len < 6) return; + if (!ie) + return; + if (len < 6) + return; ie += 2; p = ie; @@ -11127,82 +10804,76 @@ static void process_80211d(PADAPTER padapter, WLAN_BSSID_EX *bssid) _rtw_memset(country, 0, 4); _rtw_memcpy(country, p, 3); p += 3; - RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, - ("%s: 802.11d country=%s\n", __FUNCTION__, country)); + RTW_INFO("%s: 802.11d country=%s\n", __FUNCTION__, country); i = 0; - while ((ie - p) >= 3) - { + while ((ie - p) >= 3) { fcn = *(p++); noc = *(p++); p++; - for (j = 0; j < noc; j++) - { - if (fcn <= 14) channel = fcn + j; // 2.4 GHz - else channel = fcn + j*4; // 5 GHz + for (j = 0; j < noc; j++) { + if (fcn <= 14) + channel = fcn + j; /* 2.4 GHz */ + else + channel = fcn + j * 4; /* 5 GHz */ chplan_ap.Channel[i++] = channel; } } chplan_ap.Len = i; -#ifdef CONFIG_DEBUG_RTL871X +#ifdef CONFIG_RTW_DEBUG i = 0; - DBG_871X("%s: AP[%s] channel plan {", __FUNCTION__, bssid->Ssid.Ssid); - while ((i < chplan_ap.Len) && (chplan_ap.Channel[i] != 0)) - { - DBG_8192C("%02d,", chplan_ap.Channel[i]); + RTW_INFO("%s: AP[%s] channel plan {", __FUNCTION__, bssid->Ssid.Ssid); + while ((i < chplan_ap.Len) && (chplan_ap.Channel[i] != 0)) { + _RTW_INFO("%02d,", chplan_ap.Channel[i]); i++; } - DBG_871X("}\n"); + _RTW_INFO("}\n"); #endif _rtw_memcpy(chplan_sta, pmlmeext->channel_set, sizeof(chplan_sta)); -#ifdef CONFIG_DEBUG_RTL871X +#ifdef CONFIG_RTW_DEBUG i = 0; - DBG_871X("%s: STA channel plan {", __FUNCTION__); - while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0)) - { - DBG_871X("%02d(%c),", chplan_sta[i].ChannelNum, chplan_sta[i].ScanType==SCAN_PASSIVE?'p':'a'); + RTW_INFO("%s: STA channel plan {", __FUNCTION__); + while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0)) { + _RTW_INFO("%02d(%c),", chplan_sta[i].ChannelNum, chplan_sta[i].ScanType == SCAN_PASSIVE ? 'p' : 'a'); i++; } - DBG_871X("}\n"); + _RTW_INFO("}\n"); #endif _rtw_memset(pmlmeext->channel_set, 0, sizeof(pmlmeext->channel_set)); chplan_new = pmlmeext->channel_set; i = j = k = 0; - if (pregistrypriv->wireless_mode & WIRELESS_11G) - { + if (pregistrypriv->wireless_mode & WIRELESS_11G) { do { - if ((i == MAX_CHANNEL_NUM) || - (chplan_sta[i].ChannelNum == 0) || - (chplan_sta[i].ChannelNum > 14)) + if ((i == MAX_CHANNEL_NUM) + || (chplan_sta[i].ChannelNum == 0) + || (chplan_sta[i].ChannelNum > 14)) break; if ((j == chplan_ap.Len) || (chplan_ap.Channel[j] > 14)) break; - if (chplan_sta[i].ChannelNum == chplan_ap.Channel[j]) - { + if (chplan_sta[i].ChannelNum == chplan_ap.Channel[j]) { chplan_new[k].ChannelNum = chplan_ap.Channel[j]; chplan_new[k].ScanType = SCAN_ACTIVE; i++; j++; k++; - } - else if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j]) - { + } else if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j]) { chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; -// chplan_new[k].ScanType = chplan_sta[i].ScanType; +#if 0 + chplan_new[k].ScanType = chplan_sta[i].ScanType; +#else chplan_new[k].ScanType = SCAN_PASSIVE; +#endif i++; k++; - } - else if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j]) - { + } else if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j]) { chplan_new[k].ChannelNum = chplan_ap.Channel[j]; chplan_new[k].ScanType = SCAN_ACTIVE; j++; @@ -11210,75 +10881,68 @@ static void process_80211d(PADAPTER padapter, WLAN_BSSID_EX *bssid) } } while (1); - // change AP not support channel to Passive scan - while ((i < MAX_CHANNEL_NUM) && - (chplan_sta[i].ChannelNum != 0) && - (chplan_sta[i].ChannelNum <= 14)) - { + /* change AP not support channel to Passive scan */ + while ((i < MAX_CHANNEL_NUM) + && (chplan_sta[i].ChannelNum != 0) + && (chplan_sta[i].ChannelNum <= 14)) { chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; -// chplan_new[k].ScanType = chplan_sta[i].ScanType; +#if 0 + chplan_new[k].ScanType = chplan_sta[i].ScanType; +#else chplan_new[k].ScanType = SCAN_PASSIVE; +#endif i++; k++; } - // add channel AP supported - while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14)) - { + /* add channel AP supported */ + while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14)) { chplan_new[k].ChannelNum = chplan_ap.Channel[j]; chplan_new[k].ScanType = SCAN_ACTIVE; j++; k++; } - } - else - { - // keep original STA 2.4G channel plan - while ((i < MAX_CHANNEL_NUM) && - (chplan_sta[i].ChannelNum != 0) && - (chplan_sta[i].ChannelNum <= 14)) - { + } else { + /* keep original STA 2.4G channel plan */ + while ((i < MAX_CHANNEL_NUM) + && (chplan_sta[i].ChannelNum != 0) + && (chplan_sta[i].ChannelNum <= 14)) { chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; chplan_new[k].ScanType = chplan_sta[i].ScanType; i++; k++; } - // skip AP 2.4G channel plan + /* skip AP 2.4G channel plan */ while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14)) - { j++; - } } - if (pregistrypriv->wireless_mode & WIRELESS_11A) - { + if (pregistrypriv->wireless_mode & WIRELESS_11A) { do { - if ((i >= MAX_CHANNEL_NUM) || - (chplan_sta[i].ChannelNum == 0)) + if ((i >= MAX_CHANNEL_NUM) + || (chplan_sta[i].ChannelNum == 0)) break; if ((j == chplan_ap.Len) || (chplan_ap.Channel[j] == 0)) break; - if (chplan_sta[i].ChannelNum == chplan_ap.Channel[j]) - { + if (chplan_sta[i].ChannelNum == chplan_ap.Channel[j]) { chplan_new[k].ChannelNum = chplan_ap.Channel[j]; chplan_new[k].ScanType = SCAN_ACTIVE; i++; j++; k++; - } - else if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j]) - { + } else if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j]) { chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; -// chplan_new[k].ScanType = chplan_sta[i].ScanType; +#if 0 + chplan_new[k].ScanType = chplan_sta[i].ScanType; +#else chplan_new[k].ScanType = SCAN_PASSIVE; +#endif i++; k++; - } - else if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j]) - { + } else if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j]) { chplan_new[k].ChannelNum = chplan_ap.Channel[j]; chplan_new[k].ScanType = SCAN_ACTIVE; j++; @@ -11286,30 +10950,28 @@ static void process_80211d(PADAPTER padapter, WLAN_BSSID_EX *bssid) } } while (1); - // change AP not support channel to Passive scan - while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0)) - { + /* change AP not support channel to Passive scan */ + while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0)) { chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; -// chplan_new[k].ScanType = chplan_sta[i].ScanType; +#if 0 + chplan_new[k].ScanType = chplan_sta[i].ScanType; +#else chplan_new[k].ScanType = SCAN_PASSIVE; +#endif i++; k++; } - // add channel AP supported - while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] != 0)) - { + /* add channel AP supported */ + while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] != 0)) { chplan_new[k].ChannelNum = chplan_ap.Channel[j]; chplan_new[k].ScanType = SCAN_ACTIVE; j++; k++; } - } - else - { - // keep original STA 5G channel plan - while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0)) - { + } else { + /* keep original STA 5G channel plan */ + while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0)) { chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum; chplan_new[k].ScanType = chplan_sta[i].ScanType; i++; @@ -11319,27 +10981,24 @@ static void process_80211d(PADAPTER padapter, WLAN_BSSID_EX *bssid) pmlmeext->update_channel_plan_by_ap_done = 1; -#ifdef CONFIG_DEBUG_RTL871X +#ifdef CONFIG_RTW_DEBUG k = 0; - DBG_871X("%s: new STA channel plan {", __FUNCTION__); - while ((k < MAX_CHANNEL_NUM) && (chplan_new[k].ChannelNum != 0)) - { - DBG_871X("%02d(%c),", chplan_new[k].ChannelNum, chplan_new[k].ScanType==SCAN_PASSIVE?'p':'c'); + RTW_INFO("%s: new STA channel plan {", __FUNCTION__); + while ((k < MAX_CHANNEL_NUM) && (chplan_new[k].ChannelNum != 0)) { + _RTW_INFO("%02d(%c),", chplan_new[k].ChannelNum, chplan_new[k].ScanType == SCAN_PASSIVE ? 'p' : 'c'); k++; } - DBG_871X("}\n"); + _RTW_INFO("}\n"); #endif #if 0 - // recover the right channel index + /* recover the right channel index */ channel = chplan_sta[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; k = 0; - while ((k < MAX_CHANNEL_NUM) && (chplan_new[k].ChannelNum != 0)) - { + while ((k < MAX_CHANNEL_NUM) && (chplan_new[k].ChannelNum != 0)) { if (chplan_new[k].ChannelNum == channel) { - RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, - ("%s: change mlme_ext sitesurvey channel index from %d to %d\n", - __FUNCTION__, pmlmeext->sitesurvey_res.channel_idx, k)); + RTW_INFO("%s: change mlme_ext sitesurvey channel index from %d to %d\n", + __FUNCTION__, pmlmeext->sitesurvey_res.channel_idx, k); pmlmeext->sitesurvey_res.channel_idx = k; break; } @@ -11348,24 +11007,20 @@ static void process_80211d(PADAPTER padapter, WLAN_BSSID_EX *bssid) #endif } - // If channel is used by AP, set channel scan type to active + /* If channel is used by AP, set channel scan type to active */ channel = bssid->Configuration.DSConfig; chplan_new = pmlmeext->channel_set; i = 0; - while ((i < MAX_CHANNEL_NUM) && (chplan_new[i].ChannelNum != 0)) - { - if (chplan_new[i].ChannelNum == channel) - { - if (chplan_new[i].ScanType == SCAN_PASSIVE) - { - //5G Bnad 2, 3 (DFS) doesn't change to active scan - if(channel >= 52 && channel <= 144) + while ((i < MAX_CHANNEL_NUM) && (chplan_new[i].ChannelNum != 0)) { + if (chplan_new[i].ChannelNum == channel) { + if (chplan_new[i].ScanType == SCAN_PASSIVE) { + /* 5G Bnad 2, 3 (DFS) doesn't change to active scan */ + if (channel >= 52 && channel <= 144) break; - + chplan_new[i].ScanType = SCAN_ACTIVE; - RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, - ("%s: change channel %d scan type from passive to active\n", - __FUNCTION__, channel)); + RTW_INFO("%s: change channel %d scan type from passive to active\n", + __FUNCTION__, channel); } break; } @@ -11389,24 +11044,23 @@ void report_survey_event(_adapter *padapter, union recv_frame *precv_frame) struct C2HEvent_Header *pc2h_evt_hdr; struct mlme_ext_priv *pmlmeext; struct cmd_priv *pcmdpriv; - //u8 *pframe = precv_frame->u.hdr.rx_data; - //uint len = precv_frame->u.hdr.len; + /* u8 *pframe = precv_frame->u.hdr.rx_data; */ + /* uint len = precv_frame->u.hdr.len; */ - if(!padapter) + if (!padapter) return; pmlmeext = &padapter->mlmeextpriv; pcmdpriv = &padapter->cmdpriv; - - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { + + pcmd_obj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmd_obj == NULL) return; - } cmdsz = (sizeof(struct survey_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { + pevtcmd = (u8 *)rtw_zmalloc(cmdsz); + if (pevtcmd == NULL) { rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); return; } @@ -11420,15 +11074,14 @@ void report_survey_event(_adapter *padapter, union recv_frame *precv_frame) pcmd_obj->rsp = NULL; pcmd_obj->rspsz = 0; - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); pc2h_evt_hdr->len = sizeof(struct survey_event); pc2h_evt_hdr->ID = GEN_EVT_CODE(_Survey); pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - psurvey_evt = (struct survey_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + psurvey_evt = (struct survey_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); - if (collect_bss_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL) - { + if (collect_bss_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL) { rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); rtw_mfree((u8 *)pevtcmd, cmdsz); return; @@ -11456,14 +11109,13 @@ void report_surveydone_event(_adapter *padapter) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { + pcmd_obj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmd_obj == NULL) return; - } cmdsz = (sizeof(struct surveydone_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { + pevtcmd = (u8 *)rtw_zmalloc(cmdsz); + if (pevtcmd == NULL) { rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); return; } @@ -11477,15 +11129,15 @@ void report_surveydone_event(_adapter *padapter) pcmd_obj->rsp = NULL; pcmd_obj->rspsz = 0; - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); pc2h_evt_hdr->len = sizeof(struct surveydone_event); pc2h_evt_hdr->ID = GEN_EVT_CODE(_SurveyDone); pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - psurveydone_evt = (struct surveydone_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + psurveydone_evt = (struct surveydone_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); psurveydone_evt->bss_cnt = pmlmeext->sitesurvey_res.bss_cnt; - DBG_871X("survey done event(%x) band:%d for "ADPT_FMT"\n", psurveydone_evt->bss_cnt, padapter->setband, ADPT_ARG(padapter)); + RTW_INFO("survey done event(%x) band:%d for "ADPT_FMT"\n", psurveydone_evt->bss_cnt, padapter->setband, ADPT_ARG(padapter)); rtw_enqueue_cmd(pcmdpriv, pcmd_obj); @@ -11493,7 +11145,7 @@ void report_surveydone_event(_adapter *padapter) } -void report_join_res(_adapter *padapter, int res) +u32 report_join_res(_adapter *padapter, int res) { struct cmd_obj *pcmd_obj; u8 *pevtcmd; @@ -11503,17 +11155,17 @@ void report_join_res(_adapter *padapter, int res) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u32 ret = _FAIL; - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - return; - } + pcmd_obj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmd_obj == NULL) + goto exit; cmdsz = (sizeof(struct joinbss_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { + pevtcmd = (u8 *)rtw_zmalloc(cmdsz); + if (pevtcmd == NULL) { rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); - return; + goto exit; } _rtw_init_listhead(&pcmd_obj->list); @@ -11525,25 +11177,25 @@ void report_join_res(_adapter *padapter, int res) pcmd_obj->rsp = NULL; pcmd_obj->rspsz = 0; - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); pc2h_evt_hdr->len = sizeof(struct joinbss_event); pc2h_evt_hdr->ID = GEN_EVT_CODE(_JoinBss); pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - pjoinbss_evt = (struct joinbss_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + pjoinbss_evt = (struct joinbss_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); _rtw_memcpy((unsigned char *)(&(pjoinbss_evt->network.network)), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX)); - pjoinbss_evt->network.join_res = pjoinbss_evt->network.aid = res; + pjoinbss_evt->network.join_res = pjoinbss_evt->network.aid = res; + + RTW_INFO("report_join_res(%d)\n", res); + - DBG_871X("report_join_res(%d)\n", res); - - rtw_joinbss_event_prehandle(padapter, (u8 *)&pjoinbss_evt->network); - - - rtw_enqueue_cmd(pcmdpriv, pcmd_obj); - return; + ret = rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + +exit: + return ret; } void report_wmm_edca_update(_adapter *padapter) @@ -11557,14 +11209,13 @@ void report_wmm_edca_update(_adapter *padapter) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { + pcmd_obj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmd_obj == NULL) return; - } cmdsz = (sizeof(struct wmm_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { + pevtcmd = (u8 *)rtw_zmalloc(cmdsz); + if (pevtcmd == NULL) { rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); return; } @@ -11578,21 +11229,21 @@ void report_wmm_edca_update(_adapter *padapter) pcmd_obj->rsp = NULL; pcmd_obj->rspsz = 0; - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); pc2h_evt_hdr->len = sizeof(struct wmm_event); pc2h_evt_hdr->ID = GEN_EVT_CODE(_WMM); pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - pwmm_event = (struct wmm_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); - pwmm_event->wmm =0; - + pwmm_event = (struct wmm_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); + pwmm_event->wmm = 0; + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); return; } -void report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, bool enqueue) +u32 report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, bool enqueue, u8 locally_generated) { struct cmd_obj *pcmd_obj; u8 *pevtcmd; @@ -11613,20 +11264,21 @@ void report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned s goto exit; } - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); pc2h_evt_hdr->len = sizeof(struct stadel_event); pc2h_evt_hdr->ID = GEN_EVT_CODE(_DelSTA); pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - pdel_sta_evt = (struct stadel_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + pdel_sta_evt = (struct stadel_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); _rtw_memcpy((unsigned char *)(&(pdel_sta_evt->macaddr)), MacAddr, ETH_ALEN); - _rtw_memcpy((unsigned char *)(pdel_sta_evt->rsvd),(unsigned char *)(&reason),2); + _rtw_memcpy((unsigned char *)(pdel_sta_evt->rsvd), (unsigned char *)(&reason), 2); psta = rtw_get_stainfo(&padapter->stapriv, MacAddr); - if(psta) - mac_id = (int)psta->mac_id; + if (psta) + mac_id = (int)psta->mac_id; else mac_id = (-1); pdel_sta_evt->mac_id = mac_id; + pdel_sta_evt->locally_generated = locally_generated; if (!enqueue) { /* do directly */ @@ -11653,13 +11305,13 @@ void report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned s exit: - DBG_871X(FUNC_ADPT_FMT" "MAC_FMT" mac_id=%d, enqueue:%d, res:%u\n" + RTW_INFO(FUNC_ADPT_FMT" "MAC_FMT" mac_id=%d, enqueue:%d, res:%u\n" , FUNC_ADPT_ARG(padapter), MAC_ARG(MacAddr), mac_id, enqueue, res); - return; + return res; } -void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx) +void report_add_sta_event(_adapter *padapter, unsigned char *MacAddr) { struct cmd_obj *pcmd_obj; u8 *pevtcmd; @@ -11669,14 +11321,13 @@ void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_id struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { + pcmd_obj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (pcmd_obj == NULL) return; - } cmdsz = (sizeof(struct stassoc_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { + pevtcmd = (u8 *)rtw_zmalloc(cmdsz); + if (pevtcmd == NULL) { rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); return; } @@ -11690,16 +11341,15 @@ void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_id pcmd_obj->rsp = NULL; pcmd_obj->rspsz = 0; - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd); pc2h_evt_hdr->len = sizeof(struct stassoc_event); pc2h_evt_hdr->ID = GEN_EVT_CODE(_AddSTA); pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - padd_sta_evt = (struct stassoc_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + padd_sta_evt = (struct stassoc_event *)(pevtcmd + sizeof(struct C2HEvent_Header)); _rtw_memcpy((unsigned char *)(&(padd_sta_evt->macaddr)), MacAddr, ETH_ALEN); - padd_sta_evt->cam_id = cam_idx; - DBG_871X("report_add_sta_event: add STA\n"); + RTW_INFO("report_add_sta_event: add STA\n"); rtw_enqueue_cmd(pcmdpriv, pcmd_obj); @@ -11721,11 +11371,10 @@ bool rtw_port_switch_chk(_adapter *adapter) int i; for (i = 0; i < dvobj->iface_nums; i++) { - if (get_iface_type(dvobj->padapters[i]) == IFACE_PORT0) { + if (get_hw_port(dvobj->padapters[i]) == HW_PORT0) { if_port0 = dvobj->padapters[i]; if_port0_mlmeinfo = &(if_port0->mlmeextpriv.mlmext_info); - } - else if (get_iface_type(dvobj->padapters[i]) == IFACE_PORT1) { + } else if (get_hw_port(dvobj->padapters[i]) == HW_PORT1) { if_port1 = dvobj->padapters[i]; if_port1_mlmeinfo = &(if_port1->mlmeextpriv.mlmext_info); } @@ -11742,10 +11391,10 @@ bool rtw_port_switch_chk(_adapter *adapter) } #ifdef DBG_RUNTIME_PORT_SWITCH - DBG_871X(FUNC_ADPT_FMT" wowlan_mode:%u\n" - ADPT_FMT", port0, mlmeinfo->state:0x%08x, p2p_state:%d, %d\n" - ADPT_FMT", port1, mlmeinfo->state:0x%08x, p2p_state:%d, %d\n", - FUNC_ADPT_ARG(adapter), pwrctl->wowlan_mode, + RTW_INFO(FUNC_ADPT_FMT" wowlan_mode:%u\n" + ADPT_FMT", port0, mlmeinfo->state:0x%08x, p2p_state:%d, %d\n" + ADPT_FMT", port1, mlmeinfo->state:0x%08x, p2p_state:%d, %d\n", + FUNC_ADPT_ARG(adapter), pwrctl->wowlan_mode, ADPT_ARG(if_port0), if_port0_mlmeinfo->state, rtw_p2p_state(&if_port0->wdinfo), rtw_p2p_chk_state(&if_port0->wdinfo, P2P_STATE_NONE), ADPT_ARG(if_port1), if_port1_mlmeinfo->state, rtw_p2p_state(&if_port1->wdinfo), rtw_p2p_chk_state(&if_port1->wdinfo, P2P_STATE_NONE)); #endif /* DBG_RUNTIME_PORT_SWITCH */ @@ -11753,8 +11402,8 @@ bool rtw_port_switch_chk(_adapter *adapter) #ifdef CONFIG_WOWLAN /* WOWLAN interface(primary, for now) should be port0 */ if (pwrctl->wowlan_mode == _TRUE) { - if(!is_primary_adapter(if_port0)) { - DBG_871X("%s "ADPT_FMT" enable WOWLAN\n", __func__, ADPT_ARG(if_port1)); + if (!is_primary_adapter(if_port0)) { + RTW_INFO("%s "ADPT_FMT" enable WOWLAN\n", __func__, ADPT_ARG(if_port1)); switch_needed = _TRUE; } goto exit; @@ -11763,35 +11412,37 @@ bool rtw_port_switch_chk(_adapter *adapter) /* AP should use port0 for ctl frame's ack */ if ((if_port1_mlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { - DBG_871X("%s "ADPT_FMT" is AP/GO\n", __func__, ADPT_ARG(if_port1)); + RTW_INFO("%s "ADPT_FMT" is AP/GO\n", __func__, ADPT_ARG(if_port1)); switch_needed = _TRUE; goto exit; } - /* GC should use port0 for p2p ps */ + /* GC should use port0 for p2p ps */ if (((if_port1_mlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) - && (if_port1_mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - && !rtw_p2p_chk_state(&if_port1->wdinfo, P2P_STATE_NONE) - && !check_fwstate(&if_port1->mlmepriv, WIFI_UNDER_WPS) - ) { - DBG_871X("%s "ADPT_FMT" is GC\n", __func__, ADPT_ARG(if_port1)); + && (if_port1_mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) +#ifdef CONFIG_P2P + && !rtw_p2p_chk_state(&if_port1->wdinfo, P2P_STATE_NONE) +#endif + && !check_fwstate(&if_port1->mlmepriv, WIFI_UNDER_WPS) + ) { + RTW_INFO("%s "ADPT_FMT" is GC\n", __func__, ADPT_ARG(if_port1)); switch_needed = _TRUE; goto exit; } /* port1 linked, but port0 not linked */ if ((if_port1_mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - && !(if_port0_mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - && ((if_port0_mlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) - ) { - DBG_871X("%s "ADPT_FMT" is SINGLE_LINK\n", __func__, ADPT_ARG(if_port1)); + && !(if_port0_mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) + && ((if_port0_mlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) + ) { + RTW_INFO("%s "ADPT_FMT" is SINGLE_LINK\n", __func__, ADPT_ARG(if_port1)); switch_needed = _TRUE; goto exit; } exit: #ifdef DBG_RUNTIME_PORT_SWITCH - DBG_871X(FUNC_ADPT_FMT" ret:%d\n", FUNC_ADPT_ARG(adapter), switch_needed); + RTW_INFO(FUNC_ADPT_FMT" ret:%d\n", FUNC_ADPT_ARG(adapter), switch_needed); #endif /* DBG_RUNTIME_PORT_SWITCH */ #endif /* CONFIG_RUNTIME_PORT_SWITCH */ #endif /* CONFIG_CONCURRENT_MODE */ @@ -11804,7 +11455,7 @@ Following are the event callback functions *****************************************************************************/ -//for sta/adhoc mode +/* for sta/adhoc mode */ void update_sta_info(_adapter *padapter, struct sta_info *psta) { _irqL irqL; @@ -11812,18 +11463,17 @@ void update_sta_info(_adapter *padapter, struct sta_info *psta) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - //ERP + /* ERP */ VCS_update(padapter, psta); #ifdef CONFIG_80211N_HT - //HT - if(pmlmepriv->htpriv.ht_option) - { + /* HT */ + if (pmlmepriv->htpriv.ht_option) { psta->htpriv.ht_option = _TRUE; psta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable; - psta->htpriv.rx_ampdu_min_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2; + psta->htpriv.rx_ampdu_min_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & IEEE80211_HT_CAP_AMPDU_DENSITY) >> 2; if (support_short_GI(padapter, &(pmlmeinfo->HT_caps), CHANNEL_WIDTH_20)) psta->htpriv.sgi_20m = _TRUE; @@ -11838,38 +11488,37 @@ void update_sta_info(_adapter *padapter, struct sta_info *psta) psta->htpriv.beamform_cap = pmlmepriv->htpriv.beamform_cap; _rtw_memcpy(&psta->htpriv.ht_cap, &pmlmeinfo->HT_caps, sizeof(struct rtw_ieee80211_ht_cap)); - } - else -#endif //CONFIG_80211N_HT + } else +#endif /* CONFIG_80211N_HT */ { #ifdef CONFIG_80211N_HT psta->htpriv.ht_option = _FALSE; psta->htpriv.ampdu_enable = _FALSE; - + psta->htpriv.sgi_20m = _FALSE; psta->htpriv.sgi_40m = _FALSE; -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ psta->qos_option = _FALSE; } #ifdef CONFIG_80211N_HT psta->htpriv.ch_offset = pmlmeext->cur_ch_offset; - - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset -#endif //CONFIG_80211N_HT + + psta->htpriv.agg_enable_bitmap = 0x0;/* reset */ + psta->htpriv.candidate_tid_bitmap = 0x0;/* reset */ +#endif /* CONFIG_80211N_HT */ psta->bw_mode = pmlmeext->cur_bwmode; - //QoS - if(pmlmepriv->qospriv.qos_option) + /* QoS */ + if (pmlmepriv->qospriv.qos_option) psta->qos_option = _TRUE; #ifdef CONFIG_80211AC_VHT _rtw_memcpy(&psta->vhtpriv, &pmlmepriv->vhtpriv, sizeof(struct vht_priv)); -#endif //CONFIG_80211AC_VHT +#endif /* CONFIG_80211AC_VHT */ update_ldpc_stbc_cap(psta); @@ -11884,52 +11533,40 @@ static void rtw_mlmeext_disconnect(_adapter *padapter) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); - u8 state_backup = (pmlmeinfo->state&0x03); - u8 ASIX_ID[]= {0x00, 0x0E, 0xC6}; + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network)); + u8 state_backup = (pmlmeinfo->state & 0x03); + u8 ASIX_ID[] = {0x00, 0x0E, 0xC6}; - //set_opmode_cmd(padapter, infra_client_with_mlme); - -#if 1 - /* - * For safety, prevent from keeping macid sleep. - * If we can sure all power mode enter/leave are paired, - * this check can be removed. - * Lucas@20131113 - */ - /* wakeup macid after disconnect. */ - { - struct sta_info *psta; - psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork)); - if (psta) - rtw_hal_macid_wakeup(padapter, psta->mac_id); - } -#endif + /* set_opmode_cmd(padapter, infra_client_with_mlme); */ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0); rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr); - //set MSR to no link state -> infra. mode + /* set MSR to no link state->infra. mode */ Set_MSR(padapter, _HW_STATE_STATION_); - //check if sta is ASIX peer and fix IOT issue if it is. - if (_rtw_memcmp(get_my_bssid(&pmlmeinfo->network) ,ASIX_ID ,3)) { + /* check if sta is ASIX peer and fix IOT issue if it is. */ + if (_rtw_memcmp(get_my_bssid(&pmlmeinfo->network) , ASIX_ID , 3)) { u8 iot_flag = _FALSE; rtw_hal_set_hwreg(padapter, HW_VAR_ASIX_IOT, (u8 *)(&iot_flag)); } pmlmeinfo->state = WIFI_FW_NULL_STATE; - if(state_backup == WIFI_FW_STATION_STATE) - { +#ifdef CONFIG_MCC_MODE + /* mcc disconnect setting before download LPS rsvd page */ + rtw_hal_set_mcc_setting_disconnect(padapter); +#endif /* CONFIG_MCC_MODE */ + + if (state_backup == WIFI_FW_STATION_STATE) { if (rtw_port_switch_chk(padapter) == _TRUE) { rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL); - #ifdef CONFIG_LPS +#ifdef CONFIG_LPS { _adapter *port0_iface = dvobj_get_port0_adapter(adapter_to_dvobj(padapter)); if (port0_iface) rtw_lps_ctrl_wk_cmd(port0_iface, LPS_CTRL_CONNECT, 0); } - #endif +#endif } } @@ -11952,15 +11589,17 @@ static void rtw_mlmeext_disconnect(_adapter *padapter) { u8 ch, bw, offset; - if (rtw_get_ch_setting_union_no_self(padapter, &ch, &bw, &offset) != 0) + if (rtw_mi_get_ch_setting_union_no_self(padapter, &ch, &bw, &offset) != 0) { set_channel_bwmode(padapter, ch, offset, bw); + rtw_mi_update_union_chan_inf(padapter, ch, offset, bw); + } } flush_all_cam_entry(padapter); _cancel_timer_ex(&pmlmeext->link_timer); - //pmlmepriv->LinkDetectInfo.TrafficBusyState = _FALSE; + /* pmlmepriv->LinkDetectInfo.TrafficBusyState = _FALSE; */ pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0; pmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0; @@ -11969,9 +11608,7 @@ static void rtw_mlmeext_disconnect(_adapter *padapter) /* 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 */ } @@ -11981,15 +11618,15 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) struct sta_info *psta, *psta_bmc; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); struct sta_priv *pstapriv = &padapter->stapriv; u8 join_type; #ifdef CONFIG_ARP_KEEP_ALIVE struct mlme_priv *pmlmepriv = &padapter->mlmepriv; #endif + struct security_priv *psecuritypriv = &padapter->securitypriv; - if(join_res < 0) - { + if (join_res < 0) { join_type = 1; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr); @@ -12000,73 +11637,73 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) pmlmepriv->bGetGateway = 1; #endif - if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - //update bc/mc sta_info + if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { + /* update bc/mc sta_info */ update_bmc_sta(padapter); } - //turn on dynamic functions + /* turn on dynamic functions */ /* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); */ - // update IOT-releated issue + /* update IOT-releated issue */ update_IOT_info(padapter); rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, cur_network->SupportedRates); - //BCN interval + /* BCN interval */ rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pmlmeinfo->bcn_interval)); - //udpate capability + /* udpate capability */ update_capinfo(padapter, pmlmeinfo->capability); - //WMM, Update EDCA param + /* WMM, Update EDCA param */ WMMOnAssocRsp(padapter); - //HT + /* HT */ HTOnAssocRsp(padapter); #ifdef CONFIG_80211AC_VHT - //VHT + /* VHT */ VHTOnAssocRsp(padapter); #endif psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); - if (psta) //only for infra. mode - { - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - - //DBG_871X("set_sta_rate\n"); + if (psta) { /* only for infra. mode */ + /* RTW_INFO("set_sta_rate\n"); */ psta->wireless_mode = pmlmeext->cur_wireless_mode; - - //set per sta rate after updating HT cap. + + /* set per sta rate after updating HT cap. */ set_sta_rate(padapter, psta); - + rtw_sta_media_status_rpt(padapter, psta, 1); - /* wakeup macid after join bss successfully to ensure + /* wakeup macid after join bss successfully to ensure the subsequent data frames can be sent out normally */ rtw_hal_macid_wakeup(padapter, psta->mac_id); } +#ifndef CONFIG_IOCTL_CFG80211 + if (is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm)) + rtw_sec_restore_wep_key(padapter); +#endif /* CONFIG_IOCTL_CFG80211 */ + if (rtw_port_switch_chk(padapter) == _TRUE) rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL); join_type = 2; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) - { - // correcting TSF + if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { + /* correcting TSF */ correct_TSF(padapter, pmlmeext); - - //set_link_timer(pmlmeext, DISCONNECT_TO); + + /* set_link_timer(pmlmeext, DISCONNECT_TO); */ } #ifdef CONFIG_LPS - if(get_iface_type(padapter) == IFACE_PORT0) + if (get_hw_port(padapter) == HW_PORT0) rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_CONNECT, 0); #endif @@ -12079,65 +11716,49 @@ exit_mlmeext_joinbss_event_callback: rtw_join_done_chk_ch(padapter, join_res); - DBG_871X("=>%s - End to Connection without 4-way\n", __FUNCTION__); + RTW_INFO("=>%s - End to Connection without 4-way\n", __FUNCTION__); } -//currently only adhoc mode will go here +/* currently only adhoc mode will go here */ void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta) { struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 join_type; - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); - if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - if(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)//adhoc master or sta_count>1 - { - //nothing to do - } - else//adhoc client - { - //update TSF Value - //update_TSF(pmlmeext, pframe, len); + if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) { /* adhoc master or sta_count>1 */ + /* nothing to do */ + } else { /* adhoc client */ + /* update TSF Value */ + /* update_TSF(pmlmeext, pframe, len); */ - // correcting TSF + /* correcting TSF */ correct_TSF(padapter, pmlmeext); - //start beacon - if(send_beacon(padapter)==_FAIL) - { - pmlmeinfo->FW_sta_info[psta->mac_id].status = 0; - - pmlmeinfo->state ^= WIFI_FW_ADHOC_STATE; - - return; - } + /* start beacon */ + if (send_beacon(padapter) == _FAIL) + rtw_warn_on(1); pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; - } join_type = 2; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); } - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - - psta->bssratelen = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[psta->mac_id].SupportedRates); - _rtw_memcpy(psta->bssrateset, pmlmeinfo->FW_sta_info[psta->mac_id].SupportedRates, psta->bssratelen); - - //update adhoc sta_info + /* update adhoc sta_info */ update_sta_info(padapter, psta); rtw_hal_update_sta_rate_mask(padapter, psta); - // ToDo: HT for Ad-hoc + /* ToDo: HT for Ad-hoc */ psta->wireless_mode = rtw_check_network_type(psta->bssrateset, psta->bssratelen, pmlmeext->cur_channel); psta->raid = rtw_hal_networktype_to_raid(padapter, psta); - //rate radaptive + /* rate radaptive */ Update_RA_Entry(padapter, psta); } @@ -12147,9 +11768,7 @@ void mlmeext_sta_del_event_callback(_adapter *padapter) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); if (is_client_associated_to_ap(padapter) || is_IBSS_empty(padapter)) - { rtw_mlmeext_disconnect(padapter); - } } @@ -12163,58 +11782,54 @@ void _linked_info_dump(_adapter *padapter) int i; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + HAL_DATA_TYPE *HalData = GET_HAL_DATA(padapter); int UndecoratedSmoothedPWDB = 0; - struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); - struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); - - if(padapter->bLinkInfoDump){ - DBG_871X("\n============["ADPT_FMT"] linked status check ===================\n",ADPT_ARG(padapter)); + if (padapter->bLinkInfoDump) { - if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) - { - rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); - - DBG_871X("AP[" MAC_FMT "] - UndecoratedSmoothedPWDB:%d\n", - MAC_ARG(padapter->mlmepriv.cur_network.network.MacAddress),UndecoratedSmoothedPWDB); - } - else if((pmlmeinfo->state&0x03) == _HW_STATE_AP_) - { + RTW_INFO("\n============["ADPT_FMT"] linked status check ===================\n", ADPT_ARG(padapter)); + + if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { + rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); + + RTW_INFO("AP[" MAC_FMT "] - UndecoratedSmoothedPWDB:%d\n", + MAC_ARG(padapter->mlmepriv.cur_network.network.MacAddress), UndecoratedSmoothedPWDB); + } else if ((pmlmeinfo->state & 0x03) == _HW_STATE_AP_) { _irqL irqL; _list *phead, *plist; - - struct sta_info *psta=NULL; + + struct sta_info *psta = NULL; struct sta_priv *pstapriv = &padapter->stapriv; - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + _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) - { + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); - - DBG_871X("STA[" MAC_FMT "]:UndecoratedSmoothedPWDB:%d\n", - MAC_ARG(psta->hwaddr),psta->rssi_stat.UndecoratedSmoothedPWDB); + plist = get_next(plist); + + RTW_INFO("STA[" MAC_FMT "]:UndecoratedSmoothedPWDB:%d\n", + MAC_ARG(psta->hwaddr), psta->rssi_stat.UndecoratedSmoothedPWDB); } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + } - for(i=0; inum; i++) - { - if(rtw_macid_is_used(macid_ctl, i) - && !rtw_macid_is_bmc(macid_ctl, i) /* skip bc/mc sta */ - ) { - //============ tx info ============ - rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, &i); - } - } - rtw_hal_set_odm_var(padapter, HAL_ODM_RX_INFO_DUMP, NULL, _FALSE); - + + /*============ tx info ============ */ + rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, RTW_DBGDUMP); + + rtw_hal_set_odm_var(padapter, HAL_ODM_RX_INFO_DUMP, RTW_DBGDUMP, _FALSE); + } - + } +/******************************************************************** + +When station does not receive any packet in MAX_CONTINUAL_NORXPACKET_COUNT*2 seconds, +recipient station will teardown the block ack by issuing DELBA frame. + +*********************************************************************/ void rtw_delba_check(_adapter *padapter, struct sta_info *psta, u8 from_timer) { int i = 0; @@ -12225,31 +11840,29 @@ void rtw_delba_check(_adapter *padapter, struct sta_info *psta, u8 from_timer) /* IOT issue,occur Broadcom ap(Buffalo WZR-D1800H,Netgear R6300). AP is originator.AP does not transmit unicast packets when STA response its BAR. - This case probably occur ap issue BAR after AP builds BA. - + This case probably occur ap issue BAR after AP builds BA. + Follow 802.11 spec, STA shall maintain an inactivity timer for every negotiated Block Ack setup. The inactivity timer is not reset when MPDUs corresponding to other TIDs are received. */ if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_BROADCOM) { - for (i = 0; i < TID_NUM ; i++) { - if (sta_rx_data_qos_pkts(psta, i) == sta_last_rx_data_qos_pkts(psta, i)) { - if (_TRUE == rtw_inc_and_chk_continual_no_rx_packet(psta, i)) { - if (psta->recvreorder_ctrl[i].enable) { - /* send a DELBA frame to the peer STA with the Reason Code field set to TIMEOUT */ + for (i = 0; i < TID_NUM ; i++) { + if ((psta->recvreorder_ctrl[i].enable) && + (sta_rx_data_qos_pkts(psta, i) == sta_last_rx_data_qos_pkts(psta, i)) ) { + if (_TRUE == rtw_inc_and_chk_continual_no_rx_packet(psta, i)) { + /* send a DELBA frame to the peer STA with the Reason Code field set to TIMEOUT */ if (!from_timer) ret = issue_del_ba_ex(padapter, psta->hwaddr, i, 39, 0, 3, 1); else - issue_del_ba(padapter, psta->hwaddr, i, 39, 0); - psta->recvreorder_ctrl[i].enable = _FALSE; + issue_del_ba(padapter, psta->hwaddr, i, 39, 0); + psta->recvreorder_ctrl[i].enable = _FALSE; if (ret != _FAIL) psta->recvreorder_ctrl[i].ampdu_size = RX_AMPDU_SIZE_INVALID; - rtw_reset_continual_no_rx_packet(psta, i); - } - } - } - else{ + rtw_reset_continual_no_rx_packet(psta, i); + } + } else { /* The inactivity timer is reset when MPDUs to the TID is received. */ - rtw_reset_continual_no_rx_packet(psta, i); + rtw_reset_continual_no_rx_packet(psta, i); } } } @@ -12262,55 +11875,82 @@ u8 chk_ap_is_alive(_adapter *padapter, struct sta_info *psta) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - #ifdef DBG_EXPIRATION_CHK - DBG_871X(FUNC_ADPT_FMT" rx:"STA_PKTS_FMT", beacon:%llu, probersp_to_self:%llu" - /*", probersp_bm:%llu, probersp_uo:%llu, probereq:%llu, BI:%u"*/ - ", retry:%u\n" - , FUNC_ADPT_ARG(padapter) - , STA_RX_PKTS_DIFF_ARG(psta) +#ifdef DBG_EXPIRATION_CHK + RTW_INFO(FUNC_ADPT_FMT" rx:"STA_PKTS_FMT", beacon:%llu, probersp_to_self:%llu" + /*", probersp_bm:%llu, probersp_uo:%llu, probereq:%llu, BI:%u"*/ + ", retry:%u\n" + , FUNC_ADPT_ARG(padapter) + , STA_RX_PKTS_DIFF_ARG(psta) , psta->sta_stats.rx_beacon_pkts - psta->sta_stats.last_rx_beacon_pkts , psta->sta_stats.rx_probersp_pkts - psta->sta_stats.last_rx_probersp_pkts /*, psta->sta_stats.rx_probersp_bm_pkts - psta->sta_stats.last_rx_probersp_bm_pkts , psta->sta_stats.rx_probersp_uo_pkts - psta->sta_stats.last_rx_probersp_uo_pkts , psta->sta_stats.rx_probereq_pkts - psta->sta_stats.last_rx_probereq_pkts - , pmlmeinfo->bcn_interval*/ - , pmlmeext->retry - ); + , pmlmeinfo->bcn_interval*/ + , pmlmeext->retry + ); - DBG_871X(FUNC_ADPT_FMT" tx_pkts:%llu, link_count:%u\n", FUNC_ADPT_ARG(padapter) - , padapter->xmitpriv.tx_pkts - , pmlmeinfo->link_count - ); - #endif + RTW_INFO(FUNC_ADPT_FMT" tx_pkts:%llu, link_count:%u\n", FUNC_ADPT_ARG(padapter) + , padapter->xmitpriv.tx_pkts + , pmlmeinfo->link_count + ); +#endif - if((sta_rx_data_pkts(psta) == sta_last_rx_data_pkts(psta)) - && sta_rx_beacon_pkts(psta) == sta_last_rx_beacon_pkts(psta) - && sta_rx_probersp_pkts(psta) == sta_last_rx_probersp_pkts(psta) - ) - { + if ((sta_rx_data_pkts(psta) == sta_last_rx_data_pkts(psta)) + && sta_rx_beacon_pkts(psta) == sta_last_rx_beacon_pkts(psta) + && sta_rx_probersp_pkts(psta) == sta_last_rx_probersp_pkts(psta) + ) ret = _FALSE; - } else - { ret = _TRUE; - } sta_update_last_rx_pkts(psta); /* record last rx data packets for every tid. */ - for (i = 0; i < TID_NUM; i++) + for (i = 0; i < TID_NUM; i++) psta->sta_stats.last_rx_data_qos_pkts[i] = psta->sta_stats.rx_data_qos_pkts[i]; return ret; } +u8 chk_adhoc_peer_is_alive(struct sta_info *psta) +{ + u8 ret = _TRUE; + +#ifdef DBG_EXPIRATION_CHK + RTW_INFO("sta:"MAC_FMT", rssi:%d, rx:"STA_PKTS_FMT", beacon:%llu, probersp_to_self:%llu" + /*", probersp_bm:%llu, probersp_uo:%llu, probereq:%llu, BI:%u"*/ + ", expire_to:%u\n" + , MAC_ARG(psta->hwaddr) + , psta->rssi_stat.UndecoratedSmoothedPWDB + , STA_RX_PKTS_DIFF_ARG(psta) + , psta->sta_stats.rx_beacon_pkts - psta->sta_stats.last_rx_beacon_pkts + , psta->sta_stats.rx_probersp_pkts - psta->sta_stats.last_rx_probersp_pkts + /*, psta->sta_stats.rx_probersp_bm_pkts - psta->sta_stats.last_rx_probersp_bm_pkts + , psta->sta_stats.rx_probersp_uo_pkts - psta->sta_stats.last_rx_probersp_uo_pkts + , psta->sta_stats.rx_probereq_pkts - psta->sta_stats.last_rx_probereq_pkts + , pmlmeinfo->bcn_interval*/ + , psta->expire_to + ); +#endif + + if (sta_rx_data_pkts(psta) == sta_last_rx_data_pkts(psta) + && sta_rx_beacon_pkts(psta) == sta_last_rx_beacon_pkts(psta) + && sta_rx_probersp_pkts(psta) == sta_last_rx_probersp_pkts(psta)) + ret = _FALSE; + + sta_update_last_rx_pkts(psta); + + return ret; +} + #ifdef CONFIG_TDLS u8 chk_tdls_peer_sta_is_alive(_adapter *padapter, struct sta_info *psta) { if ((psta->sta_stats.rx_data_pkts == psta->sta_stats.last_rx_data_pkts) - && (psta->sta_stats.rx_tdls_disc_rsp_pkts == psta->sta_stats.last_rx_tdls_disc_rsp_pkts)) + && (psta->sta_stats.rx_tdls_disc_rsp_pkts == psta->sta_stats.last_rx_tdls_disc_rsp_pkts)) return _FALSE; return _TRUE; @@ -12318,19 +11958,21 @@ u8 chk_tdls_peer_sta_is_alive(_adapter *padapter, struct sta_info *psta) void linked_status_chk_tdls(_adapter *padapter) { -struct candidate_pool{ - struct sta_info *psta; - u8 addr[ETH_ALEN]; -}; + struct candidate_pool { + struct sta_info *psta; + u8 addr[ETH_ALEN]; + }; struct sta_priv *pstapriv = &padapter->stapriv; _irqL irqL; u8 ack_chk; struct sta_info *psta; - int i, num_teardown=0, num_checkalive=0; + int i, num_teardown = 0, num_checkalive = 0; _list *plist, *phead; struct tdls_txmgmt txmgmt; - struct candidate_pool checkalive[NUM_STA]; - struct candidate_pool teardown[NUM_STA]; + struct candidate_pool checkalive[MAX_ALLOWED_TDLS_STA_NUM]; + struct candidate_pool teardown[MAX_ALLOWED_TDLS_STA_NUM]; + u8 tdls_sta_max = _FALSE; + #define ALIVE_MIN 2 #define ALIVE_MAX 5 @@ -12338,45 +11980,44 @@ struct candidate_pool{ _rtw_memset(checkalive, 0x00, sizeof(checkalive)); _rtw_memset(teardown, 0x00, sizeof(teardown)); - if((padapter->tdlsinfo.link_established == _TRUE)){ + if ((padapter->tdlsinfo.link_established == _TRUE)) { _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - for(i=0; i< NUM_STA; i++) - { + 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) - { + + 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_LINKED_STATE) - { + if (psta->tdls_sta_state & TDLS_LINKED_STATE) { psta->alive_count++; - if(psta->alive_count >= ALIVE_MIN) - { + if (psta->alive_count >= ALIVE_MIN) { if (chk_tdls_peer_sta_is_alive(padapter, psta) == _FALSE) { if (psta->alive_count < ALIVE_MAX) { _rtw_memcpy(checkalive[num_checkalive].addr, psta->hwaddr, ETH_ALEN); checkalive[num_checkalive].psta = psta; num_checkalive++; - } - else - { + } else { _rtw_memcpy(teardown[num_teardown].addr, psta->hwaddr, ETH_ALEN); teardown[num_teardown].psta = psta; num_teardown++; } - } - else - { + } else psta->alive_count = 0; - } } psta->sta_stats.last_rx_data_pkts = psta->sta_stats.rx_data_pkts; psta->sta_stats.last_rx_tdls_disc_rsp_pkts = psta->sta_stats.rx_tdls_disc_rsp_pkts; + + if ((num_checkalive >= MAX_ALLOWED_TDLS_STA_NUM) || (num_teardown >= MAX_ALLOWED_TDLS_STA_NUM)) { + tdls_sta_max = _TRUE; + break; + } } } + + if (tdls_sta_max == _TRUE) + break; } _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); @@ -12389,11 +12030,9 @@ struct candidate_pool{ } } - if(num_teardown > 0) - { - for(i=0; i< num_teardown; i++) - { - DBG_871X("[%s %d] Send teardown to "MAC_FMT" \n", __FUNCTION__, __LINE__, MAC_ARG(teardown[i].addr)); + if (num_teardown > 0) { + for (i = 0; i < num_teardown; i++) { + RTW_INFO("[%s %d] Send teardown to "MAC_FMT"\n", __FUNCTION__, __LINE__, MAC_ARG(teardown[i].addr)); txmgmt.status_code = _RSON_TDLS_TEAR_TOOFAR_; _rtw_memcpy(txmgmt.peer, teardown[i].addr, ETH_ALEN); issue_tdls_teardown(padapter, &txmgmt, _FALSE); @@ -12402,9 +12041,9 @@ struct candidate_pool{ } } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ -//from_timer == 1 means driver is in LPS +/* from_timer == 1 means driver is in LPS */ void linked_status_chk(_adapter *padapter, u8 from_timer) { u32 i; @@ -12416,50 +12055,57 @@ void linked_status_chk(_adapter *padapter, u8 from_timer) #ifdef CONFIG_ARP_KEEP_ALIVE struct mlme_priv *pmlmepriv = &padapter->mlmepriv; #endif - - if (is_client_associated_to_ap(padapter)) - { - //linked infrastructure client mode + + if (is_client_associated_to_ap(padapter)) { + /* linked infrastructure client mode */ int tx_chk = _SUCCESS, rx_chk = _SUCCESS; int rx_chk_limit; int link_count_limit; - #if defined(DBG_ROAMING_TEST) +#ifdef CONFIG_MCC_MODE + /* + * due to tx ps null date to ao, so ap doest not tx pkt to driver + * we may check chk_ap_is_alive fail, and may issue_probereq to wrong channel under sitesurvey + * don't keep alive check under MCC + */ + if (rtw_hal_mcc_link_status_chk(padapter, __func__) == _FALSE) + return; +#endif + +#if defined(DBG_ROAMING_TEST) rx_chk_limit = 1; - #elif defined(CONFIG_ACTIVE_KEEP_ALIVE_CHECK) && !defined(CONFIG_LPS_LCLK_WD_TIMER) +#elif defined(CONFIG_ACTIVE_KEEP_ALIVE_CHECK) && !defined(CONFIG_LPS_LCLK_WD_TIMER) rx_chk_limit = 4; - #else +#else rx_chk_limit = 8; - #endif +#endif #ifdef CONFIG_ARP_KEEP_ALIVE if (!from_timer && pmlmepriv->bGetGateway == 1) { - DBG_871X("do rtw_gw_addr_query()"); - if (rtw_gw_addr_query(padapter) == 0) { + RTW_INFO("do rtw_gw_addr_query()"); + if (rtw_gw_addr_query(padapter) == 0) pmlmepriv->bGetGateway = 0; - } else { + else { _rtw_memset(pmlmepriv->gw_ip, 0, 4); _rtw_memset(pmlmepriv->gw_mac_addr, 0, 6); } } #endif #ifdef CONFIG_P2P - if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE)) - { - if(!from_timer) - link_count_limit = 3; // 8 sec + if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE)) { + if (!from_timer) + link_count_limit = 3; /* 8 sec */ else - link_count_limit = 15; // 32 sec + link_count_limit = 15; /* 32 sec */ + } else +#endif /* CONFIG_P2P */ + { + if (!from_timer) + link_count_limit = 7; /* 16 sec */ + else + link_count_limit = 29; /* 60 sec */ } - else -#endif // CONFIG_P2P - { - if(!from_timer) - link_count_limit = 7; // 16 sec - else - link_count_limit = 29; // 60 sec - } #ifdef CONFIG_TDLS #ifdef CONFIG_TDLS_CH_SW @@ -12472,30 +12118,44 @@ void linked_status_chk(_adapter *padapter, u8 from_timer) #endif /* CONFIG_TDLS_AUTOCHECKALIVE */ #endif /* CONFIG_TDLS */ - if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) - { + psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress); + if (psta != NULL) { bool is_p2p_enable = _FALSE; - #ifdef CONFIG_P2P +#ifdef CONFIG_P2P is_p2p_enable = !rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE); - #endif +#endif +#ifdef CONFIG_ISSUE_DELBA_WHEN_NO_TRAFFIC /*issue delba when ap does not tx data packet that is Broadcom ap */ rtw_delba_check(padapter, psta, from_timer); - +#endif if (chk_ap_is_alive(padapter, psta) == _FALSE) rx_chk = _FAIL; if (pxmitpriv->last_tx_pkts == pxmitpriv->tx_pkts) tx_chk = _FAIL; - #if defined(CONFIG_ACTIVE_KEEP_ALIVE_CHECK) && !defined(CONFIG_LPS_LCLK_WD_TIMER) - if (pmlmeext->active_keep_alive_check && (rx_chk == _FAIL || tx_chk == _FAIL)) { - u8 backup_oper_channel=0; +#if defined(CONFIG_ACTIVE_KEEP_ALIVE_CHECK) && !defined(CONFIG_LPS_LCLK_WD_TIMER) + if (pmlmeext->active_keep_alive_check && (rx_chk == _FAIL || tx_chk == _FAIL) + #ifdef CONFIG_MCC_MODE + /* Driver don't know operation channel under MCC*/ + /* So driver don't do KEEP_ALIVE_CHECK */ + && (!rtw_hal_check_mcc_status(padapter, MCC_STATUS_NEED_MCC)) + #endif + ) { + u8 backup_ch = 0, backup_bw, backup_offset; + u8 union_ch = 0, union_bw, union_offset; + + if (!rtw_mi_get_ch_setting_union(padapter, &union_ch, &union_bw, &union_offset) + || pmlmeext->cur_channel != union_ch) + goto bypass_active_keep_alive; /* switch to correct channel of current network before issue keep-alive frames */ if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) { - backup_oper_channel = rtw_get_oper_ch(padapter); - SelectChannel(padapter, pmlmeext->cur_channel); + backup_ch = rtw_get_oper_ch(padapter); + backup_bw = rtw_get_oper_bw(padapter); + backup_offset = rtw_get_oper_choffset(padapter); + set_channel_bwmode(padapter, union_ch, union_offset, union_bw); } if (rx_chk != _SUCCESS) @@ -12509,91 +12169,101 @@ void linked_status_chk(_adapter *padapter, u8 from_timer) } /* back to the original operation channel */ - if(backup_oper_channel>0) - SelectChannel(padapter, backup_oper_channel); + if (backup_ch > 0) + set_channel_bwmode(padapter, backup_ch, backup_offset, backup_bw); - } - else - #endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ +bypass_active_keep_alive: + ; + } else +#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ { if (rx_chk != _SUCCESS) { if (pmlmeext->retry == 0) { - #ifdef DBG_EXPIRATION_CHK - DBG_871X("issue_probereq to trigger probersp, retry=%d\n", pmlmeext->retry); - #endif +#ifdef DBG_EXPIRATION_CHK + RTW_INFO("issue_probereq to trigger probersp, retry=%d\n", pmlmeext->retry); +#endif issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress, 0, 0, 0, 0); issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress, 0, 0, 0, 0); issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress, 0, 0, 0, 0); } } - if (tx_chk != _SUCCESS && pmlmeinfo->link_count++ == link_count_limit) { - #ifdef DBG_EXPIRATION_CHK - DBG_871X("%s issue_nulldata(%d)\n", __FUNCTION__, from_timer?1:0); - #endif - tx_chk = issue_nulldata_in_interrupt(padapter, NULL, from_timer?1:0); + if (tx_chk != _SUCCESS && pmlmeinfo->link_count++ == link_count_limit +#ifdef CONFIG_MCC_MODE + /* FW tx nulldata under MCC mode, we just check ap is alive */ + && (!rtw_hal_check_mcc_status(padapter, MCC_STATUS_NEED_MCC)) +#endif /* CONFIG_MCC_MODE */ + ) { +#ifdef DBG_EXPIRATION_CHK + RTW_INFO("%s issue_nulldata(%d)\n", __FUNCTION__, from_timer ? 1 : 0); +#endif + tx_chk = issue_nulldata_in_interrupt(padapter, NULL, from_timer ? 1 : 0); } } if (rx_chk == _FAIL) { pmlmeext->retry++; if (pmlmeext->retry > rx_chk_limit) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" disconnect or roaming\n", - FUNC_ADPT_ARG(padapter)); + RTW_PRINT(FUNC_ADPT_FMT" disconnect or roaming\n", + FUNC_ADPT_ARG(padapter)); receive_disconnect(padapter, pmlmeinfo->network.MacAddress - , WLAN_REASON_EXPIRATION_CHK); + , WLAN_REASON_EXPIRATION_CHK, _FALSE); return; } - } else { + } else pmlmeext->retry = 0; - } - if (tx_chk == _FAIL) { - pmlmeinfo->link_count %= (link_count_limit+1); - } else { + if (tx_chk == _FAIL) + pmlmeinfo->link_count %= (link_count_limit + 1); + else { pxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts; pmlmeinfo->link_count = 0; } - } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) + } /* end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) */ - } - else if (is_client_associated_to_ibss(padapter)) - { - //linked IBSS mode - //for each assoc list entry to check the rx pkt counter - for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) - { - if (pmlmeinfo->FW_sta_info[i].status == 1) - { - psta = pmlmeinfo->FW_sta_info[i].psta; + } else if (is_client_associated_to_ibss(padapter)) { + _irqL irqL; + _list *phead, *plist, dlist; - if(NULL==psta) continue; + _rtw_init_listhead(&dlist); - if (pmlmeinfo->FW_sta_info[i].rx_pkt == sta_rx_pkts(psta)) - { + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - if(pmlmeinfo->FW_sta_info[i].retry<3) - { - pmlmeinfo->FW_sta_info[i].retry++; - } - else - { - pmlmeinfo->FW_sta_info[i].retry = 0; - pmlmeinfo->FW_sta_info[i].status = 0; - report_del_sta_event(padapter, psta->hwaddr, WLAN_REASON_EXPIRATION_CHK, _TRUE); - } - } + 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 (is_broadcast_mac_addr(psta->hwaddr)) + continue; + + if (chk_adhoc_peer_is_alive(psta) || !psta->expire_to) + psta->expire_to = pstapriv->adhoc_expire_to; else - { - pmlmeinfo->FW_sta_info[i].retry = 0; - pmlmeinfo->FW_sta_info[i].rx_pkt = (u32)sta_rx_pkts(psta); + psta->expire_to--; + + if (psta->expire_to <= 0) { + rtw_list_delete(&psta->list); + rtw_list_insert_tail(&psta->list, &dlist); } } } - //set_link_timer(pmlmeext, DISCONNECT_TO); + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + plist = get_next(&dlist); + while (rtw_end_of_queue_search(&dlist, plist) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info, list); + plist = get_next(plist); + rtw_list_delete(&psta->list); + RTW_INFO(FUNC_ADPT_FMT" ibss expire "MAC_FMT"\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->hwaddr)); + report_del_sta_event(padapter, psta->hwaddr, WLAN_REASON_EXPIRATION_CHK, from_timer ? _TRUE : _FALSE, _FALSE); + } } } @@ -12605,7 +12275,7 @@ void survey_timer_hdl(_adapter *padapter) struct cmd_priv *pcmdpriv = &padapter->cmdpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); #endif if (mlmeext_scan_state(pmlmeext) > SCAN_DISABLE) { @@ -12632,119 +12302,50 @@ exit: void link_timer_hdl(_adapter *padapter) { - //static unsigned int rx_pkt = 0; - //static u64 tx_cnt = 0; - //struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + /* static unsigned int rx_pkt = 0; */ + /* static u64 tx_cnt = 0; */ + /* struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); */ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - //struct sta_priv *pstapriv = &padapter->stapriv; + /* struct sta_priv *pstapriv = &padapter->stapriv; */ - if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) - { - DBG_871X("link_timer_hdl:no beacon while connecting\n"); + if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) { + RTW_INFO("link_timer_hdl:no beacon while connecting\n"); pmlmeinfo->state = WIFI_FW_NULL_STATE; report_join_res(padapter, -3); - } - else if (pmlmeinfo->state & WIFI_FW_AUTH_STATE) - { - //re-auth timer - if (++pmlmeinfo->reauth_count > REAUTH_LIMIT) - { - //if (pmlmeinfo->auth_algo != dot11AuthAlgrthm_Auto) - //{ - pmlmeinfo->state = 0; - report_join_res(padapter, -1); - return; - //} - //else - //{ - // pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared; - // pmlmeinfo->reauth_count = 0; - //} + } else if (pmlmeinfo->state & WIFI_FW_AUTH_STATE) { + /* re-auth timer */ + if (++pmlmeinfo->reauth_count > REAUTH_LIMIT) { + /* if (pmlmeinfo->auth_algo != dot11AuthAlgrthm_Auto) */ + /* { */ + pmlmeinfo->state = 0; + report_join_res(padapter, -1); + return; + /* } */ + /* else */ + /* { */ + /* pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared; */ + /* pmlmeinfo->reauth_count = 0; */ + /* } */ } - - DBG_871X("link_timer_hdl: auth timeout and try again\n"); + + RTW_INFO("link_timer_hdl: auth timeout and try again\n"); pmlmeinfo->auth_seq = 1; issue_auth(padapter, NULL, 0); set_link_timer(pmlmeext, REAUTH_TO); - } - else if (pmlmeinfo->state & WIFI_FW_ASSOC_STATE) - { - //re-assoc timer - if (++pmlmeinfo->reassoc_count > REASSOC_LIMIT) - { + } else if (pmlmeinfo->state & WIFI_FW_ASSOC_STATE) { + /* re-assoc timer */ + if (++pmlmeinfo->reassoc_count > REASSOC_LIMIT) { pmlmeinfo->state = WIFI_FW_NULL_STATE; report_join_res(padapter, -2); return; } - DBG_871X("link_timer_hdl: assoc timeout and try again\n"); + RTW_INFO("link_timer_hdl: assoc timeout and try again\n"); issue_assocreq(padapter); set_link_timer(pmlmeext, REASSOC_TO); } -#if 0 - else if (is_client_associated_to_ap(padapter)) - { - //linked infrastructure client mode - if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) - { - /*to monitor whether the AP is alive or not*/ - if (rx_pkt == psta->sta_stats.rx_pkts) - { - receive_disconnect(padapter, pmlmeinfo->network.MacAddress); - return; - } - else - { - rx_pkt = psta->sta_stats.rx_pkts; - set_link_timer(pmlmeext, DISCONNECT_TO); - } - - //update the EDCA paramter according to the Tx/RX mode - update_EDCA_param(padapter); - - /*to send the AP a nulldata if no frame is xmitted in order to keep alive*/ - if (pmlmeinfo->link_count++ == 0) - { - tx_cnt = pxmitpriv->tx_pkts; - } - else if ((pmlmeinfo->link_count & 0xf) == 0) - { - if (tx_cnt == pxmitpriv->tx_pkts) - { - issue_nulldata_in_interrupt(padapter, NULL, 0); - } - - tx_cnt = pxmitpriv->tx_pkts; - } - } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) - } - else if (is_client_associated_to_ibss(padapter)) - { - //linked IBSS mode - //for each assoc list entry to check the rx pkt counter - for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) - { - if (pmlmeinfo->FW_sta_info[i].status == 1) - { - psta = pmlmeinfo->FW_sta_info[i].psta; - - if (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts) - { - pmlmeinfo->FW_sta_info[i].status = 0; - report_del_sta_event(padapter, psta->hwaddr); - } - else - { - pmlmeinfo->FW_sta_info[i].rx_pkt = psta->sta_stats.rx_pkts; - } - } - } - - set_link_timer(pmlmeext, DISCONNECT_TO); - } -#endif return; } @@ -12754,18 +12355,17 @@ void addba_timer_hdl(struct sta_info *psta) #ifdef CONFIG_80211N_HT struct ht_priv *phtpriv; - if(!psta) + if (!psta) return; - + phtpriv = &psta->htpriv; - if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) - { - if(phtpriv->candidate_tid_bitmap) - phtpriv->candidate_tid_bitmap=0x0; - + if ((phtpriv->ht_option == _TRUE) && (phtpriv->ampdu_enable == _TRUE)) { + if (phtpriv->candidate_tid_bitmap) + phtpriv->candidate_tid_bitmap = 0x0; + } -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ } #ifdef CONFIG_IEEE80211W @@ -12780,7 +12380,7 @@ void report_sta_timeout_event(_adapter *padapter, u8 *MacAddr, unsigned short re struct C2HEvent_Header *pc2h_evt_hdr; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - + pcmd_obj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); if (pcmd_obj == NULL) return; @@ -12813,13 +12413,13 @@ void report_sta_timeout_event(_adapter *padapter, u8 *MacAddr, unsigned short re psta = rtw_get_stainfo(&padapter->stapriv, MacAddr); if (psta) - mac_id = (int)psta->mac_id; + mac_id = (int)psta->mac_id; else mac_id = (-1); pdel_sta_evt->mac_id = mac_id; - DBG_871X("report_del_sta_event: delete STA, mac_id=%d\n", mac_id); + RTW_INFO("report_del_sta_event: delete STA, mac_id=%d\n", mac_id); rtw_enqueue_cmd(pcmdpriv, pcmd_obj); @@ -12830,10 +12430,10 @@ void clnt_sa_query_timeout(_adapter *padapter) { rtw_disassoc_cmd(padapter, 0, _TRUE); - rtw_indicate_disconnect(padapter); - rtw_free_assoc_resources(padapter, 1); + rtw_indicate_disconnect(padapter, 0, _FALSE); + rtw_free_assoc_resources(padapter, 1); - DBG_871X("SA query timeout client disconnect\n"); + RTW_INFO("SA query timeout client disconnect\n"); } void sa_query_timer_hdl(struct sta_info *psta) @@ -12844,13 +12444,13 @@ void sa_query_timer_hdl(struct sta_info *psta) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE && - check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) clnt_sa_query_timeout(padapter); else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) report_sta_timeout_event(padapter, psta->hwaddr, WLAN_REASON_PREV_AUTH_NOT_VALID); } -#endif //CONFIG_IEEE80211W +#endif /* CONFIG_IEEE80211W */ u8 NULL_hdl(_adapter *padapter, u8 *pbuf) { @@ -12860,106 +12460,89 @@ u8 NULL_hdl(_adapter *padapter, u8 *pbuf) #ifdef CONFIG_AUTO_AP_MODE void rtw_start_auto_ap(_adapter *adapter) { - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); rtw_set_802_11_infrastructure_mode(adapter, Ndis802_11APMode); - rtw_setopmode_cmd(adapter, Ndis802_11APMode,_TRUE); + rtw_setopmode_cmd(adapter, Ndis802_11APMode, _TRUE); } static int rtw_auto_ap_start_beacon(_adapter *adapter) { - int ret=0; + int ret = 0; u8 *pbuf = NULL; uint len; u8 supportRate[16]; - int sz = 0, rateLen; - u8 * ie; + int sz = 0, rateLen; + u8 *ie; u8 wireless_mode, oper_channel; - u8 ssid[3] = {0}; //hidden ssid + u8 ssid[3] = {0}; /* hidden ssid */ u32 ssid_len = sizeof(ssid); struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) return -EINVAL; len = 128; pbuf = rtw_zmalloc(len); - if(!pbuf) + if (!pbuf) return -ENOMEM; - //generate beacon + /* generate beacon */ ie = pbuf; - //timestamp will be inserted by hardware + /* timestamp will be inserted by hardware */ sz += 8; ie += sz; - //beacon interval : 2bytes - *(u16*)ie = cpu_to_le16((u16)100);//BCN_INTERVAL=100; + /* beacon interval : 2bytes */ + *(u16 *)ie = cpu_to_le16((u16)100); /* BCN_INTERVAL=100; */ sz += 2; ie += 2; - //capability info - *(u16*)ie = 0; - *(u16*)ie |= cpu_to_le16(cap_ESS); - *(u16*)ie |= cpu_to_le16(cap_ShortPremble); - //*(u16*)ie |= cpu_to_le16(cap_Privacy); + /* capability info */ + *(u16 *)ie = 0; + *(u16 *)ie |= cpu_to_le16(cap_ESS); + *(u16 *)ie |= cpu_to_le16(cap_ShortPremble); + /* *(u16*)ie |= cpu_to_le16(cap_Privacy); */ sz += 2; ie += 2; - //SSID + /* SSID */ ie = rtw_set_ie(ie, _SSID_IE_, ssid_len, ssid, &sz); - //supported rates + /* supported rates */ wireless_mode = WIRELESS_11BG_24N; rtw_set_supported_rate(supportRate, wireless_mode) ; rateLen = rtw_get_rateset_len(supportRate); if (rateLen > 8) - { ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, supportRate, &sz); - } else - { ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, supportRate, &sz); - } - //DS parameter set - if(check_buddy_fwstate(adapter, _FW_LINKED) && - check_buddy_fwstate(adapter, WIFI_STATION_STATE)) - { - PADAPTER pbuddy_adapter = adapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - oper_channel = pbuddy_mlmeext->cur_channel; - } + /* DS parameter set */ + if (rtw_mi_check_status(adapter, MI_LINKED)) + oper_channel = rtw_mi_get_union_chan(adapter); else - { oper_channel = adapter_to_dvobj(adapter)->oper_channel; - } + ie = rtw_set_ie(ie, _DSSET_IE_, 1, &oper_channel, &sz); - //ext supported rates + /* ext supported rates */ if (rateLen > 8) - { ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (supportRate + 8), &sz); - } - DBG_871X("%s, start auto ap beacon sz=%d\n", __FUNCTION__, sz); + RTW_INFO("%s, start auto ap beacon sz=%d\n", __FUNCTION__, sz); - //lunch ap mode & start to issue beacon - if(rtw_check_beacon_data(adapter, pbuf, sz) == _SUCCESS) - { + /* lunch ap mode & start to issue beacon */ + if (rtw_check_beacon_data(adapter, pbuf, sz) == _SUCCESS) { - } - else - { + } else ret = -EINVAL; - } rtw_mfree(pbuf, len); @@ -12967,7 +12550,7 @@ static int rtw_auto_ap_start_beacon(_adapter *adapter) return ret; } -#endif//CONFIG_AUTO_AP_MODE +#endif/* CONFIG_AUTO_AP_MODE */ u8 setopmode_hdl(_adapter *padapter, u8 *pbuf) { @@ -12976,78 +12559,70 @@ u8 setopmode_hdl(_adapter *padapter, u8 *pbuf) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct setopmode_parm *psetop = (struct setopmode_parm *)pbuf; - if(psetop->mode == Ndis802_11APMode) - { + if (psetop->mode == Ndis802_11APMode) { pmlmeinfo->state = WIFI_FW_AP_STATE; type = _HW_STATE_AP_; #ifdef CONFIG_NATIVEAP_MLME - //start_ap_mode(padapter); + /* start_ap_mode(padapter); */ #endif - } - else if(psetop->mode == Ndis802_11Infrastructure) - { - pmlmeinfo->state &= ~(BIT(0)|BIT(1));// clear state - pmlmeinfo->state |= WIFI_FW_STATION_STATE;//set to STATION_STATE + } else if (psetop->mode == Ndis802_11Infrastructure) { + pmlmeinfo->state &= ~(BIT(0) | BIT(1)); /* clear state */ + pmlmeinfo->state |= WIFI_FW_STATION_STATE;/* set to STATION_STATE */ type = _HW_STATE_STATION_; - } - else if(psetop->mode == Ndis802_11IBSS) - { + } else if (psetop->mode == Ndis802_11IBSS) type = _HW_STATE_ADHOC_; - } else if (psetop->mode == Ndis802_11Monitor) { + else if (psetop->mode == Ndis802_11Monitor) type = _HW_STATE_MONITOR_; - } else - { type = _HW_STATE_NOLINK_; - } + +#ifdef CONFIG_SUPPORT_FW_MULTI_PORT + rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, (u8 *)(&type)); +#endif rtw_hal_set_hwreg(padapter, HW_VAR_SET_OPMODE, (u8 *)(&type)); - //Set_NETYPE0_MSR(padapter, type); - #ifdef CONFIG_AUTO_AP_MODE - if(psetop->mode == Ndis802_11APMode) + if (psetop->mode == Ndis802_11APMode) rtw_auto_ap_start_beacon(padapter); #endif - if (rtw_port_switch_chk(padapter) == _TRUE) - { + if (rtw_port_switch_chk(padapter) == _TRUE) { rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL); - if(psetop->mode == Ndis802_11APMode) - adapter_to_pwrctl(padapter)->fw_psmode_iface_id = 0xff; //ap mode won't dowload rsvd pages + if (psetop->mode == Ndis802_11APMode) + adapter_to_pwrctl(padapter)->fw_psmode_iface_id = 0xff; /* ap mode won't dowload rsvd pages */ else if (psetop->mode == Ndis802_11Infrastructure) { - #ifdef CONFIG_LPS +#ifdef CONFIG_LPS _adapter *port0_iface = dvobj_get_port0_adapter(adapter_to_dvobj(padapter)); if (port0_iface) rtw_lps_ctrl_wk_cmd(port0_iface, LPS_CTRL_CONNECT, 0); - #endif +#endif } - } + } #ifdef CONFIG_BT_COEXIST - if (psetop->mode == Ndis802_11APMode) - { - // Do this after port switch to - // prevent from downloading rsvd page to wrong port - rtw_btcoex_MediaStatusNotify(padapter, 1); //connect + if (psetop->mode == Ndis802_11APMode) { + /* Do this after port switch to */ + /* prevent from downloading rsvd page to wrong port */ + rtw_btcoex_MediaStatusNotify(padapter, 1); /* connect */ } -#endif // CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ return H2C_SUCCESS; - + } u8 createbss_hdl(_adapter *padapter, u8 *pbuf) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network)); WLAN_BSSID_EX *pdev_network = &padapter->registrypriv.dev_network; struct createbss_parm *parm = (struct createbss_parm *)pbuf; u8 ret = H2C_SUCCESS; - //u8 initialgain; - + /* u8 initialgain; */ + #ifdef CONFIG_AP_MODE if (pmlmeinfo->state == WIFI_FW_AP_STATE) { start_bss_network(padapter, parm); @@ -13059,9 +12634,9 @@ u8 createbss_hdl(_adapter *padapter, u8 *pbuf) if (parm->adhoc) { rtw_warn_on(pdev_network->InfrastructureMode != Ndis802_11IBSS); rtw_joinbss_reset(padapter); - + pmlmeext->cur_bwmode = CHANNEL_WIDTH_20; - pmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; pmlmeinfo->ERP_enable = 0; pmlmeinfo->WMM_enable = 0; pmlmeinfo->HT_enable = 0; @@ -13070,19 +12645,19 @@ u8 createbss_hdl(_adapter *padapter, u8 *pbuf) pmlmeinfo->agg_enable_bitmap = 0; pmlmeinfo->candidate_tid_bitmap = 0; - //config the initial gain under linking, need to write the BB registers - //initialgain = 0x1E; + /* config the initial gain under linking, need to write the BB registers */ + /* initialgain = 0x1E; */ /*rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, _FALSE);*/ - //disable dynamic functions, such as high power, DIG + /* disable dynamic functions, such as high power, DIG */ rtw_phydm_ability_backup(padapter); rtw_phydm_func_disable_all(padapter); - - //cancel link timer + + /* cancel link timer */ _cancel_timer_ex(&pmlmeext->link_timer); - //clear CAM - flush_all_cam_entry(padapter); + /* clear CAM */ + flush_all_cam_entry(padapter); pdev_network->Length = get_WLAN_BSSID_EX_sz(pdev_network); _rtw_memcpy(pnetwork, pdev_network, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); @@ -13114,33 +12689,31 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) struct registry_priv *pregpriv = &padapter->registrypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network)); #ifdef CONFIG_ANTENNA_DIVERSITY struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; -#endif //CONFIG_ANTENNA_DIVERSITY +#endif /* CONFIG_ANTENNA_DIVERSITY */ u32 i; - //u8 initialgain; - //u32 acparm; + /* u8 initialgain; */ + /* u32 acparm; */ u8 u_ch, u_bw, u_offset; + u8 doiqk = _FALSE; - //check already connecting to AP or not - if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - { + /* check already connecting to AP or not */ + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) { if (pmlmeinfo->state & WIFI_FW_STATION_STATE) - { issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 1, 100); - } pmlmeinfo->state = WIFI_FW_NULL_STATE; - - //clear CAM - flush_all_cam_entry(padapter); - + + /* clear CAM */ + flush_all_cam_entry(padapter); + _cancel_timer_ex(&pmlmeext->link_timer); - - //set MSR to nolink -> infra. mode - //Set_MSR(padapter, _HW_STATE_NOLINK_); - Set_MSR(padapter, _HW_STATE_STATION_); - + + /* set MSR to nolink->infra. mode */ + /* Set_MSR(padapter, _HW_STATE_NOLINK_); */ + Set_MSR(padapter, _HW_STATE_STATION_); + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0); } @@ -13163,59 +12736,56 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) pmlmeinfo->agg_enable_bitmap = 0; pmlmeinfo->candidate_tid_bitmap = 0; pmlmeinfo->bwmode_updated = _FALSE; - //pmlmeinfo->assoc_AP_vendor = HT_IOT_PEER_MAX; + /* pmlmeinfo->assoc_AP_vendor = HT_IOT_PEER_MAX; */ pmlmeinfo->VHT_enable = 0; - _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); + _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); pnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength; - - if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength - return H2C_PARAMETERS_ERROR; - + + 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); + _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); - //Check AP vendor to move rtw_joinbss_cmd() - //pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->IEs, pnetwork->IELength); + /* Check AP vendor to move rtw_joinbss_cmd() */ + /* pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->IEs, pnetwork->IELength); */ - //sizeof(NDIS_802_11_FIXED_IEs) + /* sizeof(NDIS_802_11_FIXED_IEs) */ for (i = _FIXED_IE_LENGTH_ ; i < pnetwork->IELength - 2 ;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_://Get WMM IE. - if ( _rtw_memcmp(pIE->data, WMM_OUI, 4) ) - { - WMM_param_handler(padapter, pIE); - } - break; + switch (pIE->ElementID) { + case _VENDOR_SPECIFIC_IE_: /* Get WMM IE. */ + if (_rtw_memcmp(pIE->data, WMM_OUI, 4)) + WMM_param_handler(padapter, pIE); + break; #ifdef CONFIG_80211N_HT - case _HT_CAPABILITY_IE_: //Get HT Cap IE. - pmlmeinfo->HT_caps_enable = 1; - break; + case _HT_CAPABILITY_IE_: /* Get HT Cap IE. */ + pmlmeinfo->HT_caps_enable = 1; + break; - case _HT_EXTRA_INFO_IE_: //Get HT Info IE. - pmlmeinfo->HT_info_enable = 1; - break; + case _HT_EXTRA_INFO_IE_: /* Get HT Info IE. */ + pmlmeinfo->HT_info_enable = 1; + break; #endif /* CONFIG_80211N_HT */ #ifdef CONFIG_80211AC_VHT - case EID_VHTCapability://Get VHT Cap IE. - pmlmeinfo->VHT_enable = 1; - break; + case EID_VHTCapability: /* Get VHT Cap IE. */ + pmlmeinfo->VHT_enable = 1; + break; - case EID_VHTOperation://Get VHT Operation IE. - break; + case EID_VHTOperation: /* Get VHT Operation IE. */ + break; #endif /* CONFIG_80211AC_VHT */ - default: - break; + default: + break; } i += (pIE->Length + 2); @@ -13228,30 +12798,29 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) #if 0 if (padapter->registrypriv.wifi_spec) { - // for WiFi test, follow WMM test plan spec - acparm = 0x002F431C; // VO + /* for WiFi test, follow WMM test plan spec */ + acparm = 0x002F431C; /* VO */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); - acparm = 0x005E541C; // VI + acparm = 0x005E541C; /* VI */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); - acparm = 0x0000A525; // BE + acparm = 0x0000A525; /* BE */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); - acparm = 0x0000A549; // BK + acparm = 0x0000A549; /* BK */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); - - // for WiFi test, mixed mode with intel STA under bg mode throughput issue - if (padapter->mlmepriv.htpriv.ht_option == _FALSE){ + + /* for WiFi test, mixed mode with intel STA under bg mode throughput issue */ + if (padapter->mlmepriv.htpriv.ht_option == _FALSE) { acparm = 0x00004320; rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); } - } - else { - acparm = 0x002F3217; // VO + } else { + acparm = 0x002F3217; /* VO */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); - acparm = 0x005E4317; // VI + acparm = 0x005E4317; /* VI */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); - acparm = 0x00105320; // BE + acparm = 0x00105320; /* BE */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); - acparm = 0x0000A444; // BK + acparm = 0x0000A444; /* BK */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); } #endif @@ -13262,27 +12831,32 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) return H2C_SUCCESS; } - //disable dynamic functions, such as high power, DIG + /* disable dynamic functions, such as high power, DIG */ /*rtw_phydm_func_disable_all(padapter);*/ - //config the initial gain under linking, need to write the BB registers - //initialgain = 0x1E; + /* config the initial gain under linking, need to write the BB registers */ + /* initialgain = 0x1E; */ /*rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, _FALSE);*/ rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); join_type = 0; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, NULL); + doiqk = _TRUE; + rtw_hal_set_hwreg(padapter , HW_VAR_DO_IQK , &doiqk); set_channel_bwmode(padapter, u_ch, u_offset, u_bw); + rtw_mi_update_union_chan_inf(padapter, u_ch, u_offset, u_bw); - //cancel link timer + doiqk = _FALSE; + rtw_hal_set_hwreg(padapter , HW_VAR_DO_IQK , &doiqk); + + /* cancel link timer */ _cancel_timer_ex(&pmlmeext->link_timer); - + start_clnt_join(padapter); - + return H2C_SUCCESS; - + } u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf) @@ -13290,30 +12864,28 @@ u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf) struct disconnect_parm *param = (struct disconnect_parm *)pbuf; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network)); u8 val8; - if (is_client_associated_to_ap(padapter)) - { + if (is_client_associated_to_ap(padapter)) { #ifdef CONFIG_DFS - if(padapter->mlmepriv.handle_dfs == _FALSE) -#endif //CONFIG_DFS + if (padapter->mlmepriv.handle_dfs == _FALSE) +#endif /* CONFIG_DFS */ #ifdef CONFIG_PLATFORM_ROCKCHIPS - //To avoid connecting to AP fail during resume process, change retry count from 5 to 1 + /* To avoid connecting to AP fail during resume process, change retry count from 5 to 1 */ issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 1, 100); #else - issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, param->deauth_timeout_ms/100, 100); -#endif //CONFIG_PLATFORM_ROCKCHIPS + issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, param->deauth_timeout_ms / 100, 100); +#endif /* CONFIG_PLATFORM_ROCKCHIPS */ } #ifdef CONFIG_DFS - if( padapter->mlmepriv.handle_dfs == _TRUE ) + if (padapter->mlmepriv.handle_dfs == _TRUE) padapter->mlmepriv.handle_dfs = _FALSE; -#endif //CONFIG_DFS +#endif /* CONFIG_DFS */ - if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //Stop BCN + if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) { + /* Stop BCN */ val8 = 0; rtw_hal_set_hwreg(padapter, HW_VAR_BCN_FUNC, (u8 *)(&val8)); } @@ -13322,10 +12894,10 @@ u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf) rtw_free_uc_swdec_pending_queue(padapter); - return H2C_SUCCESS; + return H2C_SUCCESS; } -static const char * const _scan_state_str[] = { +static const char *const _scan_state_str[] = { "SCAN_DISABLE", "SCAN_START", "SCAN_PS_ANNC_WAIT", @@ -13359,21 +12931,21 @@ static bool scan_abort_hdl(_adapter *adapter) bool ret = _FALSE; if (pmlmeext->scan_abort == _TRUE) { - #ifdef CONFIG_P2P +#ifdef CONFIG_P2P if (!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) { rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX); ss->channel_idx = 3; - DBG_871X("%s idx:%d, cnt:%u\n", __FUNCTION__ - , ss->channel_idx - , pwdinfo->find_phase_state_exchange_cnt - ); + RTW_INFO("%s idx:%d, cnt:%u\n", __FUNCTION__ + , ss->channel_idx + , pwdinfo->find_phase_state_exchange_cnt + ); } else - #endif +#endif { ss->channel_idx = ss->ch_num; - DBG_871X("%s idx:%d\n", __FUNCTION__ - , ss->channel_idx - ); + RTW_INFO("%s idx:%d\n", __FUNCTION__ + , ss->channel_idx + ); } pmlmeext->scan_abort = _FALSE; ret = _TRUE; @@ -13384,7 +12956,7 @@ static bool scan_abort_hdl(_adapter *adapter) u8 rtw_scan_sparse(_adapter *adapter, struct rtw_ieee80211_channel *ch, u8 ch_num) { -/* interval larger than this is treated as backgroud scan */ + /* interval larger than this is treated as backgroud scan */ #ifndef RTW_SCAN_SPARSE_BG_INTERVAL_MS #define RTW_SCAN_SPARSE_BG_INTERVAL_MS 12000 #endif @@ -13421,51 +12993,42 @@ u8 rtw_scan_sparse(_adapter *adapter, struct rtw_ieee80211_channel *ch, u8 ch_nu interval = rtw_get_passing_time_ms(mlmeext->last_scan_time); - if (adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE - #ifdef CONFIG_CONCURRENT_MODE - || (adapter->pbuddy_adapter && adapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE) - #endif - ) - busy_traffic = _TRUE; - #ifdef CONFIG_WFD - if (is_miracast_enabled(adapter->wfd_info.stack_wfd_mode) - #ifdef CONFIG_CONCURRENT_MODE - || (adapter->pbuddy_adapter && is_miracast_enabled(adapter->pbuddy_adapter->wfd_info.stack_wfd_mode)) - #endif - ) + if (rtw_mi_busy_traffic_check(adapter, _FALSE)) + busy_traffic = _TRUE; + + if (rtw_mi_check_miracast_enabled(adapter)) miracast_enabled = _TRUE; - #endif if (interval > RTW_SCAN_SPARSE_BG_INTERVAL_MS) bg_scan = _TRUE; /* max_allow_ch by conditions*/ - #if RTW_SCAN_SPARSE_MIRACAST +#if RTW_SCAN_SPARSE_MIRACAST if (miracast_enabled == _TRUE && busy_traffic == _TRUE) max_allow_ch = rtw_min(max_allow_ch, RTW_SCAN_SPARSE_CH_NUM_MIRACAST); - #endif +#endif - #if RTW_SCAN_SPARSE_BG +#if RTW_SCAN_SPARSE_BG if (bg_scan == _TRUE) max_allow_ch = rtw_min(max_allow_ch, RTW_SCAN_SPARSE_CH_NUM_BG); - #endif +#endif if (max_allow_ch != SCAN_SPARSE_CH_NUM_INVALID) { int i; int k = 0; - scan_division_num = (ch_num / max_allow_ch) + ((ch_num % max_allow_ch)?1:0); + scan_division_num = (ch_num / max_allow_ch) + ((ch_num % max_allow_ch) ? 1 : 0); token = (token + 1) % scan_division_num; - + if (0) - DBG_871X("scan_division_num:%u, token:%u\n", scan_division_num, token); - + RTW_INFO("scan_division_num:%u, token:%u\n", scan_division_num, token); + for (i = 0; i < ch_num; i++) { if (ch[i].hw_value && (i % scan_division_num) == token - ) { + ) { if (i != k) _rtw_memcpy(&ch[k], &ch[i], sizeof(struct rtw_ieee80211_channel)); k++; @@ -13483,63 +13046,68 @@ exit: } static int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out, - u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num) + u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num) { int i, j; int scan_ch_num = 0; int set_idx; + u8 chan; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; /* clear first */ - _rtw_memset(out, 0, sizeof(struct rtw_ieee80211_channel)*out_num); + _rtw_memset(out, 0, sizeof(struct rtw_ieee80211_channel) * out_num); /* acquire channels from in */ j = 0; - for (i=0;ichannel_set, in[i].hw_value)) >=0 - && rtw_mlme_band_check(padapter, in[i].hw_value) == _TRUE - ) - { + if (!in[i].hw_value || (in[i].flags & RTW_IEEE80211_CHAN_DISABLED)) + continue; + if (rtw_mlme_band_check(padapter, in[i].hw_value) == _FALSE) + continue; + + set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, in[i].hw_value); + if (set_idx >= 0) { if (j >= out_num) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" out_num:%u not enough\n", - FUNC_ADPT_ARG(padapter), out_num); + RTW_PRINT(FUNC_ADPT_FMT" out_num:%u not enough\n", + FUNC_ADPT_ARG(padapter), out_num); break; } _rtw_memcpy(&out[j], &in[i], sizeof(struct rtw_ieee80211_channel)); - - if(pmlmeext->channel_set[set_idx].ScanType == SCAN_PASSIVE) + + if (pmlmeext->channel_set[set_idx].ScanType == SCAN_PASSIVE) out[j].flags |= RTW_IEEE80211_CHAN_PASSIVE_SCAN; - + j++; } - if(j>=out_num) + if (j >= out_num) break; } - + /* if out is empty, use channel_set as default */ - if(j == 0) { - for (i=0;imax_chan_nums;i++) { + if (j == 0) { + for (i = 0; i < pmlmeext->max_chan_nums; i++) { + chan = pmlmeext->channel_set[i].ChannelNum; + if (rtw_mlme_band_check(padapter, chan) == _TRUE) { + if (rtw_mlme_ignore_chan(padapter, chan) == _TRUE) + continue; - if (0) - 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) { + if (0) + RTW_INFO(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter), chan); if (j >= out_num) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" out_num:%u not enough\n", + RTW_PRINT(FUNC_ADPT_FMT" out_num:%u not enough\n", FUNC_ADPT_ARG(padapter), out_num); break; } - out[j].hw_value = pmlmeext->channel_set[i].ChannelNum; - - if(pmlmeext->channel_set[i].ScanType == SCAN_PASSIVE) + out[j].hw_value = chan; + + if (pmlmeext->channel_set[i].ScanType == SCAN_PASSIVE) out[j].flags |= RTW_IEEE80211_CHAN_PASSIVE_SCAN; j++; @@ -13560,26 +13128,27 @@ static void sitesurvey_res_reset(_adapter *adapter, struct sitesurvey_parm *parm ss->bss_cnt = 0; ss->channel_idx = 0; + ss->igi_scan = 0; + ss->igi_before_scan = 0; #ifdef CONFIG_SCAN_BACKOP ss->scan_cnt = 0; #endif #if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL) ss->is_sw_antdiv_bl_scan = 0; #endif - + for (i = 0; i < RTW_SSID_SCAN_AMOUNT; i++) { if (parm->ssid[i].SsidLength) { _rtw_memcpy(ss->ssid[i].Ssid, parm->ssid[i].Ssid, IW_ESSID_MAX_SIZE); ss->ssid[i].SsidLength = parm->ssid[i].SsidLength; - } else { + } else ss->ssid[i].SsidLength = 0; - } } ss->ch_num = rtw_scan_ch_decision(adapter - , ss->ch, RTW_CHANNEL_SCAN_AMOUNT - , parm->ch, parm->ch_num - ); + , ss->ch, RTW_CHANNEL_SCAN_AMOUNT + , parm->ch, parm->ch_num + ); ss->scan_mode = parm->scan_mode; } @@ -13634,7 +13203,7 @@ static u8 sitesurvey_pick_ch_behavior(_adapter *padapter, u8 *ch, RT_SCAN_TYPE * if (scan_ch != 0) { next_state = SCAN_PROCESS; - #ifdef CONFIG_SCAN_BACKOP +#ifdef CONFIG_SCAN_BACKOP { u8 sta_num; u8 ld_sta_num; @@ -13642,43 +13211,39 @@ static u8 sitesurvey_pick_ch_behavior(_adapter *padapter, u8 *ch, RT_SCAN_TYPE * u8 ld_ap_num; u8 backop_flags = 0; - rtw_dev_iface_status(padapter, &sta_num, &ld_sta_num, NULL, &ap_num, &ld_ap_num); + rtw_mi_status(padapter, &sta_num, &ld_sta_num, NULL, &ap_num, &ld_ap_num, NULL); if ((ld_sta_num > 0 && mlmeext_chk_scan_backop_flags_sta(pmlmeext, SS_BACKOP_EN)) - || (sta_num > 0 && mlmeext_chk_scan_backop_flags_sta(pmlmeext, SS_BACKOP_EN_NL)) - ) { + || (sta_num > 0 && mlmeext_chk_scan_backop_flags_sta(pmlmeext, SS_BACKOP_EN_NL))) backop_flags |= mlmeext_scan_backop_flags_sta(pmlmeext); - } if ((ld_ap_num > 0 && mlmeext_chk_scan_backop_flags_ap(pmlmeext, SS_BACKOP_EN)) - || (ap_num > 0 && mlmeext_chk_scan_backop_flags_ap(pmlmeext, SS_BACKOP_EN_NL)) - ) { + || (ap_num > 0 && mlmeext_chk_scan_backop_flags_ap(pmlmeext, SS_BACKOP_EN_NL))) backop_flags |= mlmeext_scan_backop_flags_ap(pmlmeext); - } if (backop_flags) { - if (ss->scan_cnt < ss->scan_cnt_max) { + if (ss->scan_cnt < ss->scan_cnt_max) ss->scan_cnt++; - } else { + else { mlmeext_assign_scan_backop_flags(pmlmeext, backop_flags); next_state = SCAN_BACKING_OP; } } } - #endif /* CONFIG_SCAN_BACKOP */ +#endif /* CONFIG_SCAN_BACKOP */ } else if (rtw_p2p_findphase_ex_is_needed(pwdinfo)) { /* go p2p listen */ next_state = SCAN_TO_P2P_LISTEN; - #ifdef CONFIG_ANTENNA_DIVERSITY +#ifdef CONFIG_ANTENNA_DIVERSITY } else if (rtw_hal_antdiv_before_linked(padapter)) { /* go sw antdiv before link */ next_state = SCAN_SW_ANTDIV_BL; - #endif +#endif } else { next_state = SCAN_COMPLETE; - #if defined(DBG_SCAN_SW_ANTDIV_BL) +#if defined(DBG_SCAN_SW_ANTDIV_BL) { /* for SCAN_SW_ANTDIV_BL state testing */ struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); @@ -13696,18 +13261,17 @@ static u8 sitesurvey_pick_ch_behavior(_adapter *padapter, u8 *ch, RT_SCAN_TYPE * if (fake_sw_antdiv_bl_state == 0) { next_state = SCAN_SW_ANTDIV_BL; fake_sw_antdiv_bl_state = 1; - } else { + } else fake_sw_antdiv_bl_state = 0; - } } } - #endif /* defined(DBG_SCAN_SW_ANTDIV_BL) */ +#endif /* defined(DBG_SCAN_SW_ANTDIV_BL) */ } - #ifdef CONFIG_SCAN_BACKOP +#ifdef CONFIG_SCAN_BACKOP if (next_state != SCAN_PROCESS) ss->scan_cnt = 0; - #endif +#endif #ifdef DBG_FIXED_CHAN @@ -13735,29 +13299,29 @@ void site_survey(_adapter *padapter, u8 survey_channel, RT_SCAN_TYPE ScanType) if (survey_channel != 0) { set_channel_bwmode(padapter, survey_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); - #ifdef CONFIG_AUTO_CHNL_SEL_NHM +#ifdef CONFIG_AUTO_CHNL_SEL_NHM if (ACS_ENABLE == GET_ACS_STATE(padapter)) { ACS_OP acs_op = ACS_RESET; rtw_hal_set_odm_var(padapter, HAL_ODM_AUTO_CHNL_SEL, &acs_op, _TRUE); rtw_set_acs_channel(padapter, survey_channel); - #ifdef DBG_AUTO_CHNL_SEL_NHM - DBG_871X("[ACS-"ADPT_FMT"]-set ch:%u\n", +#ifdef DBG_AUTO_CHNL_SEL_NHM + RTW_INFO("[ACS-"ADPT_FMT"]-set ch:%u\n", ADPT_ARG(padapter), rtw_get_acs_channel(padapter)); - #endif +#endif } - #endif +#endif if (ScanType == SCAN_ACTIVE) { - #ifdef CONFIG_P2P - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || - rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) - ) { +#ifdef CONFIG_P2P + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || + rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) + ) { issue_probereq_p2p(padapter, NULL); issue_probereq_p2p(padapter, NULL); issue_probereq_p2p(padapter, NULL); } else - #endif /* CONFIG_P2P */ +#endif /* CONFIG_P2P */ { int i; @@ -13796,13 +13360,22 @@ void survey_done_set_ch_bw(_adapter *padapter) u8 cur_channel = 0; u8 cur_bwmode; u8 cur_ch_offset; - - if (rtw_get_ch_setting_union(padapter, &cur_channel, &cur_bwmode, &cur_ch_offset) != 0) { + +#ifdef CONFIG_MCC_MODE + if (!rtw_hal_mcc_change_scan_flag(padapter, &cur_channel, &cur_bwmode, &cur_ch_offset)) { if (0) - DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n", + RTW_INFO(FUNC_ADPT_FMT" back to AP channel - ch:%u, bw:%u, offset:%u\n", + FUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset); + goto exit; + } +#endif + + if (rtw_mi_get_ch_setting_union(padapter, &cur_channel, &cur_bwmode, &cur_ch_offset) != 0) { + if (0) + RTW_INFO(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); } else { - #ifdef CONFIG_P2P +#ifdef CONFIG_P2P struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); _adapter *iface; int i; @@ -13812,36 +13385,54 @@ void survey_done_set_ch_bw(_adapter *padapter) if (!iface) continue; - #ifdef CONFIG_IOCTL_CFG80211 +#ifdef CONFIG_IOCTL_CFG80211 if (iface->wdinfo.driver_interface == DRIVER_CFG80211 && !adapter_wdev_data(iface)->p2p_enabled) continue; - #endif +#endif if (rtw_p2p_chk_state(&iface->wdinfo, P2P_STATE_LISTEN)) { cur_channel = iface->wdinfo.listen_channel; cur_bwmode = CHANNEL_WIDTH_20; cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; if (0) - DBG_871X(FUNC_ADPT_FMT" back to "ADPT_FMT"'s listen ch - ch:%u, bw:%u, offset:%u\n", + RTW_INFO(FUNC_ADPT_FMT" back to "ADPT_FMT"'s listen ch - ch:%u, bw:%u, offset:%u\n", FUNC_ADPT_ARG(padapter), ADPT_ARG(iface), cur_channel, cur_bwmode, cur_ch_offset); break; } } - #endif /* CONFIG_P2P */ +#endif /* CONFIG_P2P */ if (cur_channel == 0) { cur_channel = pmlmeext->cur_channel; cur_bwmode = pmlmeext->cur_bwmode; cur_ch_offset = pmlmeext->cur_ch_offset; if (0) - DBG_871X(FUNC_ADPT_FMT" back to ch:%u, bw:%u, offset:%u\n", + RTW_INFO(FUNC_ADPT_FMT" back to ch:%u, bw:%u, offset:%u\n", FUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset); } } - +exit: set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); } +#if 1 +/** + * sitesurvey_ps_annc - check and doing ps announcement for all the adapters of given @dvobj + * @padapter + * @ps: power saving or not + * + * Returns: 0: no ps announcement is doing. 1: ps announcement is doing + */ + +u8 sitesurvey_ps_annc(_adapter *padapter, bool ps) +{ + u8 ps_anc = 0; + + if (rtw_mi_issue_nulldata(padapter, NULL, ps, 3, 500)) + ps_anc = 1; + return ps_anc; +} +#else /** * sitesurvey_ps_annc - check and doing ps announcement for all the adapters of given @dvobj * @dvobj: the dvobj to check @@ -13849,6 +13440,7 @@ void survey_done_set_ch_bw(_adapter *padapter) * * Returns: 0: no ps announcement is doing. 1: ps announcement is doing */ + u8 sitesurvey_ps_annc(struct dvobj_priv *dvobj, bool ps) { _adapter *adapter; @@ -13874,36 +13466,82 @@ u8 sitesurvey_ps_annc(struct dvobj_priv *dvobj, bool ps) } } } - return ps_anc; } +#endif -void sitesurvey_set_igi(_adapter *adapter, bool enter) +void sitesurvey_set_igi(_adapter *adapter) { + struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; + struct ss_res *ss = &mlmeext->sitesurvey_res; u8 igi; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &adapter->wdinfo; #endif - if (enter) { -#ifdef CONFIG_P2P -#ifdef CONFIG_IOCTL_CFG80211 + switch (mlmeext_scan_state(mlmeext)) { + case SCAN_ENTER: + #ifdef CONFIG_P2P + #ifdef CONFIG_IOCTL_CFG80211 if (adapter_wdev_data(adapter)->p2p_enabled == _TRUE && pwdinfo->driver_interface == DRIVER_CFG80211) igi = 0x30; else -#endif /* CONFIG_IOCTL_CFG80211 */ + #endif /* CONFIG_IOCTL_CFG80211 */ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) igi = 0x28; else -#endif /* CONFIG_P2P */ + #endif /* CONFIG_P2P */ igi = 0x1e; - } else { - igi = 0xff; /* restore RX GAIN */ + + /* record IGI status */ + ss->igi_scan = igi; + rtw_hal_get_odm_var(adapter, HAL_ODM_INITIAL_GAIN, &ss->igi_before_scan, NULL); + + /* disable DIG and set IGI for scan */ + rtw_hal_set_odm_var(adapter, HAL_ODM_INITIAL_GAIN, &igi, _FALSE); + break; + case SCAN_COMPLETE: + case SCAN_TO_P2P_LISTEN: + /* enable DIG and restore IGI */ + igi = 0xff; + rtw_hal_set_odm_var(adapter, HAL_ODM_INITIAL_GAIN, &igi, _FALSE); + break; +#ifdef CONFIG_SCAN_BACKOP + case SCAN_BACKING_OP: + /* write IGI for op channel when DIG is not enabled */ + ODM_Write_DIG(GET_ODM(adapter), ss->igi_before_scan); + break; + case SCAN_LEAVE_OP: + /* write IGI for scan when DIG is not enabled */ + ODM_Write_DIG(GET_ODM(adapter), ss->igi_scan); + break; +#endif /* CONFIG_SCAN_BACKOP */ + default: + rtw_warn_on(1); + break; } - - rtw_hal_set_odm_var(adapter, HAL_ODM_INITIAL_GAIN, &igi, _FALSE); } +void sitesurvey_set_msr(_adapter *adapter, bool enter) +{ + u8 network_type; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + if (enter) { +#ifdef CONFIG_MI_WITH_MBSSID_CAM + rtw_hal_get_hwreg(adapter, HW_VAR_MEDIA_STATUS, (u8 *)(&pmlmeinfo->hw_media_state)); +#endif + /* set MSR to no link state */ + network_type = _HW_STATE_NOLINK_; + } else { +#ifdef CONFIG_MI_WITH_MBSSID_CAM + network_type = pmlmeinfo->hw_media_state; +#else + network_type = pmlmeinfo->state & 0x3; +#endif + } + Set_MSR(adapter, network_type); +} u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) { struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf; @@ -13920,7 +13558,7 @@ u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) #ifdef DBG_CHECK_FW_PS_STATE if (rtw_fw_ps_state(padapter) == _FAIL) { - DBG_871X("scan without leave 32k\n"); + RTW_INFO("scan without leave 32k\n"); pdbgpriv->dbg_scan_pwr_state_cnt++; } #endif /* DBG_CHECK_FW_PS_STATE */ @@ -13937,7 +13575,7 @@ operation_by_state: switch (mlmeext_scan_state(pmlmeext)) { case SCAN_DISABLE: - /* + /* * SW parameter initialization */ @@ -13950,18 +13588,20 @@ operation_by_state: * prepare to leave operating channel */ +#ifdef CONFIG_MCC_MODE + rtw_hal_set_mcc_setting_scan_start(padapter); +#endif /* CONFIG_MCC_MODE */ + /* apply rx ampdu setting */ if (ss->rx_ampdu_accept != RX_AMPDU_ACCEPT_INVALID - || ss->rx_ampdu_size != RX_AMPDU_SIZE_INVALID - ) { + || ss->rx_ampdu_size != RX_AMPDU_SIZE_INVALID) rtw_rx_ampdu_apply(padapter); - } /* clear HW TX queue before scan */ rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0); /* power save state announcement */ - if (sitesurvey_ps_annc(adapter_to_dvobj(padapter), 1)) { + if (sitesurvey_ps_annc(padapter, 1)) { mlmeext_set_scan_state(pmlmeext, SCAN_PS_ANNC_WAIT); mlmeext_set_scan_next_state(pmlmeext, SCAN_ENTER); set_survey_timer(pmlmeext, 50); /* delay 50ms to protect nulldata(1) */ @@ -13977,46 +13617,45 @@ operation_by_state: * HW register and DM setting for enter scan */ - /* config the initial gain under scanning */ - sitesurvey_set_igi(padapter, 1); - - /* disable dynamic functions, such as high power, DIG */ rtw_phydm_ability_backup(padapter); + + sitesurvey_set_igi(padapter); + + /* config dynamic functions for off channel */ rtw_phydm_func_for_offchannel(padapter); - /* set MSR to no link state */ - Set_MSR(padapter, _HW_STATE_NOLINK_); + sitesurvey_set_msr(padapter, _TRUE); + val8 = 1; /* under site survey */ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); mlmeext_set_scan_state(pmlmeext, SCAN_PROCESS); goto operation_by_state; - case SCAN_PROCESS: - { + case SCAN_PROCESS: { u8 scan_ch; RT_SCAN_TYPE scan_type; u8 next_state; u32 scan_ms; - #ifdef CONFIG_AUTO_CHNL_SEL_NHM +#ifdef CONFIG_AUTO_CHNL_SEL_NHM if ((ACS_ENABLE == GET_ACS_STATE(padapter)) && (0 != rtw_get_acs_channel(padapter))) { ACS_OP acs_op = ACS_SELECT; rtw_hal_set_odm_var(padapter, HAL_ODM_AUTO_CHNL_SEL, &acs_op, _TRUE); } - #endif +#endif next_state = sitesurvey_pick_ch_behavior(padapter, &scan_ch, &scan_type); if (next_state != SCAN_PROCESS) { - #ifdef CONFIG_AUTO_CHNL_SEL_NHM +#ifdef CONFIG_AUTO_CHNL_SEL_NHM if (ACS_ENABLE == GET_ACS_STATE(padapter)) { rtw_set_acs_channel(padapter, 0); - #ifdef DBG_AUTO_CHNL_SEL_NHM - DBG_871X("[ACS-"ADPT_FMT"]-set ch:%u\n", ADPT_ARG(padapter), rtw_get_acs_channel(padapter)); - #endif +#ifdef DBG_AUTO_CHNL_SEL_NHM + RTW_INFO("[ACS-"ADPT_FMT"]-set ch:%u\n", ADPT_ARG(padapter), rtw_get_acs_channel(padapter)); +#endif } - #endif +#endif mlmeext_set_scan_state(pmlmeext, next_state); goto operation_by_state; @@ -14024,114 +13663,114 @@ operation_by_state: /* still SCAN_PROCESS state */ if (0) - #ifdef CONFIG_P2P - DBG_871X(FUNC_ADPT_FMT" %s ch:%u (cnt:%u,idx:%d) at %dms, %c%c%c\n" - , FUNC_ADPT_ARG(padapter) - , mlmeext_scan_state_str(pmlmeext) - , scan_ch +#ifdef CONFIG_P2P + RTW_INFO(FUNC_ADPT_FMT" %s ch:%u (cnt:%u,idx:%d) at %dms, %c%c%c\n" + , FUNC_ADPT_ARG(padapter) + , mlmeext_scan_state_str(pmlmeext) + , scan_ch , pwdinfo->find_phase_state_exchange_cnt, ss->channel_idx , rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time) - , scan_type?'A':'P', ss->scan_mode?'A':'P' - , ss->ssid[0].SsidLength?'S':' ' - ); - #else - DBG_871X(FUNC_ADPT_FMT" %s ch:%u (idx:%d) at %dms, %c%c%c\n" - , FUNC_ADPT_ARG(padapter) - , mlmeext_scan_state_str(pmlmeext) - , scan_ch - , ss->channel_idx + , scan_type ? 'A' : 'P', ss->scan_mode ? 'A' : 'P' + , ss->ssid[0].SsidLength ? 'S' : ' ' + ); +#else + RTW_INFO(FUNC_ADPT_FMT" %s ch:%u (idx:%d) at %dms, %c%c%c\n" + , FUNC_ADPT_ARG(padapter) + , mlmeext_scan_state_str(pmlmeext) + , scan_ch + , ss->channel_idx , rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time) - , scan_type?'A':'P', ss->scan_mode?'A':'P' - , ss->ssid[0].SsidLength?'S':' ' - ); - #endif /* CONFIG_P2P */ + , scan_type ? 'A' : 'P', ss->scan_mode ? 'A' : 'P' + , ss->ssid[0].SsidLength ? 'S' : ' ' + ); +#endif /* CONFIG_P2P */ - #ifdef DBG_FIXED_CHAN +#ifdef DBG_FIXED_CHAN if (pmlmeext->fixed_chan != 0xff) - DBG_871X(FUNC_ADPT_FMT" fixed_chan:%u\n", pmlmeext->fixed_chan); - #endif + RTW_INFO(FUNC_ADPT_FMT" fixed_chan:%u\n", pmlmeext->fixed_chan); +#endif site_survey(padapter, scan_ch, scan_type); - #if defined(CONFIG_ATMEL_RC_PATCH) +#if defined(CONFIG_ATMEL_RC_PATCH) if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) scan_ms = 20; else scan_ms = 40; - #else +#else scan_ms = ss->scan_ch_ms; - #endif +#endif - #if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL) +#if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL) if (ss->is_sw_antdiv_bl_scan) - scan_ms = scan_ms/2; - #endif + scan_ms = scan_ms / 2; +#endif - #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR) +#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR) { struct noise_info info; info.bPauseDIG = _FALSE; info.IGIValue = 0; - info.max_time = scan_ms/2; + info.max_time = scan_ms / 2; info.chan = scan_ch; - rtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR, &info, _FALSE); + rtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR, &info, _FALSE); } - #endif +#endif set_survey_timer(pmlmeext, scan_ms); break; } - #ifdef CONFIG_SCAN_BACKOP - case SCAN_BACKING_OP: - { +#ifdef CONFIG_SCAN_BACKOP + case SCAN_BACKING_OP: { u8 back_ch, back_bw, back_ch_offset; + u8 need_ch_setting_union = _TRUE; - if (rtw_get_ch_setting_union(padapter, &back_ch, &back_bw, &back_ch_offset) == 0) - rtw_warn_on(1); +#ifdef CONFIG_MCC_MODE + need_ch_setting_union = rtw_hal_mcc_change_scan_flag(padapter, + &back_ch, &back_bw, &back_ch_offset); +#endif /* CONFIG_MCC_MODE */ + + if (need_ch_setting_union) { + if (rtw_mi_get_ch_setting_union(padapter, &back_ch, &back_bw, &back_ch_offset) == 0) + rtw_warn_on(1); + } if (0) - DBG_871X(FUNC_ADPT_FMT" %s ch:%u, bw:%u, offset:%u at %dms\n" - , FUNC_ADPT_ARG(padapter) - , mlmeext_scan_state_str(pmlmeext) - , back_ch, back_bw, back_ch_offset + RTW_INFO(FUNC_ADPT_FMT" %s ch:%u, bw:%u, offset:%u at %dms\n" + , FUNC_ADPT_ARG(padapter) + , mlmeext_scan_state_str(pmlmeext) + , back_ch, back_bw, back_ch_offset , rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time) - ); + ); set_channel_bwmode(padapter, back_ch, back_ch_offset, back_bw); - Set_MSR(padapter, (pmlmeinfo->state & 0x3)); + sitesurvey_set_msr(padapter, _FALSE); + val8 = 0; /* survey done */ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); if (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC)) { - sitesurvey_set_igi(padapter, 0); - sitesurvey_ps_annc(adapter_to_dvobj(padapter), 0); + sitesurvey_set_igi(padapter); + sitesurvey_ps_annc(padapter, 0); } mlmeext_set_scan_state(pmlmeext, SCAN_BACK_OP); ss->backop_time = rtw_get_current_time(); - if (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_TX_RESUME)) { - int i; + if (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_TX_RESUME)) + rtw_mi_os_xmit_schedule(padapter); - /* resume TX */ - for (i = 0; i < dvobj->iface_nums; i++) { - if (!dvobj->padapters[i]) - continue; - - rtw_os_xmit_schedule(dvobj->padapters[i]); - } - } goto operation_by_state; } - + case SCAN_BACK_OP: if (rtw_get_passing_time_ms(ss->backop_time) >= ss->backop_ms - || pmlmeext->scan_abort - ) { + || pmlmeext->scan_abort + ) { mlmeext_set_scan_state(pmlmeext, SCAN_LEAVING_OP); goto operation_by_state; } @@ -14147,8 +13786,8 @@ operation_by_state: rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0); if (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC) - && sitesurvey_ps_annc(adapter_to_dvobj(padapter), 1) - ) { + && sitesurvey_ps_annc(padapter, 1) + ) { mlmeext_set_scan_state(pmlmeext, SCAN_PS_ANNC_WAIT); mlmeext_set_scan_next_state(pmlmeext, SCAN_LEAVE_OP); set_survey_timer(pmlmeext, 50); /* delay 50ms to protect nulldata(1) */ @@ -14164,22 +13803,20 @@ operation_by_state: * HW register and DM setting for enter scan */ - if (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC)) { - /* config the initial gain under scanning */ - sitesurvey_set_igi(padapter, 1); - } + if (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC)) + sitesurvey_set_igi(padapter); - /* set MSR to no link state */ - Set_MSR(padapter, _HW_STATE_NOLINK_); - val8 = 1; //under site survey + sitesurvey_set_msr(padapter, _TRUE); + + val8 = 1; /* under site survey */ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); mlmeext_set_scan_state(pmlmeext, SCAN_PROCESS); goto operation_by_state; - #endif /* CONFIG_SCAN_BACKOP */ +#endif /* CONFIG_SCAN_BACKOP */ - #if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL) +#if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL) case SCAN_SW_ANTDIV_BL: /* * 20100721 @@ -14193,9 +13830,9 @@ operation_by_state: mlmeext_set_scan_next_state(pmlmeext, SCAN_PROCESS); set_survey_timer(pmlmeext, ss->scan_ch_ms); break; - #endif +#endif - #ifdef CONFIG_P2P +#ifdef CONFIG_P2P case SCAN_TO_P2P_LISTEN: /* * Set the P2P State to the listen state of find phase @@ -14203,11 +13840,11 @@ operation_by_state: */ set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_LISTEN); - + /* turn on phy-dynamic functions */ rtw_phydm_ability_restore(padapter); - sitesurvey_set_igi(padapter, 0); + sitesurvey_set_igi(padapter); mlmeext_set_scan_state(pmlmeext, SCAN_P2P_LISTEN); _set_timer(&pwdinfo->find_phase_timer, (u32)((u32)pwdinfo->listen_dwell * 100)); @@ -14217,40 +13854,43 @@ operation_by_state: mlmeext_set_scan_state(pmlmeext, SCAN_PROCESS); ss->channel_idx = 0; goto operation_by_state; - #endif /* CONFIG_P2P */ +#endif /* CONFIG_P2P */ - case SCAN_COMPLETE: - #ifdef CONFIG_P2P + case SCAN_COMPLETE: +#ifdef CONFIG_P2P if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) - || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) - ) { - #ifdef CONFIG_CONCURRENT_MODE + || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) + ) { +#ifdef CONFIG_CONCURRENT_MODE if (pwdinfo->driver_interface == DRIVER_WEXT) { - if (check_buddy_fwstate(padapter, _FW_LINKED)) + if (rtw_mi_check_status(padapter, MI_LINKED)) _set_timer(&pwdinfo->ap_p2p_switch_timer, 500); } +#endif + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - #else - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - #endif } rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); - #endif /* CONFIG_P2P */ +#endif /* CONFIG_P2P */ /* switch channel */ survey_done_set_ch_bw(padapter); - /* config MSR */ - Set_MSR(padapter, (pmlmeinfo->state & 0x3)); + sitesurvey_set_msr(padapter, _FALSE); + val8 = 0; /* survey done */ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); /* turn on phy-dynamic functions */ rtw_phydm_ability_restore(padapter); - sitesurvey_set_igi(padapter, 0); + sitesurvey_set_igi(padapter); - sitesurvey_ps_annc(adapter_to_dvobj(padapter), 0); +#ifdef CONFIG_MCC_MODE + /* start MCC fail, then tx null data */ + if (!rtw_hal_set_mcc_setting_scan_complete(padapter)) +#endif /* CONFIG_MCC_MODE */ + sitesurvey_ps_annc(padapter, 0); /* apply rx ampdu setting */ rtw_rx_ampdu_apply(padapter); @@ -14272,15 +13912,27 @@ u8 setauth_hdl(_adapter *padapter, unsigned char *pbuf) struct setauth_parm *pparm = (struct setauth_parm *)pbuf; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if (pparm->mode < 4) - { - pmlmeinfo->auth_algo = pparm->mode; - } - return H2C_SUCCESS; + if (pparm->mode < 4) + pmlmeinfo->auth_algo = pparm->mode; + + return H2C_SUCCESS; } +/* +SEC CAM Entry format (32 bytes) +DW0 - MAC_ADDR[15:0] | Valid[15] | MFB[14:8] | RSVD[7] | GK[6] | MIC_KEY[5] | SEC_TYPE[4:2] | KID[1:0] +DW0 - MAC_ADDR[15:0] | Valid[15] |RSVD[14:9] | RPT_MODE[8] | SPP_MODE[7] | GK[6] | MIC_KEY[5] | SEC_TYPE[4:2] | KID[1:0] (92E/8812A/8814A) +DW1 - MAC_ADDR[47:16] +DW2 - KEY[31:0] +DW3 - KEY[63:32] +DW4 - KEY[95:64] +DW5 - KEY[127:96] +DW6 - RSVD +DW7 - RSVD +*/ + +/*Set WEP key or Group Key*/ u8 setkey_hdl(_adapter *padapter, u8 *pbuf) { u16 ctrl = 0; @@ -14290,28 +13942,41 @@ u8 setkey_hdl(_adapter *padapter, u8 *pbuf) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); unsigned char null_addr[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; u8 *addr; - bool used; + bool used = _FALSE; - //main tx key for wep. - if(pparm->set_tx) + /* main tx key for wep. */ + if (pparm->set_tx) pmlmeinfo->key_index = pparm->keyid; - cam_id = rtw_camid_alloc(padapter, NULL, pparm->keyid, &used); +#ifdef CONFIG_CONCURRENT_MODE + if (((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE)) + cam_id = rtw_iface_bcmc_id_get(padapter); + else +#endif + cam_id = rtw_camid_alloc(padapter, NULL, pparm->keyid, &used); if (cam_id < 0) goto enable_mc; - if (cam_id > 3) /* not default key, searched by A2 */ - addr = get_bssid(&padapter->mlmepriv); - else +#ifndef CONFIG_CONCURRENT_MODE + if (cam_id >= 0 && cam_id <= 3) addr = null_addr; + else +#endif + { + if (((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE)) + /* for AP mode ,we will force sec cam entry_id so hw dont search cam when tx*/ + addr = adapter_mac_addr(padapter); + else + /* not default key, searched by A2 */ + addr = get_bssid(&padapter->mlmepriv); + } - #ifdef DYNAMIC_CAMID_ALLOC /* cam entry searched is pairwise key */ if (used == _TRUE && rtw_camid_is_gk(padapter, cam_id) == _FALSE) { s16 camid_clr; - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key with "MAC_FMT" id:%u the same key id as pairwise key\n" + RTW_PRINT(FUNC_ADPT_FMT" group key with "MAC_FMT" id:%u the same key id as pairwise key\n" , FUNC_ADPT_ARG(padapter), MAC_ARG(addr), pparm->keyid); /* HW has problem to distinguish this group key with existing pairwise key, stop HW enc and dec for BMC */ @@ -14320,37 +13985,101 @@ u8 setkey_hdl(_adapter *padapter, u8 *pbuf) /* clear group key */ while ((camid_clr = rtw_camid_search(padapter, addr, -1, 1)) >= 0) { - DBG_871X_LEVEL(_drv_always_, "clear group key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(addr), camid_clr); + RTW_PRINT("clear group key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(addr), camid_clr); clear_cam_entry(padapter, camid_clr); rtw_camid_free(padapter, camid_clr); } goto enable_mc; } - #endif - ctrl = BIT(15) | BIT6 | ((pparm->algorithm) << 2) | pparm->keyid; - DBG_871X_LEVEL(_drv_always_, "set group key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n" + ctrl = BIT(15) | BIT(6) | ((pparm->algorithm) << 2) | pparm->keyid; + + RTW_PRINT("set group key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n" , cam_id, MAC_ARG(addr), pparm->keyid, security_type_str(pparm->algorithm)); + write_cam(padapter, cam_id, ctrl, addr, pparm->key); - #ifdef DYNAMIC_CAMID_ALLOC - if (cam_id >=0 && cam_id <=3) - rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_TRUE); - #endif + /* if ((cam_id > 3) && (((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)))*/ +#ifdef CONFIG_CONCURRENT_MODE + if (((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE)) { + if (is_wep_enc(pparm->algorithm)) { + padapter->securitypriv.dot11Def_camid[pparm->keyid] = cam_id; + padapter->securitypriv.dot118021x_bmc_cam_id = + padapter->securitypriv.dot11Def_camid[padapter->securitypriv.dot11PrivacyKeyIndex]; + RTW_PRINT("wep group key - force camid:%d\n", padapter->securitypriv.dot118021x_bmc_cam_id); + } else { + /*u8 org_cam_id = padapter->securitypriv.dot118021x_bmc_cam_id;*/ + + /*force GK's cam id*/ + padapter->securitypriv.dot118021x_bmc_cam_id = cam_id; + + /* for GTK rekey + if ((org_cam_id != INVALID_SEC_MAC_CAM_ID) && + (org_cam_id != cam_id)) { + RTW_PRINT("clear group key for addr:"MAC_FMT", org_camid:%d new_camid:%d\n", MAC_ARG(addr), org_cam_id, cam_id); + clear_cam_entry(padapter, org_cam_id); + rtw_camid_free(padapter, org_cam_id); + }*/ + } + } +#endif + + +#ifndef CONFIG_CONCURRENT_MODE + if (cam_id >= 0 && cam_id <= 3) + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8 *)_TRUE); +#endif + + /* 8814au should set both broadcast and unicast CAM entry for WEP key in STA mode */ + if (is_wep_enc(pparm->algorithm) && check_mlmeinfo_state(pmlmeext, WIFI_FW_STATION_STATE) && + _rtw_camctl_chk_cap(padapter, SEC_CAP_CHK_BMC)) { + struct set_stakey_parm sta_pparm; + + sta_pparm.algorithm = pparm->algorithm; + sta_pparm.keyid = pparm->keyid; + _rtw_memcpy(sta_pparm.key, pparm->key, 16); + _rtw_memcpy(sta_pparm.addr, get_bssid(&padapter->mlmepriv), ETH_ALEN); + set_stakey_hdl(padapter, (u8 *)&sta_pparm); + } enable_mc: - //allow multicast packets to driver + /* allow multicast packets to driver */ rtw_hal_set_hwreg(padapter, HW_VAR_ON_RCR_AM, null_addr); return H2C_SUCCESS; } +void rtw_ap_wep_pk_setting(_adapter *adapter, struct sta_info *psta) +{ + struct security_priv *psecuritypriv = &(adapter->securitypriv); + struct set_stakey_parm sta_pparm; + sint keyid; + + if (!is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm)) + return; + + for (keyid = 0; keyid < 4; keyid++) { + if ((psecuritypriv->key_mask & BIT(keyid)) && (keyid == psecuritypriv->dot11PrivacyKeyIndex)) { + sta_pparm.algorithm = psecuritypriv->dot11PrivacyAlgrthm; + sta_pparm.keyid = keyid; + _rtw_memcpy(sta_pparm.key, &(psecuritypriv->dot11DefKey[keyid].skey[0]), 16); + _rtw_memcpy(sta_pparm.addr, psta->hwaddr, ETH_ALEN); + + RTW_PRINT(FUNC_ADPT_FMT"set WEP - PK with "MAC_FMT" keyid:%u\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(psta->hwaddr), keyid); + + set_stakey_hdl(adapter, (u8 *)&sta_pparm); + } + } +} + u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf) { u16 ctrl = 0; s16 cam_id = 0; bool used; + u8 kid = 0; u8 ret = H2C_SUCCESS; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -14358,27 +14087,28 @@ u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf) struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info *psta; - if(pparm->algorithm == _NO_PRIVACY_) + if (pparm->algorithm == _NO_PRIVACY_) goto write_to_cam; psta = rtw_get_stainfo(pstapriv, pparm->addr); if (!psta) { - DBG_871X_LEVEL(_drv_always_, "%s sta:"MAC_FMT" not found\n", __func__, MAC_ARG(pparm->addr)); + RTW_PRINT("%s sta:"MAC_FMT" not found\n", __func__, MAC_ARG(pparm->addr)); ret = H2C_REJECTED; goto exit; } pmlmeinfo->enc_algo = pparm->algorithm; - cam_id = rtw_camid_alloc(padapter, psta, 0, &used); + if (is_wep_enc(pparm->algorithm)) + kid = pparm->keyid; + cam_id = rtw_camid_alloc(padapter, psta, kid, &used); if (cam_id < 0) goto exit; - #ifdef DYNAMIC_CAMID_ALLOC /* cam entry searched is group key */ if (used == _TRUE && rtw_camid_is_gk(padapter, cam_id) == _TRUE) { s16 camid_clr; - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" pairwise key with "MAC_FMT" id:%u the same key id as group key\n" + RTW_PRINT(FUNC_ADPT_FMT" pairwise key with "MAC_FMT" id:%u the same key id as group key\n" , FUNC_ADPT_ARG(padapter), MAC_ARG(pparm->addr), pparm->keyid); /* HW has problem to distinguish this pairwise key with existing group key, stop HW enc and dec for BMC */ @@ -14387,22 +14117,21 @@ u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf) /* clear group key */ while ((camid_clr = rtw_camid_search(padapter, pparm->addr, -1, 1)) >= 0) { - DBG_871X_LEVEL(_drv_always_, "clear group key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(pparm->addr), camid_clr); + RTW_PRINT("clear group key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(pparm->addr), camid_clr); clear_cam_entry(padapter, camid_clr); rtw_camid_free(padapter, camid_clr); } } - #endif write_to_cam: - if(pparm->algorithm == _NO_PRIVACY_) { + if (pparm->algorithm == _NO_PRIVACY_) { while ((cam_id = rtw_camid_search(padapter, pparm->addr, -1, -1)) >= 0) { - DBG_871X_LEVEL(_drv_always_, "clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(pparm->addr), cam_id); + RTW_PRINT("clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(pparm->addr), cam_id); clear_cam_entry(padapter, cam_id); - rtw_camid_free(padapter,cam_id); + rtw_camid_free(padapter, cam_id); } } else { - DBG_871X_LEVEL(_drv_always_, "set pairwise key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n", + RTW_PRINT("set pairwise key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n", cam_id, MAC_ARG(pparm->addr), pparm->keyid, security_type_str(pparm->algorithm)); ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid; write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key); @@ -14415,55 +14144,92 @@ exit: u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf) { - struct addBaReq_parm *pparm = (struct addBaReq_parm *)pbuf; + struct addBaReq_parm *pparm = (struct addBaReq_parm *)pbuf; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, pparm->addr); - - if(!psta) - return H2C_SUCCESS; - + + if (!psta) + return H2C_SUCCESS; + #ifdef CONFIG_80211N_HT if (((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && (pmlmeinfo->HT_enable)) || - ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //pmlmeinfo->ADDBA_retry_count = 0; - //pmlmeinfo->candidate_tid_bitmap |= (0x1 << pparm->tid); - //psta->htpriv.candidate_tid_bitmap |= BIT(pparm->tid); + ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) { + /* pmlmeinfo->ADDBA_retry_count = 0; */ + /* pmlmeinfo->candidate_tid_bitmap |= (0x1 << pparm->tid); */ + /* psta->htpriv.candidate_tid_bitmap |= BIT(pparm->tid); */ issue_addba_req(padapter, pparm->addr, (u8)pparm->tid); - //_set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO); + /* _set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO); */ _set_timer(&psta->addba_retry_timer, ADDBA_TO); } #ifdef CONFIG_TDLS - else if((psta->tdls_sta_state & TDLS_LINKED_STATE)&& - (psta->htpriv.ht_option==_TRUE) && - (psta->htpriv.ampdu_enable==_TRUE) ) - { + else if ((psta->tdls_sta_state & TDLS_LINKED_STATE) && + (psta->htpriv.ht_option == _TRUE) && + (psta->htpriv.ampdu_enable == _TRUE)) { issue_addba_req(padapter, pparm->addr, (u8)pparm->tid); _set_timer(&psta->addba_retry_timer, ADDBA_TO); } -#endif //CONFIG +#endif /* CONFIG */ else - { - psta->htpriv.candidate_tid_bitmap &= ~BIT(pparm->tid); - } -#endif //CONFIG_80211N_HT - return H2C_SUCCESS; + psta->htpriv.candidate_tid_bitmap &= ~BIT(pparm->tid); +#endif /* CONFIG_80211N_HT */ + return H2C_SUCCESS; } -u8 chk_bmc_sleepq_cmd(_adapter* padapter) +u8 add_ba_rsp_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct addBaRsp_parm *pparm = (struct addBaRsp_parm *)pbuf; + u8 ret = _TRUE, i = 0, try_cnt = 3, wait_ms = 50; + struct recv_reorder_ctrl *preorder_ctrl; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta; + + psta = rtw_get_stainfo(pstapriv, pparm->addr); + if (!psta) + goto exit; + + preorder_ctrl = &psta->recvreorder_ctrl[pparm->tid]; + ret = issue_addba_rsp_wait_ack(padapter, pparm->addr, pparm->tid, pparm->status, pparm->size, 3, 50); + +#ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ + /* status = 0 means accept this addba req, so update indicate seq = start_seq under this compile flag */ + if (pparm->status == 0) { + preorder_ctrl->indicate_seq = pparm->start_seq; +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __func__, __LINE__, + preorder_ctrl->indicate_seq, pparm->start_seq); +#endif + } +#else + preorder_ctrl->indicate_seq = 0xffff; +#endif + + /* + * status = 0 means accept this addba req + * status = 37 means reject this addba req + */ + if (pparm->status == 0) { + preorder_ctrl->enable = _TRUE; + preorder_ctrl->ampdu_size = pparm->size; + } else if (pparm->status == 37) + preorder_ctrl->enable = _FALSE; + +exit: + return H2C_SUCCESS; +} + +u8 chk_bmc_sleepq_cmd(_adapter *padapter) { struct cmd_obj *ph2c; struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); u8 res = _SUCCESS; -_func_enter_; - if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - res= _FAIL; + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; } @@ -14473,53 +14239,50 @@ _func_enter_; exit: -_func_exit_; return res; } -u8 set_tx_beacon_cmd(_adapter* padapter) +u8 set_tx_beacon_cmd(_adapter *padapter) { struct cmd_obj *ph2c; - struct Tx_Beacon_param *ptxBeacon_parm; + struct Tx_Beacon_param *ptxBeacon_parm; struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 res = _SUCCESS; int len_diff = 0; - -_func_enter_; - if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - res= _FAIL; + + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; goto exit; } - if ((ptxBeacon_parm = (struct Tx_Beacon_param *)rtw_zmalloc(sizeof(struct Tx_Beacon_param))) == NULL) - { + ptxBeacon_parm = (struct Tx_Beacon_param *)rtw_zmalloc(sizeof(struct Tx_Beacon_param)); + if (ptxBeacon_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } _rtw_memcpy(&(ptxBeacon_parm->network), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX)); len_diff = update_hidden_ssid( - ptxBeacon_parm->network.IEs+_BEACON_IE_OFFSET_ - , ptxBeacon_parm->network.IELength-_BEACON_IE_OFFSET_ - , pmlmeinfo->hidden_ssid_mode - ); + ptxBeacon_parm->network.IEs + _BEACON_IE_OFFSET_ + , ptxBeacon_parm->network.IELength - _BEACON_IE_OFFSET_ + , pmlmeinfo->hidden_ssid_mode + ); ptxBeacon_parm->network.IELength += len_diff; init_h2fwcmd_w_parm_no_rsp(ph2c, ptxBeacon_parm, GEN_CMD_CODE(_TX_Beacon)); res = rtw_enqueue_cmd(pcmdpriv, ph2c); - + exit: - -_func_exit_; + return res; } @@ -14529,57 +14292,49 @@ u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf) { u8 evt_code, evt_seq; u16 evt_sz; - uint *peventbuf; + uint *peventbuf; void (*event_callback)(_adapter *dev, u8 *pbuf); struct evt_priv *pevt_priv = &(padapter->evtpriv); if (pbuf == NULL) goto _abort_event_; - peventbuf = (uint*)pbuf; - evt_sz = (u16)(*peventbuf&0xffff); - evt_seq = (u8)((*peventbuf>>24)&0x7f); - evt_code = (u8)((*peventbuf>>16)&0xff); - - - #ifdef CHECK_EVENT_SEQ - // checking event sequence... - if (evt_seq != (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f) ) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("Evetn Seq Error! %d vs %d\n", (evt_seq & 0x7f), (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f))); - - pevt_priv->event_seq = (evt_seq+1)&0x7f; + peventbuf = (uint *)pbuf; + evt_sz = (u16)(*peventbuf & 0xffff); + evt_seq = (u8)((*peventbuf >> 24) & 0x7f); + evt_code = (u8)((*peventbuf >> 16) & 0xff); + + +#ifdef CHECK_EVENT_SEQ + /* checking event sequence... */ + if (evt_seq != (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f)) { + + pevt_priv->event_seq = (evt_seq + 1) & 0x7f; goto _abort_event_; } - #endif +#endif - // checking if event code is valid - if (evt_code >= MAX_C2HEVT) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent Code(%d) mismatch!\n", evt_code)); + /* checking if event code is valid */ + if (evt_code >= MAX_C2HEVT) { goto _abort_event_; } - // checking if event size match the event parm size - if ((wlanevents[evt_code].parmsize != 0) && - (wlanevents[evt_code].parmsize != evt_sz)) - { - - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent(%d) Parm Size mismatch (%d vs %d)!\n", - evt_code, wlanevents[evt_code].parmsize, evt_sz)); - goto _abort_event_; - + /* checking if event size match the event parm size */ + if ((wlanevents[evt_code].parmsize != 0) && + (wlanevents[evt_code].parmsize != evt_sz)) { + + goto _abort_event_; + } ATOMIC_INC(&pevt_priv->event_seq); peventbuf += 2; - - if(peventbuf) - { + + if (peventbuf) { event_callback = wlanevents[evt_code].event_callback; - event_callback(padapter, (u8*)peventbuf); + event_callback(padapter, (u8 *)peventbuf); pevt_priv->evt_done_cnt++; } @@ -14589,12 +14344,12 @@ _abort_event_: return H2C_SUCCESS; - + } u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) { - if(!pbuf) + if (!pbuf) return H2C_PARAMETERS_ERROR; return H2C_SUCCESS; @@ -14606,28 +14361,26 @@ u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf) _irqL irqL; struct sta_info *psta_bmc; _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; + struct xmit_frame *pxmitframe = NULL; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct sta_priv *pstapriv = &padapter->stapriv; - //for BC/MC Frames + /* for BC/MC Frames */ psta_bmc = rtw_get_bcmc_stainfo(padapter); - if(!psta_bmc) + if (!psta_bmc) return H2C_SUCCESS; - if((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0)) - { + if ((pstapriv->tim_bitmap & BIT(0)) && (psta_bmc->sleepq_len > 0)) { #ifndef CONFIG_PCI_HCI - rtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows + rtw_msleep_os(10);/* 10ms, ATIM(HIQ) Windows */ #endif - //_enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + /* _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); */ _enter_critical_bh(&pxmitpriv->lock, &irqL); xmitframe_phead = get_list_head(&psta_bmc->sleep_q); xmitframe_plist = get_next(xmitframe_phead); - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { + 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); @@ -14635,28 +14388,26 @@ u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf) rtw_list_delete(&pxmitframe->list); psta_bmc->sleepq_len--; - if(psta_bmc->sleepq_len>0) + if (psta_bmc->sleepq_len > 0) pxmitframe->attrib.mdata = 1; else pxmitframe->attrib.mdata = 0; - pxmitframe->attrib.triggered=1; + pxmitframe->attrib.triggered = 1; if (xmitframe_hiq_filter(pxmitframe) == _TRUE) - pxmitframe->attrib.qsel = QSLT_HIGH;//HIQ + pxmitframe->attrib.qsel = QSLT_HIGH;/* HIQ */ - #if 0 +#if 0 _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); - if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE) - { + if (rtw_hal_xmit(padapter, pxmitframe) == _TRUE) rtw_os_xmit_complete(padapter, pxmitframe); - } _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); - #endif +#endif rtw_hal_xmitframe_enqueue(padapter, pxmitframe); } - //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + /* _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); */ _exit_critical_bh(&pxmitpriv->lock, &irqL); if (rtw_get_intf_type(padapter) != RTW_PCIE) { @@ -14671,18 +14422,21 @@ u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf) u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf) { - if(send_beacon(padapter)==_FAIL) - { - DBG_871X("issue_beacon, fail!\n"); + +#ifdef CONFIG_SWTIMER_BASED_TXBCN + + tx_beacon_handlder(padapter->dvobj); + +#else + + if (send_beacon(padapter) == _FAIL) { + RTW_INFO("issue_beacon, fail!\n"); return H2C_PARAMETERS_ERROR; } - - if (padapter->registrypriv.wifi_spec == 1) - return H2C_SUCCESS; - /* tx bc/mc frames after update TIM */ chk_bmc_sleepq_hdl(padapter, NULL); +#endif return H2C_SUCCESS; } @@ -14695,10 +14449,10 @@ u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf) */ void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 ch) { - u8 network_type,rate_len, total_rate_len,remainder_rate_len; + u8 network_type, rate_len, total_rate_len, remainder_rate_len; struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 erpinfo=0x4; + u8 erpinfo = 0x4; if (ch >= 36) { network_type = WIRELESS_11A; @@ -14706,7 +14460,7 @@ void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 ch) rtw_remove_bcn_ie(padapter, pnetwork, _ERPINFO_IE_); } else { network_type = WIRELESS_11BG; - total_rate_len = IEEE80211_CCK_RATE_LEN+IEEE80211_NUM_OFDM_RATESLEN; + total_rate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; rtw_add_bcn_ie(padapter, pnetwork, _ERPINFO_IE_, &erpinfo, 1); } @@ -14714,58 +14468,24 @@ void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 ch) UpdateBrateTbl(padapter, pnetwork->SupportedRates); - if(total_rate_len > 8) - { + if (total_rate_len > 8) { rate_len = 8; remainder_rate_len = total_rate_len - 8; - } - else - { + } else { rate_len = total_rate_len; remainder_rate_len = 0; } rtw_add_bcn_ie(padapter, pnetwork, _SUPPORTEDRATES_IE_, pnetwork->SupportedRates, rate_len); - if(remainder_rate_len) - { - rtw_add_bcn_ie(padapter, pnetwork, _EXT_SUPPORTEDRATES_IE_, (pnetwork->SupportedRates+8), remainder_rate_len); - } + if (remainder_rate_len) + rtw_add_bcn_ie(padapter, pnetwork, _EXT_SUPPORTEDRATES_IE_, (pnetwork->SupportedRates + 8), remainder_rate_len); else - { rtw_remove_bcn_ie(padapter, pnetwork, _EXT_SUPPORTEDRATES_IE_); - } pnetwork->Length = get_WLAN_BSSID_EX_sz(pnetwork); } -#ifdef CONFIG_CONCURRENT_MODE -sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state) -{ - PADAPTER pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext; - struct mlme_ext_info *pbuddy_mlmeinfo; - - if(padapter == NULL) - return _FALSE; - - pbuddy_adapter = padapter->pbuddy_adapter; - - if(pbuddy_adapter == NULL) - return _FALSE; - - - pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - pbuddy_mlmeinfo = &(pbuddy_mlmeext->mlmext_info); - - if((pbuddy_mlmeinfo->state&0x03) == state) - return _TRUE; - - return _FALSE; - -} -#endif /* CONFIG_CONCURRENT_MODE */ - void rtw_join_done_chk_ch(_adapter *adapter, int join_res) { #define DUMP_ADAPTERS_STATUS 0 @@ -14780,12 +14500,19 @@ void rtw_join_done_chk_ch(_adapter *adapter, int join_res) dvobj = adapter_to_dvobj(adapter); if (DUMP_ADAPTERS_STATUS) { - DBG_871X(FUNC_ADPT_FMT" enter\n", FUNC_ADPT_ARG(adapter)); + RTW_INFO(FUNC_ADPT_FMT" enter\n", FUNC_ADPT_ARG(adapter)); dump_adapters_status(RTW_DBGDUMP , dvobj); } if (join_res >= 0) { - if (rtw_get_ch_setting_union(adapter, &u_ch, &u_bw, &u_offset) <= 0) { + +#ifdef CONFIG_MCC_MODE + /* MCC setting success, don't go to ch union process */ + if (rtw_hal_set_mcc_setting_join_done_chk_ch(adapter)) + return; +#endif /* CONFIG_MCC_MODE */ + + if (rtw_mi_get_ch_setting_union(adapter, &u_ch, &u_bw, &u_offset) <= 0) { dump_adapters_status(RTW_DBGDUMP , dvobj); rtw_warn_on(1); } @@ -14799,8 +14526,8 @@ void rtw_join_done_chk_ch(_adapter *adapter, int join_res) continue; if (check_fwstate(mlme, WIFI_AP_STATE) - && check_fwstate(mlme, WIFI_ASOC_STATE) - ) { + && check_fwstate(mlme, WIFI_ASOC_STATE) + ) { bool is_grouped = rtw_is_chbw_grouped(u_ch, u_bw, u_offset , mlmeext->cur_channel, mlmeext->cur_bwmode, mlmeext->cur_ch_offset); @@ -14812,7 +14539,7 @@ void rtw_join_done_chk_ch(_adapter *adapter, int join_res) mlmeext->cur_channel = u_ch; rtw_adjust_chbw(iface , mlmeext->cur_channel, &mlmeext->cur_bwmode, &mlmeext->cur_ch_offset); - + rtw_sync_chbw(&mlmeext->cur_channel, &mlmeext->cur_bwmode, &mlmeext->cur_ch_offset , &u_ch, &u_bw, &u_offset); @@ -14830,9 +14557,9 @@ void rtw_join_done_chk_ch(_adapter *adapter, int join_res) clr_fwstate(mlme, WIFI_OP_CH_SWITCHING); } - #ifdef CONFIG_DFS_MASTER +#ifdef CONFIG_DFS_MASTER rtw_dfs_master_status_apply(adapter, MLME_STA_CONNECTED); - #endif +#endif } else { for (i = 0; i < dvobj->iface_nums; i++) { iface = dvobj->padapters[i]; @@ -14843,21 +14570,23 @@ void rtw_join_done_chk_ch(_adapter *adapter, int join_res) continue; if (check_fwstate(mlme, WIFI_AP_STATE) - && check_fwstate(mlme, WIFI_ASOC_STATE)) + && check_fwstate(mlme, WIFI_ASOC_STATE)) update_beacon(iface, 0, NULL, _TRUE); clr_fwstate(mlme, WIFI_OP_CH_SWITCHING); } - #ifdef CONFIG_DFS_MASTER +#ifdef CONFIG_DFS_MASTER rtw_dfs_master_status_apply(adapter, MLME_STA_DISCONNECTED); - #endif +#endif } - if (rtw_get_ch_setting_union(adapter, &u_ch, &u_bw, &u_offset)) + if (rtw_mi_get_ch_setting_union(adapter, &u_ch, &u_bw, &u_offset)) { set_channel_bwmode(adapter, u_ch, u_offset, u_bw); + rtw_mi_update_union_chan_inf(adapter, u_ch, u_offset, u_bw); + } if (DUMP_ADAPTERS_STATUS) { - DBG_871X(FUNC_ADPT_FMT" exit\n", FUNC_ADPT_ARG(adapter)); + RTW_INFO(FUNC_ADPT_FMT" exit\n", FUNC_ADPT_ARG(adapter)); dump_adapters_status(RTW_DBGDUMP , dvobj); } } @@ -14882,131 +14611,141 @@ int rtw_chk_start_clnt_join(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset) if (cur_ch == 0) { connect_allow = _FALSE; - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" cur_ch:%u\n" + RTW_ERR(FUNC_ADPT_FMT" cur_ch:%u\n" , FUNC_ADPT_ARG(adapter), cur_ch); rtw_warn_on(1); goto exit; } - DBG_871X(FUNC_ADPT_FMT" req: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); + RTW_INFO(FUNC_ADPT_FMT" req: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); #ifdef CONFIG_CONCURRENT_MODE -{ - struct dvobj_priv *dvobj; - _adapter *iface; - struct mlme_priv *mlme; - struct mlme_ext_priv *mlmeext; - u8 sta_num; - u8 ld_sta_num; - u8 lg_sta_num; - u8 ap_num; - u8 ld_ap_num; - int i; + { + struct dvobj_priv *dvobj; + _adapter *iface; + struct mlme_priv *mlme; + struct mlme_ext_priv *mlmeext; + u8 sta_num; + u8 ld_sta_num; + u8 lg_sta_num; + u8 ap_num; + u8 ld_ap_num; + int i; - dvobj = adapter_to_dvobj(adapter); + dvobj = adapter_to_dvobj(adapter); - rtw_dev_iface_status_no_self(adapter, &sta_num, &ld_sta_num, &lg_sta_num, &ap_num, &ld_ap_num); - DBG_871X(FUNC_ADPT_FMT" ld_sta_num:%u, ap_num:%u\n" - , FUNC_ADPT_ARG(adapter), ld_sta_num, ap_num); + rtw_mi_status_no_self(adapter, &sta_num, &ld_sta_num, &lg_sta_num, &ap_num, &ld_ap_num, NULL); + RTW_INFO(FUNC_ADPT_FMT" ld_sta_num:%u, ap_num:%u\n" + , FUNC_ADPT_ARG(adapter), ld_sta_num, ap_num); - if (!ld_sta_num && !ap_num) { - /* consider linking STA? */ - goto connect_allow_hdl; - } - - if (rtw_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset) <= 0) { - dump_adapters_status(RTW_DBGDUMP , dvobj); - rtw_warn_on(1); - } - DBG_871X(FUNC_ADPT_FMT" union no self: %u,%u,%u\n" - , FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); - - /* chbw_allow? */ - chbw_allow = rtw_is_chbw_grouped(pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset - , u_ch, u_bw, u_offset); - - DBG_871X(FUNC_ADPT_FMT" chbw_allow:%d\n" - , FUNC_ADPT_ARG(adapter), chbw_allow); - - if (chbw_allow == _TRUE) { - rtw_sync_chbw(&cur_ch, &cur_bw, &cur_ch_offset, &u_ch, &u_bw, &u_offset); - rtw_warn_on(cur_ch != pmlmeext->cur_channel); - rtw_warn_on(cur_bw != pmlmeext->cur_bwmode); - rtw_warn_on(cur_ch_offset != pmlmeext->cur_ch_offset); - goto connect_allow_hdl; - } - - /* chbw_allow is _FALSE, connect allow? */ - for (i = 0; i < dvobj->iface_nums; i++) { - iface = dvobj->padapters[i]; - mlme = &iface->mlmepriv; - mlmeext = &iface->mlmeextpriv; - - #ifdef CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT - if (check_fwstate(mlme, WIFI_STATION_STATE) - && check_fwstate(mlme, WIFI_ASOC_STATE) - #if defined(CONFIG_P2P) - && rtw_p2p_chk_state(&(iface->wdinfo), P2P_STATE_NONE) - #endif - ) { - connect_allow = _FALSE; - break; + if (!ld_sta_num && !ap_num) { + /* consider linking STA? */ + goto connect_allow_hdl; } - #endif /* CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT */ - } - DBG_871X(FUNC_ADPT_FMT" connect_allow:%d\n" - , FUNC_ADPT_ARG(adapter), connect_allow); - if (connect_allow == _FALSE) - goto exit; + if (rtw_mi_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset) <= 0) { + dump_adapters_status(RTW_DBGDUMP , dvobj); + rtw_warn_on(1); + } + RTW_INFO(FUNC_ADPT_FMT" union no self: %u,%u,%u\n" + , FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); -connect_allow_hdl: - /* connect_allow == _TRUE */ + /* chbw_allow? */ + chbw_allow = rtw_is_chbw_grouped(pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset + , u_ch, u_bw, u_offset); - #ifdef CONFIG_DFS_MASTER - rtw_dfs_master_status_apply(adapter, MLME_STA_CONNECTING); - #endif + RTW_INFO(FUNC_ADPT_FMT" chbw_allow:%d\n" + , FUNC_ADPT_ARG(adapter), chbw_allow); - if (chbw_allow == _FALSE) { - u_ch = cur_ch; - u_bw = cur_bw; - u_offset = cur_ch_offset; +#ifdef CONFIG_MCC_MODE + /* check setting success, don't go to ch union process */ + if (rtw_hal_set_mcc_setting_chk_start_clnt_join(adapter, &u_ch, &u_bw, &u_offset, chbw_allow)) + goto exit; +#endif + if (chbw_allow == _TRUE) { + rtw_sync_chbw(&cur_ch, &cur_bw, &cur_ch_offset, &u_ch, &u_bw, &u_offset); + rtw_warn_on(cur_ch != pmlmeext->cur_channel); + rtw_warn_on(cur_bw != pmlmeext->cur_bwmode); + rtw_warn_on(cur_ch_offset != pmlmeext->cur_ch_offset); + goto connect_allow_hdl; + } + +#ifdef CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT + /* chbw_allow is _FALSE, connect allow? */ for (i = 0; i < dvobj->iface_nums; i++) { iface = dvobj->padapters[i]; mlme = &iface->mlmepriv; mlmeext = &iface->mlmeextpriv; - if (!iface || iface == adapter) - continue; + if (check_fwstate(mlme, WIFI_STATION_STATE) + && check_fwstate(mlme, WIFI_ASOC_STATE) +#if defined(CONFIG_P2P) + && rtw_p2p_chk_state(&(iface->wdinfo), P2P_STATE_NONE) +#endif + ) { + connect_allow = _FALSE; + break; + } + } +#endif /* CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT */ - if (check_fwstate(mlme, WIFI_AP_STATE) - && check_fwstate(mlme, WIFI_ASOC_STATE) - ) { - #ifdef CONFIG_SPCT_CH_SWITCH - if (1) - rtw_ap_inform_ch_switch(iface, pmlmeext->cur_channel , pmlmeext->cur_ch_offset); - else - #endif - rtw_sta_flush(iface, _FALSE); + if ((ld_sta_num + ld_ap_num) >= 2) + connect_allow = _FALSE; - rtw_hal_set_hwreg(iface, HW_VAR_CHECK_TXBUF, 0); - set_fwstate(mlme, WIFI_OP_CH_SWITCHING); - } else if (check_fwstate(mlme, WIFI_STATION_STATE) - && check_fwstate(mlme, WIFI_ASOC_STATE) - ) { - rtw_disassoc_cmd(iface, 500, _FALSE); - rtw_indicate_disconnect(iface); - rtw_free_assoc_resources(iface, 1); + RTW_INFO(FUNC_ADPT_FMT" connect_allow:%d\n" + , FUNC_ADPT_ARG(adapter), connect_allow); + + if (connect_allow == _FALSE) + goto exit; + +connect_allow_hdl: + /* connect_allow == _TRUE */ + +#ifdef CONFIG_DFS_MASTER + rtw_dfs_master_status_apply(adapter, MLME_STA_CONNECTING); +#endif + + if (chbw_allow == _FALSE) { + u_ch = cur_ch; + u_bw = cur_bw; + u_offset = cur_ch_offset; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + mlme = &iface->mlmepriv; + mlmeext = &iface->mlmeextpriv; + + if (!iface || iface == adapter) + continue; + + if (check_fwstate(mlme, WIFI_AP_STATE) + && check_fwstate(mlme, WIFI_ASOC_STATE) + ) { +#ifdef CONFIG_SPCT_CH_SWITCH + if (1) + rtw_ap_inform_ch_switch(iface, pmlmeext->cur_channel , pmlmeext->cur_ch_offset); + else +#endif + rtw_sta_flush(iface, _FALSE); + + rtw_hal_set_hwreg(iface, HW_VAR_CHECK_TXBUF, 0); + set_fwstate(mlme, WIFI_OP_CH_SWITCHING); + } else if (check_fwstate(mlme, WIFI_STATION_STATE) + && check_fwstate(mlme, WIFI_ASOC_STATE) + ) { + rtw_disassoc_cmd(iface, 500, _FALSE); + rtw_indicate_disconnect(iface, 0, _FALSE); + rtw_free_assoc_resources(iface, 1); + } } } } -} #endif /* CONFIG_CONCURRENT_MODE */ exit: if (connect_allow == _TRUE) { - DBG_871X(FUNC_ADPT_FMT" union: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); + RTW_INFO(FUNC_ADPT_FMT" union: %u,%u,%u\n", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset); *ch = u_ch; *bw = u_bw; *offset = u_offset; @@ -15015,151 +14754,6 @@ exit: return connect_allow == _TRUE ? _SUCCESS : _FAIL; } -/* Find union about ch, bw, ch_offset of all linked/linking interfaces */ -int _rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset, bool include_self) -{ - struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); - _adapter *iface; - struct mlme_ext_priv *mlmeext; - int i; - u8 ch_ret = 0; - u8 bw_ret = CHANNEL_WIDTH_20; - u8 offset_ret = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - int num = 0; - - if (ch) *ch = 0; - if (bw) *bw = CHANNEL_WIDTH_20; - if (offset) *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - for (i = 0; iiface_nums; i++) { - iface = dvobj->padapters[i]; - mlmeext = &iface->mlmeextpriv; - - if (!check_fwstate(&iface->mlmepriv, _FW_LINKED|_FW_UNDER_LINKING)) - continue; - - if (check_fwstate(&iface->mlmepriv, WIFI_OP_CH_SWITCHING)) - continue; - - if (include_self == _FALSE && adapter == iface) - continue; - - if (num == 0) { - ch_ret = mlmeext->cur_channel; - bw_ret = mlmeext->cur_bwmode; - offset_ret = mlmeext->cur_ch_offset; - num++; - continue; - } - - if (ch_ret != mlmeext->cur_channel) { - num = 0; - break; - } - - if (bw_ret < mlmeext->cur_bwmode) { - bw_ret = mlmeext->cur_bwmode; - offset_ret = mlmeext->cur_ch_offset; - } else if (bw_ret == mlmeext->cur_bwmode && offset_ret != mlmeext->cur_ch_offset) { - num = 0; - break; - } - - num++; - } - - if (num) { - if (ch) *ch = ch_ret; - if (bw) *bw = bw_ret; - if (offset) *offset = offset_ret; - } - - return num; -} - -inline int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset) -{ - return _rtw_get_ch_setting_union(adapter, ch, bw, offset, 1); -} - -inline int rtw_get_ch_setting_union_no_self(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset) -{ - return _rtw_get_ch_setting_union(adapter, ch, bw, offset, 0); -} - -void _rtw_dev_iface_status(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num - , u8 *ap_num, u8 *ld_ap_num, bool include_self) -{ - struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); - _adapter *iface; - struct mlme_ext_priv *mlmeext; - struct mlme_ext_info *mlmeextinfo; - int i; - u8 sta_num_ret = 0; - u8 ld_sta_num_ret = 0; - u8 lg_sta_num_ret = 0; - u8 ap_num_ret = 0; - u8 ld_ap_num_ret = 0; - - if (sta_num) - *sta_num = 0; - if (ld_sta_num) - *ld_sta_num = 0; - if (lg_sta_num) - *lg_sta_num = 0; - if (ap_num) - *ap_num = 0; - if (ld_ap_num) - *ld_ap_num = 0; - - for (i = 0; i < dvobj->iface_nums; i++) { - iface = dvobj->padapters[i]; - - if (include_self == _FALSE && iface == adapter) - continue; - - mlmeext = &iface->mlmeextpriv; - - if (mlmeext_msr(mlmeext) == WIFI_FW_STATION_STATE) { - sta_num_ret++; - if (check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE) - ld_sta_num_ret++; - if (check_fwstate(&iface->mlmepriv, _FW_UNDER_LINKING) == _TRUE) - lg_sta_num_ret++; - } - - if (mlmeext_msr(mlmeext) == WIFI_FW_AP_STATE - && check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE - ) { - ap_num_ret++; - if (iface->stapriv.asoc_sta_count > 2) - ld_ap_num_ret++; - } - } - - if (sta_num) - *sta_num = sta_num_ret; - if (ld_sta_num) - *ld_sta_num = ld_sta_num_ret; - if (lg_sta_num) - *lg_sta_num = lg_sta_num_ret; - if (ap_num) - *ap_num = ap_num_ret; - if (ld_ap_num) - *ld_ap_num = ld_ap_num_ret; -} - -inline void rtw_dev_iface_status(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num - , u8 *ap_num, u8 *ld_ap_num) -{ - return _rtw_dev_iface_status(adapter, sta_num, ld_sta_num, lg_sta_num, ap_num, ld_ap_num, 1); -} - -inline void rtw_dev_iface_status_no_self(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num - , u8 *ap_num, u8 *ld_ap_num) -{ - return _rtw_dev_iface_status(adapter, sta_num, ld_sta_num, lg_sta_num, ap_num, ld_ap_num, 0); -} u8 set_ch_hdl(_adapter *padapter, u8 *pbuf) { @@ -15167,14 +14761,14 @@ u8 set_ch_hdl(_adapter *padapter, u8 *pbuf) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - if(!pbuf) + if (!pbuf) return H2C_PARAMETERS_ERROR; set_ch_parm = (struct set_ch_parm *)pbuf; - DBG_871X(FUNC_NDEV_FMT" ch:%u, bw:%u, ch_offset:%u\n", - FUNC_NDEV_ARG(padapter->pnetdev), - set_ch_parm->ch, set_ch_parm->bw, set_ch_parm->ch_offset); + RTW_INFO(FUNC_NDEV_FMT" ch:%u, bw:%u, ch_offset:%u\n", + FUNC_NDEV_ARG(padapter->pnetdev), + set_ch_parm->ch, set_ch_parm->bw, set_ch_parm->ch_offset); pmlmeext->cur_channel = set_ch_parm->ch; pmlmeext->cur_ch_offset = set_ch_parm->ch_offset; @@ -15182,7 +14776,7 @@ u8 set_ch_hdl(_adapter *padapter, u8 *pbuf) set_channel_bwmode(padapter, set_ch_parm->ch, set_ch_parm->ch_offset, set_ch_parm->bw); - return H2C_SUCCESS; + return H2C_SUCCESS; } u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf) @@ -15191,43 +14785,43 @@ u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf) struct mlme_priv *mlme = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - if(!pbuf) + if (!pbuf) return H2C_PARAMETERS_ERROR; setChannelPlan_param = (struct SetChannelPlan_param *)pbuf; - if(!rtw_is_channel_plan_valid(setChannelPlan_param->channel_plan)) { + if (!rtw_is_channel_plan_valid(setChannelPlan_param->channel_plan)) return H2C_PARAMETERS_ERROR; - } + mlme->country_ent = setChannelPlan_param->country_ent; mlme->ChannelPlan = setChannelPlan_param->channel_plan; pmlmeext->max_chan_nums = init_channel_set(padapter, setChannelPlan_param->channel_plan, pmlmeext->channel_set); - init_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list); + init_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list); + + rtw_hal_set_odm_var(padapter, HAL_ODM_REGULATION, NULL, _TRUE); - rtw_hal_set_odm_var(padapter,HAL_ODM_REGULATION,NULL,_TRUE); - #ifdef CONFIG_IOCTL_CFG80211 rtw_reg_notify_by_driver(padapter); -#endif //CONFIG_IOCTL_CFG80211 +#endif /* CONFIG_IOCTL_CFG80211 */ - return H2C_SUCCESS; + return H2C_SUCCESS; } u8 led_blink_hdl(_adapter *padapter, unsigned char *pbuf) { struct LedBlink_param *ledBlink_param; - if(!pbuf) + if (!pbuf) return H2C_PARAMETERS_ERROR; ledBlink_param = (struct LedBlink_param *)pbuf; - #ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD +#ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD BlinkHandler((PLED_DATA)ledBlink_param->pLed); - #endif +#endif - return H2C_SUCCESS; + return H2C_SUCCESS; } u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf) @@ -15237,7 +14831,7 @@ u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf) u8 new_ch_no; u8 gval8 = 0x00, sval8 = 0xff; - if(!pbuf) + if (!pbuf) return H2C_PARAMETERS_ERROR; setChannelSwitch_param = (struct SetChannelSwitch_param *)pbuf; @@ -15247,24 +14841,23 @@ u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf) rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &sval8); - DBG_871X("DFS detected! Swiching channel to %d!\n", new_ch_no); - SelectChannel(padapter, new_ch_no); + RTW_INFO("DFS detected! Swiching channel to %d!\n", new_ch_no); + set_channel_bwmode(padapter, new_ch_no, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &gval8); rtw_disassoc_cmd(padapter, 0, _FALSE); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); rtw_free_network_queue(padapter, _TRUE); - if ( ((new_ch_no >= 52) && (new_ch_no <= 64)) ||((new_ch_no >= 100) && (new_ch_no <= 140)) ) { - DBG_871X("Switched to DFS band (ch %02x) again!!\n", new_ch_no); - } + if (((new_ch_no >= 52) && (new_ch_no <= 64)) || ((new_ch_no >= 100) && (new_ch_no <= 140))) + RTW_INFO("Switched to DFS band (ch %02x) again!!\n", new_ch_no); - return H2C_SUCCESS; + return H2C_SUCCESS; #else return H2C_REJECTED; -#endif //CONFIG_DFS +#endif /* CONFIG_DFS */ } @@ -15272,8 +14865,9 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) { #ifdef CONFIG_TDLS _irqL irqL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; -#ifdef CONFIG_TDLS_CH_SW +#ifdef CONFIG_TDLS_CH_SW struct tdls_ch_switch *pchsw_info = &ptdlsinfo->chsw_info; #endif struct TDLSoption_param *TDLSoption; @@ -15284,6 +14878,8 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) struct tdls_txmgmt txmgmt; u32 setchtime, resp_sleep = 0, wait_time; u8 zaddr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + u8 ret; + u8 doiqk; if (!pbuf) return H2C_PARAMETERS_ERROR; @@ -15292,32 +14888,29 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) option = TDLSoption->option; if (!_rtw_memcmp(TDLSoption->addr, zaddr, ETH_ALEN)) { - ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), TDLSoption->addr ); - if (ptdls_sta == NULL) { + 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)) + if (!(option == TDLS_RS_RCR)) return H2C_REJECTED; } - //_enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); - //DBG_871X("[%s] option:%d\n", __FUNCTION__, option); - + /* _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); */ + /* RTW_INFO("[%s] option:%d\n", __FUNCTION__, option); */ + switch (option) { - case TDLS_ESTABLISHED: - { + 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); + /* 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)); + RTW_INFO("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); @@ -15329,11 +14922,11 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) sta_band |= WIRELESS_11A; /* 5G band */ - #ifdef CONFIG_80211AC_VHT +#ifdef CONFIG_80211AC_VHT if (ptdls_sta->vhtpriv.vht_option) sta_band = WIRELESS_11_5AC; - #endif - +#endif + } else { if (ptdls_sta->ra_mask & 0xffff000) sta_band |= WIRELESS_11_24N; @@ -15345,11 +14938,11 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) sta_band |= WIRELESS_11B; } ptdls_sta->wireless_mode = sta_band; - ptdls_sta->raid = rtw_hal_networktype_to_raid(padapter,ptdls_sta); + 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); + rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, ptdls_sta, _TRUE); break; } case TDLS_ISSUE_PTI: @@ -15357,85 +14950,139 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) issue_tdls_peer_traffic_indication(padapter, ptdls_sta); _set_timer(&ptdls_sta->pti_timer, TDLS_PTI_TIME); break; -#ifdef CONFIG_TDLS_CH_SW +#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); + issue_nulldata(padapter, NULL, 1, 3, 3); - DBG_871X("issue tdls channel switch response\n"); - issue_tdls_ch_switch_rsp(padapter, &txmgmt, _FALSE); - resp_sleep = 5; - rtw_msleep_os(resp_sleep); + RTW_INFO("[TDLS ] issue tdls channel switch response\n"); + ret = issue_tdls_ch_switch_rsp(padapter, &txmgmt, _TRUE); /* 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*/ + /* then we just switch 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); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END_TO_BASE_CHNL); break; } - _set_timer(&ptdls_sta->delay_timer, pmlmeinfo->bcn_interval - 40); - - /* Continue following actions */ - - 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); - - 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); - 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; + if (ret == _SUCCESS) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_OFF_CHNL); 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); + RTW_INFO("[TDLS] issue_tdls_ch_switch_rsp wait ack fail !!!!!!!!!!\n"); break; - case TDLS_CH_SW_BACK: + case TDLS_CH_SW_PREPARE: + pchsw_info->ch_sw_state |= TDLS_CH_SWITCH_PREPARE_STATE; + + /* to collect IQK info of off-chnl */ + doiqk = _TRUE; + rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, &doiqk); + set_channel_bwmode(padapter, pchsw_info->off_ch_num, pchsw_info->ch_offset, (pchsw_info->ch_offset) ? CHANNEL_WIDTH_40 : CHANNEL_WIDTH_20); + doiqk = _FALSE; + rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, &doiqk); + + /* switch back to base-chnl */ + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_START); + + pchsw_info->ch_sw_state &= ~(TDLS_CH_SWITCH_PREPARE_STATE); + + break; + case TDLS_CH_SW_START: + rtw_tdls_set_ch_sw_oper_control(padapter, _TRUE); + break; + case TDLS_CH_SW_TO_OFF_CHNL: + issue_nulldata(padapter, NULL, 1, 3, 3); + + if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)) + _set_timer(&ptdls_sta->ch_sw_timer, (u32)(ptdls_sta->ch_switch_timeout) / 1000); + + if (rtw_tdls_do_ch_sw(padapter, ptdls_sta, TDLS_CH_SW_OFF_CHNL, pchsw_info->off_ch_num, + pchsw_info->ch_offset, (pchsw_info->ch_offset) ? CHANNEL_WIDTH_40 : CHANNEL_WIDTH_20, ptdls_sta->ch_switch_time) == _SUCCESS) { + pchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE); + if (pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) { + if (issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 1, 3) == _FAIL) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_BASE_CHNL); + } + } else { + u8 bcancelled; + + if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)) + _cancel_timer(&ptdls_sta->ch_sw_timer, &bcancelled); + } + + + break; + case TDLS_CH_SW_END: + case TDLS_CH_SW_END_TO_BASE_CHNL: + rtw_tdls_set_ch_sw_oper_control(padapter, _FALSE); + _cancel_timer_ex(&ptdls_sta->ch_sw_timer); + _cancel_timer_ex(&ptdls_sta->stay_on_base_chnl_timer); + _cancel_timer_ex(&ptdls_sta->ch_sw_monitor_timer); +#if 0 + _rtw_memset(pHalData->tdls_ch_sw_iqk_info_base_chnl, 0x00, sizeof(pHalData->tdls_ch_sw_iqk_info_base_chnl)); + _rtw_memset(pHalData->tdls_ch_sw_iqk_info_off_chnl, 0x00, sizeof(pHalData->tdls_ch_sw_iqk_info_off_chnl)); +#endif + + if (option == TDLS_CH_SW_END_TO_BASE_CHNL) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_BASE_CHNL); + + break; + case TDLS_CH_SW_TO_BASE_CHNL_UNSOLICITED: + case TDLS_CH_SW_TO_BASE_CHNL: 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); + + if (option == TDLS_CH_SW_TO_BASE_CHNL_UNSOLICITED) { + if (ptdls_sta != NULL) { + /* Send unsolicited channel switch rsp. to peer */ + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + txmgmt.status_code = 0; + _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN); + issue_tdls_ch_switch_rsp(padapter, &txmgmt, _FALSE); + } + } + + if (rtw_tdls_do_ch_sw(padapter, ptdls_sta, TDLS_CH_SW_BASE_CHNL, pmlmeext->cur_channel, + pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode, ptdls_sta->ch_switch_time) == _SUCCESS) { + issue_nulldata(padapter, NULL, 0, 3, 3); + /* set ch sw monitor timer for responder */ + if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)) + _set_timer(&ptdls_sta->ch_sw_monitor_timer, TDLS_CH_SW_MONITOR_TIMEOUT); + } + break; -#endif +#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"); + RTW_INFO("[TDLS] write REG_RCR, set bit6 on\n"); break; - case TDLS_TEAR_STA: -#ifdef CONFIG_TDLS_CH_SW + case TDLS_TEARDOWN_STA: + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + txmgmt.status_code = 0; + _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN); + + issue_tdls_teardown(padapter, &txmgmt, _TRUE); + break; + case TDLS_TEARDOWN_STA_LOCALLY: +#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); + TDLS_CH_SWITCH_ON_STATE | + TDLS_PEER_AT_OFF_STATE); + rtw_tdls_set_ch_sw_oper_control(padapter, _FALSE); _rtw_memset(pchsw_info->addr, 0x00, ETH_ALEN); } -#endif +#endif rtw_sta_media_status_rpt(padapter, ptdls_sta, 0); free_tdls_sta(padapter, ptdls_sta); - break; + break; } - //_exit_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); + /* _exit_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); */ return H2C_SUCCESS; #else @@ -15451,7 +15098,7 @@ u8 run_in_thread_hdl(_adapter *padapter, u8 *pbuf) if (NULL == pbuf) return H2C_PARAMETERS_ERROR; - p = (struct RunInThread_param*)pbuf; + p = (struct RunInThread_param *)pbuf; if (p->func) p->func(p->context); @@ -15486,11 +15133,10 @@ u8 rtw_getmacreg_hdl(_adapter *padapter, u8 *pbuf) value = rtw_read32(padapter, addr); break; default: - DBG_871X("%s: Unknown size\n", __func__); + RTW_INFO("%s: Unknown size\n", __func__); break; } - DBG_871X("%s: addr:0x%02x valeu:0x%02x\n", __func__, addr, value); + RTW_INFO("%s: addr:0x%02x valeu:0x%02x\n", __func__, addr, value); return H2C_SUCCESS; } - diff --git a/core/rtw_mp.c b/core/rtw_mp.c old mode 100755 new mode 100644 index 557466d..ecd48a3 --- a/core/rtw_mp.c +++ b/core/rtw_mp.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. @@ -18,60 +18,69 @@ * ******************************************************************************/ #define _RTW_MP_C_ - #include - #ifdef PLATFORM_FREEBSD -#include /* for RFHIGHPID */ + #include /* for RFHIGHPID */ #endif -#include "../hal/phydm/phydm_precomp.h" +#include "../hal/phydm/phydm_precomp.h" #if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) -#include + #include #endif +#ifdef CONFIG_MP_VHT_HW_TX_MODE +#define CEILING_POS(X) ((X - (int)(X)) > 0 ? (int)(X + 1) : (int)(X)) +#define CEILING_NEG(X) ((X - (int)(X)) < 0 ? (int)(X - 1) : (int)(X)) +#define ceil(X) (((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X)) + +int rtfloor(float x) +{ + int i = x - 2; + while + (++i <= x - 1) + ; + return i; +} +#endif #ifdef CONFIG_MP_INCLUDED - u32 read_macreg(_adapter *padapter, u32 addr, u32 sz) { u32 val = 0; - switch(sz) - { - case 1: - val = rtw_read8(padapter, addr); - break; - case 2: - val = rtw_read16(padapter, addr); - break; - case 4: - val = rtw_read32(padapter, addr); - break; - default: - val = 0xffffffff; - break; + switch (sz) { + case 1: + val = rtw_read8(padapter, addr); + break; + case 2: + val = rtw_read16(padapter, addr); + break; + case 4: + val = rtw_read32(padapter, addr); + break; + default: + val = 0xffffffff; + break; } return val; - + } void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz) { - switch(sz) - { - case 1: - rtw_write8(padapter, addr, (u8)val); - break; - case 2: - rtw_write16(padapter, addr, (u16)val); - break; - case 4: - rtw_write32(padapter, addr, val); - break; - default: - break; + switch (sz) { + case 1: + rtw_write8(padapter, addr, (u8)val); + break; + case 2: + rtw_write16(padapter, addr, (u16)val); + break; + case 4: + rtw_write32(padapter, addr, val); + break; + default: + break; } } @@ -117,7 +126,7 @@ static void _init_mp_priv_(struct mp_priv *pmp_priv) pmp_priv->channel = 1; pmp_priv->bandwidth = CHANNEL_WIDTH_20; pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - pmp_priv->rateidx = MPT_RATE_1M; + pmp_priv->rateidx = RATE_1M; pmp_priv->txpoweridx = 0x2A; pmp_priv->antenna_tx = ANTENNA_A; @@ -127,7 +136,7 @@ static void _init_mp_priv_(struct mp_priv *pmp_priv) pmp_priv->tx_pktcount = 0; - pmp_priv->rx_bssidpktcount=0; + pmp_priv->rx_bssidpktcount = 0; pmp_priv->rx_pktcount = 0; pmp_priv->rx_crcerrpktcount = 0; @@ -140,6 +149,7 @@ static void _init_mp_priv_(struct mp_priv *pmp_priv) pmp_priv->bSetRxBssid = _FALSE; pmp_priv->bRTWSmbCfg = _FALSE; + pmp_priv->bloopback = _FALSE; pnetwork = &pmp_priv->mp_network.network; _rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN); @@ -155,51 +165,46 @@ static void _init_mp_priv_(struct mp_priv *pmp_priv) } #ifdef PLATFORM_WINDOWS -/* +#if 0 void mp_wi_callback( - IN NDIS_WORK_ITEM* pwk_item, + IN NDIS_WORK_ITEM *pwk_item, IN PVOID cntx - ) +) { - _adapter* padapter =(_adapter *)cntx; - struct mp_priv *pmppriv=&padapter->mppriv; - struct mp_wi_cntx *pmp_wi_cntx=&pmppriv->wi_cntx; + _adapter *padapter = (_adapter *)cntx; + struct mp_priv *pmppriv = &padapter->mppriv; + struct mp_wi_cntx *pmp_wi_cntx = &pmppriv->wi_cntx; - // Execute specified action. - if(pmp_wi_cntx->curractfunc != NULL) - { + /* Execute specified action. */ + if (pmp_wi_cntx->curractfunc != NULL) { LARGE_INTEGER cur_time; ULONGLONG start_time, end_time; - NdisGetCurrentSystemTime(&cur_time); // driver version - start_time = cur_time.QuadPart/10; // The return value is in microsecond + NdisGetCurrentSystemTime(&cur_time); /* driver version */ + start_time = cur_time.QuadPart / 10; /* The return value is in microsecond */ pmp_wi_cntx->curractfunc(padapter); - NdisGetCurrentSystemTime(&cur_time); // driver version - end_time = cur_time.QuadPart/10; // The return value is in microsecond + NdisGetCurrentSystemTime(&cur_time); /* driver version */ + end_time = cur_time.QuadPart / 10; /* The return value is in microsecond */ - RT_TRACE(_module_mp_, _drv_info_, - ("WorkItemActType: %d, time spent: %I64d us\n", - pmp_wi_cntx->param.act_type, (end_time-start_time))); } NdisAcquireSpinLock(&(pmp_wi_cntx->mp_wi_lock)); - pmp_wi_cntx->bmp_wi_progress= _FALSE; + pmp_wi_cntx->bmp_wi_progress = _FALSE; NdisReleaseSpinLock(&(pmp_wi_cntx->mp_wi_lock)); if (pmp_wi_cntx->bmpdrv_unload) - { NdisSetEvent(&(pmp_wi_cntx->mp_wi_evt)); - } } -*/ +#endif static int init_mp_priv_by_os(struct mp_priv *pmp_priv) { struct mp_wi_cntx *pmp_wi_cntx; - if (pmp_priv == NULL) return _FAIL; + if (pmp_priv == NULL) + return _FAIL; pmp_priv->rx_testcnt = 0; pmp_priv->rx_testcnt1 = 0; @@ -209,7 +214,7 @@ static int init_mp_priv_by_os(struct mp_priv *pmp_priv) pmp_priv->tx_testcnt1 = 0; pmp_wi_cntx = &pmp_priv->wi_cntx - pmp_wi_cntx->bmpdrv_unload = _FALSE; + pmp_wi_cntx->bmpdrv_unload = _FALSE; pmp_wi_cntx->bmp_wi_progress = _FALSE; pmp_wi_cntx->curractfunc = NULL; @@ -223,7 +228,8 @@ static int init_mp_priv_by_os(struct mp_priv *pmp_priv) int i, res; struct mp_xmit_frame *pmp_xmitframe; - if (pmp_priv == NULL) return _FAIL; + if (pmp_priv == NULL) + return _FAIL; _rtw_init_queue(&pmp_priv->free_mp_xmitqueue); @@ -234,12 +240,11 @@ static int init_mp_priv_by_os(struct mp_priv *pmp_priv) goto _exit_init_mp_priv; } - pmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf + 4 - ((SIZE_PTR) (pmp_priv->pallocated_mp_xmitframe_buf) & 3); + pmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf + 4 - ((SIZE_PTR)(pmp_priv->pallocated_mp_xmitframe_buf) & 3); - pmp_xmitframe = (struct mp_xmit_frame*)pmp_priv->pmp_xmtframe_buf; + pmp_xmitframe = (struct mp_xmit_frame *)pmp_priv->pmp_xmtframe_buf; - for (i = 0; i < NR_MP_XMITFRAME; i++) - { + for (i = 0; i < NR_MP_XMITFRAME; i++) { _rtw_init_listhead(&pmp_xmitframe->list); rtw_list_insert_tail(&pmp_xmitframe->list, &pmp_priv->free_mp_xmitqueue.queue); @@ -266,44 +271,44 @@ static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter) struct pkt_attrib *pattrib; - // init xmitframe attribute + /* init xmitframe attribute */ pattrib = &pmptx->attrib; _rtw_memset(pattrib, 0, sizeof(struct pkt_attrib)); _rtw_memset(pmptx->desc, 0, TXDESC_SIZE); pattrib->ether_type = 0x8712; - #if 0 +#if 0 _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - #endif +#endif _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN); -// pattrib->dhcp_pkt = 0; -// pattrib->pktlen = 0; + /* pattrib->dhcp_pkt = 0; + * pattrib->pktlen = 0; */ pattrib->ack_policy = 0; -// pattrib->pkt_hdrlen = ETH_HLEN; + /* pattrib->pkt_hdrlen = ETH_HLEN; */ pattrib->hdrlen = WLAN_HDR_A3_LEN; pattrib->subtype = WIFI_DATA; pattrib->priority = 0; pattrib->qsel = pattrib->priority; -// do_queue_select(padapter, pattrib); + /* do_queue_select(padapter, pattrib); */ pattrib->nr_frags = 1; 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 + 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) @@ -312,41 +317,42 @@ s32 init_mp_priv(PADAPTER padapter) PHAL_DATA_TYPE pHalData; pHalData = GET_HAL_DATA(padapter); - + _init_mp_priv_(pmppriv); pmppriv->papdater = padapter; - pmppriv->mp_dm =0; + pmppriv->mp_dm = 0; pmppriv->tx.stop = 1; - pmppriv->bSetTxPower=0; //for manually set tx power - pmppriv->bTxBufCkFail=_FALSE; - pmppriv->pktInterval=0; - + pmppriv->bSetTxPower = 0; /*for manually set tx power*/ + pmppriv->bTxBufCkFail = _FALSE; + pmppriv->pktInterval = 0; + pmppriv->pktLength = 1000; + mp_init_xmit_attrib(&pmppriv->tx, padapter); switch (padapter->registrypriv.rf_config) { - case RF_1T1R: - pmppriv->antenna_tx = ANTENNA_A; - pmppriv->antenna_rx = ANTENNA_A; - break; - case RF_1T2R: - default: - pmppriv->antenna_tx = ANTENNA_A; - pmppriv->antenna_rx = ANTENNA_AB; - break; - case RF_2T2R: - case RF_2T2R_GREEN: - pmppriv->antenna_tx = ANTENNA_AB; - pmppriv->antenna_rx = ANTENNA_AB; - break; - case RF_2T4R: - pmppriv->antenna_tx = ANTENNA_BC; - pmppriv->antenna_rx = ANTENNA_ABCD; - break; + case RF_1T1R: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_A; + break; + case RF_1T2R: + default: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T2R: + case RF_2T2R_GREEN: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T4R: + pmppriv->antenna_tx = ANTENNA_BC; + pmppriv->antenna_rx = ANTENNA_ABCD; + break; } - + pHalData->AntennaRxPath = pmppriv->antenna_rx; pHalData->AntennaTxPath = pmppriv->antenna_tx; - + return _SUCCESS; } @@ -362,166 +368,238 @@ void free_mp_priv(struct mp_priv *pmp_priv) static VOID PHY_IQCalibrate_default( IN PADAPTER pAdapter, - IN BOOLEAN bReCovery - ) -{ - DBG_871X("%s\n", __func__); + IN BOOLEAN bReCovery +) +{ + RTW_INFO("%s\n", __func__); } static VOID PHY_LCCalibrate_default( IN PADAPTER pAdapter - ) +) { - DBG_871X("%s\n", __func__); + RTW_INFO("%s\n", __func__); } static VOID PHY_SetRFPathSwitch_default( IN PADAPTER pAdapter, IN BOOLEAN bMain - ) +) { - DBG_871X("%s\n", __func__); + RTW_INFO("%s\n", __func__); } void mpt_InitHWConfig(PADAPTER 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. + /* 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. */ - PHY_SetMacReg(Adapter, 0x64, BIT20, 0x0); //0x66[4]=0 - PHY_SetMacReg(Adapter, 0x64, BIT24, 0x0); //0x66[8]=0 - PHY_SetMacReg(Adapter, 0x40, BIT4, 0x0); //0x40[4]=0 - PHY_SetMacReg(Adapter, 0x40, BIT3, 0x1); //0x40[3]=1 - PHY_SetMacReg(Adapter, 0x4C, BIT24, 0x1); //0x4C[24:23]=10 - PHY_SetMacReg(Adapter, 0x4C, BIT23, 0x0); //0x4C[24:23]=10 - PHY_SetBBReg(Adapter, 0x944, BIT1|BIT0, 0x3); //0x944[1:0]=11 - PHY_SetBBReg(Adapter, 0x930, bMaskByte0, 0x77); //0x930[7:0]=77 - PHY_SetMacReg(Adapter, 0x38, BIT11, 0x1); //0x38[11]=1 + PHY_SetMacReg(Adapter, 0x64, BIT20, 0x0); /* 0x66[4]=0 */ + PHY_SetMacReg(Adapter, 0x64, BIT24, 0x0); /* 0x66[8]=0 */ + PHY_SetMacReg(Adapter, 0x40, BIT4, 0x0); /* 0x40[4]=0 */ + PHY_SetMacReg(Adapter, 0x40, BIT3, 0x1); /* 0x40[3]=1 */ + PHY_SetMacReg(Adapter, 0x4C, BIT24, 0x1); /* 0x4C[24:23]=10 */ + PHY_SetMacReg(Adapter, 0x4C, BIT23, 0x0); /* 0x4C[24:23]=10 */ + PHY_SetBBReg(Adapter, 0x944, BIT1 | BIT0, 0x3); /* 0x944[1:0]=11 */ + PHY_SetBBReg(Adapter, 0x930, bMaskByte0, 0x77); /* 0x930[7:0]=77 */ + PHY_SetMacReg(Adapter, 0x38, BIT11, 0x1); /* 0x38[11]=1 */ - // TODO: <20130206, Kordan> The default setting is wrong, hard-coded here. - PHY_SetMacReg(Adapter, 0x778, 0x3, 0x3); // Turn off hardware PTA control (Asked by Scott) - PHY_SetMacReg(Adapter, 0x64, bMaskDWord, 0x36000000); //Fix BT S0/S1 - PHY_SetMacReg(Adapter, 0x948, bMaskDWord, 0x0); //Fix BT can't Tx + /* TODO: <20130206, Kordan> The default setting is wrong, hard-coded here. */ + PHY_SetMacReg(Adapter, 0x778, 0x3, 0x3); /* Turn off hardware PTA control (Asked by Scott) */ + 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*/ - } else if (IS_HARDWARE_TYPE_8821(Adapter)) { + } 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)) +#ifdef CONFIG_RTL8814A + else if (IS_HARDWARE_TYPE_8814A(Adapter)) PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8814A, 0x2000); -#endif - /* - else if(IS_HARDWARE_TYPE_8822B(Adapter)) - { +#endif +#ifdef CONFIG_RTL8822B + else if (IS_HARDWARE_TYPE_8822B(Adapter)) { + u32 tmp_reg = 0; + PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8822B, 0x2000); - }*/ + /* fixed wifi can't 2.4g tx suggest by Szuyitasi 20160504 */ + PHY_SetBBReg(Adapter, 0x70, bMaskByte3, 0x0e); + RTW_INFO(" 0x73 = 0x%x\n",PHY_QueryBBReg(Adapter, 0x70, bMaskByte3)); + PHY_SetBBReg(Adapter, 0x1704, bMaskDWord, 0x0000ff00); + RTW_INFO(" 0x1704 = 0x%x\n",PHY_QueryBBReg(Adapter, 0x1704, bMaskDWord)); + PHY_SetBBReg(Adapter, 0x1700, bMaskDWord, 0xc00f0038); + RTW_INFO(" 0x1700 = 0x%x\n",PHY_QueryBBReg(Adapter, 0x1700, bMaskDWord)); + } +#endif /* CONFIG_RTL8822B */ +#ifdef CONFIG_RTL8821C + else if (IS_HARDWARE_TYPE_8821C(Adapter)) + PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8821C, 0x2000); +#endif /* CONFIG_RTL8821C */ } -#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) -#define PHY_LCCalibrate(a) PHY_LCCalibrate_8812A(&(GET_HAL_DATA(a)->odmpriv)) -#define PHY_SetRFPathSwitch(a,b) PHY_SetRFPathSwitch_8812A(a,b) -*/ - -#ifndef CONFIG_RTL8812A -#define PHY_IQCalibrate_8812A -#define PHY_LCCalibrate_8812A -#define PHY_SetRFPathSwitch_8812A -#endif - -#ifndef CONFIG_RTL8821A -#define PHY_IQCalibrate_8821A -#define PHY_LCCalibrate_8821A -#define PHY_SetRFPathSwitch_8812A -#endif - -#define PHY_IQCalibrate(_Adapter, b) \ - IS_HARDWARE_TYPE_8812(_Adapter) ? PHY_IQCalibrate_8812A(_Adapter, b) : \ - IS_HARDWARE_TYPE_8821(_Adapter) ? PHY_IQCalibrate_8821A(&(GET_HAL_DATA(_Adapter)->odmpriv), b) : \ - PHY_IQCalibrate_default(_Adapter, b) - -#define PHY_LCCalibrate(_Adapter) \ - IS_HARDWARE_TYPE_8812(_Adapter) ? PHY_LCCalibrate_8812A(&(GET_HAL_DATA(_Adapter)->odmpriv)) : \ - IS_HARDWARE_TYPE_8821(_Adapter) ? PHY_LCCalibrate_8821A(&(GET_HAL_DATA(_Adapter)->odmpriv)) : \ - PHY_LCCalibrate_default(_Adapter) - -#define PHY_SetRFPathSwitch(_Adapter, b) \ - (IS_HARDWARE_TYPE_JAGUAR(_Adapter)) ? PHY_SetRFPathSwitch_8812A(_Adapter, b) : \ - PHY_SetRFPathSwitch_default(_Adapter, b) - -#endif //#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) -#ifdef CONFIG_RTL8192E -#define PHY_IQCalibrate(a,b) PHY_IQCalibrate_8192E(a,b) -#define PHY_LCCalibrate(a) PHY_LCCalibrate_8192E(&(GET_HAL_DATA(a)->odmpriv)) -#define PHY_SetRFPathSwitch(a,b) PHY_SetRFPathSwitch_8192E(a,b) -#endif //CONFIG_RTL8812A_8821A - -#ifdef CONFIG_RTL8723B static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery) { PHAL_DATA_TYPE pHalData; - u8 b2ant; //false:1ant, true:2-ant - u8 RF_Path; //0:S1, 1:S0 + u8 b2ant; /* false:1ant, true:2-ant */ + u8 RF_Path; /* 0:S1, 1:S0 */ - pHalData = GET_HAL_DATA(padapter); - b2ant = pHalData->EEPROMBluetoothAntNum==Ant_x2?_TRUE:_FALSE; - - PHY_IQCalibrate_8723B(padapter, bReCovery, _FALSE, b2ant, pHalData->ant_path); -} - - -#define PHY_LCCalibrate(a) PHY_LCCalibrate_8723B(&(GET_HAL_DATA(a)->odmpriv)) -#define PHY_SetRFPathSwitch(a,b) PHY_SetRFPathSwitch_8723B(a,b) + if (IS_HARDWARE_TYPE_8723B(padapter)) { +#ifdef CONFIG_RTL8723B + pHalData = GET_HAL_DATA(padapter); + b2ant = pHalData->EEPROMBluetoothAntNum == Ant_x2 ? _TRUE : _FALSE; + PHY_IQCalibrate_8723B(padapter, bReCovery, _FALSE, b2ant, pHalData->ant_path); #endif - + } else if (IS_HARDWARE_TYPE_8188E(padapter)) { +#ifdef CONFIG_RTL8188E + PHY_IQCalibrate_8188E(padapter, bReCovery); +#endif + } else if (IS_HARDWARE_TYPE_8814A(padapter)) { +#ifdef CONFIG_RTL8814A + PHY_IQCalibrate_8814A(&(GET_HAL_DATA(padapter)->odmpriv), bReCovery); +#endif + } else if (IS_HARDWARE_TYPE_8812(padapter)) { +#ifdef CONFIG_RTL8812A + PHY_IQCalibrate_8812A(padapter, bReCovery); +#endif + } else if (IS_HARDWARE_TYPE_8821(padapter)) { +#ifdef CONFIG_RTL8821A + PHY_IQCalibrate_8821A(&(GET_HAL_DATA(padapter)->odmpriv), bReCovery); +#endif + } else if (IS_HARDWARE_TYPE_8192E(padapter)) { +#ifdef CONFIG_RTL8192E + PHY_IQCalibrate_8192E(padapter, bReCovery); +#endif + } else if (IS_HARDWARE_TYPE_8703B(padapter)) { #ifdef CONFIG_RTL8703B -static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery) -{ - PHY_IQCalibrate_8703B(padapter, bReCovery); -} - - -#define PHY_LCCalibrate(a) PHY_LCCalibrate_8703B(&(GET_HAL_DATA(a)->odmpriv)) -#define PHY_SetRFPathSwitch(a, b) + PHY_IQCalibrate_8703B(padapter, bReCovery); #endif - + } else if (IS_HARDWARE_TYPE_8188F(padapter)) { #ifdef CONFIG_RTL8188F -static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery) -{ - PHY_IQCalibrate_8188F(padapter, bReCovery, _FALSE); + PHY_IQCalibrate_8188F(padapter, bReCovery, _FALSE); +#endif + } else if (IS_HARDWARE_TYPE_8822B(padapter)) { +#ifdef CONFIG_RTL8822B + PHY_IQCalibrate_8822B(&(GET_HAL_DATA(padapter)->odmpriv), bReCovery); +#endif + } else if (IS_HARDWARE_TYPE_8723D(padapter)) { +#ifdef CONFIG_RTL8723D + PHY_IQCalibrate_8723D(padapter, bReCovery); +#endif + } else if (IS_HARDWARE_TYPE_8821C(padapter)) { +#ifdef CONFIG_RTL8821C + /*PHY_IQCalibrate_8821C(padapter, bReCovery);*/ +#endif + } + } - -#define PHY_LCCalibrate(a) PHY_LCCalibrate_8188F(&(GET_HAL_DATA(a)->odmpriv)) -#define PHY_SetRFPathSwitch(a, b) PHY_SetRFPathSwitch_8188F(a, b) +static void PHY_LCCalibrate(PADAPTER padapter) +{ + if (IS_HARDWARE_TYPE_8723B(padapter)) { +#ifdef CONFIG_RTL8723B + PHY_LCCalibrate_8723B(&(GET_HAL_DATA(padapter)->odmpriv)); #endif + } else if (IS_HARDWARE_TYPE_8188E(padapter)) { +#ifdef CONFIG_RTL8188E + PHY_LCCalibrate_8188E(&(GET_HAL_DATA(padapter)->odmpriv)); +#endif + } else if (IS_HARDWARE_TYPE_8814A(padapter)) { +#ifdef CONFIG_RTL8814A + PHY_LCCalibrate_8814A(&(GET_HAL_DATA(padapter)->odmpriv)); +#endif + } else if (IS_HARDWARE_TYPE_8812(padapter)) { +#ifdef CONFIG_RTL8812A + PHY_LCCalibrate_8812A(&(GET_HAL_DATA(padapter)->odmpriv)); +#endif + } else if (IS_HARDWARE_TYPE_8821(padapter)) { +#ifdef CONFIG_RTL8821A + PHY_LCCalibrate_8821A(&(GET_HAL_DATA(padapter)->odmpriv)); +#endif + } else if (IS_HARDWARE_TYPE_8192E(padapter)) { +#ifdef CONFIG_RTL8192E + PHY_LCCalibrate_8192E(&(GET_HAL_DATA(padapter)->odmpriv)); +#endif + } else if (IS_HARDWARE_TYPE_8703B(padapter)) { +#ifdef CONFIG_RTL8703B + PHY_LCCalibrate_8703B(&(GET_HAL_DATA(padapter)->odmpriv)); +#endif + } else if (IS_HARDWARE_TYPE_8188F(padapter)) { +#ifdef CONFIG_RTL8188F + PHY_LCCalibrate_8188F(&(GET_HAL_DATA(padapter)->odmpriv)); +#endif + } else if (IS_HARDWARE_TYPE_8822B(padapter)) { +#ifdef CONFIG_RTL8822B + PHY_LCCalibrate_8822B(&(GET_HAL_DATA(padapter)->odmpriv)); +#endif + } else if (IS_HARDWARE_TYPE_8723D(padapter)) { +#ifdef CONFIG_RTL8723D + PHY_LCCalibrate_8723D(&(GET_HAL_DATA(padapter)->odmpriv)); +#endif + } else if (IS_HARDWARE_TYPE_8821C(padapter)) { +#ifdef CONFIG_RTL8821C + /*PHY_IQCalibrate_8821C(&(GET_HAL_DATA(padapter)->odmpriv));*/ +#endif + } + +} + +static void PHY_SetRFPathSwitch(PADAPTER padapter , BOOLEAN bMain) { + + if (IS_HARDWARE_TYPE_8723B(padapter)) { +#ifdef CONFIG_RTL8723B + PHY_SetRFPathSwitch_8723B(padapter, bMain); +#endif + } else if (IS_HARDWARE_TYPE_8188E(padapter)) { +#ifdef CONFIG_RTL8188E + PHY_SetRFPathSwitch_8188E(padapter, bMain); +#endif + } else if (IS_HARDWARE_TYPE_8814A(padapter)) { +#ifdef CONFIG_RTL8814A + PHY_SetRFPathSwitch_8814A(padapter, bMain); +#endif + } else if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) { +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) + PHY_SetRFPathSwitch_8812A(padapter, bMain); +#endif + } else if (IS_HARDWARE_TYPE_8192E(padapter)) { +#ifdef CONFIG_RTL8192E + PHY_SetRFPathSwitch_8192E(padapter, bMain); +#endif + } else if (IS_HARDWARE_TYPE_8703B(padapter)) { +#ifdef CONFIG_RTL8703B + PHY_SetRFPathSwitch_8703B(padapter, bMain); +#endif + } else if (IS_HARDWARE_TYPE_8188F(padapter)) { +#ifdef CONFIG_RTL8188F + PHY_SetRFPathSwitch_8188F(padapter, bMain); +#endif + } else if (IS_HARDWARE_TYPE_8822B(padapter)) { +#ifdef CONFIG_RTL8822B + PHY_SetRFPathSwitch_8822B(padapter, bMain); +#endif + } else if (IS_HARDWARE_TYPE_8723D(padapter)) { +#ifdef CONFIG_RTL8723D + PHY_SetRFPathSwitch_8723D(padapter, bMain); +#endif + } else if (IS_HARDWARE_TYPE_8821C(padapter)) { +#ifdef CONFIG_RTL8821C + /*PHY_SetRFPathSwitch_8821C(&(GET_HAL_DATA(padapter)->odmpriv));*/ +#endif + } +} s32 MPT_InitializeAdapter( IN PADAPTER pAdapter, IN u8 Channel - ) +) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); s32 rtStatus = _SUCCESS; @@ -531,33 +609,32 @@ MPT_InitializeAdapter( pMptCtx->bMptDrvUnload = _FALSE; pMptCtx->bMassProdTest = _FALSE; - pMptCtx->bMptIndexEven = _TRUE; //default gain index is -6.0db + pMptCtx->bMptIndexEven = _TRUE; /* default gain index is -6.0db */ pMptCtx->h2cReqNum = 0x0; - //init for BT MP -#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A) + /* init for BT MP */ +#if defined(CONFIG_RTL8723B) pMptCtx->bMPh2c_timeout = _FALSE; pMptCtx->MptH2cRspEvent = _FALSE; pMptCtx->MptBtC2hEvent = _FALSE; _rtw_init_sema(&pMptCtx->MPh2c_Sema, 0); - _init_timer( &pMptCtx->MPh2c_timeout_timer, pAdapter->pnetdev, MPh2c_timeout_handle, pAdapter ); + _init_timer(&pMptCtx->MPh2c_timeout_timer, pAdapter->pnetdev, MPh2c_timeout_handle, pAdapter); #endif mpt_InitHWConfig(pAdapter); #ifdef CONFIG_RTL8723B rtl8723b_InitAntenna_Selection(pAdapter); - if (IS_HARDWARE_TYPE_8723B(pAdapter)) - { + if (IS_HARDWARE_TYPE_8723B(pAdapter)) { /* <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); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E); else - PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E); - } + 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); @@ -566,23 +643,23 @@ MPT_InitializeAdapter( pMptCtx->bMptWorkItemInProgress = _FALSE; pMptCtx->CurrMptAct = NULL; pMptCtx->MptRfPath = ODM_RF_PATH_A; - //------------------------------------------------------------------------- - // Don't accept any packets + /* ------------------------------------------------------------------------- */ + /* Don't accept any packets */ rtw_write32(pAdapter, REG_RCR, 0); - //ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); - //rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS); - - //rtw_write32(pAdapter, REG_LEDCFG0, 0x08080); + /* ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); */ + /* rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS); */ + + /* rtw_write32(pAdapter, REG_LEDCFG0, 0x08080); */ ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); - - + + PHY_LCCalibrate(pAdapter); PHY_IQCalibrate(pAdapter, _FALSE); - //dm_CheckTXPowerTracking(&pHalData->odmpriv); //trigger thermal meter - - PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main - + /* dm_CheckTXPowerTracking(&pHalData->odmpriv); */ /* trigger thermal meter */ + + PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /* default use Main */ + 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); @@ -591,6 +668,14 @@ MPT_InitializeAdapter( #ifdef CONFIG_RTL8188E rtw_write32(pAdapter, REG_MACID_NO_LINK_0, 0x0); rtw_write32(pAdapter, REG_MACID_NO_LINK_1, 0x0); +#endif +#ifdef CONFIG_RTL8814A + if (IS_HARDWARE_TYPE_8814A(pAdapter)) { + pHalData->BackUp_IG_REG_4_Chnl_Section[0] = (u1Byte)PHY_QueryBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0); + pHalData->BackUp_IG_REG_4_Chnl_Section[1] = (u1Byte)PHY_QueryBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0); + pHalData->BackUp_IG_REG_4_Chnl_Section[2] = (u1Byte)PHY_QueryBBReg(pAdapter, rC_IGI_Jaguar2, bMaskByte0); + pHalData->BackUp_IG_REG_4_Chnl_Section[3] = (u1Byte)PHY_QueryBBReg(pAdapter, rD_IGI_Jaguar2, bMaskByte0); + } #endif return rtStatus; } @@ -615,29 +700,26 @@ MPT_InitializeAdapter( VOID MPT_DeInitAdapter( IN PADAPTER pAdapter - ) +) { PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; pMptCtx->bMptDrvUnload = _TRUE; - #if defined(CONFIG_RTL8723B) +#if defined(CONFIG_RTL8723B) _rtw_free_sema(&(pMptCtx->MPh2c_Sema)); - _cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); - #endif - #if defined(CONFIG_RTL8723B) - PHY_SetBBReg(pAdapter,0xA01, BIT0, 1); ///suggestion by jerry for MP Rx. - #endif -#if 0 // for Windows - PlatformFreeWorkItem( &(pMptCtx->MptWorkItem) ); + _cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer); +#endif +#if defined(CONFIG_RTL8723B) + PHY_SetBBReg(pAdapter, 0xA01, BIT0, 1); /* /suggestion by jerry for MP Rx. */ +#endif +#if 0 /* for Windows */ + PlatformFreeWorkItem(&(pMptCtx->MptWorkItem)); - while(pMptCtx->bMptWorkItemInProgress) - { - if(NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50)) - { + while (pMptCtx->bMptWorkItemInProgress) { + if (NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50)) break; - } } - NdisFreeSpinLock( &(pMptCtx->MptWorkItemSpinLock) ); + NdisFreeSpinLock(&(pMptCtx->MptWorkItemSpinLock)); #endif } @@ -652,6 +734,7 @@ static u8 mpt_ProStartTest(PADAPTER padapter) pMptCtx->bSingleCarrier = _FALSE; pMptCtx->bCarrierSuppression = _FALSE; pMptCtx->bSingleTone = _FALSE; + pMptCtx->HWTxmode = PACKETS_TX; return _SUCCESS; } @@ -671,28 +754,38 @@ void GetPowerTracking(PADAPTER padapter, u8 *enable) hal_mpt_GetPowerTracking(padapter, enable); } +void rtw_mp_trigger_iqk(PADAPTER padapter) +{ + PHY_IQCalibrate(padapter, _FALSE); +} + +void rtw_mp_trigger_lck(PADAPTER padapter) +{ + PHY_LCCalibrate(padapter); +} + static void disable_dm(PADAPTER padapter) { u8 v8; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - //3 1. disable firmware dynamic mechanism - // disable Power Training, Rate Adaptive + /* 3 1. disable firmware dynamic mechanism */ + /* disable Power Training, Rate Adaptive */ v8 = rtw_read8(padapter, REG_BCN_CTRL); v8 &= ~EN_BCN_FUNCTION; rtw_write8(padapter, REG_BCN_CTRL, v8); - //3 2. disable driver dynamic mechanism + /* 3 2. disable driver dynamic mechanism */ rtw_phydm_func_disable_all(padapter); - // enable APK, LCK and IQK but disable power tracking + /* enable APK, LCK and IQK but disable power tracking */ pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE; rtw_phydm_func_set(padapter, ODM_RF_CALIBRATION); -//#ifdef CONFIG_BT_COEXIST -// rtw_btcoex_Switch(padapter, 0); //remove for BT MP Down. -//#endif + /* #ifdef CONFIG_BT_COEXIST */ + /* rtw_btcoex_Switch(padapter, 0); */ /* remove for BT MP Down. */ + /* #endif */ } @@ -701,35 +794,42 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart) HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - if (bstart==1){ - DBG_871X("in MPT_PwrCtlDM start\n"); + if (bstart == 1) { + RTW_INFO("in MPT_PwrCtlDM start\n"); rtw_phydm_func_set(padapter, ODM_RF_TX_PWR_TRACK | ODM_RF_CALIBRATION); pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE; - padapter->mppriv.mp_dm =1; - - }else{ - DBG_871X("in MPT_PwrCtlDM stop \n"); + padapter->mppriv.mp_dm = 1; + + } else { + RTW_INFO("in MPT_PwrCtlDM stop\n"); disable_dm(padapter); pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE; padapter->mppriv.mp_dm = 0; { TXPWRTRACK_CFG c; - u1Byte chnl =0 ; + u1Byte chnl = 0 ; _rtw_memset(&c, 0, sizeof(TXPWRTRACK_CFG)); ConfigureTxpowerTrack(pDM_Odm, &c); ODM_ClearTxPowerTrackingState(pDM_Odm); 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); + if (pDM_Odm->SupportICType == ODM_RTL8188F) + (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, chnl); + else if (pDM_Odm->SupportICType == ODM_RTL8723D) { + (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_A, chnl); + SetTxPower(padapter); + } else { + (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_A, chnl); + (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_B, chnl); + } } } } - + } -u32 mp_join(PADAPTER padapter,u8 mode) +u32 mp_join(PADAPTER padapter, u8 mode) { WLAN_BSSID_EX bssid; struct sta_info *psta; @@ -743,36 +843,37 @@ u32 mp_join(PADAPTER padapter,u8 mode) 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 + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network)); + +#ifdef CONFIG_IOCTL_CFG80211 struct wireless_dev *pwdev = padapter->rtw_wdev; -#endif //#ifdef CONFIG_IOCTL_CFG80211 - // 1. initialize a new WLAN_BSSID_EX +#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__, - pmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]); + RTW_INFO("%s ,pmppriv->network_macaddr=%x %x %x %x %x %x\n", __func__, + pmppriv->network_macaddr[0], pmppriv->network_macaddr[1], pmppriv->network_macaddr[2], pmppriv->network_macaddr[3], pmppriv->network_macaddr[4], + pmppriv->network_macaddr[5]); _rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN); - - if( mode==WIFI_FW_ADHOC_STATE ){ + + if (mode == WIFI_FW_ADHOC_STATE) { bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc"); - _rtw_memcpy(bssid.Ssid.Ssid, (u8*)"mp_pseudo_adhoc", bssid.Ssid.SsidLength); + _rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_adhoc", bssid.Ssid.SsidLength); bssid.InfrastructureMode = Ndis802_11IBSS; bssid.NetworkTypeInUse = Ndis802_11DS; bssid.IELength = 0; - bssid.Configuration.DSConfig=pmppriv->channel; + bssid.Configuration.DSConfig = pmppriv->channel; - }else if(mode==WIFI_FW_STATION_STATE){ + } else if (mode == WIFI_FW_STATION_STATE) { bssid.Ssid.SsidLength = strlen("mp_pseudo_STATION"); - _rtw_memcpy(bssid.Ssid.Ssid, (u8*)"mp_pseudo_STATION", bssid.Ssid.SsidLength); + _rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_STATION", bssid.Ssid.SsidLength); bssid.InfrastructureMode = Ndis802_11Infrastructure; bssid.NetworkTypeInUse = Ndis802_11DS; 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. + bssid.Length = ((length >> 2) + 1) << 2; /* round up to multiple of 4 bytes. */ else bssid.Length = length; @@ -781,61 +882,62 @@ u32 mp_join(PADAPTER padapter,u8 mode) if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) goto end_of_mp_start_test; - //init mp_start_test status + /* init mp_start_test status */ if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { rtw_disassoc_cmd(padapter, 500, _TRUE); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); } pmppriv->prev_fw_state = get_fwstate(pmlmepriv); - pmlmepriv->fw_state = WIFI_MP_STATE; + /*pmlmepriv->fw_state = WIFI_MP_STATE;*/ + init_fwstate(pmlmepriv, WIFI_MP_STATE); set_fwstate(pmlmepriv, _FW_UNDER_LINKING); - //3 2. create a new psta for mp driver - //clear psta in the cur_network, if any + /* 3 2. create a new psta for mp driver */ + /* clear psta in the cur_network, if any */ psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); - if (psta) rtw_free_stainfo(padapter, psta); + if (psta) + rtw_free_stainfo(padapter, psta); psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress); if (psta == NULL) { - RT_TRACE(_module_mp_, _drv_err_, ("mp_start_test: Can't alloc sta_info!\n")); - pmlmepriv->fw_state = pmppriv->prev_fw_state; + /*pmlmepriv->fw_state = pmppriv->prev_fw_state;*/ + init_fwstate(pmlmepriv, pmppriv->prev_fw_state); res = _FAIL; goto end_of_mp_start_test; } - set_fwstate(pmlmepriv,WIFI_ADHOC_MASTER_STATE); - //3 3. join psudo AdHoc + set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE); + /* 3 3. join psudo AdHoc */ tgt_network->join_res = 1; tgt_network->aid = psta->aid = 1; _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); + _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); rtw_indicate_connect(padapter); _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - set_fwstate(pmlmepriv,_FW_LINKED); + set_fwstate(pmlmepriv, _FW_LINKED); end_of_mp_start_test: _exit_critical_bh(&pmlmepriv->lock, &irqL); - if(1) //(res == _SUCCESS) - { - // set MSR to WIFI_FW_ADHOC_STATE - if( mode==WIFI_FW_ADHOC_STATE ){ + if (1) { /* (res == _SUCCESS) */ + /* set MSR to WIFI_FW_ADHOC_STATE */ + if (mode == WIFI_FW_ADHOC_STATE) { - val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102 + val8 = rtw_read8(padapter, MSR) & 0xFC; /* 0x0102 */ val8 |= WIFI_FW_ADHOC_STATE; - rtw_write8(padapter, MSR, val8); // Link in ad hoc network - } - else { + rtw_write8(padapter, MSR, val8); /* Link in ad hoc network */ + } else { Set_MSR(padapter, WIFI_FW_STATION_STATE); - DBG_8192C("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n",__func__, - pmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]); + RTW_INFO("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n", __func__, + pmppriv->network_macaddr[0], pmppriv->network_macaddr[1], pmppriv->network_macaddr[2], pmppriv->network_macaddr[3], pmppriv->network_macaddr[4], + pmppriv->network_macaddr[5]); rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr); } @@ -843,7 +945,7 @@ end_of_mp_start_test: return res; } -//This function initializes the DUT to the MP test mode +/* This function initializes the DUT to the MP test mode */ s32 mp_start_test(PADAPTER padapter) { struct mp_priv *pmppriv = &padapter->mppriv; @@ -851,61 +953,73 @@ s32 mp_start_test(PADAPTER padapter) padapter->registrypriv.mp_mode = 1; - //3 disable dynamic mechanism + /* 3 disable dynamic mechanism */ disable_dm(padapter); - #ifdef CONFIG_RTL8814A +#ifdef CONFIG_RTL8814A rtl8814_InitHalDm(padapter); - #endif /* CONFIG_RTL8814A */ - #ifdef CONFIG_RTL8812A +#endif /* CONFIG_RTL8814A */ +#ifdef CONFIG_RTL8822B + rtl8822b_phy_init_haldm(padapter); +#endif /* CONFIG_RTL8822B */ +#ifdef CONFIG_RTL8821C + rtl8821c_phy_init_haldm(padapter); +#endif /* CONFIG_RTL8821C */ +#ifdef CONFIG_RTL8812A rtl8812_InitHalDm(padapter); - #endif /* CONFIG_RTL8812A */ - #ifdef CONFIG_RTL8723B +#endif /* CONFIG_RTL8812A */ +#ifdef CONFIG_RTL8723B rtl8723b_InitHalDm(padapter); - #endif /* CONFIG_RTL8723B */ - #ifdef CONFIG_RTL8703B +#endif /* CONFIG_RTL8723B */ +#ifdef CONFIG_RTL8703B rtl8703b_InitHalDm(padapter); - #endif /* CONFIG_RTL8703B */ - #ifdef CONFIG_RTL8192E +#endif /* CONFIG_RTL8703B */ +#ifdef CONFIG_RTL8192E rtl8192e_InitHalDm(padapter); - #endif - #ifdef CONFIG_RTL8188F +#endif +#ifdef CONFIG_RTL8188F rtl8188f_InitHalDm(padapter); - #endif +#endif +#ifdef CONFIG_RTL8188E + rtl8188e_InitHalDm(padapter); +#endif +#ifdef CONFIG_RTL8723D + rtl8723d_InitHalDm(padapter); +#endif /* CONFIG_RTL8723D */ - //3 0. update mp_priv + /* 3 0. update mp_priv */ if (padapter->registrypriv.rf_config == RF_MAX_TYPE) { -// switch (phal->rf_type) { + /* switch (phal->rf_type) { */ switch (GET_RF_TYPE(padapter)) { - case RF_1T1R: - pmppriv->antenna_tx = ANTENNA_A; - pmppriv->antenna_rx = ANTENNA_A; - break; - case RF_1T2R: - default: - pmppriv->antenna_tx = ANTENNA_A; - pmppriv->antenna_rx = ANTENNA_AB; - break; - case RF_2T2R: - case RF_2T2R_GREEN: - pmppriv->antenna_tx = ANTENNA_AB; - pmppriv->antenna_rx = ANTENNA_AB; - break; - case RF_2T4R: - pmppriv->antenna_tx = ANTENNA_AB; - pmppriv->antenna_rx = ANTENNA_ABCD; - break; - } + case RF_1T1R: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_A; + break; + case RF_1T2R: + default: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T2R: + case RF_2T2R_GREEN: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T4R: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_ABCD; + break; + } } mpt_ProStartTest(padapter); - mp_join(padapter,WIFI_FW_ADHOC_STATE); + mp_join(padapter, WIFI_FW_ADHOC_STATE); return res; } -//------------------------------------------------------------------------------ -//This function change the DUT from the MP test mode into normal mode +/* ------------------------------------------------------------------------------ + * This function change the DUT from the MP test mode into normal mode */ void mp_stop_test(PADAPTER padapter) { struct mp_priv *pmppriv = &padapter->mppriv; @@ -914,54 +1028,58 @@ void mp_stop_test(PADAPTER padapter) struct sta_info *psta; _irqL irqL; - - if(pmppriv->mode==MP_ON) - { - pmppriv->bSetTxPower=0; - _enter_critical_bh(&pmlmepriv->lock, &irqL); - if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE) - goto end_of_mp_stop_test; - //3 1. disconnect psudo AdHoc - rtw_indicate_disconnect(padapter); + if (pmppriv->mode == MP_ON) { + pmppriv->bSetTxPower = 0; + _enter_critical_bh(&pmlmepriv->lock, &irqL); + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE) + goto end_of_mp_stop_test; - //3 2. clear psta used in mp test mode. -// rtw_free_assoc_resources(padapter, 1); - psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); - if (psta) rtw_free_stainfo(padapter, psta); + /* 3 1. disconnect psudo AdHoc */ + rtw_indicate_disconnect(padapter, 0, _FALSE); - //3 3. return to normal state (default:station mode) - pmlmepriv->fw_state = pmppriv->prev_fw_state; // WIFI_STATION_STATE; + /* 3 2. clear psta used in mp test mode. + * rtw_free_assoc_resources(padapter, 1); */ + psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); + if (psta) + rtw_free_stainfo(padapter, psta); - //flush the cur_network - _rtw_memset(tgt_network, 0, sizeof(struct wlan_network)); - - _clr_fwstate_(pmlmepriv, WIFI_MP_STATE); + /* 3 3. return to normal state (default:station mode) */ + /*pmlmepriv->fw_state = pmppriv->prev_fw_state; */ /* WIFI_STATION_STATE;*/ + init_fwstate(pmlmepriv, pmppriv->prev_fw_state); + + /* flush the cur_network */ + _rtw_memset(tgt_network, 0, sizeof(struct wlan_network)); + + _clr_fwstate_(pmlmepriv, WIFI_MP_STATE); end_of_mp_stop_test: - _exit_critical_bh(&pmlmepriv->lock, &irqL); + _exit_critical_bh(&pmlmepriv->lock, &irqL); - #ifdef CONFIG_RTL8812A - rtl8812_InitHalDm(padapter); - #endif - #ifdef CONFIG_RTL8723B - rtl8723b_InitHalDm(padapter); - #endif - #ifdef CONFIG_RTL8703B - rtl8703b_InitHalDm(padapter); - #endif - #ifdef CONFIG_RTL8192E - rtl8192e_InitHalDm(padapter); - #endif - #ifdef CONFIG_RTL8188F - rtl8188f_InitHalDm(padapter); - #endif +#ifdef CONFIG_RTL8812A + rtl8812_InitHalDm(padapter); +#endif +#ifdef CONFIG_RTL8723B + rtl8723b_InitHalDm(padapter); +#endif +#ifdef CONFIG_RTL8703B + rtl8703b_InitHalDm(padapter); +#endif +#ifdef CONFIG_RTL8192E + rtl8192e_InitHalDm(padapter); +#endif +#ifdef CONFIG_RTL8188F + rtl8188f_InitHalDm(padapter); +#endif +#ifdef CONFIG_RTL8723D + rtl8723d_InitHalDm(padapter); +#endif } } /*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ #if 0 -//#ifdef CONFIG_USB_HCI +/* #ifdef CONFIG_USB_HCI */ static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Channel, u8 BandWidthID) { u8 eRFPath; @@ -969,18 +1087,17 @@ static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Ch HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - if (RateIdx < MPT_RATE_6M) { // CCK rate,for 88cu + if (RateIdx < MPT_RATE_6M) /* CCK rate,for 88cu */ rfReg0x26 = 0xf400; - } - else if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {// OFDM rate,for 88cu + else if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {/* OFDM rate,for 88cu */ if ((4 == Channel) || (8 == Channel) || (12 == Channel)) rfReg0x26 = 0xf000; else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel)) rfReg0x26 = 0xf400; else rfReg0x26 = 0x4f200; - } - else if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) {// MCS 20M ,for 88cu // MCS40M rate,for 88cu + } else if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) { + /* MCS 20M ,for 88cu */ /* MCS40M rate,for 88cu */ if (CHANNEL_WIDTH_20 == BandWidthID) { if ((4 == Channel) || (8 == Channel)) @@ -989,8 +1106,7 @@ static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Ch rfReg0x26 = 0xf400; else rfReg0x26 = 0x4f200; - } - else{ + } else { if ((4 == Channel) || (8 == Channel)) rfReg0x26 = 0xf000; else if ((5 == Channel) || (7 == Channel)) @@ -1000,10 +1116,8 @@ static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Ch } } -// RT_TRACE(COMP_CMD, DBG_LOUD, ("\n mpt_AdjustRFRegByRateByChan92CU():Chan:%d Rate=%d rfReg0x26:0x%08x\n",Channel, RateIdx,rfReg0x26)); - for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) { + for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) write_rfreg(pAdapter, eRFPath, RF_SYN_G2, rfReg0x26); - } } #endif /*----------------------------------------------------------------------------- @@ -1026,7 +1140,7 @@ static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Ch static void mpt_SwitchRfSetting(PADAPTER pAdapter) { hal_mpt_SwitchRfSetting(pAdapter); - } +} /*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ /*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ @@ -1038,7 +1152,7 @@ static void MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) static void MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) { hal_mpt_CCKTxPowerAdjustbyIndex(pAdapter, beven); - } +} /*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ @@ -1077,15 +1191,15 @@ int SetTxPower(PADAPTER pAdapter) void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) { - u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC; + u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D, tmpAGC; - TxAGCOffset_B = (ulTxAGCOffset&0x000000ff); - TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8); - TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16); + TxAGCOffset_B = (ulTxAGCOffset & 0x000000ff); + TxAGCOffset_C = ((ulTxAGCOffset & 0x0000ff00) >> 8); + TxAGCOffset_D = ((ulTxAGCOffset & 0x00ff0000) >> 16); - tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B); + tmpAGC = (TxAGCOffset_D << 8 | TxAGCOffset_C << 4 | TxAGCOffset_B); write_bbreg(pAdapter, rFPGA0_TxGainStage, - (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC); + (bXBTxAGC | bXCTxAGC | bXDTxAGC), tmpAGC); } void SetDataRate(PADAPTER pAdapter) @@ -1093,7 +1207,7 @@ void SetDataRate(PADAPTER pAdapter) hal_mpt_SetDataRate(pAdapter); } -void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter ,BOOLEAN bMain) +void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter , BOOLEAN bMain) { PHY_SetRFPathSwitch(pAdapter, bMain); @@ -1149,7 +1263,7 @@ void SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) { PhySetTxPowerLevel(pAdapter); hal_mpt_SetOFDMContinuousTx(pAdapter, bStart); -}/* mpt_StartOfdmContTx */ +} /* mpt_StartOfdmContTx */ void SetContinuousTx(PADAPTER pAdapter, u8 bStart) { @@ -1161,30 +1275,29 @@ void SetContinuousTx(PADAPTER pAdapter, u8 bStart) void PhySetTxPowerLevel(PADAPTER pAdapter) { struct mp_priv *pmp_priv = &pAdapter->mppriv; - - if (pmp_priv->bSetTxPower==0) // for NO manually set power index - { -#ifdef CONFIG_RTL8188E - PHY_SetTxPowerLevel8188E(pAdapter,pmp_priv->channel); + + if (pmp_priv->bSetTxPower == 0) { /* for NO manually set power index */ +#ifdef CONFIG_RTL8188E + PHY_SetTxPowerLevel8188E(pAdapter, pmp_priv->channel); #endif #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) - PHY_SetTxPowerLevel8812(pAdapter,pmp_priv->channel); + PHY_SetTxPowerLevel8812(pAdapter, pmp_priv->channel); #endif #if defined(CONFIG_RTL8192E) - PHY_SetTxPowerLevel8192E(pAdapter,pmp_priv->channel); + PHY_SetTxPowerLevel8192E(pAdapter, pmp_priv->channel); #endif #if defined(CONFIG_RTL8723B) - PHY_SetTxPowerLevel8723B(pAdapter,pmp_priv->channel); + PHY_SetTxPowerLevel8723B(pAdapter, pmp_priv->channel); #endif #if defined(CONFIG_RTL8188F) PHY_SetTxPowerLevel8188F(pAdapter, pmp_priv->channel); #endif - mpt_ProQueryCalTxPower(pAdapter,pmp_priv->antenna_tx); + mpt_ProQueryCalTxPower(pAdapter, pmp_priv->antenna_tx); } } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ static void dump_mpframe(PADAPTER padapter, struct xmit_frame *pmpframe) { rtw_hal_mgnt_xmit(padapter, pmpframe); @@ -1195,13 +1308,12 @@ static struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv) struct xmit_frame *pmpframe; struct xmit_buf *pxmitbuf; - if ((pmpframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL) - { + pmpframe = rtw_alloc_xmitframe(pxmitpriv); + if (pmpframe == NULL) return NULL; - } - if ((pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL) - { + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if (pxmitbuf == NULL) { rtw_free_xmitframe(pxmitpriv, pmpframe); return NULL; } @@ -1230,34 +1342,33 @@ static thread_return mp_xmit_packet_thread(thread_context context) pmptx = &pmp_priv->tx; padapter = pmp_priv->papdater; pxmitpriv = &(padapter->xmitpriv); - + thread_enter("RTW_MP_THREAD"); - DBG_871X("%s:pkTx Start\n", __func__); + RTW_INFO("%s:pkTx Start\n", __func__); while (1) { pxmitframe = alloc_mp_xmitframe(pxmitpriv); if (pxmitframe == NULL) { if (pmptx->stop || - RTW_CANNOT_RUN(padapter)) { + RTW_CANNOT_RUN(padapter)) goto exit; - } else { rtw_usleep_os(10); continue; } } - _rtw_memcpy((u8 *)(pxmitframe->buf_addr+TXDESC_OFFSET), pmptx->buf, pmptx->write_size); + _rtw_memcpy((u8 *)(pxmitframe->buf_addr + TXDESC_OFFSET), pmptx->buf, pmptx->write_size); _rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib)); - + rtw_usleep_os(padapter->mppriv.pktInterval); dump_mpframe(padapter, pxmitframe); - + pmptx->sended++; pmp_priv->tx_pktcount++; if (pmptx->stop || - RTW_CANNOT_RUN(padapter)) + RTW_CANNOT_RUN(padapter)) goto exit; if ((pmptx->count != 0) && (pmptx->count == pmptx->sended)) @@ -1267,7 +1378,7 @@ static thread_return mp_xmit_packet_thread(thread_context context) } exit: - //DBG_871X("%s:pkTx Exit\n", __func__); + /* RTW_INFO("%s:pkTx Exit\n", __func__); */ rtw_mfree(pmptx->pallocated_buf, pmptx->buf_size); pmptx->pallocated_buf = NULL; pmptx->stop = 1; @@ -1276,12 +1387,12 @@ exit: } void fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc) -{ +{ struct mp_priv *pmp_priv = &padapter->mppriv; _rtw_memcpy(ptxdesc, pmp_priv->tx.desc, TXDESC_SIZE); } -#if defined(CONFIG_RTL8188E) +#if defined(CONFIG_RTL8188E) void fill_tx_desc_8188e(PADAPTER padapter) { struct mp_priv *pmp_priv = &padapter->mppriv; @@ -1289,48 +1400,49 @@ void fill_tx_desc_8188e(PADAPTER padapter) struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib); u32 pkt_size = pattrib->last_txcmdsz; s32 bmcast = IS_MCAST(pattrib->ra); -// offset 0 + /* offset 0 */ #if !defined(CONFIG_RTL8188E_SDIO) && !defined(CONFIG_PCI_HCI) desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); - desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); // packet size - desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); //32 bytes for TX Desc - if (bmcast) desc->txdw0 |= cpu_to_le32(BMC); // broadcast packet + desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); /* packet size */ + desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); /* 32 bytes for TX Desc */ + if (bmcast) + desc->txdw0 |= cpu_to_le32(BMC); /* broadcast packet */ desc->txdw1 |= cpu_to_le32((0x01 << 26) & 0xff000000); #endif - desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x3F); //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->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x3F); /* 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->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0x0fff0000); desc->txdw4 |= cpu_to_le32(HW_SSN); - + 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->preamble) { + if (HwRateToMPTRate(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 + /* 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 + if (pmp_priv->preamble) { + if (HwRateToMPTRate(pmp_priv->rateidx) > MPT_RATE_54M) + desc->txdw5 |= cpu_to_le32(SGI); /* MCS Short Guard Interval */ } - desc->txdw5 |= cpu_to_le32(RTY_LMT_EN); // retry limit enable - desc->txdw5 |= cpu_to_le32(0x00180000); // DATA/RTS Rate Fallback Limit - - + desc->txdw5 |= cpu_to_le32(RTY_LMT_EN); /* retry limit enable */ + desc->txdw5 |= cpu_to_le32(0x00180000); /* DATA/RTS Rate Fallback Limit */ + + } #endif @@ -1340,18 +1452,18 @@ 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; + u8 data_rate, pwr_status, offset; - //SET_TX_DESC_FIRST_SEG_8814A(pDesc, 1); + /* 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_OWN_(pDesc, 1); */ + SET_TX_DESC_PKT_SIZE_8814A(pDesc, pkt_size); - - offset = TXDESC_SIZE + OFFSET_SZ; + + offset = TXDESC_SIZE + OFFSET_SZ; SET_TX_DESC_OFFSET_8814A(pDesc, offset); #if defined(CONFIG_PCI_HCI) @@ -1359,32 +1471,29 @@ void fill_tx_desc_8814a(PADAPTER padapter) #else SET_TX_DESC_PKT_OFFSET_8814A(pDesc, 1); #endif - - if (bmcast) { + + 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_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_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) { + + 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); + else { + RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth); SET_TX_DESC_DATA_BW_8814A(pDesc, CHANNEL_WIDTH_20); } @@ -1401,18 +1510,18 @@ void fill_tx_desc_8812a(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; + u8 data_rate, pwr_status, offset; SET_TX_DESC_FIRST_SEG_8812(pDesc, 1); SET_TX_DESC_LAST_SEG_8812(pDesc, 1); SET_TX_DESC_OWN_8812(pDesc, 1); - + SET_TX_DESC_PKT_SIZE_8812(pDesc, pkt_size); - - offset = TXDESC_SIZE + OFFSET_SZ; + + offset = TXDESC_SIZE + OFFSET_SZ; SET_TX_DESC_OFFSET_8812(pDesc, offset); @@ -1421,27 +1530,25 @@ void fill_tx_desc_8812a(PADAPTER padapter) #else SET_TX_DESC_PKT_OFFSET_8812(pDesc, 1); #endif - if (bmcast) { + if (bmcast) SET_TX_DESC_BMC_8812(pDesc, 1); - } SET_TX_DESC_MACID_8812(pDesc, pattrib->mac_id); SET_TX_DESC_RATE_ID_8812(pDesc, pattrib->raid); - //SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G); + /* SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G); */ SET_TX_DESC_QUEUE_SEL_8812(pDesc, pattrib->qsel); - //SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); - + /* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */ + if (!pattrib->qos_en) { - SET_TX_DESC_HWSEQ_EN_8812(pDesc, 1); // Hw set sequence number - } else { + SET_TX_DESC_HWSEQ_EN_8812(pDesc, 1); /* Hw set sequence number */ + } else SET_TX_DESC_SEQ_8812(pDesc, pattrib->seqnum); - } - - if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160) { + + if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160) SET_TX_DESC_DATA_BW_8812(pDesc, pmp_priv->bandwidth); - } else { - DBG_871X("%s:Err: unknown bandwidth %d, use 20M\n", __func__,pmp_priv->bandwidth); + else { + RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth); SET_TX_DESC_DATA_BW_8812(pDesc, CHANNEL_WIDTH_20); } @@ -1457,51 +1564,49 @@ void fill_tx_desc_8192e(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; - + u8 data_rate, pwr_status, offset; + SET_TX_DESC_PKT_SIZE_92E(pDesc, pkt_size); - - offset = TXDESC_SIZE + OFFSET_SZ; - + + offset = TXDESC_SIZE + OFFSET_SZ; + SET_TX_DESC_OFFSET_92E(pDesc, offset); - #if defined(CONFIG_PCI_HCI) /* 8192EE */ +#if defined(CONFIG_PCI_HCI) /* 8192EE */ SET_TX_DESC_PKT_OFFSET_92E(pDesc, 0); /* 8192EE pkt_offset is 0 */ - #else /* 8192EU 8192ES */ +#else /* 8192EU 8192ES */ SET_TX_DESC_PKT_OFFSET_92E(pDesc, 1); - #endif - - if (bmcast) { +#endif + + if (bmcast) SET_TX_DESC_BMC_92E(pDesc, 1); - } - + SET_TX_DESC_MACID_92E(pDesc, pattrib->mac_id); SET_TX_DESC_RATE_ID_92E(pDesc, pattrib->raid); - - + + SET_TX_DESC_QUEUE_SEL_92E(pDesc, pattrib->qsel); - //SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); - + /* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */ + if (!pattrib->qos_en) { - SET_TX_DESC_EN_HWSEQ_92E(pDesc, 1);// Hw set sequence number + SET_TX_DESC_EN_HWSEQ_92E(pDesc, 1);/* Hw set sequence number */ SET_TX_DESC_HWSEQ_SEL_92E(pDesc, pattrib->hw_ssn_sel); - } else { + } else SET_TX_DESC_SEQ_92E(pDesc, pattrib->seqnum); - } - - if ((pmp_priv->bandwidth == CHANNEL_WIDTH_20) || (pmp_priv->bandwidth == CHANNEL_WIDTH_40)) { + + if ((pmp_priv->bandwidth == CHANNEL_WIDTH_20) || (pmp_priv->bandwidth == CHANNEL_WIDTH_40)) SET_TX_DESC_DATA_BW_92E(pDesc, pmp_priv->bandwidth); - } else { - DBG_871X("%s:Err: unknown bandwidth %d, use 20M\n", __func__,pmp_priv->bandwidth); + else { + RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth); SET_TX_DESC_DATA_BW_92E(pDesc, CHANNEL_WIDTH_20); } - - //SET_TX_DESC_DATA_SC_92E(pDesc, SCMapping_92E(padapter,pattrib)); - + + /* SET_TX_DESC_DATA_SC_92E(pDesc, SCMapping_92E(padapter,pattrib)); */ + SET_TX_DESC_DISABLE_FB_92E(pDesc, 1); SET_TX_DESC_USE_RATE_92E(pDesc, 1); SET_TX_DESC_TX_RATE_92E(pDesc, pmp_priv->rateidx); @@ -1526,15 +1631,14 @@ void fill_tx_desc_8723b(PADAPTER padapter) SET_TX_DESC_USE_RATE_8723B(ptxdesc, 1); SET_TX_DESC_DISABLE_FB_8723B(ptxdesc, 1); - if (pmp_priv->preamble) - if (pmp_priv->rateidx <= MPT_RATE_54M) { + if (pmp_priv->preamble) { + if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M) SET_TX_DESC_DATA_SHORT_8723B(ptxdesc, 1); - } - - if (pmp_priv->bandwidth == CHANNEL_WIDTH_40) { - SET_TX_DESC_DATA_BW_8723B(ptxdesc, 1); } + if (pmp_priv->bandwidth == CHANNEL_WIDTH_40) + SET_TX_DESC_DATA_BW_8723B(ptxdesc, 1); + SET_TX_DESC_TX_RATE_8723B(ptxdesc, pmp_priv->rateidx); SET_TX_DESC_DATA_RATE_FB_LIMIT_8723B(ptxdesc, 0x1F); @@ -1543,7 +1647,7 @@ void fill_tx_desc_8723b(PADAPTER padapter) #endif #if defined(CONFIG_RTL8703B) -void fill_tx_desc_8703b(PADAPTER padapter) +void fill_tx_desc_8703b(PADAPTER padapter) { struct mp_priv *pmp_priv = &padapter->mppriv; struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib); @@ -1560,7 +1664,7 @@ void fill_tx_desc_8703b(PADAPTER padapter) SET_TX_DESC_DISABLE_FB_8703B(ptxdesc, 1); if (pmp_priv->preamble) { - if (pmp_priv->rateidx <= MPT_RATE_54M) + if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M) SET_TX_DESC_DATA_SHORT_8703B(ptxdesc, 1); } @@ -1592,10 +1696,10 @@ void fill_tx_desc_8188f(PADAPTER padapter) SET_TX_DESC_DISABLE_FB_8188F(ptxdesc, 1); if (pmp_priv->preamble) - if (pmp_priv->rateidx <= MPT_RATE_54M) + if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M) SET_TX_DESC_DATA_SHORT_8188F(ptxdesc, 1); - if (pmp_priv->bandwidth == CHANNEL_WIDTH_40) + if (pmp_priv->bandwidth == CHANNEL_WIDTH_40) SET_TX_DESC_DATA_BW_8188F(ptxdesc, 1); SET_TX_DESC_TX_RATE_8188F(ptxdesc, pmp_priv->rateidx); @@ -1605,25 +1709,57 @@ void fill_tx_desc_8188f(PADAPTER padapter) } #endif +#if defined(CONFIG_RTL8723D) +void fill_tx_desc_8723d(PADAPTER padapter) +{ + struct mp_priv *pmp_priv = &padapter->mppriv; + struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib); + u8 *ptxdesc = pmp_priv->tx.desc; + + SET_TX_DESC_BK_8723D(ptxdesc, 1); + SET_TX_DESC_MACID_8723D(ptxdesc, pattrib->mac_id); + SET_TX_DESC_QUEUE_SEL_8723D(ptxdesc, pattrib->qsel); + + SET_TX_DESC_RATE_ID_8723D(ptxdesc, pattrib->raid); + SET_TX_DESC_SEQ_8723D(ptxdesc, pattrib->seqnum); + SET_TX_DESC_HWSEQ_EN_8723D(ptxdesc, 1); + SET_TX_DESC_USE_RATE_8723D(ptxdesc, 1); + SET_TX_DESC_DISABLE_FB_8723D(ptxdesc, 1); + + if (pmp_priv->preamble) { + if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M) + SET_TX_DESC_DATA_SHORT_8723D(ptxdesc, 1); + } + + if (pmp_priv->bandwidth == CHANNEL_WIDTH_40) + SET_TX_DESC_DATA_BW_8723D(ptxdesc, 1); + + SET_TX_DESC_TX_RATE_8723D(ptxdesc, pmp_priv->rateidx); + + SET_TX_DESC_DATA_RATE_FB_LIMIT_8723D(ptxdesc, 0x1F); + SET_TX_DESC_RTS_RATE_FB_LIMIT_8723D(ptxdesc, 0xF); +} +#endif + static void Rtw_MPSetMacTxEDCA(PADAPTER padapter) { - rtw_write32(padapter, 0x508 , 0x00a422); //Disable EDCA BE Txop for MP pkt tx adjust Packet interval - //DBG_871X("%s:write 0x508~~~~~~ 0x%x\n", __func__,rtw_read32(padapter, 0x508)); - PHY_SetMacReg(padapter, 0x458 ,bMaskDWord , 0x0); - //DBG_8192C("%s()!!!!! 0x460 = 0x%x\n" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord)); - PHY_SetMacReg(padapter, 0x460 ,bMaskLWord , 0x0);//fast EDCA queue packet interval & time out vaule - //PHY_SetMacReg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C); - //PHY_SetMacReg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C); - //PHY_SetMacReg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C); - DBG_8192C("%s()!!!!! 0x460 = 0x%x\n" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord)); + rtw_write32(padapter, 0x508 , 0x00a422); /* Disable EDCA BE Txop for MP pkt tx adjust Packet interval */ + /* RTW_INFO("%s:write 0x508~~~~~~ 0x%x\n", __func__,rtw_read32(padapter, 0x508)); */ + PHY_SetMacReg(padapter, 0x458 , bMaskDWord , 0x0); + /* RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord)); */ + PHY_SetMacReg(padapter, 0x460 , bMaskLWord , 0x0); /* fast EDCA queue packet interval & time out vaule */ + /* PHY_SetMacReg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C); */ + /* PHY_SetMacReg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C); */ + /* PHY_SetMacReg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C); */ + RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" , __func__, PHY_QueryBBReg(padapter, 0x460, bMaskDWord)); } void SetPacketTx(PADAPTER padapter) { - u8 *ptr, *pkt_start, *pkt_end,*fctrl; - u32 pkt_size,offset,startPlace,i; + u8 *ptr, *pkt_start, *pkt_end, *fctrl; + u32 pkt_size, offset, startPlace, i; struct rtw_ieee80211_hdr *hdr; u8 payload; s32 bmcast; @@ -1631,13 +1767,14 @@ void SetPacketTx(PADAPTER padapter) struct mp_priv *pmp_priv; pmp_priv = &padapter->mppriv; - - if (pmp_priv->tx.stop) return; + + if (pmp_priv->tx.stop) + return; pmp_priv->tx.sended = 0; pmp_priv->tx.stop = 0; pmp_priv->tx_pktcount = 0; - //3 1. update_attrib() + /* 3 1. update_attrib() */ pattrib = &pmp_priv->tx.attrib; _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); @@ -1651,10 +1788,10 @@ void SetPacketTx(PADAPTER padapter) pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); } pattrib->mbssid = 0; - + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen; - //3 2. allocate xmit buffer + /* 3 2. allocate xmit buffer */ pkt_size = pattrib->last_txcmdsz; if (pmp_priv->tx.pallocated_buf) @@ -1663,7 +1800,7 @@ void SetPacketTx(PADAPTER padapter) pmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ; pmp_priv->tx.pallocated_buf = rtw_zmalloc(pmp_priv->tx.buf_size); if (pmp_priv->tx.pallocated_buf == NULL) { - DBG_871X("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size); + RTW_INFO("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size); return; } pmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ); @@ -1673,101 +1810,115 @@ void SetPacketTx(PADAPTER padapter) pkt_start = ptr; pkt_end = pkt_start + pkt_size; - //3 3. init TX descriptor + /* 3 3. init TX descriptor */ #if defined(CONFIG_RTL8188E) - if(IS_HARDWARE_TYPE_8188E(padapter)) + if (IS_HARDWARE_TYPE_8188E(padapter)) fill_tx_desc_8188e(padapter); #endif #if defined(CONFIG_RTL8814A) - if(IS_HARDWARE_TYPE_8814A(padapter)) + if (IS_HARDWARE_TYPE_8814A(padapter)) fill_tx_desc_8814a(padapter); #endif /* defined(CONFIG_RTL8814A) */ +#if defined(CONFIG_RTL8822B) + if (IS_HARDWARE_TYPE_8822B(padapter)) + rtl8822b_prepare_mp_txdesc(padapter, pmp_priv); +#endif /* CONFIG_RTL8822B */ + +#if defined(CONFIG_RTL8821C) + if (IS_HARDWARE_TYPE_8821C(padapter)) + rtl8821c_prepare_mp_txdesc(padapter, pmp_priv); +#endif /* CONFIG_RTL8821C */ + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) - if(IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) + if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) fill_tx_desc_8812a(padapter); #endif #if defined(CONFIG_RTL8192E) - if(IS_HARDWARE_TYPE_8192E(padapter)) + if (IS_HARDWARE_TYPE_8192E(padapter)) fill_tx_desc_8192e(padapter); #endif #if defined(CONFIG_RTL8723B) - if(IS_HARDWARE_TYPE_8723B(padapter)) + if (IS_HARDWARE_TYPE_8723B(padapter)) fill_tx_desc_8723b(padapter); #endif #if defined(CONFIG_RTL8703B) if (IS_HARDWARE_TYPE_8703B(padapter)) fill_tx_desc_8703b(padapter); #endif - + #if defined(CONFIG_RTL8188F) if (IS_HARDWARE_TYPE_8188F(padapter)) fill_tx_desc_8188f(padapter); #endif - //3 4. make wlan header, make_wlanhdr() +#if defined(CONFIG_RTL8723D) + if (IS_HARDWARE_TYPE_8723D(padapter)) + fill_tx_desc_8723d(padapter); +#endif + + /* 3 4. make wlan header, make_wlanhdr() */ hdr = (struct rtw_ieee80211_hdr *)pkt_start; SetFrameSubType(&hdr->frame_ctl, pattrib->subtype); - // + /* */ SetFrDs(&hdr->frame_ctl); - _rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); // DA - _rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); // SA - _rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); // RA, BSSID + _rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); /* DA */ + _rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); /* SA */ + _rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); /* RA, BSSID */ - //3 5. make payload + /* 3 5. make payload */ ptr = pkt_start + pattrib->hdrlen; switch (pmp_priv->tx.payload) { - case 0: - payload = 0x00; - break; - case 1: - payload = 0x5a; - break; - case 2: - payload = 0xa5; - break; - case 3: - payload = 0xff; - break; - default: - payload = 0x00; - break; + case 0: + payload = 0x00; + break; + case 1: + payload = 0x5a; + break; + case 2: + payload = 0xa5; + break; + case 3: + payload = 0xff; + break; + default: + payload = 0x00; + break; } pmp_priv->TXradomBuffer = rtw_zmalloc(4096); - if(pmp_priv->TXradomBuffer == NULL) - { - DBG_871X("mp create random buffer fail!\n"); + if (pmp_priv->TXradomBuffer == NULL) { + RTW_INFO("mp create random buffer fail!\n"); goto exit; } - - - for(i=0;i<4096;i++) - pmp_priv->TXradomBuffer[i] = rtw_random32() %0xFF; - - //startPlace = (u32)(rtw_random32() % 3450); - _rtw_memcpy(ptr, pmp_priv->TXradomBuffer,pkt_end - ptr); - //_rtw_memset(ptr, payload, pkt_end - ptr); - rtw_mfree(pmp_priv->TXradomBuffer,4096); - - //3 6. start thread + + + for (i = 0; i < 4096; i++) + pmp_priv->TXradomBuffer[i] = rtw_random32() % 0xFF; + + /* startPlace = (u32)(rtw_random32() % 3450); */ + _rtw_memcpy(ptr, pmp_priv->TXradomBuffer, pkt_end - ptr); + /* _rtw_memset(ptr, payload, pkt_end - ptr); */ + rtw_mfree(pmp_priv->TXradomBuffer, 4096); + + /* 3 6. start thread */ #ifdef PLATFORM_LINUX pmp_priv->tx.PktTxThread = kthread_run(mp_xmit_packet_thread, pmp_priv, "RTW_MP_THREAD"); if (IS_ERR(pmp_priv->tx.PktTxThread)) - DBG_871X("Create PktTx Thread Fail !!!!!\n"); + RTW_INFO("Create PktTx Thread Fail !!!!!\n"); #endif #ifdef PLATFORM_FREEBSD -{ - struct proc *p; - struct thread *td; - pmp_priv->tx.PktTxThread = kproc_kthread_add(mp_xmit_packet_thread, pmp_priv, - &p, &td, RFHIGHPID, 0, "MPXmitThread", "MPXmitThread"); + { + struct proc *p; + struct thread *td; + pmp_priv->tx.PktTxThread = kproc_kthread_add(mp_xmit_packet_thread, pmp_priv, + &p, &td, RFHIGHPID, 0, "MPXmitThread", "MPXmitThread"); - if (pmp_priv->tx.PktTxThread < 0) - DBG_871X("Create PktTx Thread Fail !!!!!\n"); -} + if (pmp_priv->tx.PktTxThread < 0) + RTW_INFO("Create PktTx Thread Fail !!!!!\n"); + } #endif Rtw_MPSetMacTxEDCA(padapter); @@ -1777,50 +1928,44 @@ exit: void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB) { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); struct mp_priv *pmppriv = &pAdapter->mppriv; - u8 type; - type = _HW_STATE_AP_; - if(bStartRx) - { + + + if (bStartRx) { #ifdef CONFIG_RTL8723B - PHY_SetMacReg(pAdapter, 0xe70, BIT23|BIT22, 0x3);// Power on adc (in RX_WAIT_CCA state) - write_bbreg(pAdapter, 0xa01, BIT0, bDisable);// improve Rx performance by jerry + PHY_SetMacReg(pAdapter, 0xe70, BIT23 | BIT22, 0x3); /* Power on adc (in RX_WAIT_CCA state) */ + write_bbreg(pAdapter, 0xa01, BIT0, bDisable);/* improve Rx performance by jerry */ #endif - if( pmppriv->bSetRxBssid == _TRUE ){ - //pHalData->ReceiveConfig = RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYST_RXFF; - pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AB |RCR_AMF | RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYST_RXFF ; - pHalData->ReceiveConfig |= ACRC32; - - DBG_8192C("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n",__func__, - pmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]); - //Set_MSR(pAdapter, WIFI_FW_AP_STATE); - //rtw_hal_set_hwreg(pAdapter, HW_VAR_BSSID, pmppriv->network_macaddr); - //rtw_hal_set_hwreg(pAdapter, HW_VAR_SET_OPMODE, (u8 *)(&type)); + pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AMF | RCR_HTC_LOC_CTRL; + pHalData->ReceiveConfig |= RCR_ACRC32; + pHalData->ReceiveConfig |= RCR_APP_PHYST_RXFF | RCR_APP_ICV | RCR_APP_MIC; + + if (pmppriv->bSetRxBssid == _TRUE) { + RTW_INFO("%s: pmppriv->network_macaddr=" MAC_FMT "\n", __func__, + MAC_ARG(pmppriv->network_macaddr)); + + /* Set_MSR(pAdapter, WIFI_FW_AP_STATE); */ + /* rtw_hal_set_hwreg(pAdapter, HW_VAR_BSSID, pmppriv->network_macaddr); */ + /* rtw_hal_set_hwreg(pAdapter, HW_VAR_SET_OPMODE, (u8 *)(&type)); */ + } else { + pHalData->ReceiveConfig |= RCR_ADF; + + /* Accept all data frames */ + rtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF); } - else - { - pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; - pHalData->ReceiveConfig |= ACRC32; - rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); - // Accept all data frames - rtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF); - // Accept CRC error and destination address - } - } - else - { + + if (bAB) + pHalData->ReceiveConfig |= RCR_AB; + } else { #ifdef CONFIG_RTL8723B - PHY_SetMacReg(pAdapter, 0xe70, BIT23|BIT22, 0x00);// Power off adc (in RX_WAIT_CCA state) - write_bbreg(pAdapter, 0xa01, BIT0, bEnable);// improve Rx performance by jerry + PHY_SetMacReg(pAdapter, 0xe70, BIT23 | BIT22, 0x00); /* Power off adc (in RX_WAIT_CCA state) */ + write_bbreg(pAdapter, 0xa01, BIT0, bEnable);/* improve Rx performance by jerry */ #endif - rtw_write32(pAdapter, REG_RCR, 0); + pHalData->ReceiveConfig = 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)); + rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); } void ResetPhyRxPktCount(PADAPTER pAdapter) @@ -1829,21 +1974,21 @@ void ResetPhyRxPktCount(PADAPTER pAdapter) for (i = 0; i <= 0xF; i++) { phyrx_set = 0; - phyrx_set |= _RXERR_RPT_SEL(i); //select - phyrx_set |= RXERR_RPT_RST; // set counter to zero + phyrx_set |= _RXERR_RPT_SEL(i); /* select */ + phyrx_set |= RXERR_RPT_RST; /* set counter to zero */ rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); } } static u32 GetPhyRxPktCounts(PADAPTER pAdapter, u32 selbit) { - //selection + /* selection */ u32 phyrx_set = 0, count = 0; phyrx_set = _RXERR_RPT_SEL(selbit & 0xF); rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); - //Read packet count + /* Read packet count */ count = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK; return count; @@ -1871,19 +2016,19 @@ u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter) return OFDM_cnt + CCK_cnt + HT_cnt; } -//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 +/* 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 */ static u32 rtw_GetPSDData(PADAPTER pAdapter, u32 point) { - u32 psd_val=0; - -#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) + u32 psd_val = 0; + +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) u16 psd_reg = 0x910; - u16 psd_regL= 0xF44; -#else + u16 psd_regL = 0xF44; +#else u16 psd_reg = 0x808; - u16 psd_regL= 0x8B4; + u16 psd_regL = 0x8B4; #endif psd_val = rtw_read32(pAdapter, psd_reg); @@ -1914,106 +2059,92 @@ static u32 rtw_GetPSDData(PADAPTER pAdapter, u32 point) */ u32 mp_query_psd(PADAPTER pAdapter, u8 *data) { - u32 i, psd_pts=0, psd_start=0, psd_stop=0; - u32 psd_data=0; + u32 i, psd_pts = 0, psd_start = 0, psd_stop = 0; + u32 psd_data = 0; #ifdef PLATFORM_LINUX if (!netif_running(pAdapter->pnetdev)) { - RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! interface not opened!\n")); return 0; } #endif if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { - RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! not in MP mode!\n")); return 0; } - if (strlen(data) == 0) { //default value + if (strlen(data) == 0) { /* default value */ psd_pts = 128; psd_start = 64; - psd_stop = 128; - } else { + psd_stop = 128; + } else sscanf(data, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop); - } - - data[0]='\0'; + + data[0] = '\0'; i = psd_start; - while (i < psd_stop) - { - if (i >= psd_pts) { - psd_data = rtw_GetPSDData(pAdapter, i-psd_pts); - } else { + while (i < psd_stop) { + if (i >= psd_pts) + psd_data = rtw_GetPSDData(pAdapter, i - psd_pts); + else psd_data = rtw_GetPSDData(pAdapter, i); - } sprintf(data, "%s%x ", data, psd_data); i++; } - #ifdef CONFIG_LONG_DELAY_ISSUE +#ifdef CONFIG_LONG_DELAY_ISSUE rtw_msleep_os(100); - #else +#else rtw_mdelay_os(100); - #endif +#endif - return strlen(data)+1; + return strlen(data) + 1; } #if 0 -void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv) +void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv) { - int i,res; - _adapter *padapter = pxmitpriv->adapter; - struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf; + int i, res; + _adapter *padapter = pxmitpriv->adapter; + struct xmit_frame *pxmitframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf; struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf; - + u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ; u32 num_xmit_extbuf = NR_XMIT_EXTBUFF; - if(padapter->registrypriv.mp_mode ==0) - { + if (padapter->registrypriv.mp_mode == 0) { max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ; num_xmit_extbuf = NR_XMIT_EXTBUFF; - } - else - { - max_xmit_extbuf_size = 6000; - num_xmit_extbuf = 8; + } else { + max_xmit_extbuf_size = 6000; + num_xmit_extbuf = 8; } pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; - for(i=0; ipallocated_xmit_extbuf) { + if (pxmitpriv->pallocated_xmit_extbuf) rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, num_xmit_extbuf * sizeof(struct xmit_buf) + 4); - } - if(padapter->registrypriv.mp_mode ==0) - { - max_xmit_extbuf_size = 6000; - num_xmit_extbuf = 8; - } - else - { + if (padapter->registrypriv.mp_mode == 0) { + max_xmit_extbuf_size = 6000; + num_xmit_extbuf = 8; + } else { max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ; num_xmit_extbuf = NR_XMIT_EXTBUFF; } - - // Init xmit extension buff + + /* Init xmit extension buff */ _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue); pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4); - - if (pxmitpriv->pallocated_xmit_extbuf == NULL){ - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n")); - res= _FAIL; + + if (pxmitpriv->pallocated_xmit_extbuf == NULL) { + res = _FAIL; goto exit; } @@ -2021,19 +2152,19 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv) pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; - for (i = 0; i < num_xmit_extbuf; i++) - { + for (i = 0; i < num_xmit_extbuf; i++) { _rtw_init_listhead(&pxmitbuf->list); pxmitbuf->priv_data = NULL; pxmitbuf->padapter = padapter; pxmitbuf->buf_tag = XMITBUF_MGNT; - if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) { - res= _FAIL; + res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE); + if (res == _FAIL) { + res = _FAIL; goto exit; } - + #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) pxmitbuf->phead = pxmitbuf->pbuf; pxmitbuf->pend = pxmitbuf->pbuf + max_xmit_extbuf_size; @@ -2042,11 +2173,11 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv) #endif rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue)); - #ifdef DBG_XMIT_BUF_EXT - pxmitbuf->no=i; - #endif +#ifdef DBG_XMIT_BUF_EXT + pxmitbuf->no = i; +#endif pxmitbuf++; - + } pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf; @@ -2056,512 +2187,511 @@ exit: } #endif - -ULONG getPowerDiffByRate8188E( - IN PADAPTER pAdapter, - IN u1Byte CurrChannel, - IN ULONG RfPath - ) -{ - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - ULONG PwrGroup=0; - ULONG TxPower=0, Limit=0; - ULONG Pathmapping = (RfPath == ODM_RF_PATH_A?0:8); - - switch(pHalData->EEPROMRegulatory) - { - case 0: // driver-defined maximum power offset for longer communication range - // refer to power by rate table - PwrGroup = 0; - Limit = 0xff; - break; - case 1: // Power-limit table-defined maximum power offset range - // choosed by min(power by rate, power limit). - { - if(pHalData->pwrGroupCnt == 1) - PwrGroup = 0; - if(pHalData->pwrGroupCnt >= 3) - { - if(CurrChannel <= 3) - PwrGroup = 0; - else if(CurrChannel >= 4 && CurrChannel <= 9) - PwrGroup = 1; - else if(CurrChannel > 9) - PwrGroup = 2; - - if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) - PwrGroup++; - else - PwrGroup+=4; - } - Limit = 0xff; - } - break; - case 2: // not support power offset by rate. - // don't increase any power diff - PwrGroup = 0; - Limit = 0; - break; - default: - PwrGroup = 0; - Limit = 0xff; - break; - } - - - { - switch(pMptCtx->MptRateIndex) - { - case MPT_RATE_1M: - case MPT_RATE_2M: - case MPT_RATE_55M: - case MPT_RATE_11M: - //CCK rates, don't add any tx power index. - //RT_DISP(FPHY, PHY_TXPWR,("CCK rates!\n")); - break; - case MPT_RATE_6M: //0xe00 [31:0] = 18M,12M,09M,06M - TxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0+Pathmapping])&0xff); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, OFDM 6M, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0], TxPower)); - break; - case MPT_RATE_9M: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0+Pathmapping])&0xff00)>>8); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, OFDM 9M, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0], TxPower)); - break; - case MPT_RATE_12M: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0+Pathmapping])&0xff0000)>>16); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, OFDM 12M, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0], TxPower)); - break; - case MPT_RATE_18M: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0+Pathmapping])&0xff000000)>>24); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, OFDM 24M, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0], TxPower)); - break; - case MPT_RATE_24M: //0xe04[31:0] = 54M,48M,36M,24M - TxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1+Pathmapping])&0xff); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, OFDM 24M, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1], TxPower)); - break; - case MPT_RATE_36M: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1+Pathmapping])&0xff00)>>8); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, OFDM 36M, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1], TxPower)); - break; - case MPT_RATE_48M: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1+Pathmapping])&0xff0000)>>16); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, OFDM 48M, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1], TxPower)); - break; - case MPT_RATE_54M: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1+Pathmapping])&0xff000000)>>24); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, OFDM 54M, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1], TxPower)); - break; - case MPT_RATE_MCS0: //0xe10[31:0]= MCS=03,02,01,00 - TxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2+Pathmapping])&0xff); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, MCS0, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2], TxPower)); - break; - case MPT_RATE_MCS1: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2+Pathmapping])&0xff00)>>8); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, MCS1, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2], TxPower)); - break; - case MPT_RATE_MCS2: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2+Pathmapping])&0xff0000)>>16); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, MCS2, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2], TxPower)); - break; - case MPT_RATE_MCS3: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2+Pathmapping])&0xff000000)>>24); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, MCS3, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2], TxPower)); - break; - case MPT_RATE_MCS4: //0xe14[31:0]= MCS=07,06,05,04 - TxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3+Pathmapping])&0xff); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, MCS4, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3], TxPower)); - break; - case MPT_RATE_MCS5: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3+Pathmapping])&0xff00)>>8); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, MCS5, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3], TxPower)); - break; - case MPT_RATE_MCS6: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3+Pathmapping])&0xff0000)>>16); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, MCS6, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3], TxPower)); - break; - case MPT_RATE_MCS7: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3+Pathmapping])&0xff000000)>>24); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, MCS7, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3], TxPower)); - break; - - case MPT_RATE_MCS8: //0xe18[31:0]= MCS=11,10,09,08 - TxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4+Pathmapping])&0xff); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, MCS8, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4], TxPower)); - break; - case MPT_RATE_MCS9: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4+Pathmapping])&0xff00)>>8); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, MCS9, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4], TxPower)); - break; - case MPT_RATE_MCS10: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4+Pathmapping])&0xff0000)>>16); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, MCS10, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4], TxPower)); - break; - case MPT_RATE_MCS11: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4+Pathmapping])&0xff000000)>>24); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, MCS11, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4], TxPower)); - break; - case MPT_RATE_MCS12: //0xe1c[31:0]= MCS=15,14,13,12 - TxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5+Pathmapping])&0xff); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, MCS12, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5], TxPower)); - break; - case MPT_RATE_MCS13: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5+Pathmapping])&0xff00)>>8); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, MCS13, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5], TxPower)); - break; - case MPT_RATE_MCS14: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5+Pathmapping])&0xff0000)>>16); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, MCS14, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5], TxPower)); - break; - case MPT_RATE_MCS15: - TxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5+Pathmapping])&0xff000000)>>24); - //RT_DISP(FPHY, PHY_TXPWR,("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, MCS15, TxPower = %d\n", - // PwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5], TxPower)); - break; - default: - break; - } - } - - if(TxPower > Limit) - TxPower = Limit; - - return TxPower; -} - - - -static ULONG -mpt_ProQueryCalTxPower_8188E( - IN PADAPTER pAdapter, - IN u1Byte RfPath - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u1Byte TxCount=TX_1S, i = 0; //default set to 1S - //PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo); - ULONG TxPower = 1, PwrGroup=0, PowerDiffByRate=0; - ULONG TxPowerCCK = 1, TxPowerOFDM = 1, TxPowerBW20 = 1, TxPowerBW40 = 1 ; - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); - u1Byte CurrChannel = pHalData->CurrentChannel; - u1Byte index = (CurrChannel -1); - u1Byte rf_path=(RfPath), rfPath; - u1Byte limit = 0, rate = 0; - - if(HAL_IsLegalChannel(pAdapter, CurrChannel) == FALSE) - { - CurrChannel = 1; - } - - if(pMptCtx->MptRateIndex <= MPT_RATE_11M ) - { - TxPower = pHalData->Index24G_CCK_Base[rf_path][index]; - } - else if(pMptCtx->MptRateIndex >= MPT_RATE_6M && - pMptCtx->MptRateIndex <= MPT_RATE_54M ) - { - TxPower = pHalData->Index24G_BW40_Base[rf_path][index]; - } - else if(pMptCtx->MptRateIndex >= MPT_RATE_MCS0 && - pMptCtx->MptRateIndex <= MPT_RATE_MCS7 ) - { - TxPower = pHalData->Index24G_BW40_Base[rf_path][index]; - } - - //RT_DISP(FPHY, PHY_TXPWR, ("HT40 rate(%d) Tx power(RF-%c) = 0x%x\n", pMptCtx->MptRateIndex, ((rf_path==0)?'A':'B'), TxPower)); - - - if(pMptCtx->MptRateIndex >= MPT_RATE_6M && - pMptCtx->MptRateIndex <= MPT_RATE_54M ) - { - TxPower += pHalData->OFDM_24G_Diff[rf_path][TxCount]; - ///RT_DISP(FPHY, PHY_TXPWR, ("+OFDM_PowerDiff(RF-%c) = 0x%x\n", ((rf_path==0)?'A':'B'), - // pHalData->OFDM_24G_Diff[rf_path][TxCount])); - } - - if(pMptCtx->MptRateIndex >= MPT_RATE_MCS0) - { - if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) - { - TxPower += pHalData->BW20_24G_Diff[rf_path][TxCount]; - // RT_DISP(FPHY, PHY_TXPWR, ("+HT20_PowerDiff(RF-%c) = 0x%x\n", ((rf_path==0)?'A':'B'), - // pHalData->BW20_24G_Diff[rf_path][TxCount])); - } - } - - -#ifdef ENABLE_POWER_BY_RATE - PowerDiffByRate = getPowerDiffByRate8188E(pAdapter, CurrChannel, RfPath); -#else - PowerDiffByRate = 0; -#endif - - // 2012/11/02 Awk: add power limit mechansim - if( pMptCtx->MptRateIndex <= MPT_RATE_11M ) - { - rate = MGN_1M; - } - else if(pMptCtx->MptRateIndex >= MPT_RATE_6M && - pMptCtx->MptRateIndex <= MPT_RATE_54M ) - { - rate = MGN_54M; - } - else if(pMptCtx->MptRateIndex >= MPT_RATE_MCS0 && - pMptCtx->MptRateIndex <= MPT_RATE_MCS7 ) - { - rate = MGN_MCS7; - } - - limit = (u8)PHY_GetTxPowerLimit(pAdapter, pMptCtx->RegTxPwrLimit, - pHalData->CurrentBandType, - pHalData->CurrentChannelBW,RfPath, - rate, CurrChannel); - - //RT_DISP(FPHY, PHY_TXPWR, ("+PowerDiffByRate(RF-%c) = 0x%x\n", ((rf_path==0)?'A':'B'), - // PowerDiffByRate)); - TxPower += PowerDiffByRate; - //RT_DISP(FPHY, PHY_TXPWR, ("PowerDiffByRate limit value(RF-%c) = %d\n", ((rf_path==0)?'A':'B'), - // limit)); - - TxPower += limit > (s8) PowerDiffByRate ? PowerDiffByRate : limit; - - return TxPower; -} - - -u8 +u8 MptToMgntRate( IN ULONG MptRateIdx - ) +) { -// Mapped to MGN_XXX defined in MgntGen.h - switch (MptRateIdx) - { - /* CCK rate. */ - case MPT_RATE_1M: return MGN_1M; - case MPT_RATE_2M: return MGN_2M; - case MPT_RATE_55M: return MGN_5_5M; - case MPT_RATE_11M: return MGN_11M; - - /* OFDM rate. */ - case MPT_RATE_6M: return MGN_6M; - case MPT_RATE_9M: return MGN_9M; - case MPT_RATE_12M: return MGN_12M; - case MPT_RATE_18M: return MGN_18M; - case MPT_RATE_24M: return MGN_24M; - case MPT_RATE_36M: return MGN_36M; - case MPT_RATE_48M: return MGN_48M; - case MPT_RATE_54M: return MGN_54M; - - /* HT rate. */ - case MPT_RATE_MCS0: return MGN_MCS0; - case MPT_RATE_MCS1: return MGN_MCS1; - case MPT_RATE_MCS2: return MGN_MCS2; - case MPT_RATE_MCS3: return MGN_MCS3; - case MPT_RATE_MCS4: return MGN_MCS4; - case MPT_RATE_MCS5: return MGN_MCS5; - case MPT_RATE_MCS6: return MGN_MCS6; - case MPT_RATE_MCS7: return MGN_MCS7; - case MPT_RATE_MCS8: return MGN_MCS8; - case MPT_RATE_MCS9: return MGN_MCS9; - case MPT_RATE_MCS10: return MGN_MCS10; - case MPT_RATE_MCS11: return MGN_MCS11; - case MPT_RATE_MCS12: return MGN_MCS12; - case MPT_RATE_MCS13: return MGN_MCS13; - case MPT_RATE_MCS14: return MGN_MCS14; - case MPT_RATE_MCS15: return MGN_MCS15; - case MPT_RATE_MCS16: return MGN_MCS16; - case MPT_RATE_MCS17: return MGN_MCS17; - case MPT_RATE_MCS18: return MGN_MCS18; - case MPT_RATE_MCS19: return MGN_MCS19; - case MPT_RATE_MCS20: return MGN_MCS20; - case MPT_RATE_MCS21: return MGN_MCS21; - case MPT_RATE_MCS22: return MGN_MCS22; - case MPT_RATE_MCS23: return MGN_MCS23; - case MPT_RATE_MCS24: return MGN_MCS24; - case MPT_RATE_MCS25: return MGN_MCS25; - case MPT_RATE_MCS26: return MGN_MCS26; - case MPT_RATE_MCS27: return MGN_MCS27; - case MPT_RATE_MCS28: return MGN_MCS28; - case MPT_RATE_MCS29: return MGN_MCS29; - case MPT_RATE_MCS30: return MGN_MCS30; - case MPT_RATE_MCS31: return MGN_MCS31; - - /* VHT rate. */ - case MPT_RATE_VHT1SS_MCS0: return MGN_VHT1SS_MCS0; - case MPT_RATE_VHT1SS_MCS1: return MGN_VHT1SS_MCS1; - case MPT_RATE_VHT1SS_MCS2: return MGN_VHT1SS_MCS2; - case MPT_RATE_VHT1SS_MCS3: return MGN_VHT1SS_MCS3; - case MPT_RATE_VHT1SS_MCS4: return MGN_VHT1SS_MCS4; - case MPT_RATE_VHT1SS_MCS5: return MGN_VHT1SS_MCS5; - case MPT_RATE_VHT1SS_MCS6: return MGN_VHT1SS_MCS6; - case MPT_RATE_VHT1SS_MCS7: return MGN_VHT1SS_MCS7; - case MPT_RATE_VHT1SS_MCS8: return MGN_VHT1SS_MCS8; - case MPT_RATE_VHT1SS_MCS9: return MGN_VHT1SS_MCS9; - case MPT_RATE_VHT2SS_MCS0: return MGN_VHT2SS_MCS0; - case MPT_RATE_VHT2SS_MCS1: return MGN_VHT2SS_MCS1; - case MPT_RATE_VHT2SS_MCS2: return MGN_VHT2SS_MCS2; - case MPT_RATE_VHT2SS_MCS3: return MGN_VHT2SS_MCS3; - case MPT_RATE_VHT2SS_MCS4: return MGN_VHT2SS_MCS4; - case MPT_RATE_VHT2SS_MCS5: return MGN_VHT2SS_MCS5; - case MPT_RATE_VHT2SS_MCS6: return MGN_VHT2SS_MCS6; - case MPT_RATE_VHT2SS_MCS7: return MGN_VHT2SS_MCS7; - case MPT_RATE_VHT2SS_MCS8: return MGN_VHT2SS_MCS8; - case MPT_RATE_VHT2SS_MCS9: return MGN_VHT2SS_MCS9; - case MPT_RATE_VHT3SS_MCS0: return MGN_VHT3SS_MCS0; - case MPT_RATE_VHT3SS_MCS1: return MGN_VHT3SS_MCS1; - case MPT_RATE_VHT3SS_MCS2: return MGN_VHT3SS_MCS2; - case MPT_RATE_VHT3SS_MCS3: return MGN_VHT3SS_MCS3; - case MPT_RATE_VHT3SS_MCS4: return MGN_VHT3SS_MCS4; - case MPT_RATE_VHT3SS_MCS5: return MGN_VHT3SS_MCS5; - case MPT_RATE_VHT3SS_MCS6: return MGN_VHT3SS_MCS6; - case MPT_RATE_VHT3SS_MCS7: return MGN_VHT3SS_MCS7; - case MPT_RATE_VHT3SS_MCS8: return MGN_VHT3SS_MCS8; - case MPT_RATE_VHT3SS_MCS9: return MGN_VHT3SS_MCS9; - case MPT_RATE_VHT4SS_MCS0: return MGN_VHT4SS_MCS0; - case MPT_RATE_VHT4SS_MCS1: return MGN_VHT4SS_MCS1; - case MPT_RATE_VHT4SS_MCS2: return MGN_VHT4SS_MCS2; - case MPT_RATE_VHT4SS_MCS3: return MGN_VHT4SS_MCS3; - case MPT_RATE_VHT4SS_MCS4: return MGN_VHT4SS_MCS4; - case MPT_RATE_VHT4SS_MCS5: return MGN_VHT4SS_MCS5; - case MPT_RATE_VHT4SS_MCS6: return MGN_VHT4SS_MCS6; - case MPT_RATE_VHT4SS_MCS7: return MGN_VHT4SS_MCS7; - case MPT_RATE_VHT4SS_MCS8: return MGN_VHT4SS_MCS8; - case MPT_RATE_VHT4SS_MCS9: return MGN_VHT4SS_MCS9; - - case MPT_RATE_LAST: // fully automatiMGN_VHT2SS_MCS1; - default: - DBG_871X("<===MptToMgntRate(), Invalid Rate: %d!!\n", MptRateIdx); - return 0x0; - } -} + /* Mapped to MGN_XXX defined in MgntGen.h */ + switch (MptRateIdx) { + /* CCK rate. */ + case MPT_RATE_1M: + return MGN_1M; + case MPT_RATE_2M: + return MGN_2M; + case MPT_RATE_55M: + return MGN_5_5M; + case MPT_RATE_11M: + return MGN_11M; + + /* OFDM rate. */ + case MPT_RATE_6M: + return MGN_6M; + case MPT_RATE_9M: + return MGN_9M; + case MPT_RATE_12M: + return MGN_12M; + case MPT_RATE_18M: + return MGN_18M; + case MPT_RATE_24M: + return MGN_24M; + case MPT_RATE_36M: + return MGN_36M; + case MPT_RATE_48M: + return MGN_48M; + case MPT_RATE_54M: + return MGN_54M; + + /* HT rate. */ + case MPT_RATE_MCS0: + return MGN_MCS0; + case MPT_RATE_MCS1: + return MGN_MCS1; + case MPT_RATE_MCS2: + return MGN_MCS2; + case MPT_RATE_MCS3: + return MGN_MCS3; + case MPT_RATE_MCS4: + return MGN_MCS4; + case MPT_RATE_MCS5: + return MGN_MCS5; + case MPT_RATE_MCS6: + return MGN_MCS6; + case MPT_RATE_MCS7: + return MGN_MCS7; + case MPT_RATE_MCS8: + return MGN_MCS8; + case MPT_RATE_MCS9: + return MGN_MCS9; + case MPT_RATE_MCS10: + return MGN_MCS10; + case MPT_RATE_MCS11: + return MGN_MCS11; + case MPT_RATE_MCS12: + return MGN_MCS12; + case MPT_RATE_MCS13: + return MGN_MCS13; + case MPT_RATE_MCS14: + return MGN_MCS14; + case MPT_RATE_MCS15: + return MGN_MCS15; + case MPT_RATE_MCS16: + return MGN_MCS16; + case MPT_RATE_MCS17: + return MGN_MCS17; + case MPT_RATE_MCS18: + return MGN_MCS18; + case MPT_RATE_MCS19: + return MGN_MCS19; + case MPT_RATE_MCS20: + return MGN_MCS20; + case MPT_RATE_MCS21: + return MGN_MCS21; + case MPT_RATE_MCS22: + return MGN_MCS22; + case MPT_RATE_MCS23: + return MGN_MCS23; + case MPT_RATE_MCS24: + return MGN_MCS24; + case MPT_RATE_MCS25: + return MGN_MCS25; + case MPT_RATE_MCS26: + return MGN_MCS26; + case MPT_RATE_MCS27: + return MGN_MCS27; + case MPT_RATE_MCS28: + return MGN_MCS28; + case MPT_RATE_MCS29: + return MGN_MCS29; + case MPT_RATE_MCS30: + return MGN_MCS30; + case MPT_RATE_MCS31: + return MGN_MCS31; + + /* VHT rate. */ + case MPT_RATE_VHT1SS_MCS0: + return MGN_VHT1SS_MCS0; + case MPT_RATE_VHT1SS_MCS1: + return MGN_VHT1SS_MCS1; + case MPT_RATE_VHT1SS_MCS2: + return MGN_VHT1SS_MCS2; + case MPT_RATE_VHT1SS_MCS3: + return MGN_VHT1SS_MCS3; + case MPT_RATE_VHT1SS_MCS4: + return MGN_VHT1SS_MCS4; + case MPT_RATE_VHT1SS_MCS5: + return MGN_VHT1SS_MCS5; + case MPT_RATE_VHT1SS_MCS6: + return MGN_VHT1SS_MCS6; + case MPT_RATE_VHT1SS_MCS7: + return MGN_VHT1SS_MCS7; + case MPT_RATE_VHT1SS_MCS8: + return MGN_VHT1SS_MCS8; + case MPT_RATE_VHT1SS_MCS9: + return MGN_VHT1SS_MCS9; + case MPT_RATE_VHT2SS_MCS0: + return MGN_VHT2SS_MCS0; + case MPT_RATE_VHT2SS_MCS1: + return MGN_VHT2SS_MCS1; + case MPT_RATE_VHT2SS_MCS2: + return MGN_VHT2SS_MCS2; + case MPT_RATE_VHT2SS_MCS3: + return MGN_VHT2SS_MCS3; + case MPT_RATE_VHT2SS_MCS4: + return MGN_VHT2SS_MCS4; + case MPT_RATE_VHT2SS_MCS5: + return MGN_VHT2SS_MCS5; + case MPT_RATE_VHT2SS_MCS6: + return MGN_VHT2SS_MCS6; + case MPT_RATE_VHT2SS_MCS7: + return MGN_VHT2SS_MCS7; + case MPT_RATE_VHT2SS_MCS8: + return MGN_VHT2SS_MCS8; + case MPT_RATE_VHT2SS_MCS9: + return MGN_VHT2SS_MCS9; + case MPT_RATE_VHT3SS_MCS0: + return MGN_VHT3SS_MCS0; + case MPT_RATE_VHT3SS_MCS1: + return MGN_VHT3SS_MCS1; + case MPT_RATE_VHT3SS_MCS2: + return MGN_VHT3SS_MCS2; + case MPT_RATE_VHT3SS_MCS3: + return MGN_VHT3SS_MCS3; + case MPT_RATE_VHT3SS_MCS4: + return MGN_VHT3SS_MCS4; + case MPT_RATE_VHT3SS_MCS5: + return MGN_VHT3SS_MCS5; + case MPT_RATE_VHT3SS_MCS6: + return MGN_VHT3SS_MCS6; + case MPT_RATE_VHT3SS_MCS7: + return MGN_VHT3SS_MCS7; + case MPT_RATE_VHT3SS_MCS8: + return MGN_VHT3SS_MCS8; + case MPT_RATE_VHT3SS_MCS9: + return MGN_VHT3SS_MCS9; + case MPT_RATE_VHT4SS_MCS0: + return MGN_VHT4SS_MCS0; + case MPT_RATE_VHT4SS_MCS1: + return MGN_VHT4SS_MCS1; + case MPT_RATE_VHT4SS_MCS2: + return MGN_VHT4SS_MCS2; + case MPT_RATE_VHT4SS_MCS3: + return MGN_VHT4SS_MCS3; + case MPT_RATE_VHT4SS_MCS4: + return MGN_VHT4SS_MCS4; + case MPT_RATE_VHT4SS_MCS5: + return MGN_VHT4SS_MCS5; + case MPT_RATE_VHT4SS_MCS6: + return MGN_VHT4SS_MCS6; + case MPT_RATE_VHT4SS_MCS7: + return MGN_VHT4SS_MCS7; + case MPT_RATE_VHT4SS_MCS8: + return MGN_VHT4SS_MCS8; + case MPT_RATE_VHT4SS_MCS9: + return MGN_VHT4SS_MCS9; + + case MPT_RATE_LAST: /* fully automatiMGN_VHT2SS_MCS1; */ + default: + RTW_INFO("<===MptToMgntRate(), Invalid Rate: %d!!\n", MptRateIdx); + return 0x0; + } +} + + +u8 HwRateToMPTRate(u8 rate) +{ + u8 ret_rate = MGN_1M; + + switch (rate) { + case DESC_RATE1M: + ret_rate = MPT_RATE_1M; + break; + case DESC_RATE2M: + ret_rate = MPT_RATE_2M; + break; + case DESC_RATE5_5M: + ret_rate = MPT_RATE_55M; + break; + case DESC_RATE11M: + ret_rate = MPT_RATE_11M; + break; + case DESC_RATE6M: + ret_rate = MPT_RATE_6M; + break; + case DESC_RATE9M: + ret_rate = MPT_RATE_9M; + break; + case DESC_RATE12M: + ret_rate = MPT_RATE_12M; + break; + case DESC_RATE18M: + ret_rate = MPT_RATE_18M; + break; + case DESC_RATE24M: + ret_rate = MPT_RATE_24M; + break; + case DESC_RATE36M: + ret_rate = MPT_RATE_36M; + break; + case DESC_RATE48M: + ret_rate = MPT_RATE_48M; + break; + case DESC_RATE54M: + ret_rate = MPT_RATE_54M; + break; + case DESC_RATEMCS0: + ret_rate = MPT_RATE_MCS0; + break; + case DESC_RATEMCS1: + ret_rate = MPT_RATE_MCS1; + break; + case DESC_RATEMCS2: + ret_rate = MPT_RATE_MCS2; + break; + case DESC_RATEMCS3: + ret_rate = MPT_RATE_MCS3; + break; + case DESC_RATEMCS4: + ret_rate = MPT_RATE_MCS4; + break; + case DESC_RATEMCS5: + ret_rate = MPT_RATE_MCS5; + break; + case DESC_RATEMCS6: + ret_rate = MPT_RATE_MCS6; + break; + case DESC_RATEMCS7: + ret_rate = MPT_RATE_MCS7; + break; + case DESC_RATEMCS8: + ret_rate = MPT_RATE_MCS8; + break; + case DESC_RATEMCS9: + ret_rate = MPT_RATE_MCS9; + break; + case DESC_RATEMCS10: + ret_rate = MPT_RATE_MCS10; + break; + case DESC_RATEMCS11: + ret_rate = MPT_RATE_MCS11; + break; + case DESC_RATEMCS12: + ret_rate = MPT_RATE_MCS12; + break; + case DESC_RATEMCS13: + ret_rate = MPT_RATE_MCS13; + break; + case DESC_RATEMCS14: + ret_rate = MPT_RATE_MCS14; + break; + case DESC_RATEMCS15: + ret_rate = MPT_RATE_MCS15; + break; + case DESC_RATEMCS16: + ret_rate = MPT_RATE_MCS16; + break; + case DESC_RATEMCS17: + ret_rate = MPT_RATE_MCS17; + break; + case DESC_RATEMCS18: + ret_rate = MPT_RATE_MCS18; + break; + case DESC_RATEMCS19: + ret_rate = MPT_RATE_MCS19; + break; + case DESC_RATEMCS20: + ret_rate = MPT_RATE_MCS20; + break; + case DESC_RATEMCS21: + ret_rate = MPT_RATE_MCS21; + break; + case DESC_RATEMCS22: + ret_rate = MPT_RATE_MCS22; + break; + case DESC_RATEMCS23: + ret_rate = MPT_RATE_MCS23; + break; + case DESC_RATEMCS24: + ret_rate = MPT_RATE_MCS24; + break; + case DESC_RATEMCS25: + ret_rate = MPT_RATE_MCS25; + break; + case DESC_RATEMCS26: + ret_rate = MPT_RATE_MCS26; + break; + case DESC_RATEMCS27: + ret_rate = MPT_RATE_MCS27; + break; + case DESC_RATEMCS28: + ret_rate = MPT_RATE_MCS28; + break; + case DESC_RATEMCS29: + ret_rate = MPT_RATE_MCS29; + break; + case DESC_RATEMCS30: + ret_rate = MPT_RATE_MCS30; + break; + case DESC_RATEMCS31: + ret_rate = MPT_RATE_MCS31; + break; + case DESC_RATEVHTSS1MCS0: + ret_rate = MPT_RATE_VHT1SS_MCS0; + break; + case DESC_RATEVHTSS1MCS1: + ret_rate = MPT_RATE_VHT1SS_MCS1; + break; + case DESC_RATEVHTSS1MCS2: + ret_rate = MPT_RATE_VHT1SS_MCS2; + break; + case DESC_RATEVHTSS1MCS3: + ret_rate = MPT_RATE_VHT1SS_MCS3; + break; + case DESC_RATEVHTSS1MCS4: + ret_rate = MPT_RATE_VHT1SS_MCS4; + break; + case DESC_RATEVHTSS1MCS5: + ret_rate = MPT_RATE_VHT1SS_MCS5; + break; + case DESC_RATEVHTSS1MCS6: + ret_rate = MPT_RATE_VHT1SS_MCS6; + break; + case DESC_RATEVHTSS1MCS7: + ret_rate = MPT_RATE_VHT1SS_MCS7; + break; + case DESC_RATEVHTSS1MCS8: + ret_rate = MPT_RATE_VHT1SS_MCS8; + break; + case DESC_RATEVHTSS1MCS9: + ret_rate = MPT_RATE_VHT1SS_MCS9; + break; + case DESC_RATEVHTSS2MCS0: + ret_rate = MPT_RATE_VHT2SS_MCS0; + break; + case DESC_RATEVHTSS2MCS1: + ret_rate = MPT_RATE_VHT2SS_MCS1; + break; + case DESC_RATEVHTSS2MCS2: + ret_rate = MPT_RATE_VHT2SS_MCS2; + break; + case DESC_RATEVHTSS2MCS3: + ret_rate = MPT_RATE_VHT2SS_MCS3; + break; + case DESC_RATEVHTSS2MCS4: + ret_rate = MPT_RATE_VHT2SS_MCS4; + break; + case DESC_RATEVHTSS2MCS5: + ret_rate = MPT_RATE_VHT2SS_MCS5; + break; + case DESC_RATEVHTSS2MCS6: + ret_rate = MPT_RATE_VHT2SS_MCS6; + break; + case DESC_RATEVHTSS2MCS7: + ret_rate = MPT_RATE_VHT2SS_MCS7; + break; + case DESC_RATEVHTSS2MCS8: + ret_rate = MPT_RATE_VHT2SS_MCS8; + break; + case DESC_RATEVHTSS2MCS9: + ret_rate = MPT_RATE_VHT2SS_MCS9; + break; + case DESC_RATEVHTSS3MCS0: + ret_rate = MPT_RATE_VHT3SS_MCS0; + break; + case DESC_RATEVHTSS3MCS1: + ret_rate = MPT_RATE_VHT3SS_MCS1; + break; + case DESC_RATEVHTSS3MCS2: + ret_rate = MPT_RATE_VHT3SS_MCS2; + break; + case DESC_RATEVHTSS3MCS3: + ret_rate = MPT_RATE_VHT3SS_MCS3; + break; + case DESC_RATEVHTSS3MCS4: + ret_rate = MPT_RATE_VHT3SS_MCS4; + break; + case DESC_RATEVHTSS3MCS5: + ret_rate = MPT_RATE_VHT3SS_MCS5; + break; + case DESC_RATEVHTSS3MCS6: + ret_rate = MPT_RATE_VHT3SS_MCS6; + break; + case DESC_RATEVHTSS3MCS7: + ret_rate = MPT_RATE_VHT3SS_MCS7; + break; + case DESC_RATEVHTSS3MCS8: + ret_rate = MPT_RATE_VHT3SS_MCS8; + break; + case DESC_RATEVHTSS3MCS9: + ret_rate = MPT_RATE_VHT3SS_MCS9; + break; + case DESC_RATEVHTSS4MCS0: + ret_rate = MPT_RATE_VHT4SS_MCS0; + break; + case DESC_RATEVHTSS4MCS1: + ret_rate = MPT_RATE_VHT4SS_MCS1; + break; + case DESC_RATEVHTSS4MCS2: + ret_rate = MPT_RATE_VHT4SS_MCS2; + break; + case DESC_RATEVHTSS4MCS3: + ret_rate = MPT_RATE_VHT4SS_MCS3; + break; + case DESC_RATEVHTSS4MCS4: + ret_rate = MPT_RATE_VHT4SS_MCS4; + break; + case DESC_RATEVHTSS4MCS5: + ret_rate = MPT_RATE_VHT4SS_MCS5; + break; + case DESC_RATEVHTSS4MCS6: + ret_rate = MPT_RATE_VHT4SS_MCS6; + break; + case DESC_RATEVHTSS4MCS7: + ret_rate = MPT_RATE_VHT4SS_MCS7; + break; + case DESC_RATEVHTSS4MCS8: + ret_rate = MPT_RATE_VHT4SS_MCS8; + break; + case DESC_RATEVHTSS4MCS9: + ret_rate = MPT_RATE_VHT4SS_MCS9; + break; + + default: + RTW_INFO("HwRateToMRate(): Non supported Rate [%x]!!!\n", rate); + break; + } + return ret_rate; +} u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr) { - u16 i=0; - u8* rateindex_Array[] = { "1M","2M","5.5M","11M","6M","9M","12M","18M","24M","36M","48M","54M", - "HTMCS0","HTMCS1","HTMCS2","HTMCS3","HTMCS4","HTMCS5","HTMCS6","HTMCS7", - "HTMCS8","HTMCS9","HTMCS10","HTMCS11","HTMCS12","HTMCS13","HTMCS14","HTMCS15", - "HTMCS16","HTMCS17","HTMCS18","HTMCS19","HTMCS20","HTMCS21","HTMCS22","HTMCS23", - "HTMCS24","HTMCS25","HTMCS26","HTMCS27","HTMCS28","HTMCS29","HTMCS30","HTMCS31", - "VHT1MCS0","VHT1MCS1","VHT1MCS2","VHT1MCS3","VHT1MCS4","VHT1MCS5","VHT1MCS6","VHT1MCS7","VHT1MCS8","VHT1MCS9", - "VHT2MCS0","VHT2MCS1","VHT2MCS2","VHT2MCS3","VHT2MCS4","VHT2MCS5","VHT2MCS6","VHT2MCS7","VHT2MCS8","VHT2MCS9", - "VHT3MCS0","VHT3MCS1","VHT3MCS2","VHT3MCS3","VHT3MCS4","VHT3MCS5","VHT3MCS6","VHT3MCS7","VHT3MCS8","VHT3MCS9", - "VHT4MCS0","VHT4MCS1","VHT4MCS2","VHT4MCS3","VHT4MCS4","VHT4MCS5","VHT4MCS6","VHT4MCS7","VHT4MCS8","VHT4MCS9"}; + u16 i = 0; + u8 *rateindex_Array[] = { "1M", "2M", "5.5M", "11M", "6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M", + "HTMCS0", "HTMCS1", "HTMCS2", "HTMCS3", "HTMCS4", "HTMCS5", "HTMCS6", "HTMCS7", + "HTMCS8", "HTMCS9", "HTMCS10", "HTMCS11", "HTMCS12", "HTMCS13", "HTMCS14", "HTMCS15", + "HTMCS16", "HTMCS17", "HTMCS18", "HTMCS19", "HTMCS20", "HTMCS21", "HTMCS22", "HTMCS23", + "HTMCS24", "HTMCS25", "HTMCS26", "HTMCS27", "HTMCS28", "HTMCS29", "HTMCS30", "HTMCS31", + "VHT1MCS0", "VHT1MCS1", "VHT1MCS2", "VHT1MCS3", "VHT1MCS4", "VHT1MCS5", "VHT1MCS6", "VHT1MCS7", "VHT1MCS8", "VHT1MCS9", + "VHT2MCS0", "VHT2MCS1", "VHT2MCS2", "VHT2MCS3", "VHT2MCS4", "VHT2MCS5", "VHT2MCS6", "VHT2MCS7", "VHT2MCS8", "VHT2MCS9", + "VHT3MCS0", "VHT3MCS1", "VHT3MCS2", "VHT3MCS3", "VHT3MCS4", "VHT3MCS5", "VHT3MCS6", "VHT3MCS7", "VHT3MCS8", "VHT3MCS9", + "VHT4MCS0", "VHT4MCS1", "VHT4MCS2", "VHT4MCS3", "VHT4MCS4", "VHT4MCS5", "VHT4MCS6", "VHT4MCS7", "VHT4MCS8", "VHT4MCS9" + }; - for(i=0;i<=83;i++){ - if(strcmp(targetStr, rateindex_Array[i]) == 0){ - DBG_871X("%s , index = %d \n",__func__ ,i); + for (i = 0; i <= 83; i++) { + if (strcmp(targetStr, rateindex_Array[i]) == 0) { + RTW_INFO("%s , index = %d\n", __func__ , i); return i; } } - - printk("%s ,please input a Data RATE String as:",__func__); - for(i=0;i<=83;i++){ - printk("%s ",rateindex_Array[i]); - if(i%10==0) + + printk("%s ,please input a Data RATE String as:", __func__); + for (i = 0; i <= 83; i++) { + printk("%s ", rateindex_Array[i]); + if (i % 10 == 0) printk("\n"); - } + } return _FAIL; } ULONG mpt_ProQueryCalTxPower( PADAPTER pAdapter, - u8 RfPath - ) + u8 RfPath +) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); - ULONG TxPower = 1, PwrGroup=0, PowerDiffByRate=0; - u1Byte limit = 0, rate = 0; - - #if defined(CONFIG_RTL8188E) - if (IS_HARDWARE_TYPE_8188E(pAdapter)) - { - //return mpt_ProQueryCalTxPower_8188E(pAdapter, RfPath); - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8188E(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); + ULONG TxPower = 1; + u1Byte rate = 0; + struct txpwr_idx_comp tic; + u8 mgn_rate = MptToMgntRate(pMptCtx->MptRateIndex); - } - #endif - - #if defined(CONFIG_RTL8723B) - if( IS_HARDWARE_TYPE_8723B(pAdapter) ) - { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8723B(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } - #endif - - #if defined(CONFIG_RTL8192E) - if( IS_HARDWARE_TYPE_8192E(pAdapter) ) - { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8192E(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } - #endif - #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) - if( IS_HARDWARE_TYPE_JAGUAR(pAdapter) ) - { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8812A(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } - #endif - #if defined(CONFIG_RTL8814A) - if ( IS_HARDWARE_TYPE_8814A(pAdapter) ) - { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8814A(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } - #endif - #if defined(CONFIG_RTL8703B) - if (IS_HARDWARE_TYPE_8703B(pAdapter)) { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8703B(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } - #endif + TxPower = rtw_hal_get_tx_power_index(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel, &tic); - #if defined(CONFIG_RTL8188F) - if (IS_HARDWARE_TYPE_8188F(pAdapter)) { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8188F(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } - #endif - - DBG_8192C("txPower=%d ,CurrentChannelBW=%d ,CurrentChannel=%d ,rate =%d\n", - TxPower, pHalData->CurrentChannelBW, pHalData->CurrentChannel, rate); + RTW_INFO("bw=%d, ch=%d, rate=%d, txPower:%u = %u + (%d=%d:%d) + (%d) + (%d)\n", + pHalData->CurrentChannelBW, pHalData->CurrentChannel, mgn_rate + , TxPower, tic.base, (tic.by_rate > tic.limit ? tic.limit : tic.by_rate), tic.by_rate, tic.limit, tic.tpt, tic.ebias); pAdapter->mppriv.txpoweridx = (u8)TxPower; pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)TxPower; @@ -2572,5 +2702,831 @@ ULONG mpt_ProQueryCalTxPower( return TxPower; } -#endif +#ifdef CONFIG_MP_VHT_HW_TX_MODE +static inline void dump_buf(u8 *buf, u32 len) +{ + u32 i; + + RTW_INFO("-----------------Len %d----------------\n", len); + for (i = 0; i < len; i++) + RTW_INFO("%2.2x-", *(buf + i)); + RTW_INFO("\n"); +} + +void ByteToBit( + UCHAR *out, + bool *in, + UCHAR in_size) +{ + UCHAR i = 0, j = 0; + + for (i = 0; i < in_size; i++) { + for (j = 0; j < 8; j++) { + if (in[8 * i + j]) + out[i] |= (1 << j); + } + } +} + + +void CRC16_generator( + bool *out, + bool *in, + UCHAR in_size +) +{ + UCHAR i = 0; + bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + + for (i = 0; i < in_size; i++) {/* take one's complement and bit reverse*/ + temp = in[i] ^ reg[15]; + reg[15] = reg[14]; + reg[14] = reg[13]; + reg[13] = reg[12]; + reg[12] = reg[11]; + reg[11] = reg[10]; + reg[10] = reg[9]; + reg[9] = reg[8]; + reg[8] = reg[7]; + + reg[7] = reg[6]; + reg[6] = reg[5]; + reg[5] = reg[4]; + reg[4] = reg[3]; + reg[3] = reg[2]; + reg[2] = reg[1]; + reg[1] = reg[0]; + reg[12] = reg[12] ^ temp; + reg[5] = reg[5] ^ temp; + reg[0] = temp; + } + for (i = 0; i < 16; i++) /* take one's complement and bit reverse*/ + out[i] = 1 - reg[15 - i]; +} + + + +/*======================================== + SFD SIGNAL SERVICE LENGTH CRC + 16 bit 8 bit 8 bit 16 bit 16 bit +========================================*/ +void CCK_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo +) +{ + double ratio = 0; + bool crc16_in[32] = {0}, crc16_out[16] = {0}; + bool LengthExtBit; + double LengthExact; + double LengthPSDU; + UCHAR i; + UINT PacketLength = pPMacTxInfo->PacketLength; + + if (pPMacTxInfo->bSPreamble) + pPMacTxInfo->SFD = 0x05CF; + else + pPMacTxInfo->SFD = 0xF3A0; + + switch (pPMacPktInfo->MCS) { + case 0: + pPMacTxInfo->SignalField = 0xA; + ratio = 8; + /*CRC16_in(1,0:7)=[0 1 0 1 0 0 0 0]*/ + crc16_in[1] = crc16_in[3] = 1; + break; + case 1: + pPMacTxInfo->SignalField = 0x14; + ratio = 4; + /*CRC16_in(1,0:7)=[0 0 1 0 1 0 0 0];*/ + crc16_in[2] = crc16_in[4] = 1; + break; + case 2: + pPMacTxInfo->SignalField = 0x37; + ratio = 8.0 / 5.5; + /*CRC16_in(1,0:7)=[1 1 1 0 1 1 0 0];*/ + crc16_in[0] = crc16_in[1] = crc16_in[2] = crc16_in[4] = crc16_in[5] = 1; + break; + case 3: + pPMacTxInfo->SignalField = 0x6E; + ratio = 8.0 / 11.0; + /*CRC16_in(1,0:7)=[0 1 1 1 0 1 1 0];*/ + crc16_in[1] = crc16_in[2] = crc16_in[3] = crc16_in[5] = crc16_in[6] = 1; + break; + } + + LengthExact = PacketLength * ratio; + LengthPSDU = ceil(LengthExact); + + if ((pPMacPktInfo->MCS == 3) && + ((LengthPSDU - LengthExact) >= 0.727 || (LengthPSDU - LengthExact) <= -0.727)) + LengthExtBit = 1; + else + LengthExtBit = 0; + + + pPMacTxInfo->LENGTH = (UINT)LengthPSDU; + /* CRC16_in(1,16:31) = LengthPSDU[0:15]*/ + for (i = 0; i < 16; i++) + crc16_in[i + 16] = (pPMacTxInfo->LENGTH >> i) & 0x1; + + if (LengthExtBit == 0) { + pPMacTxInfo->ServiceField = 0x0; + /* CRC16_in(1,8:15) = [0 0 0 0 0 0 0 0];*/ + } else { + pPMacTxInfo->ServiceField = 0x80; + /*CRC16_in(1,8:15)=[0 0 0 0 0 0 0 1];*/ + crc16_in[15] = 1; + } + + CRC16_generator(crc16_out, crc16_in, 32); + + _rtw_memset(pPMacTxInfo->CRC16, 0, 2); + ByteToBit(pPMacTxInfo->CRC16, crc16_out, 2); + +} + + +void PMAC_Get_Pkt_Param( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo) +{ + + UCHAR TX_RATE_HEX = 0, MCS = 0; + UCHAR TX_RATE = pPMacTxInfo->TX_RATE; + + /* TX_RATE & Nss */ + if (MPT_IS_2SS_RATE(TX_RATE)) + pPMacPktInfo->Nss = 2; + else if (MPT_IS_3SS_RATE(TX_RATE)) + pPMacPktInfo->Nss = 3; + else if (MPT_IS_4SS_RATE(TX_RATE)) + pPMacPktInfo->Nss = 4; + else + pPMacPktInfo->Nss = 1; + + RTW_INFO("PMacTxInfo.Nss =%d\n", pPMacPktInfo->Nss); + + /* MCS & TX_RATE_HEX*/ + if (MPT_IS_CCK_RATE(TX_RATE)) { + switch (TX_RATE) { + case MPT_RATE_1M: + TX_RATE_HEX = MCS = 0; + break; + case MPT_RATE_2M: + TX_RATE_HEX = MCS = 1; + break; + case MPT_RATE_55M: + TX_RATE_HEX = MCS = 2; + break; + case MPT_RATE_11M: + TX_RATE_HEX = MCS = 3; + break; + } + } else if (MPT_IS_OFDM_RATE(TX_RATE)) { + MCS = TX_RATE - MPT_RATE_6M; + TX_RATE_HEX = MCS + 4; + } else if (MPT_IS_HT_RATE(TX_RATE)) { + MCS = TX_RATE - MPT_RATE_MCS0; + TX_RATE_HEX = MCS + 12; + } else if (MPT_IS_VHT_RATE(TX_RATE)) { + TX_RATE_HEX = TX_RATE - MPT_RATE_VHT1SS_MCS0 + 44; + + if (MPT_IS_VHT_2S_RATE(TX_RATE)) + MCS = TX_RATE - MPT_RATE_VHT2SS_MCS0; + else if (MPT_IS_VHT_3S_RATE(TX_RATE)) + MCS = TX_RATE - MPT_RATE_VHT3SS_MCS0; + else if (MPT_IS_VHT_4S_RATE(TX_RATE)) + MCS = TX_RATE - MPT_RATE_VHT4SS_MCS0; + else + MCS = TX_RATE - MPT_RATE_VHT1SS_MCS0; + } + + pPMacPktInfo->MCS = MCS; + pPMacTxInfo->TX_RATE_HEX = TX_RATE_HEX; + + RTW_INFO(" MCS=%d, TX_RATE_HEX =0x%x\n", MCS, pPMacTxInfo->TX_RATE_HEX); + /* mSTBC & Nsts*/ + pPMacPktInfo->Nsts = pPMacPktInfo->Nss; + if (pPMacTxInfo->bSTBC) { + if (pPMacPktInfo->Nss == 1) { + pPMacTxInfo->m_STBC = 2; + pPMacPktInfo->Nsts = pPMacPktInfo->Nss * 2; + } else + pPMacTxInfo->m_STBC = 1; + } else + pPMacTxInfo->m_STBC = 1; +} + + +UINT LDPC_parameter_generator( + UINT N_pld_int, + UINT N_CBPSS, + UINT N_SS, + UINT R, + UINT m_STBC, + UINT N_TCB_int +) +{ + double CR = 0.; + double N_pld = (double)N_pld_int; + double N_TCB = (double)N_TCB_int; + double N_CW = 0., N_shrt = 0., N_spcw = 0., N_fshrt = 0.; + double L_LDPC = 0., K_LDPC = 0., L_LDPC_info = 0.; + double N_punc = 0., N_ppcw = 0., N_fpunc = 0., N_rep = 0., N_rpcw = 0., N_frep = 0.; + double R_eff = 0.; + UINT VHTSIGA2B3 = 0;/* extra symbol from VHT-SIG-A2 Bit 3*/ + + if (R == 0) + CR = 0.5; + else if (R == 1) + CR = 2. / 3.; + else if (R == 2) + CR = 3. / 4.; + else if (R == 3) + CR = 5. / 6.; + + if (N_TCB <= 648.) { + N_CW = 1.; + if (N_TCB >= N_pld + 912.*(1. - CR)) + L_LDPC = 1296.; + else + L_LDPC = 648.; + } else if (N_TCB <= 1296.) { + N_CW = 1.; + if (N_TCB >= (double)N_pld + 1464.*(1. - CR)) + L_LDPC = 1944.; + else + L_LDPC = 1296.; + } else if (N_TCB <= 1944.) { + N_CW = 1.; + L_LDPC = 1944.; + } else if (N_TCB <= 2592.) { + N_CW = 2.; + if (N_TCB >= N_pld + 2916.*(1. - CR)) + L_LDPC = 1944.; + else + L_LDPC = 1296.; + } else { + N_CW = ceil(N_pld / 1944. / CR); + L_LDPC = 1944.; + } + /* Number of information bits per CW*/ + K_LDPC = L_LDPC * CR; + /* Number of shortening bits max(0, (N_CW * L_LDPC * R) - N_pld)*/ + N_shrt = (N_CW * K_LDPC - N_pld) > 0. ? (N_CW * K_LDPC - N_pld) : 0.; + /* Number of shortening bits per CW N_spcw = rtfloor(N_shrt/N_CW)*/ + N_spcw = rtfloor(N_shrt / N_CW); + /* The first N_fshrt CWs shorten 1 bit more*/ + N_fshrt = (double)((int)N_shrt % (int)N_CW); + /* Number of data bits for the last N_CW-N_fshrt CWs*/ + L_LDPC_info = K_LDPC - N_spcw; + /* Number of puncturing bits*/ + N_punc = (N_CW * L_LDPC - N_TCB - N_shrt) > 0. ? (N_CW * L_LDPC - N_TCB - N_shrt) : 0.; + if (((N_punc > .1 * N_CW * L_LDPC * (1. - CR)) && (N_shrt < 1.2 * N_punc * CR / (1. - CR))) || + (N_punc > 0.3 * N_CW * L_LDPC * (1. - CR))) { + /*cout << "*** N_TCB and N_punc are Recomputed ***" << endl;*/ + VHTSIGA2B3 = 1; + N_TCB += (double)N_CBPSS * N_SS * m_STBC; + N_punc = (N_CW * L_LDPC - N_TCB - N_shrt) > 0. ? (N_CW * L_LDPC - N_TCB - N_shrt) : 0.; + } else + VHTSIGA2B3 = 0; + + return VHTSIGA2B3; +} /* function end of LDPC_parameter_generator */ + +/*======================================== + Data field of PPDU + Get N_sym and SIGA2BB3 +========================================*/ +void PMAC_Nsym_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo) +{ + UINT SIGA2B3 = 0; + UCHAR TX_RATE = pPMacTxInfo->TX_RATE; + + UINT R, R_list[10] = {0, 0, 2, 0, 2, 1, 2, 3, 2, 3}; + double CR = 0; + UINT N_SD, N_BPSC_list[10] = {1, 2, 2, 4, 4, 6, 6, 6, 8, 8}; + UINT N_BPSC = 0, N_CBPS = 0, N_DBPS = 0, N_ES = 0, N_SYM = 0, N_pld = 0, N_TCB = 0; + int D_R = 0; + + RTW_INFO("TX_RATE = %d\n", TX_RATE); + /* N_SD*/ + if (pPMacTxInfo->BandWidth == 0) + N_SD = 52; + else if (pPMacTxInfo->BandWidth == 1) + N_SD = 108; + else + N_SD = 234; + + if (MPT_IS_HT_RATE(TX_RATE)) { + UCHAR MCS_temp; + + if (pPMacPktInfo->MCS > 23) + MCS_temp = pPMacPktInfo->MCS - 24; + else if (pPMacPktInfo->MCS > 15) + MCS_temp = pPMacPktInfo->MCS - 16; + else if (pPMacPktInfo->MCS > 7) + MCS_temp = pPMacPktInfo->MCS - 8; + else + MCS_temp = pPMacPktInfo->MCS; + + R = R_list[MCS_temp]; + + switch (R) { + case 0: + CR = .5; + break; + case 1: + CR = 2. / 3.; + break; + case 2: + CR = 3. / 4.; + break; + case 3: + CR = 5. / 6.; + break; + } + + N_BPSC = N_BPSC_list[MCS_temp]; + N_CBPS = N_BPSC * N_SD * pPMacPktInfo->Nss; + N_DBPS = (UINT)((double)N_CBPS * CR); + + if (pPMacTxInfo->bLDPC == FALSE) { + N_ES = (UINT)ceil((double)(N_DBPS * pPMacPktInfo->Nss) / 4. / 300.); + RTW_INFO("N_ES = %d\n", N_ES); + + /* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/ + N_SYM = pPMacTxInfo->m_STBC * (UINT)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16 + N_ES * 6) / + (double)(N_DBPS * pPMacTxInfo->m_STBC)); + + } else { + N_ES = 1; + /* N_pld = length * 8 + 16*/ + N_pld = pPMacTxInfo->PacketLength * 8 + 16; + RTW_INFO("N_pld = %d\n", N_pld); + N_SYM = pPMacTxInfo->m_STBC * (UINT)ceil((double)(N_pld) / + (double)(N_DBPS * pPMacTxInfo->m_STBC)); + RTW_INFO("N_SYM = %d\n", N_SYM); + /* N_avbits = N_CBPS *m_STBC *(N_pld/N_CBPS*R*m_STBC)*/ + N_TCB = N_CBPS * N_SYM; + RTW_INFO("N_TCB = %d\n", N_TCB); + SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB); + RTW_INFO("SIGA2B3 = %d\n", SIGA2B3); + N_SYM = N_SYM + SIGA2B3 * pPMacTxInfo->m_STBC; + RTW_INFO("N_SYM = %d\n", N_SYM); + } + } else if (MPT_IS_VHT_RATE(TX_RATE)) { + R = R_list[pPMacPktInfo->MCS]; + + switch (R) { + case 0: + CR = .5; + break; + case 1: + CR = 2. / 3.; + break; + case 2: + CR = 3. / 4.; + break; + case 3: + CR = 5. / 6.; + break; + } + N_BPSC = N_BPSC_list[pPMacPktInfo->MCS]; + N_CBPS = N_BPSC * N_SD * pPMacPktInfo->Nss; + N_DBPS = (UINT)((double)N_CBPS * CR); + if (pPMacTxInfo->bLDPC == FALSE) { + if (pPMacTxInfo->bSGI) + N_ES = (UINT)ceil((double)(N_DBPS) / 3.6 / 600.); + else + N_ES = (UINT)ceil((double)(N_DBPS) / 4. / 600.); + /* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/ + N_SYM = pPMacTxInfo->m_STBC * (UINT)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16 + N_ES * 6) / (double)(N_DBPS * pPMacTxInfo->m_STBC)); + SIGA2B3 = 0; + } else { + N_ES = 1; + /* N_SYM = m_STBC* (8*length+N_service) / (m_STBC*N_DBPS)*/ + N_SYM = pPMacTxInfo->m_STBC * (UINT)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16) / (double)(N_DBPS * pPMacTxInfo->m_STBC)); + /* N_avbits = N_sys_init * N_CBPS*/ + N_TCB = N_CBPS * N_SYM; + /* N_pld = N_sys_init * N_DBPS*/ + N_pld = N_SYM * N_DBPS; + SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB); + N_SYM = N_SYM + SIGA2B3 * pPMacTxInfo->m_STBC; + } + + switch (R) { + case 0: + D_R = 2; + break; + case 1: + D_R = 3; + break; + case 2: + D_R = 4; + break; + case 3: + D_R = 6; + break; + } + + if (((N_CBPS / N_ES) % D_R) != 0) { + RTW_INFO("MCS= %d is not supported when Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth); + return; + } + + RTW_INFO("MCS= %d Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth); + } + + pPMacPktInfo->N_sym = N_SYM; + pPMacPktInfo->SIGA2B3 = SIGA2B3; +} + +/*======================================== + L-SIG Rate R Length P Tail + 4b 1b 12b 1b 6b +========================================*/ + +void L_SIG_generator( + UINT N_SYM, /* Max: 750*/ + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo) +{ + u8 sig_bi[24] = {0}; /* 24 BIT*/ + UINT mode, LENGTH; + int i; + + if (MPT_IS_OFDM_RATE(pPMacTxInfo->TX_RATE)) { + mode = pPMacPktInfo->MCS; + LENGTH = pPMacTxInfo->PacketLength; + } else { + UCHAR N_LTF; + double T_data; + UINT OFDM_symbol; + + mode = 0; + + /* Table 20-13 Num of HT-DLTFs request*/ + if (pPMacPktInfo->Nsts <= 2) + N_LTF = pPMacPktInfo->Nsts; + else + N_LTF = 4; + + if (pPMacTxInfo->bSGI) + T_data = 3.6; + else + T_data = 4.0; + + /*(L-SIG, HT-SIG, HT-STF, HT-LTF....HT-LTF, Data)*/ + if (MPT_IS_VHT_RATE(pPMacTxInfo->TX_RATE)) + OFDM_symbol = (UINT)ceil((double)(8 + 4 + N_LTF * 4 + N_SYM * T_data + 4) / 4.); + else + OFDM_symbol = (UINT)ceil((double)(8 + 4 + N_LTF * 4 + N_SYM * T_data) / 4.); + + RTW_INFO("%s , OFDM_symbol =%d\n", __func__, OFDM_symbol); + LENGTH = OFDM_symbol * 3 - 3; + RTW_INFO("%s , LENGTH =%d\n", __func__, LENGTH); + + } + /* Rate Field*/ + switch (mode) { + case 0: + sig_bi[0] = 1; + sig_bi[1] = 1; + sig_bi[2] = 0; + sig_bi[3] = 1; + break; + case 1: + sig_bi[0] = 1; + sig_bi[1] = 1; + sig_bi[2] = 1; + sig_bi[3] = 1; + break; + case 2: + sig_bi[0] = 0; + sig_bi[1] = 1; + sig_bi[2] = 0; + sig_bi[3] = 1; + break; + case 3: + sig_bi[0] = 0; + sig_bi[1] = 1; + sig_bi[2] = 1; + sig_bi[3] = 1; + break; + case 4: + sig_bi[0] = 1; + sig_bi[1] = 0; + sig_bi[2] = 0; + sig_bi[3] = 1; + break; + case 5: + sig_bi[0] = 1; + sig_bi[1] = 0; + sig_bi[2] = 1; + sig_bi[3] = 1; + break; + case 6: + sig_bi[0] = 0; + sig_bi[1] = 0; + sig_bi[2] = 0; + sig_bi[3] = 1; + break; + case 7: + sig_bi[0] = 0; + sig_bi[1] = 0; + sig_bi[2] = 1; + sig_bi[3] = 1; + break; + } + /*Reserved bit*/ + sig_bi[4] = 0; + + /* Length Field*/ + for (i = 0; i < 12; i++) + sig_bi[i + 5] = (LENGTH >> i) & 1; + + /* Parity Bit*/ + sig_bi[17] = 0; + for (i = 0; i < 17; i++) + sig_bi[17] = sig_bi[17] + sig_bi[i]; + + sig_bi[17] %= 2; + + /* Tail Field*/ + for (i = 18; i < 24; i++) + sig_bi[i] = 0; + + /* dump_buf(sig_bi,24);*/ + _rtw_memset(pPMacTxInfo->LSIG, 0, 3); + ByteToBit(pPMacTxInfo->LSIG, (bool *)sig_bi, 3); +} + + +void CRC8_generator( + bool *out, + bool *in, + UCHAR in_size +) +{ + UCHAR i = 0; + bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1}; + + for (i = 0; i < in_size; i++) { /* take one's complement and bit reverse*/ + temp = in[i] ^ reg[7]; + reg[7] = reg[6]; + reg[6] = reg[5]; + reg[5] = reg[4]; + reg[4] = reg[3]; + reg[3] = reg[2]; + reg[2] = reg[1] ^ temp; + reg[1] = reg[0] ^ temp; + reg[0] = temp; + } + for (i = 0; i < 8; i++)/* take one's complement and bit reverse*/ + out[i] = reg[7 - i] ^ 1; +} + +/*/================================================================================ + HT-SIG1 MCS CW Length 24BIT + 24BIT + 7b 1b 16b + HT-SIG2 Smoothing Not sounding Rsvd AGG STBC FEC SGI N_ELTF CRC Tail + 1b 1b 1b 1b 2b 1b 1b 2b 8b 6b +================================================================================*/ +void HT_SIG_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo +) +{ + UINT i; + bool sig_bi[48] = {0}, crc8[8] = {0}; + /* MCS Field*/ + for (i = 0; i < 7; i++) + sig_bi[i] = (pPMacPktInfo->MCS >> i) & 0x1; + /* Packet BW Setting*/ + sig_bi[7] = pPMacTxInfo->BandWidth; + /* HT-Length Field*/ + for (i = 0; i < 16; i++) + sig_bi[i + 8] = (pPMacTxInfo->PacketLength >> i) & 0x1; + /* Smoothing; 1->allow smoothing*/ + sig_bi[24] = 1; + /*Not Sounding*/ + sig_bi[25] = 1 - pPMacTxInfo->NDP_sound; + /*Reserved bit*/ + sig_bi[26] = 1; + /*/Aggregate*/ + sig_bi[27] = 0; + /*STBC Field*/ + if (pPMacTxInfo->bSTBC) { + sig_bi[28] = 1; + sig_bi[29] = 0; + } else { + sig_bi[28] = 0; + sig_bi[29] = 0; + } + /*Advance Coding, 0: BCC, 1: LDPC*/ + sig_bi[30] = pPMacTxInfo->bLDPC; + /* Short GI*/ + sig_bi[31] = pPMacTxInfo->bSGI; + /* N_ELTFs*/ + if (pPMacTxInfo->NDP_sound == FALSE) { + sig_bi[32] = 0; + sig_bi[33] = 0; + } else { + int N_ELTF = pPMacTxInfo->Ntx - pPMacPktInfo->Nss; + + for (i = 0; i < 2; i++) + sig_bi[32 + i] = (N_ELTF >> i) % 2; + } + /* CRC-8*/ + CRC8_generator(crc8, sig_bi, 34); + + for (i = 0; i < 8; i++) + sig_bi[34 + i] = crc8[i]; + + /*Tail*/ + for (i = 42; i < 48; i++) + sig_bi[i] = 0; + + _rtw_memset(pPMacTxInfo->HT_SIG, 0, 6); + ByteToBit(pPMacTxInfo->HT_SIG, sig_bi, 6); +} + + +/*====================================================================================== + VHT-SIG-A1 + BW Reserved STBC G_ID SU_Nsts P_AID TXOP_PS_NOT_ALLOW Reserved + 2b 1b 1b 6b 3b 9b 1b 2b 1b + VHT-SIG-A2 + SGI SGI_Nsym SU/MU coding LDPC_Extra SU_NCS Beamformed Reserved CRC Tail + 1b 1b 1b 1b 4b 1b 1b 8b 6b +======================================================================================*/ +void VHT_SIG_A_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo) +{ + UINT i; + bool sig_bi[48], crc8[8]; + + _rtw_memset(sig_bi, 0, 48); + _rtw_memset(crc8, 0, 8); + + /* BW Setting*/ + for (i = 0; i < 2; i++) + sig_bi[i] = (pPMacTxInfo->BandWidth >> i) & 0x1; + /* Reserved Bit*/ + sig_bi[2] = 1; + /*STBC Field*/ + sig_bi[3] = pPMacTxInfo->bSTBC; + /*Group ID: Single User->A value of 0 or 63 indicates an SU PPDU. */ + for (i = 0; i < 6; i++) + sig_bi[4 + i] = 0; + /* N_STS/Partial AID*/ + for (i = 0; i < 12; i++) { + if (i < 3) + sig_bi[10 + i] = ((pPMacPktInfo->Nsts - 1) >> i) & 0x1; + else + sig_bi[10 + i] = 0; + } + /*TXOP_PS_NOT_ALLPWED*/ + sig_bi[22] = 0; + /*Reserved Bits*/ + sig_bi[23] = 1; + /*Short GI*/ + sig_bi[24] = pPMacTxInfo->bSGI; + if (pPMacTxInfo->bSGI > 0 && (pPMacPktInfo->N_sym % 10) == 9) + sig_bi[25] = 1; + else + sig_bi[25] = 0; + /* SU/MU[0] Coding*/ + sig_bi[26] = pPMacTxInfo->bLDPC; /* 0:BCC, 1:LDPC */ + sig_bi[27] = pPMacPktInfo->SIGA2B3; /*/ Record Extra OFDM Symols is added or not when LDPC is used*/ + /*SU MCS/MU[1-3] Coding*/ + for (i = 0; i < 4; i++) + sig_bi[28 + i] = (pPMacPktInfo->MCS >> i) & 0x1; + /*SU Beamform */ + sig_bi[32] = 0; /*packet.TXBF_en;*/ + /*Reserved Bit*/ + sig_bi[33] = 1; + /*CRC-8*/ + CRC8_generator(crc8, sig_bi, 34); + for (i = 0; i < 8; i++) + sig_bi[34 + i] = crc8[i]; + /*Tail*/ + for (i = 42; i < 48; i++) + sig_bi[i] = 0; + + _rtw_memset(pPMacTxInfo->VHT_SIG_A, 0, 6); + ByteToBit(pPMacTxInfo->VHT_SIG_A, sig_bi, 6); +} + +/*====================================================================================== + VHT-SIG-B + Length Resesrved Trail + 17/19/21 BIT 3/2/2 BIT 6b +======================================================================================*/ +void VHT_SIG_B_generator( + PRT_PMAC_TX_INFO pPMacTxInfo) +{ + bool sig_bi[32], crc8_bi[8]; + UINT i, len, res, tail = 6, total_len, crc8_in_len; + UINT sigb_len; + + _rtw_memset(sig_bi, 0, 32); + _rtw_memset(crc8_bi, 0, 8); + + /*Sounding Packet*/ + if (pPMacTxInfo->NDP_sound == 1) { + if (pPMacTxInfo->BandWidth == 0) { + bool sigb_temp[26] = {0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + + _rtw_memcpy(sig_bi, sigb_temp, 26); + } else if (pPMacTxInfo->BandWidth == 1) { + bool sigb_temp[27] = {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}; + + _rtw_memcpy(sig_bi, sigb_temp, 27); + } else if (pPMacTxInfo->BandWidth == 2) { + bool sigb_temp[29] = {0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + + _rtw_memcpy(sig_bi, sigb_temp, 29); + } + } else { /* Not NDP Sounding*/ + bool *sigb_temp[29] = {0}; + + if (pPMacTxInfo->BandWidth == 0) { + len = 17; + res = 3; + } else if (pPMacTxInfo->BandWidth == 1) { + len = 19; + res = 2; + } else if (pPMacTxInfo->BandWidth == 2) { + len = 21; + res = 2; + } else { + len = 21; + res = 2; + } + total_len = len + res + tail; + crc8_in_len = len + res; + + /*Length Field*/ + sigb_len = (pPMacTxInfo->PacketLength + 3) >> 2; + + for (i = 0; i < len; i++) + sig_bi[i] = (sigb_len >> i) & 0x1; + /*Reserved Field*/ + for (i = 0; i < res; i++) + sig_bi[len + i] = 1; + /* CRC-8*/ + CRC8_generator(crc8_bi, sig_bi, crc8_in_len); + + /* Tail */ + for (i = 0; i < tail; i++) + sig_bi[len + res + i] = 0; + } + + _rtw_memset(pPMacTxInfo->VHT_SIG_B, 0, 4); + ByteToBit(pPMacTxInfo->VHT_SIG_B, sig_bi, 4); + + pPMacTxInfo->VHT_SIG_B_CRC = 0; + ByteToBit(&(pPMacTxInfo->VHT_SIG_B_CRC), crc8_bi, 1); +} + +/*======================= + VHT Delimiter +=======================*/ +void VHT_Delimiter_generator( + PRT_PMAC_TX_INFO pPMacTxInfo +) +{ + bool sig_bi[32] = {0}, crc8[8] = {0}; + UINT crc8_in_len = 16; + UINT PacketLength = pPMacTxInfo->PacketLength; + int j; + + /* Delimiter[0]: EOF*/ + sig_bi[0] = 1; + /* Delimiter[1]: Reserved*/ + sig_bi[1] = 0; + /* Delimiter[3:2]: MPDU Length High*/ + sig_bi[2] = ((PacketLength - 4) >> 12) % 2; + sig_bi[3] = ((PacketLength - 4) >> 13) % 2; + /* Delimiter[15:4]: MPDU Length Low*/ + for (j = 4; j < 16; j++) + sig_bi[j] = ((PacketLength - 4) >> (j - 4)) % 2; + CRC8_generator(crc8, sig_bi, crc8_in_len); + for (j = 16; j < 24; j++) /* Delimiter[23:16]: CRC 8*/ + sig_bi[j] = crc8[j - 16]; + for (j = 24; j < 32; j++) /* Delimiter[31:24]: Signature ('4E' in Hex, 78 in Dec)*/ + sig_bi[j] = (78 >> (j - 24)) % 2; + + _rtw_memset(pPMacTxInfo->VHT_Delimiter, 0, 4); + ByteToBit(pPMacTxInfo->VHT_Delimiter, sig_bi, 4); +} + +#endif +#endif diff --git a/core/rtw_mp_ioctl.c b/core/rtw_mp_ioctl.c old mode 100755 new mode 100644 index ff0c66b..ffeea1c --- a/core/rtw_mp_ioctl.c +++ b/core/rtw_mp_ioctl.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. @@ -23,32 +23,28 @@ #include #include "../hal/phydm/phydm_precomp.h" -//**************** oid_rtl_seg_81_85 section start **************** +/* **************** oid_rtl_seg_81_85 section start **************** */ NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; if (poid_par_priv->information_buf_len < sizeof(u8)) return NDIS_STATUS_INVALID_LENGTH; - if (poid_par_priv->type_of_oid == SET_OID) { - Adapter->registrypriv.wireless_mode = *(u8*)poid_par_priv->information_buf; - } else if (poid_par_priv->type_of_oid == QUERY_OID) { - *(u8*)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode; + if (poid_par_priv->type_of_oid == SET_OID) + Adapter->registrypriv.wireless_mode = *(u8 *)poid_par_priv->information_buf; + else if (poid_par_priv->type_of_oid == QUERY_OID) { + *(u8 *)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_info_, ("-query Wireless Mode=%d\n", Adapter->registrypriv.wireless_mode)); - } else { + } else status = NDIS_STATUS_NOT_ACCEPTED; - } -_func_exit_; return status; } -//**************** oid_rtl_seg_81_87_80 section start **************** +/* **************** oid_rtl_seg_81_87_80 section start **************** */ NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -60,9 +56,7 @@ NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_bb_reg_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -72,24 +66,21 @@ _func_enter_; pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); - offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff - if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR; + offset = (u16)(pbbreg->offset) & 0xFFF; /* 0ffset :0x800~0xfff */ + if (offset < BB_REG_BASE_ADDR) + offset |= BB_REG_BASE_ADDR; value = pbbreg->value; - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_write_bb_reg_hdl: offset=0x%03X value=0x%08X\n", - offset, value)); _irqlevel_changed_(&oldirql, LOWER); write_bbreg(Adapter, offset, 0xFFFFFFFF, value); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -101,9 +92,7 @@ NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_bb_reg_hdl\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -113,8 +102,9 @@ _func_enter_; pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); - offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff - if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR; + offset = (u16)(pbbreg->offset) & 0xFFF; /* 0ffset :0x800~0xfff */ + if (offset < BB_REG_BASE_ADDR) + offset |= BB_REG_BASE_ADDR; _irqlevel_changed_(&oldirql, LOWER); value = read_bbreg(Adapter, offset, 0xFFFFFFFF); @@ -123,14 +113,10 @@ _func_enter_; pbbreg->value = value; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_read_bb_reg_hdl: offset=0x%03X value:0x%08X\n", - offset, value)); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -143,9 +129,7 @@ NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_rf_reg_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -166,19 +150,15 @@ _func_enter_; offset = (u8)pbbreg->offset; value = pbbreg->value; - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_write_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n", - path, offset, value)); _irqlevel_changed_(&oldirql, LOWER); - write_rfreg(Adapter, path, offset, value); + write_rfreg(Adapter, path, offset, value); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -191,9 +171,7 @@ NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv) PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_rf_reg_hdl\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -219,32 +197,25 @@ _func_enter_; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_read_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n", - path, offset, value)); -_func_exit_; return status; } -//**************** oid_rtl_seg_81_87_00 section end**************** -//------------------------------------------------------------------------------ +/* **************** oid_rtl_seg_81_87_00 section end**************** + * ------------------------------------------------------------------------------ */ -//**************** oid_rtl_seg_81_80_00 section start **************** -//------------------------------------------------------------------------------ +/* **************** oid_rtl_seg_81_80_00 section start **************** + * ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP _irqL oldirql; #endif - u32 ratevalue;//4 + u32 ratevalue;/* 4 */ NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, - ("+oid_rt_pro_set_data_rate_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -252,9 +223,7 @@ _func_enter_; if (poid_par_priv->information_buf_len != sizeof(u32)) return NDIS_STATUS_INVALID_LENGTH; - ratevalue = *((u32*)poid_par_priv->information_buf);//4 - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_set_data_rate_hdl: data rate idx=%d\n", ratevalue)); + ratevalue = *((u32 *)poid_par_priv->information_buf); /* 4 */ if (ratevalue >= MPT_RATE_LAST) return NDIS_STATUS_INVALID_DATA; @@ -264,11 +233,10 @@ _func_enter_; SetDataRate(Adapter); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -278,9 +246,7 @@ NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_start_test_hdl\n")); if (Adapter->registrypriv.mp_mode == 0) return NDIS_STATUS_NOT_ACCEPTED; @@ -290,10 +256,10 @@ _func_enter_; _irqlevel_changed_(&oldirql, LOWER); - //IQCalibrateBcut(Adapter); + /* IQCalibrateBcut(Adapter); */ - mode = *((u32*)poid_par_priv->information_buf); - Adapter->mppriv.mode = mode;// 1 for loopback + mode = *((u32 *)poid_par_priv->information_buf); + Adapter->mppriv.mode = mode;/* 1 for loopback */ if (mp_start_test(Adapter) == _FAIL) { status = NDIS_STATUS_NOT_ACCEPTED; @@ -303,13 +269,11 @@ _func_enter_; exit: _irqlevel_changed_(&oldirql, RAISE); - RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_pro_start_test_hdl: mp_mode=%d\n", Adapter->mppriv.mode)); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -318,9 +282,7 @@ NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_STOP_TEST\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -329,13 +291,11 @@ _func_enter_; mp_stop_test(Adapter); _irqlevel_changed_(&oldirql, RAISE); - RT_TRACE(_module_mp_, _drv_notice_, ("-Set OID_RT_PRO_STOP_TEST\n")); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -345,23 +305,20 @@ NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_channel_direct_call_hdl\n")); if (poid_par_priv->information_buf_len != sizeof(u32)) return NDIS_STATUS_INVALID_LENGTH; if (poid_par_priv->type_of_oid == QUERY_OID) { - *((u32*)poid_par_priv->information_buf) = Adapter->mppriv.channel; + *((u32 *)poid_par_priv->information_buf) = Adapter->mppriv.channel; return NDIS_STATUS_SUCCESS; } if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; - Channel = *((u32*)poid_par_priv->information_buf); - RT_TRACE(_module_mp_, _drv_notice_, ("oid_rt_pro_set_channel_direct_call_hdl: Channel=%d\n", Channel)); + Channel = *((u32 *)poid_par_priv->information_buf); if (Channel > 14) return NDIS_STATUS_NOT_ACCEPTED; Adapter->mppriv.channel = Channel; @@ -370,11 +327,10 @@ _func_enter_; SetChannel(Adapter); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -385,10 +341,7 @@ NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_info_, - ("+oid_rt_set_bandwidth_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -396,7 +349,7 @@ _func_enter_; if (poid_par_priv->information_buf_len < sizeof(u32)) return NDIS_STATUS_INVALID_LENGTH; - bandwidth = *((u32*)poid_par_priv->information_buf);//4 + bandwidth = *((u32 *)poid_par_priv->information_buf); /* 4 */ channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; if (bandwidth != CHANNEL_WIDTH_40) @@ -408,15 +361,11 @@ _func_enter_; SetBandwidth(padapter); _irqlevel_changed_(&oldirql, RAISE); - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_set_bandwidth_hdl: bandwidth=%d channel_offset=%d\n", - bandwidth, channel_offset)); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -426,32 +375,25 @@ NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_antenna_bb_hdl\n")); if (poid_par_priv->information_buf_len != sizeof(u32)) return NDIS_STATUS_INVALID_LENGTH; - if (poid_par_priv->type_of_oid == SET_OID) - { - antenna = *(u32*)poid_par_priv->information_buf; + if (poid_par_priv->type_of_oid == SET_OID) { + antenna = *(u32 *)poid_par_priv->information_buf; Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16); Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF); - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_set_antenna_bb_hdl: tx_ant=0x%04x rx_ant=0x%04x\n", - Adapter->mppriv.antenna_tx, Adapter->mppriv.antenna_rx)); _irqlevel_changed_(&oldirql, LOWER); SetAntenna(Adapter); _irqlevel_changed_(&oldirql, RAISE); } else { - antenna = (Adapter->mppriv.antenna_tx << 16)|Adapter->mppriv.antenna_rx; - *(u32*)poid_par_priv->information_buf = antenna; + antenna = (Adapter->mppriv.antenna_tx << 16) | Adapter->mppriv.antenna_rx; + *(u32 *)poid_par_priv->information_buf = antenna; } -_func_exit_; return status; } @@ -465,9 +407,7 @@ NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_pr NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_set_tx_power_control_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -475,132 +415,110 @@ _func_enter_; if (poid_par_priv->information_buf_len != sizeof(u32)) return NDIS_STATUS_INVALID_LENGTH; - tx_pwr_idx = *((u32*)poid_par_priv->information_buf); + tx_pwr_idx = *((u32 *)poid_par_priv->information_buf); if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE) return NDIS_STATUS_NOT_ACCEPTED; Adapter->mppriv.txpoweridx = (u8)tx_pwr_idx; - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_set_tx_power_control_hdl: idx=0x%2x\n", - Adapter->mppriv.txpoweridx)); _irqlevel_changed_(&oldirql, LOWER); SetTxPower(Adapter); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//------------------------------------------------------------------------------ -//**************** oid_rtl_seg_81_80_20 section start **************** -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ + * **************** oid_rtl_seg_81_80_20 section start **************** + * ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - if (poid_par_priv->type_of_oid !=QUERY_OID) { + if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount; + *(ULONG *)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else { + } else status = NDIS_STATUS_INVALID_LENGTH; - } -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } - RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_received_hdl.\n")); if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount; + *(ULONG *)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_alert_, ("recv_ok:%d \n",Adapter->mppriv.rx_pktcount)); - } else { + } else status = NDIS_STATUS_INVALID_LENGTH; - } -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } - RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_crc32_error_hdl.\n")); if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount; + *(ULONG *)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_alert_, ("recv_err:%d \n",Adapter->mppriv.rx_crcerrpktcount)); - } else { + } else status = NDIS_STATUS_INVALID_LENGTH; - } -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } - RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_reset_tx_packet_sent_hdl.\n")); Adapter->mppriv.tx_pktcount = 0; -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - if (poid_par_priv->type_of_oid != SET_OID) - { + if (poid_par_priv->type_of_oid != SET_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } @@ -608,15 +526,13 @@ _func_enter_; if (poid_par_priv->information_buf_len == sizeof(ULONG)) { Adapter->mppriv.rx_pktcount = 0; Adapter->mppriv.rx_crcerrpktcount = 0; - } else { + } else status = NDIS_STATUS_INVALID_LENGTH; - } -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -625,7 +541,6 @@ NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_p NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) { status = NDIS_STATUS_NOT_ACCEPTED; @@ -636,11 +551,10 @@ _func_enter_; ResetPhyRxPktCount(Adapter); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -649,9 +563,7 @@ NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_ NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_received_hdl\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -660,18 +572,16 @@ _func_enter_; return NDIS_STATUS_INVALID_LENGTH; _irqlevel_changed_(&oldirql, LOWER); - *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter); + *(ULONG *)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter); _irqlevel_changed_(&oldirql, RAISE); *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_get_phy_rx_packet_received_hdl: recv_ok=%d\n", *(ULONG*)poid_par_priv->information_buf)); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -680,9 +590,7 @@ NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_p NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_crc32_error_hdl\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -692,18 +600,16 @@ _func_enter_; return NDIS_STATUS_INVALID_LENGTH; _irqlevel_changed_(&oldirql, LOWER); - *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter); + *(ULONG *)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter); _irqlevel_changed_(&oldirql, RAISE); *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_get_phy_rx_packet_crc32_error_hdl: recv_err=%d\n", *(ULONG*)poid_par_priv->information_buf)); -_func_exit_; return status; } -//**************** oid_rtl_seg_81_80_20 section end **************** +/* **************** oid_rtl_seg_81_80_20 section end **************** */ NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -713,22 +619,20 @@ NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_continuous_tx_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; - bStartTest = *((u32*)poid_par_priv->information_buf); + bStartTest = *((u32 *)poid_par_priv->information_buf); _irqlevel_changed_(&oldirql, LOWER); - SetContinuousTx(Adapter,(u8)bStartTest); + SetContinuousTx(Adapter, (u8)bStartTest); if (bStartTest) { struct mp_priv *pmp_priv = &Adapter->mppriv; if (pmp_priv->tx.stop == 0) { pmp_priv->tx.stop = 1; - DBG_871X("%s: pkt tx is running...\n", __func__); + RTW_INFO("%s: pkt tx is running...\n", __func__); rtw_msleep_os(5); } pmp_priv->tx.stop = 0; @@ -737,7 +641,6 @@ _func_enter_; } _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } @@ -751,14 +654,12 @@ NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_p NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_carrier_tx_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; - bStartTest = *((u32*)poid_par_priv->information_buf); + bStartTest = *((u32 *)poid_par_priv->information_buf); _irqlevel_changed_(&oldirql, LOWER); SetSingleCarrierTx(Adapter, (u8)bStartTest); @@ -766,7 +667,7 @@ _func_enter_; struct mp_priv *pmp_priv = &Adapter->mppriv; if (pmp_priv->tx.stop == 0) { pmp_priv->tx.stop = 1; - DBG_871X("%s: pkt tx is running...\n", __func__); + RTW_INFO("%s: pkt tx is running...\n", __func__); rtw_msleep_os(5); } pmp_priv->tx.stop = 0; @@ -775,7 +676,6 @@ _func_enter_; } _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } @@ -789,14 +689,12 @@ NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_ NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_carrier_suppression_tx_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; - bStartTest = *((u32*)poid_par_priv->information_buf); + bStartTest = *((u32 *)poid_par_priv->information_buf); _irqlevel_changed_(&oldirql, LOWER); SetCarrierSuppressionTx(Adapter, (u8)bStartTest); @@ -804,7 +702,7 @@ _func_enter_; struct mp_priv *pmp_priv = &Adapter->mppriv; if (pmp_priv->tx.stop == 0) { pmp_priv->tx.stop = 1; - DBG_871X("%s: pkt tx is running...\n", __func__); + RTW_INFO("%s: pkt tx is running...\n", __func__); rtw_msleep_os(5); } pmp_priv->tx.stop = 0; @@ -813,7 +711,6 @@ _func_enter_; } _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } @@ -823,29 +720,26 @@ NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv #ifdef PLATFORM_OS_XP _irqL oldirql; #endif - u32 bStartTest; + u32 bStartTest; NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_tone_tx_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; - bStartTest = *((u32*)poid_par_priv->information_buf); + bStartTest = *((u32 *)poid_par_priv->information_buf); _irqlevel_changed_(&oldirql, LOWER); - SetSingleToneTx(Adapter,(u8)bStartTest); + SetSingleToneTx(Adapter, (u8)bStartTest); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv) +NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv *poid_par_priv) { return 0; } @@ -858,7 +752,6 @@ NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv) _irqL oldirql; #endif NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -867,12 +760,11 @@ _func_enter_; rtw_hal_set_hwreg(Adapter, HW_VAR_TRIGGER_GPIO_0, 0); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//**************** oid_rtl_seg_81_80_00 section end **************** -//------------------------------------------------------------------------------ +/* **************** oid_rtl_seg_81_80_00 section end **************** + * ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -885,7 +777,6 @@ NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv) PNDIS_802_11_SSID pssid; -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -906,28 +797,24 @@ _func_enter_; *poid_par_priv->bytes_rw = sizeof(NDIS_802_11_SSID); -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP _irqL oldirql; #endif - pRW_Reg RegRWStruct; + pRW_Reg RegRWStruct; u32 offset, width; NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_info_, - ("+oid_rt_pro_read_register_hdl\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -942,44 +829,37 @@ _func_enter_; _irqlevel_changed_(&oldirql, LOWER); switch (width) { - case 1: - RegRWStruct->value = rtw_read8(Adapter, offset); - break; - case 2: - RegRWStruct->value = rtw_read16(Adapter, offset); - break; - default: - width = 4; - RegRWStruct->value = rtw_read32(Adapter, offset); - break; + case 1: + RegRWStruct->value = rtw_read8(Adapter, offset); + break; + case 2: + RegRWStruct->value = rtw_read16(Adapter, offset); + break; + default: + width = 4; + RegRWStruct->value = rtw_read32(Adapter, offset); + break; } - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_read_register_hdl: offset:0x%04X value:0x%X\n", - offset, RegRWStruct->value)); _irqlevel_changed_(&oldirql, RAISE); *poid_par_priv->bytes_rw = width; -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP _irqL oldirql; #endif - pRW_Reg RegRWStruct; + pRW_Reg RegRWStruct; u32 offset, width, value; NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_info_, - ("+oid_rt_pro_write_register_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -994,41 +874,36 @@ _func_enter_; _irqlevel_changed_(&oldirql, LOWER); - switch (RegRWStruct->width) - { - case 1: - if (value > 0xFF) { - status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - rtw_write8(padapter, offset, (u8)value); - break; - case 2: - if (value > 0xFFFF) { - status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - rtw_write16(padapter, offset, (u16)value); - break; - case 4: - rtw_write32(padapter, offset, value); - break; - default: + switch (RegRWStruct->width) { + case 1: + if (value > 0xFF) { status = NDIS_STATUS_NOT_ACCEPTED; break; + } + rtw_write8(padapter, offset, (u8)value); + break; + case 2: + if (value > 0xFFFF) { + status = NDIS_STATUS_NOT_ACCEPTED; + break; + } + rtw_write16(padapter, offset, (u16)value); + break; + case 4: + rtw_write32(padapter, offset, value); + break; + default: + status = NDIS_STATUS_NOT_ACCEPTED; + break; } _irqlevel_changed_(&oldirql, RAISE); - RT_TRACE(_module_mp_, _drv_info_, - ("-oid_rt_pro_write_register_hdl: offset=0x%08X width=%d value=0x%X\n", - offset, width, value)); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1039,9 +914,7 @@ NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_pri NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_read_register_hdl\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1054,16 +927,14 @@ _func_enter_; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_read_register_hdl\n")); -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1074,9 +945,7 @@ NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_pr NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_write_register_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1087,22 +956,20 @@ _func_enter_; rtw_write_mem(padapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data); _irqlevel_changed_(&oldirql, RAISE); - RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_write_register_hdl\n")); -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv) { #if 0 NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); #ifdef PLATFORM_OS_XP _irqL oldirql; @@ -1110,40 +977,30 @@ NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv) TX_CMD_Desc *TxCmd_Info; -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; - RT_TRACE(_module_mp_, _drv_info_, ("+Set OID_RT_PRO_WRITE_TXCMD\n")); - TxCmd_Info=(TX_CMD_Desc*)poid_par_priv->information_buf; + TxCmd_Info = (TX_CMD_Desc *)poid_par_priv->information_buf; - RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:Addr=%.8X\n", TxCmd_Info->offset)); - RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:1.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[0])); - RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:2.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[1])); - RT_TRACE(_module_mp_, _drv_info_, (("WRITE_TXCMD:3.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[2])); - RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:4.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[3])); - _irqlevel_changed_(&oldirql, LOWER); + _irqlevel_changed_(&oldirql, LOWER); - rtw_write32(Adapter, TxCmd_Info->offset + 0, (unsigned int)TxCmd_Info->TxCMD.value[0]); - rtw_write32(Adapter, TxCmd_Info->offset + 4, (unsigned int)TxCmd_Info->TxCMD.value[1]); + rtw_write32(Adapter, TxCmd_Info->offset + 0, (unsigned int)TxCmd_Info->TxCMD.value[0]); + rtw_write32(Adapter, TxCmd_Info->offset + 4, (unsigned int)TxCmd_Info->TxCMD.value[1]); - _irqlevel_changed_(&oldirql, RAISE); + _irqlevel_changed_(&oldirql, RAISE); - RT_TRACE(_module_mp_, _drv_notice_, - ("-Set OID_RT_PRO_WRITE_TXCMD: status=0x%08X\n", status)); -_func_exit_; - return status; + return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1154,9 +1011,7 @@ NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_info_, ("+Query OID_RT_PRO_READ16_EEPROM\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1169,11 +1024,7 @@ _func_enter_; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_notice_, - ("-Query OID_RT_PRO_READ16_EEPROM: offset=0x%x value=0x%x\n", - pEEPROM->offset, pEEPROM->value)); -_func_exit_; return status; #else @@ -1181,8 +1032,8 @@ _func_exit_; #endif } -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv *poid_par_priv) +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv) { #if 0 #ifdef PLATFORM_OS_XP @@ -1192,9 +1043,7 @@ NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_WRITE16_EEPROM\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1207,24 +1056,22 @@ _func_enter_; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv) { #if 0 - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); NDIS_STATUS status = NDIS_STATUS_SUCCESS; struct mp_wiparam *pwi_param; -_func_enter_; if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1239,54 +1086,48 @@ _func_enter_; _rtw_memcpy(pwi_param, &Adapter->mppriv.workparam, sizeof(struct mp_wiparam)); Adapter->mppriv.act_in_progress = _FALSE; -// RT_TRACE(_module_mp_, _drv_info_, ("rf:%x\n", pwiparam->IoValue)); *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv) { #if 0 - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro8711_pkt_loss_hdl\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; - if (poid_par_priv->information_buf_len < sizeof(uint)*2) { - RT_TRACE(_module_mp_, _drv_err_, ("-oid_rt_pro8711_pkt_loss_hdl: buf_len=%d\n", (int)poid_par_priv->information_buf_len)); + if (poid_par_priv->information_buf_len < sizeof(uint) * 2) { return NDIS_STATUS_INVALID_LENGTH; } - if (*(uint*)poid_par_priv->information_buf == 1)//init==1 + if (*(uint *)poid_par_priv->information_buf == 1) /* init==1 */ Adapter->mppriv.rx_pktloss = 0; - *((uint*)poid_par_priv->information_buf+1) = Adapter->mppriv.rx_pktloss; + *((uint *)poid_par_priv->information_buf + 1) = Adapter->mppriv.rx_pktloss; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) { #if 0 - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; struct intf_hdl *pintfhdl = &pio_queue->intf; @@ -1299,34 +1140,31 @@ NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); #endif -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+Query OID_RT_RD_ATTRIB_MEM\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; #ifdef CONFIG_SDIO_HCI _irqlevel_changed_(&oldirql, LOWER); -{ - u32 *plmem = (u32*)poid_par_priv->information_buf+2; - _attrib_read = pintfhdl->io_ops._attrib_read; - _attrib_read(pintfhdl, *((u32*)poid_par_priv->information_buf), - *((u32*)poid_par_priv->information_buf+1), (u8*)plmem); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -} + { + u32 *plmem = (u32 *)poid_par_priv->information_buf + 2; + _attrib_read = pintfhdl->io_ops._attrib_read; + _attrib_read(pintfhdl, *((u32 *)poid_par_priv->information_buf), + *((u32 *)poid_par_priv->information_buf + 1), (u8 *)plmem); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } _irqlevel_changed_(&oldirql, RAISE); #endif -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv *poid_par_priv) +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_wr_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) { #if 0 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -1342,30 +1180,28 @@ NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv *poid_par_priv) void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); #endif -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; #ifdef CONFIG_SDIO_HCI _irqlevel_changed_(&oldirql, LOWER); -{ - u32 *plmem = (u32*)poid_par_priv->information_buf + 2; - _attrib_write = pintfhdl->io_ops._attrib_write; - _attrib_write(pintfhdl, *(u32*)poid_par_priv->information_buf, - *((u32*)poid_par_priv->information_buf+1), (u8*)plmem); -} + { + u32 *plmem = (u32 *)poid_par_priv->information_buf + 2; + _attrib_write = pintfhdl->io_ops._attrib_write; + _attrib_write(pintfhdl, *(u32 *)poid_par_priv->information_buf, + *((u32 *)poid_par_priv->information_buf + 1), (u8 *)plmem); + } _irqlevel_changed_(&oldirql, RAISE); #endif -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1376,28 +1212,25 @@ NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv) #endif NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_RF_INTFS\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; _irqlevel_changed_(&oldirql, LOWER); - if (rtw_setrfintfs_cmd(Adapter, *(unsigned char*)poid_par_priv->information_buf) == _FAIL) + if (rtw_setrfintfs_cmd(Adapter, *(unsigned char *)poid_par_priv->information_buf) == _FAIL) status = NDIS_STATUS_NOT_ACCEPTED; _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1405,22 +1238,20 @@ NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; - _rtw_memcpy(poid_par_priv->information_buf, (unsigned char*)&Adapter->mppriv.rxstat, sizeof(struct recv_stat)); + _rtw_memcpy(poid_par_priv->information_buf, (unsigned char *)&Adapter->mppriv.rxstat, sizeof(struct recv_stat)); *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1430,45 +1261,33 @@ NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv) PCFG_DBG_MSG_STRUCT pdbg_msg; -_func_enter_; -// RT_TRACE(0xffffffffff,_drv_alert_,("===> oid_rt_pro_cfg_debug_message_hdl.\n")); -#if 0//#ifdef CONFIG_DEBUG_RTL871X +#if 0/*#ifdef CONFIG_DEBUG_RTL871X*/ pdbg_msg = (PCFG_DBG_MSG_STRUCT)(poid_par_priv->information_buf); if (poid_par_priv->type_of_oid == SET_OID) { - RT_TRACE(0xffffffffff, _drv_alert_, - ("===>Set level :0x%08x, H32:0x%08x L32:0x%08x\n", - pdbg_msg->DebugLevel, pdbg_msg->DebugComponent_H32, pdbg_msg->DebugComponent_L32)); GlobalDebugLevel = pdbg_msg->DebugLevel; GlobalDebugComponents = (pdbg_msg->DebugComponent_H32 << 32) | pdbg_msg->DebugComponent_L32; - RT_TRACE(0xffffffffff, _drv_alert_, - ("===> Set level :0x%08x, component:0x%016x\n", - GlobalDebugLevel, (u32)GlobalDebugComponents)); } else { pdbg_msg->DebugLevel = GlobalDebugLevel; pdbg_msg->DebugComponent_H32 = (u32)(GlobalDebugComponents >> 32); pdbg_msg->DebugComponent_L32 = (u32)GlobalDebugComponents; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(0xffffffffff, _drv_alert_, - ("===>Query level:0x%08x H32:0x%08x L32:0x%08x\n", - (u32)pdbg_msg->DebugLevel, (u32)pdbg_msg->DebugComponent_H32, (u32)pdbg_msg->DebugComponent_L32)); } #endif -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv) { PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); @@ -1478,25 +1297,22 @@ NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv) #endif NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_DATA_RATE_EX\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; _irqlevel_changed_(&oldirql, LOWER); - if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) !=_SUCCESS) + if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) != _SUCCESS) status = NDIS_STATUS_NOT_ACCEPTED; _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//----------------------------------------------------------------------------- +/* ----------------------------------------------------------------------------- */ NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -1506,9 +1322,7 @@ NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv) u8 thermal = 0; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_get_thermal_meter_hdl\n")); if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1520,14 +1334,13 @@ _func_enter_; GetThermalMeter(Adapter, &thermal); _irqlevel_changed_(&oldirql, RAISE); - *(u32*)poid_par_priv->information_buf = (u32)thermal; + *(u32 *)poid_par_priv->information_buf = (u32)thermal; *poid_par_priv->bytes_rw = sizeof(u32); -_func_exit_; return status; } -//----------------------------------------------------------------------------- +/* ----------------------------------------------------------------------------- */ NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1538,9 +1351,7 @@ NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv) #endif NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_tssi_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1551,7 +1362,7 @@ _func_enter_; if (poid_par_priv->information_buf_len < sizeof(u8)) return NDIS_STATUS_INVALID_LENGTH; - //init workparam + /* init workparam */ Adapter->mppriv.act_in_progress = _TRUE; Adapter->mppriv.workparam.bcompleted = _FALSE; Adapter->mppriv.workparam.act_type = MPT_READ_TSSI; @@ -1560,19 +1371,18 @@ _func_enter_; _irqlevel_changed_(&oldirql, LOWER); - if (!rtw_gettssi_cmd(Adapter,0, (u8*)&Adapter->mppriv.workparam.io_value)) + if (!rtw_gettssi_cmd(Adapter, 0, (u8 *)&Adapter->mppriv.workparam.io_value)) status = NDIS_STATUS_NOT_ACCEPTED; _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -1582,10 +1392,9 @@ NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; -// if (poid_par_priv->type_of_oid != SET_OID) -// return NDIS_STATUS_NOT_ACCEPTED; + /* if (poid_par_priv->type_of_oid != SET_OID) + * return NDIS_STATUS_NOT_ACCEPTED; */ if (poid_par_priv->information_buf_len < sizeof(u8)) return NDIS_STATUS_INVALID_LENGTH; @@ -1594,21 +1403,17 @@ _func_enter_; if (poid_par_priv->type_of_oid == SET_OID) { u8 enable; - enable = *(u8*)poid_par_priv->information_buf; - RT_TRACE(_module_mp_, _drv_notice_, - ("+oid_rt_pro_set_power_tracking_hdl: enable=%d\n", enable)); + enable = *(u8 *)poid_par_priv->information_buf; SetPowerTracking(Adapter, enable); - } else { - GetPowerTracking(Adapter, (u8*)poid_par_priv->information_buf); - } + } else + GetPowerTracking(Adapter, (u8 *)poid_par_priv->information_buf); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//----------------------------------------------------------------------------- +/* ----------------------------------------------------------------------------- */ NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1621,21 +1426,18 @@ NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - RT_TRACE(_module_mp_, _drv_info_, ("+OID_RT_PRO_SET_BASIC_RATE\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; #if 0 - ratevalue = *((u32*)poid_par_priv->information_buf); + ratevalue = *((u32 *)poid_par_priv->information_buf); for (i = 0; i < NumRates; i++) { if (ratevalue == mpdatarate[i]) datarates[i] = mpdatarate[i]; else datarates[i] = 0xff; - RT_TRACE(_module_rtl871x_ioctl_c_, _drv_info_, ("basicrate_inx=%d\n", datarates[i])); } _irqlevel_changed_(&oldirql, LOWER); @@ -1645,17 +1447,14 @@ _func_enter_; _irqlevel_changed_(&oldirql, RAISE); #endif - RT_TRACE(_module_mp_, _drv_notice_, - ("-OID_RT_PRO_SET_BASIC_RATE: status=0x%08X\n", status)); -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1663,7 +1462,6 @@ NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1675,18 +1473,14 @@ _func_enter_; _rtw_memcpy(poid_par_priv->information_buf, &(adapter_to_pwrctl(Adapter)->pwr_mode), 8); *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_qry_pwrstate_hdl: pwr_mode=%d smart_ps=%d\n", - adapter_to_pwrctl(Adapter)->pwr_mode, adapter_to_pwrctl(Adapter)->smart_ps)); -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1696,9 +1490,7 @@ NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv) uint pwr_mode, smart_ps; -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_SET_PWRSTATE\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1714,14 +1506,13 @@ _func_enter_; *poid_par_priv->bytes_rw = 8; -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1735,7 +1526,6 @@ NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv struct setratable_parm *prate_table; u8 res; -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -1744,7 +1534,7 @@ _func_enter_; if (poid_par_priv->information_buf_len < sizeof(struct setratable_parm)) return NDIS_STATUS_INVALID_LENGTH; - prate_table = (struct setratable_parm*)poid_par_priv->information_buf; + prate_table = (struct setratable_parm *)poid_par_priv->information_buf; _irqlevel_changed_(&oldirql, LOWER); res = rtw_setrttbl_cmd(Adapter, prate_table); @@ -1753,14 +1543,13 @@ _func_enter_; if (res == _FAIL) status = NDIS_STATUS_FAILURE; -_func_exit_; return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1768,40 +1557,35 @@ NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; - #if 0 - struct mp_wi_cntx *pmp_wi_cntx=&(Adapter->mppriv.wi_cntx); - u8 res=_SUCCESS; - DEBUG_INFO(("===> Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); +#if 0 + struct mp_wi_cntx *pmp_wi_cntx = &(Adapter->mppriv.wi_cntx); + u8 res = _SUCCESS; + DEBUG_INFO(("===> Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); - if(pmp_wi_cntx->bmp_wi_progress ==_TRUE){ - DEBUG_ERR(("\n mp workitem is progressing, not allow to set another workitem right now!!!\n")); - Status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - else{ - pmp_wi_cntx->bmp_wi_progress=_TRUE; - pmp_wi_cntx->param.bcompleted=_FALSE; - pmp_wi_cntx->param.act_type=MPT_GET_RATE_TABLE; - pmp_wi_cntx->param.io_offset=0x0; - pmp_wi_cntx->param.bytes_cnt=sizeof(struct getratable_rsp); - pmp_wi_cntx->param.io_value=0xffffffff; + if (pmp_wi_cntx->bmp_wi_progress == _TRUE) { + DEBUG_ERR(("\n mp workitem is progressing, not allow to set another workitem right now!!!\n")); + Status = NDIS_STATUS_NOT_ACCEPTED; + break; + } else { + pmp_wi_cntx->bmp_wi_progress = _TRUE; + pmp_wi_cntx->param.bcompleted = _FALSE; + pmp_wi_cntx->param.act_type = MPT_GET_RATE_TABLE; + pmp_wi_cntx->param.io_offset = 0x0; + pmp_wi_cntx->param.bytes_cnt = sizeof(struct getratable_rsp); + pmp_wi_cntx->param.io_value = 0xffffffff; - res=rtw_getrttbl_cmd(Adapter,(struct getratable_rsp *)pmp_wi_cntx->param.data); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - if(res != _SUCCESS) - { - Status = NDIS_STATUS_NOT_ACCEPTED; - } - } - DEBUG_INFO(("\n <=== Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); - #endif + res = rtw_getrttbl_cmd(Adapter, (struct getratable_rsp *)pmp_wi_cntx->param.data); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + if (res != _SUCCESS) + Status = NDIS_STATUS_NOT_ACCEPTED; + } + DEBUG_INFO(("\n <=== Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); +#endif -_func_exit_; return status; #else @@ -1809,7 +1593,7 @@ _func_exit_; #endif } -//**************** oid_rtl_seg_87_12_00 section start **************** +/* **************** oid_rtl_seg_87_12_00 section start **************** */ NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1825,68 +1609,61 @@ NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv) if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) return NDIS_STATUS_INVALID_LENGTH; - if (poid_par_priv->type_of_oid == SET_OID) - { - encry_mode = *((u8*)poid_par_priv->information_buf); - switch (encry_mode) - { - case HW_CONTROL: - #if 0 - Adapter->registrypriv.software_decrypt=_FALSE; - Adapter->registrypriv.software_encrypt=_FALSE; - #else - psecuritypriv->sw_decrypt = _FALSE; - psecuritypriv->sw_encrypt = _FALSE; - #endif - break; - case SW_CONTROL: - #if 0 - Adapter->registrypriv.software_decrypt=_TRUE; - Adapter->registrypriv.software_encrypt=_TRUE; - #else - psecuritypriv->sw_decrypt = _TRUE; - psecuritypriv->sw_encrypt = _TRUE; - #endif - break; - case HW_ENCRY_SW_DECRY: - #if 0 - Adapter->registrypriv.software_decrypt=_TRUE; - Adapter->registrypriv.software_encrypt=_FALSE; - #else - psecuritypriv->sw_decrypt = _TRUE; - psecuritypriv->sw_encrypt = _FALSE; - #endif - break; - case SW_ENCRY_HW_DECRY: - #if 0 - Adapter->registrypriv.software_decrypt=_FALSE; - Adapter->registrypriv.software_encrypt=_TRUE; - #else - psecuritypriv->sw_decrypt = _FALSE; - psecuritypriv->sw_encrypt = _TRUE; - #endif - break; + if (poid_par_priv->type_of_oid == SET_OID) { + encry_mode = *((u8 *)poid_par_priv->information_buf); + switch (encry_mode) { + case HW_CONTROL: +#if 0 + Adapter->registrypriv.software_decrypt = _FALSE; + Adapter->registrypriv.software_encrypt = _FALSE; +#else + psecuritypriv->sw_decrypt = _FALSE; + psecuritypriv->sw_encrypt = _FALSE; +#endif + break; + case SW_CONTROL: +#if 0 + Adapter->registrypriv.software_decrypt = _TRUE; + Adapter->registrypriv.software_encrypt = _TRUE; +#else + psecuritypriv->sw_decrypt = _TRUE; + psecuritypriv->sw_encrypt = _TRUE; +#endif + break; + case HW_ENCRY_SW_DECRY: +#if 0 + Adapter->registrypriv.software_decrypt = _TRUE; + Adapter->registrypriv.software_encrypt = _FALSE; +#else + psecuritypriv->sw_decrypt = _TRUE; + psecuritypriv->sw_encrypt = _FALSE; +#endif + break; + case SW_ENCRY_HW_DECRY: +#if 0 + Adapter->registrypriv.software_decrypt = _FALSE; + Adapter->registrypriv.software_encrypt = _TRUE; +#else + psecuritypriv->sw_decrypt = _FALSE; + psecuritypriv->sw_encrypt = _TRUE; +#endif + break; } - RT_TRACE(_module_rtl871x_ioctl_c_, _drv_notice_, - ("-oid_rt_pro_encryption_ctrl_hdl: SET encry_mode=0x%x sw_encrypt=0x%x sw_decrypt=0x%x\n", - encry_mode, psecuritypriv->sw_encrypt, psecuritypriv->sw_decrypt)); - } - else { - #if 0 + } else { +#if 0 if (Adapter->registrypriv.software_encrypt == _FALSE) { if (Adapter->registrypriv.software_decrypt == _FALSE) encry_mode = HW_CONTROL; else encry_mode = HW_ENCRY_SW_DECRY; - } - else { + } else { if (Adapter->registrypriv.software_decrypt == _FALSE) encry_mode = SW_ENCRY_HW_DECRY; else encry_mode = SW_CONTROL; } - #else +#else if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _FALSE)) encry_mode = HW_CONTROL; @@ -1897,14 +1674,11 @@ NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv) else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _TRUE)) encry_mode = SW_CONTROL; - #endif +#endif - *(u8*)poid_par_priv->information_buf = encry_mode; + *(u8 *)poid_par_priv->information_buf = encry_mode; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_encryption_ctrl_hdl: QUERY encry_mode=0x%x\n", - encry_mode)); } return status; @@ -1912,7 +1686,7 @@ NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv) return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1924,7 +1698,7 @@ NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; struct sta_info *psta = NULL; - UCHAR *macaddr; + UCHAR *macaddr; if (poid_par_priv->type_of_oid != SET_OID) @@ -1936,23 +1710,17 @@ NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv) macaddr = (UCHAR *) poid_par_priv->information_buf ; - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_, - ("OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) )); _irqlevel_changed_(&oldirql, LOWER); psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); - if (psta == NULL) { // the sta have been in sta_info_queue => do nothing + if (psta == NULL) { /* the sta have been in sta_info_queue => do nothing */ psta = rtw_alloc_stainfo(&Adapter->stapriv, macaddr); if (psta == NULL) { - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("Can't alloc sta_info when OID_RT_PRO_ADD_STA_INFO\n")); status = NDIS_STATUS_FAILURE; } - } else { //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY) - RT_TRACE(_module_rtl871x_ioctl_c_, _drv_err_, - ("Error: OID_RT_PRO_ADD_STA_INFO: sta has been in sta_hash_queue \n")); } _irqlevel_changed_(&oldirql, RAISE); @@ -1962,7 +1730,7 @@ NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv) return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -1985,14 +1753,12 @@ NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv) return NDIS_STATUS_INVALID_LENGTH; macaddr = (UCHAR *) poid_par_priv->information_buf ; - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_, - ("+OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) )); psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); if (psta != NULL) { - //_enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); + /* _enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); */ rtw_free_stainfo(Adapter, psta); - //_exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); + /* _exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); */ } return status; @@ -2000,7 +1766,7 @@ NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv) return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ #if 0 static u32 mp_query_drv_var(_adapter *padapter, u8 offset, u32 var) { @@ -2009,166 +1775,89 @@ static u32 mp_query_drv_var(_adapter *padapter, u8 offset, u32 var) if (offset == 1) { u16 tmp_blk_num; tmp_blk_num = rtw_read16(padapter, SDIO_RX0_RDYBLK_NUM); - RT_TRACE(_module_mp_, _drv_err_, ("Query Information, mp_query_drv_var SDIO_RX0_RDYBLK_NUM=0x%x dvobj.rxblknum=0x%x\n", tmp_blk_num, adapter_to_dvobj(padapter)->rxblknum)); if (adapter_to_dvobj(padapter)->rxblknum != tmp_blk_num) { - RT_TRACE(_module_mp_,_drv_err_, ("Query Information, mp_query_drv_var call recv rx\n")); - // sd_recv_rxfifo(padapter); + /* sd_recv_rxfifo(padapter); */ } } #if 0 - if(offset <=100){ //For setting data rate and query data rate - if(offset==100){ //For query data rate - RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): query rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate)); - var=padapter->registrypriv.tx_rate; + if (offset <= 100) { /* For setting data rate and query data rate */ + if (offset == 100) { /* For query data rate */ + var = padapter->registrypriv.tx_rate; + + } else if (offset < 0x1d) { /* For setting data rate */ + padapter->registrypriv.tx_rate = offset; + var = padapter->registrypriv.tx_rate; + padapter->registrypriv.use_rate = _TRUE; + } else { /* not use the data rate */ + padapter->registrypriv.use_rate = _FALSE; + } + } else if (offset <= 110) { /* for setting debug level */ + if (offset == 110) { /* For query data rate */ + padapter->registrypriv.dbg_level = GlobalDebugLevel; + var = padapter->registrypriv.dbg_level; + } else if (offset < 110 && offset > 100) { + padapter->registrypriv.dbg_level = GlobalDebugLevel = offset - 100; + var = padapter->registrypriv.dbg_level; } - else if(offset<0x1d){ //For setting data rate - padapter->registrypriv.tx_rate=offset; - var=padapter->registrypriv.tx_rate; - padapter->registrypriv.use_rate=_TRUE; - RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): set rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate)); - } - else{ //not use the data rate - padapter->registrypriv.use_rate=_FALSE; - RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) out of rate range\n",offset)); - } - } - else if (offset<=110){ //for setting debug level - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d) for set debug level\n",offset)); - if(offset==110){ //For query data rate - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): query dbg level=0x%.2x \n",offset,padapter->registrypriv.dbg_level)); - padapter->registrypriv.dbg_level=GlobalDebugLevel; - var=padapter->registrypriv.dbg_level; - } - else if(offset<110 && offset>100){ - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): set dbg level=0x%.2x \n",offset,offset-100)); - padapter->registrypriv.dbg_level=GlobalDebugLevel=offset-100; - var=padapter->registrypriv.dbg_level; - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_alert_, (" mp_query_drv_var(_drv_alert_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_crit_, (" mp_query_drv_var(_drv_crit_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_err_, (" mp_query_drv_var(_drv_err_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_warning_, (" mp_query_drv_var(_drv_warning_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_notice_, (" mp_query_drv_var(_drv_notice_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_info_, (" mp_query_drv_var(_drv_info_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_debug_, (" mp_query_drv_var(_drv_debug_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - - } - } - else if(offset >110 &&offset <116){ - if(115==offset){ - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): query TRX access type: [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode)); - } - else { - switch(offset){ - case 111: - adapter_to_dvobj(padapter)->tx_block_mode=1; - adapter_to_dvobj(padapter)->rx_block_mode=1; - RT_TRACE(_module_mp_, _drv_emerg_, \ - (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode)); - break; - case 112: - adapter_to_dvobj(padapter)->tx_block_mode=1; - adapter_to_dvobj(padapter)->rx_block_mode=0; - RT_TRACE(_module_mp_, _drv_emerg_, \ - (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode)); - break; - case 113: - adapter_to_dvobj(padapter)->tx_block_mode=0; - adapter_to_dvobj(padapter)->rx_block_mode=1; - RT_TRACE(_module_mp_, _drv_emerg_, \ - (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode)); - break; - case 114: - adapter_to_dvobj(padapter)->tx_block_mode=0; - adapter_to_dvobj(padapter)->rx_block_mode=0; - RT_TRACE(_module_mp_, _drv_emerg_, \ - (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode)); - break; - default : - break; + } else if (offset > 110 && offset < 116) { + if (115 == offset) { + } else { + switch (offset) { + case 111: + adapter_to_dvobj(padapter)->tx_block_mode = 1; + adapter_to_dvobj(padapter)->rx_block_mode = 1; + break; + case 112: + adapter_to_dvobj(padapter)->tx_block_mode = 1; + adapter_to_dvobj(padapter)->rx_block_mode = 0; + break; + case 113: + adapter_to_dvobj(padapter)->tx_block_mode = 0; + adapter_to_dvobj(padapter)->rx_block_mode = 1; + break; + case 114: + adapter_to_dvobj(padapter)->tx_block_mode = 0; + adapter_to_dvobj(padapter)->rx_block_mode = 0; + break; + default: + break; } } - } - else if(offset>=127){ + } else if (offset >= 127) { u64 prnt_dbg_comp; u8 chg_idx; u64 tmp_dbg_comp; - chg_idx=offset-0x80; - tmp_dbg_comp=BIT(chg_idx); - prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; - RT_TRACE(_module_mp_, _drv_emerg_, (" 1: mp_query_drv_var: offset(%d;0x%x):for dbg conpoment prnt_dbg_comp=0x%.16x GlobalDebugComponents=0x%.16x padapter->registrypriv.dbg_component=0x%.16x\n",offset,offset,prnt_dbg_comp,GlobalDebugComponents,padapter->registrypriv.dbg_component)); - if(offset==127){ - // prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; - var=(u32)(padapter->registrypriv.dbg_component); - RT_TRACE(0xffffffff, _drv_emerg_, ("2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) \n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); - prnt_dbg_comp=GlobalDebugComponents; - RT_TRACE(0xffffffff, _drv_emerg_, ("2-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); - prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component; - RT_TRACE(0xffffffff, _drv_emerg_, ("2-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); + chg_idx = offset - 0x80; + tmp_dbg_comp = BIT(chg_idx); + prnt_dbg_comp = padapter->registrypriv.dbg_component = GlobalDebugComponents; + if (offset == 127) { + /* prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; */ + var = (u32)(padapter->registrypriv.dbg_component); + prnt_dbg_comp = GlobalDebugComponents; + prnt_dbg_comp = GlobalDebugComponents = padapter->registrypriv.dbg_component; + + } else { + prnt_dbg_comp = GlobalDebugComponents; + prnt_dbg_comp = GlobalDebugComponents = padapter->registrypriv.dbg_component; + + if (GlobalDebugComponents & tmp_dbg_comp) { + /* this bit is already set, now clear it */ + GlobalDebugComponents = GlobalDebugComponents & (~tmp_dbg_comp); + } else { + /* this bit is not set, now set it. */ + GlobalDebugComponents = GlobalDebugComponents | tmp_dbg_comp; + } + prnt_dbg_comp = GlobalDebugComponents; + + var = (u32)(GlobalDebugComponents); + /* GlobalDebugComponents=padapter->registrypriv.dbg_component; */ } - else{ - RT_TRACE(0xffffffff, _drv_emerg_, ("3: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx)); - prnt_dbg_comp=GlobalDebugComponents; - RT_TRACE(0xffffffff, _drv_emerg_,("3-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx));// ("3-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment=0x%x chg_idx=%d or0x%x BIT(chg_idx[%d]=0x%x)\n",offset,offset,prnt_dbg_comp,chg_idx,chg_idx,(chg_idx),tmp_dbg_comp) - prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component; - RT_TRACE(0xffffffff, _drv_emerg_, ("3-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); - - if(GlobalDebugComponents&tmp_dbg_comp){ - //this bit is already set, now clear it - GlobalDebugComponents=GlobalDebugComponents&(~tmp_dbg_comp); - } - else{ - //this bit is not set, now set it. - GlobalDebugComponents =GlobalDebugComponents|tmp_dbg_comp; - } - RT_TRACE(0xffffffff, _drv_emerg_, ("4: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp)); - prnt_dbg_comp=GlobalDebugComponents; - RT_TRACE(0xffffffff, _drv_emerg_, ("4-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp)); - - RT_TRACE(_module_rtl871x_xmit_c_, _drv_emerg_, ("0: mp_query_drv_var(_module_rtl871x_xmit_c_:0): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,prnt_dbg_comp)); - RT_TRACE(_module_xmit_osdep_c_, _drv_emerg_, ("1: mp_query_drv_var(_module_xmit_osdep_c_:1): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_recv_c_, _drv_emerg_, ("2: mp_query_drv_var(_module_rtl871x_recv_c_:2): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_recv_osdep_c_, _drv_emerg_, ("3: mp_query_drv_var(_module_recv_osdep_c_:3): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_mlme_c_, _drv_emerg_, ("4: mp_query_drv_var(_module_rtl871x_mlme_c_:4): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_mlme_osdep_c_, _drv_emerg_, (" 5:mp_query_drv_var(_module_mlme_osdep_c_:5): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_emerg_, ("6: mp_query_drv_var(_module_rtl871x_sta_mgt_c_:6): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_cmd_c_, _drv_emerg_, ("7: mp_query_drv_var(_module_rtl871x_cmd_c_:7): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_cmd_osdep_c_, _drv_emerg_, ("8: mp_query_drv_var(_module_cmd_osdep_c_:8): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_io_c_, _drv_emerg_, ("9: mp_query_drv_var(_module_rtl871x_io_c_:9): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_io_osdep_c_, _drv_emerg_, ("10: mp_query_drv_var(_module_io_osdep_c_:10): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_os_intfs_c_, _drv_emerg_, ("11: mp_query_drv_var(_module_os_intfs_c_:11): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_security_c_, _drv_emerg_, ("12: mp_query_drv_var(_module_rtl871x_security_c_:12): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_emerg_, ("13: mp_query_drv_var(_module_rtl871x_eeprom_c_:13): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hal_init_c_, _drv_emerg_, ("14: mp_query_drv_var(_module_hal_init_c_:14): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hci_hal_init_c_, _drv_emerg_, ("15: mp_query_drv_var(_module_hci_hal_init_c_:15): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_ioctl_c_, _drv_emerg_, ("16: mp_query_drv_var(_module_rtl871x_ioctl_c_:16): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_emerg_, ("17: mp_query_drv_var(_module_rtl871x_ioctl_set_c_:17): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_ioctl_query_c_, _drv_emerg_, ("18: mp_query_drv_var(_module_rtl871x_ioctl_query_c_:18): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_emerg_, ("19: mp_query_drv_var(_module_rtl871x_pwrctrl_c_:19): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hci_intfs_c_, _drv_emerg_, ("20: mp_query_drv_var(_module_hci_intfs_c_:20): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hci_ops_c_, _drv_emerg_, ("21: mp_query_drv_var(_module_hci_ops_c_:21): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_osdep_service_c_, _drv_emerg_, ("22: mp_query_drv_var(_module_osdep_service_c_:22): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_mp_, _drv_emerg_, ("23: mp_query_drv_var(_module_mp_:23): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hci_ops_os_c_, _drv_emerg_, ("24: mp_query_drv_var(_module_hci_ops_os_c_:24): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - var=(u32)(GlobalDebugComponents); - //GlobalDebugComponents=padapter->registrypriv.dbg_component; - RT_TRACE(0xffffffff, _drv_emerg_, (" ==mp_query_drv_var(_module_mp_): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - - } - } - else{ - RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) >110\n",offset)); } #endif #endif @@ -2197,7 +1886,6 @@ NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv) if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) return NDIS_STATUS_INVALID_LENGTH; - RT_TRACE(_module_mp_, _drv_notice_, ("+Query Information, OID_RT_PRO_QUERY_DR_VARIABLE\n")); pdrv_var = (struct _DR_VARIABLE_STRUCT_ *)poid_par_priv->information_buf; @@ -2207,16 +1895,13 @@ NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv) *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_query_dr_variable_hdl: offset=0x%x valule=0x%x\n", - pdrv_var->offset, pdrv_var->variable)); return status; #else return 0; #endif } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) { #if 0 @@ -2224,9 +1909,8 @@ NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; - RT_TRACE(_module_mp_, _drv_err_, ("oid_rt_pro_rx_packet_type_hdl...................\n")); - if (poid_par_priv->information_buf_len < sizeof (UCHAR)) { + if (poid_par_priv->information_buf_len < sizeof(UCHAR)) { status = NDIS_STATUS_INVALID_LENGTH; *poid_par_priv->bytes_needed = sizeof(UCHAR); return status; @@ -2234,32 +1918,21 @@ NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) if (poid_par_priv->type_of_oid == SET_OID) { Adapter->mppriv.rx_with_status = *(UCHAR *) poid_par_priv->information_buf; - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n",\ - Adapter->mppriv.rx_with_status)); - 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])); - } - else { + } else { *(UCHAR *) poid_par_priv->information_buf = Adapter->mppriv.rx_with_status; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - 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])); + /* *(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); */ + /* *(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); */ } #endif return NDIS_STATUS_SUCCESS; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -2271,7 +1944,6 @@ NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -2284,30 +1956,24 @@ _func_enter_; cnts = pefuse->cnts; data = pefuse->data; - RT_TRACE(_module_mp_, _drv_notice_, - ("+oid_rt_pro_read_efuse_hd: buf_len=%d addr=%d cnts=%d\n", - poid_par_priv->information_buf_len, addr, cnts)); EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); if ((addr + cnts) > max_available_size) { - RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: parameter error!\n")); return NDIS_STATUS_NOT_ACCEPTED; } _irqlevel_changed_(&oldirql, LOWER); if (rtw_efuse_access(Adapter, _FALSE, addr, cnts, data) == _FAIL) { - RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: rtw_efuse_access FAIL!\n")); status = NDIS_STATUS_FAILURE; } else *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -2320,7 +1986,6 @@ NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv) PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -2330,14 +1995,10 @@ _func_enter_; cnts = pefuse->cnts; data = pefuse->data; - RT_TRACE(_module_mp_, _drv_notice_, - ("+oid_rt_pro_write_efuse_hdl: buf_len=%d addr=0x%04x cnts=%d\n", - poid_par_priv->information_buf_len, addr, cnts)); EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); if ((addr + cnts) > max_available_size) { - RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_write_efuse_hdl: parameter error")); return NDIS_STATUS_NOT_ACCEPTED; } @@ -2346,11 +2007,10 @@ _func_enter_; status = NDIS_STATUS_FAILURE; _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -2360,9 +2020,7 @@ NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv) NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; -// RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_rw_efuse_pgpkt_hdl\n")); *poid_par_priv->bytes_rw = 0; @@ -2373,11 +2031,7 @@ _func_enter_; _irqlevel_changed_(&oldirql, LOWER); - if (poid_par_priv->type_of_oid == QUERY_OID) - { - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_rw_efuse_pgpkt_hdl: Read offset=0x%x\n",\ - ppgpkt->offset)); + if (poid_par_priv->type_of_oid == QUERY_OID) { Efuse_PowerSwitch(Adapter, _FALSE, _TRUE); if (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, _FALSE) == _TRUE) @@ -2386,9 +2040,6 @@ _func_enter_; status = NDIS_STATUS_FAILURE; Efuse_PowerSwitch(Adapter, _FALSE, _FALSE); } else { - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_rw_efuse_pgpkt_hdl: Write offset=0x%x word_en=0x%x\n",\ - ppgpkt->offset, ppgpkt->word_en)); Efuse_PowerSwitch(Adapter, _TRUE, _TRUE); if (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, _FALSE) == _TRUE) @@ -2400,14 +2051,11 @@ _func_enter_; _irqlevel_changed_(&oldirql, RAISE); - RT_TRACE(_module_mp_, _drv_info_, - ("-oid_rt_pro_rw_efuse_pgpkt_hdl: status=0x%08X\n", status)); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -2418,34 +2066,6 @@ NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len information_buf = size; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_FAILURE; - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; if (poid_par_priv->type_of_oid != QUERY_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -2453,38 +2073,55 @@ _func_enter_; if (poid_par_priv->information_buf_len < sizeof(u32)) return NDIS_STATUS_INVALID_LENGTH; - *(u32*)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + _irqlevel_changed_(&oldirql, LOWER); + ret = efuse_GetCurrentSize(Adapter, &size); + _irqlevel_changed_(&oldirql, RAISE); + if (ret == _SUCCESS) { + *(u32 *)poid_par_priv->information_buf = size; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else + status = NDIS_STATUS_FAILURE; - RT_TRACE(_module_mp_, _drv_info_, - ("-oid_rt_get_efuse_max_size_hdl: size=%d status=0x%08X\n", - *(int*)poid_par_priv->information_buf, status)); - -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ +NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + *(u32 *)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + + + return status; +} +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv) { NDIS_STATUS status; -_func_enter_; - RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_efuse_hdl\n")); if (poid_par_priv->type_of_oid == QUERY_OID) status = oid_rt_pro_read_efuse_hdl(poid_par_priv); else status = oid_rt_pro_write_efuse_hdl(poid_par_priv); - RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_efuse_hdl: status=0x%08X\n", status)); -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -2493,11 +2130,9 @@ NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv) u8 *data; NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - u16 mapLen=0; + u16 mapLen = 0; -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_efuse_map_hdl\n")); EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); @@ -2506,42 +2141,30 @@ _func_enter_; if (poid_par_priv->information_buf_len < mapLen) return NDIS_STATUS_INVALID_LENGTH; - data = (u8*)poid_par_priv->information_buf; + data = (u8 *)poid_par_priv->information_buf; _irqlevel_changed_(&oldirql, LOWER); - if (poid_par_priv->type_of_oid == QUERY_OID) - { - RT_TRACE(_module_mp_, _drv_info_, - ("oid_rt_pro_efuse_map_hdl: READ\n")); + if (poid_par_priv->type_of_oid == QUERY_OID) { if (rtw_efuse_map_read(Adapter, 0, mapLen, data) == _SUCCESS) *poid_par_priv->bytes_rw = mapLen; else { - RT_TRACE(_module_mp_, _drv_err_, - ("oid_rt_pro_efuse_map_hdl: READ fail\n")); status = NDIS_STATUS_FAILURE; } } else { - // SET_OID - RT_TRACE(_module_mp_, _drv_info_, - ("oid_rt_pro_efuse_map_hdl: WRITE\n")); + /* SET_OID */ if (rtw_efuse_map_write(Adapter, 0, mapLen, data) == _SUCCESS) *poid_par_priv->bytes_rw = mapLen; else { - RT_TRACE(_module_mp_, _drv_err_, - ("oid_rt_pro_efuse_map_hdl: WRITE fail\n")); status = NDIS_STATUS_FAILURE; } } _irqlevel_changed_(&oldirql, RAISE); - RT_TRACE(_module_mp_, _drv_info_, - ("-oid_rt_pro_efuse_map_hdl: status=0x%08X\n", status)); -_func_exit_; return status; } @@ -2558,25 +2181,23 @@ NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv) u32 crystal_cap = 0; -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; - if (poid_par_priv->information_buf_len information_buf_len < sizeof(u32)) return NDIS_STATUS_INVALID_LENGTH; - crystal_cap = *((u32*)poid_par_priv->information_buf);//4 + crystal_cap = *((u32 *)poid_par_priv->information_buf); /* 4 */ if (crystal_cap > 0xf) return NDIS_STATUS_NOT_ACCEPTED; Adapter->mppriv.curr_crystalcap = crystal_cap; - _irqlevel_changed_(&oldirql,LOWER); + _irqlevel_changed_(&oldirql, LOWER); SetCrystalCap(Adapter); - _irqlevel_changed_(&oldirql,RAISE); + _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; #endif return status; @@ -2588,13 +2209,11 @@ NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) _irqL oldirql; #endif u8 rx_pkt_type; -// u32 rcr_val32; + /* u32 rcr_val32; */ NDIS_STATUS status = NDIS_STATUS_SUCCESS; -// PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + /* PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); */ -_func_enter_; - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_set_rx_packet_type_hdl\n")); if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -2602,75 +2221,63 @@ _func_enter_; if (poid_par_priv->information_buf_len < sizeof(u8)) return NDIS_STATUS_INVALID_LENGTH; - rx_pkt_type = *((u8*)poid_par_priv->information_buf);//4 + rx_pkt_type = *((u8 *)poid_par_priv->information_buf); /* 4 */ - RT_TRACE(_module_mp_, _drv_info_, ("rx_pkt_type: %x\n",rx_pkt_type )); #if 0 _irqlevel_changed_(&oldirql, LOWER); #if 0 - rcr_val8 = rtw_read8(Adapter, 0x10250048);//RCR - rcr_val8 &= ~(RCR_AB|RCR_AM|RCR_APM|RCR_AAP); + rcr_val8 = rtw_read8(Adapter, 0x10250048);/* RCR */ + rcr_val8 &= ~(RCR_AB | RCR_AM | RCR_APM | RCR_AAP); - if(rx_pkt_type == RX_PKT_BROADCAST){ - rcr_val8 |= (RCR_AB | RCR_ACRC32 ); - } - else if(rx_pkt_type == RX_PKT_DEST_ADDR){ - rcr_val8 |= (RCR_AAP| RCR_AM |RCR_ACRC32); - } - else if(rx_pkt_type == RX_PKT_PHY_MATCH){ - rcr_val8 |= (RCR_APM|RCR_ACRC32); - } - else{ - rcr_val8 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); - } - rtw_write8(padapter, 0x10250048,rcr_val8); + if (rx_pkt_type == RX_PKT_BROADCAST) + rcr_val8 |= (RCR_AB | RCR_ACRC32); + else if (rx_pkt_type == RX_PKT_DEST_ADDR) + rcr_val8 |= (RCR_AAP | RCR_AM | RCR_ACRC32); + else if (rx_pkt_type == RX_PKT_PHY_MATCH) + rcr_val8 |= (RCR_APM | RCR_ACRC32); + else + rcr_val8 &= ~(RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_ACRC32); + rtw_write8(padapter, 0x10250048, rcr_val8); #else - rcr_val32 = rtw_read32(padapter, RCR);//RCR = 0x10250048 - rcr_val32 &= ~(RCR_CBSSID|RCR_AB|RCR_AM|RCR_APM|RCR_AAP); + rcr_val32 = rtw_read32(padapter, RCR);/* RCR = 0x10250048 */ + rcr_val32 &= ~(RCR_CBSSID | RCR_AB | RCR_AM | RCR_APM | RCR_AAP); #if 0 - if(rx_pkt_type == RX_PKT_BROADCAST){ - rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); - } - else if(rx_pkt_type == RX_PKT_DEST_ADDR){ - //rcr_val32 |= (RCR_CBSSID|RCR_AAP|RCR_AM|RCR_ACRC32); - rcr_val32 |= (RCR_CBSSID|RCR_APM|RCR_ACRC32); - } - else if(rx_pkt_type == RX_PKT_PHY_MATCH){ - rcr_val32 |= (RCR_APM|RCR_ACRC32); - //rcr_val32 |= (RCR_AAP|RCR_ACRC32); - } - else{ - rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); - } + if (rx_pkt_type == RX_PKT_BROADCAST) + rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32); + else if (rx_pkt_type == RX_PKT_DEST_ADDR) { + /* rcr_val32 |= (RCR_CBSSID|RCR_AAP|RCR_AM|RCR_ACRC32); */ + rcr_val32 |= (RCR_CBSSID | RCR_APM | RCR_ACRC32); + } else if (rx_pkt_type == RX_PKT_PHY_MATCH) { + rcr_val32 |= (RCR_APM | RCR_ACRC32); + /* rcr_val32 |= (RCR_AAP|RCR_ACRC32); */ + } else + rcr_val32 &= ~(RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_ACRC32); #else - switch (rx_pkt_type) - { - case RX_PKT_BROADCAST : - rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); - break; - case RX_PKT_DEST_ADDR : - rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); - break; - case RX_PKT_PHY_MATCH: - rcr_val32 |= (RCR_APM|RCR_ACRC32); - break; - default: - rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); - break; + switch (rx_pkt_type) { + case RX_PKT_BROADCAST: + rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32); + break; + case RX_PKT_DEST_ADDR: + rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32); + break; + case RX_PKT_PHY_MATCH: + rcr_val32 |= (RCR_APM | RCR_ACRC32); + break; + default: + rcr_val32 &= ~(RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_ACRC32); + break; } - if (rx_pkt_type == RX_PKT_DEST_ADDR) { + if (rx_pkt_type == RX_PKT_DEST_ADDR) padapter->mppriv.check_mp_pkt = 1; - } else { + else padapter->mppriv.check_mp_pkt = 0; - } #endif rtw_write32(padapter, RCR, rcr_val32); #endif _irqlevel_changed_(&oldirql, RAISE); #endif -_func_exit_; return status; } @@ -2685,9 +2292,8 @@ NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv) #endif NDIS_STATUS status = NDIS_STATUS_SUCCESS; - u32 txagc; + u32 txagc; -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; @@ -2695,15 +2301,12 @@ _func_enter_; if (poid_par_priv->information_buf_len < sizeof(u32)) return NDIS_STATUS_INVALID_LENGTH; - txagc = *(u32*)poid_par_priv->information_buf; - RT_TRACE(_module_mp_, _drv_info_, - ("oid_rt_pro_set_tx_agc_offset_hdl: 0x%08x\n", txagc)); + txagc = *(u32 *)poid_par_priv->information_buf; _irqlevel_changed_(&oldirql, LOWER); SetTxAGCOffset(Adapter, txagc); _irqlevel_changed_(&oldirql, RAISE); -_func_exit_; return status; #else @@ -2720,30 +2323,26 @@ NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv) struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; struct mp_priv *pmppriv = &Adapter->mppriv; - u32 type; + u32 type; -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) return NDIS_STATUS_NOT_ACCEPTED; - if (poid_par_priv->information_buf_len information_buf_len < sizeof(u32)) return NDIS_STATUS_INVALID_LENGTH; - type = *(u32*)poid_par_priv->information_buf; + type = *(u32 *)poid_par_priv->information_buf; if (_LOOPBOOK_MODE_ == type) { pmppriv->mode = type; - set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc - RT_TRACE(_module_mp_, _drv_info_, ("test mode change to loopback mode:0x%08x.\n", get_fwstate(pmlmepriv))); - } else if (_2MAC_MODE_ == type){ + set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); /* append txdesc */ + } else if (_2MAC_MODE_ == type) { pmppriv->mode = type; _clr_fwstate_(pmlmepriv, WIFI_MP_LPBK_STATE); - RT_TRACE(_module_mp_, _drv_info_, ("test mode change to 2mac mode:0x%08x.\n", get_fwstate(pmlmepriv))); } else status = NDIS_STATUS_NOT_ACCEPTED; -_func_exit_; return status; #else @@ -2758,7 +2357,6 @@ unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) struct mp_priv *pmp_priv; struct pkt_attrib *pattrib; - RT_TRACE(_module_mp_, _drv_notice_, ("+%s\n", __func__)); pparm = (PMP_XMIT_PARM)poid_par_priv->information_buf; padapter = (PADAPTER)poid_par_priv->adapter_context; @@ -2768,9 +2366,9 @@ unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) pparm->enable = !pmp_priv->tx.stop; pparm->count = pmp_priv->tx.sended; } else { - if (pparm->enable == 0) { + if (pparm->enable == 0) pmp_priv->tx.stop = 1; - } else if (pmp_priv->tx.stop == 1) { + else if (pmp_priv->tx.stop == 1) { pmp_priv->tx.stop = 0; pmp_priv->tx.count = pparm->count; pmp_priv->tx.payload = pparm->payload_type; @@ -2794,39 +2392,38 @@ unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) struct rtw_ieee80211_hdr *pwlanhdr; unsigned short *fctrl; int llc_sz, payload_len; - struct mp_xmit_frame *pxframe= NULL; - struct mp_xmit_packet *pmp_xmitpkt = (struct mp_xmit_packet*)param; + struct mp_xmit_frame *pxframe = NULL; + struct mp_xmit_packet *pmp_xmitpkt = (struct mp_xmit_packet *)param; u8 addr3[] = {0x02, 0xE0, 0x4C, 0x87, 0x66, 0x55}; -// DBG_871X("+mp_ioctl_xmit_packet_hdl\n"); + /* RTW_INFO("+mp_ioctl_xmit_packet_hdl\n"); */ pxframe = alloc_mp_xmitframe(&padapter->mppriv); - if (pxframe == NULL) - { + if (pxframe == NULL) { DEBUG_ERR(("Can't alloc pmpframe %d:%s\n", __LINE__, __FILE__)); return -1; } - //mp_xmit_pkt + /* mp_xmit_pkt */ payload_len = pmp_xmitpkt->len - 14; - pmp_pkt = (unsigned char*)pmp_xmitpkt->mem; + pmp_pkt = (unsigned char *)pmp_xmitpkt->mem; pethhdr = (struct ethhdr *)pmp_pkt; - //DBG_871X("payload_len=%d, pkt_mem=0x%x\n", pmp_xmitpkt->len, (void*)pmp_xmitpkt->mem); + /* RTW_INFO("payload_len=%d, pkt_mem=0x%x\n", pmp_xmitpkt->len, (void*)pmp_xmitpkt->mem); */ - //DBG_871X("pxframe=0x%x\n", (void*)pxframe); - //DBG_871X("pxframe->mem=0x%x\n", (void*)pxframe->mem); + /* RTW_INFO("pxframe=0x%x\n", (void*)pxframe); */ + /* RTW_INFO("pxframe->mem=0x%x\n", (void*)pxframe->mem); */ - //update attribute + /* update attribute */ pattrib = &pxframe->attrib; - memset((u8 *)(pattrib), 0, sizeof (struct pkt_attrib)); + memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib)); pattrib->pktlen = pmp_xmitpkt->len; pattrib->ether_type = ntohs(pethhdr->h_proto); pattrib->hdrlen = 24; pattrib->nr_frags = 1; pattrib->priority = 0; #ifndef CONFIG_MP_LINUX - if(IS_MCAST(pethhdr->h_dest)) + if (IS_MCAST(pethhdr->h_dest)) pattrib->mac_id = 4; else pattrib->mac_id = 5; @@ -2834,7 +2431,7 @@ unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) pattrib->mac_id = 5; #endif - // + /* */ memset(pxframe->mem, 0 , WLANHDR_OFFSET); pframe = (u8 *)(pxframe->mem) + WLANHDR_OFFSET; @@ -2852,10 +2449,10 @@ unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) pwlanhdr->seq_ctl = 0; pframe += pattrib->hdrlen; - llc_sz= rtw_put_snap(pframe, pattrib->ether_type); + llc_sz = rtw_put_snap(pframe, pattrib->ether_type); pframe += llc_sz; - _rtw_memcpy(pframe, (void*)(pmp_pkt+14), payload_len); + _rtw_memcpy(pframe, (void *)(pmp_pkt + 14), payload_len); pattrib->last_txcmdsz = pattrib->hdrlen + llc_sz + payload_len; @@ -2865,7 +2462,7 @@ unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) return _SUCCESS; } #endif -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv) { #ifdef PLATFORM_OS_XP @@ -2879,45 +2476,40 @@ NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv) #endif #endif -_func_enter_; if (poid_par_priv->type_of_oid != SET_OID) { status = NDIS_STATUS_NOT_ACCEPTED; return status; } - RT_TRACE(_module_mp_, _drv_info_, - ("\n ===> Setoid_rt_set_power_down_hdl.\n")); _irqlevel_changed_(&oldirql, LOWER); bpwrup = *(u8 *)poid_par_priv->information_buf; - //CALL the power_down function + /* CALL the power_down function */ #ifdef PLATFORM_LINUX -#if defined(CONFIG_RTL8712) //Linux MP insmod unknown symbol - dev_power_down(padapter,bpwrup); +#if defined(CONFIG_RTL8712) /* Linux MP insmod unknown symbol */ + dev_power_down(padapter, bpwrup); #endif #endif _irqlevel_changed_(&oldirql, RAISE); - //DEBUG_ERR(("\n <=== Query OID_RT_PRO_READ_REGISTER. - // Add:0x%08x Width:%d Value:0x%08x\n",RegRWStruct->offset,RegRWStruct->width,RegRWStruct->value)); + /* DEBUG_ERR(("\n <=== Query OID_RT_PRO_READ_REGISTER. */ + /* Add:0x%08x Width:%d Value:0x%08x\n",RegRWStruct->offset,RegRWStruct->width,RegRWStruct->value)); */ -_func_exit_; return status; } -//------------------------------------------------------------------------------ +/* ------------------------------------------------------------------------------ */ NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv) { #if 0 NDIS_STATUS status = NDIS_STATUS_SUCCESS; PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -//#ifdef PLATFORM_OS_XP -// _irqL oldirql; -//#endif + /* #ifdef PLATFORM_OS_XP */ + /* _irqL oldirql; + * #endif */ -_func_enter_; if (poid_par_priv->type_of_oid != QUERY_OID) { status = NDIS_STATUS_NOT_ACCEPTED; @@ -2928,19 +2520,15 @@ _func_enter_; return status; } - RT_TRACE(_module_mp_, _drv_info_, - ("\n ===> oid_rt_get_power_mode_hdl.\n")); -// _irqlevel_changed_(&oldirql, LOWER); - *(int*)poid_par_priv->information_buf = Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL; + /* _irqlevel_changed_(&oldirql, LOWER); */ + *(int *)poid_par_priv->information_buf = Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL; *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -// _irqlevel_changed_(&oldirql, RAISE); + /* _irqlevel_changed_(&oldirql, RAISE); */ -_func_exit_; return status; #else return 0; #endif } - diff --git a/core/rtw_odm.c b/core/rtw_odm.c old mode 100755 new mode 100644 index c5596d5..c0a792c --- a/core/rtw_odm.c +++ b/core/rtw_odm.c @@ -21,156 +21,37 @@ #include #include -const char *odm_comp_str[] = { - /* BIT0 */"ODM_COMP_DIG", - /* BIT1 */"ODM_COMP_RA_MASK", - /* BIT2 */"ODM_COMP_DYNAMIC_TXPWR", - /* BIT3 */"ODM_COMP_FA_CNT", - /* BIT4 */"ODM_COMP_RSSI_MONITOR", - /* BIT5 */"ODM_COMP_CCK_PD", - /* BIT6 */"ODM_COMP_ANT_DIV", - /* BIT7 */"ODM_COMP_PWR_SAVE", - /* BIT8 */"ODM_COMP_PWR_TRAIN", - /* BIT9 */"ODM_COMP_RATE_ADAPTIVE", - /* BIT10 */"ODM_COMP_PATH_DIV", - /* BIT11 */"ODM_COMP_PSD", - /* BIT12 */"ODM_COMP_DYNAMIC_PRICCA", - /* BIT13 */"ODM_COMP_RXHP", - /* BIT14 */"ODM_COMP_MP", - /* BIT15 */"ODM_COMP_CFO_TRACKING", - /* BIT16 */"ODM_COMP_ACS", - /* BIT17 */"PHYDM_COMP_ADAPTIVITY", - /* BIT18 */"PHYDM_COMP_RA_DBG", - /* BIT19 */"PHYDM_COMP_TXBF", - /* BIT20 */"ODM_COMP_EDCA_TURBO", - /* BIT21 */"ODM_COMP_EARLY_MODE", - /* 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 */"ODM_PHY_CONFIG", - /* BIT29 */"BEAMFORMING_DEBUG", - /* BIT30 */"ODM_COMP_COMMON", - /* BIT31 */"ODM_COMP_INIT", - /* BIT32 */"ODM_COMP_NOISY_DETECT", -}; -#define RTW_ODM_COMP_MAX 33 -const char *odm_ability_str[] = { - /* BIT0 */"ODM_BB_DIG", - /* BIT1 */"ODM_BB_RA_MASK", - /* BIT2 */"ODM_BB_DYNAMIC_TXPWR", - /* BIT3 */"ODM_BB_FA_CNT", - /* BIT4 */"ODM_BB_RSSI_MONITOR", - /* BIT5 */"ODM_BB_CCK_PD", - /* BIT6 */"ODM_BB_ANT_DIV", - /* BIT7 */"ODM_BB_PWR_SAVE", - /* BIT8 */"ODM_BB_PWR_TRAIN", - /* BIT9 */"ODM_BB_RATE_ADAPTIVE", - /* BIT10 */"ODM_BB_PATH_DIV", - /* BIT11 */"ODM_BB_PSD", - /* BIT12 */"ODM_BB_RXHP", - /* BIT13 */"ODM_BB_ADAPTIVITY", - /* BIT14 */"ODM_BB_CFO_TRACKING", - /* BIT15 */"ODM_BB_NHM_CNT", - /* BIT16 */"ODM_BB_PRIMARY_CCA", - /* BIT17 */"ODM_BB_TXBF", - /* BIT18 */NULL, - /* BIT19 */NULL, - /* BIT20 */"ODM_MAC_EDCA_TURBO", - /* BIT21 */"ODM_MAC_EARLY_MODE", - /* BIT22 */NULL, - /* BIT23 */NULL, - /* BIT24 */"ODM_RF_TX_PWR_TRACK", - /* BIT25 */"ODM_RF_RX_GAIN_TRACK", - /* BIT26 */"ODM_RF_CALIBRATION", -}; - -#define RTW_ODM_ABILITY_MAX 27 - -const char *odm_dbg_level_str[] = { - NULL, - "ODM_DBG_OFF", - "ODM_DBG_SERIOUS", - "ODM_DBG_WARNING", - "ODM_DBG_LOUD", - "ODM_DBG_TRACE", -}; - -#define RTW_ODM_DBG_LEVEL_NUM 6 - -void rtw_odm_dbg_comp_msg(void *sel, _adapter *adapter) +/* set ODM_CMNINFO_IC_TYPE based on chip_type */ +void rtw_odm_init_ic_type(_adapter *adapter) { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); - DM_ODM_T *odm = &pHalData->odmpriv; - int cnt = 0; - u64 dbg_comp = 0; - int i; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); + DM_ODM_T *odm = &hal_data->odmpriv; + u4Byte ic_type = chip_type_to_odm_ic_type(rtw_get_chip_type(adapter)); - rtw_hal_get_odm_var(adapter, HAL_ODM_DBG_FLAG, &dbg_comp, NULL); + rtw_warn_on(!ic_type); - DBG_871X_SEL_NL(sel, "odm.DebugComponents = 0x%016llx\n", dbg_comp); - for (i=0;iu1ForcedIgiLb = lb; } -void rtw_odm_dbg_level_msg(void *sel, _adapter *adapter) +inline u8 rtw_odm_get_force_igi_lb(_adapter *adapter) { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); - DM_ODM_T *odm = &pHalData->odmpriv; - int cnt = 0; - u32 dbg_level = 0; - int i; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); - rtw_hal_get_odm_var(adapter, HAL_ODM_DBG_LEVEL, &dbg_level, NULL); - DBG_871X_SEL_NL(sel, "odm.DebugLevel = %u\n", dbg_level); - for (i=0;iodmpriv; - int cnt = 0; - u32 ability = 0; - int i; - - ability = rtw_phydm_ability_get(adapter); - DBG_871X_SEL_NL(sel, "odm.SupportAbility = 0x%08x\n", ability); - for (i=0;iu1ForcedIgiLb; } void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter) { - DBG_871X_SEL_NL(sel, "ADAPTIVITY_VERSION "ADAPTIVITY_VERSION"\n"); + RTW_PRINT_SEL(sel, "ADAPTIVITY_VERSION "ADAPTIVITY_VERSION"\n"); } #define RTW_ADAPTIVITY_EN_DISABLE 0 @@ -183,15 +64,14 @@ void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter) HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); DM_ODM_T *odm = &hal_data->odmpriv; - DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_EN_"); + RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_EN_"); - if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_DISABLE) { - DBG_871X_SEL(sel, "DISABLE\n"); - } else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE) { - DBG_871X_SEL(sel, "ENABLE\n"); - } else { - DBG_871X_SEL(sel, "INVALID\n"); - } + if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_DISABLE) + _RTW_PRINT_SEL(sel, "DISABLE\n"); + else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE) + _RTW_PRINT_SEL(sel, "ENABLE\n"); + else + _RTW_PRINT_SEL(sel, "INVALID\n"); } #define RTW_ADAPTIVITY_MODE_NORMAL 0 @@ -201,15 +81,14 @@ void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter) { struct registry_priv *regsty = &adapter->registrypriv; - DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_MODE_"); + RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_MODE_"); - if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_NORMAL) { - DBG_871X_SEL(sel, "NORMAL\n"); - } else if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_CARRIER_SENSE) { - DBG_871X_SEL(sel, "CARRIER_SENSE\n"); - } else { - DBG_871X_SEL(sel, "INVALID\n"); - } + if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_NORMAL) + _RTW_PRINT_SEL(sel, "NORMAL\n"); + else if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_CARRIER_SENSE) + _RTW_PRINT_SEL(sel, "CARRIER_SENSE\n"); + else + _RTW_PRINT_SEL(sel, "INVALID\n"); } #define RTW_ADAPTIVITY_DML_DISABLE 0 @@ -219,22 +98,21 @@ void rtw_odm_adaptivity_dml_msg(void *sel, _adapter *adapter) { struct registry_priv *regsty = &adapter->registrypriv; - DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_DML_"); + RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_DML_"); - if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_DISABLE) { - DBG_871X_SEL(sel, "DISABLE\n"); - } else if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_ENABLE) { - DBG_871X_SEL(sel, "ENABLE\n"); - } else { - DBG_871X_SEL(sel, "INVALID\n"); - } + if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_DISABLE) + _RTW_PRINT_SEL(sel, "DISABLE\n"); + else if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_ENABLE) + _RTW_PRINT_SEL(sel, "ENABLE\n"); + else + _RTW_PRINT_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); + RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_DC_BACKOFF:%u\n", regsty->adaptivity_dc_backoff); } void rtw_odm_adaptivity_config_msg(void *sel, _adapter *adapter) @@ -265,9 +143,9 @@ void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter) rtw_odm_adaptivity_config_msg(sel, adapter); - DBG_871X_SEL_NL(sel, "%10s %16s %16s %22s %12s\n" + RTW_PRINT_SEL(sel, "%10s %16s %16s %22s %12s\n" , "TH_L2H_ini", "TH_EDCCA_HL_diff", "TH_L2H_ini_mode2", "TH_EDCCA_HL_diff_mode2", "EDCCA_enable"); - DBG_871X_SEL_NL(sel, "0x%-8x %-16d 0x%-14x %-22d %-12d\n" + RTW_PRINT_SEL(sel, "0x%-8x %-16d 0x%-14x %-22d %-12d\n" , (u8)odm->TH_L2H_ini , odm->TH_EDCCA_HL_diff , (u8)odm->TH_L2H_ini_mode2 @@ -275,8 +153,8 @@ void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter) , odm->EDCCA_enable ); - DBG_871X_SEL_NL(sel, "%15s %9s\n", "AdapEnableState", "Adap_Flag"); - DBG_871X_SEL_NL(sel, "%-15x %-9x\n" + RTW_PRINT_SEL(sel, "%15s %9s\n", "AdapEnableState", "Adap_Flag"); + RTW_PRINT_SEL(sel, "%-15x %-9x\n" , odm->Adaptivity_enable , odm->adaptivity_flag ); @@ -297,10 +175,10 @@ void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_H void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter) { HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); - DM_ODM_T *odm = &(hal_data->odmpriv); - - DBG_871X_SEL_NL(sel,"RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n", - HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B); + DM_ODM_T *odm = &(hal_data->odmpriv); + + RTW_PRINT_SEL(sel, "RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n", + HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B); } @@ -309,12 +187,11 @@ void rtw_odm_acquirespinlock(_adapter *adapter, RT_SPINLOCK_TYPE type) PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter); _irqL irqL; - switch(type) - { - case RT_IQK_SPINLOCK: - _enter_critical_bh(&pHalData->IQKSpinLock, &irqL); - default: - break; + switch (type) { + case RT_IQK_SPINLOCK: + _enter_critical_bh(&pHalData->IQKSpinLock, &irqL); + default: + break; } } @@ -323,127 +200,41 @@ void rtw_odm_releasespinlock(_adapter *adapter, RT_SPINLOCK_TYPE type) PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter); _irqL irqL; - switch(type) - { - case RT_IQK_SPINLOCK: - _exit_critical_bh(&pHalData->IQKSpinLock, &irqL); - default: - break; + switch (type) { + case RT_IQK_SPINLOCK: + _exit_critical_bh(&pHalData->IQKSpinLock, &irqL); + default: + break; } } #ifdef CONFIG_DFS_MASTER -VOID rtw_odm_radar_detect_reset(_adapter *adapter) +inline u8 rtw_odm_get_dfs_domain(_adapter *adapter) { HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); PDM_ODM_T pDM_Odm = &(hal_data->odmpriv); - if (pDM_Odm->SupportICType & ODM_RTL8192D) { - ODM_SetBBReg(pDM_Odm, 0xc84 , BIT25, 0); - ODM_SetBBReg(pDM_Odm, 0xc84 , BIT25, 1); - } else if (pDM_Odm->SupportICType & ODM_RTL8821) { - ODM_SetBBReg(pDM_Odm, 0x924 , BIT15, 0); - ODM_SetBBReg(pDM_Odm, 0x924 , BIT15, 1); - } else { - /* not supported yet */ - rtw_warn_on(1); - } + return pDM_Odm->DFS_RegionDomain; } -VOID rtw_odm_radar_detect_disable(_adapter *adapter) +inline VOID rtw_odm_radar_detect_reset(_adapter *adapter) { - HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); - PDM_ODM_T pDM_Odm = &(hal_data->odmpriv); - - if (pDM_Odm->SupportICType & ODM_RTL8192D) - ODM_SetBBReg(pDM_Odm, 0xc84 , BIT25, 0); - else if (pDM_Odm->SupportICType & ODM_RTL8821) - ODM_SetBBReg(pDM_Odm, 0x924 , BIT15, 0); - else - rtw_warn_on(1); + phydm_radar_detect_reset(GET_ODM(adapter)); } -/* called after ch, bw is set, chance to adjust parameter for different ch conditions */ -VOID rtw_odm_radar_detect_enable(_adapter *adapter) +inline VOID rtw_odm_radar_detect_disable(_adapter *adapter) { - HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); - PDM_ODM_T pDM_Odm = &(hal_data->odmpriv); - - if (pDM_Odm->SupportICType & ODM_RTL8192D) { - ODM_SetBBReg(pDM_Odm, 0xc38, BIT23 | BIT22, 2); - ODM_SetBBReg(pDM_Odm, 0x814, bMaskDWord, 0x04cc4d10); - ODM_SetBBReg(pDM_Odm, 0xc8c, BIT23 | BIT22, 3); - ODM_SetBBReg(pDM_Odm, 0xc30, 0xf, 0xa); - ODM_SetBBReg(pDM_Odm, 0xcdc, 0xf0000, 4); - } else if (pDM_Odm->SupportICType & ODM_RTL8821) { - ODM_SetBBReg(pDM_Odm, 0x814, 0x3fffffff, 0x04cc4d10); - ODM_SetBBReg(pDM_Odm, 0x834, bMaskByte0, 0x06); - ODM_SetBBReg(pDM_Odm, 0x918, bMaskDWord, 0x1c16ecdf); - ODM_SetBBReg(pDM_Odm, 0x924, bMaskDWord, 0x0152a400); - ODM_SetBBReg(pDM_Odm, 0x91c, bMaskDWord, 0x0fa21a20); - ODM_SetBBReg(pDM_Odm, 0x920, bMaskDWord, 0xe0f57204); - } else { - /* not supported yet */ - rtw_warn_on(1); - } - - rtw_odm_radar_detect_reset(adapter); + phydm_radar_detect_disable(GET_ODM(adapter)); } -BOOLEAN rtw_odm_radar_detect(_adapter *adapter) +/* called after ch, bw is set */ +inline VOID rtw_odm_radar_detect_enable(_adapter *adapter) { - HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); - PDM_ODM_T pDM_Odm = &(hal_data->odmpriv); - BOOLEAN enable_DFS = FALSE; - BOOLEAN bypass = FALSE; - BOOLEAN radar_detected = FALSE; + phydm_radar_detect_enable(GET_ODM(adapter)); +} - static u8Byte last_tx_unicast = 0; - static u8Byte last_rx_unicast = 0; - static u8Byte throughput = 0; - int tp_th = ((*pDM_Odm->pBandWidth == ODM_BW40M) ? 45 : 20); /*refer AP team's testing number*/ - - throughput = (*(pDM_Odm->pNumTxBytesUnicast) - last_tx_unicast) + (*(pDM_Odm->pNumRxBytesUnicast) - last_rx_unicast); - last_tx_unicast = *(pDM_Odm->pNumTxBytesUnicast); - last_rx_unicast = *(pDM_Odm->pNumRxBytesUnicast); - - if (throughput>>18 > tp_th) { - if (pDM_Odm->SupportICType & ODM_RTL8192D) - ODM_SetBBReg(pDM_Odm, 0xcdc, BIT8|BIT9, 0); - bypass = TRUE; - } else { - if (pDM_Odm->SupportICType & ODM_RTL8192D) - ODM_SetBBReg(pDM_Odm, 0xcdc, BIT8|BIT9, 1); - } - - if (pDM_Odm->SupportICType & ODM_RTL8192D) { - if (ODM_GetBBReg(pDM_Odm , 0xc84, BIT25)) - enable_DFS = TRUE; - } else if (pDM_Odm->SupportICType & ODM_RTL8821) { - if (ODM_GetBBReg(pDM_Odm , 0x924, BIT15)) - enable_DFS = TRUE; - } - - if (pDM_Odm->SupportICType & ODM_RTL8192D) { - if (ODM_GetBBReg(pDM_Odm , 0xcf8, BIT23)) - radar_detected = TRUE; - } else if (pDM_Odm->SupportICType & ODM_RTL8821) { - if (ODM_GetBBReg(pDM_Odm , 0xf98, BIT17)) - radar_detected = TRUE; - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD - , ("Radar detect: enable_DFS:%d, radar_detected:%d, bypass:%d\n" - , enable_DFS, radar_detected, bypass)); - if (0) - DBG_871X("Radar detect: enable_DFS:%d, radar_detected:%d, bypass:%d(throughput:%llu, tp_th:%d)\n" - , enable_DFS, radar_detected, bypass, throughput, tp_th); - - if (enable_DFS && radar_detected) - rtw_odm_radar_detect_reset(adapter); - -exit: - return (enable_DFS && radar_detected && !bypass); +inline BOOLEAN rtw_odm_radar_detect(_adapter *adapter) +{ + return phydm_radar_detect(GET_ODM(adapter)); } #endif /* CONFIG_DFS_MASTER */ - diff --git a/core/rtw_p2p.c b/core/rtw_p2p.c old mode 100755 new mode 100644 index 9c63b8c..ca69e57 --- a/core/rtw_p2p.c +++ b/core/rtw_p2p.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. @@ -23,19 +23,17 @@ #ifdef CONFIG_P2P -int rtw_p2p_is_channel_list_ok( u8 desired_ch, u8* ch_list, u8 ch_cnt ) +int rtw_p2p_is_channel_list_ok(u8 desired_ch, u8 *ch_list, u8 ch_cnt) { int found = 0, i = 0; - for( i = 0; i < ch_cnt; i++ ) - { - if ( ch_list[ i ] == desired_ch ) - { + for (i = 0; i < ch_cnt; i++) { + if (ch_list[i] == desired_ch) { found = 1; break; } } - return( found ); + return found ; } int is_any_client_associated(_adapter *padapter) @@ -47,22 +45,22 @@ static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf) { _irqL irqL; _list *phead, *plist; - u32 len=0; + u32 len = 0; u16 attr_len = 0; u8 tmplen, *pdata_attr, *pstart, *pcur; struct sta_info *psta = NULL; _adapter *padapter = pwdinfo->padapter; struct sta_priv *pstapriv = &padapter->stapriv; - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); pdata_attr = rtw_zmalloc(MAX_P2P_IE_LEN); - if(NULL == pdata_attr){ - DBG_871X("%s pdata_attr malloc failed \n", __FUNCTION__); + if (NULL == pdata_attr) { + RTW_INFO("%s pdata_attr malloc failed\n", __FUNCTION__); goto _exit; } - + pstart = pdata_attr; pcur = pdata_attr; @@ -70,32 +68,30 @@ static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf) phead = &pstapriv->asoc_list; plist = get_next(phead); - //look up sta asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { + /* look up sta asoc_queue */ + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - if(psta->is_p2p_device) - { + plist = get_next(plist); + + + if (psta->is_p2p_device) { tmplen = 0; - + pcur++; - - //P2P device address + + /* P2P device address */ _rtw_memcpy(pcur, psta->dev_addr, ETH_ALEN); pcur += ETH_ALEN; - //P2P interface address + /* P2P interface address */ _rtw_memcpy(pcur, psta->hwaddr, ETH_ALEN); pcur += ETH_ALEN; *pcur = psta->dev_cap; pcur++; - //*(u16*)(pcur) = cpu_to_be16(psta->config_methods); + /* *(u16*)(pcur) = cpu_to_be16(psta->config_methods); */ RTW_PUT_BE16(pcur, psta->config_methods); pcur += 2; @@ -105,16 +101,15 @@ static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf) *pcur = psta->num_of_secdev_type; pcur++; - _rtw_memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type*8); - pcur += psta->num_of_secdev_type*8; - - if(psta->dev_name_len>0) - { - //*(u16*)(pcur) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + _rtw_memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type * 8); + pcur += psta->num_of_secdev_type * 8; + + if (psta->dev_name_len > 0) { + /* *(u16*)(pcur) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); */ RTW_PUT_BE16(pcur, WPS_ATTR_DEVICE_NAME); pcur += 2; - //*(u16*)(pcur) = cpu_to_be16( psta->dev_name_len ); + /* *(u16*)(pcur) = cpu_to_be16( psta->dev_name_len ); */ RTW_PUT_BE16(pcur, psta->dev_name_len); pcur += 2; @@ -123,28 +118,26 @@ static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf) } - tmplen = (u8)(pcur-pstart); - - *pstart = (tmplen-1); + tmplen = (u8)(pcur - pstart); + + *pstart = (tmplen - 1); attr_len += tmplen; - //pstart += tmplen; + /* pstart += tmplen; */ pstart = pcur; - + } - - + + } _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - if(attr_len>0) - { + if (attr_len > 0) len = rtw_set_p2p_attr_content(pbuf, P2P_ATTR_GROUP_INFO, attr_len, pdata_attr); - } rtw_mfree(pdata_attr, MAX_P2P_IE_LEN); - + _exit: return len; @@ -159,20 +152,19 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) unsigned short *fctrl; _adapter *padapter = pwdinfo->padapter; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - unsigned char category = RTW_WLAN_CATEGORY_P2P;//P2P action frame + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + unsigned char category = RTW_WLAN_CATEGORY_P2P;/* P2P action frame */ u32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_GO_DISC_REQUEST; - u8 dialogToken=0; + u8 dialogToken = 0; - DBG_871X("[%s]\n", __FUNCTION__); + RTW_INFO("[%s]\n", __FUNCTION__); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -195,13 +187,13 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) pframe += sizeof(struct rtw_ieee80211_hdr_3addr); pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - //Build P2P action frame header - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + /* Build P2P action frame header */ + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - //there is no IE in this P2P action frame + /* there is no IE in this P2P action frame */ pattrib->last_txcmdsz = pattrib->pktlen; @@ -210,7 +202,7 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) } static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken) -{ +{ struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; @@ -218,22 +210,21 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s unsigned short *fctrl; _adapter *padapter = pwdinfo->padapter; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; u32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_DEVDISC_RESP; u8 p2pie[8] = { 0x00 }; - u32 p2pielen = 0; + u32 p2pielen = 0; - DBG_871X("[%s]\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + RTW_INFO("[%s]\n", __FUNCTION__); + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -256,26 +247,26 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s pframe += sizeof(struct rtw_ieee80211_hdr_3addr); pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - //Build P2P public action frame header + /* Build P2P public action frame header */ 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - //Build P2P IE - // P2P OUI + /* Build P2P IE */ + /* P2P OUI */ p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ - // P2P_ATTR_STATUS + /* P2P_ATTR_STATUS */ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen); + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen); pattrib->last_txcmdsz = pattrib->pktlen; @@ -283,20 +274,20 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s } -static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, u8* frame_body, u16 config_method) +static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr, u8 *frame_body, u16 config_method) { _adapter *padapter = pwdinfo->padapter; unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; - u8 dialogToken = frame_body[7]; // The Dialog Token of provisioning discovery request frame. + u8 dialogToken = frame_body[7]; /* The Dialog Token of provisioning discovery request frame. */ u32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_PROVISION_DISC_RESP; - u8 wpsie[ 100 ] = { 0x00 }; + u8 wpsie[100] = { 0x00 }; u8 wpsielen = 0; #ifdef CONFIG_WFD u32 wfdielen = 0; -#endif //CONFIG_WFD - +#endif + struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; @@ -307,12 +298,11 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -338,52 +328,52 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, 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, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); wpsielen = 0; - // WPS OUI - //*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + /* WPS OUI */ + /* *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); */ RTW_PUT_BE32(wpsie, WPSOUI); wpsielen += 4; #if 0 - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + /* WPS version */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); wpsielen += 2; - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); wpsielen += 2; - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + /* Value: */ + wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ #endif - // Config Method - // Type: - //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + /* Config Method */ + /* Type: */ + /* *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); */ RTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD); wpsielen += 2; - // Length: - //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + /* Length: */ + /* *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); */ RTW_PUT_BE16(wpsie + wpsielen, 0x0002); wpsielen += 2; - // Value: - //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method ); + /* Value: */ + /* *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method ); */ RTW_PUT_BE16(wpsie + wpsielen, config_method); wpsielen += 2; - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen); #ifdef CONFIG_WFD wfdielen = build_provdisc_resp_wfd_ie(pwdinfo, pframe); pframe += wfdielen; pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD +#endif pattrib->last_txcmdsz = pattrib->pktlen; @@ -402,22 +392,21 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 unsigned short *fctrl; _adapter *padapter = pwdinfo->padapter; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - unsigned char category = RTW_WLAN_CATEGORY_P2P;//P2P action frame + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + unsigned char category = RTW_WLAN_CATEGORY_P2P;/* P2P action frame */ u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_PRESENCE_RESPONSE; - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u8 oui_subtype = P2P_PRESENCE_RESPONSE; + u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; u8 noa_attr_content[32] = { 0x00 }; u32 p2pielen = 0; - DBG_871X("[%s]\n", __FUNCTION__); + RTW_INFO("[%s]\n", __FUNCTION__); - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) return; - } - //update attribute + /* update attribute */ pattrib = &pmgntframe->attrib; update_mgntframe_attrib(padapter, pattrib); @@ -440,37 +429,37 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 pframe += sizeof(struct rtw_ieee80211_hdr_3addr); pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - //Build P2P action frame header - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + /* Build P2P action frame header */ + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - //Add P2P IE header - // P2P OUI + /* Add P2P IE header */ + /* P2P OUI */ p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ - //Add Status attribute in P2P IE + /* Add Status attribute in P2P IE */ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); - //Add NoA attribute in P2P IE - noa_attr_content[0] = 0x1;//index - noa_attr_content[1] = 0x0;//CTWindow and OppPS Parameters - - //todo: Notice of Absence Descriptor(s) - + /* Add NoA attribute in P2P IE */ + noa_attr_content[0] = 0x1;/* index */ + noa_attr_content[1] = 0x0;/* CTWindow and OppPS Parameters */ + + /* todo: Notice of Absence Descriptor(s) */ + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_NOA, 2, noa_attr_content); pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &(pattrib->pktlen)); - + pattrib->last_txcmdsz = pattrib->pktlen; dump_mgntframe(padapter, pmgntframe); @@ -479,1613 +468,1560 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u16 capability=0; - u32 len=0, p2pielen = 0; - + u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; + u16 capability = 0; + u32 len = 0, p2pielen = 0; - // P2P OUI + + /* P2P OUI */ p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ - // According to the P2P Specification, the beacon frame should contain 3 P2P attributes - // 1. P2P Capability - // 2. P2P Device ID - // 3. Notice of Absence ( NOA ) + /* According to the P2P Specification, the beacon frame should contain 3 P2P attributes */ + /* 1. P2P Capability */ + /* 2. P2P Device ID */ + /* 3. Notice of Absence ( NOA ) */ - // P2P Capability ATTR - // Type: - // Length: - // Value: - // Device Capability Bitmap, 1 byte - // Be able to participate in additional P2P Groups and - // support the P2P Invitation Procedure - // Group Capability Bitmap, 1 byte - capability = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY; - capability |= ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8); - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) - capability |= (P2P_GRPCAP_GROUP_FORMATION<<8); + /* P2P Capability ATTR */ + /* Type: */ + /* Length: */ + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + /* Be able to participate in additional P2P Groups and */ + /* support the P2P Invitation Procedure */ + /* Group Capability Bitmap, 1 byte */ + capability = P2P_DEVCAP_INVITATION_PROC | P2P_DEVCAP_CLIENT_DISCOVERABILITY; + capability |= ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8); + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) + capability |= (P2P_GRPCAP_GROUP_FORMATION << 8); capability = cpu_to_le16(capability); - p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8*)&capability); + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8 *)&capability); - - // P2P Device ID ATTR + + /* P2P Device ID ATTR */ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_DEVICE_ID, ETH_ALEN, pwdinfo->device_addr); - - // Notice of Absence ATTR - // Type: - // Length: - // Value: - - //go_add_noa_attr(pwdinfo); - - + + /* Notice of Absence ATTR */ + /* Type: */ + /* Length: */ + /* Value: */ + + /* go_add_noa_attr(pwdinfo); */ + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); - - + + return len; - + } #ifdef CONFIG_WFD u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u16 val16=0; - u32 len=0, wfdielen = 0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u16 val16 = 0; + u32 len = 0, wfdielen = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + wfdie[wfdielen++] = 0x50; + wfdie[wfdielen++] = 0x6F; + wfdie[wfdielen++] = 0x9A; + wfdie[wfdielen++] = 0x0A; /* WFA WFD v1.0 */ - // Commented by Albert 20110812 - // According to the WFD Specification, the beacon frame should contain 4 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID - // 3. Coupled Sink Information + /* Commented by Albert 20110812 */ + /* According to the WFD Specification, the beacon frame should contain 4 WFD attributes */ + /* 1. WFD Device Information */ + /* 2. Associated BSSID */ + /* 3. Coupled Sink Information */ - // WFD Device Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + /* 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 + /* Value1: */ + /* WFD device information */ - if ( P2P_ROLE_GO == pwdinfo->role ) - { - if ( is_any_client_associated( pwdinfo->padapter ) ) - { - // WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) + if (P2P_ROLE_GO == pwdinfo->role) { + if (is_any_client_associated(pwdinfo->padapter)) { + /* WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD; - RTW_PUT_BE16(wfdie + wfdielen, val16); - } - else - { - // WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) + RTW_PUT_BE16(wfdie + wfdielen, val16); + } else { + /* WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD; RTW_PUT_BE16(wfdie + wfdielen, val16); } - } - else - { - // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) + } else { + /* WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD; RTW_PUT_BE16(wfdie + wfdielen, val16); } - + wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u16 val16=0; - u32 len=0, wfdielen = 0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u16 val16 = 0; + u32 len = 0, wfdielen = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + wfdie[wfdielen++] = 0x50; + wfdie[wfdielen++] = 0x6F; + wfdie[wfdielen++] = 0x9A; + wfdie[wfdielen++] = 0x0A; /* WFA WFD v1.0 */ - // Commented by Albert 20110812 - // According to the WFD Specification, the probe request frame should contain 4 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID - // 3. Coupled Sink Information + /* Commented by Albert 20110812 */ + /* According to the WFD Specification, the probe request frame should contain 4 WFD attributes */ + /* 1. WFD Device Information */ + /* 2. Associated BSSID */ + /* 3. Coupled Sink Information */ - // WFD Device Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + /* 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 + /* Value1: */ + /* WFD device information */ - if ( 1 == pwdinfo->wfd_tdls_enable ) - { - // WFD primary sink + available for WFD session + WiFi TDLS mode + WSC ( WFD Service Discovery ) - val16 = pwfd_info->wfd_device_type | - WFD_DEVINFO_SESSION_AVAIL | - WFD_DEVINFO_WSD | - WFD_DEVINFO_PC_TDLS; - RTW_PUT_BE16(wfdie + wfdielen, val16 ); - } - else - { - // WFD primary sink + available for WFD session + WiFi Direct mode + WSC ( WFD Service Discovery ) + if (1 == pwdinfo->wfd_tdls_enable) { + /* WFD primary sink + available for WFD session + WiFi TDLS mode + WSC ( WFD Service Discovery ) */ val16 = pwfd_info->wfd_device_type | - WFD_DEVINFO_SESSION_AVAIL | - WFD_DEVINFO_WSD; - RTW_PUT_BE16(wfdie + wfdielen, val16 ); + WFD_DEVINFO_SESSION_AVAIL | + WFD_DEVINFO_WSD | + WFD_DEVINFO_PC_TDLS; + RTW_PUT_BE16(wfdie + wfdielen, val16); + } else { + /* WFD primary sink + available for WFD session + WiFi Direct mode + WSC ( WFD Service Discovery ) */ + val16 = pwfd_info->wfd_device_type | + WFD_DEVINFO_SESSION_AVAIL | + WFD_DEVINFO_WSD; + RTW_PUT_BE16(wfdie + wfdielen, val16); } wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunneled) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 len=0, wfdielen = 0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u32 len = 0, wfdielen = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + wfdie[wfdielen++] = 0x50; + wfdie[wfdielen++] = 0x6F; + wfdie[wfdielen++] = 0x9A; + wfdie[wfdielen++] = 0x0A; /* WFA WFD v1.0 */ - // Commented by Albert 20110812 - // According to the WFD Specification, the probe response frame should contain 4 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID - // 3. Coupled Sink Information - // 4. WFD Session Information + /* Commented by Albert 20110812 */ + /* According to the WFD Specification, the probe response frame should contain 4 WFD attributes */ + /* 1. WFD Device Information */ + /* 2. Associated BSSID */ + /* 3. Coupled Sink Information */ + /* 4. WFD Session Information */ - // WFD Device Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + /* 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 - // WFD primary sink + available for WFD session + WiFi Direct mode - - if ( _TRUE == pwdinfo->session_available ) - { - if ( P2P_ROLE_GO == pwdinfo->role ) - { - if ( is_any_client_associated( pwdinfo->padapter ) ) - { - if ( pwdinfo->wfd_tdls_enable ) - { - // TDLS mode + WSD ( WFD Service Discovery ) - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT); - } - else - { - // WiFi Direct mode + WSD ( WFD Service Discovery ) - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT); - } - } - else - { - if ( pwdinfo->wfd_tdls_enable ) - { - // available for WFD session + TDLS mode + WSD ( WFD Service Discovery ) - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT); - } - else - { - // available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT); - } - } - } - else - { - if ( pwdinfo->wfd_tdls_enable ) - { - // available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT); - } - else - { + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + available for WFD session + WiFi Direct mode */ - // available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) + if (_TRUE == pwdinfo->session_available) { + if (P2P_ROLE_GO == pwdinfo->role) { + if (is_any_client_associated(pwdinfo->padapter)) { + if (pwdinfo->wfd_tdls_enable) { + /* TDLS mode + WSD ( WFD Service Discovery ) */ + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT); + } else { + /* WiFi Direct mode + WSD ( WFD Service Discovery ) */ + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT); + } + } else { + if (pwdinfo->wfd_tdls_enable) { + /* available for WFD session + TDLS mode + WSD ( WFD Service Discovery ) */ + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT); + } else { + /* available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT); + } + } + } else { + if (pwdinfo->wfd_tdls_enable) { + /* available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT); + } else { + + /* available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT); } } - } - else - { - if ( pwdinfo->wfd_tdls_enable ) - { - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD |WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT); - } + } else { + if (pwdinfo->wfd_tdls_enable) + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT); else - { RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT); - } } wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - // WFD Session Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO; + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + /* WFD Session Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_SESSION_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, 0x0000); wfdielen += 2; - // Todo: to add the list of WFD device info descriptor in WFD group. + /* Todo: to add the list of WFD device info descriptor in WFD group. */ } #ifdef CONFIG_CONCURRENT_MODE #ifdef CONFIG_TDLS - if ( ( tunneled == 0 ) && ( padapter->pbuddy_adapter->wdinfo.wfd_tdls_enable == 1 ) ) { - // Alternative MAC Address ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_ALTER_MAC; + int i; + _adapter *iface = NULL; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); - // Length: - // Note: In the WFD specification, the size of length field is 2. - RTW_PUT_BE16(wfdie + wfdielen, ETH_ALEN ); - wfdielen += 2; + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + if (iface == padapter) + continue; - // Value: - // Alternative MAC Address - _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. + if ((tunneled == 0) && (iface->wdinfo.wfd_tdls_enable == 1)) { + /* Alternative MAC Address ATTR + Type: */ + wfdie[wfdielen++] = WFD_ATTR_ALTER_MAC; - wfdielen += ETH_ALEN; + /* Length: + Note: In the WFD specification, the size of length field is 2.*/ + RTW_PUT_BE16(wfdie + wfdielen, ETH_ALEN); + wfdielen += 2; + + /* Value: + Alternative MAC Address*/ + _rtw_memcpy(wfdie + wfdielen, adapter_mac_addr(iface), ETH_ALEN); + wfdielen += ETH_ALEN; + } + } + } } -#endif // CONFIG_TDLS -#endif // CONFIG_CONCURRENT_MODE + +#endif /* CONFIG_TDLS*/ +#endif /* CONFIG_CONCURRENT_MODE */ pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u16 val16=0; - u32 len=0, wfdielen = 0; - _adapter *padapter = NULL; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u16 val16 = 0; + u32 len = 0, wfdielen = 0; + _adapter *padapter = NULL; struct mlme_priv *pmlmepriv = NULL; struct wifi_display_info *pwfd_info = NULL; - // WFD OUI - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) - { - return 0; - } - padapter = pwdinfo->padapter; pmlmepriv = &padapter->mlmepriv; pwfd_info = padapter->wdinfo.wfd_info; - + + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + wfdie[wfdielen++] = 0x50; + wfdie[wfdielen++] = 0x6F; + wfdie[wfdielen++] = 0x9A; + wfdie[wfdielen++] = 0x0A; /* WFA WFD v1.0 */ - // Commented by Albert 20110812 - // According to the WFD Specification, the probe request frame should contain 4 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID - // 3. Coupled Sink Information + /* Commented by Albert 20110812 */ + /* According to the WFD Specification, the probe request frame should contain 4 WFD attributes */ + /* 1. WFD Device Information */ + /* 2. Associated BSSID */ + /* 3. Coupled Sink Information */ - // WFD Device Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + /* 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 - // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD; RTW_PUT_BE16(wfdie + wfdielen, val16); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 len=0, wfdielen = 0; - u16 val16=0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u32 len = 0, wfdielen = 0; + u16 val16 = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + wfdie[wfdielen++] = 0x50; + wfdie[wfdielen++] = 0x6F; + wfdie[wfdielen++] = 0x9A; + wfdie[wfdielen++] = 0x0A; /* WFA WFD v1.0 */ - // Commented by Albert 20110812 - // According to the WFD Specification, the probe request frame should contain 4 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID - // 3. Coupled Sink Information + /* Commented by Albert 20110812 */ + /* According to the WFD Specification, the probe request frame should contain 4 WFD attributes */ + /* 1. WFD Device Information */ + /* 2. Associated BSSID */ + /* 3. Coupled Sink Information */ - // WFD Device Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + /* 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 - // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD; RTW_PUT_BE16(wfdie + wfdielen, val16); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 len=0, wfdielen = 0; - u16 val16=0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u32 len = 0, wfdielen = 0; + u16 val16 = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.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 ) + /* 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; + /* 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 - // WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL; RTW_PUT_BE16(wfdie + wfdielen, val16); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 len=0, wfdielen = 0; - u16 val16=0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u32 len = 0, wfdielen = 0; + u16 val16 = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.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 ) + /* 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; + /* 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 - // WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL; RTW_PUT_BE16(wfdie + wfdielen, val16); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 len=0, wfdielen = 0; - u16 val16=0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u32 len = 0, wfdielen = 0; + u16 val16 = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.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 ) + /* 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; + /* 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 - // WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL; RTW_PUT_BE16(wfdie + wfdielen, val16); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 len=0, wfdielen = 0; - u16 val16=0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u32 len = 0, wfdielen = 0; + u16 val16 = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.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 provision discovery request frame should contain 3 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID ( Optional ) - // 3. Local IP Adress ( Optional ) + /* Commented by Albert 20110825 */ + /* According to the WFD Specification, the provision discovery 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; + /* 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 - // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD; RTW_PUT_BE16(wfdie + wfdielen, val16); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; - if ( P2P_ROLE_GO == pwdinfo->role ) - { - // WFD Session Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO; + if (P2P_ROLE_GO == pwdinfo->role) { + /* WFD Session Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_SESSION_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, 0x0000); wfdielen += 2; - // Todo: to add the list of WFD device info descriptor in WFD group. + /* Todo: to add the list of WFD device info descriptor in WFD group. */ } rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u16 val16=0; - u32 len=0, wfdielen = 0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u16 val16 = 0; + u32 len = 0, wfdielen = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.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 provision discovery request frame should contain 3 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID ( Optional ) - // 3. Local IP Adress ( Optional ) + /* Commented by Albert 20110825 */ + /* According to the WFD Specification, the provision discovery 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; + /* 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 - // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD; RTW_PUT_BE16(wfdie + wfdielen, val16); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; - if ( P2P_ROLE_GO == pwdinfo->role ) - { - // WFD Session Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO; + if (P2P_ROLE_GO == pwdinfo->role) { + /* WFD Session Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_SESSION_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, 0x0000); wfdielen += 2; - // Todo: to add the list of WFD device info descriptor in WFD group. + /* Todo: to add the list of WFD device info descriptor in WFD group. */ } rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 len=0, wfdielen = 0; - u16 val16=0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u32 len = 0, wfdielen = 0; + u16 val16 = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.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 provision discovery request frame should contain 3 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID ( Optional ) - // 3. Local IP Adress ( Optional ) + /* Commented by Albert 20110825 */ + /* According to the WFD Specification, the provision discovery 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; + /* 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 - // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD; RTW_PUT_BE16(wfdie + wfdielen, val16); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 len=0, wfdielen = 0; - u16 val16=0; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u32 len = 0, wfdielen = 0; + u16 val16 = 0; _adapter *padapter = pwdinfo->padapter; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info; + struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info; - // WFD OUI + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + goto exit; + + /* WFD OUI */ wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.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 provision discovery response frame should contain 3 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID ( Optional ) - // 3. Local IP Adress ( Optional ) + /* Commented by Albert 20110825 */ + /* According to the WFD Specification, the provision discovery response 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; + /* 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 - // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) + /* Value1: */ + /* WFD device information */ + /* WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery ) */ val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD; RTW_PUT_BE16(wfdie + wfdielen, val16); wfdielen += 2; - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + /* 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: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + /* 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); wfdielen += ETH_ALEN; - // Coupled Sink Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + /* Coupled Sink Information ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_COUPLED_SINK_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, 0x0007); wfdielen += 2; - // Value: - // Coupled Sink Status bitmap - // Not coupled/available for Coupling - wfdie[ wfdielen++ ] = 0; - // MAC Addr. - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; - wfdie[ wfdielen++ ] = 0; + /* Value: */ + /* Coupled Sink Status bitmap */ + /* Not coupled/available for Coupling */ + wfdie[wfdielen++] = 0; + /* MAC Addr. */ + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; + wfdie[wfdielen++] = 0; rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); +exit: return len; - } - - -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u32 len=0, p2pielen = 0; + u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; + u32 len = 0, p2pielen = 0; #ifdef CONFIG_INTEL_WIDI struct mlme_priv *pmlmepriv = &(pwdinfo->padapter->mlmepriv); u8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 }; u8 widi_version = 0, i = 0; - if( _rtw_memcmp( pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN ) == _FALSE ) - { + if (_rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE) widi_version = 35; - } - else if( pmlmepriv->num_p2p_sdt != 0 ) - { + else if (pmlmepriv->num_p2p_sdt != 0) widi_version = 40; - } -#endif //CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ - // P2P OUI + /* P2P OUI */ p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ - // Commented by Albert 20100907 - // According to the P2P Specification, the probe response frame should contain 5 P2P attributes - // 1. P2P Capability - // 2. Extended Listen Timing - // 3. Notice of Absence ( NOA ) ( Only GO needs this ) - // 4. Device Info - // 5. Group Info ( Only GO need this ) + /* Commented by Albert 20100907 */ + /* According to the P2P Specification, the probe response frame should contain 5 P2P attributes */ + /* 1. P2P Capability */ + /* 2. Extended Listen Timing */ + /* 3. Notice of Absence ( NOA ) ( Only GO needs this ) */ + /* 4. Device Info */ + /* 5. Group Info ( Only GO need this ) */ - // P2P Capability ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + /* P2P Capability ATTR */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + /* Length: */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); */ RTW_PUT_LE16(p2pie + p2pielen, 0x0002); p2pielen += 2; - // Value: - // Device Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; - - // Group Capability Bitmap, 1 byte - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - p2pie[ p2pielen ] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS); + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) - p2pie[ p2pielen ] |= P2P_GRPCAP_GROUP_FORMATION; + /* Group Capability Bitmap, 1 byte */ + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + p2pie[p2pielen] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS); + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) + p2pie[p2pielen] |= P2P_GRPCAP_GROUP_FORMATION; p2pielen++; - } - else if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) ) - { - // Group Capability Bitmap, 1 byte - if ( pwdinfo->persistent_supported ) - p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; + } else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) { + /* Group Capability Bitmap, 1 byte */ + if (pwdinfo->persistent_supported) + p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; else - p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT; + p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT; } - // Extended Listen Timing ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + /* Extended Listen Timing ATTR */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING; - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + /* Length: */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); */ RTW_PUT_LE16(p2pie + p2pielen, 0x0004); p2pielen += 2; - // Value: - // Availability Period - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + /* Value: */ + /* Availability Period */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); */ RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); p2pielen += 2; - // Availability Interval - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + /* Availability Interval */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); */ RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); p2pielen += 2; - // Notice of Absence ATTR - // Type: - // Length: - // Value: - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - //go_add_noa_attr(pwdinfo); - } + /* Notice of Absence ATTR */ + /* Type: */ + /* Length: */ + /* Value: */ + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + /* go_add_noa_attr(pwdinfo); */ + } - // Device Info ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + /* Device Info ATTR */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + /* Length: */ + /* 21->P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ + /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); */ #ifdef CONFIG_INTEL_WIDI - if( widi_version == 35 ) - { + if (widi_version == 35) RTW_PUT_LE16(p2pie + p2pielen, 21 + 8 + pwdinfo->device_name_len); - } - else if( widi_version == 40 ) - { + else if (widi_version == 40) RTW_PUT_LE16(p2pie + p2pielen, 21 + 8 * pmlmepriv->num_p2p_sdt + pwdinfo->device_name_len); - } else -#endif //CONFIG_INTEL_WIDI - RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); +#endif /* CONFIG_INTEL_WIDI */ + RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); p2pielen += 2; - // Value: - // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); + /* Value: */ + /* P2P Device Address */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); p2pielen += ETH_ALEN; - // Config Method - // This field should be big endian. Noted by P2P specification. - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + /* Config Method */ + /* This field should be big endian. Noted by P2P specification. */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); */ RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->supported_wps_cm); p2pielen += 2; #ifdef CONFIG_INTEL_WIDI - if( widi_version == 40 ) - { - // Primary Device Type - // Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); - RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_pdt_cid ); + if (widi_version == 40) { + /* Primary Device Type */ + /* Category ID */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); */ + RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_pdt_cid); p2pielen += 2; - // OUI - //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + /* OUI */ + /* *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); */ RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); p2pielen += 4; - // Sub Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + /* Sub Category ID */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); */ RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_pdt_scid); p2pielen += 2; - } - else -#endif //CONFIG_INTEL_WIDI + } else +#endif /* CONFIG_INTEL_WIDI */ { - // Primary Device Type - // Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + /* Primary Device Type */ + /* Category ID */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); */ RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA); p2pielen += 2; - // OUI - //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + /* OUI */ + /* *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); */ RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); p2pielen += 4; - // Sub Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + /* Sub Category ID */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); */ RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER); p2pielen += 2; } - // Number of Secondary Device Types + /* Number of Secondary Device Types */ #ifdef CONFIG_INTEL_WIDI - if( widi_version == 35 ) - { - p2pie[ p2pielen++ ] = 0x01; - + if (widi_version == 35) { + p2pie[p2pielen++] = 0x01; + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_DISPLAYS); p2pielen += 2; @@ -2094,12 +2030,9 @@ u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) RTW_PUT_BE16(p2pie + p2pielen, P2P_SCID_WIDI_CONSUMER_SINK); p2pielen += 2; - } - else if( widi_version == 40 ) - { - p2pie[ p2pielen++ ] = pmlmepriv->num_p2p_sdt; - for( ; i < pmlmepriv->num_p2p_sdt; i++ ) - { + } else if (widi_version == 40) { + p2pie[p2pielen++] = pmlmepriv->num_p2p_sdt; + for (; i < pmlmepriv->num_p2p_sdt; i++) { RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_sdt_cid[i]); p2pielen += 2; @@ -2109,369 +2042,336 @@ u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_sdt_scid[i]); p2pielen += 2; } - } - else -#endif //CONFIG_INTEL_WIDI - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + } else +#endif /* CONFIG_INTEL_WIDI */ + p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ - // Device Name - // Type: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + /* Device Name */ + /* Type: */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); */ RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); p2pielen += 2; - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + /* Length: */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); */ RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); p2pielen += 2; - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); p2pielen += pwdinfo->device_name_len; - // Group Info ATTR - // Type: - // Length: - // Value: - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { + /* Group Info ATTR */ + /* Type: */ + /* Length: */ + /* Value: */ + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) p2pielen += go_add_group_info_attr(pwdinfo, p2pie + p2pielen); - } - + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); - + return len; - + } -u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr ) +u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 *pssid, u8 ussidlen, u8 *pdev_raddr) { - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u32 len=0, p2pielen = 0; + u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; + u32 len = 0, p2pielen = 0; - // P2P OUI + /* P2P OUI */ p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ - // Commented by Albert 20110301 - // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes - // 1. P2P Capability - // 2. Device Info - // 3. Group ID ( When joining an operating P2P Group ) + /* Commented by Albert 20110301 */ + /* According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes */ + /* 1. P2P Capability */ + /* 2. Device Info */ + /* 3. Group ID ( When joining an operating P2P Group ) */ - // P2P Capability ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + /* P2P Capability ATTR */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_CAPABILITY; - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + /* Length: */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); */ RTW_PUT_LE16(p2pie + p2pielen, 0x0002); p2pielen += 2; - // Value: - // Device Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT; - - // Group Capability Bitmap, 1 byte - if ( pwdinfo->persistent_supported ) - p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT; + + /* Group Capability Bitmap, 1 byte */ + if (pwdinfo->persistent_supported) + p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT; else - p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT; + p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT; - // Device Info ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + /* Device Info ATTR */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO; - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + /* Length: */ + /* 21->P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ + /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); */ RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); p2pielen += 2; - // Value: - // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); + /* Value: */ + /* P2P Device Address */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN); p2pielen += ETH_ALEN; - // Config Method - // This field should be big endian. Noted by P2P specification. - if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC ) - { - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); + /* Config Method */ + /* This field should be big endian. Noted by P2P specification. */ + if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC) { + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); */ RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_PBC); - } - else - { - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); + } else { + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); */ RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_DISPLAY); } p2pielen += 2; - // Primary Device Type - // Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + /* Primary Device Type */ + /* Category ID */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); */ RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA); p2pielen += 2; - // OUI - //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + /* OUI */ + /* *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); */ RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); p2pielen += 4; - // Sub Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + /* Sub Category ID */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); */ RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER); p2pielen += 2; - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + /* Number of Secondary Device Types */ + p2pie[p2pielen++] = 0x00; /* No Secondary Device Type List */ - // Device Name - // Type: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + /* Device Name */ + /* Type: */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); */ RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); p2pielen += 2; - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + /* Length: */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); */ RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); p2pielen += 2; - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len); p2pielen += pwdinfo->device_name_len; - if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) ) - { - // Added by Albert 2011/05/19 - // In this case, the pdev_raddr is the device address of the group owner. - - // P2P Group ID ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) { + /* Added by Albert 2011/05/19 */ + /* In this case, the pdev_raddr is the device address of the group owner. */ - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + ussidlen ); + /* P2P Group ID ATTR */ + /* Type: */ + p2pie[p2pielen++] = P2P_ATTR_GROUP_ID; + + /* Length: */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + ussidlen ); */ RTW_PUT_LE16(p2pie + p2pielen, ETH_ALEN + ussidlen); p2pielen += 2; - // Value: - _rtw_memcpy( p2pie + p2pielen, pdev_raddr, ETH_ALEN ); + /* Value: */ + _rtw_memcpy(p2pie + p2pielen, pdev_raddr, ETH_ALEN); p2pielen += ETH_ALEN; - _rtw_memcpy( p2pie + p2pielen, pssid, ussidlen ); + _rtw_memcpy(p2pie + p2pielen, pssid, ussidlen); p2pielen += ussidlen; - + } pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); - + return len; - + } u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code) { - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u32 len=0, p2pielen = 0; + u8 p2pie[MAX_P2P_IE_LEN] = { 0x00 }; + u32 len = 0, p2pielen = 0; - // P2P OUI + /* P2P OUI */ p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + p2pie[p2pielen++] = 0x50; + p2pie[p2pielen++] = 0x6F; + p2pie[p2pielen++] = 0x9A; + p2pie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ - // According to the P2P Specification, the Association response frame should contain 2 P2P attributes - // 1. Status - // 2. Extended Listen Timing (optional) + /* According to the P2P Specification, the Association response frame should contain 2 P2P attributes */ + /* 1. Status */ + /* 2. Extended Listen Timing (optional) */ - // Status ATTR + /* Status ATTR */ p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status_code); - // Extended Listen Timing ATTR - // Type: - // Length: - // Value: + /* Extended Listen Timing ATTR */ + /* Type: */ + /* Length: */ + /* Value: */ pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); - + return len; - + } u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) { - u32 len=0; - + u32 len = 0; + return len; } u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) -{ +{ u8 *p; - u32 ret=_FALSE; + u32 ret = _FALSE; u8 *p2pie; u32 p2pielen = 0; - int ssid_len=0, rate_cnt = 0; + int ssid_len = 0, rate_cnt = 0; p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SUPPORTEDRATES_IE_, (int *)&rate_cnt, - len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); - if ( rate_cnt <= 4 ) - { - int i, g_rate =0; + if (rate_cnt <= 4) { + int i, g_rate = 0; - for( i = 0; i < rate_cnt; i++ ) - { - if ( ( ( *( p + 2 + i ) & 0xff ) != 0x02 ) && - ( ( *( p + 2 + i ) & 0xff ) != 0x04 ) && - ( ( *( p + 2 + i ) & 0xff ) != 0x0B ) && - ( ( *( p + 2 + i ) & 0xff ) != 0x16 ) ) - { + for (i = 0; i < rate_cnt; i++) { + if (((*(p + 2 + i) & 0xff) != 0x02) && + ((*(p + 2 + i) & 0xff) != 0x04) && + ((*(p + 2 + i) & 0xff) != 0x0B) && + ((*(p + 2 + i) & 0xff) != 0x16)) g_rate = 1; - } } - if ( g_rate == 0 ) - { - // There is no OFDM rate included in SupportedRates IE of this probe request frame - // The driver should response this probe request. + if (g_rate == 0) { + /* There is no OFDM rate included in SupportedRates IE of this probe request frame */ + /* The driver should response this probe request. */ return ret; } - } - else - { - // rate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4. - // We should proceed the following check for this probe request. + } else { + /* rate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4. */ + /* We should proceed the following check for this probe request. */ } - // Added comments by Albert 20100906 - // There are several items we should check here. - // 1. This probe request frame must contain the P2P IE. (Done) - // 2. This probe request frame must contain the wildcard SSID. (Done) - // 3. Wildcard BSSID. (Todo) - // 4. Destination Address. ( Done in mgt_dispatcher function ) - // 5. Requested Device Type in WSC IE. (Todo) - // 6. Device ID attribute in P2P IE. (Todo) + /* Added comments by Albert 20100906 */ + /* There are several items we should check here. */ + /* 1. This probe request frame must contain the P2P IE. (Done) */ + /* 2. This probe request frame must contain the wildcard SSID. (Done) */ + /* 3. Wildcard BSSID. (Todo) */ + /* 4. Destination Address. ( Done in mgt_dispatcher function ) */ + /* 5. Requested Device Type in WSC IE. (Todo) */ + /* 6. Device ID attribute in P2P IE. (Todo) */ p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ssid_len, - len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); - ssid_len &= 0xff; // Just last 1 byte is valid for ssid len of the probe request - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - if((p2pie=rtw_get_p2p_ie( pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_ , len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_ , NULL, &p2pielen))) - { - if ( (p != NULL) && _rtw_memcmp( ( void * ) ( p+2 ), ( void * ) pwdinfo->p2p_wildcard_ssid , 7 )) - { - //todo: - //Check Requested Device Type attributes in WSC IE. - //Check Device ID attribute in P2P IE + ssid_len &= 0xff; /* Just last 1 byte is valid for ssid len of the probe request */ + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + p2pie = rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_ , len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_ , NULL, &p2pielen); + if (p2pie) { + if ((p != NULL) && _rtw_memcmp((void *)(p + 2), (void *) pwdinfo->p2p_wildcard_ssid , 7)) { + /* todo: */ + /* Check Requested Device Type attributes in WSC IE. */ + /* Check Device ID attribute in P2P IE */ - ret = _TRUE; - } - else if ( (p != NULL) && ( ssid_len == 0 ) ) - { ret = _TRUE; - } + } else if ((p != NULL) && (ssid_len == 0)) + ret = _TRUE; + } else { + /* non -p2p device */ } - else - { - //non -p2p device - } - - } - + } + + return ret; - + } u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len, struct sta_info *psta) { u8 status_code = P2P_STATUS_SUCCESS; - u8 *pbuf, *pattr_content=NULL; + u8 *pbuf, *pattr_content = NULL; u32 attr_contentlen = 0; - u16 cap_attr=0; - unsigned short frame_type, ie_offset=0; - u8 * ies; + u16 cap_attr = 0; + unsigned short frame_type, ie_offset = 0; + u8 *ies; u32 ies_len; - u8 * p2p_ie; + u8 *p2p_ie; u32 p2p_ielen = 0; - if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) + if (!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) return P2P_STATUS_FAIL_REQUEST_UNABLE; frame_type = GetFrameSubType(pframe); if (frame_type == WIFI_ASSOCREQ) - { ie_offset = _ASOCREQ_IE_OFFSET_; - } - else // WIFI_REASSOCREQ - { + else /* WIFI_REASSOCREQ */ ie_offset = _REASOCREQ_IE_OFFSET_; - } - + ies = pframe + WLAN_HDR_A3_LEN + ie_offset; ies_len = len - WLAN_HDR_A3_LEN - ie_offset; p2p_ie = rtw_get_p2p_ie(ies , ies_len , NULL, &p2p_ielen); - if ( !p2p_ie ) - { - DBG_8192C( "[%s] P2P IE not Found!!\n", __FUNCTION__ ); + if (!p2p_ie) { + RTW_INFO("[%s] P2P IE not Found!!\n", __FUNCTION__); status_code = P2P_STATUS_FAIL_INVALID_PARAM; - } - else - { - DBG_8192C( "[%s] P2P IE Found!!\n", __FUNCTION__ ); - } - - while ( p2p_ie ) - { - //Check P2P Capability ATTR - if( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) ) - { - DBG_8192C( "[%s] Got P2P Capability Attr!!\n", __FUNCTION__ ); + } else + RTW_INFO("[%s] P2P IE Found!!\n", __FUNCTION__); + + while (p2p_ie) { + /* Check P2P Capability ATTR */ + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8 *)&cap_attr, (uint *) &attr_contentlen)) { + RTW_INFO("[%s] Got P2P Capability Attr!!\n", __FUNCTION__); cap_attr = le16_to_cpu(cap_attr); - psta->dev_cap = cap_attr&0xff; + psta->dev_cap = cap_attr & 0xff; } - //Check Extended Listen Timing ATTR - + /* Check Extended Listen Timing ATTR */ - //Check P2P Device Info ATTR - if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint*)&attr_contentlen)) - { - DBG_8192C( "[%s] Got P2P DEVICE INFO Attr!!\n", __FUNCTION__ ); + + /* Check P2P Device Info ATTR */ + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint *)&attr_contentlen)) { + RTW_INFO("[%s] Got P2P DEVICE INFO Attr!!\n", __FUNCTION__); pattr_content = pbuf = rtw_zmalloc(attr_contentlen); - if(pattr_content) - { + if (pattr_content) { u8 num_of_secdev_type; u16 dev_name_len; - - - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO , pattr_content, (uint*)&attr_contentlen); - _rtw_memcpy(psta->dev_addr, pattr_content, ETH_ALEN);//P2P Device Address + + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO , pattr_content, (uint *)&attr_contentlen); + + _rtw_memcpy(psta->dev_addr, pattr_content, ETH_ALEN);/* P2P Device Address */ pattr_content += ETH_ALEN; - _rtw_memcpy(&psta->config_methods, pattr_content, 2);//Config Methods + _rtw_memcpy(&psta->config_methods, pattr_content, 2);/* Config Methods */ psta->config_methods = be16_to_cpu(psta->config_methods); pattr_content += 2; @@ -2483,33 +2383,29 @@ u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint l num_of_secdev_type = *pattr_content; pattr_content += 1; - if(num_of_secdev_type==0) - { + if (num_of_secdev_type == 0) psta->num_of_secdev_type = 0; - } - else - { + else { u32 len; psta->num_of_secdev_type = num_of_secdev_type; - len = (sizeof(psta->secdev_types_list)<(num_of_secdev_type*8)) ? (sizeof(psta->secdev_types_list)) : (num_of_secdev_type*8); + len = (sizeof(psta->secdev_types_list) < (num_of_secdev_type * 8)) ? (sizeof(psta->secdev_types_list)) : (num_of_secdev_type * 8); _rtw_memcpy(psta->secdev_types_list, pattr_content, len); - - pattr_content += (num_of_secdev_type*8); + + pattr_content += (num_of_secdev_type * 8); } - //dev_name_len = attr_contentlen - ETH_ALEN - 2 - 8 - 1 - (num_of_secdev_type*8); - psta->dev_name_len=0; - if(WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(u16*)pattr_content)) - { - dev_name_len = be16_to_cpu(*(u16*)(pattr_content+2)); + /* dev_name_len = attr_contentlen - ETH_ALEN - 2 - 8 - 1 - (num_of_secdev_type*8); */ + psta->dev_name_len = 0; + if (WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(u16 *)pattr_content)) { + dev_name_len = be16_to_cpu(*(u16 *)(pattr_content + 2)); - psta->dev_name_len = (sizeof(psta->dev_name)dev_name):dev_name_len; + psta->dev_name_len = (sizeof(psta->dev_name) < dev_name_len) ? sizeof(psta->dev_name) : dev_name_len; - _rtw_memcpy(psta->dev_name, pattr_content+4, psta->dev_name_len); + _rtw_memcpy(psta->dev_name, pattr_content + 4, psta->dev_name_len); } rtw_mfree(pbuf, attr_contentlen); @@ -2518,9 +2414,9 @@ u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint l } - //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); - + /* 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); + } return status_code; @@ -2535,85 +2431,71 @@ u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le _adapter *padapter = pwdinfo->padapter; struct sta_priv *pstapriv = &padapter->stapriv; u8 *p2p_ie; - u32 p2p_ielen = 0; - + u32 p2p_ielen = 0; + frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); dialogToken = frame_body[7]; status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; - - if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) ) - { - u8 groupid[ 38 ] = { 0x00 }; - u8 dev_addr[ETH_ALEN] = { 0x00 }; + + p2p_ie = rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen); + if (p2p_ie) { + u8 groupid[38] = { 0x00 }; + u8 dev_addr[ETH_ALEN] = { 0x00 }; u32 attr_contentlen = 0; - if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) - { - if(_rtw_memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) && - _rtw_memcmp(pwdinfo->p2p_group_ssid, groupid+ETH_ALEN, pwdinfo->p2p_group_ssid_len)) - { - attr_contentlen=0; - if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_ID, dev_addr, &attr_contentlen)) - { + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) { + if (_rtw_memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) && + _rtw_memcmp(pwdinfo->p2p_group_ssid, groupid + ETH_ALEN, pwdinfo->p2p_group_ssid_len)) { + attr_contentlen = 0; + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_ID, dev_addr, &attr_contentlen)) { _irqL irqL; - _list *phead, *plist; + _list *phead, *plist; _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); phead = &pstapriv->asoc_list; plist = get_next(phead); - //look up sta asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { + /* look up sta asoc_queue */ + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - + plist = get_next(plist); - if(psta->is_p2p_device && (psta->dev_cap&P2P_DEVCAP_CLIENT_DISCOVERABILITY) && - _rtw_memcmp(psta->dev_addr, dev_addr, ETH_ALEN)) - { + if (psta->is_p2p_device && (psta->dev_cap & P2P_DEVCAP_CLIENT_DISCOVERABILITY) && + _rtw_memcmp(psta->dev_addr, dev_addr, ETH_ALEN)) { - //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - //issue GO Discoverability Request + /* _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); */ + /* issue GO Discoverability Request */ issue_group_disc_req(pwdinfo, psta->hwaddr); - //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - status = P2P_STATUS_SUCCESS; - - break; - } - else - { - status = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } - - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - } - else - { - status = P2P_STATUS_FAIL_INVALID_PARAM; - } + /* _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); */ - } - else - { + status = P2P_STATUS_SUCCESS; + + break; + } else + status = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + } else + status = P2P_STATUS_FAIL_INVALID_PARAM; + + } else status = P2P_STATUS_FAIL_INVALID_PARAM; - } - - } - + + } + } - - //issue Device Discoverability Response + + /* issue Device Discoverability Response */ issue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); - - - return (status==P2P_STATUS_SUCCESS) ? _TRUE:_FALSE; - + + + return (status == P2P_STATUS_SUCCESS) ? _TRUE : _FALSE; + } u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) @@ -2621,52 +2503,46 @@ u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint l return _TRUE; } -u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) { u8 *frame_body; u8 *wpsie; uint wps_ielen = 0, attr_contentlen = 0; u16 uconfig_method = 0; - + frame_body = (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); - if ( (wpsie=rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen)) ) - { - if ( rtw_get_wps_attr_content( wpsie, wps_ielen, WPS_ATTR_CONF_METHOD , ( u8* ) &uconfig_method, &attr_contentlen) ) - { - uconfig_method = be16_to_cpu( uconfig_method ); - switch( uconfig_method ) - { - case WPS_CM_DISPLYA: - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3 ); - break; - } - case WPS_CM_LABEL: - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "lab", 3 ); - break; - } - case WPS_CM_PUSH_BUTTON: - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3 ); - break; - } - case WPS_CM_KEYPAD: - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3 ); - break; - } + wpsie = rtw_get_wps_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen); + if (wpsie) { + if (rtw_get_wps_attr_content(wpsie, wps_ielen, WPS_ATTR_CONF_METHOD , (u8 *) &uconfig_method, &attr_contentlen)) { + uconfig_method = be16_to_cpu(uconfig_method); + switch (uconfig_method) { + case WPS_CM_DISPLYA: { + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3); + break; } - issue_p2p_provision_resp( pwdinfo, GetAddr2Ptr(pframe), frame_body, uconfig_method); + case WPS_CM_LABEL: { + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "lab", 3); + break; + } + case WPS_CM_PUSH_BUTTON: { + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3); + break; + } + case WPS_CM_KEYPAD: { + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3); + break; + } + } + issue_p2p_provision_resp(pwdinfo, GetAddr2Ptr(pframe), frame_body, uconfig_method); } } - DBG_871X( "[%s] config method = %s\n", __FUNCTION__, pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req ); + RTW_INFO("[%s] config method = %s\n", __FUNCTION__, pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req); return _TRUE; - + } - + u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe) { @@ -2681,15 +2557,12 @@ u8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8 ch_content += 3; ch_cnt -= 3; - while( ch_cnt > 0) - { + while (ch_cnt > 0) { ch_content += 1; ch_cnt -= 1; temp = *ch_content; - for( i = 0 ; i < temp ; i++, j++ ) - { - peer_ch_list[j] = *( ch_content + 1 + i ); - } + for (i = 0 ; i < temp ; i++, j++) + peer_ch_list[j] = *(ch_content + 1 + i); ch_content += (temp + 1); ch_cnt -= (temp + 1); ch_no += temp ; @@ -2702,12 +2575,9 @@ u8 rtw_p2p_check_peer_oper_ch(struct mlme_ext_priv *pmlmeext, u8 ch) { u8 i = 0; - for( i = 0; i < pmlmeext->max_chan_nums; i++ ) - { - if ( pmlmeext->channel_set[ i ].ChannelNum == ch ) - { + for (i = 0; i < pmlmeext->max_chan_nums; i++) { + if (pmlmeext->channel_set[i].ChannelNum == ch) return _SUCCESS; - } } return _FAIL; @@ -2718,13 +2588,10 @@ u8 rtw_p2p_ch_inclusion(struct mlme_ext_priv *pmlmeext, u8 *peer_ch_list, u8 pee int i = 0, j = 0, temp = 0; u8 ch_no = 0; - for( i = 0; i < peer_ch_num; i++ ) - { - for( j = temp; j < pmlmeext->max_chan_nums; j++ ) - { - if( *( peer_ch_list + i ) == pmlmeext->channel_set[ j ].ChannelNum ) - { - ch_list_inclusioned[ ch_no++ ] = *( peer_ch_list + i ); + for (i = 0; i < peer_ch_num; i++) { + for (j = temp; j < pmlmeext->max_chan_nums; j++) { + if (*(peer_ch_list + i) == pmlmeext->channel_set[j].ChannelNum) { + ch_list_inclusioned[ch_no++] = *(peer_ch_list + i); temp = j; break; } @@ -2734,77 +2601,57 @@ u8 rtw_p2p_ch_inclusion(struct mlme_ext_priv *pmlmeext, u8 *peer_ch_list, u8 pee return ch_no; } -u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +u8 process_p2p_group_negotation_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) { _adapter *padapter = pwdinfo->padapter; u8 result = P2P_STATUS_SUCCESS; u32 p2p_ielen = 0, wps_ielen = 0; - u8 * ies; + u8 *ies; u32 ies_len; u8 *p2p_ie; u8 *wpsie; u16 wps_devicepassword_id = 0x0000; uint wps_devicepassword_id_len = 0; #ifdef CONFIG_WFD - u8 wfd_ie[ 128 ] = { 0x00 }; - u32 wfd_ielen = 0; #ifdef CONFIG_TDLS struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; -#endif // CONFIG_TDLS -#endif // CONFIG_WFD -#ifdef CONFIG_CONCURRENT_MODE - _adapter *pbuddy_adapter = pwdinfo->padapter->pbuddy_adapter; - struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo; - struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; -#endif +#endif /* CONFIG_TDLS */ +#endif /* CONFIG_WFD */ + wpsie = rtw_get_wps_ie(pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen); + if (wpsie) { + /* Commented by Kurt 20120113 */ + /* If some device wants to do p2p handshake without sending prov_disc_req */ + /* We have to get peer_req_cm from here. */ + if (_rtw_memcmp(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3)) { + rtw_get_wps_attr_content(wpsie, wps_ielen, WPS_ATTR_DEVICE_PWID, (u8 *) &wps_devicepassword_id, &wps_devicepassword_id_len); + wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id); - if ( (wpsie=rtw_get_wps_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen)) ) - { - // Commented by Kurt 20120113 - // If some device wants to do p2p handshake without sending prov_disc_req - // We have to get peer_req_cm from here. - if(_rtw_memcmp( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3) ) - { - rtw_get_wps_attr_content( wpsie, wps_ielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); - wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); - - if ( wps_devicepassword_id == WPS_DPID_USER_SPEC ) - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3 ); - } - else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC ) - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3 ); - } + if (wps_devicepassword_id == WPS_DPID_USER_SPEC) + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3); + else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3); else - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3 ); - } + _rtw_memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3); } - } - else - { - DBG_871X( "[%s] WPS IE not Found!!\n", __FUNCTION__ ); + } else { + RTW_INFO("[%s] WPS IE not Found!!\n", __FUNCTION__); result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); - return( result ); + return result ; } ies = pframe + _PUBLIC_ACTION_IE_OFFSET_; ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; - - p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); - if ( !p2p_ie ) - { - DBG_871X( "[%s] P2P IE not Found!!\n", __FUNCTION__ ); + p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); + + if (!p2p_ie) { + RTW_INFO("[%s] P2P IE not Found!!\n", __FUNCTION__); result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); } - - while ( p2p_ie ) - { + + while (p2p_ie) { u8 attr_content = 0x00; u32 attr_contentlen = 0; u8 ch_content[100] = { 0x00 }; @@ -2818,124 +2665,95 @@ u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_ING); - //Check P2P Capability ATTR - if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen) ) - { + /* Check P2P Capability ATTR */ + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8 *)&cap_attr, (uint *)&attr_contentlen)) { cap_attr = le16_to_cpu(cap_attr); - + #if defined(CONFIG_WFD) && defined(CONFIG_TDLS) - if(!(cap_attr & P2P_GRPCAP_INTRABSS) ) + if (!(cap_attr & P2P_GRPCAP_INTRABSS)) ptdlsinfo->ap_prohibited = _TRUE; -#endif //defined(CONFIG_WFD) && defined(CONFIG_TDLS) +#endif /* defined(CONFIG_WFD) && defined(CONFIG_TDLS) */ } - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen) ) - { - DBG_871X( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 ); - pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values. + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen)) { + RTW_INFO("[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01); + pwdinfo->peer_intent = attr_content; /* include both intent and tie breaker values. */ - if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) ) - { - // Try to match the tie breaker value - if ( pwdinfo->intent == P2P_MAX_INTENT ) - { + if (pwdinfo->intent == (pwdinfo->peer_intent >> 1)) { + /* Try to match the tie breaker value */ + if (pwdinfo->intent == P2P_MAX_INTENT) { rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; - } - else - { - if ( attr_content & 0x01 ) - { + } else { + if (attr_content & 0x01) rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - } else - { rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } - } - } - else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) ) - { + } + } else if (pwdinfo->intent > (pwdinfo->peer_intent >> 1)) rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } else - { rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - } - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - // Store the group id information. - _rtw_memcpy( pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN ); - _rtw_memcpy( pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + /* Store the group id information. */ + _rtw_memcpy(pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN); + _rtw_memcpy(pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen); } } if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, (u8 *)listen_ch_attr, (uint *) &attr_contentlen) && attr_contentlen == 5) pwdinfo->nego_req_info.peer_ch = listen_ch_attr[4]; - - DBG_871X(FUNC_ADPT_FMT" listen channel :%u\n", FUNC_ADPT_ARG(padapter), pwdinfo->nego_req_info.peer_ch); + + RTW_INFO(FUNC_ADPT_FMT" listen channel :%u\n", FUNC_ADPT_ARG(padapter), pwdinfo->nego_req_info.peer_ch); attr_contentlen = 0; - if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ) ) - { - if ( attr_contentlen != ETH_ALEN ) - { - _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); - } + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen)) { + if (attr_contentlen != ETH_ALEN) + _rtw_memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN); } - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt) ) - { + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt)) { peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, ch_content, ch_cnt, peer_ch_list); ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned); - if( ch_num_inclusioned == 0) - { - DBG_871X( "[%s] No common channel in channel list!\n", __FUNCTION__ ); + if (ch_num_inclusioned == 0) { + RTW_INFO("[%s] No common channel in channel list!\n", __FUNCTION__); result = P2P_STATUS_FAIL_NO_COMMON_CH; rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); break; } - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - if ( !rtw_p2p_is_channel_list_ok( pwdinfo->operating_channel, - ch_list_inclusioned, ch_num_inclusioned) ) - { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + if (!rtw_p2p_is_channel_list_ok(pwdinfo->operating_channel, + ch_list_inclusioned, ch_num_inclusioned)) { #ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - DBG_871X( "[%s] desired channel NOT Found!\n", __FUNCTION__ ); + if (rtw_mi_check_status(padapter, MI_LINKED) + && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + RTW_INFO("[%s] desired channel NOT Found!\n", __FUNCTION__); result = P2P_STATUS_FAIL_NO_COMMON_CH; rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); break; - } - else -#endif //CONFIG_CONCURRENT_MODE + } else +#endif /* CONFIG_CONCURRENT_MODE */ { u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0; attr_contentlen = 0; - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) ) - { + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) peer_operating_ch = operatingch_info[4]; - } - if ( rtw_p2p_is_channel_list_ok( peer_operating_ch, - ch_list_inclusioned, ch_num_inclusioned) ) - { + if (rtw_p2p_is_channel_list_ok(peer_operating_ch, + ch_list_inclusioned, ch_num_inclusioned)) { /** * Change our operating channel as peer's for compatibility. */ pwdinfo->operating_channel = peer_operating_ch; - DBG_871X( "[%s] Change op ch to %02x as peer's\n", __FUNCTION__, pwdinfo->operating_channel); - } - else - { - // Take first channel of ch_list_inclusioned as operating channel + RTW_INFO("[%s] Change op ch to %02x as peer's\n", __FUNCTION__, pwdinfo->operating_channel); + } else { + /* Take first channel of ch_list_inclusioned as operating channel */ pwdinfo->operating_channel = ch_list_inclusioned[0]; - DBG_871X( "[%s] Change op ch to %02x\n", __FUNCTION__, pwdinfo->operating_channel); + RTW_INFO("[%s] Change op ch to %02x\n", __FUNCTION__, pwdinfo->operating_channel); } } @@ -2943,8 +2761,8 @@ u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe } } - //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); + /* 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); } if (pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO) { @@ -2954,639 +2772,512 @@ u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe } #ifdef CONFIG_WFD - // Added by Albert 20110823 - // Try to get the TCP port information when receiving the negotiation request. - if ( rtw_get_wfd_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen ) ) - { - u8 attr_content[ 10 ] = { 0x00 }; - u32 attr_contentlen = 0; + rtw_process_wfd_ies(padapter, pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, __func__); +#endif - 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 ) - { - pwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); - DBG_871X( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport ); - } - } -#endif // CONFIG_WFD - - return( result ); + return result ; } -u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +u8 process_p2p_group_negotation_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) { _adapter *padapter = pwdinfo->padapter; u8 result = P2P_STATUS_SUCCESS; u32 p2p_ielen, wps_ielen; - u8 * ies; + u8 *ies; u32 ies_len; - u8 * p2p_ie; + u8 *p2p_ie; #ifdef CONFIG_WFD - u8 wfd_ie[ 128 ] = { 0x00 }; - u32 wfd_ielen = 0; #ifdef CONFIG_TDLS struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; -#endif // CONFIG_TDLS -#endif // CONFIG_WFD +#endif /* CONFIG_TDLS */ +#endif /* CONFIG_WFD */ ies = pframe + _PUBLIC_ACTION_IE_OFFSET_; ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; - // Be able to know which one is the P2P GO and which one is P2P client. - - if ( rtw_get_wps_ie( ies, ies_len, NULL, &wps_ielen) ) - { + /* Be able to know which one is the P2P GO and which one is P2P client. */ - } - else - { - DBG_871X( "[%s] WPS IE not Found!!\n", __FUNCTION__ ); + if (rtw_get_wps_ie(ies, ies_len, NULL, &wps_ielen)) { + + } else { + RTW_INFO("[%s] WPS IE not Found!!\n", __FUNCTION__); result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); } - p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); - if ( !p2p_ie ) - { + p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); + if (!p2p_ie) { rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; - } - else - { + } else { u8 attr_content = 0x00; u32 attr_contentlen = 0; u8 operatingch_info[5] = { 0x00 }; uint ch_cnt = 0; u8 ch_content[100] = { 0x00 }; - u8 groupid[ 38 ]; + u8 groupid[38]; u16 cap_attr; u8 peer_ch_list[100] = { 0x00 }; u8 peer_ch_num = 0; u8 ch_list_inclusioned[100] = { 0x00 }; u8 ch_num_inclusioned = 0; - while ( p2p_ie ) // Found the P2P IE. - { + while (p2p_ie) { /* Found the P2P IE. */ - //Check P2P Capability ATTR - if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen) ) - { + /* Check P2P Capability ATTR */ + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8 *)&cap_attr, (uint *)&attr_contentlen)) { cap_attr = le16_to_cpu(cap_attr); #ifdef CONFIG_TDLS - if(!(cap_attr & P2P_GRPCAP_INTRABSS) ) + if (!(cap_attr & P2P_GRPCAP_INTRABSS)) ptdlsinfo->ap_prohibited = _TRUE; -#endif // CONFIG_TDLS +#endif /* CONFIG_TDLS */ } rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); - if ( attr_contentlen == 1 ) - { - DBG_871X( "[%s] Status = %d\n", __FUNCTION__, attr_content ); - if ( attr_content == P2P_STATUS_SUCCESS ) - { - // Do nothing. - } - else - { - if ( P2P_STATUS_FAIL_INFO_UNAVAILABLE == attr_content ) { + if (attr_contentlen == 1) { + RTW_INFO("[%s] Status = %d\n", __FUNCTION__, attr_content); + if (attr_content == P2P_STATUS_SUCCESS) { + /* Do nothing. */ + } else { + if (P2P_STATUS_FAIL_INFO_UNAVAILABLE == attr_content) rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INFOR_NOREADY); - } else { + else rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); - } rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); result = attr_content; break; } } - // Try to get the peer's interface address + /* Try to get the peer's interface address */ attr_contentlen = 0; - if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ) ) - { - if ( attr_contentlen != ETH_ALEN ) - { - _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); - } + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen)) { + if (attr_contentlen != ETH_ALEN) + _rtw_memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN); } - - // Try to get the peer's intent and tie breaker value. + + /* Try to get the peer's intent and tie breaker value. */ attr_content = 0x00; attr_contentlen = 0; - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen) ) - { - DBG_871X( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 ); - pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values. + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen)) { + RTW_INFO("[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01); + pwdinfo->peer_intent = attr_content; /* include both intent and tie breaker values. */ - if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) ) - { - // Try to match the tie breaker value - if ( pwdinfo->intent == P2P_MAX_INTENT ) - { + if (pwdinfo->intent == (pwdinfo->peer_intent >> 1)) { + /* Try to match the tie breaker value */ + if (pwdinfo->intent == P2P_MAX_INTENT) { rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); - } - else - { + } else { rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); - if ( attr_content & 0x01 ) - { + if (attr_content & 0x01) rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - } else - { rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } - } - } - else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) ) - { + } + } else if (pwdinfo->intent > (pwdinfo->peer_intent >> 1)) { rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } - else - { + } else { rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); } - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - // Store the group id information. - _rtw_memcpy( pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN ); - _rtw_memcpy( pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); - + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + /* Store the group id information. */ + _rtw_memcpy(pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN); + _rtw_memcpy(pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen); + } } - - // Try to get the operation channel information - + + /* Try to get the operation channel information */ + attr_contentlen = 0; - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) - { - DBG_871X( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] ); + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) { + RTW_INFO("[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4]); pwdinfo->peer_operating_ch = operatingch_info[4]; } - - // Try to get the channel list information - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, pwdinfo->channel_list_attr, &pwdinfo->channel_list_attr_len ) ) - { - DBG_871X( "[%s] channel list attribute found, len = %d\n", __FUNCTION__, pwdinfo->channel_list_attr_len ); + + /* Try to get the channel list information */ + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, pwdinfo->channel_list_attr, &pwdinfo->channel_list_attr_len)) { + RTW_INFO("[%s] channel list attribute found, len = %d\n", __FUNCTION__, pwdinfo->channel_list_attr_len); peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, pwdinfo->channel_list_attr, pwdinfo->channel_list_attr_len, peer_ch_list); ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned); - if( ch_num_inclusioned == 0) - { - DBG_871X( "[%s] No common channel in channel list!\n", __FUNCTION__ ); + if (ch_num_inclusioned == 0) { + RTW_INFO("[%s] No common channel in channel list!\n", __FUNCTION__); result = P2P_STATUS_FAIL_NO_COMMON_CH; rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); break; } - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - if ( !rtw_p2p_is_channel_list_ok( pwdinfo->operating_channel, - ch_list_inclusioned, ch_num_inclusioned) ) - { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { + if (!rtw_p2p_is_channel_list_ok(pwdinfo->operating_channel, + ch_list_inclusioned, ch_num_inclusioned)) { #ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - DBG_871X( "[%s] desired channel NOT Found!\n", __FUNCTION__ ); + if (rtw_mi_check_status(padapter, MI_LINKED) + && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + RTW_INFO("[%s] desired channel NOT Found!\n", __FUNCTION__); result = P2P_STATUS_FAIL_NO_COMMON_CH; rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); break; - } - else -#endif //CONFIG_CONCURRENT_MODE + } else +#endif /* CONFIG_CONCURRENT_MODE */ { u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0; attr_contentlen = 0; - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) ) - { + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) peer_operating_ch = operatingch_info[4]; - } - if ( rtw_p2p_is_channel_list_ok( peer_operating_ch, - ch_list_inclusioned, ch_num_inclusioned) ) - { + if (rtw_p2p_is_channel_list_ok(peer_operating_ch, + ch_list_inclusioned, ch_num_inclusioned)) { /** * Change our operating channel as peer's for compatibility. */ pwdinfo->operating_channel = peer_operating_ch; - DBG_871X( "[%s] Change op ch to %02x as peer's\n", __FUNCTION__, pwdinfo->operating_channel); - } - else - { - // Take first channel of ch_list_inclusioned as operating channel + RTW_INFO("[%s] Change op ch to %02x as peer's\n", __FUNCTION__, pwdinfo->operating_channel); + } else { + /* Take first channel of ch_list_inclusioned as operating channel */ pwdinfo->operating_channel = ch_list_inclusioned[0]; - DBG_871X( "[%s] Change op ch to %02x\n", __FUNCTION__, pwdinfo->operating_channel); + RTW_INFO("[%s] Change op ch to %02x\n", __FUNCTION__, pwdinfo->operating_channel); } } } } - } - else - { - DBG_871X( "[%s] channel list attribute not found!\n", __FUNCTION__); + } else + RTW_INFO("[%s] channel list attribute not found!\n", __FUNCTION__); + + /* Try to get the group id information if peer is GO */ + attr_contentlen = 0; + _rtw_memset(groupid, 0x00, 38); + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) { + _rtw_memcpy(pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN); + _rtw_memcpy(pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN); } - // Try to get the group id information if peer is GO - attr_contentlen = 0; - _rtw_memset( groupid, 0x00, 38 ); - if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen) ) - { - _rtw_memcpy( pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN ); - _rtw_memcpy( pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN ); - } - - //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); + /* 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); } - + } #ifdef CONFIG_WFD - // Added by Albert 20111122 - // Try to get the TCP port information when receiving the negotiation response. - if ( rtw_get_wfd_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen ) ) - { - u8 attr_content[ 10 ] = { 0x00 }; - u32 attr_contentlen = 0; + rtw_process_wfd_ies(padapter, pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, __func__); +#endif - DBG_8192C( "[%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 ) - { - pwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); - DBG_8192C( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport ); - } - } -#endif // CONFIG_WFD - - return( result ); + return result ; } -u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +u8 process_p2p_group_negotation_confirm(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) { - u8 * ies; + _adapter *padapter = pwdinfo->padapter; + u8 *ies; u32 ies_len; - u8 * p2p_ie; + u8 *p2p_ie; u32 p2p_ielen = 0; u8 result = P2P_STATUS_SUCCESS; ies = pframe + _PUBLIC_ACTION_IE_OFFSET_; ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; - p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); - while ( p2p_ie ) // Found the P2P IE. - { + p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); + while (p2p_ie) { /* Found the P2P IE. */ u8 attr_content = 0x00, operatingch_info[5] = { 0x00 }; - u8 groupid[ 38 ] = { 0x00 }; + u8 groupid[38] = { 0x00 }; u32 attr_contentlen = 0; pwdinfo->negotiation_dialog_token = 1; rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); - if ( attr_contentlen == 1 ) - { - DBG_871X( "[%s] Status = %d\n", __FUNCTION__, attr_content ); + if (attr_contentlen == 1) { + RTW_INFO("[%s] Status = %d\n", __FUNCTION__, attr_content); result = attr_content; - if ( attr_content == P2P_STATUS_SUCCESS ) - { + if (attr_content == P2P_STATUS_SUCCESS) { u8 bcancelled = 0; - - _cancel_timer( &pwdinfo->restore_p2p_state_timer, &bcancelled ); - // Commented by Albert 20100911 - // Todo: Need to handle the case which both Intents are the same. + _cancel_timer(&pwdinfo->restore_p2p_state_timer, &bcancelled); + + /* Commented by Albert 20100911 */ + /* Todo: Need to handle the case which both Intents are the same. */ rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); - if ( ( pwdinfo->intent ) > ( pwdinfo->peer_intent >> 1 ) ) - { + if ((pwdinfo->intent) > (pwdinfo->peer_intent >> 1)) rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } - else if ( ( pwdinfo->intent ) < ( pwdinfo->peer_intent >> 1 ) ) - { + else if ((pwdinfo->intent) < (pwdinfo->peer_intent >> 1)) rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - } - else - { - // Have to compare the Tie Breaker - if ( pwdinfo->peer_intent & 0x01 ) - { + else { + /* Have to compare the Tie Breaker */ + if (pwdinfo->peer_intent & 0x01) rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - } else - { rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } - } - -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(pwdinfo->padapter , _FW_LINKED ) ) - { - // Switch back to the AP channel soon. - _set_timer( &pwdinfo->ap_p2p_switch_timer, 100 ); } -#endif - } - else - { + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED) + && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + /* Switch back to the AP channel soon. */ + _set_timer(&pwdinfo->ap_p2p_switch_timer, 100); + } +#endif + } else { rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); break; } } - // Try to get the group id information + /* Try to get the group id information */ attr_contentlen = 0; - _rtw_memset( groupid, 0x00, 38 ); - if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen) ) - { - DBG_871X( "[%s] Ssid = %s, ssidlen = %zu\n", __FUNCTION__, &groupid[ETH_ALEN], strlen(&groupid[ETH_ALEN]) ); - _rtw_memcpy( pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN ); - _rtw_memcpy( pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN ); + _rtw_memset(groupid, 0x00, 38); + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) { + RTW_INFO("[%s] Ssid = %s, ssidlen = %zu\n", __FUNCTION__, &groupid[ETH_ALEN], strlen(&groupid[ETH_ALEN])); + _rtw_memcpy(pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN); + _rtw_memcpy(pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN); } attr_contentlen = 0; - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) ) - { - DBG_871X( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] ); + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen)) { + RTW_INFO("[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4]); pwdinfo->peer_operating_ch = operatingch_info[4]; } - //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); - + /* 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); + } - return( result ); + return result ; } u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) { - u8 *frame_body; - u8 dialogToken=0; + u8 *frame_body; + u8 dialogToken = 0; u8 status = P2P_STATUS_SUCCESS; - + frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); dialogToken = frame_body[6]; - //todo: check NoA attribute + /* todo: check NoA attribute */ issue_p2p_presence_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); return _TRUE; } -void find_phase_handler( _adapter* padapter ) +void find_phase_handler(_adapter *padapter) { struct wifidirect_info *pwdinfo = &padapter->wdinfo; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - NDIS_802_11_SSID ssid; + NDIS_802_11_SSID ssid; _irqL irqL; u8 _status = 0; -_func_enter_; - _rtw_memset((unsigned char*)&ssid, 0, sizeof(NDIS_802_11_SSID)); - _rtw_memcpy(ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN ); + _rtw_memset((unsigned char *)&ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN); ssid.SsidLength = P2P_WILDCARD_SSID_LEN; rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); - + _enter_critical_bh(&pmlmepriv->lock, &irqL); _status = rtw_sitesurvey_cmd(padapter, &ssid, 1, NULL, 0); _exit_critical_bh(&pmlmepriv->lock, &irqL); -_func_exit_; } -void p2p_concurrent_handler( _adapter* padapter ); +void p2p_concurrent_handler(_adapter *padapter); -void restore_p2p_state_handler( _adapter* padapter ) +void restore_p2p_state_handler(_adapter *padapter) { struct wifidirect_info *pwdinfo = &padapter->wdinfo; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -_func_enter_; - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) - { + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL)) rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - } #ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP)) - { - 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 (rtw_mi_check_status(padapter, MI_LINKED)) { + u8 union_ch = rtw_mi_get_union_chan(padapter); + u8 union_bw = rtw_mi_get_union_bw(padapter); + u8 union_offset = rtw_mi_get_union_offset(padapter); + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP)) { + set_channel_bwmode(padapter, union_ch, union_offset, union_bw); + rtw_mi_buddy_issue_nulldata(padapter, NULL, 0, 3, 500); } } #endif rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) - { + + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) { #ifdef CONFIG_CONCURRENT_MODE - p2p_concurrent_handler( padapter ); + p2p_concurrent_handler(padapter); #else - // In the P2P client mode, the driver should not switch back to its listen channel - // because this P2P client should stay at the operating channel of P2P GO. - set_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + /* In the P2P client mode, the driver should not switch back to its listen channel */ + /* because this P2P client should stay at the operating channel of P2P GO. */ + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); #endif } -_func_exit_; } -void pre_tx_invitereq_handler( _adapter* padapter ) +void pre_tx_invitereq_handler(_adapter *padapter) { struct wifidirect_info *pwdinfo = &padapter->wdinfo; u8 val8 = 1; -_func_enter_; set_channel_bwmode(padapter, pwdinfo->invitereq_info.peer_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); - rtw_hal_set_hwreg(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 ); - -_func_exit_; + _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); + } -void pre_tx_provdisc_handler( _adapter* padapter ) +void pre_tx_provdisc_handler(_adapter *padapter) { struct wifidirect_info *pwdinfo = &padapter->wdinfo; u8 val8 = 1; -_func_enter_; set_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); 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 ); - -_func_exit_; + _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); + } -void pre_tx_negoreq_handler( _adapter* padapter ) +void pre_tx_negoreq_handler(_adapter *padapter) { struct wifidirect_info *pwdinfo = &padapter->wdinfo; u8 val8 = 1; -_func_enter_; set_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); - 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 ); - -_func_exit_; + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + issue_probereq_p2p(padapter , NULL); + /* WIN Phone only accept unicast probe request when nego back */ + issue_probereq_p2p(padapter , pwdinfo->nego_req_info.peerDevAddr); + _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); + } #ifdef CONFIG_CONCURRENT_MODE -void p2p_concurrent_handler( _adapter* padapter ) +void p2p_concurrent_handler(_adapter *padapter) { struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - //_adapter *pbuddy_adapter = padapter->pbuddy_adapter; - //struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo; - //struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv; - //struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; u8 val8; -_func_enter_; - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + if (rtw_mi_check_status(padapter, MI_LINKED)) { + u8 union_ch = rtw_mi_get_union_chan(padapter); + u8 union_bw = rtw_mi_get_union_bw(padapter); + u8 union_offset = rtw_mi_get_union_offset(padapter); - pwdinfo->operating_channel = pbuddy_mlmeext->cur_channel; + pwdinfo->operating_channel = union_ch; - if( pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - DBG_871X("%s, switch ch back to buddy's cur_channel=%d\n", __func__, pbuddy_mlmeext->cur_channel); + if (pwdinfo->driver_interface == DRIVER_CFG80211) { + RTW_INFO("%s, switch ch back to union_ch=%d\n", __func__, union_ch); + set_channel_bwmode(padapter, union_ch, union_offset, union_bw); - set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); + rtw_mi_buddy_issue_nulldata(padapter, 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 ) - { - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) - { - // Now, the driver stays on the AP's channel. - // If the pwdinfo->ext_listen_period = 0, that means the P2P listen state is not available on listen channel. - if ( pwdinfo->ext_listen_period > 0 ) - { - DBG_8192C( "[%s] P2P_STATE_IDLE, ext_listen_period = %d\n", __FUNCTION__, pwdinfo->ext_listen_period ); + } else if (pwdinfo->driver_interface == DRIVER_WEXT) { + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) { + /* Now, the driver stays on the AP's channel. */ + /* If the pwdinfo->ext_listen_period = 0, that means the P2P listen state is not available on listen channel. */ + if (pwdinfo->ext_listen_period > 0) { + RTW_INFO("[%s] P2P_STATE_IDLE, ext_listen_period = %d\n", __FUNCTION__, pwdinfo->ext_listen_period); - if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel ) - { - // Will switch to listen channel so that need to send the NULL data with PW bit to AP. - issue_nulldata(pbuddy_adapter, NULL, 1, 3, 500); + if (union_ch != pwdinfo->listen_channel) { + /* Will switch to listen channel so that need to send the NULL data with PW bit to AP. */ + rtw_mi_buddy_issue_nulldata(padapter, NULL, 1, 3, 500); set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); } rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - if(!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) && - !(pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { + + if (!rtw_mi_check_mlmeinfo_state(padapter, WIFI_FW_AP_STATE)) { val8 = 1; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); } - // Todo: To check the value of pwdinfo->ext_listen_period is equal to 0 or not. - _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period ); + /* Todo: To check the value of pwdinfo->ext_listen_period is equal to 0 or not. */ + _set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period); } - } - else if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) || - rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL) || - ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _FALSE ) || - rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ) ) - { - // Now, the driver is in the listen state of P2P mode. - DBG_8192C( "[%s] P2P_STATE_IDLE, ext_listen_interval = %d\n", __FUNCTION__, pwdinfo->ext_listen_interval ); + } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) || + rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL) || + (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _FALSE) || + rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ)) { + /* Now, the driver is in the listen state of P2P mode. */ + RTW_INFO("[%s] P2P_STATE_IDLE, ext_listen_interval = %d\n", __FUNCTION__, pwdinfo->ext_listen_interval); - // Commented by Albert 2012/11/01 - // If the AP's channel is the same as the listen channel, we should still be in the listen state - // Other P2P device is still able to find this device out even this device is in the AP's channel. - // So, configure this device to be able to receive the probe request frame and set it to listen state. - if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel ) - { - set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); - if(!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) &&!(pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { + /* Commented by Albert 2012/11/01 */ + /* If the AP's channel is the same as the listen channel, we should still be in the listen state */ + /* Other P2P device is still able to find this device out even this device is in the AP's channel. */ + /* So, configure this device to be able to receive the probe request frame and set it to listen state. */ + if (union_ch != pwdinfo->listen_channel) { + + set_channel_bwmode(padapter, union_ch, union_offset, union_bw); + if (!rtw_mi_check_status(padapter, MI_AP_MODE)) { val8 = 0; 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); + rtw_mi_buddy_issue_nulldata(padapter, NULL, 0, 3, 500); } - // Todo: To check the value of pwdinfo->ext_listen_interval is equal to 0 or not. - _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_interval ); - } - else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_OK)) - { - // The driver had finished the P2P handshake successfully. + /* Todo: To check the value of pwdinfo->ext_listen_interval is equal to 0 or not. */ + _set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_interval); + } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_OK)) { + /* The driver had finished the P2P handshake successfully. */ val8 = 0; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - 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); - } - else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) - { + set_channel_bwmode(padapter, union_ch, union_offset, union_bw); + rtw_mi_buddy_issue_nulldata(padapter, NULL, 0, 3, 500); + } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) { val8 = 1; set_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); 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 ); - } - else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _TRUE) - { + _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); + } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _TRUE) { val8 = 1; set_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); 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 ); - } - else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) && pwdinfo->invitereq_info.benable == _TRUE) - { + _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); + } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ) && pwdinfo->invitereq_info.benable == _TRUE) { /* val8 = 1; - set_channel_bwmode(padapter, , HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + set_channel_bwmode(padapter, , HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); 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 ); */ } } - } - else - { - set_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + } else { + /* In p2p+softap. When in P2P_STATE_GONEGO_OK, not back to listen channel.*/ + if (!rtw_p2p_chk_state(pwdinfo , P2P_STATE_GONEGO_OK) || padapter->registrypriv.full_ch_in_p2p_handshake == 0) + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + else + RTW_INFO("%s, buddy not linked, go nego ok, not back to listen channel\n", __func__); } -_func_exit_; } #endif @@ -3597,92 +3288,85 @@ static void ro_ch_handler(_adapter *padapter) struct wifidirect_info *pwdinfo = &padapter->wdinfo; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; u8 ch, bw, offset; -_func_enter_; - if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) { + if (rtw_mi_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); - } - else if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->listen_channel) { + RTW_INFO(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); - } - else { + RTW_INFO(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); + RTW_INFO(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); rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); + RTW_INFO("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); #endif 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_INFO("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, - &pcfg80211_wdinfo->remain_on_ch_channel, - pcfg80211_wdinfo->remain_on_ch_type, GFP_KERNEL); + rtw_cfg80211_remain_on_channel_expired(padapter, + pcfg80211_wdinfo->remain_on_ch_cookie, + &pcfg80211_wdinfo->remain_on_ch_channel, + pcfg80211_wdinfo->remain_on_ch_type, GFP_KERNEL); -_func_exit_; } -static void ro_ch_timer_process (void *FunctionContext) +static void ro_ch_timer_process(void *FunctionContext) { _adapter *adapter = (_adapter *)FunctionContext; struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter); - //printk("%s \n", __FUNCTION__); - -#ifdef CONFIG_CONCURRENT_MODE + /* printk("%s\n", __FUNCTION__); */ + +#ifdef CONFIG_CONCURRENT_MODE ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); #endif - p2p_protocol_wk_cmd( adapter, P2P_RO_CH_WK); + p2p_protocol_wk_cmd(adapter, P2P_RO_CH_WK); } static void rtw_change_p2pie_op_ch(_adapter *padapter, const u8 *frame_body, u32 len, u8 ch) { u8 *ies, *p2p_ie; u32 ies_len, p2p_ielen; - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); + ies = (u8 *)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; - p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); + p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); - while ( p2p_ie ) { + while (p2p_ie) { u32 attr_contentlen = 0; u8 *pattr = NULL; - //Check P2P_ATTR_OPERATING_CH + /* Check P2P_ATTR_OPERATING_CH */ attr_contentlen = 0; pattr = NULL; - if((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL) - { - *(pattr+4) = ch; - } + pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint *)&attr_contentlen); + if (pattr != NULL) + *(pattr + 4) = ch; - //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); + /* 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); } } @@ -3690,39 +3374,38 @@ static void rtw_change_p2pie_ch_list(_adapter *padapter, const u8 *frame_body, u { u8 *ies, *p2p_ie; u32 ies_len, p2p_ielen; - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); + ies = (u8 *)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; - p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); + p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); while (p2p_ie) { u32 attr_contentlen = 0; u8 *pattr = NULL; - //Check P2P_ATTR_CH_LIST - if ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL) { + /* Check P2P_ATTR_CH_LIST */ + pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint *)&attr_contentlen); + if (pattr != NULL) { int i; u32 num_of_ch; u8 *pattr_temp = pattr + 3 ; attr_contentlen -= 3; - - while (attr_contentlen>0) { - num_of_ch = *(pattr_temp+1); - for(i=0; i 0) { + num_of_ch = *(pattr_temp + 1); - pattr_temp += (2+num_of_ch); - attr_contentlen -= (2+num_of_ch); + for (i = 0; i < num_of_ch; i++) + *(pattr_temp + 2 + i) = ch; + + pattr_temp += (2 + num_of_ch); + attr_contentlen -= (2 + num_of_ch); } } - //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); + /* 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); } } @@ -3732,45 +3415,44 @@ static bool rtw_chk_p2pie_ch_list_with_buddy(_adapter *padapter, const u8 *frame #ifdef CONFIG_CONCURRENT_MODE u8 *ies, *p2p_ie; u32 ies_len, p2p_ielen; - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - u8 buddy_ch = pbuddy_mlmeext->cur_channel; + u8 union_ch = rtw_mi_get_union_chan(padapter); - ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); + ies = (u8 *)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; - p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); + p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); while (p2p_ie) { u32 attr_contentlen = 0; u8 *pattr = NULL; - //Check P2P_ATTR_CH_LIST - if ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL) { + /* Check P2P_ATTR_CH_LIST */ + pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint *)&attr_contentlen); + if (pattr != NULL) { int i; u32 num_of_ch; u8 *pattr_temp = pattr + 3 ; attr_contentlen -= 3; - while (attr_contentlen>0) { - num_of_ch = *(pattr_temp+1); + while (attr_contentlen > 0) { + num_of_ch = *(pattr_temp + 1); - for(i=0; ipbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - u8 buddy_ch = pbuddy_mlmeext->cur_channel; + u8 union_ch = rtw_mi_get_union_chan(padapter); - ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); + ies = (u8 *)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; - p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); + p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); while (p2p_ie) { u32 attr_contentlen = 0; u8 *pattr = NULL; - //Check P2P_ATTR_OPERATING_CH + /* Check P2P_ATTR_OPERATING_CH */ attr_contentlen = 0; pattr = NULL; - if((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL) { - if (*(pattr+4) == buddy_ch) { - DBG_871X(FUNC_ADPT_FMT" op_ch fit buddy_ch:%u\n", FUNC_ADPT_ARG(padapter), buddy_ch); + pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint *)&attr_contentlen); + if (pattr != NULL) { + if (*(pattr + 4) == union_ch) { + RTW_INFO(FUNC_ADPT_FMT" op_ch fit buddy_ch:%u\n", FUNC_ADPT_ARG(padapter), union_ch); fit = _TRUE; 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); + /* 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); } #endif return fit; @@ -3818,172 +3499,208 @@ static void rtw_cfg80211_adjust_p2pie_channel(_adapter *padapter, const u8 *fram #ifdef CONFIG_CONCURRENT_MODE u8 *ies, *p2p_ie; u32 ies_len, p2p_ielen; - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + u8 union_ch = rtw_mi_get_union_chan(padapter); - ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); + ies = (u8 *)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; - - p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); - while ( p2p_ie ) - { + p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); + + while (p2p_ie) { u32 attr_contentlen = 0; u8 *pattr = NULL; - - //Check P2P_ATTR_CH_LIST - if((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL) - { + + /* Check P2P_ATTR_CH_LIST */ + pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint *)&attr_contentlen); + if (pattr != NULL) { int i; u32 num_of_ch; u8 *pattr_temp = pattr + 3 ; attr_contentlen -= 3; - - while(attr_contentlen>0) - { - num_of_ch = *(pattr_temp+1); - - for(i=0; icur_channel;//forcing to the same channel - pattr_temp += (2+num_of_ch); - attr_contentlen -= (2+num_of_ch); - } + while (attr_contentlen > 0) { + num_of_ch = *(pattr_temp + 1); + + for (i = 0; i < num_of_ch; i++) + *(pattr_temp + 2 + i) = union_ch; /*forcing to the same channel*/ + + pattr_temp += (2 + num_of_ch); + attr_contentlen -= (2 + num_of_ch); + } } - //Check P2P_ATTR_OPERATING_CH + /* Check P2P_ATTR_OPERATING_CH */ attr_contentlen = 0; pattr = NULL; - if((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL) - { - *(pattr+4) = pbuddy_mlmeext->cur_channel;//forcing to the same channel + pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint *)&attr_contentlen); + if (pattr != NULL) { + *(pattr + 4) = union_ch; /*forcing to the same channel */ } - //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); - + /* 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); + } #endif } #ifdef CONFIG_WFD -void rtw_append_wfd_ie(_adapter *padapter, u8 *buf, u32* len) +u32 rtw_xframe_build_wfd_ie(struct xmit_frame *xframe) { - unsigned char *frame_body; - u8 category, action, OUI_Subtype, dialogToken=0; + _adapter *adapter = xframe->padapter; + struct wifidirect_info *wdinfo = &adapter->wdinfo; + u8 *frame = xframe->buf_addr + TXDESC_OFFSET; + u8 *frame_body = frame + sizeof(struct rtw_ieee80211_hdr_3addr); + u8 *frame_tail = frame + xframe->attrib.pktlen; + u8 category, action, OUI_Subtype, dialogToken = 0; u32 wfdielen = 0; - struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); - - frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); - category = frame_body[0]; - if(category == RTW_WLAN_CATEGORY_PUBLIC) - { + category = frame_body[0]; + if (category == RTW_WLAN_CATEGORY_PUBLIC) { action = frame_body[1]; if (action == ACT_PUBLIC_VENDOR - && _rtw_memcmp(frame_body+2, P2P_OUI, 4) == _TRUE - ) - { + && _rtw_memcmp(frame_body + 2, P2P_OUI, 4) == _TRUE + ) { OUI_Subtype = frame_body[6]; dialogToken = frame_body[7]; - switch( OUI_Subtype )//OUI Subtype - { - case P2P_GO_NEGO_REQ: - { - wfdielen = build_nego_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_GO_NEGO_RESP: - { - wfdielen = build_nego_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_GO_NEGO_CONF: - { - wfdielen = build_nego_confirm_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_INVIT_REQ: - { - wfdielen = build_invitation_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_INVIT_RESP: - { - wfdielen = build_invitation_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_DEVDISC_REQ: - break; - case P2P_DEVDISC_RESP: - break; - case P2P_PROVISION_DISC_REQ: - { - wfdielen = build_provdisc_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - case P2P_PROVISION_DISC_RESP: - { - wfdielen = build_provdisc_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) ); - (*len) += wfdielen; - break; - } - default: - - break; + switch (OUI_Subtype) { + case P2P_GO_NEGO_REQ: + wfdielen = build_nego_req_wfd_ie(wdinfo, frame_tail); + break; + case P2P_GO_NEGO_RESP: + wfdielen = build_nego_resp_wfd_ie(wdinfo, frame_tail); + break; + case P2P_GO_NEGO_CONF: + wfdielen = build_nego_confirm_wfd_ie(wdinfo, frame_tail); + break; + case P2P_INVIT_REQ: + wfdielen = build_invitation_req_wfd_ie(wdinfo, frame_tail); + break; + case P2P_INVIT_RESP: + wfdielen = build_invitation_resp_wfd_ie(wdinfo, frame_tail); + break; + case P2P_PROVISION_DISC_REQ: + wfdielen = build_provdisc_req_wfd_ie(wdinfo, frame_tail); + break; + case P2P_PROVISION_DISC_RESP: + wfdielen = build_provdisc_resp_wfd_ie(wdinfo, frame_tail); + break; + case P2P_DEVDISC_REQ: + case P2P_DEVDISC_RESP: + default: + break; } } - - } - else if(category == RTW_WLAN_CATEGORY_P2P) - { + } else if (category == RTW_WLAN_CATEGORY_P2P) { OUI_Subtype = frame_body[5]; dialogToken = frame_body[6]; #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n", - cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ), OUI_Subtype, dialogToken); + RTW_INFO("ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n" + , cpu_to_be32(*((u32 *)(frame_body + 1))), OUI_Subtype, dialogToken); #endif - switch(OUI_Subtype) - { - case P2P_NOTICE_OF_ABSENCE: + switch (OUI_Subtype) { + case P2P_NOTICE_OF_ABSENCE: + break; + case P2P_PRESENCE_REQUEST: + break; + case P2P_PRESENCE_RESPONSE: + break; + case P2P_GO_DISC_REQUEST: + break; + default: + break; + } + } else + RTW_INFO("%s, action frame category=%d\n", __func__, category); - break; - case P2P_PRESENCE_REQUEST: + xframe->attrib.pktlen += wfdielen; - break; - case P2P_PRESENCE_RESPONSE: + return wfdielen; +} +#endif /* CONFIG_WFD */ - break; - case P2P_GO_DISC_REQUEST: +bool rtw_xframe_del_wfd_ie(struct xmit_frame *xframe) +{ +#define DBG_XFRAME_DEL_WFD_IE 0 - break; - default: + _adapter *adapter = xframe->padapter; + u8 *frame = xframe->buf_addr + TXDESC_OFFSET; + u8 *frame_body = frame + sizeof(struct rtw_ieee80211_hdr_3addr); + u8 *frame_tail = frame + xframe->attrib.pktlen; + u8 category, action, OUI_Subtype; + u8 *ies = NULL; + uint ies_len_ori = 0; + uint ies_len = 0; - break; - } + category = frame_body[0]; + if (category == RTW_WLAN_CATEGORY_PUBLIC) { + action = frame_body[1]; + if (action == ACT_PUBLIC_VENDOR + && _rtw_memcmp(frame_body + 2, P2P_OUI, 4) == _TRUE + ) { + OUI_Subtype = frame_body[6]; - } - else - { - DBG_871X("%s, action frame category=%d\n", __func__, category); - //is_p2p_frame = (-1); + switch (OUI_Subtype) { + case P2P_GO_NEGO_REQ: + case P2P_GO_NEGO_RESP: + case P2P_GO_NEGO_CONF: + case P2P_INVIT_REQ: + case P2P_INVIT_RESP: + case P2P_PROVISION_DISC_REQ: + case P2P_PROVISION_DISC_RESP: + ies = frame_body + 8; + ies_len_ori = frame_tail - (frame_body + 8); + break; + } + } } - return; + if (ies && ies_len_ori) { + ies_len = rtw_del_wfd_ie(ies, ies_len_ori, DBG_XFRAME_DEL_WFD_IE ? __func__ : NULL); + xframe->attrib.pktlen -= (ies_len_ori - ies_len); + } + + return ies_len_ori != ies_len; } + +/* +* rtw_xframe_chk_wfd_ie - +* +*/ +void rtw_xframe_chk_wfd_ie(struct xmit_frame *xframe) +{ + _adapter *adapter = xframe->padapter; + u8 *frame = xframe->buf_addr + TXDESC_OFFSET; + u8 *frame_body = frame + sizeof(struct rtw_ieee80211_hdr_3addr); + u8 *frame_tail = frame + xframe->attrib.pktlen; + + struct wifidirect_info *wdinfo = &adapter->wdinfo; + struct mlme_priv *mlme = &adapter->mlmepriv; + u8 build = 0; + u8 del = 0; + + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + del = 1; + +#ifdef CONFIG_IOCTL_CFG80211 + if (_TRUE == wdinfo->wfd_info->wfd_enable) #endif + del = build = 1; + + if (del) + rtw_xframe_del_wfd_ie(xframe); + +#ifdef CONFIG_WFD + if (build) + rtw_xframe_build_wfd_ie(xframe); +#endif +} u8 *dump_p2p_attr_ch_list(u8 *p2p_ie, uint p2p_ielen, u8 *buf, u32 buf_len) { @@ -3994,7 +3711,8 @@ u8 *dump_p2p_attr_ch_list(u8 *p2p_ie, uint p2p_ielen, u8 *buf, u32 buf_len) u8 ch_list[40]; bool continuous = _FALSE; - if ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, &attr_contentlen))!=NULL) { + pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, &attr_contentlen); + if (pattr != NULL) { int i, j; u32 num_of_ch; u8 *pattr_temp = pattr + 3 ; @@ -4003,33 +3721,32 @@ u8 *dump_p2p_attr_ch_list(u8 *p2p_ie, uint p2p_ielen, u8 *buf, u32 buf_len) _rtw_memset(ch_list, 0, 40); - while (attr_contentlen>0) { - num_of_ch = *(pattr_temp+1); + while (attr_contentlen > 0) { + num_of_ch = *(pattr_temp + 1); - for(i=0; i=ch_cnt) - ch_list[ch_cnt++] = *(pattr_temp+2+i); + if (j >= ch_cnt) + ch_list[ch_cnt++] = *(pattr_temp + 2 + i); } - pattr_temp += (2+num_of_ch); - attr_contentlen -= (2+num_of_ch); + pattr_temp += (2 + num_of_ch); + attr_contentlen -= (2 + num_of_ch); } - for (j=0;j>1 == resp >>1) - return req&0x01 ? _TRUE : _FALSE; - else if (req>>1 > resp>>1) + if (req >> 1 == resp >> 1) + return req & 0x01 ? _TRUE : _FALSE; + else if (req >> 1 > resp >> 1) return _TRUE; else return _FALSE; @@ -4052,7 +3769,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx) { int is_p2p_frame = (-1); unsigned char *frame_body; - u8 category, action, OUI_Subtype, dialogToken=0; + u8 category, action, OUI_Subtype, dialogToken = 0; u8 *p2p_ie = NULL; uint p2p_ielen = 0; struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); @@ -4061,549 +3778,508 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx) int op_ch = -1; int listen_ch = -1; u8 intent = 0; - - frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); + + frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); category = frame_body[0]; - //just for check - if(category == RTW_WLAN_CATEGORY_PUBLIC) - { + /* just for check */ + if (category == RTW_WLAN_CATEGORY_PUBLIC) { action = frame_body[1]; if (action == ACT_PUBLIC_VENDOR - && _rtw_memcmp(frame_body+2, P2P_OUI, 4) == _TRUE - ) - { + && _rtw_memcmp(frame_body + 2, P2P_OUI, 4) == _TRUE + ) { OUI_Subtype = frame_body[6]; dialogToken = frame_body[7]; is_p2p_frame = OUI_Subtype; - #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("ACTION_CATEGORY_PUBLIC: ACT_PUBLIC_VENDOR, OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n", - cpu_to_be32( *( ( u32* ) ( frame_body + 2 ) ) ), OUI_Subtype, dialogToken); - #endif +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("ACTION_CATEGORY_PUBLIC: ACT_PUBLIC_VENDOR, OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n", + cpu_to_be32(*((u32 *)(frame_body + 2))), OUI_Subtype, dialogToken); +#endif p2p_ie = rtw_get_p2p_ie( - (u8 *)buf+sizeof(struct rtw_ieee80211_hdr_3addr)+_PUBLIC_ACTION_IE_OFFSET_, - len-sizeof(struct rtw_ieee80211_hdr_3addr)-_PUBLIC_ACTION_IE_OFFSET_, - NULL, &p2p_ielen); + (u8 *)buf + sizeof(struct rtw_ieee80211_hdr_3addr) + _PUBLIC_ACTION_IE_OFFSET_, + len - sizeof(struct rtw_ieee80211_hdr_3addr) - _PUBLIC_ACTION_IE_OFFSET_, + NULL, &p2p_ielen); - switch( OUI_Subtype )//OUI Subtype - { + switch (OUI_Subtype) { /* OUI Subtype */ u8 *cont; uint cont_len; - case P2P_GO_NEGO_REQ: - { - struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info; + case P2P_GO_NEGO_REQ: { + struct rtw_wdev_nego_info *nego_info = &pwdev_priv->nego_info; - if (tx) { - #ifdef CONFIG_DRV_ISSUE_PROV_REQ // IOT FOR S2 - if(pwdev_priv->provdisc_req_issued == _FALSE) - rtw_cfg80211_issue_p2p_provision_request(padapter, buf, len); - #endif //CONFIG_DRV_ISSUE_PROV_REQ + if (tx) { +#ifdef CONFIG_DRV_ISSUE_PROV_REQ /* IOT FOR S2 */ + if (pwdev_priv->provdisc_req_issued == _FALSE) + rtw_cfg80211_issue_p2p_provision_request(padapter, buf, len); +#endif /* CONFIG_DRV_ISSUE_PROV_REQ */ - //pwdev_priv->provdisc_req_issued = _FALSE; + /* pwdev_priv->provdisc_req_issued = _FALSE; */ - #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) - if(check_buddy_fwstate(padapter, _FW_LINKED)) - rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); - #endif - } - - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) - op_ch = *(cont+4); - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, NULL, &cont_len))) - listen_ch = *(cont+4); - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len))) - intent = *cont; - - if (nego_info->token != dialogToken) - rtw_wdev_nego_info_init(nego_info); - - _rtw_memcpy(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN); - nego_info->active = tx ? 1 : 0; - nego_info->token = dialogToken; - nego_info->req_op_ch = op_ch; - nego_info->req_listen_ch = listen_ch; - nego_info->req_intent = intent; - nego_info->state = 0; - - dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); - DBG_871X("RTW_%s:P2P_GO_NEGO_REQ, dialogToken=%d, intent:%u%s, listen_ch:%d, op_ch:%d, ch_list:%s\n", - (tx==_TRUE)?"Tx":"Rx", dialogToken, (intent>>1), intent&0x1 ? "+" : "-", listen_ch, op_ch, ch_list_buf); - - if (!tx) { - #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) - if(check_buddy_fwstate(padapter, _FW_LINKED) - && rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) - { - DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter)); - rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0); - } - #endif - } - - break; +#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr)); +#endif } - case P2P_GO_NEGO_RESP: - { - struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info; - if (tx) { - #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) - if(check_buddy_fwstate(padapter, _FW_LINKED)) - rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); - #endif + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len); + if (cont) + op_ch = *(cont + 4); + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, NULL, &cont_len); + if (cont) + listen_ch = *(cont + 4); + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len); + if (cont) + intent = *cont; + + if (nego_info->token != dialogToken) + rtw_wdev_nego_info_init(nego_info); + + _rtw_memcpy(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN); + nego_info->active = tx ? 1 : 0; + nego_info->token = dialogToken; + nego_info->req_op_ch = op_ch; + nego_info->req_listen_ch = listen_ch; + nego_info->req_intent = intent; + nego_info->state = 0; + + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + RTW_INFO("RTW_%s:P2P_GO_NEGO_REQ, dialogToken=%d, intent:%u%s, listen_ch:%d, op_ch:%d, ch_list:%s, full_ch_in_p2p_handshake:%d\n" , + (tx == _TRUE) ? "Tx" : "Rx" , dialogToken , (intent >> 1) , intent & 0x1 ? "+" : "-" , listen_ch , op_ch , ch_list_buf , + padapter->registrypriv.full_ch_in_p2p_handshake); + + if (!tx) { +#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) + if (rtw_mi_check_status(padapter, MI_LINKED) + && rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE + && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + RTW_INFO(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter)); + rtw_change_p2pie_ch_list(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr), 0); } - - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) - op_ch = *(cont+4); - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len))) - intent = *cont; - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len))) - status = *cont; - - if (nego_info->token == dialogToken && nego_info->state == 0 - && _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE - ) { - nego_info->status = (status==-1) ? 0xff : status; - nego_info->rsp_op_ch= op_ch; - nego_info->rsp_intent = intent; - nego_info->state = 1; - if (status != 0) - nego_info->token = 0; /* init */ - } - - dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); - DBG_871X("RTW_%s:P2P_GO_NEGO_RESP, dialogToken=%d, intent:%u%s, status:%d, op_ch:%d, ch_list:%s\n", - (tx==_TRUE)?"Tx":"Rx", dialogToken, (intent>>1), intent&0x1 ? "+" : "-", status, op_ch, ch_list_buf); - - if (!tx) { - pwdev_priv->provdisc_req_issued = _FALSE; - #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) - if(check_buddy_fwstate(padapter, _FW_LINKED) - && rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) - { - DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter)); - rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0); - } - #endif - } - - break; +#endif } - case P2P_GO_NEGO_CONF: - { - struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info; - bool is_go = _FALSE; - if (tx) { - #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) - if(check_buddy_fwstate(padapter, _FW_LINKED)) - rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); - #endif - } + break; + } + case P2P_GO_NEGO_RESP: { + struct rtw_wdev_nego_info *nego_info = &pwdev_priv->nego_info; - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) - op_ch = *(cont+4); - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len))) - status = *cont; + if (tx) { +#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr)); +#endif + } - if (nego_info->token == dialogToken && nego_info->state == 1 - && _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE - ) { - nego_info->status = (status==-1) ? 0xff : status; - nego_info->conf_op_ch = (op_ch==-1) ? 0 : op_ch; - nego_info->state = 2; - - if (status == 0) { - if (rtw_p2p_nego_intent_compare(nego_info->req_intent, nego_info->rsp_intent) ^ !tx) - is_go = _TRUE; - } + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len); + if (cont) + op_ch = *(cont + 4); + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len); + if (cont) + intent = *cont; + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); + if (cont) + status = *cont; + if (nego_info->token == dialogToken && nego_info->state == 0 + && _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE + ) { + nego_info->status = (status == -1) ? 0xff : status; + nego_info->rsp_op_ch = op_ch; + nego_info->rsp_intent = intent; + nego_info->state = 1; + if (status != 0) nego_info->token = 0; /* init */ - } - - dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); - DBG_871X("RTW_%s:P2P_GO_NEGO_CONF, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\n", - (tx==_TRUE)?"Tx":"Rx", dialogToken, status, op_ch, ch_list_buf); - - if (!tx) { - } - - break; } - case P2P_INVIT_REQ: - { - struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info; - int flags = -1; - if (tx) { - #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) - if(check_buddy_fwstate(padapter, _FW_LINKED)) - rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); - #endif + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + RTW_INFO("RTW_%s:P2P_GO_NEGO_RESP, dialogToken=%d, intent:%u%s, status:%d, op_ch:%d, ch_list:%s\n", + (tx == _TRUE) ? "Tx" : "Rx", dialogToken, (intent >> 1), intent & 0x1 ? "+" : "-", status, op_ch, ch_list_buf); + + if (!tx) { + pwdev_priv->provdisc_req_issued = _FALSE; +#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) + if (rtw_mi_check_status(padapter, MI_LINKED) + && rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE + && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + RTW_INFO(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter)); + rtw_change_p2pie_ch_list(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr), 0); + } +#endif + } + + break; + } + case P2P_GO_NEGO_CONF: { + struct rtw_wdev_nego_info *nego_info = &pwdev_priv->nego_info; + bool is_go = _FALSE; + + if (tx) { +#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr)); +#endif + } + + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len); + if (cont) + op_ch = *(cont + 4); + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); + if (cont) + status = *cont; + + if (nego_info->token == dialogToken && nego_info->state == 1 + && _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE + ) { + nego_info->status = (status == -1) ? 0xff : status; + nego_info->conf_op_ch = (op_ch == -1) ? 0 : op_ch; + nego_info->state = 2; + + if (status == 0) { + if (rtw_p2p_nego_intent_compare(nego_info->req_intent, nego_info->rsp_intent) ^ !tx) + is_go = _TRUE; } - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, NULL, &cont_len))) - flags = *cont; - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) - op_ch = *(cont+4); + nego_info->token = 0; /* init */ + } - if (invit_info->token != dialogToken) - rtw_wdev_invit_info_init(invit_info); + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + RTW_INFO("RTW_%s:P2P_GO_NEGO_CONF, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\n", + (tx == _TRUE) ? "Tx" : "Rx", dialogToken, status, op_ch, ch_list_buf); - _rtw_memcpy(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN); - invit_info->active = tx ? 1 : 0; - invit_info->token = dialogToken; - invit_info->flags = (flags==-1) ? 0x0 : flags; - invit_info->req_op_ch= op_ch; - invit_info->state = 0; + if (!tx) { + } - dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); - DBG_871X("RTW_%s:P2P_INVIT_REQ, dialogToken=%d, flags:0x%02x, op_ch:%d, ch_list:%s\n", - (tx==_TRUE)?"Tx":"Rx", dialogToken, flags, op_ch, ch_list_buf); + break; + } + case P2P_INVIT_REQ: { + struct rtw_wdev_invit_info *invit_info = &pwdev_priv->invit_info; + int flags = -1; - if (!tx) { - #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) - if(check_buddy_fwstate(padapter, _FW_LINKED)) { - if (op_ch != -1 && rtw_chk_p2pie_op_ch_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) { - DBG_871X(FUNC_ADPT_FMT" op_ch:%u has no intersect with buddy\n", FUNC_ADPT_ARG(padapter), op_ch); - rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0); - } else if (rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) { - DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter)); - rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0); - } + if (tx) { +#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) + if (rtw_mi_check_status(padapter, MI_LINKED) + && padapter->registrypriv.full_ch_in_p2p_handshake == 0) + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr)); +#endif + } + + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, NULL, &cont_len); + if (cont) + flags = *cont; + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len); + if (cont) + op_ch = *(cont + 4); + + if (invit_info->token != dialogToken) + rtw_wdev_invit_info_init(invit_info); + + _rtw_memcpy(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN); + invit_info->active = tx ? 1 : 0; + invit_info->token = dialogToken; + invit_info->flags = (flags == -1) ? 0x0 : flags; + invit_info->req_op_ch = op_ch; + invit_info->state = 0; + + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + RTW_INFO("RTW_%s:P2P_INVIT_REQ, dialogToken=%d, flags:0x%02x, op_ch:%d, ch_list:%s\n", + (tx == _TRUE) ? "Tx" : "Rx", dialogToken, flags, op_ch, ch_list_buf); + + if (!tx) { +#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) { + if (op_ch != -1 && rtw_chk_p2pie_op_ch_with_buddy(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) { + RTW_INFO(FUNC_ADPT_FMT" op_ch:%u has no intersect with buddy\n", FUNC_ADPT_ARG(padapter), op_ch); + rtw_change_p2pie_ch_list(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr), 0); + } else if (rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) { + RTW_INFO(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter)); + rtw_change_p2pie_ch_list(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr), 0); } - #endif } - - break; +#endif } - case P2P_INVIT_RESP: - { - struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info; - if (tx) { - #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) - if(check_buddy_fwstate(padapter, _FW_LINKED)) - rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); - #endif - } + break; + } + case P2P_INVIT_RESP: { + struct rtw_wdev_invit_info *invit_info = &pwdev_priv->invit_info; - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len))) - { + if (tx) { +#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT) + if (rtw_mi_check_status(padapter, MI_LINKED) && padapter->registrypriv.full_ch_in_p2p_handshake == 0) + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len - sizeof(struct rtw_ieee80211_hdr_3addr)); +#endif + } + + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); + if (cont) { #ifdef CONFIG_P2P_INVITE_IOT - if(tx && *cont==7) - { - DBG_871X("TX_P2P_INVITE_RESP, status is no common channel, change to unknown group\n"); - *cont = 8; //unknow group status - } -#endif //CONFIG_P2P_INVITE_IOT - status = *cont; - } - if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) - op_ch = *(cont+4); - - if (invit_info->token == dialogToken && invit_info->state == 0 - && _rtw_memcmp(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE - ) { - invit_info->status = (status==-1) ? 0xff : status; - invit_info->rsp_op_ch= op_ch; - invit_info->state = 1; - invit_info->token = 0; /* init */ + if (tx && *cont == 7) { + RTW_INFO("TX_P2P_INVITE_RESP, status is no common channel, change to unknown group\n"); + *cont = 8; /* unknow group status */ } - - dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); - DBG_871X("RTW_%s:P2P_INVIT_RESP, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\n", - (tx==_TRUE)?"Tx":"Rx", dialogToken, status, op_ch, ch_list_buf); - - if (!tx) { - } - - break; +#endif /* CONFIG_P2P_INVITE_IOT */ + status = *cont; } - case P2P_DEVDISC_REQ: - DBG_871X("RTW_%s:P2P_DEVDISC_REQ, dialogToken=%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken); - break; - case P2P_DEVDISC_RESP: - cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); - DBG_871X("RTW_%s:P2P_DEVDISC_RESP, dialogToken=%d, status:%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken, cont?*cont:-1); - break; - case P2P_PROVISION_DISC_REQ: + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len); + if (cont) + op_ch = *(cont + 4); + + if (invit_info->token == dialogToken && invit_info->state == 0 + && _rtw_memcmp(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE + ) { + invit_info->status = (status == -1) ? 0xff : status; + invit_info->rsp_op_ch = op_ch; + invit_info->state = 1; + invit_info->token = 0; /* init */ + } + + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + RTW_INFO("RTW_%s:P2P_INVIT_RESP, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\n", + (tx == _TRUE) ? "Tx" : "Rx", dialogToken, status, op_ch, ch_list_buf); + + if (!tx) { + } + + break; + } + case P2P_DEVDISC_REQ: + RTW_INFO("RTW_%s:P2P_DEVDISC_REQ, dialogToken=%d\n", (tx == _TRUE) ? "Tx" : "Rx", dialogToken); + break; + case P2P_DEVDISC_RESP: + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); + RTW_INFO("RTW_%s:P2P_DEVDISC_RESP, dialogToken=%d, status:%d\n", (tx == _TRUE) ? "Tx" : "Rx", dialogToken, cont ? *cont : -1); + break; + case P2P_PROVISION_DISC_REQ: { + size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr); + u8 *p2p_ie; + uint p2p_ielen = 0; + uint contentlen = 0; + + RTW_INFO("RTW_%s:P2P_PROVISION_DISC_REQ, dialogToken=%d\n", (tx == _TRUE) ? "Tx" : "Rx", dialogToken); + + /* if(tx) */ { - size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr); - u8 *p2p_ie; - uint p2p_ielen = 0; - uint contentlen = 0; - - DBG_871X("RTW_%s:P2P_PROVISION_DISC_REQ, dialogToken=%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken); + pwdev_priv->provdisc_req_issued = _FALSE; - //if(tx) - { - pwdev_priv->provdisc_req_issued = _FALSE; - - if( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen))) - { + p2p_ie = rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen); + if (p2p_ie) { - if(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, NULL, &contentlen)) - { - pwdev_priv->provdisc_req_issued = _FALSE;//case: p2p_client join p2p GO - } - else - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("provdisc_req_issued is _TRUE\n"); - #endif //CONFIG_DEBUG_CFG80211 - pwdev_priv->provdisc_req_issued = _TRUE;//case: p2p_devices connection before Nego req. - } - - } - } - } - break; - case P2P_PROVISION_DISC_RESP: - DBG_871X("RTW_%s:P2P_PROVISION_DISC_RESP, dialogToken=%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken); - break; - default: - DBG_871X("RTW_%s:OUI_Subtype=%d, dialogToken=%d\n", (tx==_TRUE)?"Tx":"Rx", OUI_Subtype, dialogToken); - break; + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, NULL, &contentlen)) { + pwdev_priv->provdisc_req_issued = _FALSE;/* case: p2p_client join p2p GO */ + } else { +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("provdisc_req_issued is _TRUE\n"); +#endif /*CONFIG_DEBUG_CFG80211*/ + pwdev_priv->provdisc_req_issued = _TRUE;/* case: p2p_devices connection before Nego req. */ + } + + } + } + } + break; + case P2P_PROVISION_DISC_RESP: + RTW_INFO("RTW_%s:P2P_PROVISION_DISC_RESP, dialogToken=%d\n", (tx == _TRUE) ? "Tx" : "Rx", dialogToken); + break; + default: + RTW_INFO("RTW_%s:OUI_Subtype=%d, dialogToken=%d\n", (tx == _TRUE) ? "Tx" : "Rx", OUI_Subtype, dialogToken); + break; } } - - } - else if(category == RTW_WLAN_CATEGORY_P2P) - { + + } else if (category == RTW_WLAN_CATEGORY_P2P) { OUI_Subtype = frame_body[5]; dialogToken = frame_body[6]; - #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n", - cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ), OUI_Subtype, dialogToken); - #endif +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n", + cpu_to_be32(*((u32 *)(frame_body + 1))), OUI_Subtype, dialogToken); +#endif is_p2p_frame = OUI_Subtype; - switch(OUI_Subtype) - { - case P2P_NOTICE_OF_ABSENCE: - DBG_871X("RTW_%s:P2P_NOTICE_OF_ABSENCE, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", dialogToken); - break; - case P2P_PRESENCE_REQUEST: - DBG_871X("RTW_%s:P2P_PRESENCE_REQUEST, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", dialogToken); - break; - case P2P_PRESENCE_RESPONSE: - DBG_871X("RTW_%s:P2P_PRESENCE_RESPONSE, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", dialogToken); - break; - case P2P_GO_DISC_REQUEST: - DBG_871X("RTW_%s:P2P_GO_DISC_REQUEST, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", dialogToken); - break; - default: - DBG_871X("RTW_%s:OUI_Subtype=%d, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", OUI_Subtype, dialogToken); - break; - } + switch (OUI_Subtype) { + case P2P_NOTICE_OF_ABSENCE: + RTW_INFO("RTW_%s:P2P_NOTICE_OF_ABSENCE, dialogToken=%d\n", (tx == _TRUE) ? "TX" : "RX", dialogToken); + break; + case P2P_PRESENCE_REQUEST: + RTW_INFO("RTW_%s:P2P_PRESENCE_REQUEST, dialogToken=%d\n", (tx == _TRUE) ? "TX" : "RX", dialogToken); + break; + case P2P_PRESENCE_RESPONSE: + RTW_INFO("RTW_%s:P2P_PRESENCE_RESPONSE, dialogToken=%d\n", (tx == _TRUE) ? "TX" : "RX", dialogToken); + break; + case P2P_GO_DISC_REQUEST: + RTW_INFO("RTW_%s:P2P_GO_DISC_REQUEST, dialogToken=%d\n", (tx == _TRUE) ? "TX" : "RX", dialogToken); + break; + default: + RTW_INFO("RTW_%s:OUI_Subtype=%d, dialogToken=%d\n", (tx == _TRUE) ? "TX" : "RX", OUI_Subtype, dialogToken); + break; + } - } - else - { - DBG_871X("RTW_%s:action frame category=%d\n", (tx==_TRUE)?"TX":"RX", category); - } + } else + RTW_INFO("RTW_%s:action frame category=%d\n", (tx == _TRUE) ? "TX" : "RX", category); return is_p2p_frame; } -void rtw_init_cfg80211_wifidirect_info( _adapter* padapter) +void rtw_init_cfg80211_wifidirect_info(_adapter *padapter) { struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - _rtw_memset(pcfg80211_wdinfo, 0x00, sizeof(struct cfg80211_wifidirect_info) ); - - _init_timer( &pcfg80211_wdinfo->remain_on_ch_timer, padapter->pnetdev, ro_ch_timer_process, padapter ); + _rtw_memset(pcfg80211_wdinfo, 0x00, sizeof(struct cfg80211_wifidirect_info)); + + _init_timer(&pcfg80211_wdinfo->remain_on_ch_timer, padapter->pnetdev, ro_ch_timer_process, padapter); } -#endif //CONFIG_IOCTL_CFG80211 +#endif /* CONFIG_IOCTL_CFG80211 */ void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType) { - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - -_func_enter_; + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - switch(intCmdType) - { - case P2P_FIND_PHASE_WK: - { - find_phase_handler( padapter ); - break; - } - case P2P_RESTORE_STATE_WK: - { - restore_p2p_state_handler( padapter ); - break; - } - case P2P_PRE_TX_PROVDISC_PROCESS_WK: - { + + switch (intCmdType) { + case P2P_FIND_PHASE_WK: { + find_phase_handler(padapter); + break; + } + case P2P_RESTORE_STATE_WK: { + restore_p2p_state_handler(padapter); + break; + } + case P2P_PRE_TX_PROVDISC_PROCESS_WK: { #ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - p2p_concurrent_handler( padapter ); - } - else - { - pre_tx_provdisc_handler( padapter ); - } + if (rtw_mi_check_status(padapter, MI_LINKED)) + p2p_concurrent_handler(padapter); + else + pre_tx_provdisc_handler(padapter); #else - pre_tx_provdisc_handler( padapter ); + pre_tx_provdisc_handler(padapter); #endif - break; - } - case P2P_PRE_TX_INVITEREQ_PROCESS_WK: - { + break; + } + case P2P_PRE_TX_INVITEREQ_PROCESS_WK: { #ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - p2p_concurrent_handler( padapter ); - } - else - { - pre_tx_invitereq_handler( padapter ); - } -#else - pre_tx_invitereq_handler( padapter ); + if (rtw_mi_check_status(padapter, MI_LINKED)) + p2p_concurrent_handler(padapter); + else + pre_tx_invitereq_handler(padapter); +#else + pre_tx_invitereq_handler(padapter); #endif - break; - } - case P2P_PRE_TX_NEGOREQ_PROCESS_WK: - { + break; + } + case P2P_PRE_TX_NEGOREQ_PROCESS_WK: { #ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - p2p_concurrent_handler( padapter ); - } - else - { - pre_tx_negoreq_handler( padapter ); - } -#else - pre_tx_negoreq_handler( padapter ); + if (rtw_mi_check_status(padapter, MI_LINKED)) + p2p_concurrent_handler(padapter); + else + pre_tx_negoreq_handler(padapter); +#else + pre_tx_negoreq_handler(padapter); #endif - break; - } + break; + } #ifdef CONFIG_P2P #ifdef CONFIG_CONCURRENT_MODE - case P2P_AP_P2P_CH_SWITCH_PROCESS_WK: - { - p2p_concurrent_handler( padapter ); - break; - } + case P2P_AP_P2P_CH_SWITCH_PROCESS_WK: { + p2p_concurrent_handler(padapter); + break; + } #endif #endif #ifdef CONFIG_IOCTL_CFG80211 - case P2P_RO_CH_WK: - { - ro_ch_handler( padapter ); - break; - } -#endif //CONFIG_IOCTL_CFG80211 + case P2P_RO_CH_WK: { + ro_ch_handler(padapter); + break; + } +#endif /* CONFIG_IOCTL_CFG80211 */ } - -_func_exit_; + } int process_p2p_cross_connect_ie(PADAPTER padapter, u8 *IEs, u32 IELength) { int ret = _TRUE; - u8 * ies; + u8 *ies; u32 ies_len; - u8 * p2p_ie; + u8 *p2p_ie; u32 p2p_ielen = 0; - u8 p2p_attr[MAX_P2P_IE_LEN] = { 0x00 };// NoA length should be n*(13) + 2 + 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 ); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); -_func_enter_; - if(IELength <= _BEACON_IE_OFFSET_) + 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; - } + 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); + /* 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) { - u8 * ies; + u8 *ies; u32 ies_len; - u8 * p2p_ie; + u8 *p2p_ie; u32 p2p_ielen = 0; - u8 noa_attr[MAX_P2P_IE_LEN] = { 0x00 };// NoA length should be n*(13) + 2 + u8 noa_attr[MAX_P2P_IE_LEN] = { 0x00 };/* NoA length should be n*(13) + 2 */ u32 attr_contentlen = 0; - - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); u8 find_p2p = _FALSE, find_p2p_ps = _FALSE; u8 noa_offset, noa_num, noa_index; -_func_enter_; - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) return; - } #ifdef CONFIG_CONCURRENT_MODE - if(padapter->iface_type != IFACE_PORT0) + if (padapter->hw_port != HW_PORT0) return; #endif - if(IELength <= _BEACON_IE_OFFSET_) + if (IELength <= _BEACON_IE_OFFSET_) return; - + 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) - { + p2p_ie = rtw_get_p2p_ie(ies, ies_len, NULL, &p2p_ielen); + + while (p2p_ie) { find_p2p = _TRUE; - // Get Notice of Absence IE. - if(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen)) - { + /* Get Notice of Absence IE. */ + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen)) { find_p2p_ps = _TRUE; noa_index = noa_attr[0]; - if( (pwdinfo->p2p_ps_mode == P2P_PS_NONE) || - (noa_index != pwdinfo->noa_index) )// if index change, driver should reconfigure related setting. - { + if ((pwdinfo->p2p_ps_mode == P2P_PS_NONE) || + (noa_index != pwdinfo->noa_index)) { /* if index change, driver should reconfigure related setting. */ pwdinfo->noa_index = noa_index; pwdinfo->opp_ps = noa_attr[1] >> 7; pwdinfo->ctwindow = noa_attr[1] & 0x7F; noa_offset = 2; noa_num = 0; - // NoA length should be n*(13) + 2 - if(attr_contentlen > 2) - { - while(noa_offset < attr_contentlen) - { - //_rtw_memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1); + /* NoA length should be n*(13) + 2 */ + if (attr_contentlen > 2) { + while (noa_offset < attr_contentlen) { + /* _rtw_memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1); */ pwdinfo->noa_count[noa_num] = noa_attr[noa_offset]; noa_offset += 1; @@ -4621,136 +4297,122 @@ _func_enter_; } pwdinfo->noa_num = noa_num; - if( pwdinfo->opp_ps == 1 ) - { + if (pwdinfo->opp_ps == 1) { pwdinfo->p2p_ps_mode = P2P_PS_CTWINDOW; - // driver should wait LPS for entering CTWindow - if(adapter_to_pwrctl(padapter)->bFwCurrentInPSMode == _TRUE) - { + /* driver should wait LPS for entering CTWindow */ + if (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode == _TRUE) p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); - } - } - else if( pwdinfo->noa_num > 0 ) - { + } else if (pwdinfo->noa_num > 0) { pwdinfo->p2p_ps_mode = P2P_PS_NOA; p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); - } - else if( pwdinfo->p2p_ps_mode > P2P_PS_NONE) - { + } else if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); - } } - break; // find target, just break. + break; /* find target, just 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); + /* 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); } - if(find_p2p == _TRUE) - { - if( (pwdinfo->p2p_ps_mode > P2P_PS_NONE) && (find_p2p_ps == _FALSE) ) - { + if (find_p2p == _TRUE) { + if ((pwdinfo->p2p_ps_mode > P2P_PS_NONE) && (find_p2p_ps == _FALSE)) p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); - } } -_func_exit_; } void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state) { struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - -_func_enter_; + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - // Pre action for p2p state - switch(p2p_ps_state) - { - case P2P_PS_DISABLE: + + /* Pre action for p2p state */ + switch (p2p_ps_state) { + case P2P_PS_DISABLE: + pwdinfo->p2p_ps_state = p2p_ps_state; + + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); + + pwdinfo->noa_index = 0; + pwdinfo->ctwindow = 0; + pwdinfo->opp_ps = 0; + pwdinfo->noa_num = 0; + pwdinfo->p2p_ps_mode = P2P_PS_NONE; + if (pwrpriv->bFwCurrentInPSMode == _TRUE) { + if (pwrpriv->smart_ps == 0) { + pwrpriv->smart_ps = 2; + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(pwrpriv->pwr_mode))); + } + } + break; + case P2P_PS_ENABLE: + if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) { +#ifdef CONFIG_MCC_MODE + if (MCC_EN(padapter)) { + if (rtw_hal_check_mcc_status(padapter, MCC_STATUS_DOING_MCC)) { + RTW_INFO("P2P PS enble under MCC\n"); + rtw_warn_on(1); + } + + } +#endif /* CONFIG_MCC_MODE */ pwdinfo->p2p_ps_state = p2p_ps_state; - - rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); - pwdinfo->noa_index = 0; - pwdinfo->ctwindow = 0; - pwdinfo->opp_ps = 0; - pwdinfo->noa_num = 0; - pwdinfo->p2p_ps_mode = P2P_PS_NONE; - if(pwrpriv->bFwCurrentInPSMode == _TRUE) - { - if(pwrpriv->smart_ps == 0) - { - pwrpriv->smart_ps = 2; + if (pwdinfo->ctwindow > 0) { + if (pwrpriv->smart_ps != 0) { + pwrpriv->smart_ps = 0; + RTW_INFO("%s(): Enter CTW, change SmartPS\n", __FUNCTION__); rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(pwrpriv->pwr_mode))); } } - break; - case P2P_PS_ENABLE: - if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) { - pwdinfo->p2p_ps_state = p2p_ps_state; - - if( pwdinfo->ctwindow > 0 ) - { - if(pwrpriv->smart_ps != 0) - { - pwrpriv->smart_ps = 0; - DBG_871X("%s(): Enter CTW, change SmartPS\n", __FUNCTION__); - rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(pwrpriv->pwr_mode))); - } - } - rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); - } - break; - case P2P_PS_SCAN: - case P2P_PS_SCAN_DONE: - case P2P_PS_ALLSTASLEEP: - if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) { - pwdinfo->p2p_ps_state = p2p_ps_state; - rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); - } - break; - default: - break; + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); + } + break; + case P2P_PS_SCAN: + case P2P_PS_SCAN_DONE: + case P2P_PS_ALLSTASLEEP: + if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) { + pwdinfo->p2p_ps_state = p2p_ps_state; + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); + } + break; + default: + break; } -_func_exit_; } -u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue) +u8 p2p_ps_wk_cmd(_adapter *padapter, u8 p2p_ps_state, u8 enqueue) { struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - -_func_enter_; - if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) #ifdef CONFIG_CONCURRENT_MODE - || (padapter->iface_type != IFACE_PORT0) + || (padapter->hw_port != HW_PORT0) #endif - ) - { + ) return res; - } - if(enqueue) - { - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; + if (enqueue) { + 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){ + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (pdrvextra_cmd_parm == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; + res = _FAIL; goto exit; } @@ -4762,327 +4424,475 @@ _func_enter_; init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); res = rtw_enqueue_cmd(pcmdpriv, ph2c); - } - else - { + } else p2p_ps_wk_hdl(padapter, p2p_ps_state); - } - + exit: - -_func_exit_; + return res; } -#endif // CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ -static void reset_ch_sitesurvey_timer_process (void *FunctionContext) +static void reset_ch_sitesurvey_timer_process(void *FunctionContext) { _adapter *adapter = (_adapter *)FunctionContext; struct wifidirect_info *pwdinfo = &adapter->wdinfo; - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) return; - DBG_871X( "[%s] In\n", __FUNCTION__ ); - // Reset the operation channel information + RTW_INFO("[%s] In\n", __FUNCTION__); + /* Reset the operation channel information */ pwdinfo->rx_invitereq_info.operation_ch[0] = 0; #ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH pwdinfo->rx_invitereq_info.operation_ch[1] = 0; pwdinfo->rx_invitereq_info.operation_ch[2] = 0; pwdinfo->rx_invitereq_info.operation_ch[3] = 0; -#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH +#endif /* CONFIG_P2P_OP_CHK_SOCIAL_CH */ pwdinfo->rx_invitereq_info.scan_op_ch_only = 0; } -static void reset_ch_sitesurvey_timer_process2 (void *FunctionContext) +static void reset_ch_sitesurvey_timer_process2(void *FunctionContext) { _adapter *adapter = (_adapter *)FunctionContext; struct wifidirect_info *pwdinfo = &adapter->wdinfo; - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) return; - DBG_871X( "[%s] In\n", __FUNCTION__ ); - // Reset the operation channel information + RTW_INFO("[%s] In\n", __FUNCTION__); + /* Reset the operation channel information */ pwdinfo->p2p_info.operation_ch[0] = 0; #ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH pwdinfo->p2p_info.operation_ch[1] = 0; pwdinfo->p2p_info.operation_ch[2] = 0; pwdinfo->p2p_info.operation_ch[3] = 0; -#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH +#endif /* CONFIG_P2P_OP_CHK_SOCIAL_CH */ pwdinfo->p2p_info.scan_op_ch_only = 0; } -static void restore_p2p_state_timer_process (void *FunctionContext) +static void restore_p2p_state_timer_process(void *FunctionContext) { _adapter *adapter = (_adapter *)FunctionContext; struct wifidirect_info *pwdinfo = &adapter->wdinfo; - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - return; - - p2p_protocol_wk_cmd( adapter, P2P_RESTORE_STATE_WK ); + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + return; + + p2p_protocol_wk_cmd(adapter, P2P_RESTORE_STATE_WK); } -static void pre_tx_scan_timer_process (void *FunctionContext) +static void pre_tx_scan_timer_process(void *FunctionContext) { - _adapter *adapter = (_adapter *) FunctionContext; + _adapter *adapter = (_adapter *) FunctionContext; struct wifidirect_info *pwdinfo = &adapter->wdinfo; _irqL irqL; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; u8 _status = 0; - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) return; - + _enter_critical_bh(&pmlmepriv->lock, &irqL); - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) - { - if ( _TRUE == pwdinfo->tx_prov_disc_info.benable ) // the provision discovery request frame is trigger to send or not - { - p2p_protocol_wk_cmd( adapter, P2P_PRE_TX_PROVDISC_PROCESS_WK ); - //issue_probereq_p2p(adapter, NULL); - //_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) { + if (_TRUE == pwdinfo->tx_prov_disc_info.benable) { /* the provision discovery request frame is trigger to send or not */ + p2p_protocol_wk_cmd(adapter, P2P_PRE_TX_PROVDISC_PROCESS_WK); + /* issue_probereq_p2p(adapter, NULL); */ + /* _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); */ } - } - else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) - { - if ( _TRUE == pwdinfo->nego_req_info.benable ) - { - p2p_protocol_wk_cmd( adapter, P2P_PRE_TX_NEGOREQ_PROCESS_WK ); - } - } - else if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) ) - { - if ( _TRUE == pwdinfo->invitereq_info.benable ) - { - p2p_protocol_wk_cmd( adapter, P2P_PRE_TX_INVITEREQ_PROCESS_WK ); - } - } - else - { - DBG_8192C( "[%s] p2p_state is %d, ignore!!\n", __FUNCTION__, rtw_p2p_state(pwdinfo) ); - } - + } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) { + if (_TRUE == pwdinfo->nego_req_info.benable) + p2p_protocol_wk_cmd(adapter, P2P_PRE_TX_NEGOREQ_PROCESS_WK); + } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ)) { + if (_TRUE == pwdinfo->invitereq_info.benable) + p2p_protocol_wk_cmd(adapter, P2P_PRE_TX_INVITEREQ_PROCESS_WK); + } else + RTW_INFO("[%s] p2p_state is %d, ignore!!\n", __FUNCTION__, rtw_p2p_state(pwdinfo)); + _exit_critical_bh(&pmlmepriv->lock, &irqL); } -static void find_phase_timer_process (void *FunctionContext) +static void find_phase_timer_process(void *FunctionContext) { _adapter *adapter = (_adapter *)FunctionContext; struct wifidirect_info *pwdinfo = &adapter->wdinfo; - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) return; adapter->wdinfo.find_phase_state_exchange_cnt++; - p2p_protocol_wk_cmd( adapter, P2P_FIND_PHASE_WK ); + p2p_protocol_wk_cmd(adapter, P2P_FIND_PHASE_WK); } #ifdef CONFIG_CONCURRENT_MODE -void ap_p2p_switch_timer_process (void *FunctionContext) +void ap_p2p_switch_timer_process(void *FunctionContext) { _adapter *adapter = (_adapter *)FunctionContext; struct wifidirect_info *pwdinfo = &adapter->wdinfo; -#ifdef CONFIG_IOCTL_CFG80211 +#ifdef CONFIG_IOCTL_CFG80211 struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter); #endif - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) return; #ifdef CONFIG_IOCTL_CFG80211 ATOMIC_SET(&pwdev_priv->switch_ch_to, 1); #endif - p2p_protocol_wk_cmd( adapter, P2P_AP_P2P_CH_SWITCH_PROCESS_WK ); + p2p_protocol_wk_cmd(adapter, P2P_AP_P2P_CH_SWITCH_PROCESS_WK); } #endif -void reset_global_wifidirect_info( _adapter* padapter ) +void reset_global_wifidirect_info(_adapter *padapter) { struct wifidirect_info *pwdinfo; pwdinfo = &padapter->wdinfo; pwdinfo->persistent_supported = 0; pwdinfo->session_available = _TRUE; - pwdinfo->wfd_tdls_enable = 0; + rtw_tdls_wfd_enable(padapter, 0); pwdinfo->wfd_tdls_weaksec = _TRUE; } #ifdef CONFIG_WFD -int rtw_init_wifi_display_info(_adapter* padapter) +int rtw_init_wifi_display_info(_adapter *padapter) { int res = _SUCCESS; struct wifi_display_info *pwfd_info = &padapter->wfd_info; - // Used in P2P and TDLS - pwfd_info->rtsp_ctrlport = 554; - pwfd_info->peer_rtsp_ctrlport = 0; // Reset to 0 + /* Used in P2P and TDLS */ + pwfd_info->init_rtsp_ctrlport = 554; +#ifdef CONFIG_IOCTL_CFG80211 + pwfd_info->rtsp_ctrlport = 0; +#else + pwfd_info->rtsp_ctrlport = pwfd_info->init_rtsp_ctrlport; /* set non-zero value for legacy wfd */ +#endif + pwfd_info->tdls_rtsp_ctrlport = 0; + pwfd_info->peer_rtsp_ctrlport = 0; /* Reset to 0 */ pwfd_info->wfd_enable = _FALSE; pwfd_info->wfd_device_type = WFD_DEVINFO_PSINK; pwfd_info->scan_result_type = SCAN_RESULT_P2P_ONLY; - // Used in P2P + /* Used in P2P */ pwfd_info->peer_session_avail = _TRUE; pwfd_info->wfd_pc = _FALSE; - // Used in TDLS - _rtw_memset( pwfd_info->ip_address, 0x00, 4 ); - _rtw_memset( pwfd_info->peer_ip_address, 0x00, 4 ); + /* Used in TDLS */ + _rtw_memset(pwfd_info->ip_address, 0x00, 4); + _rtw_memset(pwfd_info->peer_ip_address, 0x00, 4); return res; } -#endif //CONFIG_WFD -void rtw_init_wifidirect_timers(_adapter* padapter) +inline void rtw_wfd_enable(_adapter *adapter, bool on) +{ + struct wifi_display_info *wfdinfo = &adapter->wfd_info; + + if (on) { + wfdinfo->rtsp_ctrlport = wfdinfo->init_rtsp_ctrlport; + wfdinfo->wfd_enable = _TRUE; + + } else { + wfdinfo->wfd_enable = _FALSE; + wfdinfo->rtsp_ctrlport = 0; + } +} + +inline void rtw_wfd_set_ctrl_port(_adapter *adapter, u16 port) +{ + struct wifi_display_info *wfdinfo = &adapter->wfd_info; + + wfdinfo->init_rtsp_ctrlport = port; + if (wfdinfo->wfd_enable == _TRUE) + wfdinfo->rtsp_ctrlport = port; + if (adapter->wdinfo.wfd_tdls_enable == 1) + wfdinfo->tdls_rtsp_ctrlport = port; +} + +inline void rtw_tdls_wfd_enable(_adapter *adapter, bool on) +{ + struct wifi_display_info *wfdinfo = &adapter->wfd_info; + + if (on) { + wfdinfo->tdls_rtsp_ctrlport = wfdinfo->init_rtsp_ctrlport; + adapter->wdinfo.wfd_tdls_enable = 1; + + } else { + adapter->wdinfo.wfd_tdls_enable = 0; + wfdinfo->tdls_rtsp_ctrlport = 0; + } +} + +u32 rtw_append_beacon_wfd_ie(_adapter *adapter, u8 *pbuf) +{ + struct wifidirect_info *wdinfo = &adapter->wdinfo; + struct mlme_priv *mlme = &adapter->mlmepriv; + u8 build_ie_by_self = 0; + u32 len = 0; + + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + goto exit; + +#ifdef CONFIG_IOCTL_CFG80211 + if (_TRUE == wdinfo->wfd_info->wfd_enable) +#endif + build_ie_by_self = 1; + + if (build_ie_by_self) + len = build_beacon_wfd_ie(wdinfo, pbuf); +#ifdef CONFIG_IOCTL_CFG80211 + else if (mlme->wfd_beacon_ie && mlme->wfd_beacon_ie_len > 0) { + len = mlme->wfd_beacon_ie_len; + _rtw_memcpy(pbuf, mlme->wfd_beacon_ie, len); + } +#endif + +exit: + return len; +} + +u32 rtw_append_probe_req_wfd_ie(_adapter *adapter, u8 *pbuf) +{ + struct wifidirect_info *wdinfo = &adapter->wdinfo; + struct mlme_priv *mlme = &adapter->mlmepriv; + u8 build_ie_by_self = 0; + u32 len = 0; + + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + goto exit; + +#ifdef CONFIG_IOCTL_CFG80211 + if (_TRUE == wdinfo->wfd_info->wfd_enable) +#endif + build_ie_by_self = 1; + + if (build_ie_by_self) + len = build_probe_req_wfd_ie(wdinfo, pbuf); +#ifdef CONFIG_IOCTL_CFG80211 + else if (mlme->wfd_probe_req_ie && mlme->wfd_probe_req_ie_len > 0) { + len = mlme->wfd_probe_req_ie_len; + _rtw_memcpy(pbuf, mlme->wfd_probe_req_ie, len); + } +#endif + +exit: + return len; +} + +u32 rtw_append_probe_resp_wfd_ie(_adapter *adapter, u8 *pbuf) +{ + struct wifidirect_info *wdinfo = &adapter->wdinfo; + struct mlme_priv *mlme = &adapter->mlmepriv; + u8 build_ie_by_self = 0; + u32 len = 0; + + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + goto exit; + +#ifdef CONFIG_IOCTL_CFG80211 + if (_TRUE == wdinfo->wfd_info->wfd_enable) +#endif + build_ie_by_self = 1; + + if (build_ie_by_self) + len = build_probe_resp_wfd_ie(wdinfo, pbuf, 0); +#ifdef CONFIG_IOCTL_CFG80211 + else if (mlme->wfd_probe_resp_ie && mlme->wfd_probe_resp_ie_len > 0) { + len = mlme->wfd_probe_resp_ie_len; + _rtw_memcpy(pbuf, mlme->wfd_probe_resp_ie, len); + } +#endif + +exit: + return len; +} + +u32 rtw_append_assoc_req_wfd_ie(_adapter *adapter, u8 *pbuf) +{ + struct wifidirect_info *wdinfo = &adapter->wdinfo; + struct mlme_priv *mlme = &adapter->mlmepriv; + u8 build_ie_by_self = 0; + u32 len = 0; + + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + goto exit; + +#ifdef CONFIG_IOCTL_CFG80211 + if (_TRUE == wdinfo->wfd_info->wfd_enable) +#endif + build_ie_by_self = 1; + + if (build_ie_by_self) + len = build_assoc_req_wfd_ie(wdinfo, pbuf); +#ifdef CONFIG_IOCTL_CFG80211 + else if (mlme->wfd_assoc_req_ie && mlme->wfd_assoc_req_ie_len > 0) { + len = mlme->wfd_assoc_req_ie_len; + _rtw_memcpy(pbuf, mlme->wfd_assoc_req_ie, len); + } +#endif + +exit: + return len; +} + +u32 rtw_append_assoc_resp_wfd_ie(_adapter *adapter, u8 *pbuf) +{ + struct wifidirect_info *wdinfo = &adapter->wdinfo; + struct mlme_priv *mlme = &adapter->mlmepriv; + u8 build_ie_by_self = 0; + u32 len = 0; + + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + goto exit; + +#ifdef CONFIG_IOCTL_CFG80211 + if (_TRUE == wdinfo->wfd_info->wfd_enable) +#endif + build_ie_by_self = 1; + + if (build_ie_by_self) + len = build_assoc_resp_wfd_ie(wdinfo, pbuf); +#ifdef CONFIG_IOCTL_CFG80211 + else if (mlme->wfd_assoc_resp_ie && mlme->wfd_assoc_resp_ie_len > 0) { + len = mlme->wfd_assoc_resp_ie_len; + _rtw_memcpy(pbuf, mlme->wfd_assoc_resp_ie, len); + } +#endif + +exit: + return len; +} + +#endif /* CONFIG_WFD */ + +void rtw_init_wifidirect_timers(_adapter *padapter) { struct wifidirect_info *pwdinfo = &padapter->wdinfo; - _init_timer( &pwdinfo->find_phase_timer, padapter->pnetdev, find_phase_timer_process, padapter ); - _init_timer( &pwdinfo->restore_p2p_state_timer, padapter->pnetdev, restore_p2p_state_timer_process, padapter ); - _init_timer( &pwdinfo->pre_tx_scan_timer, padapter->pnetdev, pre_tx_scan_timer_process, padapter ); - _init_timer( &pwdinfo->reset_ch_sitesurvey, padapter->pnetdev, reset_ch_sitesurvey_timer_process, padapter ); - _init_timer( &pwdinfo->reset_ch_sitesurvey2, padapter->pnetdev, reset_ch_sitesurvey_timer_process2, padapter ); + _init_timer(&pwdinfo->find_phase_timer, padapter->pnetdev, find_phase_timer_process, padapter); + _init_timer(&pwdinfo->restore_p2p_state_timer, padapter->pnetdev, restore_p2p_state_timer_process, padapter); + _init_timer(&pwdinfo->pre_tx_scan_timer, padapter->pnetdev, pre_tx_scan_timer_process, padapter); + _init_timer(&pwdinfo->reset_ch_sitesurvey, padapter->pnetdev, reset_ch_sitesurvey_timer_process, padapter); + _init_timer(&pwdinfo->reset_ch_sitesurvey2, padapter->pnetdev, reset_ch_sitesurvey_timer_process2, padapter); #ifdef CONFIG_CONCURRENT_MODE - _init_timer( &pwdinfo->ap_p2p_switch_timer, padapter->pnetdev, ap_p2p_switch_timer_process, padapter ); + _init_timer(&pwdinfo->ap_p2p_switch_timer, padapter->pnetdev, ap_p2p_switch_timer_process, padapter); #endif } -void rtw_init_wifidirect_addrs(_adapter* padapter, u8 *dev_addr, u8 *iface_addr) +void rtw_init_wifidirect_addrs(_adapter *padapter, u8 *dev_addr, u8 *iface_addr) { #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &padapter->wdinfo; /*init device&interface address */ - if (dev_addr) { + if (dev_addr) _rtw_memcpy(pwdinfo->device_addr, dev_addr, ETH_ALEN); - } - if (iface_addr) { + if (iface_addr) _rtw_memcpy(pwdinfo->interface_addr, iface_addr, ETH_ALEN); - } #endif } -void init_wifidirect_info( _adapter* padapter, enum P2P_ROLE role) +void init_wifidirect_info(_adapter *padapter, enum P2P_ROLE role) { struct wifidirect_info *pwdinfo; #ifdef CONFIG_WFD struct wifi_display_info *pwfd_info = &padapter->wfd_info; #endif -#ifdef CONFIG_CONCURRENT_MODE - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct wifidirect_info *pbuddy_wdinfo = NULL; - struct mlme_priv *pbuddy_mlmepriv = NULL; - struct mlme_ext_priv *pbuddy_mlmeext = NULL; -#endif - + u8 union_ch = 0; pwdinfo = &padapter->wdinfo; pwdinfo->padapter = padapter; - - // 1, 6, 11 are the social channel defined in the WiFi Direct specification. + + /* 1, 6, 11 are the social channel defined in the WiFi Direct specification. */ pwdinfo->social_chan[0] = 1; pwdinfo->social_chan[1] = 6; pwdinfo->social_chan[2] = 11; - pwdinfo->social_chan[3] = 0; // channel 0 for scanning ending in site survey function. + pwdinfo->social_chan[3] = 0; /* channel 0 for scanning ending in site survey function. */ #ifdef CONFIG_CONCURRENT_MODE - if (pbuddy_adapter) { - pbuddy_wdinfo = &pbuddy_adapter->wdinfo; - pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv; - pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - } + if (rtw_mi_check_status(padapter, MI_LINKED)) + union_ch = rtw_mi_get_union_chan(padapter); - if ( ( check_buddy_fwstate(padapter, _FW_LINKED ) == _TRUE ) && - ( ( pbuddy_mlmeext->cur_channel == 1) || ( pbuddy_mlmeext->cur_channel == 6 ) || ( pbuddy_mlmeext->cur_channel == 11 ) ) - ) + if ((union_ch != 0) && + ((union_ch == 1) || (union_ch == 6) || (union_ch == 11)) + ) { + /* Use the AP's channel as the listen channel */ + /* This will avoid the channel switch between AP's channel and listen channel. */ + pwdinfo->listen_channel = union_ch; + } else +#endif /* CONFIG_CONCURRENT_MODE */ { - // Use the AP's channel as the listen channel - // This will avoid the channel switch between AP's channel and listen channel. - pwdinfo->listen_channel = pbuddy_mlmeext->cur_channel; - } - else -#endif //CONFIG_CONCURRENT_MODE - { - // Use the channel 11 as the listen channel + /* Use the channel 11 as the listen channel */ pwdinfo->listen_channel = 11; } - if (role == P2P_ROLE_DEVICE) - { + if (role == P2P_ROLE_DEVICE) { rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - #ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) == _TRUE ) - { +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_check_status(padapter, MI_LINKED)) rtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE); - } else - #endif - { +#endif rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - } + pwdinfo->intent = 1; rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_LISTEN); - } - else if (role == P2P_ROLE_CLIENT) - { + } else if (role == P2P_ROLE_CLIENT) { rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); pwdinfo->intent = 1; rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); - } - else if (role == P2P_ROLE_GO) - { + } else if (role == P2P_ROLE_GO) { rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); pwdinfo->intent = 15; rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK); } -// Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 ) - pwdinfo->support_rate[0] = 0x8c; // 6(B) - pwdinfo->support_rate[1] = 0x92; // 9(B) - pwdinfo->support_rate[2] = 0x18; // 12 - pwdinfo->support_rate[3] = 0x24; // 18 - pwdinfo->support_rate[4] = 0x30; // 24 - pwdinfo->support_rate[5] = 0x48; // 36 - pwdinfo->support_rate[6] = 0x60; // 48 - pwdinfo->support_rate[7] = 0x6c; // 54 + /* Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 ) */ + pwdinfo->support_rate[0] = 0x8c; /* 6(B) */ + pwdinfo->support_rate[1] = 0x92; /* 9(B) */ + pwdinfo->support_rate[2] = 0x18; /* 12 */ + pwdinfo->support_rate[3] = 0x24; /* 18 */ + pwdinfo->support_rate[4] = 0x30; /* 24 */ + pwdinfo->support_rate[5] = 0x48; /* 36 */ + pwdinfo->support_rate[6] = 0x60; /* 48 */ + pwdinfo->support_rate[7] = 0x6c; /* 54 */ - _rtw_memcpy( ( void* ) pwdinfo->p2p_wildcard_ssid, "DIRECT-", 7 ); + _rtw_memcpy((void *) pwdinfo->p2p_wildcard_ssid, "DIRECT-", 7); - _rtw_memset( pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN ); + _rtw_memset(pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN); pwdinfo->device_name_len = 0; - _rtw_memset( &pwdinfo->invitereq_info, 0x00, sizeof( struct tx_invite_req_info ) ); - pwdinfo->invitereq_info.token = 3; // Token used for P2P invitation request frame. - - _rtw_memset( &pwdinfo->inviteresp_info, 0x00, sizeof( struct tx_invite_resp_info ) ); + _rtw_memset(&pwdinfo->invitereq_info, 0x00, sizeof(struct tx_invite_req_info)); + pwdinfo->invitereq_info.token = 3; /* Token used for P2P invitation request frame. */ + + _rtw_memset(&pwdinfo->inviteresp_info, 0x00, sizeof(struct tx_invite_resp_info)); pwdinfo->inviteresp_info.token = 0; pwdinfo->profileindex = 0; - _rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM ); + _rtw_memset(&pwdinfo->profileinfo[0], 0x00, sizeof(struct profile_info) * P2P_MAX_PERSISTENT_GROUP_NUM); rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); - pwdinfo->listen_dwell = ( u8 ) (( rtw_get_current_time() % 3 ) + 1); - //DBG_8192C( "[%s] listen_dwell time is %d00ms\n", __FUNCTION__, pwdinfo->listen_dwell ); + pwdinfo->listen_dwell = (u8)((rtw_get_current_time() % 3) + 1); + /* RTW_INFO( "[%s] listen_dwell time is %d00ms\n", __FUNCTION__, pwdinfo->listen_dwell ); */ - _rtw_memset( &pwdinfo->tx_prov_disc_info, 0x00, sizeof( struct tx_provdisc_req_info ) ); + _rtw_memset(&pwdinfo->tx_prov_disc_info, 0x00, sizeof(struct tx_provdisc_req_info)); pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_NONE; - _rtw_memset( &pwdinfo->nego_req_info, 0x00, sizeof( struct tx_nego_req_info ) ); + _rtw_memset(&pwdinfo->nego_req_info, 0x00, sizeof(struct tx_nego_req_info)); pwdinfo->device_password_id_for_nego = WPS_DPID_PBC; pwdinfo->negotiation_dialog_token = 1; - _rtw_memset( pwdinfo->nego_ssid, 0x00, WLAN_SSID_MAXLEN ); + _rtw_memset(pwdinfo->nego_ssid, 0x00, WLAN_SSID_MAXLEN); pwdinfo->nego_ssidlen = 0; pwdinfo->ui_got_wps_info = P2P_NO_WPSINFO; @@ -5091,52 +4901,52 @@ void init_wifidirect_info( _adapter* padapter, enum P2P_ROLE role) pwdinfo->wfd_info = pwfd_info; #else pwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY | WPS_CONFIG_METHOD_PBC | WPS_CONFIG_METHOD_KEYPAD; -#endif //CONFIG_WFD +#endif /* CONFIG_WFD */ pwdinfo->channel_list_attr_len = 0; - _rtw_memset( pwdinfo->channel_list_attr, 0x00, 100 ); + _rtw_memset(pwdinfo->channel_list_attr, 0x00, 100); - _rtw_memset( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, 0x00, 4 ); - _rtw_memset( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, '0', 3 ); - _rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) ); + _rtw_memset(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, 0x00, 4); + _rtw_memset(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, '0', 3); + _rtw_memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info)); #ifdef CONFIG_CONCURRENT_MODE #ifdef CONFIG_IOCTL_CFG80211 - pwdinfo->ext_listen_interval = 1000; //The interval to be available with legacy AP during p2p0-find/scan - pwdinfo->ext_listen_period = 3000; //The time period to be available for P2P during nego -#else //!CONFIG_IOCTL_CFG80211 - //pwdinfo->ext_listen_interval = 3000; - //pwdinfo->ext_listen_period = 400; + pwdinfo->ext_listen_interval = 1000; /* The interval to be available with legacy AP during p2p0-find/scan */ + pwdinfo->ext_listen_period = 3000; /* The time period to be available for P2P during nego */ +#else /* !CONFIG_IOCTL_CFG80211 */ + /* pwdinfo->ext_listen_interval = 3000; */ + /* pwdinfo->ext_listen_period = 400; */ pwdinfo->ext_listen_interval = 1000; pwdinfo->ext_listen_period = 1000; -#endif //!CONFIG_IOCTL_CFG80211 +#endif /* !CONFIG_IOCTL_CFG80211 */ #endif -// Commented by Kurt 20130319 -// For WiDi purpose: Use CFG80211 interface but controled WFD/RDS frame by driver itself. + /* Commented by Kurt 20130319 + * For WiDi purpose: Use CFG80211 interface but controled WFD/RDS frame by driver itself. */ #ifdef CONFIG_IOCTL_CFG80211 pwdinfo->driver_interface = DRIVER_CFG80211; #else pwdinfo->driver_interface = DRIVER_WEXT; -#endif //CONFIG_IOCTL_CFG80211 +#endif /* CONFIG_IOCTL_CFG80211 */ pwdinfo->wfd_tdls_enable = 0; - _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); - _rtw_memset( pwdinfo->p2p_peer_device_addr, 0x00, ETH_ALEN ); + _rtw_memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN); + _rtw_memset(pwdinfo->p2p_peer_device_addr, 0x00, ETH_ALEN); pwdinfo->rx_invitereq_info.operation_ch[0] = 0; - pwdinfo->rx_invitereq_info.operation_ch[1] = 0; // Used to indicate the scan end in site survey function + pwdinfo->rx_invitereq_info.operation_ch[1] = 0; /* Used to indicate the scan end in site survey function */ #ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH pwdinfo->rx_invitereq_info.operation_ch[2] = 0; pwdinfo->rx_invitereq_info.operation_ch[3] = 0; pwdinfo->rx_invitereq_info.operation_ch[4] = 0; -#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH +#endif /* CONFIG_P2P_OP_CHK_SOCIAL_CH */ pwdinfo->rx_invitereq_info.scan_op_ch_only = 0; pwdinfo->p2p_info.operation_ch[0] = 0; - pwdinfo->p2p_info.operation_ch[1] = 0; // Used to indicate the scan end in site survey function + pwdinfo->p2p_info.operation_ch[1] = 0; /* Used to indicate the scan end in site survey function */ #ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH pwdinfo->p2p_info.operation_ch[2] = 0; pwdinfo->p2p_info.operation_ch[3] = 0; pwdinfo->p2p_info.operation_ch[4] = 0; -#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH +#endif /* CONFIG_P2P_OP_CHK_SOCIAL_CH */ pwdinfo->p2p_info.scan_op_ch_only = 0; } @@ -5147,7 +4957,7 @@ void init_wifidirect_info( _adapter* padapter, enum P2P_ROLE role) * @role: P2P role * Returns: The state name as a printable text string */ -const char * rtw_p2p_role_txt(enum P2P_ROLE role) +const char *rtw_p2p_role_txt(enum P2P_ROLE role) { switch (role) { case P2P_ROLE_DISABLE: @@ -5168,7 +4978,7 @@ const char * rtw_p2p_role_txt(enum P2P_ROLE role) * @state: P2P state * Returns: The state name as a printable text string */ -const char * rtw_p2p_state_txt(enum P2P_STATE state) +const char *rtw_p2p_state_txt(enum P2P_STATE state) { switch (state) { case P2P_STATE_NONE: @@ -5224,172 +5034,167 @@ const char * rtw_p2p_state_txt(enum P2P_STATE state) void dbg_rtw_p2p_set_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line) { - if(!_rtw_p2p_chk_state(wdinfo, state)) { + if (!_rtw_p2p_chk_state(wdinfo, state)) { enum P2P_STATE old_state = _rtw_p2p_state(wdinfo); _rtw_p2p_set_state(wdinfo, state); - DBG_871X("[CONFIG_DBG_P2P]%s:%d set_state from %s to %s\n", caller, line + RTW_INFO("[CONFIG_DBG_P2P]%s:%d set_state from %s to %s\n", caller, line , rtw_p2p_state_txt(old_state), rtw_p2p_state_txt(_rtw_p2p_state(wdinfo)) - ); + ); } else { - DBG_871X("[CONFIG_DBG_P2P]%s:%d set_state to same state %s\n", caller, line - , rtw_p2p_state_txt(_rtw_p2p_state(wdinfo)) - ); + RTW_INFO("[CONFIG_DBG_P2P]%s:%d set_state to same state %s\n", caller, line + , rtw_p2p_state_txt(_rtw_p2p_state(wdinfo)) + ); } } void dbg_rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line) { - if(_rtw_p2p_pre_state(wdinfo) != state) { - enum P2P_STATE old_state = _rtw_p2p_pre_state(wdinfo); + if (_rtw_p2p_pre_state(wdinfo) != state) { + enum P2P_STATE old_state = _rtw_p2p_pre_state(wdinfo); _rtw_p2p_set_pre_state(wdinfo, state); - DBG_871X("[CONFIG_DBG_P2P]%s:%d set_pre_state from %s to %s\n", caller, line + RTW_INFO("[CONFIG_DBG_P2P]%s:%d set_pre_state from %s to %s\n", caller, line , rtw_p2p_state_txt(old_state), rtw_p2p_state_txt(_rtw_p2p_pre_state(wdinfo)) - ); + ); } else { - DBG_871X("[CONFIG_DBG_P2P]%s:%d set_pre_state to same state %s\n", caller, line - , rtw_p2p_state_txt(_rtw_p2p_pre_state(wdinfo)) - ); + RTW_INFO("[CONFIG_DBG_P2P]%s:%d set_pre_state to same state %s\n", caller, line + , rtw_p2p_state_txt(_rtw_p2p_pre_state(wdinfo)) + ); } } #if 0 void dbg_rtw_p2p_restore_state(struct wifidirect_info *wdinfo, const char *caller, int line) { - if(wdinfo->pre_p2p_state != -1) { - DBG_871X("[CONFIG_DBG_P2P]%s:%d restore from %s to %s\n", caller, line + if (wdinfo->pre_p2p_state != -1) { + RTW_INFO("[CONFIG_DBG_P2P]%s:%d restore from %s to %s\n", caller, line , p2p_state_str[wdinfo->p2p_state], p2p_state_str[wdinfo->pre_p2p_state] - ); + ); _rtw_p2p_restore_state(wdinfo); } else { - DBG_871X("[CONFIG_DBG_P2P]%s:%d restore no pre state, cur state %s\n", caller, line - , p2p_state_str[wdinfo->p2p_state] - ); + RTW_INFO("[CONFIG_DBG_P2P]%s:%d restore no pre state, cur state %s\n", caller, line + , p2p_state_str[wdinfo->p2p_state] + ); } } #endif void dbg_rtw_p2p_set_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role, const char *caller, int line) { - if(wdinfo->role != role) { + if (wdinfo->role != role) { enum P2P_ROLE old_role = wdinfo->role; _rtw_p2p_set_role(wdinfo, role); - DBG_871X("[CONFIG_DBG_P2P]%s:%d set_role from %s to %s\n", caller, line + RTW_INFO("[CONFIG_DBG_P2P]%s:%d set_role from %s to %s\n", caller, line , rtw_p2p_role_txt(old_role), rtw_p2p_role_txt(wdinfo->role) - ); + ); } else { - DBG_871X("[CONFIG_DBG_P2P]%s:%d set_role to same role %s\n", caller, line - , rtw_p2p_role_txt(wdinfo->role) - ); + RTW_INFO("[CONFIG_DBG_P2P]%s:%d set_role to same role %s\n", caller, line + , rtw_p2p_role_txt(wdinfo->role) + ); } } -#endif //CONFIG_DBG_P2P +#endif /* CONFIG_DBG_P2P */ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role) { int ret = _SUCCESS; - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT|| role == P2P_ROLE_GO) - { + if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT || role == P2P_ROLE_GO) { u8 channel, ch_offset; u16 bwmode; #ifdef CONFIG_CONCURRENT_MODE - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo; - // Commented by Albert 2011/12/30 - // The driver just supports 1 P2P group operation. - // So, this function will do nothing if the buddy adapter had enabled the P2P function. - if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) - { - // The buddy adapter had enabled the P2P function. + /* Commented by Albert 2011/12/30 */ + /* The driver just supports 1 P2P group operation. */ + /* So, this function will do nothing if the buddy adapter had enabled the P2P function. */ + /*if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) + return ret;*/ + /*The buddy adapter had enabled the P2P function.*/ + if (rtw_mi_buddy_stay_in_p2p_mode(padapter)) return ret; - } -#endif //CONFIG_CONCURRENT_MODE +#endif /* CONFIG_CONCURRENT_MODE */ - //leave IPS/Autosuspend + /* leave IPS/Autosuspend */ if (_FAIL == rtw_pwr_wakeup(padapter)) { ret = _FAIL; goto exit; } - // Added by Albert 2011/03/22 - // In the P2P mode, the driver should not support the b mode. - // So, the Tx packet shouldn't use the CCK rate + /* Added by Albert 2011/03/22 */ + /* In the P2P mode, the driver should not support the b mode. */ + /* So, the Tx packet shouldn't use the CCK rate */ update_tx_basic_rate(padapter, WIRELESS_11AGN); - //Enable P2P function + /* Enable P2P function */ init_wifidirect_info(padapter, role); - - rtw_hal_set_odm_var(padapter,HAL_ODM_P2P_STATE,NULL,_TRUE); - #ifdef CONFIG_WFD - rtw_hal_set_odm_var(padapter,HAL_ODM_WIFI_DISPLAY_STATE,NULL,_TRUE); - #endif - - } - else if (role == P2P_ROLE_DISABLE) - { + + rtw_hal_set_odm_var(padapter, HAL_ODM_P2P_STATE, NULL, _TRUE); +#ifdef CONFIG_WFD + if (hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + rtw_hal_set_odm_var(padapter, HAL_ODM_WIFI_DISPLAY_STATE, NULL, _TRUE); +#endif + + } else if (role == P2P_ROLE_DISABLE) { #ifdef CONFIG_INTEL_WIDI - if( padapter->mlmepriv.p2p_reject_disable == _TRUE ) + if (padapter->mlmepriv.p2p_reject_disable == _TRUE) return ret; -#endif //CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ #ifdef CONFIG_IOCTL_CFG80211 - if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 ) + if (padapter->wdinfo.driver_interface == DRIVER_CFG80211) adapter_wdev_data(padapter)->p2p_enabled = _FALSE; -#endif //CONFIG_IOCTL_CFG80211 +#endif /* CONFIG_IOCTL_CFG80211 */ - //Disable P2P function - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey); - _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey2); - reset_ch_sitesurvey_timer_process( padapter ); - reset_ch_sitesurvey_timer_process2( padapter ); - #ifdef CONFIG_CONCURRENT_MODE - _cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer); - #endif + /* Disable P2P function */ + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { + _cancel_timer_ex(&pwdinfo->find_phase_timer); + _cancel_timer_ex(&pwdinfo->restore_p2p_state_timer); + _cancel_timer_ex(&pwdinfo->pre_tx_scan_timer); + _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey); + _cancel_timer_ex(&pwdinfo->reset_ch_sitesurvey2); + reset_ch_sitesurvey_timer_process(padapter); + reset_ch_sitesurvey_timer_process2(padapter); +#ifdef CONFIG_CONCURRENT_MODE + _cancel_timer_ex(&pwdinfo->ap_p2p_switch_timer); +#endif rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_NONE); rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE); _rtw_memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info)); /* Remove profiles in wifidirect_info structure. */ - _rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM ); + _rtw_memset(&pwdinfo->profileinfo[0], 0x00, sizeof(struct profile_info) * P2P_MAX_PERSISTENT_GROUP_NUM); pwdinfo->profileindex = 0; } - rtw_hal_set_odm_var(padapter,HAL_ODM_P2P_STATE,NULL,_FALSE); - #ifdef CONFIG_WFD - rtw_hal_set_odm_var(padapter,HAL_ODM_WIFI_DISPLAY_STATE,NULL,_FALSE); - #endif + rtw_hal_set_odm_var(padapter, HAL_ODM_P2P_STATE, NULL, _FALSE); +#ifdef CONFIG_WFD + if (hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + rtw_hal_set_odm_var(padapter, HAL_ODM_WIFI_DISPLAY_STATE, NULL, _FALSE); +#endif if (_FAIL == rtw_pwr_wakeup(padapter)) { ret = _FAIL; goto exit; } - //Restore to initial setting. + /* Restore to initial setting. */ update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); #ifdef CONFIG_INTEL_WIDI rtw_reset_widi_info(padapter); -#endif //CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ - //For WiDi purpose. + /* For WiDi purpose. */ #ifdef CONFIG_IOCTL_CFG80211 pwdinfo->driver_interface = DRIVER_CFG80211; #else pwdinfo->driver_interface = DRIVER_WEXT; -#endif //CONFIG_IOCTL_CFG80211 +#endif /* CONFIG_IOCTL_CFG80211 */ } - -exit: + +exit: return ret; } -#endif //CONFIG_P2P - +#endif /* CONFIG_P2P */ diff --git a/core/rtw_pwrctrl.c b/core/rtw_pwrctrl.c old mode 100755 new mode 100644 index 9dd0956..c510671 --- a/core/rtw_pwrctrl.c +++ b/core/rtw_pwrctrl.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -27,41 +27,40 @@ int rtw_fw_ps_state(PADAPTER padapter) { struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; - int ret=_FAIL, dont_care=0; - u16 fw_ps_state=0; + int ret = _FAIL, dont_care = 0; + u16 fw_ps_state = 0; u32 start_time; struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct registry_priv *registry_par = &padapter->registrypriv; - - if(registry_par->check_fw_ps != 1) + + if (registry_par->check_fw_ps != 1) return _SUCCESS; - + _enter_pwrlock(&pwrpriv->check_32k_lock); - + if (RTW_CANNOT_RUN(padapter)) { - DBG_871X("%s: bSurpriseRemoved=%s , hw_init_completed=%d, bDriverStopped=%s\n", __func__ - , rtw_is_surprise_removed(padapter)?"True":"False" - , rtw_get_hw_init_completed(padapter) - , rtw_is_drv_stopped(padapter)?"True":"False"); + RTW_INFO("%s: bSurpriseRemoved=%s , hw_init_completed=%d, bDriverStopped=%s\n", __func__ + , rtw_is_surprise_removed(padapter) ? "True" : "False" + , rtw_get_hw_init_completed(padapter) + , rtw_is_drv_stopped(padapter) ? "True" : "False"); goto exit_fw_ps_state; } rtw_hal_set_hwreg(padapter, HW_VAR_SET_REQ_FW_PS, (u8 *)&dont_care); { - //4. if 0x88[7]=1, driver set cmd to leave LPS/IPS. - //Else, hw will keep in active mode. - //debug info: - //0x88[7] = 32kpermission, - //0x88[6:0] = current_ps_state - //0x89[7:0] = last_rpwm + /* 4. if 0x88[7]=1, driver set cmd to leave LPS/IPS. */ + /* Else, hw will keep in active mode. */ + /* debug info: */ + /* 0x88[7] = 32kpermission, */ + /* 0x88[6:0] = current_ps_state */ + /* 0x89[7:0] = last_rpwm */ rtw_hal_get_hwreg(padapter, HW_VAR_FW_PS_STATE, (u8 *)&fw_ps_state); - - if((fw_ps_state & 0x80) == 0) - ret=_SUCCESS; - else - { + + if ((fw_ps_state & 0x80) == 0) + ret = _SUCCESS; + else { pdbgpriv->dbg_poll_fail_cnt++; - DBG_871X("%s: fw_ps_state=%04x \n", __FUNCTION__, fw_ps_state); + RTW_INFO("%s: fw_ps_state=%04x\n", __FUNCTION__, fw_ps_state); } } @@ -72,65 +71,63 @@ exit_fw_ps_state: } #ifdef CONFIG_IPS -void _ips_enter(_adapter * padapter) +void _ips_enter(_adapter *padapter) { struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - pwrpriv->bips_processing = _TRUE; + pwrpriv->bips_processing = _TRUE; - // syn ips_mode with request + /* syn ips_mode with request */ pwrpriv->ips_mode = pwrpriv->ips_mode_req; - - pwrpriv->ips_enter_cnts++; - DBG_871X("==>ips_enter cnts:%d\n",pwrpriv->ips_enter_cnts); - if(rf_off == pwrpriv->change_rfpwrstate ) - { + pwrpriv->ips_enter_cnts++; + RTW_INFO("==>ips_enter cnts:%d\n", pwrpriv->ips_enter_cnts); + + if (rf_off == pwrpriv->change_rfpwrstate) { pwrpriv->bpower_saving = _TRUE; - DBG_871X_LEVEL(_drv_always_, "nolinked power save enter\n"); + RTW_PRINT("nolinked power save enter\n"); - if(pwrpriv->ips_mode == IPS_LEVEL_2) + if (pwrpriv->ips_mode == IPS_LEVEL_2) pwrpriv->bkeepfwalive = _TRUE; - + rtw_ips_pwr_down(padapter); pwrpriv->rf_pwrstate = rf_off; - } - pwrpriv->bips_processing = _FALSE; - + } + pwrpriv->bips_processing = _FALSE; + } -void ips_enter(_adapter * padapter) +void ips_enter(_adapter *padapter) { struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); #ifdef CONFIG_BT_COEXIST rtw_btcoex_IpsNotify(padapter, pwrpriv->ips_mode_req); -#endif // CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ _enter_pwrlock(&pwrpriv->lock); _ips_enter(padapter); _exit_pwrlock(&pwrpriv->lock); } -int _ips_leave(_adapter * padapter) +int _ips_leave(_adapter *padapter) { struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); int result = _SUCCESS; - if((pwrpriv->rf_pwrstate == rf_off) &&(!pwrpriv->bips_processing)) - { + if ((pwrpriv->rf_pwrstate == rf_off) && (!pwrpriv->bips_processing)) { pwrpriv->bips_processing = _TRUE; pwrpriv->change_rfpwrstate = rf_on; pwrpriv->ips_leave_cnts++; - DBG_871X("==>ips_leave cnts:%d\n",pwrpriv->ips_leave_cnts); + RTW_INFO("==>ips_leave cnts:%d\n", pwrpriv->ips_leave_cnts); - if ((result = rtw_ips_pwr_up(padapter)) == _SUCCESS) { + result = rtw_ips_pwr_up(padapter); + if (result == _SUCCESS) pwrpriv->rf_pwrstate = rf_on; - } - DBG_871X_LEVEL(_drv_always_, "nolinked power save leave\n"); - - DBG_871X("==> ips_leave.....LED(0x%08x)...\n",rtw_read32(padapter,0x4c)); + RTW_PRINT("nolinked power save leave\n"); + + RTW_INFO("==> ips_leave.....LED(0x%08x)...\n", rtw_read32(padapter, 0x4c)); pwrpriv->bips_processing = _FALSE; pwrpriv->bkeepfwalive = _FALSE; @@ -140,25 +137,24 @@ int _ips_leave(_adapter * padapter) return result; } -int ips_leave(_adapter * padapter) +int ips_leave(_adapter *padapter) { struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; int ret; - if(!is_primary_adapter(padapter)) + if (!is_primary_adapter(padapter)) return _SUCCESS; _enter_pwrlock(&pwrpriv->lock); ret = _ips_leave(padapter); #ifdef DBG_CHECK_FW_PS_STATE - if(rtw_fw_ps_state(padapter) == _FAIL) - { - DBG_871X("ips leave doesn't leave 32k\n"); + if (rtw_fw_ps_state(padapter) == _FAIL) { + RTW_INFO("ips leave doesn't leave 32k\n"); pdbgpriv->dbg_leave_ips_fail_cnt++; } -#endif //DBG_CHECK_FW_PS_STATE +#endif /* DBG_CHECK_FW_PS_STATE */ _exit_pwrlock(&pwrpriv->lock); if (_SUCCESS == ret) @@ -167,86 +163,74 @@ int ips_leave(_adapter * padapter) #ifdef CONFIG_BT_COEXIST if (_SUCCESS == ret) rtw_btcoex_IpsNotify(padapter, IPS_NONE); -#endif // CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ return ret; } #endif /* CONFIG_IPS */ #ifdef CONFIG_AUTOSUSPEND -extern void autosuspend_enter(_adapter* padapter); -extern int autoresume_enter(_adapter* padapter); + extern void autosuspend_enter(_adapter *padapter); + extern int autoresume_enter(_adapter *padapter); #endif #ifdef SUPPORT_HW_RFOFF_DETECTED -int rtw_hw_suspend(_adapter *padapter ); -int rtw_hw_resume(_adapter *padapter); + int rtw_hw_suspend(_adapter *padapter); + int rtw_hw_resume(_adapter *padapter); #endif bool rtw_pwr_unassociated_idle(_adapter *adapter) { - _adapter *buddy = adapter->pbuddy_adapter; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + u8 i; + _adapter *iface; + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); struct xmit_priv *pxmit_priv = &adapter->xmitpriv; + struct mlme_priv *pmlmepriv; #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(adapter->wdinfo); + struct wifidirect_info *pwdinfo; #ifdef CONFIG_IOCTL_CFG80211 - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &adapter->cfg80211_wdinfo; + struct cfg80211_wifidirect_info *pcfg80211_wdinfo; #endif #endif bool ret = _FALSE; - if (adapter_to_pwrctl(adapter)->bpower_saving ==_TRUE ) { - //DBG_871X("%s: already in LPS or IPS mode\n", __func__); + if (adapter_to_pwrctl(adapter)->bpower_saving == _TRUE) { + /* RTW_INFO("%s: already in LPS or IPS mode\n", __func__); */ goto exit; } if (adapter_to_pwrctl(adapter)->ips_deny_time >= rtw_get_current_time()) { - //DBG_871X("%s ips_deny_time\n", __func__); + /* RTW_INFO("%s ips_deny_time\n", __func__); */ goto exit; } - if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) - || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) - || check_fwstate(pmlmepriv, WIFI_AP_STATE) - || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE) - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS) - || pcfg80211_wdinfo->is_ro_ch - #elif defined(CONFIG_P2P) - || !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) - #endif - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) - || rtw_get_passing_time_ms(pcfg80211_wdinfo->last_ro_ch_time) < 3000 - #endif - ) { - goto exit; - } + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + pmlmepriv = &(iface->mlmepriv); +#ifdef CONFIG_P2P + pwdinfo = &(iface->wdinfo); +#ifdef CONFIG_IOCTL_CFG80211 + pcfg80211_wdinfo = &iface->cfg80211_wdinfo; +#endif +#endif + if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE | WIFI_SITE_MONITOR) + || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING | WIFI_UNDER_WPS) + || check_fwstate(pmlmepriv, WIFI_AP_STATE) + || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE) +#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) + || pcfg80211_wdinfo->is_ro_ch +#elif defined(CONFIG_P2P) + || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) + || rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) +#endif +#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) + || rtw_get_passing_time_ms(pcfg80211_wdinfo->last_ro_ch_time) < 3000 +#endif + ) + goto exit; - /* consider buddy, if exist */ - if (buddy) { - struct mlme_priv *b_pmlmepriv = &(buddy->mlmepriv); - #ifdef CONFIG_P2P - struct wifidirect_info *b_pwdinfo = &(buddy->wdinfo); - #ifdef CONFIG_IOCTL_CFG80211 - struct cfg80211_wifidirect_info *b_pcfg80211_wdinfo = &buddy->cfg80211_wdinfo; - #endif - #endif - - if (check_fwstate(b_pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) - || check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) - || check_fwstate(b_pmlmepriv, WIFI_AP_STATE) - || check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE) - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS) - || b_pcfg80211_wdinfo->is_ro_ch - #elif defined(CONFIG_P2P) - || !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE) - #endif - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) - || rtw_get_passing_time_ms(b_pcfg80211_wdinfo->last_ro_ch_time) < 3000 - #endif - ) { - goto exit; } } @@ -256,16 +240,15 @@ bool rtw_pwr_unassociated_idle(_adapter *adapter) #endif #ifdef CONFIG_INTEL_PROXIM - if(adapter->proximity.proxim_on==_TRUE){ + if (adapter->proximity.proxim_on == _TRUE) return; - } #endif if (pxmit_priv->free_xmitbuf_cnt != NR_XMITBUFF || - pxmit_priv->free_xmit_extbuf_cnt != NR_XMIT_EXTBUFF) { - DBG_871X_LEVEL(_drv_always_, "There are some pkts to transmit\n"); - DBG_871X_LEVEL(_drv_always_, "free_xmitbuf_cnt: %d, free_xmit_extbuf_cnt: %d\n", - pxmit_priv->free_xmitbuf_cnt, pxmit_priv->free_xmit_extbuf_cnt); + pxmit_priv->free_xmit_extbuf_cnt != NR_XMIT_EXTBUFF) { + RTW_PRINT("There are some pkts to transmit\n"); + RTW_PRINT("free_xmitbuf_cnt: %d, free_xmit_extbuf_cnt: %d\n", + pxmit_priv->free_xmitbuf_cnt, pxmit_priv->free_xmit_extbuf_cnt); goto exit; } @@ -280,94 +263,83 @@ exit: * ATTENTION: * rtw_ps_processor() doesn't handle LPS. */ -void rtw_ps_processor(_adapter*padapter) +void rtw_ps_processor(_adapter *padapter) { #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); -#endif //CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif /* CONFIG_P2P */ struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; #ifdef SUPPORT_HW_RFOFF_DETECTED rt_rf_power_state rfpwrstate; -#endif //SUPPORT_HW_RFOFF_DETECTED +#endif /* SUPPORT_HW_RFOFF_DETECTED */ u32 ps_deny = 0; _enter_pwrlock(&adapter_to_pwrctl(padapter)->lock); ps_deny = rtw_ps_deny_get(padapter); _exit_pwrlock(&adapter_to_pwrctl(padapter)->lock); - if (ps_deny != 0) - { - DBG_871X(FUNC_ADPT_FMT ": ps_deny=0x%08X, skip power save!\n", - FUNC_ADPT_ARG(padapter), ps_deny); + if (ps_deny != 0) { + RTW_INFO(FUNC_ADPT_FMT ": ps_deny=0x%08X, skip power save!\n", + FUNC_ADPT_ARG(padapter), ps_deny); goto exit; } - if(pwrpriv->bInSuspend == _TRUE){//system suspend or autosuspend + if (pwrpriv->bInSuspend == _TRUE) { /* system suspend or autosuspend */ pdbgpriv->dbg_ps_insuspend_cnt++; - DBG_871X("%s, pwrpriv->bInSuspend == _TRUE ignore this process\n",__FUNCTION__); + RTW_INFO("%s, pwrpriv->bInSuspend == _TRUE ignore this process\n", __FUNCTION__); return; - } + } pwrpriv->ps_processing = _TRUE; #ifdef SUPPORT_HW_RFOFF_DETECTED - if(pwrpriv->bips_processing == _TRUE) + if (pwrpriv->bips_processing == _TRUE) goto exit; - - //DBG_871X("==> fw report state(0x%x)\n",rtw_read8(padapter,0x1ca)); - if(pwrpriv->bHWPwrPindetect) - { - #ifdef CONFIG_AUTOSUSPEND - if(padapter->registrypriv.usbss_enable) - { - if(pwrpriv->rf_pwrstate == rf_on) - { - if(padapter->net_closed == _TRUE) + + /* RTW_INFO("==> fw report state(0x%x)\n",rtw_read8(padapter,0x1ca)); */ + if (pwrpriv->bHWPwrPindetect) { +#ifdef CONFIG_AUTOSUSPEND + if (padapter->registrypriv.usbss_enable) { + if (pwrpriv->rf_pwrstate == rf_on) { + if (padapter->net_closed == _TRUE) pwrpriv->ps_flag = _TRUE; rfpwrstate = RfOnOffDetect(padapter); - DBG_871X("@@@@- #1 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off"); - if(rfpwrstate!= pwrpriv->rf_pwrstate) - { - if(rfpwrstate == rf_off) - { + RTW_INFO("@@@@- #1 %s==> rfstate:%s\n", __FUNCTION__, (rfpwrstate == rf_on) ? "rf_on" : "rf_off"); + if (rfpwrstate != pwrpriv->rf_pwrstate) { + if (rfpwrstate == rf_off) { pwrpriv->change_rfpwrstate = rf_off; - - pwrpriv->bkeepfwalive = _TRUE; - pwrpriv->brfoffbyhw = _TRUE; - - autosuspend_enter(padapter); + + pwrpriv->bkeepfwalive = _TRUE; + pwrpriv->brfoffbyhw = _TRUE; + + autosuspend_enter(padapter); } } - } - } - else - #endif //CONFIG_AUTOSUSPEND + } + } else +#endif /* CONFIG_AUTOSUSPEND */ { rfpwrstate = RfOnOffDetect(padapter); - DBG_871X("@@@@- #2 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off"); + RTW_INFO("@@@@- #2 %s==> rfstate:%s\n", __FUNCTION__, (rfpwrstate == rf_on) ? "rf_on" : "rf_off"); - if(rfpwrstate!= pwrpriv->rf_pwrstate) - { - if(rfpwrstate == rf_off) - { - pwrpriv->change_rfpwrstate = rf_off; + if (rfpwrstate != pwrpriv->rf_pwrstate) { + if (rfpwrstate == rf_off) { + pwrpriv->change_rfpwrstate = rf_off; pwrpriv->brfoffbyhw = _TRUE; - rtw_hw_suspend(padapter ); - } - else - { + rtw_hw_suspend(padapter); + } else { pwrpriv->change_rfpwrstate = rf_on; - rtw_hw_resume(padapter ); + rtw_hw_resume(padapter); } - DBG_871X("current rf_pwrstate(%s)\n",(pwrpriv->rf_pwrstate == rf_off)?"rf_off":"rf_on"); + RTW_INFO("current rf_pwrstate(%s)\n", (pwrpriv->rf_pwrstate == rf_off) ? "rf_off" : "rf_on"); } } - pwrpriv->pwr_state_check_cnts ++; + pwrpriv->pwr_state_check_cnts++; } -#endif //SUPPORT_HW_RFOFF_DETECTED +#endif /* SUPPORT_HW_RFOFF_DETECTED */ if (pwrpriv->ips_mode_req == IPS_NONE) goto exit; @@ -375,47 +347,42 @@ void rtw_ps_processor(_adapter*padapter) if (rtw_pwr_unassociated_idle(padapter) == _FALSE) goto exit; - if((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts%4)==0)) - { - DBG_871X("==>%s .fw_state(%x)\n",__FUNCTION__,get_fwstate(pmlmepriv)); - #if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) - #else + if ((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts % 4) == 0)) { + RTW_INFO("==>%s .fw_state(%x)\n", __FUNCTION__, get_fwstate(pmlmepriv)); +#if defined(CONFIG_BT_COEXIST) && defined (CONFIG_AUTOSUSPEND) +#else pwrpriv->change_rfpwrstate = rf_off; - #endif - #ifdef CONFIG_AUTOSUSPEND - if(padapter->registrypriv.usbss_enable) - { - if(pwrpriv->bHWPwrPindetect) +#endif +#ifdef CONFIG_AUTOSUSPEND + if (padapter->registrypriv.usbss_enable) { + if (pwrpriv->bHWPwrPindetect) pwrpriv->bkeepfwalive = _TRUE; - - if(padapter->net_closed == _TRUE) + + if (padapter->net_closed == _TRUE) pwrpriv->ps_flag = _TRUE; - #if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) - if (_TRUE==pwrpriv->bInternalAutoSuspend) { - DBG_871X("<==%s .pwrpriv->bInternalAutoSuspend)(%x)\n",__FUNCTION__,pwrpriv->bInternalAutoSuspend); - } else { +#if defined(CONFIG_BT_COEXIST) && defined (CONFIG_AUTOSUSPEND) + if (_TRUE == pwrpriv->bInternalAutoSuspend) + RTW_INFO("<==%s .pwrpriv->bInternalAutoSuspend)(%x)\n", __FUNCTION__, pwrpriv->bInternalAutoSuspend); + else { pwrpriv->change_rfpwrstate = rf_off; - DBG_871X("<==%s .pwrpriv->bInternalAutoSuspend)(%x) call autosuspend_enter\n",__FUNCTION__,pwrpriv->bInternalAutoSuspend); + RTW_INFO("<==%s .pwrpriv->bInternalAutoSuspend)(%x) call autosuspend_enter\n", __FUNCTION__, pwrpriv->bInternalAutoSuspend); autosuspend_enter(padapter); - } - #else + } +#else autosuspend_enter(padapter); - #endif //if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) - } - else if(pwrpriv->bHWPwrPindetect) +#endif /* if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) */ + } else if (pwrpriv->bHWPwrPindetect) { + } else +#endif /* CONFIG_AUTOSUSPEND */ { - } - else - #endif //CONFIG_AUTOSUSPEND - { - #if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) +#if defined(CONFIG_BT_COEXIST) && defined (CONFIG_AUTOSUSPEND) pwrpriv->change_rfpwrstate = rf_off; - #endif //defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) +#endif /* defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) */ - #ifdef CONFIG_IPS - ips_enter(padapter); - #endif +#ifdef CONFIG_IPS + ips_enter(padapter); +#endif } } exit: @@ -442,61 +409,52 @@ void traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets) u8 bLeaveLPS = _FALSE; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - if(tx) //from tx - { + + if (tx) { /* from tx */ xmit_cnt += tx_packets; - if (start_time== 0) - start_time= rtw_get_current_time(); + if (start_time == 0) + start_time = rtw_get_current_time(); - if (rtw_get_passing_time_ms(start_time) > 2000) // 2 sec == watch dog timer - { - if(xmit_cnt > 8) - { - if ((adapter_to_pwrctl(padapter)->bLeisurePs) - && (adapter_to_pwrctl(padapter)->pwr_mode != PS_MODE_ACTIVE) + if (rtw_get_passing_time_ms(start_time) > 2000) { /* 2 sec == watch dog timer */ + if (xmit_cnt > 8) { + if ((adapter_to_pwrctl(padapter)->bLeisurePs) + && (adapter_to_pwrctl(padapter)->pwr_mode != PS_MODE_ACTIVE) #ifdef CONFIG_BT_COEXIST - && (rtw_btcoex_IsBtControlLps(padapter) == _FALSE) + && (rtw_btcoex_IsBtControlLps(padapter) == _FALSE) #endif - ) - { - //DBG_871X("leave lps via Tx = %d\n", xmit_cnt); + ) { + /* RTW_INFO("leave lps via Tx = %d\n", xmit_cnt); */ bLeaveLPS = _TRUE; } } - start_time= rtw_get_current_time(); + start_time = rtw_get_current_time(); xmit_cnt = 0; } - } - else // from rx path - { - if(pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 4/*2*/) - { + } else { /* from rx path */ + if (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 4/*2*/) { if ((adapter_to_pwrctl(padapter)->bLeisurePs) - && (adapter_to_pwrctl(padapter)->pwr_mode != PS_MODE_ACTIVE) -#ifdef CONFIG_BT_COEXIST - && (rtw_btcoex_IsBtControlLps(padapter) == _FALSE) + && (adapter_to_pwrctl(padapter)->pwr_mode != PS_MODE_ACTIVE) +#ifdef CONFIG_BT_COEXIST + && (rtw_btcoex_IsBtControlLps(padapter) == _FALSE) #endif - ) - { - //DBG_871X("leave lps via Rx = %d\n", pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); + ) { + /* RTW_INFO("leave lps via Rx = %d\n", pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); */ bLeaveLPS = _TRUE; } - } - } - - if(bLeaveLPS) - { - //DBG_871X("leave lps via %s, Tx = %d, Rx = %d \n", tx?"Tx":"Rx", pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); - //rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1); - rtw_lps_ctrl_wk_cmd(padapter, tx?LPS_CTRL_TX_TRAFFIC_LEAVE:LPS_CTRL_RX_TRAFFIC_LEAVE, tx?0:1); + } } -#endif //CONFIG_CHECK_LEAVE_LPS -} + + if (bLeaveLPS) { + /* RTW_INFO("leave lps via %s, Tx = %d, Rx = %d\n", tx?"Tx":"Rx", pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); */ + /* rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1); */ + rtw_lps_ctrl_wk_cmd(padapter, tx ? LPS_CTRL_TX_TRAFFIC_LEAVE : LPS_CTRL_RX_TRAFFIC_LEAVE, tx ? 0 : 1); + } +#endif /* CONFIG_CHECK_LEAVE_LPS */ +} /* * Description: @@ -513,41 +471,29 @@ void rtw_set_rpwm(PADAPTER padapter, u8 pslv) struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); #ifdef CONFIG_DETECT_CPWM_BY_POLLING u8 cpwm_orig; -#endif // CONFIG_DETECT_CPWM_BY_POLLING +#endif /* CONFIG_DETECT_CPWM_BY_POLLING */ struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; -_func_enter_; pslv = PS_STATE(pslv); #ifdef CONFIG_LPS_RPWM_TIMER if (pwrpriv->brpwmtimeout == _TRUE) - { - DBG_871X("%s: RPWM timeout, force to set RPWM(0x%02X) again!\n", __FUNCTION__, pslv); - } + RTW_INFO("%s: RPWM timeout, force to set RPWM(0x%02X) again!\n", __FUNCTION__, pslv); else -#endif // CONFIG_LPS_RPWM_TIMER +#endif /* CONFIG_LPS_RPWM_TIMER */ { - if ( (pwrpriv->rpwm == pslv) + if ((pwrpriv->rpwm == pslv) #ifdef CONFIG_LPS_LCLK - || ((pwrpriv->rpwm >= PS_STATE_S2)&&(pslv >= PS_STATE_S2)) + || ((pwrpriv->rpwm >= PS_STATE_S2) && (pslv >= PS_STATE_S2)) #endif - ) - { - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_, - ("%s: Already set rpwm[0x%02X], new=0x%02X!\n", __FUNCTION__, pwrpriv->rpwm, pslv)); + ) { return; } } if (rtw_is_surprise_removed(padapter) || - (!rtw_is_hw_init_completed(padapter))) - { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, - ("%s: SurpriseRemoved(%s) hw_init_completed(%s)\n" - , __func__ - , rtw_is_surprise_removed(padapter)?"True":"False" - , rtw_is_hw_init_completed(padapter)?"True":"False")); + (!rtw_is_hw_init_completed(padapter))) { pwrpriv->cpwm = PS_STATE_S4; @@ -555,104 +501,89 @@ _func_enter_; } if (rtw_is_drv_stopped(padapter)) { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, - ("%s: change power state(0x%02X) when DriverStopped\n", __FUNCTION__, pslv)); if (pslv < PS_STATE_S2) { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, - ("%s: Reject to enter PS_STATE(0x%02X) lower than S2 when DriverStopped!!\n", __FUNCTION__, pslv)); return; } } rpwm = pslv | pwrpriv->tog; #ifdef CONFIG_LPS_LCLK - // only when from PS_STATE S0/S1 to S2 and higher needs ACK + /* only when from PS_STATE S0/S1 to S2 and higher needs ACK */ if ((pwrpriv->cpwm < PS_STATE_S2) && (pslv >= PS_STATE_S2)) rpwm |= PS_ACK; #endif - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("rtw_set_rpwm: rpwm=0x%02x cpwm=0x%02x\n", rpwm, pwrpriv->cpwm)); pwrpriv->rpwm = pslv; #ifdef CONFIG_DETECT_CPWM_BY_POLLING cpwm_orig = 0; if (rpwm & PS_ACK) - { rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig); - } #endif #if defined(CONFIG_LPS_RPWM_TIMER) && !defined(CONFIG_DETECT_CPWM_BY_POLLING) if (rpwm & PS_ACK) _set_timer(&pwrpriv->pwr_rpwm_timer, LPS_RPWM_WAIT_MS); -#endif // CONFIG_LPS_RPWM_TIMER & !CONFIG_DETECT_CPWM_BY_POLLING +#endif /* CONFIG_LPS_RPWM_TIMER & !CONFIG_DETECT_CPWM_BY_POLLING */ rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); pwrpriv->tog += 0x80; #ifdef CONFIG_LPS_LCLK - // No LPS 32K, No Ack - if (rpwm & PS_ACK) - { + /* No LPS 32K, No Ack */ + if (rpwm & PS_ACK) { #ifdef CONFIG_DETECT_CPWM_BY_POLLING u32 start_time; u8 cpwm_now; - u8 poll_cnt=0; + u8 poll_cnt = 0; start_time = rtw_get_current_time(); - // polling cpwm + /* polling cpwm */ 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) - { + if ((cpwm_orig ^ cpwm_now) & 0x80) { pwrpriv->cpwm = PS_STATE_S4; 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" - , __FUNCTION__,poll_cnt, cpwm_orig, cpwm_now, rtw_read8(padapter, REG_CR)); - if(rtw_fw_ps_state(padapter) == _FAIL) - { - DBG_871X("leave 32k but fw state in 32k\n"); + RTW_INFO("%s: polling cpwm OK! poll_cnt=%d, cpwm_orig=%02x, cpwm_now=%02x , 0x100=0x%x\n" + , __FUNCTION__, poll_cnt, cpwm_orig, cpwm_now, rtw_read8(padapter, REG_CR)); + if (rtw_fw_ps_state(padapter) == _FAIL) { + RTW_INFO("leave 32k but fw state in 32k\n"); pdbgpriv->dbg_rpwm_toogle_cnt++; } -#endif //DBG_CHECK_FW_PS_STATE +#endif /* DBG_CHECK_FW_PS_STATE */ break; } - if (rtw_get_passing_time_ms(start_time) > LPS_RPWM_WAIT_MS) - { - DBG_871X("%s: polling cpwm timeout! poll_cnt=%d, cpwm_orig=%02x, cpwm_now=%02x \n", __FUNCTION__,poll_cnt, cpwm_orig, cpwm_now); + if (rtw_get_passing_time_ms(start_time) > LPS_RPWM_WAIT_MS) { + RTW_INFO("%s: polling cpwm timeout! poll_cnt=%d, cpwm_orig=%02x, cpwm_now=%02x\n", __FUNCTION__, poll_cnt, cpwm_orig, cpwm_now); #ifdef DBG_CHECK_FW_PS_STATE - if(rtw_fw_ps_state(padapter) == _FAIL) - { - DBG_871X("rpwm timeout and fw ps state in 32k\n"); + if (rtw_fw_ps_state(padapter) == _FAIL) { + RTW_INFO("rpwm timeout and fw ps state in 32k\n"); pdbgpriv->dbg_rpwm_timeout_fail_cnt++; } -#endif //DBG_CHECK_FW_PS_STATE +#endif /* DBG_CHECK_FW_PS_STATE */ #ifdef CONFIG_LPS_RPWM_TIMER _set_timer(&pwrpriv->pwr_rpwm_timer, 1); -#endif // CONFIG_LPS_RPWM_TIMER +#endif /* CONFIG_LPS_RPWM_TIMER */ break; } } while (1); -#endif // CONFIG_DETECT_CPWM_BY_POLLING - } - else -#endif // CONFIG_LPS_LCLK +#endif /* CONFIG_DETECT_CPWM_BY_POLLING */ + } else +#endif /* CONFIG_LPS_LCLK */ { pwrpriv->cpwm = pslv; } -_func_exit_; } -u8 PS_RDY_CHECK(_adapter * padapter) +u8 PS_RDY_CHECK(_adapter *padapter) { u32 curr_time, delta_time; struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); @@ -665,53 +596,48 @@ u8 PS_RDY_CHECK(_adapter * padapter) #endif /* CONFIG_P2P */ #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) - if(_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_mode) + if (_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_mode) return _TRUE; - else if(_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_ap_mode) + else if (_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_ap_mode) return _TRUE; else if (_TRUE == pwrpriv->bInSuspend) return _FALSE; #else - if(_TRUE == pwrpriv->bInSuspend ) + if (_TRUE == pwrpriv->bInSuspend) return _FALSE; #endif - curr_time = rtw_get_current_time(); + curr_time = rtw_get_current_time(); - delta_time = curr_time -pwrpriv->DelayLPSLastTimeStamp; + delta_time = curr_time - pwrpriv->DelayLPSLastTimeStamp; - if(delta_time < LPS_DELAY_TIME) - { + if (delta_time < LPS_DELAY_TIME) return _FALSE; - } if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) - || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) - || check_fwstate(pmlmepriv, WIFI_AP_STATE) - || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE) - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS) - || pcfg80211_wdinfo->is_ro_ch - #elif defined(CONFIG_P2P) - || !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) - #endif - || rtw_is_scan_deny(padapter) + || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING | WIFI_UNDER_WPS) + || check_fwstate(pmlmepriv, WIFI_AP_STATE) + || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE) +#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) + || pcfg80211_wdinfo->is_ro_ch +#endif + || rtw_is_scan_deny(padapter) #ifdef CONFIG_TDLS - // TDLS link is established. - || ( padapter->tdlsinfo.link_established == _TRUE ) -#endif // CONFIG_TDLS - ) + /* TDLS link is established. */ + || (padapter->tdlsinfo.link_established == _TRUE) +#endif /* CONFIG_TDLS */ + ) return _FALSE; - if( (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) && (padapter->securitypriv.binstallGrpkey == _FALSE) ) - { - DBG_871X("Group handshake still in progress !!!\n"); + if ((padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) && (padapter->securitypriv.binstallGrpkey == _FALSE)) { + RTW_INFO("Group handshake still in progress !!!\n"); return _FALSE; } #ifdef CONFIG_IOCTL_CFG80211 if (!rtw_cfg80211_pwr_mgmt(padapter)) return _FALSE; -#endif +#endif return _TRUE; } @@ -720,118 +646,118 @@ u8 PS_RDY_CHECK(_adapter * padapter) void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable) { struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - int cnt=0; + int cnt = 0; u32 start_time; u8 val8 = 0; u8 cpwm_orig = 0, cpwm_now = 0; - u8 parm[H2C_INACTIVE_PS_LEN]={0}; + u8 parm[H2C_INACTIVE_PS_LEN] = {0}; if (padapter->netif_up == _FALSE) { - DBG_871X("%s: ERROR, netif is down\n", __func__); + RTW_INFO("%s: ERROR, netif is down\n", __func__); return; } - //u8 cmd_param; //BIT0:enable, BIT1:NoConnect32k + /* 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__); + /* Enter IPS */ + RTW_INFO("%s: issue H2C to FW when entering IPS\n", __func__); + parm[0] = 0x1;/* suggest by Isaac.Hsu*/ #ifdef CONFIG_PNO_SUPPORT - parm[0] = 0x03; - 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 + if (pwrpriv->pno_inited) { + parm[1] = pwrpriv->pnlo_info->fast_scan_iterations; + parm[2] = pwrpriv->pnlo_info->slow_scan_period; + } +#endif - 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. - do{ + 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. */ + do { val8 = rtw_read8(padapter, REG_HMETFR); cnt++; - DBG_871X("%s polling REG_HMETFR=0x%x, cnt=%d \n", - __func__, val8, cnt); + RTW_INFO("%s polling REG_HMETFR=0x%x, cnt=%d\n", + __func__, val8, cnt); rtw_mdelay_os(10); - }while(cnt<100 && (val8!=0)); + } while (cnt < 100 && (val8 != 0)); - //H2C done, enter 32k +#ifdef CONFIG_LPS_LCLK + /* H2C done, enter 32k */ if (val8 == 0) { - //ser rpwm to enter 32k - val8 = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1); - DBG_871X("%s: read rpwm=%02x\n", __FUNCTION__, val8); + /* ser rpwm to enter 32k */ + val8 = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1); + RTW_INFO("%s: read rpwm=%02x\n", __FUNCTION__, val8); val8 += 0x80; val8 |= BIT(0); - rtw_write8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, val8); - DBG_871X("%s: write rpwm=%02x\n", __FUNCTION__, val8); + rtw_write8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1, val8); + RTW_INFO("%s: write rpwm=%02x\n", __FUNCTION__, val8); adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80; cnt = val8 = 0; 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_INFO("%s polling 0x100=0x%x, cnt=%d\n", + __func__, val8, cnt); + RTW_INFO("%s 0x08:%02x, 0x03:%02x\n", + __func__, + rtw_read8(padapter, 0x08), + rtw_read8(padapter, 0x03)); rtw_mdelay_os(10); - } while(cnt<20 && (val8!=0xEA)); + } while (cnt < 20 && (val8 != 0xEA)); } } +#endif } else { - //Leave IPS - DBG_871X("%s: Leaving IPS in FWLPS state\n", __func__); + /* Leave IPS */ + RTW_INFO("%s: Leaving IPS in FWLPS state\n", __func__); - //for polling cpwm +#ifdef CONFIG_LPS_LCLK + /* for polling cpwm */ cpwm_orig = 0; rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig); - //ser rpwm - val8 = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1); + /* ser rpwm */ + val8 = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1); val8 &= 0x80; val8 += 0x80; val8 |= BIT(6); - rtw_write8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, val8); - DBG_871X("%s: write rpwm=%02x\n", __FUNCTION__, val8); + rtw_write8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1, val8); + RTW_INFO("%s: write rpwm=%02x\n", __FUNCTION__, val8); adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80; - //do polling cpwm + /* do polling cpwm */ start_time = rtw_get_current_time(); do { rtw_mdelay_os(1); rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_now); - if ((cpwm_orig ^ cpwm_now) & 0x80) { + if ((cpwm_orig ^ cpwm_now) & 0x80) break; - } - if (rtw_get_passing_time_ms(start_time) > 100) - { - DBG_871X("%s: polling cpwm timeout when leaving IPS in FWLPS state\n", __FUNCTION__); + if (rtw_get_passing_time_ms(start_time) > 100) { + RTW_INFO("%s: polling cpwm timeout when leaving IPS in FWLPS state\n", __FUNCTION__); break; } } while (1); +#endif parm[0] = 0x0; parm[1] = 0x0; parm[2] = 0x0; rtw_hal_fill_h2c_cmd(padapter, H2C_INACTIVE_PS_, - H2C_INACTIVE_PS_LEN, parm); + H2C_INACTIVE_PS_LEN, parm); #ifdef CONFIG_BT_COEXIST rtw_btcoex_IpsNotify(padapter, IPS_NONE); #endif } } -#endif //CONFIG_PNO_SUPPORT +#endif /* CONFIG_PNO_SUPPORT */ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg) { @@ -839,174 +765,163 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); -#endif //CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif /* CONFIG_P2P */ #ifdef CONFIG_TDLS struct sta_priv *pstapriv = &padapter->stapriv; _irqL irqL; int i, j; _list *plist, *phead; struct sta_info *ptdls_sta; -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ -_func_enter_; - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("%s: PowerMode=%d Smart_PS=%d\n", - __FUNCTION__, ps_mode, smart_ps)); - if(ps_mode > PM_Card_Disable) { - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("ps_mode:%d error\n", ps_mode)); + if (ps_mode > PM_Card_Disable) { return; } - if (pwrpriv->pwr_mode == ps_mode) - { - if (PS_MODE_ACTIVE == ps_mode) return; + if (pwrpriv->pwr_mode == ps_mode) { + if (PS_MODE_ACTIVE == ps_mode) + return; #ifndef CONFIG_BT_COEXIST if ((pwrpriv->smart_ps == smart_ps) && - (pwrpriv->bcn_ant_mode == bcn_ant_mode)) - { + (pwrpriv->bcn_ant_mode == bcn_ant_mode)) return; - } -#endif // !CONFIG_BT_COEXIST +#endif /* !CONFIG_BT_COEXIST */ } +#ifdef CONFIG_LPS_PG + if ((PS_MODE_ACTIVE != ps_mode) && (pwrpriv->blpspg_info_up)) + rtw_hal_set_lps_pg_info(padapter); +#endif + #ifdef CONFIG_LPS_LCLK _enter_pwrlock(&pwrpriv->lock); #endif - //if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) - if(ps_mode == PS_MODE_ACTIVE) - { + /* if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) */ + if (ps_mode == PS_MODE_ACTIVE) { if (1 #ifdef CONFIG_BT_COEXIST - && (((rtw_btcoex_IsBtControlLps(padapter) == _FALSE) + && (((rtw_btcoex_IsBtControlLps(padapter) == _FALSE) #ifdef CONFIG_P2P_PS - && (pwdinfo->opp_ps == 0) -#endif // CONFIG_P2P_PS - ) - || ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE) - && (rtw_btcoex_IsLpsOn(padapter) == _FALSE)) - ) -#else // !CONFIG_BT_COEXIST -#ifdef CONFIG_P2P_PS - && (pwdinfo->opp_ps == 0) -#endif // CONFIG_P2P_PS -#endif // !CONFIG_BT_COEXIST + && (pwdinfo->opp_ps == 0) +#endif /* CONFIG_P2P_PS */ ) - { - DBG_871X(FUNC_ADPT_FMT" Leave 802.11 power save - %s\n", - FUNC_ADPT_ARG(padapter), msg); + || ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE) + && (rtw_btcoex_IsLpsOn(padapter) == _FALSE)) + ) +#else /* !CONFIG_BT_COEXIST */ +#ifdef CONFIG_P2P_PS + && (pwdinfo->opp_ps == 0) +#endif /* CONFIG_P2P_PS */ +#endif /* !CONFIG_BT_COEXIST */ + ) { + RTW_INFO(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); - - for(i=0; i< NUM_STA; i++) - { + 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) - { + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list); - if( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE ) + if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 0, 0); plist = get_next(plist); } } - - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ pwrpriv->pwr_mode = ps_mode; rtw_set_rpwm(padapter, PS_STATE_S4); - + #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) || defined(CONFIG_P2P_WOWLAN) if (pwrpriv->wowlan_mode == _TRUE || - pwrpriv->wowlan_ap_mode == _TRUE || - pwrpriv->wowlan_p2p_mode == _TRUE) - { + pwrpriv->wowlan_ap_mode == _TRUE || + pwrpriv->wowlan_p2p_mode == _TRUE) { u32 start_time, delay_ms; u8 val8; delay_ms = 20; start_time = rtw_get_current_time(); - do { + do { rtw_hal_get_hwreg(padapter, HW_VAR_SYS_CLKR, &val8); - if (!(val8 & BIT(4))){ //0x08 bit4 =1 --> in 32k, bit4 = 0 --> leave 32k + if (!(val8 & BIT(4))) { /* 0x08 bit4 =1 --> in 32k, bit4 = 0 --> leave 32k */ pwrpriv->cpwm = PS_STATE_S4; break; } - if (rtw_get_passing_time_ms(start_time) > delay_ms) - { - DBG_871X("%s: Wait for FW 32K leave more than %u ms!!!\n", - __FUNCTION__, delay_ms); + if (rtw_get_passing_time_ms(start_time) > delay_ms) { + RTW_INFO("%s: Wait for FW 32K leave more than %u ms!!!\n", + __FUNCTION__, delay_ms); pdbgpriv->dbg_wow_leave_ps_fail_cnt++; break; } rtw_usleep_os(100); - } while (1); + } while (1); } #endif rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); +#ifdef CONFIG_LPS_POFF + rtw_hal_set_hwreg(padapter, HW_VAR_LPS_POFF_SET_MODE, + (u8 *)(&ps_mode)); +#endif /*CONFIG_LPS_POFF*/ + pwrpriv->bFwCurrentInPSMode = _FALSE; #ifdef CONFIG_BT_COEXIST rtw_btcoex_LpsNotify(padapter, ps_mode); -#endif // CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ } - } - else - { + } else { if ((PS_RDY_CHECK(padapter) && check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE)) #ifdef CONFIG_BT_COEXIST - || ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE) - && (rtw_btcoex_IsLpsOn(padapter) == _TRUE)) + || ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE) + && (rtw_btcoex_IsLpsOn(padapter) == _TRUE)) #endif #ifdef CONFIG_P2P_WOWLAN - ||( _TRUE == pwrpriv->wowlan_p2p_mode) -#endif //CONFIG_P2P_WOWLAN - ) - { + || (_TRUE == pwrpriv->wowlan_p2p_mode) +#endif /* CONFIG_P2P_WOWLAN */ + ) { u8 pslv; - DBG_871X(FUNC_ADPT_FMT" Enter 802.11 power save - %s\n", - FUNC_ADPT_ARG(padapter), msg); + RTW_INFO(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); - - for(i=0; i< NUM_STA; i++) - { + 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) - { + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list); - if( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE ) + if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 1, 0, 0); plist = get_next(plist); } } - - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ #ifdef CONFIG_BT_COEXIST rtw_btcoex_LpsNotify(padapter, ps_mode); -#endif // CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ + +#ifdef CONFIG_LPS_POFF + rtw_hal_set_hwreg(padapter, HW_VAR_LPS_POFF_SET_MODE, + (u8 *)(&ps_mode)); +#endif /*CONFIG_LPS_POFF*/ pwrpriv->bFwCurrentInPSMode = _TRUE; pwrpriv->pwr_mode = ps_mode; @@ -1015,21 +930,20 @@ _func_enter_; rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); #ifdef CONFIG_P2P_PS - // Set CTWindow after LPS - if(pwdinfo->opp_ps == 1) + /* Set CTWindow after LPS */ + if (pwdinfo->opp_ps == 1) p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 0); -#endif //CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ pslv = PS_STATE_S2; #ifdef CONFIG_LPS_LCLK if (pwrpriv->alives == 0) pslv = PS_STATE_S0; -#endif // CONFIG_LPS_LCLK +#endif /* CONFIG_LPS_LCLK */ #ifdef CONFIG_BT_COEXIST if ((rtw_btcoex_IsBtDisabled(padapter) == _FALSE) - && (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)) - { + && (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)) { u8 val8; val8 = rtw_btcoex_LpsVal(padapter); @@ -1037,7 +951,7 @@ _func_enter_; pslv = PS_STATE_S2; } -#endif // CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ rtw_set_rpwm(padapter, pslv); } @@ -1047,7 +961,6 @@ _func_enter_; _exit_pwrlock(&pwrpriv->lock); #endif -_func_exit_; } /* @@ -1064,22 +977,20 @@ s32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms) start_time = rtw_get_current_time(); - while (1) - { + while (1) { rtw_hal_get_hwreg(padapter, HW_VAR_FWLPS_RF_ON, &bAwake); if (_TRUE == bAwake) break; if (rtw_is_surprise_removed(padapter)) { err = -2; - DBG_871X("%s: device surprise removed!!\n", __FUNCTION__); + RTW_INFO("%s: device surprise removed!!\n", __FUNCTION__); break; } - if (rtw_get_passing_time_ms(start_time) > delay_ms) - { + if (rtw_get_passing_time_ms(start_time) > delay_ms) { err = -1; - DBG_871X("%s: Wait for FW LPS leave more than %u ms!!!\n", __FUNCTION__, delay_ms); + RTW_INFO("%s: Wait for FW LPS leave more than %u ms!!!\n", __FUNCTION__, delay_ms); break; } rtw_usleep_os(100); @@ -1088,23 +999,23 @@ s32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms) return err; } -// -// Description: -// Enter the leisure power save mode. -// +/* + * Description: + * Enter the leisure power save mode. + * */ void LPS_Enter(PADAPTER padapter, const char *msg) { struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - _adapter *buddy = padapter->pbuddy_adapter; int n_assoc_iface = 0; int i; char buf[32] = {0}; -_func_enter_; -// DBG_871X("+LeisurePSEnter\n"); + /* RTW_INFO("+LeisurePSEnter\n"); */ + if (_FALSE == padapter->bFWReady) + return; #ifdef CONFIG_BT_COEXIST if (rtw_btcoex_IsBtControlLps(padapter) == _TRUE) @@ -1119,9 +1030,11 @@ _func_enter_; if (n_assoc_iface != 1) return; +#ifndef CONFIG_SUPPORT_FW_MULTI_PORT /* Skip lps enter request for adapter not port0 */ - if (get_iface_type(padapter) != IFACE_PORT0) + if (get_hw_port(padapter) != HW_PORT0) return; +#endif for (i = 0; i < dvobj->iface_nums; i++) { if (PS_RDY_CHECK(dvobj->padapters[i]) == _FALSE) @@ -1129,37 +1042,31 @@ _func_enter_; } #ifdef CONFIG_P2P_PS - if(padapter->wdinfo.p2p_ps_mode == P2P_PS_NOA) - { - return;//supporting p2p client ps NOA via H2C_8723B_P2P_PS_OFFLOAD + if (padapter->wdinfo.p2p_ps_mode == P2P_PS_NOA) { + return;/* supporting p2p client ps NOA via H2C_8723B_P2P_PS_OFFLOAD */ } -#endif //CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ - if (pwrpriv->bLeisurePs) - { - // Idle for a while if we connect to AP a while ago. - if (pwrpriv->LpsIdleCount >= 2) // 4 Sec - { - if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) - { + if (pwrpriv->bLeisurePs) { + /* Idle for a while if we connect to AP a while ago. */ + if (pwrpriv->LpsIdleCount >= 2) { /* 4 Sec */ + if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) { sprintf(buf, "WIFI-%s", msg); pwrpriv->bpower_saving = _TRUE; rtw_set_ps_mode(padapter, pwrpriv->power_mgnt, padapter->registrypriv.smart_ps, 0, buf); } - } - else + } else pwrpriv->LpsIdleCount++; } -// DBG_871X("-LeisurePSEnter\n"); + /* RTW_INFO("-LeisurePSEnter\n"); */ -_func_exit_; } -// -// Description: -// Leave the leisure power save mode. -// +/* + * Description: + * Leave the leisure power save mode. + * */ void LPS_Leave(PADAPTER padapter, const char *msg) { #define LPS_LEAVE_TIMEOUT_MS 100 @@ -1171,38 +1078,33 @@ void LPS_Leave(PADAPTER padapter, const char *msg) char buf[32] = {0}; struct debug_priv *pdbgpriv = &dvobj->drv_dbg; -_func_enter_; -// DBG_871X("+LeisurePSLeave\n"); + /* RTW_INFO("+LeisurePSLeave\n"); */ #ifdef CONFIG_BT_COEXIST if (rtw_btcoex_IsBtControlLps(padapter) == _TRUE) return; #endif - if (pwrpriv->bLeisurePs) - { - if(pwrpriv->pwr_mode != PS_MODE_ACTIVE) - { + if (pwrpriv->bLeisurePs) { + if (pwrpriv->pwr_mode != PS_MODE_ACTIVE) { sprintf(buf, "WIFI-%s", msg); rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, buf); - if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) + if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) LPS_RF_ON_check(padapter, LPS_LEAVE_TIMEOUT_MS); } } pwrpriv->bpower_saving = _FALSE; #ifdef DBG_CHECK_FW_PS_STATE - if(rtw_fw_ps_state(padapter) == _FAIL) - { - DBG_871X("leave lps, fw in 32k\n"); + if (rtw_fw_ps_state(padapter) == _FAIL) { + RTW_INFO("leave lps, fw in 32k\n"); pdbgpriv->dbg_leave_lps_fail_cnt++; } -#endif //DBG_CHECK_FW_PS_STATE -// DBG_871X("-LeisurePSLeave\n"); +#endif /* DBG_CHECK_FW_PS_STATE + * RTW_INFO("-LeisurePSLeave\n"); */ -_func_exit_; } #endif @@ -1216,26 +1118,20 @@ void LeaveAllPowerSaveModeDirect(PADAPTER Adapter) #ifndef CONFIG_DETECT_CPWM_BY_POLLING u8 cpwm_orig, cpwm_now; u32 start_time; -#endif // CONFIG_DETECT_CPWM_BY_POLLING +#endif /* CONFIG_DETECT_CPWM_BY_POLLING */ -_func_enter_; - DBG_871X("%s.....\n",__FUNCTION__); + RTW_INFO("%s.....\n", __FUNCTION__); if (rtw_is_surprise_removed(Adapter)) { - DBG_871X(FUNC_ADPT_FMT ": bSurpriseRemoved=_TRUE Skip!\n", FUNC_ADPT_ARG(Adapter)); + RTW_INFO(FUNC_ADPT_FMT ": bSurpriseRemoved=_TRUE Skip!\n", FUNC_ADPT_ARG(Adapter)); return; } - if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) -#ifdef CONFIG_CONCURRENT_MODE - || (check_buddy_fwstate(Adapter,_FW_LINKED) == _TRUE) -#endif - ) - { //connect + if (rtw_mi_check_status(Adapter, MI_LINKED)) { /*connect*/ - if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) { - DBG_871X("%s: Driver Already Leave LPS\n",__FUNCTION__); + if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) { + RTW_INFO("%s: Driver Already Leave LPS\n", __FUNCTION__); return; } @@ -1245,95 +1141,83 @@ _func_enter_; #ifndef CONFIG_DETECT_CPWM_BY_POLLING cpwm_orig = 0; rtw_hal_get_hwreg(Adapter, HW_VAR_CPWM, &cpwm_orig); -#endif //CONFIG_DETECT_CPWM_BY_POLLING +#endif /* CONFIG_DETECT_CPWM_BY_POLLING */ rtw_set_rpwm(Adapter, PS_STATE_S4); #ifndef CONFIG_DETECT_CPWM_BY_POLLING start_time = rtw_get_current_time(); - // polling cpwm + /* polling cpwm */ do { rtw_mdelay_os(1); rtw_hal_get_hwreg(Adapter, HW_VAR_CPWM, &cpwm_now); - if ((cpwm_orig ^ cpwm_now) & 0x80) - { + if ((cpwm_orig ^ cpwm_now) & 0x80) { pwrpriv->cpwm = PS_STATE_S4; 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" - , __FUNCTION__, cpwm_orig, cpwm_now, rtw_read8(Adapter, REG_CR)); - if(rtw_fw_ps_state(Adapter) == _FAIL) - { - DBG_871X("%s: leave 32k but fw state in 32k\n", __FUNCTION__); + RTW_INFO("%s: polling cpwm OK! cpwm_orig=%02x, cpwm_now=%02x, 0x100=0x%x\n" + , __FUNCTION__, cpwm_orig, cpwm_now, rtw_read8(Adapter, REG_CR)); + if (rtw_fw_ps_state(Adapter) == _FAIL) { + RTW_INFO("%s: leave 32k but fw state in 32k\n", __FUNCTION__); pdbgpriv->dbg_rpwm_toogle_cnt++; } -#endif //DBG_CHECK_FW_PS_STATE +#endif /* DBG_CHECK_FW_PS_STATE */ break; } - if (rtw_get_passing_time_ms(start_time) > LPS_RPWM_WAIT_MS) - { - DBG_871X("%s: polling cpwm timeout! cpwm_orig=%02x, cpwm_now=%02x \n", __FUNCTION__, cpwm_orig, cpwm_now); + if (rtw_get_passing_time_ms(start_time) > LPS_RPWM_WAIT_MS) { + RTW_INFO("%s: polling cpwm timeout! cpwm_orig=%02x, cpwm_now=%02x\n", __FUNCTION__, cpwm_orig, cpwm_now); #ifdef DBG_CHECK_FW_PS_STATE - if(rtw_fw_ps_state(Adapter) == _FAIL) - { - DBG_871X("rpwm timeout and fw ps state in 32k\n"); + if (rtw_fw_ps_state(Adapter) == _FAIL) { + RTW_INFO("rpwm timeout and fw ps state in 32k\n"); pdbgpriv->dbg_rpwm_timeout_fail_cnt++; } -#endif //DBG_CHECK_FW_PS_STATE +#endif /* DBG_CHECK_FW_PS_STATE */ break; } } while (1); -#endif // CONFIG_DETECT_CPWM_BY_POLLING +#endif /* CONFIG_DETECT_CPWM_BY_POLLING */ - _exit_pwrlock(&pwrpriv->lock); + _exit_pwrlock(&pwrpriv->lock); #endif #ifdef CONFIG_P2P_PS p2p_ps_wk_cmd(pri_padapter, P2P_PS_DISABLE, 0); -#endif //CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ #ifdef CONFIG_LPS rtw_lps_ctrl_wk_cmd(pri_padapter, LPS_CTRL_LEAVE, 0); #endif - } - else - { - if(pwrpriv->rf_pwrstate== rf_off) - { - #ifdef CONFIG_AUTOSUSPEND - if(Adapter->registrypriv.usbss_enable) - { - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + } else { + if (pwrpriv->rf_pwrstate == rf_off) { +#ifdef CONFIG_AUTOSUSPEND + if (Adapter->registrypriv.usbss_enable) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) usb_disable_autosuspend(adapter_to_dvobj(Adapter)->pusbdev); - #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) - adapter_to_dvobj(Adapter)->pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;//autosuspend disabled by the user - #endif - } - else - #endif +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 34)) + adapter_to_dvobj(Adapter)->pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;/* autosuspend disabled by the user */ +#endif + } else +#endif { #if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_RTL8188E) - #ifdef CONFIG_IPS - if(_FALSE == ips_leave(pri_padapter)) - { - DBG_871X("======> ips_leave fail.............\n"); - } - #endif -#endif //CONFIG_SWLPS_IN_IPS || (CONFIG_PLATFORM_SPRD && CONFIG_RTL8188E) +#ifdef CONFIG_IPS + if (_FALSE == ips_leave(pri_padapter)) + RTW_INFO("======> ips_leave fail.............\n"); +#endif +#endif /* CONFIG_SWLPS_IN_IPS || (CONFIG_PLATFORM_SPRD && CONFIG_RTL8188E) */ } } } -_func_exit_; } -// -// Description: Leave all power save mode: LPS, FwLPS, IPS if needed. -// Move code to function by tynli. 2010.03.26. -// +/* + * Description: Leave all power save mode: LPS, FwLPS, IPS if needed. + * Move code to function by tynli. 2010.03.26. + * */ void LeaveAllPowerSaveMode(IN PADAPTER Adapter) { struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter); @@ -1342,19 +1226,17 @@ void LeaveAllPowerSaveMode(IN PADAPTER Adapter) int n_assoc_iface = 0; int i; -_func_enter_; - //DBG_871X("%s.....\n",__FUNCTION__); + /* RTW_INFO("%s.....\n",__FUNCTION__); */ - if (_FALSE == Adapter->bup) - { - DBG_871X(FUNC_ADPT_FMT ": bup=%d Skip!\n", - FUNC_ADPT_ARG(Adapter), Adapter->bup); + if (_FALSE == Adapter->bup) { + RTW_INFO(FUNC_ADPT_FMT ": bup=%d Skip!\n", + FUNC_ADPT_ARG(Adapter), Adapter->bup); return; } if (rtw_is_surprise_removed(Adapter)) { - DBG_871X(FUNC_ADPT_FMT ": bSurpriseRemoved=_TRUE Skip!\n", FUNC_ADPT_ARG(Adapter)); + RTW_INFO(FUNC_ADPT_FMT ": bSurpriseRemoved=_TRUE Skip!\n", FUNC_ADPT_ARG(Adapter)); return; } @@ -1363,15 +1245,15 @@ _func_enter_; n_assoc_iface++; } - if (n_assoc_iface) - { //connect + if (n_assoc_iface) { + /* connect */ #ifdef CONFIG_LPS_LCLK enqueue = 1; #endif #ifdef CONFIG_P2P_PS p2p_ps_wk_cmd(Adapter, P2P_PS_DISABLE, enqueue); -#endif //CONFIG_P2P_PS +#endif /* CONFIG_P2P_PS */ #ifdef CONFIG_LPS rtw_lps_ctrl_wk_cmd(Adapter, LPS_CTRL_LEAVE, enqueue); @@ -1379,37 +1261,29 @@ _func_enter_; #ifdef CONFIG_LPS_LCLK LPS_Leave_check(Adapter); -#endif - } - else - { - if(adapter_to_pwrctl(Adapter)->rf_pwrstate== rf_off) - { - #ifdef CONFIG_AUTOSUSPEND - if(Adapter->registrypriv.usbss_enable) - { - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) +#endif + } else { + if (adapter_to_pwrctl(Adapter)->rf_pwrstate == rf_off) { +#ifdef CONFIG_AUTOSUSPEND + if (Adapter->registrypriv.usbss_enable) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) usb_disable_autosuspend(adapter_to_dvobj(Adapter)->pusbdev); - #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) - adapter_to_dvobj(Adapter)->pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;//autosuspend disabled by the user - #endif - } - else - #endif +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 34)) + adapter_to_dvobj(Adapter)->pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;/* autosuspend disabled by the user */ +#endif + } else +#endif { #if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS) || (defined(CONFIG_PLATFORM_SPRD) && defined(CONFIG_RTL8188E)) - #ifdef CONFIG_IPS - if(_FALSE == ips_leave(Adapter)) - { - DBG_871X("======> ips_leave fail.............\n"); - } - #endif -#endif //CONFIG_SWLPS_IN_IPS || (CONFIG_PLATFORM_SPRD && CONFIG_RTL8188E) - } - } +#ifdef CONFIG_IPS + if (_FALSE == ips_leave(Adapter)) + RTW_INFO("======> ips_leave fail.............\n"); +#endif +#endif /* CONFIG_SWLPS_IN_IPS || (CONFIG_PLATFORM_SPRD && CONFIG_RTL8188E) */ + } + } } -_func_exit_; } #ifdef CONFIG_LPS_LCLK @@ -1420,7 +1294,6 @@ void LPS_Leave_check( u32 start_time; u8 bReady; -_func_enter_; pwrpriv = adapter_to_pwrctl(padapter); @@ -1428,36 +1301,31 @@ _func_enter_; start_time = rtw_get_current_time(); rtw_yield_os(); - - while(1) - { + + while (1) { _enter_pwrlock(&pwrpriv->lock); if (rtw_is_surprise_removed(padapter) - || (!rtw_is_hw_init_completed(padapter)) + || (!rtw_is_hw_init_completed(padapter)) #ifdef CONFIG_USB_HCI - || rtw_is_drv_stopped(padapter) + || rtw_is_drv_stopped(padapter) #endif - || (pwrpriv->pwr_mode == PS_MODE_ACTIVE) - ) - { + || (pwrpriv->pwr_mode == PS_MODE_ACTIVE) + ) bReady = _TRUE; - } _exit_pwrlock(&pwrpriv->lock); - if(_TRUE == bReady) + if (_TRUE == bReady) break; - if(rtw_get_passing_time_ms(start_time)>100) - { - DBG_871X("Wait for cpwm event than 100 ms!!!\n"); + if (rtw_get_passing_time_ms(start_time) > 100) { + RTW_INFO("Wait for cpwm event than 100 ms!!!\n"); break; } rtw_msleep_os(1); } -_func_exit_; } /* @@ -1473,14 +1341,10 @@ void cpwm_int_hdl( { struct pwrctrl_priv *pwrpriv; -_func_enter_; pwrpriv = adapter_to_pwrctl(padapter); #if 0 if (pwrpriv->cpwm_tog == (preportpwrstate->state & PS_TOGGLE)) { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, - ("cpwm_int_hdl: tog(old)=0x%02x cpwm(new)=0x%02x toggle bit didn't change!?\n", - pwrpriv->cpwm_tog, preportpwrstate->state)); goto exit; } #endif @@ -1488,19 +1352,17 @@ _func_enter_; _enter_pwrlock(&pwrpriv->lock); #ifdef CONFIG_LPS_RPWM_TIMER - if (pwrpriv->rpwm < PS_STATE_S2) - { - DBG_871X("%s: Redundant CPWM Int. RPWM=0x%02X CPWM=0x%02x\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); + if (pwrpriv->rpwm < PS_STATE_S2) { + RTW_INFO("%s: Redundant CPWM Int. RPWM=0x%02X CPWM=0x%02x\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); _exit_pwrlock(&pwrpriv->lock); goto exit; } -#endif // CONFIG_LPS_RPWM_TIMER +#endif /* CONFIG_LPS_RPWM_TIMER */ pwrpriv->cpwm = PS_STATE(preportpwrstate->state); pwrpriv->cpwm_tog = preportpwrstate->state & PS_TOGGLE; - if (pwrpriv->cpwm >= PS_STATE_S2) - { + if (pwrpriv->cpwm >= PS_STATE_S2) { if (pwrpriv->alives & CMD_ALIVE) _rtw_up_sema(&padapter->cmdpriv.cmd_queue_sema); @@ -1511,25 +1373,31 @@ _func_enter_; _exit_pwrlock(&pwrpriv->lock); exit: - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("cpwm_int_hdl: cpwm=0x%02x\n", pwrpriv->cpwm)); - -_func_exit_; + return; } static void cpwm_event_callback(struct work_struct *work) { struct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, cpwm_event); struct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv); - _adapter *adapter = dvobj->padapters[IFACE_ID0]; + _adapter *adapter = dvobj_get_primary_adapter(dvobj); struct reportpwrstate_parm report; - //DBG_871X("%s\n",__FUNCTION__); + /* RTW_INFO("%s\n",__FUNCTION__); */ report.state = PS_STATE_S2; cpwm_int_hdl(adapter, &report); } +static void dma_event_callback(struct work_struct *work) +{ + struct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, dma_event); + struct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv); + _adapter *adapter = dvobj_get_primary_adapter(dvobj); + + rtw_unregister_tx_alive(adapter); +} + #ifdef CONFIG_LPS_RPWM_TIMER static void rpwmtimeout_workitem_callback(struct work_struct *work) { @@ -1540,27 +1408,25 @@ static void rpwmtimeout_workitem_callback(struct work_struct *work) pwrpriv = container_of(work, struct pwrctrl_priv, rpwmtimeoutwi); dvobj = pwrctl_to_dvobj(pwrpriv); - padapter = dvobj->padapters[IFACE_ID0]; -// DBG_871X("+%s: rpwm=0x%02X cpwm=0x%02X\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); + padapter = dvobj_get_primary_adapter(dvobj); + /* RTW_INFO("+%s: rpwm=0x%02X cpwm=0x%02X\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); */ _enter_pwrlock(&pwrpriv->lock); - if ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2)) - { - DBG_871X("%s: rpwm=0x%02X cpwm=0x%02X CPWM done!\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); + if ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2)) { + RTW_INFO("%s: rpwm=0x%02X cpwm=0x%02X CPWM done!\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); goto exit; } _exit_pwrlock(&pwrpriv->lock); - if (rtw_read8(padapter, 0x100) != 0xEA) - { + if (rtw_read8(padapter, 0x100) != 0xEA) { #if 1 struct reportpwrstate_parm report; report.state = PS_STATE_S2; - DBG_871X("\n%s: FW already leave 32K!\n\n", __func__); + RTW_INFO("\n%s: FW already leave 32K!\n\n", __func__); cpwm_int_hdl(padapter, &report); #else - DBG_871X("\n%s: FW already leave 32K!\n\n", __func__); + RTW_INFO("\n%s: FW already leave 32K!\n\n", __func__); cpwm_event_callback(&pwrpriv->cpwm_event); #endif return; @@ -1568,9 +1434,8 @@ static void rpwmtimeout_workitem_callback(struct work_struct *work) _enter_pwrlock(&pwrpriv->lock); - if ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2)) - { - DBG_871X("%s: cpwm=%d, nothing to do!\n", __func__, pwrpriv->cpwm); + if ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2)) { + RTW_INFO("%s: cpwm=%d, nothing to do!\n", __func__, pwrpriv->cpwm); goto exit; } pwrpriv->brpwmtimeout = _TRUE; @@ -1592,17 +1457,16 @@ static void pwr_rpwm_timeout_handler(void *FunctionContext) padapter = (PADAPTER)FunctionContext; pwrpriv = adapter_to_pwrctl(padapter); - DBG_871X("+%s: rpwm=0x%02X cpwm=0x%02X\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); + RTW_INFO("+%s: rpwm=0x%02X cpwm=0x%02X\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); - if ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2)) - { - DBG_871X("+%s: cpwm=%d, nothing to do!\n", __func__, pwrpriv->cpwm); + if ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2)) { + RTW_INFO("+%s: cpwm=%d, nothing to do!\n", __func__, pwrpriv->cpwm); return; } _set_workitem(&pwrpriv->rpwmtimeoutwi); } -#endif // CONFIG_LPS_RPWM_TIMER +#endif /* CONFIG_LPS_RPWM_TIMER */ __inline static void register_task_alive(struct pwrctrl_priv *pwrctrl, u32 tag) { @@ -1625,7 +1489,7 @@ __inline static void unregister_task_alive(struct pwrctrl_priv *pwrctrl, u32 tag * * Constraint: * 1. this function will request pwrctrl->lock - * + * * Return Value: * _SUCCESS hardware is ready for I/O * _FAIL can't I/O right now @@ -1636,7 +1500,6 @@ s32 rtw_register_task_alive(PADAPTER padapter, u32 task) struct pwrctrl_priv *pwrctrl; u8 pslv; -_func_enter_; res = _SUCCESS; pwrctrl = adapter_to_pwrctl(padapter); @@ -1646,14 +1509,9 @@ _func_enter_; register_task_alive(pwrctrl, task); - if (pwrctrl->bFwCurrentInPSMode == _TRUE) - { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("%s: task=0x%x cpwm=0x%02x alives=0x%08x\n", - __FUNCTION__, task, pwrctrl->cpwm, pwrctrl->alives)); + if (pwrctrl->bFwCurrentInPSMode == _TRUE) { - if (pwrctrl->cpwm < pslv) - { + if (pwrctrl->cpwm < pslv) { if (pwrctrl->cpwm < PS_STATE_S2) res = _FAIL; if (pwrctrl->rpwm < pslv) @@ -1664,16 +1522,14 @@ _func_enter_; _exit_pwrlock(&pwrctrl->lock); #ifdef CONFIG_DETECT_CPWM_BY_POLLING - if (_FAIL == res) - { + if (_FAIL == res) { if (pwrctrl->cpwm >= PS_STATE_S2) res = _SUCCESS; } -#endif // CONFIG_DETECT_CPWM_BY_POLLING +#endif /* CONFIG_DETECT_CPWM_BY_POLLING */ -_func_exit_; - return res; + return res; } /* @@ -1691,15 +1547,13 @@ void rtw_unregister_task_alive(PADAPTER padapter, u32 task) struct pwrctrl_priv *pwrctrl; u8 pslv; -_func_enter_; pwrctrl = adapter_to_pwrctl(padapter); pslv = PS_STATE_S0; #ifdef CONFIG_BT_COEXIST if ((rtw_btcoex_IsBtDisabled(padapter) == _FALSE) - && (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)) - { + && (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)) { u8 val8; val8 = rtw_btcoex_LpsVal(padapter); @@ -1707,21 +1561,16 @@ _func_enter_; pslv = PS_STATE_S2; } -#endif // CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ _enter_pwrlock(&pwrctrl->lock); unregister_task_alive(pwrctrl, task); if ((pwrctrl->pwr_mode != PS_MODE_ACTIVE) - && (pwrctrl->bFwCurrentInPSMode == _TRUE)) - { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("%s: cpwm=0x%02x alives=0x%08x\n", - __FUNCTION__, pwrctrl->cpwm, pwrctrl->alives)); + && (pwrctrl->bFwCurrentInPSMode == _TRUE)) { - if (pwrctrl->cpwm > pslv) - { + if (pwrctrl->cpwm > pslv) { if ((pslv >= PS_STATE_S2) || (pwrctrl->alives == 0)) rtw_set_rpwm(padapter, pslv); } @@ -1729,18 +1578,17 @@ _func_enter_; _exit_pwrlock(&pwrctrl->lock); -_func_exit_; } /* * Caller: rtw_xmit_thread - * + * * Check if the fw_pwrstate is okay for xmit. * If not (cpwm is less than S3), then the sub-routine - * will raise the cpwm to be greater than or equal to S3. + * will raise the cpwm to be greater than or equal to S3. * * Calling Context: Passive - * + * * Return Value: * _SUCCESS rtw_xmit_thread can write fifo/txcmd afterwards. * _FAIL rtw_xmit_thread can not do anything. @@ -1751,7 +1599,6 @@ s32 rtw_register_tx_alive(PADAPTER padapter) struct pwrctrl_priv *pwrctrl; u8 pslv; -_func_enter_; res = _SUCCESS; pwrctrl = adapter_to_pwrctl(padapter); @@ -1761,14 +1608,9 @@ _func_enter_; register_task_alive(pwrctrl, XMIT_ALIVE); - if (pwrctrl->bFwCurrentInPSMode == _TRUE) - { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("rtw_register_tx_alive: cpwm=0x%02x alives=0x%08x\n", - pwrctrl->cpwm, pwrctrl->alives)); + if (pwrctrl->bFwCurrentInPSMode == _TRUE) { - if (pwrctrl->cpwm < pslv) - { + if (pwrctrl->cpwm < pslv) { if (pwrctrl->cpwm < PS_STATE_S2) res = _FAIL; if (pwrctrl->rpwm < pslv) @@ -1779,16 +1621,14 @@ _func_enter_; _exit_pwrlock(&pwrctrl->lock); #ifdef CONFIG_DETECT_CPWM_BY_POLLING - if (_FAIL == res) - { + if (_FAIL == res) { if (pwrctrl->cpwm >= PS_STATE_S2) res = _SUCCESS; } -#endif // CONFIG_DETECT_CPWM_BY_POLLING +#endif /* CONFIG_DETECT_CPWM_BY_POLLING */ -_func_exit_; - return res; + return res; } /* @@ -1810,7 +1650,6 @@ s32 rtw_register_cmd_alive(PADAPTER padapter) struct pwrctrl_priv *pwrctrl; u8 pslv; -_func_enter_; res = _SUCCESS; pwrctrl = adapter_to_pwrctl(padapter); @@ -1820,14 +1659,9 @@ _func_enter_; register_task_alive(pwrctrl, CMD_ALIVE); - if (pwrctrl->bFwCurrentInPSMode == _TRUE) - { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_info_, - ("rtw_register_cmd_alive: cpwm=0x%02x alives=0x%08x\n", - pwrctrl->cpwm, pwrctrl->alives)); + if (pwrctrl->bFwCurrentInPSMode == _TRUE) { - if (pwrctrl->cpwm < pslv) - { + if (pwrctrl->cpwm < pslv) { if (pwrctrl->cpwm < PS_STATE_S2) res = _FAIL; if (pwrctrl->rpwm < pslv) @@ -1838,14 +1672,12 @@ _func_enter_; _exit_pwrlock(&pwrctrl->lock); #ifdef CONFIG_DETECT_CPWM_BY_POLLING - if (_FAIL == res) - { + if (_FAIL == res) { if (pwrctrl->cpwm >= PS_STATE_S2) res = _SUCCESS; } -#endif // CONFIG_DETECT_CPWM_BY_POLLING +#endif /* CONFIG_DETECT_CPWM_BY_POLLING */ -_func_exit_; return res; } @@ -1863,20 +1695,15 @@ s32 rtw_register_rx_alive(PADAPTER padapter) { struct pwrctrl_priv *pwrctrl; -_func_enter_; pwrctrl = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrctrl->lock); register_task_alive(pwrctrl, RECV_ALIVE); - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("rtw_register_rx_alive: cpwm=0x%02x alives=0x%08x\n", - pwrctrl->cpwm, pwrctrl->alives)); _exit_pwrlock(&pwrctrl->lock); -_func_exit_; return _SUCCESS; } @@ -1894,20 +1721,15 @@ s32 rtw_register_evt_alive(PADAPTER padapter) { struct pwrctrl_priv *pwrctrl; -_func_enter_; pwrctrl = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrctrl->lock); register_task_alive(pwrctrl, EVT_ALIVE); - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("rtw_register_evt_alive: cpwm=0x%02x alives=0x%08x\n", - pwrctrl->cpwm, pwrctrl->alives)); _exit_pwrlock(&pwrctrl->lock); -_func_exit_; return _SUCCESS; } @@ -1922,17 +1744,17 @@ _func_exit_; void rtw_unregister_tx_alive(PADAPTER padapter) { struct pwrctrl_priv *pwrctrl; - u8 pslv; + _adapter *iface; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + u8 pslv, i; -_func_enter_; pwrctrl = adapter_to_pwrctl(padapter); pslv = PS_STATE_S0; #ifdef CONFIG_BT_COEXIST if ((rtw_btcoex_IsBtDisabled(padapter) == _FALSE) - && (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)) - { + && (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)) { u8 val8; val8 = rtw_btcoex_LpsVal(padapter); @@ -1940,35 +1762,27 @@ _func_enter_; pslv = PS_STATE_S2; } -#endif // CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ #ifdef CONFIG_P2P_PS - if(padapter->wdinfo.p2p_ps_mode > P2P_PS_NONE) - { - pslv = PS_STATE_S2; - } -#ifdef CONFIG_CONCURRENT_MODE - else if(rtw_buddy_adapter_up(padapter)) - { - if(padapter->pbuddy_adapter->wdinfo.p2p_ps_mode > P2P_PS_NONE) - pslv = PS_STATE_S2; + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + if (iface->wdinfo.p2p_ps_mode > P2P_PS_NONE) { + pslv = PS_STATE_S2; + break; + } + } } #endif -#endif - _enter_pwrlock(&pwrctrl->lock); unregister_task_alive(pwrctrl, XMIT_ALIVE); if ((pwrctrl->pwr_mode != PS_MODE_ACTIVE) - && (pwrctrl->bFwCurrentInPSMode == _TRUE)) - { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("%s: cpwm=0x%02x alives=0x%08x\n", - __FUNCTION__, pwrctrl->cpwm, pwrctrl->alives)); + && (pwrctrl->bFwCurrentInPSMode == _TRUE)) { - if (pwrctrl->cpwm > pslv) - { + if (pwrctrl->cpwm > pslv) { if ((pslv >= PS_STATE_S2) || (pwrctrl->alives == 0)) rtw_set_rpwm(padapter, pslv); } @@ -1976,7 +1790,6 @@ _func_enter_; _exit_pwrlock(&pwrctrl->lock); -_func_exit_; } /* @@ -1988,18 +1801,18 @@ _func_exit_; */ void rtw_unregister_cmd_alive(PADAPTER padapter) { + _adapter *iface; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct pwrctrl_priv *pwrctrl; - u8 pslv; + u8 pslv, i; -_func_enter_; pwrctrl = adapter_to_pwrctl(padapter); pslv = PS_STATE_S0; #ifdef CONFIG_BT_COEXIST if ((rtw_btcoex_IsBtDisabled(padapter) == _FALSE) - && (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)) - { + && (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)) { u8 val8; val8 = rtw_btcoex_LpsVal(padapter); @@ -2007,20 +1820,18 @@ _func_enter_; pslv = PS_STATE_S2; } -#endif // CONFIG_BT_COEXIST +#endif /* CONFIG_BT_COEXIST */ #ifdef CONFIG_P2P_PS - if(padapter->wdinfo.p2p_ps_mode > P2P_PS_NONE) - { - pslv = PS_STATE_S2; + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + if (iface->wdinfo.p2p_ps_mode > P2P_PS_NONE) { + pslv = PS_STATE_S2; + break; + } + } } -#ifdef CONFIG_CONCURRENT_MODE - else if(rtw_buddy_adapter_up(padapter)) - { - if(padapter->pbuddy_adapter->wdinfo.p2p_ps_mode > P2P_PS_NONE) - pslv = PS_STATE_S2; - } -#endif #endif _enter_pwrlock(&pwrctrl->lock); @@ -2028,14 +1839,9 @@ _func_enter_; unregister_task_alive(pwrctrl, CMD_ALIVE); if ((pwrctrl->pwr_mode != PS_MODE_ACTIVE) - && (pwrctrl->bFwCurrentInPSMode == _TRUE)) - { - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_info_, - ("%s: cpwm=0x%02x alives=0x%08x\n", - __FUNCTION__, pwrctrl->cpwm, pwrctrl->alives)); + && (pwrctrl->bFwCurrentInPSMode == _TRUE)) { - if (pwrctrl->cpwm > pslv) - { + if (pwrctrl->cpwm > pslv) { if ((pslv >= PS_STATE_S2) || (pwrctrl->alives == 0)) rtw_set_rpwm(padapter, pslv); } @@ -2043,7 +1849,6 @@ _func_enter_; _exit_pwrlock(&pwrctrl->lock); -_func_exit_; } /* @@ -2053,7 +1858,6 @@ void rtw_unregister_rx_alive(PADAPTER padapter) { struct pwrctrl_priv *pwrctrl; -_func_enter_; pwrctrl = adapter_to_pwrctl(padapter); @@ -2061,43 +1865,34 @@ _func_enter_; unregister_task_alive(pwrctrl, RECV_ALIVE); - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("rtw_unregister_rx_alive: cpwm=0x%02x alives=0x%08x\n", - pwrctrl->cpwm, pwrctrl->alives)); _exit_pwrlock(&pwrctrl->lock); -_func_exit_; } void rtw_unregister_evt_alive(PADAPTER padapter) { struct pwrctrl_priv *pwrctrl; -_func_enter_; pwrctrl = adapter_to_pwrctl(padapter); unregister_task_alive(pwrctrl, EVT_ALIVE); - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, - ("rtw_unregister_evt_alive: cpwm=0x%02x alives=0x%08x\n", - pwrctrl->cpwm, pwrctrl->alives)); _exit_pwrlock(&pwrctrl->lock); -_func_exit_; } #endif /* CONFIG_LPS_LCLK */ #ifdef CONFIG_RESUME_IN_WORKQUEUE -static void resume_workitem_callback(struct work_struct *work); -#endif //CONFIG_RESUME_IN_WORKQUEUE + static void resume_workitem_callback(struct work_struct *work); +#endif /* CONFIG_RESUME_IN_WORKQUEUE */ void rtw_init_pwrctrl_priv(PADAPTER padapter) { struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); - int i = 0; + u8 val8 = 0; #if defined(CONFIG_CONCURRENT_MODE) @@ -2105,19 +1900,18 @@ void rtw_init_pwrctrl_priv(PADAPTER padapter) return; #endif -_func_enter_; #ifdef PLATFORM_WINDOWS - pwrctrlpriv->pnp_current_pwr_state=NdisDeviceStateD0; + pwrctrlpriv->pnp_current_pwr_state = NdisDeviceStateD0; #endif _init_pwrlock(&pwrctrlpriv->lock); _init_pwrlock(&pwrctrlpriv->check_32k_lock); 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->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; @@ -2131,17 +1925,22 @@ _func_enter_; #ifdef CONFIG_AUTOSUSPEND #ifdef SUPPORT_HW_RFOFF_DETECTED - pwrctrlpriv->pwr_state_check_interval = (pwrctrlpriv->bHWPwrPindetect) ?1000:2000; + pwrctrlpriv->pwr_state_check_interval = (pwrctrlpriv->bHWPwrPindetect) ? 1000 : 2000; #endif #endif pwrctrlpriv->LpsIdleCount = 0; - //pwrctrlpriv->FWCtrlPSMode =padapter->registrypriv.power_mgnt;// PS_MODE_MIN; + +#ifdef CONFIG_LPS_PG + pwrctrlpriv->lpspg_rsvd_page_locate = 0; +#endif + + /* pwrctrlpriv->FWCtrlPSMode =padapter->registrypriv.power_mgnt; */ /* PS_MODE_MIN; */ if (padapter->registrypriv.mp_mode == 1) - pwrctrlpriv->power_mgnt =PS_MODE_ACTIVE ; - else - pwrctrlpriv->power_mgnt =padapter->registrypriv.power_mgnt;// PS_MODE_MIN; - pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?_TRUE:_FALSE; + pwrctrlpriv->power_mgnt = PS_MODE_ACTIVE ; + else + pwrctrlpriv->power_mgnt = padapter->registrypriv.power_mgnt; /* PS_MODE_MIN; */ + pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt) ? _TRUE : _FALSE; pwrctrlpriv->bFwCurrentInPSMode = _FALSE; @@ -2160,47 +1959,44 @@ _func_enter_; _init_workitem(&pwrctrlpriv->cpwm_event, cpwm_event_callback, NULL); + _init_workitem(&pwrctrlpriv->dma_event, dma_event_callback, NULL); + #ifdef CONFIG_LPS_RPWM_TIMER pwrctrlpriv->brpwmtimeout = _FALSE; _init_workitem(&pwrctrlpriv->rpwmtimeoutwi, rpwmtimeout_workitem_callback, NULL); _init_timer(&pwrctrlpriv->pwr_rpwm_timer, padapter->pnetdev, pwr_rpwm_timeout_handler, padapter); -#endif // CONFIG_LPS_RPWM_TIMER -#endif // CONFIG_LPS_LCLK +#endif /* CONFIG_LPS_RPWM_TIMER */ +#endif /* CONFIG_LPS_LCLK */ rtw_init_timer(&pwrctrlpriv->pwr_state_check_timer, padapter, pwr_state_check_handler); pwrctrlpriv->wowlan_mode = _FALSE; pwrctrlpriv->wowlan_ap_mode = _FALSE; pwrctrlpriv->wowlan_p2p_mode = _FALSE; + pwrctrlpriv->wowlan_last_wake_reason = 0; - #ifdef CONFIG_RESUME_IN_WORKQUEUE +#ifdef CONFIG_RESUME_IN_WORKQUEUE _init_workitem(&pwrctrlpriv->resume_work, resume_workitem_callback, NULL); pwrctrlpriv->rtw_workqueue = create_singlethread_workqueue("rtw_workqueue"); - #endif //CONFIG_RESUME_IN_WORKQUEUE +#endif /* CONFIG_RESUME_IN_WORKQUEUE */ - #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) +#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) pwrctrlpriv->early_suspend.suspend = NULL; rtw_register_early_suspend(pwrctrlpriv); - #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER +#endif /* CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER */ #ifdef CONFIG_GPIO_WAKEUP /*default low active*/ pwrctrlpriv->is_high_active = HIGH_ACTIVE; val8 = (pwrctrlpriv->is_high_active == 0) ? 1 : 0; + rtw_hal_switch_gpio_wl_ctrl(padapter, WAKEUP_GPIO_IDX, _TRUE); rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, val8); - DBG_871X("%s: set GPIO_%d %d as default.\n", + RTW_INFO("%s: set GPIO_%d %d as default.\n", __func__, WAKEUP_GPIO_IDX, val8); #endif /* CONFIG_GPIO_WAKEUP */ #ifdef CONFIG_WOWLAN - pwrctrlpriv->wowlan_pattern_idx = 0; - for (i = 0 ; i < MAX_WKFM_NUM; i++) { - _rtw_memset(pwrctrlpriv->patterns[i].content, '\0', - sizeof(pwrctrlpriv->patterns[i].content)); - _rtw_memset(pwrctrlpriv->patterns[i].mask, '\0', - sizeof(pwrctrlpriv->patterns[i].mask)); - pwrctrlpriv->patterns[i].len = 0; - } + rtw_wow_pattern_sw_reset(padapter); #ifdef CONFIG_PNO_SUPPORT pwrctrlpriv->pno_inited = _FALSE; @@ -2209,9 +2005,16 @@ _func_enter_; pwrctrlpriv->pno_ssid_list = NULL; pwrctrlpriv->pno_in_resume = _TRUE; #endif /* CONFIG_PNO_SUPPORT */ +#ifdef CONFIG_WOW_PATTERN_HW_CAM + _rtw_mutex_init(&pwrctrlpriv->wowlan_pattern_cam_mutex); + pwrctrlpriv->wowlan_aoac_rpt_loc = 0; +#endif #endif /* CONFIG_WOWLAN */ -_func_exit_; +#ifdef CONFIG_LPS_POFF + rtw_hal_set_hwreg(padapter, HW_VAR_LPS_POFF_INIT, 0); +#endif + } @@ -2223,19 +2026,22 @@ void rtw_free_pwrctrl_priv(PADAPTER adapter) #if defined(CONFIG_CONCURRENT_MODE) if (adapter->adapter_type != PRIMARY_ADAPTER) return; -#endif - -_func_enter_; - - //_rtw_memset((unsigned char *)pwrctrlpriv, 0, sizeof(struct pwrctrl_priv)); +#endif - #ifdef CONFIG_RESUME_IN_WORKQUEUE - if (pwrctrlpriv->rtw_workqueue) { + /* _rtw_memset((unsigned char *)pwrctrlpriv, 0, sizeof(struct pwrctrl_priv)); */ + + +#ifdef CONFIG_RESUME_IN_WORKQUEUE + if (pwrctrlpriv->rtw_workqueue) { flush_workqueue(pwrctrlpriv->rtw_workqueue); destroy_workqueue(pwrctrlpriv->rtw_workqueue); } - #endif +#endif + +#ifdef CONFIG_LPS_POFF + rtw_hal_set_hwreg(adapter, HW_VAR_LPS_POFF_DEINIT, 0); +#endif #ifdef CONFIG_WOWLAN #ifdef CONFIG_PNO_SUPPORT @@ -2248,16 +2054,19 @@ _func_enter_; if (pwrctrlpriv->pno_ssid_list != NULL) printk("****** pno_ssid_list memory leak********\n"); #endif +#ifdef CONFIG_WOW_PATTERN_HW_CAM + _rtw_mutex_free(&pwrctrlpriv->wowlan_pattern_cam_mutex); +#endif + #endif /* CONFIG_WOWLAN */ - #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) +#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) rtw_unregister_early_suspend(pwrctrlpriv); - #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER +#endif /* CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER */ _free_pwrlock(&pwrctrlpriv->lock); _free_pwrlock(&pwrctrlpriv->check_32k_lock); -_func_exit_; } #ifdef CONFIG_RESUME_IN_WORKQUEUE @@ -2267,9 +2076,9 @@ static void resume_workitem_callback(struct work_struct *work) { struct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, resume_work); struct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv); - _adapter *adapter = dvobj->padapters[IFACE_ID0]; + _adapter *adapter = dvobj_get_primary_adapter(dvobj); - DBG_871X("%s\n",__FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); rtw_resume_process(adapter); @@ -2278,18 +2087,18 @@ static void resume_workitem_callback(struct work_struct *work) void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv) { - // accquire system's suspend lock preventing from falliing asleep while resume in workqueue - //rtw_lock_suspend(); + /* accquire system's suspend lock preventing from falliing asleep while resume in workqueue */ + /* rtw_lock_suspend(); */ rtw_resume_lock_suspend(); - - #if 1 - queue_work(pwrpriv->rtw_workqueue, &pwrpriv->resume_work); - #else + +#if 1 + queue_work(pwrpriv->rtw_workqueue, &pwrpriv->resume_work); +#else _set_workitem(&pwrpriv->resume_work); - #endif +#endif } -#endif //CONFIG_RESUME_IN_WORKQUEUE +#endif /* CONFIG_RESUME_IN_WORKQUEUE */ #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) inline bool rtw_is_earlysuspend_registered(struct pwrctrl_priv *pwrpriv) @@ -2313,7 +2122,7 @@ extern int rtw_resume_process(_adapter *padapter); static void rtw_early_suspend(struct early_suspend *h) { struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); - DBG_871X("%s\n",__FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); rtw_set_do_late_resume(pwrpriv, _FALSE); } @@ -2322,11 +2131,11 @@ static void rtw_late_resume(struct early_suspend *h) { struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); struct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv); - _adapter *adapter = dvobj->padapters[IFACE_ID0]; + _adapter *adapter = dvobj_get_primary_adapter(dvobj); - DBG_871X("%s\n",__FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); - if(pwrpriv->do_late_resume) { + if (pwrpriv->do_late_resume) { rtw_set_do_late_resume(pwrpriv, _FALSE); rtw_resume_process(adapter); } @@ -2334,39 +2143,39 @@ static void rtw_late_resume(struct early_suspend *h) void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv) { - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); - //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit + /* jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit */ pwrpriv->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20; pwrpriv->early_suspend.suspend = rtw_early_suspend; pwrpriv->early_suspend.resume = rtw_late_resume; - register_early_suspend(&pwrpriv->early_suspend); + register_early_suspend(&pwrpriv->early_suspend); + - } void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv) { - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); rtw_set_do_late_resume(pwrpriv, _FALSE); - if (pwrpriv->early_suspend.suspend) + if (pwrpriv->early_suspend.suspend) unregister_early_suspend(&pwrpriv->early_suspend); pwrpriv->early_suspend.suspend = NULL; pwrpriv->early_suspend.resume = NULL; } -#endif //CONFIG_HAS_EARLYSUSPEND +#endif /* CONFIG_HAS_EARLYSUSPEND */ #ifdef CONFIG_ANDROID_POWER #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) -extern int rtw_resume_process(PADAPTER padapter); + extern int rtw_resume_process(PADAPTER padapter); #endif static void rtw_early_suspend(android_early_suspend_t *h) { struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); - DBG_871X("%s\n",__FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); rtw_set_do_late_resume(pwrpriv, _FALSE); } @@ -2375,47 +2184,47 @@ static void rtw_late_resume(android_early_suspend_t *h) { struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); struct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv); - _adapter *adapter = dvobj->padapters[IFACE_ID0]; + _adapter *adapter = dvobj_get_primary_adapter(dvobj); - DBG_871X("%s\n",__FUNCTION__); - if(pwrpriv->do_late_resume) { - #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + RTW_INFO("%s\n", __FUNCTION__); + if (pwrpriv->do_late_resume) { +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) rtw_set_do_late_resume(pwrpriv, _FALSE); rtw_resume_process(adapter); - #endif +#endif } } void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv) { - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); - //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit + /* jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit */ pwrpriv->early_suspend.level = ANDROID_EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20; pwrpriv->early_suspend.suspend = rtw_early_suspend; pwrpriv->early_suspend.resume = rtw_late_resume; - android_register_early_suspend(&pwrpriv->early_suspend); + android_register_early_suspend(&pwrpriv->early_suspend); } void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv) { - DBG_871X("%s\n", __FUNCTION__); + RTW_INFO("%s\n", __FUNCTION__); rtw_set_do_late_resume(pwrpriv, _FALSE); - if (pwrpriv->early_suspend.suspend) + if (pwrpriv->early_suspend.suspend) android_unregister_early_suspend(&pwrpriv->early_suspend); pwrpriv->early_suspend.suspend = NULL; pwrpriv->early_suspend.resume = NULL; } -#endif //CONFIG_ANDROID_POWER +#endif /* CONFIG_ANDROID_POWER */ -u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val) +u8 rtw_interface_ps_func(_adapter *padapter, HAL_INTF_PS_FUNC efunc_id, u8 *val) { u8 bResult = _TRUE; - rtw_hal_intf_ps_func(padapter,efunc_id,val); - + rtw_hal_intf_ps_func(padapter, efunc_id, val); + return bResult; } @@ -2454,108 +2263,97 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller) if (pwrpriv->ps_processing) { - DBG_871X("%s wait ps_processing...\n", __func__); + RTW_INFO("%s wait ps_processing...\n", __func__); while (pwrpriv->ps_processing && rtw_get_passing_time_ms(start) <= 3000) rtw_msleep_os(10); if (pwrpriv->ps_processing) - DBG_871X("%s wait ps_processing timeout\n", __func__); + RTW_INFO("%s wait ps_processing timeout\n", __func__); else - DBG_871X("%s wait ps_processing done\n", __func__); + RTW_INFO("%s wait ps_processing done\n", __func__); } #ifdef DBG_CONFIG_ERROR_DETECT if (rtw_hal_sreset_inprogress(padapter)) { - DBG_871X("%s wait sreset_inprogress...\n", __func__); + RTW_INFO("%s wait sreset_inprogress...\n", __func__); while (rtw_hal_sreset_inprogress(padapter) && rtw_get_passing_time_ms(start) <= 4000) rtw_msleep_os(10); if (rtw_hal_sreset_inprogress(padapter)) - DBG_871X("%s wait sreset_inprogress timeout\n", __func__); + RTW_INFO("%s wait sreset_inprogress timeout\n", __func__); else - DBG_871X("%s wait sreset_inprogress done\n", __func__); + RTW_INFO("%s wait sreset_inprogress done\n", __func__); } #endif if (pwrpriv->bInternalAutoSuspend == _FALSE && pwrpriv->bInSuspend) { - DBG_871X("%s wait bInSuspend...\n", __func__); - while (pwrpriv->bInSuspend - && ((rtw_get_passing_time_ms(start) <= 3000 && !rtw_is_do_late_resume(pwrpriv)) - || (rtw_get_passing_time_ms(start) <= 500 && rtw_is_do_late_resume(pwrpriv))) - ) { + RTW_INFO("%s wait bInSuspend...\n", __func__); + while (pwrpriv->bInSuspend + && ((rtw_get_passing_time_ms(start) <= 3000 && !rtw_is_do_late_resume(pwrpriv)) + || (rtw_get_passing_time_ms(start) <= 500 && rtw_is_do_late_resume(pwrpriv))) + ) rtw_msleep_os(10); - } if (pwrpriv->bInSuspend) - DBG_871X("%s wait bInSuspend timeout\n", __func__); + RTW_INFO("%s wait bInSuspend timeout\n", __func__); else - DBG_871X("%s wait bInSuspend done\n", __func__); + RTW_INFO("%s wait bInSuspend done\n", __func__); } - //System suspend is not allowed to wakeup - if((pwrpriv->bInternalAutoSuspend == _FALSE) && (_TRUE == pwrpriv->bInSuspend )){ + /* System suspend is not allowed to wakeup */ + if ((pwrpriv->bInternalAutoSuspend == _FALSE) && (_TRUE == pwrpriv->bInSuspend)) { ret = _FAIL; goto exit; } - //block??? - if((pwrpriv->bInternalAutoSuspend == _TRUE) && (padapter->net_closed == _TRUE)) { + /* block??? */ + if ((pwrpriv->bInternalAutoSuspend == _TRUE) && (padapter->net_closed == _TRUE)) { ret = _FAIL; goto exit; } - //I think this should be check in IPS, LPS, autosuspend functions... - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { -#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) - if(_TRUE==pwrpriv->bInternalAutoSuspend){ - if(0==pwrpriv->autopm_cnt){ - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33)) - if (usb_autopm_get_interface(adapter_to_dvobj(padapter)->pusbintf) < 0) - { - DBG_871X( "can't get autopm: \n"); - } - #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20)) + /* I think this should be check in IPS, LPS, autosuspend functions... */ + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { +#if defined(CONFIG_BT_COEXIST) && defined (CONFIG_AUTOSUSPEND) + if (_TRUE == pwrpriv->bInternalAutoSuspend) { + if (0 == pwrpriv->autopm_cnt) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)) + if (usb_autopm_get_interface(adapter_to_dvobj(padapter)->pusbintf) < 0) + RTW_INFO("can't get autopm:\n"); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)) usb_autopm_disable(adapter_to_dvobj(padapter)->pusbintf); - #else +#else usb_autoresume_device(adapter_to_dvobj(padapter)->pusbdev, 1); - #endif - pwrpriv->autopm_cnt++; +#endif + pwrpriv->autopm_cnt++; } -#endif //#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) - ret = _SUCCESS; - goto exit; -#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) +#endif /* #if defined (CONFIG_BT_COEXIST) && defined (CONFIG_AUTOSUSPEND) */ + ret = _SUCCESS; + goto exit; +#if defined(CONFIG_BT_COEXIST) && defined (CONFIG_AUTOSUSPEND) } -#endif //#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND) - } +#endif /* #if defined (CONFIG_BT_COEXIST) && defined (CONFIG_AUTOSUSPEND) */ + } - if(rf_off == pwrpriv->rf_pwrstate ) - { + if (rf_off == pwrpriv->rf_pwrstate) { #ifdef CONFIG_USB_HCI #ifdef CONFIG_AUTOSUSPEND - if(pwrpriv->brfoffbyhw==_TRUE) - { - DBG_8192C("hw still in rf_off state ...........\n"); + if (pwrpriv->brfoffbyhw == _TRUE) { + RTW_INFO("hw still in rf_off state ...........\n"); ret = _FAIL; goto exit; - } - else if(padapter->registrypriv.usbss_enable) - { - DBG_8192C("%s call autoresume_enter....\n",__FUNCTION__); - if(_FAIL == autoresume_enter(padapter)) - { - DBG_8192C("======> autoresume fail.............\n"); + } else if (padapter->registrypriv.usbss_enable) { + RTW_INFO("%s call autoresume_enter....\n", __FUNCTION__); + if (_FAIL == autoresume_enter(padapter)) { + RTW_INFO("======> autoresume fail.............\n"); ret = _FAIL; goto exit; - } - } - else + } + } else #endif #endif { #ifdef CONFIG_IPS - DBG_8192C("%s call ips_leave....\n",__FUNCTION__); - if(_FAIL == ips_leave(padapter)) - { - DBG_8192C("======> ips_leave fail.............\n"); + RTW_INFO("%s call ips_leave....\n", __FUNCTION__); + if (_FAIL == ips_leave(padapter)) { + RTW_INFO("======> ips_leave fail.............\n"); ret = _FAIL; goto exit; } @@ -2563,17 +2361,17 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller) } } - //TODO: the following checking need to be merged... + /* TODO: the following checking need to be merged... */ if (rtw_is_drv_stopped(padapter) - || !padapter->bup - || !rtw_is_hw_init_completed(padapter) - ) { - DBG_8192C("%s: bDriverStopped=%s, bup=%d, hw_init_completed=%u\n" - , caller - , rtw_is_drv_stopped(padapter)?"True":"False" - , padapter->bup - , rtw_get_hw_init_completed(padapter)); - ret= _FALSE; + || !padapter->bup + || !rtw_is_hw_init_completed(padapter) + ) { + RTW_INFO("%s: bDriverStopped=%s, bup=%d, hw_init_completed=%u\n" + , caller + , rtw_is_drv_stopped(padapter) ? "True" : "False" + , padapter->bup + , rtw_get_hw_init_completed(padapter)); + ret = _FALSE; goto exit; } @@ -2586,29 +2384,20 @@ exit: int rtw_pm_set_lps(_adapter *padapter, u8 mode) { - int ret = 0; + int ret = 0; struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); - - if ( mode < PS_MODE_NUM ) - { - if(pwrctrlpriv->power_mgnt !=mode) - { - if(PS_MODE_ACTIVE == mode) - { + + if (mode < PS_MODE_NUM) { + if (pwrctrlpriv->power_mgnt != mode) { + if (PS_MODE_ACTIVE == mode) LeaveAllPowerSaveMode(padapter); - } else - { pwrctrlpriv->LpsIdleCount = 2; - } pwrctrlpriv->power_mgnt = mode; - pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?_TRUE:_FALSE; + pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt) ? _TRUE : _FALSE; } - } - else - { + } else ret = -EINVAL; - } return ret; } @@ -2617,20 +2406,17 @@ int rtw_pm_set_ips(_adapter *padapter, u8 mode) { struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); - if( mode == IPS_NORMAL || mode == IPS_LEVEL_2 ) { + if (mode == IPS_NORMAL || mode == IPS_LEVEL_2) { rtw_ips_mode_req(pwrctrlpriv, mode); - DBG_871X("%s %s\n", __FUNCTION__, mode == IPS_NORMAL?"IPS_NORMAL":"IPS_LEVEL_2"); + RTW_INFO("%s %s\n", __FUNCTION__, mode == IPS_NORMAL ? "IPS_NORMAL" : "IPS_LEVEL_2"); return 0; - } - else if(mode ==IPS_NONE){ + } else if (mode == IPS_NONE) { rtw_ips_mode_req(pwrctrlpriv, mode); - DBG_871X("%s %s\n", __FUNCTION__, "IPS_NONE"); + RTW_INFO("%s %s\n", __FUNCTION__, "IPS_NONE"); if (!rtw_is_surprise_removed(padapter) && (_FAIL == rtw_pwr_wakeup(padapter))) return -EFAULT; - } - else { + } else return -EINVAL; - } return 0; } @@ -2644,22 +2430,21 @@ void rtw_ps_deny(PADAPTER padapter, PS_DENY_REASON reason) s32 ret; -// DBG_871X("+" FUNC_ADPT_FMT ": Request PS deny for %d (0x%08X)\n", -// FUNC_ADPT_ARG(padapter), reason, BIT(reason)); + /* RTW_INFO("+" FUNC_ADPT_FMT ": Request PS deny for %d (0x%08X)\n", + * FUNC_ADPT_ARG(padapter), reason, BIT(reason)); */ pwrpriv = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrpriv->lock); - if (pwrpriv->ps_deny & BIT(reason)) - { - DBG_871X(FUNC_ADPT_FMT ": [WARNING] Reason %d had been set before!!\n", - FUNC_ADPT_ARG(padapter), reason); + if (pwrpriv->ps_deny & BIT(reason)) { + RTW_INFO(FUNC_ADPT_FMT ": [WARNING] Reason %d had been set before!!\n", + FUNC_ADPT_ARG(padapter), reason); } pwrpriv->ps_deny |= BIT(reason); _exit_pwrlock(&pwrpriv->lock); -// DBG_871X("-" FUNC_ADPT_FMT ": Now PS deny for 0x%08X\n", -// FUNC_ADPT_ARG(padapter), pwrpriv->ps_deny); + /* RTW_INFO("-" FUNC_ADPT_FMT ": Now PS deny for 0x%08X\n", + * FUNC_ADPT_ARG(padapter), pwrpriv->ps_deny); */ } /* @@ -2671,22 +2456,21 @@ void rtw_ps_deny_cancel(PADAPTER padapter, PS_DENY_REASON reason) struct pwrctrl_priv *pwrpriv; -// DBG_871X("+" FUNC_ADPT_FMT ": Cancel PS deny for %d(0x%08X)\n", -// FUNC_ADPT_ARG(padapter), reason, BIT(reason)); + /* RTW_INFO("+" FUNC_ADPT_FMT ": Cancel PS deny for %d(0x%08X)\n", + * FUNC_ADPT_ARG(padapter), reason, BIT(reason)); */ pwrpriv = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrpriv->lock); - if ((pwrpriv->ps_deny & BIT(reason)) == 0) - { - DBG_871X(FUNC_ADPT_FMT ": [ERROR] Reason %d had been canceled before!!\n", - FUNC_ADPT_ARG(padapter), reason); + if ((pwrpriv->ps_deny & BIT(reason)) == 0) { + RTW_INFO(FUNC_ADPT_FMT ": [ERROR] Reason %d had been canceled before!!\n", + FUNC_ADPT_ARG(padapter), reason); } pwrpriv->ps_deny &= ~BIT(reason); _exit_pwrlock(&pwrpriv->lock); -// DBG_871X("-" FUNC_ADPT_FMT ": Now PS deny for 0x%08X\n", -// FUNC_ADPT_ARG(padapter), pwrpriv->ps_deny); + /* RTW_INFO("-" FUNC_ADPT_FMT ": Now PS deny for 0x%08X\n", + * FUNC_ADPT_ARG(padapter), pwrpriv->ps_deny); */ } /* @@ -2703,4 +2487,3 @@ u32 rtw_ps_deny_get(PADAPTER padapter) return deny; } - diff --git a/core/rtw_recv.c b/core/rtw_recv.c index 78e8955..ad9c8fa 100755 --- a/core/rtw_recv.c +++ b/core/rtw_recv.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -22,9 +22,9 @@ #include #include -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) +#if defined(PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) -#error "Shall be Linux or Windows, but not both!\n" + #error "Shall be Linux or Windows, but not both!\n" #endif @@ -43,28 +43,26 @@ u8 signal_stat_calc_profile[SIGNAL_STAT_CALC_PROFILE_MAX][2] = { {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_1 +#ifndef RTW_SIGNAL_STATE_CALC_PROFILE + #define RTW_SIGNAL_STATE_CALC_PROFILE SIGNAL_STAT_CALC_PROFILE_1 #endif -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS +#endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */ void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv) { -_func_enter_; - _rtw_memset((u8 *)psta_recvpriv, 0, sizeof (struct sta_recv_priv)); + _rtw_memset((u8 *)psta_recvpriv, 0, sizeof(struct sta_recv_priv)); _rtw_spinlock_init(&psta_recvpriv->lock); - //for(i=0; iblk_strms[i]); + /* for(i=0; iblk_strms[i]); */ _rtw_init_queue(&psta_recvpriv->defrag_q); -_func_exit_; } @@ -73,13 +71,11 @@ sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter) sint i; union recv_frame *precvframe; + sint res = _SUCCESS; - sint res=_SUCCESS; -_func_enter_; - - // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). - //_rtw_memset((unsigned char *)precvpriv, 0, sizeof (struct recv_priv)); + /* We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */ + /* _rtw_memset((unsigned char *)precvpriv, 0, sizeof (struct recv_priv)); */ _rtw_spinlock_init(&precvpriv->lock); @@ -95,25 +91,30 @@ _func_enter_; precvpriv->pre_rtp_rxseq = 0; precvpriv->cur_rtp_rxseq = 0; +#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA + precvpriv->store_law_data_flag = 1; +#else + precvpriv->store_law_data_flag = 0; +#endif + rtw_os_recv_resource_init(precvpriv, padapter); precvpriv->pallocated_frame_buf = rtw_zvmalloc(NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); - - if(precvpriv->pallocated_frame_buf==NULL){ - res= _FAIL; + + if (precvpriv->pallocated_frame_buf == NULL) { + res = _FAIL; goto exit; } - //_rtw_memset(precvpriv->pallocated_frame_buf, 0, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); + /* _rtw_memset(precvpriv->pallocated_frame_buf, 0, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); */ precvpriv->precv_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ); - //precvpriv->precv_frame_buf = precvpriv->pallocated_frame_buf + RXFRAME_ALIGN_SZ - - // ((SIZE_PTR) (precvpriv->pallocated_frame_buf) &(RXFRAME_ALIGN_SZ-1)); + /* precvpriv->precv_frame_buf = precvpriv->pallocated_frame_buf + RXFRAME_ALIGN_SZ - */ + /* ((SIZE_PTR) (precvpriv->pallocated_frame_buf) &(RXFRAME_ALIGN_SZ-1)); */ - precvframe = (union recv_frame*) precvpriv->precv_frame_buf; + precvframe = (union recv_frame *) precvpriv->precv_frame_buf; - for(i=0; i < NR_RECVFRAME ; i++) - { + for (i = 0; i < NR_RECVFRAME ; i++) { _rtw_init_listhead(&(precvframe->u.list)); rtw_list_insert_tail(&(precvframe->u.list), &(precvpriv->free_recv_queue.queue)); @@ -122,7 +123,7 @@ _func_enter_; precvframe->u.hdr.len = 0; - precvframe->u.hdr.adapter =padapter; + precvframe->u.hdr.adapter = padapter; precvframe++; } @@ -140,15 +141,14 @@ _func_enter_; #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS rtw_init_timer(&precvpriv->signal_stat_timer, padapter, RTW_TIMER_HDL_NAME(signal_stat)); - precvpriv->signal_stat_sampling_interval = 2000; //ms - //precvpriv->signal_stat_converging_constant = 5000; //ms + precvpriv->signal_stat_sampling_interval = 2000; /* ms */ + /* precvpriv->signal_stat_converging_constant = 5000; */ /* ms */ rtw_set_signal_stat_timer(precvpriv); -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS +#endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */ exit: -_func_exit_; return res; @@ -158,7 +158,7 @@ void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv); void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv) { _rtw_spinlock_free(&precvpriv->lock); -#ifdef CONFIG_RECV_THREAD_MODE +#ifdef CONFIG_RECV_THREAD_MODE _rtw_free_sema(&precvpriv->recv_sema); _rtw_free_sema(&precvpriv->terminate_recvthread_sema); #endif @@ -170,14 +170,13 @@ void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv) #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX _rtw_spinlock_free(&precvpriv->recv_buf_pending_queue.lock); -#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX +#endif /* CONFIG_USE_USB_BUFFER_ALLOC_RX */ } -void _rtw_free_recv_priv (struct recv_priv *precvpriv) +void _rtw_free_recv_priv(struct recv_priv *precvpriv) { _adapter *padapter = precvpriv->adapter; -_func_enter_; rtw_free_uc_swdec_pending_queue(padapter); @@ -185,31 +184,38 @@ _func_enter_; rtw_os_recv_resource_free(precvpriv); - if(precvpriv->pallocated_frame_buf) { + if (precvpriv->pallocated_frame_buf) rtw_vmfree(precvpriv->pallocated_frame_buf, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); - } rtw_hal_free_recv_priv(padapter); -_func_exit_; } -union recv_frame *_rtw_alloc_recvframe (_queue *pfree_recv_queue) +bool rtw_rframe_del_wfd_ie(union recv_frame *rframe, u8 ies_offset) +{ +#define DBG_RFRAME_DEL_WFD_IE 0 + u8 *ies = rframe->u.hdr.rx_data + sizeof(struct rtw_ieee80211_hdr_3addr) + ies_offset; + uint ies_len_ori = rframe->u.hdr.len - (ies - rframe->u.hdr.rx_data); + uint ies_len; + + ies_len = rtw_del_wfd_ie(ies, ies_len_ori, DBG_RFRAME_DEL_WFD_IE ? __func__ : NULL); + rframe->u.hdr.len -= ies_len_ori - ies_len; + + return ies_len_ori != ies_len; +} + +union recv_frame *_rtw_alloc_recvframe(_queue *pfree_recv_queue) { union recv_frame *precvframe; _list *plist, *phead; _adapter *padapter; struct recv_priv *precvpriv; -_func_enter_; - if(_rtw_queue_empty(pfree_recv_queue) == _TRUE) - { + if (_rtw_queue_empty(pfree_recv_queue) == _TRUE) precvframe = NULL; - } - else - { + else { phead = get_list_head(pfree_recv_queue); plist = get_next(phead); @@ -217,25 +223,24 @@ _func_enter_; precvframe = LIST_CONTAINOR(plist, union recv_frame, u); rtw_list_delete(&precvframe->u.hdr.list); - padapter=precvframe->u.hdr.adapter; - if(padapter !=NULL){ - precvpriv=&padapter->recvpriv; - if(pfree_recv_queue == &precvpriv->free_recv_queue) + padapter = precvframe->u.hdr.adapter; + if (padapter != NULL) { + precvpriv = &padapter->recvpriv; + if (pfree_recv_queue == &precvpriv->free_recv_queue) precvpriv->free_recvframe_cnt--; } } -_func_exit_; return precvframe; } -union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue) +union recv_frame *rtw_alloc_recvframe(_queue *pfree_recv_queue) { _irqL irqL; union recv_frame *precvframe; - + _enter_critical_bh(&pfree_recv_queue->lock, &irqL); precvframe = _rtw_alloc_recvframe(pfree_recv_queue); @@ -250,27 +255,24 @@ void rtw_init_recvframe(union recv_frame *precvframe, struct recv_priv *precvpri /* Perry: This can be removed */ _rtw_init_listhead(&precvframe->u.hdr.list); - precvframe->u.hdr.len=0; + precvframe->u.hdr.len = 0; } int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue) { _irqL irqL; - _adapter *padapter=precvframe->u.hdr.adapter; + _adapter *padapter = precvframe->u.hdr.adapter; struct recv_priv *precvpriv = &padapter->recvpriv; -_func_enter_; #ifdef CONFIG_CONCURRENT_MODE - if(padapter->adapter_type > PRIMARY_ADAPTER) - { - padapter = padapter->pbuddy_adapter;//get primary_padapter - precvpriv = &padapter->recvpriv; - pfree_recv_queue = &precvpriv->free_recv_queue; - precvframe->u.hdr.adapter = padapter; - } + padapter = GET_PRIMARY_ADAPTER(padapter); + precvpriv = &padapter->recvpriv; + pfree_recv_queue = &precvpriv->free_recv_queue; + precvframe->u.hdr.adapter = padapter; #endif + rtw_os_free_recvframe(precvframe); @@ -282,14 +284,13 @@ _func_enter_; rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(pfree_recv_queue)); - if(padapter !=NULL){ - if(pfree_recv_queue == &precvpriv->free_recv_queue) - precvpriv->free_recvframe_cnt++; + if (padapter != NULL) { + if (pfree_recv_queue == &precvpriv->free_recv_queue) + precvpriv->free_recvframe_cnt++; } - _exit_critical_bh(&pfree_recv_queue->lock, &irqL); + _exit_critical_bh(&pfree_recv_queue->lock, &irqL); -_func_exit_; return _SUCCESS; @@ -301,12 +302,11 @@ _func_exit_; sint _rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue) { - _adapter *padapter=precvframe->u.hdr.adapter; + _adapter *padapter = precvframe->u.hdr.adapter; struct recv_priv *precvpriv = &padapter->recvpriv; -_func_enter_; - //_rtw_init_listhead(&(precvframe->u.hdr.list)); + /* _rtw_init_listhead(&(precvframe->u.hdr.list)); */ rtw_list_delete(&(precvframe->u.hdr.list)); @@ -317,7 +317,6 @@ _func_enter_; precvpriv->free_recvframe_cnt++; } -_func_exit_; return _SUCCESS; } @@ -326,11 +325,11 @@ sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue) { sint ret; _irqL irqL; - - //_spinlock(&pfree_recv_queue->lock); + + /* _spinlock(&pfree_recv_queue->lock); */ _enter_critical_bh(&queue->lock, &irqL); ret = _rtw_enqueue_recvframe(precvframe, queue); - //_rtw_spinunlock(&pfree_recv_queue->lock); + /* _rtw_spinunlock(&pfree_recv_queue->lock); */ _exit_critical_bh(&queue->lock, &irqL); return ret; @@ -356,29 +355,26 @@ using spinlock to protect void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue) { - union recv_frame *precvframe; + union recv_frame *precvframe; _list *plist, *phead; -_func_enter_; _rtw_spinlock(&pframequeue->lock); phead = get_list_head(pframequeue); plist = get_next(phead); - while(rtw_end_of_queue_search(phead, plist) == _FALSE) - { + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { precvframe = LIST_CONTAINOR(plist, union recv_frame, u); plist = get_next(plist); - //rtw_list_delete(&precvframe->u.hdr.list); // will do this in rtw_free_recvframe() + /* rtw_list_delete(&precvframe->u.hdr.list); */ /* will do this in rtw_free_recvframe() */ rtw_free_recvframe(precvframe, pfree_recv_queue); } _rtw_spinunlock(&pframequeue->lock); -_func_exit_; } @@ -386,13 +382,13 @@ u32 rtw_free_uc_swdec_pending_queue(_adapter *adapter) { u32 cnt = 0; union recv_frame *pending_frame; - while((pending_frame=rtw_alloc_recvframe(&adapter->recvpriv.uc_swdec_pending_queue))) { + while ((pending_frame = rtw_alloc_recvframe(&adapter->recvpriv.uc_swdec_pending_queue))) { rtw_free_recvframe(pending_frame, &adapter->recvpriv.free_recv_queue); cnt++; } if (cnt) - DBG_871X(FUNC_ADPT_FMT" dequeue %d\n", FUNC_ADPT_ARG(adapter), cnt); + RTW_INFO(FUNC_ADPT_FMT" dequeue %d\n", FUNC_ADPT_ARG(adapter), cnt); return cnt; } @@ -414,43 +410,40 @@ sint rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, _queue *queue) sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue) { - _irqL irqL; + _irqL irqL; #ifdef CONFIG_SDIO_HCI _enter_critical_bh(&queue->lock, &irqL); #else _enter_critical_ex(&queue->lock, &irqL); -#endif/*#ifdef CONFIG_SDIO_HCI*/ +#endif/*#ifdef CONFIG_SDIO_HCI*/ rtw_list_delete(&precvbuf->list); rtw_list_insert_tail(&precvbuf->list, get_list_head(queue)); -#ifdef CONFIG_SDIO_HCI +#ifdef CONFIG_SDIO_HCI _exit_critical_bh(&queue->lock, &irqL); #else _exit_critical_ex(&queue->lock, &irqL); -#endif/*#ifdef CONFIG_SDIO_HCI*/ +#endif/*#ifdef CONFIG_SDIO_HCI*/ return _SUCCESS; - + } -struct recv_buf *rtw_dequeue_recvbuf (_queue *queue) +struct recv_buf *rtw_dequeue_recvbuf(_queue *queue) { _irqL irqL; struct recv_buf *precvbuf; - _list *plist, *phead; + _list *plist, *phead; #ifdef CONFIG_SDIO_HCI _enter_critical_bh(&queue->lock, &irqL); #else _enter_critical_ex(&queue->lock, &irqL); -#endif/*#ifdef CONFIG_SDIO_HCI*/ - - if(_rtw_queue_empty(queue) == _TRUE) - { +#endif/*#ifdef CONFIG_SDIO_HCI*/ + + if (_rtw_queue_empty(queue) == _TRUE) precvbuf = NULL; - } - else - { + else { phead = get_list_head(queue); plist = get_next(phead); @@ -458,152 +451,107 @@ struct recv_buf *rtw_dequeue_recvbuf (_queue *queue) precvbuf = LIST_CONTAINOR(plist, struct recv_buf, list); rtw_list_delete(&precvbuf->list); - + } #ifdef CONFIG_SDIO_HCI _exit_critical_bh(&queue->lock, &irqL); #else _exit_critical_ex(&queue->lock, &irqL); -#endif/*#ifdef CONFIG_SDIO_HCI*/ +#endif/*#ifdef CONFIG_SDIO_HCI*/ return precvbuf; } sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe); -sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe){ +sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe) +{ - sint i,res=_SUCCESS; + sint i, res = _SUCCESS; u32 datalen; u8 miccode[8]; - u8 bmic_err=_FALSE,brpt_micerror = _TRUE; - u8 *pframe, *payload,*pframemic; + u8 bmic_err = _FALSE, brpt_micerror = _TRUE; + u8 *pframe, *payload, *pframemic; u8 *mickey; - //u8 *iv,rxdata_key_idx=0; + /* u8 *iv,rxdata_key_idx=0; */ struct sta_info *stainfo; - struct rx_pkt_attrib *prxattrib=&precvframe->u.hdr.attrib; - struct security_priv *psecuritypriv=&adapter->securitypriv; + struct rx_pkt_attrib *prxattrib = &precvframe->u.hdr.attrib; + struct security_priv *psecuritypriv = &adapter->securitypriv; struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -_func_enter_; - stainfo=rtw_get_stainfo(&adapter->stapriv ,&prxattrib->ta[0]); + stainfo = rtw_get_stainfo(&adapter->stapriv , &prxattrib->ta[0]); - if(prxattrib->encrypt ==_TKIP_) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:prxattrib->encrypt ==_TKIP_\n")); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:da=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2],prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5])); + if (prxattrib->encrypt == _TKIP_) { - //calculate mic code - if(stainfo!= NULL) - { - if(IS_MCAST(prxattrib->ra)) - { - //mickey=&psecuritypriv->dot118021XGrprxmickey.skey[0]; - //iv = precvframe->u.hdr.rx_data+prxattrib->hdrlen; - //rxdata_key_idx =( ((iv[3])>>6)&0x3) ; - mickey=&psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0]; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic: bcmc key \n")); - //DBG_871X("\n recvframe_chkmic: bcmc key psecuritypriv->dot118021XGrpKeyid(%d),pmlmeinfo->key_index(%d) ,recv key_id(%d)\n", - // psecuritypriv->dot118021XGrpKeyid,pmlmeinfo->key_index,rxdata_key_idx); - - if(psecuritypriv->binstallGrpkey==_FALSE) - { - res=_FAIL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n")); - DBG_871X("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n"); + /* calculate mic code */ + if (stainfo != NULL) { + if (IS_MCAST(prxattrib->ra)) { + /* mickey=&psecuritypriv->dot118021XGrprxmickey.skey[0]; */ + /* iv = precvframe->u.hdr.rx_data+prxattrib->hdrlen; */ + /* rxdata_key_idx =( ((iv[3])>>6)&0x3) ; */ + mickey = &psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0]; + + /* RTW_INFO("\n recvframe_chkmic: bcmc key psecuritypriv->dot118021XGrpKeyid(%d),pmlmeinfo->key_index(%d) ,recv key_id(%d)\n", */ + /* psecuritypriv->dot118021XGrpKeyid,pmlmeinfo->key_index,rxdata_key_idx); */ + + if (psecuritypriv->binstallGrpkey == _FALSE) { + res = _FAIL; + RTW_INFO("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n"); goto exit; } - } - else{ - mickey=&stainfo->dot11tkiprxmickey.skey[0]; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic: unicast key \n")); + } else { + mickey = &stainfo->dot11tkiprxmickey.skey[0]; } - datalen=precvframe->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len-prxattrib->icv_len-8;//icv_len included the mic code - pframe=precvframe->u.hdr.rx_data; - payload=pframe+prxattrib->hdrlen+prxattrib->iv_len; + datalen = precvframe->u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len - prxattrib->icv_len - 8; /* icv_len included the mic code */ + pframe = precvframe->u.hdr.rx_data; + payload = pframe + prxattrib->hdrlen + prxattrib->iv_len; - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n prxattrib->iv_len=%d prxattrib->icv_len=%d\n",prxattrib->iv_len,prxattrib->icv_len)); - //rtw_seccalctkipmic(&stainfo->dot11tkiprxmickey.skey[0],pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data + /* rtw_seccalctkipmic(&stainfo->dot11tkiprxmickey.skey[0],pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); */ /* care the length of the data */ - rtw_seccalctkipmic(mickey,pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data + rtw_seccalctkipmic(mickey, pframe, payload, datalen , &miccode[0], (unsigned char)prxattrib->priority); /* care the length of the data */ - pframemic=payload+datalen; + pframemic = payload + datalen; - bmic_err=_FALSE; + bmic_err = _FALSE; - for(i=0;i<8;i++){ - if(miccode[i] != *(pframemic+i)){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x) ",i,miccode[i],i,*(pframemic+i))); - bmic_err=_TRUE; + for (i = 0; i < 8; i++) { + if (miccode[i] != *(pframemic + i)) { + bmic_err = _TRUE; } } - if(bmic_err==_TRUE){ + if (bmic_err == _TRUE) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-8)-*(pframemic-1)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - *(pframemic-8),*(pframemic-7),*(pframemic-6),*(pframemic-5),*(pframemic-4),*(pframemic-3),*(pframemic-2),*(pframemic-1))); - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-16)-*(pframemic-9)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - *(pframemic-16),*(pframemic-15),*(pframemic-14),*(pframemic-13),*(pframemic-12),*(pframemic-11),*(pframemic-10),*(pframemic-9))); - { - uint i; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet (len=%d)======\n",precvframe->u.hdr.len)); - for(i=0;iu.hdr.len;i=i+8){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x", - *(precvframe->u.hdr.rx_data+i),*(precvframe->u.hdr.rx_data+i+1), - *(precvframe->u.hdr.rx_data+i+2),*(precvframe->u.hdr.rx_data+i+3), - *(precvframe->u.hdr.rx_data+i+4),*(precvframe->u.hdr.rx_data+i+5), - *(precvframe->u.hdr.rx_data+i+6),*(precvframe->u.hdr.rx_data+i+7))); - } - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet end [len=%d]======\n",precvframe->u.hdr.len)); - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n hrdlen=%d, \n",prxattrib->hdrlen)); - } - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ra=0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x psecuritypriv->binstallGrpkey=%d ", - prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2], - prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5],psecuritypriv->binstallGrpkey)); - - // double check key_index for some timing issue , - // cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue - if((IS_MCAST(prxattrib->ra)==_TRUE) && (prxattrib->key_index != pmlmeinfo->key_index )) + /* double check key_index for some timing issue , */ + /* cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue */ + if ((IS_MCAST(prxattrib->ra) == _TRUE) && (prxattrib->key_index != pmlmeinfo->key_index)) brpt_micerror = _FALSE; - - if((prxattrib->bdecrypted ==_TRUE)&& (brpt_micerror == _TRUE)) - { - rtw_handle_tkip_mic_err(adapter, stainfo, (u8)IS_MCAST(prxattrib->ra)); - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" mic error :prxattrib->bdecrypted=%d ",prxattrib->bdecrypted)); - DBG_871X(" mic error :prxattrib->bdecrypted=%d\n",prxattrib->bdecrypted); - } - else - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" mic error :prxattrib->bdecrypted=%d ",prxattrib->bdecrypted)); - DBG_871X(" mic error :prxattrib->bdecrypted=%d\n",prxattrib->bdecrypted); + + if ((prxattrib->bdecrypted == _TRUE) && (brpt_micerror == _TRUE)) { + rtw_handle_tkip_mic_err(adapter, stainfo, (u8)IS_MCAST(prxattrib->ra)); + RTW_INFO(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted); + } else { + RTW_INFO(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted); } - res=_FAIL; + res = _FAIL; - } - else{ - //mic checked ok - if((psecuritypriv->bcheck_grpkey ==_FALSE)&&(IS_MCAST(prxattrib->ra)==_TRUE)){ - psecuritypriv->bcheck_grpkey =_TRUE; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->bcheck_grpkey =_TRUE")); + } else { + /* mic checked ok */ + if ((psecuritypriv->bcheck_grpkey == _FALSE) && (IS_MCAST(prxattrib->ra) == _TRUE)) { + psecuritypriv->bcheck_grpkey = _TRUE; } } } - else - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic: rtw_get_stainfo==NULL!!!\n")); - } recvframe_pull_tail(precvframe, 8); @@ -611,69 +559,70 @@ _func_enter_; exit: -_func_exit_; return res; } -//decrypt and set the ivlen,icvlen of the recv_frame -union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame); -union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame) +/*#define DBG_RX_SW_DECRYPTOR*/ + +/* decrypt and set the ivlen,icvlen of the recv_frame */ +union recv_frame *decryptor(_adapter *padapter, union recv_frame *precv_frame); +union recv_frame *decryptor(_adapter *padapter, union recv_frame *precv_frame) { struct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - union recv_frame *return_packet=precv_frame; - u32 res=_SUCCESS; + struct security_priv *psecuritypriv = &padapter->securitypriv; + union recv_frame *return_packet = precv_frame; + u32 res = _SUCCESS; -_func_enter_; DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("prxstat->decrypted=%x prxattrib->encrypt = 0x%03x\n",prxattrib->bdecrypted,prxattrib->encrypt)); - if(prxattrib->encrypt>0) - { - u8 *iv = precv_frame->u.hdr.rx_data+prxattrib->hdrlen; - prxattrib->key_index = ( ((iv[3])>>6)&0x3) ; + if (prxattrib->encrypt > 0) { + u8 *iv = precv_frame->u.hdr.rx_data + prxattrib->hdrlen; + prxattrib->key_index = (((iv[3]) >> 6) & 0x3) ; - if(prxattrib->key_index > WEP_KEYS) - { - DBG_871X("prxattrib->key_index(%d) > WEP_KEYS \n", prxattrib->key_index); + if (prxattrib->key_index > WEP_KEYS) { + RTW_INFO("prxattrib->key_index(%d) > WEP_KEYS\n", prxattrib->key_index); - switch(prxattrib->encrypt){ - case _WEP40_: - case _WEP104_: - prxattrib->key_index = psecuritypriv->dot11PrivacyKeyIndex; - break; - case _TKIP_: - case _AES_: - default: - prxattrib->key_index = psecuritypriv->dot118021XGrpKeyid; - break; - } - } + switch (prxattrib->encrypt) { + case _WEP40_: + case _WEP104_: + prxattrib->key_index = psecuritypriv->dot11PrivacyKeyIndex; + break; + case _TKIP_: + case _AES_: + default: + prxattrib->key_index = psecuritypriv->dot118021XGrpKeyid; + break; + } + } } - if((prxattrib->encrypt>0) && ((prxattrib->bdecrypted==0) ||(psecuritypriv->sw_decrypt==_TRUE))) - { + if ((prxattrib->encrypt > 0) && ((prxattrib->bdecrypted == 0) || (psecuritypriv->sw_decrypt == _TRUE))) { #ifdef CONFIG_CONCURRENT_MODE - if(!IS_MCAST(prxattrib->ra))//bc/mc packets use sw decryption for concurrent mode -#endif - psecuritypriv->hw_decrypted=_FALSE; + if (!IS_MCAST(prxattrib->ra)) /* bc/mc packets use sw decryption for concurrent mode */ +#endif + psecuritypriv->hw_decrypted = _FALSE; - #ifdef DBG_RX_DECRYPTOR - DBG_871X("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n", - __FUNCTION__, - __LINE__, - prxattrib->bdecrypted, - prxattrib->encrypt, - psecuritypriv->hw_decrypted); - #endif +#ifdef DBG_RX_SW_DECRYPTOR + RTW_INFO(ADPT_FMT" - sec_type:%s DO SW decryption\n", + ADPT_ARG(padapter), security_type_str(prxattrib->encrypt)); +#endif - switch(prxattrib->encrypt){ +#ifdef DBG_RX_DECRYPTOR + RTW_INFO("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n", + __FUNCTION__, + __LINE__, + prxattrib->bdecrypted, + prxattrib->encrypt, + psecuritypriv->hw_decrypted); +#endif + + switch (prxattrib->encrypt) { case _WEP40_: case _WEP104_: DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wep); @@ -685,83 +634,72 @@ _func_enter_; break; case _AES_: DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_aes); - res = rtw_aes_decrypt(padapter, (u8 * )precv_frame); + res = rtw_aes_decrypt(padapter, (u8 *)precv_frame); break; #ifdef CONFIG_WAPI_SUPPORT case _SMS4_: DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wapi); - rtw_sms4_decrypt(padapter, (u8 * )precv_frame); + rtw_sms4_decrypt(padapter, (u8 *)precv_frame); break; #endif default: - break; + break; } - } - else if(prxattrib->bdecrypted==1 - && prxattrib->encrypt >0 - && (psecuritypriv->busetkipkey==1 || prxattrib->encrypt !=_TKIP_ ) - ) - { + } else if (prxattrib->bdecrypted == 1 + && prxattrib->encrypt > 0 + && (psecuritypriv->busetkipkey == 1 || prxattrib->encrypt != _TKIP_) + ) { #if 0 - if((prxstat->icv==1)&&(prxattrib->encrypt!=_AES_)) - { - psecuritypriv->hw_decrypted=_FALSE; + if ((prxstat->icv == 1) && (prxattrib->encrypt != _AES_)) { + psecuritypriv->hw_decrypted = _FALSE; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->hw_decrypted=_FALSE")); rtw_free_recvframe(precv_frame, &padapter->recvpriv.free_recv_queue); - return_packet=NULL; + return_packet = NULL; - } - else + } else #endif { DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_hw); - psecuritypriv->hw_decrypted=_TRUE; - #ifdef DBG_RX_DECRYPTOR - DBG_871X("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n", - __FUNCTION__, - __LINE__, - prxattrib->bdecrypted, - prxattrib->encrypt, - psecuritypriv->hw_decrypted); + psecuritypriv->hw_decrypted = _TRUE; +#ifdef DBG_RX_DECRYPTOR + RTW_INFO("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n", + __FUNCTION__, + __LINE__, + prxattrib->bdecrypted, + prxattrib->encrypt, + psecuritypriv->hw_decrypted); - #endif +#endif } - } - else { + } else { DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_unknown); - #ifdef DBG_RX_DECRYPTOR - DBG_871X("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n", - __FUNCTION__, - __LINE__, - prxattrib->bdecrypted, - prxattrib->encrypt, - psecuritypriv->hw_decrypted); - #endif +#ifdef DBG_RX_DECRYPTOR + RTW_INFO("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n", + __FUNCTION__, + __LINE__, + prxattrib->bdecrypted, + prxattrib->encrypt, + psecuritypriv->hw_decrypted); +#endif } - - if(res == _FAIL) - { - rtw_free_recvframe(return_packet,&padapter->recvpriv.free_recv_queue); - return_packet = NULL; - } - else - { - prxattrib->bdecrypted = _TRUE; - } - //recvframe_chkmic(adapter, precv_frame); //move to recvframme_defrag function -_func_exit_; + if (res == _FAIL) { + rtw_free_recvframe(return_packet, &padapter->recvpriv.free_recv_queue); + return_packet = NULL; + } else + prxattrib->bdecrypted = _TRUE; + /* recvframe_chkmic(adapter, precv_frame); */ /* move to recvframme_defrag function */ + return return_packet; } -//###set the security information in the recv_frame -union recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame); -union recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame) +/* ###set the security information in the recv_frame */ +union recv_frame *portctrl(_adapter *adapter, union recv_frame *precv_frame); +union recv_frame *portctrl(_adapter *adapter, union recv_frame *precv_frame) { u8 *psta_addr = NULL; u8 *ptr; @@ -770,11 +708,10 @@ union recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame) struct sta_info *psta; struct sta_priv *pstapriv ; union recv_frame *prtnframe; - u16 ether_type=0; - u16 eapol_type = 0x888e;//for Funia BD's WPA issue + u16 ether_type = 0; + u16 eapol_type = 0x888e;/* for Funia BD's WPA issue */ struct rx_pkt_attrib *pattrib; -_func_enter_; pstapriv = &adapter->stapriv; @@ -789,65 +726,44 @@ _func_enter_; psta = rtw_get_stainfo(pstapriv, psta_addr); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:adapter->securitypriv.dot11AuthAlgrthm=%d\n",adapter->securitypriv.dot11AuthAlgrthm)); - if(auth_alg==2) - { - if ((psta!=NULL) && (psta->ieee8021x_blocked)) - { - //blocked - //only accept EAPOL frame - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==1\n")); + if (auth_alg == dot11AuthAlgrthm_8021X) { + if ((psta != NULL) && (psta->ieee8021x_blocked)) { + /* blocked */ + /* only accept EAPOL frame */ - prtnframe=precv_frame; + prtnframe = precv_frame; - //get ether_type - ptr=ptr+pfhdr->attrib.hdrlen+pfhdr->attrib.iv_len+LLC_HEADER_SIZE; - _rtw_memcpy(ðer_type,ptr, 2); - ether_type= ntohs((unsigned short )ether_type); + /* get ether_type */ + ptr = ptr + pfhdr->attrib.hdrlen + pfhdr->attrib.iv_len + LLC_HEADER_SIZE; + _rtw_memcpy(ðer_type, ptr, 2); + ether_type = ntohs((unsigned short)ether_type); - if (ether_type == eapol_type) { - prtnframe=precv_frame; - } + if (ether_type == eapol_type) + prtnframe = precv_frame; else { - //free this frame + /* free this frame */ rtw_free_recvframe(precv_frame, &adapter->recvpriv.free_recv_queue); - prtnframe=NULL; + prtnframe = NULL; } + } else { + /* allowed */ + /* check decryption status, and decrypt the frame if needed */ + + + prtnframe = precv_frame; + /* check is the EAPOL frame or not (Rekey) */ + /* if(ether_type == eapol_type){ */ + /* check Rekey */ + + /* prtnframe=precv_frame; */ + /* } */ } - else - { - //allowed - //check decryption status, and decrypt the frame if needed - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==0\n")); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:precv_frame->hdr.attrib.privacy=%x\n",precv_frame->u.hdr.attrib.privacy)); + } else + prtnframe = precv_frame; - if (pattrib->bdecrypted == 0) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:prxstat->decrypted=%x\n", pattrib->bdecrypted)); - } - prtnframe=precv_frame; - //check is the EAPOL frame or not (Rekey) - //if(ether_type == eapol_type){ - // RT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,("########portctrl:ether_type == 0x888e\n")); - //check Rekey - - // prtnframe=precv_frame; - //} - //else{ - // RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:ether_type=0x%04x\n", ether_type)); - //} - } - } - else - { - prtnframe=precv_frame; - } - -_func_exit_; - - return prtnframe; + return prtnframe; } @@ -856,23 +772,17 @@ sint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcac { sint tid = precv_frame->u.hdr.attrib.priority; - u16 seq_ctrl = ( (precv_frame->u.hdr.attrib.seq_num&0xffff) << 4) | - (precv_frame->u.hdr.attrib.frag_num & 0xf); + u16 seq_ctrl = ((precv_frame->u.hdr.attrib.seq_num & 0xffff) << 4) | + (precv_frame->u.hdr.attrib.frag_num & 0xf); -_func_enter_; - if(tid>15) - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, (tid>15)! seq_ctrl=0x%x, tid=0x%x\n", seq_ctrl, tid)); + if (tid > 15) { return _FAIL; } - if(1)//if(bretry) - { - if(seq_ctrl == prxcache->tid_rxseq[tid]) - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, seq_ctrl=0x%x, tid=0x%x, tid_rxseq=0x%x\n", seq_ctrl, tid, prxcache->tid_rxseq[tid])); + if (1) { /* if(bretry) */ + if (seq_ctrl == prxcache->tid_rxseq[tid]) { return _FAIL; } @@ -880,7 +790,6 @@ _func_enter_; prxcache->tid_rxseq[tid] = seq_ctrl; -_func_exit_; return _SUCCESS; @@ -894,36 +803,30 @@ void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame) u8 *ptr = precv_frame->u.hdr.rx_data; struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta=NULL; + struct sta_info *psta = NULL; psta = rtw_get_stainfo(pstapriv, pattrib->src); pwrbit = GetPwrMgt(ptr); - if(psta) - { - if(pwrbit) - { - if(!(psta->state & WIFI_SLEEP_STATE)) - { - //psta->state |= WIFI_SLEEP_STATE; - //pstapriv->sta_dz_bitmap |= BIT(psta->aid); + if (psta) { + if (pwrbit) { + if (!(psta->state & WIFI_SLEEP_STATE)) { + /* psta->state |= WIFI_SLEEP_STATE; */ + /* pstapriv->sta_dz_bitmap |= BIT(psta->aid); */ stop_sta_xmit(padapter, psta); - //DBG_871X("to sleep, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); + /* RTW_INFO("to sleep, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); */ } - } - else - { - if(psta->state & WIFI_SLEEP_STATE) - { - //psta->state ^= WIFI_SLEEP_STATE; - //pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); + } else { + if (psta->state & WIFI_SLEEP_STATE) { + /* psta->state ^= WIFI_SLEEP_STATE; */ + /* pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); */ wakeup_sta_to_xmit(padapter, psta); - //DBG_871X("to wakeup, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); + /* RTW_INFO("to wakeup, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); */ } } @@ -935,80 +838,74 @@ void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame) void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame); void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame) { -#ifdef CONFIG_AP_MODE +#ifdef CONFIG_AP_MODE struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta=NULL; + struct sta_info *psta = NULL; psta = rtw_get_stainfo(pstapriv, pattrib->src); - - if(!psta) return; + + if (!psta) + return; #ifdef CONFIG_TDLS - if( !(psta->tdls_sta_state & TDLS_LINKED_STATE ) ) - { -#endif //CONFIG_TDLS + if (!(psta->tdls_sta_state & TDLS_LINKED_STATE)) { +#endif /* CONFIG_TDLS */ - if(!psta->qos_option) - return; + if (!psta->qos_option) + return; + + if (!(psta->qos_info & 0xf)) + return; - if(!(psta->qos_info&0xf)) - return; - #ifdef CONFIG_TDLS } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ - if(psta->state&WIFI_SLEEP_STATE) - { - u8 wmmps_ac=0; - - switch(pattrib->priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(1); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(1); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(1); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(1); - break; + if (psta->state & WIFI_SLEEP_STATE) { + u8 wmmps_ac = 0; + + switch (pattrib->priority) { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk & BIT(1); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi & BIT(1); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo & BIT(1); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be & BIT(1); + break; } - if(wmmps_ac) - { - if(psta->sleepq_ac_len>0) - { - //process received triggered frame + if (wmmps_ac) { + if (psta->sleepq_ac_len > 0) { + /* process received triggered frame */ xmit_delivery_enabled_frames(padapter, psta); - } - else - { - //issue one qos null frame with More data bit = 0 and the EOSP bit set (=1) + } else { + /* issue one qos null frame with More data bit = 0 and the EOSP bit set (=1) */ issue_qos_nulldata(padapter, psta->hwaddr, (u16)pattrib->priority, 0, 0); } } - + } - -#endif + +#endif } #ifdef CONFIG_TDLS sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame) { - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; sint ret = _SUCCESS; u8 *paction = get_recvframe_data(precv_frame); u8 category_field = 1; @@ -1018,53 +915,59 @@ sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame) struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo); /* point to action field */ - paction+=pattrib->hdrlen - + pattrib->iv_len - + SNAP_SIZE - + ETH_TYPE_LEN - + PAYLOAD_TYPE_LEN - + category_field; + paction += pattrib->hdrlen + + pattrib->iv_len + + SNAP_SIZE + + ETH_TYPE_LEN + + PAYLOAD_TYPE_LEN + + category_field; - if (ptdlsinfo->tdls_enable == _FALSE) { - DBG_871X("recv tdls frame, " - "but tdls haven't enabled\n"); + RTW_INFO("[TDLS] Recv %s from "MAC_FMT" with SeqNum = %d\n", rtw_tdls_action_txt(*paction), MAC_ARG(pattrib->src), GetSequence(get_recvframe_data(precv_frame))); + + if (hal_chk_wl_func(adapter, WL_FUNC_TDLS) == _FALSE) { + RTW_INFO("Ignore tdls frame since hal doesn't support tdls\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){ + if (ptdlsinfo->tdls_enable == _FALSE) { + RTW_INFO("recv tdls frame, " + "but tdls haven't enabled\n"); + ret = _FAIL; + return ret; + } + + switch (*paction) { case TDLS_SETUP_REQUEST: - ret=On_TDLS_Setup_Req(adapter, precv_frame); + ret = On_TDLS_Setup_Req(adapter, precv_frame); break; case TDLS_SETUP_RESPONSE: - ret=On_TDLS_Setup_Rsp(adapter, precv_frame); + ret = On_TDLS_Setup_Rsp(adapter, precv_frame); break; case TDLS_SETUP_CONFIRM: - ret=On_TDLS_Setup_Cfm(adapter, precv_frame); + ret = On_TDLS_Setup_Cfm(adapter, precv_frame); break; case TDLS_TEARDOWN: - ret=On_TDLS_Teardown(adapter, precv_frame); + ret = On_TDLS_Teardown(adapter, precv_frame); break; case TDLS_DISCOVERY_REQUEST: - ret=On_TDLS_Dis_Req(adapter, precv_frame); + ret = On_TDLS_Dis_Req(adapter, precv_frame); break; case TDLS_PEER_TRAFFIC_INDICATION: - ret=On_TDLS_Peer_Traffic_Indication(adapter, precv_frame); + ret = On_TDLS_Peer_Traffic_Indication(adapter, precv_frame); break; case TDLS_PEER_TRAFFIC_RESPONSE: - ret=On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); + ret = On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); break; -#ifdef CONFIG_TDLS_CH_SW +#ifdef CONFIG_TDLS_CH_SW case TDLS_CHANNEL_SWITCH_REQUEST: - ret=On_TDLS_Ch_Switch_Req(adapter, precv_frame); + ret = On_TDLS_Ch_Switch_Req(adapter, precv_frame); break; case TDLS_CHANNEL_SWITCH_RESPONSE: - ret=On_TDLS_Ch_Switch_Rsp(adapter, precv_frame); + ret = On_TDLS_Ch_Switch_Rsp(adapter, precv_frame); break; -#endif -#ifdef CONFIG_WFD +#endif +#ifdef CONFIG_WFD /* First byte of WFA OUI */ case 0x50: if (_rtw_memcmp(WFA_OUI, paction, 3)) { @@ -1072,37 +975,37 @@ sint OnTDLS(_adapter *adapter, union recv_frame *precv_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"); + RTW_INFO("recv tunneled probe request frame\n"); issue_tunneled_probe_rsp(adapter, precv_frame); } - /* Probe response frame */ + /* 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"); + RTW_INFO("recv tunneled probe response frame\n"); } } break; #endif /* CONFIG_WFD */ default: - DBG_871X("receive TDLS frame %d but not support\n", *paction); - ret=_FAIL; + RTW_INFO("receive TDLS frame %d but not support\n", *paction); + ret = _FAIL; break; } exit: return ret; - + } #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) +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) { int sz; struct sta_info *psta = NULL; struct stainfo_stats *pstats = NULL; - struct rx_pkt_attrib *pattrib = & prframe->u.hdr.attrib; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; struct recv_priv *precvpriv = &padapter->recvpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -1112,145 +1015,134 @@ void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_in padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++; - if( (!MacAddr_isBcst(pattrib->dst)) && (!IS_MCAST(pattrib->dst))){ + if ((!MacAddr_isBcst(pattrib->dst)) && (!IS_MCAST(pattrib->dst))) padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++; - } - if(sta) + if (sta) psta = sta; else psta = prframe->u.hdr.psta; - if(psta) - { + if (psta) { pstats = &psta->sta_stats; pstats->rx_data_pkts++; pstats->rx_bytes += sz; - - /*record rx packets for every tid*/ + + /*record rx packets for every tid*/ pstats->rx_data_qos_pkts[pattrib->priority]++; #ifdef CONFIG_TDLS - if(psta->tdls_sta_state & TDLS_LINKED_STATE) - { + if (psta->tdls_sta_state & TDLS_LINKED_STATE) { struct sta_info *pap_sta = NULL; pap_sta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); - if(pap_sta) - { + if (pap_sta) { pstats = &pap_sta->sta_stats; pstats->rx_data_pkts++; pstats->rx_bytes += sz; } } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ } #ifdef CONFIG_CHECK_LEAVE_LPS traffic_check_for_leave_lps(padapter, _FALSE, 0); -#endif //CONFIG_LPS +#endif /* CONFIG_LPS */ } sint sta2sta_data_frame( _adapter *adapter, union recv_frame *precv_frame, - struct sta_info**psta + struct sta_info **psta ); sint sta2sta_data_frame( _adapter *adapter, union recv_frame *precv_frame, - struct sta_info**psta + struct sta_info **psta ) { u8 *ptr = precv_frame->u.hdr.rx_data; sint ret = _SUCCESS; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; u8 *mybssid = get_bssid(pmlmepriv); u8 *myhwaddr = adapter_mac_addr(adapter); - u8 * sta_addr = NULL; + u8 *sta_addr = NULL; sint bmcast = IS_MCAST(pattrib->dst); -#ifdef CONFIG_TDLS +#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 - u8 *pframe_body = psnap_type+2+1; + 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 */ + u8 *pframe_body = psnap_type + 2 + 1; #endif -_func_enter_; - //DBG_871X("[%s] %d, seqnum:%d\n", __FUNCTION__, __LINE__, pattrib->seq_num); + /* RTW_INFO("[%s] %d, seqnum:%d\n", __FUNCTION__, __LINE__, pattrib->seq_num); */ if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) - { + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { - // filter packets that SA is myself or multicast or broadcast - if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); - ret= _FAIL; + /* filter packets that SA is myself or multicast or broadcast */ + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)) { + ret = _FAIL; goto exit; } - if( (!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast) ){ - ret= _FAIL; + if ((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) { + ret = _FAIL; goto exit; } - 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)) ) { - ret= _FAIL; + 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))) { + ret = _FAIL; goto exit; } sta_addr = pattrib->src; - } - else if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { + } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) { #ifdef CONFIG_TDLS /* direct link data transfer */ if (ptdlsinfo->link_established == _TRUE) { ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); if (ptdls_sta == NULL) { - ret=_FAIL; + 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)) { - ret= _FAIL; + ret = _FAIL; goto exit; } /* da should be for me */ if ((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) { - ret= _FAIL; + ret = _FAIL; goto exit; } /* 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))) { - ret= _FAIL; + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN))) { + ret = _FAIL; goto exit; } #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); + if (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) { + if (adapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(adapter)) { pchsw_info->ch_sw_state |= TDLS_PEER_AT_OFF_STATE; + if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)) + _cancel_timer_ex(&ptdls_sta->ch_sw_timer); /* On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); */ } } @@ -1265,73 +1157,62 @@ _func_enter_; 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; + RTW_INFO("TDLS: recv peer null frame with pwr bit 1\n"); + /* ptdls_sta->tdls_sta_state|=TDLS_PEER_SLEEP_STATE; */ } /* TODO: Updated BSSID's seq. */ - //DBG_871X("drop Null Data\n"); + /* RTW_INFO("drop Null Data\n"); */ ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE); - ret= _FAIL; + 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)) { - ret= OnTDLS(adapter, precv_frame); + ret = OnTDLS(adapter, precv_frame); goto exit; } - if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) { + if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) process_wmmps_data(adapter, precv_frame); - } ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE); } sta_addr = pattrib->src; - - } - else + + } else #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) ) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("bssid != TA under STATION_MODE; drop pkt\n")); - ret= _FAIL; + /* 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)) { + ret = _FAIL; goto exit; - } - - sta_addr = pattrib->bssid; - } - - } - else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - if (bmcast) - { - // For AP mode, if DA == MCAST, then BSSID should be also MCAST - if (!IS_MCAST(pattrib->bssid)){ - ret= _FAIL; - goto exit; } + + sta_addr = pattrib->bssid; } - else // not mc-frame - { - // For AP mode, if DA is non-MCAST, then it must be BSSID, and bssid == BSSID - if(!_rtw_memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN)) { - ret= _FAIL; + + } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { + if (bmcast) { + /* For AP mode, if DA == MCAST, then BSSID should be also MCAST */ + if (!IS_MCAST(pattrib->bssid)) { + ret = _FAIL; + goto exit; + } + } else { /* not mc-frame */ + /* For AP mode, if DA is non-MCAST, then it must be BSSID, and bssid == BSSID */ + if (!_rtw_memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN)) { + ret = _FAIL; goto exit; } sta_addr = pattrib->src; } - } - else if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) - { + } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) { _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); @@ -1339,41 +1220,33 @@ _func_enter_; _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); sta_addr = mybssid; - } - else - { + } else ret = _FAIL; - } - if(bmcast) + if (bmcast) *psta = rtw_get_bcmc_stainfo(adapter); else - *psta = rtw_get_stainfo(pstapriv, sta_addr); // get ap_info + *psta = rtw_get_stainfo(pstapriv, sta_addr); /* get ap_info */ #ifdef CONFIG_TDLS - if(ptdls_sta != NULL) - { + if (ptdls_sta != NULL) *psta = ptdls_sta; - } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ if (*psta == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under sta2sta_data_frame ; drop pkt\n")); #ifdef CONFIG_MP_INCLUDED - if (adapter->registrypriv.mp_mode == 1) - { - if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + if (adapter->registrypriv.mp_mode == 1) { + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) adapter->mppriv.rx_pktloss++; } #endif - ret= _FAIL; + ret = _FAIL; goto exit; } exit: -_func_exit_; return ret; } @@ -1381,88 +1254,75 @@ _func_exit_; sint ap2sta_data_frame( _adapter *adapter, union recv_frame *precv_frame, - struct sta_info**psta ); + struct sta_info **psta); sint ap2sta_data_frame( _adapter *adapter, union recv_frame *precv_frame, - struct sta_info**psta ) + struct sta_info **psta) { u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; sint ret = _SUCCESS; - struct sta_priv *pstapriv = &adapter->stapriv; + struct sta_priv *pstapriv = &adapter->stapriv; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; u8 *mybssid = get_bssid(pmlmepriv); u8 *myhwaddr = adapter_mac_addr(adapter); sint bmcast = IS_MCAST(pattrib->dst); -_func_enter_; if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE - || check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE ) - ) - { + && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE + || check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) + ) { - // filter packets that SA is myself or multicast or broadcast - if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s SA="MAC_FMT", myhwaddr="MAC_FMT"\n", + /* filter packets that SA is myself or multicast or broadcast */ + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s SA="MAC_FMT", myhwaddr="MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->src), MAC_ARG(myhwaddr)); - #endif - ret= _FAIL; +#endif + ret = _FAIL; goto exit; } - // da should be for me - if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_, - (" ap2sta_data_frame: compare DA fail; DA="MAC_FMT"\n", MAC_ARG(pattrib->dst))); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s DA="MAC_FMT"\n", __func__, MAC_ARG(pattrib->dst)); - #endif - ret= _FAIL; + /* da should be for me */ + if ((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s DA="MAC_FMT"\n", __func__, MAC_ARG(pattrib->dst)); +#endif + ret = _FAIL; goto exit; } - // 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)) ) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_, - (" ap2sta_data_frame: compare BSSID fail ; BSSID="MAC_FMT"\n", MAC_ARG(pattrib->bssid))); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("mybssid="MAC_FMT"\n", MAC_ARG(mybssid))); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s BSSID="MAC_FMT", mybssid="MAC_FMT"\n", - __FUNCTION__, MAC_ARG(pattrib->bssid), MAC_ARG(mybssid)); - DBG_871X( "this adapter = %d, buddy adapter = %d\n", adapter->adapter_type, adapter->pbuddy_adapter->adapter_type ); - #endif + /* 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))) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s BSSID="MAC_FMT", mybssid="MAC_FMT"\n", + __func__, MAC_ARG(pattrib->bssid), MAC_ARG(mybssid)); +#endif - if(!bmcast) - { - DBG_871X("issue_deauth to the nonassociated ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid)); + if (!bmcast) { + RTW_INFO(ADPT_FMT" -issue_deauth to the nonassociated ap=" MAC_FMT " for the reason(7)\n", ADPT_ARG(adapter), MAC_ARG(pattrib->bssid)); issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA); } - ret= _FAIL; + ret = _FAIL; goto exit; } - if(bmcast) + if (bmcast) *psta = rtw_get_bcmc_stainfo(adapter); else - *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get ap_info + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get ap_info */ if (*psta == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ap2sta: can't get psta under STATION_MODE ; drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under STATION_MODE ; drop pkt\n", __FUNCTION__); - #endif - ret= _FAIL; +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s can't get psta under STATION_MODE ; drop pkt\n", __FUNCTION__); +#endif + ret = _FAIL; goto exit; } @@ -1476,72 +1336,57 @@ _func_enter_; goto exit; } - } - else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && - (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ) - { + } else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && + (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) { _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); - // - if(adapter->mppriv.bRTWSmbCfg==_FALSE) - _rtw_memcpy(pattrib->bssid, mybssid, ETH_ALEN); - - *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get sta_info */ if (*psta == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under MP_MODE ; drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__); - #endif - ret= _FAIL; +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__); +#endif + ret = _FAIL; goto exit; } - } - else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { + } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { /* Special case */ ret = RTW_RX_HANDLED; goto exit; - } - else - { - if(_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)&& (!bmcast)) - { - *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info - if (*psta == NULL) - { - - //for AP multicast issue , modify by yiwei - static u32 send_issue_deauth_time=0; - - //DBG_871X("After send deauth , %u ms has elapsed.\n", rtw_get_passing_time_ms(send_issue_deauth_time)); - - if(rtw_get_passing_time_ms(send_issue_deauth_time) > 10000 || send_issue_deauth_time == 0 ) - { - send_issue_deauth_time = rtw_get_current_time(); - - DBG_871X("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid)); - + } else { + if (_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN) && (!bmcast)) { + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get sta_info */ + if (*psta == NULL) { + + /* for AP multicast issue , modify by yiwei */ + static u32 send_issue_deauth_time = 0; + + /* RTW_INFO("After send deauth , %u ms has elapsed.\n", rtw_get_passing_time_ms(send_issue_deauth_time)); */ + + if (rtw_get_passing_time_ms(send_issue_deauth_time) > 10000 || send_issue_deauth_time == 0) { + send_issue_deauth_time = rtw_get_current_time(); + + RTW_INFO("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid)); + issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA); } } - } - + } + ret = _FAIL; - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s fw_state:0x%x\n", __FUNCTION__, get_fwstate(pmlmepriv)); - #endif +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s fw_state:0x%x\n", __FUNCTION__, get_fwstate(pmlmepriv)); +#endif } exit: -_func_exit_; return ret; @@ -1550,47 +1395,52 @@ _func_exit_; sint sta2ap_data_frame( _adapter *adapter, union recv_frame *precv_frame, - struct sta_info**psta ); + struct sta_info **psta); sint sta2ap_data_frame( _adapter *adapter, union recv_frame *precv_frame, - struct sta_info**psta ) + struct sta_info **psta) { u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - unsigned char *mybssid = get_bssid(pmlmepriv); - sint ret=_SUCCESS; + unsigned char *mybssid = get_bssid(pmlmepriv); + sint ret = _SUCCESS; -_func_enter_; - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - //For AP mode, RA=BSSID, TX=STA(SRC_ADDR), A3=DST_ADDR - if(!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) - { - ret= _FAIL; + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { + /* For AP mode, RA=BSSID, TX=STA(SRC_ADDR), A3=DST_ADDR */ + if (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) { + ret = _FAIL; goto exit; } *psta = rtw_get_stainfo(pstapriv, pattrib->src); - if (*psta == NULL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under AP_MODE; drop pkt\n")); - DBG_871X("issue_deauth to sta=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->src)); + if (*psta == NULL) { + #ifdef CONFIG_DFS_MASTER + struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); + + /* prevent RX tasklet blocks cmd_thread */ + if (rfctl->radar_detected == 1) + goto bypass_deauth7; + #endif + + RTW_INFO("issue_deauth to sta=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->src)); issue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA); +#ifdef CONFIG_DFS_MASTER +bypass_deauth7: +#endif ret = RTW_RX_HANDLED; goto exit; } process_pwrbit_data(adapter, precv_frame); - if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) { + if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) process_wmmps_data(adapter, precv_frame); - } if (GetFrameSubType(ptr) & BIT(6)) { /* No data, will not indicate to upper layer, temporily count it here */ @@ -1598,38 +1448,32 @@ _func_enter_; ret = RTW_RX_HANDLED; goto exit; } - } - else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && - (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ) - { - //DBG_871X("%s ,in WIFI_MP_STATE \n",__func__); + } else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && + (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) { + /* RTW_INFO("%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); - // - if(adapter->mppriv.bRTWSmbCfg == _FALSE) - _rtw_memcpy(pattrib->bssid, mybssid, ETH_ALEN); - *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info + + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get sta_info */ if (*psta == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under MP_MODE ; drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__); - #endif - ret= _FAIL; +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__); +#endif + ret = _FAIL; goto exit; } - } - else { + } else { u8 *myhwaddr = adapter_mac_addr(adapter); if (!_rtw_memcmp(pattrib->ra, myhwaddr, ETH_ALEN)) { ret = RTW_RX_HANDLED; goto exit; } - DBG_871X("issue_deauth to sta=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->src)); + RTW_INFO("issue_deauth to sta=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->src)); issue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA); ret = RTW_RX_HANDLED; goto exit; @@ -1637,7 +1481,6 @@ _func_enter_; exit: -_func_exit_; return ret; @@ -1649,88 +1492,77 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame) struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; struct sta_priv *pstapriv = &padapter->stapriv; u8 *pframe = precv_frame->u.hdr.rx_data; - struct sta_info *psta=NULL; - //uint len = precv_frame->u.hdr.len; - - //DBG_871X("+validate_recv_ctrl_frame\n"); + struct sta_info *psta = NULL; + /* uint len = precv_frame->u.hdr.len; */ + + /* RTW_INFO("+validate_recv_ctrl_frame\n"); */ if (GetFrameType(pframe) != WIFI_CTRL_TYPE) - { return _FAIL; - } - //receive the frames that ra(a1) is my address + /* receive the frames that ra(a1) is my address */ if (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN)) return _FAIL; psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - if (psta==NULL) - { + if (psta == NULL) return _FAIL; - } - //for rx pkt statistics + /* for rx pkt statistics */ psta->sta_stats.rx_ctrl_pkts++; - //only handle ps-poll - if(GetFrameSubType(pframe) == WIFI_PSPOLL) - { + /* only handle ps-poll */ + if (GetFrameSubType(pframe) == WIFI_PSPOLL) { #ifdef CONFIG_AP_MODE u16 aid; - u8 wmmps_ac=0; - + u8 wmmps_ac = 0; + aid = GetAid(pframe); - if(psta->aid!=aid) - { - return _FAIL; - } - - switch(pattrib->priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(0); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(0); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(0); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(0); - break; - } - - if(wmmps_ac) + if (psta->aid != aid) return _FAIL; - if(psta->state & WIFI_STA_ALIVE_CHK_STATE) - { - DBG_871X("%s alive check-rx ps-poll\n", __func__); + switch (pattrib->priority) { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk & BIT(0); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi & BIT(0); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo & BIT(0); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be & BIT(0); + break; + } + + if (wmmps_ac) + return _FAIL; + + if (psta->state & WIFI_STA_ALIVE_CHK_STATE) { + RTW_INFO("%s alive check-rx ps-poll\n", __func__); psta->expire_to = pstapriv->expire_to; psta->state ^= WIFI_STA_ALIVE_CHK_STATE; - } + } - if((psta->state&WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap&BIT(psta->aid))) - { - _irqL irqL; + if ((psta->state & WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap & BIT(psta->aid))) { + _irqL irqL; _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; + struct xmit_frame *pxmitframe = NULL; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - //_enter_critical_bh(&psta->sleep_q.lock, &irqL); + + /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */ _enter_critical_bh(&pxmitpriv->lock, &irqL); xmitframe_phead = get_list_head(&psta->sleep_q); xmitframe_plist = get_next(xmitframe_phead); - if ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { + if ((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); @@ -1739,72 +1571,62 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame) psta->sleepq_len--; - if(psta->sleepq_len>0) + if (psta->sleepq_len > 0) pxmitframe->attrib.mdata = 1; else pxmitframe->attrib.mdata = 0; pxmitframe->attrib.triggered = 1; - //DBG_871X("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); + /* RTW_INFO("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); */ #if 0 _exit_critical_bh(&psta->sleep_q.lock, &irqL); - if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE) - { + if (rtw_hal_xmit(padapter, pxmitframe) == _TRUE) rtw_os_xmit_complete(padapter, pxmitframe); - } - _enter_critical_bh(&psta->sleep_q.lock, &irqL); + _enter_critical_bh(&psta->sleep_q.lock, &irqL); #endif rtw_hal_xmitframe_enqueue(padapter, pxmitframe); - if(psta->sleepq_len==0) - { + if (psta->sleepq_len == 0) { pstapriv->tim_bitmap &= ~BIT(psta->aid); - //DBG_871X("after handling ps-poll, tim=%x\n", pstapriv->tim_bitmap); + /* RTW_INFO("after handling ps-poll, tim=%x\n", pstapriv->tim_bitmap); */ - //upate BCN for TIM IE - //update_BCNTIM(padapter); + /* upate BCN for TIM IE */ + /* update_BCNTIM(padapter); */ update_beacon(padapter, _TIM_IE_, NULL, _TRUE); } - - //_exit_critical_bh(&psta->sleep_q.lock, &irqL); - _exit_critical_bh(&pxmitpriv->lock, &irqL); - - } - else - { - //_exit_critical_bh(&psta->sleep_q.lock, &irqL); - _exit_critical_bh(&pxmitpriv->lock, &irqL); - - //DBG_871X("no buffered packets to xmit\n"); - if(pstapriv->tim_bitmap&BIT(psta->aid)) - { - if(psta->sleepq_len==0) - { - DBG_871X("no buffered packets to xmit\n"); - //issue nulldata with More data bit = 0 to indicate we have no buffered packets + /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */ + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + } else { + /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */ + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + /* RTW_INFO("no buffered packets to xmit\n"); */ + if (pstapriv->tim_bitmap & BIT(psta->aid)) { + if (psta->sleepq_len == 0) { + RTW_INFO("no buffered packets to xmit\n"); + + /* issue nulldata with More data bit = 0 to indicate we have no buffered packets */ issue_nulldata_in_interrupt(padapter, psta->hwaddr, 0); + } else { + RTW_INFO("error!psta->sleepq_len=%d\n", psta->sleepq_len); + psta->sleepq_len = 0; } - else - { - DBG_871X("error!psta->sleepq_len=%d\n", psta->sleepq_len); - psta->sleepq_len=0; - } - - pstapriv->tim_bitmap &= ~BIT(psta->aid); - //upate BCN for TIM IE - //update_BCNTIM(padapter); + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + /* upate BCN for TIM IE */ + /* update_BCNTIM(padapter); */ update_beacon(padapter, _TIM_IE_, NULL, _TRUE); } - } + } } -#endif //CONFIG_AP_MODE - } - else if(GetFrameSubType(pframe) == WIFI_NDPA) { +#endif /* CONFIG_AP_MODE */ + } else if (GetFrameSubType(pframe) == WIFI_NDPA) { #ifdef CONFIG_BEAMFORMING beamforming_get_ndpa_frame(padapter, precv_frame); #endif/*CONFIG_BEAMFORMING*/ @@ -1814,37 +1636,31 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame) } -union recv_frame* recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame); +union recv_frame *recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame); sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame); sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame) { - //struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + /* struct mlme_priv *pmlmepriv = &adapter->mlmepriv; */ - RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("+validate_recv_mgnt_frame\n")); #if 0 - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { #ifdef CONFIG_NATIVEAP_MLME mgt_dispatcher(padapter, precv_frame); #else rtw_hostapd_mlme_rx(padapter, precv_frame); #endif - } - else - { + } else mgt_dispatcher(padapter, precv_frame); - } #endif precv_frame = recvframe_chk_defrag(padapter, precv_frame); if (precv_frame == NULL) { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,("%s: fragment packet\n",__FUNCTION__)); return _SUCCESS; } { - //for rx pkt statistics + /* for rx pkt statistics */ struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(precv_frame->u.hdr.rx_data)); if (psta) { psta->sta_stats.rx_mgnt_pkts++; @@ -1858,19 +1674,18 @@ sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame) else if (is_broadcast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data)) || is_multicast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data))) psta->sta_stats.rx_probersp_bm_pkts++; - else + else psta->sta_stats.rx_probersp_uo_pkts++; } } } #ifdef CONFIG_INTEL_PROXIM - if(padapter->proximity.proxim_on==_TRUE) - { - struct rx_pkt_attrib * pattrib=&precv_frame->u.hdr.attrib; - struct recv_stat* prxstat=( struct recv_stat * ) precv_frame->u.hdr.rx_head ; - u8 * pda,*psa,*pbssid,*ptr; - ptr=precv_frame->u.hdr.rx_data; + if (padapter->proximity.proxim_on == _TRUE) { + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct recv_stat *prxstat = (struct recv_stat *) precv_frame->u.hdr.rx_head ; + u8 *pda, *psa, *pbssid, *ptr; + ptr = precv_frame->u.hdr.rx_data; pda = get_da(ptr); psa = get_sa(ptr); pbssid = get_hdr_bssid(ptr); @@ -1881,8 +1696,7 @@ sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame) _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN); - switch(pattrib->to_fr_ds) - { + switch (pattrib->to_fr_ds) { case 0: _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); @@ -1901,17 +1715,16 @@ sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame) case 3: _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" case 3\n")); break; default: break; - } - pattrib->priority=0; - pattrib->hdrlen = pattrib->to_fr_ds==3 ? 30 : 24; + } + pattrib->priority = 0; + pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 30 : 24; - padapter->proximity.proxim_rx(padapter,precv_frame); + padapter->proximity.proxim_rx(padapter, precv_frame); } #endif mgt_dispatcher(padapter, precv_frame); @@ -1927,23 +1740,22 @@ sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame) u8 *psa, *pda, *pbssid; struct sta_info *psta = NULL; u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; - struct security_priv *psecuritypriv = &adapter->securitypriv; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; sint ret = _SUCCESS; -_func_enter_; bretry = GetRetry(ptr); pda = get_da(ptr); psa = get_sa(ptr); pbssid = get_hdr_bssid(ptr); - if(pbssid == NULL){ - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s pbssid == NULL\n", __func__); - #endif - ret= _FAIL; + if (pbssid == NULL) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s pbssid == NULL\n", __func__); +#endif + ret = _FAIL; goto exit; } @@ -1952,130 +1764,111 @@ _func_enter_; _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN); - switch(pattrib->to_fr_ds) - { - case 0: - _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); - _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); - ret = sta2sta_data_frame(adapter, precv_frame, &psta); - break; + switch (pattrib->to_fr_ds) { + case 0: + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); + ret = sta2sta_data_frame(adapter, precv_frame, &psta); + break; - case 1: - _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN); - ret = ap2sta_data_frame(adapter, precv_frame, &psta); - break; + case 1: + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN); + ret = ap2sta_data_frame(adapter, precv_frame, &psta); + break; - case 2: - _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN); - _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); - ret = sta2ap_data_frame(adapter, precv_frame, &psta); - break; + case 2: + _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); + ret = sta2ap_data_frame(adapter, precv_frame, &psta); + break; - case 3: - _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); - _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); - ret =_FAIL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" case 3\n")); - break; + case 3: + _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); + ret = _FAIL; + break; - default: - ret =_FAIL; - break; + default: + ret = _FAIL; + break; } - if(ret ==_FAIL){ - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s case:%d, res:%d\n", __FUNCTION__, pattrib->to_fr_ds, ret); - #endif + if (ret == _FAIL) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s case:%d, res:%d\n", __FUNCTION__, pattrib->to_fr_ds, ret); +#endif goto exit; - } else if (ret == RTW_RX_HANDLED) { + } else if (ret == RTW_RX_HANDLED) + goto exit; + + + if (psta == NULL) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s psta == NULL\n", __func__); +#endif + ret = _FAIL; goto exit; } - - if(psta==NULL){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" after to_fr_ds_chk; psta==NULL \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s psta == NULL\n", __func__); - #endif - ret= _FAIL; - goto exit; - } - - //psta->rssi = prxcmd->rssi; - //psta->signal_quality= prxcmd->sq; + /* psta->rssi = prxcmd->rssi; */ + /* psta->signal_quality= prxcmd->sq; */ precv_frame->u.hdr.psta = psta; - - pattrib->amsdu=0; + + pattrib->amsdu = 0; pattrib->ack_policy = 0; - //parsing QC field - if(pattrib->qos == 1) - { + /* parsing QC field */ + if (pattrib->qos == 1) { pattrib->priority = GetPriority((ptr + 24)); pattrib->ack_policy = GetAckpolicy((ptr + 24)); pattrib->amsdu = GetAMsdu((ptr + 24)); - pattrib->hdrlen = pattrib->to_fr_ds==3 ? 32 : 26; + pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 32 : 26; - if(pattrib->priority!=0 && pattrib->priority!=3) + if (pattrib->priority != 0 && pattrib->priority != 3) adapter->recvpriv.bIsAnyNonBEPkts = _TRUE; else adapter->recvpriv.bIsAnyNonBEPkts = _FALSE; - } - else - { - pattrib->priority=0; - pattrib->hdrlen = pattrib->to_fr_ds==3 ? 30 : 24; + } else { + pattrib->priority = 0; + pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 30 : 24; } - if(pattrib->order)//HT-CTRL 11n - { + if (pattrib->order) /* HT-CTRL 11n */ pattrib->hdrlen += 4; - } precv_frame->u.hdr.preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority]; - // decache, drop duplicate recv packets - if(recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decache : drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s recv_decache return _FAIL\n", __func__); - #endif - ret= _FAIL; + /* decache, drop duplicate recv packets */ + if (recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s recv_decache return _FAIL\n", __func__); +#endif + ret = _FAIL; goto exit; } - if(pattrib->privacy){ + if (pattrib->privacy) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("validate_recv_data_frame:pattrib->privacy=%x\n", pattrib->privacy)); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n ^^^^^^^^^^^IS_MCAST(pattrib->ra(0x%02x))=%d^^^^^^^^^^^^^^^6\n", pattrib->ra[0],IS_MCAST(pattrib->ra))); #ifdef CONFIG_TDLS - if((psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta->dot118021XPrivacy==_AES_)) - { - pattrib->encrypt=psta->dot118021XPrivacy; - } + if ((psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta->dot118021XPrivacy == _AES_)) + pattrib->encrypt = psta->dot118021XPrivacy; else -#endif //CONFIG_TDLS - GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, IS_MCAST(pattrib->ra)); +#endif /* CONFIG_TDLS */ + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, IS_MCAST(pattrib->ra)); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n pattrib->encrypt=%d\n",pattrib->encrypt)); SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt); - } - else - { + } else { pattrib->encrypt = 0; pattrib->iv_len = pattrib->icv_len = 0; } exit: -_func_exit_; return ret; } @@ -2084,115 +1877,105 @@ _func_exit_; static sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_frame) { struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; u8 *ptr = precv_frame->u.hdr.rx_data; struct sta_info *psta; struct sta_priv *pstapriv = &adapter->stapriv; u8 type; u8 subtype; - + type = GetFrameType(ptr); - subtype = GetFrameSubType(ptr); //bit(7)~bit(2) - - if (adapter->securitypriv.binstallBIPkey == _TRUE) - { - //unicast management frame decrypt - if(pattrib->privacy && !(IS_MCAST(GetAddr1Ptr(ptr))) && - (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC || subtype == WIFI_ACTION)) - { + subtype = GetFrameSubType(ptr); /* bit(7)~bit(2) */ + + if (adapter->securitypriv.binstallBIPkey == _TRUE) { + /* unicast management frame decrypt */ + if (pattrib->privacy && !(IS_MCAST(GetAddr1Ptr(ptr))) && + (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC || subtype == WIFI_ACTION)) { u8 *ppp, *mgmt_DATA; - u32 data_len=0; + u32 data_len = 0; ppp = GetAddr2Ptr(ptr); - + pattrib->bdecrypted = 0; pattrib->encrypt = _AES_; pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); - //set iv and icv length + /* set iv and icv length */ SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt); _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); - //actual management data frame body + /* actual management data frame body */ data_len = pattrib->pkt_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; mgmt_DATA = rtw_zmalloc(data_len); - if(mgmt_DATA == NULL) - { - DBG_871X("%s mgmt allocate fail !!!!!!!!!\n", __FUNCTION__); + if (mgmt_DATA == NULL) { + RTW_INFO("%s mgmt allocate fail !!!!!!!!!\n", __FUNCTION__); goto validate_80211w_fail; } - /* //dump the packet content before decrypt +#if 0 + /* dump the packet content before decrypt */ { int pp; printk("pattrib->pktlen = %d =>", pattrib->pkt_len); - for(pp=0;pp< pattrib->pkt_len; pp++) + for (pp = 0; pp < pattrib->pkt_len; pp++) printk(" %02x ", ptr[pp]); printk("\n"); - }*/ - + } +#endif + precv_frame = decryptor(adapter, precv_frame); - //save actual management data frame body - _rtw_memcpy(mgmt_DATA, ptr+pattrib->hdrlen+pattrib->iv_len, data_len); - //overwrite the iv field - _rtw_memcpy(ptr+pattrib->hdrlen, mgmt_DATA, data_len); - //remove the iv and icv length + /* save actual management data frame body */ + _rtw_memcpy(mgmt_DATA, ptr + pattrib->hdrlen + pattrib->iv_len, data_len); + /* overwrite the iv field */ + _rtw_memcpy(ptr + pattrib->hdrlen, mgmt_DATA, data_len); + /* remove the iv and icv length */ pattrib->pkt_len = pattrib->pkt_len - pattrib->iv_len - pattrib->icv_len; rtw_mfree(mgmt_DATA, data_len); - /* //print packet content after decryption +#if 0 + /* print packet content after decryption */ { int pp; printk("after decryption pattrib->pktlen = %d @@=>", pattrib->pkt_len); - for(pp=0;pp< pattrib->pkt_len; pp++) + for (pp = 0; pp < pattrib->pkt_len; pp++) printk(" %02x ", ptr[pp]); printk("\n"); - }*/ - if(!precv_frame) - { - DBG_871X("%s mgmt descrypt fail !!!!!!!!!\n", __FUNCTION__); + } +#endif + if (!precv_frame) { + RTW_INFO("%s mgmt descrypt fail !!!!!!!!!\n", __FUNCTION__); goto validate_80211w_fail; } - } - else if(IS_MCAST(GetAddr1Ptr(ptr)) && - (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC)) - { + } else if (IS_MCAST(GetAddr1Ptr(ptr)) && + (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC)) { sint BIP_ret = _SUCCESS; - //verify BIP MME IE of broadcast/multicast de-auth/disassoc packet - BIP_ret = rtw_BIP_verify(adapter, (u8 * )precv_frame); - if(BIP_ret == _FAIL) - { - //DBG_871X("802.11w BIP verify fail\n"); + /* verify BIP MME IE of broadcast/multicast de-auth/disassoc packet */ + BIP_ret = rtw_BIP_verify(adapter, (u8 *)precv_frame); + if (BIP_ret == _FAIL) { + /* RTW_INFO("802.11w BIP verify fail\n"); */ goto validate_80211w_fail; - } - else if(BIP_ret == RTW_RX_HANDLED) - { - DBG_871X("802.11w recv none protected packet\n"); - //drop pkt, don't issue sa query request + } else if (BIP_ret == RTW_RX_HANDLED) { + RTW_INFO("802.11w recv none protected packet\n"); + /* drop pkt, don't issue sa query request */ /* issue_action_SA_Query(adapter, NULL, 0, 0, 0); */ goto validate_80211w_fail; } - }//802.11w protect - else - { + } /* 802.11w protect */ + else { psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(ptr)); - + if (subtype == WIFI_ACTION && psta && psta->bpairwise_key_installed == _TRUE) { - //according 802.11-2012 standard, these five types are not robust types - if( ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_PUBLIC && - ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_HT && - ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_UNPROTECTED_WNM && - ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_SELF_PROTECTED && - ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_P2P) - { - DBG_871X("action frame category=%d should robust\n", ptr[WLAN_HDR_A3_LEN]); + /* according 802.11-2012 standard, these five types are not robust types */ + if (ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_PUBLIC && + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_HT && + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_UNPROTECTED_WNM && + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_SELF_PROTECTED && + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_P2P) { + RTW_INFO("action frame category=%d should robust\n", ptr[WLAN_HDR_A3_LEN]); goto validate_80211w_fail; } - } - else if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC) - { + } else if (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC) { unsigned short reason; reason = le16_to_cpu(*(unsigned short *)(ptr + WLAN_HDR_A3_LEN)); - DBG_871X("802.11w recv none protected packet, reason=%d\n", reason); - if(reason == 6 || reason == 7) - { - //issue sa query request + RTW_INFO("802.11w recv none protected packet, reason=%d\n", reason); + if (reason == 6 || reason == 7) { + /* issue sa query request */ issue_action_SA_Query(adapter, NULL, 0, 0, IEEE80211W_RIGHT_KEY); } goto validate_80211w_fail; @@ -2200,46 +1983,46 @@ static sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_fram } } return _SUCCESS; - + validate_80211w_fail: return _FAIL; - + } -#endif //CONFIG_IEEE80211W +#endif /* CONFIG_IEEE80211W */ static inline void dump_rx_packet(u8 *ptr) { int i; - DBG_871X("############################# \n"); - for(i=0; i<64;i=i+8) - DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), - *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); - DBG_871X("############################# \n"); + RTW_INFO("#############################\n"); + for (i = 0; i < 64; i = i + 8) + RTW_INFO("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr + i), + *(ptr + i + 1), *(ptr + i + 2) , *(ptr + i + 3) , *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7)); + RTW_INFO("#############################\n"); } sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame); sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame) { - //shall check frame subtype, to / from ds, da, bssid + /* shall check frame subtype, to / from ds, da, bssid */ - //then call check if rx seq/frag. duplicated. + /* then call check if rx seq/frag. duplicated. */ u8 type; u8 subtype; sint retval = _SUCCESS; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; u8 *ptr = precv_frame->u.hdr.rx_data; - u8 ver =(unsigned char) (*ptr)&0x3 ; + u8 ver = (unsigned char)(*ptr) & 0x3 ; #ifdef CONFIG_FIND_BEST_CHANNEL struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; #endif #ifdef CONFIG_TDLS struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ #ifdef CONFIG_WAPI_SUPPORT PRT_WAPI_T pWapiInfo = &adapter->wapiInfo; struct recv_frame_hdr *phdr = &precv_frame->u.hdr; @@ -2248,7 +2031,6 @@ sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame) u8 external_len = 0; #endif -_func_enter_; #ifdef CONFIG_FIND_BEST_CHANNEL if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { @@ -2259,36 +2041,33 @@ _func_enter_; #endif #ifdef CONFIG_TDLS - if(ptdlsinfo->ch_sensing==1 && ptdlsinfo->cur_channel !=0){ - ptdlsinfo->collect_pkt_num[ptdlsinfo->cur_channel-1]++; - } -#endif //CONFIG_TDLS + if (ptdlsinfo->ch_sensing == 1 && ptdlsinfo->cur_channel != 0) + ptdlsinfo->collect_pkt_num[ptdlsinfo->cur_channel - 1]++; +#endif /* CONFIG_TDLS */ #ifdef RTK_DMP_PLATFORM - if ( 0 ) - { - DBG_871X("++\n"); + if (0) { + RTW_INFO("++\n"); { int i; - for(i=0; i<64;i=i+8) - DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr+i), - *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + for (i = 0; i < 64; i = i + 8) + RTW_INFO("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr + i), + *(ptr + i + 1), *(ptr + i + 2) , *(ptr + i + 3) , *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7)); } - DBG_871X("--\n"); + RTW_INFO("--\n"); } -#endif //RTK_DMP_PLATFORM +#endif /* RTK_DMP_PLATFORM */ - //add version chk - if(ver!=0){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! (ver!=0)\n")); - retval= _FAIL; + /* add version chk */ + if (ver != 0) { + retval = _FAIL; DBG_COUNTER(adapter->rx_logs.core_rx_pre_ver_err); goto exit; } type = GetFrameType(ptr); - subtype = GetFrameSubType(ptr); //bit(7)~bit(2) + subtype = GetFrameSubType(ptr); /* bit(7)~bit(2) */ pattrib->to_fr_ds = get_tofr_ds(ptr); @@ -2301,239 +2080,212 @@ _func_enter_; pattrib->privacy = GetPrivacy(ptr); pattrib->order = GetOrder(ptr); #ifdef CONFIG_WAPI_SUPPORT - sc = (pattrib->seq_num<<4) | pattrib->frag_num; + sc = (pattrib->seq_num << 4) | pattrib->frag_num; #endif -#if 1 //Dump rx packets -{ - u8 bDumpRxPkt; - rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt)); - if (bDumpRxPkt == 1) //dump all rx packets - dump_rx_packet(ptr); - else if ((bDumpRxPkt == 2) && (type == WIFI_MGT_TYPE)) - dump_rx_packet(ptr); - else if ((bDumpRxPkt == 3) && (type == WIFI_DATA_TYPE)) - dump_rx_packet(ptr); -} -#endif - switch (type) +#if 1 /* Dump rx packets */ { - case WIFI_MGT_TYPE: //mgnt - DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt); + u8 bDumpRxPkt = 0; + + rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt)); + if (bDumpRxPkt == 1) /* dump all rx packets */ + dump_rx_packet(ptr); + else if ((bDumpRxPkt == 2) && (type == WIFI_MGT_TYPE)) + dump_rx_packet(ptr); + else if ((bDumpRxPkt == 3) && (type == WIFI_DATA_TYPE)) + dump_rx_packet(ptr); + } +#endif + switch (type) { + case WIFI_MGT_TYPE: /* mgnt */ + DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt); #ifdef CONFIG_IEEE80211W - if(validate_80211w_mgmt(adapter, precv_frame) == _FAIL) - { + if (validate_80211w_mgmt(adapter, precv_frame) == _FAIL) { + retval = _FAIL; + DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err_80211w); + break; + } +#endif /* CONFIG_IEEE80211W */ + + retval = validate_recv_mgnt_frame(adapter, precv_frame); + if (retval == _FAIL) { + DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err); + } + retval = _FAIL; /* only data frame return _SUCCESS */ + break; + case WIFI_CTRL_TYPE: /* ctrl */ + DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl); + retval = validate_recv_ctrl_frame(adapter, precv_frame); + if (retval == _FAIL) { + DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl_err); + } + retval = _FAIL; /* only data frame return _SUCCESS */ + break; + case WIFI_DATA_TYPE: /* data */ + DBG_COUNTER(adapter->rx_logs.core_rx_pre_data); +#ifdef CONFIG_WAPI_SUPPORT + if (pattrib->qos) + external_len = 2; + else + external_len = 0; + + wai_pkt = rtw_wapi_is_wai_packet(adapter, ptr); + + phdr->bIsWaiPacket = wai_pkt; + + if (wai_pkt != 0) { + if (sc != adapter->wapiInfo.wapiSeqnumAndFragNum) + adapter->wapiInfo.wapiSeqnumAndFragNum = sc; + else { retval = _FAIL; - DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err_80211w); + DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_seq_err); break; } -#endif //CONFIG_IEEE80211W - - retval = validate_recv_mgnt_frame(adapter, precv_frame); - if (retval == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_mgnt_frame fail\n")); - DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err); - } - retval = _FAIL; // only data frame return _SUCCESS - break; - case WIFI_CTRL_TYPE: //ctrl - DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl); - retval = validate_recv_ctrl_frame(adapter, precv_frame); - if (retval == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_ctrl_frame fail\n")); - DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl_err); - } - retval = _FAIL; // only data frame return _SUCCESS - break; - case WIFI_DATA_TYPE: //data - DBG_COUNTER(adapter->rx_logs.core_rx_pre_data); -#ifdef CONFIG_WAPI_SUPPORT - if(pattrib->qos) - external_len = 2; - else - external_len= 0; - - wai_pkt = rtw_wapi_is_wai_packet(adapter,ptr); + } else { - phdr->bIsWaiPacket = wai_pkt; - - if(wai_pkt !=0){ - if(sc != adapter->wapiInfo.wapiSeqnumAndFragNum) - { - adapter->wapiInfo.wapiSeqnumAndFragNum = sc; - } - else - { - retval = _FAIL; - DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_seq_err); - break; - } - } - else{ - - if(rtw_wapi_drop_for_key_absent(adapter,GetAddr2Ptr(ptr))){ - retval=_FAIL; - WAPI_TRACE(WAPI_RX,"drop for key absent for rx \n"); - DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_key_err); - break; - } + if (rtw_wapi_drop_for_key_absent(adapter, GetAddr2Ptr(ptr))) { + retval = _FAIL; + WAPI_TRACE(WAPI_RX, "drop for key absent for rx\n"); + DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_key_err); + break; } + } #endif - pattrib->qos = (subtype & BIT(7))? 1:0; - retval = validate_recv_data_frame(adapter, precv_frame); - if (retval == _FAIL) - { - struct recv_priv *precvpriv = &adapter->recvpriv; - //RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail\n")); - precvpriv->rx_drop++; - DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_err); - } - else if (retval == _SUCCESS) - { + pattrib->qos = (subtype & BIT(7)) ? 1 : 0; + retval = validate_recv_data_frame(adapter, precv_frame); + if (retval == _FAIL) { + struct recv_priv *precvpriv = &adapter->recvpriv; + precvpriv->rx_drop++; + DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_err); + } else if (retval == _SUCCESS) { #ifdef DBG_RX_DUMP_EAP - u8 bDumpRxPkt; - u16 eth_type; + u8 bDumpRxPkt; + u16 eth_type; - // dump eapol - rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt)); - // get ether_type - _rtw_memcpy(ð_type, ptr + pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE, 2); - eth_type = ntohs((unsigned short) eth_type); - if ((bDumpRxPkt == 4) && (eth_type == 0x888e)) - dump_rx_packet(ptr); + /* dump eapol */ + rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt)); + /* get ether_type */ + _rtw_memcpy(ð_type, ptr + pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE, 2); + eth_type = ntohs((unsigned short) eth_type); + if ((bDumpRxPkt == 4) && (eth_type == 0x888e)) + dump_rx_packet(ptr); #endif - } - else - { - DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_handled); - } - break; - default: - DBG_COUNTER(adapter->rx_logs.core_rx_pre_unknown); - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! type=0x%x\n", type)); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type); - #endif - retval = _FAIL; - break; + } else + DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_handled); + break; + default: + DBG_COUNTER(adapter->rx_logs.core_rx_pre_unknown); +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type); +#endif + retval = _FAIL; + break; } exit: -_func_exit_; return retval; } -//remove the wlanhdr and add the eth_hdr +/* remove the wlanhdr and add the eth_hdr */ #if 1 -sint wlanhdr_to_ethhdr ( union recv_frame *precvframe); -sint wlanhdr_to_ethhdr ( union recv_frame *precvframe) +sint wlanhdr_to_ethhdr(union recv_frame *precvframe); +sint wlanhdr_to_ethhdr(union recv_frame *precvframe) { sint rmv_len; u16 eth_type, len; u8 bsnaphdr; u8 *psnap_type; struct ieee80211_snap_hdr *psnap; - - sint ret=_SUCCESS; - _adapter *adapter =precvframe->u.hdr.adapter; + + sint ret = _SUCCESS; + _adapter *adapter = precvframe->u.hdr.adapter; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - u8 *ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field - struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib; + u8 *ptr = get_recvframe_data(precvframe) ; /* point to frame_ctrl field */ + struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; -_func_enter_; - if(pattrib->encrypt){ - recvframe_pull_tail(precvframe, pattrib->icv_len); - } + if (pattrib->encrypt) + recvframe_pull_tail(precvframe, pattrib->icv_len); - psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len); - psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + psnap = (struct ieee80211_snap_hdr *)(ptr + pattrib->hdrlen + pattrib->iv_len); + psnap_type = ptr + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE; /* convert hdr + possible LLC headers into Ethernet header */ - //eth_type = (psnap_type[0] << 8) | psnap_type[1]; - if((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) && - (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && - (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)==_FALSE) )|| - //eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || - _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)){ + /* eth_type = (psnap_type[0] << 8) | psnap_type[1]; */ + if ((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) && + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2) == _FALSE)) || + /* eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || */ + _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)) { /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ bsnaphdr = _TRUE; - } - else { + } else { /* Leave Ethernet header part of hdr and full payload */ bsnaphdr = _FALSE; } - rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0); + rmv_len = pattrib->hdrlen + pattrib->iv_len + (bsnaphdr ? SNAP_SIZE : 0); len = precvframe->u.hdr.len - rmv_len; - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n\n", pattrib->hdrlen, pattrib->iv_len)); - _rtw_memcpy(ð_type, ptr+rmv_len, 2); - eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type + _rtw_memcpy(ð_type, ptr + rmv_len, 2); + eth_type = ntohs((unsigned short)eth_type); /* pattrib->ether_type */ pattrib->eth_type = eth_type; #ifdef CONFIG_AUTO_AP_MODE - if (0x8899 == pattrib->eth_type) - { + if (0x8899 == pattrib->eth_type) { struct sta_info *psta = precvframe->u.hdr.psta; - - DBG_871X("wlan rx: got eth_type=0x%x\n", pattrib->eth_type); - - if (psta && psta->isrc && psta->pid>0) - { + + RTW_INFO("wlan rx: got eth_type=0x%x\n", pattrib->eth_type); + + if (psta && psta->isrc && psta->pid > 0) { u16 rx_pid; - rx_pid = *(u16*)(ptr+rmv_len+2); - - DBG_871X("wlan rx(pid=0x%x): sta("MAC_FMT") pid=0x%x\n", - rx_pid, MAC_ARG(psta->hwaddr), psta->pid); + rx_pid = *(u16 *)(ptr + rmv_len + 2); - if(rx_pid == psta->pid) - { + RTW_INFO("wlan rx(pid=0x%x): sta("MAC_FMT") pid=0x%x\n", + rx_pid, MAC_ARG(psta->hwaddr), psta->pid); + + if (rx_pid == psta->pid) { int i; - u16 len = *(u16*)(ptr+rmv_len+4); - //u16 ctrl_type = *(u16*)(ptr+rmv_len+6); + u16 len = *(u16 *)(ptr + rmv_len + 4); + /* u16 ctrl_type = *(u16*)(ptr+rmv_len+6); */ - //DBG_871X("RC: len=0x%x, ctrl_type=0x%x\n", len, ctrl_type); - DBG_871X("RC: len=0x%x\n", len); + /* RTW_INFO("RC: len=0x%x, ctrl_type=0x%x\n", len, ctrl_type); */ + RTW_INFO("RC: len=0x%x\n", len); - for(i=0;idst, ETH_ALEN); - _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN); + _rtw_memcpy(ptr + ETH_ALEN, pattrib->src, ETH_ALEN); - if(!bsnaphdr) { + if (!bsnaphdr) { len = htons(len); - _rtw_memcpy(ptr+12, &len, 2); + _rtw_memcpy(ptr + 12, &len, 2); } } exiting: -_func_exit_; return ret; } #else -sint wlanhdr_to_ethhdr ( union recv_frame *precvframe) +sint wlanhdr_to_ethhdr(union recv_frame *precvframe) { sint rmv_len; u16 eth_type; @@ -2566,123 +2317,104 @@ sint wlanhdr_to_ethhdr ( union recv_frame *precvframe) u8 *psnap_type; struct ieee80211_snap_hdr *psnap; - sint ret=_SUCCESS; - _adapter *adapter =precvframe->u.hdr.adapter; + sint ret = _SUCCESS; + _adapter *adapter = precvframe->u.hdr.adapter; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - u8* ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field - struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib; + u8 *ptr = get_recvframe_data(precvframe) ; /* point to frame_ctrl field */ + struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; struct _vlan *pvlan = NULL; -_func_enter_; - psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len); - psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; - if (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03) - { + psnap = (struct ieee80211_snap_hdr *)(ptr + pattrib->hdrlen + pattrib->iv_len); + psnap_type = ptr + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE; + if (psnap->dsap == 0xaa && psnap->ssap == 0xaa && psnap->ctrl == 0x03) { if (_rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN)) - bsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042; + bsnaphdr = _TRUE; /* wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042; */ else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) && - _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) ) - bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK; - else if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN)) - bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL; + _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2)) + bsnaphdr = _TRUE; /* wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK; */ + else if (_rtw_memcmp(psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN)) + bsnaphdr = _TRUE; /* wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL; */ else { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("drop pkt due to invalid frame format!\n")); - ret= _FAIL; + ret = _FAIL; goto exit; } } else - bsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS; + bsnaphdr = _FALSE; /* wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS; */ - rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n", pattrib->hdrlen, pattrib->iv_len)); + rmv_len = pattrib->hdrlen + pattrib->iv_len + (bsnaphdr ? SNAP_SIZE : 0); - if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) - { + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) { ptr += rmv_len ; *ptr = 0x87; - *(ptr+1) = 0x12; + *(ptr + 1) = 0x12; - //back to original pointer + /* back to original pointer */ ptr -= rmv_len; } ptr += rmv_len ; _rtw_memcpy(ð_type, ptr, 2); - eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type - ptr +=2; + eth_type = ntohs((unsigned short)eth_type); /* pattrib->ether_type */ + ptr += 2; - if(pattrib->encrypt){ + if (pattrib->encrypt) recvframe_pull_tail(precvframe, pattrib->icv_len); - } - if(eth_type == 0x8100) //vlan - { + if (eth_type == 0x8100) { /* vlan */ pvlan = (struct _vlan *) ptr; - //eth_type = get_vlan_encap_proto(pvlan); - //eth_type = pvlan->h_vlan_encapsulated_proto;//? + /* eth_type = get_vlan_encap_proto(pvlan); */ + /* eth_type = pvlan->h_vlan_encapsulated_proto; */ /* ? */ rmv_len += 4; - ptr+=4; + ptr += 4; } - if(eth_type==0x0800)//ip - { - //struct iphdr* piphdr = (struct iphdr*) ptr; - //__u8 tos = (unsigned char)(pattrib->priority & 0xff); + if (eth_type == 0x0800) { /* ip */ + /* struct iphdr* piphdr = (struct iphdr*) ptr; */ + /* __u8 tos = (unsigned char)(pattrib->priority & 0xff); */ - //piphdr->tos = tos; + /* piphdr->tos = tos; */ - //if (piphdr->protocol == 0x06) - //{ - // RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("@@@===recv tcp len:%d @@@===\n", precvframe->u.hdr.len)); - //} - } - else if(eth_type==0x8712)// append rx status for mp test packets - { - //ptr -= 16; - //_rtw_memcpy(ptr, get_rxmem(precvframe), 16); - } - else - { + } else if (eth_type == 0x8712) { /* append rx status for mp test packets */ + /* ptr -= 16; */ + /* _rtw_memcpy(ptr, get_rxmem(precvframe), 16); */ + } else { #ifdef PLATFORM_OS_XP NDIS_PACKET_8021Q_INFO VlanPriInfo; UINT32 UserPriority = precvframe->u.hdr.attrib.priority; - UINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 ); + UINT32 VlanID = (pvlan != NULL ? get_vlan_id(pvlan) : 0); - VlanPriInfo.Value = // Get current value. - NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo); + VlanPriInfo.Value = /* Get current value. */ + NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo); VlanPriInfo.TagHeader.UserPriority = UserPriority; VlanPriInfo.TagHeader.VlanId = VlanID ; - VlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero. - VlanPriInfo.TagHeader.Reserved = 0; // Should be zero. + VlanPriInfo.TagHeader.CanonicalFormatId = 0; /* Should be zero. */ + VlanPriInfo.TagHeader.Reserved = 0; /* Should be zero. */ NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value; #endif } - if(eth_type==0x8712)// append rx status for mp test packets - { - ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24); + if (eth_type == 0x8712) { /* append rx status for mp test packets */ + ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + 2) - 24); _rtw_memcpy(ptr, get_rxmem(precvframe), 24); - ptr+=24; - } - else - ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)); + ptr += 24; + } else + ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + 2)); _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN); - _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN); + _rtw_memcpy(ptr + ETH_ALEN, pattrib->src, ETH_ALEN); eth_type = htons((unsigned short)eth_type) ; - _rtw_memcpy(ptr+12, ð_type, 2); + _rtw_memcpy(ptr + 12, ð_type, 2); exit: -_func_exit_; return ret; } @@ -2704,38 +2436,39 @@ static void recvframe_expand_pkt( pfhdr = &prframe->u.hdr; - // 6 is for IP header 8 bytes alignment in QoS packet case. + /* 6 is for IP header 8 bytes alignment in QoS packet case. */ if (pfhdr->attrib.qos) shift_sz = 6; else shift_sz = 0; - // for first fragment packet, need to allocate - // (1536 + RXDESC_SIZE + drvinfo_sz) to reassemble packet - // 8 is for skb->data 8 bytes alignment. -// alloc_sz = _RND(1536 + RXDESC_SIZE + pfhdr->attrib.drvinfosize + shift_sz + 8, 128); - alloc_sz = 1664; // round (1536 + 24 + 32 + shift_sz + 8) to 128 bytes alignment + /* for first fragment packet, need to allocate */ + /* (1536 + RXDESC_SIZE + drvinfo_sz) to reassemble packet */ + /* 8 is for skb->data 8 bytes alignment. + * alloc_sz = _RND(1536 + RXDESC_SIZE + pfhdr->attrib.drvinfosize + shift_sz + 8, 128); */ + alloc_sz = 1664; /* round (1536 + 24 + 32 + shift_sz + 8) to 128 bytes alignment */ - //3 1. alloc new skb - // prepare extra space for 4 bytes alignment + /* 3 1. alloc new skb */ + /* prepare extra space for 4 bytes alignment */ ppkt = rtw_skb_alloc(alloc_sz); - if (!ppkt) return; // no way to expand + if (!ppkt) + return; /* no way to expand */ - //3 2. Prepare new skb to replace & release old skb - // force ppkt->data at 8-byte alignment address + /* 3 2. Prepare new skb to replace & release old skb */ + /* force ppkt->data at 8-byte alignment address */ skb_reserve(ppkt, 8 - ((SIZE_PTR)ppkt->data & 7)); - // force ip_hdr at 8-byte alignment address according to shift_sz + /* force ip_hdr at 8-byte alignment address according to shift_sz */ skb_reserve(ppkt, shift_sz); - // copy data to new pkt + /* copy data to new pkt */ ptr = skb_put(ppkt, pfhdr->len); if (ptr) _rtw_memcpy(ptr, pfhdr->rx_data, pfhdr->len); rtw_skb_free(pfhdr->pkt); - // attach new pkt to recvframe + /* attach new pkt to recvframe */ pfhdr->pkt = ppkt; pfhdr->rx_head = ppkt->head; pfhdr->rx_data = ppkt->data; @@ -2747,32 +2480,30 @@ static void recvframe_expand_pkt( #endif #endif -//perform defrag -union recv_frame * recvframe_defrag(_adapter *adapter,_queue *defrag_q); -union recv_frame * recvframe_defrag(_adapter *adapter,_queue *defrag_q) +/* perform defrag */ +union recv_frame *recvframe_defrag(_adapter *adapter, _queue *defrag_q); +union recv_frame *recvframe_defrag(_adapter *adapter, _queue *defrag_q) { - _list *plist, *phead; - u8 *data,wlanhdr_offset; + _list *plist, *phead; + u8 *data, wlanhdr_offset; u8 curfragnum; - struct recv_frame_hdr *pfhdr,*pnfhdr; - union recv_frame* prframe, *pnextrframe; + struct recv_frame_hdr *pfhdr, *pnfhdr; + union recv_frame *prframe, *pnextrframe; _queue *pfree_recv_queue; -_func_enter_; - curfragnum=0; - pfree_recv_queue=&adapter->recvpriv.free_recv_queue; + curfragnum = 0; + pfree_recv_queue = &adapter->recvpriv.free_recv_queue; phead = get_list_head(defrag_q); plist = get_next(phead); prframe = LIST_CONTAINOR(plist, union recv_frame, u); - pfhdr=&prframe->u.hdr; + pfhdr = &prframe->u.hdr; rtw_list_delete(&(prframe->u.list)); - if(curfragnum!=pfhdr->attrib.frag_num) - { - //the first fragment number must be 0 - //free the whole queue + if (curfragnum != pfhdr->attrib.frag_num) { + /* the first fragment number must be 0 */ + /* free the whole queue */ rtw_free_recvframe(prframe, pfree_recv_queue); rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); @@ -2787,24 +2518,22 @@ _func_enter_; curfragnum++; - plist= get_list_head(defrag_q); + plist = get_list_head(defrag_q); plist = get_next(plist); - data=get_recvframe_data(prframe); + data = get_recvframe_data(prframe); - while(rtw_end_of_queue_search(phead, plist) == _FALSE) - { + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { pnextrframe = LIST_CONTAINOR(plist, union recv_frame , u); - pnfhdr=&pnextrframe->u.hdr; + pnfhdr = &pnextrframe->u.hdr; - //check the fragment sequence (2nd ~n fragment frame) + /* check the fragment sequence (2nd ~n fragment frame) */ - if(curfragnum!=pnfhdr->attrib.frag_num) - { - //the fragment number must be increasing (after decache) - //release the defrag_q & prframe + if (curfragnum != pnfhdr->attrib.frag_num) { + /* the fragment number must be increasing (after decache) */ + /* release the defrag_q & prframe */ rtw_free_recvframe(prframe, pfree_recv_queue); rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); return NULL; @@ -2812,38 +2541,36 @@ _func_enter_; curfragnum++; - //copy the 2nd~n fragment frame's payload to the first fragment - //get the 2nd~last fragment frame's payload + /* copy the 2nd~n fragment frame's payload to the first fragment */ + /* get the 2nd~last fragment frame's payload */ wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len; recvframe_pull(pnextrframe, wlanhdr_offset); - //append to first fragment frame's tail (if privacy frame, pull the ICV) + /* append to first fragment frame's tail (if privacy frame, pull the ICV) */ recvframe_pull_tail(prframe, pfhdr->attrib.icv_len); - //memcpy + /* memcpy */ _rtw_memcpy(pfhdr->rx_tail, pnfhdr->rx_data, pnfhdr->len); recvframe_put(prframe, pnfhdr->len); - pfhdr->attrib.icv_len=pnfhdr->attrib.icv_len; + pfhdr->attrib.icv_len = pnfhdr->attrib.icv_len; plist = get_next(plist); }; - //free the defrag_q queue and return the prframe + /* free the defrag_q queue and return the prframe */ rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Performance defrag!!!!!\n")); -_func_exit_; return prframe; } -//check if need to defrag, if needed queue the frame to defrag_q -union recv_frame* recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame) +/* check if need to defrag, if needed queue the frame to defrag_q */ +union recv_frame *recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame) { u8 ismfrag; u8 fragnum; @@ -2855,7 +2582,6 @@ union recv_frame* recvframe_chk_defrag(PADAPTER padapter, union recv_frame *prec union recv_frame *prtnframe = NULL; _queue *pfree_recv_queue, *pdefrag_q; -_func_enter_; pstapriv = &padapter->stapriv; @@ -2863,108 +2589,87 @@ _func_enter_; pfree_recv_queue = &padapter->recvpriv.free_recv_queue; - //need to define struct of wlan header frame ctrl + /* need to define struct of wlan header frame ctrl */ ismfrag = pfhdr->attrib.mfrag; fragnum = pfhdr->attrib.frag_num; psta_addr = pfhdr->attrib.ta; psta = rtw_get_stainfo(pstapriv, psta_addr); - if (psta == NULL) - { + if (psta == NULL) { u8 type = GetFrameType(pfhdr->rx_data); if (type != WIFI_DATA_TYPE) { psta = rtw_get_bcmc_stainfo(padapter); pdefrag_q = &psta->sta_recvpriv.defrag_q; } else pdefrag_q = NULL; - } - else + } else pdefrag_q = &psta->sta_recvpriv.defrag_q; - if ((ismfrag==0) && (fragnum==0)) - { - prtnframe = precv_frame;//isn't a fragment frame + if ((ismfrag == 0) && (fragnum == 0)) { + prtnframe = precv_frame;/* isn't a fragment frame */ } - if (ismfrag==1) - { - //0~(n-1) fragment frame - //enqueue to defraf_g - if(pdefrag_q != NULL) - { - if(fragnum==0) - { - //the first fragment - if(_rtw_queue_empty(pdefrag_q) == _FALSE) - { - //free current defrag_q + if (ismfrag == 1) { + /* 0~(n-1) fragment frame */ + /* enqueue to defraf_g */ + if (pdefrag_q != NULL) { + if (fragnum == 0) { + /* the first fragment */ + if (_rtw_queue_empty(pdefrag_q) == _FALSE) { + /* free current defrag_q */ rtw_free_recvframe_queue(pdefrag_q, pfree_recv_queue); } } - //Then enqueue the 0~(n-1) fragment into the defrag_q + /* Then enqueue the 0~(n-1) fragment into the defrag_q */ - //_rtw_spinlock(&pdefrag_q->lock); + /* _rtw_spinlock(&pdefrag_q->lock); */ phead = get_list_head(pdefrag_q); rtw_list_insert_tail(&pfhdr->list, phead); - //_rtw_spinunlock(&pdefrag_q->lock); + /* _rtw_spinunlock(&pdefrag_q->lock); */ - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Enqueuq: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum)); - prtnframe=NULL; + prtnframe = NULL; - } - else - { - //can't find this ta's defrag_queue, so free this recv_frame + } else { + /* can't find this ta's defrag_queue, so free this recv_frame */ rtw_free_recvframe(precv_frame, pfree_recv_queue); - prtnframe=NULL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum)); + prtnframe = NULL; } } - if((ismfrag==0)&&(fragnum!=0)) - { - //the last fragment frame - //enqueue the last fragment - if(pdefrag_q != NULL) - { - //_rtw_spinlock(&pdefrag_q->lock); + if ((ismfrag == 0) && (fragnum != 0)) { + /* the last fragment frame */ + /* enqueue the last fragment */ + if (pdefrag_q != NULL) { + /* _rtw_spinlock(&pdefrag_q->lock); */ phead = get_list_head(pdefrag_q); - rtw_list_insert_tail(&pfhdr->list,phead); - //_rtw_spinunlock(&pdefrag_q->lock); + rtw_list_insert_tail(&pfhdr->list, phead); + /* _rtw_spinunlock(&pdefrag_q->lock); */ - //call recvframe_defrag to defrag - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("defrag: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum)); + /* call recvframe_defrag to defrag */ precv_frame = recvframe_defrag(padapter, pdefrag_q); - prtnframe=precv_frame; + prtnframe = precv_frame; - } - else - { - //can't find this ta's defrag_queue, so free this recv_frame + } else { + /* can't find this ta's defrag_queue, so free this recv_frame */ rtw_free_recvframe(precv_frame, pfree_recv_queue); - prtnframe=NULL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum)); + prtnframe = NULL; } } - if((prtnframe!=NULL)&&(prtnframe->u.hdr.attrib.privacy)) - { - //after defrag we must check tkip mic code - if(recvframe_chkmic(padapter, prtnframe)==_FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic(padapter, prtnframe)==_FAIL\n")); - rtw_free_recvframe(prtnframe,pfree_recv_queue); - prtnframe=NULL; + if ((prtnframe != NULL) && (prtnframe->u.hdr.attrib.privacy)) { + /* after defrag we must check tkip mic code */ + if (recvframe_chkmic(padapter, prtnframe) == _FAIL) { + rtw_free_recvframe(prtnframe, pfree_recv_queue); + prtnframe = NULL; } } -_func_exit_; return prtnframe; @@ -2973,10 +2678,10 @@ _func_exit_; int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) { int a_len, padding_len; - u16 nSubframe_Length; + u16 nSubframe_Length; u8 nr_subframes, i; u8 *pdata; - _pkt *sub_pkt,*subframes[MAX_SUBFRAME_COUNT]; + _pkt *sub_pkt, *subframes[MAX_SUBFRAME_COUNT]; struct recv_priv *precvpriv = &padapter->recvpriv; _queue *pfree_recv_queue = &(precvpriv->free_recv_queue); int ret = _SUCCESS; @@ -2984,29 +2689,27 @@ int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) nr_subframes = 0; recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen); - - if(prframe->u.hdr.attrib.iv_len >0) - { + + if (prframe->u.hdr.attrib.iv_len > 0) recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len); - } a_len = prframe->u.hdr.len; pdata = prframe->u.hdr.rx_data; - while(a_len > ETH_HLEN) { + while (a_len > ETH_HLEN) { /* Offset 12 denote 2 mac address */ nSubframe_Length = RTW_GET_BE16(pdata + 12); - if( a_len < (ETHERNET_HEADER_SIZE + nSubframe_Length) ) { - DBG_871X("nRemain_Length is %d and nSubframe_Length is : %d\n",a_len,nSubframe_Length); + if (a_len < (ETHERNET_HEADER_SIZE + nSubframe_Length)) { + RTW_INFO("nRemain_Length is %d and nSubframe_Length is : %d\n", a_len, nSubframe_Length); break; } sub_pkt = rtw_os_alloc_msdu_pkt(prframe, nSubframe_Length, pdata); if (sub_pkt == NULL) { - DBG_871X("%s(): allocate sub packet fail !!!\n",__FUNCTION__); + RTW_INFO("%s(): allocate sub packet fail !!!\n", __FUNCTION__); break; } @@ -3016,21 +2719,20 @@ int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) subframes[nr_subframes++] = sub_pkt; - if(nr_subframes >= MAX_SUBFRAME_COUNT) { - DBG_871X("ParseSubframe(): Too many Subframes! Packets dropped!\n"); + if (nr_subframes >= MAX_SUBFRAME_COUNT) { + RTW_INFO("ParseSubframe(): Too many Subframes! Packets dropped!\n"); break; } pdata += nSubframe_Length; a_len -= nSubframe_Length; - if(a_len != 0) { - padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4-1)); - if(padding_len == 4) { + if (a_len != 0) { + padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4 - 1)); + if (padding_len == 4) padding_len = 0; - } - if(a_len < padding_len) { - DBG_871X("ParseSubframe(): a_len < padding_len !\n"); + if (a_len < padding_len) { + RTW_INFO("ParseSubframe(): a_len < padding_len !\n"); break; } pdata += padding_len; @@ -3038,18 +2740,17 @@ int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) } } - for(i=0; iu.hdr.attrib); - } } prframe->u.hdr.len = 0; - rtw_free_recvframe(prframe, pfree_recv_queue);//free this recv_frame - + rtw_free_recvframe(prframe, pfree_recv_queue);/* free this recv_frame */ + return ret; } @@ -3060,69 +2761,62 @@ int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num) struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; u8 wsize = preorder_ctrl->wsize_b; - u16 wend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;//% 4096; + u16 wend = (preorder_ctrl->indicate_seq + wsize - 1) & 0xFFF; /* % 4096; */ - // Rx Reorder initialize condition. - if (preorder_ctrl->indicate_seq == 0xFFFF) - { + /* Rx Reorder initialize condition. */ + if (preorder_ctrl->indicate_seq == 0xFFFF) { preorder_ctrl->indicate_seq = seq_num; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d init IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, seq_num); - #endif +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d init IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, seq_num); +#endif - //DbgPrint("check_indicate_seq, 1st->indicate_seq=%d\n", precvpriv->indicate_seq); + /* DbgPrint("check_indicate_seq, 1st->indicate_seq=%d\n", precvpriv->indicate_seq); */ } - //DbgPrint("enter->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + /* DbgPrint("enter->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); */ - // Drop out the packet which SeqNum is smaller than WinStart - if( SN_LESS(seq_num, preorder_ctrl->indicate_seq) ) - { - //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum)); - //DbgPrint("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + /* Drop out the packet which SeqNum is smaller than WinStart */ + if (SN_LESS(seq_num, preorder_ctrl->indicate_seq)) { + /* DbgPrint("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); */ - #ifdef DBG_RX_DROP_FRAME - DBG_871X("%s IndicateSeq: %d > NewSeq: %d\n", __FUNCTION__, - preorder_ctrl->indicate_seq, seq_num); - #endif +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("%s IndicateSeq: %d > NewSeq: %d\n", __FUNCTION__, + preorder_ctrl->indicate_seq, seq_num); +#endif return _FALSE; } - // - // Sliding window manipulation. Conditions includes: - // 1. Incoming SeqNum is equal to WinStart =>Window shift 1 - // 2. Incoming SeqNum is larger than the WinEnd => Window shift N - // - if( SN_EQUAL(seq_num, preorder_ctrl->indicate_seq) ) - { + /* */ + /* Sliding window manipulation. Conditions includes: */ + /* 1. Incoming SeqNum is equal to WinStart =>Window shift 1 */ + /* 2. Incoming SeqNum is larger than the WinEnd => Window shift N */ + /* */ + if (SN_EQUAL(seq_num, preorder_ctrl->indicate_seq)) { preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d SN_EQUAL IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, seq_num); - #endif - } - else if(SN_LESS(wend, seq_num)) - { - //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum)); - //DbgPrint("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d SN_EQUAL IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, seq_num); +#endif + } else if (SN_LESS(wend, seq_num)) { + /* DbgPrint("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); */ - // boundary situation, when seq_num cross 0xFFF - if(seq_num >= (wsize - 1)) - preorder_ctrl->indicate_seq = seq_num + 1 -wsize; + /* boundary situation, when seq_num cross 0xFFF */ + if (seq_num >= (wsize - 1)) + preorder_ctrl->indicate_seq = seq_num + 1 - wsize; else preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1; pdbgpriv->dbg_rx_ampdu_window_shift_cnt++; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d SN_LESS(wend, seq_num) IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, seq_num); - #endif +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d SN_LESS(wend, seq_num) IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, seq_num); +#endif } - //DbgPrint("exit->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + /* DbgPrint("exit->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); */ return _TRUE; } @@ -3136,55 +2830,46 @@ int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union rec union recv_frame *pnextrframe; struct rx_pkt_attrib *pnextattrib; - //DbgPrint("+enqueue_reorder_recvframe()\n"); + /* DbgPrint("+enqueue_reorder_recvframe()\n"); */ - //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); - //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); + /* _enter_critical_ex(&ppending_recvframe_queue->lock, &irql); */ + /* _rtw_spinlock_ex(&ppending_recvframe_queue->lock); */ phead = get_list_head(ppending_recvframe_queue); plist = get_next(phead); - while(rtw_end_of_queue_search(phead, plist) == _FALSE) - { + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { pnextrframe = LIST_CONTAINOR(plist, union recv_frame, u); pnextattrib = &pnextrframe->u.hdr.attrib; - if(SN_LESS(pnextattrib->seq_num, pattrib->seq_num)) - { + if (SN_LESS(pnextattrib->seq_num, pattrib->seq_num)) plist = get_next(plist); - } - else if( SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) - { - //Duplicate entry is found!! Do not insert current entry. - //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Duplicate packet is dropped!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum)); + else if (SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) { + /* Duplicate entry is found!! Do not insert current entry. */ - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */ return _FALSE; - } - else - { + } else break; - } - //DbgPrint("enqueue_reorder_recvframe():while\n"); + /* DbgPrint("enqueue_reorder_recvframe():while\n"); */ } - //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); - //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); + /* _enter_critical_ex(&ppending_recvframe_queue->lock, &irql); */ + /* _rtw_spinlock_ex(&ppending_recvframe_queue->lock); */ rtw_list_delete(&(prframe->u.hdr.list)); rtw_list_insert_tail(&(prframe->u.hdr.list), plist); - //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + /* _rtw_spinunlock_ex(&ppending_recvframe_queue->lock); */ + /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */ - //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Pkt insert into buffer!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum)); return _TRUE; } @@ -3192,25 +2877,21 @@ int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union rec void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq); void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq) { - if(current_seq < prev_seq) - { - pdbgpriv->dbg_rx_ampdu_loss_count+= (4096 + current_seq - prev_seq); + if (current_seq < prev_seq) + pdbgpriv->dbg_rx_ampdu_loss_count += (4096 + current_seq - prev_seq); - } else - { - pdbgpriv->dbg_rx_ampdu_loss_count+= (current_seq - prev_seq); - } + pdbgpriv->dbg_rx_ampdu_loss_count += (current_seq - prev_seq); } int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced); int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced) { - //_irqL irql; - //u8 bcancelled; + /* _irqL irql; */ + /* u8 bcancelled; */ _list *phead, *plist; union recv_frame *prframe; struct rx_pkt_attrib *pattrib; - //u8 index = 0; + /* u8 index = 0; */ int bPktInBuf = _FALSE; struct recv_priv *precvpriv = &padapter->recvpriv; _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; @@ -3219,62 +2900,54 @@ int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *pre DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_in_oder); - //DbgPrint("+recv_indicatepkts_in_order\n"); + /* DbgPrint("+recv_indicatepkts_in_order\n"); */ - //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); - //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); + /* _enter_critical_ex(&ppending_recvframe_queue->lock, &irql); */ + /* _rtw_spinlock_ex(&ppending_recvframe_queue->lock); */ - phead = get_list_head(ppending_recvframe_queue); + phead = get_list_head(ppending_recvframe_queue); plist = get_next(phead); #if 0 - // Check if there is any other indication thread running. - if(pTS->RxIndicateState == RXTS_INDICATE_PROCESSING) + /* Check if there is any other indication thread running. */ + if (pTS->RxIndicateState == RXTS_INDICATE_PROCESSING) return; #endif - // Handling some condition for forced indicate case. - if(bforced==_TRUE) - { + /* Handling some condition for forced indicate case. */ + if (bforced == _TRUE) { pdbgpriv->dbg_rx_ampdu_forced_indicate_count++; - if(rtw_is_list_empty(phead)) - { - // _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); + if (rtw_is_list_empty(phead)) { + /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */ + /* _rtw_spinunlock_ex(&ppending_recvframe_queue->lock); */ return _TRUE; } - - prframe = LIST_CONTAINOR(plist, union recv_frame, u); - pattrib = &prframe->u.hdr.attrib; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif - recv_indicatepkts_pkt_loss_cnt(pdbgpriv,preorder_ctrl->indicate_seq,pattrib->seq_num); - preorder_ctrl->indicate_seq = pattrib->seq_num; - - } - - // Prepare indication list and indication. - // Check if there is any packet need indicate. - while(!rtw_is_list_empty(phead)) - { - prframe = LIST_CONTAINOR(plist, union recv_frame, u); pattrib = &prframe->u.hdr.attrib; - if(!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, - ("recv_indicatepkts_in_order: indicate=%d seq=%d amsdu=%d\n", - preorder_ctrl->indicate_seq, pattrib->seq_num, pattrib->amsdu)); +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); +#endif + recv_indicatepkts_pkt_loss_cnt(pdbgpriv, preorder_ctrl->indicate_seq, pattrib->seq_num); + preorder_ctrl->indicate_seq = pattrib->seq_num; + + } + + /* Prepare indication list and indication. */ + /* Check if there is any packet need indicate. */ + while (!rtw_is_list_empty(phead)) { + + prframe = LIST_CONTAINOR(plist, union recv_frame, u); + pattrib = &prframe->u.hdr.attrib; + + if (!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) { #if 0 - // This protect buffer from overflow. - if(index >= REORDER_WIN_SIZE) - { - RT_ASSERT(FALSE, ("IndicateRxReorderList(): Buffer overflow!! \n")); + /* This protect buffer from overflow. */ + if (index >= REORDER_WIN_SIZE) { + RT_ASSERT(FALSE, ("IndicateRxReorderList(): Buffer overflow!!\n")); bPktInBuf = TRUE; break; } @@ -3283,94 +2956,79 @@ int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *pre plist = get_next(plist); rtw_list_delete(&(prframe->u.hdr.list)); - if(SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num)) - { + if (SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num)) { preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif +#endif } #if 0 index++; - if(index==1) - { - //Cancel previous pending timer. - //PlatformCancelTimer(Adapter, &pTS->RxPktPendingTimer); - if(bforced!=_TRUE) - { - //DBG_871X("_cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled);\n"); + if (index == 1) { + /* Cancel previous pending timer. */ + /* PlatformCancelTimer(Adapter, &pTS->RxPktPendingTimer); */ + if (bforced != _TRUE) { + /* RTW_INFO("_cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled);\n"); */ _cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled); } } #endif - //Set this as a lock to make sure that only one thread is indicating packet. - //pTS->RxIndicateState = RXTS_INDICATE_PROCESSING; + /* Set this as a lock to make sure that only one thread is indicating packet. */ + /* pTS->RxIndicateState = RXTS_INDICATE_PROCESSING; */ - // Indicate packets - //RT_ASSERT((index<=REORDER_WIN_SIZE), ("RxReorderIndicatePacket(): Rx Reorder buffer full!! \n")); + /* Indicate packets */ + /* RT_ASSERT((index<=REORDER_WIN_SIZE), ("RxReorderIndicatePacket(): Rx Reorder buffer full!!\n")); */ - //indicate this recv_frame - //DbgPrint("recv_indicatepkts_in_order, indicate_seq=%d, seq_num=%d\n", precvpriv->indicate_seq, pattrib->seq_num); - if(!pattrib->amsdu) - { - //DBG_871X("recv_indicatepkts_in_order, amsdu!=1, indicate_seq=%d, seq_num=%d\n", preorder_ctrl->indicate_seq, pattrib->seq_num); + /* indicate this recv_frame */ + /* DbgPrint("recv_indicatepkts_in_order, indicate_seq=%d, seq_num=%d\n", precvpriv->indicate_seq, pattrib->seq_num); */ + if (!pattrib->amsdu) { + /* RTW_INFO("recv_indicatepkts_in_order, amsdu!=1, indicate_seq=%d, seq_num=%d\n", preorder_ctrl->indicate_seq, pattrib->seq_num); */ if (!RTW_CANNOT_RUN(padapter)) rtw_recv_indicatepkt(padapter, prframe);/*indicate this recv_frame*/ - } - else if(pattrib->amsdu==1) - { - if(amsdu_to_msdu(padapter, prframe)!=_SUCCESS) - { + } else if (pattrib->amsdu == 1) { + if (amsdu_to_msdu(padapter, prframe) != _SUCCESS) rtw_free_recvframe(prframe, &precvpriv->free_recv_queue); - } - } - else - { - //error condition; + } else { + /* error condition; */ } - //Update local variables. + /* Update local variables. */ bPktInBuf = _FALSE; - } - else - { + } else { bPktInBuf = _TRUE; break; } - //DbgPrint("recv_indicatepkts_in_order():while\n"); + /* DbgPrint("recv_indicatepkts_in_order():while\n"); */ } - //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + /* _rtw_spinunlock_ex(&ppending_recvframe_queue->lock); */ + /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */ + +#if 0 + /* Release the indication lock and set to new indication step. */ + if (bPktInBuf) { + /* Set new pending timer. */ + /* pTS->RxIndicateState = RXTS_INDICATE_REORDER; */ + /* PlatformSetTimer(Adapter, &pTS->RxPktPendingTimer, pHTInfo->RxReorderPendingTime); */ -/* - //Release the indication lock and set to new indication step. - if(bPktInBuf) - { - // Set new pending timer. - //pTS->RxIndicateState = RXTS_INDICATE_REORDER; - //PlatformSetTimer(Adapter, &pTS->RxPktPendingTimer, pHTInfo->RxReorderPendingTime); - //DBG_871X("_set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME)\n"); _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + } else { + /* pTS->RxIndicateState = RXTS_INDICATE_IDLE; */ } - else - { - //pTS->RxIndicateState = RXTS_INDICATE_IDLE; - } -*/ - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); +#endif + /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */ - //return _TRUE; + /* return _TRUE; */ return bPktInBuf; } @@ -3388,122 +3046,106 @@ int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe) DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_reoder); - if(!pattrib->amsdu) - { - //s1. - retval = wlanhdr_to_ethhdr(prframe); - if (retval != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__); - #endif - return retval; - } + if (!pattrib->amsdu) { + /* s1. */ + retval = wlanhdr_to_ethhdr(prframe); + if (retval != _SUCCESS) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__); +#endif + return retval; + } - //if ((pattrib->qos!=1) /*|| pattrib->priority!=0 || IS_MCAST(pattrib->ra)*/ - // || (pattrib->eth_type==0x0806) || (pattrib->ack_policy!=0)) - if (pattrib->qos!=1) - { + /* if ((pattrib->qos!=1) || pattrib->priority!=0 || IS_MCAST(pattrib->ra) */ + /* || (pattrib->eth_type==0x0806) || (pattrib->ack_policy!=0)) */ + if (pattrib->qos != 1) { if (!RTW_CANNOT_RUN(padapter)) { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ recv_indicatepkt_reorder -recv_func recv_indicatepkt\n" )); rtw_recv_indicatepkt(padapter, prframe); return _SUCCESS; } - - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s pattrib->qos !=1\n", __FUNCTION__); - #endif - + +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s pattrib->qos !=1\n", __FUNCTION__); +#endif + return _FAIL; - + } - if (preorder_ctrl->enable == _FALSE) - { - //indicate this recv_frame + if (preorder_ctrl->enable == _FALSE) { + /* indicate this recv_frame */ preorder_ctrl->indicate_seq = pattrib->seq_num; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif - - rtw_recv_indicatepkt(padapter, prframe); - - preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif - - return _SUCCESS; - } +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); +#endif + + rtw_recv_indicatepkt(padapter, prframe); + + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) % 4096; +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); +#endif + + return _SUCCESS; + } #ifndef CONFIG_RECV_REORDERING_CTRL - //indicate this recv_frame + /* indicate this recv_frame */ rtw_recv_indicatepkt(padapter, prframe); return _SUCCESS; #endif - } - else if(pattrib->amsdu==1) //temp filter -> means didn't support A-MSDUs in a A-MPDU - { - if (preorder_ctrl->enable == _FALSE) - { + } else if (pattrib->amsdu == 1) { /* temp filter->means didn't support A-MSDUs in a A-MPDU */ + if (preorder_ctrl->enable == _FALSE) { preorder_ctrl->indicate_seq = pattrib->seq_num; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); +#endif retval = amsdu_to_msdu(padapter, prframe); - preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) % 4096; +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); +#endif - if(retval != _SUCCESS){ - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); - #endif + if (retval != _SUCCESS) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); +#endif } return retval; } - } - else - { + } else { } _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, - ("recv_indicatepkt_reorder: indicate=%d seq=%d\n", - preorder_ctrl->indicate_seq, pattrib->seq_num)); - //s2. check if winstart_b(indicate_seq) needs to been updated - if(!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) - { + /* s2. check if winstart_b(indicate_seq) needs to been updated */ + if (!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) { pdbgpriv->dbg_rx_ampdu_drop_count++; - //pHTInfo->RxReorderDropCounter++; - //ReturnRFDList(Adapter, pRfd); - //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("RxReorderIndicatePacket() ==> Packet Drop!!\n")); - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - //return _FAIL; + /* pHTInfo->RxReorderDropCounter++; */ + /* ReturnRFDList(Adapter, pRfd); */ + /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */ + /* return _FAIL; */ - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s check_indicate_seq fail\n", __FUNCTION__); - #endif -#if 0 +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s check_indicate_seq fail\n", __FUNCTION__); +#endif +#if 0 rtw_recv_indicatepkt(padapter, prframe); _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); - + goto _success_exit; #else goto _err_exit; @@ -3511,37 +3153,37 @@ int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe) } - //s3. Insert all packet into Reorder Queue to maintain its ordering. - if(!enqueue_reorder_recvframe(preorder_ctrl, prframe)) - { - //DbgPrint("recv_indicatepkt_reorder, enqueue_reorder_recvframe fail!\n"); - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - //return _FAIL; - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s enqueue_reorder_recvframe fail\n", __FUNCTION__); - #endif + /* s3. Insert all packet into Reorder Queue to maintain its ordering. */ + if (!enqueue_reorder_recvframe(preorder_ctrl, prframe)) { + /* DbgPrint("recv_indicatepkt_reorder, enqueue_reorder_recvframe fail!\n"); */ + /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */ + /* return _FAIL; */ +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s enqueue_reorder_recvframe fail\n", __FUNCTION__); +#endif goto _err_exit; } - //s4. - // Indication process. - // After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets - // with the SeqNum smaller than latest WinStart and buffer other packets. - // - // For Rx Reorder condition: - // 1. All packets with SeqNum smaller than WinStart => Indicate - // 2. All packets with SeqNum larger than or equal to WinStart => Buffer it. - // + /* s4. */ + /* Indication process. */ + /* After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets */ + /* with the SeqNum smaller than latest WinStart and buffer other packets. */ + /* */ + /* For Rx Reorder condition: */ + /* 1. All packets with SeqNum smaller than WinStart => Indicate */ + /* 2. All packets with SeqNum larger than or equal to WinStart => Buffer it. */ + /* */ - //recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE); - if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _FALSE)==_TRUE) - { - _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + /* recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE); */ + if (recv_indicatepkts_in_order(padapter, preorder_ctrl, _FALSE) == _TRUE) { + if (!preorder_ctrl->bReorderWaiting) { + preorder_ctrl->bReorderWaiting = _TRUE; + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + } _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); - } - else - { + } else { + preorder_ctrl->bReorderWaiting = _FALSE; _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); } @@ -3553,7 +3195,7 @@ _success_exit: _err_exit: - _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); return _FAIL; } @@ -3570,14 +3212,15 @@ void rtw_reordering_ctrl_timeout_handler(void *pcontext) if (RTW_CANNOT_RUN(padapter)) return; - //DBG_871X("+rtw_reordering_ctrl_timeout_handler()=>\n"); + /* RTW_INFO("+rtw_reordering_ctrl_timeout_handler()=>\n"); */ _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); - if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE)==_TRUE) - { - _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); - } + if (preorder_ctrl) + preorder_ctrl->bReorderWaiting = _FALSE; + + if (recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE) == _TRUE) + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); @@ -3587,67 +3230,56 @@ int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe); int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe) { int retval = _SUCCESS; - //struct recv_priv *precvpriv = &padapter->recvpriv; - //struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; + /* struct recv_priv *precvpriv = &padapter->recvpriv; */ + /* struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; */ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; #ifdef CONFIG_TDLS struct sta_info *psta = prframe->u.hdr.psta; -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ #ifdef CONFIG_80211N_HT struct ht_priv *phtpriv = &pmlmepriv->htpriv; - + DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate); #ifdef CONFIG_TDLS - if( (phtpriv->ht_option==_TRUE) || - ((psta->tdls_sta_state & TDLS_LINKED_STATE) && - (psta->htpriv.ht_option==_TRUE) && - (psta->htpriv.ampdu_enable==_TRUE))) //B/G/N Mode + if ((phtpriv->ht_option == _TRUE) || + ((psta->tdls_sta_state & TDLS_LINKED_STATE) && + (psta->htpriv.ht_option == _TRUE) && + (psta->htpriv.ampdu_enable == _TRUE))) /* B/G/N Mode */ #else - if(phtpriv->ht_option==_TRUE) //B/G/N Mode -#endif //CONFIG_TDLS + if (phtpriv->ht_option == _TRUE) /* B/G/N Mode */ +#endif /* CONFIG_TDLS */ { - //prframe->u.hdr.preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority]; + /* prframe->u.hdr.preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority]; */ + + if (recv_indicatepkt_reorder(padapter, prframe) != _SUCCESS) { /* including perform A-MPDU Rx Ordering Buffer Control */ +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s recv_indicatepkt_reorder error!\n", __FUNCTION__); +#endif - if(recv_indicatepkt_reorder(padapter, prframe)!=_SUCCESS)// including perform A-MPDU Rx Ordering Buffer Control - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s recv_indicatepkt_reorder error!\n", __FUNCTION__); - #endif - if (!RTW_CANNOT_RUN(padapter)) { retval = _FAIL; return retval; } } - } - else //B/G mode + } else /* B/G mode */ #endif { - retval=wlanhdr_to_ethhdr (prframe); - if(retval != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__); - #endif + retval = wlanhdr_to_ethhdr(prframe); + if (retval != _SUCCESS) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__); +#endif return retval; } if (!RTW_CANNOT_RUN(padapter)) { - //indicate this recv_frame - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\n" )); + /* indicate this recv_frame */ rtw_recv_indicatepkt(padapter, prframe); - } - else - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\n" )); + } else { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)" - , rtw_is_drv_stopped(padapter)?"True":"False" - , rtw_is_surprise_removed(padapter)?"True":"False")); retval = _FAIL; return retval; } @@ -3662,114 +3294,118 @@ int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe) int validate_mp_recv_frame(_adapter *adapter, union recv_frame *precv_frame) { int ret = _SUCCESS; - u8 *ptr = precv_frame->u.hdr.rx_data; - u8 type,subtype; + u8 *ptr = precv_frame->u.hdr.rx_data; + u8 type, subtype; + struct mp_priv *pmppriv = &adapter->mppriv; + struct mp_tx *pmptx; - if(!adapter->mppriv.bmac_filter) - return ret; -#if 0 - if (1){ + pmptx = &pmppriv->tx; + +#if 0 + if (1) { u8 bDumpRxPkt; type = GetFrameType(ptr); - subtype = GetFrameSubType(ptr); //bit(7)~bit(2) - + subtype = GetFrameSubType(ptr); /* bit(7)~bit(2) */ + rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt)); - if(bDumpRxPkt ==1){//dump all rx packets + if (bDumpRxPkt == 1) { /* dump all rx packets */ int i; - DBG_871X("############ type:0x%02x subtype:0x%02x ################# \n",type,subtype); - - for(i=0; i<64;i=i+8) - DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), - *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); - DBG_871X("############################# \n"); + RTW_INFO("############ type:0x%02x subtype:0x%02x #################\n", type, subtype); + + for (i = 0; i < 64; i = i + 8) + RTW_INFO("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr + i), + *(ptr + i + 1), *(ptr + i + 2) , *(ptr + i + 3) , *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7)); + RTW_INFO("#############################\n"); + } + } +#endif + if (pmppriv->bloopback) { + if (_rtw_memcmp(ptr + 24, pmptx->buf + 24, precv_frame->u.hdr.len - 24) == _FALSE) { + RTW_INFO("Compare payload content Fail !!!\n"); + ret = _FAIL; } } -#endif - if(_rtw_memcmp( GetAddr2Ptr(ptr), adapter->mppriv.mac_filter, ETH_ALEN) == _FALSE ) + if (!adapter->mppriv.bmac_filter) + return ret; + + if (_rtw_memcmp(GetAddr2Ptr(ptr), adapter->mppriv.mac_filter, ETH_ALEN) == _FALSE) ret = _FAIL; return ret; } -#endif -static sint MPwlanhdr_to_ethhdr ( union recv_frame *precvframe) +static sint MPwlanhdr_to_ethhdr(union recv_frame *precvframe) { sint rmv_len; u16 eth_type, len; u8 bsnaphdr; u8 *psnap_type; - u8 mcastheadermac[]={0x01,0x00,0x5e}; - + u8 mcastheadermac[] = {0x01, 0x00, 0x5e}; + struct ieee80211_snap_hdr *psnap; - - sint ret=_SUCCESS; - _adapter *adapter =precvframe->u.hdr.adapter; + + sint ret = _SUCCESS; + _adapter *adapter = precvframe->u.hdr.adapter; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - u8 *ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field - struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib; + u8 *ptr = get_recvframe_data(precvframe) ; /* point to frame_ctrl field */ + struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; -_func_enter_; - if(pattrib->encrypt){ - recvframe_pull_tail(precvframe, pattrib->icv_len); - } + if (pattrib->encrypt) + recvframe_pull_tail(precvframe, pattrib->icv_len); - psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len); - psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + psnap = (struct ieee80211_snap_hdr *)(ptr + pattrib->hdrlen + pattrib->iv_len); + psnap_type = ptr + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE; /* convert hdr + possible LLC headers into Ethernet header */ - //eth_type = (psnap_type[0] << 8) | psnap_type[1]; - if((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) && - (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && - (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)==_FALSE) )|| - //eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || - _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)){ + /* eth_type = (psnap_type[0] << 8) | psnap_type[1]; */ + if ((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) && + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2) == _FALSE)) || + /* eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || */ + _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)) { /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ bsnaphdr = _TRUE; - } - else { + } else { /* Leave Ethernet header part of hdr and full payload */ bsnaphdr = _FALSE; } - rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0); + rmv_len = pattrib->hdrlen + pattrib->iv_len + (bsnaphdr ? SNAP_SIZE : 0); len = precvframe->u.hdr.len - rmv_len; - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n\n", pattrib->hdrlen, pattrib->iv_len)); - _rtw_memcpy(ð_type, ptr+rmv_len, 2); - eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type + _rtw_memcpy(ð_type, ptr + rmv_len, 2); + eth_type = ntohs((unsigned short)eth_type); /* pattrib->ether_type */ pattrib->eth_type = eth_type; { - ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+ (bsnaphdr?2:0))); + ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + (bsnaphdr ? 2 : 0))); } _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN); - _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN); + _rtw_memcpy(ptr + ETH_ALEN, pattrib->src, ETH_ALEN); - if(!bsnaphdr) { + if (!bsnaphdr) { len = htons(len); - _rtw_memcpy(ptr+12, &len, 2); + _rtw_memcpy(ptr + 12, &len, 2); } - - 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. + len = htons(pattrib->seq_num); + /* RTW_INFO("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; } @@ -3784,34 +3420,28 @@ int mp_recv_frame(_adapter *padapter, union recv_frame *rframe) #ifdef CONFIG_MP_INCLUDED struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mp_priv *pmppriv = &padapter->mppriv; -#endif //CONFIG_MP_INCLUDED +#endif /* CONFIG_MP_INCLUDED */ u8 type; u8 *ptr = rframe->u.hdr.rx_data; u8 *psa, *pda, *pbssid; struct sta_info *psta = NULL; - DBG_COUNTER(padapter->rx_logs.core_rx_pre); - - if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) )//&&(padapter->mppriv.check_mp_pkt == 0)) - { - if (pattrib->crc_err == 1){ + DBG_COUNTER(padapter->rx_logs.core_rx_pre); + + if ((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)) + 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) - { - //RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("MP - Not in loopback mode , drop pkt \n")); + if (pmppriv->rx_bindicatePkt == _FALSE) { ret = _FAIL; - rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame + rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */ goto exit; - } - else - { + } else { type = GetFrameType(ptr); pattrib->to_fr_ds = get_tofr_ds(ptr); pattrib->frag_num = GetFragNum(ptr); @@ -3821,137 +3451,124 @@ int mp_recv_frame(_adapter *padapter, union recv_frame *rframe) pattrib->mdata = GetMData(ptr); pattrib->privacy = GetPrivacy(ptr); pattrib->order = GetOrder(ptr); - - if(type ==WIFI_DATA_TYPE) - { + + if (type == WIFI_DATA_TYPE) { pda = get_da(ptr); psa = get_sa(ptr); pbssid = get_hdr_bssid(ptr); - + _rtw_memcpy(pattrib->dst, pda, ETH_ALEN); _rtw_memcpy(pattrib->src, psa, ETH_ALEN); _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN); - - switch(pattrib->to_fr_ds) - { - case 0: - _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); - _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); - ret = sta2sta_data_frame(padapter, rframe, &psta); - break; - case 1: - - _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN); - ret = ap2sta_data_frame(padapter, rframe, &psta); - - break; + switch (pattrib->to_fr_ds) { + case 0: + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); + ret = sta2sta_data_frame(padapter, rframe, &psta); + break; - case 2: - _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN); - _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); - ret = sta2ap_data_frame(padapter, rframe, &psta); - break; + case 1: - case 3: - _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); - _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); - ret =_FAIL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" case 3\n")); - break; + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN); + ret = ap2sta_data_frame(padapter, rframe, &psta); - default: - ret =_FAIL; - break; - } - - ret = MPwlanhdr_to_ethhdr (rframe); - - if (ret != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__); - #endif - rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame + break; + + case 2: + _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); + ret = sta2ap_data_frame(padapter, rframe, &psta); + break; + + case 3: + _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); + ret = _FAIL; + break; + + default: + ret = _FAIL; + break; + } + + ret = MPwlanhdr_to_ethhdr(rframe); + + if (ret != _SUCCESS) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("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 (!RTW_CANNOT_RUN(padapter)) { - RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: recv_func rtw_recv_indicatepkt\n" )); - //indicate this recv_frame + /* indicate this recv_frame */ ret = rtw_recv_indicatepkt(padapter, rframe); - if (ret != _SUCCESS) - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__); - #endif - rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame - ret = _FAIL; + if (ret != _SUCCESS) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__); +#endif + rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */ + ret = _FAIL; - goto exit; - } - } - else - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: rtw_free_recvframe\n" )); - RT_TRACE(_module_rtl871x_recv_c_, _drv_debug_, ("recv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)" - , rtw_is_drv_stopped(padapter)?"True":"False" - , rtw_is_surprise_removed(padapter)?"True":"False")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)\n", __func__, - rtw_is_drv_stopped(padapter)?"True":"False", - rtw_is_surprise_removed(padapter)?"True":"False"); - #endif - ret = _FAIL; - rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame goto exit; + } + } else { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)\n", __func__, + rtw_is_drv_stopped(padapter) ? "True" : "False", + rtw_is_surprise_removed(padapter) ? "True" : "False"); +#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 + rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */ ret = _FAIL; exit: - return ret; + return ret; } +#endif static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, u8 *buf) { -#define CHAN2FREQ(a) ((a < 14)?(2407+5*a):(5000+5*a)) +#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) +#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) | \ */ @@ -4023,9 +3640,9 @@ static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, 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 + /* always append FCS */ + hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_FCS; + if (0) hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_DATAPAD; @@ -4062,9 +3679,9 @@ static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, /* channel flags */ tmp_16bit = 0; - if (pHalData->CurrentBandType == 0) + if (pHalData->CurrentBandType == 0) tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_2GHZ); - else + else tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_5GHZ); if (pattrib->data_rate < 12) { @@ -4075,9 +3692,8 @@ static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, /* OFDM */ tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_OFDM); } - } else { + } else tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_DYN); - } memcpy(&hdr_buf[rt_len], &tmp_16bit, 2); rt_len += 2; @@ -4119,15 +3735,15 @@ static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, /* bandwidth */ hdr_buf[rt_len] |= BIT0; - hdr_buf[rt_len+1] |= (pattrib->bw & 0x03); + hdr_buf[rt_len + 1] |= (pattrib->bw & 0x03); /* guard interval */ hdr_buf[rt_len] |= BIT2; - hdr_buf[rt_len+1] |= (pattrib->sgi & 0x01) << 2; + hdr_buf[rt_len + 1] |= (pattrib->sgi & 0x01) << 2; /* STBC */ hdr_buf[rt_len] |= BIT5; - hdr_buf[rt_len+1] |= (pattrib->stbc & 0x03) << 5; + hdr_buf[rt_len + 1] |= (pattrib->stbc & 0x03) << 5; rt_len += 2; @@ -4154,27 +3770,27 @@ static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, /* STBC */ tmp_16bit |= BIT0; - hdr_buf[rt_len+2] |= (pattrib->stbc & 0x01); + hdr_buf[rt_len + 2] |= (pattrib->stbc & 0x01); /* Guard interval */ tmp_16bit |= BIT2; - hdr_buf[rt_len+2] |= (pattrib->sgi & 0x01) << 2; + 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; + 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) + if (pattrib->bw == 0) hdr_buf[rt_len] |= 0; - else if (pattrib->bw == 1) + else if (pattrib->bw == 1) hdr_buf[rt_len] |= 1; - else if (pattrib->bw == 2) + else if (pattrib->bw == 2) hdr_buf[rt_len] |= 4; - else if (pattrib->bw == 3) + else if (pattrib->bw == 3) hdr_buf[rt_len] |= 11; rt_len += 1; @@ -4211,7 +3827,7 @@ static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, /* 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__); + RTW_INFO("%s:%d %s headroom is too small.\n", __FILE__, __LINE__, __func__); ret = _FAIL; return ret; } @@ -4220,9 +3836,8 @@ static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, if (ptr) { rtap_hdr->it_len = cpu_to_le16(rt_len); memcpy(ptr, rtap_hdr, rt_len); - } else { + } else ret = _FAIL; - } return ret; @@ -4283,8 +3898,7 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) _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 (padapter->dump_rx_cnt_mode & DUMP_DRV_RX_COUNTER) { if (pattrib->crc_err == 1) padapter->drv_rx_cnt_crcerror++; else @@ -4293,28 +3907,25 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) #endif #ifdef CONFIG_MP_INCLUDED - if (padapter->registrypriv.mp_mode == 1 || padapter->mppriv.bRTWSmbCfg ==_TRUE) - { - mp_recv_frame(padapter,rframe); + if (padapter->registrypriv.mp_mode == 1 || padapter->mppriv.bRTWSmbCfg == _TRUE) { + mp_recv_frame(padapter, rframe); ret = _FAIL; goto exit; - } - else + } else #endif { - //check the frame crtl field and decache - ret = validate_recv_frame(padapter, rframe); - if (ret != _SUCCESS) - { - 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 - goto exit; - } + /* check the frame crtl field and decache */ + ret = validate_recv_frame(padapter, rframe); + if (ret != _SUCCESS) { + rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */ + goto exit; + } } exit: return ret; } +/*#define DBG_RX_BMC_FRAME*/ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe) { int ret = _SUCCESS; @@ -4324,69 +3935,74 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe) _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; #ifdef CONFIG_TDLS u8 *psnap_type, *pcategory; -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ DBG_COUNTER(padapter->rx_logs.core_rx_post); - // DATA FRAME + /* DATA FRAME */ rtw_led_control(padapter, LED_CTL_RX); prframe = decryptor(padapter, prframe); if (prframe == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decryptor: drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__); - #endif +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__); +#endif ret = _FAIL; DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_err); goto _recv_data_drop; } +#ifdef DBG_RX_BMC_FRAME + if (IS_MCAST(pattrib->ra)) { + u8 *pbuf = prframe->u.hdr.rx_data; + u8 *sa_addr = get_sa(pbuf); + + RTW_INFO("%s =>"ADPT_FMT" Rx BC/MC from MAC: "MAC_FMT"\n", __func__, ADPT_ARG(padapter), MAC_ARG(sa_addr)); + } +#endif + #if 0 - if ( padapter->adapter_type == PRIMARY_ADAPTER ) - { - DBG_871X("+++\n"); + if (padapter->adapter_type == PRIMARY_ADAPTER) { + RTW_INFO("+++\n"); { int i; u8 *ptr = get_recvframe_data(prframe); - for(i=0; i<140;i=i+8) - DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr+i), - *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + for (i = 0; i < 140; i = i + 8) + RTW_INFO("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr + i), + *(ptr + i + 1), *(ptr + i + 2) , *(ptr + i + 3) , *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7)); } - DBG_871X("---\n"); + RTW_INFO("---\n"); } #endif #ifdef CONFIG_TDLS - //check TDLS frame - psnap_type = get_recvframe_data(orig_prframe) + pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + /* check TDLS frame */ + psnap_type = get_recvframe_data(orig_prframe) + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE; pcategory = psnap_type + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN; - if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, ETH_TYPE_LEN)) && - ((*pcategory==RTW_WLAN_CATEGORY_TDLS) || (*pcategory==RTW_WLAN_CATEGORY_P2P))){ + 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); - if(ret == _FAIL) + if (ret == _FAIL) goto _exit_recv_func; } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ prframe = recvframe_chk_defrag(padapter, prframe); - if(prframe==NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chk_defrag: drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__); - #endif + if (prframe == NULL) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__); +#endif DBG_COUNTER(padapter->rx_logs.core_rx_post_defrag_err); - goto _recv_data_drop; + goto _recv_data_drop; } - prframe=portctrl(padapter, prframe); + prframe = portctrl(padapter, prframe); if (prframe == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("portctrl: drop pkt \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__); - #endif +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__); +#endif ret = _FAIL; DBG_COUNTER(padapter->rx_logs.core_rx_post_portctrl_err); goto _recv_data_drop; @@ -4400,77 +4016,62 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe) #ifdef CONFIG_80211N_HT ret = process_recv_indicatepkts(padapter, prframe); - if (ret != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recv_func: process_recv_indicatepkts fail! \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s process_recv_indicatepkts fail!\n", __FUNCTION__); - #endif - rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame + if (ret != _SUCCESS) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s process_recv_indicatepkts fail!\n", __FUNCTION__); +#endif + rtw_free_recvframe(orig_prframe, pfree_recv_queue);/* free this recv_frame */ DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_err); goto _recv_data_drop; } -#else // CONFIG_80211N_HT - if (!pattrib->amsdu) - { - ret = wlanhdr_to_ethhdr (prframe); - if (ret != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__); - #endif - rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame +#else /* CONFIG_80211N_HT */ + if (!pattrib->amsdu) { + ret = wlanhdr_to_ethhdr(prframe); + if (ret != _SUCCESS) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__); +#endif + rtw_free_recvframe(orig_prframe, pfree_recv_queue);/* free this recv_frame */ goto _recv_data_drop; } if (!RTW_CANNOT_RUN(padapter)) { - RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: recv_func rtw_recv_indicatepkt\n" )); - //indicate this recv_frame + /* indicate this recv_frame */ ret = rtw_recv_indicatepkt(padapter, prframe); - if (ret != _SUCCESS) - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__); - #endif + if (ret != _SUCCESS) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__); +#endif goto _recv_data_drop; } - } - 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(%s) OR bSurpriseRemoved(%s)\n", __func__ - , rtw_is_drv_stopped(padapter)?"True":"False" - , rtw_is_surprise_removed(padapter)?"True":"False"); - #endif + } else { + +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s recv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)\n", __func__ + , rtw_is_drv_stopped(padapter) ? "True" : "False" + , rtw_is_surprise_removed(padapter) ? "True" : "False"); +#endif ret = _FAIL; - rtw_free_recvframe(orig_prframe, pfree_recv_queue); //free this recv_frame + rtw_free_recvframe(orig_prframe, pfree_recv_queue); /* free this recv_frame */ } - } - else if(pattrib->amsdu==1) - { + } else if (pattrib->amsdu == 1) { ret = amsdu_to_msdu(padapter, prframe); - if(ret != _SUCCESS) - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); - #endif + if (ret != _SUCCESS) { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); +#endif rtw_free_recvframe(orig_prframe, pfree_recv_queue); goto _recv_data_drop; } - } - else - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s what is this condition??\n", __FUNCTION__); - #endif + } else { +#ifdef DBG_RX_DROP_FRAME + RTW_INFO("DBG_RX_DROP_FRAME %s what is this condition??\n", __FUNCTION__); +#endif goto _recv_data_drop; } -#endif // CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ _exit_recv_func: return ret; @@ -4487,7 +4088,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe) int ret; struct rx_pkt_attrib *prxattrib = &rframe->u.hdr.attrib; struct recv_priv *recvpriv = &padapter->recvpriv; - struct security_priv *psecuritypriv=&padapter->securitypriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; struct mlme_priv *mlmepriv = &padapter->mlmepriv; if (check_fwstate(mlmepriv, WIFI_MONITOR_STATE)) { @@ -4497,41 +4098,39 @@ int recv_func(_adapter *padapter, union recv_frame *rframe) goto exit; } else - /* check if need to handle uc_swdec_pending_queue*/ - if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && psecuritypriv->busetkipkey) - { - union recv_frame *pending_frame; - int cnt = 0; + /* check if need to handle uc_swdec_pending_queue*/ + if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && psecuritypriv->busetkipkey) { + union recv_frame *pending_frame; + int cnt = 0; - while((pending_frame=rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue))) { - cnt++; - DBG_COUNTER(padapter->rx_logs.core_rx_dequeue); - recv_func_posthandle(padapter, pending_frame); + while ((pending_frame = rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue))) { + cnt++; + DBG_COUNTER(padapter->rx_logs.core_rx_dequeue); + recv_func_posthandle(padapter, pending_frame); + } + + if (cnt) + RTW_INFO(FUNC_ADPT_FMT" dequeue %d from uc_swdec_pending_queue\n", + FUNC_ADPT_ARG(padapter), cnt); } - if (cnt) - DBG_871X(FUNC_ADPT_FMT" dequeue %d from uc_swdec_pending_queue\n", - FUNC_ADPT_ARG(padapter), cnt); - } - DBG_COUNTER(padapter->rx_logs.core_rx); ret = recv_func_prehandle(padapter, rframe); - if(ret == _SUCCESS) { - + if (ret == _SUCCESS) { + /* check if need to enqueue into uc_swdec_pending_queue*/ if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && - !IS_MCAST(prxattrib->ra) && prxattrib->encrypt>0 && - (prxattrib->bdecrypted == 0 ||psecuritypriv->sw_decrypt == _TRUE) && - psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPAPSK && - !psecuritypriv->busetkipkey) - { + !IS_MCAST(prxattrib->ra) && prxattrib->encrypt > 0 && + (prxattrib->bdecrypted == 0 || psecuritypriv->sw_decrypt == _TRUE) && + psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPAPSK && + !psecuritypriv->busetkipkey) { DBG_COUNTER(padapter->rx_logs.core_rx_enqueue); rtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue); - //DBG_871X("%s: no key, enqueue uc_swdec_pending_queue\n", __func__); + /* RTW_INFO("%s: no key, enqueue uc_swdec_pending_queue\n", __func__); */ - if (recvpriv->free_recvframe_cnt < NR_RECVFRAME/4) { - /* to prevent from recvframe starvation, get recvframe from uc_swdec_pending_queue to free_recvframe_cnt */ + if (recvpriv->free_recvframe_cnt < NR_RECVFRAME / 4) { + /* to prevent from recvframe starvation, get recvframe from uc_swdec_pending_queue to free_recvframe_cnt */ rframe = rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue); if (rframe) goto do_posthandle; @@ -4552,27 +4151,23 @@ s32 rtw_recv_entry(union recv_frame *precvframe) { _adapter *padapter; struct recv_priv *precvpriv; - s32 ret=_SUCCESS; + s32 ret = _SUCCESS; -_func_enter_; -// RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("+rtw_recv_entry\n")); padapter = precvframe->u.hdr.adapter; precvpriv = &padapter->recvpriv; - if ((ret = recv_func(padapter, precvframe)) == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("rtw_recv_entry: recv_func return fail!!!\n")); + ret = recv_func(padapter, precvframe); + if (ret == _FAIL) { goto _recv_entry_drop; } precvpriv->rx_pkts++; -_func_exit_; return ret; @@ -4583,18 +4178,17 @@ _recv_entry_drop: padapter->mppriv.rx_pktloss = precvpriv->rx_drop; #endif - //RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("_recv_entry_drop\n")); -_func_exit_; return ret; } #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS -void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ +void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS) +{ _adapter *adapter = (_adapter *)FunctionContext; struct recv_priv *recvpriv = &adapter->recvpriv; - + u32 tmp_s, tmp_q; u8 avg_signal_strength = 0; u8 avg_signal_qual = 0; @@ -4602,44 +4196,42 @@ void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ u32 num_signal_qual = 0; 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 - adapter->recvpriv.signal_strength= adapter->recvpriv.signal_strength_dbg; - adapter->recvpriv.rssi=(s8)translate_percentage_to_dbm((u8)adapter->recvpriv.signal_strength_dbg); + if (adapter->recvpriv.is_signal_dbg) { + /* update the user specific value, signal_strength_dbg, to signal_strength, rssi */ + adapter->recvpriv.signal_strength = adapter->recvpriv.signal_strength_dbg; + adapter->recvpriv.rssi = (s8)translate_percentage_to_dbm((u8)adapter->recvpriv.signal_strength_dbg); } else { - if(recvpriv->signal_strength_data.update_req == 0) {// update_req is clear, means we got rx + if (recvpriv->signal_strength_data.update_req == 0) { /* update_req is clear, means we got rx */ avg_signal_strength = recvpriv->signal_strength_data.avg_val; num_signal_strength = recvpriv->signal_strength_data.total_num; - // after avg_vals are accquired, we can re-stat the signal values + /* after avg_vals are accquired, we can re-stat the signal values */ recvpriv->signal_strength_data.update_req = 1; } - - if(recvpriv->signal_qual_data.update_req == 0) {// update_req is clear, means we got rx + + if (recvpriv->signal_qual_data.update_req == 0) { /* update_req is clear, means we got rx */ avg_signal_qual = recvpriv->signal_qual_data.avg_val; num_signal_qual = recvpriv->signal_qual_data.total_num; - // after avg_vals are accquired, we can re-stat the signal values + /* after avg_vals are accquired, we can re-stat the signal values */ recvpriv->signal_qual_data.update_req = 1; } if (num_signal_strength == 0) { if (rtw_get_on_cur_ch_time(adapter) == 0 - || rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) < 2 * adapter->mlmeextpriv.mlmext_info.bcn_interval - ) { + || rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) < 2 * adapter->mlmeextpriv.mlmext_info.bcn_interval + ) goto set_timer; - } } - if(check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE - || check_fwstate(&adapter->mlmepriv, _FW_LINKED) == _FALSE - ) { + if (check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE + || check_fwstate(&adapter->mlmepriv, _FW_LINKED) == _FALSE + ) goto set_timer; - } - #ifdef CONFIG_CONCURRENT_MODE - if (check_buddy_fwstate(adapter, _FW_UNDER_SURVEY) == _TRUE) +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_buddy_check_fwstate(adapter, _FW_UNDER_SURVEY) == _TRUE) goto set_timer; - #endif +#endif if (RTW_SIGNAL_STATE_CALC_PROFILE < SIGNAL_STAT_CALC_PROFILE_MAX) ratio_profile = RTW_SIGNAL_STATE_CALC_PROFILE; @@ -4648,7 +4240,7 @@ void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ 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 + /* update value of signal_strength, rssi, signal_qual */ 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; @@ -4669,40 +4261,40 @@ void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ recvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s); recvpriv->signal_qual = tmp_q; - #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 - DBG_871X(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u" - ", num_signal_strength:%u, num_signal_qual:%u" - ", on_cur_ch_ms:%d" - "\n" - , FUNC_ADPT_ARG(adapter) - , recvpriv->signal_strength - , recvpriv->rssi - , recvpriv->signal_qual - , num_signal_strength, num_signal_qual +#if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 + RTW_INFO(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u" + ", num_signal_strength:%u, num_signal_qual:%u" + ", on_cur_ch_ms:%d" + "\n" + , FUNC_ADPT_ARG(adapter) + , recvpriv->signal_strength + , recvpriv->rssi + , recvpriv->signal_qual + , num_signal_strength, num_signal_qual , rtw_get_on_cur_ch_time(adapter) ? rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) : 0 - ); - #endif + ); +#endif } set_timer: rtw_set_signal_stat_timer(recvpriv); - -} -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS -static void rx_process_rssi(_adapter *padapter,union recv_frame *prframe) +} +#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 + 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) + /* RTW_INFO("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) { +#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; @@ -4710,59 +4302,56 @@ static void rx_process_rssi(_adapter *padapter,union recv_frame *prframe) 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) - { + 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.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) + 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); + 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); + 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 +#endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */ } } -static void rx_process_link_qual(_adapter *padapter,union recv_frame *prframe) +static void rx_process_link_qual(_adapter *padapter, union recv_frame *prframe) { - u32 last_evm=0, tmpVal; - struct rx_pkt_attrib *pattrib; + 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 + struct signal_stat *signal_stat; +#endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */ - if(prframe == NULL || padapter==NULL){ + 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 +#endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */ - //DBG_8192C("process_link_qual=> pattrib->signal_qual(%d)\n ",pattrib->signal_qual); + /* RTW_INFO("process_link_qual=> pattrib->signal_qual(%d)\n ",pattrib->signal_qual); */ #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - if(signal_stat->update_req) { + if (signal_stat->update_req) { signal_stat->total_num = 0; signal_stat->total_val = 0; signal_stat->update_req = 0; @@ -4771,37 +4360,30 @@ static void rx_process_link_qual(_adapter *padapter,union recv_frame *prframe) 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; +#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; - 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)); + 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; - // <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; + + /* <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 +#endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */ } void rx_process_phy_info(_adapter *padapter, union recv_frame *rframe) @@ -4810,25 +4392,23 @@ void rx_process_phy_info(_adapter *padapter, union recv_frame *rframe) rx_process_rssi(padapter, rframe); /* Check PWDB */ - //process_PWDB(padapter, rframe); + /* process_PWDB(padapter, rframe); */ + + /* UpdateRxSignalStatistics8192C(Adapter, pRfd); */ - //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 + rtw_store_phy_info(padapter, rframe); } void rx_query_phy_status( union recv_frame *precvframe, u8 *pphy_status) { - PADAPTER padapter = precvframe->u.hdr.adapter; + 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); + 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; @@ -4836,16 +4416,16 @@ void rx_query_phy_status( struct sta_info *psta = NULL; struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; - //_irqL irqL; - - pkt_info.bPacketMatchBSSID =_FALSE; + /* _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) + && (!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) @@ -4855,7 +4435,7 @@ void rx_query_phy_status( && _rtw_memcmp(get_ra(wlanhdr), adapter_mac_addr(padapter), ETH_ALEN); pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID - && (GetFrameSubType(wlanhdr) == WIFI_BEACON); + && (GetFrameSubType(wlanhdr) == WIFI_BEACON); sa = get_ta(wlanhdr); @@ -4866,26 +4446,26 @@ void rx_query_phy_status( #if 0 /*For debug */ if (IsFrameTypeCtrl(wlanhdr)) { - DBG_871X("-->Control frame: Y\n"); - DBG_871X("-->pkt_len: %d\n", pattrib->pkt_len); - DBG_871X("-->Sub Type = 0x%X\n", GetFrameSubType(wlanhdr)); + RTW_INFO("-->Control frame: Y\n"); + RTW_INFO("-->pkt_len: %d\n", pattrib->pkt_len); + RTW_INFO("-->Sub Type = 0x%X\n", GetFrameSubType(wlanhdr)); } /* Dump first 40 bytes of header */ int i = 0; for (i = 0; i < 40; i++) - DBG_871X("%d: %X\n", i, *((u8 *)wlanhdr + i)); + RTW_INFO("%d: %X\n", i, *((u8 *)wlanhdr + i)); - DBG_871X("\n"); + RTW_INFO("\n"); #endif if ((start_time == 0) || (rtw_get_passing_time_ms(start_time) > 5000)) { - DBG_871X_LEVEL(_drv_always_, "Warning!!! %s: Confilc mac addr!!\n", __func__); + RTW_PRINT("Warning!!! %s: Confilc mac addr!!\n", __func__); start_time = rtw_get_current_time(); } pdbgpriv->dbg_rx_conflic_mac_addr_cnt++; - } else{ + } else { pstapriv = &padapter->stapriv; psta = rtw_get_stainfo(pstapriv, sa); if (psta) @@ -4894,29 +4474,25 @@ void rx_query_phy_status( pkt_info.DataRate = pattrib->data_rate; - //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL); + /* _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); + /* _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) - ) { + && (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; - } + + if (psta) + precvframe->u.hdr.psta = psta; rx_process_phy_info(padapter, precvframe); } } @@ -4928,13 +4504,13 @@ void rx_query_phy_status( */ int rtw_inc_and_chk_continual_no_rx_packet(struct sta_info *sta, int tid_index) { - + int ret = _FALSE; int value = ATOMIC_INC_RETURN(&sta->continual_no_rx_packet[tid_index]); - if (value >= MAX_CONTINUAL_NORXPACKET_COUNT) + if (value >= MAX_CONTINUAL_NORXPACKET_COUNT) ret = _TRUE; - + return ret; } @@ -4942,6 +4518,32 @@ int rtw_inc_and_chk_continual_no_rx_packet(struct sta_info *sta, int tid_index) * Set the continual_no_rx_packet of this @param pmlmepriv to 0 */ void rtw_reset_continual_no_rx_packet(struct sta_info *sta, int tid_index) -{ - ATOMIC_SET(&sta->continual_no_rx_packet[tid_index], 0); +{ + ATOMIC_SET(&sta->continual_no_rx_packet[tid_index], 0); +} + + +s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status) +{ + s32 ret = _SUCCESS; +#ifdef CONFIG_CONCURRENT_MODE + u8 *pda; + u8 *pbuf = precvframe->u.hdr.rx_data; + _adapter *iface = NULL; + _adapter *primary_padapter = precvframe->u.hdr.adapter; + + pda = get_ra(pbuf); + + if (IS_MCAST(pda) == _FALSE) { /*unicast packets*/ + iface = rtw_get_iface_by_macddr(primary_padapter , pda); + if (NULL == iface) { + RTW_INFO("%s [WARN] Cannot find appropriate adapter - mac_addr : "MAC_FMT"\n", __func__, MAC_ARG(pda)); + /*rtw_warn_on(1);*/ + } else + precvframe->u.hdr.adapter = iface; + } else /* Handle BC/MC Packets */ + rtw_mi_buddy_clone_bcmc_packet(primary_padapter, precvframe, pphy_status); +#endif + + return ret; } diff --git a/core/rtw_rf.c b/core/rtw_rf.c old mode 100755 new mode 100644 index a682cf3..b78e5ab --- a/core/rtw_rf.c +++ b/core/rtw_rf.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. @@ -22,56 +22,416 @@ #include #include -u8 center_ch_5g_all[CENTER_CH_5G_ALL_NUM] = { - 36, 38, 40, 42, 44, 46, 48, /* Band 1 */ - 52, 54, 56, 58, 60, 62, 64, /* Band 2 */ - 100, 102, 104, 106, 108, 110, 112, /* Band 3 */ - 116, 118, 120, 122, 124, 126, 128, /* Band 3 */ - 132, 134, 136, 138, 140, 142, 144, /* Band 3 */ - 149, 151, 153, 155, 157, 159, 161, /* Band 4 */ - 165, 167, 169, 171, 173, 175, 177}; /* Band 4 */ - -u8 center_ch_5g_20m[CENTER_CH_5G_20M_NUM] = { - 36, 40, 44, 48, - 52, 56, 60, 64, - 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, - 149, 153, 157, 161, 165, 169, 173, 177 +u8 center_ch_2g[CENTER_CH_2G_NUM] = { +/* G00 */1, 2, +/* G01 */3, 4, 5, +/* G02 */6, 7, 8, +/* G03 */9, 10, 11, +/* G04 */12, 13, +/* G05 */14 }; -u8 center_ch_5g_40m[CENTER_CH_5G_40M_NUM] = {38, 46, 54, 62, 102, 110, 118, 126, 134, 142, 151, 159, 167, 175}; +u8 center_ch_2g_40m[CENTER_CH_2G_40M_NUM] = { + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, +}; -u8 center_ch_5g_80m[CENTER_CH_5G_80M_NUM] = {42, 58, 106, 122, 138, 155, 171}; +u8 op_chs_of_cch_2g_40m[CENTER_CH_2G_40M_NUM][2] = { + {1, 5}, /* 3 */ + {2, 6}, /* 4 */ + {3, 7}, /* 5 */ + {4, 8}, /* 6 */ + {5, 9}, /* 7 */ + {6, 10}, /* 8 */ + {7, 11}, /* 9 */ + {8, 12}, /* 10 */ + {9, 13}, /* 11 */ +}; -struct center_chs_ent { +u8 center_ch_5g_all[CENTER_CH_5G_ALL_NUM] = { +/* G00 */36, 38, 40, + 42, +/* G01 */44, 46, 48, + /* 50, */ +/* G02 */52, 54, 56, + 58, +/* G03 */60, 62, 64, +/* G04 */100, 102, 104, + 106, +/* G05 */108, 110, 112, + /* 114, */ +/* G06 */116, 118, 120, + 122, +/* G07 */124, 126, 128, +/* G08 */132, 134, 136, + 138, +/* G09 */140, 142, 144, +/* G10 */149, 151, 153, + 155, +/* G11 */157, 159, 161, + /* 163, */ +/* G12 */165, 167, 169, + 171, +/* G13 */173, 175, 177 +}; + +u8 center_ch_5g_20m[CENTER_CH_5G_20M_NUM] = { +/* G00 */36, 40, +/* G01 */44, 48, +/* G02 */52, 56, +/* G03 */60, 64, +/* G04 */100, 104, +/* G05 */108, 112, +/* G06 */116, 120, +/* G07 */124, 128, +/* G08 */132, 136, +/* G09 */140, 144, +/* G10 */149, 153, +/* G11 */157, 161, +/* G12 */165, 169, +/* G13 */173, 177 +}; + +u8 center_ch_5g_40m[CENTER_CH_5G_40M_NUM] = { +/* G00 */38, +/* G01 */46, +/* G02 */54, +/* G03 */62, +/* G04 */102, +/* G05 */110, +/* G06 */118, +/* G07 */126, +/* G08 */134, +/* G09 */142, +/* G10 */151, +/* G11 */159, +/* G12 */167, +/* G13 */175 +}; + +u8 center_ch_5g_20m_40m[CENTER_CH_5G_20M_NUM + CENTER_CH_5G_40M_NUM] = { +/* G00 */36, 38, 40, +/* G01 */44, 46, 48, +/* G02 */52, 54, 56, +/* G03 */60, 62, 64, +/* G04 */100, 102, 104, +/* G05 */108, 110, 112, +/* G06 */116, 118, 120, +/* G07 */124, 126, 128, +/* G08 */132, 134, 136, +/* G09 */140, 142, 144, +/* G10 */149, 151, 153, +/* G11 */157, 159, 161, +/* G12 */165, 167, 169, +/* G13 */173, 175, 177 +}; + +u8 op_chs_of_cch_5g_40m[CENTER_CH_5G_40M_NUM][2] = { + {36, 40}, /* 38 */ + {44, 48}, /* 46 */ + {52, 56}, /* 54 */ + {60, 64}, /* 62 */ + {100, 104}, /* 102 */ + {108, 112}, /* 110 */ + {116, 120}, /* 118 */ + {124, 128}, /* 126 */ + {132, 136}, /* 134 */ + {140, 144}, /* 142 */ + {149, 153}, /* 151 */ + {157, 161}, /* 159 */ + {165, 169}, /* 167 */ + {173, 177}, /* 175 */ +}; + +u8 center_ch_5g_80m[CENTER_CH_5G_80M_NUM] = { +/* G00 ~ G01*/42, +/* G02 ~ G03*/58, +/* G04 ~ G05*/106, +/* G06 ~ G07*/122, +/* G08 ~ G09*/138, +/* G10 ~ G11*/155, +/* G12 ~ G13*/171 +}; + +u8 op_chs_of_cch_5g_80m[CENTER_CH_5G_80M_NUM][4] = { + {36, 40, 44, 48}, /* 42 */ + {52, 56, 60, 64}, /* 58 */ + {100, 104, 108, 112}, /* 106 */ + {116, 120, 124, 128}, /* 122 */ + {132, 136, 140, 144}, /* 138 */ + {149, 153, 157, 161}, /* 155 */ + {165, 169, 173, 177}, /* 171 */ +}; + +u8 center_ch_5g_160m[CENTER_CH_5G_160M_NUM] = { +/* G00 ~ G03*/50, +/* G04 ~ G07*/114, +/* G10 ~ G13*/163 +}; + +u8 op_chs_of_cch_5g_160m[CENTER_CH_5G_160M_NUM][8] = { + {36, 40, 44, 48, 52, 56, 60, 64}, /* 50 */ + {100, 104, 108, 112, 116, 120, 124, 128}, /* 114 */ + {149, 153, 157, 161, 165, 169, 173, 177}, /* 163 */ +}; + +struct center_chs_ent_t { u8 ch_num; u8 *chs; }; -struct center_chs_ent center_chs_5g_by_bw[] = { +struct center_chs_ent_t center_chs_2g_by_bw[] = { + {CENTER_CH_2G_NUM, center_ch_2g}, + {CENTER_CH_2G_40M_NUM, center_ch_2g_40m}, +}; + +struct center_chs_ent_t center_chs_5g_by_bw[] = { {CENTER_CH_5G_20M_NUM, center_ch_5g_20m}, {CENTER_CH_5G_40M_NUM, center_ch_5g_40m}, {CENTER_CH_5G_80M_NUM, center_ch_5g_80m}, + {CENTER_CH_5G_160M_NUM, center_ch_5g_160m}, }; +/* + * Get center channel of smaller bandwidth by @param cch, @param bw, @param offset + * @cch: the given center channel + * @bw: the given bandwidth + * @offset: the given primary SC offset of the given bandwidth + * + * return center channel of smaller bandiwdth if valid, or 0 + */ +u8 rtw_get_scch_by_cch_offset(u8 cch, u8 bw, u8 offset) +{ + int i; + u8 t_cch = 0; + + if (bw == CHANNEL_WIDTH_20) { + t_cch = cch; + goto exit; + } + + if (offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) { + rtw_warn_on(1); + goto exit; + } + + /* 2.4G, 40MHz */ + if (cch >= 3 && cch <= 11 && bw == CHANNEL_WIDTH_40) { + t_cch = (offset == HAL_PRIME_CHNL_OFFSET_UPPER) ? cch + 2 : cch - 2; + goto exit; + } + + /* 5G, 160MHz */ + if (cch >= 50 && cch <= 163 && bw == CHANNEL_WIDTH_160) { + t_cch = (offset == HAL_PRIME_CHNL_OFFSET_UPPER) ? cch + 8 : cch - 8; + goto exit; + + /* 5G, 80MHz */ + } else if (cch >= 42 && cch <= 171 && bw == CHANNEL_WIDTH_80) { + t_cch = (offset == HAL_PRIME_CHNL_OFFSET_UPPER) ? cch + 4 : cch - 4; + goto exit; + + /* 5G, 40MHz */ + } else if (cch >= 38 && cch <= 175 && bw == CHANNEL_WIDTH_40) { + t_cch = (offset == HAL_PRIME_CHNL_OFFSET_UPPER) ? cch + 2 : cch - 2; + goto exit; + + } else { + rtw_warn_on(1); + goto exit; + } + +exit: + return t_cch; +} + +struct op_chs_ent_t { + u8 ch_num; + u8 *chs; +}; + +struct op_chs_ent_t op_chs_of_cch_2g_by_bw[] = { + {1, center_ch_2g}, + {2, (u8 *)op_chs_of_cch_2g_40m}, +}; + +struct op_chs_ent_t op_chs_of_cch_5g_by_bw[] = { + {1, center_ch_5g_20m}, + {2, (u8 *)op_chs_of_cch_5g_40m}, + {4, (u8 *)op_chs_of_cch_5g_80m}, + {8, (u8 *)op_chs_of_cch_5g_160m}, +}; + +inline u8 center_chs_2g_num(u8 bw) +{ + if (bw > CHANNEL_WIDTH_40) + return 0; + + return center_chs_2g_by_bw[bw].ch_num; +} + +inline u8 center_chs_2g(u8 bw, u8 id) +{ + if (bw > CHANNEL_WIDTH_40) + return 0; + + if (id >= center_chs_2g_num(bw)) + return 0; + + return center_chs_2g_by_bw[bw].chs[id]; +} + inline u8 center_chs_5g_num(u8 bw) { - if (bw >= CHANNEL_WIDTH_160) + if (bw > CHANNEL_WIDTH_80) return 0; - + return center_chs_5g_by_bw[bw].ch_num; } inline u8 center_chs_5g(u8 bw, u8 id) { - if (bw >= CHANNEL_WIDTH_160) + if (bw > CHANNEL_WIDTH_80) return 0; if (id >= center_chs_5g_num(bw)) return 0; - + return center_chs_5g_by_bw[bw].chs[id]; } +/* + * Get available op channels by @param cch, @param bw + * @cch: the given center channel + * @bw: the given bandwidth + * @op_chs: the pointer to return pointer of op channel array + * @op_ch_num: the pointer to return pointer of op channel number + * + * return valid (1) or not (0) + */ +u8 rtw_get_op_chs_by_cch_bw(u8 cch, u8 bw, u8 **op_chs, u8 *op_ch_num) +{ + int i; + struct center_chs_ent_t *c_chs_ent = NULL; + struct op_chs_ent_t *op_chs_ent = NULL; + u8 valid = 1; + + if (cch <= 14 + && bw >= CHANNEL_WIDTH_20 && bw <= CHANNEL_WIDTH_40 + ) { + c_chs_ent = ¢er_chs_2g_by_bw[bw]; + op_chs_ent = &op_chs_of_cch_2g_by_bw[bw]; + } else if (cch >= 36 && cch <= 177 + && bw >= CHANNEL_WIDTH_20 && bw <= CHANNEL_WIDTH_160 + ) { + c_chs_ent = ¢er_chs_5g_by_bw[bw]; + op_chs_ent = &op_chs_of_cch_5g_by_bw[bw]; + } else { + valid = 0; + goto exit; + } + + for (i = 0; i < c_chs_ent->ch_num; i++) + if (cch == *(c_chs_ent->chs + i)) + break; + + if (i == c_chs_ent->ch_num) { + valid = 0; + goto exit; + } + + *op_chs = op_chs_ent->chs + op_chs_ent->ch_num * i; + *op_ch_num = op_chs_ent->ch_num; + +exit: + return valid; +} + +u8 rtw_get_ch_group(u8 ch, u8 *group, u8 *cck_group) +{ + BAND_TYPE band = BAND_MAX; + s8 gp = -1, cck_gp = -1; + + if (ch <= 14) { + band = BAND_ON_2_4G; + + if (1 <= ch && ch <= 2) + gp = 0; + else if (3 <= ch && ch <= 5) + gp = 1; + else if (6 <= ch && ch <= 8) + gp = 2; + else if (9 <= ch && ch <= 11) + gp = 3; + else if (12 <= ch && ch <= 14) + gp = 4; + else + band = BAND_MAX; + + if (ch == 14) + cck_gp = 5; + else + cck_gp = gp; + } else { + band = BAND_ON_5G; + + if (36 <= ch && ch <= 42) + gp = 0; + else if (44 <= ch && ch <= 48) + gp = 1; + else if (50 <= ch && ch <= 58) + gp = 2; + else if (60 <= ch && ch <= 64) + gp = 3; + else if (100 <= ch && ch <= 106) + gp = 4; + else if (108 <= ch && ch <= 114) + gp = 5; + else if (116 <= ch && ch <= 122) + gp = 6; + else if (124 <= ch && ch <= 130) + gp = 7; + else if (132 <= ch && ch <= 138) + gp = 8; + else if (140 <= ch && ch <= 144) + gp = 9; + else if (149 <= ch && ch <= 155) + gp = 10; + else if (157 <= ch && ch <= 161) + gp = 11; + else if (165 <= ch && ch <= 171) + gp = 12; + else if (173 <= ch && ch <= 177) + gp = 13; + else + band = BAND_MAX; + } + + if (band == BAND_MAX + || (band == BAND_ON_2_4G && cck_gp == -1) + || gp == -1 + ) { + RTW_WARN("%s invalid channel:%u", __func__, ch); + rtw_warn_on(1); + goto exit; + } + + if (group) + *group = gp; + if (cck_group && band == BAND_ON_2_4G) + *cck_group = cck_gp; + +exit: + return band; +} + int rtw_ch2freq(int chan) { /* see 802.11 17.3.8.3.2 and Annex J @@ -87,9 +447,8 @@ int rtw_ch2freq(int chan) return 2484; else if (chan < 14) return 2407 + chan * 5; - } else if (chan >= 36 && chan <= 177) { + } else if (chan >= 36 && chan <= 177) return 5000 + chan * 5; - } return 0; /* not supported */ } @@ -141,9 +500,8 @@ bool rtw_chbw_to_freq_range(u8 ch, u8 bw, u8 offset, u32 *hi, u32 *lo) } else if (bw == CHANNEL_WIDTH_20) { hi_ret = freq + 10; lo_ret = freq - 10; - } else { + } else rtw_warn_on(1); - } if (hi) *hi = hi_ret; @@ -156,7 +514,7 @@ exit: return valid; } -const char * const _ch_width_str[] = { +const char *const _ch_width_str[] = { "20MHz", "40MHz", "80MHz", @@ -174,7 +532,7 @@ const u8 _ch_width_to_bw_cap[] = { 0, }; -const char * const _band_str[] = { +const char *const _band_str[] = { "2.4G", "5G", "BOTH", @@ -188,154 +546,418 @@ const u8 _band_to_band_cap[] = { 0, }; -struct country_chplan { - char alpha2[2]; - u8 chplan; +#ifdef CONFIG_80211AC_VHT +#define COUNTRY_CHPLAN_ASSIGN_EN_11AC(_val) , .en_11ac = (_val) +#else +#define COUNTRY_CHPLAN_ASSIGN_EN_11AC(_val) +#endif + +#if RTW_DEF_MODULE_REGULATORY_CERT +#define COUNTRY_CHPLAN_ASSIGN_DEF_MODULE_FLAGS(_val) , .def_module_flags = (_val) +#else +#define COUNTRY_CHPLAN_ASSIGN_DEF_MODULE_FLAGS(_val) +#endif + +/* has def_module_flags specified, used by common map and HAL dfference map */ +#define COUNTRY_CHPLAN_ENT(_alpha2, _chplan, _en_11ac, _def_module_flags) \ + {.alpha2 = (_alpha2), .chplan = (_chplan) \ + COUNTRY_CHPLAN_ASSIGN_EN_11AC(_en_11ac) \ + COUNTRY_CHPLAN_ASSIGN_DEF_MODULE_FLAGS(_def_module_flags) \ + } + +#ifdef CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP + +#include "../platform/custom_country_chplan.h" + +#elif RTW_DEF_MODULE_REGULATORY_CERT + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8821AE_HMC_M2) +static const struct country_chplan RTL8821AE_HMC_M2_country_chplan_map[] = { + COUNTRY_CHPLAN_ENT("CN", 0x51, 1, 0xFB), /* China */ + COUNTRY_CHPLAN_ENT("RU", 0x59, 0, 0xFB), /* Russia(fac/gost), Kaliningrad */ + COUNTRY_CHPLAN_ENT("UA", 0x26, 0, 0xFB), /* Ukraine */ }; +static const u16 RTL8821AE_HMC_M2_country_chplan_map_sz = sizeof(RTL8821AE_HMC_M2_country_chplan_map) / sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8821AU) +static const struct country_chplan RTL8821AU_country_chplan_map[] = { + COUNTRY_CHPLAN_ENT("RU", 0x59, 0, 0xFB), /* Russia(fac/gost), Kaliningrad */ + COUNTRY_CHPLAN_ENT("UA", 0x26, 0, 0xFB), /* Ukraine */ +}; +static const u16 RTL8821AU_country_chplan_map_sz = sizeof(RTL8821AU_country_chplan_map) / sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8812AENF_NGFF) +static const struct country_chplan RTL8812AENF_NGFF_country_chplan_map[] = { +}; +static const u16 RTL8812AENF_NGFF_country_chplan_map_sz = sizeof(RTL8812AENF_NGFF_country_chplan_map) / sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8812AEBT_HMC) +static const struct country_chplan RTL8812AEBT_HMC_country_chplan_map[] = { +}; +static const u16 RTL8812AEBT_HMC_country_chplan_map_sz = sizeof(RTL8812AEBT_HMC_country_chplan_map) / sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8188EE_HMC_M2) +static const struct country_chplan RTL8188EE_HMC_M2_country_chplan_map[] = { +}; +static const u16 RTL8188EE_HMC_M2_country_chplan_map_sz = sizeof(RTL8188EE_HMC_M2_country_chplan_map) / sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8723BE_HMC_M2) +static const struct country_chplan RTL8723BE_HMC_M2_country_chplan_map[] = { +}; +static const u16 RTL8723BE_HMC_M2_country_chplan_map_sz = sizeof(RTL8723BE_HMC_M2_country_chplan_map) / sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8723BS_NGFF1216) +static const struct country_chplan RTL8723BS_NGFF1216_country_chplan_map[] = { +}; +static const u16 RTL8723BS_NGFF1216_country_chplan_map_sz = sizeof(RTL8723BS_NGFF1216_country_chplan_map) / sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8192EEBT_HMC_M2) +static const struct country_chplan RTL8192EEBT_HMC_M2_country_chplan_map[] = { +}; +static const u16 RTL8192EEBT_HMC_M2_country_chplan_map_sz = sizeof(RTL8192EEBT_HMC_M2_country_chplan_map) / sizeof(struct country_chplan); +#endif + +/** + * rtw_def_module_get_chplan_from_country - + * @country_code: string of country code + * @return: + * Return NULL for case referring to common map + */ +static const struct country_chplan *rtw_def_module_get_chplan_from_country(const char *country_code) +{ + const struct country_chplan *ent = NULL; + const struct country_chplan *hal_map = NULL; + u16 hal_map_sz = 0; + int i; + + /* TODO: runtime selection for multi driver */ +#if (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8821AE_HMC_M2) + hal_map = RTL8821AE_HMC_M2_country_chplan_map; + hal_map_sz = RTL8821AE_HMC_M2_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8821AU) + hal_map = RTL8821AU_country_chplan_map; + hal_map_sz = RTL8821AU_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8812AENF_NGFF) + hal_map = RTL8812AENF_NGFF_country_chplan_map; + hal_map_sz = RTL8812AENF_NGFF_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8812AEBT_HMC) + hal_map = RTL8812AEBT_HMC_country_chplan_map; + hal_map_sz = RTL8812AEBT_HMC_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8188EE_HMC_M2) + hal_map = RTL8188EE_HMC_M2_country_chplan_map; + hal_map_sz = RTL8188EE_HMC_M2_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8723BE_HMC_M2) + hal_map = RTL8723BE_HMC_M2_country_chplan_map; + hal_map_sz = RTL8723BE_HMC_M2_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8723BS_NGFF1216) + hal_map = RTL8723BS_NGFF1216_country_chplan_map; + hal_map_sz = RTL8723BS_NGFF1216_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8192EEBT_HMC_M2) + hal_map = RTL8192EEBT_HMC_M2_country_chplan_map; + hal_map_sz = RTL8192EEBT_HMC_M2_country_chplan_map_sz; +#endif + + if (hal_map == NULL || hal_map_sz == 0) + goto exit; + + for (i = 0; i < hal_map_sz; i++) { + if (strncmp(country_code, hal_map[i].alpha2, 2) == 0) { + ent = &hal_map[i]; + break; + } + } + +exit: + return ent; +} +#endif /* CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP or RTW_DEF_MODULE_REGULATORY_CERT */ static const struct country_chplan country_chplan_map[] = { - {"AD", 0x26}, /* Andorra */ - {"AE", 0x26}, /* United Arab Emirates */ - {"AG", 0x30}, /* Antigua & Barbuda */ - {"AI", 0x26}, /* Anguilla(UK) */ - {"AL", 0x26}, /* Albania */ - {"AM", 0x34}, /* Armenia */ - {"AO", 0x26}, /* Angola */ - {"AQ", 0x26}, /* Antarctica */ - {"AR", 0x57}, /* Argentina */ - {"AS", 0x34}, /* American Samoa */ - {"AT", 0x26}, /* Austria */ - {"AU", 0x45}, /* Australia */ - {"AW", 0x34}, /* Aruba */ - {"AZ", 0x26}, /* Azerbaijan */ - {"BA", 0x26}, /* Bosnia & Herzegovina */ - {"BD", 0x26}, /* Bangladesh */ - {"BE", 0x26}, /* Belgium */ - {"BG", 0x26}, /* Bulgaria */ - {"BH", 0x47}, /* Bahrain */ - {"BO", 0x30}, /* Bolivia */ - {"BR", 0x34}, /* Brazil */ - {"CA", 0x34}, /* Canada */ - {"CH", 0x26}, /* Switzerland */ - {"CL", 0x30}, /* Chile */ - {"CN", 0x48}, /* China */ - {"CO", 0x34}, /* Colombia */ - {"CR", 0x34}, /* Costa Rica */ - {"CY", 0x26}, /* Cyprus */ - {"CZ", 0x26}, /* Czech Republic */ - {"DE", 0x26}, /* Germany */ - {"DK", 0x26}, /* Denmark */ - {"DO", 0x34}, /* Dominican Republic */ - {"EC", 0x34}, /* Ecuador */ - {"EE", 0x26}, /* Estonia */ - {"EG", 0x47}, /* Egypt */ - {"ES", 0x26}, /* Spain */ - {"FI", 0x26}, /* Finland */ - {"FR", 0x26}, /* France */ - {"GB", 0x26}, /* Great Britain (United Kingdom; England) */ - {"GH", 0x26}, /* Ghana */ - {"GR", 0x26}, /* Greece */ - {"GT", 0x34}, /* Guatemala */ - {"HK", 0x26}, /* Hong Kong */ - {"HN", 0x32}, /* Honduras */ - {"HR", 0x26}, /* Croatia */ - {"HU", 0x26}, /* Hungary */ - {"ID", 0x54}, /* Indonesia */ - {"IE", 0x26}, /* Ireland */ - {"IL", 0x47}, /* Israel */ - {"IN", 0x47}, /* India */ - {"IQ", 0x26}, /* Iraq */ - {"IS", 0x26}, /* Iceland */ - {"IT", 0x26}, /* Italy */ - {"JM", 0x51}, /* Jamaica */ - {"JO", 0x49}, /* Jordan */ - {"JP", 0x27}, /* Japan- Telec */ - {"KE", 0x47}, /* Kenya */ - {"KG", 0x26}, /* Kyrgyzstan */ - {"KH", 0x26}, /* Cambodia */ - {"KR", 0x28}, /* South Korea */ - {"KW", 0x47}, /* Kuwait */ - {"KZ", 0x26}, /* Kazakhstan */ - {"LB", 0x26}, /* Lebanon */ - {"LI", 0x26}, /* Liechtenstein */ - {"LK", 0x26}, /* Sri Lanka */ - {"LS", 0x26}, /* Lesotho */ - {"LT", 0x26}, /* Lithuania */ - {"LU", 0x26}, /* Luxembourg */ - {"LV", 0x26}, /* Latvia */ - {"MA", 0x47}, /* Morocco */ - {"MC", 0x26}, /* Monaco */ - {"ME", 0x26}, /* Montenegro */ - {"MK", 0x26}, /* Republic of Macedonia (FYROM) */ - {"MT", 0x26}, /* Malta */ - {"MX", 0x34}, /* Mexico */ - {"MY", 0x47}, /* Malaysia */ - {"MZ", 0x26}, /* Mozambique */ - {"NA", 0x26}, /* Namibia */ - {"NG", 0x50}, /* Nigeria */ - {"NI", 0x34}, /* Nicaragua */ - {"NL", 0x26}, /* Netherlands */ - {"NO", 0x26}, /* Norway */ - {"NZ", 0x45}, /* New Zealand */ - {"OM", 0x26}, /* Oman */ - {"PA", 0x34}, /* Panama */ - {"PE", 0x34}, /* Peru */ - {"PG", 0x26}, /* Papua New Guinea */ - {"PH", 0x26}, /* Philippines */ - {"PK", 0x51}, /* Pakistan */ - {"PL", 0x26}, /* Poland */ - {"PR", 0x34}, /* Puerto Rico */ - {"PT", 0x26}, /* Portugal */ - {"PY", 0x34}, /* Paraguay */ - {"QA", 0x51}, /* Qatar */ - {"RO", 0x26}, /* Romania */ - {"RS", 0x26}, /* Serbia */ - {"RU", 0x59}, /* Russia, fac/gost */ - {"SA", 0x26}, /* Saudi Arabia */ - {"SE", 0x26}, /* Sweden */ - {"SG", 0x47}, /* Singapore */ - {"SI", 0x26}, /* Slovenia */ - {"SK", 0x26}, /* Slovakia */ - {"SN", 0x26}, /* Senegal */ - {"SV", 0x30}, /* El Salvador */ - {"TH", 0x26}, /* Thailand */ - {"TN", 0x47}, /* Tunisia */ - {"TR", 0x26}, /* Turkey */ - {"TT", 0x42}, /* Trinidad & Tobago */ - {"TW", 0x39}, /* Taiwan */ - {"UA", 0x26}, /* Ukraine */ - {"US", 0x34}, /* United States of America (USA) */ - {"UY", 0x34}, /* Uruguay */ - {"VE", 0x30}, /* Venezuela */ - {"VN", 0x26}, /* Vietnam */ - {"YE", 0x26}, /* Yemen */ - {"ZA", 0x26}, /* South Africa */ - {"ZW", 0x26}, /* Zimbabwe */ + COUNTRY_CHPLAN_ENT("AD", 0x26, 1, 0x00), /* Andorra */ + COUNTRY_CHPLAN_ENT("AE", 0x26, 1, 0xFB), /* United Arab Emirates */ + COUNTRY_CHPLAN_ENT("AF", 0x42, 1, 0x00), /* Afghanistan */ + COUNTRY_CHPLAN_ENT("AG", 0x30, 1, 0x00), /* Antigua & Barbuda */ + COUNTRY_CHPLAN_ENT("AI", 0x26, 1, 0x00), /* Anguilla(UK) */ + COUNTRY_CHPLAN_ENT("AL", 0x26, 1, 0xF1), /* Albania */ + COUNTRY_CHPLAN_ENT("AM", 0x26, 1, 0xB0), /* Armenia */ + COUNTRY_CHPLAN_ENT("AO", 0x26, 1, 0xE0), /* Angola */ + COUNTRY_CHPLAN_ENT("AQ", 0x26, 1, 0x00), /* Antarctica */ + COUNTRY_CHPLAN_ENT("AR", 0x57, 1, 0xF3), /* Argentina */ + COUNTRY_CHPLAN_ENT("AS", 0x34, 1, 0x00), /* American Samoa */ + COUNTRY_CHPLAN_ENT("AT", 0x26, 1, 0xFB), /* Austria */ + COUNTRY_CHPLAN_ENT("AU", 0x45, 1, 0xFB), /* Australia */ + COUNTRY_CHPLAN_ENT("AW", 0x34, 1, 0xB0), /* Aruba */ + COUNTRY_CHPLAN_ENT("AZ", 0x26, 1, 0xF1), /* Azerbaijan */ + COUNTRY_CHPLAN_ENT("BA", 0x26, 1, 0xF1), /* Bosnia & Herzegovina */ + COUNTRY_CHPLAN_ENT("BB", 0x34, 1, 0x50), /* Barbados */ + COUNTRY_CHPLAN_ENT("BD", 0x26, 1, 0xF1), /* Bangladesh */ + COUNTRY_CHPLAN_ENT("BE", 0x26, 1, 0xFB), /* Belgium */ + COUNTRY_CHPLAN_ENT("BF", 0x26, 1, 0xB0), /* Burkina Faso */ + COUNTRY_CHPLAN_ENT("BG", 0x26, 1, 0xF1), /* Bulgaria */ + COUNTRY_CHPLAN_ENT("BH", 0x47, 1, 0xF1), /* Bahrain */ + COUNTRY_CHPLAN_ENT("BI", 0x26, 1, 0xB0), /* Burundi */ + COUNTRY_CHPLAN_ENT("BJ", 0x26, 1, 0xB0), /* Benin */ + COUNTRY_CHPLAN_ENT("BN", 0x47, 1, 0x10), /* Brunei */ + COUNTRY_CHPLAN_ENT("BO", 0x30, 1, 0xF1), /* Bolivia */ + COUNTRY_CHPLAN_ENT("BR", 0x34, 1, 0xF1), /* Brazil */ + COUNTRY_CHPLAN_ENT("BS", 0x34, 1, 0x20), /* Bahamas */ + COUNTRY_CHPLAN_ENT("BW", 0x26, 1, 0xF1), /* Botswana */ + COUNTRY_CHPLAN_ENT("BY", 0x26, 1, 0xF1), /* Belarus */ + COUNTRY_CHPLAN_ENT("BZ", 0x34, 1, 0x00), /* Belize */ + COUNTRY_CHPLAN_ENT("CA", 0x34, 1, 0xFB), /* Canada */ + COUNTRY_CHPLAN_ENT("CC", 0x26, 1, 0x00), /* Cocos (Keeling) Islands (Australia) */ + COUNTRY_CHPLAN_ENT("CD", 0x26, 1, 0xB0), /* Congo, Republic of the */ + COUNTRY_CHPLAN_ENT("CF", 0x26, 1, 0xB0), /* Central African Republic */ + COUNTRY_CHPLAN_ENT("CG", 0x26, 1, 0xB0), /* Congo, Democratic Republic of the. Zaire */ + COUNTRY_CHPLAN_ENT("CH", 0x26, 1, 0xFB), /* Switzerland */ + COUNTRY_CHPLAN_ENT("CI", 0x26, 1, 0xF1), /* Cote d'Ivoire */ + COUNTRY_CHPLAN_ENT("CK", 0x26, 1, 0x00), /* Cook Islands */ + COUNTRY_CHPLAN_ENT("CL", 0x30, 1, 0xF1), /* Chile */ + COUNTRY_CHPLAN_ENT("CM", 0x26, 1, 0xB0), /* Cameroon */ + COUNTRY_CHPLAN_ENT("CN", 0x48, 1, 0xFB), /* China */ + COUNTRY_CHPLAN_ENT("CO", 0x34, 1, 0xF1), /* Colombia */ + COUNTRY_CHPLAN_ENT("CR", 0x34, 1, 0xF1), /* Costa Rica */ + COUNTRY_CHPLAN_ENT("CV", 0x26, 1, 0xB0), /* Cape Verde */ + COUNTRY_CHPLAN_ENT("CX", 0x45, 1, 0x00), /* Christmas Island (Australia) */ + COUNTRY_CHPLAN_ENT("CY", 0x26, 1, 0xFB), /* Cyprus */ + COUNTRY_CHPLAN_ENT("CZ", 0x26, 1, 0xFB), /* Czech Republic */ + COUNTRY_CHPLAN_ENT("DE", 0x26, 1, 0xFB), /* Germany */ + COUNTRY_CHPLAN_ENT("DJ", 0x26, 1, 0x80), /* Djibouti */ + COUNTRY_CHPLAN_ENT("DK", 0x26, 1, 0xFB), /* Denmark */ + COUNTRY_CHPLAN_ENT("DM", 0x34, 1, 0x00), /* Dominica */ + COUNTRY_CHPLAN_ENT("DO", 0x34, 1, 0xF1), /* Dominican Republic */ + COUNTRY_CHPLAN_ENT("DZ", 0x26, 1, 0xF1), /* Algeria */ + COUNTRY_CHPLAN_ENT("EC", 0x34, 1, 0xF1), /* Ecuador */ + COUNTRY_CHPLAN_ENT("EE", 0x26, 1, 0xFB), /* Estonia */ + COUNTRY_CHPLAN_ENT("EG", 0x47, 0, 0xF1), /* Egypt */ + COUNTRY_CHPLAN_ENT("EH", 0x47, 1, 0x80), /* Western Sahara */ + COUNTRY_CHPLAN_ENT("ER", 0x26, 1, 0x00), /* Eritrea */ + COUNTRY_CHPLAN_ENT("ES", 0x26, 1, 0xFB), /* Spain, Canary Islands, Ceuta, Melilla */ + COUNTRY_CHPLAN_ENT("ET", 0x26, 1, 0xB0), /* Ethiopia */ + COUNTRY_CHPLAN_ENT("FI", 0x26, 1, 0xFB), /* Finland */ + COUNTRY_CHPLAN_ENT("FJ", 0x34, 1, 0x00), /* Fiji */ + COUNTRY_CHPLAN_ENT("FK", 0x26, 1, 0x00), /* Falkland Islands (Islas Malvinas) (UK) */ + COUNTRY_CHPLAN_ENT("FM", 0x34, 1, 0x00), /* Micronesia, Federated States of (USA) */ + COUNTRY_CHPLAN_ENT("FO", 0x26, 1, 0x00), /* Faroe Islands (Denmark) */ + COUNTRY_CHPLAN_ENT("FR", 0x26, 1, 0xFB), /* France */ + COUNTRY_CHPLAN_ENT("GA", 0x26, 1, 0xB0), /* Gabon */ + COUNTRY_CHPLAN_ENT("GB", 0x26, 1, 0xFB), /* Great Britain (United Kingdom; England) */ + COUNTRY_CHPLAN_ENT("GD", 0x34, 1, 0xB0), /* Grenada */ + COUNTRY_CHPLAN_ENT("GE", 0x26, 1, 0x00), /* Georgia */ + COUNTRY_CHPLAN_ENT("GF", 0x26, 1, 0x80), /* French Guiana */ + COUNTRY_CHPLAN_ENT("GG", 0x26, 1, 0x00), /* Guernsey (UK) */ + COUNTRY_CHPLAN_ENT("GH", 0x26, 1, 0xF1), /* Ghana */ + COUNTRY_CHPLAN_ENT("GI", 0x26, 1, 0x00), /* Gibraltar (UK) */ + COUNTRY_CHPLAN_ENT("GL", 0x26, 1, 0x00), /* Greenland (Denmark) */ + COUNTRY_CHPLAN_ENT("GM", 0x26, 1, 0xB0), /* Gambia */ + COUNTRY_CHPLAN_ENT("GN", 0x26, 1, 0x10), /* Guinea */ + COUNTRY_CHPLAN_ENT("GP", 0x26, 1, 0x00), /* Guadeloupe (France) */ + COUNTRY_CHPLAN_ENT("GQ", 0x26, 1, 0xB0), /* Equatorial Guinea */ + COUNTRY_CHPLAN_ENT("GR", 0x26, 1, 0xFB), /* Greece */ + COUNTRY_CHPLAN_ENT("GS", 0x26, 1, 0x00), /* South Georgia and the Sandwich Islands (UK) */ + COUNTRY_CHPLAN_ENT("GT", 0x34, 1, 0xF1), /* Guatemala */ + COUNTRY_CHPLAN_ENT("GU", 0x34, 1, 0x00), /* Guam (USA) */ + COUNTRY_CHPLAN_ENT("GW", 0x26, 1, 0xB0), /* Guinea-Bissau */ + COUNTRY_CHPLAN_ENT("GY", 0x44, 1, 0x00), /* Guyana */ + COUNTRY_CHPLAN_ENT("HK", 0x26, 1, 0xFB), /* Hong Kong */ + COUNTRY_CHPLAN_ENT("HM", 0x45, 1, 0x00), /* Heard and McDonald Islands (Australia) */ + COUNTRY_CHPLAN_ENT("HN", 0x32, 1, 0xF1), /* Honduras */ + COUNTRY_CHPLAN_ENT("HR", 0x26, 1, 0xF9), /* Croatia */ + COUNTRY_CHPLAN_ENT("HT", 0x34, 1, 0x50), /* Haiti */ + COUNTRY_CHPLAN_ENT("HU", 0x26, 1, 0xFB), /* Hungary */ + COUNTRY_CHPLAN_ENT("ID", 0x54, 0, 0xF3), /* Indonesia */ + COUNTRY_CHPLAN_ENT("IE", 0x26, 1, 0xFB), /* Ireland */ + COUNTRY_CHPLAN_ENT("IL", 0x47, 1, 0xF1), /* Israel */ + COUNTRY_CHPLAN_ENT("IM", 0x26, 1, 0x00), /* Isle of Man (UK) */ + COUNTRY_CHPLAN_ENT("IN", 0x47, 1, 0xF1), /* India */ + COUNTRY_CHPLAN_ENT("IQ", 0x26, 1, 0x00), /* Iraq */ + COUNTRY_CHPLAN_ENT("IR", 0x26, 0, 0x00), /* Iran */ + COUNTRY_CHPLAN_ENT("IS", 0x26, 1, 0xFB), /* Iceland */ + COUNTRY_CHPLAN_ENT("IT", 0x26, 1, 0xFB), /* Italy */ + COUNTRY_CHPLAN_ENT("JE", 0x26, 1, 0x00), /* Jersey (UK) */ + COUNTRY_CHPLAN_ENT("JM", 0x51, 1, 0xF1), /* Jamaica */ + COUNTRY_CHPLAN_ENT("JO", 0x49, 1, 0xFB), /* Jordan */ + COUNTRY_CHPLAN_ENT("JP", 0x27, 1, 0xFF), /* Japan- Telec */ + COUNTRY_CHPLAN_ENT("KE", 0x47, 1, 0xF9), /* Kenya */ + COUNTRY_CHPLAN_ENT("KG", 0x26, 1, 0xF1), /* Kyrgyzstan */ + COUNTRY_CHPLAN_ENT("KH", 0x26, 1, 0xF1), /* Cambodia */ + COUNTRY_CHPLAN_ENT("KI", 0x26, 1, 0x00), /* Kiribati */ + COUNTRY_CHPLAN_ENT("KN", 0x34, 1, 0x00), /* Saint Kitts and Nevis */ + COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0xFB), /* South Korea */ + COUNTRY_CHPLAN_ENT("KW", 0x47, 1, 0xFB), /* Kuwait */ + COUNTRY_CHPLAN_ENT("KY", 0x34, 1, 0x00), /* Cayman Islands (UK) */ + COUNTRY_CHPLAN_ENT("KZ", 0x26, 1, 0x00), /* Kazakhstan */ + COUNTRY_CHPLAN_ENT("LA", 0x26, 1, 0x00), /* Laos */ + COUNTRY_CHPLAN_ENT("LB", 0x26, 1, 0xF1), /* Lebanon */ + COUNTRY_CHPLAN_ENT("LC", 0x34, 1, 0x00), /* Saint Lucia */ + COUNTRY_CHPLAN_ENT("LI", 0x26, 1, 0xFB), /* Liechtenstein */ + COUNTRY_CHPLAN_ENT("LK", 0x26, 1, 0xF1), /* Sri Lanka */ + COUNTRY_CHPLAN_ENT("LR", 0x26, 1, 0xB0), /* Liberia */ + COUNTRY_CHPLAN_ENT("LS", 0x26, 1, 0xF1), /* Lesotho */ + COUNTRY_CHPLAN_ENT("LT", 0x26, 1, 0xFB), /* Lithuania */ + COUNTRY_CHPLAN_ENT("LU", 0x26, 1, 0xFB), /* Luxembourg */ + COUNTRY_CHPLAN_ENT("LV", 0x26, 1, 0xFB), /* Latvia */ + COUNTRY_CHPLAN_ENT("LY", 0x26, 1, 0x00), /* Libya */ + COUNTRY_CHPLAN_ENT("MA", 0x47, 1, 0xF1), /* Morocco */ + COUNTRY_CHPLAN_ENT("MC", 0x26, 1, 0xFB), /* Monaco */ + COUNTRY_CHPLAN_ENT("MD", 0x26, 1, 0xF1), /* Moldova */ + COUNTRY_CHPLAN_ENT("ME", 0x26, 1, 0xF1), /* Montenegro */ + COUNTRY_CHPLAN_ENT("MF", 0x34, 1, 0x00), /* Saint Martin */ + COUNTRY_CHPLAN_ENT("MG", 0x26, 1, 0x20), /* Madagascar */ + COUNTRY_CHPLAN_ENT("MH", 0x34, 1, 0x00), /* Marshall Islands (USA) */ + COUNTRY_CHPLAN_ENT("MK", 0x26, 1, 0xF1), /* Republic of Macedonia (FYROM) */ + COUNTRY_CHPLAN_ENT("ML", 0x26, 1, 0xB0), /* Mali */ + COUNTRY_CHPLAN_ENT("MM", 0x26, 1, 0x00), /* Burma (Myanmar) */ + COUNTRY_CHPLAN_ENT("MN", 0x26, 1, 0x00), /* Mongolia */ + COUNTRY_CHPLAN_ENT("MO", 0x26, 1, 0x00), /* Macau */ + COUNTRY_CHPLAN_ENT("MP", 0x34, 1, 0x00), /* Northern Mariana Islands (USA) */ + COUNTRY_CHPLAN_ENT("MQ", 0x26, 1, 0x40), /* Martinique (France) */ + COUNTRY_CHPLAN_ENT("MR", 0x26, 1, 0xA0), /* Mauritania */ + COUNTRY_CHPLAN_ENT("MS", 0x26, 1, 0x00), /* Montserrat (UK) */ + COUNTRY_CHPLAN_ENT("MT", 0x26, 1, 0xFB), /* Malta */ + COUNTRY_CHPLAN_ENT("MU", 0x26, 1, 0xB0), /* Mauritius */ + COUNTRY_CHPLAN_ENT("MV", 0x26, 1, 0x00), /* Maldives */ + COUNTRY_CHPLAN_ENT("MW", 0x26, 1, 0xB0), /* Malawi */ + COUNTRY_CHPLAN_ENT("MX", 0x34, 1, 0xF1), /* Mexico */ + COUNTRY_CHPLAN_ENT("MY", 0x47, 1, 0xF1), /* Malaysia */ + COUNTRY_CHPLAN_ENT("MZ", 0x26, 1, 0xF1), /* Mozambique */ + COUNTRY_CHPLAN_ENT("NA", 0x26, 0, 0x00), /* Namibia */ + COUNTRY_CHPLAN_ENT("NC", 0x26, 1, 0x00), /* New Caledonia */ + COUNTRY_CHPLAN_ENT("NE", 0x26, 1, 0xB0), /* Niger */ + COUNTRY_CHPLAN_ENT("NF", 0x45, 1, 0x00), /* Norfolk Island (Australia) */ + COUNTRY_CHPLAN_ENT("NG", 0x50, 1, 0xF9), /* Nigeria */ + COUNTRY_CHPLAN_ENT("NI", 0x34, 1, 0xF1), /* Nicaragua */ + COUNTRY_CHPLAN_ENT("NL", 0x26, 1, 0xFB), /* Netherlands */ + COUNTRY_CHPLAN_ENT("NO", 0x26, 1, 0xFB), /* Norway */ + COUNTRY_CHPLAN_ENT("NP", 0x47, 1, 0xF0), /* Nepal */ + COUNTRY_CHPLAN_ENT("NR", 0x26, 1, 0x00), /* Nauru */ + COUNTRY_CHPLAN_ENT("NU", 0x45, 1, 0x00), /* Niue */ + COUNTRY_CHPLAN_ENT("NZ", 0x45, 1, 0xFB), /* New Zealand */ + COUNTRY_CHPLAN_ENT("OM", 0x26, 1, 0xF9), /* Oman */ + COUNTRY_CHPLAN_ENT("PA", 0x34, 1, 0xF1), /* Panama */ + COUNTRY_CHPLAN_ENT("PE", 0x34, 1, 0xF1), /* Peru */ + COUNTRY_CHPLAN_ENT("PF", 0x26, 1, 0x00), /* French Polynesia (France) */ + COUNTRY_CHPLAN_ENT("PG", 0x26, 1, 0xF1), /* Papua New Guinea */ + COUNTRY_CHPLAN_ENT("PH", 0x26, 1, 0xF1), /* Philippines */ + COUNTRY_CHPLAN_ENT("PK", 0x51, 1, 0xF1), /* Pakistan */ + COUNTRY_CHPLAN_ENT("PL", 0x26, 1, 0xFB), /* Poland */ + COUNTRY_CHPLAN_ENT("PM", 0x26, 1, 0x00), /* Saint Pierre and Miquelon (France) */ + COUNTRY_CHPLAN_ENT("PR", 0x34, 1, 0xF1), /* Puerto Rico */ + COUNTRY_CHPLAN_ENT("PT", 0x26, 1, 0xFB), /* Portugal */ + COUNTRY_CHPLAN_ENT("PW", 0x34, 1, 0x00), /* Palau */ + COUNTRY_CHPLAN_ENT("PY", 0x34, 1, 0xF1), /* Paraguay */ + COUNTRY_CHPLAN_ENT("QA", 0x51, 1, 0xF9), /* Qatar */ + COUNTRY_CHPLAN_ENT("RE", 0x26, 1, 0x00), /* Reunion (France) */ + COUNTRY_CHPLAN_ENT("RO", 0x26, 1, 0xF1), /* Romania */ + COUNTRY_CHPLAN_ENT("RS", 0x26, 1, 0xF1), /* Serbia, Kosovo */ + COUNTRY_CHPLAN_ENT("RU", 0x59, 1, 0xFB), /* Russia(fac/gost), Kaliningrad */ + COUNTRY_CHPLAN_ENT("RW", 0x26, 1, 0xB0), /* Rwanda */ + COUNTRY_CHPLAN_ENT("SA", 0x26, 1, 0xFB), /* Saudi Arabia */ + COUNTRY_CHPLAN_ENT("SB", 0x26, 1, 0x00), /* Solomon Islands */ + COUNTRY_CHPLAN_ENT("SC", 0x34, 1, 0x90), /* Seychelles */ + COUNTRY_CHPLAN_ENT("SE", 0x26, 1, 0xFB), /* Sweden */ + COUNTRY_CHPLAN_ENT("SG", 0x47, 1, 0xFB), /* Singapore */ + COUNTRY_CHPLAN_ENT("SH", 0x26, 1, 0x00), /* Saint Helena (UK) */ + COUNTRY_CHPLAN_ENT("SI", 0x26, 1, 0xFB), /* Slovenia */ + COUNTRY_CHPLAN_ENT("SJ", 0x26, 1, 0x00), /* Svalbard (Norway) */ + COUNTRY_CHPLAN_ENT("SK", 0x26, 1, 0xFB), /* Slovakia */ + COUNTRY_CHPLAN_ENT("SL", 0x26, 1, 0xB0), /* Sierra Leone */ + COUNTRY_CHPLAN_ENT("SM", 0x26, 1, 0x00), /* San Marino */ + COUNTRY_CHPLAN_ENT("SN", 0x26, 1, 0xF1), /* Senegal */ + COUNTRY_CHPLAN_ENT("SO", 0x26, 1, 0x00), /* Somalia */ + COUNTRY_CHPLAN_ENT("SR", 0x34, 1, 0x00), /* Suriname */ + COUNTRY_CHPLAN_ENT("ST", 0x34, 1, 0x80), /* Sao Tome and Principe */ + COUNTRY_CHPLAN_ENT("SV", 0x30, 1, 0xF1), /* El Salvador */ + COUNTRY_CHPLAN_ENT("SX", 0x34, 1, 0x00), /* Sint Marteen */ + COUNTRY_CHPLAN_ENT("SZ", 0x26, 1, 0x20), /* Swaziland */ + COUNTRY_CHPLAN_ENT("TC", 0x26, 1, 0x00), /* Turks and Caicos Islands (UK) */ + COUNTRY_CHPLAN_ENT("TD", 0x26, 1, 0xB0), /* Chad */ + COUNTRY_CHPLAN_ENT("TF", 0x26, 1, 0x80), /* French Southern and Antarctic Lands (FR Southern Territories) */ + COUNTRY_CHPLAN_ENT("TG", 0x26, 1, 0xB0), /* Togo */ + COUNTRY_CHPLAN_ENT("TH", 0x26, 1, 0xF1), /* Thailand */ + COUNTRY_CHPLAN_ENT("TJ", 0x26, 1, 0x40), /* Tajikistan */ + COUNTRY_CHPLAN_ENT("TK", 0x45, 1, 0x00), /* Tokelau */ + COUNTRY_CHPLAN_ENT("TM", 0x26, 1, 0x00), /* Turkmenistan */ + COUNTRY_CHPLAN_ENT("TN", 0x47, 1, 0xF1), /* Tunisia */ + COUNTRY_CHPLAN_ENT("TO", 0x26, 1, 0x00), /* Tonga */ + COUNTRY_CHPLAN_ENT("TR", 0x26, 1, 0xF1), /* Turkey, Northern Cyprus */ + COUNTRY_CHPLAN_ENT("TT", 0x42, 1, 0xF1), /* Trinidad & Tobago */ + COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0xFF), /* Taiwan */ + COUNTRY_CHPLAN_ENT("TZ", 0x26, 1, 0xF0), /* Tanzania */ + COUNTRY_CHPLAN_ENT("UA", 0x26, 1, 0xFB), /* Ukraine */ + COUNTRY_CHPLAN_ENT("UG", 0x26, 1, 0xF1), /* Uganda */ + COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0xFF), /* United States of America (USA) */ + COUNTRY_CHPLAN_ENT("UY", 0x34, 1, 0xF1), /* Uruguay */ + COUNTRY_CHPLAN_ENT("UZ", 0x47, 1, 0xF0), /* Uzbekistan */ + COUNTRY_CHPLAN_ENT("VA", 0x26, 1, 0x00), /* Holy See (Vatican City) */ + COUNTRY_CHPLAN_ENT("VC", 0x34, 1, 0x10), /* Saint Vincent and the Grenadines */ + COUNTRY_CHPLAN_ENT("VE", 0x30, 1, 0xF1), /* Venezuela */ + COUNTRY_CHPLAN_ENT("VI", 0x34, 1, 0x00), /* United States Virgin Islands (USA) */ + COUNTRY_CHPLAN_ENT("VN", 0x26, 1, 0xF1), /* Vietnam */ + COUNTRY_CHPLAN_ENT("VU", 0x26, 1, 0x00), /* Vanuatu */ + COUNTRY_CHPLAN_ENT("WF", 0x26, 1, 0x00), /* Wallis and Futuna (France) */ + COUNTRY_CHPLAN_ENT("WS", 0x34, 1, 0x00), /* Samoa */ + COUNTRY_CHPLAN_ENT("YE", 0x26, 1, 0x40), /* Yemen */ + COUNTRY_CHPLAN_ENT("YT", 0x26, 1, 0x80), /* Mayotte (France) */ + COUNTRY_CHPLAN_ENT("ZA", 0x26, 1, 0xF1), /* South Africa */ + COUNTRY_CHPLAN_ENT("ZM", 0x26, 1, 0xB0), /* Zambia */ + COUNTRY_CHPLAN_ENT("ZW", 0x26, 1, 0xF1), /* Zimbabwe */ }; -u16 country_chplan_map_sz = sizeof(country_chplan_map)/sizeof(struct country_chplan); +u16 const country_chplan_map_sz = sizeof(country_chplan_map) / sizeof(struct country_chplan); /* * rtw_get_chplan_from_country - * @country_code: string of country code * -* Return channel_plan index or -1 when unsupported country_code is given +* Return pointer of struct country_chplan entry or NULL when unsupported country_code is given */ -int rtw_get_chplan_from_country(const char *country_code) +const struct country_chplan *rtw_get_chplan_from_country(const char *country_code) { - int channel_plan = -1; + const struct country_chplan *ent = NULL; + const struct country_chplan *map = NULL; + u16 map_sz = 0; + char code[2]; int i; - /* TODO: should consider 3-character country code? */ + code[0] = alpha_to_upper(country_code[0]); + code[1] = alpha_to_upper(country_code[1]); - for (i = 0; i < country_chplan_map_sz; i++) { - if (strncmp(country_code, country_chplan_map[i].alpha2, 2) == 0) { - channel_plan = country_chplan_map[i].chplan; +#if !defined(CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP) && RTW_DEF_MODULE_REGULATORY_CERT + ent = rtw_def_module_get_chplan_from_country(code); + if (ent != NULL) + goto exit; +#endif + +#ifdef CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP + map = CUSTOMIZED_country_chplan_map; + map_sz = CUSTOMIZED_country_chplan_map_sz; +#else + map = country_chplan_map; + map_sz = country_chplan_map_sz; +#endif + + for (i = 0; i < map_sz; i++) { + if (strncmp(code, map[i].alpha2, 2) == 0) { + ent = &map[i]; break; } } - return channel_plan; +exit: + #if RTW_DEF_MODULE_REGULATORY_CERT + if (ent && !(COUNTRY_CHPLAN_DEF_MODULE_FALGS(ent) & RTW_DEF_MODULE_REGULATORY_CERT)) + ent = NULL; + #endif + + return ent; } int rtw_ch_to_bb_gain_sel(int ch) @@ -364,7 +986,7 @@ s8 rtw_rf_get_kfree_tx_gain_offset(_adapter *padapter, u8 path, u8 ch) { s8 kfree_offset = 0; -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter); struct kfree_data_t *kfree_data = GET_KFREE_DATA(padapter); s8 bb_gain_sel = rtw_ch_to_bb_gain_sel(ch); @@ -377,11 +999,11 @@ s8 rtw_rf_get_kfree_tx_gain_offset(_adapter *padapter, u8 path, u8 ch) if (kfree_data->flag & KFREE_FLAG_ON) { kfree_offset = kfree_data->bb_gain[bb_gain_sel][path]; if (1) - DBG_871X("%s path:%u, ch:%u, bb_gain_sel:%d, kfree_offset:%d\n" + RTW_INFO("%s path:%u, ch:%u, bb_gain_sel:%d, kfree_offset:%d\n" , __func__, path, ch, bb_gain_sel, kfree_offset); } exit: -#endif /* CONFIG_RF_GAIN_OFFSET */ +#endif /* CONFIG_RF_POWER_TRIM */ return kfree_offset; } @@ -389,8 +1011,14 @@ void rtw_rf_set_tx_gain_offset(_adapter *adapter, u8 path, s8 offset) { u8 write_value; - DBG_871X("kfree gain_offset 0x55:0x%x ", rtw_hal_read_rfreg(adapter, path, 0x55, 0xffffffff)); + RTW_INFO("kfree gain_offset 0x55:0x%x ", rtw_hal_read_rfreg(adapter, path, 0x55, 0xffffffff)); switch (rtw_get_chip_type(adapter)) { +#ifdef CONFIG_RTL8723D + case RTL8723D: + write_value = RF_TX_GAIN_OFFSET_8723D(offset); + rtw_hal_write_rfreg(adapter, path, 0x55, 0x0fc000, write_value); + break; +#endif /* CONFIG_RTL8723D */ #ifdef CONFIG_RTL8703B case RTL8703B: write_value = RF_TX_GAIN_OFFSET_8703B(offset); @@ -416,18 +1044,20 @@ void rtw_rf_set_tx_gain_offset(_adapter *adapter, u8 path, s8 offset) rtw_hal_write_rfreg(adapter, path, 0x55, 0x0f8000, write_value); break; #endif /* CONFIG_RTL8821A */ -#ifdef CONFIG_RTL8814A - case RTL8814A: - DBG_871X("\nkfree by PhyDM on the sw CH. path %d\n", path); +#if defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) + case RTL8814A: + case RTL8822B: + case RTL8821C: + RTW_INFO("\nkfree by PhyDM on the sw CH. path %d\n", path); break; -#endif /* CONFIG_RTL8821A */ +#endif /* CONFIG_RTL8814A || CONFIG_RTL8822B || CONFIG_RTL8821C */ default: rtw_warn_on(1); break; } - DBG_871X(" after :0x%x\n", rtw_hal_read_rfreg(adapter, path, 0x55, 0xffffffff)); + RTW_INFO(" after :0x%x\n", rtw_hal_read_rfreg(adapter, path, 0x55, 0xffffffff)); } void rtw_rf_apply_tx_gain_offset(_adapter *adapter, u8 ch) @@ -447,7 +1077,7 @@ void rtw_rf_apply_tx_gain_offset(_adapter *adapter, u8 ch) bool rtw_is_dfs_range(u32 hi, u32 lo) { - return rtw_is_range_overlap(hi, lo, 5720 + 10, 5260 - 10)?_TRUE:_FALSE; + return rtw_is_range_overlap(hi, lo, 5720 + 10, 5260 - 10) ? _TRUE : _FALSE; } bool rtw_is_dfs_ch(u8 ch, u8 bw, u8 offset) @@ -457,21 +1087,20 @@ bool rtw_is_dfs_ch(u8 ch, u8 bw, u8 offset) if (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE) return _FALSE; - return rtw_is_dfs_range(hi, lo)?_TRUE:_FALSE; + return rtw_is_dfs_range(hi, lo) ? _TRUE : _FALSE; } -bool rtw_is_long_cac_range(u32 hi, u32 lo) +bool rtw_is_long_cac_range(u32 hi, u32 lo, u8 dfs_region) { - return rtw_is_range_overlap(hi, lo, 5660 + 10, 5600 - 10)?_TRUE:_FALSE; + return (dfs_region == PHYDM_DFS_DOMAIN_ETSI && rtw_is_range_overlap(hi, lo, 5660 + 10, 5600 - 10)) ? _TRUE : _FALSE; } -bool rtw_is_long_cac_ch(u8 ch, u8 bw, u8 offset) +bool rtw_is_long_cac_ch(u8 ch, u8 bw, u8 offset, u8 dfs_region) { u32 hi, lo; if (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE) return _FALSE; - return rtw_is_long_cac_range(hi, lo)?_TRUE:_FALSE; + return rtw_is_long_cac_range(hi, lo, dfs_region) ? _TRUE : _FALSE; } - diff --git a/core/rtw_sdio.c b/core/rtw_sdio.c new file mode 100644 index 0000000..817d60b --- /dev/null +++ b/core/rtw_sdio.c @@ -0,0 +1,98 @@ +/****************************************************************************** + * + * Copyright(c) 2015 - 2016 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 + * + ******************************************************************************/ +#define _RTW_SDIO_C_ + +#include /* struct dvobj_priv and etc. */ +#include /* RTW_SDIO_ADDR_CMD52_GEN */ + +/* + * Description: + * Use SDIO cmd52 or cmd53 to read/write data + * + * Parameters: + * d pointer of device object(struct dvobj_priv) + * addr SDIO address, 17 bits + * buf buffer for I/O + * len length + * write 0:read, 1:write + * cmd52 0:cmd52, 1:cmd53 + * + * Return: + * _SUCCESS I/O ok. + * _FAIL I/O fail. + */ +static u8 sdio_io(struct dvobj_priv *d, u32 addr, void *buf, size_t len, u8 write, u8 cmd52) +{ + int err; + + + if (cmd52) + addr = RTW_SDIO_ADDR_CMD52_GEN(addr); + + if (write) + err = d->intf_ops->write(d, addr, buf, len, 0); + else + err = d->intf_ops->read(d, addr, buf, len, 0); + if (err) { + RTW_INFO("%s: [ERROR] %s FAIL! error(%d)\n", + __FUNCTION__, write ? "write" : "read", err); + return _FAIL; + } + + return _SUCCESS; +} + +u8 rtw_sdio_read_cmd52(struct dvobj_priv *d, u32 addr, void *buf, size_t len) +{ + return sdio_io(d, addr, buf, len, 0, 1); +} + +u8 rtw_sdio_read_cmd53(struct dvobj_priv *d, u32 addr, void *buf, size_t len) +{ + return sdio_io(d, addr, buf, len, 0, 0); +} + +u8 rtw_sdio_write_cmd52(struct dvobj_priv *d, u32 addr, void *buf, size_t len) +{ + return sdio_io(d, addr, buf, len, 1, 1); +} + +u8 rtw_sdio_write_cmd53(struct dvobj_priv *d, u32 addr, void *buf, size_t len) +{ + return sdio_io(d, addr, buf, len, 1, 0); +} + +u8 rtw_sdio_f0_read(struct dvobj_priv *d, u32 addr, void *buf, size_t len) +{ + int err; + u8 ret; + + + ret = _SUCCESS; + addr = RTW_SDIO_ADDR_F0_GEN(addr); + + err = d->intf_ops->read(d, addr, buf, len, 0); + if (err) { + RTW_INFO("%s: [ERROR] Read f0 register FAIL!\n", __FUNCTION__); + ret = _FAIL; + } + + + return ret; +} diff --git a/core/rtw_security.c b/core/rtw_security.c old mode 100755 new mode 100644 index 0729501..ae43bfa --- a/core/rtw_security.c +++ b/core/rtw_security.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. @@ -45,53 +45,59 @@ const char *security_type_str(u8 value) } #ifdef DBG_SW_SEC_CNT -#define WEP_SW_ENC_CNT_INC(sec, ra) \ +#define WEP_SW_ENC_CNT_INC(sec, ra) do {\ if (is_broadcast_mac_addr(ra)) \ sec->wep_sw_enc_cnt_bc++; \ else if (is_multicast_mac_addr(ra)) \ sec->wep_sw_enc_cnt_mc++; \ else \ - sec->wep_sw_enc_cnt_uc++; + sec->wep_sw_enc_cnt_uc++; \ + } while (0) -#define WEP_SW_DEC_CNT_INC(sec, ra) \ +#define WEP_SW_DEC_CNT_INC(sec, ra) do {\ if (is_broadcast_mac_addr(ra)) \ sec->wep_sw_dec_cnt_bc++; \ else if (is_multicast_mac_addr(ra)) \ sec->wep_sw_dec_cnt_mc++; \ else \ - sec->wep_sw_dec_cnt_uc++; + sec->wep_sw_dec_cnt_uc++; \ + } while (0) -#define TKIP_SW_ENC_CNT_INC(sec, ra) \ +#define TKIP_SW_ENC_CNT_INC(sec, ra) do {\ if (is_broadcast_mac_addr(ra)) \ sec->tkip_sw_enc_cnt_bc++; \ else if (is_multicast_mac_addr(ra)) \ sec->tkip_sw_enc_cnt_mc++; \ else \ - sec->tkip_sw_enc_cnt_uc++; + sec->tkip_sw_enc_cnt_uc++; \ + } while (0) -#define TKIP_SW_DEC_CNT_INC(sec, ra) \ +#define TKIP_SW_DEC_CNT_INC(sec, ra) do {\ if (is_broadcast_mac_addr(ra)) \ sec->tkip_sw_dec_cnt_bc++; \ else if (is_multicast_mac_addr(ra)) \ sec->tkip_sw_dec_cnt_mc++; \ else \ - sec->tkip_sw_dec_cnt_uc++; + sec->tkip_sw_dec_cnt_uc++; \ + } while (0) -#define AES_SW_ENC_CNT_INC(sec, ra) \ +#define AES_SW_ENC_CNT_INC(sec, ra) do {\ if (is_broadcast_mac_addr(ra)) \ sec->aes_sw_enc_cnt_bc++; \ else if (is_multicast_mac_addr(ra)) \ sec->aes_sw_enc_cnt_mc++; \ else \ - sec->aes_sw_enc_cnt_uc++; + sec->aes_sw_enc_cnt_uc++; \ + } while (0) -#define AES_SW_DEC_CNT_INC(sec, ra) \ +#define AES_SW_DEC_CNT_INC(sec, ra) do {\ if (is_broadcast_mac_addr(ra)) \ sec->aes_sw_dec_cnt_bc++; \ else if (is_multicast_mac_addr(ra)) \ sec->aes_sw_dec_cnt_mc++; \ else \ - sec->aes_sw_dec_cnt_uc++; + sec->aes_sw_dec_cnt_uc++; \ + } while (0) #else #define WEP_SW_ENC_CNT_INC(sec, ra) #define WEP_SW_DEC_CNT_INC(sec, ra) @@ -101,26 +107,24 @@ const char *security_type_str(u8 value) #define AES_SW_DEC_CNT_INC(sec, ra) #endif /* DBG_SW_SEC_CNT */ -//=====WEP related===== +/* *****WEP related***** */ #define CRC32_POLY 0x04c11db7 -struct arc4context -{ +struct arc4context { u32 x; u32 y; u8 state[256]; }; -static void arcfour_init(struct arc4context *parc4ctx, u8 * key,u32 key_len) +static void arcfour_init(struct arc4context *parc4ctx, u8 *key, u32 key_len) { u32 t, u; u32 keyindex; u32 stateindex; - u8 * state; + u8 *state; u32 counter; -_func_enter_; state = parc4ctx->state; parc4ctx->x = 0; parc4ctx->y = 0; @@ -128,8 +132,7 @@ _func_enter_; state[counter] = (u8)counter; keyindex = 0; stateindex = 0; - for (counter = 0; counter < 256; counter++) - { + for (counter = 0; counter < 256; counter++) { t = state[counter]; stateindex = (stateindex + key[keyindex] + t) & 0xff; u = state[stateindex]; @@ -138,15 +141,13 @@ _func_enter_; if (++keyindex >= key_len) keyindex = 0; } -_func_exit_; } -static u32 arcfour_byte( struct arc4context *parc4ctx) +static u32 arcfour_byte(struct arc4context *parc4ctx) { u32 x; u32 y; u32 sx, sy; - u8 * state; -_func_enter_; + u8 *state; state = parc4ctx->state; x = (parc4ctx->x + 1) & 0xff; sx = state[x]; @@ -156,51 +157,46 @@ _func_enter_; parc4ctx->y = y; state[y] = (u8)sx; state[x] = (u8)sy; -_func_exit_; return state[(sx + sy) & 0xff]; } - - -static void arcfour_encrypt( struct arc4context *parc4ctx, - u8 * dest, - u8 * src, - u32 len) + + +static void arcfour_encrypt(struct arc4context *parc4ctx, + u8 *dest, + u8 *src, + u32 len) { u32 i; -_func_enter_; for (i = 0; i < len; i++) dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx); -_func_exit_; } static sint bcrc32initialized = 0; static u32 crc32_table[256]; -static u8 crc32_reverseBit( u8 data) +static u8 crc32_reverseBit(u8 data) { - return( (u8)((data<<7)&0x80) | ((data<<5)&0x40) | ((data<<3)&0x20) | ((data<<1)&0x10) | ((data>>1)&0x08) | ((data>>3)&0x04) | ((data>>5)&0x02) | ((data>>7)&0x01) ); + return (u8)((data << 7) & 0x80) | ((data << 5) & 0x40) | ((data << 3) & 0x20) | ((data << 1) & 0x10) | ((data >> 1) & 0x08) | ((data >> 3) & 0x04) | ((data >> 5) & 0x02) | (( + data >> 7) & 0x01) ; } static void crc32_init(void) { -_func_enter_; - if (bcrc32initialized == 1) + if (bcrc32initialized == 1) goto exit; - else{ + else { sint i, j; u32 c; - u8 *p=(u8 *)&c, *p1; + u8 *p = (u8 *)&c, *p1; u8 k; c = 0x12340000; - for (i = 0; i < 256; ++i) - { + for (i = 0; i < 256; ++i) { k = crc32_reverseBit((u8)i); - for (c = ((u32)k) << 24, j = 8; j > 0; --j){ + for (c = ((u32)k) << 24, j = 8; j > 0; --j) c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1); - } p1 = (u8 *)&crc32_table[i]; p1[0] = crc32_reverseBit(p[3]); @@ -208,26 +204,23 @@ _func_enter_; p1[2] = crc32_reverseBit(p[1]); p1[3] = crc32_reverseBit(p[0]); } - bcrc32initialized= 1; + bcrc32initialized = 1; } -exit: -_func_exit_; +exit: + return; } static u32 getcrc32(u8 *buf, sint len) { u8 *p; u32 crc; -_func_enter_; - if (bcrc32initialized == 0) crc32_init(); + if (bcrc32initialized == 0) + crc32_init(); crc = 0xffffffff; /* preload shift register, per CRC-32 spec */ - for (p = buf; len > 0; ++p, --len) - { - crc = crc32_table[ (crc ^ *p) & 0xff] ^ (crc >> 8); - } -_func_exit_; + for (p = buf; len > 0; ++p, --len) + crc = crc32_table[(crc ^ *p) & 0xff] ^ (crc >> 8); return ~crc; /* transmit complement, per CRC-32 spec */ } @@ -236,269 +229,233 @@ _func_exit_; Need to consider the fragment situation */ void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe) -{ // exclude ICV - +{ + /* exclude ICV */ + unsigned char crc[4]; struct arc4context mycontext; - sint curfragnum,length; + sint curfragnum, length; u32 keylength; - u8 *pframe, *payload,*iv; //,*wepkey + u8 *pframe, *payload, *iv; /* ,*wepkey */ u8 wepkey[16]; - u8 hw_hdr_offset=0; - struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; - -_func_enter_; + u8 hw_hdr_offset = 0; + struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + + + if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL) return; #ifdef CONFIG_USB_TX_AGGREGATION hw_hdr_offset = TXDESC_SIZE + - (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); + (((struct xmit_frame *)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); +#else +#ifdef CONFIG_TX_EARLY_MODE + hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE; #else - #ifdef CONFIG_TX_EARLY_MODE - hw_hdr_offset = TXDESC_OFFSET+EARLY_MODE_INFO_SIZE; - #else hw_hdr_offset = TXDESC_OFFSET; - #endif +#endif #endif - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + hw_hdr_offset; - - //start to encrypt each fragment - if((pattrib->encrypt==_WEP40_)||(pattrib->encrypt==_WEP104_)) - { - keylength=psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex]; + pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset; - for(curfragnum=0;curfragnumnr_frags;curfragnum++) - { - iv=pframe+pattrib->hdrlen; + /* start to encrypt each fragment */ + if ((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) { + keylength = psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex]; + + for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { + iv = pframe + pattrib->hdrlen; _rtw_memcpy(&wepkey[0], iv, 3); - _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); - payload=pframe+pattrib->iv_len+pattrib->hdrlen; + _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0], keylength); + payload = pframe + pattrib->iv_len + pattrib->hdrlen; - if((curfragnum+1)==pattrib->nr_frags) - { //the last fragment - - length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; - - *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length)); + if ((curfragnum + 1) == pattrib->nr_frags) { + /* the last fragment */ - arcfour_init(&mycontext, wepkey,3+keylength); + length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; + + *((u32 *)crc) = cpu_to_le32(getcrc32(payload, length)); + + arcfour_init(&mycontext, wepkey, 3 + keylength); arcfour_encrypt(&mycontext, payload, payload, length); - arcfour_encrypt(&mycontext, payload+length, crc, 4); + arcfour_encrypt(&mycontext, payload + length, crc, 4); + + } else { + length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len ; + *((u32 *)crc) = cpu_to_le32(getcrc32(payload, length)); + arcfour_init(&mycontext, wepkey, 3 + keylength); + arcfour_encrypt(&mycontext, payload, payload, length); + arcfour_encrypt(&mycontext, payload + length, crc, 4); + + pframe += pxmitpriv->frag_len; + pframe = (u8 *)RND4((SIZE_PTR)(pframe)); } - else - { - length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; - *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length)); - arcfour_init(&mycontext, wepkey,3+keylength); - arcfour_encrypt(&mycontext, payload, payload, length); - arcfour_encrypt(&mycontext, payload+length, crc, 4); - - pframe+=pxmitpriv->frag_len; - pframe=(u8 *)RND4((SIZE_PTR)(pframe)); - } - - } + } WEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra); } - -_func_exit_; + } void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe) -{ - // exclude ICV +{ + /* exclude ICV */ u8 crc[4]; struct arc4context mycontext; - sint length; + sint length; u32 keylength; - u8 *pframe, *payload,*iv,wepkey[16]; + u8 *pframe, *payload, *iv, wepkey[16]; u8 keyindex; - struct rx_pkt_attrib *prxattrib = &(((union recv_frame*)precvframe)->u.hdr.attrib); - struct security_priv *psecuritypriv=&padapter->securitypriv; + struct rx_pkt_attrib *prxattrib = &(((union recv_frame *)precvframe)->u.hdr.attrib); + struct security_priv *psecuritypriv = &padapter->securitypriv; -_func_enter_; - pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - - //start to decrypt recvframe - if((prxattrib->encrypt==_WEP40_)||(prxattrib->encrypt==_WEP104_)) - { - iv=pframe+prxattrib->hdrlen; - //keyindex=(iv[3]&0x3); + pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data; + + /* start to decrypt recvframe */ + if ((prxattrib->encrypt == _WEP40_) || (prxattrib->encrypt == _WEP104_)) { + iv = pframe + prxattrib->hdrlen; + /* keyindex=(iv[3]&0x3); */ keyindex = prxattrib->key_index; - keylength=psecuritypriv->dot11DefKeylen[keyindex]; + keylength = psecuritypriv->dot11DefKeylen[keyindex]; _rtw_memcpy(&wepkey[0], iv, 3); - //_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); - _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0],keylength); - length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; + /* _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); */ + _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0], keylength); + length = ((union recv_frame *)precvframe)->u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len; - payload=pframe+prxattrib->iv_len+prxattrib->hdrlen; - - //decrypt payload include icv - arcfour_init(&mycontext, wepkey,3+keylength); + payload = pframe + prxattrib->iv_len + prxattrib->hdrlen; + + /* decrypt payload include icv */ + arcfour_init(&mycontext, wepkey, 3 + keylength); arcfour_encrypt(&mycontext, payload, payload, length); - - //calculate icv and compare the icv - *((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4)); - - if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4]) - { - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n", - crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4])); - } + + /* calculate icv and compare the icv */ + *((u32 *)crc) = le32_to_cpu(getcrc32(payload, length - 4)); + WEP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra); } - -_func_exit_; + return; - + } -//3 =====TKIP related===== +/* 3 =====TKIP related===== */ -static u32 secmicgetuint32( u8 * p ) -// Convert from Byte[] to Us4Byte32 in a portable way +static u32 secmicgetuint32(u8 *p) +/* Convert from Byte[] to Us4Byte32 in a portable way */ { s32 i; u32 res = 0; -_func_enter_; - for( i=0; i<4; i++ ) - { - res |= ((u32)(*p++)) << (8*i); - } -_func_exit_; + for (i = 0; i < 4; i++) + res |= ((u32)(*p++)) << (8 * i); return res; } -static void secmicputuint32( u8 * p, u32 val ) -// Convert from Us4Byte32 to Byte[] in a portable way +static void secmicputuint32(u8 *p, u32 val) +/* Convert from Us4Byte32 to Byte[] in a portable way */ { long i; -_func_enter_; - for( i=0; i<4; i++ ) - { - *p++ = (u8) (val & 0xff); + for (i = 0; i < 4; i++) { + *p++ = (u8)(val & 0xff); val >>= 8; } -_func_exit_; } static void secmicclear(struct mic_data *pmicdata) { -// Reset the state to the empty message. -_func_enter_; + /* Reset the state to the empty message. */ pmicdata->L = pmicdata->K0; pmicdata->R = pmicdata->K1; pmicdata->nBytesInM = 0; pmicdata->M = 0; -_func_exit_; } -void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key ) +void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key) { - // Set the key -_func_enter_; - pmicdata->K0 = secmicgetuint32( key ); - pmicdata->K1 = secmicgetuint32( key + 4 ); - // and reset the message + /* Set the key */ + pmicdata->K0 = secmicgetuint32(key); + pmicdata->K1 = secmicgetuint32(key + 4); + /* and reset the message */ secmicclear(pmicdata); -_func_exit_; } -void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b ) +void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b) { -_func_enter_; - // Append the byte to our word-sized buffer - pmicdata->M |= ((unsigned long)b) << (8*pmicdata->nBytesInM); + /* Append the byte to our word-sized buffer */ + pmicdata->M |= ((unsigned long)b) << (8 * pmicdata->nBytesInM); pmicdata->nBytesInM++; - // Process the word if it is full. - if( pmicdata->nBytesInM >= 4 ) - { + /* Process the word if it is full. */ + if (pmicdata->nBytesInM >= 4) { pmicdata->L ^= pmicdata->M; - pmicdata->R ^= ROL32( pmicdata->L, 17 ); + pmicdata->R ^= ROL32(pmicdata->L, 17); pmicdata->L += pmicdata->R; pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) | ((pmicdata->L & 0x00ff00ff) << 8); pmicdata->L += pmicdata->R; - pmicdata->R ^= ROL32( pmicdata->L, 3 ); + pmicdata->R ^= ROL32(pmicdata->L, 3); pmicdata->L += pmicdata->R; - pmicdata->R ^= ROR32( pmicdata->L, 2 ); + pmicdata->R ^= ROR32(pmicdata->L, 2); pmicdata->L += pmicdata->R; - // Clear the buffer + /* Clear the buffer */ pmicdata->M = 0; pmicdata->nBytesInM = 0; } -_func_exit_; } -void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nbytes ) +void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nbytes) { -_func_enter_; - // This is simple - while( nbytes > 0 ) - { - rtw_secmicappendbyte(pmicdata, *src++ ); + /* This is simple */ + while (nbytes > 0) { + rtw_secmicappendbyte(pmicdata, *src++); nbytes--; } -_func_exit_; } -void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst ) +void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst) { -_func_enter_; - // Append the minimum padding - rtw_secmicappendbyte(pmicdata, 0x5a ); - rtw_secmicappendbyte(pmicdata, 0 ); - rtw_secmicappendbyte(pmicdata, 0 ); - rtw_secmicappendbyte(pmicdata, 0 ); - rtw_secmicappendbyte(pmicdata, 0 ); - // and then zeroes until the length is a multiple of 4 - while( pmicdata->nBytesInM != 0 ) - { - rtw_secmicappendbyte(pmicdata, 0 ); - } - // The appendByte function has already computed the result. - secmicputuint32( dst, pmicdata->L ); - secmicputuint32( dst+4, pmicdata->R ); - // Reset to the empty message. + /* Append the minimum padding */ + rtw_secmicappendbyte(pmicdata, 0x5a); + rtw_secmicappendbyte(pmicdata, 0); + rtw_secmicappendbyte(pmicdata, 0); + rtw_secmicappendbyte(pmicdata, 0); + rtw_secmicappendbyte(pmicdata, 0); + /* and then zeroes until the length is a multiple of 4 */ + while (pmicdata->nBytesInM != 0) + rtw_secmicappendbyte(pmicdata, 0); + /* The appendByte function has already computed the result. */ + secmicputuint32(dst, pmicdata->L); + secmicputuint32(dst + 4, pmicdata->R); + /* Reset to the empty message. */ secmicclear(pmicdata); -_func_exit_; } -void rtw_seccalctkipmic(u8 * key,u8 *header,u8 *data,u32 data_len,u8 *mic_code, u8 pri) +void rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len, u8 *mic_code, u8 pri) { struct mic_data micdata; - u8 priority[4]={0x0,0x0,0x0,0x0}; -_func_enter_; + u8 priority[4] = {0x0, 0x0, 0x0, 0x0}; rtw_secmicsetkey(&micdata, key); - priority[0]=pri; - + priority[0] = pri; + /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */ - if(header[1]&1){ //ToDS==1 - rtw_secmicappend(&micdata, &header[16], 6); //DA - if(header[1]&2) //From Ds==1 + if (header[1] & 1) { /* ToDS==1 */ + rtw_secmicappend(&micdata, &header[16], 6); /* DA */ + if (header[1] & 2) /* From Ds==1 */ rtw_secmicappend(&micdata, &header[24], 6); else - rtw_secmicappend(&micdata, &header[10], 6); - } - else{ //ToDS==0 - rtw_secmicappend(&micdata, &header[4], 6); //DA - if(header[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &header[10], 6); + } else { /* ToDS==0 */ + rtw_secmicappend(&micdata, &header[4], 6); /* DA */ + if (header[1] & 2) /* From Ds==1 */ rtw_secmicappend(&micdata, &header[16], 6); else rtw_secmicappend(&micdata, &header[10], 6); @@ -506,113 +463,112 @@ _func_enter_; } rtw_secmicappend(&micdata, &priority[0], 4); - + rtw_secmicappend(&micdata, data, data_len); - rtw_secgetmic(&micdata,mic_code); -_func_exit_; + rtw_secgetmic(&micdata, mic_code); } -/* macros for extraction/creation of unsigned char/unsigned short values */ +/* macros for extraction/creation of unsigned char/unsigned short values */ #define RotR1(v16) ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15)) -#define Lo8(v16) ((u8)( (v16) & 0x00FF)) +#define Lo8(v16) ((u8)((v16) & 0x00FF)) #define Hi8(v16) ((u8)(((v16) >> 8) & 0x00FF)) -#define Lo16(v32) ((u16)( (v32) & 0xFFFF)) -#define Hi16(v32) ((u16)(((v32) >>16) & 0xFFFF)) -#define Mk16(hi,lo) ((lo) ^ (((u16)(hi)) << 8)) +#define Lo16(v32) ((u16)((v32) & 0xFFFF)) +#define Hi16(v32) ((u16)(((v32) >> 16) & 0xFFFF)) +#define Mk16(hi, lo) ((lo) ^ (((u16)(hi)) << 8)) -/* select the Nth 16-bit word of the temporal key unsigned char array TK[] */ -#define TK16(N) Mk16(tk[2*(N)+1],tk[2*(N)]) +/* select the Nth 16-bit word of the temporal key unsigned char array TK[] */ +#define TK16(N) Mk16(tk[2*(N)+1], tk[2*(N)]) /* S-box lookup: 16 bits --> 16 bits */ #define _S_(v16) (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)]) /* fixed algorithm "parameters" */ #define PHASE1_LOOP_CNT 8 /* this needs to be "big enough" */ -#define TA_SIZE 6 /* 48-bit transmitter address */ -#define TK_SIZE 16 /* 128-bit temporal key */ -#define P1K_SIZE 10 /* 80-bit Phase1 key */ +#define TA_SIZE 6 /* 48-bit transmitter address */ +#define TK_SIZE 16 /* 128-bit temporal key */ +#define P1K_SIZE 10 /* 80-bit Phase1 key */ #define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */ /* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */ -static const unsigned short Sbox1[2][256]= /* Sbox for hash (can be in ROM) */ +static const unsigned short Sbox1[2][256] = /* Sbox for hash (can be in ROM) */ { { - 0xC6A5,0xF884,0xEE99,0xF68D,0xFF0D,0xD6BD,0xDEB1,0x9154, - 0x6050,0x0203,0xCEA9,0x567D,0xE719,0xB562,0x4DE6,0xEC9A, - 0x8F45,0x1F9D,0x8940,0xFA87,0xEF15,0xB2EB,0x8EC9,0xFB0B, - 0x41EC,0xB367,0x5FFD,0x45EA,0x23BF,0x53F7,0xE496,0x9B5B, - 0x75C2,0xE11C,0x3DAE,0x4C6A,0x6C5A,0x7E41,0xF502,0x834F, - 0x685C,0x51F4,0xD134,0xF908,0xE293,0xAB73,0x6253,0x2A3F, - 0x080C,0x9552,0x4665,0x9D5E,0x3028,0x37A1,0x0A0F,0x2FB5, - 0x0E09,0x2436,0x1B9B,0xDF3D,0xCD26,0x4E69,0x7FCD,0xEA9F, - 0x121B,0x1D9E,0x5874,0x342E,0x362D,0xDCB2,0xB4EE,0x5BFB, - 0xA4F6,0x764D,0xB761,0x7DCE,0x527B,0xDD3E,0x5E71,0x1397, - 0xA6F5,0xB968,0x0000,0xC12C,0x4060,0xE31F,0x79C8,0xB6ED, - 0xD4BE,0x8D46,0x67D9,0x724B,0x94DE,0x98D4,0xB0E8,0x854A, - 0xBB6B,0xC52A,0x4FE5,0xED16,0x86C5,0x9AD7,0x6655,0x1194, - 0x8ACF,0xE910,0x0406,0xFE81,0xA0F0,0x7844,0x25BA,0x4BE3, - 0xA2F3,0x5DFE,0x80C0,0x058A,0x3FAD,0x21BC,0x7048,0xF104, - 0x63DF,0x77C1,0xAF75,0x4263,0x2030,0xE51A,0xFD0E,0xBF6D, - 0x814C,0x1814,0x2635,0xC32F,0xBEE1,0x35A2,0x88CC,0x2E39, - 0x9357,0x55F2,0xFC82,0x7A47,0xC8AC,0xBAE7,0x322B,0xE695, - 0xC0A0,0x1998,0x9ED1,0xA37F,0x4466,0x547E,0x3BAB,0x0B83, - 0x8CCA,0xC729,0x6BD3,0x283C,0xA779,0xBCE2,0x161D,0xAD76, - 0xDB3B,0x6456,0x744E,0x141E,0x92DB,0x0C0A,0x486C,0xB8E4, - 0x9F5D,0xBD6E,0x43EF,0xC4A6,0x39A8,0x31A4,0xD337,0xF28B, - 0xD532,0x8B43,0x6E59,0xDAB7,0x018C,0xB164,0x9CD2,0x49E0, - 0xD8B4,0xACFA,0xF307,0xCF25,0xCAAF,0xF48E,0x47E9,0x1018, - 0x6FD5,0xF088,0x4A6F,0x5C72,0x3824,0x57F1,0x73C7,0x9751, - 0xCB23,0xA17C,0xE89C,0x3E21,0x96DD,0x61DC,0x0D86,0x0F85, - 0xE090,0x7C42,0x71C4,0xCCAA,0x90D8,0x0605,0xF701,0x1C12, - 0xC2A3,0x6A5F,0xAEF9,0x69D0,0x1791,0x9958,0x3A27,0x27B9, - 0xD938,0xEB13,0x2BB3,0x2233,0xD2BB,0xA970,0x0789,0x33A7, - 0x2DB6,0x3C22,0x1592,0xC920,0x8749,0xAAFF,0x5078,0xA57A, - 0x038F,0x59F8,0x0980,0x1A17,0x65DA,0xD731,0x84C6,0xD0B8, - 0x82C3,0x29B0,0x5A77,0x1E11,0x7BCB,0xA8FC,0x6DD6,0x2C3A, - }, - + 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154, + 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A, + 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B, + 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B, + 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F, + 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F, + 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5, + 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F, + 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB, + 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397, + 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED, + 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A, + 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194, + 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3, + 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104, + 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D, + 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39, + 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695, + 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83, + 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76, + 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4, + 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B, + 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0, + 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018, + 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751, + 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85, + 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12, + 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9, + 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7, + 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A, + 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8, + 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A, + }, - { /* second half of table is unsigned char-reversed version of first! */ - 0xA5C6,0x84F8,0x99EE,0x8DF6,0x0DFF,0xBDD6,0xB1DE,0x5491, - 0x5060,0x0302,0xA9CE,0x7D56,0x19E7,0x62B5,0xE64D,0x9AEC, - 0x458F,0x9D1F,0x4089,0x87FA,0x15EF,0xEBB2,0xC98E,0x0BFB, - 0xEC41,0x67B3,0xFD5F,0xEA45,0xBF23,0xF753,0x96E4,0x5B9B, - 0xC275,0x1CE1,0xAE3D,0x6A4C,0x5A6C,0x417E,0x02F5,0x4F83, - 0x5C68,0xF451,0x34D1,0x08F9,0x93E2,0x73AB,0x5362,0x3F2A, - 0x0C08,0x5295,0x6546,0x5E9D,0x2830,0xA137,0x0F0A,0xB52F, - 0x090E,0x3624,0x9B1B,0x3DDF,0x26CD,0x694E,0xCD7F,0x9FEA, - 0x1B12,0x9E1D,0x7458,0x2E34,0x2D36,0xB2DC,0xEEB4,0xFB5B, - 0xF6A4,0x4D76,0x61B7,0xCE7D,0x7B52,0x3EDD,0x715E,0x9713, - 0xF5A6,0x68B9,0x0000,0x2CC1,0x6040,0x1FE3,0xC879,0xEDB6, - 0xBED4,0x468D,0xD967,0x4B72,0xDE94,0xD498,0xE8B0,0x4A85, - 0x6BBB,0x2AC5,0xE54F,0x16ED,0xC586,0xD79A,0x5566,0x9411, - 0xCF8A,0x10E9,0x0604,0x81FE,0xF0A0,0x4478,0xBA25,0xE34B, - 0xF3A2,0xFE5D,0xC080,0x8A05,0xAD3F,0xBC21,0x4870,0x04F1, - 0xDF63,0xC177,0x75AF,0x6342,0x3020,0x1AE5,0x0EFD,0x6DBF, - 0x4C81,0x1418,0x3526,0x2FC3,0xE1BE,0xA235,0xCC88,0x392E, - 0x5793,0xF255,0x82FC,0x477A,0xACC8,0xE7BA,0x2B32,0x95E6, - 0xA0C0,0x9819,0xD19E,0x7FA3,0x6644,0x7E54,0xAB3B,0x830B, - 0xCA8C,0x29C7,0xD36B,0x3C28,0x79A7,0xE2BC,0x1D16,0x76AD, - 0x3BDB,0x5664,0x4E74,0x1E14,0xDB92,0x0A0C,0x6C48,0xE4B8, - 0x5D9F,0x6EBD,0xEF43,0xA6C4,0xA839,0xA431,0x37D3,0x8BF2, - 0x32D5,0x438B,0x596E,0xB7DA,0x8C01,0x64B1,0xD29C,0xE049, - 0xB4D8,0xFAAC,0x07F3,0x25CF,0xAFCA,0x8EF4,0xE947,0x1810, - 0xD56F,0x88F0,0x6F4A,0x725C,0x2438,0xF157,0xC773,0x5197, - 0x23CB,0x7CA1,0x9CE8,0x213E,0xDD96,0xDC61,0x860D,0x850F, - 0x90E0,0x427C,0xC471,0xAACC,0xD890,0x0506,0x01F7,0x121C, - 0xA3C2,0x5F6A,0xF9AE,0xD069,0x9117,0x5899,0x273A,0xB927, - 0x38D9,0x13EB,0xB32B,0x3322,0xBBD2,0x70A9,0x8907,0xA733, - 0xB62D,0x223C,0x9215,0x20C9,0x4987,0xFFAA,0x7850,0x7AA5, - 0x8F03,0xF859,0x8009,0x171A,0xDA65,0x31D7,0xC684,0xB8D0, - 0xC382,0xB029,0x775A,0x111E,0xCB7B,0xFCA8,0xD66D,0x3A2C, - } + + { /* second half of table is unsigned char-reversed version of first! */ + 0xA5C6, 0x84F8, 0x99EE, 0x8DF6, 0x0DFF, 0xBDD6, 0xB1DE, 0x5491, + 0x5060, 0x0302, 0xA9CE, 0x7D56, 0x19E7, 0x62B5, 0xE64D, 0x9AEC, + 0x458F, 0x9D1F, 0x4089, 0x87FA, 0x15EF, 0xEBB2, 0xC98E, 0x0BFB, + 0xEC41, 0x67B3, 0xFD5F, 0xEA45, 0xBF23, 0xF753, 0x96E4, 0x5B9B, + 0xC275, 0x1CE1, 0xAE3D, 0x6A4C, 0x5A6C, 0x417E, 0x02F5, 0x4F83, + 0x5C68, 0xF451, 0x34D1, 0x08F9, 0x93E2, 0x73AB, 0x5362, 0x3F2A, + 0x0C08, 0x5295, 0x6546, 0x5E9D, 0x2830, 0xA137, 0x0F0A, 0xB52F, + 0x090E, 0x3624, 0x9B1B, 0x3DDF, 0x26CD, 0x694E, 0xCD7F, 0x9FEA, + 0x1B12, 0x9E1D, 0x7458, 0x2E34, 0x2D36, 0xB2DC, 0xEEB4, 0xFB5B, + 0xF6A4, 0x4D76, 0x61B7, 0xCE7D, 0x7B52, 0x3EDD, 0x715E, 0x9713, + 0xF5A6, 0x68B9, 0x0000, 0x2CC1, 0x6040, 0x1FE3, 0xC879, 0xEDB6, + 0xBED4, 0x468D, 0xD967, 0x4B72, 0xDE94, 0xD498, 0xE8B0, 0x4A85, + 0x6BBB, 0x2AC5, 0xE54F, 0x16ED, 0xC586, 0xD79A, 0x5566, 0x9411, + 0xCF8A, 0x10E9, 0x0604, 0x81FE, 0xF0A0, 0x4478, 0xBA25, 0xE34B, + 0xF3A2, 0xFE5D, 0xC080, 0x8A05, 0xAD3F, 0xBC21, 0x4870, 0x04F1, + 0xDF63, 0xC177, 0x75AF, 0x6342, 0x3020, 0x1AE5, 0x0EFD, 0x6DBF, + 0x4C81, 0x1418, 0x3526, 0x2FC3, 0xE1BE, 0xA235, 0xCC88, 0x392E, + 0x5793, 0xF255, 0x82FC, 0x477A, 0xACC8, 0xE7BA, 0x2B32, 0x95E6, + 0xA0C0, 0x9819, 0xD19E, 0x7FA3, 0x6644, 0x7E54, 0xAB3B, 0x830B, + 0xCA8C, 0x29C7, 0xD36B, 0x3C28, 0x79A7, 0xE2BC, 0x1D16, 0x76AD, + 0x3BDB, 0x5664, 0x4E74, 0x1E14, 0xDB92, 0x0A0C, 0x6C48, 0xE4B8, + 0x5D9F, 0x6EBD, 0xEF43, 0xA6C4, 0xA839, 0xA431, 0x37D3, 0x8BF2, + 0x32D5, 0x438B, 0x596E, 0xB7DA, 0x8C01, 0x64B1, 0xD29C, 0xE049, + 0xB4D8, 0xFAAC, 0x07F3, 0x25CF, 0xAFCA, 0x8EF4, 0xE947, 0x1810, + 0xD56F, 0x88F0, 0x6F4A, 0x725C, 0x2438, 0xF157, 0xC773, 0x5197, + 0x23CB, 0x7CA1, 0x9CE8, 0x213E, 0xDD96, 0xDC61, 0x860D, 0x850F, + 0x90E0, 0x427C, 0xC471, 0xAACC, 0xD890, 0x0506, 0x01F7, 0x121C, + 0xA3C2, 0x5F6A, 0xF9AE, 0xD069, 0x9117, 0x5899, 0x273A, 0xB927, + 0x38D9, 0x13EB, 0xB32B, 0x3322, 0xBBD2, 0x70A9, 0x8907, 0xA733, + 0xB62D, 0x223C, 0x9215, 0x20C9, 0x4987, 0xFFAA, 0x7850, 0x7AA5, + 0x8F03, 0xF859, 0x8009, 0x171A, 0xDA65, 0x31D7, 0xC684, 0xB8D0, + 0xC382, 0xB029, 0x775A, 0x111E, 0xCB7B, 0xFCA8, 0xD66D, 0x3A2C, + } }; - - /* + +/* ********************************************************************** * Routine: Phase 1 -- generate P1K, given TA, TK, IV32 * @@ -629,31 +585,29 @@ static const unsigned short Sbox1[2][256]= /* Sbox for hash (can be in ROM * ********************************************************************** */ -static void phase1(u16 *p1k,const u8 *tk,const u8 *ta,u32 iv32) +static void phase1(u16 *p1k, const u8 *tk, const u8 *ta, u32 iv32) { sint i; -_func_enter_; - /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */ + /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */ p1k[0] = Lo16(iv32); p1k[1] = Hi16(iv32); - p1k[2] = Mk16(ta[1],ta[0]); /* use TA[] as little-endian */ - p1k[3] = Mk16(ta[3],ta[2]); - p1k[4] = Mk16(ta[5],ta[4]); + p1k[2] = Mk16(ta[1], ta[0]); /* use TA[] as little-endian */ + p1k[3] = Mk16(ta[3], ta[2]); + p1k[4] = Mk16(ta[5], ta[4]); /* Now compute an unbalanced Feistel cipher with 80-bit block */ /* size on the 80-bit block P1K[], using the 128-bit key TK[] */ - for (i=0; i < PHASE1_LOOP_CNT ;i++) - { /* Each add operation here is mod 2**16 */ - p1k[0] += _S_(p1k[4] ^ TK16((i&1)+0)); - p1k[1] += _S_(p1k[0] ^ TK16((i&1)+2)); - p1k[2] += _S_(p1k[1] ^ TK16((i&1)+4)); - p1k[3] += _S_(p1k[2] ^ TK16((i&1)+6)); - p1k[4] += _S_(p1k[3] ^ TK16((i&1)+0)); - p1k[4] += (unsigned short)i; /* avoid "slide attacks" */ - } -_func_exit_; + for (i = 0; i < PHASE1_LOOP_CNT ; i++) { + /* Each add operation here is mod 2**16 */ + p1k[0] += _S_(p1k[4] ^ TK16((i & 1) + 0)); + p1k[1] += _S_(p1k[0] ^ TK16((i & 1) + 2)); + p1k[2] += _S_(p1k[1] ^ TK16((i & 1) + 4)); + p1k[3] += _S_(p1k[2] ^ TK16((i & 1) + 6)); + p1k[4] += _S_(p1k[3] ^ TK16((i & 1) + 0)); + p1k[4] += (unsigned short)i; /* avoid "slide attacks" */ + } } - + /* ********************************************************************** @@ -678,55 +632,54 @@ _func_exit_; * ********************************************************************** */ -static void phase2(u8 *rc4key,const u8 *tk,const u16 *p1k,u16 iv16) +static void phase2(u8 *rc4key, const u8 *tk, const u16 *p1k, u16 iv16) { sint i; - u16 PPK[6]; /* temporary key for mixing */ -_func_enter_; - /* Note: all adds in the PPK[] equations below are mod 2**16 */ - for (i=0;i<5;i++) PPK[i]=p1k[i]; /* first, copy P1K to PPK */ - PPK[5] = p1k[4] +iv16; /* next, add in IV16 */ + u16 PPK[6]; /* temporary key for mixing */ + /* Note: all adds in the PPK[] equations below are mod 2**16 */ + for (i = 0; i < 5; i++) + PPK[i] = p1k[i]; /* first, copy P1K to PPK */ + PPK[5] = p1k[4] + iv16; /* next, add in IV16 */ - /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */ + /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */ PPK[0] += _S_(PPK[5] ^ TK16(0)); /* Mix key in each "round" */ PPK[1] += _S_(PPK[0] ^ TK16(1)); PPK[2] += _S_(PPK[1] ^ TK16(2)); PPK[3] += _S_(PPK[2] ^ TK16(3)); PPK[4] += _S_(PPK[3] ^ TK16(4)); - PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */ + PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */ /* Final sweep: bijective, "linear". Rotates kill LSB correlations */ PPK[0] += RotR1(PPK[5] ^ TK16(6)); - PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */ + PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */ PPK[2] += RotR1(PPK[1]); PPK[3] += RotR1(PPK[2]); PPK[4] += RotR1(PPK[3]); PPK[5] += RotR1(PPK[4]); /* Note: At this point, for a given key TK[0..15], the 96-bit output */ - /* value PPK[0..5] is guaranteed to be unique, as a function */ + /* value PPK[0..5] is guaranteed to be unique, as a function */ /* of the 96-bit "input" value {TA,IV32,IV16}. That is, P1K */ - /* is now a keyed permutation of {TA,IV32,IV16}. */ + /* is now a keyed permutation of {TA,IV32,IV16}. */ /* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key */ - rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV */ - rc4key[1] =(Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys */ + rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV */ + rc4key[1] = (Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys */ rc4key[2] = Lo8(iv16); rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1); - - /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */ - for (i=0;i<6;i++) - { - rc4key[4+2*i] = Lo8(PPK[i]); - rc4key[5+2*i] = Hi8(PPK[i]); + + /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */ + for (i = 0; i < 6; i++) { + rc4key[4 + 2 * i] = Lo8(PPK[i]); + rc4key[5 + 2 * i] = Hi8(PPK[i]); } -_func_exit_; } -//The hlen isn't include the IV +/* The hlen isn't include the IV */ u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe) -{ // exclude ICV +{ + /* exclude ICV */ u16 pnl; u32 pnh; u8 rc4key[16]; @@ -734,162 +687,151 @@ u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe) u8 crc[4]; u8 hw_hdr_offset = 0; struct arc4context mycontext; - sint curfragnum,length; + sint curfragnum, length; u32 prwskeylen; - u8 *pframe, *payload,*iv,*prwskey; + u8 *pframe, *payload, *iv, *prwskey; union pn48 dot11txpn; - //struct sta_info *stainfo; - struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; - u32 res=_SUCCESS; -_func_enter_; + /* struct sta_info *stainfo; */ + struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + u32 res = _SUCCESS; - if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL) return _FAIL; #ifdef CONFIG_USB_TX_AGGREGATION hw_hdr_offset = TXDESC_SIZE + - (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); + (((struct xmit_frame *)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); +#else +#ifdef CONFIG_TX_EARLY_MODE + hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE; #else - #ifdef CONFIG_TX_EARLY_MODE - hw_hdr_offset = TXDESC_OFFSET+EARLY_MODE_INFO_SIZE; - #else hw_hdr_offset = TXDESC_OFFSET; - #endif +#endif #endif - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + hw_hdr_offset; - //4 start to encrypt each fragment - if(pattrib->encrypt==_TKIP_){ + pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset; + /* 4 start to encrypt each fragment */ + if (pattrib->encrypt == _TKIP_) { -/* - if(pattrib->psta) + /* + if(pattrib->psta) + { + stainfo = pattrib->psta; + } + else + { + RTW_INFO("%s, call rtw_get_stainfo()\n", __func__); + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); + } + */ + /* if (stainfo!=NULL) */ { - stainfo = pattrib->psta; - } - else - { - DBG_871X("%s, call rtw_get_stainfo()\n", __func__); - stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); - } -*/ - //if (stainfo!=NULL) - { -/* - if(!(stainfo->state &_FW_LINKED)) - { - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state); - return _FAIL; - } -*/ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo!=NULL!!!\n")); + /* + if(!(stainfo->state &_FW_LINKED)) + { + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state); + return _FAIL; + } + */ - if(IS_MCAST(pattrib->ra)) - { - prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; - } - else - { - //prwskey=&stainfo->dot118021x_UncstKey.skey[0]; - prwskey=pattrib->dot118021x_UncstKey.skey; + if (IS_MCAST(pattrib->ra)) + prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + else { + /* prwskey=&stainfo->dot118021x_UncstKey.skey[0]; */ + prwskey = pattrib->dot118021x_UncstKey.skey; } - prwskeylen=16; + prwskeylen = 16; + + for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { + iv = pframe + pattrib->hdrlen; + payload = pframe + pattrib->iv_len + pattrib->hdrlen; - for(curfragnum=0;curfragnumnr_frags;curfragnum++){ - iv=pframe+pattrib->hdrlen; - payload=pframe+pattrib->iv_len+pattrib->hdrlen; - GET_TKIP_PN(iv, dot11txpn); - pnl=(u16)(dot11txpn.val); - pnh=(u32)(dot11txpn.val>>16); + pnl = (u16)(dot11txpn.val); + pnh = (u32)(dot11txpn.val >> 16); - phase1((u16 *)&ttkey[0],prwskey,&pattrib->ta[0],pnh); + phase1((u16 *)&ttkey[0], prwskey, &pattrib->ta[0], pnh); - phase2(&rc4key[0],prwskey,(u16 *)&ttkey[0],pnl); + phase2(&rc4key[0], prwskey, (u16 *)&ttkey[0], pnl); - if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment - length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; - RT_TRACE(_module_rtl871x_security_c_,_drv_info_,("pattrib->iv_len =%x, pattrib->icv_len =%x\n", pattrib->iv_len,pattrib->icv_len)); - *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/ + if ((curfragnum + 1) == pattrib->nr_frags) { /* 4 the last fragment */ + length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; + *((u32 *)crc) = cpu_to_le32(getcrc32(payload, length)); /* modified by Amy*/ - arcfour_init(&mycontext, rc4key,16); + arcfour_init(&mycontext, rc4key, 16); arcfour_encrypt(&mycontext, payload, payload, length); - arcfour_encrypt(&mycontext, payload+length, crc, 4); + arcfour_encrypt(&mycontext, payload + length, crc, 4); - } - else{ - length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; - *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/ - arcfour_init(&mycontext,rc4key,16); + } else { + length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len ; + *((u32 *)crc) = cpu_to_le32(getcrc32(payload, length)); /* modified by Amy*/ + arcfour_init(&mycontext, rc4key, 16); arcfour_encrypt(&mycontext, payload, payload, length); - arcfour_encrypt(&mycontext, payload+length, crc, 4); - - pframe+=pxmitpriv->frag_len; - pframe=(u8 *)RND4((SIZE_PTR)(pframe)); + arcfour_encrypt(&mycontext, payload + length, crc, 4); + + pframe += pxmitpriv->frag_len; + pframe = (u8 *)RND4((SIZE_PTR)(pframe)); } } - TKIP_SW_ENC_CNT_INC(psecuritypriv,pattrib->ra); + TKIP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra); } -/* - else{ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo==NULL!!!\n")); - DBG_871X("%s, psta==NUL\n", __func__); - res=_FAIL; - } -*/ - + /* + else{ + RTW_INFO("%s, psta==NUL\n", __func__); + res=_FAIL; + } + */ + } -_func_exit_; return res; - + } -//The hlen isn't include the IV +/* The hlen isn't include the IV */ u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe) -{ // exclude ICV +{ + /* exclude ICV */ u16 pnl; u32 pnh; u8 rc4key[16]; u8 ttkey[16]; u8 crc[4]; struct arc4context mycontext; - sint length; + sint length; u32 prwskeylen; - u8 *pframe, *payload,*iv,*prwskey; + u8 *pframe, *payload, *iv, *prwskey; union pn48 dot11txpn; struct sta_info *stainfo; - struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; -// struct recv_priv *precvpriv=&padapter->recvpriv; - u32 res=_SUCCESS; + struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib; + struct security_priv *psecuritypriv = &padapter->securitypriv; + /* struct recv_priv *precvpriv=&padapter->recvpriv; */ + u32 res = _SUCCESS; -_func_enter_; - pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - - //4 start to decrypt recvframe - if(prxattrib->encrypt==_TKIP_){ + pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data; - stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] ); - if (stainfo!=NULL){ + /* 4 start to decrypt recvframe */ + if (prxattrib->encrypt == _TKIP_) { - if(IS_MCAST(prxattrib->ra)) - { + stainfo = rtw_get_stainfo(&padapter->stapriv , &prxattrib->ta[0]); + if (stainfo != NULL) { + + if (IS_MCAST(prxattrib->ra)) { static u32 start = 0; static u32 no_gkey_bc_cnt = 0; static u32 no_gkey_mc_cnt = 0; - if(psecuritypriv->binstallGrpkey==_FALSE) - { - res=_FAIL; + if (psecuritypriv->binstallGrpkey == _FALSE) { + res = _FAIL; if (start == 0) start = rtw_get_current_time(); @@ -901,7 +843,7 @@ _func_enter_; if (rtw_get_passing_time_ms(start) > 1000) { if (no_gkey_bc_cnt || no_gkey_mc_cnt) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", + RTW_PRINT(FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt); } start = rtw_get_current_time(); @@ -912,66 +854,58 @@ _func_enter_; } if (no_gkey_bc_cnt || no_gkey_mc_cnt) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", + RTW_PRINT(FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt); } start = 0; no_gkey_bc_cnt = 0; no_gkey_mc_cnt = 0; - //DBG_871X("rx bc/mc packets, to perform sw rtw_tkip_decrypt\n"); - //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + /* RTW_INFO("rx bc/mc packets, to perform sw rtw_tkip_decrypt\n"); */ + /* prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; */ prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; - prwskeylen=16; + prwskeylen = 16; + } else { + prwskey = &stainfo->dot118021x_UncstKey.skey[0]; + prwskeylen = 16; } - else - { - prwskey=&stainfo->dot118021x_UncstKey.skey[0]; - prwskeylen=16; - } - - iv=pframe+prxattrib->hdrlen; - payload=pframe+prxattrib->iv_len+prxattrib->hdrlen; - length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; - + + iv = pframe + prxattrib->hdrlen; + payload = pframe + prxattrib->iv_len + prxattrib->hdrlen; + length = ((union recv_frame *)precvframe)->u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len; + GET_TKIP_PN(iv, dot11txpn); - pnl=(u16)(dot11txpn.val); - pnh=(u32)(dot11txpn.val>>16); + pnl = (u16)(dot11txpn.val); + pnh = (u32)(dot11txpn.val >> 16); - phase1((u16 *)&ttkey[0],prwskey,&prxattrib->ta[0],pnh); - phase2(&rc4key[0],prwskey,(unsigned short *)&ttkey[0],pnl); + phase1((u16 *)&ttkey[0], prwskey, &prxattrib->ta[0], pnh); + phase2(&rc4key[0], prwskey, (unsigned short *)&ttkey[0], pnl); - //4 decrypt payload include icv - - arcfour_init(&mycontext, rc4key,16); + /* 4 decrypt payload include icv */ + + arcfour_init(&mycontext, rc4key, 16); arcfour_encrypt(&mycontext, payload, payload, length); - *((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4)); + *((u32 *)crc) = le32_to_cpu(getcrc32(payload, length - 4)); - if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4]) - { - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n", - crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4])); - res=_FAIL; + if (crc[3] != payload[length - 1] || crc[2] != payload[length - 2] || crc[1] != payload[length - 3] || crc[0] != payload[length - 4]) { + res = _FAIL; } TKIP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra); + } else { + res = _FAIL; } - else{ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo==NULL!!!\n")); - res=_FAIL; - } - + } -_func_exit_; exit: return res; - + } -//3 =====AES related===== +/* 3 =====AES related===== */ @@ -980,41 +914,40 @@ exit: /******** SBOX Table *********/ /*****************************/ - static u8 sbox_table[256] = - { - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, - 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, - 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, - 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, - 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, - 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, - 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, - 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, - 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, - 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, - 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, - 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 - }; +static u8 sbox_table[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, + 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, + 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, + 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, + 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, + 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, + 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, + 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, + 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, + 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, + 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; /*****************************/ /**** Function Prototypes ****/ @@ -1022,31 +955,31 @@ exit: static void bitwise_xor(u8 *ina, u8 *inb, u8 *out); static void construct_mic_iv( - u8 *mic_header1, - sint qc_exists, - sint a4_exists, - u8 *mpdu, - uint payload_length, - u8 * pn_vector, - uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use + u8 *mic_header1, + sint qc_exists, + sint a4_exists, + u8 *mpdu, + uint payload_length, + u8 *pn_vector, + uint frtype);/* add for CONFIG_IEEE80211W, none 11w also can use */ static void construct_mic_header1( - u8 *mic_header1, - sint header_length, - u8 *mpdu, - uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use + u8 *mic_header1, + sint header_length, + u8 *mpdu, + uint frtype);/* add for CONFIG_IEEE80211W, none 11w also can use */ static void construct_mic_header2( - u8 *mic_header2, - u8 *mpdu, - sint a4_exists, - sint qc_exists); + u8 *mic_header2, + u8 *mpdu, + sint a4_exists, + sint qc_exists); static void construct_ctr_preload( - u8 *ctr_preload, - sint a4_exists, - sint qc_exists, - u8 *mpdu, - u8 *pn_vector, - sint c, - uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use + u8 *ctr_preload, + sint a4_exists, + sint qc_exists, + u8 *mpdu, + u8 *pn_vector, + sint c, + uint frtype);/* add for CONFIG_IEEE80211W, none 11w also can use */ static void xor_128(u8 *a, u8 *b, u8 *out); static void xor_32(u8 *a, u8 *b, u8 *out); static u8 sbox(u8 a); @@ -1054,417 +987,379 @@ static void next_key(u8 *key, sint round); static void byte_sub(u8 *in, u8 *out); static void shift_row(u8 *in, u8 *out); static void mix_column(u8 *in, u8 *out); -#ifndef PLATFORM_FREEBSD -static void add_round_key( u8 *shiftrow_in, - u8 *mcol_in, - u8 *block_in, - sint round, - u8 *out); -#endif //PLATFORM_FREEBSD +#ifndef PLATFORM_FREEBSD +static void add_round_key(u8 *shiftrow_in, + u8 *mcol_in, + u8 *block_in, + sint round, + u8 *out); +#endif /* PLATFORM_FREEBSD */ static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext); /****************************************/ -/* aes128k128d() */ -/* Performs a 128 bit AES encrypt with */ -/* 128 bit data. */ +/* aes128k128d() */ +/* Performs a 128 bit AES encrypt with */ +/* 128 bit data. */ /****************************************/ static void xor_128(u8 *a, u8 *b, u8 *out) { - sint i; -_func_enter_; - for (i=0;i<16; i++) - { - out[i] = a[i] ^ b[i]; - } -_func_exit_; + sint i; + for (i = 0; i < 16; i++) + out[i] = a[i] ^ b[i]; } static void xor_32(u8 *a, u8 *b, u8 *out) { - sint i; -_func_enter_; - for (i=0;i<4; i++) - { - out[i] = a[i] ^ b[i]; - } -_func_exit_; + sint i; + for (i = 0; i < 4; i++) + out[i] = a[i] ^ b[i]; } static u8 sbox(u8 a) { - return sbox_table[(sint)a]; + return sbox_table[(sint)a]; } static void next_key(u8 *key, sint round) { - u8 rcon; - u8 sbox_key[4]; - u8 rcon_table[12] = - { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x36, 0x36 - }; -_func_enter_; - sbox_key[0] = sbox(key[13]); - sbox_key[1] = sbox(key[14]); - sbox_key[2] = sbox(key[15]); - sbox_key[3] = sbox(key[12]); + u8 rcon; + u8 sbox_key[4]; + u8 rcon_table[12] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, + 0x1b, 0x36, 0x36, 0x36 + }; + sbox_key[0] = sbox(key[13]); + sbox_key[1] = sbox(key[14]); + sbox_key[2] = sbox(key[15]); + sbox_key[3] = sbox(key[12]); - rcon = rcon_table[round]; + rcon = rcon_table[round]; - xor_32(&key[0], sbox_key, &key[0]); - key[0] = key[0] ^ rcon; + xor_32(&key[0], sbox_key, &key[0]); + key[0] = key[0] ^ rcon; - xor_32(&key[4], &key[0], &key[4]); - xor_32(&key[8], &key[4], &key[8]); - xor_32(&key[12], &key[8], &key[12]); -_func_exit_; + xor_32(&key[4], &key[0], &key[4]); + xor_32(&key[8], &key[4], &key[8]); + xor_32(&key[12], &key[8], &key[12]); } static void byte_sub(u8 *in, u8 *out) { - sint i; -_func_enter_; - for (i=0; i< 16; i++) - { - out[i] = sbox(in[i]); - } -_func_exit_; + sint i; + for (i = 0; i < 16; i++) + out[i] = sbox(in[i]); } static void shift_row(u8 *in, u8 *out) { -_func_enter_; - out[0] = in[0]; - out[1] = in[5]; - out[2] = in[10]; - out[3] = in[15]; - out[4] = in[4]; - out[5] = in[9]; - out[6] = in[14]; - out[7] = in[3]; - out[8] = in[8]; - out[9] = in[13]; - out[10] = in[2]; - out[11] = in[7]; - out[12] = in[12]; - out[13] = in[1]; - out[14] = in[6]; - out[15] = in[11]; -_func_exit_; + out[0] = in[0]; + out[1] = in[5]; + out[2] = in[10]; + out[3] = in[15]; + out[4] = in[4]; + out[5] = in[9]; + out[6] = in[14]; + out[7] = in[3]; + out[8] = in[8]; + out[9] = in[13]; + out[10] = in[2]; + out[11] = in[7]; + out[12] = in[12]; + out[13] = in[1]; + out[14] = in[6]; + out[15] = in[11]; } static void mix_column(u8 *in, u8 *out) { - sint i; - u8 add1b[4]; - u8 add1bf7[4]; - u8 rotl[4]; - u8 swap_halfs[4]; - u8 andf7[4]; - u8 rotr[4]; - u8 temp[4]; - u8 tempb[4]; -_func_enter_; - for (i=0 ; i<4; i++) - { - if ((in[i] & 0x80)== 0x80) - add1b[i] = 0x1b; - else - add1b[i] = 0x00; - } + sint i; + u8 add1b[4]; + u8 add1bf7[4]; + u8 rotl[4]; + u8 swap_halfs[4]; + u8 andf7[4]; + u8 rotr[4]; + u8 temp[4]; + u8 tempb[4]; + for (i = 0 ; i < 4; i++) { + if ((in[i] & 0x80) == 0x80) + add1b[i] = 0x1b; + else + add1b[i] = 0x00; + } - swap_halfs[0] = in[2]; /* Swap halfs */ - swap_halfs[1] = in[3]; - swap_halfs[2] = in[0]; - swap_halfs[3] = in[1]; + swap_halfs[0] = in[2]; /* Swap halfs */ + swap_halfs[1] = in[3]; + swap_halfs[2] = in[0]; + swap_halfs[3] = in[1]; - rotl[0] = in[3]; /* Rotate left 8 bits */ - rotl[1] = in[0]; - rotl[2] = in[1]; - rotl[3] = in[2]; + rotl[0] = in[3]; /* Rotate left 8 bits */ + rotl[1] = in[0]; + rotl[2] = in[1]; + rotl[3] = in[2]; - andf7[0] = in[0] & 0x7f; - andf7[1] = in[1] & 0x7f; - andf7[2] = in[2] & 0x7f; - andf7[3] = in[3] & 0x7f; + andf7[0] = in[0] & 0x7f; + andf7[1] = in[1] & 0x7f; + andf7[2] = in[2] & 0x7f; + andf7[3] = in[3] & 0x7f; - for (i = 3; i>0; i--) /* logical shift left 1 bit */ - { - andf7[i] = andf7[i] << 1; - if ((andf7[i-1] & 0x80) == 0x80) - { - andf7[i] = (andf7[i] | 0x01); - } - } - andf7[0] = andf7[0] << 1; - andf7[0] = andf7[0] & 0xfe; + for (i = 3; i > 0; i--) { /* logical shift left 1 bit */ + andf7[i] = andf7[i] << 1; + if ((andf7[i - 1] & 0x80) == 0x80) + andf7[i] = (andf7[i] | 0x01); + } + andf7[0] = andf7[0] << 1; + andf7[0] = andf7[0] & 0xfe; - xor_32(add1b, andf7, add1bf7); + xor_32(add1b, andf7, add1bf7); - xor_32(in, add1bf7, rotr); + xor_32(in, add1bf7, rotr); - temp[0] = rotr[0]; /* Rotate right 8 bits */ - rotr[0] = rotr[1]; - rotr[1] = rotr[2]; - rotr[2] = rotr[3]; - rotr[3] = temp[0]; + temp[0] = rotr[0]; /* Rotate right 8 bits */ + rotr[0] = rotr[1]; + rotr[1] = rotr[2]; + rotr[2] = rotr[3]; + rotr[3] = temp[0]; - xor_32(add1bf7, rotr, temp); - xor_32(swap_halfs, rotl,tempb); - xor_32(temp, tempb, out); -_func_exit_; + xor_32(add1bf7, rotr, temp); + xor_32(swap_halfs, rotl, tempb); + xor_32(temp, tempb, out); } static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext) { - sint round; - sint i; - u8 intermediatea[16]; - u8 intermediateb[16]; - u8 round_key[16]; -_func_enter_; - for(i=0; i<16; i++) round_key[i] = key[i]; + sint round; + sint i; + u8 intermediatea[16]; + u8 intermediateb[16]; + u8 round_key[16]; + for (i = 0; i < 16; i++) + round_key[i] = key[i]; - for (round = 0; round < 11; round++) - { - if (round == 0) - { - xor_128(round_key, data, ciphertext); - next_key(round_key, round); - } - else if (round == 10) - { - byte_sub(ciphertext, intermediatea); - shift_row(intermediatea, intermediateb); - xor_128(intermediateb, round_key, ciphertext); - } - else /* 1 - 9 */ - { - byte_sub(ciphertext, intermediatea); - shift_row(intermediatea, intermediateb); - mix_column(&intermediateb[0], &intermediatea[0]); - mix_column(&intermediateb[4], &intermediatea[4]); - mix_column(&intermediateb[8], &intermediatea[8]); - mix_column(&intermediateb[12], &intermediatea[12]); - xor_128(intermediatea, round_key, ciphertext); - next_key(round_key, round); - } - } -_func_exit_; + for (round = 0; round < 11; round++) { + if (round == 0) { + xor_128(round_key, data, ciphertext); + next_key(round_key, round); + } else if (round == 10) { + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + xor_128(intermediateb, round_key, ciphertext); + } else { /* 1 - 9 */ + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + mix_column(&intermediateb[0], &intermediatea[0]); + mix_column(&intermediateb[4], &intermediatea[4]); + mix_column(&intermediateb[8], &intermediatea[8]); + mix_column(&intermediateb[12], &intermediatea[12]); + xor_128(intermediatea, round_key, ciphertext); + next_key(round_key, round); + } + } } /************************************************/ -/* construct_mic_iv() */ -/* Builds the MIC IV from header fields and PN */ -/* Baron think the function is construct CCM */ -/* nonce */ +/* construct_mic_iv() */ +/* Builds the MIC IV from header fields and PN */ +/* Baron think the function is construct CCM */ +/* nonce */ /************************************************/ static void construct_mic_iv( - u8 *mic_iv, - sint qc_exists, - sint a4_exists, - u8 *mpdu, - uint payload_length, - u8 *pn_vector, - uint frtype// add for CONFIG_IEEE80211W, none 11w also can use - ) + u8 *mic_iv, + sint qc_exists, + sint a4_exists, + u8 *mpdu, + uint payload_length, + u8 *pn_vector, + uint frtype/* add for CONFIG_IEEE80211W, none 11w also can use */ +) { - sint i; -_func_enter_; - mic_iv[0] = 0x59; - if (qc_exists && a4_exists) mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */ - if (qc_exists && !a4_exists) mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */ - if (!qc_exists) mic_iv[1] = 0x00; + sint i; + mic_iv[0] = 0x59; + if (qc_exists && a4_exists) + mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */ + if (qc_exists && !a4_exists) + mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */ + if (!qc_exists) + mic_iv[1] = 0x00; #ifdef CONFIG_IEEE80211W - //802.11w management frame should set management bit(4) - if(frtype == WIFI_MGT_TYPE) + /* 802.11w management frame should set management bit(4) */ + if (frtype == WIFI_MGT_TYPE) mic_iv[1] |= BIT(4); -#endif //CONFIG_IEEE80211W - for (i = 2; i < 8; i++) - mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */ - #ifdef CONSISTENT_PN_ORDER - for (i = 8; i < 14; i++) - mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */ - #else - for (i = 8; i < 14; i++) - mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */ - #endif - mic_iv[14] = (unsigned char) (payload_length / 256); - mic_iv[15] = (unsigned char) (payload_length % 256); -_func_exit_; +#endif /* CONFIG_IEEE80211W */ + for (i = 2; i < 8; i++) + mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */ +#ifdef CONSISTENT_PN_ORDER + for (i = 8; i < 14; i++) + mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */ +#else + for (i = 8; i < 14; i++) + mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */ +#endif + mic_iv[14] = (unsigned char)(payload_length / 256); + mic_iv[15] = (unsigned char)(payload_length % 256); } /************************************************/ -/* construct_mic_header1() */ -/* Builds the first MIC header block from */ -/* header fields. */ -/* Build AAD SC,A1,A2 */ +/* construct_mic_header1() */ +/* Builds the first MIC header block from */ +/* header fields. */ +/* Build AAD SC,A1,A2 */ /************************************************/ static void construct_mic_header1( - u8 *mic_header1, - sint header_length, - u8 *mpdu, - uint frtype// add for CONFIG_IEEE80211W, none 11w also can use - ) + u8 *mic_header1, + sint header_length, + u8 *mpdu, + uint frtype/* add for CONFIG_IEEE80211W, none 11w also can use */ +) { -_func_enter_; - mic_header1[0] = (u8)((header_length - 2) / 256); - mic_header1[1] = (u8)((header_length - 2) % 256); + mic_header1[0] = (u8)((header_length - 2) / 256); + mic_header1[1] = (u8)((header_length - 2) % 256); #ifdef CONFIG_IEEE80211W - //802.11w management frame don't AND subtype bits 4,5,6 of frame control field - if(frtype == WIFI_MGT_TYPE) + /* 802.11w management frame don't AND subtype bits 4,5,6 of frame control field */ + if (frtype == WIFI_MGT_TYPE) mic_header1[2] = mpdu[0]; else -#endif //CONFIG_IEEE80211W +#endif /* CONFIG_IEEE80211W */ mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */ - - mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */ - mic_header1[4] = mpdu[4]; /* A1 */ - mic_header1[5] = mpdu[5]; - mic_header1[6] = mpdu[6]; - mic_header1[7] = mpdu[7]; - mic_header1[8] = mpdu[8]; - mic_header1[9] = mpdu[9]; - mic_header1[10] = mpdu[10]; /* A2 */ - mic_header1[11] = mpdu[11]; - mic_header1[12] = mpdu[12]; - mic_header1[13] = mpdu[13]; - mic_header1[14] = mpdu[14]; - mic_header1[15] = mpdu[15]; -_func_exit_; + + mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */ + mic_header1[4] = mpdu[4]; /* A1 */ + mic_header1[5] = mpdu[5]; + mic_header1[6] = mpdu[6]; + mic_header1[7] = mpdu[7]; + mic_header1[8] = mpdu[8]; + mic_header1[9] = mpdu[9]; + mic_header1[10] = mpdu[10]; /* A2 */ + mic_header1[11] = mpdu[11]; + mic_header1[12] = mpdu[12]; + mic_header1[13] = mpdu[13]; + mic_header1[14] = mpdu[14]; + mic_header1[15] = mpdu[15]; } /************************************************/ -/* construct_mic_header2() */ -/* Builds the last MIC header block from */ -/* header fields. */ +/* construct_mic_header2() */ +/* Builds the last MIC header block from */ +/* header fields. */ /************************************************/ static void construct_mic_header2( - u8 *mic_header2, - u8 *mpdu, - sint a4_exists, - sint qc_exists - ) + u8 *mic_header2, + u8 *mpdu, + sint a4_exists, + sint qc_exists +) { - sint i; -_func_enter_; - for (i = 0; i<16; i++) mic_header2[i]=0x00; + sint i; + for (i = 0; i < 16; i++) + mic_header2[i] = 0x00; - mic_header2[0] = mpdu[16]; /* A3 */ - mic_header2[1] = mpdu[17]; - mic_header2[2] = mpdu[18]; - mic_header2[3] = mpdu[19]; - mic_header2[4] = mpdu[20]; - mic_header2[5] = mpdu[21]; + mic_header2[0] = mpdu[16]; /* A3 */ + mic_header2[1] = mpdu[17]; + mic_header2[2] = mpdu[18]; + mic_header2[3] = mpdu[19]; + mic_header2[4] = mpdu[20]; + mic_header2[5] = mpdu[21]; - //mic_header2[6] = mpdu[22] & 0xf0; /* SC */ - mic_header2[6] = 0x00; - mic_header2[7] = 0x00; /* mpdu[23]; */ + /* mic_header2[6] = mpdu[22] & 0xf0; SC */ + mic_header2[6] = 0x00; + mic_header2[7] = 0x00; /* mpdu[23]; */ - if (!qc_exists && a4_exists) - { - for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ + if (!qc_exists && a4_exists) { + for (i = 0; i < 6; i++) + mic_header2[8 + i] = mpdu[24 + i]; /* A4 */ - } + } - if (qc_exists && !a4_exists) - { - mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */ - mic_header2[9] = mpdu[25] & 0x00; - } + if (qc_exists && !a4_exists) { + mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */ + mic_header2[9] = mpdu[25] & 0x00; + } - if (qc_exists && a4_exists) - { - for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ + if (qc_exists && a4_exists) { + for (i = 0; i < 6; i++) + mic_header2[8 + i] = mpdu[24 + i]; /* A4 */ - mic_header2[14] = mpdu[30] & 0x0f; - mic_header2[15] = mpdu[31] & 0x00; - } + mic_header2[14] = mpdu[30] & 0x0f; + mic_header2[15] = mpdu[31] & 0x00; + } -_func_exit_; } /************************************************/ -/* construct_mic_header2() */ -/* Builds the last MIC header block from */ -/* header fields. */ -/* Baron think the function is construct CCM */ -/* nonce */ +/* construct_mic_header2() */ +/* Builds the last MIC header block from */ +/* header fields. */ +/* Baron think the function is construct CCM */ +/* nonce */ /************************************************/ static void construct_ctr_preload( - u8 *ctr_preload, - sint a4_exists, - sint qc_exists, - u8 *mpdu, - u8 *pn_vector, - sint c, - uint frtype // add for CONFIG_IEEE80211W, none 11w also can use - ) + u8 *ctr_preload, + sint a4_exists, + sint qc_exists, + u8 *mpdu, + u8 *pn_vector, + sint c, + uint frtype /* add for CONFIG_IEEE80211W, none 11w also can use */ +) { - sint i = 0; -_func_enter_; - for (i=0; i<16; i++) ctr_preload[i] = 0x00; - i = 0; - - ctr_preload[0] = 0x01; /* flag */ - if (qc_exists && a4_exists) + sint i = 0; + for (i = 0; i < 16; i++) + ctr_preload[i] = 0x00; + i = 0; + + ctr_preload[0] = 0x01; /* flag */ + if (qc_exists && a4_exists) ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */ - if (qc_exists && !a4_exists) + if (qc_exists && !a4_exists) ctr_preload[1] = mpdu[24] & 0x0f; #ifdef CONFIG_IEEE80211W - //802.11w management frame should set management bit(4) - if(frtype == WIFI_MGT_TYPE) + /* 802.11w management frame should set management bit(4) */ + if (frtype == WIFI_MGT_TYPE) ctr_preload[1] |= BIT(4); -#endif //CONFIG_IEEE80211W - for (i = 2; i < 8; i++) - ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */ - #ifdef CONSISTENT_PN_ORDER - for (i = 8; i < 14; i++) - ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */ - #else - for (i = 8; i < 14; i++) - ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */ - #endif - ctr_preload[14] = (unsigned char) (c / 256); /* Ctr */ - ctr_preload[15] = (unsigned char) (c % 256); -_func_exit_; +#endif /* CONFIG_IEEE80211W */ + for (i = 2; i < 8; i++) + ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */ +#ifdef CONSISTENT_PN_ORDER + for (i = 8; i < 14; i++) + ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */ +#else + for (i = 8; i < 14; i++) + ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */ +#endif + ctr_preload[14] = (unsigned char)(c / 256); /* Ctr */ + ctr_preload[15] = (unsigned char)(c % 256); } /************************************/ -/* bitwise_xor() */ -/* A 128 bit, bitwise exclusive or */ +/* bitwise_xor() */ +/* A 128 bit, bitwise exclusive or */ /************************************/ static void bitwise_xor(u8 *ina, u8 *inb, u8 *out) { - sint i; -_func_enter_; - for (i=0; i<16; i++) - { - out[i] = ina[i] ^ inb[i]; - } -_func_exit_; + sint i; + for (i = 0; i < 16; i++) + out[i] = ina[i] ^ inb[i]; } static sint aes_cipher(u8 *key, uint hdrlen, - u8 *pframe, uint plen) + u8 *pframe, uint plen) { -// /*static*/ unsigned char message[MAX_MSG_SIZE]; + /* static unsigned char message[MAX_MSG_SIZE]; */ uint qc_exists, a4_exists, i, j, payload_remainder, num_blocks, payload_index; @@ -1479,12 +1374,11 @@ static sint aes_cipher(u8 *key, uint hdrlen, u8 aes_out[16]; u8 padded_buffer[16]; u8 mic[8]; -// uint offset = 0; + /* uint offset = 0; */ uint frtype = GetFrameType(pframe); uint frsubtype = GetFrameSubType(pframe); - -_func_enter_; - frsubtype=frsubtype>>4; + + frsubtype = frsubtype >> 4; _rtw_memset((void *)mic_iv, 0, 16); @@ -1495,166 +1389,161 @@ _func_enter_; _rtw_memset((void *)aes_out, 0, 16); _rtw_memset((void *)padded_buffer, 0, 16); - if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN)) + if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN)) a4_exists = 0; else a4_exists = 1; if ( - ((frtype|frsubtype) == WIFI_DATA_CFACK) || - ((frtype|frsubtype) == WIFI_DATA_CFPOLL)|| - ((frtype|frsubtype) == WIFI_DATA_CFACKPOLL)) - { - qc_exists = 1; - if(hdrlen != WLAN_HDR_A3_QOS_LEN){ - - hdrlen += 2; - } - } - // add for CONFIG_IEEE80211W, none 11w also can use + ((frtype | frsubtype) == WIFI_DATA_CFACK) || + ((frtype | frsubtype) == WIFI_DATA_CFPOLL) || + ((frtype | frsubtype) == WIFI_DATA_CFACKPOLL)) { + qc_exists = 1; + if (hdrlen != WLAN_HDR_A3_QOS_LEN) + + hdrlen += 2; + } + /* add for CONFIG_IEEE80211W, none 11w also can use */ else if ((frtype == WIFI_DATA) && - ((frsubtype == 0x08) || - (frsubtype == 0x09)|| - (frsubtype == 0x0a)|| - (frsubtype == 0x0b))) - { - if(hdrlen != WLAN_HDR_A3_QOS_LEN){ - - hdrlen += 2; - } - qc_exists = 1; - } - else + ((frsubtype == 0x08) || + (frsubtype == 0x09) || + (frsubtype == 0x0a) || + (frsubtype == 0x0b))) { + if (hdrlen != WLAN_HDR_A3_QOS_LEN) + + hdrlen += 2; + qc_exists = 1; + } else qc_exists = 0; - pn_vector[0]=pframe[hdrlen]; - pn_vector[1]=pframe[hdrlen+1]; - pn_vector[2]=pframe[hdrlen+4]; - pn_vector[3]=pframe[hdrlen+5]; - pn_vector[4]=pframe[hdrlen+6]; - pn_vector[5]=pframe[hdrlen+7]; - - construct_mic_iv( - mic_iv, - qc_exists, - a4_exists, - pframe, //message, - plen, - pn_vector, - frtype // add for CONFIG_IEEE80211W, none 11w also can use - ); + pn_vector[0] = pframe[hdrlen]; + pn_vector[1] = pframe[hdrlen + 1]; + pn_vector[2] = pframe[hdrlen + 4]; + pn_vector[3] = pframe[hdrlen + 5]; + pn_vector[4] = pframe[hdrlen + 6]; + pn_vector[5] = pframe[hdrlen + 7]; - construct_mic_header1( - mic_header1, - hdrlen, - pframe, //message - frtype // add for CONFIG_IEEE80211W, none 11w also can use - ); - construct_mic_header2( - mic_header2, - pframe, //message, - a4_exists, - qc_exists - ); + construct_mic_iv( + mic_iv, + qc_exists, + a4_exists, + pframe, /* message, */ + plen, + pn_vector, + frtype /* add for CONFIG_IEEE80211W, none 11w also can use */ + ); + + construct_mic_header1( + mic_header1, + hdrlen, + pframe, /* message */ + frtype /* add for CONFIG_IEEE80211W, none 11w also can use */ + ); + construct_mic_header2( + mic_header2, + pframe, /* message, */ + a4_exists, + qc_exists + ); payload_remainder = plen % 16; - num_blocks = plen / 16; + num_blocks = plen / 16; - /* Find start of payload */ - payload_index = (hdrlen + 8); + /* Find start of payload */ + payload_index = (hdrlen + 8); - /* Calculate MIC */ - aes128k128d(key, mic_iv, aes_out); - bitwise_xor(aes_out, mic_header1, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); - bitwise_xor(aes_out, mic_header2, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); + /* Calculate MIC */ + aes128k128d(key, mic_iv, aes_out); + bitwise_xor(aes_out, mic_header1, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + bitwise_xor(aes_out, mic_header2, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); - for (i = 0; i < num_blocks; i++) - { - bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer); + for (i = 0; i < num_blocks; i++) { + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);/* bitwise_xor(aes_out, &message[payload_index], chain_buffer); */ - payload_index += 16; - aes128k128d(key, chain_buffer, aes_out); - } + payload_index += 16; + aes128k128d(key, chain_buffer, aes_out); + } - /* Add on the final payload block if it needs padding */ - if (payload_remainder > 0) - { - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = pframe[payload_index++];//padded_buffer[j] = message[payload_index++]; - } - bitwise_xor(aes_out, padded_buffer, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); + /* Add on the final payload block if it needs padding */ + if (payload_remainder > 0) { + for (j = 0; j < 16; j++) + padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) { + padded_buffer[j] = pframe[payload_index++];/* padded_buffer[j] = message[payload_index++]; */ + } + bitwise_xor(aes_out, padded_buffer, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); - } + } - for (j = 0 ; j < 8; j++) mic[j] = aes_out[j]; + for (j = 0 ; j < 8; j++) + mic[j] = aes_out[j]; - /* Insert MIC into payload */ - for (j = 0; j < 8; j++) - pframe[payload_index+j] = mic[j]; //message[payload_index+j] = mic[j]; + /* Insert MIC into payload */ + for (j = 0; j < 8; j++) + pframe[payload_index + j] = mic[j]; /* message[payload_index+j] = mic[j]; */ payload_index = hdrlen + 8; - for (i=0; i< num_blocks; i++) - { - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - pframe, //message, - pn_vector, - i+1, - frtype); // add for CONFIG_IEEE80211W, none 11w also can use - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer); - for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; - } + for (i = 0; i < num_blocks; i++) { + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, /* message, */ + pn_vector, + i + 1, + frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */ + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);/* bitwise_xor(aes_out, &message[payload_index], chain_buffer); */ + for (j = 0; j < 16; j++) + pframe[payload_index++] = chain_buffer[j];/* for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; */ + } - if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ - { /* encrypt it and copy the unpadded part back */ - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - pframe, //message, - pn_vector, - num_blocks+1, - frtype); // add for CONFIG_IEEE80211W, none 11w also can use + if (payload_remainder > 0) { /* If there is a short final block, then pad it,*/ + /* encrypt it and copy the unpadded part back */ + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, /* message, */ + pn_vector, + num_blocks + 1, + frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */ - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = pframe[payload_index+j];//padded_buffer[j] = message[payload_index+j]; - } - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, padded_buffer, chain_buffer); - for (j=0; jattrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + /* struct sta_info *stainfo=NULL; */ + struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; -// uint offset = 0; - u32 res=_SUCCESS; -_func_enter_; + /* uint offset = 0; */ + u32 res = _SUCCESS; - if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL) return _FAIL; #ifdef CONFIG_USB_TX_AGGREGATION hw_hdr_offset = TXDESC_SIZE + - (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); + (((struct xmit_frame *)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); +#else +#ifdef CONFIG_TX_EARLY_MODE + hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE; #else - #ifdef CONFIG_TX_EARLY_MODE - hw_hdr_offset = TXDESC_OFFSET+EARLY_MODE_INFO_SIZE; - #else hw_hdr_offset = TXDESC_OFFSET; - #endif +#endif #endif - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + hw_hdr_offset; + pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset; - //4 start to encrypt each fragment - if((pattrib->encrypt==_AES_)){ -/* - if(pattrib->psta) + /* 4 start to encrypt each fragment */ + if ((pattrib->encrypt == _AES_)) { + /* + if(pattrib->psta) + { + stainfo = pattrib->psta; + } + else + { + RTW_INFO("%s, call rtw_get_stainfo()\n", __func__); + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); + } + */ + /* if (stainfo!=NULL) */ { - stainfo = pattrib->psta; - } - else - { - DBG_871X("%s, call rtw_get_stainfo()\n", __func__); - stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); - } -*/ - //if (stainfo!=NULL) - { -/* - if(!(stainfo->state &_FW_LINKED)) - { - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state); - return _FAIL; - } -*/ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo!=NULL!!!\n")); + /* + if(!(stainfo->state &_FW_LINKED)) + { + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state); + return _FAIL; + } + */ - if(IS_MCAST(pattrib->ra)) - { - prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; - } - else - { - //prwskey=&stainfo->dot118021x_UncstKey.skey[0]; - prwskey=pattrib->dot118021x_UncstKey.skey; + if (IS_MCAST(pattrib->ra)) + prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + else { + /* prwskey=&stainfo->dot118021x_UncstKey.skey[0]; */ + prwskey = pattrib->dot118021x_UncstKey.skey; } #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) ) - { - DBG_871X("[%s] for tdls link\n", __FUNCTION__); - prwskey=&ptdls_sta->tpk.tk[0]; + ptdls_sta = rtw_get_stainfo(&padapter->stapriv , &pattrib->dst[0]); + if ((ptdls_sta != NULL) && (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) { + RTW_INFO("[%s] for tdls link\n", __FUNCTION__); + prwskey = &ptdls_sta->tpk.tk[0]; } } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ - prwskeylen=16; - - for(curfragnum=0;curfragnumnr_frags;curfragnum++){ - - if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment - length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; - - aes_cipher(prwskey,pattrib->hdrlen,pframe, length); - } - else{ - length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; - - aes_cipher(prwskey,pattrib->hdrlen,pframe, length); - pframe+=pxmitpriv->frag_len; - pframe=(u8*)RND4((SIZE_PTR)(pframe)); + prwskeylen = 16; + + for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { + + if ((curfragnum + 1) == pattrib->nr_frags) { /* 4 the last fragment */ + length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; + + aes_cipher(prwskey, pattrib->hdrlen, pframe, length); + } else { + length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len ; + + aes_cipher(prwskey, pattrib->hdrlen, pframe, length); + pframe += pxmitpriv->frag_len; + pframe = (u8 *)RND4((SIZE_PTR)(pframe)); } } AES_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra); } -/* - else{ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n")); - DBG_871X("%s, psta==NUL\n", __func__); - res=_FAIL; - } -*/ + /* + else{ + RTW_INFO("%s, psta==NUL\n", __func__); + res=_FAIL; + } + */ } -_func_exit_; - return res; + return res; } static sint aes_decipher(u8 *key, uint hdrlen, - u8 *pframe, uint plen) + u8 *pframe, uint plen) { static u8 message[MAX_MSG_SIZE]; uint qc_exists, a4_exists, i, j, payload_remainder, - num_blocks, payload_index; + num_blocks, payload_index; sint res = _SUCCESS; u8 pn_vector[6]; u8 mic_iv[16]; @@ -1795,18 +1676,17 @@ static sint aes_decipher(u8 *key, uint hdrlen, u8 mic_header2[16]; u8 ctr_preload[16]; - /* Intermediate Buffers */ + /* Intermediate Buffers */ u8 chain_buffer[16]; u8 aes_out[16]; u8 padded_buffer[16]; u8 mic[8]; -// uint offset = 0; + /* uint offset = 0; */ uint frtype = GetFrameType(pframe); uint frsubtype = GetFrameSubType(pframe); -_func_enter_; - frsubtype=frsubtype>>4; + frsubtype = frsubtype >> 4; _rtw_memset((void *)mic_iv, 0, 16); @@ -1817,284 +1697,270 @@ _func_enter_; _rtw_memset((void *)aes_out, 0, 16); _rtw_memset((void *)padded_buffer, 0, 16); - //start to decrypt the payload + /* start to decrypt the payload */ - num_blocks = (plen-8) / 16; //(plen including LLC, payload_length and mic ) + num_blocks = (plen - 8) / 16; /* (plen including LLC, payload_length and mic ) */ - payload_remainder = (plen-8) % 16; + payload_remainder = (plen - 8) % 16; pn_vector[0] = pframe[hdrlen]; - pn_vector[1] = pframe[hdrlen+1]; - pn_vector[2] = pframe[hdrlen+4]; - pn_vector[3] = pframe[hdrlen+5]; - pn_vector[4] = pframe[hdrlen+6]; - pn_vector[5] = pframe[hdrlen+7]; + pn_vector[1] = pframe[hdrlen + 1]; + pn_vector[2] = pframe[hdrlen + 4]; + pn_vector[3] = pframe[hdrlen + 5]; + pn_vector[4] = pframe[hdrlen + 6]; + pn_vector[5] = pframe[hdrlen + 7]; - if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN)) + if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN)) a4_exists = 0; else a4_exists = 1; if ( - ((frtype|frsubtype) == WIFI_DATA_CFACK) || - ((frtype|frsubtype) == WIFI_DATA_CFPOLL)|| - ((frtype|frsubtype) == WIFI_DATA_CFACKPOLL)) - { - qc_exists = 1; - if(hdrlen != WLAN_HDR_A3_QOS_LEN){ - - hdrlen += 2; - } - }//only for data packet . add for CONFIG_IEEE80211W, none 11w also can use + ((frtype | frsubtype) == WIFI_DATA_CFACK) || + ((frtype | frsubtype) == WIFI_DATA_CFPOLL) || + ((frtype | frsubtype) == WIFI_DATA_CFACKPOLL)) { + qc_exists = 1; + if (hdrlen != WLAN_HDR_A3_QOS_LEN) + + hdrlen += 2; + } /* only for data packet . add for CONFIG_IEEE80211W, none 11w also can use */ else if ((frtype == WIFI_DATA) && - ((frsubtype == 0x08) || - (frsubtype == 0x09)|| - (frsubtype == 0x0a)|| - (frsubtype == 0x0b))) - { - if(hdrlen != WLAN_HDR_A3_QOS_LEN){ - - hdrlen += 2; - } - qc_exists = 1; - } - else + ((frsubtype == 0x08) || + (frsubtype == 0x09) || + (frsubtype == 0x0a) || + (frsubtype == 0x0b))) { + if (hdrlen != WLAN_HDR_A3_QOS_LEN) + + hdrlen += 2; + qc_exists = 1; + } else qc_exists = 0; - // now, decrypt pframe with hdrlen offset and plen long + /* now, decrypt pframe with hdrlen offset and plen long */ - payload_index = hdrlen + 8; // 8 is for extiv - - for (i=0; i< num_blocks; i++) - { - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - pframe, - pn_vector, - i+1, - frtype // add for CONFIG_IEEE80211W, none 11w also can use - ); + payload_index = hdrlen + 8; /* 8 is for extiv */ - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, &pframe[payload_index], chain_buffer); + for (i = 0; i < num_blocks; i++) { + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, + pn_vector, + i + 1, + frtype /* add for CONFIG_IEEE80211W, none 11w also can use */ + ); - for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j]; - } + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer); - if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ - { /* encrypt it and copy the unpadded part back */ - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - pframe, - pn_vector, - num_blocks+1, - frtype // add for CONFIG_IEEE80211W, none 11w also can use - ); + for (j = 0; j < 16; j++) + pframe[payload_index++] = chain_buffer[j]; + } - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = pframe[payload_index+j]; - } - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, padded_buffer, chain_buffer); - for (j=0; j 0) { /* If there is a short final block, then pad it,*/ + /* encrypt it and copy the unpadded part back */ + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, + pn_vector, + num_blocks + 1, + frtype /* add for CONFIG_IEEE80211W, none 11w also can use */ + ); - //start to calculate the mic - if((hdrlen +plen+8) <= MAX_MSG_SIZE) - _rtw_memcpy((void *)message, pframe, (hdrlen +plen+8)); //8 is for ext iv len + for (j = 0; j < 16; j++) + padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + padded_buffer[j] = pframe[payload_index + j]; + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, padded_buffer, chain_buffer); + for (j = 0; j < payload_remainder; j++) + pframe[payload_index++] = chain_buffer[j]; + } + + /* start to calculate the mic */ + if ((hdrlen + plen + 8) <= MAX_MSG_SIZE) + _rtw_memcpy((void *)message, pframe, (hdrlen + plen + 8)); /* 8 is for ext iv len */ - pn_vector[0]=pframe[hdrlen]; - pn_vector[1]=pframe[hdrlen+1]; - pn_vector[2]=pframe[hdrlen+4]; - pn_vector[3]=pframe[hdrlen+5]; - pn_vector[4]=pframe[hdrlen+6]; - pn_vector[5]=pframe[hdrlen+7]; + pn_vector[0] = pframe[hdrlen]; + pn_vector[1] = pframe[hdrlen + 1]; + pn_vector[2] = pframe[hdrlen + 4]; + pn_vector[3] = pframe[hdrlen + 5]; + pn_vector[4] = pframe[hdrlen + 6]; + pn_vector[5] = pframe[hdrlen + 7]; + - construct_mic_iv( - mic_iv, - qc_exists, - a4_exists, - message, - plen-8, - pn_vector, - frtype // add for CONFIG_IEEE80211W, none 11w also can use - ); + mic_iv, + qc_exists, + a4_exists, + message, + plen - 8, + pn_vector, + frtype /* add for CONFIG_IEEE80211W, none 11w also can use */ + ); - construct_mic_header1( - mic_header1, - hdrlen, - message, - frtype // add for CONFIG_IEEE80211W, none 11w also can use - ); - construct_mic_header2( - mic_header2, - message, - a4_exists, - qc_exists - ); + construct_mic_header1( + mic_header1, + hdrlen, + message, + frtype /* add for CONFIG_IEEE80211W, none 11w also can use */ + ); + construct_mic_header2( + mic_header2, + message, + a4_exists, + qc_exists + ); - payload_remainder = (plen-8) % 16; - num_blocks = (plen-8) / 16; + payload_remainder = (plen - 8) % 16; + num_blocks = (plen - 8) / 16; - /* Find start of payload */ - payload_index = (hdrlen + 8); + /* Find start of payload */ + payload_index = (hdrlen + 8); - /* Calculate MIC */ - aes128k128d(key, mic_iv, aes_out); - bitwise_xor(aes_out, mic_header1, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); - bitwise_xor(aes_out, mic_header2, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); + /* Calculate MIC */ + aes128k128d(key, mic_iv, aes_out); + bitwise_xor(aes_out, mic_header1, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + bitwise_xor(aes_out, mic_header2, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); - for (i = 0; i < num_blocks; i++) - { - bitwise_xor(aes_out, &message[payload_index], chain_buffer); + for (i = 0; i < num_blocks; i++) { + bitwise_xor(aes_out, &message[payload_index], chain_buffer); - payload_index += 16; - aes128k128d(key, chain_buffer, aes_out); - } + payload_index += 16; + aes128k128d(key, chain_buffer, aes_out); + } - /* Add on the final payload block if it needs padding */ - if (payload_remainder > 0) - { - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = message[payload_index++]; - } - bitwise_xor(aes_out, padded_buffer, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); + /* Add on the final payload block if it needs padding */ + if (payload_remainder > 0) { + for (j = 0; j < 16; j++) + padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + padded_buffer[j] = message[payload_index++]; + bitwise_xor(aes_out, padded_buffer, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); - } + } - for (j = 0 ; j < 8; j++) mic[j] = aes_out[j]; + for (j = 0 ; j < 8; j++) + mic[j] = aes_out[j]; - /* Insert MIC into payload */ - for (j = 0; j < 8; j++) - message[payload_index+j] = mic[j]; + /* Insert MIC into payload */ + for (j = 0; j < 8; j++) + message[payload_index + j] = mic[j]; payload_index = hdrlen + 8; - for (i=0; i< num_blocks; i++) - { - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - message, - pn_vector, - i+1, - frtype); // add for CONFIG_IEEE80211W, none 11w also can use - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, &message[payload_index], chain_buffer); - for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; - } + for (i = 0; i < num_blocks; i++) { + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + message, + pn_vector, + i + 1, + frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */ + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, &message[payload_index], chain_buffer); + for (j = 0; j < 16; j++) + message[payload_index++] = chain_buffer[j]; + } - if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ - { /* encrypt it and copy the unpadded part back */ - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - message, - pn_vector, - num_blocks+1, - frtype); // add for CONFIG_IEEE80211W, none 11w also can use + if (payload_remainder > 0) { /* If there is a short final block, then pad it,*/ + /* encrypt it and copy the unpadded part back */ + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + message, + pn_vector, + num_blocks + 1, + frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */ - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = message[payload_index+j]; - } - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, padded_buffer, chain_buffer); - for (j=0; ju.hdr.attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; -// struct recv_priv *precvpriv=&padapter->recvpriv; - u32 res=_SUCCESS; -_func_enter_; - pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - //4 start to encrypt each fragment - if((prxattrib->encrypt==_AES_)){ + struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib; + struct security_priv *psecuritypriv = &padapter->securitypriv; + /* struct recv_priv *precvpriv=&padapter->recvpriv; */ + u32 res = _SUCCESS; + pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data; + /* 4 start to encrypt each fragment */ + if ((prxattrib->encrypt == _AES_)) { - stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] ); - if (stainfo!=NULL){ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo!=NULL!!!\n")); + stainfo = rtw_get_stainfo(&padapter->stapriv , &prxattrib->ta[0]); + if (stainfo != NULL) { - if(IS_MCAST(prxattrib->ra)) - { + if (IS_MCAST(prxattrib->ra)) { static u32 start = 0; static u32 no_gkey_bc_cnt = 0; static u32 no_gkey_mc_cnt = 0; - //DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n"); - //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; - if(psecuritypriv->binstallGrpkey==_FALSE) - { - res=_FAIL; + /* RTW_INFO("rx bc/mc packets, to perform sw rtw_aes_decrypt\n"); */ + /* prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; */ + if (psecuritypriv->binstallGrpkey == _FALSE) { + res = _FAIL; if (start == 0) start = rtw_get_current_time(); @@ -2106,7 +1972,7 @@ _func_enter_; if (rtw_get_passing_time_ms(start) > 1000) { if (no_gkey_bc_cnt || no_gkey_mc_cnt) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", + RTW_PRINT(FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt); } start = rtw_get_current_time(); @@ -2118,7 +1984,7 @@ _func_enter_; } if (no_gkey_bc_cnt || no_gkey_mc_cnt) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", + RTW_PRINT(FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt); } start = 0; @@ -2126,54 +1992,47 @@ _func_enter_; no_gkey_mc_cnt = 0; prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; - if(psecuritypriv->dot118021XGrpKeyid != prxattrib->key_index) - { - DBG_871X("not match packet_index=%d, install_index=%d \n" - , prxattrib->key_index, psecuritypriv->dot118021XGrpKeyid); - res=_FAIL; + if (psecuritypriv->dot118021XGrpKeyid != prxattrib->key_index) { + RTW_DBG("not match packet_index=%d, install_index=%d\n" + , prxattrib->key_index, psecuritypriv->dot118021XGrpKeyid); + res = _FAIL; goto exit; } - } - else - { - prwskey=&stainfo->dot118021x_UncstKey.skey[0]; - } - - length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; - /*// add for CONFIG_IEEE80211W, debug - if(0) - printk("@@@@@@@@@@@@@@@@@@ length=%d, prxattrib->hdrlen=%d, prxattrib->pkt_len=%d \n" - , length, prxattrib->hdrlen, prxattrib->pkt_len); - if(0) - { + } else + prwskey = &stainfo->dot118021x_UncstKey.skey[0]; + + length = ((union recv_frame *)precvframe)->u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len; +#if 0 + /* add for CONFIG_IEEE80211W, debug */ + if (0) + printk("@@@@@@@@@@@@@@@@@@ length=%d, prxattrib->hdrlen=%d, prxattrib->pkt_len=%d\n" + , length, prxattrib->hdrlen, prxattrib->pkt_len); + if (0) { int no; - //test print PSK + /* test print PSK */ printk("PSK key below:\n"); - for(no=0;no<16;no++) + for (no = 0; no < 16; no++) printk(" %02x ", prwskey[no]); printk("\n"); } - if(0) - { + if (0) { int no; - //test print PSK + /* test print PSK */ printk("frame:\n"); - for(no=0;nopkt_len;no++) + for (no = 0; no < prxattrib->pkt_len; no++) printk(" %02x ", pframe[no]); printk("\n"); - }*/ + } +#endif - res= aes_decipher(prwskey,prxattrib->hdrlen,pframe, length); + res = aes_decipher(prwskey, prxattrib->hdrlen, pframe, length); AES_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra); + } else { + res = _FAIL; } - else{ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo==NULL!!!\n")); - res=_FAIL; - } - + } -_func_exit_; exit: return res; } @@ -2184,100 +2043,95 @@ u32 rtw_BIP_verify(_adapter *padapter, u8 *precvframe) struct rx_pkt_attrib *pattrib = &((union recv_frame *)precvframe)->u.hdr.attrib; u8 *pframe; u8 *BIP_AAD, *p; - u32 res=_FAIL; + u32 res = _FAIL; uint len, ori_len; struct rtw_ieee80211_hdr *pwlanhdr; u8 mic[16]; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - ori_len = pattrib->pkt_len-WLAN_HDR_A3_LEN+BIP_AAD_SIZE; + ori_len = pattrib->pkt_len - WLAN_HDR_A3_LEN + BIP_AAD_SIZE; BIP_AAD = rtw_zmalloc(ori_len); - - if(BIP_AAD == NULL) - { - DBG_871X("BIP AAD allocate fail\n"); + + if (BIP_AAD == NULL) { + RTW_INFO("BIP AAD allocate fail\n"); return _FAIL; } - //PKT start - pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - //mapping to wlan header + /* PKT start */ + pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data; + /* mapping to wlan header */ pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - //save the frame body + MME - _rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, pframe+WLAN_HDR_A3_LEN, pattrib->pkt_len-WLAN_HDR_A3_LEN); - //find MME IE pointer - p = rtw_get_ie(BIP_AAD+BIP_AAD_SIZE, _MME_IE_, &len, pattrib->pkt_len-WLAN_HDR_A3_LEN); - //Baron - if(p) - { - u16 keyid=0; - u64 temp_ipn=0; - //save packet number - _rtw_memcpy(&temp_ipn, p+4, 6); + /* save the frame body + MME */ + _rtw_memcpy(BIP_AAD + BIP_AAD_SIZE, pframe + WLAN_HDR_A3_LEN, pattrib->pkt_len - WLAN_HDR_A3_LEN); + /* find MME IE pointer */ + p = rtw_get_ie(BIP_AAD + BIP_AAD_SIZE, _MME_IE_, &len, pattrib->pkt_len - WLAN_HDR_A3_LEN); + /* Baron */ + if (p) { + u16 keyid = 0; + u64 temp_ipn = 0; + /* save packet number */ + _rtw_memcpy(&temp_ipn, p + 4, 6); temp_ipn = le64_to_cpu(temp_ipn); - //BIP packet number should bigger than previous BIP packet + /* BIP packet number should bigger than previous BIP packet */ if (temp_ipn < pmlmeext->mgnt_80211w_IPN_rx) { - DBG_871X("replay BIP packet\n"); + RTW_INFO("replay BIP packet\n"); goto BIP_exit; } - //copy key index - _rtw_memcpy(&keyid, p+2, 2); + /* copy key index */ + _rtw_memcpy(&keyid, p + 2, 2); keyid = le16_to_cpu(keyid); - if(keyid != padapter->securitypriv.dot11wBIPKeyid) - { - DBG_871X("BIP key index error!\n"); + if (keyid != padapter->securitypriv.dot11wBIPKeyid) { + RTW_INFO("BIP key index error!\n"); goto BIP_exit; } - //clear the MIC field of MME to zero - _rtw_memset(p+2+len-8, 0, 8); - - //conscruct AAD, copy frame control field + /* clear the MIC field of MME to zero */ + _rtw_memset(p + 2 + len - 8, 0, 8); + + /* conscruct AAD, copy frame control field */ _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2); ClearRetry(BIP_AAD); ClearPwrMgt(BIP_AAD); ClearMData(BIP_AAD); - //conscruct AAD, copy address 1 to address 3 - _rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18); - - if(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey - , BIP_AAD, ori_len, mic)) + /* conscruct AAD, copy address 1 to address 3 */ + _rtw_memcpy(BIP_AAD + 2, pwlanhdr->addr1, 18); + + if (omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey + , BIP_AAD, ori_len, mic)) goto BIP_exit; - - /*//management packet content + +#if 0 + /* management packet content */ { int pp; - DBG_871X("pkt: "); - for(pp=0;pp< pattrib->pkt_len; pp++) + RTW_INFO("pkt: "); + for (pp = 0; pp < pattrib->pkt_len; pp++) printk(" %02x ", pframe[pp]); - DBG_871X("\n"); - //BIP AAD + management frame body + MME(MIC is zero) - DBG_871X("AAD+PKT: "); - for(pp=0;pp< ori_len; pp++) - DBG_871X(" %02x ", BIP_AAD[pp]); - DBG_871X("\n"); - //show the MIC result - DBG_871X("mic: "); - for(pp=0;pp<16; pp++) - DBG_871X(" %02x ", mic[pp]); - DBG_871X("\n"); + RTW_INFO("\n"); + /* BIP AAD + management frame body + MME(MIC is zero) */ + RTW_INFO("AAD+PKT: "); + for (pp = 0; pp < ori_len; pp++) + RTW_INFO(" %02x ", BIP_AAD[pp]); + RTW_INFO("\n"); + /* show the MIC result */ + RTW_INFO("mic: "); + for (pp = 0; pp < 16; pp++) + RTW_INFO(" %02x ", mic[pp]); + RTW_INFO("\n"); } - */ - //MIC field should be last 8 bytes of packet (packet without FCS) - if(_rtw_memcmp(mic, pframe+pattrib->pkt_len-8, 8)) - { +#endif + /* MIC field should be last 8 bytes of packet (packet without FCS) */ + if (_rtw_memcmp(mic, pframe + pattrib->pkt_len - 8, 8)) { pmlmeext->mgnt_80211w_IPN_rx = temp_ipn; - res=_SUCCESS; - } - else - DBG_871X("BIP MIC error!\n"); - - } - else + res = _SUCCESS; + } else + RTW_INFO("BIP MIC error!\n"); + + } else res = RTW_RX_HANDLED; BIP_exit: rtw_mfree(BIP_AAD, ori_len); return res; } -#endif //CONFIG_IEEE80211W +#endif /* CONFIG_IEEE80211W */ #ifndef PLATFORM_FREEBSD /* compress 512-bits */ @@ -2288,9 +2142,8 @@ static int sha256_compress(struct sha256_state *md, unsigned char *buf) int i; /* copy state into S */ - for (i = 0; i < 8; i++) { + for (i = 0; i < 8; i++) S[i] = md->state[i]; - } /* copy the state into 512-bits into W[0..15] */ for (i = 0; i < 16; i++) @@ -2299,26 +2152,33 @@ static int sha256_compress(struct sha256_state *md, unsigned char *buf) /* fill W[16..63] */ for (i = 16; i < 64; i++) { W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + - W[i - 16]; - } + W[i - 16]; + } /* Compress */ -#define RND(a,b,c,d,e,f,g,h,i) \ +#define RND(a, b, c, d, e, f, g, h, i) do {\ t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ t1 = Sigma0(a) + Maj(a, b, c); \ d += t0; \ - h = t0 + t1; + h = t0 + t1; \ + } while (0) for (i = 0; i < 64; ++i) { RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i); - t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4]; - S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t; + t = S[7]; + S[7] = S[6]; + S[6] = S[5]; + S[5] = S[4]; + S[4] = S[3]; + S[3] = S[2]; + S[2] = S[1]; + S[1] = S[0]; + S[0] = t; } /* feedback */ - for (i = 0; i < 8; i++) { + for (i = 0; i < 8; i++) md->state[i] = md->state[i] + S[i]; - } return 0; } @@ -2403,17 +2263,15 @@ static int sha256_done(struct sha256_state *md, unsigned char *out) * encoding like normal. */ if (md->curlen > 56) { - while (md->curlen < 64) { + while (md->curlen < 64) md->buf[md->curlen++] = (unsigned char) 0; - } sha256_compress(md, md->buf); md->curlen = 0; } /* pad upto 56 bytes of zeroes */ - while (md->curlen < 56) { + while (md->curlen < 56) md->buf[md->curlen++] = (unsigned char) 0; - } /* store length */ WPA_PUT_BE64(md->buf + 56, md->length); @@ -2435,7 +2293,7 @@ static int sha256_done(struct sha256_state *md, unsigned char *out) * Returns: 0 on success, -1 of failure */ static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len, - u8 *mac) + u8 *mac) { struct sha256_state ctx; size_t i; @@ -2485,7 +2343,7 @@ static int os_memcmp(void *s1, void *s2, u8 n) * @mac: Buffer for the hash (32 bytes) */ static void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem, - u8 *addr[], size_t *len, u8 *mac) + u8 *addr[], size_t *len, u8 *mac) { unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */ unsigned char tk[32]; @@ -2500,12 +2358,12 @@ static void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem, return; } - /* if key is longer than 64 bytes reset it to key = SHA256(key) */ - if (key_len > 64) { + /* if key is longer than 64 bytes reset it to key = SHA256(key) */ + if (key_len > 64) { sha256_vector(1, &key, &key_len, tk); key = tk; key_len = 32; - } + } /* the HMAC_SHA256 transform looks like: * @@ -2545,7 +2403,7 @@ static void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem, _len[1] = 32; sha256_vector(2, _addr, _len, mac); } -#endif //PLATFORM_FREEBSD +#endif /* PLATFORM_FREEBSD */ /** * sha256_prf - SHA256-based Pseudo-Random Function (IEEE 802.11r, 8.5.1.5.2) * @key: Key for PRF @@ -2559,9 +2417,9 @@ static void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem, * This function is used to derive new, cryptographically separate keys from a * given key. */ -#ifndef PLATFORM_FREEBSD //Baron +#ifndef PLATFORM_FREEBSD /* Baron */ static void sha256_prf(u8 *key, size_t key_len, char *label, - u8 *data, size_t data_len, u8 *buf, size_t buf_len) + u8 *data, size_t data_len, u8 *buf, size_t buf_len) { u16 counter = 1; size_t pos, plen; @@ -2596,174 +2454,174 @@ static void sha256_prf(u8 *key, size_t key_len, char *label, counter++; } } -#endif //PLATFORM_FREEBSD Baron +#endif /* PLATFORM_FREEBSD Baron */ /* AES tables*/ const u32 Te0[256] = { - 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, - 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, - 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, - 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, - 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, - 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, - 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, - 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, - 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, - 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, - 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, - 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, - 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, - 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, - 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, - 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, - 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, - 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, - 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, - 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, - 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, - 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, - 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, - 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, - 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, - 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, - 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, - 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, - 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, - 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, - 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, - 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, - 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, - 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, - 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, - 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, - 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, - 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, - 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, - 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, - 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, - 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, - 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, - 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, - 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, - 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, - 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, - 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, - 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, - 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, - 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, - 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, - 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, - 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, - 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, - 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, - 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, - 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, - 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, - 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, - 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, - 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, - 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, - 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, }; const u32 Td0[256] = { - 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, - 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, - 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, - 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, - 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, - 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, - 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, - 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, - 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, - 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, - 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, - 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, - 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, - 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, - 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, - 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, - 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, - 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, - 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, - 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, - 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, - 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, - 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, - 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, - 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, - 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, - 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, - 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, - 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, - 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, - 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, - 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, - 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, - 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, - 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, - 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, - 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, - 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, - 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, - 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, - 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, - 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, - 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, - 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, - 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, - 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, - 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, - 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, - 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, - 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, - 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, - 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, - 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, - 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, - 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, - 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, - 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, - 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, - 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, - 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, - 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, - 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, - 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, - 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, }; const u8 Td4s[256] = { - 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, - 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, - 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, - 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, - 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, - 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, - 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, - 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, - 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, - 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, - 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, - 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, - 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, - 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, - 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, - 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, - 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, - 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, - 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, - 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, - 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, - 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, - 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, - 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, - 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, - 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, - 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, - 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, - 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, - 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, - 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, - 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, + 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, + 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, + 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, + 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, + 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, + 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, + 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, + 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, + 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, + 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, + 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, + 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, + 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, + 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, + 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, + 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, + 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, + 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, + 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, + 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, + 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, + 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, + 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, + 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, + 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, + 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, + 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, + 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, + 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, + 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, + 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, + 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, }; const u8 rcons[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 @@ -2775,13 +2633,13 @@ const u8 rcons[] = { * * @return the number of rounds for the given cipher key size. */ -#ifndef PLATFORM_FREEBSD //Baron +#ifndef PLATFORM_FREEBSD /* Baron */ static void rijndaelKeySetupEnc(u32 rk[/*44*/], const u8 cipherKey[]) { int i; u32 temp; - rk[0] = GETU32(cipherKey ); + rk[0] = GETU32(cipherKey); rk[1] = GETU32(cipherKey + 4); rk[2] = GETU32(cipherKey + 8); rk[3] = GETU32(cipherKey + 12); @@ -2809,28 +2667,29 @@ static void rijndaelEncrypt(u32 rk[/*44*/], u8 pt[16], u8 ct[16]) * map byte array block to cipher state * and add initial round key: */ - s0 = GETU32(pt ) ^ rk[0]; + s0 = GETU32(pt) ^ rk[0]; s1 = GETU32(pt + 4) ^ rk[1]; s2 = GETU32(pt + 8) ^ rk[2]; s3 = GETU32(pt + 12) ^ rk[3]; -#define ROUND(i,d,s) \ -d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \ -d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \ -d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \ -d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3] +#define ROUND(i, d, s) do {\ + d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \ + d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \ + d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \ + d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]; \ + } while (0) #ifdef FULL_UNROLL - ROUND(1,t,s); - ROUND(2,s,t); - ROUND(3,t,s); - ROUND(4,s,t); - ROUND(5,t,s); - ROUND(6,s,t); - ROUND(7,t,s); - ROUND(8,s,t); - ROUND(9,t,s); + ROUND(1, t, s); + ROUND(2, s, t); + ROUND(3, t, s); + ROUND(4, s, t); + ROUND(5, t, s); + ROUND(6, s, t); + ROUND(7, t, s); + ROUND(8, s, t); + ROUND(9, t, s); rk += Nr << 2; @@ -2839,11 +2698,11 @@ d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3] /* Nr - 1 full rounds: */ r = Nr >> 1; for (;;) { - ROUND(1,t,s); + ROUND(1, t, s); rk += 8; if (--r == 0) break; - ROUND(0,s,t); + ROUND(0, s, t); } #endif /* ?FULL_UNROLL */ @@ -2864,12 +2723,12 @@ d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3] PUTU32(ct + 12, s3); } -static void * aes_encrypt_init(u8 *key, size_t len) +static void *aes_encrypt_init(u8 *key, size_t len) { u32 *rk; if (len != 16) return NULL; - rk = (u32*)rtw_malloc(AES_PRIV_SIZE); + rk = (u32 *)rtw_malloc(AES_PRIV_SIZE); if (rk == NULL) return NULL; rijndaelKeySetupEnc(rk, key); @@ -2915,7 +2774,7 @@ static void aes_encrypt_deinit(void *ctx) * (SP) 800-38B. */ static int omac1_aes_128_vector(u8 *key, size_t num_elem, - u8 *addr[], size_t *len, u8 *mac) + u8 *addr[], size_t *len, u8 *mac) { void *ctx; u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE]; @@ -2986,12 +2845,12 @@ static int omac1_aes_128_vector(u8 *key, size_t num_elem, * This is a mode for using block cipher (AES in this case) for authentication. * OMAC1 was standardized with the name CMAC by NIST in a Special Publication * (SP) 800-38B. - */ //modify for CONFIG_IEEE80211W + */ /* modify for CONFIG_IEEE80211W */ int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac) { return omac1_aes_128_vector(key, 1, &data, &data_len, mac); } -#endif //PLATFORM_FREEBSD Baron +#endif /* PLATFORM_FREEBSD Baron */ #ifdef CONFIG_TDLS void wpa_tdls_generate_tpk(_adapter *padapter, PVOID sta) @@ -3038,7 +2897,7 @@ void wpa_tdls_generate_tpk(_adapter *padapter, PVOID sta) } _rtw_memcpy(data + 2 * ETH_ALEN, get_bssid(pmlmepriv), ETH_ALEN); - sha256_prf(key_input, SHA256_MAC_LEN, "TDLS PMK", data, sizeof(data), (u8 *) &psta->tpk, sizeof(psta->tpk)); + sha256_prf(key_input, SHA256_MAC_LEN, "TDLS PMK", data, sizeof(data), (u8 *) &psta->tpk, sizeof(psta->tpk)); } @@ -3054,19 +2913,19 @@ void wpa_tdls_generate_tpk(_adapter *padapter, PVOID sta) * * Calculate MIC for TDLS frame. */ -int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, - u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, - u8 *mic) +int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, + u8 *mic) { u8 *buf, *pos; struct wpa_tdls_ftie *_ftie; struct wpa_tdls_lnkid *_lnkid; int ret; int len = 2 * ETH_ALEN + 1 + 2 + lnkid[1] + 2 + rsnie[1] + - 2 + timeoutie[1] + 2 + ftie[1]; + 2 + timeoutie[1] + 2 + ftie[1]; buf = rtw_zmalloc(len); if (!buf) { - DBG_871X("TDLS: No memory for MIC calculation\n"); + RTW_INFO("TDLS: No memory for MIC calculation\n"); return -1; } @@ -3094,7 +2953,7 @@ int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, _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; @@ -3113,17 +2972,17 @@ int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, * * 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) +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"); + RTW_INFO("TDLS: No memory for MIC calculation\n"); return -1; } @@ -3151,7 +3010,7 @@ int wpa_tdls_teardown_ftie_mic(u8 *kck, u8 *lnkid, u16 reason, } int tdls_verify_mic(u8 *kck, u8 trans_seq, - u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie) + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie) { u8 *buf, *pos; int len; @@ -3160,11 +3019,10 @@ int tdls_verify_mic(u8 *kck, u8 trans_seq, u8 *rx_ftie, *tmp_ftie; if (lnkid == NULL || rsnie == NULL || - timeoutie == NULL || ftie == NULL){ + timeoutie == NULL || ftie == NULL) return _FAIL; - } - - len = 2 * ETH_ALEN + 1 + 2 + 18 + 2 + *(rsnie+1) + 2 + *(timeoutie+1) + 2 + *(ftie+1); + + len = 2 * ETH_ALEN + 1 + 2 + 18 + 2 + *(rsnie + 1) + 2 + *(timeoutie + 1) + 2 + *(ftie + 1); buf = rtw_zmalloc(len); if (buf == NULL) @@ -3183,95 +3041,88 @@ int tdls_verify_mic(u8 *kck, u8 trans_seq, _rtw_memcpy(pos, lnkid, 2 + 18); pos += 2 + 18; /* 5) RSN IE */ - _rtw_memcpy(pos, rsnie, 2 + *(rsnie+1)); - pos += 2 + *(rsnie+1); + _rtw_memcpy(pos, rsnie, 2 + *(rsnie + 1)); + pos += 2 + *(rsnie + 1); /* 6) Timeout Interval IE */ - _rtw_memcpy(pos, timeoutie, 2 + *(timeoutie+1)); - pos += 2 + *(timeoutie+1); + _rtw_memcpy(pos, timeoutie, 2 + *(timeoutie + 1)); + pos += 2 + *(timeoutie + 1); /* 7) FTIE, with the MIC field of the FTIE set to 0 */ - _rtw_memcpy(pos, ftie, 2 + *(ftie+1)); + _rtw_memcpy(pos, ftie, 2 + *(ftie + 1)); pos += 2; - tmp_ftie = (u8 *) (pos+2); + tmp_ftie = (u8 *)(pos + 2); _rtw_memset(tmp_ftie, 0, 16); - pos += *(ftie+1); + pos += *(ftie + 1); ret = omac1_aes_128(kck, buf, pos - buf, mic); rtw_mfree(buf, len); if (ret) return _FAIL; - rx_ftie = ftie+4; + rx_ftie = ftie + 4; if (os_memcmp(mic, rx_ftie, 16) == 0) { - //Valid MIC + /* Valid MIC */ return _SUCCESS; } - //Invalid MIC - DBG_871X( "[%s] Invalid MIC\n", __FUNCTION__); + /* Invalid MIC */ + RTW_INFO("[%s] Invalid MIC\n", __FUNCTION__); return _FAIL; } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ void rtw_use_tkipkey_handler(RTW_TIMER_HDL_ARGS) { - _adapter *padapter = (_adapter *)FunctionContext; + _adapter *padapter = (_adapter *)FunctionContext; -_func_enter_; - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler ^^^\n")); - -/* - if (RTW_CANNOT_RUN(padapter)) { - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler (padapter->bDriverStopped %s)(padapter->bSurpriseRemoved %s)^^^\n" - , rtw_is_drv_stopped(padapter)?"True":"False" - , rtw_is_surprise_removed(padapter)?"True":"False")); - return; - } - */ - - padapter->securitypriv.busetkipkey=_TRUE; + /* + if (RTW_CANNOT_RUN(padapter)) { + + return; + } + */ + + padapter->securitypriv.busetkipkey = _TRUE; - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler padapter->securitypriv.busetkipkey=%d^^^\n",padapter->securitypriv.busetkipkey)); -_func_exit_; } /* Restore HW wep key setting according to key_mask */ void rtw_sec_restore_wep_key(_adapter *adapter) { - struct security_priv* securitypriv=&(adapter->securitypriv); + struct security_priv *securitypriv = &(adapter->securitypriv); sint keyid; - if((_WEP40_ == securitypriv->dot11PrivacyAlgrthm) ||(_WEP104_ == securitypriv->dot11PrivacyAlgrthm)) { - for(keyid=0;keyid<4;keyid++){ - if(securitypriv->key_mask & BIT(keyid)){ - if(keyid == securitypriv->dot11PrivacyKeyIndex) - rtw_set_key(adapter,securitypriv, keyid, 1, _FALSE); + if ((_WEP40_ == securitypriv->dot11PrivacyAlgrthm) || (_WEP104_ == securitypriv->dot11PrivacyAlgrthm)) { + for (keyid = 0; keyid < 4; keyid++) { + if (securitypriv->key_mask & BIT(keyid)) { + if (keyid == securitypriv->dot11PrivacyKeyIndex) + rtw_set_key(adapter, securitypriv, keyid, 1, _FALSE); else - rtw_set_key(adapter,securitypriv, keyid, 0, _FALSE); + rtw_set_key(adapter, securitypriv, keyid, 0, _FALSE); } } } } -u8 rtw_handle_tkip_countermeasure(_adapter* adapter, const char *caller) +u8 rtw_handle_tkip_countermeasure(_adapter *adapter, const char *caller) { - struct security_priv* securitypriv=&(adapter->securitypriv); + struct security_priv *securitypriv = &(adapter->securitypriv); u8 status = _SUCCESS; if (securitypriv->btkip_countermeasure == _TRUE) { u32 passing_ms = rtw_get_passing_time_ms(securitypriv->btkip_countermeasure_time); - if (passing_ms > 60*1000) { - DBG_871X_LEVEL(_drv_always_, "%s("ADPT_FMT") countermeasure time:%ds > 60s \n", - caller, ADPT_ARG(adapter), passing_ms/1000); + if (passing_ms > 60 * 1000) { + RTW_PRINT("%s("ADPT_FMT") countermeasure time:%ds > 60s\n", + caller, ADPT_ARG(adapter), passing_ms / 1000); securitypriv->btkip_countermeasure = _FALSE; securitypriv->btkip_countermeasure_time = 0; } else { - DBG_871X_LEVEL(_drv_always_, "%s("ADPT_FMT") countermeasure time:%ds < 60s \n", - caller, ADPT_ARG(adapter), passing_ms/1000); + RTW_PRINT("%s("ADPT_FMT") countermeasure time:%ds < 60s\n", + caller, ADPT_ARG(adapter), passing_ms / 1000); status = _FAIL; } } @@ -3305,7 +3156,7 @@ u16 rtw_cal_crc16(u8 data, u16 crc) crc_bit11 = ((crc & BIT11) ? 1 : 0) ^ shift_in; if (crc_bit11 == 0) - crc_result &= (~BIT12); + crc_result &= (~BIT12); else crc_result |= BIT12; @@ -3335,7 +3186,7 @@ u16 rtw_calc_crc(u8 *pdata, int length) { u16 crc = 0xffff; int i; - + for (i = 0; i < length; i++) crc = rtw_cal_crc16(pdata[i], crc); /* get 1' complement */ diff --git a/core/rtw_sreset.c b/core/rtw_sreset.c old mode 100755 new mode 100644 index b567bc0..6d241ca --- a/core/rtw_sreset.c +++ b/core/rtw_sreset.c @@ -1,365 +1,346 @@ -/****************************************************************************** - * - * 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 - * - * - ******************************************************************************/ - -#include -#include -#include - -void sreset_init_value(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - _rtw_mutex_init(&psrtpriv->silentreset_mutex); - psrtpriv->silent_reset_inprogress = _FALSE; - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - psrtpriv->last_tx_time =0; - psrtpriv->last_tx_complete_time =0; -#endif -} -void sreset_reset_value(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - psrtpriv->last_tx_time =0; - psrtpriv->last_tx_complete_time =0; -#endif -} - -u8 sreset_get_wifi_status(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - u8 status = WIFI_STATUS_SUCCESS; - u32 val32 = 0; - _irqL irqL; - if(psrtpriv->silent_reset_inprogress == _TRUE) - { - return status; - } - val32 =rtw_read32(padapter,REG_TXDMA_STATUS); - if(val32==0xeaeaeaea){ - psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST; - } - else if(val32!=0){ - DBG_8192C("txdmastatu(%x)\n",val32); - psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR; - } - - if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status) - { - DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status); - status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL))); - } - DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status); - - //status restore - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - - return status; -#else - return WIFI_STATUS_SUCCESS; -#endif -} - -void sreset_set_wifi_error_status(_adapter *padapter, u32 status) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.Wifi_Error_Status = status; -#endif -} - -void sreset_set_trigger_point(_adapter *padapter, s32 tgp) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.dbg_trigger_point = tgp; -#endif -} - -bool sreset_inprogress(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_RESET) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - return pHalData->srestpriv.silent_reset_inprogress; -#else - return _FALSE; -#endif -} - -void sreset_restore_security_station(_adapter *padapter) -{ - u8 EntryId = 0; - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct sta_priv * pstapriv = &padapter->stapriv; - struct sta_info *psta; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; - - { - u8 val8; - - if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) { - val8 = 0xcc; - #ifdef CONFIG_WAPI_SUPPORT - } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) { - //Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. - val8 = 0x4c; - #endif - } else { - val8 = 0xcf; - } - rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - } - - #if 0 - if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) || - ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ )) - { - - for(EntryId=0; EntryId<4; EntryId++) - { - if(EntryId == psecuritypriv->dot11PrivacyKeyIndex) - rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1,_FALSE); - else - rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0,_FALSE); - } - - } - else - #endif - if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) - { - psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv)); - if (psta == NULL) { - //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); - } - else - { - //pairwise key - rtw_setstakey_cmd(padapter, psta, UNICAST_KEY,_FALSE); - //group key - rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0,_FALSE); - } - } -} - -void sreset_restore_network_station(_adapter *padapter) -{ - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - #if 0 - { - //======================================================= - // reset related register of Beacon control - - //set MSR to nolink - Set_MSR(padapter, _HW_STATE_NOLINK_); - // reject all data frame - rtw_write16(padapter, REG_RXFLTMAP2,0x00); - //reset TSF - rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); - - // disable update TSF - SetBcnCtrlReg(padapter, BIT(4), 0); - - //======================================================= - } - #endif - - rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure,_FALSE); - - { - u8 threshold; - #ifdef CONFIG_USB_HCI - // TH=1 => means that invalidate usb rx aggregation - // TH=0 => means that validate usb rx aggregation, use init value. - if(mlmepriv->htpriv.ht_option) { - if(padapter->registrypriv.wifi_spec==1) - threshold = 1; - else - threshold = 0; - rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } else { - threshold = 1; - rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } - #endif - } - - rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, NULL); - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - //disable dynamic functions, such as high power, DIG - /*rtw_phydm_func_disable_all(padapter);*/ - - rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); - - { - u8 join_type = 0; - rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - } - - Set_MSR(padapter, (pmlmeinfo->state & 0x3)); - - mlmeext_joinbss_event_callback(padapter, 1); - //restore Sequence No. - rtw_hal_set_hwreg(padapter, HW_VAR_RESTORE_HW_SEQ, 0); - - sreset_restore_security_station(padapter); -} - - -void sreset_restore_network_status(_adapter *padapter) -{ - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - sreset_restore_network_station(padapter); - } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - rtw_ap_restore_network(padapter); - } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - } else { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - } -} - -void sreset_stop_adapter(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - if (padapter == NULL) - return; - - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); - - rtw_netif_stop_queue(padapter->pnetdev); - - rtw_cancel_all_timer(padapter); - - /* TODO: OS and HCI independent */ - #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) - tasklet_kill(&pxmitpriv->xmit_tasklet); - #endif - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) - rtw_scan_abort(padapter); - - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) - { - rtw_set_to_roam(padapter, 0); - _rtw_join_timeout_handler(padapter); - } - -} - -void sreset_start_adapter(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - if (padapter == NULL) - return; - - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); - - if (check_fwstate(pmlmepriv, _FW_LINKED)) { - sreset_restore_network_status(padapter); - } - - /* TODO: OS and HCI independent */ - #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); - #endif - - if (is_primary_adapter(padapter)) - _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); - - rtw_netif_wake_queue(padapter->pnetdev); -} - -void sreset_reset(_adapter *padapter) -{ -#ifdef DBG_CONFIG_ERROR_RESET - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - _irqL irqL; - u32 start = rtw_get_current_time(); - struct dvobj_priv *psdpriv = padapter->dvobj; - struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; - - DBG_871X("%s\n", __FUNCTION__); - - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - - -#ifdef CONFIG_LPS - rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "SRESET"); -#endif//#ifdef CONFIG_LPS - - _enter_pwrlock(&pwrpriv->lock); - - psrtpriv->silent_reset_inprogress = _TRUE; - pwrpriv->change_rfpwrstate = rf_off; - - sreset_stop_adapter(padapter); - #ifdef CONFIG_CONCURRENT_MODE - sreset_stop_adapter(padapter->pbuddy_adapter); - #endif - - #ifdef CONFIG_IPS - _ips_enter(padapter); - _ips_leave(padapter); - #endif - - sreset_start_adapter(padapter); - #ifdef CONFIG_CONCURRENT_MODE - sreset_start_adapter(padapter->pbuddy_adapter); - #endif - - psrtpriv->silent_reset_inprogress = _FALSE; - - _exit_pwrlock(&pwrpriv->lock); - - DBG_871X("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start)); - pdbgpriv->dbg_sreset_cnt++; -#endif -} - +/****************************************************************************** + * + * 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 + * + * + ******************************************************************************/ + +#include +#include +#include + +void sreset_init_value(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + _rtw_mutex_init(&psrtpriv->silentreset_mutex); + psrtpriv->silent_reset_inprogress = _FALSE; + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time = 0; + psrtpriv->last_tx_complete_time = 0; +#endif +} +void sreset_reset_value(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time = 0; + psrtpriv->last_tx_complete_time = 0; +#endif +} + +u8 sreset_get_wifi_status(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + u8 status = WIFI_STATUS_SUCCESS; + u32 val32 = 0; + _irqL irqL; + if (psrtpriv->silent_reset_inprogress == _TRUE) + return status; + val32 = rtw_read32(padapter, REG_TXDMA_STATUS); + if (val32 == 0xeaeaeaea) + psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST; + else if (val32 != 0) { + RTW_INFO("txdmastatu(%x)\n", val32); + psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR; + } + + if (WIFI_STATUS_SUCCESS != psrtpriv->Wifi_Error_Status) { + RTW_INFO("==>%s error_status(0x%x)\n", __FUNCTION__, psrtpriv->Wifi_Error_Status); + status = (psrtpriv->Wifi_Error_Status & (~(USB_READ_PORT_FAIL | USB_WRITE_PORT_FAIL))); + } + RTW_INFO("==> %s wifi_status(0x%x)\n", __FUNCTION__, status); + + /* status restore */ + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + return status; +#else + return WIFI_STATUS_SUCCESS; +#endif +} + +void sreset_set_wifi_error_status(_adapter *padapter, u32 status) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = status; +#endif +} + +void sreset_set_trigger_point(_adapter *padapter, s32 tgp) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.dbg_trigger_point = tgp; +#endif +} + +bool sreset_inprogress(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_RESET) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + return pHalData->srestpriv.silent_reset_inprogress; +#else + return _FALSE; +#endif +} + +void sreset_restore_security_station(_adapter *padapter) +{ + u8 EntryId = 0; + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta; + struct security_priv *psecuritypriv = &(padapter->securitypriv); + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + + { + u8 val8; + + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) { + val8 = 0xcc; +#ifdef CONFIG_WAPI_SUPPORT + } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) { + /* Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. */ + val8 = 0x4c; +#endif + } else + val8 = 0xcf; + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + } + +#if 0 + if ((padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_)) { + + for (EntryId = 0; EntryId < 4; EntryId++) { + if (EntryId == psecuritypriv->dot11PrivacyKeyIndex) + rtw_set_key(padapter, &padapter->securitypriv, EntryId, 1, _FALSE); + else + rtw_set_key(padapter, &padapter->securitypriv, EntryId, 0, _FALSE); + } + + } else +#endif + if ((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) { + psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv)); + if (psta == NULL) { + /* DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail\n")); */ + } else { + /* pairwise key */ + rtw_setstakey_cmd(padapter, psta, UNICAST_KEY, _FALSE); + /* group key */ + rtw_set_key(padapter, &padapter->securitypriv, padapter->securitypriv.dot118021XGrpKeyid, 0, _FALSE); + } + } +} + +void sreset_restore_network_station(_adapter *padapter) +{ + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 doiqk = _FALSE; + +#if 0 + { + /* ======================================================= */ + /* reset related register of Beacon control */ + + /* set MSR to nolink */ + Set_MSR(padapter, _HW_STATE_NOLINK_); + /* reject all data frame */ + rtw_write16(padapter, REG_RXFLTMAP2, 0x00); + /* reset TSF */ + rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); + + /* disable update TSF */ + SetBcnCtrlReg(padapter, BIT(4), 0); + + /* ======================================================= */ + } +#endif + + rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure, _FALSE); + + { + u8 threshold; +#ifdef CONFIG_USB_HCI + /* TH=1 => means that invalidate usb rx aggregation */ + /* TH=0 => means that validate usb rx aggregation, use init value. */ + if (mlmepriv->htpriv.ht_option) { + if (padapter->registrypriv.wifi_spec == 1) + threshold = 1; + else + threshold = 0; + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } else { + threshold = 1; + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } +#endif + } + + doiqk = _TRUE; + rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK , &doiqk); + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + doiqk = _FALSE; + rtw_hal_set_hwreg(padapter , HW_VAR_DO_IQK , &doiqk); + /* disable dynamic functions, such as high power, DIG */ + /*rtw_phydm_func_disable_all(padapter);*/ + + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); + + { + u8 join_type = 0; + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + } + + Set_MSR(padapter, (pmlmeinfo->state & 0x3)); + + mlmeext_joinbss_event_callback(padapter, 1); + /* restore Sequence No. */ + rtw_hal_set_hwreg(padapter, HW_VAR_RESTORE_HW_SEQ, 0); + + sreset_restore_security_station(padapter); +} + + +void sreset_restore_network_status(_adapter *padapter) +{ + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { + RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + sreset_restore_network_station(padapter); + } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) { + RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + rtw_ap_restore_network(padapter); + } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) + RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + else + RTW_INFO(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); +} + +void sreset_stop_adapter(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + if (padapter == NULL) + return; + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + rtw_netif_stop_queue(padapter->pnetdev); + + rtw_cancel_all_timer(padapter); + + /* TODO: OS and HCI independent */ +#if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) + tasklet_kill(&pxmitpriv->xmit_tasklet); +#endif + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) + rtw_scan_abort(padapter); + + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) { + rtw_set_to_roam(padapter, 0); + _rtw_join_timeout_handler(padapter); + } + +} + +void sreset_start_adapter(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + if (padapter == NULL) + return; + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + if (check_fwstate(pmlmepriv, _FW_LINKED)) + sreset_restore_network_status(padapter); + + /* TODO: OS and HCI independent */ +#if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); +#endif + + if (is_primary_adapter(padapter)) + _set_timer(&adapter_to_dvobj(padapter)->dynamic_chk_timer, 2000); + + rtw_netif_wake_queue(padapter->pnetdev); +} + +void sreset_reset(_adapter *padapter) +{ +#ifdef DBG_CONFIG_ERROR_RESET + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + _irqL irqL; + u32 start = rtw_get_current_time(); + struct dvobj_priv *psdpriv = padapter->dvobj; + struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; + + RTW_INFO("%s\n", __FUNCTION__); + + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + +#ifdef CONFIG_LPS + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "SRESET"); +#endif/* #ifdef CONFIG_LPS */ + + _enter_pwrlock(&pwrpriv->lock); + + psrtpriv->silent_reset_inprogress = _TRUE; + pwrpriv->change_rfpwrstate = rf_off; + + rtw_mi_sreset_adapter_hdl(padapter, _FALSE);/*sreset_stop_adapter*/ +#ifdef CONFIG_IPS + _ips_enter(padapter); + _ips_leave(padapter); +#endif + rtw_mi_sreset_adapter_hdl(padapter, _TRUE);/*sreset_start_adapter*/ + + psrtpriv->silent_reset_inprogress = _FALSE; + + _exit_pwrlock(&pwrpriv->lock); + + RTW_INFO("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start)); + pdbgpriv->dbg_sreset_cnt++; +#endif +} diff --git a/core/rtw_sta_mgt.c b/core/rtw_sta_mgt.c old mode 100755 new mode 100644 index f731330..37f7953 --- a/core/rtw_sta_mgt.c +++ b/core/rtw_sta_mgt.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. @@ -21,44 +21,177 @@ #include -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) +#if defined(PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) -#error "Shall be Linux or Windows, but not both!\n" + #error "Shall be Linux or Windows, but not both!\n" #endif +bool test_st_match_rule(_adapter *adapter, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port) +{ + if (ntohs(*((u16 *)local_port)) == 5001 || ntohs(*((u16 *)remote_port)) == 5001) + return _TRUE; + return _FALSE; +} + +struct st_register test_st_reg = { + .s_proto = 0x06, + .rule = test_st_match_rule, +}; + +inline void rtw_st_ctl_init(struct st_ctl_t *st_ctl) +{ + _rtw_memset(st_ctl->reg, 0 , sizeof(struct st_register) * SESSION_TRACKER_REG_ID_NUM); + _rtw_init_queue(&st_ctl->tracker_q); +} + +inline void rtw_st_ctl_clear_tracker_q(struct st_ctl_t *st_ctl) +{ + _irqL irqL; + _list *plist, *phead; + struct session_tracker *st; + + _enter_critical_bh(&st_ctl->tracker_q.lock, &irqL); + phead = &st_ctl->tracker_q.queue; + plist = get_next(phead); + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { + st = LIST_CONTAINOR(plist, struct session_tracker, list); + plist = get_next(plist); + rtw_list_delete(&st->list); + rtw_mfree((u8 *)st, sizeof(struct session_tracker)); + } + _exit_critical_bh(&st_ctl->tracker_q.lock, &irqL); +} + +inline void rtw_st_ctl_deinit(struct st_ctl_t *st_ctl) +{ + rtw_st_ctl_clear_tracker_q(st_ctl); + _rtw_deinit_queue(&st_ctl->tracker_q); +} + +inline void rtw_st_ctl_register(struct st_ctl_t *st_ctl, u8 st_reg_id, struct st_register *reg) +{ + if (st_reg_id >= SESSION_TRACKER_REG_ID_NUM) { + rtw_warn_on(1); + return; + } + + st_ctl->reg[st_reg_id].s_proto = reg->s_proto; + st_ctl->reg[st_reg_id].rule = reg->rule; +} + +inline void rtw_st_ctl_unregister(struct st_ctl_t *st_ctl, u8 st_reg_id) +{ + int i; + + if (st_reg_id >= SESSION_TRACKER_REG_ID_NUM) { + rtw_warn_on(1); + return; + } + + st_ctl->reg[st_reg_id].s_proto = 0; + st_ctl->reg[st_reg_id].rule = NULL; + + /* clear tracker queue if no session trecker registered */ + for (i = 0; i < SESSION_TRACKER_REG_ID_NUM; i++) + if (st_ctl->reg[i].s_proto != 0) + break; + if (i >= SESSION_TRACKER_REG_ID_NUM) + rtw_st_ctl_clear_tracker_q(st_ctl); +} + +inline bool rtw_st_ctl_chk_reg_s_proto(struct st_ctl_t *st_ctl, u8 s_proto) +{ + bool ret = _FALSE; + int i; + + for (i = 0; i < SESSION_TRACKER_REG_ID_NUM; i++) { + if (st_ctl->reg[i].s_proto == s_proto) { + ret = _TRUE; + break; + } + } + + return ret; +} + +inline bool rtw_st_ctl_chk_reg_rule(struct st_ctl_t *st_ctl, _adapter *adapter, u8 *local_naddr, u8 *local_port, u8 *remote_naddr, u8 *remote_port) +{ + bool ret = _FALSE; + int i; + st_match_rule rule; + + for (i = 0; i < SESSION_TRACKER_REG_ID_NUM; i++) { + rule = st_ctl->reg[i].rule; + if (rule && rule(adapter, local_naddr, local_port, remote_naddr, remote_port) == _TRUE) { + ret = _TRUE; + break; + } + } + + return ret; +} + +#define SESSION_TRACKER_FMT IP_FMT":"PORT_FMT" "IP_FMT":"PORT_FMT" %u %d" +#define SESSION_TRACKER_ARG(st) IP_ARG(&(st)->local_naddr), PORT_ARG(&(st)->local_port), IP_ARG(&(st)->remote_naddr), PORT_ARG(&(st)->remote_port), (st)->status, rtw_get_passing_time_ms((st)->set_time) + +void dump_st_ctl(void *sel, struct st_ctl_t *st_ctl) +{ + int i; + _irqL irqL; + _list *plist, *phead; + struct session_tracker *st; + + if (!DBG_SESSION_TRACKER) + return; + + for (i = 0; i < SESSION_TRACKER_REG_ID_NUM; i++) + RTW_PRINT_SEL(sel, "reg%d: %u %p\n", i, st_ctl->reg[i].s_proto, st_ctl->reg[i].rule); + + _enter_critical_bh(&st_ctl->tracker_q.lock, &irqL); + phead = &st_ctl->tracker_q.queue; + plist = get_next(phead); + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { + st = LIST_CONTAINOR(plist, struct session_tracker, list); + plist = get_next(plist); + + RTW_PRINT_SEL(sel, SESSION_TRACKER_FMT"\n", SESSION_TRACKER_ARG(st)); + } + _exit_critical_bh(&st_ctl->tracker_q.lock, &irqL); + +} + void _rtw_init_stainfo(struct sta_info *psta); void _rtw_init_stainfo(struct sta_info *psta) { -_func_enter_; - _rtw_memset((u8 *)psta, 0, sizeof (struct sta_info)); + _rtw_memset((u8 *)psta, 0, sizeof(struct sta_info)); - _rtw_spinlock_init(&psta->lock); + _rtw_spinlock_init(&psta->lock); _rtw_init_listhead(&psta->list); _rtw_init_listhead(&psta->hash_list); - //_rtw_init_listhead(&psta->asoc_list); - //_rtw_init_listhead(&psta->sleep_list); - //_rtw_init_listhead(&psta->wakeup_list); + /* _rtw_init_listhead(&psta->asoc_list); */ + /* _rtw_init_listhead(&psta->sleep_list); */ + /* _rtw_init_listhead(&psta->wakeup_list); */ _rtw_init_queue(&psta->sleep_q); psta->sleepq_len = 0; _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); _rtw_init_sta_recv_priv(&psta->sta_recvpriv); - + #ifdef CONFIG_AP_MODE _rtw_init_listhead(&psta->asoc_list); _rtw_init_listhead(&psta->auth_list); - + psta->expire_to = 0; - + psta->flags = 0; - + psta->capability = 0; psta->bpairwise_key_installed = _FALSE; @@ -72,17 +205,18 @@ _func_enter_; psta->no_ht_set = 0; psta->ht_20mhz_set = 0; psta->ht_40mhz_intolerant = 0; -#endif +#endif #ifdef CONFIG_TX_MCAST2UNI psta->under_exist_checking = 0; -#endif // CONFIG_TX_MCAST2UNI - +#endif /* CONFIG_TX_MCAST2UNI */ + psta->keep_alive_trycnt = 0; -#endif // CONFIG_AP_MODE - -_func_exit_; +#endif /* CONFIG_AP_MODE */ + + rtw_st_ctl_init(&psta->st_ctl); + } @@ -91,30 +225,28 @@ u32 _rtw_init_sta_priv(struct sta_priv *pstapriv) struct sta_info *psta; s32 i; -_func_enter_; - pstapriv->pallocated_stainfo_buf = rtw_zvmalloc (sizeof(struct sta_info) * NUM_STA+ 4); - - if(!pstapriv->pallocated_stainfo_buf) + pstapriv->pallocated_stainfo_buf = rtw_zvmalloc(sizeof(struct sta_info) * NUM_STA + 4); + + if (!pstapriv->pallocated_stainfo_buf) return _FAIL; - pstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 - - ((SIZE_PTR)(pstapriv->pallocated_stainfo_buf ) & 3); + pstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 - + ((SIZE_PTR)(pstapriv->pallocated_stainfo_buf) & 3); _rtw_init_queue(&pstapriv->free_sta_queue); _rtw_spinlock_init(&pstapriv->sta_hash_lock); - - //_rtw_init_queue(&pstapriv->asoc_q); + + /* _rtw_init_queue(&pstapriv->asoc_q); */ pstapriv->asoc_sta_count = 0; _rtw_init_queue(&pstapriv->sleep_q); _rtw_init_queue(&pstapriv->wakeup_q); psta = (struct sta_info *)(pstapriv->pstainfo_buf); - - for(i = 0; i < NUM_STA; i++) - { + + for (i = 0; i < NUM_STA; i++) { _rtw_init_stainfo(psta); _rtw_init_listhead(&(pstapriv->sta_hash[i])); @@ -124,7 +256,7 @@ _func_enter_; psta++; } - + pstapriv->adhoc_expire_to = 4; /* 4 * 2 = 8 sec */ #ifdef CONFIG_AP_MODE @@ -138,34 +270,37 @@ _func_enter_; pstapriv->asoc_list_cnt = 0; pstapriv->auth_list_cnt = 0; - pstapriv->auth_to = 3; // 3*2 = 6 sec + pstapriv->auth_to = 3; /* 3*2 = 6 sec */ pstapriv->assoc_to = 3; - //pstapriv->expire_to = 900;// 900*2 = 1800 sec = 30 min, expire after no any traffic. - //pstapriv->expire_to = 30;// 30*2 = 60 sec = 1 min, expire after no any traffic. + /* pstapriv->expire_to = 900; */ /* 900*2 = 1800 sec = 30 min, expire after no any traffic. */ + /* pstapriv->expire_to = 30; */ /* 30*2 = 60 sec = 1 min, expire after no any traffic. */ #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK - pstapriv->expire_to = 3; // 3*2 = 6 sec + pstapriv->expire_to = 3; /* 3*2 = 6 sec */ #else - pstapriv->expire_to = 60;// 60*2 = 120 sec = 2 min, expire after no any traffic. -#endif -#ifdef CONFIG_ATMEL_RC_PATCH - _rtw_memset( pstapriv->atmel_rc_pattern, 0, ETH_ALEN); -#endif - pstapriv->max_num_sta = NUM_STA; - + pstapriv->expire_to = 60;/* 60*2 = 120 sec = 2 min, expire after no any traffic. */ #endif - -_func_exit_; +#ifdef CONFIG_ATMEL_RC_PATCH + _rtw_memset(pstapriv->atmel_rc_pattern, 0, ETH_ALEN); +#endif + pstapriv->max_num_sta = NUM_STA; + +#endif + +#if CONFIG_RTW_MACADDR_ACL + _rtw_init_queue(&(pstapriv->acl_list.acl_node_q)); +#endif + return _SUCCESS; - + } inline int rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta) { - int offset = (((u8 *)sta) - stapriv->pstainfo_buf)/sizeof(struct sta_info); + int offset = (((u8 *)sta) - stapriv->pstainfo_buf) / sizeof(struct sta_info); if (!stainfo_offset_valid(offset)) - DBG_871X("%s invalid offset(%d), out of range!!!", __func__, offset); + RTW_INFO("%s invalid offset(%d), out of range!!!", __func__, offset); return offset; } @@ -173,7 +308,7 @@ inline int rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta) inline struct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int offset) { if (!stainfo_offset_valid(offset)) - DBG_871X("%s invalid offset(%d), out of range!!!", __func__, offset); + RTW_INFO("%s invalid offset(%d), out of range!!!", __func__, offset); return (struct sta_info *)(stapriv->pstainfo_buf + offset * sizeof(struct sta_info)); } @@ -181,7 +316,6 @@ inline struct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int void _rtw_free_sta_xmit_priv_lock(struct sta_xmit_priv *psta_xmitpriv); void _rtw_free_sta_xmit_priv_lock(struct sta_xmit_priv *psta_xmitpriv) { -_func_enter_; _rtw_spinlock_free(&psta_xmitpriv->lock); @@ -189,73 +323,61 @@ _func_enter_; _rtw_spinlock_free(&(psta_xmitpriv->bk_q.sta_pending.lock)); _rtw_spinlock_free(&(psta_xmitpriv->vi_q.sta_pending.lock)); _rtw_spinlock_free(&(psta_xmitpriv->vo_q.sta_pending.lock)); -_func_exit_; } static void _rtw_free_sta_recv_priv_lock(struct sta_recv_priv *psta_recvpriv) { -_func_enter_; _rtw_spinlock_free(&psta_recvpriv->lock); _rtw_spinlock_free(&(psta_recvpriv->defrag_q.lock)); -_func_exit_; } void rtw_mfree_stainfo(struct sta_info *psta); void rtw_mfree_stainfo(struct sta_info *psta) { -_func_enter_; - if(&psta->lock != NULL) - _rtw_spinlock_free(&psta->lock); + if (&psta->lock != NULL) + _rtw_spinlock_free(&psta->lock); _rtw_free_sta_xmit_priv_lock(&psta->sta_xmitpriv); _rtw_free_sta_recv_priv_lock(&psta->sta_recvpriv); - -_func_exit_; + } -// this function is used to free the memory of lock || sema for all stainfos -void rtw_mfree_all_stainfo(struct sta_priv *pstapriv ); -void rtw_mfree_all_stainfo(struct sta_priv *pstapriv ) +/* this function is used to free the memory of lock || sema for all stainfos */ +void rtw_mfree_all_stainfo(struct sta_priv *pstapriv); +void rtw_mfree_all_stainfo(struct sta_priv *pstapriv) { _irqL irqL; _list *plist, *phead; struct sta_info *psta = NULL; - -_func_enter_; + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); phead = get_list_head(&pstapriv->free_sta_queue); plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info ,list); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info , list); plist = get_next(plist); rtw_mfree_stainfo(psta); } - + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); -_func_exit_; } void rtw_mfree_sta_priv_lock(struct sta_priv *pstapriv); void rtw_mfree_sta_priv_lock(struct sta_priv *pstapriv) { -#ifdef CONFIG_AP_MODE - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; -#endif - - rtw_mfree_all_stainfo(pstapriv); //be done before free sta_hash_lock + rtw_mfree_all_stainfo(pstapriv); /* be done before free sta_hash_lock */ _rtw_spinlock_free(&pstapriv->free_sta_queue.lock); @@ -266,60 +388,57 @@ void rtw_mfree_sta_priv_lock(struct sta_priv *pstapriv) #ifdef CONFIG_AP_MODE _rtw_spinlock_free(&pstapriv->asoc_list_lock); _rtw_spinlock_free(&pstapriv->auth_list_lock); - _rtw_spinlock_free(&pacl_list->acl_node_q.lock); #endif } u32 _rtw_free_sta_priv(struct sta_priv *pstapriv) { - _irqL irqL; + _irqL irqL; _list *phead, *plist; struct sta_info *psta = NULL; struct recv_reorder_ctrl *preorder_ctrl; - int index; + int index; -_func_enter_; - if(pstapriv){ + if (pstapriv) { - /* delete all reordering_ctrl_timer */ + /* delete all reordering_ctrl_timer */ _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) - { - int i; - psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + int i; + psta = LIST_CONTAINOR(plist, struct sta_info , hash_list); plist = get_next(plist); - for(i=0; i < 16 ; i++) - { + for (i = 0; i < 16 ; i++) { preorder_ctrl = &psta->recvreorder_ctrl[i]; - _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); + _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); } } } _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); /*===============================*/ - + rtw_mfree_sta_priv_lock(pstapriv); - if(pstapriv->pallocated_stainfo_buf) { - rtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info)*NUM_STA+4); - } +#if CONFIG_RTW_MACADDR_ACL + _rtw_deinit_queue(&(pstapriv->acl_list.acl_node_q)); +#endif + + if (pstapriv->pallocated_stainfo_buf) + rtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info) * NUM_STA + 4); } - -_func_exit_; + return _SUCCESS; } -//struct sta_info *rtw_alloc_stainfo(_queue *pfree_sta_queue, unsigned char *hwaddr) -struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) -{ +/* struct sta_info *rtw_alloc_stainfo(_queue *pfree_sta_queue, unsigned char *hwaddr) */ +struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) +{ _irqL irqL, irqL2; uint tmp_aid; s32 index; @@ -329,29 +448,25 @@ struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) struct recv_reorder_ctrl *preorder_ctrl; int i = 0; u16 wRxSeqInitialValue = 0xffff; - -_func_enter_; + pfree_sta_queue = &pstapriv->free_sta_queue; - //_enter_critical_bh(&(pfree_sta_queue->lock), &irqL); + /* _enter_critical_bh(&(pfree_sta_queue->lock), &irqL); */ _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); - if (_rtw_queue_empty(pfree_sta_queue) == _TRUE) - { - //_exit_critical_bh(&(pfree_sta_queue->lock), &irqL); + if (_rtw_queue_empty(pfree_sta_queue) == _TRUE) { + /* _exit_critical_bh(&(pfree_sta_queue->lock), &irqL); */ _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); psta = NULL; - } - else - { + } else { psta = LIST_CONTAINOR(get_next(&pfree_sta_queue->queue), struct sta_info, list); - + rtw_list_delete(&(psta->list)); - //_exit_critical_bh(&(pfree_sta_queue->lock), &irqL); - - tmp_aid = psta->aid; - + /* _exit_critical_bh(&(pfree_sta_queue->lock), &irqL); */ + + tmp_aid = psta->aid; + _rtw_init_stainfo(psta); psta->padapter = pstapriv->padapter; @@ -360,35 +475,29 @@ _func_enter_; index = wifi_mac_hash(hwaddr); - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("rtw_alloc_stainfo: index = %x", index)); - if(index >= NUM_STA){ - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("ERROR=> rtw_alloc_stainfo: index >= NUM_STA")); - psta= NULL; + if (index >= NUM_STA) { + psta = NULL; goto exit; } phash_list = &(pstapriv->sta_hash[index]); - //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + /* _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); */ rtw_list_insert_tail(&psta->hash_list, phash_list); - pstapriv->asoc_sta_count ++ ; + pstapriv->asoc_sta_count++; - //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + /* _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); */ -// Commented by Albert 2009/08/13 -// For the SMC router, the sequence number of first packet of WPS handshake will be 0. -// In this case, this packet will be dropped by recv_decache function if we use the 0x00 as the default value for tid_rxseq variable. -// So, we initialize the tid_rxseq variable as the 0xffff. + /* Commented by Albert 2009/08/13 + * For the SMC router, the sequence number of first packet of WPS handshake will be 0. + * In this case, this packet will be dropped by recv_decache function if we use the 0x00 as the default value for tid_rxseq variable. + * So, we initialize the tid_rxseq variable as the 0xffff. */ - for( i = 0; i < 16; i++ ) - { - _rtw_memcpy( &psta->sta_recvpriv.rxcache.tid_rxseq[ i ], &wRxSeqInitialValue, 2 ); - } + for (i = 0; i < 16; i++) + _rtw_memcpy(&psta->sta_recvpriv.rxcache.tid_rxseq[i], &wRxSeqInitialValue, 2); - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("alloc number_%d stainfo with hwaddr = %x %x %x %x %x %x \n", - pstapriv->asoc_sta_count , hwaddr[0], hwaddr[1], hwaddr[2],hwaddr[3],hwaddr[4],hwaddr[5])); init_addba_retry_timer(pstapriv->padapter, psta); #ifdef CONFIG_IEEE80211W @@ -396,25 +505,24 @@ _func_enter_; #endif /* CONFIG_IEEE80211W */ #ifdef CONFIG_TDLS rtw_init_tdls_timer(pstapriv->padapter, psta); -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ - //for A-MPDU Rx reordering buffer control - for(i=0; i < 16 ; i++) - { + /* for A-MPDU Rx reordering buffer control */ + for (i = 0; i < 16 ; i++) { preorder_ctrl = &psta->recvreorder_ctrl[i]; preorder_ctrl->padapter = pstapriv->padapter; - + preorder_ctrl->enable = _FALSE; - + preorder_ctrl->indicate_seq = 0xffff; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq); - #endif - preorder_ctrl->wend_b= 0xffff; - //preorder_ctrl->wsize_b = (NR_RECVBUFF-2); - preorder_ctrl->wsize_b = 64;//64; +#ifdef DBG_RX_SEQ + RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); +#endif + 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); @@ -423,7 +531,7 @@ _func_enter_; } - //init for DM + /* init for DM */ psta->rssi_stat.UndecoratedSmoothedPWDB = (-1); psta->rssi_stat.UndecoratedSmoothedCCK = (-1); #ifdef CONFIG_ATMEL_RC_PATCH @@ -431,17 +539,16 @@ _func_enter_; #endif /* init for the sequence number of received management frame */ psta->RxMgmtFrameSeqNum = 0xffff; + psta->ra_rpt_linked = _FALSE; - //alloc mac id for non-bc/mc station, rtw_alloc_macid(pstapriv->padapter, psta); } - + exit: _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); -_func_exit_; return psta; @@ -449,28 +556,26 @@ _func_exit_; } -// using pstapriv->sta_hash_lock to protect +/* using pstapriv->sta_hash_lock to protect */ u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta) -{ +{ int i; _irqL irqL0; _queue *pfree_sta_queue; struct recv_reorder_ctrl *preorder_ctrl; struct sta_xmit_priv *pstaxmitpriv; - struct xmit_priv *pxmitpriv= &padapter->xmitpriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct sta_priv *pstapriv = &padapter->stapriv; struct hw_xmit *phwxmit; int pending_qcnt[4]; -_func_enter_; - + if (psta == NULL) goto exit; _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0); rtw_list_delete(&psta->hash_list); - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("\n free number_%d stainfo with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5])); - pstapriv->asoc_sta_count --; + pstapriv->asoc_sta_count--; _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0); @@ -482,64 +587,64 @@ _func_enter_; pstaxmitpriv = &psta->sta_xmitpriv; - - //rtw_list_delete(&psta->sleep_list); - - //rtw_list_delete(&psta->wakeup_list); - + + /* rtw_list_delete(&psta->sleep_list); */ + + /* rtw_list_delete(&psta->wakeup_list); */ + _enter_critical_bh(&pxmitpriv->lock, &irqL0); - + rtw_free_xmitframe_queue(pxmitpriv, &psta->sleep_q); psta->sleepq_len = 0; - - //vo - //_enter_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); - rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vo_q.sta_pending); + + /* vo */ + /* _enter_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); */ + rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->vo_q.sta_pending); rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending)); phwxmit = pxmitpriv->hwxmits; phwxmit->accnt -= pstaxmitpriv->vo_q.qcnt; pending_qcnt[0] = pstaxmitpriv->vo_q.qcnt; pstaxmitpriv->vo_q.qcnt = 0; - //_exit_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); + /* _exit_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); */ - //vi - //_enter_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); - rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vi_q.sta_pending); + /* vi */ + /* _enter_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); */ + rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->vi_q.sta_pending); rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending)); - phwxmit = pxmitpriv->hwxmits+1; + phwxmit = pxmitpriv->hwxmits + 1; phwxmit->accnt -= pstaxmitpriv->vi_q.qcnt; pending_qcnt[1] = pstaxmitpriv->vi_q.qcnt; pstaxmitpriv->vi_q.qcnt = 0; - //_exit_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); + /* _exit_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); */ - //be - //_enter_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); - rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->be_q.sta_pending); + /* be */ + /* _enter_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); */ + rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->be_q.sta_pending); rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending)); - phwxmit = pxmitpriv->hwxmits+2; + phwxmit = pxmitpriv->hwxmits + 2; phwxmit->accnt -= pstaxmitpriv->be_q.qcnt; pending_qcnt[2] = pstaxmitpriv->be_q.qcnt; pstaxmitpriv->be_q.qcnt = 0; - //_exit_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); - - //bk - //_enter_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); - rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->bk_q.sta_pending); + /* _exit_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); */ + + /* bk */ + /* _enter_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); */ + rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->bk_q.sta_pending); rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending)); - phwxmit = pxmitpriv->hwxmits+3; + phwxmit = pxmitpriv->hwxmits + 3; phwxmit->accnt -= pstaxmitpriv->bk_q.qcnt; pending_qcnt[3] = pstaxmitpriv->bk_q.qcnt; pstaxmitpriv->bk_q.qcnt = 0; - //_exit_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); + /* _exit_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); */ rtw_os_wake_queue_at_free_stainfo(padapter, pending_qcnt); _exit_critical_bh(&pxmitpriv->lock, &irqL0); - - - // re-init sta_info; 20061114 // will be init in alloc_stainfo - //_rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); - //_rtw_init_sta_recv_priv(&psta->sta_recvpriv); + + + /* re-init sta_info; 20061114 */ /* will be init in alloc_stainfo */ + /* _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); */ + /* _rtw_init_sta_recv_priv(&psta->sta_recvpriv); */ #ifdef CONFIG_IEEE80211W _cancel_timer_ex(&psta->dot11w_expire_timer); #endif /* CONFIG_IEEE80211W */ @@ -548,65 +653,63 @@ _func_enter_; #ifdef CONFIG_TDLS psta->tdls_sta_state = TDLS_STATE_NONE; rtw_free_tdls_timer(psta); -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ - //for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer - for(i=0; i < 16 ; i++) - { + /* for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer */ + for (i = 0; i < 16 ; i++) { _irqL irqL; _list *phead, *plist; union recv_frame *prframe; _queue *ppending_recvframe_queue; _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; - - preorder_ctrl = &psta->recvreorder_ctrl[i]; - - _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); - + preorder_ctrl = &psta->recvreorder_ctrl[i]; + + _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); + + ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; _enter_critical_bh(&ppending_recvframe_queue->lock, &irqL); - phead = get_list_head(ppending_recvframe_queue); + phead = get_list_head(ppending_recvframe_queue); plist = get_next(phead); - - while(!rtw_is_list_empty(phead)) - { + + while (!rtw_is_list_empty(phead)) { prframe = LIST_CONTAINOR(plist, union recv_frame, u); - + plist = get_next(plist); - + rtw_list_delete(&(prframe->u.hdr.list)); rtw_free_recvframe(prframe, pfree_recv_queue); } _exit_critical_bh(&ppending_recvframe_queue->lock, &irqL); - + } - if (!(psta->state & WIFI_AP_STATE)) + if (!((psta->state & WIFI_AP_STATE) || MacAddr_isBcst(psta->hwaddr))) rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _FALSE); - - //release mac id for non-bc/mc station, + + /* release mac id for non-bc/mc station, */ rtw_release_macid(pstapriv->padapter, psta); #ifdef CONFIG_AP_MODE -/* - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL0); - rtw_list_delete(&psta->asoc_list); - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL0); -*/ + /* + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL0); + rtw_list_delete(&psta->asoc_list); + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL0); + */ _enter_critical_bh(&pstapriv->auth_list_lock, &irqL0); if (!rtw_is_list_empty(&psta->auth_list)) { rtw_list_delete(&psta->auth_list); pstapriv->auth_list_cnt--; } _exit_critical_bh(&pstapriv->auth_list_lock, &irqL0); - + psta->expire_to = 0; #ifdef CONFIG_ATMEL_RC_PATCH psta->flag_atmel_rc = 0; @@ -623,43 +726,43 @@ _func_enter_; psta->has_legacy_ac = 0; #ifdef CONFIG_NATIVEAP_MLME - - pstapriv->sta_dz_bitmap &=~BIT(psta->aid); - pstapriv->tim_bitmap &=~BIT(psta->aid); - //rtw_indicate_sta_disassoc_event(padapter, psta); + pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); + pstapriv->tim_bitmap &= ~BIT(psta->aid); - if ((psta->aid >0)&&(pstapriv->sta_aid[psta->aid - 1] == psta)) - { + /* rtw_indicate_sta_disassoc_event(padapter, psta); */ + + if ((psta->aid > 0) && (pstapriv->sta_aid[psta->aid - 1] == psta)) { pstapriv->sta_aid[psta->aid - 1] = NULL; psta->aid = 0; - } - -#endif // CONFIG_NATIVEAP_MLME + } + +#endif /* CONFIG_NATIVEAP_MLME */ #ifdef CONFIG_TX_MCAST2UNI psta->under_exist_checking = 0; -#endif // CONFIG_TX_MCAST2UNI +#endif /* CONFIG_TX_MCAST2UNI */ -#endif // CONFIG_AP_MODE +#endif /* CONFIG_AP_MODE */ - _rtw_spinlock_free(&psta->lock); + rtw_st_ctl_deinit(&psta->st_ctl); - //_enter_critical_bh(&(pfree_sta_queue->lock), &irqL0); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0); + _rtw_spinlock_free(&psta->lock); + + /* _enter_critical_bh(&(pfree_sta_queue->lock), &irqL0); */ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0); rtw_list_insert_tail(&psta->list, get_list_head(pfree_sta_queue)); _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0); - //_exit_critical_bh(&(pfree_sta_queue->lock), &irqL0); + /* _exit_critical_bh(&(pfree_sta_queue->lock), &irqL0); */ exit: - -_func_exit_; + return _SUCCESS; - + } -// free all stainfo which in sta_hash[all] +/* free all stainfo which in sta_hash[all] */ void rtw_free_all_stainfo(_adapter *padapter) { _irqL irqL; @@ -667,55 +770,47 @@ void rtw_free_all_stainfo(_adapter *padapter) s32 index; struct sta_info *psta = NULL; struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info* pbcmc_stainfo =rtw_get_bcmc_stainfo( padapter); + struct sta_info *pbcmc_stainfo = rtw_get_bcmc_stainfo(padapter); u8 free_sta_num = 0; char free_sta_list[NUM_STA]; int stainfo_offset; - -_func_enter_; - if(pstapriv->asoc_sta_count==1) + + if (pstapriv->asoc_sta_count == 1) goto exit; _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) - { - psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info , hash_list); plist = get_next(plist); - if(pbcmc_stainfo!=psta) - { + if (pbcmc_stainfo != psta) { rtw_list_delete(&psta->hash_list); - //rtw_free_stainfo(padapter , psta); + /* rtw_free_stainfo(padapter , psta); */ stainfo_offset = rtw_stainfo_offset(pstapriv, psta); - if (stainfo_offset_valid(stainfo_offset)) { + if (stainfo_offset_valid(stainfo_offset)) free_sta_list[free_sta_num++] = stainfo_offset; - } - } - + } + } } - + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - for (index = 0; index < free_sta_num; index++) - { + for (index = 0; index < free_sta_num; index++) { psta = rtw_get_stainfo_by_offset(pstapriv, free_sta_list[index]); rtw_free_stainfo(padapter , psta); } - -exit: - -_func_exit_; +exit: + return; } /* any station allocated can be searched by hash list */ @@ -727,156 +822,152 @@ struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) _list *plist, *phead; struct sta_info *psta = NULL; - + u32 index; u8 *addr; - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -_func_enter_; - if(hwaddr==NULL) + if (hwaddr == NULL) return NULL; - - if(IS_MCAST(hwaddr)) - { + + if (IS_MCAST(hwaddr)) addr = bc_addr; - } else - { addr = hwaddr; - } index = wifi_mac_hash(addr); _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - + 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); - - if ((_rtw_memcmp(psta->hwaddr, addr, ETH_ALEN))== _TRUE) - { // if found the matched address + + if ((_rtw_memcmp(psta->hwaddr, addr, ETH_ALEN)) == _TRUE) { + /* if found the matched address */ break; } - psta=NULL; + psta = NULL; plist = get_next(plist); } _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); -_func_exit_; return psta; - + } -u32 rtw_init_bcmc_stainfo(_adapter* padapter) +u32 rtw_init_bcmc_stainfo(_adapter *padapter) { - struct sta_info *psta; + struct sta_info *psta; struct tx_servq *ptxservq; - u32 res=_SUCCESS; - NDIS_802_11_MAC_ADDRESS bcast_addr= {0xff,0xff,0xff,0xff,0xff,0xff}; - + u32 res = _SUCCESS; + NDIS_802_11_MAC_ADDRESS bcast_addr = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + struct sta_priv *pstapriv = &padapter->stapriv; - //_queue *pstapending = &padapter->xmitpriv.bm_pending; - -_func_enter_; + /* _queue *pstapending = &padapter->xmitpriv.bm_pending; */ + psta = rtw_alloc_stainfo(pstapriv, bcast_addr); - - if(psta==NULL){ - res=_FAIL; - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("rtw_alloc_stainfo fail")); + + if (psta == NULL) { + res = _FAIL; goto exit; } #ifdef CONFIG_BEAMFORMING psta->txbf_gid = 63; psta->txbf_paid = 0; #endif - ptxservq= &(psta->sta_xmitpriv.be_q); + ptxservq = &(psta->sta_xmitpriv.be_q); -/* - _enter_critical(&pstapending->lock, &irqL0); + /* + _enter_critical(&pstapending->lock, &irqL0); - if (rtw_is_list_empty(&ptxservq->tx_pending)) - rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(pstapending)); + if (rtw_is_list_empty(&ptxservq->tx_pending)) + rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(pstapending)); + + _exit_critical(&pstapending->lock, &irqL0); + */ - _exit_critical(&pstapending->lock, &irqL0); -*/ - exit: -_func_exit_; return _SUCCESS; } -struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter) +struct sta_info *rtw_get_bcmc_stainfo(_adapter *padapter) { - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; -_func_enter_; - psta = rtw_get_stainfo(pstapriv, bc_addr); -_func_exit_; + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + psta = rtw_get_stainfo(pstapriv, bc_addr); return psta; } -u8 rtw_access_ctrl(_adapter *padapter, u8 *mac_addr) +#if CONFIG_RTW_MACADDR_ACL +const char *const _acl_mode_str[] = { + "DISABLED", + "ACCEPT_UNLESS_LISTED", + "DENY_UNLESS_LISTED", +}; + +u8 rtw_access_ctrl(_adapter *adapter, u8 *mac_addr) { u8 res = _TRUE; -#ifdef CONFIG_AP_MODE _irqL irqL; - _list *plist, *phead; - struct rtw_wlan_acl_node *paclnode; + _list *list, *head; + struct rtw_wlan_acl_node *acl_node; u8 match = _FALSE; - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); + struct sta_priv *stapriv = &adapter->stapriv; + struct wlan_acl_pool *acl = &stapriv->acl_list; + _queue *acl_node_q = &acl->acl_node_q; - if(_rtw_memcmp(paclnode->addr, mac_addr, ETH_ALEN)) - { - if(paclnode->valid == _TRUE) - { + _enter_critical_bh(&(acl_node_q->lock), &irqL); + head = get_list_head(acl_node_q); + list = get_next(head); + while (rtw_end_of_queue_search(head, list) == _FALSE) { + acl_node = LIST_CONTAINOR(list, struct rtw_wlan_acl_node, list); + list = get_next(list); + + if (_rtw_memcmp(acl_node->addr, mac_addr, ETH_ALEN)) { + if (acl_node->valid == _TRUE) { match = _TRUE; break; } - } - } - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - - if(pacl_list->mode == 1)//accept unless in deny list - { - res = (match == _TRUE) ? _FALSE:_TRUE; - } - else if(pacl_list->mode == 2)//deny unless in accept list - { - res = (match == _TRUE) ? _TRUE:_FALSE; + } } + _exit_critical_bh(&(acl_node_q->lock), &irqL); + + if (acl->mode == RTW_ACL_MODE_ACCEPT_UNLESS_LISTED) + res = (match == _TRUE) ? _FALSE : _TRUE; + else if (acl->mode == RTW_ACL_MODE_DENY_UNLESS_LISTED) + res = (match == _TRUE) ? _TRUE : _FALSE; else - { - res = _TRUE; - } - -#endif + res = _TRUE; return res; - } +void dump_macaddr_acl(void *sel, _adapter *adapter) +{ + struct sta_priv *stapriv = &adapter->stapriv; + struct wlan_acl_pool *acl = &stapriv->acl_list; + int i; + + RTW_PRINT_SEL(sel, "mode:%s(%d)\n", acl_mode_str(acl->mode), acl->mode); + RTW_PRINT_SEL(sel, "num:%d/%d\n", acl->num, NUM_ACL); + for (i = 0; i < NUM_ACL; i++) { + if (acl->aclnode[i].valid == _FALSE) + continue; + RTW_PRINT_SEL(sel, MAC_FMT"\n", MAC_ARG(acl->aclnode[i].addr)); + } +} +#endif /* CONFIG_RTW_MACADDR_ACL */ diff --git a/core/rtw_tdls.c b/core/rtw_tdls.c old mode 100755 new mode 100644 index 422fe52..be31530 --- a/core/rtw_tdls.c +++ b/core/rtw_tdls.c @@ -1,480 +1,497 @@ -/****************************************************************************** - * - * 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 - * - * - ******************************************************************************/ -#define _RTW_TDLS_C_ - -#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) -{ - 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->watchdog_count = 0; - ptdlsinfo->dev_discovered = _FALSE; - -#ifdef CONFIG_WFD - ptdlsinfo->wfd_info = &padapter->wfd_info; -#endif /* ONFIG_WFD */ -} - -int rtw_init_tdls_info(_adapter* padapter) -{ - int res = _SUCCESS; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - - 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); - - return res; - -} - -void rtw_free_tdls_info(struct tdls_info *ptdlsinfo) -{ - _rtw_spinlock_free(&ptdlsinfo->cmd_lock); - _rtw_spinlock_free(&ptdlsinfo->hdl_lock); - - _rtw_memset(ptdlsinfo, 0, sizeof(struct tdls_info) ); - -} - -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; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - 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; - - 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); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - 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, 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_QOS_DATA_NULL); - - 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) - ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); - else { - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; - } - -exit: - return ret; - -} - +/****************************************************************************** + * + * 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 + * + * + ******************************************************************************/ +#define _RTW_TDLS_C_ + +#include +#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) +{ + 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 = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + 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->watchdog_count = 0; + ptdlsinfo->dev_discovered = _FALSE; + +#ifdef CONFIG_WFD + ptdlsinfo->wfd_info = &padapter->wfd_info; +#endif +} + +int rtw_init_tdls_info(_adapter *padapter) +{ + int res = _SUCCESS; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + 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); + + return res; + +} + +void rtw_free_tdls_info(struct tdls_info *ptdlsinfo) +{ + _rtw_spinlock_free(&ptdlsinfo->cmd_lock); + _rtw_spinlock_free(&ptdlsinfo->hdl_lock); + + _rtw_memset(ptdlsinfo, 0, sizeof(struct tdls_info)); + +} + +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; +} + +u8 rtw_tdls_is_setup_allowed(_adapter *padapter) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + if (ptdlsinfo->ap_prohibited == _TRUE) + return _FALSE; + + return _TRUE; +} + +#ifdef CONFIG_TDLS_CH_SW +u8 rtw_tdls_is_chsw_allowed(_adapter *padapter) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + if (ptdlsinfo->ch_switch_prohibited == _TRUE) + return _FALSE; + + if (padapter->registrypriv.wifi_spec == 0) + return _FALSE; + + return _TRUE; +} +#endif + +int _issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ack) +{ + int ret = _FAIL; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + 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); + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + 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); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + 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, 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_QOS_DATA_NULL); + + 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) + ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); + else { + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; + } + +exit: + return ret; + +} + /* *wait_ms == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT *wait_ms > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX *try_cnt means the maximal TX count to try */ -int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms) -{ - int ret; - int i = 0; - u32 start = rtw_get_current_time(); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - #if 0 - psta = rtw_get_stainfo(&padapter->stapriv, da); - if (psta) { - if (power_mode) - rtw_hal_macid_sleep(padapter, psta->mac_id); - else - rtw_hal_macid_wakeup(padapter, psta->mac_id); - } else { - DBG_871X(FUNC_ADPT_FMT ": Can't find sta info for " MAC_FMT ", skip macid %s!!\n", - FUNC_ADPT_ARG(padapter), MAC_ARG(da), power_mode?"sleep":"wakeup"); - rtw_warn_on(1); - } - #endif - - do { - ret = _issue_nulldata_to_TDLS_peer_STA(padapter, da, power_mode, wait_ms>0 ? _TRUE : _FALSE); - - i++; - - if (RTW_CANNOT_RUN(padapter)) - break; - - if (i < try_cnt && wait_ms > 0 && ret == _FAIL) - rtw_msleep_os(wait_ms); - - } while ((i < try_cnt) && (ret==_FAIL || wait_ms==0)); - - if (ret != _FAIL) { - ret = _SUCCESS; - #ifndef DBG_XMIT_ACK - goto exit; - #endif - } - - if (try_cnt && wait_ms) { - if (da) - DBG_871X(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d in %u ms\n", - FUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter), - ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start)); - else - DBG_871X(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n", - FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter), - ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start)); - } -exit: - return ret; -} - -void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct sta_priv *pstapriv = &padapter->stapriv; - _irqL irqL; - - /* free peer sta_info */ - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if (ptdlsinfo->sta_cnt != 0) - ptdlsinfo->sta_cnt--; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - /* -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 */ - rtw_clearstakey_cmd(padapter, ptdls_sta, _TRUE); - - if (ptdlsinfo->sta_cnt == 0) { - rtw_tdls_cmd(padapter, NULL, TDLS_RS_RCR); - ptdlsinfo->link_established = _FALSE; - } - else - DBG_871X("Remain tdls sta:%02x\n", ptdlsinfo->sta_cnt); - - rtw_free_stainfo(padapter, ptdls_sta); - -} - - -/* TDLS encryption(if needed) will always be CCMP */ -void rtw_tdls_set_key(_adapter *padapter, struct sta_info *ptdls_sta) -{ - ptdls_sta->dot118021XPrivacy=_AES_; - rtw_setstakey_cmd(padapter, ptdls_sta, TDLS_KEY, _TRUE); -} - -#ifdef CONFIG_80211N_HT -void rtw_tdls_process_ht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - u8 max_AMPDU_len, min_MPDU_spacing; - u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0; - - /* 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)) { - 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) { - ptdls_sta->htpriv.ht_option = _TRUE; - ptdls_sta->qos_option = _TRUE; - } else { - ptdls_sta->htpriv.ht_option = _FALSE; - 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) - ptdls_sta->htpriv.ampdu_enable = _TRUE; - - /* AMPDU Parameters field */ - /* Get MIN of MAX AMPDU Length Exp */ - if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (data[2] & 0x3)) - max_AMPDU_len = (data[2] & 0x3); - else - max_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3); - /* Get MAX of MIN MPDU Start Spacing */ - if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (data[2] & 0x1c)) - min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c); - else - min_MPDU_spacing = (data[2] & 0x1c); - ptdls_sta->htpriv.rx_ampdu_min_spacing = max_AMPDU_len | min_MPDU_spacing; - - /* 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)) - 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)) { - 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; - } - - /* Config LDPC Coding Capability */ - if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAP_ELE_LDPC_CAP(data)) { - SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX)); - DBG_871X("Enable HT Tx LDPC!\n"); - } - ptdls_sta->htpriv.ldpc_cap = cur_ldpc_cap; +int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms) +{ + int ret; + int i = 0; + u32 start = rtw_get_current_time(); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - /* Config STBC setting */ - if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_RX_STBC(data)) { - SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX)); - DBG_871X("Enable HT Tx STBC!\n"); +#if 0 + psta = rtw_get_stainfo(&padapter->stapriv, da); + if (psta) { + if (power_mode) + rtw_hal_macid_sleep(padapter, psta->mac_id); + else + rtw_hal_macid_wakeup(padapter, psta->mac_id); + } else { + RTW_INFO(FUNC_ADPT_FMT ": Can't find sta info for " MAC_FMT ", skip macid %s!!\n", + FUNC_ADPT_ARG(padapter), MAC_ARG(da), power_mode ? "sleep" : "wakeup"); + rtw_warn_on(1); + } +#endif + + do { + ret = _issue_nulldata_to_TDLS_peer_STA(padapter, da, power_mode, wait_ms > 0 ? _TRUE : _FALSE); + + i++; + + if (RTW_CANNOT_RUN(padapter)) + break; + + if (i < try_cnt && wait_ms > 0 && ret == _FAIL) + rtw_msleep_os(wait_ms); + + } while ((i < try_cnt) && (ret == _FAIL || wait_ms == 0)); + + if (ret != _FAIL) { + ret = _SUCCESS; +#ifndef DBG_XMIT_ACK + goto exit; +#endif + } + + if (try_cnt && wait_ms) { + if (da) + RTW_INFO(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d in %u ms\n", + FUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter), + ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); + else + RTW_INFO(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n", + FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter), + ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start)); + } +exit: + return ret; +} + +void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct sta_priv *pstapriv = &padapter->stapriv; + _irqL irqL; + + /* free peer sta_info */ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if (ptdlsinfo->sta_cnt != 0) + ptdlsinfo->sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + /* -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 */ + rtw_clearstakey_cmd(padapter, ptdls_sta, _TRUE); + + if (ptdlsinfo->sta_cnt == 0) { + rtw_tdls_cmd(padapter, NULL, TDLS_RS_RCR); + ptdlsinfo->link_established = _FALSE; + } else + RTW_INFO("Remain tdls sta:%02x\n", ptdlsinfo->sta_cnt); + + rtw_free_stainfo(padapter, ptdls_sta); + +} + + +/* TDLS encryption(if needed) will always be CCMP */ +void rtw_tdls_set_key(_adapter *padapter, struct sta_info *ptdls_sta) +{ + ptdls_sta->dot118021XPrivacy = _AES_; + rtw_setstakey_cmd(padapter, ptdls_sta, TDLS_KEY, _TRUE); +} + +#ifdef CONFIG_80211N_HT +void rtw_tdls_process_ht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 max_AMPDU_len, min_MPDU_spacing; + u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0; + + /* 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)) { + 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) { + ptdls_sta->htpriv.ht_option = _TRUE; + ptdls_sta->qos_option = _TRUE; + } else { + ptdls_sta->htpriv.ht_option = _FALSE; + ptdls_sta->qos_option = _FALSE; } - ptdls_sta->htpriv.stbc_cap = cur_stbc_cap; + } + + /* 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; + + /* AMPDU Parameters field */ + /* Get MIN of MAX AMPDU Length Exp */ + if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (data[2] & 0x3)) + max_AMPDU_len = (data[2] & 0x3); + else + max_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3); + /* Get MAX of MIN MPDU Start Spacing */ + if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (data[2] & 0x1c)) + min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c); + else + min_MPDU_spacing = (data[2] & 0x1c); + ptdls_sta->htpriv.rx_ampdu_min_spacing = max_AMPDU_len | min_MPDU_spacing; + + /* 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)) + 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)) { + 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; + } + + /* Config LDPC Coding Capability */ + if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAP_ELE_LDPC_CAP(data)) { + SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX)); + RTW_INFO("Enable HT Tx LDPC!\n"); + } + ptdls_sta->htpriv.ldpc_cap = cur_ldpc_cap; + + /* Config STBC setting */ + if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_RX_STBC(data)) { + SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX)); + RTW_INFO("Enable HT Tx STBC!\n"); + } + ptdls_sta->htpriv.stbc_cap = cur_stbc_cap; #ifdef CONFIG_BEAMFORMING - /* Config Tx beamforming setting */ - if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && - GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(data)) { + /* Config Tx beamforming setting */ + if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && + GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(data)) SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE); - } if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) && - GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(data)) { + GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(data)) SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE); - } - ptdls_sta->htpriv.beamform_cap = cur_beamform_cap; - if (cur_beamform_cap) - DBG_871X("Client HT Beamforming Cap = 0x%02X\n", cur_beamform_cap); -#endif /* CONFIG_BEAMFORMING */ - } - -} - -u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) -{ - rtw_ht_use_default_setting(padapter); - - rtw_restructure_ht_ie(padapter, NULL, pframe, 0, &(pattrib->pktlen), padapter->mlmeextpriv.cur_channel); - - return pframe + pattrib->pktlen; -} -#endif - -#ifdef CONFIG_80211AC_VHT -void rtw_tdls_process_vht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; - u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0, rf_type = RF_1T1R; - u8 *pcap_mcs; - u8 vht_mcs[2]; - - _rtw_memset(&ptdls_sta->vhtpriv, 0, sizeof(struct vht_priv)); - if (data && Length == 12) { - ptdls_sta->flags |= WLAN_STA_VHT; + ptdls_sta->htpriv.beamform_cap = cur_beamform_cap; + if (cur_beamform_cap) + RTW_INFO("Client HT Beamforming Cap = 0x%02X\n", cur_beamform_cap); +#endif /* CONFIG_BEAMFORMING */ + } - _rtw_memcpy(ptdls_sta->vhtpriv.vht_cap, data, 12); - -#if 0 - if (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1) { +} + +u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + rtw_ht_use_default_setting(padapter); + + rtw_restructure_ht_ie(padapter, NULL, pframe, 0, &(pattrib->pktlen), padapter->mlmeextpriv.cur_channel); + + return pframe + pattrib->pktlen; +} +#endif + +#ifdef CONFIG_80211AC_VHT +void rtw_tdls_process_vht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; + u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0, rf_type = RF_1T1R; + u8 *pcap_mcs; + u8 vht_mcs[2]; + + _rtw_memset(&ptdls_sta->vhtpriv, 0, sizeof(struct vht_priv)); + if (data && Length == 12) { + ptdls_sta->flags |= WLAN_STA_VHT; + + _rtw_memcpy(ptdls_sta->vhtpriv.vht_cap, data, 12); + +#if 0 + if (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1) _rtw_memcpy(&pstat->vhtpriv.vht_op_mode_notify, elems.vht_op_mode_notify, 1); - } else /* for Frame without Operating Mode notify ie; default: 80M */ { + else /* for Frame without Operating Mode notify ie; default: 80M */ pstat->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80; - } -#else - ptdls_sta->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80; -#endif - } else - ptdls_sta->flags &= ~WLAN_STA_VHT; - - if (ptdls_sta->flags & WLAN_STA_VHT) { - if (padapter->registrypriv.vht_enable == _TRUE) - ptdls_sta->vhtpriv.vht_option = _TRUE; - else - ptdls_sta->vhtpriv.vht_option = _FALSE; - } - - /* B4 Rx LDPC */ - if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) && - GET_VHT_CAPABILITY_ELE_RX_LDPC(data)) { +#else + ptdls_sta->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80; +#endif + } else + ptdls_sta->flags &= ~WLAN_STA_VHT; + + if (ptdls_sta->flags & WLAN_STA_VHT) { + if (REGSTY_IS_11AC_ENABLE(&padapter->registrypriv) + && hal_chk_proto_cap(padapter, PROTO_CAP_11AC) + && (!pmlmepriv->country_ent || COUNTRY_CHPLAN_EN_11AC(pmlmepriv->country_ent))) + ptdls_sta->vhtpriv.vht_option = _TRUE; + else + ptdls_sta->vhtpriv.vht_option = _FALSE; + } + + /* B4 Rx LDPC */ + if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) && + GET_VHT_CAPABILITY_ELE_RX_LDPC(data)) { SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX)); - DBG_871X("Current VHT LDPC Setting = %02X\n", cur_ldpc_cap); + RTW_INFO("Current VHT LDPC Setting = %02X\n", cur_ldpc_cap); } - ptdls_sta->vhtpriv.ldpc_cap = cur_ldpc_cap; + ptdls_sta->vhtpriv.ldpc_cap = cur_ldpc_cap; - /* B5 Short GI for 80 MHz */ - ptdls_sta->vhtpriv.sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(data) & pvhtpriv->sgi_80m) ? _TRUE : _FALSE; - - /* B8 B9 B10 Rx STBC */ - if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) && - GET_VHT_CAPABILITY_ELE_RX_STBC(data)) { - SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); - DBG_871X("Current VHT STBC Setting = %02X\n", cur_stbc_cap); + /* B5 Short GI for 80 MHz */ + ptdls_sta->vhtpriv.sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(data) & pvhtpriv->sgi_80m) ? _TRUE : _FALSE; + + /* B8 B9 B10 Rx STBC */ + if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) && + GET_VHT_CAPABILITY_ELE_RX_STBC(data)) { + SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); + RTW_INFO("Current VHT STBC Setting = %02X\n", cur_stbc_cap); } - ptdls_sta->vhtpriv.stbc_cap = cur_stbc_cap; + ptdls_sta->vhtpriv.stbc_cap = cur_stbc_cap; - /* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */ - if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && - GET_VHT_CAPABILITY_ELE_SU_BFEE(data)) { + /* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */ + if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && + GET_VHT_CAPABILITY_ELE_SU_BFEE(data)) SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); - } - /* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */ + /* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) && - GET_VHT_CAPABILITY_ELE_SU_BFER(data)) { + GET_VHT_CAPABILITY_ELE_SU_BFER(data)) SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); - } - ptdls_sta->vhtpriv.beamform_cap = cur_beamform_cap; - if (cur_beamform_cap) - DBG_871X("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap); - - /* B23 B24 B25 Maximum A-MPDU Length Exponent */ - ptdls_sta->vhtpriv.ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(data); + ptdls_sta->vhtpriv.beamform_cap = cur_beamform_cap; + if (cur_beamform_cap) + RTW_INFO("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap); - pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(data); + /* B23 B24 B25 Maximum A-MPDU Length Exponent */ + ptdls_sta->vhtpriv.ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(data); + + pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(data); _rtw_memcpy(vht_mcs, pcap_mcs, 2); rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); @@ -485,2658 +502,2840 @@ void rtw_tdls_process_vht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 else if (rf_type == RF_3T3R) vht_mcs[0] |= 0xc0; - _rtw_memcpy(ptdls_sta->vhtpriv.vht_mcs_map, vht_mcs, 2); + _rtw_memcpy(ptdls_sta->vhtpriv.vht_mcs_map, vht_mcs, 2); - ptdls_sta->vhtpriv.vht_highest_rate = rtw_get_vht_highest_rate(ptdls_sta->vhtpriv.vht_mcs_map); -} - -u8 *rtw_tdls_set_aid(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) -{ - return rtw_set_ie(pframe, EID_AID, 2, (u8 *)&(padapter->mlmepriv.cur_network.aid), &(pattrib->pktlen)); -} - -u8 *rtw_tdls_set_vht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) -{ - u32 ie_len = 0; - - rtw_vht_use_default_setting(padapter); - - ie_len = rtw_build_vht_cap_ie(padapter, pframe); - pattrib->pktlen += ie_len; - - return pframe + ie_len; -} - -u8 *rtw_tdls_set_vht_operation(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib, u8 channel) -{ - u32 ie_len = 0; - - ie_len = rtw_build_vht_operation_ie(padapter, pframe, channel); - pattrib->pktlen += ie_len; - - return pframe + ie_len; -} - -u8 *rtw_tdls_set_vht_op_mode_notify(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib, u8 bw) -{ - u32 ie_len = 0; - - ie_len = rtw_build_vht_op_mode_notify_ie(padapter, pframe, bw); - pattrib->pktlen += ie_len; - - return pframe + ie_len; -} -#endif - - -u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib) -{ - u8 sup_ch[30 * 2] = {0x00}, ch_set_idx = 0, sup_ch_idx = 2; - - do { - if (pmlmeext->channel_set[ch_set_idx].ChannelNum <= 14) { - sup_ch[0] = 1; /* First channel number */ - sup_ch[1] = pmlmeext->channel_set[ch_set_idx].ChannelNum; /* Number of channel */ - } else { - sup_ch[sup_ch_idx++] = pmlmeext->channel_set[ch_set_idx].ChannelNum; - sup_ch[sup_ch_idx++] = 1; - } - ch_set_idx++; - } 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, 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 == WIRELESS_MODE_MAX) ? padapter->mlmeextpriv.cur_wireless_mode : 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. */ - - wfd_offset = 0; - wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); - 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) { - 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 ); - } - - _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) { - _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]); - } - wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); - } -} - -int issue_tunneled_probe_req(_adapter *padapter) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - struct tdls_txmgmt txmgmt; - int ret = _FAIL; - - DBG_871X("[%s]\n", __FUNCTION__); - - _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - txmgmt.action_code = TUNNELED_PROBE_REQ; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - goto exit; - - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, baddr, 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) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; -exit: - - return ret; -} - -int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame) -{ - 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; - - DBG_871X("[%s]\n", __FUNCTION__); - - _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - txmgmt.action_code = TUNNELED_PROBE_RSP; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - goto exit; - - 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, 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) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; -exit: - - return ret; -} -#endif /* CONFIG_WFD */ - -int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta= NULL; - _irqL irqL; - int ret = _FAIL; - /* 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) - goto exit; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - goto exit; - - pattrib = &pmgntframe->attrib; - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _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); - - update_tdls_attrib(padapter, pattrib); - - /* init peer sta_info */ - ptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer); - if (ptdls_sta == NULL) { - ptdls_sta = rtw_alloc_stainfo(pstapriv, ptxmgmt->peer); - if (ptdls_sta == NULL) { - DBG_871X("[%s] rtw_alloc_stainfo fail\n", __FUNCTION__); - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - } - - if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) - ptdlsinfo->sta_cnt++; - - if (ptdlsinfo->sta_cnt == MAX_ALLOWED_TDLS_STA_NUM) - ptdlsinfo->sta_maximum = _TRUE; - - ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE; - - 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) { - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - - if (wait_ack) { - ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); - } else { - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; - } - -exit: - - return ret; -} - -int _issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta=NULL; - _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) { - DBG_871X("Np tdls_sta for tearing down\n"); - goto exit; - } - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - goto exit; - - 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, 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, ptxmgmt) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - 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 { - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; - } - - 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; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - 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; - - pattrib = &pmgntframe->attrib; - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _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); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel = pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - dump_mgntframe(padapter, pmgntframe); - DBG_871X("issue tdls dis req\n"); - - ret = _SUCCESS; -exit: - - return ret; -} - -int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - 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; - - pattrib = &pmgntframe->attrib; - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, ptxmgmt->peer, 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); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel = pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - - dump_mgntframe(padapter, pmgntframe); - - ret = _SUCCESS; -exit: - - return ret; - -} - -int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - 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; - - pattrib = &pmgntframe->attrib; - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, ptxmgmt->peer, 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); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel = pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - - dump_mgntframe(padapter, pmgntframe); - - ret = _SUCCESS; -exit: - - return ret; - -} - -/* 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; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - int ret = _FAIL; - - DBG_871X("[TDLS] %s\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - goto exit; - - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - /* unicast probe request frame */ - _rtw_memcpy(pwlanhdr->addr1, ptxmgmt->peer, ETH_ALEN); - _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, 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); - - 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, privacy); - - pattrib->nr_frags = 1; - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; - -exit: - return ret; -} - -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); - int ret = _FAIL; - - DBG_871X("[TDLS] %s\n", __FUNCTION__); - - ptxmgmt->action_code = TDLS_PEER_TRAFFIC_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, 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, ptxmgmt) !=_SUCCESS) { - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; - -exit: - - return ret; -} - -int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta) -{ - 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; - - 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; - - 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, adapter_mac_addr(padapter), ETH_ALEN); - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - /* PTI frame's priority should be AC_VO */ - pattrib->priority = 7; - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel = pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; - -exit: - - return ret; -} - -int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta) -{ - 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; - - 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; - - 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, 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) { - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; -exit: - - return ret; -} - -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); - 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; - } - - 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, 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); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel = pattrib->priority; -/* - _enter_critical_bh(&pxmitpriv->lock, &irqL); - if(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){ - _exit_critical_bh(&pxmitpriv->lock, &irqL); - return _FALSE; - } -*/ - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) !=_SUCCESS) { - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - - if (wait_ack) { - ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); - } else { - dump_mgntframe(padapter, pmgntframe); - ret = _SUCCESS; - } - ret = _SUCCESS; -exit: - - return ret; -} - -int On_TDLS_Dis_Rsp(_adapter *padapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(padapter->stapriv), get_bssid(&(padapter->mlmepriv))); - struct recv_priv *precvpriv = &(padapter->recvpriv); - u8 *ptr = precv_frame->u.hdr.rx_data, *psa; - struct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib); - struct tdls_info *ptdlsinfo = &(padapter->tdlsinfo); - u8 empty_addr[ETH_ALEN] = { 0x00 }; - int UndecoratedSmoothedPWDB; - struct tdls_txmgmt txmgmt; - int ret = _SUCCESS; - - _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - /* WFDTDLS: for sigma test, not to setup direct link automatically */ - ptdlsinfo->dev_discovered = _TRUE; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), psa); - if (ptdls_sta != NULL) - ptdls_sta->sta_stats.rx_tdls_disc_rsp_pkts++; - -#ifdef CONFIG_TDLS_AUTOSETUP - if (ptdls_sta != NULL) { - /* 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->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->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. */ - ret = _FAIL; - goto exit; - } 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 { - ret = _FAIL; - goto exit; - } - } - } - - rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &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 */ - -exit: - return ret; - -} - -sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - u8 *psa, *pmyid; - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv *psecuritypriv = &padapter->securitypriv; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *prsnie, *ppairwise_cipher; - u8 i, k; - u8 ccmp_included=0, rsnie_included=0; - u16 j, pairwise_count; - u8 SNonce[32]; - 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 = 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 - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - 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 */ - DBG_871X("re-setup a direct link\n"); - } - /* 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 */ - 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; - break; - }else if(*(pmyid+i)<*(psa+i)){ - goto exit; - } - } - } - } - - 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 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; -#ifdef CONFIG_80211N_HT - case _HT_CAPABILITY_IE_: - rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); - break; -#endif -#ifdef CONFIG_80211AC_VHT - case EID_AID: - break; - case EID_VHTCapability: - rtw_tdls_process_vht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); - break; -#endif - 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 (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 && (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) { - _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); - - if (timeout_interval <= 300) - ptdls_sta->TDLS_PeerKey_Lifetime = TPK_RESEND_COUNT; - else - ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; - } - - /* Update station supportRate */ - ptdls_sta->bssratelen = supportRateNum; - _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); - - if (!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) - ptdlsinfo->sta_cnt++; - /* -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 */ - - }else { - goto exit; - } - - _rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN); - - 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: - - return _SUCCESS; -} - -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; - u8 *ptr = precv_frame->u.hdr.rx_data; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - 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]; - u8 *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL, *ppairwise_cipher=NULL; - u16 pairwise_count, j, k; - u8 verify_ccmp=0; - unsigned char supportRate[16]; - 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) { - ret = _FAIL; - goto exit; - } - - 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 - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - _rtw_memcpy(&status_code, ptr+2, 2); - - 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; - } - - 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 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; -#ifdef CONFIG_80211N_HT - case _HT_CAPABILITY_IE_: - rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); - break; -#endif -#ifdef CONFIG_80211AC_VHT - case EID_AID: - /* todo in the future if necessary */ - break; - case EID_VHTCapability: - rtw_tdls_process_vht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); - break; - case EID_OpModeNotification: - rtw_process_vht_op_mode_notify(padapter, pIE->data, ptdls_sta); - break; -#endif - case EID_BSSCoexistence: - break; - case _LINK_ID_IE_: - plinkid_ie=(u8*)pIE; - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - 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 */ - - 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 - { - txmgmt.status_code = _STATS_INVALID_RSNIE_; - } - - }else{ - txmgmt.status_code = _STATS_SUCCESSFUL_; - } - } - - 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 (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; - ptdls_sta->state |= _FW_LINKED; - _cancel_timer_ex( &ptdls_sta->handshake_timer); - } - - if (prx_pkt_attrib->encrypt) - rtw_tdls_set_key(padapter, ptdls_sta); - - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED); - - } - } - -exit: - if (rtw_tdls_is_driver_setup(padapter) == _TRUE) - return ret; - else - return _SUCCESS; - -} - -int On_TDLS_Setup_Cfm(_adapter *padapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - u16 status_code=0; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =5; - u8 *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL, *ppairwise_cipher=NULL; - u16 j, pairwise_count; - int ret = _SUCCESS; - - 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)); - ret = _FAIL; - goto exit; - } - - 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 - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - _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; - } - - /* Parsing information element */ - for (j = FIXED_IE; j < parsing_length;) { - - pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j); - - 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; -#ifdef CONFIG_80211N_HT - case _HT_EXTRA_INFO_IE_: - break; -#endif -#ifdef CONFIG_80211AC_VHT - case EID_VHTOperation: - break; - case EID_OpModeNotification: - rtw_process_vht_op_mode_notify(padapter, pIE->data, ptdls_sta); - break; -#endif - case _LINK_ID_IE_: - plinkid_ie = (u8 *)pIE; - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - if (prx_pkt_attrib->encrypt) { - /* 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; - } - } - - if (rtw_tdls_is_driver_setup(padapter)) { - ptdlsinfo->link_established = _TRUE; - - 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); - } - -exit: - return ret; - -} - -int On_TDLS_Dis_Req(_adapter *padapter, union recv_frame *precv_frame) -{ - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - 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 */ - 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+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; - 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 - -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(adapter_mac_addr(padapter), dst, 6) == _FALSE)) - goto exit; - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - issue_tdls_dis_rsp(padapter, &txmgmt, prx_pkt_attrib->privacy); - -exit: - return ret; - -} - -int On_TDLS_Teardown(_adapter *padapter, union recv_frame *precv_frame) -{ - u8 *psa; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - 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 (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_PEER_AT_OFF_STATE) { - if (state & TDLS_PEER_SLEEP_STATE) - return 2; /* U-APSD + ch. switch */ - else - 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+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 { - DBG_871X("from unknown sta:"MAC_FMT"\n", MAC_ARG(pattrib->src)); - return _FAIL; - } - - return _SUCCESS; -} - -/* 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; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); - 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); - - /* 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) { - if (wmmps_ac) { - _irqL irqL; - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; - - _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - - 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) { - 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) { - pxmitframe->attrib.mdata = 1; - pxmitframe->attrib.eosp = 0; - } 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) - DBG_871X("no buffered packets for tdls to xmit\n"); - else { - DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); - ptdls_sta->sleepq_len=0; - } - - _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - - } - - } - - 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; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - 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); - - 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 - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - pchsw_info->off_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 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 */ - txmgmt.status_code = 0; - _rtw_memcpy(txmgmt.peer, psa, ETH_ALEN); - - ATOMIC_SET(&pchsw_info->chsw_on, _TRUE); - - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_RESP); - - 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; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - 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 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, NULL, TDLS_CH_SW_BACK); - goto exit; - } - } - - 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 - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - _rtw_memcpy(&status_code, ptr+2, 2); - - 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; j < parsing_length;) { - pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j); - - 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); - } - - 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 ) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info *pwfd_info = padapter->tdlsinfo.wfd_info; - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 wfdielen = 0; - - /* 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++ ] = WFD_ATTR_DEVICE_INFO; - - /* 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 ) */ - 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 */ - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); - wfdielen += 2; - - /* Value3: */ - /* WFD Device Maximum Throughput */ - /* 300Mbps is the maximum throughput */ - RTW_PUT_BE16(wfdie + wfdielen, 300); - wfdielen += 2; - - /* Associated BSSID ATTR */ - /* Type: */ - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; - - /* 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); - else - _rtw_memset(wfdie + wfdielen, 0x00, ETH_ALEN); - - /* Local IP Address ATTR */ - wfdie[ wfdielen++ ] = WFD_ATTR_LOCAL_IP_ADDR; - - /* 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 */ - wfdie[ wfdielen++ ] = 0x01; - - /* 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 */ - -void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) -{ - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); - - int i = 0 ; - u32 time; - u8 *pframe_head; - - /* 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 = 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_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 = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); - - pframe = rtw_tdls_set_ext_cap(pframe, pattrib); - - if (pattrib->encrypt) { - pframe = rtw_tdls_set_ftie(ptxmgmt - , pframe - , pattrib - , NULL - , ptdls_sta->SNonce); - - pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); - } - -#ifdef CONFIG_80211N_HT - /* Sup_reg_classes(optional) */ - if (pregistrypriv->ht_enable == _TRUE) - pframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib); -#endif - - pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib); - - pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); - - if ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE)) - pframe = rtw_tdls_set_qos_cap(pframe, pattrib); - -#ifdef CONFIG_80211AC_VHT - if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pregistrypriv->vht_enable == _TRUE) && (pmlmeext->cur_channel > 14)) { - pframe = rtw_tdls_set_aid(padapter, pframe, pattrib); - pframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib); - } -#endif - -#ifdef CONFIG_WFD - wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); -#endif /* CONFIG_WFD */ - -} - -void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) -{ - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_info *ptdls_sta; - 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 ptdls_sta is NULL\n", __FUNCTION__, __LINE__); - - 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; - - 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 (ptxmgmt->status_code != 0) { - DBG_871X("[%s] status_code:%04x \n", __FUNCTION__, ptxmgmt->status_code); - return; - } - - 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); - - if (pattrib->encrypt) { - prsnie = pframe; - pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _FALSE, ptdls_sta); - } - - pframe = rtw_tdls_set_ext_cap(pframe, pattrib); - - if (pattrib->encrypt) { - if (rtw_tdls_is_driver_setup(padapter) == _TRUE) - wpa_tdls_generate_tpk(padapter, ptdls_sta); - - pftie = pframe; - pftie_mic = pframe+4; - pframe = rtw_tdls_set_ftie(ptxmgmt - , pframe - , pattrib - , ptdls_sta->ANonce - , ptdls_sta->SNonce); - - ptimeout_ie = pframe; - pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _FALSE, ptdls_sta); - } - -#ifdef CONFIG_80211N_HT - /* Sup_reg_classes(optional) */ - if (pregistrypriv->ht_enable == _TRUE) - pframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib); -#endif - - pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib); - - plinkid_ie = pframe; - pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE); - - /* 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_80211AC_VHT - if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pregistrypriv->vht_enable == _TRUE) && (pmlmeext->cur_channel > 14)) { - pframe = rtw_tdls_set_aid(padapter, pframe, pattrib); - pframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib); - pframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode); - } -#endif - -#ifdef CONFIG_WFD - wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); -#endif /* CONFIG_WFD */ - -} - -void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) -{ - 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 sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); - - unsigned int ie_len; - unsigned char *p; - u8 wmm_param_ele[24] = {0}; - u8 *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL; - - 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 (ptxmgmt->status_code!=0) - return; - - if (pattrib->encrypt) { - prsnie = pframe; - pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); - } - - if (pattrib->encrypt) { - pftie = pframe; - pftie_mic = pframe+4; - pframe = rtw_tdls_set_ftie(ptxmgmt - , pframe - , pattrib - , ptdls_sta->ANonce - , ptdls_sta->SNonce); - - ptimeout_ie = pframe; - 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 */ - - plinkid_ie = pframe; - pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); - - 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); - - if (ptdls_sta->qos_option == _TRUE) - pframe = rtw_tdls_set_wmm_params(padapter, pframe, pattrib); - -#ifdef CONFIG_80211AC_VHT - if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pregistrypriv->vht_enable == _TRUE) - && (ptdls_sta->vhtpriv.vht_option == _TRUE) && (pmlmeext->cur_channel > 14)) { - pframe = rtw_tdls_set_vht_operation(padapter, pframe, pattrib, pmlmeext->cur_channel); - pframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode); - } -#endif -} - -void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) -{ - 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; - - 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 (pattrib->encrypt) { - pftie = pframe; - pftie_mic = pframe + 4; - pframe = rtw_tdls_set_ftie(ptxmgmt - , pframe - , pattrib - , ptdls_sta->ANonce - , ptdls_sta->SNonce); - } - - 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; - - 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); - -} - -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 pkt_attrib *pattrib = &pxmitframe->attrib; - u8 *pframe_head, pktlen_index; - - pktlen_index = pattrib->pktlen; - pframe_head = pframe; - - 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); - - pframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib); - - pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - - if (privacy) - pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, NULL); - - pframe = rtw_tdls_set_ext_cap(pframe, pattrib); - - if (privacy) { - pframe = rtw_tdls_set_ftie(ptxmgmt, pframe, pattrib, NULL, NULL); - pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, NULL); - } - -#ifdef CONFIG_80211N_HT - if (pregistrypriv->ht_enable == _TRUE) - pframe = rtw_tdls_set_ht_cap(padapter, pframe_head - pktlen_index, pattrib); -#endif - - 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, struct tdls_txmgmt *ptxmgmt) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 AC_queue=0; - struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst); - - 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); - - /* PTI control */ - /* PU buffer status */ - if (ptdls_sta->uapsd_bk & BIT(1)) - AC_queue=BIT(0); - if (ptdls_sta->uapsd_be & BIT(1)) - AC_queue=BIT(1); - if (ptdls_sta->uapsd_vi & BIT(1)) - AC_queue=BIT(2); - 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, struct tdls_txmgmt *ptxmgmt) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst); - - 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); -} - -#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 sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - u16 switch_time= CH_SWITCH_TIME * 1000, switch_timeout=CH_SWITCH_TIMEOUT * 1000; - - ptdls_sta->ch_switch_time=switch_time; - ptdls_sta->ch_switch_timeout=switch_timeout; - - 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); - - 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); - -} - -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; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - - 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->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) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; - u8 category = RTW_WLAN_CATEGORY_P2P; - u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; - u8 probe_req = 4; - u8 wfdielen = 0; - - 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)) { - wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } 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; - } - -} - -void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; - u8 category = RTW_WLAN_CATEGORY_P2P; - u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; - u8 probe_rsp = 5; - u8 wfdielen = 0; - - 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)) { - 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)) { - wfdielen = build_probe_resp_wfd_ie(pbuddy_wdinfo, pframe, 1); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } - -} -#endif /* CONFIG_WFD */ - -void _tdls_tpk_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - struct tdls_txmgmt txmgmt; - - _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - ptdls_sta->TPK_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, ONE_SEC); -} - -#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; - 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); - } - -#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_delay_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _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; - - _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) - { - issue_tdls_teardown(padapter, &txmgmt, _TRUE); - } - else - { - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEAR_STA); - } - } -} - -void _tdls_pti_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _adapter *padapter = ptdls_sta->padapter; - struct tdls_txmgmt txmgmt; - - _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); - _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("[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); - } - } -} - -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); -#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); -} - -void rtw_free_tdls_timer(struct sta_info *psta) -{ - _cancel_timer_ex(&psta->TPK_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); -} - -u8 update_sgi_tdls(_adapter *padapter, struct sta_info *psta) -{ - return query_ra_short_GI(psta); -} - -u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta) -{ - unsigned char sta_band = 0; - unsigned int tx_ra_bitmap=0; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - - rtw_hal_update_sta_rate_mask(padapter, psta); - tx_ra_bitmap = psta->ra_mask; - - if (pcur_network->Configuration.DSConfig > 14) { - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_5N | WIRELESS_11A; - else - sta_band |= WIRELESS_11A; - } else { - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; - else if (tx_ra_bitmap & 0xff0) - sta_band |= WIRELESS_11G |WIRELESS_11B; - else - sta_band |= WIRELESS_11B; - } - - psta->wireless_mode = sta_band; - - psta->raid = rtw_hal_networktype_to_raid(padapter,psta); - tx_ra_bitmap |= ((psta->raid<<28)&0xf0000000); - return tx_ra_bitmap; -} - -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 */ + ptdls_sta->vhtpriv.vht_highest_rate = rtw_get_vht_highest_rate(ptdls_sta->vhtpriv.vht_mcs_map); +} + +u8 *rtw_tdls_set_aid(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + return rtw_set_ie(pframe, EID_AID, 2, (u8 *)&(padapter->mlmepriv.cur_network.aid), &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_vht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + u32 ie_len = 0; + + rtw_vht_use_default_setting(padapter); + + ie_len = rtw_build_vht_cap_ie(padapter, pframe); + pattrib->pktlen += ie_len; + + return pframe + ie_len; +} + +u8 *rtw_tdls_set_vht_operation(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib, u8 channel) +{ + u32 ie_len = 0; + + ie_len = rtw_build_vht_operation_ie(padapter, pframe, channel); + pattrib->pktlen += ie_len; + + return pframe + ie_len; +} + +u8 *rtw_tdls_set_vht_op_mode_notify(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib, u8 bw) +{ + u32 ie_len = 0; + + ie_len = rtw_build_vht_op_mode_notify_ie(padapter, pframe, bw); + pattrib->pktlen += ie_len; + + return pframe + ie_len; +} +#endif + + +u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib) +{ + u8 sup_ch[30 * 2] = {0x00}, ch_set_idx = 0, sup_ch_idx = 2; + + do { + if (pmlmeext->channel_set[ch_set_idx].ChannelNum <= 14) { + sup_ch[0] = 1; /* First channel number */ + sup_ch[1] = pmlmeext->channel_set[ch_set_idx].ChannelNum; /* Number of channel */ + } else { + sup_ch[sup_ch_idx++] = pmlmeext->channel_set[ch_set_idx].ChannelNum; + sup_ch[sup_ch_idx++] = 1; + } + ch_set_idx++; + } 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, 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 = TDLS_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 = 22; + return rtw_set_fixed_ie(pframe, 1, &(reg_class), &(pattrib->pktlen)); +} + +u8 *rtw_tdls_set_second_channel_offset(u8 *pframe, struct pkt_attrib *pattrib, u8 ch_offset) +{ + return rtw_set_ie(pframe, EID_SecondaryChnlOffset , 1, &ch_offset, &(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 == WIRELESS_MODE_MAX) ? padapter->mlmeextpriv.cur_wireless_mode : 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 >= TDLS_CH_SWITCH_TIME * 1000) ? + ptdls_sta->ch_switch_time : TDLS_CH_SWITCH_TIME; + u16 switch_timeout = (ptdls_sta->ch_switch_timeout >= TDLS_CH_SWITCH_TIMEOUT * 1000) ? + ptdls_sta->ch_switch_timeout : TDLS_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)); +} + +void rtw_tdls_set_ch_sw_oper_control(_adapter *padapter, u8 enable) +{ + if (ATOMIC_READ(&padapter->tdlsinfo.chsw_info.chsw_on) != enable) + ATOMIC_SET(&padapter->tdlsinfo.chsw_info.chsw_on, enable); + + rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_BCN_EARLY_C2H_RPT, &enable); + RTW_INFO("[TDLS] %s Bcn Early C2H Report\n", (enable == _TRUE) ? "Start" : "Stop"); +} + +void rtw_tdls_ch_sw_back_to_base_chnl(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv; + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; + + pmlmepriv = &padapter->mlmepriv; + + if ((ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) && + (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter))) + rtw_tdls_cmd(padapter, pchsw_info->addr, TDLS_CH_SW_TO_BASE_CHNL_UNSOLICITED); +} + +static void rtw_tdls_chsw_oper_init(_adapter *padapter, u32 timeout_ms) +{ + struct submit_ctx *chsw_sctx = &padapter->tdlsinfo.chsw_info.chsw_sctx; + + rtw_sctx_init(chsw_sctx, timeout_ms); +} + +static int rtw_tdls_chsw_oper_wait(_adapter *padapter) +{ + struct submit_ctx *chsw_sctx = &padapter->tdlsinfo.chsw_info.chsw_sctx; + + return rtw_sctx_wait(chsw_sctx, __func__); +} + +void rtw_tdls_chsw_oper_done(_adapter *padapter) +{ + struct submit_ctx *chsw_sctx = &padapter->tdlsinfo.chsw_info.chsw_sctx; + + rtw_sctx_done(&chsw_sctx); +} + +s32 rtw_tdls_do_ch_sw(_adapter *padapter, struct sta_info *ptdls_sta, u8 chnl_type, u8 channel, u8 channel_offset, u16 bwmode, u16 ch_switch_time) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 center_ch, chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + u32 ch_sw_time_start, ch_sw_time_spent, wait_time; + u8 take_care_iqk; + s32 ret = _FAIL; + + ch_sw_time_start = rtw_systime_to_ms(rtw_get_current_time()); + + rtw_tdls_chsw_oper_init(padapter, TDLS_CH_SWITCH_OPER_OFFLOAD_TIMEOUT); + + /* set mac_id sleep before channel switch */ + rtw_hal_macid_sleep(padapter, ptdls_sta->mac_id); + + /* channel switch IOs offload to FW */ + if (rtw_hal_ch_sw_oper_offload(padapter, channel, channel_offset, bwmode) == _SUCCESS) { + if (rtw_tdls_chsw_oper_wait(padapter) == _SUCCESS) { + /* set channel and bw related variables in driver */ + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); + + rtw_set_oper_ch(padapter, channel); + rtw_set_oper_choffset(padapter, channel_offset); + rtw_set_oper_bw(padapter, bwmode); + + center_ch = rtw_get_center_ch(channel, bwmode, channel_offset); + pHalData->CurrentChannel = center_ch; + pHalData->CurrentCenterFrequencyIndex1 = center_ch; + pHalData->CurrentChannelBW = bwmode; + pHalData->nCur40MhzPrimeSC = channel_offset; + + if (bwmode == CHANNEL_WIDTH_80) { + if (center_ch > channel) + chnl_offset80 = HAL_PRIME_CHNL_OFFSET_LOWER; + else if (center_ch < channel) + chnl_offset80 = HAL_PRIME_CHNL_OFFSET_UPPER; + else + chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + pHalData->nCur80MhzPrimeSC = chnl_offset80; + + pHalData->CurrentCenterFrequencyIndex1 = center_ch; + + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); + + rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk); + if (take_care_iqk == _TRUE) + rtw_hal_ch_sw_iqk_info_restore(padapter, CH_SW_USE_CASE_TDLS); + + ch_sw_time_spent = rtw_systime_to_ms(rtw_get_current_time()) - ch_sw_time_start; + + if (chnl_type == TDLS_CH_SW_OFF_CHNL) { + if ((u32)ch_switch_time / 1000 > ch_sw_time_spent) + wait_time = (u32)ch_switch_time / 1000 - ch_sw_time_spent; + else + wait_time = 0; + + if (wait_time > 0) + rtw_msleep_os(wait_time); + } + + ret = _SUCCESS; + } else + RTW_INFO("[TDLS] chsw oper wait fail !!\n"); + } + + /* set mac_id wakeup after channel switch */ + rtw_hal_macid_wakeup(padapter, ptdls_sta->mac_id); + + return ret; +} +#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; + u32 wfd_ielen = 0; + + if (!hal_chk_wl_func(tdls_info_to_adapter(ptdlsinfo), WL_FUNC_MIRACAST)) + return; + + /* Try to get the TCP port information when receiving the negotiation response. */ + + wfd_ie = rtw_get_wfd_ie(ptr, length, NULL, &wfd_ielen); + while (wfd_ie) { + u8 *attr_content; + u32 attr_contentlen = 0; + int i; + + RTW_INFO("[%s] WFD IE Found!!\n", __FUNCTION__); + attr_content = rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, NULL, &attr_contentlen); + if (attr_content && attr_contentlen) { + ptdlsinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16(attr_content + 2); + RTW_INFO("[%s] Peer PORT NUM = %d\n", __FUNCTION__, ptdlsinfo->wfd_info->peer_rtsp_ctrlport); + } + + attr_content = rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_LOCAL_IP_ADDR, NULL, &attr_contentlen); + if (attr_content && attr_contentlen) { + _rtw_memcpy(ptdlsinfo->wfd_info->peer_ip_address, (attr_content + 1), 4); + RTW_INFO("[%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]); + } + + wfd_ie = rtw_get_wfd_ie(wfd_ie + wfd_ielen, (ptr + length) - (wfd_ie + wfd_ielen), NULL, &wfd_ielen); + } +} + +int issue_tunneled_probe_req(_adapter *padapter) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + struct tdls_txmgmt txmgmt; + int ret = _FAIL; + + RTW_INFO("[%s]\n", __FUNCTION__); + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + txmgmt.action_code = TUNNELED_PROBE_REQ; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, baddr, 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) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; +exit: + + return ret; +} + +int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + 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_INFO("[%s]\n", __FUNCTION__); + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + txmgmt.action_code = TUNNELED_PROBE_RSP; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + 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, 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) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; +exit: + + return ret; +} +#endif /* CONFIG_WFD */ + +int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = NULL; + _irqL irqL; + int ret = _FAIL; + /* Retry timer should be set at least 301 sec, using TPK_count counting 301 times. */ + u32 timeout_interval = TDLS_TPK_RESEND_COUNT; + + RTW_INFO("[TDLS] %s\n", __FUNCTION__); + + ptxmgmt->action_code = TDLS_SETUP_REQUEST; + if (rtw_tdls_is_setup_allowed(padapter) == _FALSE) + goto exit; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + pattrib = &pmgntframe->attrib; + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _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); + + update_tdls_attrib(padapter, pattrib); + + /* init peer sta_info */ + ptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer); + if (ptdls_sta == NULL) { + ptdls_sta = rtw_alloc_stainfo(pstapriv, ptxmgmt->peer); + if (ptdls_sta == NULL) { + RTW_INFO("[%s] rtw_alloc_stainfo fail\n", __FUNCTION__); + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + } + + if (!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) + ptdlsinfo->sta_cnt++; + + if (ptdlsinfo->sta_cnt == MAX_ALLOWED_TDLS_STA_NUM) + ptdlsinfo->sta_maximum = _TRUE; + + ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE; + + 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) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + + if (wait_ack) + ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe); + else { + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; + } + +exit: + + return ret; +} + +int _issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = NULL; + _irqL irqL; + int ret = _FAIL; + + RTW_INFO("[TDLS] %s\n", __FUNCTION__); + + ptxmgmt->action_code = TDLS_TEARDOWN; + ptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer); + if (ptdls_sta == NULL) { + RTW_INFO("Np tdls_sta for tearing down\n"); + goto exit; + } + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + rtw_mi_set_scan_deny(padapter, 550); + rtw_mi_scan_abort(padapter, _TRUE); + + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _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); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel = pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + 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 { + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; + } + + if (rtw_tdls_is_driver_setup(padapter)) + rtw_tdls_cmd(padapter, ptxmgmt->peer, TDLS_TEARDOWN_STA_LOCALLY); + +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; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + int ret = _FAIL; + + RTW_INFO("[TDLS] %s\n", __FUNCTION__); + + ptxmgmt->action_code = TDLS_DISCOVERY_REQUEST; + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + pattrib = &pmgntframe->attrib; + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _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); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel = pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + dump_mgntframe(padapter, pmgntframe); + RTW_INFO("issue tdls dis req\n"); + + ret = _SUCCESS; +exit: + + return ret; +} + +int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + int ret = _FAIL; + + RTW_INFO("[TDLS] %s\n", __FUNCTION__); + + ptxmgmt->action_code = TDLS_SETUP_RESPONSE; + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + pattrib = &pmgntframe->attrib; + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, ptxmgmt->peer, 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); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel = pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + + dump_mgntframe(padapter, pmgntframe); + + ret = _SUCCESS; +exit: + + return ret; + +} + +int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + int ret = _FAIL; + + RTW_INFO("[TDLS] %s\n", __FUNCTION__); + + ptxmgmt->action_code = TDLS_SETUP_CONFIRM; + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + pattrib = &pmgntframe->attrib; + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, ptxmgmt->peer, 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); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel = pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + + dump_mgntframe(padapter, pmgntframe); + + ret = _SUCCESS; +exit: + + return ret; + +} + +/* 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; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + int ret = _FAIL; + + RTW_INFO("[TDLS] %s\n", __FUNCTION__); + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + /* unicast probe request frame */ + _rtw_memcpy(pwlanhdr->addr1, ptxmgmt->peer, ETH_ALEN); + _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, 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); + + 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, privacy); + + pattrib->nr_frags = 1; + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; + +exit: + return ret; +} + +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); + int ret = _FAIL; + + RTW_INFO("[TDLS] %s\n", __FUNCTION__); + + ptxmgmt->action_code = TDLS_PEER_TRAFFIC_RESPONSE; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + 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, 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, ptxmgmt) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; + +exit: + + return ret; +} + +int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta) +{ + 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_INFO("[TDLS] %s\n", __FUNCTION__); + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + txmgmt.action_code = TDLS_PEER_TRAFFIC_INDICATION; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + 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, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + /* PTI frame's priority should be AC_VO */ + pattrib->priority = 7; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel = pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; + +exit: + + return ret; +} + +#ifdef CONFIG_TDLS_CH_SW +int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta) +{ + 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_INFO("[TDLS] %s\n", __FUNCTION__); + + if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) { + RTW_INFO("[TDLS] Ignore %s since channel switch is not allowed\n", __func__); + goto exit; + } + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + txmgmt.action_code = TDLS_CHANNEL_SWITCH_REQUEST; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + 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, 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) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; +exit: + + return ret; +} + +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); + int ret = _FAIL; + + RTW_INFO("[TDLS] %s\n", __FUNCTION__); + + if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) { + RTW_INFO("[TDLS] Ignore %s since channel switch is not allowed\n", __func__); + goto exit; + } + + ptxmgmt->action_code = TDLS_CHANNEL_SWITCH_RESPONSE; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN); + _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pattrib->ra, ptxmgmt->peer, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel = pattrib->priority; + /* + _enter_critical_bh(&pxmitpriv->lock, &irqL); + if(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){ + _exit_critical_bh(&pxmitpriv->lock, &irqL); + return _FALSE; + } + */ + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + + if (wait_ack) + ret = dump_mgntframe_and_wait_ack_timeout(padapter, pmgntframe, 10); + else { + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; + } +exit: + + return ret; +} +#endif + +int On_TDLS_Dis_Rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(padapter->stapriv), get_bssid(&(padapter->mlmepriv))); + struct recv_priv *precvpriv = &(padapter->recvpriv); + u8 *ptr = precv_frame->u.hdr.rx_data, *psa; + struct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib); + struct tdls_info *ptdlsinfo = &(padapter->tdlsinfo); + u8 empty_addr[ETH_ALEN] = { 0x00 }; + int UndecoratedSmoothedPWDB; + struct tdls_txmgmt txmgmt; + int ret = _SUCCESS; + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + /* WFDTDLS: for sigma test, not to setup direct link automatically */ + ptdlsinfo->dev_discovered = _TRUE; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), psa); + if (ptdls_sta != NULL) + ptdls_sta->sta_stats.rx_tdls_disc_rsp_pkts++; + +#ifdef CONFIG_TDLS_AUTOSETUP + if (ptdls_sta != NULL) { + /* 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->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->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. */ + ret = _FAIL; + goto exit; + } 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 { + ret = _FAIL; + goto exit; + } + } + } + + rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); + + if (pattrib->phy_info.RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB) { + RTW_INFO("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 */ + +exit: + return ret; + +} + +sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + u8 *psa, *pmyid; + struct sta_info *ptdls_sta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecuritypriv = &padapter->securitypriv; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *prsnie, *ppairwise_cipher; + u8 i, k; + u8 ccmp_included = 0, rsnie_included = 0; + u16 j, pairwise_count; + u8 SNonce[32]; + u32 timeout_interval = TDLS_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 (rtw_tdls_is_setup_allowed(padapter) == _FALSE) + goto exit; + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + 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 + - prx_pkt_attrib->icv_len + - LLC_HEADER_SIZE + - ETH_TYPE_LEN + - PAYLOAD_TYPE_LEN + - FIXED_IE; + + 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 */ + RTW_INFO("re-setup a direct link\n"); + } + /* Already receiving TDLS setup request */ + else if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) { + RTW_INFO("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 */ + else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) { + RTW_INFO("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; + break; + } else if (*(pmyid + i) < *(psa + i)) + goto exit; + } + } + } + + if (ptdls_sta) { + txmgmt.dialog_token = *(ptr + 2); /* Copy dialog token */ + txmgmt.status_code = _STATS_SUCCESSFUL_; + + /* Parsing information element */ + for (j = FIXED_IE; j < parsing_length;) { + + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j); + + 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; k < pairwise_count; k++) { + if (_rtw_memcmp(ppairwise_cipher + 4 * k, RSN_CIPHER_SUITE_CCMP, 4) == _TRUE) + ccmp_included = 1; + } + + if (ccmp_included == 0) + txmgmt.status_code = _STATS_INVALID_RSNIE_; + } + 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 = cpu_to_le32(*(u32 *)(ptr + j + 3)); + break; + case _RIC_Descriptor_IE_: + break; +#ifdef CONFIG_80211N_HT + case _HT_CAPABILITY_IE_: + rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); + break; +#endif +#ifdef CONFIG_80211AC_VHT + case EID_AID: + break; + case EID_VHTCapability: + rtw_tdls_process_vht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); + break; +#endif + 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 (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 && (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) { + _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); + + if (timeout_interval <= 300) + ptdls_sta->TDLS_PeerKey_Lifetime = TDLS_TPK_RESEND_COUNT; + else + ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; + } + + /* Update station supportRate */ + ptdls_sta->bssratelen = supportRateNum; + _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); + + if (!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) + ptdlsinfo->sta_cnt++; + /* -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); +#endif + + } else + goto exit; + + _rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN); + + 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: + + return _SUCCESS; +} + +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; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + 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]; + u8 *pftie = NULL, *ptimeout_ie = NULL, *plinkid_ie = NULL, *prsnie = NULL, *pftie_mic = NULL, *ppairwise_cipher = NULL; + u16 pairwise_count, j, k; + u8 verify_ccmp = 0; + unsigned char supportRate[16]; + int supportRateNum = 0; + struct tdls_txmgmt txmgmt; + int ret = _SUCCESS; + u32 timeout_interval = TDLS_TPK_RESEND_COUNT; + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + if (ptdls_sta == NULL) { + RTW_INFO("[%s] Direct Link Peer = "MAC_FMT" not found\n", __func__, MAC_ARG(psa)); + ret = _FAIL; + goto exit; + } + + 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 + - ETH_TYPE_LEN + - PAYLOAD_TYPE_LEN + - FIXED_IE; + + _rtw_memcpy(&status_code, ptr + 2, 2); + + if (status_code != 0) { + RTW_INFO("[TDLS] %s status_code = %d, free_tdls_sta\n", __FUNCTION__, status_code); + free_tdls_sta(padapter, ptdls_sta); + ret = _FAIL; + goto exit; + } + + status_code = 0; + + /* parsing information element */ + for (j = FIXED_IE; j < parsing_length;) { + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j); + + 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; k < pairwise_count; k++) { + if (_rtw_memcmp(ppairwise_cipher + 4 * k, RSN_CIPHER_SUITE_CCMP, 4) == _TRUE) + verify_ccmp = 1; + } + case _EXT_CAP_IE_: + break; + case _VENDOR_SPECIFIC_IE_: + if (_rtw_memcmp((u8 *)pIE + 2, WMM_INFO_OUI, 6) == _TRUE) { + /* WMM Info ID and OUI */ + if ((pregistrypriv->wmm_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; +#ifdef CONFIG_80211N_HT + case _HT_CAPABILITY_IE_: + rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); + break; +#endif +#ifdef CONFIG_80211AC_VHT + case EID_AID: + /* todo in the future if necessary */ + break; + case EID_VHTCapability: + rtw_tdls_process_vht_cap(padapter, ptdls_sta, pIE->data, pIE->Length); + break; + case EID_OpModeNotification: + rtw_process_vht_op_mode_notify(padapter, pIE->data, ptdls_sta); + break; +#endif + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + plinkid_ie = (u8 *)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + 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); +#endif + + 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) { + RTW_INFO("[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 + txmgmt.status_code = _STATS_INVALID_RSNIE_; + + } else + txmgmt.status_code = _STATS_SUCCESSFUL_; + } + + 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 (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; + ptdls_sta->state |= _FW_LINKED; + _cancel_timer_ex(&ptdls_sta->handshake_timer); + } + + if (prx_pkt_attrib->encrypt) + rtw_tdls_set_key(padapter, ptdls_sta); + + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED); + + } + } + +exit: + if (rtw_tdls_is_driver_setup(padapter) == _TRUE) + return ret; + else + return _SUCCESS; + +} + +int On_TDLS_Setup_Cfm(_adapter *padapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct sta_info *ptdls_sta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + u16 status_code = 0; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE = 5; + u8 *pftie = NULL, *ptimeout_ie = NULL, *plinkid_ie = NULL, *prsnie = NULL, *pftie_mic = NULL, *ppairwise_cipher = NULL; + u16 j, pairwise_count; + int ret = _SUCCESS; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + if (ptdls_sta == NULL) { + RTW_INFO("[%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 + 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 + - ETH_TYPE_LEN + - PAYLOAD_TYPE_LEN + - FIXED_IE; + + _rtw_memcpy(&status_code, ptr + 2, 2); + + if (status_code != 0) { + RTW_INFO("[%s] status_code = %d\n, free_tdls_sta", __FUNCTION__, status_code); + free_tdls_sta(padapter, ptdls_sta); + ret = _FAIL; + goto exit; + } + + /* Parsing information element */ + for (j = FIXED_IE; j < parsing_length;) { + + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j); + + 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; +#ifdef CONFIG_80211N_HT + case _HT_EXTRA_INFO_IE_: + break; +#endif +#ifdef CONFIG_80211AC_VHT + case EID_VHTOperation: + break; + case EID_OpModeNotification: + rtw_process_vht_op_mode_notify(padapter, pIE->data, ptdls_sta); + break; +#endif + case _LINK_ID_IE_: + plinkid_ie = (u8 *)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + if (prx_pkt_attrib->encrypt) { + /* 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; + } + } + + if (rtw_tdls_is_driver_setup(padapter)) { + ptdlsinfo->link_established = _TRUE; + + 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); + } + +exit: + return ret; + +} + +int On_TDLS_Dis_Req(_adapter *padapter, union recv_frame *precv_frame) +{ + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + 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 */ + 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 + 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; + 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 + - ETH_TYPE_LEN + - PAYLOAD_TYPE_LEN + - FIXED_IE; + + /* Parsing information element */ + for (j = FIXED_IE; j < parsing_length;) { + + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j); + + 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); + + } + + issue_tdls_dis_rsp(padapter, &txmgmt, prx_pkt_attrib->privacy); + +exit: + return ret; + +} + +int On_TDLS_Teardown(_adapter *padapter, union recv_frame *precv_frame) +{ + u8 *psa; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + 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); + RTW_INFO("[TDLS] %s Reason code(%d)\n", __FUNCTION__, reason); + + psa = get_sa(ptr); + + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + if (ptdls_sta != NULL) { + if (rtw_tdls_is_driver_setup(padapter)) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEARDOWN_STA_LOCALLY); + } + + return _SUCCESS; + +} + +#if 0 +u8 TDLS_check_ch_state(uint state) +{ + 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 */ + } 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 + 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 { + RTW_INFO("from unknown sta:"MAC_FMT"\n", MAC_ARG(pattrib->src)); + return _FAIL; + } + + return _SUCCESS; +} + +/* 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; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); + 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); + + /* 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) { + if (wmmps_ac) { + _irqL irqL; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe = NULL; + + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + 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) { + 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) { + pxmitframe->attrib.mdata = 1; + pxmitframe->attrib.eosp = 0; + } 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) + RTW_INFO("no buffered packets for tdls to xmit\n"); + else { + RTW_INFO("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); + ptdls_sta->sleepq_len = 0; + } + + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + } + + } + + 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; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE = 4; + u16 j; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct tdls_txmgmt txmgmt; + u8 zaddr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + u16 switch_time = TDLS_CH_SWITCH_TIME * 1000, switch_timeout = TDLS_CH_SWITCH_TIMEOUT * 1000; + u8 take_care_iqk; + + if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) { + RTW_INFO("[TDLS] Ignore %s since channel switch is not allowed\n", __func__); + return _FAIL; + } + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + if (ptdls_sta == NULL) { + RTW_INFO("[%s] Direct Link Peer = "MAC_FMT" not found\n", __func__, MAC_ARG(psa)); + return _FAIL; + } + + 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 + - prx_pkt_attrib->icv_len + - LLC_HEADER_SIZE + - ETH_TYPE_LEN + - PAYLOAD_TYPE_LEN + - FIXED_IE; + + pchsw_info->off_ch_num = *(ptr + 2); + + if ((*(ptr + 2) == 2) && (hal_is_band_support(padapter, BAND_ON_5G))) + pchsw_info->off_ch_num = 44; + + if (pchsw_info->off_ch_num != pmlmeext->cur_channel) + pchsw_info->delay_switch_back = _FALSE; + + /* Parsing information element */ + for (j = FIXED_IE; j < parsing_length;) { + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j); + + switch (pIE->ElementID) { + case EID_SecondaryChnlOffset: + switch (*(pIE->data)) { + case EXTCHNL_OFFSET_UPPER: + pchsw_info->ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case EXTCHNL_OFFSET_LOWER: + pchsw_info->ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + pchsw_info->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + break; + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + ptdls_sta->ch_switch_time = (RTW_GET_LE16(pIE->data) >= TDLS_CH_SWITCH_TIME * 1000) ? + RTW_GET_LE16(pIE->data) : TDLS_CH_SWITCH_TIME * 1000; + ptdls_sta->ch_switch_timeout = (RTW_GET_LE16(pIE->data + 2) >= TDLS_CH_SWITCH_TIMEOUT * 1000) ? + RTW_GET_LE16(pIE->data + 2) : TDLS_CH_SWITCH_TIMEOUT * 1000; + RTW_INFO("[TDLS] %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); + } + + rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk); + if (take_care_iqk == _TRUE) { + u8 central_chnl; + u8 bw_mode; + + bw_mode = (pchsw_info->ch_offset) ? CHANNEL_WIDTH_40 : CHANNEL_WIDTH_20; + central_chnl = rtw_get_center_ch(pchsw_info->off_ch_num, bw_mode, pchsw_info->ch_offset); + if (rtw_hal_ch_sw_iqk_info_search(padapter, central_chnl, bw_mode) < 0) { + if (!(pchsw_info->ch_sw_state & TDLS_CH_SWITCH_PREPARE_STATE)) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_PREPARE); + + return _FAIL; + } + } + + /* cancel ch sw monitor timer for responder */ + if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)) + _cancel_timer_ex(&ptdls_sta->ch_sw_monitor_timer); + + /* Todo: check status */ + txmgmt.status_code = 0; + _rtw_memcpy(txmgmt.peer, psa, ETH_ALEN); + + if (_rtw_memcmp(pchsw_info->addr, zaddr, ETH_ALEN) == _TRUE) + _rtw_memcpy(pchsw_info->addr, ptdls_sta->hwaddr, ETH_ALEN); + + if (ATOMIC_READ(&pchsw_info->chsw_on) == _FALSE) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_START); + + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_RESP); + + 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; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE = 4; + u16 status_code, j, switch_time, switch_timeout; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + int ret = _SUCCESS; + + if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) { + RTW_INFO("[TDLS] Ignore %s since channel switch is not allowed\n", __func__); + return _SUCCESS; + } + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + if (ptdls_sta == NULL) { + RTW_INFO("[%s] Direct Link Peer = "MAC_FMT" not found\n", __func__, MAC_ARG(psa)); + return _FAIL; + } + + /* 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)) { + RTW_INFO("[TDLS] Rx unsolicited channel switch response\n"); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_BASE_CHNL); + goto exit; + } + } + + 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 + - ETH_TYPE_LEN + - PAYLOAD_TYPE_LEN + - FIXED_IE; + + _rtw_memcpy(&status_code, ptr + 2, 2); + + if (status_code != 0) { + RTW_INFO("[TDLS] %s status_code:%d\n", __func__, status_code); + pchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END); + ret = _FAIL; + goto exit; + } + + /* Parsing information element */ + for (j = FIXED_IE; j < parsing_length;) { + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j); + + 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); + } + + if ((pmlmeext->cur_channel == rtw_get_oper_ch(padapter)) && + (pchsw_info->ch_sw_state & TDLS_WAIT_CH_RSP_STATE)) { + if (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_OFF_CHNL); + } + +exit: + return ret; +} +#endif /* CONFIG_TDLS_CH_SW */ + +#ifdef CONFIG_WFD +void wfd_ie_tdls(_adapter *padapter, u8 *pframe, u32 *pktlen) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wifi_display_info *pwfd_info = padapter->tdlsinfo.wfd_info; + u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 }; + u32 wfdielen = 0; + + if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) + return; + + /* 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++] = WFD_ATTR_DEVICE_INFO; + + /* 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 ) */ + 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 */ + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->tdls_rtsp_ctrlport); + wfdielen += 2; + + /* Value3: */ + /* WFD Device Maximum Throughput */ + /* 300Mbps is the maximum throughput */ + RTW_PUT_BE16(wfdie + wfdielen, 300); + wfdielen += 2; + + /* Associated BSSID ATTR */ + /* Type: */ + wfdie[wfdielen++] = WFD_ATTR_ASSOC_BSSID; + + /* 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); + else + _rtw_memset(wfdie + wfdielen, 0x00, ETH_ALEN); + + /* Local IP Address ATTR */ + wfdie[wfdielen++] = WFD_ATTR_LOCAL_IP_ADDR; + + /* 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 */ + wfdie[wfdielen++] = 0x01; + + /* 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 */ + +void rtw_build_tdls_setup_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) +{ + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *ptdls_sta = rtw_get_stainfo((&padapter->stapriv) , pattrib->dst); + + int i = 0 ; + u32 time; + u8 *pframe_head; + + /* 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 = 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_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 = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); + + pframe = rtw_tdls_set_ext_cap(pframe, pattrib); + + if (pattrib->encrypt) { + pframe = rtw_tdls_set_ftie(ptxmgmt + , pframe + , pattrib + , NULL + , ptdls_sta->SNonce); + + pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); + } + +#ifdef CONFIG_80211N_HT + /* Sup_reg_classes(optional) */ + if (pregistrypriv->ht_enable == _TRUE) + pframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib); +#endif + + pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib); + + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); + + if ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE)) + pframe = rtw_tdls_set_qos_cap(pframe, pattrib); + +#ifdef CONFIG_80211AC_VHT + if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pmlmeext->cur_channel > 14) + && REGSTY_IS_11AC_ENABLE(pregistrypriv) + && hal_chk_proto_cap(padapter, PROTO_CAP_11AC) + && (!padapter->mlmepriv.country_ent || COUNTRY_CHPLAN_EN_11AC(padapter->mlmepriv.country_ent)) + ) { + pframe = rtw_tdls_set_aid(padapter, pframe, pattrib); + pframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib); + } +#endif + +#ifdef CONFIG_WFD + if (padapter->wdinfo.wfd_tdls_enable == 1) + wfd_ie_tdls(padapter, pframe, &(pattrib->pktlen)); +#endif + +} + +void rtw_build_tdls_setup_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) +{ + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *ptdls_sta; + 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) + RTW_INFO("[%s] %d ptdls_sta is NULL\n", __FUNCTION__, __LINE__); + + 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; + + 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 (ptxmgmt->status_code != 0) { + RTW_INFO("[%s] status_code:%04x\n", __FUNCTION__, ptxmgmt->status_code); + return; + } + + 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); + + if (pattrib->encrypt) { + prsnie = pframe; + pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _FALSE, ptdls_sta); + } + + pframe = rtw_tdls_set_ext_cap(pframe, pattrib); + + if (pattrib->encrypt) { + if (rtw_tdls_is_driver_setup(padapter) == _TRUE) + wpa_tdls_generate_tpk(padapter, ptdls_sta); + + pftie = pframe; + pftie_mic = pframe + 4; + pframe = rtw_tdls_set_ftie(ptxmgmt + , pframe + , pattrib + , ptdls_sta->ANonce + , ptdls_sta->SNonce); + + ptimeout_ie = pframe; + pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _FALSE, ptdls_sta); + } + +#ifdef CONFIG_80211N_HT + /* Sup_reg_classes(optional) */ + if (pregistrypriv->ht_enable == _TRUE) + pframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib); +#endif + + pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib); + + plinkid_ie = pframe; + pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE); + + /* 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_80211AC_VHT + if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pmlmeext->cur_channel > 14) + && REGSTY_IS_11AC_ENABLE(pregistrypriv) + && hal_chk_proto_cap(padapter, PROTO_CAP_11AC) + && (!padapter->mlmepriv.country_ent || COUNTRY_CHPLAN_EN_11AC(padapter->mlmepriv.country_ent)) + ) { + pframe = rtw_tdls_set_aid(padapter, pframe, pattrib); + pframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib); + pframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode); + } +#endif + +#ifdef CONFIG_WFD + if (padapter->wdinfo.wfd_tdls_enable) + wfd_ie_tdls(padapter, pframe, &(pattrib->pktlen)); +#endif + +} + +void rtw_build_tdls_setup_cfm_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) +{ + 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 sta_info *ptdls_sta = rtw_get_stainfo((&padapter->stapriv) , pattrib->dst); + + unsigned int ie_len; + unsigned char *p; + u8 wmm_param_ele[24] = {0}; + u8 *pftie = NULL, *ptimeout_ie = NULL, *plinkid_ie = NULL, *prsnie = NULL, *pftie_mic = NULL; + + 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 (ptxmgmt->status_code != 0) + return; + + if (pattrib->encrypt) { + prsnie = pframe; + pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta); + } + + if (pattrib->encrypt) { + pftie = pframe; + pftie_mic = pframe + 4; + pframe = rtw_tdls_set_ftie(ptxmgmt + , pframe + , pattrib + , ptdls_sta->ANonce + , ptdls_sta->SNonce); + + ptimeout_ie = pframe; + 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 */ + + plinkid_ie = pframe; + pframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE); + + 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); + + if (ptdls_sta->qos_option == _TRUE) + pframe = rtw_tdls_set_wmm_params(padapter, pframe, pattrib); + +#ifdef CONFIG_80211AC_VHT + if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) + && (ptdls_sta->vhtpriv.vht_option == _TRUE) && (pmlmeext->cur_channel > 14) + && REGSTY_IS_11AC_ENABLE(pregistrypriv) + && hal_chk_proto_cap(padapter, PROTO_CAP_11AC) + && (!padapter->mlmepriv.country_ent || COUNTRY_CHPLAN_EN_11AC(padapter->mlmepriv.country_ent)) + ) { + pframe = rtw_tdls_set_vht_operation(padapter, pframe, pattrib, pmlmeext->cur_channel); + pframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode); + } +#endif +} + +void rtw_build_tdls_teardown_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) +{ + 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; + + 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 (pattrib->encrypt) { + pftie = pframe; + pftie_mic = pframe + 4; + pframe = rtw_tdls_set_ftie(ptxmgmt + , pframe + , pattrib + , ptdls_sta->ANonce + , ptdls_sta->SNonce); + } + + 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; + + 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); + +} + +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 pkt_attrib *pattrib = &pxmitframe->attrib; + u8 *pframe_head, pktlen_index; + + pktlen_index = pattrib->pktlen; + pframe_head = pframe; + + 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); + + pframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib); + + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); + + if (privacy) + pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, NULL); + + pframe = rtw_tdls_set_ext_cap(pframe, pattrib); + + if (privacy) { + pframe = rtw_tdls_set_ftie(ptxmgmt, pframe, pattrib, NULL, NULL); + pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, NULL); + } + +#ifdef CONFIG_80211N_HT + if (pregistrypriv->ht_enable == _TRUE) + pframe = rtw_tdls_set_ht_cap(padapter, pframe_head - pktlen_index, pattrib); +#endif + + 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, struct tdls_txmgmt *ptxmgmt) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 AC_queue = 0; + struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst); + + 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); + + /* PTI control */ + /* PU buffer status */ + if (ptdls_sta->uapsd_bk & BIT(1)) + AC_queue = BIT(0); + if (ptdls_sta->uapsd_be & BIT(1)) + AC_queue = BIT(1); + if (ptdls_sta->uapsd_vi & BIT(1)) + AC_queue = BIT(2); + 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, struct tdls_txmgmt *ptxmgmt) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst); + + 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); +} + +#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 tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + u16 switch_time = TDLS_CH_SWITCH_TIME * 1000, switch_timeout = TDLS_CH_SWITCH_TIMEOUT * 1000; + + ptdls_sta->ch_switch_time = switch_time; + ptdls_sta->ch_switch_timeout = switch_timeout; + + 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); + + if (ptdlsinfo->chsw_info.ch_offset != HAL_PRIME_CHNL_OFFSET_DONT_CARE) { + switch (ptdlsinfo->chsw_info.ch_offset) { + case HAL_PRIME_CHNL_OFFSET_LOWER: + pframe = rtw_tdls_set_second_channel_offset(pframe, pattrib, SCA); + break; + case HAL_PRIME_CHNL_OFFSET_UPPER: + pframe = rtw_tdls_set_second_channel_offset(pframe, pattrib, SCB); + break; + } + } + + 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); + +} + +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; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + + 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->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) +{ + u8 i; + _adapter *iface = NULL; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct wifidirect_info *pwdinfo; + + u8 category = RTW_WLAN_CATEGORY_P2P; + u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; + u8 probe_req = 4; + u8 wfdielen = 0; + + 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)); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + pwdinfo = &iface->wdinfo; + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { + wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + } + } +} + +void rtw_build_tunneled_probe_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe) +{ + u8 i; + _adapter *iface = NULL; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct wifidirect_info *pwdinfo; + u8 category = RTW_WLAN_CATEGORY_P2P; + u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; + u8 probe_rsp = 5; + u8 wfdielen = 0; + + 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)); + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + pwdinfo = &iface->wdinfo; + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { + wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 1); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + } + } +} +#endif /* CONFIG_WFD */ + +void _tdls_tpk_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + struct tdls_txmgmt txmgmt; + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + ptdls_sta->TPK_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 - 3)) { + RTW_INFO("[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, ONE_SEC); +} + +#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; + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; + + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END_TO_BASE_CHNL); + RTW_INFO("[TDLS] %s, can't get traffic from op_ch:%d\n", __func__, rtw_get_oper_ch(padapter)); +} + +void _tdls_delay_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; + + RTW_INFO("[TDLS] %s, op_ch:%d, tdls_state:0x%08x\n", __func__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state); + pchsw_info->delay_switch_back = _TRUE; +} + +void _tdls_stay_on_base_chnl_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; + + if (ptdls_sta != NULL) { + issue_tdls_ch_switch_req(padapter, ptdls_sta); + pchsw_info->ch_sw_state |= TDLS_WAIT_CH_RSP_STATE; + } +} + +void _tdls_ch_switch_monitor_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; + + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END); + RTW_INFO("[TDLS] %s, does not receive ch sw req\n", __func__); +} + +#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; + + _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) { + RTW_INFO("[TDLS] Handshake time out\n"); + if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEARDOWN_STA); + else + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEARDOWN_STA_LOCALLY); + } +} + +void _tdls_pti_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + struct tdls_txmgmt txmgmt; + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + _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) { + RTW_INFO("[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); + } + } +} + +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); +#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); + _init_timer(&psta->stay_on_base_chnl_timer, padapter->pnetdev, _tdls_stay_on_base_chnl_timer_hdl, psta); + _init_timer(&psta->ch_sw_monitor_timer, padapter->pnetdev, _tdls_ch_switch_monitor_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); +} + +void rtw_free_tdls_timer(struct sta_info *psta) +{ + _cancel_timer_ex(&psta->TPK_timer); +#ifdef CONFIG_TDLS_CH_SW + _cancel_timer_ex(&psta->ch_sw_timer); + _cancel_timer_ex(&psta->delay_timer); + _cancel_timer_ex(&psta->stay_on_base_chnl_timer); + _cancel_timer_ex(&psta->ch_sw_monitor_timer); +#endif + _cancel_timer_ex(&psta->handshake_timer); + _cancel_timer_ex(&psta->pti_timer); +} + +u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta) +{ + unsigned char sta_band = 0; + unsigned int tx_ra_bitmap = 0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + + rtw_hal_update_sta_rate_mask(padapter, psta); + tx_ra_bitmap = psta->ra_mask; + + if (pcur_network->Configuration.DSConfig > 14) { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_5N | WIRELESS_11A; + else + sta_band |= WIRELESS_11A; + } else { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; + else if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11G | WIRELESS_11B; + else + sta_band |= WIRELESS_11B; + } + + psta->wireless_mode = sta_band; + + psta->raid = rtw_hal_networktype_to_raid(padapter, psta); + tx_ra_bitmap |= ((psta->raid << 28) & 0xf0000000); + return tx_ra_bitmap; +} + +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/core/rtw_vht.c b/core/rtw_vht.c old mode 100755 new mode 100644 index 0978c01..b467bea --- a/core/rtw_vht.c +++ b/core/rtw_vht.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. @@ -22,49 +22,61 @@ #include #ifdef CONFIG_80211AC_VHT -// 20/40/80, ShortGI, MCS Rate -const u16 VHT_MCS_DATA_RATE[3][2][30] = - { { {13, 26, 39, 52, 78, 104, 117, 130, 156, 156, - 26, 52, 78, 104, 156, 208, 234, 260, 312, 312, - 39, 78, 117, 156, 234, 312, 351, 390, 468, 520}, // Long GI, 20MHz - {14, 29, 43, 58, 87, 116, 130, 144, 173, 173, +/* 20/40/80, ShortGI, MCS Rate */ +const u16 VHT_MCS_DATA_RATE[3][2][30] = { + { { + 13, 26, 39, 52, 78, 104, 117, 130, 156, 156, + 26, 52, 78, 104, 156, 208, 234, 260, 312, 312, + 39, 78, 117, 156, 234, 312, 351, 390, 468, 520 + }, /* Long GI, 20MHz */ + { + 14, 29, 43, 58, 87, 116, 130, 144, 173, 173, 29, 58, 87, 116, 173, 231, 260, 289, 347, 347, - 43, 87, 130, 173, 260, 347,390, 433, 520, 578} }, // Short GI, 20MHz - { {27, 54, 81, 108, 162, 216, 243, 270, 324, 360, + 43, 87, 130, 173, 260, 347, 390, 433, 520, 578 + } + }, /* Short GI, 20MHz */ + { { + 27, 54, 81, 108, 162, 216, 243, 270, 324, 360, 54, 108, 162, 216, 324, 432, 486, 540, 648, 720, - 81, 162, 243, 324, 486, 648, 729, 810, 972, 1080}, // Long GI, 40MHz - {30, 60, 90, 120, 180, 240, 270, 300,360, 400, + 81, 162, 243, 324, 486, 648, 729, 810, 972, 1080 + }, /* Long GI, 40MHz */ + { + 30, 60, 90, 120, 180, 240, 270, 300, 360, 400, 60, 120, 180, 240, 360, 480, 540, 600, 720, 800, - 90, 180, 270, 360, 540, 720, 810, 900, 1080, 1200}}, // Short GI, 40MHz - { {59, 117, 176, 234, 351, 468, 527, 585, 702, 780, + 90, 180, 270, 360, 540, 720, 810, 900, 1080, 1200 + } + }, /* Short GI, 40MHz */ + { { + 59, 117, 176, 234, 351, 468, 527, 585, 702, 780, 117, 234, 351, 468, 702, 936, 1053, 1170, 1404, 1560, - 176, 351, 527, 702, 1053, 1404, 1580, 1755, 2106, 2340}, /* Long GI, 80MHz */ - {65, 130, 195, 260, 390, 520, 585, 650, 780, 867, - 130, 260, 390, 520, 780, 1040, 1170, 1300, 1560,1734, - 195, 390, 585, 780, 1170, 1560, 1755, 1950, 2340, 2600} } /* Short GI, 80MHz */ - }; + 176, 351, 527, 702, 1053, 1404, 1580, 1755, 2106, 2340 + }, /* Long GI, 80MHz */ + { + 65, 130, 195, 260, 390, 520, 585, 650, 780, 867, + 130, 260, 390, 520, 780, 1040, 1170, 1300, 1560, 1734, + 195, 390, 585, 780, 1170, 1560, 1755, 1950, 2340, 2600 + } + } /* Short GI, 80MHz */ +}; u8 rtw_get_vht_highest_rate(u8 *pvht_mcs_map) { u8 i, j; u8 bit_map; u8 vht_mcs_rate = 0; - - for(i = 0; i < 2; i++) - { - if(pvht_mcs_map[i] != 0xff) - { - for(j = 0; j < 8; j += 2) - { + + for (i = 0; i < 2; i++) { + if (pvht_mcs_map[i] != 0xff) { + for (j = 0; j < 8; j += 2) { bit_map = (pvht_mcs_map[i] >> j) & 3; - - if(bit_map != 3) - vht_mcs_rate = MGN_VHT1SS_MCS7 + 10*j/2 + i*40 + bit_map; //VHT rate indications begin from 0x90 + + if (bit_map != 3) + vht_mcs_rate = MGN_VHT1SS_MCS7 + 10 * j / 2 + i * 40 + bit_map; /* VHT rate indications begin from 0x90 */ } } } - - /* DBG_871X("HighestVHTMCSRate is %x\n", vht_mcs_rate); */ + + /* RTW_INFO("HighestVHTMCSRate is %x\n", vht_mcs_rate); */ return vht_mcs_rate; } @@ -73,22 +85,19 @@ u8 rtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map) u8 i, j; u8 bit_map; u8 nss = 0; - - for(i = 0; i < 2; i++) - { - if(pvht_mcs_map[i] != 0xff) - { - for(j = 0; j < 8; j += 2) - { + + for (i = 0; i < 2; i++) { + if (pvht_mcs_map[i] != 0xff) { + for (j = 0; j < 8; j += 2) { bit_map = (pvht_mcs_map[i] >> j) & 3; - - if(bit_map != 3) + + if (bit_map != 3) nss++; } } } - - /* DBG_871X("%s : %dSS\n", __FUNCTION__, nss); */ + + /* RTW_INFO("%s : %dSS\n", __FUNCTION__, nss); */ return nss; } @@ -96,102 +105,121 @@ void rtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map) { u8 i, j; u8 cur_rate, target_rate; - - for(i = 0; i < 2; i++) - { + + for (i = 0; i < 2; i++) { target_mcs_map[i] = 0; - for(j = 0; j < 8; j+=2) - { + for (j = 0; j < 8; j += 2) { cur_rate = (cur_mcs_map[i] >> j) & 3; - if(cur_rate == 3) //0x3 indicates not supported that num of SS + if (cur_rate == 3) /* 0x3 indicates not supported that num of SS */ target_rate = 3; - else if(nss <= ((j/2)+i*4)) + else if (nss <= ((j / 2) + i * 4)) target_rate = 3; - else + else target_rate = cur_rate; target_mcs_map[i] |= (target_rate << j); } } - - //DBG_871X("%s : %dSS\n", __FUNCTION__, nss); + + /* RTW_INFO("%s : %dSS\n", __FUNCTION__, nss); */ } u16 rtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate) { - if(vht_mcs_rate > MGN_VHT3SS_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)]; + /* RTW_INFO("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)]; } void rtw_vht_use_default_setting(_adapter *padapter) { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; struct registry_priv *pregistrypriv = &padapter->registrypriv; BOOLEAN bHwLDPCSupport = _FALSE, bHwSTBCSupport = _FALSE; +#ifdef CONFIG_BEAMFORMING BOOLEAN bHwSupportBeamformer = _FALSE, bHwSupportBeamformee = _FALSE; + u8 mu_bfer, mu_bfee; +#endif /* CONFIG_BEAMFORMING */ u8 rf_type = 0; struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); pvhtpriv->sgi_80m = TEST_FLAG(pregistrypriv->short_gi, BIT2) ? _TRUE : _FALSE; - // LDPC support + /* LDPC support */ rtw_hal_get_def_var(padapter, HAL_DEF_RX_LDPC, (u8 *)&bHwLDPCSupport); CLEAR_FLAGS(pvhtpriv->ldpc_cap); - if(bHwLDPCSupport) - { - if(TEST_FLAG(pregistrypriv->ldpc_cap, BIT0)) + if (bHwLDPCSupport) { + if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT0)) SET_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX); } rtw_hal_get_def_var(padapter, HAL_DEF_TX_LDPC, (u8 *)&bHwLDPCSupport); - if(bHwLDPCSupport) - { - if(TEST_FLAG(pregistrypriv->ldpc_cap, BIT1)) + if (bHwLDPCSupport) { + if (TEST_FLAG(pregistrypriv->ldpc_cap, BIT1)) SET_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX); } if (pvhtpriv->ldpc_cap) - DBG_871X("[VHT] Support LDPC = 0x%02X\n", pvhtpriv->ldpc_cap); + RTW_INFO("[VHT] Support LDPC = 0x%02X\n", pvhtpriv->ldpc_cap); - // STBC + /* STBC */ rtw_hal_get_def_var(padapter, HAL_DEF_TX_STBC, (u8 *)&bHwSTBCSupport); CLEAR_FLAGS(pvhtpriv->stbc_cap); - if(bHwSTBCSupport) - { - if(TEST_FLAG(pregistrypriv->stbc_cap, BIT1)) + if (bHwSTBCSupport) { + if (TEST_FLAG(pregistrypriv->stbc_cap, BIT1)) SET_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX); } rtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)&bHwSTBCSupport); - if(bHwSTBCSupport) - { - if(TEST_FLAG(pregistrypriv->stbc_cap, BIT0)) + if (bHwSTBCSupport) { + if (TEST_FLAG(pregistrypriv->stbc_cap, BIT0)) SET_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX); } if (pvhtpriv->stbc_cap) - DBG_871X("[VHT] Support STBC = 0x%02X\n", pvhtpriv->stbc_cap); + RTW_INFO("[VHT] Support STBC = 0x%02X\n", pvhtpriv->stbc_cap); - // Beamforming setting + /* Beamforming setting */ + CLEAR_FLAGS(pvhtpriv->beamform_cap); +#ifdef CONFIG_BEAMFORMING rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMER, (u8 *)&bHwSupportBeamformer); rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMEE, (u8 *)&bHwSupportBeamformee); - CLEAR_FLAGS(pvhtpriv->beamform_cap); + mu_bfer = _FALSE; + mu_bfee = _FALSE; + rtw_hal_get_def_var(padapter, HAL_DEF_VHT_MU_BEAMFORMER, &mu_bfer); + rtw_hal_get_def_var(padapter, HAL_DEF_VHT_MU_BEAMFORMEE, &mu_bfee); if (TEST_FLAG(pregistrypriv->beamform_cap, BIT0) && bHwSupportBeamformer) { - #ifdef CONFIG_CONCURRENT_MODE - if ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) { - SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); - DBG_871X("[VHT] CONCURRENT AP Support Beamformer\n"); - } else - DBG_871X("[VHT] CONCURRENT not AP ;not allow Support Beamformer\n"); - #else +#ifdef CONFIG_CONCURRENT_MODE + if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); - DBG_871X("[VHT] Support Beamformer\n"); - #endif + RTW_INFO("[VHT] CONCURRENT AP Support Beamformer\n"); + if (TEST_FLAG(pregistrypriv->beamform_cap, BIT(2)) + && (_TRUE == mu_bfer)) { + SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); + RTW_INFO("[VHT] Support MU-MIMO AP\n"); + } + } else + RTW_INFO("[VHT] CONCURRENT not AP ;not allow Support Beamformer\n"); +#else + SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); + RTW_INFO("[VHT] Support Beamformer\n"); + if (TEST_FLAG(pregistrypriv->beamform_cap, BIT(2)) + && (_TRUE == mu_bfer) + && ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) { + SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); + RTW_INFO("[VHT] Support MU-MIMO AP\n"); + } +#endif } - if(TEST_FLAG(pregistrypriv->beamform_cap, BIT1) && bHwSupportBeamformee) - { + if (TEST_FLAG(pregistrypriv->beamform_cap, BIT1) && bHwSupportBeamformee) { SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); - DBG_871X("[VHT] Support Beamformee\n"); + RTW_INFO("[VHT] Support Beamformee\n"); + if (TEST_FLAG(pregistrypriv->beamform_cap, BIT(3)) + && (_TRUE == mu_bfee) + && ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE)) { + SET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE); + RTW_INFO("[VHT] Support MU-MIMO STA\n"); + } } +#endif /* CONFIG_BEAMFORMING */ pvhtpriv->ampdu_len = pregistrypriv->ampdu_factor; @@ -199,47 +227,30 @@ void rtw_vht_use_default_setting(_adapter *padapter) 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) + 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] = 0xfe; /* Only support 1SS MCS 0~9; */ pvhtpriv->vht_mcs_map[1] = 0xff; - if(pregistrypriv->vht_rate_sel == 1) - { - pvhtpriv->vht_mcs_map[0] = 0xfc; // support 1SS MCS 0~7 - } - else if(pregistrypriv->vht_rate_sel == 2) - { - pvhtpriv->vht_mcs_map[0] = 0xfd; // Support 1SS MCS 0~8 - } - else if(pregistrypriv->vht_rate_sel == 3) - { - pvhtpriv->vht_mcs_map[0] = 0xfe; // Support 1SS MCS 0~9 - } - else if(pregistrypriv->vht_rate_sel == 4) - { - pvhtpriv->vht_mcs_map[0] = 0xf0; // support 1SS MCS 0~7 2SS MCS 0~7 - } - else if(pregistrypriv->vht_rate_sel == 5) - { - pvhtpriv->vht_mcs_map[0] = 0xf5; // support 1SS MCS 0~8 2SS MCS 0~8 - } - else if(pregistrypriv->vht_rate_sel == 6) - { - pvhtpriv->vht_mcs_map[0] = 0xfa; // support 1SS MCS 0~9 2SS MCS 0~9 - } - else if(pregistrypriv->vht_rate_sel == 7) - { - pvhtpriv->vht_mcs_map[0] = 0xf8; // support 1SS MCS 0-7 2SS MCS 0~9 - } - else if(pregistrypriv->vht_rate_sel == 8) - { - pvhtpriv->vht_mcs_map[0] = 0xf9; // support 1SS MCS 0-8 2SS MCS 0~9 - } - else if(pregistrypriv->vht_rate_sel == 9) - { - pvhtpriv->vht_mcs_map[0] = 0xf4; // support 1SS MCS 0-7 2SS MCS 0~8 + if (pregistrypriv->vht_rate_sel == 1) { + pvhtpriv->vht_mcs_map[0] = 0xfc; /* support 1SS MCS 0~7 */ + } else if (pregistrypriv->vht_rate_sel == 2) { + pvhtpriv->vht_mcs_map[0] = 0xfd; /* Support 1SS MCS 0~8 */ + } else if (pregistrypriv->vht_rate_sel == 3) { + pvhtpriv->vht_mcs_map[0] = 0xfe; /* Support 1SS MCS 0~9 */ + } else if (pregistrypriv->vht_rate_sel == 4) { + pvhtpriv->vht_mcs_map[0] = 0xf0; /* support 1SS MCS 0~7 2SS MCS 0~7 */ + } else if (pregistrypriv->vht_rate_sel == 5) { + pvhtpriv->vht_mcs_map[0] = 0xf5; /* support 1SS MCS 0~8 2SS MCS 0~8 */ + } else if (pregistrypriv->vht_rate_sel == 6) { + pvhtpriv->vht_mcs_map[0] = 0xfa; /* support 1SS MCS 0~9 2SS MCS 0~9 */ + } else if (pregistrypriv->vht_rate_sel == 7) { + pvhtpriv->vht_mcs_map[0] = 0xf8; /* support 1SS MCS 0-7 2SS MCS 0~9 */ + } else if (pregistrypriv->vht_rate_sel == 8) { + pvhtpriv->vht_mcs_map[0] = 0xf9; /* support 1SS MCS 0-8 2SS MCS 0~9 */ + } else if (pregistrypriv->vht_rate_sel == 9) { + pvhtpriv->vht_mcs_map[0] = 0xf4; /* support 1SS MCS 0-7 2SS MCS 0~8 */ } pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map); @@ -248,32 +259,31 @@ void rtw_vht_use_default_setting(_adapter *padapter) u64 rtw_vht_rate_to_bitmap(u8 *pVHTRate) { - u8 i,j , tmpRate; + u8 i, j , tmpRate; u64 RateBitmap = 0; u8 Bits_3ss = 6; - - for(i = j= 0; i < Bits_3ss; 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){ + switch (tmpRate) { case 2: RateBitmap = RateBitmap | (0x03ff << j); break; case 1: RateBitmap = RateBitmap | (0x01ff << j); - break; + break; case 0: RateBitmap = RateBitmap | (0x00ff << j); - break; + break; default: break; } } - DBG_871X("RateBitmap=%016llx , pVHTRate[0]=%02x, pVHTRate[1]=%02x\n", RateBitmap, pVHTRate[0], pVHTRate[1]); + RTW_INFO("RateBitmap=%016llx , pVHTRate[0]=%02x, pVHTRate[1]=%02x\n", RateBitmap, pVHTRate[0], pVHTRate[1]); return RateBitmap; } @@ -289,21 +299,19 @@ void update_sta_vht_info_apmode(_adapter *padapter, PVOID sta) u16 cur_beamform_cap = 0; u8 *pcap_mcs; - if (pvhtpriv_sta->vht_option == _FALSE) { + if (pvhtpriv_sta->vht_option == _FALSE) return; - } bw_mode = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&pvhtpriv_sta->vht_op_mode_notify); - - //if (bw_mode > psta->bw_mode) + + /* if (bw_mode > psta->bw_mode) */ psta->bw_mode = bw_mode; - // B4 Rx LDPC - if (TEST_FLAG(pvhtpriv_ap->ldpc_cap, LDPC_VHT_ENABLE_TX) && - GET_VHT_CAPABILITY_ELE_RX_LDPC(pvhtpriv_sta->vht_cap)) - { + /* B4 Rx LDPC */ + if (TEST_FLAG(pvhtpriv_ap->ldpc_cap, LDPC_VHT_ENABLE_TX) && + GET_VHT_CAPABILITY_ELE_RX_LDPC(pvhtpriv_sta->vht_cap)) { SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX)); - DBG_871X("Current STA(%d) VHT LDPC = %02X\n", psta->aid, cur_ldpc_cap); + RTW_INFO("Current STA(%d) VHT LDPC = %02X\n", psta->aid, cur_ldpc_cap); } pvhtpriv_sta->ldpc_cap = cur_ldpc_cap; @@ -311,47 +319,45 @@ void update_sta_vht_info_apmode(_adapter *padapter, PVOID sta) psta->bw_mode = pmlmeext->cur_bwmode; if (psta->bw_mode == CHANNEL_WIDTH_80) { - // B5 Short GI for 80 MHz + /* B5 Short GI for 80 MHz */ pvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE; - //DBG_871X("Current STA ShortGI80MHz = %d\n", pvhtpriv_sta->sgi_80m); + /* RTW_INFO("Current STA ShortGI80MHz = %d\n", pvhtpriv_sta->sgi_80m); */ } else if (psta->bw_mode >= CHANNEL_WIDTH_160) { - // B5 Short GI for 80 MHz + /* B5 Short GI for 80 MHz */ pvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI160M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE; - //DBG_871X("Current STA ShortGI160MHz = %d\n", pvhtpriv_sta->sgi_80m); + /* RTW_INFO("Current STA ShortGI160MHz = %d\n", pvhtpriv_sta->sgi_80m); */ } - // B8 B9 B10 Rx STBC - if (TEST_FLAG(pvhtpriv_ap->stbc_cap, STBC_VHT_ENABLE_TX) && - GET_VHT_CAPABILITY_ELE_RX_STBC(pvhtpriv_sta->vht_cap)) - { - SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); - DBG_871X("Current STA(%d) VHT STBC = %02X\n", psta->aid, cur_stbc_cap); + /* B8 B9 B10 Rx STBC */ + if (TEST_FLAG(pvhtpriv_ap->stbc_cap, STBC_VHT_ENABLE_TX) && + GET_VHT_CAPABILITY_ELE_RX_STBC(pvhtpriv_sta->vht_cap)) { + SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); + RTW_INFO("Current STA(%d) VHT STBC = %02X\n", psta->aid, cur_stbc_cap); } pvhtpriv_sta->stbc_cap = cur_stbc_cap; - // B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee - if (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && - GET_VHT_CAPABILITY_ELE_SU_BFEE(pvhtpriv_sta->vht_cap)) - { +#ifdef CONFIG_BEAMFORMING + /* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */ + if (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && + GET_VHT_CAPABILITY_ELE_SU_BFEE(pvhtpriv_sta->vht_cap)) { SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); /*Shift to BEAMFORMING_VHT_BEAMFORMER_STS_CAP*/ - SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pvhtpriv_sta->vht_cap)<<8); + SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pvhtpriv_sta->vht_cap) << 8); } - // B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer + /* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */ if (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) && - GET_VHT_CAPABILITY_ELE_SU_BFER(pvhtpriv_sta->vht_cap)) - { + GET_VHT_CAPABILITY_ELE_SU_BFER(pvhtpriv_sta->vht_cap)) { SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); /*Shit to BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM*/ - SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pvhtpriv_sta->vht_cap)<<12); + SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pvhtpriv_sta->vht_cap) << 12); } pvhtpriv_sta->beamform_cap = cur_beamform_cap; - if (cur_beamform_cap) { - DBG_871X("Current STA(%d) VHT Beamforming Setting = %02X\n", psta->aid, cur_beamform_cap); - } + if (cur_beamform_cap) + RTW_INFO("Current STA(%d) VHT Beamforming Setting = %02X\n", psta->aid, cur_beamform_cap); +#endif - // B23 B24 B25 Maximum A-MPDU Length Exponent + /* B23 B24 B25 Maximum A-MPDU Length Exponent */ pvhtpriv_sta->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pvhtpriv_sta->vht_cap); pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pvhtpriv_sta->vht_cap); @@ -371,13 +377,13 @@ void update_hw_vht_param(_adapter *padapter) ht_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; - if(pvhtpriv->ampdu_len > ht_AMPDU_len) + if (pvhtpriv->ampdu_len > ht_AMPDU_len) rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&pvhtpriv->ampdu_len)); } void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -386,58 +392,100 @@ void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) u8 *pcap_mcs; u8 vht_mcs[2]; - if(pIE==NULL) return; + if (pIE == NULL) + return; - if(pvhtpriv->vht_option == _FALSE) return; + if (pvhtpriv->vht_option == _FALSE) + return; pmlmeinfo->VHT_enable = 1; - // B4 Rx LDPC - if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) && - GET_VHT_CAPABILITY_ELE_RX_LDPC(pIE->data)) - { + /* B4 Rx LDPC */ + if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) && + GET_VHT_CAPABILITY_ELE_RX_LDPC(pIE->data)) { SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX)); - DBG_871X("Current VHT LDPC Setting = %02X\n", cur_ldpc_cap); + RTW_INFO("Current VHT LDPC Setting = %02X\n", cur_ldpc_cap); } pvhtpriv->ldpc_cap = cur_ldpc_cap; - // B5 Short GI for 80 MHz + /* B5 Short GI for 80 MHz */ pvhtpriv->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pIE->data) & pvhtpriv->sgi_80m) ? _TRUE : _FALSE; - //DBG_871X("Current ShortGI80MHz = %d\n", pvhtpriv->sgi_80m); + /* RTW_INFO("Current ShortGI80MHz = %d\n", pvhtpriv->sgi_80m); */ - // B8 B9 B10 Rx STBC - if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) && - GET_VHT_CAPABILITY_ELE_RX_STBC(pIE->data)) - { - SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); - DBG_871X("Current VHT STBC Setting = %02X\n", cur_stbc_cap); + /* B8 B9 B10 Rx STBC */ + if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) && + GET_VHT_CAPABILITY_ELE_RX_STBC(pIE->data)) { + SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); + RTW_INFO("Current VHT STBC Setting = %02X\n", cur_stbc_cap); } pvhtpriv->stbc_cap = cur_stbc_cap; +#ifdef CONFIG_BEAMFORMING +#ifdef RTW_BEAMFORMING_VERSION_2 + /* + * B11 SU Beamformer Capable, + * the target supports Beamformer and we are Beamformee + */ + if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) + && GET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data)) { + SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); - // B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee - if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && - GET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data)) - { + /* Shift to BEAMFORMING_VHT_BEAMFORMEE_STS_CAP */ + SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pIE->data) << 8); + + /* + * B19 MU Beamformer Capable, + * the target supports Beamformer and we are Beamformee + */ + if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE) + && GET_VHT_CAPABILITY_ELE_MU_BFER(pIE->data)) + SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE); + } + + /* + * B12 SU Beamformee Capable, + * the target supports Beamformee and we are Beamformer + */ + if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) + && GET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data)) { + SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); + + /* Shit to BEAMFORMING_VHT_BEAMFORMER_SOUND_DIM */ + SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pIE->data) << 12); + + /* + * B20 MU Beamformee Capable, + * the target supports Beamformee and we are Beamformer + */ + if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE) + && GET_VHT_CAPABILITY_ELE_MU_BFEE(pIE->data)) + SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE); + } + + pvhtpriv->beamform_cap = cur_beamform_cap; + RTW_INFO("Current VHT Beamforming Setting=0x%04X\n", cur_beamform_cap); +#else /* !RTW_BEAMFORMING_VERSION_2 */ + /* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */ + if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && + GET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data)) { SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE); /*Shift to BEAMFORMING_VHT_BEAMFORMER_STS_CAP*/ - SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pIE->data)<<8); + SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pIE->data) << 8); } - // B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer + /* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) && - GET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data)) - { + GET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data)) { SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE); /*Shit to BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM*/ - SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pIE->data)<<12); - + SET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pIE->data) << 12); + } pvhtpriv->beamform_cap = cur_beamform_cap; - if (cur_beamform_cap) { - DBG_871X("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap); - } - - // B23 B24 B25 Maximum A-MPDU Length Exponent + if (cur_beamform_cap) + RTW_INFO("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap); +#endif /* !RTW_BEAMFORMING_VERSION_2 */ +#endif /* CONFIG_BEAMFORMING */ + /* B23 B24 B25 Maximum A-MPDU Length Exponent */ pvhtpriv->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pIE->data); pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pIE->data); @@ -458,18 +506,20 @@ void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) void VHT_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; - if(pIE==NULL) return; + if (pIE == NULL) + return; - if(pvhtpriv->vht_option == _FALSE) return; + if (pvhtpriv->vht_option == _FALSE) + return; } void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta) { struct sta_info *psta = (struct sta_info *)sta; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct registry_priv *regsty = adapter_to_regsty(padapter); @@ -478,16 +528,16 @@ void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta) u8 update_ra = _FALSE; u8 vht_mcs_map[2] = {}; - if(pvhtpriv->vht_option == _FALSE) + if (pvhtpriv->vht_option == _FALSE) return; target_bw = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(pframe); - target_rxss = (GET_VHT_OPERATING_MODE_FIELD_RX_NSS(pframe)+1); + target_rxss = (GET_VHT_OPERATING_MODE_FIELD_RX_NSS(pframe) + 1); if (target_bw != psta->bw_mode) { if (hal_is_bw_support(padapter, target_bw) - && REGSTY_IS_BW_5G_SUPPORT(regsty, target_bw) - ) { + && REGSTY_IS_BW_5G_SUPPORT(regsty, target_bw) + ) { update_ra = _TRUE; psta->bw_mode = target_bw; } @@ -499,13 +549,12 @@ void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta) rtw_vht_nss_to_mcsmap(target_rxss, vht_mcs_map, psta->vhtpriv.vht_mcs_map); _rtw_memcpy(psta->vhtpriv.vht_mcs_map, vht_mcs_map, 2); - + rtw_hal_update_sta_rate_mask(padapter, psta); } - if (update_ra) { + if (update_ra) rtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta); - } } u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel) @@ -513,20 +562,20 @@ u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel) struct registry_priv *pregistrypriv = &padapter->registrypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; - //struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + /* struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; */ u8 ChnlWidth, center_freq, bw_mode, rf_type = 0; u32 len = 0; u8 operation[5]; - + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - + _rtw_memset(operation, 0, 5); bw_mode = REGSTY_BW_5G(pregistrypriv); /* TODO: control op bw with other info */ if (hal_chk_bw_cap(padapter, BW_CAP_80M | BW_CAP_160M) - && REGSTY_BW_5G(pregistrypriv) >= CHANNEL_WIDTH_80 - ) { + && REGSTY_BW_5G(pregistrypriv) >= CHANNEL_WIDTH_80 + ) { center_freq = rtw_get_center_ch(channel, bw_mode, HAL_PRIME_CHNL_OFFSET_LOWER); ChnlWidth = 1; } else { @@ -534,39 +583,39 @@ u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel) ChnlWidth = 0; } - + SET_VHT_OPERATION_ELE_CHL_WIDTH(operation, ChnlWidth); - //center frequency - SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(operation, center_freq);//Todo: need to set correct center channel - SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(operation,0); - + /* center frequency */ + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(operation, center_freq);/* Todo: need to set correct center channel */ + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(operation, 0); + if (padapter->registrypriv.rf_config != RF_MAX_TYPE) rf_type = padapter->registrypriv.rf_config; - + switch (rf_type) { case RF_1T1R: - operation[3] = 0xfe; - operation[4] = 0xff; - break; + operation[3] = 0xfe; + operation[4] = 0xff; + break; case RF_1T2R: case RF_2T2R: case RF_2T2R_GREEN: - operation[3] = 0xfa; - operation[4] = 0xff; - break; + operation[3] = 0xfa; + operation[4] = 0xff; + break; case RF_2T3R: case RF_2T4R: case RF_3T3R: case RF_3T4R: - operation[3] = 0xea; - operation[4] = 0xff; - break; + operation[3] = 0xea; + operation[4] = 0xff; + break; case RF_4T4R: - operation[3] = 0xaa; - operation[4] = 0xff; - break; + operation[3] = 0xaa; + operation[4] = 0xff; + break; default: - DBG_871X("%s, %d, unknown rf type\n", __func__, __LINE__); + RTW_INFO("%s, %d, unknown rf type\n", __func__, __LINE__); } rtw_set_ie(pbuf, EID_VHTOperation, 5, operation, &len); @@ -576,7 +625,7 @@ 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) { - //struct registry_priv *pregistrypriv = &padapter->registrypriv; + /* struct registry_priv *pregistrypriv = &padapter->registrypriv; */ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; u32 len = 0; @@ -586,16 +635,16 @@ 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_3T3R) + if (rf_type == RF_3T3R) rx_nss = 3; - else if(rf_type == RF_2T2R) + 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)); - SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(&opmode, 0); //Todo + SET_VHT_OPERATING_MODE_FIELD_RX_NSS(&opmode, (rx_nss - 1)); + SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(&opmode, 0); /* Todo */ pvhtpriv->vht_op_mode_notify = opmode; @@ -606,94 +655,111 @@ u32 rtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw) u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf) { - u8 bw, rf_type, rf_num; + u8 bw, rf_type, rf_num, rx_stbc_nss = 0; u16 HighestRate; u8 *pcap, *pcap_mcs; u32 len = 0; + u32 rx_packet_offset, max_recvbuf_sz; struct registry_priv *pregistrypriv = &padapter->registrypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; pcap = pvhtpriv->vht_cap; _rtw_memset(pcap, 0, 32); - + /* B0 B1 Maximum MPDU Length */ - SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 2); - + rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + + RTW_DBG("%s, line%d, Available RX buf size = %d bytes\n.", __FUNCTION__, __LINE__, max_recvbuf_sz - rx_packet_offset); + + if ((max_recvbuf_sz - rx_packet_offset) >= 11454) { + SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 2); + RTW_INFO("%s, line%d, Set MAX MPDU len = 11454 bytes\n.", __FUNCTION__, __LINE__); + } else if ((max_recvbuf_sz - rx_packet_offset) >= 7991) { + SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 1); + RTW_INFO("%s, line%d, Set MAX MPDU len = 7991 bytes\n.", __FUNCTION__, __LINE__); + } else if ((max_recvbuf_sz - rx_packet_offset) >= 3895) { + SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 0); + RTW_INFO("%s, line%d, Set MAX MPDU len = 3895 bytes\n.", __FUNCTION__, __LINE__); + } else + RTW_ERR("%s, line%d, Error!! Available RX buf size < 3895 bytes\n.", __FUNCTION__, __LINE__); + /* B2 B3 Supported Channel Width Set */ if (hal_chk_bw_cap(padapter, BW_CAP_160M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_160)) { if (hal_chk_bw_cap(padapter, BW_CAP_80_80M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_80_80)) SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 2); else SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 1); - } else { + } else SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 0); - } - // B4 Rx LDPC - if(TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX)) - { + /* B4 Rx LDPC */ + if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX)) { SET_VHT_CAPABILITY_ELE_RX_LDPC(pcap, 1); + RTW_INFO("[VHT] Declare supporting RX LDPC\n"); } - // B5 ShortGI for 80MHz - SET_VHT_CAPABILITY_ELE_SHORT_GI80M(pcap, pvhtpriv->sgi_80m? 1 : 0); // We can receive Short GI of 80M + /* B5 ShortGI for 80MHz */ + SET_VHT_CAPABILITY_ELE_SHORT_GI80M(pcap, pvhtpriv->sgi_80m ? 1 : 0); /* We can receive Short GI of 80M */ + if (pvhtpriv->sgi_80m) + RTW_INFO("[VHT] Declare supporting SGI 80MHz\n"); - // B6 ShortGI for 160MHz - //SET_VHT_CAPABILITY_ELE_SHORT_GI160M(pcap, pvhtpriv->sgi_80m? 1 : 0); + /* B6 ShortGI for 160MHz */ + /* SET_VHT_CAPABILITY_ELE_SHORT_GI160M(pcap, pvhtpriv->sgi_80m? 1 : 0); */ - // B7 Tx STBC - if(TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX)) - { + /* B7 Tx STBC */ + if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX)) { SET_VHT_CAPABILITY_ELE_TX_STBC(pcap, 1); + RTW_INFO("[VHT] Declare supporting TX STBC\n"); } - // B8 B9 B10 Rx STBC - if(TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX)) - { - rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - if ((rf_type == RF_2T2R) || (rf_type == RF_1T2R)) - rf_num = 1; - else if (rf_type == RF_1T1R) - rf_num = 1; - - SET_VHT_CAPABILITY_ELE_RX_STBC(pcap, rf_num); + /* B8 B9 B10 Rx STBC */ + if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX)) { + rtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)(&rx_stbc_nss)); + + SET_VHT_CAPABILITY_ELE_RX_STBC(pcap, rx_stbc_nss); + RTW_INFO("[VHT] Declare supporting RX STBC = %d\n", rx_stbc_nss); } - // B11 SU Beamformer Capable - if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) { + /* B11 SU Beamformer Capable */ + if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) { SET_VHT_CAPABILITY_ELE_SU_BFER(pcap, 1); - // B16 17 18 Number of Sounding Dimensions + RTW_INFO("[VHT] Declare supporting SU Bfer\n"); + /* B16 17 18 Number of Sounding Dimensions */ rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMER_CAP, (u8 *)&rf_num); SET_VHT_CAPABILITY_ELE_SOUNDING_DIMENSIONS(pcap, rf_num); + /* B19 MU Beamformer Capable */ + if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE)) { + SET_VHT_CAPABILITY_ELE_MU_BFER(pcap, 1); + RTW_INFO("[VHT] Declare supporting MU Bfer\n"); + } } - // B12 SU Beamformee Capable + /* B12 SU Beamformee Capable */ if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) { SET_VHT_CAPABILITY_ELE_SU_BFEE(pcap, 1); - // B13 14 15 Compressed Steering Number of Beamformer Antennas Supported + RTW_INFO("[VHT] Declare supporting SU Bfee\n"); + /* B13 14 15 Compressed Steering Number of Beamformer Antennas Supported */ rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMEE_CAP, (u8 *)&rf_num); SET_VHT_CAPABILITY_ELE_BFER_ANT_SUPP(pcap, rf_num); + /* B20 SU Beamformee Capable */ + if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE)) { + SET_VHT_CAPABILITY_ELE_MU_BFEE(pcap, 1); + RTW_INFO("[VHT] Declare supporting MU Bfee\n"); + } } - // B19 MU Beamformer Capable - SET_VHT_CAPABILITY_ELE_MU_BFER(pcap, 0); //HW don't support mu bfee/bfer - // B20 MU Beamformee Capable - SET_VHT_CAPABILITY_ELE_MU_BFEE(pcap, 0); - // B21 VHT TXOP PS + /* B21 VHT TXOP PS */ SET_VHT_CAPABILITY_ELE_TXOP_PS(pcap, 0); - // B22 +HTC-VHT Capable + /* B22 +HTC-VHT Capable */ SET_VHT_CAPABILITY_ELE_HTC_VHT(pcap, 1); - // B23 24 25 Maximum A-MPDU Length Exponent + /* B23 24 25 Maximum A-MPDU Length Exponent */ if (pregistrypriv->ampdu_factor != 0xFE) - { SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pcap, pregistrypriv->ampdu_factor); - } else - { SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pcap, 7); - } - // B26 27 VHT Link Adaptation Capable + /* B26 27 VHT Link Adaptation Capable */ SET_VHT_CAPABILITY_ELE_LINK_ADAPTION(pcap, 0); pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pcap); @@ -705,11 +771,11 @@ u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf) /* find the largest bw supported by both registry and hal */ bw = hal_largest_bw(padapter, REGSTY_BW_5G(pregistrypriv)); - HighestRate = VHT_MCS_DATA_RATE[bw][pvhtpriv->sgi_80m][((pvhtpriv->vht_highest_rate - MGN_VHT1SS_MCS0)&0x3f)]; - HighestRate = (HighestRate+1) >> 1; + HighestRate = VHT_MCS_DATA_RATE[bw][pvhtpriv->sgi_80m][((pvhtpriv->vht_highest_rate - MGN_VHT1SS_MCS0) & 0x3f)]; + HighestRate = (HighestRate + 1) >> 1; - SET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(pcap, HighestRate); //indicate we support highest rx rate is 600Mbps. - SET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(pcap, HighestRate); //indicate we support highest tx rate is 600Mbps. + SET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(pcap, HighestRate); /* indicate we support highest rx rate is 600Mbps. */ + SET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(pcap, HighestRate); /* indicate we support highest tx rate is 600Mbps. */ pbuf = rtw_set_ie(pbuf, EID_VHTCapability, 12, pcap, &len); @@ -718,8 +784,8 @@ u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf) u32 rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len) { - u32 ielen=0, out_len=0; - u8 cap_len=0, notify_len=0, notify_bw=0, operation_bw=0, supported_chnl_width=0; + u32 ielen = 0, out_len = 0; + u8 cap_len = 0, notify_len = 0, notify_bw = 0, operation_bw = 0, supported_chnl_width = 0; u8 *p, *pframe; struct registry_priv *pregistrypriv = &padapter->registrypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -727,29 +793,29 @@ u32 rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_le rtw_vht_use_default_setting(padapter); - p = rtw_get_ie(in_ie+12, EID_VHTCapability, &ielen, in_len-12); - if (p && ielen>0) { - supported_chnl_width = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(p+2); - - // VHT Capabilities element - cap_len = rtw_build_vht_cap_ie(padapter, out_ie+*pout_len); + p = rtw_get_ie(in_ie + 12, EID_VHTCapability, &ielen, in_len - 12); + if (p && ielen > 0) { + supported_chnl_width = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(p + 2); + + /* VHT Capabilities element */ + cap_len = rtw_build_vht_cap_ie(padapter, out_ie + *pout_len); *pout_len += cap_len; - // Get HT BW - p = rtw_get_ie(in_ie+12, _HT_EXTRA_INFO_IE_, &ielen, in_len-12); - if (p && ielen>0) { - struct HT_info_element *pht_info = (struct HT_info_element *)(p+2); + /* Get HT BW */ + p = rtw_get_ie(in_ie + 12, _HT_EXTRA_INFO_IE_, &ielen, in_len - 12); + if (p && ielen > 0) { + struct HT_info_element *pht_info = (struct HT_info_element *)(p + 2); if (pht_info->infos[0] & BIT(2)) operation_bw = CHANNEL_WIDTH_40; else operation_bw = CHANNEL_WIDTH_20; } - // VHT Operation element - p = rtw_get_ie(in_ie+12, EID_VHTOperation, &ielen, in_len-12); - if (p && ielen>0) { + /* VHT Operation element */ + p = rtw_get_ie(in_ie + 12, EID_VHTOperation, &ielen, in_len - 12); + if (p && ielen > 0) { out_len = *pout_len; - if (GET_VHT_OPERATION_ELE_CHL_WIDTH(p+2) >= 1) { + if (GET_VHT_OPERATION_ELE_CHL_WIDTH(p + 2) >= 1) { if (supported_chnl_width == 2) operation_bw = CHANNEL_WIDTH_80_80; else if (supported_chnl_width == 1) @@ -757,7 +823,7 @@ u32 rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_le else operation_bw = CHANNEL_WIDTH_80; } - pframe = rtw_set_ie(out_ie+out_len, EID_VHTOperation, ielen, p+2 , pout_len); + pframe = rtw_set_ie(out_ie + out_len, EID_VHTOperation, ielen, p + 2 , pout_len); } /* find the largest bw supported by both registry and hal */ @@ -766,15 +832,15 @@ u32 rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_le if (notify_bw > operation_bw) notify_bw = operation_bw; - // Operating Mode Notification element - notify_len = rtw_build_vht_op_mode_notify_ie(padapter, out_ie+*pout_len, notify_bw); + /* Operating Mode Notification element */ + notify_len = rtw_build_vht_op_mode_notify_ie(padapter, out_ie + *pout_len, notify_bw); *pout_len += notify_len; pvhtpriv->vht_option = _TRUE; } - - return (pvhtpriv->vht_option); - + + return pvhtpriv->vht_option; + } void VHTOnAssocRsp(_adapter *padapter) @@ -784,8 +850,8 @@ void VHTOnAssocRsp(_adapter *padapter) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 ht_AMPDU_len; - - DBG_871X("%s\n", __FUNCTION__); + + RTW_INFO("%s\n", __FUNCTION__); if (!pmlmeinfo->HT_enable) return; @@ -795,11 +861,10 @@ void VHTOnAssocRsp(_adapter *padapter) ht_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; - if(pvhtpriv->ampdu_len > ht_AMPDU_len) + if (pvhtpriv->ampdu_len > ht_AMPDU_len) rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&pvhtpriv->ampdu_len)); rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MAX_TIME, (u8 *)(&pvhtpriv->vht_highest_rate)); } -#endif //CONFIG_80211AC_VHT - +#endif /* CONFIG_80211AC_VHT */ diff --git a/core/rtw_wapi.c b/core/rtw_wapi.c old mode 100755 new mode 100644 index d4835da..5b84f77 --- a/core/rtw_wapi.c +++ b/core/rtw_wapi.c @@ -1,1326 +1,1240 @@ -#ifdef CONFIG_WAPI_SUPPORT - -#include -#include -#include -#include - - -u32 wapi_debug_component = -// WAPI_INIT | -// WAPI_API | -// WAPI_TX | -// WAPI_RX | - WAPI_ERR ; //always open err flags on - -void WapiFreeAllStaInfo(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - PRT_WAPI_STA_INFO pWapiStaInfo; - PRT_WAPI_BKID pWapiBkid; - - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - pWapiInfo = &padapter->wapiInfo; - - //Pust to Idle List - rtw_wapi_return_all_sta_info(padapter); - - //Sta Info List - while(!list_empty(&(pWapiInfo->wapiSTAIdleList))) - { - pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); - list_del_init(&pWapiStaInfo->list); - } - - //BKID List - while(!list_empty(&(pWapiInfo->wapiBKIDIdleList))) - { - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - } - WAPI_TRACE(WAPI_INIT, "<=========== %s\n", __FUNCTION__); - return; -} - -void WapiSetIE(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - //PRT_WAPI_BKID pWapiBkid; - u16 protocolVer = 1; - u16 akmCnt = 1; - u16 suiteCnt = 1; - u16 capability = 0; - u8 OUI[3]; - - OUI[0] = 0x00; - OUI[1] = 0x14; - OUI[2] = 0x72; - - pWapiInfo->wapiIELength = 0; -//protocol version - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &protocolVer, 2); - pWapiInfo->wapiIELength +=2; -//akm - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &akmCnt, 2); - pWapiInfo->wapiIELength +=2; - - if(pWapiInfo->bWapiPSK){ - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2; - pWapiInfo->wapiIELength +=1; - }else{ - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; - pWapiInfo->wapiIELength +=1; - } - -//usk - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &suiteCnt, 2); - pWapiInfo->wapiIELength +=2; - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; - pWapiInfo->wapiIELength +=1; - -//msk - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; - pWapiInfo->wapiIELength +=1; - -//Capbility - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &capability, 2); - pWapiInfo->wapiIELength +=2; -} - - -/* PN1 > PN2, return 1, - * else return 0. - */ -u32 WapiComparePN(u8 *PN1, u8 *PN2) -{ - char i; - - if ((NULL == PN1) || (NULL == PN2)) - return 1; - - // overflow case - if ((PN2[15] - PN1[15]) & 0x80) - return 1; - - for (i=16; i>0; i--) - { - if(PN1[i-1] == PN2[i-1]) - continue; - else if(PN1[i-1] > PN2[i-1]) - return 1; - else - return 0; - } - - return 0; -} - -u8 -WapiGetEntryForCamWrite(_adapter *padapter,u8 *pMacAddr,u8 KID,BOOLEAN IsMsk) -{ - PRT_WAPI_T pWapiInfo=NULL; - //PRT_WAPI_CAM_ENTRY pEntry=NULL; - u8 i=0; - u8 ret = 0xff; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - //exist? - for(i=0;iwapiCamEntry[i].IsUsed - && (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) - && pWapiInfo->wapiCamEntry[i].keyidx == KID - && pWapiInfo->wapiCamEntry[i].type == IsMsk) - { - ret = pWapiInfo->wapiCamEntry[i].entry_idx; //cover it - break; - } - } - - if(i == WAPI_CAM_ENTRY_NUM) //not found - { - for(i=0;iwapiCamEntry[i].IsUsed == 0) - { - pWapiInfo->wapiCamEntry[i].IsUsed = 1; - pWapiInfo->wapiCamEntry[i].type = IsMsk; - pWapiInfo->wapiCamEntry[i].keyidx = KID; - _rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr,ETH_ALEN); - ret = pWapiInfo->wapiCamEntry[i].entry_idx; - break; - } - } - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - return ret; - -/* - if(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)){ - RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); - return 0; - } - - pEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList); - RTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list); - - RT_TRACE(COMP_SEC,DBG_LOUD,("<====WapiGetCamEntry(),Get Entry Idx:%d.but we just return 4 for test\n",pEntry->entry_idx)); - - return pEntry->entry_idx;*/ -} - -u8 WapiGetEntryForCamClear(_adapter *padapter,u8 *pPeerMac,u8 keyid,u8 IsMsk) -{ - PRT_WAPI_T pWapiInfo=NULL; - u8 i=0; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - for(i=0;iwapiCamEntry[i].IsUsed - && (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) - && pWapiInfo->wapiCamEntry[i].keyidx == keyid - && pWapiInfo->wapiCamEntry[i].type == IsMsk) - { - pWapiInfo->wapiCamEntry[i].IsUsed = 0; - pWapiInfo->wapiCamEntry[i].keyidx = 2; - _rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr,0,ETH_ALEN); - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - return pWapiInfo->wapiCamEntry[i].entry_idx; - } - } - - WAPI_TRACE(WAPI_API,"<====WapiGetReturnCamEntry(), No this cam entry.\n"); - return 0xff; -/* - if(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)){ - RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); - return FALSE; - } - - pList = &pWapiInfo->wapiCamUsedList; - while(pList->Flink != &pWapiInfo->wapiCamUsedList) - { - pEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink; - if(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0 - && keyid == pEntry->keyidx) - { - RTRemoveEntryList(pList); - RTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList); - return pEntry->entry_idx; - } - pList = pList->Flink; - } - - return 0; -*/ -} - -void -WapiResetAllCamEntry(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - int i; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - for (i=0;iwapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN); - pWapiInfo->wapiCamEntry[i].IsUsed = 0; - pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid - pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - - return; -} - -u8 WapiWriteOneCamEntry( - _adapter *padapter, - u8 *pMacAddr, - u8 KeyId, - u8 EntryId, - u8 EncAlg, - u8 bGroupKey, - u8 *pKey -) -{ - u8 retVal = 0; - u16 usConfig = 0; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if(EntryId >= 32) - { - WAPI_TRACE(WAPI_ERR, "<=== CamAddOneEntry(): ulKeyId exceed!\n"); - return retVal; - } - - usConfig=usConfig|(0x01<<15)|((u16)(EncAlg)<<2)|(KeyId); - - if(EncAlg == _SMS4_ ) - { - if(bGroupKey == 1) - usConfig |= (0x01<<6); - if((EntryId % 2)==1) // ==0 sec key; == 1mic key - usConfig |= (0x01<<5); - } - - write_cam(padapter, EntryId, usConfig, pMacAddr, pKey); - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - return 1; -} - -void rtw_wapi_init(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - int i; - - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - RT_ASSERT_RET(padapter); - - if (!padapter->WapiSupport) - { - WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - pWapiInfo = &padapter->wapiInfo; - pWapiInfo->bWapiEnable = false; - - //Init BKID List - INIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList); - INIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList); - for(i=0;iwapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList); - } - - //Init STA List - INIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList); - INIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList); - for(i=0;iwapiSta[i].list, &pWapiInfo->wapiSTAIdleList); - } - - for (i=0;iwapiCamEntry[i].IsUsed = 0; - pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid - pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; - } - - WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_free(_adapter *padapter) -{ - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - RT_ASSERT_RET(padapter); - - if (!padapter->WapiSupport) - { - WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiFreeAllStaInfo(padapter); - - WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_disable_tx(_adapter *padapter) -{ - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - RT_ASSERT_RET(padapter); - - if (!padapter->WapiSupport) - { - WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - padapter->wapiInfo.wapiTxMsk.bTxEnable = false; - padapter->wapiInfo.wapiTxMsk.bSet = false; - - WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); -} - -u8 rtw_wapi_is_wai_packet(_adapter* padapter,u8 *pkt_data) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 WaiPkt = 0, *pTaddr, bFind = false; - u8 Offset_TypeWAI = 0 ; // (mac header len + llc length) - - WAPI_TRACE(WAPI_TX|WAPI_RX, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return 0; - } - - Offset_TypeWAI = 24 + 6 ; - - //YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4. - if ((pkt_data[1]&0x40) !=0) - { - //DBG_871X("data is privacy \n"); - return 0; - } - - pTaddr = GetAddr2Ptr(pkt_data); - if(list_empty(&pWapiInfo->wapiSTAUsedList)){ - bFind = false; - }else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ - if (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) { - bFind = true; - break; - } - } - } - - WAPI_TRACE(WAPI_TX|WAPI_RX, "%s: bFind=%d pTaddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(pTaddr)); - - if (pkt_data[0] == WIFI_QOS_DATA_TYPE) - { - Offset_TypeWAI += 2; - } - - // 88b4? - if( (pkt_data[Offset_TypeWAI]==0x88) && (pkt_data[Offset_TypeWAI+1]==0xb4) ){ - WaiPkt = pkt_data[Offset_TypeWAI+5]; - - psecuritypriv->hw_decrypted = _TRUE; - }else{ - WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): non wai packet\n",__FUNCTION__); - } - - WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): Recvd WAI frame. IsWAIPkt(%d)\n",__FUNCTION__, WaiPkt); - - return WaiPkt; -} - - -void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - struct recv_frame_hdr *precv_hdr; - u8 *ptr; - u8 *pTA; - u8 *pRecvPN; - - - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - precv_hdr = &precv_frame->u.hdr; - ptr = precv_hdr->rx_data; - - if (precv_hdr->attrib.qos == 1) - { - precv_hdr->UserPriority = GetTid(ptr); - } - else - { - precv_hdr->UserPriority = 0; - } - - pTA = GetAddr2Ptr(ptr); - _rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6); - pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2; - _rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16); - - WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); -} - -/**************************************************************************** -TRUE-----------------Drop -FALSE---------------- handle -add to support WAPI to N-mode -*****************************************************************************/ -u8 rtw_wapi_check_for_drop( - _adapter *padapter, - union recv_frame *precv_frame -) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 *pLastRecvPN = NULL; - u8 bFind = false; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 bDrop = false; - struct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 *ptr = precv_frame->u.hdr.rx_data; - int i; - - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return false; - } - - if(precv_hdr->bIsWaiPacket !=0) - { - if(precv_hdr->bIsWaiPacket== 0x8) - { - - DBG_871X("rtw_wapi_check_for_drop: dump packet \n"); - for(i=0;i<50;i++) - { - DBG_871X("%02X ",ptr[i]); - if((i+1) %8 ==0) - DBG_871X("\n"); - } - DBG_871X("\n rtw_wapi_check_for_drop: dump packet \n"); - - for(i=0;i<16;i++) - { - if(ptr[i+27] !=0) - break; - } - - if(i== 16) - { - WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: drop with zero BKID \n"); - return true; - } - else - { - return false; - } - } - else - return false; - } - - if(list_empty(&pWapiInfo->wapiSTAUsedList)){ - bFind = false; - }else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) { - bFind = true; - break; - } - } - } - WAPI_TRACE(WAPI_RX, "%s: bFind=%d prxb->WapiSrcAddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr)); - - if(bFind) - { - if(IS_MCAST(precv_hdr->attrib.ra)) - { - WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: multicast case \n"); - pLastRecvPN = pWapiSta->lastRxMulticastPN; - } - else - { - WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: unicast case \n"); - switch(precv_hdr->UserPriority) - { - case 0: - case 3: - pLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue; - break; - case 1: - case 2: - pLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue; - break; - case 4: - case 5: - pLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue; - break; - case 6: - case 7: - pLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue; - break; - default: - WAPI_TRACE(WAPI_ERR,"%s: Unknown TID \n",__FUNCTION__); - break; - } - } - - if(!WapiComparePN(precv_hdr->WapiTempPN,pLastRecvPN)) - { - WAPI_TRACE(WAPI_RX,"%s: Equal PN!!\n",__FUNCTION__); - if(IS_MCAST(precv_hdr->attrib.ra)) - _rtw_memcpy(pLastRecvPN,WapiAEMultiCastPNInitialValueSrc,16); - else - _rtw_memcpy(pLastRecvPN,WapiAEPNInitialValueSrc,16); - bDrop = true; - } - else - { - _rtw_memcpy(pLastRecvPN,precv_hdr->WapiTempPN,16); - } - } - - WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); - return bDrop; -} - -void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 WapiIELength = 0; - - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiSetIE(padapter); - WapiIELength = pWapiInfo->wapiIELength; - pframe[0] = _WAPI_IE_; - pframe[1] = WapiIELength; - _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); - pframe += WapiIELength+2; - pattrib->pktlen += WapiIELength+2; - - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - -void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 WapiIELength = 0; - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiSetIE(padapter); - WapiIELength = pWapiInfo->wapiIELength; - pframe[0] = _WAPI_IE_; - pframe[1] = WapiIELength; - _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); - pframe += WapiIELength+2; - pattrib->pktlen += WapiIELength+2; - - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - -void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) -{ - PRT_WAPI_BKID pWapiBKID; - u16 bkidNum; - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 WapiIELength = 0; - - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiSetIE(padapter); - WapiIELength = pWapiInfo->wapiIELength; - bkidNum = 0; - if(!list_empty(&(pWapiInfo->wapiBKIDStoreList))){ - list_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) { - bkidNum ++; - _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength+2, pWapiBKID->bkid,16); - WapiIELength += 16; - } - } - _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength, &bkidNum, 2); - WapiIELength += 2; - - pframe[0] = _WAPI_IE_; - pframe[1] = WapiIELength; - _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); - pframe += WapiIELength+2; - pattrib->pktlen += WapiIELength+2; - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - PRT_WAPI_STA_INFO pWapiSta; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - //u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - pWapiSta =(PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); - list_del_init(&pWapiSta->list); - list_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList); - _rtw_memcpy(pWapiSta->PeerMacAddr,padapter->mlmeextpriv.mlmext_info.network.MacAddress,6); - _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); - _rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16); - - //For chenk PN error with Qos Data after s3: add by ylb 20111114 - _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16); - - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - - -void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr) -{ - PRT_WAPI_T pWapiInfo; - PRT_WAPI_STA_INFO pWapiStaInfo = NULL; - PRT_WAPI_BKID pWapiBkid = NULL; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - pWapiInfo = &padapter->wapiInfo; - - WAPI_TRACE(WAPI_API, "==========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) - { - while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) - { - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - _rtw_memset(pWapiBkid->bkid,0,16); - list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); - } - } - - - WAPI_TRACE(WAPI_API, " %s: after clear bkid \n", __FUNCTION__); - - - //Remove STA info - if(list_empty(&(pWapiInfo->wapiSTAUsedList))){ - WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is null \n", __FUNCTION__); - return; - }else{ - - WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is not null \n", __FUNCTION__); -#if 0 - pWapiStaInfo=(PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next),RT_WAPI_STA_INFO,list); - - list_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) { - - DBG_871X("MAC Addr %02x-%02x-%02x-%02x-%02x-%02x \n",MacAddr[0],MacAddr[1],MacAddr[2],MacAddr[3],MacAddr[4],MacAddr[5]); - - - DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); - - if(pWapiStaInfo == NULL) - { - WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo == NULL Case \n", __FUNCTION__); - return; - } - - if(pWapiStaInfo->PeerMacAddr == NULL) - { - WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo->PeerMacAddr == NULL Case \n", __FUNCTION__); - return; - } - - if(MacAddr == NULL) - { - WAPI_TRACE(WAPI_API, " %s: MacAddr == NULL Case \n", __FUNCTION__); - return; - } - - if (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) { - pWapiStaInfo->bAuthenticateInProgress = false; - pWapiStaInfo->bSetkeyOk = false; - _rtw_memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); - list_del_init(&pWapiStaInfo->list); - list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); - break; - } - - } -#endif - - while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) - { - pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); - - DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); - - list_del_init(&pWapiStaInfo->list); - memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); - pWapiStaInfo->bSetkeyOk = 0; - list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); - } - - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - return; -} - -void rtw_wapi_return_all_sta_info(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - PRT_WAPI_STA_INFO pWapiStaInfo; - PRT_WAPI_BKID pWapiBkid; - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - //Sta Info List - while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) - { - pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); - list_del_init(&pWapiStaInfo->list); - memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); - pWapiStaInfo->bSetkeyOk = 0; - list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); - } - - //BKID List - while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) - { - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - memset(pWapiBkid->bkid,0,16); - list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); - } - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr) -{ - u8 UcIndex = 0; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0); - if(UcIndex != 0xff){ - //CAM_mark_invalid(Adapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0); - if(UcIndex != 0xff){ - //CAM_mark_invalid(Adapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1); - if(UcIndex != 0xff){ - //CAM_mark_invalid(Adapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1); - if(UcIndex != 0xff){ - //CAM_mark_invalid(padapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_clear_all_cam_entry(_adapter *padapter) -{ - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - invalidate_cam_all(padapter); // is this ok? - WapiResetAllCamEntry(padapter); - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); -} - -void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - u8 *pMacAddr = pWapiSta->PeerMacAddr; - u32 EntryId = 0; - BOOLEAN IsPairWise = false ; - u8 EncAlgo; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_API, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - EncAlgo = _SMS4_; - - //For Tx bc/mc pkt,use defualt key entry - if(bUseDefaultKey) - { - // when WAPI update key, keyid will be 0 or 1 by turns. - if (pWapiKey->keyId == 0) - EntryId = 0; - else - EntryId = 2; - } - else - { - // tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr - EntryId = WapiGetEntryForCamWrite(padapter,pMacAddr,pWapiKey->keyId,bGroupKey); - } - - if(EntryId == 0xff){ - WAPI_TRACE(WAPI_API, "===>No entry for WAPI setkey! !!\n"); - return; - } - - //EntryId is also used to diff Sec key and Mic key - //Sec Key - WapiWriteOneCamEntry(padapter, - pMacAddr, - pWapiKey->keyId, //keyid - EntryId, //entry - EncAlgo, //type - bGroupKey, //pairwise or group key - pWapiKey->dataKey); - //MIC key - WapiWriteOneCamEntry(padapter, - pMacAddr, - pWapiKey->keyId, //keyid - EntryId+1, //entry - EncAlgo, //type - bGroupKey, //pairwise or group key - pWapiKey->micKey); - - WAPI_TRACE(WAPI_API, "Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\n",pWapiKey->keyId,EntryId,!bGroupKey); - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - -} - -#if 0 -//YJ,test,091013 -void wapi_test_set_key(struct _adapter *padapter, u8* buf) -{ /*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_BKID pWapiBkid; - PRT_WAPI_STA_INFO pWapiSta; - u8 data[43]; - bool bTxEnable; - bool bUpdate; - bool bAuthenticator; - u8 PeerAddr[6]; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - - WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); - - if (!padapter->WapiSupport){ - return; - } - - copy_from_user(data, buf, 43); - bTxEnable = data[1]; - bAuthenticator = data[2]; - bUpdate = data[3]; - memcpy(PeerAddr,data+4,6); - - if(data[0] == 0x3){ - if(!list_empty(&(pWapiInfo->wapiBKIDIdleList))){ - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - memcpy(pWapiBkid->bkid, data+10, 16); - WAPI_DATA(WAPI_INIT, "SetKey - BKID", pWapiBkid->bkid, 16); - list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList); - } - }else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(!memcmp(pWapiSta->PeerMacAddr,PeerAddr,6)){ - pWapiSta->bAuthenticatorInUpdata = false; - switch(data[0]){ - case 1: //usk - if(bAuthenticator){ //authenticator - memcpy(pWapiSta->lastTxUnicastPN,WapiAEPNInitialValueSrc,16); - if(!bUpdate) { //first - WAPI_TRACE(WAPI_INIT,"AE fisrt set usk \n"); - pWapiSta->wapiUsk.bSet = true; - memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); - memcpy(pWapiSta->wapiUsk.micKey,data+26,16); - pWapiSta->wapiUsk.keyId = *(data+42); - pWapiSta->wapiUsk.bTxEnable = true; - WAPI_DATA(WAPI_INIT, "SetKey - AE USK Data Key", pWapiSta->wapiUsk.dataKey, 16); - WAPI_DATA(WAPI_INIT, "SetKey - AE USK Mic Key", pWapiSta->wapiUsk.micKey, 16); - } - else //update - { - WAPI_TRACE(WAPI_INIT, "AE update usk \n"); - pWapiSta->wapiUskUpdate.bSet = true; - pWapiSta->bAuthenticatorInUpdata = true; - memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); - memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); - memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); - pWapiSta->wapiUskUpdate.keyId = *(data+42); - pWapiSta->wapiUskUpdate.bTxEnable = true; - } - } - else{ - if(!bUpdate){ - WAPI_TRACE(WAPI_INIT,"ASUE fisrt set usk \n"); - if(bTxEnable){ - pWapiSta->wapiUsk.bTxEnable = true; - memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); - }else{ - pWapiSta->wapiUsk.bSet = true; - memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); - memcpy(pWapiSta->wapiUsk.micKey,data+26,16); - pWapiSta->wapiUsk.keyId = *(data+42); - pWapiSta->wapiUsk.bTxEnable = false; - } - }else{ - WAPI_TRACE(WAPI_INIT,"ASUE update usk \n"); - if(bTxEnable){ - pWapiSta->wapiUskUpdate.bTxEnable = true; - if(pWapiSta->wapiUskUpdate.bSet){ - memcpy(pWapiSta->wapiUsk.dataKey,pWapiSta->wapiUskUpdate.dataKey,16); - memcpy(pWapiSta->wapiUsk.micKey,pWapiSta->wapiUskUpdate.micKey,16); - pWapiSta->wapiUsk.keyId=pWapiSta->wapiUskUpdate.keyId; - memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); - pWapiSta->wapiUskUpdate.bTxEnable = false; - pWapiSta->wapiUskUpdate.bSet = false; - } - memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); - }else{ - pWapiSta->wapiUskUpdate.bSet = true; - memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); - memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); - pWapiSta->wapiUskUpdate.keyId = *(data+42); - pWapiSta->wapiUskUpdate.bTxEnable = false; - } - } - } - break; - case 2: //msk - if(bAuthenticator){ //authenticator - pWapiInfo->wapiTxMsk.bSet = true; - memcpy(pWapiInfo->wapiTxMsk.dataKey,data+10,16); - memcpy(pWapiInfo->wapiTxMsk.micKey,data+26,16); - pWapiInfo->wapiTxMsk.keyId = *(data+42); - pWapiInfo->wapiTxMsk.bTxEnable = true; - memcpy(pWapiInfo->lastTxMulticastPN,WapiAEMultiCastPNInitialValueSrc,16); - - if(!bUpdate){ //first - WAPI_TRACE(WAPI_INIT, "AE fisrt set msk \n"); - if(!pWapiSta->bSetkeyOk) - pWapiSta->bSetkeyOk = true; - pWapiInfo->bFirstAuthentiateInProgress= false; - }else{ //update - WAPI_TRACE(WAPI_INIT,"AE update msk \n"); - } - - WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Data Key", pWapiInfo->wapiTxMsk.dataKey, 16); - WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Mic Key", pWapiInfo->wapiTxMsk.micKey, 16); - } - else{ - if(!bUpdate){ - WAPI_TRACE(WAPI_INIT,"ASUE fisrt set msk \n"); - pWapiSta->wapiMsk.bSet = true; - memcpy(pWapiSta->wapiMsk.dataKey,data+10,16); - memcpy(pWapiSta->wapiMsk.micKey,data+26,16); - pWapiSta->wapiMsk.keyId = *(data+42); - pWapiSta->wapiMsk.bTxEnable = false; - if(!pWapiSta->bSetkeyOk) - pWapiSta->bSetkeyOk = true; - pWapiInfo->bFirstAuthentiateInProgress= false; - WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Data Key", pWapiSta->wapiMsk.dataKey, 16); - WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Mic Key", pWapiSta->wapiMsk.micKey, 16); - }else{ - WAPI_TRACE(WAPI_INIT,"ASUE update msk \n"); - pWapiSta->wapiMskUpdate.bSet = true; - memcpy(pWapiSta->wapiMskUpdate.dataKey,data+10,16); - memcpy(pWapiSta->wapiMskUpdate.micKey,data+26,16); - pWapiSta->wapiMskUpdate.keyId = *(data+42); - pWapiSta->wapiMskUpdate.bTxEnable = false; - } - } - break; - default: - WAPI_TRACE(WAPI_ERR,"Unknown Flag \n"); - break; - } - } - } - } - WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); -} - - -void wapi_test_init(struct _adapter *padapter) -{ - u8 keybuf[100]; - u8 mac_addr[6]={0x00,0xe0,0x4c,0x72,0x04,0x70}; - u8 UskDataKey[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; - u8 UskMicKey[16]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f}; - u8 UskId = 0; - u8 MskDataKey[16]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f}; - u8 MskMicKey[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f}; - u8 MskId = 0; - - WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); - - //Enable Wapi - WAPI_TRACE(WAPI_INIT, "%s: Enable wapi!!!!\n", __FUNCTION__); - padapter->wapiInfo.bWapiEnable = true; - padapter->pairwise_key_type = KEY_TYPE_SMS4; - ieee->group_key_type = KEY_TYPE_SMS4; - padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; - padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; - - //set usk - WAPI_TRACE(WAPI_INIT, "%s: Set USK!!!!\n", __FUNCTION__); - memset(keybuf,0,100); - keybuf[0] = 1; //set usk - keybuf[1] = 1; //enable tx - keybuf[2] = 1; //AE - keybuf[3] = 0; //not update - - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,UskDataKey,16); - memcpy(keybuf+26,UskMicKey,16); - keybuf[42]=UskId; - wapi_test_set_key(padapter, keybuf); - - memset(keybuf,0,100); - keybuf[0] = 1; //set usk - keybuf[1] = 1; //enable tx - keybuf[2] = 0; //AE - keybuf[3] = 0; //not update - - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,UskDataKey,16); - memcpy(keybuf+26,UskMicKey,16); - keybuf[42]=UskId; - wapi_test_set_key(padapter, keybuf); - - //set msk - WAPI_TRACE(WAPI_INIT, "%s: Set MSK!!!!\n", __FUNCTION__); - memset(keybuf,0,100); - keybuf[0] = 2; //set msk - keybuf[1] = 1; //Enable TX - keybuf[2] = 1; //AE - keybuf[3] = 0; //not update - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,MskDataKey,16); - memcpy(keybuf+26,MskMicKey,16); - keybuf[42] = MskId; - wapi_test_set_key(padapter, keybuf); - - memset(keybuf,0,100); - keybuf[0] = 2; //set msk - keybuf[1] = 1; //Enable TX - keybuf[2] = 0; //AE - keybuf[3] = 0; //not update - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,MskDataKey,16); - memcpy(keybuf+26,MskMicKey,16); - keybuf[42] = MskId; - wapi_test_set_key(padapter, keybuf); - WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); -} -#endif - -void rtw_wapi_get_iv(_adapter *padapter,u8 *pRA, u8*IV) -{ - PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - bool bPNOverflow = false; - bool bFindMatchPeer = false; - PRT_WAPI_STA_INFO pWapiSta = NULL; - - pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV; - - WAPI_DATA(WAPI_RX,"wapi_get_iv: pra",pRA,6); - - if(IS_MCAST(pRA)){ - if(!pWapiInfo->wapiTxMsk.bTxEnable){ - WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); - return; - } - - if(pWapiInfo->wapiTxMsk.keyId <= 1){ - pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); - memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); - } - } - else - { - if(list_empty(&pWapiInfo->wapiSTAUsedList)){ - WAPI_TRACE(WAPI_RX,"rtw_wapi_get_iv: list is empty \n"); - _rtw_memset(IV,10,18); - return; - } - else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ - WAPI_DATA(WAPI_RX,"rtw_wapi_get_iv: peermacaddr ",pWapiSta->PeerMacAddr,6); - if (_rtw_memcmp((u8*)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) { - bFindMatchPeer = true; - break; - } - } - - WAPI_TRACE(WAPI_RX,"bFindMatchPeer: %d \n",bFindMatchPeer); - WAPI_DATA(WAPI_RX,"Addr",pRA,6); - - if (bFindMatchPeer){ - if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)) - return; - - if (pWapiSta->wapiUsk.keyId <= 1){ - if(pWapiSta->wapiUskUpdate.bTxEnable) - pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; - else - pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; - - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); - _rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); - - } - } - } - - } - -} - -bool rtw_wapi_drop_for_key_absent(_adapter *padapter,u8 *pRA) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - bool bFindMatchPeer = false; - bool bDrop = false; - PRT_WAPI_STA_INFO pWapiSta = NULL; - struct security_priv *psecuritypriv = &padapter->securitypriv; - - WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: ra ",pRA,6); - - if(psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) - { - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - return true; - - if(IS_MCAST(pRA)){ - if(!pWapiInfo->wapiTxMsk.bTxEnable){ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: multicast key is absent \n"); - return bDrop; - } - } - else{ - if(!list_empty(&pWapiInfo->wapiSTAUsedList)){ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ - WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr ",pWapiSta->PeerMacAddr,6); - if (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE){ - bFindMatchPeer = true; - break; - } - } - if (bFindMatchPeer) { - if (!pWapiSta->wapiUsk.bTxEnable){ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: unicast key is absent \n"); - return bDrop; - } - } - else{ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no peer find \n"); - return bDrop; - } - - } - else{ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no sta exist \n"); - return bDrop; - } - } - } - else - { - return bDrop; - } - - return bDrop; -} - -#endif +#ifdef CONFIG_WAPI_SUPPORT + +#include +#include +#include +#include + + +u32 wapi_debug_component = + /* WAPI_INIT | + * WAPI_API | + * WAPI_TX | + * WAPI_RX | */ + WAPI_ERR ; /* always open err flags on */ + +void WapiFreeAllStaInfo(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + PRT_WAPI_STA_INFO pWapiStaInfo; + PRT_WAPI_BKID pWapiBkid; + + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + pWapiInfo = &padapter->wapiInfo; + + /* Pust to Idle List */ + rtw_wapi_return_all_sta_info(padapter); + + /* Sta Info List */ + while (!list_empty(&(pWapiInfo->wapiSTAIdleList))) { + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); + list_del_init(&pWapiStaInfo->list); + } + + /* BKID List */ + while (!list_empty(&(pWapiInfo->wapiBKIDIdleList))) { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + } + WAPI_TRACE(WAPI_INIT, "<=========== %s\n", __FUNCTION__); + return; +} + +void WapiSetIE(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + /* PRT_WAPI_BKID pWapiBkid; */ + u16 protocolVer = 1; + u16 akmCnt = 1; + u16 suiteCnt = 1; + u16 capability = 0; + u8 OUI[3]; + + OUI[0] = 0x00; + OUI[1] = 0x14; + OUI[2] = 0x72; + + pWapiInfo->wapiIELength = 0; + /* protocol version */ + memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &protocolVer, 2); + pWapiInfo->wapiIELength += 2; + /* akm */ + memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &akmCnt, 2); + pWapiInfo->wapiIELength += 2; + + if (pWapiInfo->bWapiPSK) { + memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3); + pWapiInfo->wapiIELength += 3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2; + pWapiInfo->wapiIELength += 1; + } else { + memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3); + pWapiInfo->wapiIELength += 3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; + pWapiInfo->wapiIELength += 1; + } + + /* usk */ + memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &suiteCnt, 2); + pWapiInfo->wapiIELength += 2; + memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3); + pWapiInfo->wapiIELength += 3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; + pWapiInfo->wapiIELength += 1; + + /* msk */ + memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3); + pWapiInfo->wapiIELength += 3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; + pWapiInfo->wapiIELength += 1; + + /* Capbility */ + memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &capability, 2); + pWapiInfo->wapiIELength += 2; +} + + +/* PN1 > PN2, return 1, + * else return 0. + */ +u32 WapiComparePN(u8 *PN1, u8 *PN2) +{ + char i; + + if ((NULL == PN1) || (NULL == PN2)) + return 1; + + /* overflow case */ + if ((PN2[15] - PN1[15]) & 0x80) + return 1; + + for (i = 16; i > 0; i--) { + if (PN1[i - 1] == PN2[i - 1]) + continue; + else if (PN1[i - 1] > PN2[i - 1]) + return 1; + else + return 0; + } + + return 0; +} + +u8 +WapiGetEntryForCamWrite(_adapter *padapter, u8 *pMacAddr, u8 KID, BOOLEAN IsMsk) +{ + PRT_WAPI_T pWapiInfo = NULL; + /* PRT_WAPI_CAM_ENTRY pEntry=NULL; */ + u8 i = 0; + u8 ret = 0xff; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + /* exist? */ + for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) { + if (pWapiInfo->wapiCamEntry[i].IsUsed + && (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) + && pWapiInfo->wapiCamEntry[i].keyidx == KID + && pWapiInfo->wapiCamEntry[i].type == IsMsk) { + ret = pWapiInfo->wapiCamEntry[i].entry_idx; /* cover it */ + break; + } + } + + if (i == WAPI_CAM_ENTRY_NUM) { /* not found */ + for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) { + if (pWapiInfo->wapiCamEntry[i].IsUsed == 0) { + pWapiInfo->wapiCamEntry[i].IsUsed = 1; + pWapiInfo->wapiCamEntry[i].type = IsMsk; + pWapiInfo->wapiCamEntry[i].keyidx = KID; + _rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr, ETH_ALEN); + ret = pWapiInfo->wapiCamEntry[i].entry_idx; + break; + } + } + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + return ret; + + /* + if(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)) { + return 0; + } + + pEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList); + RTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list); + + + return pEntry->entry_idx;*/ +} + +u8 WapiGetEntryForCamClear(_adapter *padapter, u8 *pPeerMac, u8 keyid, u8 IsMsk) +{ + PRT_WAPI_T pWapiInfo = NULL; + u8 i = 0; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) { + if (pWapiInfo->wapiCamEntry[i].IsUsed + && (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) + && pWapiInfo->wapiCamEntry[i].keyidx == keyid + && pWapiInfo->wapiCamEntry[i].type == IsMsk) { + pWapiInfo->wapiCamEntry[i].IsUsed = 0; + pWapiInfo->wapiCamEntry[i].keyidx = 2; + _rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN); + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + return pWapiInfo->wapiCamEntry[i].entry_idx; + } + } + + WAPI_TRACE(WAPI_API, "<====WapiGetReturnCamEntry(), No this cam entry.\n"); + return 0xff; + /* + if(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)) { + return FALSE; + } + + pList = &pWapiInfo->wapiCamUsedList; + while(pList->Flink != &pWapiInfo->wapiCamUsedList) + { + pEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink; + if(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0 + && keyid == pEntry->keyidx) + { + RTRemoveEntryList(pList); + RTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList); + return pEntry->entry_idx; + } + pList = pList->Flink; + } + + return 0; + */ +} + +void +WapiResetAllCamEntry(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + int i; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) { + _rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN); + pWapiInfo->wapiCamEntry[i].IsUsed = 0; + pWapiInfo->wapiCamEntry[i].keyidx = 2; /* invalid */ + pWapiInfo->wapiCamEntry[i].entry_idx = 4 + i * 2; + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + + return; +} + +u8 WapiWriteOneCamEntry( + _adapter *padapter, + u8 *pMacAddr, + u8 KeyId, + u8 EntryId, + u8 EncAlg, + u8 bGroupKey, + u8 *pKey +) +{ + u8 retVal = 0; + u16 usConfig = 0; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if (EntryId >= 32) { + WAPI_TRACE(WAPI_ERR, "<=== CamAddOneEntry(): ulKeyId exceed!\n"); + return retVal; + } + + usConfig = usConfig | (0x01 << 15) | ((u16)(EncAlg) << 2) | (KeyId); + + if (EncAlg == _SMS4_) { + if (bGroupKey == 1) + usConfig |= (0x01 << 6); + if ((EntryId % 2) == 1) /* ==0 sec key; == 1mic key */ + usConfig |= (0x01 << 5); + } + + write_cam(padapter, EntryId, usConfig, pMacAddr, pKey); + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + return 1; +} + +void rtw_wapi_init(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + int i; + + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + RT_ASSERT_RET(padapter); + + if (!padapter->WapiSupport) { + WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + pWapiInfo = &padapter->wapiInfo; + pWapiInfo->bWapiEnable = false; + + /* Init BKID List */ + INIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList); + INIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList); + for (i = 0; i < WAPI_MAX_BKID_NUM; i++) + list_add_tail(&pWapiInfo->wapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList); + + /* Init STA List */ + INIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList); + INIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList); + for (i = 0; i < WAPI_MAX_STAINFO_NUM; i++) + list_add_tail(&pWapiInfo->wapiSta[i].list, &pWapiInfo->wapiSTAIdleList); + + for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) { + pWapiInfo->wapiCamEntry[i].IsUsed = 0; + pWapiInfo->wapiCamEntry[i].keyidx = 2; /* invalid */ + pWapiInfo->wapiCamEntry[i].entry_idx = 4 + i * 2; + } + + WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_free(_adapter *padapter) +{ + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + RT_ASSERT_RET(padapter); + + if (!padapter->WapiSupport) { + WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiFreeAllStaInfo(padapter); + + WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_disable_tx(_adapter *padapter) +{ + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + RT_ASSERT_RET(padapter); + + if (!padapter->WapiSupport) { + WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + padapter->wapiInfo.wapiTxMsk.bTxEnable = false; + padapter->wapiInfo.wapiTxMsk.bSet = false; + + WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); +} + +u8 rtw_wapi_is_wai_packet(_adapter *padapter, u8 *pkt_data) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 WaiPkt = 0, *pTaddr, bFind = false; + u8 Offset_TypeWAI = 0 ; /* (mac header len + llc length) */ + + WAPI_TRACE(WAPI_TX | WAPI_RX, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return 0; + } + + Offset_TypeWAI = 24 + 6 ; + + /* YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4. */ + if ((pkt_data[1] & 0x40) != 0) { + /* RTW_INFO("data is privacy\n"); */ + return 0; + } + + pTaddr = GetAddr2Ptr(pkt_data); + if (list_empty(&pWapiInfo->wapiSTAUsedList)) + bFind = false; + else { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) { + bFind = true; + break; + } + } + } + + WAPI_TRACE(WAPI_TX | WAPI_RX, "%s: bFind=%d pTaddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(pTaddr)); + + if (pkt_data[0] == WIFI_QOS_DATA_TYPE) + Offset_TypeWAI += 2; + + /* 88b4? */ + if ((pkt_data[Offset_TypeWAI] == 0x88) && (pkt_data[Offset_TypeWAI + 1] == 0xb4)) { + WaiPkt = pkt_data[Offset_TypeWAI + 5]; + + psecuritypriv->hw_decrypted = _TRUE; + } else + WAPI_TRACE(WAPI_TX | WAPI_RX, "%s(): non wai packet\n", __FUNCTION__); + + WAPI_TRACE(WAPI_TX | WAPI_RX, "%s(): Recvd WAI frame. IsWAIPkt(%d)\n", __FUNCTION__, WaiPkt); + + return WaiPkt; +} + + +void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + struct recv_frame_hdr *precv_hdr; + u8 *ptr; + u8 *pTA; + u8 *pRecvPN; + + + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) { + WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + precv_hdr = &precv_frame->u.hdr; + ptr = precv_hdr->rx_data; + + if (precv_hdr->attrib.qos == 1) + precv_hdr->UserPriority = GetTid(ptr); + else + precv_hdr->UserPriority = 0; + + pTA = GetAddr2Ptr(ptr); + _rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6); + pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2; + _rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16); + + WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); +} + +/**************************************************************************** +TRUE-----------------Drop +FALSE---------------- handle +add to support WAPI to N-mode +*****************************************************************************/ +u8 rtw_wapi_check_for_drop( + _adapter *padapter, + union recv_frame *precv_frame +) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 *pLastRecvPN = NULL; + u8 bFind = false; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 bDrop = false; + struct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr; + u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ; + u8 *ptr = precv_frame->u.hdr.rx_data; + int i; + + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) { + WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return false; + } + + if (precv_hdr->bIsWaiPacket != 0) { + if (precv_hdr->bIsWaiPacket == 0x8) { + + RTW_INFO("rtw_wapi_check_for_drop: dump packet\n"); + for (i = 0; i < 50; i++) { + RTW_INFO("%02X ", ptr[i]); + if ((i + 1) % 8 == 0) + RTW_INFO("\n"); + } + RTW_INFO("\n rtw_wapi_check_for_drop: dump packet\n"); + + for (i = 0; i < 16; i++) { + if (ptr[i + 27] != 0) + break; + } + + if (i == 16) { + WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: drop with zero BKID\n"); + return true; + } else + return false; + } else + return false; + } + + if (list_empty(&pWapiInfo->wapiSTAUsedList)) + bFind = false; + else { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) { + bFind = true; + break; + } + } + } + WAPI_TRACE(WAPI_RX, "%s: bFind=%d prxb->WapiSrcAddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr)); + + if (bFind) { + if (IS_MCAST(precv_hdr->attrib.ra)) { + WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: multicast case\n"); + pLastRecvPN = pWapiSta->lastRxMulticastPN; + } else { + WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: unicast case\n"); + switch (precv_hdr->UserPriority) { + case 0: + case 3: + pLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue; + break; + case 1: + case 2: + pLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue; + break; + case 4: + case 5: + pLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue; + break; + case 6: + case 7: + pLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue; + break; + default: + WAPI_TRACE(WAPI_ERR, "%s: Unknown TID\n", __FUNCTION__); + break; + } + } + + if (!WapiComparePN(precv_hdr->WapiTempPN, pLastRecvPN)) { + WAPI_TRACE(WAPI_RX, "%s: Equal PN!!\n", __FUNCTION__); + if (IS_MCAST(precv_hdr->attrib.ra)) + _rtw_memcpy(pLastRecvPN, WapiAEMultiCastPNInitialValueSrc, 16); + else + _rtw_memcpy(pLastRecvPN, WapiAEPNInitialValueSrc, 16); + bDrop = true; + } else + _rtw_memcpy(pLastRecvPN, precv_hdr->WapiTempPN, 16); + } + + WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); + return bDrop; +} + +void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 WapiIELength = 0; + + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiSetIE(padapter); + WapiIELength = pWapiInfo->wapiIELength; + pframe[0] = _WAPI_IE_; + pframe[1] = WapiIELength; + _rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength); + pframe += WapiIELength + 2; + pattrib->pktlen += WapiIELength + 2; + + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + +void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 WapiIELength = 0; + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiSetIE(padapter); + WapiIELength = pWapiInfo->wapiIELength; + pframe[0] = _WAPI_IE_; + pframe[1] = WapiIELength; + _rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength); + pframe += WapiIELength + 2; + pattrib->pktlen += WapiIELength + 2; + + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + +void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) +{ + PRT_WAPI_BKID pWapiBKID; + u16 bkidNum; + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 WapiIELength = 0; + + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiSetIE(padapter); + WapiIELength = pWapiInfo->wapiIELength; + bkidNum = 0; + if (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) { + list_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) { + bkidNum++; + _rtw_memcpy(pWapiInfo->wapiIE + WapiIELength + 2, pWapiBKID->bkid, 16); + WapiIELength += 16; + } + } + _rtw_memcpy(pWapiInfo->wapiIE + WapiIELength, &bkidNum, 2); + WapiIELength += 2; + + pframe[0] = _WAPI_IE_; + pframe[1] = WapiIELength; + _rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength); + pframe += WapiIELength + 2; + pattrib->pktlen += WapiIELength + 2; + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + PRT_WAPI_STA_INFO pWapiSta; + u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ; + /* u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; */ + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ; + + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + pWapiSta = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); + list_del_init(&pWapiSta->list); + list_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList); + _rtw_memcpy(pWapiSta->PeerMacAddr, padapter->mlmeextpriv.mlmext_info.network.MacAddress, 6); + _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); + _rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16); + + /* For chenk PN error with Qos Data after s3: add by ylb 20111114 */ + _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiAEPNInitialValueSrc, 16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiAEPNInitialValueSrc, 16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiAEPNInitialValueSrc, 16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiAEPNInitialValueSrc, 16); + + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + + +void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr) +{ + PRT_WAPI_T pWapiInfo; + PRT_WAPI_STA_INFO pWapiStaInfo = NULL; + PRT_WAPI_BKID pWapiBkid = NULL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + pWapiInfo = &padapter->wapiInfo; + + WAPI_TRACE(WAPI_API, "==========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { + while (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + _rtw_memset(pWapiBkid->bkid, 0, 16); + list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); + } + } + + + WAPI_TRACE(WAPI_API, " %s: after clear bkid\n", __FUNCTION__); + + + /* Remove STA info */ + if (list_empty(&(pWapiInfo->wapiSTAUsedList))) { + WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is null\n", __FUNCTION__); + return; + } else { + + WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is not null\n", __FUNCTION__); +#if 0 + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next), RT_WAPI_STA_INFO, list); + + list_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) { + + RTW_INFO("MAC Addr %02x-%02x-%02x-%02x-%02x-%02x\n", MacAddr[0], MacAddr[1], MacAddr[2], MacAddr[3], MacAddr[4], MacAddr[5]); + + + RTW_INFO("peer Addr %02x-%02x-%02x-%02x-%02x-%02x\n", pWapiStaInfo->PeerMacAddr[0], pWapiStaInfo->PeerMacAddr[1], pWapiStaInfo->PeerMacAddr[2], pWapiStaInfo->PeerMacAddr[3], + pWapiStaInfo->PeerMacAddr[4], pWapiStaInfo->PeerMacAddr[5]); + + if (pWapiStaInfo == NULL) { + WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo == NULL Case\n", __FUNCTION__); + return; + } + + if (pWapiStaInfo->PeerMacAddr == NULL) { + WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo->PeerMacAddr == NULL Case\n", __FUNCTION__); + return; + } + + if (MacAddr == NULL) { + WAPI_TRACE(WAPI_API, " %s: MacAddr == NULL Case\n", __FUNCTION__); + return; + } + + if (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) { + pWapiStaInfo->bAuthenticateInProgress = false; + pWapiStaInfo->bSetkeyOk = false; + _rtw_memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN); + list_del_init(&pWapiStaInfo->list); + list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); + break; + } + + } +#endif + + while (!list_empty(&(pWapiInfo->wapiSTAUsedList))) { + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); + + RTW_INFO("peer Addr %02x-%02x-%02x-%02x-%02x-%02x\n", pWapiStaInfo->PeerMacAddr[0], pWapiStaInfo->PeerMacAddr[1], pWapiStaInfo->PeerMacAddr[2], pWapiStaInfo->PeerMacAddr[3], + pWapiStaInfo->PeerMacAddr[4], pWapiStaInfo->PeerMacAddr[5]); + + list_del_init(&pWapiStaInfo->list); + memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN); + pWapiStaInfo->bSetkeyOk = 0; + list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); + } + + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + return; +} + +void rtw_wapi_return_all_sta_info(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + PRT_WAPI_STA_INFO pWapiStaInfo; + PRT_WAPI_BKID pWapiBkid; + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + /* Sta Info List */ + while (!list_empty(&(pWapiInfo->wapiSTAUsedList))) { + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); + list_del_init(&pWapiStaInfo->list); + memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN); + pWapiStaInfo->bSetkeyOk = 0; + list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); + } + + /* BKID List */ + while (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + memset(pWapiBkid->bkid, 0, 16); + list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); + } + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr) +{ + u8 UcIndex = 0; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0); + if (UcIndex != 0xff) { + /* CAM_mark_invalid(Adapter, UcIndex); */ + CAM_empty_entry(padapter, UcIndex); + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0); + if (UcIndex != 0xff) { + /* CAM_mark_invalid(Adapter, UcIndex); */ + CAM_empty_entry(padapter, UcIndex); + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1); + if (UcIndex != 0xff) { + /* CAM_mark_invalid(Adapter, UcIndex); */ + CAM_empty_entry(padapter, UcIndex); + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1); + if (UcIndex != 0xff) { + /* CAM_mark_invalid(padapter, UcIndex); */ + CAM_empty_entry(padapter, UcIndex); + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_clear_all_cam_entry(_adapter *padapter) +{ + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + invalidate_cam_all(padapter); /* is this ok? */ + WapiResetAllCamEntry(padapter); + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); +} + +void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + u8 *pMacAddr = pWapiSta->PeerMacAddr; + u32 EntryId = 0; + BOOLEAN IsPairWise = false ; + u8 EncAlgo; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) { + WAPI_TRACE(WAPI_API, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + EncAlgo = _SMS4_; + + /* For Tx bc/mc pkt,use defualt key entry */ + if (bUseDefaultKey) { + /* when WAPI update key, keyid will be 0 or 1 by turns. */ + if (pWapiKey->keyId == 0) + EntryId = 0; + else + EntryId = 2; + } else { + /* tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr */ + EntryId = WapiGetEntryForCamWrite(padapter, pMacAddr, pWapiKey->keyId, bGroupKey); + } + + if (EntryId == 0xff) { + WAPI_TRACE(WAPI_API, "===>No entry for WAPI setkey! !!\n"); + return; + } + + /* EntryId is also used to diff Sec key and Mic key */ + /* Sec Key */ + WapiWriteOneCamEntry(padapter, + pMacAddr, + pWapiKey->keyId, /* keyid */ + EntryId, /* entry */ + EncAlgo, /* type */ + bGroupKey, /* pairwise or group key */ + pWapiKey->dataKey); + /* MIC key */ + WapiWriteOneCamEntry(padapter, + pMacAddr, + pWapiKey->keyId, /* keyid */ + EntryId + 1, /* entry */ + EncAlgo, /* type */ + bGroupKey, /* pairwise or group key */ + pWapiKey->micKey); + + WAPI_TRACE(WAPI_API, "Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\n", pWapiKey->keyId, EntryId, !bGroupKey); + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + +} + +#if 0 +/* YJ,test,091013 */ +void wapi_test_set_key(struct _adapter *padapter, u8 *buf) +{ + /*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_BKID pWapiBkid; + PRT_WAPI_STA_INFO pWapiSta; + u8 data[43]; + bool bTxEnable; + bool bUpdate; + bool bAuthenticator; + u8 PeerAddr[6]; + u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ; + u8 WapiASUEPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ; + + WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); + + if (!padapter->WapiSupport) + return; + + copy_from_user(data, buf, 43); + bTxEnable = data[1]; + bAuthenticator = data[2]; + bUpdate = data[3]; + memcpy(PeerAddr, data + 4, 6); + + if (data[0] == 0x3) { + if (!list_empty(&(pWapiInfo->wapiBKIDIdleList))) { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + memcpy(pWapiBkid->bkid, data + 10, 16); + WAPI_DATA(WAPI_INIT, "SetKey - BKID", pWapiBkid->bkid, 16); + list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList); + } + } else { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (!memcmp(pWapiSta->PeerMacAddr, PeerAddr, 6)) { + pWapiSta->bAuthenticatorInUpdata = false; + switch (data[0]) { + case 1: /* usk */ + if (bAuthenticator) { /* authenticator */ + memcpy(pWapiSta->lastTxUnicastPN, WapiAEPNInitialValueSrc, 16); + if (!bUpdate) { /* first */ + WAPI_TRACE(WAPI_INIT, "AE fisrt set usk\n"); + pWapiSta->wapiUsk.bSet = true; + memcpy(pWapiSta->wapiUsk.dataKey, data + 10, 16); + memcpy(pWapiSta->wapiUsk.micKey, data + 26, 16); + pWapiSta->wapiUsk.keyId = *(data + 42); + pWapiSta->wapiUsk.bTxEnable = true; + WAPI_DATA(WAPI_INIT, "SetKey - AE USK Data Key", pWapiSta->wapiUsk.dataKey, 16); + WAPI_DATA(WAPI_INIT, "SetKey - AE USK Mic Key", pWapiSta->wapiUsk.micKey, 16); + } else { /* update */ + WAPI_TRACE(WAPI_INIT, "AE update usk\n"); + pWapiSta->wapiUskUpdate.bSet = true; + pWapiSta->bAuthenticatorInUpdata = true; + memcpy(pWapiSta->wapiUskUpdate.dataKey, data + 10, 16); + memcpy(pWapiSta->wapiUskUpdate.micKey, data + 26, 16); + memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiASUEPNInitialValueSrc, 16); + memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiASUEPNInitialValueSrc, 16); + memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiASUEPNInitialValueSrc, 16); + memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiASUEPNInitialValueSrc, 16); + memcpy(pWapiSta->lastRxUnicastPN, WapiASUEPNInitialValueSrc, 16); + pWapiSta->wapiUskUpdate.keyId = *(data + 42); + pWapiSta->wapiUskUpdate.bTxEnable = true; + } + } else { + if (!bUpdate) { + WAPI_TRACE(WAPI_INIT, "ASUE fisrt set usk\n"); + if (bTxEnable) { + pWapiSta->wapiUsk.bTxEnable = true; + memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16); + } else { + pWapiSta->wapiUsk.bSet = true; + memcpy(pWapiSta->wapiUsk.dataKey, data + 10, 16); + memcpy(pWapiSta->wapiUsk.micKey, data + 26, 16); + pWapiSta->wapiUsk.keyId = *(data + 42); + pWapiSta->wapiUsk.bTxEnable = false; + } + } else { + WAPI_TRACE(WAPI_INIT, "ASUE update usk\n"); + if (bTxEnable) { + pWapiSta->wapiUskUpdate.bTxEnable = true; + if (pWapiSta->wapiUskUpdate.bSet) { + memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16); + memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16); + pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId; + memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiASUEPNInitialValueSrc, 16); + memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiASUEPNInitialValueSrc, 16); + memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiASUEPNInitialValueSrc, 16); + memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiASUEPNInitialValueSrc, 16); + memcpy(pWapiSta->lastRxUnicastPN, WapiASUEPNInitialValueSrc, 16); + pWapiSta->wapiUskUpdate.bTxEnable = false; + pWapiSta->wapiUskUpdate.bSet = false; + } + memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16); + } else { + pWapiSta->wapiUskUpdate.bSet = true; + memcpy(pWapiSta->wapiUskUpdate.dataKey, data + 10, 16); + memcpy(pWapiSta->wapiUskUpdate.micKey, data + 26, 16); + pWapiSta->wapiUskUpdate.keyId = *(data + 42); + pWapiSta->wapiUskUpdate.bTxEnable = false; + } + } + } + break; + case 2: /* msk */ + if (bAuthenticator) { /* authenticator */ + pWapiInfo->wapiTxMsk.bSet = true; + memcpy(pWapiInfo->wapiTxMsk.dataKey, data + 10, 16); + memcpy(pWapiInfo->wapiTxMsk.micKey, data + 26, 16); + pWapiInfo->wapiTxMsk.keyId = *(data + 42); + pWapiInfo->wapiTxMsk.bTxEnable = true; + memcpy(pWapiInfo->lastTxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); + + if (!bUpdate) { /* first */ + WAPI_TRACE(WAPI_INIT, "AE fisrt set msk\n"); + if (!pWapiSta->bSetkeyOk) + pWapiSta->bSetkeyOk = true; + pWapiInfo->bFirstAuthentiateInProgress = false; + } else /* update */ + WAPI_TRACE(WAPI_INIT, "AE update msk\n"); + + WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Data Key", pWapiInfo->wapiTxMsk.dataKey, 16); + WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Mic Key", pWapiInfo->wapiTxMsk.micKey, 16); + } else { + if (!bUpdate) { + WAPI_TRACE(WAPI_INIT, "ASUE fisrt set msk\n"); + pWapiSta->wapiMsk.bSet = true; + memcpy(pWapiSta->wapiMsk.dataKey, data + 10, 16); + memcpy(pWapiSta->wapiMsk.micKey, data + 26, 16); + pWapiSta->wapiMsk.keyId = *(data + 42); + pWapiSta->wapiMsk.bTxEnable = false; + if (!pWapiSta->bSetkeyOk) + pWapiSta->bSetkeyOk = true; + pWapiInfo->bFirstAuthentiateInProgress = false; + WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Data Key", pWapiSta->wapiMsk.dataKey, 16); + WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Mic Key", pWapiSta->wapiMsk.micKey, 16); + } else { + WAPI_TRACE(WAPI_INIT, "ASUE update msk\n"); + pWapiSta->wapiMskUpdate.bSet = true; + memcpy(pWapiSta->wapiMskUpdate.dataKey, data + 10, 16); + memcpy(pWapiSta->wapiMskUpdate.micKey, data + 26, 16); + pWapiSta->wapiMskUpdate.keyId = *(data + 42); + pWapiSta->wapiMskUpdate.bTxEnable = false; + } + } + break; + default: + WAPI_TRACE(WAPI_ERR, "Unknown Flag\n"); + break; + } + } + } + } + WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); +} + + +void wapi_test_init(struct _adapter *padapter) +{ + u8 keybuf[100]; + u8 mac_addr[6] = {0x00, 0xe0, 0x4c, 0x72, 0x04, 0x70}; + u8 UskDataKey[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; + u8 UskMicKey[16] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}; + u8 UskId = 0; + u8 MskDataKey[16] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}; + u8 MskMicKey[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f}; + u8 MskId = 0; + + WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); + + /* Enable Wapi */ + WAPI_TRACE(WAPI_INIT, "%s: Enable wapi!!!!\n", __FUNCTION__); + padapter->wapiInfo.bWapiEnable = true; + padapter->pairwise_key_type = KEY_TYPE_SMS4; + ieee->group_key_type = KEY_TYPE_SMS4; + padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; + padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; + + /* set usk */ + WAPI_TRACE(WAPI_INIT, "%s: Set USK!!!!\n", __FUNCTION__); + memset(keybuf, 0, 100); + keybuf[0] = 1; /* set usk */ + keybuf[1] = 1; /* enable tx */ + keybuf[2] = 1; /* AE */ + keybuf[3] = 0; /* not update */ + + memcpy(keybuf + 4, mac_addr, 6); + memcpy(keybuf + 10, UskDataKey, 16); + memcpy(keybuf + 26, UskMicKey, 16); + keybuf[42] = UskId; + wapi_test_set_key(padapter, keybuf); + + memset(keybuf, 0, 100); + keybuf[0] = 1; /* set usk */ + keybuf[1] = 1; /* enable tx */ + keybuf[2] = 0; /* AE */ + keybuf[3] = 0; /* not update */ + + memcpy(keybuf + 4, mac_addr, 6); + memcpy(keybuf + 10, UskDataKey, 16); + memcpy(keybuf + 26, UskMicKey, 16); + keybuf[42] = UskId; + wapi_test_set_key(padapter, keybuf); + + /* set msk */ + WAPI_TRACE(WAPI_INIT, "%s: Set MSK!!!!\n", __FUNCTION__); + memset(keybuf, 0, 100); + keybuf[0] = 2; /* set msk */ + keybuf[1] = 1; /* Enable TX */ + keybuf[2] = 1; /* AE */ + keybuf[3] = 0; /* not update */ + memcpy(keybuf + 4, mac_addr, 6); + memcpy(keybuf + 10, MskDataKey, 16); + memcpy(keybuf + 26, MskMicKey, 16); + keybuf[42] = MskId; + wapi_test_set_key(padapter, keybuf); + + memset(keybuf, 0, 100); + keybuf[0] = 2; /* set msk */ + keybuf[1] = 1; /* Enable TX */ + keybuf[2] = 0; /* AE */ + keybuf[3] = 0; /* not update */ + memcpy(keybuf + 4, mac_addr, 6); + memcpy(keybuf + 10, MskDataKey, 16); + memcpy(keybuf + 26, MskMicKey, 16); + keybuf[42] = MskId; + wapi_test_set_key(padapter, keybuf); + WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); +} +#endif + +void rtw_wapi_get_iv(_adapter *padapter, u8 *pRA, u8 *IV) +{ + PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + bool bPNOverflow = false; + bool bFindMatchPeer = false; + PRT_WAPI_STA_INFO pWapiSta = NULL; + + pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV; + + WAPI_DATA(WAPI_RX, "wapi_get_iv: pra", pRA, 6); + + if (IS_MCAST(pRA)) { + if (!pWapiInfo->wapiTxMsk.bTxEnable) { + WAPI_TRACE(WAPI_ERR, "%s: bTxEnable = 0!!\n", __FUNCTION__); + return; + } + + if (pWapiInfo->wapiTxMsk.keyId <= 1) { + pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); + memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); + } + } else { + if (list_empty(&pWapiInfo->wapiSTAUsedList)) { + WAPI_TRACE(WAPI_RX, "rtw_wapi_get_iv: list is empty\n"); + _rtw_memset(IV, 10, 18); + return; + } else { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + WAPI_DATA(WAPI_RX, "rtw_wapi_get_iv: peermacaddr ", pWapiSta->PeerMacAddr, 6); + if (_rtw_memcmp((u8 *)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) { + bFindMatchPeer = true; + break; + } + } + + WAPI_TRACE(WAPI_RX, "bFindMatchPeer: %d\n", bFindMatchPeer); + WAPI_DATA(WAPI_RX, "Addr", pRA, 6); + + if (bFindMatchPeer) { + if ((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)) + return; + + if (pWapiSta->wapiUsk.keyId <= 1) { + if (pWapiSta->wapiUskUpdate.bTxEnable) + pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; + else + pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; + + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); + _rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); + + } + } + } + + } + +} + +bool rtw_wapi_drop_for_key_absent(_adapter *padapter, u8 *pRA) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + bool bFindMatchPeer = false; + bool bDrop = false; + PRT_WAPI_STA_INFO pWapiSta = NULL; + struct security_priv *psecuritypriv = &padapter->securitypriv; + + WAPI_DATA(WAPI_RX, "rtw_wapi_drop_for_key_absent: ra ", pRA, 6); + + if (psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) { + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + return true; + + if (IS_MCAST(pRA)) { + if (!pWapiInfo->wapiTxMsk.bTxEnable) { + bDrop = true; + WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: multicast key is absent\n"); + return bDrop; + } + } else { + if (!list_empty(&pWapiInfo->wapiSTAUsedList)) { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + WAPI_DATA(WAPI_RX, "rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr ", pWapiSta->PeerMacAddr, 6); + if (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE) { + bFindMatchPeer = true; + break; + } + } + if (bFindMatchPeer) { + if (!pWapiSta->wapiUsk.bTxEnable) { + bDrop = true; + WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: unicast key is absent\n"); + return bDrop; + } + } else { + bDrop = true; + WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: no peer find\n"); + return bDrop; + } + + } else { + bDrop = true; + WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: no sta exist\n"); + return bDrop; + } + } + } else + return bDrop; + + return bDrop; +} + +#endif diff --git a/core/rtw_wapi_sms4.c b/core/rtw_wapi_sms4.c old mode 100755 new mode 100644 index 6126ed9..fc01212 --- a/core/rtw_wapi_sms4.c +++ b/core/rtw_wapi_sms4.c @@ -1,923 +1,908 @@ -#ifdef CONFIG_WAPI_SUPPORT - -#include -#include -#include -#include - - -#ifdef CONFIG_WAPI_SW_SMS4 - -#define WAPI_LITTLE_ENDIAN -//#define BIG_ENDIAN -#define ENCRYPT 0 -#define DECRYPT 1 - - -/********************************************************** - **********************************************************/ -const u8 Sbox[256] = { -0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05, -0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99, -0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62, -0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6, -0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8, -0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35, -0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87, -0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e, -0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1, -0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3, -0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f, -0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51, -0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8, -0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0, -0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84, -0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48 -}; - -const u32 CK[32] = { - 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, - 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, - 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, - 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, - 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, - 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, - 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, - 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 }; - -#define Rotl(_x, _y) (((_x) << (_y)) | ((_x) >> (32 - (_y)))) - -#define ByteSub(_A) (Sbox[(_A) >> 24 & 0xFF] << 24 | \ - Sbox[(_A) >> 16 & 0xFF] << 16 | \ - Sbox[(_A) >> 8 & 0xFF] << 8 | \ - Sbox[(_A) & 0xFF]) - -#define L1(_B) ((_B) ^ Rotl(_B, 2) ^ Rotl(_B, 10) ^ Rotl(_B, 18) ^ Rotl(_B, 24)) -#define L2(_B) ((_B) ^ Rotl(_B, 13) ^ Rotl(_B, 23)) - -static void -xor_block(void *dst, void *src1, void *src2) -/* 128-bit xor: *dst = *src1 xor *src2. Pointers must be 32-bit aligned */ -{ - ((u32 *)dst)[0] = ((u32 *)src1)[0] ^ ((u32 *)src2)[0]; - ((u32 *)dst)[1] = ((u32 *)src1)[1] ^ ((u32 *)src2)[1]; - ((u32 *)dst)[2] = ((u32 *)src1)[2] ^ ((u32 *)src2)[2]; - ((u32 *)dst)[3] = ((u32 *)src1)[3] ^ ((u32 *)src2)[3]; -} - - -void SMS4Crypt(u8 *Input, u8 *Output, u32 *rk) -{ - u32 r, mid, x0, x1, x2, x3, *p; - p = (u32 *)Input; - x0 = p[0]; - x1 = p[1]; - x2 = p[2]; - x3 = p[3]; -#ifdef WAPI_LITTLE_ENDIAN - x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); - x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); - x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); - x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); -#endif - for (r = 0; r < 32; r += 4) - { - mid = x1 ^ x2 ^ x3 ^ rk[r + 0]; - mid = ByteSub(mid); - x0 ^= L1(mid); - mid = x2 ^ x3 ^ x0 ^ rk[r + 1]; - mid = ByteSub(mid); - x1 ^= L1(mid); - mid = x3 ^ x0 ^ x1 ^ rk[r + 2]; - mid = ByteSub(mid); - x2 ^= L1(mid); - mid = x0 ^ x1 ^ x2 ^ rk[r + 3]; - mid = ByteSub(mid); - x3 ^= L1(mid); - } -#ifdef WAPI_LITTLE_ENDIAN - x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); - x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); - x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); - x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); -#endif - p = (u32 *)Output; - p[0] = x3; - p[1] = x2; - p[2] = x1; - p[3] = x0; -} - - - -void SMS4KeyExt(u8 *Key, u32 *rk, u32 CryptFlag) -{ - u32 r, mid, x0, x1, x2, x3, *p; - - p = (u32 *)Key; - x0 = p[0]; - x1 = p[1]; - x2 = p[2]; - x3 = p[3]; -#ifdef WAPI_LITTLE_ENDIAN - x0 = Rotl(x0, 16); x0 = ((x0 & 0xFF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); - x1 = Rotl(x1, 16); x1 = ((x1 & 0xFF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); - x2 = Rotl(x2, 16); x2 = ((x2 & 0xFF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); - x3 = Rotl(x3, 16); x3 = ((x3 & 0xFF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); -#endif - - x0 ^= 0xa3b1bac6; - x1 ^= 0x56aa3350; - x2 ^= 0x677d9197; - x3 ^= 0xb27022dc; - for (r = 0; r < 32; r += 4) - { - mid = x1 ^ x2 ^ x3 ^ CK[r + 0]; - mid = ByteSub(mid); - rk[r + 0] = x0 ^= L2(mid); - mid = x2 ^ x3 ^ x0 ^ CK[r + 1]; - mid = ByteSub(mid); - rk[r + 1] = x1 ^= L2(mid); - mid = x3 ^ x0 ^ x1 ^ CK[r + 2]; - mid = ByteSub(mid); - rk[r + 2] = x2 ^= L2(mid); - mid = x0 ^ x1 ^ x2 ^ CK[r + 3]; - mid = ByteSub(mid); - rk[r + 3] = x3 ^= L2(mid); - } - if (CryptFlag == DECRYPT) - { - for (r = 0; r < 16; r++) - mid = rk[r], rk[r] = rk[31 - r], rk[31 - r] = mid; - } -} - - -void WapiSMS4Cryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength, - u8 *Output, u16 *OutputLength, u32 CryptFlag) -{ - u32 blockNum,i,j, rk[32]; - u16 remainder; - u8 blockIn[16],blockOut[16], tempIV[16], k; - - *OutputLength = 0; - remainder = InputLength & 0x0F; - blockNum = InputLength >> 4; - if(remainder !=0) - blockNum++; - else - remainder = 16; - - for(k=0;k<16;k++) - tempIV[k] = IV[15-k]; - - memcpy(blockIn, tempIV, 16); - - SMS4KeyExt((u8 *)Key, rk,CryptFlag); - - for(i=0; i> 4; - - for(k=0;k<16;k++) - tempIV[k] = IV[15-k]; - - memcpy(BlockIn, tempIV, 16); - - SMS4KeyExt((u8 *)Key, rk, ENCRYPT); - - SMS4Crypt((u8 *)BlockIn, BlockOut, rk); - - for(i=0; i> 4; - - for(i=0; i%s\n", __FUNCTION__); - - header = (struct ieee80211_hdr_3addr_qos *)pHeader; - memset(TempBuf, 0, 34); - memcpy(TempBuf, pHeader, 2); //FrameCtrl - pTemp = (u16*)TempBuf; - *pTemp &= 0xc78f; //bit4,5,6,11,12,13 - - memcpy((TempBuf+2), (pHeader+4), 12); //Addr1, Addr2 - memcpy((TempBuf+14), (pHeader+22), 2); // SeqCtrl - pTemp = (u16*)(TempBuf + 14); - *pTemp &= 0x000f; - - memcpy((TempBuf+16), (pHeader+16), 6); //Addr3 - - fc = le16_to_cpu(header->frame_ctl); - - - - if (GetFrDs((u16*)&fc) && GetToDs((u16 *)&fc)) - { - memcpy((TempBuf+22), (pHeader+24), 6); - QosOffset = 30; - }else{ - memset((TempBuf+22), 0, 6); - QosOffset = 24; - } - - if((fc & 0x0088) == 0x0088){ - memcpy((TempBuf+28), (pHeader+QosOffset), 2); - TempLen += 2; - //IV = pHeader + QosOffset + 2 + SNAP_SIZE + sizeof(u16) + 2; - IV = pHeader + QosOffset + 2 + 2; - }else{ - IV = pHeader + QosOffset + 2; - //IV = pHeader + QosOffset + SNAP_SIZE + sizeof(u16) + 2; - } - - TempBuf[TempLen-1] = (u8)(DataLen & 0xff); - TempBuf[TempLen-2] = (u8)((DataLen & 0xff00)>>8); - TempBuf[TempLen-4] = KeyIdx; - - WAPI_DATA(WAPI_TX, "CalculateMic - KEY", MicKey, 16); - WAPI_DATA(WAPI_TX, "CalculateMic - IV", IV, 16); - WAPI_DATA(WAPI_TX, "CalculateMic - TempBuf", TempBuf, TempLen); - WAPI_DATA(WAPI_TX, "CalculateMic - pData", pData, DataLen); - - WapiSMS4CalculateMic(MicKey, IV, TempBuf, TempLen, - pData, DataLen, MicBuffer, &MicLen); - - if (MicLen != 16) - WAPI_TRACE(WAPI_ERR,"%s: MIC Length Error!!\n",__FUNCTION__); - - WAPI_TRACE(WAPI_TX|WAPI_RX, "<=========%s\n", __FUNCTION__); -#endif -} - -/* AddCount: 1 or 2. - * If overflow, return 1, - * else return 0. - */ -u8 WapiIncreasePN(u8 *PN, u8 AddCount) -{ - u8 i; - - if (NULL == PN) - return 1; - //YJ,test,091102 - /* - if(AddCount == 2){ - DBG_8192C("############################%s(): PN[0]=0x%x\n", __FUNCTION__, PN[0]); - if(PN[0] == 0x48){ - PN[0] += AddCount; - return 1; - }else{ - PN[0] += AddCount; - return 0; - } - } - */ - //YJ,test,091102,end - - for (i=0; i<16; i++) - { - if (PN[i] + AddCount <= 0xff) - { - PN[i] += AddCount; - return 0; - } - else - { - PN[i] += AddCount; - AddCount = 1; - } - } - return 1; -} - - -void WapiGetLastRxUnicastPNForQoSData( - u8 UserPriority, - PRT_WAPI_STA_INFO pWapiStaInfo, - u8 *PNOut -) -{ - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - switch(UserPriority) - { - case 0: - case 3: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBEQueue,16); - break; - case 1: - case 2: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBKQueue,16); - break; - case 4: - case 5: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVIQueue,16); - break; - case 6: - case 7: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVOQueue,16); - break; - default: - WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); - break; - } - WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); -} - - -void WapiSetLastRxUnicastPNForQoSData( - u8 UserPriority, - u8 *PNIn, - PRT_WAPI_STA_INFO pWapiStaInfo -) -{ - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - switch(UserPriority) - { - case 0: - case 3: - memcpy(pWapiStaInfo->lastRxUnicastPNBEQueue,PNIn,16); - break; - case 1: - case 2: - memcpy(pWapiStaInfo->lastRxUnicastPNBKQueue,PNIn,16); - break; - case 4: - case 5: - memcpy(pWapiStaInfo->lastRxUnicastPNVIQueue,PNIn,16); - break; - case 6: - case 7: - memcpy(pWapiStaInfo->lastRxUnicastPNVOQueue,PNIn,16); - break; - default: - WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); - break; - } - WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); -} - - -/**************************************************************************** - FALSE not RX-Reorder - TRUE do RX Reorder -add to support WAPI to N-mode -*****************************************************************************/ -u8 WapiCheckPnInSwDecrypt( - _adapter *padapter, - struct sk_buff *pskb -) -{ - u8 ret = false; - -#if 0 - struct ieee80211_hdr_3addr_qos *header; - u16 fc; - u8 *pDaddr, *pTaddr, *pRaddr; - - header = (struct ieee80211_hdr_3addr_qos *)pskb->data; - pTaddr = header->addr2; - pRaddr = header->addr1; - fc = le16_to_cpu(header->frame_ctl); - - if(GetToDs(&fc)) - pDaddr = header->addr3; - else - pDaddr = header->addr1; - - if ((_rtw_memcmp(pRaddr, padapter->pnetdev->dev_addr, ETH_ALEN) == 0) - && ! (pDaddr) - && (GetFrameType(&fc) == WIFI_QOS_DATA_TYPE)) - //&& ieee->pHTInfo->bCurrentHTSupport && - //ieee->pHTInfo->bCurRxReorderEnable) - ret = false; - else - ret = true; -#endif - WAPI_TRACE(WAPI_RX, "%s: return %d\n", __FUNCTION__, ret); - return ret; -} - -int SecSMS4HeaderFillIV(_adapter *padapter, u8 *pxmitframe) -{ - struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; - u8 * frame = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET; - u8 *pSecHeader = NULL, *pos = NULL, *pRA = NULL; - u8 bPNOverflow = false, bFindMatchPeer = false, hdr_len = 0; - PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_STA_INFO pWapiSta = NULL; - int ret = 0; - - WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); - - return ret; -#if 0 - hdr_len = sMacHdrLng; - if (GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE) - { - hdr_len += 2; - } - //hdr_len += SNAP_SIZE + sizeof(u16); - - pos = skb_push(pskb, padapter->wapiInfo.extra_prefix_len); - memmove(pos, pos+padapter->wapiInfo.extra_prefix_len, hdr_len); - - pSecHeader = pskb->data + hdr_len; - pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)pSecHeader; - pRA = pskb->data + 4; - - WAPI_DATA(WAPI_TX, "FillIV - Before Fill IV", pskb->data, pskb->len); - - //Address 1 is always receiver's address - if( IS_MCAST(pRA) ){ - if(!pWapiInfo->wapiTxMsk.bTxEnable){ - WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); - return -2; - } - if(pWapiInfo->wapiTxMsk.keyId <= 1){ - pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); - memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); - if (bPNOverflow){ - // Update MSK Notification. - WAPI_TRACE(WAPI_ERR,"===============>%s():multicast PN overflow\n",__FUNCTION__); - rtw_wapi_app_event_handler(padapter,NULL,0,pRA, false, false, true, 0, false); - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Multicast KeyIdx!!\n",__FUNCTION__); - ret = -3; - } - } - else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(!memcmp(pWapiSta->PeerMacAddr,pRA,6)){ - bFindMatchPeer = true; - break; - } - } - if (bFindMatchPeer){ - if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)){ - WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); - return -4; - } - if (pWapiSta->wapiUsk.keyId <= 1){ - if(pWapiSta->wapiUskUpdate.bTxEnable) - pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; - else - pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; - - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); - memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); - if (bPNOverflow){ - // Update USK Notification. - WAPI_TRACE(WAPI_ERR,"===============>%s():unicast PN overflow\n",__FUNCTION__); - rtw_wapi_app_event_handler(padapter,NULL,0,pWapiSta->PeerMacAddr, false, true, false, 0, false); - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Unicast KeyIdx!!\n",__FUNCTION__); - ret = -5; - } - } - else{ - WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta "MAC_FMT"!!\n",__FUNCTION__, MAC_ARG(pRA)); - ret = -6; - } - } - - WAPI_DATA(WAPI_TX, "FillIV - After Fill IV", pskb->data, pskb->len); - WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); - return ret; -#endif -} - -// WAPI SW Enc: must have done Coalesce! -void SecSWSMS4Encryption( - _adapter *padapter, - u8 * pxmitframe - ) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 *pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE; - struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; - - u8 *SecPtr = NULL, *pRA, *pMicKey = NULL, *pDataKey = NULL, *pIV = NULL; - u8 IVOffset, DataOffset, bFindMatchPeer = false, KeyIdx = 0, MicBuffer[16]; - u16 OutputLength; - - WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); - - WAPI_TRACE(WAPI_TX,"hdrlen: %d \n",pattrib->hdrlen); - - return; - - DataOffset = pattrib->hdrlen + pattrib->iv_len; - - pRA = pframe + 4; - - - if( IS_MCAST(pRA) ){ - KeyIdx = pWapiInfo->wapiTxMsk.keyId; - pIV = pWapiInfo->lastTxMulticastPN; - pMicKey = pWapiInfo->wapiTxMsk.micKey; - pDataKey = pWapiInfo->wapiTxMsk.dataKey; - }else{ - if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if (0 == memcmp(pWapiSta->PeerMacAddr, pRA, 6)){ - bFindMatchPeer = true; - break; - } - } - - if (bFindMatchPeer){ - if (pWapiSta->wapiUskUpdate.bTxEnable){ - KeyIdx = pWapiSta->wapiUskUpdate.keyId; - WAPI_TRACE(WAPI_TX, "%s(): Use update USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); - pIV = pWapiSta->lastTxUnicastPN; - pMicKey = pWapiSta->wapiUskUpdate.micKey; - pDataKey = pWapiSta->wapiUskUpdate.dataKey; - }else{ - KeyIdx = pWapiSta->wapiUsk.keyId; - WAPI_TRACE(WAPI_TX, "%s(): Use USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); - pIV = pWapiSta->lastTxUnicastPN; - pMicKey = pWapiSta->wapiUsk.micKey; - pDataKey = pWapiSta->wapiUsk.dataKey; - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta!!\n",__FUNCTION__); - return; - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: wapiSTAUsedList is empty!!\n",__FUNCTION__); - return; - } - } - - SecPtr = pframe; - SecCalculateMicSMS4(KeyIdx, pMicKey, SecPtr, (SecPtr+DataOffset), pattrib->pktlen, MicBuffer); - - WAPI_DATA(WAPI_TX, "Encryption - MIC", MicBuffer, padapter->wapiInfo.extra_postfix_len); - - memcpy(pframe+pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen-pattrib->icv_len, - (u8 *)MicBuffer, - padapter->wapiInfo.extra_postfix_len - ); - - - WapiSMS4Encryption(pDataKey, pIV, (SecPtr+DataOffset),pattrib->pktlen+pattrib->icv_len, (SecPtr+DataOffset), &OutputLength); - - WAPI_DATA(WAPI_TX, "Encryption - After SMS4 encryption",pframe,pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen); - - WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); -} - -u8 SecSWSMS4Decryption( - _adapter *padapter, - u8 *precv_frame, - struct recv_priv *precv_priv - ) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - struct recv_frame_hdr *precv_hdr; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 IVOffset, DataOffset, bFindMatchPeer = false, bUseUpdatedKey = false; - u8 KeyIdx, MicBuffer[16], lastRxPNforQoS[16]; - u8 *pRA, *pTA, *pMicKey, *pDataKey, *pLastRxPN, *pRecvPN, *pSecData, *pRecvMic, *pos; - u8 TID = 0; - u16 OutputLength, DataLen; - u8 bQosData; - struct sk_buff * pskb; - - WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); - - return 0; - - precv_hdr = &((union recv_frame*)precv_frame)->u.hdr; - pskb = (struct sk_buff *)(precv_hdr->rx_data); - precv_hdr->bWapiCheckPNInDecrypt = WapiCheckPnInSwDecrypt(padapter, pskb); - WAPI_TRACE(WAPI_RX, "=========>%s: check PN %d\n", __FUNCTION__,precv_hdr->bWapiCheckPNInDecrypt); - WAPI_DATA(WAPI_RX, "Decryption - Before decryption", pskb->data, pskb->len); - - IVOffset = sMacHdrLng; - bQosData = GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE; - if (bQosData){ - IVOffset += 2; - } - - //if(GetHTC()) - // IVOffset += 4; - - //IVOffset += SNAP_SIZE + sizeof(u16); - - DataOffset = IVOffset + padapter->wapiInfo.extra_prefix_len; - - pRA = pskb->data + 4; - pTA = pskb->data + 10; - KeyIdx = *(pskb->data + IVOffset); - pRecvPN = pskb->data + IVOffset + 2; - pSecData = pskb->data + DataOffset; - DataLen = pskb->len - DataOffset; - pRecvMic = pskb->data + pskb->len - padapter->wapiInfo.extra_postfix_len; - TID = GetTid(pskb->data); - - if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if (0 == memcmp(pWapiSta->PeerMacAddr, pTA, 6)){ - bFindMatchPeer = true; - break; - } - } - } - - if (!bFindMatchPeer){ - WAPI_TRACE(WAPI_ERR, "%s: Can not find Peer Sta "MAC_FMT" for Key Info!!!\n", __FUNCTION__, MAC_ARG(pTA)); - return false; - } - - if( IS_MCAST(pRA) ){ - WAPI_TRACE(WAPI_RX, "%s: Multicast decryption !!!\n", __FUNCTION__); - if (pWapiSta->wapiMsk.keyId == KeyIdx && pWapiSta->wapiMsk.bSet){ - pLastRxPN = pWapiSta->lastRxMulticastPN; - if (!WapiComparePN(pRecvPN, pLastRxPN)){ - WAPI_TRACE(WAPI_ERR, "%s: MSK PN is not larger than last, Dropped!!!\n", __FUNCTION__); - WAPI_DATA(WAPI_ERR, "pRecvPN:", pRecvPN, 16); - WAPI_DATA(WAPI_ERR, "pLastRxPN:", pLastRxPN, 16); - return false; - } - - memcpy(pLastRxPN, pRecvPN, 16); - pMicKey = pWapiSta->wapiMsk.micKey; - pDataKey = pWapiSta->wapiMsk.dataKey; - }else if (pWapiSta->wapiMskUpdate.keyId == KeyIdx && pWapiSta->wapiMskUpdate.bSet){ - WAPI_TRACE(WAPI_RX, "%s: Use Updated MSK for Decryption !!!\n", __FUNCTION__); - bUseUpdatedKey = true; - memcpy(pWapiSta->lastRxMulticastPN, pRecvPN, 16); - pMicKey = pWapiSta->wapiMskUpdate.micKey; - pDataKey = pWapiSta->wapiMskUpdate.dataKey; - }else{ - WAPI_TRACE(WAPI_ERR, "%s: Can not find MSK with matched KeyIdx(%d), Dropped !!!\n", __FUNCTION__,KeyIdx); - return false; - } - } - else{ - WAPI_TRACE(WAPI_RX, "%s: Unicast decryption !!!\n", __FUNCTION__); - if (pWapiSta->wapiUsk.keyId == KeyIdx && pWapiSta->wapiUsk.bSet){ - WAPI_TRACE(WAPI_RX, "%s: Use USK for Decryption!!!\n", __FUNCTION__); - if(precv_hdr->bWapiCheckPNInDecrypt){ - if(GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE){ - WapiGetLastRxUnicastPNForQoSData(TID, pWapiSta, lastRxPNforQoS); - pLastRxPN = lastRxPNforQoS; - }else{ - pLastRxPN = pWapiSta->lastRxUnicastPN; - } - if (!WapiComparePN(pRecvPN, pLastRxPN)){ - return false; - } - if(bQosData){ - WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); - }else{ - memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); - } - }else{ - memcpy(precv_hdr->WapiTempPN,pRecvPN,16); - } - - if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE)) - { - if ((pRecvPN[0] & 0x1) == 0){ - WAPI_TRACE(WAPI_ERR, "%s: Rx USK PN is not odd when Infra STA mode, Dropped !!!\n", __FUNCTION__); - return false; - } - } - - pMicKey = pWapiSta->wapiUsk.micKey; - pDataKey = pWapiSta->wapiUsk.dataKey; - } - else if (pWapiSta->wapiUskUpdate.keyId == KeyIdx && pWapiSta->wapiUskUpdate.bSet ){ - WAPI_TRACE(WAPI_RX, "%s: Use Updated USK for Decryption!!!\n", __FUNCTION__); - if(pWapiSta->bAuthenticatorInUpdata) - bUseUpdatedKey = true; - else - bUseUpdatedKey = false; - - if(bQosData){ - WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); - }else{ - memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); - } - pMicKey = pWapiSta->wapiUskUpdate.micKey; - pDataKey = pWapiSta->wapiUskUpdate.dataKey; - }else{ - WAPI_TRACE(WAPI_ERR, "%s: No valid USK!!!KeyIdx=%d pWapiSta->wapiUsk.keyId=%d pWapiSta->wapiUskUpdate.keyId=%d\n", __FUNCTION__, KeyIdx, pWapiSta->wapiUsk.keyId, pWapiSta->wapiUskUpdate.keyId); - //dump_buf(pskb->data,pskb->len); - return false; - } - } - - WAPI_DATA(WAPI_RX, "Decryption - DataKey", pDataKey, 16); - WAPI_DATA(WAPI_RX, "Decryption - IV", pRecvPN, 16); - WapiSMS4Decryption(pDataKey, pRecvPN, pSecData, DataLen, pSecData, &OutputLength); - - if (OutputLength != DataLen) - WAPI_TRACE(WAPI_ERR, "%s: Output Length Error!!!!\n", __FUNCTION__); - - WAPI_DATA(WAPI_RX, "Decryption - After decryption", pskb->data, pskb->len); - - DataLen -= padapter->wapiInfo.extra_postfix_len; - - SecCalculateMicSMS4(KeyIdx, pMicKey, pskb->data, pSecData, DataLen, MicBuffer); - - WAPI_DATA(WAPI_RX, "Decryption - MIC received", pRecvMic, SMS4_MIC_LEN); - WAPI_DATA(WAPI_RX, "Decryption - MIC calculated", MicBuffer, SMS4_MIC_LEN); - - if (0 == memcmp(MicBuffer, pRecvMic, padapter->wapiInfo.extra_postfix_len)){ - WAPI_TRACE(WAPI_RX, "%s: Check MIC OK!!\n", __FUNCTION__); - if (bUseUpdatedKey){ - // delete the old key - if ( IS_MCAST(pRA) ){ - WAPI_TRACE(WAPI_API, "%s(): AE use new update MSK!!\n", __FUNCTION__); - pWapiSta->wapiMsk.keyId = pWapiSta->wapiMskUpdate.keyId; - memcpy(pWapiSta->wapiMsk.dataKey, pWapiSta->wapiMskUpdate.dataKey, 16); - memcpy(pWapiSta->wapiMsk.micKey, pWapiSta->wapiMskUpdate.micKey, 16); - pWapiSta->wapiMskUpdate.bTxEnable = pWapiSta->wapiMskUpdate.bSet = false; - }else{ - WAPI_TRACE(WAPI_API, "%s(): AE use new update USK!!\n", __FUNCTION__); - pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId; - memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16); - memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16); - pWapiSta->wapiUskUpdate.bTxEnable = pWapiSta->wapiUskUpdate.bSet = false; - } - } - }else{ - WAPI_TRACE(WAPI_ERR, "%s: Check MIC Error, Dropped !!!!\n", __FUNCTION__); - return false; - } - - pos = pskb->data; - memmove(pos+padapter->wapiInfo.extra_prefix_len, pos, IVOffset); - skb_pull(pskb, padapter->wapiInfo.extra_prefix_len); - - WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); - - return true; -} - -u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) -{ - - u8 *pframe; - u32 res = _SUCCESS; - - WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_TX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); - return _FAIL; - } - - if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) - return _FAIL; - - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; - - SecSWSMS4Encryption(padapter, pxmitframe); - - WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); - return res; -} - -u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) -{ - u8 *pframe; - u32 res = _SUCCESS; - - WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); - return _FAIL; - } - - - //drop packet when hw decrypt fail - //return tempraily - return _FAIL; - - //pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - - if (false == SecSWSMS4Decryption(padapter, precvframe, &padapter->recvpriv)) - { - WAPI_TRACE(WAPI_ERR, "%s():SMS4 decrypt frame error\n",__FUNCTION__); - return _FAIL; - } - - WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); - return res; -} - -#else - -u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) -{ - WAPI_TRACE(WAPI_TX, "=========>Dummy %s\n", __FUNCTION__); - WAPI_TRACE(WAPI_TX, "<=========Dummy %s\n", __FUNCTION__); - return _SUCCESS; -} - -u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) -{ - WAPI_TRACE(WAPI_RX, "=========>Dummy %s\n", __FUNCTION__); - WAPI_TRACE(WAPI_RX, "<=========Dummy %s\n", __FUNCTION__); - return _SUCCESS; -} - -#endif - -#endif +#ifdef CONFIG_WAPI_SUPPORT + +#include +#include +#include +#include + + +#ifdef CONFIG_WAPI_SW_SMS4 + +#define WAPI_LITTLE_ENDIAN +/* #define BIG_ENDIAN */ +#define ENCRYPT 0 +#define DECRYPT 1 + + +/********************************************************** + **********************************************************/ +const u8 Sbox[256] = { + 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, + 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, + 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, + 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, + 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, + 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, + 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, + 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, + 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, + 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, + 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, + 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, + 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, + 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, + 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, + 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48 +}; + +const u32 CK[32] = { + 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, + 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, + 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, + 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, + 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, + 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, + 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, + 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 +}; + +#define Rotl(_x, _y) (((_x) << (_y)) | ((_x) >> (32 - (_y)))) + +#define ByteSub(_A) (Sbox[(_A) >> 24 & 0xFF] << 24 | \ + Sbox[(_A) >> 16 & 0xFF] << 16 | \ + Sbox[(_A) >> 8 & 0xFF] << 8 | \ + Sbox[(_A) & 0xFF]) + +#define L1(_B) ((_B) ^ Rotl(_B, 2) ^ Rotl(_B, 10) ^ Rotl(_B, 18) ^ Rotl(_B, 24)) +#define L2(_B) ((_B) ^ Rotl(_B, 13) ^ Rotl(_B, 23)) + +static void +xor_block(void *dst, void *src1, void *src2) +/* 128-bit xor: *dst = *src1 xor *src2. Pointers must be 32-bit aligned */ +{ + ((u32 *)dst)[0] = ((u32 *)src1)[0] ^ ((u32 *)src2)[0]; + ((u32 *)dst)[1] = ((u32 *)src1)[1] ^ ((u32 *)src2)[1]; + ((u32 *)dst)[2] = ((u32 *)src1)[2] ^ ((u32 *)src2)[2]; + ((u32 *)dst)[3] = ((u32 *)src1)[3] ^ ((u32 *)src2)[3]; +} + + +void SMS4Crypt(u8 *Input, u8 *Output, u32 *rk) +{ + u32 r, mid, x0, x1, x2, x3, *p; + p = (u32 *)Input; + x0 = p[0]; + x1 = p[1]; + x2 = p[2]; + x3 = p[3]; +#ifdef WAPI_LITTLE_ENDIAN + x0 = Rotl(x0, 16); + x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); + x1 = Rotl(x1, 16); + x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); + x2 = Rotl(x2, 16); + x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); + x3 = Rotl(x3, 16); + x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); +#endif + for (r = 0; r < 32; r += 4) { + mid = x1 ^ x2 ^ x3 ^ rk[r + 0]; + mid = ByteSub(mid); + x0 ^= L1(mid); + mid = x2 ^ x3 ^ x0 ^ rk[r + 1]; + mid = ByteSub(mid); + x1 ^= L1(mid); + mid = x3 ^ x0 ^ x1 ^ rk[r + 2]; + mid = ByteSub(mid); + x2 ^= L1(mid); + mid = x0 ^ x1 ^ x2 ^ rk[r + 3]; + mid = ByteSub(mid); + x3 ^= L1(mid); + } +#ifdef WAPI_LITTLE_ENDIAN + x0 = Rotl(x0, 16); + x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); + x1 = Rotl(x1, 16); + x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); + x2 = Rotl(x2, 16); + x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); + x3 = Rotl(x3, 16); + x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); +#endif + p = (u32 *)Output; + p[0] = x3; + p[1] = x2; + p[2] = x1; + p[3] = x0; +} + + + +void SMS4KeyExt(u8 *Key, u32 *rk, u32 CryptFlag) +{ + u32 r, mid, x0, x1, x2, x3, *p; + + p = (u32 *)Key; + x0 = p[0]; + x1 = p[1]; + x2 = p[2]; + x3 = p[3]; +#ifdef WAPI_LITTLE_ENDIAN + x0 = Rotl(x0, 16); + x0 = ((x0 & 0xFF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); + x1 = Rotl(x1, 16); + x1 = ((x1 & 0xFF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); + x2 = Rotl(x2, 16); + x2 = ((x2 & 0xFF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); + x3 = Rotl(x3, 16); + x3 = ((x3 & 0xFF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); +#endif + + x0 ^= 0xa3b1bac6; + x1 ^= 0x56aa3350; + x2 ^= 0x677d9197; + x3 ^= 0xb27022dc; + for (r = 0; r < 32; r += 4) { + mid = x1 ^ x2 ^ x3 ^ CK[r + 0]; + mid = ByteSub(mid); + rk[r + 0] = x0 ^= L2(mid); + mid = x2 ^ x3 ^ x0 ^ CK[r + 1]; + mid = ByteSub(mid); + rk[r + 1] = x1 ^= L2(mid); + mid = x3 ^ x0 ^ x1 ^ CK[r + 2]; + mid = ByteSub(mid); + rk[r + 2] = x2 ^= L2(mid); + mid = x0 ^ x1 ^ x2 ^ CK[r + 3]; + mid = ByteSub(mid); + rk[r + 3] = x3 ^= L2(mid); + } + if (CryptFlag == DECRYPT) { + for (r = 0; r < 16; r++) + mid = rk[r], rk[r] = rk[31 - r], rk[31 - r] = mid; + } +} + + +void WapiSMS4Cryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength, + u8 *Output, u16 *OutputLength, u32 CryptFlag) +{ + u32 blockNum, i, j, rk[32]; + u16 remainder; + u8 blockIn[16], blockOut[16], tempIV[16], k; + + *OutputLength = 0; + remainder = InputLength & 0x0F; + blockNum = InputLength >> 4; + if (remainder != 0) + blockNum++; + else + remainder = 16; + + for (k = 0; k < 16; k++) + tempIV[k] = IV[15 - k]; + + memcpy(blockIn, tempIV, 16); + + SMS4KeyExt((u8 *)Key, rk, CryptFlag); + + for (i = 0; i < blockNum - 1; i++) { + SMS4Crypt((u8 *)blockIn, blockOut, rk); + xor_block(&Output[i * 16], &Input[i * 16], blockOut); + memcpy(blockIn, blockOut, 16); + } + + *OutputLength = i * 16; + + SMS4Crypt((u8 *)blockIn, blockOut, rk); + + for (j = 0; j < remainder; j++) + Output[i * 16 + j] = Input[i * 16 + j] ^ blockOut[j]; + *OutputLength += remainder; + +} + +void WapiSMS4Encryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength, + u8 *Output, u16 *OutputLength) +{ + + WapiSMS4Cryption(Key, IV, Input, InputLength, Output, OutputLength, ENCRYPT); +} + +void WapiSMS4Decryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength, + u8 *Output, u16 *OutputLength) +{ + /* OFB mode: is also ENCRYPT flag */ + WapiSMS4Cryption(Key, IV, Input, InputLength, Output, OutputLength, ENCRYPT); +} + +void WapiSMS4CalculateMic(u8 *Key, u8 *IV, u8 *Input1, u8 Input1Length, + u8 *Input2, u16 Input2Length, u8 *Output, u8 *OutputLength) +{ + u32 blockNum, i, remainder, rk[32]; + u8 BlockIn[16], BlockOut[16], TempBlock[16], tempIV[16], k; + + *OutputLength = 0; + remainder = Input1Length & 0x0F; + blockNum = Input1Length >> 4; + + for (k = 0; k < 16; k++) + tempIV[k] = IV[15 - k]; + + memcpy(BlockIn, tempIV, 16); + + SMS4KeyExt((u8 *)Key, rk, ENCRYPT); + + SMS4Crypt((u8 *)BlockIn, BlockOut, rk); + + for (i = 0; i < blockNum; i++) { + xor_block(BlockIn, (Input1 + i * 16), BlockOut); + SMS4Crypt((u8 *)BlockIn, BlockOut, rk); + } + + if (remainder != 0) { + memset(TempBlock, 0, 16); + memcpy(TempBlock, (Input1 + blockNum * 16), remainder); + + xor_block(BlockIn, TempBlock, BlockOut); + SMS4Crypt((u8 *)BlockIn, BlockOut, rk); + } + + remainder = Input2Length & 0x0F; + blockNum = Input2Length >> 4; + + for (i = 0; i < blockNum; i++) { + xor_block(BlockIn, (Input2 + i * 16), BlockOut); + SMS4Crypt((u8 *)BlockIn, BlockOut, rk); + } + + if (remainder != 0) { + memset(TempBlock, 0, 16); + memcpy(TempBlock, (Input2 + blockNum * 16), remainder); + + xor_block(BlockIn, TempBlock, BlockOut); + SMS4Crypt((u8 *)BlockIn, BlockOut, rk); + } + + memcpy(Output, BlockOut, 16); + *OutputLength = 16; +} + +void SecCalculateMicSMS4( + u8 KeyIdx, + u8 *MicKey, + u8 *pHeader, + u8 *pData, + u16 DataLen, + u8 *MicBuffer +) +{ +#if 0 + struct ieee80211_hdr_3addr_qos *header; + u8 TempBuf[34], TempLen = 32, MicLen, QosOffset, *IV; + u16 *pTemp, fc; + + WAPI_TRACE(WAPI_TX | WAPI_RX, "=========>%s\n", __FUNCTION__); + + header = (struct ieee80211_hdr_3addr_qos *)pHeader; + memset(TempBuf, 0, 34); + memcpy(TempBuf, pHeader, 2); /* FrameCtrl */ + pTemp = (u16 *)TempBuf; + *pTemp &= 0xc78f; /* bit4,5,6,11,12,13 */ + + memcpy((TempBuf + 2), (pHeader + 4), 12); /* Addr1, Addr2 */ + memcpy((TempBuf + 14), (pHeader + 22), 2); /* SeqCtrl */ + pTemp = (u16 *)(TempBuf + 14); + *pTemp &= 0x000f; + + memcpy((TempBuf + 16), (pHeader + 16), 6); /* Addr3 */ + + fc = le16_to_cpu(header->frame_ctl); + + + + if (GetFrDs((u16 *)&fc) && GetToDs((u16 *)&fc)) { + memcpy((TempBuf + 22), (pHeader + 24), 6); + QosOffset = 30; + } else { + memset((TempBuf + 22), 0, 6); + QosOffset = 24; + } + + if ((fc & 0x0088) == 0x0088) { + memcpy((TempBuf + 28), (pHeader + QosOffset), 2); + TempLen += 2; + /* IV = pHeader + QosOffset + 2 + SNAP_SIZE + sizeof(u16) + 2; */ + IV = pHeader + QosOffset + 2 + 2; + } else { + IV = pHeader + QosOffset + 2; + /* IV = pHeader + QosOffset + SNAP_SIZE + sizeof(u16) + 2; */ + } + + TempBuf[TempLen - 1] = (u8)(DataLen & 0xff); + TempBuf[TempLen - 2] = (u8)((DataLen & 0xff00) >> 8); + TempBuf[TempLen - 4] = KeyIdx; + + WAPI_DATA(WAPI_TX, "CalculateMic - KEY", MicKey, 16); + WAPI_DATA(WAPI_TX, "CalculateMic - IV", IV, 16); + WAPI_DATA(WAPI_TX, "CalculateMic - TempBuf", TempBuf, TempLen); + WAPI_DATA(WAPI_TX, "CalculateMic - pData", pData, DataLen); + + WapiSMS4CalculateMic(MicKey, IV, TempBuf, TempLen, + pData, DataLen, MicBuffer, &MicLen); + + if (MicLen != 16) + WAPI_TRACE(WAPI_ERR, "%s: MIC Length Error!!\n", __FUNCTION__); + + WAPI_TRACE(WAPI_TX | WAPI_RX, "<=========%s\n", __FUNCTION__); +#endif +} + +/* AddCount: 1 or 2. + * If overflow, return 1, + * else return 0. + */ +u8 WapiIncreasePN(u8 *PN, u8 AddCount) +{ + u8 i; + + if (NULL == PN) + return 1; + /* YJ,test,091102 */ + /* + if(AddCount == 2){ + RTW_INFO("############################%s(): PN[0]=0x%x\n", __FUNCTION__, PN[0]); + if(PN[0] == 0x48){ + PN[0] += AddCount; + return 1; + }else{ + PN[0] += AddCount; + return 0; + } + } + */ + /* YJ,test,091102,end */ + + for (i = 0; i < 16; i++) { + if (PN[i] + AddCount <= 0xff) { + PN[i] += AddCount; + return 0; + } else { + PN[i] += AddCount; + AddCount = 1; + } + } + return 1; +} + + +void WapiGetLastRxUnicastPNForQoSData( + u8 UserPriority, + PRT_WAPI_STA_INFO pWapiStaInfo, + u8 *PNOut +) +{ + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + switch (UserPriority) { + case 0: + case 3: + memcpy(PNOut, pWapiStaInfo->lastRxUnicastPNBEQueue, 16); + break; + case 1: + case 2: + memcpy(PNOut, pWapiStaInfo->lastRxUnicastPNBKQueue, 16); + break; + case 4: + case 5: + memcpy(PNOut, pWapiStaInfo->lastRxUnicastPNVIQueue, 16); + break; + case 6: + case 7: + memcpy(PNOut, pWapiStaInfo->lastRxUnicastPNVOQueue, 16); + break; + default: + WAPI_TRACE(WAPI_ERR, "%s: Unknown TID\n", __FUNCTION__); + break; + } + WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); +} + + +void WapiSetLastRxUnicastPNForQoSData( + u8 UserPriority, + u8 *PNIn, + PRT_WAPI_STA_INFO pWapiStaInfo +) +{ + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + switch (UserPriority) { + case 0: + case 3: + memcpy(pWapiStaInfo->lastRxUnicastPNBEQueue, PNIn, 16); + break; + case 1: + case 2: + memcpy(pWapiStaInfo->lastRxUnicastPNBKQueue, PNIn, 16); + break; + case 4: + case 5: + memcpy(pWapiStaInfo->lastRxUnicastPNVIQueue, PNIn, 16); + break; + case 6: + case 7: + memcpy(pWapiStaInfo->lastRxUnicastPNVOQueue, PNIn, 16); + break; + default: + WAPI_TRACE(WAPI_ERR, "%s: Unknown TID\n", __FUNCTION__); + break; + } + WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); +} + + +/**************************************************************************** + FALSE not RX-Reorder + TRUE do RX Reorder +add to support WAPI to N-mode +*****************************************************************************/ +u8 WapiCheckPnInSwDecrypt( + _adapter *padapter, + struct sk_buff *pskb +) +{ + u8 ret = false; + +#if 0 + struct ieee80211_hdr_3addr_qos *header; + u16 fc; + u8 *pDaddr, *pTaddr, *pRaddr; + + header = (struct ieee80211_hdr_3addr_qos *)pskb->data; + pTaddr = header->addr2; + pRaddr = header->addr1; + fc = le16_to_cpu(header->frame_ctl); + + if (GetToDs(&fc)) + pDaddr = header->addr3; + else + pDaddr = header->addr1; + + if ((_rtw_memcmp(pRaddr, padapter->pnetdev->dev_addr, ETH_ALEN) == 0) + && !(pDaddr) + && (GetFrameType(&fc) == WIFI_QOS_DATA_TYPE)) + /* && ieee->pHTInfo->bCurrentHTSupport && */ + /* ieee->pHTInfo->bCurRxReorderEnable) */ + ret = false; + else + ret = true; +#endif + WAPI_TRACE(WAPI_RX, "%s: return %d\n", __FUNCTION__, ret); + return ret; +} + +int SecSMS4HeaderFillIV(_adapter *padapter, u8 *pxmitframe) +{ + struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; + u8 *frame = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET; + u8 *pSecHeader = NULL, *pos = NULL, *pRA = NULL; + u8 bPNOverflow = false, bFindMatchPeer = false, hdr_len = 0; + PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_STA_INFO pWapiSta = NULL; + int ret = 0; + + WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); + + return ret; +#if 0 + hdr_len = sMacHdrLng; + if (GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE) + hdr_len += 2; + /* hdr_len += SNAP_SIZE + sizeof(u16); */ + + pos = skb_push(pskb, padapter->wapiInfo.extra_prefix_len); + memmove(pos, pos + padapter->wapiInfo.extra_prefix_len, hdr_len); + + pSecHeader = pskb->data + hdr_len; + pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)pSecHeader; + pRA = pskb->data + 4; + + WAPI_DATA(WAPI_TX, "FillIV - Before Fill IV", pskb->data, pskb->len); + + /* Address 1 is always receiver's address */ + if (IS_MCAST(pRA)) { + if (!pWapiInfo->wapiTxMsk.bTxEnable) { + WAPI_TRACE(WAPI_ERR, "%s: bTxEnable = 0!!\n", __FUNCTION__); + return -2; + } + if (pWapiInfo->wapiTxMsk.keyId <= 1) { + pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); + memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); + if (bPNOverflow) { + /* Update MSK Notification. */ + WAPI_TRACE(WAPI_ERR, "===============>%s():multicast PN overflow\n", __FUNCTION__); + rtw_wapi_app_event_handler(padapter, NULL, 0, pRA, false, false, true, 0, false); + } + } else { + WAPI_TRACE(WAPI_ERR, "%s: Invalid Wapi Multicast KeyIdx!!\n", __FUNCTION__); + ret = -3; + } + } else { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (!memcmp(pWapiSta->PeerMacAddr, pRA, 6)) { + bFindMatchPeer = true; + break; + } + } + if (bFindMatchPeer) { + if ((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)) { + WAPI_TRACE(WAPI_ERR, "%s: bTxEnable = 0!!\n", __FUNCTION__); + return -4; + } + if (pWapiSta->wapiUsk.keyId <= 1) { + if (pWapiSta->wapiUskUpdate.bTxEnable) + pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; + else + pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; + + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); + memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); + if (bPNOverflow) { + /* Update USK Notification. */ + WAPI_TRACE(WAPI_ERR, "===============>%s():unicast PN overflow\n", __FUNCTION__); + rtw_wapi_app_event_handler(padapter, NULL, 0, pWapiSta->PeerMacAddr, false, true, false, 0, false); + } + } else { + WAPI_TRACE(WAPI_ERR, "%s: Invalid Wapi Unicast KeyIdx!!\n", __FUNCTION__); + ret = -5; + } + } else { + WAPI_TRACE(WAPI_ERR, "%s: Can not find Peer Sta "MAC_FMT"!!\n", __FUNCTION__, MAC_ARG(pRA)); + ret = -6; + } + } + + WAPI_DATA(WAPI_TX, "FillIV - After Fill IV", pskb->data, pskb->len); + WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); + return ret; +#endif +} + +/* WAPI SW Enc: must have done Coalesce! */ +void SecSWSMS4Encryption( + _adapter *padapter, + u8 *pxmitframe +) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 *pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_SIZE; + struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; + + u8 *SecPtr = NULL, *pRA, *pMicKey = NULL, *pDataKey = NULL, *pIV = NULL; + u8 IVOffset, DataOffset, bFindMatchPeer = false, KeyIdx = 0, MicBuffer[16]; + u16 OutputLength; + + WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); + + WAPI_TRACE(WAPI_TX, "hdrlen: %d\n", pattrib->hdrlen); + + return; + + DataOffset = pattrib->hdrlen + pattrib->iv_len; + + pRA = pframe + 4; + + + if (IS_MCAST(pRA)) { + KeyIdx = pWapiInfo->wapiTxMsk.keyId; + pIV = pWapiInfo->lastTxMulticastPN; + pMicKey = pWapiInfo->wapiTxMsk.micKey; + pDataKey = pWapiInfo->wapiTxMsk.dataKey; + } else { + if (!list_empty(&(pWapiInfo->wapiSTAUsedList))) { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (0 == memcmp(pWapiSta->PeerMacAddr, pRA, 6)) { + bFindMatchPeer = true; + break; + } + } + + if (bFindMatchPeer) { + if (pWapiSta->wapiUskUpdate.bTxEnable) { + KeyIdx = pWapiSta->wapiUskUpdate.keyId; + WAPI_TRACE(WAPI_TX, "%s(): Use update USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); + pIV = pWapiSta->lastTxUnicastPN; + pMicKey = pWapiSta->wapiUskUpdate.micKey; + pDataKey = pWapiSta->wapiUskUpdate.dataKey; + } else { + KeyIdx = pWapiSta->wapiUsk.keyId; + WAPI_TRACE(WAPI_TX, "%s(): Use USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); + pIV = pWapiSta->lastTxUnicastPN; + pMicKey = pWapiSta->wapiUsk.micKey; + pDataKey = pWapiSta->wapiUsk.dataKey; + } + } else { + WAPI_TRACE(WAPI_ERR, "%s: Can not find Peer Sta!!\n", __FUNCTION__); + return; + } + } else { + WAPI_TRACE(WAPI_ERR, "%s: wapiSTAUsedList is empty!!\n", __FUNCTION__); + return; + } + } + + SecPtr = pframe; + SecCalculateMicSMS4(KeyIdx, pMicKey, SecPtr, (SecPtr + DataOffset), pattrib->pktlen, MicBuffer); + + WAPI_DATA(WAPI_TX, "Encryption - MIC", MicBuffer, padapter->wapiInfo.extra_postfix_len); + + memcpy(pframe + pattrib->hdrlen + pattrib->iv_len + pattrib->pktlen - pattrib->icv_len, + (u8 *)MicBuffer, + padapter->wapiInfo.extra_postfix_len + ); + + + WapiSMS4Encryption(pDataKey, pIV, (SecPtr + DataOffset), pattrib->pktlen + pattrib->icv_len, (SecPtr + DataOffset), &OutputLength); + + WAPI_DATA(WAPI_TX, "Encryption - After SMS4 encryption", pframe, pattrib->hdrlen + pattrib->iv_len + pattrib->pktlen); + + WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); +} + +u8 SecSWSMS4Decryption( + _adapter *padapter, + u8 *precv_frame, + struct recv_priv *precv_priv +) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + struct recv_frame_hdr *precv_hdr; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 IVOffset, DataOffset, bFindMatchPeer = false, bUseUpdatedKey = false; + u8 KeyIdx, MicBuffer[16], lastRxPNforQoS[16]; + u8 *pRA, *pTA, *pMicKey, *pDataKey, *pLastRxPN, *pRecvPN, *pSecData, *pRecvMic, *pos; + u8 TID = 0; + u16 OutputLength, DataLen; + u8 bQosData; + struct sk_buff *pskb; + + WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); + + return 0; + + precv_hdr = &((union recv_frame *)precv_frame)->u.hdr; + pskb = (struct sk_buff *)(precv_hdr->rx_data); + precv_hdr->bWapiCheckPNInDecrypt = WapiCheckPnInSwDecrypt(padapter, pskb); + WAPI_TRACE(WAPI_RX, "=========>%s: check PN %d\n", __FUNCTION__, precv_hdr->bWapiCheckPNInDecrypt); + WAPI_DATA(WAPI_RX, "Decryption - Before decryption", pskb->data, pskb->len); + + IVOffset = sMacHdrLng; + bQosData = GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE; + if (bQosData) + IVOffset += 2; + + /* if(GetHTC()) */ + /* IVOffset += 4; */ + + /* IVOffset += SNAP_SIZE + sizeof(u16); */ + + DataOffset = IVOffset + padapter->wapiInfo.extra_prefix_len; + + pRA = pskb->data + 4; + pTA = pskb->data + 10; + KeyIdx = *(pskb->data + IVOffset); + pRecvPN = pskb->data + IVOffset + 2; + pSecData = pskb->data + DataOffset; + DataLen = pskb->len - DataOffset; + pRecvMic = pskb->data + pskb->len - padapter->wapiInfo.extra_postfix_len; + TID = GetTid(pskb->data); + + if (!list_empty(&(pWapiInfo->wapiSTAUsedList))) { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (0 == memcmp(pWapiSta->PeerMacAddr, pTA, 6)) { + bFindMatchPeer = true; + break; + } + } + } + + if (!bFindMatchPeer) { + WAPI_TRACE(WAPI_ERR, "%s: Can not find Peer Sta "MAC_FMT" for Key Info!!!\n", __FUNCTION__, MAC_ARG(pTA)); + return false; + } + + if (IS_MCAST(pRA)) { + WAPI_TRACE(WAPI_RX, "%s: Multicast decryption !!!\n", __FUNCTION__); + if (pWapiSta->wapiMsk.keyId == KeyIdx && pWapiSta->wapiMsk.bSet) { + pLastRxPN = pWapiSta->lastRxMulticastPN; + if (!WapiComparePN(pRecvPN, pLastRxPN)) { + WAPI_TRACE(WAPI_ERR, "%s: MSK PN is not larger than last, Dropped!!!\n", __FUNCTION__); + WAPI_DATA(WAPI_ERR, "pRecvPN:", pRecvPN, 16); + WAPI_DATA(WAPI_ERR, "pLastRxPN:", pLastRxPN, 16); + return false; + } + + memcpy(pLastRxPN, pRecvPN, 16); + pMicKey = pWapiSta->wapiMsk.micKey; + pDataKey = pWapiSta->wapiMsk.dataKey; + } else if (pWapiSta->wapiMskUpdate.keyId == KeyIdx && pWapiSta->wapiMskUpdate.bSet) { + WAPI_TRACE(WAPI_RX, "%s: Use Updated MSK for Decryption !!!\n", __FUNCTION__); + bUseUpdatedKey = true; + memcpy(pWapiSta->lastRxMulticastPN, pRecvPN, 16); + pMicKey = pWapiSta->wapiMskUpdate.micKey; + pDataKey = pWapiSta->wapiMskUpdate.dataKey; + } else { + WAPI_TRACE(WAPI_ERR, "%s: Can not find MSK with matched KeyIdx(%d), Dropped !!!\n", __FUNCTION__, KeyIdx); + return false; + } + } else { + WAPI_TRACE(WAPI_RX, "%s: Unicast decryption !!!\n", __FUNCTION__); + if (pWapiSta->wapiUsk.keyId == KeyIdx && pWapiSta->wapiUsk.bSet) { + WAPI_TRACE(WAPI_RX, "%s: Use USK for Decryption!!!\n", __FUNCTION__); + if (precv_hdr->bWapiCheckPNInDecrypt) { + if (GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE) { + WapiGetLastRxUnicastPNForQoSData(TID, pWapiSta, lastRxPNforQoS); + pLastRxPN = lastRxPNforQoS; + } else + pLastRxPN = pWapiSta->lastRxUnicastPN; + if (!WapiComparePN(pRecvPN, pLastRxPN)) + return false; + if (bQosData) + WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); + else + memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); + } else + memcpy(precv_hdr->WapiTempPN, pRecvPN, 16); + + if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE)) { + if ((pRecvPN[0] & 0x1) == 0) { + WAPI_TRACE(WAPI_ERR, "%s: Rx USK PN is not odd when Infra STA mode, Dropped !!!\n", __FUNCTION__); + return false; + } + } + + pMicKey = pWapiSta->wapiUsk.micKey; + pDataKey = pWapiSta->wapiUsk.dataKey; + } else if (pWapiSta->wapiUskUpdate.keyId == KeyIdx && pWapiSta->wapiUskUpdate.bSet) { + WAPI_TRACE(WAPI_RX, "%s: Use Updated USK for Decryption!!!\n", __FUNCTION__); + if (pWapiSta->bAuthenticatorInUpdata) + bUseUpdatedKey = true; + else + bUseUpdatedKey = false; + + if (bQosData) + WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); + else + memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); + pMicKey = pWapiSta->wapiUskUpdate.micKey; + pDataKey = pWapiSta->wapiUskUpdate.dataKey; + } else { + WAPI_TRACE(WAPI_ERR, "%s: No valid USK!!!KeyIdx=%d pWapiSta->wapiUsk.keyId=%d pWapiSta->wapiUskUpdate.keyId=%d\n", __FUNCTION__, KeyIdx, pWapiSta->wapiUsk.keyId, + pWapiSta->wapiUskUpdate.keyId); + /* dump_buf(pskb->data,pskb->len); */ + return false; + } + } + + WAPI_DATA(WAPI_RX, "Decryption - DataKey", pDataKey, 16); + WAPI_DATA(WAPI_RX, "Decryption - IV", pRecvPN, 16); + WapiSMS4Decryption(pDataKey, pRecvPN, pSecData, DataLen, pSecData, &OutputLength); + + if (OutputLength != DataLen) + WAPI_TRACE(WAPI_ERR, "%s: Output Length Error!!!!\n", __FUNCTION__); + + WAPI_DATA(WAPI_RX, "Decryption - After decryption", pskb->data, pskb->len); + + DataLen -= padapter->wapiInfo.extra_postfix_len; + + SecCalculateMicSMS4(KeyIdx, pMicKey, pskb->data, pSecData, DataLen, MicBuffer); + + WAPI_DATA(WAPI_RX, "Decryption - MIC received", pRecvMic, SMS4_MIC_LEN); + WAPI_DATA(WAPI_RX, "Decryption - MIC calculated", MicBuffer, SMS4_MIC_LEN); + + if (0 == memcmp(MicBuffer, pRecvMic, padapter->wapiInfo.extra_postfix_len)) { + WAPI_TRACE(WAPI_RX, "%s: Check MIC OK!!\n", __FUNCTION__); + if (bUseUpdatedKey) { + /* delete the old key */ + if (IS_MCAST(pRA)) { + WAPI_TRACE(WAPI_API, "%s(): AE use new update MSK!!\n", __FUNCTION__); + pWapiSta->wapiMsk.keyId = pWapiSta->wapiMskUpdate.keyId; + memcpy(pWapiSta->wapiMsk.dataKey, pWapiSta->wapiMskUpdate.dataKey, 16); + memcpy(pWapiSta->wapiMsk.micKey, pWapiSta->wapiMskUpdate.micKey, 16); + pWapiSta->wapiMskUpdate.bTxEnable = pWapiSta->wapiMskUpdate.bSet = false; + } else { + WAPI_TRACE(WAPI_API, "%s(): AE use new update USK!!\n", __FUNCTION__); + pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId; + memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16); + memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16); + pWapiSta->wapiUskUpdate.bTxEnable = pWapiSta->wapiUskUpdate.bSet = false; + } + } + } else { + WAPI_TRACE(WAPI_ERR, "%s: Check MIC Error, Dropped !!!!\n", __FUNCTION__); + return false; + } + + pos = pskb->data; + memmove(pos + padapter->wapiInfo.extra_prefix_len, pos, IVOffset); + skb_pull(pskb, padapter->wapiInfo.extra_prefix_len); + + WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); + + return true; +} + +u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) +{ + + u8 *pframe; + u32 res = _SUCCESS; + + WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) { + WAPI_TRACE(WAPI_TX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); + return _FAIL; + } + + if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL) + return _FAIL; + + pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET; + + SecSWSMS4Encryption(padapter, pxmitframe); + + WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); + return res; +} + +u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) +{ + u8 *pframe; + u32 res = _SUCCESS; + + WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) { + WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); + return _FAIL; + } + + + /* drop packet when hw decrypt fail + * return tempraily */ + return _FAIL; + + /* pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; */ + + if (false == SecSWSMS4Decryption(padapter, precvframe, &padapter->recvpriv)) { + WAPI_TRACE(WAPI_ERR, "%s():SMS4 decrypt frame error\n", __FUNCTION__); + return _FAIL; + } + + WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); + return res; +} + +#else + +u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) +{ + WAPI_TRACE(WAPI_TX, "=========>Dummy %s\n", __FUNCTION__); + WAPI_TRACE(WAPI_TX, "<=========Dummy %s\n", __FUNCTION__); + return _SUCCESS; +} + +u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) +{ + WAPI_TRACE(WAPI_RX, "=========>Dummy %s\n", __FUNCTION__); + WAPI_TRACE(WAPI_RX, "<=========Dummy %s\n", __FUNCTION__); + return _SUCCESS; +} + +#endif + +#endif diff --git a/core/rtw_wlan_util.c b/core/rtw_wlan_util.c old mode 100755 new mode 100644 index d8daac3..6844da9 --- a/core/rtw_wlan_util.c +++ b/core/rtw_wlan_util.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -22,7 +22,10 @@ #include #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) -#include + #include + #define ETH_TYPE_OFFSET 12 + #define PROTOCOL_OFFSET 23 + #define IP_OFFSET 30 #endif unsigned char ARTHEROS_OUI1[] = {0x00, 0x03, 0x7f}; @@ -47,7 +50,7 @@ extern unsigned char RSN_TKIP_CIPHER[4]; #define R2T_PHY_DELAY (0) -//#define WAIT_FOR_BCN_TO_MIN (3000) +/* #define WAIT_FOR_BCN_TO_MIN (3000) */ #define WAIT_FOR_BCN_TO_MIN (6000) #define WAIT_FOR_BCN_TO_MAX (20000) @@ -55,20 +58,20 @@ extern unsigned char RSN_TKIP_CIPHER[4]; #define DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD 3 static u8 rtw_basic_rate_cck[4] = { - IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK, - IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK + IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK, + IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK }; static u8 rtw_basic_rate_ofdm[3] = { - IEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK, - IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK + IEEE80211_OFDM_RATE_6MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB | IEEE80211_BASIC_RATE_MASK, + IEEE80211_OFDM_RATE_24MB | IEEE80211_BASIC_RATE_MASK }; static u8 rtw_basic_rate_mix[7] = { - IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK, - IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK, - IEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK, - IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK + IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK, + IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK, + IEEE80211_OFDM_RATE_6MB | IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB | IEEE80211_BASIC_RATE_MASK, + IEEE80211_OFDM_RATE_24MB | IEEE80211_BASIC_RATE_MASK }; int new_bcn_max = 3; @@ -76,11 +79,10 @@ int new_bcn_max = 3; int cckrates_included(unsigned char *rate, int ratelen) { int i; - - for(i = 0; i < ratelen; i++) - { - if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || - (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) + + for (i = 0; i < ratelen; i++) { + if ((((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || + (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22)) return _TRUE; } @@ -91,17 +93,17 @@ int cckrates_included(unsigned char *rate, int ratelen) int cckratesonly_included(unsigned char *rate, int ratelen) { int i; - - for(i = 0; i < ratelen; i++) - { - if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && - (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) + + for (i = 0; i < ratelen; i++) { + if ((((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && + (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22)) return _FALSE; } - + return _TRUE; } +#ifdef CONFIG_GET_RAID_BY_DRV s8 rtw_get_tx_nss(_adapter *adapter, struct sta_info *psta) { u8 rf_type = RF_1T1R, custom_rf_type, vht_mcs[2]; @@ -109,20 +111,20 @@ s8 rtw_get_tx_nss(_adapter *adapter, struct sta_info *psta) custom_rf_type = adapter->registrypriv.rf_config; rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - + if (!psta) return nss; - + /* rf_config is dependent on efuse or sw config */ if (custom_rf_type != RF_MAX_TYPE) rf_type = custom_rf_type; - + #ifdef CONFIG_80211AC_VHT if (psta->vhtpriv.vht_option) { u8 vht_mcs[2]; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); struct vht_priv *pvhtpriv_ap = &pmlmepriv->vhtpriv; - + _rtw_memcpy(vht_mcs, psta->vhtpriv.vht_mcs_map, 2); /* doesn't support 5~8 SS so far */ vht_mcs[1] = 0xff; @@ -142,76 +144,75 @@ s8 rtw_get_tx_nss(_adapter *adapter, struct sta_info *psta) vht_mcs[0] |= 0xc0; break; default: - DBG_871X("%s,%d, unknown rf type\n", __func__, __LINE__); + RTW_INFO("%s,%d, unknown rf type\n", __func__, __LINE__); break; } nss = rtw_vht_mcsmap_to_nss(vht_mcs); } else #endif /* CONFIG_80211AC_VHT */ - if (psta->htpriv.ht_option) { - u8 supp_mcs_set[4]; + if (psta->htpriv.ht_option) { + u8 supp_mcs_set[4]; - _rtw_memcpy(supp_mcs_set, psta->htpriv.ht_cap.supp_mcs_set, 4); - - switch (rf_type) { - case RF_1T1R: - case RF_1T2R: - supp_mcs_set[1] = supp_mcs_set[2] = supp_mcs_set[3] = 0; - break; - case RF_2T2R: - case RF_2T4R: - case RF_2T2R_GREEN: - case RF_2T3R: - supp_mcs_set[2] = supp_mcs_set[3] = 0; - break; - case RF_3T3R: - case RF_3T4R: - supp_mcs_set[3] = 0; - break; - default: - DBG_871X("%s,%d, unknown rf type\n", __func__, __LINE__); - break; + _rtw_memcpy(supp_mcs_set, psta->htpriv.ht_cap.supp_mcs_set, 4); + + switch (rf_type) { + case RF_1T1R: + case RF_1T2R: + supp_mcs_set[1] = supp_mcs_set[2] = supp_mcs_set[3] = 0; + break; + case RF_2T2R: + case RF_2T4R: + case RF_2T2R_GREEN: + case RF_2T3R: + supp_mcs_set[2] = supp_mcs_set[3] = 0; + break; + case RF_3T3R: + case RF_3T4R: + supp_mcs_set[3] = 0; + break; + default: + RTW_INFO("%s,%d, unknown rf type\n", __func__, __LINE__); + break; + } + nss = rtw_ht_mcsset_to_nss(supp_mcs_set); } - nss = rtw_ht_mcsset_to_nss(supp_mcs_set); - } - - DBG_871X("%s: %d SS, rf_type=%d\n", __func__, nss, rf_type); + + RTW_INFO("%s: %d SS, rf_type=%d\n", __func__, nss, rf_type); return nss; } -u8 networktype_to_raid(_adapter *adapter,struct sta_info *psta) +u8 networktype_to_raid(_adapter *adapter, struct sta_info *psta) { unsigned char raid; - switch(psta->wireless_mode) - { - case WIRELESS_11B: - raid = RATR_INX_WIRELESS_B; - break; - case WIRELESS_11A: - case WIRELESS_11G: - raid = RATR_INX_WIRELESS_G; - break; - case WIRELESS_11BG: - raid = RATR_INX_WIRELESS_GB; - break; - case WIRELESS_11_24N: - case WIRELESS_11_5N: - raid = RATR_INX_WIRELESS_N; - break; - case WIRELESS_11A_5N: - case WIRELESS_11G_24N: - raid = RATR_INX_WIRELESS_NG; - break; - case WIRELESS_11BG_24N: - raid = RATR_INX_WIRELESS_NGB; - break; - default: - raid = RATR_INX_WIRELESS_GB; - break; + switch (psta->wireless_mode) { + case WIRELESS_11B: + raid = RATR_INX_WIRELESS_B; + break; + case WIRELESS_11A: + case WIRELESS_11G: + raid = RATR_INX_WIRELESS_G; + break; + case WIRELESS_11BG: + raid = RATR_INX_WIRELESS_GB; + break; + case WIRELESS_11_24N: + case WIRELESS_11_5N: + raid = RATR_INX_WIRELESS_N; + break; + case WIRELESS_11A_5N: + case WIRELESS_11G_24N: + raid = RATR_INX_WIRELESS_NG; + break; + case WIRELESS_11BG_24N: + raid = RATR_INX_WIRELESS_NGB; + break; + default: + raid = RATR_INX_WIRELESS_GB; + break; } return raid; - + } u8 networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta) @@ -222,55 +223,65 @@ u8 networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta) tx_nss = rtw_get_tx_nss(adapter, psta); - switch(psta->wireless_mode) - { - case WIRELESS_11B: - raid = RATEID_IDX_B; - break; - case WIRELESS_11A: - case WIRELESS_11G: - raid = RATEID_IDX_G; - break; - case WIRELESS_11BG: - raid = RATEID_IDX_BG; - break; - case WIRELESS_11_24N: - case WIRELESS_11_5N: - case WIRELESS_11A_5N: - case WIRELESS_11G_24N: + switch (psta->wireless_mode) { + case WIRELESS_11B: + raid = RATEID_IDX_B; + break; + case WIRELESS_11A: + case WIRELESS_11G: + raid = RATEID_IDX_G; + break; + case WIRELESS_11BG: + raid = RATEID_IDX_BG; + break; + case WIRELESS_11_24N: + case WIRELESS_11_5N: + case WIRELESS_11A_5N: + case WIRELESS_11G_24N: + if (tx_nss == 1) + raid = RATEID_IDX_GN_N1SS; + else if (tx_nss == 2) + raid = RATEID_IDX_GN_N2SS; + else if (tx_nss == 3) + raid = RATEID_IDX_BGN_3SS; + else + RTW_INFO("tx_nss error!(tx_nss=%d)\n", tx_nss); + break; + case WIRELESS_11B_24N: + case WIRELESS_11BG_24N: + if (psta->bw_mode == CHANNEL_WIDTH_20) { if (tx_nss == 1) - raid = RATEID_IDX_GN_N1SS; + raid = RATEID_IDX_BGN_20M_1SS_BN; else if (tx_nss == 2) - raid = RATEID_IDX_GN_N2SS; + raid = RATEID_IDX_BGN_20M_2SS_BN; else if (tx_nss == 3) raid = RATEID_IDX_BGN_3SS; else - DBG_871X("tx_nss error!(tx_nss=%d)\n", tx_nss); - break; - case WIRELESS_11B_24N: - case WIRELESS_11BG_24N: - if (psta->bw_mode == CHANNEL_WIDTH_20) { - if (tx_nss == 1) - raid = RATEID_IDX_BGN_20M_1SS_BN; - else if (tx_nss == 2) - raid = RATEID_IDX_BGN_20M_2SS_BN; - else if (tx_nss == 3) - raid = RATEID_IDX_BGN_3SS; - else - DBG_871X("tx_nss error!(tx_nss=%d)\n", tx_nss); - } else { - if (tx_nss == 1) - raid = RATEID_IDX_BGN_40M_1SS; - else if (tx_nss == 2) - raid = RATEID_IDX_BGN_40M_2SS; - else if (tx_nss == 3) - raid = RATEID_IDX_BGN_3SS; - else - DBG_871X("tx_nss error!(tx_nss=%d)\n", tx_nss); - } - break; + RTW_INFO("tx_nss error!(tx_nss=%d)\n", tx_nss); + } else { + if (tx_nss == 1) + raid = RATEID_IDX_BGN_40M_1SS; + else if (tx_nss == 2) + raid = RATEID_IDX_BGN_40M_2SS; + else if (tx_nss == 3) + raid = RATEID_IDX_BGN_3SS; + else + RTW_INFO("tx_nss error!(tx_nss=%d)\n", tx_nss); + } + break; #ifdef CONFIG_80211AC_VHT - case WIRELESS_11_5AC: + case WIRELESS_11_5AC: + if (tx_nss == 1) + raid = RATEID_IDX_VHT_1SS; + else if (tx_nss == 2) + raid = RATEID_IDX_VHT_2SS; + else if (tx_nss == 3) + raid = RATEID_IDX_VHT_3SS; + else + RTW_INFO("tx_nss error!(tx_nss=%d)\n", tx_nss); + break; + case WIRELESS_11_24AC: + if (psta->bw_mode >= CHANNEL_WIDTH_80) { if (tx_nss == 1) raid = RATEID_IDX_VHT_1SS; else if (tx_nss == 2) @@ -278,83 +289,58 @@ u8 networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta) else if (tx_nss == 3) raid = RATEID_IDX_VHT_3SS; else - DBG_871X("tx_nss error!(tx_nss=%d)\n", tx_nss); - break; - case WIRELESS_11_24AC: - if (psta->bw_mode >= CHANNEL_WIDTH_80) - { - if (tx_nss == 1) - raid = RATEID_IDX_VHT_1SS; - else if (tx_nss == 2) - raid = RATEID_IDX_VHT_2SS; - else if (tx_nss == 3) - raid = RATEID_IDX_VHT_3SS; - else - DBG_871X("tx_nss error!(tx_nss=%d)\n", tx_nss); - } + RTW_INFO("tx_nss error!(tx_nss=%d)\n", tx_nss); + } else { + if (tx_nss == 1) + raid = RATEID_IDX_MIX1; + else if (tx_nss == 2) + raid = RATEID_IDX_MIX2; + else if (tx_nss == 3) + raid = RATEID_IDX_VHT_3SS; else - { - if (tx_nss == 1) - raid = RATEID_IDX_MIX1; - else if (tx_nss == 2) - raid = RATEID_IDX_MIX2; - else if (tx_nss == 3) - raid = RATEID_IDX_VHT_3SS; - else - DBG_871X("tx_nss error!(tx_nss=%d)\n", tx_nss); - } - break; + RTW_INFO("tx_nss error!(tx_nss=%d)\n", tx_nss); + } + break; #endif - default: - DBG_871X("unexpected wireless mode!(psta->wireless_mode=%x)\n", psta->wireless_mode); - break; + default: + RTW_INFO("unexpected wireless mode!(psta->wireless_mode=%x)\n", psta->wireless_mode); + break; } - - /* DBG_871X("psta->wireless_mode=%x, tx_nss=%d\n", psta->wireless_mode, tx_nss); */ - - return raid; - -} + /* RTW_INFO("psta->wireless_mode=%x, tx_nss=%d\n", psta->wireless_mode, tx_nss); */ + + return raid; + +} +#endif u8 judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen) { u8 network_type = 0; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if(pmlmeext->cur_channel > 14) - { + + if (pmlmeext->cur_channel > 14) { if (pmlmeinfo->VHT_enable) network_type = WIRELESS_11AC; else if (pmlmeinfo->HT_enable) network_type = WIRELESS_11_5N; network_type |= WIRELESS_11A; - } - else - { + } else { if (pmlmeinfo->HT_enable) - { network_type = WIRELESS_11_24N; - } if ((cckratesonly_included(rate, ratelen)) == _TRUE) - { network_type |= WIRELESS_11B; - } - else if((cckrates_included(rate, ratelen)) == _TRUE) - { + else if ((cckrates_included(rate, ratelen)) == _TRUE) network_type |= WIRELESS_11BG; - } else - { network_type |= WIRELESS_11G; - } } - - return network_type; + + return network_type; } unsigned char ratetbl_val_2wifirate(unsigned char rate); @@ -362,55 +348,54 @@ unsigned char ratetbl_val_2wifirate(unsigned char rate) { unsigned char val = 0; - switch (rate & 0x7f) - { - case 0: - val = IEEE80211_CCK_RATE_1MB; - break; + switch (rate & 0x7f) { + case 0: + val = IEEE80211_CCK_RATE_1MB; + break; - case 1: - val = IEEE80211_CCK_RATE_2MB; - break; + case 1: + val = IEEE80211_CCK_RATE_2MB; + break; - case 2: - val = IEEE80211_CCK_RATE_5MB; - break; + case 2: + val = IEEE80211_CCK_RATE_5MB; + break; - case 3: - val = IEEE80211_CCK_RATE_11MB; - break; - - case 4: - val = IEEE80211_OFDM_RATE_6MB; - break; + case 3: + val = IEEE80211_CCK_RATE_11MB; + break; - case 5: - val = IEEE80211_OFDM_RATE_9MB; - break; + case 4: + val = IEEE80211_OFDM_RATE_6MB; + break; - case 6: - val = IEEE80211_OFDM_RATE_12MB; - break; - - case 7: - val = IEEE80211_OFDM_RATE_18MB; - break; + case 5: + val = IEEE80211_OFDM_RATE_9MB; + break; - case 8: - val = IEEE80211_OFDM_RATE_24MB; - break; - - case 9: - val = IEEE80211_OFDM_RATE_36MB; - break; + case 6: + val = IEEE80211_OFDM_RATE_12MB; + break; - case 10: - val = IEEE80211_OFDM_RATE_48MB; - break; - - case 11: - val = IEEE80211_OFDM_RATE_54MB; - break; + case 7: + val = IEEE80211_OFDM_RATE_18MB; + break; + + case 8: + val = IEEE80211_OFDM_RATE_24MB; + break; + + case 9: + val = IEEE80211_OFDM_RATE_36MB; + break; + + case 10: + val = IEEE80211_OFDM_RATE_48MB; + break; + + case 11: + val = IEEE80211_OFDM_RATE_54MB; + break; } @@ -424,20 +409,16 @@ int is_basicrate(_adapter *padapter, unsigned char rate) int i; unsigned char val; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - for(i = 0; i < NumRates; i++) - { + + for (i = 0; i < NumRates; i++) { val = pmlmeext->basicrate[i]; - if ((val != 0xff) && (val != 0xfe)) - { + if ((val != 0xff) && (val != 0xfe)) { if (rate == ratetbl_val_2wifirate(val)) - { return _TRUE; - } } } - + return _FALSE; } @@ -449,29 +430,28 @@ unsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset) unsigned int len = 0; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - for (i = 0; i < NumRates; i++) - { + for (i = 0; i < NumRates; i++) { rate = pmlmeext->datarate[i]; - switch (rate) - { - case 0xff: - return len; - - case 0xfe: - continue; - - default: - rate = ratetbl_val_2wifirate(rate); + if (rtw_get_oper_ch(padapter) > 14 && rate < _6M_RATE_) /*5G no support CCK rate*/ + continue; - if (is_basicrate(padapter, rate) == _TRUE) - { - rate |= IEEE80211_BASIC_RATE_MASK; - } - - rateset[len] = rate; - len++; - break; + switch (rate) { + case 0xff: + return len; + + case 0xfe: + continue; + + default: + rate = ratetbl_val_2wifirate(rate); + + if (is_basicrate(padapter, rate) == _TRUE) + rate |= IEEE80211_BASIC_RATE_MASK; + + rateset[len] = rate; + len++; + break; } } return len; @@ -488,10 +468,10 @@ void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len) void set_mcs_rate_by_mask(u8 *mcs_set, u32 mask) { - u8 mcs_rate_1r = (u8)(mask&0xff); - u8 mcs_rate_2r = (u8)((mask>>8)&0xff); - u8 mcs_rate_3r = (u8)((mask>>16)&0xff); - u8 mcs_rate_4r = (u8)((mask>>24)&0xff); + u8 mcs_rate_1r = (u8)(mask & 0xff); + u8 mcs_rate_2r = (u8)((mask >> 8) & 0xff); + u8 mcs_rate_3r = (u8)((mask >> 16) & 0xff); + u8 mcs_rate_4r = (u8)((mask >> 24) & 0xff); mcs_set[0] &= mcs_rate_1r; mcs_set[1] &= mcs_rate_2r; @@ -507,21 +487,19 @@ void UpdateBrateTbl( u8 i; u8 rate; - // 1M, 2M, 5.5M, 11M, 6M, 12M, 24M are mandatory. - for(i=0;iiface_type == IFACE_PORT1) - { - Set_NETYPE1_MSR(padapter, type); - } - else -#endif - { - Set_NETYPE0_MSR(padapter, type); - } + rtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS, (u8 *)(&type)); } inline u8 rtw_get_oper_ch(_adapter *adapter) @@ -585,28 +542,28 @@ inline void rtw_set_oper_ch(_adapter *adapter, u8 ch) int i = 0; #endif /* DBG_CH_SWITCH */ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); - + if (dvobj->oper_channel != ch) { dvobj->on_oper_ch_time = rtw_get_current_time(); #ifdef DBG_CH_SWITCH - cnt += snprintf(msg+cnt, len-cnt, "switch to ch %3u", ch); + cnt += snprintf(msg + cnt, len - cnt, "switch to ch %3u", ch); for (i = 0; i < dvobj->iface_nums; i++) { _adapter *iface = dvobj->padapters[i]; - cnt += snprintf(msg+cnt, len-cnt, " ["ADPT_FMT":", ADPT_ARG(iface)); + cnt += snprintf(msg + cnt, len - cnt, " ["ADPT_FMT":", ADPT_ARG(iface)); if (iface->mlmeextpriv.cur_channel == ch) - cnt += snprintf(msg+cnt, len-cnt, "C"); + cnt += snprintf(msg + cnt, len - cnt, "C"); else - cnt += snprintf(msg+cnt, len-cnt, "_"); + cnt += snprintf(msg + cnt, len - cnt, "_"); if (iface->wdinfo.listen_channel == ch && !rtw_p2p_chk_state(&iface->wdinfo, P2P_STATE_NONE)) - cnt += snprintf(msg+cnt, len-cnt, "L"); + cnt += snprintf(msg + cnt, len - cnt, "L"); else - cnt += snprintf(msg+cnt, len-cnt, "_"); - cnt += snprintf(msg+cnt, len-cnt, "]"); + cnt += snprintf(msg + cnt, len - cnt, "_"); + cnt += snprintf(msg + cnt, len - cnt, "]"); } - DBG_871X(FUNC_ADPT_FMT" %s\n", FUNC_ADPT_ARG(adapter), msg); + RTW_INFO(FUNC_ADPT_FMT" %s\n", FUNC_ADPT_ARG(adapter), msg); #endif /* DBG_CH_SWITCH */ } @@ -633,87 +590,155 @@ inline void rtw_set_oper_choffset(_adapter *adapter, u8 offset) adapter_to_dvobj(adapter)->oper_ch_offset = offset; } +u8 rtw_get_offset_by_chbw(u8 ch, u8 bw, u8 *r_offset) +{ + u8 valid = 1; + u8 offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + if (bw == CHANNEL_WIDTH_20) + goto exit; + + if (bw >= CHANNEL_WIDTH_80 && ch <= 14) { + valid = 0; + goto exit; + } + + if (ch >= 1 && ch <= 4) + offset = HAL_PRIME_CHNL_OFFSET_LOWER; + else if (ch >= 5 && ch <= 9) { + if (*r_offset == HAL_PRIME_CHNL_OFFSET_LOWER || *r_offset == HAL_PRIME_CHNL_OFFSET_UPPER) + offset = *r_offset; /* both lower and upper is valid, obey input value */ + else + offset = HAL_PRIME_CHNL_OFFSET_UPPER; /* default use upper */ + } else if (ch >= 10 && ch <= 13) + offset = HAL_PRIME_CHNL_OFFSET_UPPER; + else if (ch == 14) { + valid = 0; /* ch14 doesn't support 40MHz bandwidth */ + goto exit; + } else if (ch >= 36 && ch <= 177) { + switch (ch) { + case 36: + case 44: + case 52: + case 60: + case 100: + case 108: + case 116: + case 124: + case 132: + case 140: + case 149: + case 157: + case 165: + case 173: + offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + case 40: + case 48: + case 56: + case 64: + case 104: + case 112: + case 120: + case 128: + case 136: + case 144: + case 153: + case 161: + case 169: + case 177: + offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + default: + valid = 0; + break; + } + } else + valid = 0; + +exit: + if (valid && r_offset) + *r_offset = offset; + return valid; +} + u8 rtw_get_offset_by_ch(u8 channel) { u8 offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - if(channel>=1 && channel<=4) - { + if (channel >= 1 && channel <= 4) offset = HAL_PRIME_CHNL_OFFSET_LOWER; - } - else if(channel>=5 && channel<=14) - { - offset = HAL_PRIME_CHNL_OFFSET_UPPER; - } - else - { - switch(channel) - { - case 36: - case 44: - case 52: - case 60: - case 100: - case 108: - case 116: - case 124: - case 132: - case 149: - case 157: - offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - case 40: - case 48: - case 56: - case 64: - case 104: - case 112: - case 120: - case 128: - case 136: - case 153: - case 161: - offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - default: - offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; + else if (channel >= 5 && channel <= 14) + offset = HAL_PRIME_CHNL_OFFSET_UPPER; + else { + switch (channel) { + case 36: + case 44: + case 52: + case 60: + case 100: + case 108: + case 116: + case 124: + case 132: + case 149: + case 157: + offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + case 40: + case 48: + case 56: + case 64: + case 104: + case 112: + case 120: + case 128: + case 136: + case 153: + case 161: + offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + default: + offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; } } return offset; - + } -u8 rtw_get_center_ch(u8 channel, u8 chnl_bw, u8 chnl_offset) +u8 rtw_get_center_ch(u8 channel, u8 chnl_bw, u8 chnl_offset) { - u8 center_ch = channel; + u8 center_ch = channel; - if(chnl_bw == CHANNEL_WIDTH_80) - { - if((channel == 36) || (channel == 40) || (channel == 44) || (channel == 48) ) + if (chnl_bw == CHANNEL_WIDTH_80) { + if (channel == 36 || channel == 40 || channel == 44 || channel == 48) center_ch = 42; - if((channel == 52) || (channel == 56) || (channel == 60) || (channel == 64) ) + else if (channel == 52 || channel == 56 || channel == 60 || channel == 64) center_ch = 58; - if((channel == 100) || (channel == 104) || (channel == 108) || (channel == 112) ) + else if (channel == 100 || channel == 104 || channel == 108 || channel == 112) center_ch = 106; - if((channel == 116) || (channel == 120) || (channel == 124) || (channel == 128) ) + else if (channel == 116 || channel == 120 || channel == 124 || channel == 128) center_ch = 122; - if((channel == 132) || (channel == 136) || (channel == 140) || (channel == 144) ) + else if (channel == 132 || channel == 136 || channel == 140 || channel == 144) center_ch = 138; - if((channel == 149) || (channel == 153) || (channel == 157) || (channel == 161) ) + else if (channel == 149 || channel == 153 || channel == 157 || channel == 161) center_ch = 155; - else if(channel <= 14) + else if (channel == 165 || channel == 169 || channel == 173 || channel == 177) + center_ch = 171; + else if (channel <= 14) center_ch = 7; - } - else if(chnl_bw == CHANNEL_WIDTH_40) - { + } else if (chnl_bw == CHANNEL_WIDTH_40) { if (chnl_offset == HAL_PRIME_CHNL_OFFSET_LOWER) center_ch = channel + 2; else center_ch = channel - 2; - } + } else if (chnl_bw == CHANNEL_WIDTH_20) + center_ch = channel; + else + rtw_warn_on(1); return center_ch; } @@ -731,145 +756,88 @@ inline u32 rtw_get_on_cur_ch_time(_adapter *adapter) return 0; } -void SelectChannel(_adapter *padapter, unsigned char channel) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); - -#ifdef CONFIG_DFS_MASTER -{ - struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); - bool ori_overlap_radar_detect_ch = rtw_rfctl_overlap_radar_detect_ch(rfctl); - bool new_overlap_radar_detect_ch = _rtw_rfctl_overlap_radar_detect_ch(rfctl, channel - , adapter_to_dvobj(padapter)->oper_bwmode, adapter_to_dvobj(padapter)->oper_ch_offset); - - if (!ori_overlap_radar_detect_ch && new_overlap_radar_detect_ch) - rtw_odm_radar_detect_enable(padapter); - - if (new_overlap_radar_detect_ch && IS_UNDER_CAC(rfctl)) { - u8 pause = 0xFF; - - rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause); - } -#endif /* CONFIG_DFS_MASTER */ - - //saved channel info - rtw_set_oper_ch(padapter, channel); - - rtw_hal_set_chan(padapter, channel); - -#ifdef CONFIG_DFS_MASTER - if (ori_overlap_radar_detect_ch && !new_overlap_radar_detect_ch) { - u8 pause = 0x00; - - rtw_odm_radar_detect_disable(padapter); - rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause); - } -} -#endif /* CONFIG_DFS_MASTER */ - - _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); - -} - -void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL); - -#ifdef CONFIG_DFS_MASTER -{ - struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); - bool ori_overlap_radar_detect_ch = rtw_rfctl_overlap_radar_detect_ch(rfctl); - bool new_overlap_radar_detect_ch = _rtw_rfctl_overlap_radar_detect_ch(rfctl - , adapter_to_dvobj(padapter)->oper_channel, bwmode, channel_offset); - - if (!ori_overlap_radar_detect_ch && new_overlap_radar_detect_ch) - rtw_odm_radar_detect_enable(padapter); - - if (new_overlap_radar_detect_ch && IS_UNDER_CAC(rfctl)) { - u8 pause = 0xFF; - - rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause); - } -#endif /* CONFIG_DFS_MASTER */ - - //saved bw info - rtw_set_oper_bw(padapter, bwmode); - rtw_set_oper_choffset(padapter, channel_offset); - - rtw_hal_set_bwmode(padapter, (CHANNEL_WIDTH)bwmode, channel_offset); - -#ifdef CONFIG_DFS_MASTER - if (ori_overlap_radar_detect_ch && !new_overlap_radar_detect_ch) { - u8 pause = 0x00; - - rtw_odm_radar_detect_disable(padapter); - rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause); - } -} -#endif /* CONFIG_DFS_MASTER */ - - _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL); -} - void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode) { u8 center_ch, chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; +#if (defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)) || defined(CONFIG_MCC_MODE) + u8 iqk_info_backup = _FALSE; +#endif - if ( padapter->bNotifyChannelChange ) - { - DBG_871X( "[%s] ch = %d, offset = %d, bwmode = %d\n", __FUNCTION__, channel, channel_offset, bwmode ); - } + if (padapter->bNotifyChannelChange) + RTW_INFO("[%s] ch = %d, offset = %d, bwmode = %d\n", __FUNCTION__, channel, channel_offset, bwmode); center_ch = rtw_get_center_ch(channel, bwmode, channel_offset); - if(bwmode == CHANNEL_WIDTH_80) - { - if(center_ch > channel) + if (bwmode == CHANNEL_WIDTH_80) { + if (center_ch > channel) chnl_offset80 = HAL_PRIME_CHNL_OFFSET_LOWER; - else if(center_ch < channel) + else if (center_ch < channel) chnl_offset80 = HAL_PRIME_CHNL_OFFSET_UPPER; else chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE; } _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); -#ifdef CONFIG_DFS_MASTER -{ - struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); - bool ori_overlap_radar_detect_ch = rtw_rfctl_overlap_radar_detect_ch(rfctl); - bool new_overlap_radar_detect_ch = _rtw_rfctl_overlap_radar_detect_ch(rfctl, channel, bwmode, channel_offset); - - if (!ori_overlap_radar_detect_ch && new_overlap_radar_detect_ch) - rtw_odm_radar_detect_enable(padapter); - - if (new_overlap_radar_detect_ch && IS_UNDER_CAC(rfctl)) { - u8 pause = 0xFF; - - rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause); +#ifdef CONFIG_MCC_MODE + if (MCC_EN(padapter)) { + /* driver doesn't set channel setting reg under MCC */ + if (rtw_hal_check_mcc_status(padapter, MCC_STATUS_DOING_MCC)) { + RTW_INFO("Warning: Do not set channel setting reg MCC mode\n"); + rtw_warn_on(1); + } } +#endif + +#ifdef CONFIG_DFS_MASTER + { + struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); + bool ori_overlap_radar_detect_ch = rtw_rfctl_overlap_radar_detect_ch(rfctl); + bool new_overlap_radar_detect_ch = _rtw_rfctl_overlap_radar_detect_ch(rfctl, channel, bwmode, channel_offset); + + if (new_overlap_radar_detect_ch) + rtw_odm_radar_detect_enable(padapter); + + if (new_overlap_radar_detect_ch && IS_CH_WAITING(rfctl)) { + u8 pause = 0xFF; + + rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause); + } #endif /* CONFIG_DFS_MASTER */ - //set Channel - //saved channel/bw info - rtw_set_oper_ch(padapter, channel); - rtw_set_oper_bw(padapter, bwmode); - rtw_set_oper_choffset(padapter, channel_offset); + /* set Channel */ + /* saved channel/bw info */ + rtw_set_oper_ch(padapter, channel); + rtw_set_oper_bw(padapter, bwmode); + rtw_set_oper_choffset(padapter, channel_offset); - rtw_hal_set_chnl_bw(padapter, center_ch, bwmode, channel_offset, chnl_offset80); // set center channel +#if (defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)) || defined(CONFIG_MCC_MODE) + /* To check if we need to backup iqk info after switch chnl & bw */ + { + u8 take_care_iqk, do_iqk; + + rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk); + rtw_hal_get_hwreg(padapter, HW_VAR_DO_IQK, &do_iqk); + if ((take_care_iqk == _TRUE) && (do_iqk == _TRUE)) + iqk_info_backup = _TRUE; + } +#endif + + rtw_hal_set_chnl_bw(padapter, center_ch, bwmode, channel_offset, chnl_offset80); /* set center channel */ + +#if (defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)) || defined(CONFIG_MCC_MODE) + if (iqk_info_backup == _TRUE) + rtw_hal_ch_sw_iqk_info_backup(padapter); +#endif #ifdef CONFIG_DFS_MASTER - if (ori_overlap_radar_detect_ch && !new_overlap_radar_detect_ch) { - u8 pause = 0x00; + if (ori_overlap_radar_detect_ch && !new_overlap_radar_detect_ch) { + u8 pause = 0x00; - rtw_odm_radar_detect_disable(padapter); - rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause); + rtw_odm_radar_detect_disable(padapter); + rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause); + } } -} #endif /* CONFIG_DFS_MASTER */ _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL); @@ -878,22 +846,16 @@ void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char int get_bsstype(unsigned short capability) { if (capability & BIT(0)) - { return WIFI_FW_AP_STATE; - } else if (capability & BIT(1)) - { return WIFI_FW_ADHOC_STATE; - } else - { - return 0; - } + return 0; } __inline u8 *get_my_bssid(WLAN_BSSID_EX *pnetwork) -{ - return (pnetwork->MacAddress); +{ + return pnetwork->MacAddress; } u16 get_beacon_interval(WLAN_BSSID_EX *bss) @@ -901,7 +863,7 @@ u16 get_beacon_interval(WLAN_BSSID_EX *bss) unsigned short val; _rtw_memcpy((unsigned char *)&val, rtw_get_beacon_interval_from_ie(bss->IEs), 2); - return le16_to_cpu(val); + return le16_to_cpu(val); } @@ -910,74 +872,61 @@ int is_client_associated_to_ap(_adapter *padapter) struct mlme_ext_priv *pmlmeext; struct mlme_ext_info *pmlmeinfo; - if(!padapter) + if (!padapter) return _FAIL; pmlmeext = &padapter->mlmeextpriv; pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)) - { + + if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE)) return _TRUE; - } else - { return _FAIL; - } } int is_client_associated_to_ibss(_adapter *padapter) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)) - { + + if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE)) return _TRUE; - } else - { return _FAIL; - } } int is_IBSS_empty(_adapter *padapter) { - unsigned int i; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) - { - if (pmlmeinfo->FW_sta_info[i].status == 1) - { + int i; + struct macid_ctl_t *macid_ctl = &padapter->dvobj->macid_ctl; + + for (i = 0; i < macid_ctl->num; i++) { + if (!rtw_macid_is_used(macid_ctl, i)) + continue; + if (rtw_macid_get_if_g(macid_ctl, i) != padapter->iface_id) + continue; + if (!GET_H2CCMD_MSRRPT_PARM_OPMODE(&macid_ctl->h2c_msr[i])) + continue; + if (GET_H2CCMD_MSRRPT_PARM_ROLE(&macid_ctl->h2c_msr[i]) == H2C_MSR_ROLE_ADHOC) return _FAIL; - } } - + return _TRUE; - } unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval) { if ((bcn_interval << 2) < WAIT_FOR_BCN_TO_MIN) - { return WAIT_FOR_BCN_TO_MIN; - } else if ((bcn_interval << 2) > WAIT_FOR_BCN_TO_MAX) - { return WAIT_FOR_BCN_TO_MAX; - } else - { - return ((bcn_interval << 2)); - } + return bcn_interval << 2; } void CAM_empty_entry( - PADAPTER Adapter, - u8 ucIndex + PADAPTER Adapter, + u8 ucIndex ) { rtw_hal_set_hwreg(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex)); @@ -1001,7 +950,7 @@ void invalidate_cam_all(_adapter *padapter) void _clear_cam_entry(_adapter *padapter, u8 entry) { unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00}; + unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; rtw_sec_write_cam_ent(padapter, entry, 0, null_sta, null_key); } @@ -1009,10 +958,10 @@ void _clear_cam_entry(_adapter *padapter, u8 entry) inline void write_cam(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key) { #ifdef CONFIG_WRITE_CACHE_ONLY - write_cam_cache(adapter, id ,ctrl, mac, key); + write_cam_cache(adapter, id , ctrl, mac, key); #else rtw_sec_write_cam_ent(adapter, id, ctrl, mac, key); - write_cam_cache(adapter, id ,ctrl, mac, key); + write_cam_cache(adapter, id , ctrl, mac, key); #endif } @@ -1035,7 +984,6 @@ inline void write_cam_from_cache(_adapter *adapter, u8 id) rtw_sec_write_cam_ent(adapter, id, cache.ctrl, cache.mac, cache.key); } - void write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key) { struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); @@ -1064,49 +1012,6 @@ void clear_cam_cache(_adapter *adapter, u8 id) _exit_critical_bh(&cam_ctl->lock, &irqL); } -s16 rtw_get_camid(_adapter *adapter, struct sta_info *sta, s16 kid) -{ - u8 macid; - s16 camid; - - //cam_entry: - //0~3 for default key - - //for concurrent mode (ap+sta, sta+sta): - //default key is disable, using sw encrypt/decrypt - //camid 0, 1, 2, 3 is default entry for default key/group key - //macid = 1 is for bc/mc stainfo, no mapping to camid - //macid = 0 mapping to camid 4 - //for macid >=2, camid = macid+3; - - if (sta) { - struct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info; - macid = sta->mac_id; - - if((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) { - if((macid == 1) || (macid>(NUM_STA-4))){ - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" failed, mac_id=%d\n", FUNC_ADPT_ARG(adapter), macid); - camid = -1; - goto exit; - } - } - - if(macid==0) - camid = 4; - else if(macid >=2) - camid = macid + 3; - else - camid = 4; - } - else { - /* default key is disabled */ - camid = -1; - } - -exit: - return (s16)camid; -} - inline bool _rtw_camctl_chk_cap(_adapter *adapter, u8 cap) { struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); @@ -1167,36 +1072,36 @@ inline bool _rtw_camctl_chk_flags(_adapter *adapter, u32 flags) void dump_sec_cam_map(void *sel, struct sec_cam_bmp *map, u8 max_num) { - DBG_871X_SEL_NL(sel, "0x%08x\n", map->m0); + RTW_PRINT_SEL(sel, "0x%08x\n", map->m0); #if (SEC_CAM_ENT_NUM_SW_LIMIT > 32) if (max_num && max_num > 32) - DBG_871X_SEL_NL(sel, "0x%08x\n", map->m1); + RTW_PRINT_SEL(sel, "0x%08x\n", map->m1); #endif #if (SEC_CAM_ENT_NUM_SW_LIMIT > 64) if (max_num && max_num > 64) - DBG_871X_SEL_NL(sel, "0x%08x\n", map->m2); + RTW_PRINT_SEL(sel, "0x%08x\n", map->m2); #endif #if (SEC_CAM_ENT_NUM_SW_LIMIT > 96) if (max_num && max_num > 96) - DBG_871X_SEL_NL(sel, "0x%08x\n", map->m3); + RTW_PRINT_SEL(sel, "0x%08x\n", map->m3); #endif } inline bool rtw_sec_camid_is_set(struct sec_cam_bmp *map, u8 id) { if (id < 32) - return (map->m0 & BIT(id)); + return map->m0 & BIT(id); #if (SEC_CAM_ENT_NUM_SW_LIMIT > 32) else if (id < 64) - return (map->m1 & BIT(id - 32)); + return map->m1 & BIT(id - 32); #endif #if (SEC_CAM_ENT_NUM_SW_LIMIT > 64) else if (id < 96) - return (map->m2 & BIT(id - 64)); + return map->m2 & BIT(id - 64); #endif #if (SEC_CAM_ENT_NUM_SW_LIMIT > 96) else if (id < 128) - return (map->m3 & BIT(id - 96)); + return map->m3 & BIT(id - 96); #endif else rtw_warn_on(1); @@ -1230,15 +1135,15 @@ inline void rtw_sec_cam_map_clr(struct sec_cam_bmp *map, u8 id) map->m0 &= ~BIT(id); #if (SEC_CAM_ENT_NUM_SW_LIMIT > 32) else if (id < 64) - map->m1 &= ~BIT(id-32); + map->m1 &= ~BIT(id - 32); #endif #if (SEC_CAM_ENT_NUM_SW_LIMIT > 64) else if (id < 96) - map->m2 &= ~BIT(id-64); + map->m2 &= ~BIT(id - 64); #endif #if (SEC_CAM_ENT_NUM_SW_LIMIT > 96) else if (id < 128) - map->m3 &= ~BIT(id-96); + map->m3 &= ~BIT(id - 96); #endif else rtw_warn_on(1); @@ -1274,18 +1179,18 @@ inline bool rtw_sec_camid_is_drv_forbid(struct cam_ctl_t *cam_ctl, u8 id) #endif if (id < 32) - return (forbid_map.m0 & BIT(id)); + return forbid_map.m0 & BIT(id); #if (SEC_CAM_ENT_NUM_SW_LIMIT > 32) else if (id < 64) - return (forbid_map.m1 & BIT(id - 32)); + return forbid_map.m1 & BIT(id - 32); #endif #if (SEC_CAM_ENT_NUM_SW_LIMIT > 64) else if (id < 96) - return (forbid_map.m2 & BIT(id - 64)); + return forbid_map.m2 & BIT(id - 64); #endif #if (SEC_CAM_ENT_NUM_SW_LIMIT > 96) else if (id < 128) - return (forbid_map.m3 & BIT(id - 96)); + return forbid_map.m3 & BIT(id - 96); #endif else rtw_warn_on(1); @@ -1302,12 +1207,12 @@ bool _rtw_sec_camid_is_used(struct cam_ctl_t *cam_ctl, u8 id) goto exit; } - #if 0 /* for testing */ +#if 0 /* for testing */ if (rtw_sec_camid_is_drv_forbid(cam_ctl, id)) { ret = _TRUE; goto exit; } - #endif +#endif ret = rtw_sec_camid_is_set(&cam_ctl->used, id); @@ -1326,6 +1231,26 @@ inline bool rtw_sec_camid_is_used(struct cam_ctl_t *cam_ctl, u8 id) return ret; } +u8 rtw_get_sec_camid(_adapter *adapter, u8 max_bk_key_num, u8 *sec_key_id) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl; + int i; + _irqL irqL; + u8 sec_cam_num = 0; + + _enter_critical_bh(&cam_ctl->lock, &irqL); + for (i = 0; i < cam_ctl->num; i++) { + if (_rtw_sec_camid_is_used(cam_ctl, i)) { + sec_key_id[sec_cam_num++] = i; + if (sec_cam_num == max_bk_key_num) + break; + } + } + _exit_critical_bh(&cam_ctl->lock, &irqL); + + return sec_cam_num; +} inline bool _rtw_camid_is_gk(_adapter *adapter, u8 cam_id) { @@ -1340,8 +1265,8 @@ inline bool _rtw_camid_is_gk(_adapter *adapter, u8 cam_id) if (_rtw_sec_camid_is_used(cam_ctl, cam_id) == _FALSE) goto exit; - - ret = (dvobj->cam_cache[cam_id].ctrl&BIT6)?_TRUE:_FALSE; + + ret = (dvobj->cam_cache[cam_id].ctrl & BIT6) ? _TRUE : _FALSE; exit: return ret; @@ -1368,9 +1293,9 @@ bool cam_cache_chk(_adapter *adapter, u8 id, u8 *addr, s16 kid, s8 gk) if (addr && _rtw_memcmp(dvobj->cam_cache[id].mac, addr, ETH_ALEN) == _FALSE) goto exit; - if (kid >= 0 && kid != (dvobj->cam_cache[id].ctrl&0x03)) + if (kid >= 0 && kid != (dvobj->cam_cache[id].ctrl & 0x03)) goto exit; - if (gk != -1 && (gk?_TRUE:_FALSE) != _rtw_camid_is_gk(adapter, id)) + if (gk != -1 && (gk ? _TRUE : _FALSE) != _rtw_camid_is_gk(adapter, id)) goto exit; ret = _TRUE; @@ -1395,10 +1320,10 @@ s16 _rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid, s8 gk) if (0) { if (addr) - DBG_871X(FUNC_ADPT_FMT" addr:"MAC_FMT" kid:%d, gk:%d, return cam_id:%d\n" + RTW_INFO(FUNC_ADPT_FMT" addr:"MAC_FMT" kid:%d, gk:%d, return cam_id:%d\n" , FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid, gk, cam_id); else - DBG_871X(FUNC_ADPT_FMT" addr:%p kid:%d, gk:%d, return cam_id:%d\n" + RTW_INFO(FUNC_ADPT_FMT" addr:%p kid:%d, gk:%d, return cam_id:%d\n" , FUNC_ADPT_ARG(adapter), addr, kid, gk, cam_id); } @@ -1419,8 +1344,67 @@ s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid, s8 gk) return cam_id; } +s16 rtw_get_camid(_adapter *adapter, struct sta_info *sta, u8 *addr, s16 kid) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl; + int i; +#if 0 /* for testing */ + static u8 start_id = 0; +#else + u8 start_id = 0; +#endif + s16 cam_id = -1; + + if (addr == NULL) { + RTW_PRINT(FUNC_ADPT_FMT" mac_address is NULL\n" + , FUNC_ADPT_ARG(adapter)); + rtw_warn_on(1); + goto _exit; + } + + /* find cam entry which has the same addr, kid (, gk bit) */ + if (_rtw_camctl_chk_cap(adapter, SEC_CAP_CHK_BMC) == _TRUE) + i = _rtw_camid_search(adapter, addr, kid, sta ? _FALSE : _TRUE); + else + i = _rtw_camid_search(adapter, addr, kid, -1); + + if (i >= 0) { + cam_id = i; + goto _exit; + } + + for (i = 0; i < cam_ctl->num; i++) { + /* bypass default key which is allocated statically */ +#ifndef CONFIG_CONCURRENT_MODE + if (((i + start_id) % cam_ctl->num) < 4) + continue; +#endif + if (_rtw_sec_camid_is_used(cam_ctl, ((i + start_id) % cam_ctl->num)) == _FALSE) + break; + } + + if (i == cam_ctl->num) { + if (sta) + RTW_PRINT(FUNC_ADPT_FMT" pairwise key with "MAC_FMT" id:%u no room\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid); + else + RTW_PRINT(FUNC_ADPT_FMT" group key with "MAC_FMT" id:%u no room\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid); + rtw_warn_on(1); + goto _exit; + } + + cam_id = ((i + start_id) % cam_ctl->num); + start_id = ((i + start_id + 1) % cam_ctl->num); + +_exit: + return cam_id; +} + s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid, bool *used) { + struct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info; struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl; _irqL irqL; @@ -1430,77 +1414,38 @@ s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid, bool *used) _enter_critical_bh(&cam_ctl->lock, &irqL); -#ifdef DYNAMIC_CAMID_ALLOC - { - struct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info; - - if((((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) || ((mlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)) - && !sta) { - /* AP/Ad-hoc mode group key: static alloction to default key by key ID */ - if (kid > 3) { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key with invalid key id:%u\n" - , FUNC_ADPT_ARG(adapter), kid); - rtw_warn_on(1); - goto bitmap_handle; - } - cam_id = kid; + if ((((mlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) || ((mlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE)) + && !sta) { +#ifndef CONFIG_CONCURRENT_MODE + /* AP/Ad-hoc mode group key static alloction to default key by key ID on Non-concurrent*/ + if (kid > 3) { + RTW_PRINT(FUNC_ADPT_FMT" group key with invalid key id:%u\n" + , FUNC_ADPT_ARG(adapter), kid); + rtw_warn_on(1); + goto bitmap_handle; } - else { - int i; - u8 *addr = sta?sta->hwaddr:NULL; - #if 0 /* for testing */ - static u8 start_id = 0; - #else - u8 start_id = 0; - #endif - - if(!sta) { - if (!(mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) { - /* bypass STA mode group key setting before connected(ex:WEP) because bssid is not ready */ - goto bitmap_handle; - } - - addr = get_bssid(&adapter->mlmepriv); - } - - /* find cam entry which has the same addr, kid (, gk bit) */ - if (_rtw_camctl_chk_cap(adapter, SEC_CAP_CHK_BMC) == _TRUE) - i = _rtw_camid_search(adapter, addr, kid, sta?_FALSE:_TRUE); - else - i = _rtw_camid_search(adapter, addr, kid, -1); - - if (i >= 0) { - cam_id = i; - goto bitmap_handle; - } - - for (i = 0; i < cam_ctl->num; i++) { - /* bypass default key which is allocated statically */ - if (((i + start_id) % cam_ctl->num) < 4) - continue; - - if (_rtw_sec_camid_is_used(cam_ctl, ((i + start_id) % cam_ctl->num)) == _FALSE) - break; - } - - if (i == cam_ctl->num) { - if (sta) - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" pairwise key with "MAC_FMT" id:%u no room\n" - , FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid); - else - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key with "MAC_FMT" id:%u no room\n" - , FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid); - rtw_warn_on(1); - goto bitmap_handle; - } - - cam_id = ((i + start_id) % cam_ctl->num); - start_id = ((i + start_id + 1) % cam_ctl->num); - } - } + cam_id = kid; #else - cam_id = rtw_get_camid(adapter, sta, kid); -#endif /* DYNAMIC_CAMID_ALLOC */ + u8 *addr = adapter_mac_addr(adapter); + + cam_id = rtw_get_camid(adapter, sta, addr, kid); + if (1) + RTW_PRINT(FUNC_ADPT_FMT" group key with "MAC_FMT" assigned cam_id:%u\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(addr), cam_id); +#endif + } else { + u8 *addr = sta ? sta->hwaddr : NULL; + + if (!sta) { + if (!(mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) { + /* bypass STA mode group key setting before connected(ex:WEP) because bssid is not ready */ + goto bitmap_handle; + } + addr = get_bssid(&adapter->mlmepriv);/*A2*/ + } + cam_id = rtw_get_camid(adapter, sta, addr, kid); + } + bitmap_handle: if (cam_id >= 0) { @@ -1513,6 +1458,20 @@ bitmap_handle: return cam_id; } +void rtw_camid_set(_adapter *adapter, u8 cam_id) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl; + _irqL irqL; + + _enter_critical_bh(&cam_ctl->lock, &irqL); + + if (cam_id < cam_ctl->num) + rtw_sec_cam_map_set(&cam_ctl->used, cam_id); + + _exit_critical_bh(&cam_ctl->lock, &irqL); +} + void rtw_camid_free(_adapter *adapter, u8 cam_id) { struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); @@ -1527,23 +1486,102 @@ void rtw_camid_free(_adapter *adapter, u8 cam_id) _exit_critical_bh(&cam_ctl->lock, &irqL); } -int allocate_fw_sta_entry(_adapter *padapter) +/*Must pause TX/RX before use this API*/ +inline void rtw_sec_cam_swap(_adapter *adapter, u8 cam_id_a, u8 cam_id_b) { - unsigned int mac_id; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - for (mac_id = IBSS_START_MAC_ID; mac_id < NUM_STA; mac_id++) - { - if (pmlmeinfo->FW_sta_info[mac_id].status == 0) - { - pmlmeinfo->FW_sta_info[mac_id].status = 1; - pmlmeinfo->FW_sta_info[mac_id].retry = 0; + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl; + struct sec_cam_ent cache_a, cache_b; + _irqL irqL; + bool cam_a_used, cam_b_used; + + if (1) + RTW_INFO(ADPT_FMT" - sec_cam %d,%d swap\n", ADPT_ARG(adapter), cam_id_a, cam_id_b); + + if (cam_id_a == cam_id_b) + return; + +#ifdef CONFIG_CONCURRENT_MODE + rtw_mi_update_ap_bmc_camid(adapter, cam_id_a, cam_id_b); +#endif + + /*setp-1. backup org cam_info*/ + _enter_critical_bh(&cam_ctl->lock, &irqL); + + cam_a_used = _rtw_sec_camid_is_used(cam_ctl, cam_id_a); + cam_b_used = _rtw_sec_camid_is_used(cam_ctl, cam_id_b); + + if (cam_a_used) + _rtw_memcpy(&cache_a, &dvobj->cam_cache[cam_id_a], sizeof(struct sec_cam_ent)); + + if (cam_b_used) + _rtw_memcpy(&cache_b, &dvobj->cam_cache[cam_id_b], sizeof(struct sec_cam_ent)); + + _exit_critical_bh(&cam_ctl->lock, &irqL); + + /*setp-2. clean cam_info*/ + if (cam_a_used) { + rtw_camid_free(adapter, cam_id_a); + clear_cam_entry(adapter, cam_id_a); + } + if (cam_b_used) { + rtw_camid_free(adapter, cam_id_b); + clear_cam_entry(adapter, cam_id_b); + } + + /*setp-3. set cam_info*/ + if (cam_a_used) { + write_cam(adapter, cam_id_b, cache_a.ctrl, cache_a.mac, cache_a.key); + rtw_camid_set(adapter, cam_id_b); + } + + if (cam_b_used) { + write_cam(adapter, cam_id_a, cache_b.ctrl, cache_b.mac, cache_b.key); + rtw_camid_set(adapter, cam_id_a); + } +} + +s16 rtw_get_empty_cam_entry(_adapter *adapter, u8 start_camid) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl; + _irqL irqL; + int i; + s16 cam_id = -1; + + _enter_critical_bh(&cam_ctl->lock, &irqL); + for (i = start_camid; i < cam_ctl->num; i++) { + if (_FALSE == _rtw_sec_camid_is_used(cam_ctl, i)) { + cam_id = i; break; } } - - return mac_id; + _exit_critical_bh(&cam_ctl->lock, &irqL); + + return cam_id; +} +void rtw_clean_dk_section(_adapter *adapter) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct cam_ctl_t *cam_ctl = dvobj_to_sec_camctl(dvobj); + s16 ept_cam_id; + int i; + + for (i = 0; i < 4; i++) { + if (rtw_sec_camid_is_used(cam_ctl, i)) { + ept_cam_id = rtw_get_empty_cam_entry(adapter, 4); + if (ept_cam_id > 0) + rtw_sec_cam_swap(adapter, i, ept_cam_id); + } + } +} +void rtw_clean_hw_dk_cam(_adapter *adapter) +{ + int i; + + for (i = 0; i < 4; i++) + rtw_sec_clr_cam_ent(adapter, i); + /*_clear_cam_entry(adapter, i);*/ } void flush_all_cam_entry(_adapter *padapter) @@ -1551,140 +1589,125 @@ void flush_all_cam_entry(_adapter *padapter) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecpriv = &padapter->securitypriv; #ifdef CONFIG_CONCURRENT_MODE - if(check_buddy_fwstate(padapter, _FW_LINKED) == _TRUE) - { - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) - { - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta; + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta; - psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress); - if(psta) { - if(psta->state & WIFI_AP_STATE) - {} //clear cam when ap free per sta_info - else { - rtw_clearstakey_cmd(padapter, psta, _FALSE); - } + psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress); + if (psta) { + if (psta->state & WIFI_AP_STATE) { + /*clear cam when ap free per sta_info*/ + } else + rtw_clearstakey_cmd(padapter, psta, _FALSE); + } + } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { +#if 1 + int cam_id = -1; + u8 *addr = adapter_mac_addr(padapter); + + while ((cam_id = rtw_camid_search(padapter, addr, -1, -1)) >= 0) { + RTW_PRINT("clear wep or group key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(addr), cam_id); + clear_cam_entry(padapter, cam_id); + rtw_camid_free(padapter, cam_id); + } +#else + /* clear default key */ + int i, cam_id; + u8 null_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; + + for (i = 0; i < 4; i++) { + cam_id = rtw_camid_search(padapter, null_addr, i, -1); + if (cam_id >= 0) { + clear_cam_entry(padapter, cam_id); + rtw_camid_free(padapter, cam_id); } } - else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - /* clear default key */ - int i, cam_id; - u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0}; - - for (i=0;i<4;i++) { - cam_id = rtw_camid_search(padapter, null_addr, i, -1); - if (cam_id >= 0) { - clear_cam_entry(padapter, cam_id); - rtw_camid_free(padapter, cam_id); - } - } - - /* clear default key related key search setting */ - #ifdef DYNAMIC_CAMID_ALLOC - rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE); - #endif - - /* leave pairwise key when ap free per sta_info */ - } - } - else -#endif //CONFIG_CONCURRENT_MODE - { - invalidate_cam_all(padapter); /* clear default key related key search setting */ - #ifdef DYNAMIC_CAMID_ALLOC - rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE); - #endif + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8 *)_FALSE); +#endif } - _rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info)); - +#else /*NON CONFIG_CONCURRENT_MODE*/ + + invalidate_cam_all(padapter); + /* clear default key related key search setting */ + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8 *)_FALSE); +#endif } #if defined(CONFIG_P2P) && defined(CONFIG_WFD) -int WFD_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +void rtw_process_wfd_ie(_adapter *adapter, u8 *wfd_ie, u8 wfd_ielen, const char *tag) { - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo; - u8 wfd_ie[ 128 ] = { 0x00 }; - u32 wfd_ielen = 0; + struct wifidirect_info *wdinfo = &adapter->wdinfo; + u8 *attr_content; + u32 attr_contentlen = 0; - pwdinfo = &padapter->wdinfo; - if ( rtw_get_wfd_ie( ( u8* ) pIE, pIE->Length, wfd_ie, &wfd_ielen ) ) - { - u8 attr_content[ 10 ] = { 0x00 }; - u32 attr_contentlen = 0; - - DBG_871X( "[%s] Found WFD IE\n", __FUNCTION__ ); - rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen); - if ( attr_contentlen ) - { - pwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); - DBG_8192C( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport ); - return( _TRUE ); - } + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + return; + + RTW_INFO("[%s] Found WFD IE\n", tag); + attr_content = rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, NULL, &attr_contentlen); + if (attr_content && attr_contentlen) { + wdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16(attr_content + 2); + RTW_INFO("[%s] Peer PORT NUM = %d\n", tag, wdinfo->wfd_info->peer_rtsp_ctrlport); } - else - { - DBG_871X( "[%s] NO WFD IE\n", __FUNCTION__ ); - - } - return( _FAIL ); } -#endif + +void rtw_process_wfd_ies(_adapter *adapter, u8 *ies, u8 ies_len, const char *tag) +{ + u8 *wfd_ie; + u32 wfd_ielen; + + if (!hal_chk_wl_func(adapter, WL_FUNC_MIRACAST)) + return; + + wfd_ie = rtw_get_wfd_ie(ies, ies_len, NULL, &wfd_ielen); + while (wfd_ie) { + rtw_process_wfd_ie(adapter, wfd_ie, wfd_ielen, tag); + wfd_ie = rtw_get_wfd_ie(wfd_ie + wfd_ielen, (ies + ies_len) - (wfd_ie + wfd_ielen), NULL, &wfd_ielen); + } +} +#endif /* defined(CONFIG_P2P) && defined(CONFIG_WFD) */ int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) { - //struct registry_priv *pregpriv = &padapter->registrypriv; + /* struct registry_priv *pregpriv = &padapter->registrypriv; */ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if(pmlmepriv->qospriv.qos_option==0) - { + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (pmlmepriv->qospriv.qos_option == 0) { pmlmeinfo->WMM_enable = 0; return _FALSE; - } - - if(_rtw_memcmp(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element))) - { + } + + if (_rtw_memcmp(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element))) return _FALSE; - } else - { _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)); - } pmlmeinfo->WMM_enable = 1; return _TRUE; - /*if (pregpriv->wifi_spec == 1) - { - if (pmlmeinfo->WMM_enable == 1) - { - //todo: compare the parameter set count & decide wheher to update or not +#if 0 + if (pregpriv->wifi_spec == 1) { + if (pmlmeinfo->WMM_enable == 1) { + /* todo: compare the parameter set count & decide wheher to update or not */ return _FAIL; - } - else - { + } else { pmlmeinfo->WMM_enable = 1; _rtw_rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)); return _TRUE; } - } - else - { + } else { pmlmeinfo->WMM_enable = 0; return _FAIL; - }*/ - + } +#endif + } void WMMOnAssocRsp(_adapter *padapter) @@ -1701,19 +1724,18 @@ void WMMOnAssocRsp(_adapter *padapter) acm_mask = 0; - if (IsSupported5G(pmlmeext->cur_wireless_mode) || - (pmlmeext->cur_wireless_mode & WIRELESS_11_24N) ) + if (IsSupported5G(pmlmeext->cur_wireless_mode) || + (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) aSifsTime = 16; else aSifsTime = 10; - if (pmlmeinfo->WMM_enable == 0) - { + if (pmlmeinfo->WMM_enable == 0) { padapter->mlmepriv.acm_mask = 0; AIFS = aSifsTime + (2 * pmlmeinfo->slotTime); - if (pmlmeext->cur_wireless_mode & (WIRELESS_11G |WIRELESS_11A)) { + if (pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11A)) { ECWMin = 4; ECWMax = 10; } else if (pmlmeext->cur_wireless_mode & WIRELESS_11B) { @@ -1735,17 +1757,14 @@ void WMMOnAssocRsp(_adapter *padapter) TXOP = 0x2f; acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); - } - else - { + } else { edca[0] = edca[1] = edca[2] = edca[3] = 0; - for (i = 0; i < 4; i++) - { + for (i = 0; i < 4; i++) { ACI = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 5) & 0x03; ACM = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 4) & 0x01; - //AIFS = AIFSN * slot time + SIFS - r2t phy delay + /* AIFS = AIFSN * slot time + SIFS - r2t phy delay */ AIFS = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN & 0x0f) * pmlmeinfo->slotTime + aSifsTime; ECWMin = (pmlmeinfo->WMM_param.ac_param[i].CW & 0x0f); @@ -1754,66 +1773,61 @@ void WMMOnAssocRsp(_adapter *padapter) acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); - switch (ACI) - { - case 0x0: - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); - acm_mask |= (ACM? BIT(1):0); - edca[XMIT_BE_QUEUE] = acParm; - break; + switch (ACI) { + case 0x0: + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); + acm_mask |= (ACM ? BIT(1) : 0); + edca[XMIT_BE_QUEUE] = acParm; + break; - case 0x1: - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); - //acm_mask |= (ACM? BIT(0):0); - edca[XMIT_BK_QUEUE] = acParm; - break; + case 0x1: + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); + /* acm_mask |= (ACM? BIT(0):0); */ + edca[XMIT_BK_QUEUE] = acParm; + break; - case 0x2: - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); - acm_mask |= (ACM? BIT(2):0); - edca[XMIT_VI_QUEUE] = acParm; - break; + case 0x2: + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); + acm_mask |= (ACM ? BIT(2) : 0); + edca[XMIT_VI_QUEUE] = acParm; + break; - case 0x3: - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); - acm_mask |= (ACM? BIT(3):0); - edca[XMIT_VO_QUEUE] = acParm; - break; + case 0x3: + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); + acm_mask |= (ACM ? BIT(3) : 0); + edca[XMIT_VO_QUEUE] = acParm; + break; } - DBG_871X("WMM(%x): %x, %x\n", ACI, ACM, acParm); + RTW_INFO("WMM(%x): %x, %x\n", ACI, ACM, acParm); } - if(padapter->registrypriv.acm_method == 1) + if (padapter->registrypriv.acm_method == 1) rtw_hal_set_hwreg(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask)); else padapter->mlmepriv.acm_mask = acm_mask; - inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3; + inx[0] = 0; + inx[1] = 1; + inx[2] = 2; + inx[3] = 3; - if(pregpriv->wifi_spec==1) - { - u32 j, tmp, change_inx=_FALSE; + if (pregpriv->wifi_spec == 1) { + u32 j, tmp, change_inx = _FALSE; - //entry indx: 0->vo, 1->vi, 2->be, 3->bk. - for(i=0; i<4; i++) - { - for(j=i+1; j<4; j++) - { - //compare CW and AIFS - if((edca[j] & 0xFFFF) < (edca[i] & 0xFFFF)) - { + /* entry indx: 0->vo, 1->vi, 2->be, 3->bk. */ + for (i = 0; i < 4; i++) { + for (j = i + 1; j < 4; j++) { + /* compare CW and AIFS */ + if ((edca[j] & 0xFFFF) < (edca[i] & 0xFFFF)) change_inx = _TRUE; - } - else if((edca[j] & 0xFFFF) == (edca[i] & 0xFFFF)) - { - //compare TXOP - if((edca[j] >> 16) > (edca[i] >> 16)) + else if ((edca[j] & 0xFFFF) == (edca[i] & 0xFFFF)) { + /* compare TXOP */ + if ((edca[j] >> 16) > (edca[i] >> 16)) change_inx = _TRUE; } - - if(change_inx) - { + + if (change_inx) { tmp = edca[i]; edca[i] = edca[j]; edca[j] = tmp; @@ -1828,9 +1842,9 @@ void WMMOnAssocRsp(_adapter *padapter) } } - for(i=0; i<4; i++) { + for (i = 0; i < 4; i++) { pxmitpriv->wmm_para_seq[i] = inx[i]; - DBG_871X("wmm_para_seq(%d): %d\n", i, pxmitpriv->wmm_para_seq[i]); + RTW_INFO("wmm_para_seq(%d): %d\n", i, pxmitpriv->wmm_para_seq[i]); } } } @@ -1840,24 +1854,26 @@ static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pI #ifdef CONFIG_80211N_HT unsigned char new_bwmode; unsigned char new_ch_offset; - struct HT_info_element *pHT_info; + struct HT_info_element *pHT_info; struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct registry_priv *pregistrypriv = &padapter->registrypriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; - u8 cbw40_enable=0; + u8 cbw40_enable = 0; - if(!pIE) + if (!pIE) return; - if(phtpriv->ht_option == _FALSE) return; - - if(pmlmeext->cur_bwmode >= CHANNEL_WIDTH_80) return; - - if(pIE->Length > sizeof(struct HT_info_element)) + if (phtpriv->ht_option == _FALSE) return; - + + if (pmlmeext->cur_bwmode >= CHANNEL_WIDTH_80) + return; + + if (pIE->Length > sizeof(struct HT_info_element)) + return; + pHT_info = (struct HT_info_element *)pIE->data; if (hal_chk_bw_cap(padapter, BW_CAP_40M)) { @@ -1870,72 +1886,61 @@ static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pI } } - if((pHT_info->infos[0] & BIT(2)) && cbw40_enable) - { + if ((pHT_info->infos[0] & BIT(2)) && cbw40_enable) { new_bwmode = CHANNEL_WIDTH_40; - switch (pHT_info->infos[0] & 0x3) - { - case 1: - new_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - - case 3: - new_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - - default: - new_bwmode = CHANNEL_WIDTH_20; - new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; + switch (pHT_info->infos[0] & 0x3) { + case 1: + new_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case 3: + new_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + new_bwmode = CHANNEL_WIDTH_20; + new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; } - } - else - { + } else { new_bwmode = CHANNEL_WIDTH_20; new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - } + } - - if((new_bwmode!= pmlmeext->cur_bwmode) || (new_ch_offset!=pmlmeext->cur_ch_offset)) - { + + if ((new_bwmode != pmlmeext->cur_bwmode || new_ch_offset != pmlmeext->cur_ch_offset) + && new_bwmode < pmlmeext->cur_bwmode + ) { pmlmeinfo->bwmode_updated = _TRUE; - + pmlmeext->cur_bwmode = new_bwmode; pmlmeext->cur_ch_offset = new_ch_offset; - //update HT info also + /* update HT info also */ HT_info_handler(padapter, pIE); - } - else - { + } else pmlmeinfo->bwmode_updated = _FALSE; - } - - if(_TRUE == pmlmeinfo->bwmode_updated) - { + + if (_TRUE == pmlmeinfo->bwmode_updated) { struct sta_info *psta; - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); struct sta_priv *pstapriv = &padapter->stapriv; - - //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - //update ap's stainfo + /* set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); */ + + + /* update ap's stainfo */ psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); - if(psta) - { + if (psta) { struct ht_priv *phtpriv_sta = &psta->htpriv; - - if(phtpriv_sta->ht_option) - { - // bwmode + + if (phtpriv_sta->ht_option) { + /* bwmode */ psta->bw_mode = pmlmeext->cur_bwmode; - phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; - } - else - { + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; + } else { psta->bw_mode = CHANNEL_WIDTH_20; phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; } @@ -1943,9 +1948,9 @@ static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pI rtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta); } - //pmlmeinfo->bwmode_updated = _FALSE;//bwmode_updated done, reset it! - } -#endif //CONFIG_80211N_HT + /* pmlmeinfo->bwmode_updated = _FALSE; */ /* bwmode_updated done, reset it! */ + } +#endif /* CONFIG_80211N_HT */ } void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) @@ -1954,166 +1959,146 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) unsigned int i; 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; + u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - - if(pIE==NULL) return; - - if(phtpriv->ht_option == _FALSE) return; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + + if (pIE == NULL) + return; + + if (phtpriv->ht_option == _FALSE) + return; pmlmeinfo->HT_caps_enable = 1; - - for (i = 0; i < (pIE->Length); i++) - { - if (i != 2) - { - // Commented by Albert 2010/07/12 - // Got the endian issue here. + + for (i = 0; i < (pIE->Length); i++) { + if (i != 2) { + /* Commented by Albert 2010/07/12 */ + /* Got the endian issue here. */ pmlmeinfo->HT_caps.u.HT_cap[i] &= (pIE->data[i]); - } - else - { + } else { /* AMPDU Parameters field */ /* Get MIN of MAX AMPDU Length Exp */ if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3)) - { max_AMPDU_len = (pIE->data[i] & 0x3); - } else - { max_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3); - } /* Get MAX of MIN MPDU Start Spacing */ if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c)) - { min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c); - } else - { min_MPDU_spacing = (pIE->data[i] & 0x1c); - } pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para = max_AMPDU_len | min_MPDU_spacing; } } - // Commented by Albert 2010/07/12 - // Have to handle the endian issue after copying. - // HT_ext_caps didn't be used yet. - pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = le16_to_cpu( pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info ); - pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps = le16_to_cpu( pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps ); + /* Commented by Albert 2010/07/12 */ + /* Have to handle the endian issue after copying. */ + /* HT_ext_caps didn't be used yet. */ + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info); + pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps = le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps); rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - //update the MCS set + /* update the MCS set */ for (i = 0; i < 16; i++) pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i]; - - //update the MCS rates - switch(rf_type) - { - case RF_1T1R: - case RF_1T2R: - set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R); - break; - case RF_2T2R: - #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 - set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R); -#else //CONFIG_DISABLE_MCS13TO15 + + /* update the MCS rates */ + switch (rf_type) { + case RF_1T1R: + case RF_1T2R: + set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R); + break; + case RF_2T2R: +#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 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); +#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: + RTW_INFO("[warning] rf_type %d is not expected\n", rf_type); } if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { - // Config STBC setting - if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_TX_STBC(pIE->data)) - { + /* Config STBC setting */ + if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_RX_STBC(pIE->data)) { SET_FLAG(cur_stbc_cap, STBC_HT_ENABLE_TX); - DBG_871X("Enable HT Tx STBC !\n"); + RTW_INFO("Enable HT Tx STBC !\n"); } phtpriv->stbc_cap = cur_stbc_cap; #ifdef CONFIG_BEAMFORMING - // Config Tx beamforming setting - if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) && - GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pIE->data)) - { + /* Config Tx beamforming setting */ + if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) && + GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pIE->data)) { SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE); /* Shift to BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP*/ SET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(pIE->data) << 6); } if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && - GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pIE->data)) - { + GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pIE->data)) { SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE); /* Shift to BEAMFORMING_HT_BEAMFORMER_STEER_NUM*/ SET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pIE->data) << 4); } phtpriv->beamform_cap = cur_beamform_cap; - if (cur_beamform_cap) { - DBG_871X("AP HT Beamforming Cap = 0x%02X\n", cur_beamform_cap); - } + if (cur_beamform_cap) + RTW_INFO("AP HT Beamforming Cap = 0x%02X\n", cur_beamform_cap); #endif /*CONFIG_BEAMFORMING*/ } else { /*WIFI_STATION_STATEorI_ADHOC_STATE or WIFI_ADHOC_MASTER_STATE*/ - // Config LDPC Coding Capability - if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAP_ELE_LDPC_CAP(pIE->data)) - { + /* Config LDPC Coding Capability */ + if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAP_ELE_LDPC_CAP(pIE->data)) { SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX)); - DBG_871X("Enable HT Tx LDPC!\n"); + RTW_INFO("Enable HT Tx LDPC!\n"); } phtpriv->ldpc_cap = cur_ldpc_cap; - // Config STBC setting - if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_RX_STBC(pIE->data)) - { - SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX) ); - DBG_871X("Enable HT Tx STBC!\n"); + /* Config STBC setting */ + if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_RX_STBC(pIE->data)) { + SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX)); + RTW_INFO("Enable HT Tx STBC!\n"); } phtpriv->stbc_cap = cur_stbc_cap; #ifdef CONFIG_BEAMFORMING - // Config Tx beamforming setting - if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && - GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pIE->data)) - { + /* Config Tx beamforming setting */ + if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && + GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pIE->data)) { SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE); /* Shift to BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP*/ SET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(pIE->data) << 6); } if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) && - GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pIE->data)) - { + GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pIE->data)) { SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE); /* Shift to BEAMFORMING_HT_BEAMFORMER_STEER_NUM*/ SET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pIE->data) << 4); } phtpriv->beamform_cap = cur_beamform_cap; - if (cur_beamform_cap) { - DBG_871X("Client HT Beamforming Cap = 0x%02X\n", cur_beamform_cap); - } + if (cur_beamform_cap) + RTW_INFO("Client HT Beamforming Cap = 0x%02X\n", cur_beamform_cap); #endif /*CONFIG_BEAMFORMING*/ } -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ } void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) @@ -2121,20 +2106,22 @@ void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) #ifdef CONFIG_80211N_HT struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; - if(pIE==NULL) return; - - if(phtpriv->ht_option == _FALSE) return; - - - if(pIE->Length > sizeof(struct HT_info_element)) + if (pIE == NULL) return; - + + if (phtpriv->ht_option == _FALSE) + return; + + + if (pIE->Length > sizeof(struct HT_info_element)) + return; + pmlmeinfo->HT_info_enable = 1; _rtw_memcpy(&(pmlmeinfo->HT_info), pIE->data, pIE->Length); -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ return; } @@ -2142,86 +2129,78 @@ void HTOnAssocRsp(_adapter *padapter) { unsigned char max_AMPDU_len; unsigned char min_MPDU_spacing; - //struct registry_priv *pregpriv = &padapter->registrypriv; + /* struct registry_priv *pregpriv = &padapter->registrypriv; */ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - DBG_871X("%s\n", __FUNCTION__); + + RTW_INFO("%s\n", __FUNCTION__); if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) - { pmlmeinfo->HT_enable = 1; - } - else - { + else { pmlmeinfo->HT_enable = 0; - //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + /* set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); */ return; } - - //handle A-MPDU parameter field - /* + + /* handle A-MPDU parameter field */ + /* AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k - AMPDU_para [4:2]:Min MPDU Start Spacing + AMPDU_para [4:2]:Min MPDU Start Spacing */ - max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; - - min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; + max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; + + min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); -#if 0 //move to rtw_update_ht_cap() +#if 0 /* move to rtw_update_ht_cap() */ if ((pregpriv->bw_mode > 0) && - (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) && - (pmlmeinfo->HT_info.infos[0] & BIT(2))) - { - //switch to the 40M Hz mode accoring to the AP + (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) && + (pmlmeinfo->HT_info.infos[0] & BIT(2))) { + /* switch to the 40M Hz mode accoring to the AP */ pmlmeext->cur_bwmode = CHANNEL_WIDTH_40; - switch ((pmlmeinfo->HT_info.infos[0] & 0x3)) - { - case EXTCHNL_OFFSET_UPPER: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - - case EXTCHNL_OFFSET_LOWER: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - - default: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; + switch ((pmlmeinfo->HT_info.infos[0] & 0x3)) { + case EXTCHNL_OFFSET_UPPER: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case EXTCHNL_OFFSET_LOWER: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; } - - //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); } #endif - //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + /* set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); */ -#if 0 //move to rtw_update_ht_cap() - // - // Config SM Power Save setting - // +#if 0 /* move to rtw_update_ht_cap() */ + /* */ + /* Config SM Power Save setting */ + /* */ pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2; - if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) - { - /*u8 i; - //update the MCS rates + if (pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) { +#if 0 + u8 i; + /* update the MCS rates */ for (i = 0; i < 16; i++) - { pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; - }*/ - DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); +#endif + RTW_INFO("%s(): WLAN_HT_CAP_SM_PS_STATIC\n", __FUNCTION__); } - // - // Config current HT Protection mode. - // + /* */ + /* Config current HT Protection mode. */ + /* */ pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; #endif - + } void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) @@ -2229,57 +2208,53 @@ void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - if(pIE->Length>1) + if (pIE->Length > 1) return; - + pmlmeinfo->ERP_enable = 1; _rtw_memcpy(&(pmlmeinfo->ERP_IE), pIE->data, pIE->Length); } void VCS_update(_adapter *padapter, struct sta_info *psta) { - struct registry_priv *pregpriv = &padapter->registrypriv; + struct registry_priv *pregpriv = &padapter->registrypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - switch (pregpriv->vrtl_carrier_sense)/* 0:off 1:on 2:auto */ - { - case 0: //off - psta->rtsen = 0; + switch (pregpriv->vrtl_carrier_sense) { /* 0:off 1:on 2:auto */ + case 0: /* off */ + psta->rtsen = 0; + psta->cts2self = 0; + break; + + case 1: /* on */ + if (pregpriv->vcs_type == 1) { /* 1:RTS/CTS 2:CTS to self */ + psta->rtsen = 1; psta->cts2self = 0; - break; - - case 1: //on - if (pregpriv->vcs_type == 1) /* 1:RTS/CTS 2:CTS to self */ - { + } else { + psta->rtsen = 0; + psta->cts2self = 1; + } + break; + + case 2: /* auto */ + default: + if (((pmlmeinfo->ERP_enable) && (pmlmeinfo->ERP_IE & BIT(1))) + /*||(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)*/ + ) { + if (pregpriv->vcs_type == 1) { psta->rtsen = 1; psta->cts2self = 0; - } - else - { + } else { psta->rtsen = 0; psta->cts2self = 1; } - break; - - case 2: //auto - default: - if (((pmlmeinfo->ERP_enable) && (pmlmeinfo->ERP_IE & BIT(1))) - /*||(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)*/ - ) { - if (pregpriv->vcs_type == 1) { - psta->rtsen = 1; - psta->cts2self = 0; - } else { - psta->rtsen = 0; - psta->cts2self = 1; - } - } else { - psta->rtsen = 0; - psta->cts2self = 0; - } - break; + } else { + psta->rtsen = 0; + psta->cts2self = 0; + } + break; } } @@ -2289,26 +2264,25 @@ void update_ldpc_stbc_cap(struct sta_info *psta) #ifdef CONFIG_80211AC_VHT if (psta->vhtpriv.vht_option) { - if(TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX)) + if (TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX)) psta->ldpc = 1; - if(TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX)) + if (TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX)) psta->stbc = 1; - } - else -#endif //CONFIG_80211AC_VHT - if (psta->htpriv.ht_option) { - if(TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX)) - psta->ldpc = 1; + } else +#endif /* CONFIG_80211AC_VHT */ + if (psta->htpriv.ht_option) { + if (TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX)) + psta->ldpc = 1; - if(TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX)) - psta->stbc = 1; - } else { - psta->ldpc = 0; - psta->stbc = 0; - } + if (TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX)) + psta->stbc = 1; + } else { + psta->ldpc = 0; + psta->stbc = 0; + } -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ } @@ -2322,7 +2296,7 @@ void update_ldpc_stbc_cap(struct sta_info *psta) * WLAN_EID_PWR_CONSTRAINT */ int rtw_get_bcn_keys(ADAPTER *Adapter, u8 *pframe, u32 packet_len, - struct beacon_keys *recv_beacon) + struct beacon_keys *recv_beacon) { int left; u16 capability; @@ -2362,42 +2336,41 @@ int rtw_get_bcn_keys(ADAPTER *Adapter, u8 *pframe, u32 packet_len, /* Checking for channel */ if (elems.ds_params && elems.ds_params_len == sizeof(recv_beacon->bcn_channel)) _rtw_memcpy(&recv_beacon->bcn_channel, elems.ds_params, - sizeof(recv_beacon->bcn_channel)); + sizeof(recv_beacon->bcn_channel)); else if (pht_info) /* In 5G, some ap do not have DSSET IE checking HT info for channel */ recv_beacon->bcn_channel = pht_info->primary_channel; else { /* we don't find channel IE, so don't check it */ - //DBG_871X("Oops: %s we don't find channel IE, so don't check it \n", __func__); + /* RTW_INFO("Oops: %s we don't find channel IE, so don't check it\n", __func__); */ recv_beacon->bcn_channel = Adapter->mlmeextpriv.cur_channel; } /* checking SSID */ if (elems.ssid) { - if (elems.ssid_len > sizeof(recv_beacon->ssid)) + if (elems.ssid_len > sizeof(recv_beacon->ssid)) return _FALSE; - _rtw_memcpy(recv_beacon->ssid, elems.ssid, elems.ssid_len); - recv_beacon->ssid_len = elems.ssid_len; - } else; // means hidden ssid + _rtw_memcpy(recv_beacon->ssid, elems.ssid, elems.ssid_len); + recv_beacon->ssid_len = elems.ssid_len; + } else + ; /* means hidden ssid */ /* checking RSN first */ if (elems.rsn_ie && elems.rsn_ie_len) { recv_beacon->encryp_protocol = ENCRYP_PROTOCOL_WPA2; rtw_parse_wpa2_ie(elems.rsn_ie - 2, elems.rsn_ie_len + 2, &recv_beacon->group_cipher, &recv_beacon->pairwise_cipher, - &recv_beacon->is_8021x); + &recv_beacon->is_8021x); } /* checking WPA secon */ else if (elems.wpa_ie && elems.wpa_ie_len) { recv_beacon->encryp_protocol = ENCRYP_PROTOCOL_WPA; rtw_parse_wpa_ie(elems.wpa_ie - 2, elems.wpa_ie_len + 2, &recv_beacon->group_cipher, &recv_beacon->pairwise_cipher, - &recv_beacon->is_8021x); - } - else if (capability & BIT(4)) { + &recv_beacon->is_8021x); + } else if (capability & BIT(4)) recv_beacon->encryp_protocol = ENCRYP_PROTOCOL_WEP; - } return _TRUE; } @@ -2411,13 +2384,13 @@ void rtw_dump_bcn_keys(struct beacon_keys *recv_beacon) _rtw_memcpy(ssid, recv_beacon->ssid, recv_beacon->ssid_len); ssid[recv_beacon->ssid_len] = '\0'; - DBG_871X("%s: ssid = %s\n", __func__, ssid); - DBG_871X("%s: channel = %x\n", __func__, recv_beacon->bcn_channel); - DBG_871X("%s: ht_cap = %x\n", __func__, recv_beacon->ht_cap_info); - DBG_871X("%s: ht_info_infos_0_sco = %x\n", __func__, recv_beacon->ht_info_infos_0_sco); - DBG_871X("%s: sec=%d, group = %x, pair = %x, 8021X = %x\n", __func__, - recv_beacon->encryp_protocol, recv_beacon->group_cipher, - recv_beacon->pairwise_cipher, recv_beacon->is_8021x); + RTW_INFO("%s: ssid = %s\n", __func__, ssid); + RTW_INFO("%s: channel = %x\n", __func__, recv_beacon->bcn_channel); + RTW_INFO("%s: ht_cap = %x\n", __func__, recv_beacon->ht_cap_info); + RTW_INFO("%s: ht_info_infos_0_sco = %x\n", __func__, recv_beacon->ht_info_infos_0_sco); + RTW_INFO("%s: sec=%d, group = %x, pair = %x, 8021X = %x\n", __func__, + recv_beacon->encryp_protocol, recv_beacon->group_cipher, + recv_beacon->pairwise_cipher, recv_beacon->is_8021x); } int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len) @@ -2427,8 +2400,8 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len) unsigned char *p; unsigned short val16, subtype; struct wlan_network *cur_network = &(Adapter->mlmepriv.cur_network); - //u8 wpa_ie[255],rsn_ie[255]; - u16 wpa_len=0,rsn_len=0; + /* u8 wpa_ie[255],rsn_ie[255]; */ + u16 wpa_len = 0, rsn_len = 0; u8 encryp_protocol = 0; WLAN_BSSID_EX *bssid; int group_cipher = 0, pairwise_cipher = 0, is_8021x = 0; @@ -2436,11 +2409,11 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len) u32 wpa_ielen = 0; u8 *pbssid = GetAddr3Ptr(pframe); u32 hidden_ssid = 0; - u8 cur_network_type, network_type=0; + u8 cur_network_type, network_type = 0; struct HT_info_element *pht_info = NULL; struct rtw_ieee80211_ht_cap *pht_cap = NULL; u32 bcn_channel; - unsigned short ht_cap_info; + unsigned short ht_cap_info; unsigned char ht_info_infos_0; #endif unsigned int len; @@ -2455,80 +2428,74 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len) len = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr); if (len > MAX_IE_SZ) { - DBG_871X("%s IE too long for survey event\n", __func__); + RTW_INFO("%s IE too long for survey event\n", __func__); return _FAIL; } if (_rtw_memcmp(cur_network->network.MacAddress, pbssid, 6) == _FALSE) { - DBG_871X("Oops: rtw_check_network_encrypt linked but recv other bssid bcn\n" MAC_FMT MAC_FMT, - MAC_ARG(pbssid), MAC_ARG(cur_network->network.MacAddress)); + RTW_INFO("Oops: rtw_check_network_encrypt linked but recv other bssid bcn\n" MAC_FMT MAC_FMT, + MAC_ARG(pbssid), MAC_ARG(cur_network->network.MacAddress)); return _TRUE; } if (rtw_get_bcn_keys(Adapter, pframe, packet_len, &recv_beacon) == _FALSE) - return _TRUE; // parsing failed => broken IE + return _TRUE; /* parsing failed => broken IE */ - // don't care hidden ssid, use current beacon ssid directly + /* don't care hidden ssid, use current beacon ssid directly */ if (recv_beacon.ssid_len == 0) { - _rtw_memcpy(recv_beacon.ssid, pmlmepriv->cur_beacon_keys.ssid, - pmlmepriv->cur_beacon_keys.ssid_len); - recv_beacon.ssid_len = pmlmepriv->cur_beacon_keys.ssid_len; + _rtw_memcpy(recv_beacon.ssid, pmlmepriv->cur_beacon_keys.ssid, + pmlmepriv->cur_beacon_keys.ssid_len); + recv_beacon.ssid_len = pmlmepriv->cur_beacon_keys.ssid_len; } if (_rtw_memcmp(&recv_beacon, &pmlmepriv->cur_beacon_keys, sizeof(recv_beacon)) == _TRUE) - { pmlmepriv->new_beacon_cnts = 0; - } else if ((pmlmepriv->new_beacon_cnts == 0) || - _rtw_memcmp(&recv_beacon, &pmlmepriv->new_beacon_keys, sizeof(recv_beacon)) == _FALSE) - { - DBG_871X_LEVEL(_drv_err_, "%s: start new beacon (seq=%d)\n", __func__, GetSequence(pframe)); + _rtw_memcmp(&recv_beacon, &pmlmepriv->new_beacon_keys, sizeof(recv_beacon)) == _FALSE) { + RTW_ERR("%s: start new beacon (seq=%d)\n", __func__, GetSequence(pframe)); if (pmlmepriv->new_beacon_cnts == 0) { - DBG_871X_LEVEL(_drv_err_, "%s: cur beacon key\n", __func__); - DBG_871X_EXP(_drv_err_, rtw_dump_bcn_keys(&pmlmepriv->cur_beacon_keys)); + RTW_ERR("%s: cur beacon key\n", __func__); + RTW_DBG_EXPR(rtw_dump_bcn_keys(&pmlmepriv->cur_beacon_keys)); } - DBG_871X_LEVEL(_drv_err_, "%s: new beacon key\n", __func__); - DBG_871X_EXP(_drv_err_, rtw_dump_bcn_keys(&recv_beacon)); + RTW_ERR("%s: new beacon key\n", __func__); + RTW_DBG_EXPR(rtw_dump_bcn_keys(&recv_beacon)); memcpy(&pmlmepriv->new_beacon_keys, &recv_beacon, sizeof(recv_beacon)); pmlmepriv->new_beacon_cnts = 1; - } - else - { - DBG_871X_LEVEL(_drv_err_, "%s: new beacon again (seq=%d)\n", __func__, GetSequence(pframe)); + } else { + RTW_ERR("%s: new beacon again (seq=%d)\n", __func__, GetSequence(pframe)); pmlmepriv->new_beacon_cnts++; } - // if counter >= max, it means beacon is changed really - if (pmlmepriv->new_beacon_cnts >= new_bcn_max) - { - DBG_871X_LEVEL(_drv_err_, "%s: new beacon occur!!\n", __func__); + /* if counter >= max, it means beacon is changed really */ + if (pmlmepriv->new_beacon_cnts >= new_bcn_max) { + RTW_ERR("%s: new beacon occur!!\n", __func__); - // check bw mode change only? + /* check bw mode change only? */ pmlmepriv->cur_beacon_keys.ht_cap_info = recv_beacon.ht_cap_info; pmlmepriv->cur_beacon_keys.ht_info_infos_0_sco = recv_beacon.ht_info_infos_0_sco; if (_rtw_memcmp(&recv_beacon, &pmlmepriv->cur_beacon_keys, - sizeof(recv_beacon)) == _FALSE) { - // beacon is changed, have to do disconnect/connect + sizeof(recv_beacon)) == _FALSE) { + /* beacon is changed, have to do disconnect/connect */ return _FAIL; } - DBG_871X("%s bw mode change\n", __func__); - DBG_871X("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, - cur_network->BcnInfo.ht_cap_info, - cur_network->BcnInfo.ht_info_infos_0); + RTW_INFO("%s bw mode change\n", __func__); + RTW_INFO("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, + cur_network->BcnInfo.ht_cap_info, + cur_network->BcnInfo.ht_info_infos_0); cur_network->BcnInfo.ht_cap_info = recv_beacon.ht_cap_info; cur_network->BcnInfo.ht_info_infos_0 = (cur_network->BcnInfo.ht_info_infos_0 & (~0x03)) | recv_beacon.ht_info_infos_0_sco; - DBG_871X("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, - cur_network->BcnInfo.ht_cap_info, - cur_network->BcnInfo.ht_info_infos_0); + RTW_INFO("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, + cur_network->BcnInfo.ht_cap_info, + cur_network->BcnInfo.ht_info_infos_0); memcpy(&pmlmepriv->cur_beacon_keys, &recv_beacon, sizeof(recv_beacon)); pmlmepriv->new_beacon_cnts = 0; @@ -2539,19 +2506,18 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len) #if 0 bssid = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX)); if (bssid == NULL) { - DBG_871X("%s rtw_zmalloc fail !!!\n", __func__); + RTW_INFO("%s rtw_zmalloc fail !!!\n", __func__); return _TRUE; } - if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) > DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS)) - { + if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) > DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS)) { pmlmepriv->timeBcnInfoChkStart = 0; pmlmepriv->NumOfBcnInfoChkFail = 0; } subtype = GetFrameSubType(pframe) >> 4; - if(subtype==WIFI_BEACON) + if (subtype == WIFI_BEACON) bssid->Reserved[0] = 1; bssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len; @@ -2563,64 +2529,62 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len) /* check bw and channel offset */ /* parsing HT_CAP_IE */ p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - if(p && len>0) { - pht_cap = (struct rtw_ieee80211_ht_cap *)(p + 2); - ht_cap_info = pht_cap->cap_info; - } else { - ht_cap_info = 0; - } + if (p && len > 0) { + pht_cap = (struct rtw_ieee80211_ht_cap *)(p + 2); + ht_cap_info = pht_cap->cap_info; + } else + ht_cap_info = 0; /* parsing HT_INFO_IE */ p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - if(p && len>0) { - pht_info = (struct HT_info_element *)(p + 2); - ht_info_infos_0 = pht_info->infos[0]; - } else { - ht_info_infos_0 = 0; - } + if (p && len > 0) { + pht_info = (struct HT_info_element *)(p + 2); + ht_info_infos_0 = pht_info->infos[0]; + } else + ht_info_infos_0 = 0; if (ht_cap_info != cur_network->BcnInfo.ht_cap_info || - ((ht_info_infos_0&0x03) != (cur_network->BcnInfo.ht_info_infos_0&0x03))) { - DBG_871X("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, - ht_cap_info, ht_info_infos_0); - DBG_871X("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, - cur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0); - DBG_871X("%s bw mode change\n", __func__); - { - //bcn_info_update - cur_network->BcnInfo.ht_cap_info = ht_cap_info; - cur_network->BcnInfo.ht_info_infos_0 = ht_info_infos_0; - //to do : need to check that whether modify related register of BB or not - } - //goto _mismatch; + ((ht_info_infos_0 & 0x03) != (cur_network->BcnInfo.ht_info_infos_0 & 0x03))) { + RTW_INFO("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, + ht_cap_info, ht_info_infos_0); + RTW_INFO("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, + cur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0); + RTW_INFO("%s bw mode change\n", __func__); + { + /* bcn_info_update */ + cur_network->BcnInfo.ht_cap_info = ht_cap_info; + cur_network->BcnInfo.ht_info_infos_0 = ht_info_infos_0; + /* to do : need to check that whether modify related register of BB or not */ + } + /* goto _mismatch; */ } /* Checking for channel */ p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _DSSET_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - if (p) { - bcn_channel = *(p + 2); - } else {/* In 5G, some ap do not have DSSET IE checking HT info for channel */ - rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - if(pht_info) { - bcn_channel = pht_info->primary_channel; - } else { /* we don't find channel IE, so don't check it */ - //DBG_871X("Oops: %s we don't find channel IE, so don't check it \n", __func__); - bcn_channel = Adapter->mlmeextpriv.cur_channel; - } + if (p) + bcn_channel = *(p + 2); + else {/* In 5G, some ap do not have DSSET IE checking HT info for channel */ + rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if (pht_info) + bcn_channel = pht_info->primary_channel; + else { /* we don't find channel IE, so don't check it */ + /* RTW_INFO("Oops: %s we don't find channel IE, so don't check it\n", __func__); */ + bcn_channel = Adapter->mlmeextpriv.cur_channel; + } } if (bcn_channel != Adapter->mlmeextpriv.cur_channel) { - DBG_871X("%s beacon channel:%d cur channel:%d disconnect\n", __func__, - bcn_channel, Adapter->mlmeextpriv.cur_channel); - goto _mismatch; + RTW_INFO("%s beacon channel:%d cur channel:%d disconnect\n", __func__, + bcn_channel, Adapter->mlmeextpriv.cur_channel); + goto _mismatch; } /* checking SSID */ - if ((p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SSID_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_)) == NULL) { - DBG_871X("%s marc: cannot find SSID for survey event\n", __func__); + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SSID_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if (p == NULL) { + RTW_INFO("%s marc: cannot find SSID for survey event\n", __func__); hidden_ssid = _TRUE; - } else { + } else hidden_ssid = _FALSE; - } - if((NULL != p) && (_FALSE == hidden_ssid && (*(p + 1)))) { + if ((NULL != p) && (_FALSE == hidden_ssid && (*(p + 1)))) { _rtw_memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1)); bssid->Ssid.SsidLength = *(p + 1); } else { @@ -2628,15 +2592,11 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len) bssid->Ssid.Ssid[0] = '\0'; } - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("%s bssid.Ssid.Ssid:%s bssid.Ssid.SsidLength:%d " - "cur_network->network.Ssid.Ssid:%s len:%d\n", __func__, bssid->Ssid.Ssid, - bssid->Ssid.SsidLength, cur_network->network.Ssid.Ssid, - cur_network->network.Ssid.SsidLength)); if (_rtw_memcmp(bssid->Ssid.Ssid, cur_network->network.Ssid.Ssid, 32) == _FALSE || - bssid->Ssid.SsidLength != cur_network->network.Ssid.SsidLength) { + bssid->Ssid.SsidLength != cur_network->network.Ssid.SsidLength) { if (bssid->Ssid.Ssid[0] != '\0' && bssid->Ssid.SsidLength != 0) { /* not hidden ssid */ - DBG_871X("%s(), SSID is not match\n", __func__); + RTW_INFO("%s(), SSID is not match\n", __func__); goto _mismatch; } } @@ -2649,61 +2609,48 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len) else bssid->Privacy = 0; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_, - ("%s(): cur_network->network.Privacy is %d, bssid.Privacy is %d\n", - __func__, cur_network->network.Privacy,bssid->Privacy)); if (cur_network->network.Privacy != bssid->Privacy) { - DBG_871X("%s(), privacy is not match\n",__func__); + RTW_INFO("%s(), privacy is not match\n", __func__); goto _mismatch; } - rtw_get_sec_ie(bssid->IEs, bssid->IELength, NULL,&rsn_len,NULL,&wpa_len); + rtw_get_sec_ie(bssid->IEs, bssid->IELength, NULL, &rsn_len, NULL, &wpa_len); - if (rsn_len > 0) { + if (rsn_len > 0) encryp_protocol = ENCRYP_PROTOCOL_WPA2; - } else if (wpa_len > 0) { + else if (wpa_len > 0) encryp_protocol = ENCRYP_PROTOCOL_WPA; - } else { + else { if (bssid->Privacy) encryp_protocol = ENCRYP_PROTOCOL_WEP; } if (cur_network->BcnInfo.encryp_protocol != encryp_protocol) { - DBG_871X("%s(): enctyp is not match\n",__func__); + RTW_INFO("%s(): enctyp is not match\n", __func__); goto _mismatch; } if (encryp_protocol == ENCRYP_PROTOCOL_WPA || encryp_protocol == ENCRYP_PROTOCOL_WPA2) { - pbuf = rtw_get_wpa_ie(&bssid->IEs[12], &wpa_ielen, bssid->IELength-12); - if(pbuf && (wpa_ielen>0)) { - if (_SUCCESS == rtw_parse_wpa_ie(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is_8021x)) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_, - ("%s pnetwork->pairwise_cipher: %d, group_cipher is %d, is_8021x is %d\n", __func__, - pairwise_cipher, group_cipher, is_8021x)); - } + pbuf = rtw_get_wpa_ie(&bssid->IEs[12], &wpa_ielen, bssid->IELength - 12); + if (pbuf && (wpa_ielen > 0)) { + rtw_parse_wpa_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is_8021x); } else { - pbuf = rtw_get_wpa2_ie(&bssid->IEs[12], &wpa_ielen, bssid->IELength-12); + pbuf = rtw_get_wpa2_ie(&bssid->IEs[12], &wpa_ielen, bssid->IELength - 12); - if(pbuf && (wpa_ielen>0)) { - if (_SUCCESS == rtw_parse_wpa2_ie(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is_8021x)) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_, - ("%s pnetwork->pairwise_cipher: %d, pnetwork->group_cipher is %d, is_802x is %d\n", - __func__, pairwise_cipher, group_cipher, is_8021x)); - } + if (pbuf && (wpa_ielen > 0)) { + rtw_parse_wpa2_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is_8021x); } } - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_, - ("%s cur_network->group_cipher is %d: %d\n",__func__, cur_network->BcnInfo.group_cipher, group_cipher)); if (pairwise_cipher != cur_network->BcnInfo.pairwise_cipher || group_cipher != cur_network->BcnInfo.group_cipher) { - DBG_871X("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match\n",__func__, - pairwise_cipher, cur_network->BcnInfo.pairwise_cipher, - group_cipher, cur_network->BcnInfo.group_cipher); + RTW_INFO("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match\n", __func__, + pairwise_cipher, cur_network->BcnInfo.pairwise_cipher, + group_cipher, cur_network->BcnInfo.group_cipher); goto _mismatch; } if (is_8021x != cur_network->BcnInfo.is_8021x) { - DBG_871X("%s authentication is not match\n", __func__); + RTW_INFO("%s authentication is not match\n", __func__); goto _mismatch; } } @@ -2715,17 +2662,14 @@ _mismatch: rtw_mfree((u8 *)bssid, sizeof(WLAN_BSSID_EX)); if (pmlmepriv->NumOfBcnInfoChkFail == 0) - { pmlmepriv->timeBcnInfoChkStart = rtw_get_current_time(); - } pmlmepriv->NumOfBcnInfoChkFail++; - DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d (SeqNum of this Beacon frame = %d).\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, GetSequence(pframe)); + RTW_INFO("%s by "ADPT_FMT" - NumOfChkFail = %d (SeqNum of this Beacon frame = %d).\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, GetSequence(pframe)); - if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) <= DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS) - && (pmlmepriv->NumOfBcnInfoChkFail >= DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD)) - { - DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d >= threshold : %d (in %d ms), return FAIL.\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, + if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) <= DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS) + && (pmlmepriv->NumOfBcnInfoChkFail >= DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD)) { + RTW_INFO("%s by "ADPT_FMT" - NumOfChkFail = %d >= threshold : %d (in %d ms), return FAIL.\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD, rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart)); pmlmepriv->timeBcnInfoChkStart = 0; pmlmepriv->NumOfBcnInfoChkFail = 0; @@ -2741,55 +2685,51 @@ void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta unsigned int i; unsigned int len; PNDIS_802_11_VARIABLE_IEs pIE; - + #ifdef CONFIG_TDLS struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - u8 tdls_prohibited[] = { 0x00, 0x00, 0x00, 0x00, 0x10 }; //bit(38): TDLS_prohibited -#endif //CONFIG_TDLS - + u8 tdls_prohibited[] = { 0x00, 0x00, 0x00, 0x00, 0x10 }; /* bit(38): TDLS_prohibited */ +#endif /* CONFIG_TDLS */ + len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN); - for (i = 0; i < len;) - { + for (i = 0; i < len;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i); - - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - //to update WMM paramter set while receiving beacon - if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6) && pIE->Length == WLAN_WMM_LEN) //WMM - { - (WMM_param_handler(padapter, pIE))? report_wmm_edca_update(padapter): 0; - } - break; + switch (pIE->ElementID) { + case _VENDOR_SPECIFIC_IE_: + /* to update WMM paramter set while receiving beacon */ + if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6) && pIE->Length == WLAN_WMM_LEN) /* WMM */ + (WMM_param_handler(padapter, pIE)) ? report_wmm_edca_update(padapter) : 0; - case _HT_EXTRA_INFO_IE_: //HT info - //HT_info_handler(padapter, pIE); - bwmode_update_check(padapter, pIE); - break; + break; + + case _HT_EXTRA_INFO_IE_: /* HT info */ + /* HT_info_handler(padapter, pIE); */ + bwmode_update_check(padapter, pIE); + break; #ifdef CONFIG_80211AC_VHT - case EID_OpModeNotification: - rtw_process_vht_op_mode_notify(padapter, pIE->data, psta); - break; -#endif //CONFIG_80211AC_VHT - case _ERPINFO_IE_: - ERP_IE_handler(padapter, pIE); - VCS_update(padapter, psta); - break; + case EID_OpModeNotification: + rtw_process_vht_op_mode_notify(padapter, pIE->data, psta); + break; +#endif /* CONFIG_80211AC_VHT */ + case _ERPINFO_IE_: + ERP_IE_handler(padapter, pIE); + VCS_update(padapter, psta); + break; #ifdef CONFIG_TDLS - 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: - break; + 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: + break; } - + i += (pIE->Length + 2); } } @@ -2800,32 +2740,30 @@ void process_csa_ie(_adapter *padapter, u8 *pframe, uint pkt_len) unsigned int i; unsigned int len; PNDIS_802_11_VARIABLE_IEs pIE; - u8 new_ch_no = 0; + u8 new_ch_no = 0; - if(padapter->mlmepriv.handle_dfs == _TRUE ) + if (padapter->mlmepriv.handle_dfs == _TRUE) return; - + len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN); - for (i = 0; i < len;) - { + for (i = 0; i < len;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i); - - switch (pIE->ElementID) - { - case _CH_SWTICH_ANNOUNCE_: - padapter->mlmepriv.handle_dfs = _TRUE; - _rtw_memcpy(&new_ch_no, pIE->data+1, 1); - rtw_set_csa_cmd(padapter, new_ch_no); - break; - default: - break; + + switch (pIE->ElementID) { + case _CH_SWTICH_ANNOUNCE_: + padapter->mlmepriv.handle_dfs = _TRUE; + _rtw_memcpy(&new_ch_no, pIE->data + 1, 1); + rtw_set_csa_cmd(padapter, new_ch_no); + break; + default: + break; } - + i += (pIE->Length + 2); } } -#endif //CONFIG_DFS +#endif /* CONFIG_DFS */ unsigned int is_ap_in_tkip(_adapter *padapter) { @@ -2833,85 +2771,69 @@ unsigned int is_ap_in_tkip(_adapter *padapter) PNDIS_802_11_VARIABLE_IEs pIE; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY) - { - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) - { + if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY) { + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i); - - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) && (_rtw_memcmp((pIE->data + 12), WPA_TKIP_CIPHER, 4))) - { - return _TRUE; - } - break; - - case _RSN_IE_2_: - if (_rtw_memcmp((pIE->data + 8), RSN_TKIP_CIPHER, 4)) - { - return _TRUE; - } - - default: - break; + + switch (pIE->ElementID) { + case _VENDOR_SPECIFIC_IE_: + if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) && (_rtw_memcmp((pIE->data + 12), WPA_TKIP_CIPHER, 4))) + return _TRUE; + break; + + case _RSN_IE_2_: + if (_rtw_memcmp((pIE->data + 8), RSN_TKIP_CIPHER, 4)) + return _TRUE; + + default: + break; } - + i += (pIE->Length + 2); } - + return _FALSE; - } - else - { + } else return _FALSE; - } - + } -unsigned int should_forbid_n_rate(_adapter * padapter) +unsigned int should_forbid_n_rate(_adapter *padapter) { u32 i; PNDIS_802_11_VARIABLE_IEs pIE; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; WLAN_BSSID_EX *cur_network = &pmlmepriv->cur_network.network; - if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY) - { - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < cur_network->IELength;) - { + if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY) { + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < cur_network->IELength;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(cur_network->IEs + i); - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if (_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4) && - ((_rtw_memcmp((pIE->data + 12), WPA_CIPHER_SUITE_CCMP, 4)) || - (_rtw_memcmp((pIE->data + 16), WPA_CIPHER_SUITE_CCMP, 4)))) - return _FALSE; - break; + switch (pIE->ElementID) { + case _VENDOR_SPECIFIC_IE_: + if (_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4) && + ((_rtw_memcmp((pIE->data + 12), WPA_CIPHER_SUITE_CCMP, 4)) || + (_rtw_memcmp((pIE->data + 16), WPA_CIPHER_SUITE_CCMP, 4)))) + return _FALSE; + break; - 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; + 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; - default: - break; + default: + break; } i += (pIE->Length + 2); } return _TRUE; - } - else - { + } else return _FALSE; - } } @@ -2922,37 +2844,31 @@ unsigned int is_ap_in_wep(_adapter *padapter) PNDIS_802_11_VARIABLE_IEs pIE; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY) - { - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) - { + if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY) { + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i); - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if (_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) - return _FALSE; - break; - - case _RSN_IE_2_: + switch (pIE->ElementID) { + case _VENDOR_SPECIFIC_IE_: + if (_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) return _FALSE; + break; - default: - break; + case _RSN_IE_2_: + return _FALSE; + + default: + break; } i += (pIE->Length + 2); } return _TRUE; - } - else - { + } else return _FALSE; - } } @@ -2962,72 +2878,68 @@ int wifirate2_ratetbl_inx(unsigned char rate) int inx = 0; rate = rate & 0x7f; - switch (rate) - { - case 54*2: - inx = 11; - break; + switch (rate) { + case 54*2: + inx = 11; + break; - case 48*2: - inx = 10; - break; + case 48*2: + inx = 10; + break; - case 36*2: - inx = 9; - break; + case 36*2: + inx = 9; + break; - case 24*2: - inx = 8; - break; - - case 18*2: - inx = 7; - break; + case 24*2: + inx = 8; + break; - case 12*2: - inx = 6; - break; + case 18*2: + inx = 7; + break; - case 9*2: - inx = 5; - break; - - case 6*2: - inx = 4; - break; + case 12*2: + inx = 6; + break; - case 11*2: - inx = 3; - break; - case 11: - inx = 2; - break; + case 9*2: + inx = 5; + break; - case 2*2: - inx = 1; - break; - - case 1*2: - inx = 0; - break; + case 6*2: + inx = 4; + break; + + case 11*2: + inx = 3; + break; + case 11: + inx = 2; + break; + + case 2*2: + inx = 1; + break; + + case 1*2: + inx = 0; + break; } - return inx; + return inx; } unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz) { unsigned int i, num_of_rate; unsigned int mask = 0; - - num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz; - - for (i = 0; i < num_of_rate; i++) - { + + num_of_rate = (ptn_sz > NumRates) ? NumRates : ptn_sz; + + for (i = 0; i < num_of_rate; i++) { if ((*(ptn + i)) & 0x80) - { mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); - } } return mask; } @@ -3036,13 +2948,11 @@ unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz) { unsigned int i, num_of_rate; unsigned int mask = 0; - - num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz; - + + num_of_rate = (ptn_sz > NumRates) ? NumRates : ptn_sz; + for (i = 0; i < num_of_rate; i++) - { mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); - } return mask; } @@ -3050,9 +2960,9 @@ unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz) unsigned int update_MCS_rate(struct HT_caps_element *pHT_caps) { unsigned int mask = 0; - + mask = ((pHT_caps->u.HT_cap_element.MCS_rate[0] << 12) | (pHT_caps->u.HT_cap_element.MCS_rate[1] << 20)); - + return mask; } @@ -3061,31 +2971,25 @@ int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps, u8 bw unsigned char bit_offset; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if (!(pmlmeinfo->HT_enable)) - return _FAIL; - bit_offset = (bwmode & CHANNEL_WIDTH_40)? 6: 5; - - if (pHT_caps->u.HT_cap_element.HT_caps_info & (0x1 << bit_offset)) - { - return _SUCCESS; - } - else - { + if (!(pmlmeinfo->HT_enable)) + return _FAIL; + + bit_offset = (bwmode & CHANNEL_WIDTH_40) ? 6 : 5; + + if (pHT_caps->u.HT_cap_element.HT_caps_info & (0x1 << bit_offset)) + return _SUCCESS; + else return _FAIL; - } } unsigned char get_highest_rate_idx(u32 mask) { int i; - unsigned char rate_idx=0; + unsigned char rate_idx = 0; - for(i=31; i>=0; i--) - { - if(mask & BIT(i)) - { + for (i = 31; i >= 0; i--) { + if (mask & BIT(i)) { rate_idx = i; break; } @@ -3098,69 +3002,59 @@ unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps); unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps) { int i, mcs_rate; - + mcs_rate = (pHT_caps->u.HT_cap_element.MCS_rate[0] | (pHT_caps->u.HT_cap_element.MCS_rate[1] << 8)); - - for (i = 15; i >= 0; i--) - { + + for (i = 15; i >= 0; i--) { if (mcs_rate & (0x1 << i)) - { break; - } } - + return i; } void Update_RA_Entry(_adapter *padapter, struct sta_info *psta) { - rtw_hal_update_ra_mask(psta, 0); -} - -void enable_rate_adaptive(_adapter *padapter, struct sta_info *psta); -void enable_rate_adaptive(_adapter *padapter, struct sta_info *psta) -{ - Update_RA_Entry(padapter, psta); + rtw_hal_update_ra_mask(psta, psta->rssi_level); } void set_sta_rate(_adapter *padapter, struct sta_info *psta) { - //rate adaptive - enable_rate_adaptive(padapter, psta); + /* rate adaptive */ + rtw_hal_update_ra_mask(psta, psta->rssi_level); } -// Update RRSR and Rate for USERATE +/* Update RRSR and Rate for USERATE */ void update_tx_basic_rate(_adapter *padapter, u8 wirelessmode) { NDIS_802_11_RATES_EX supported_rates; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; #ifdef CONFIG_P2P - struct wifidirect_info* pwdinfo = &padapter->wdinfo; + struct wifidirect_info *pwdinfo = &padapter->wdinfo; - // Added by Albert 2011/03/22 - // In the P2P mode, the driver should not support the b mode. - // So, the Tx packet shouldn't use the CCK rate - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + /* Added by Albert 2011/03/22 */ + /* In the P2P mode, the driver should not support the b mode. */ + /* So, the Tx packet shouldn't use the CCK rate */ + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) return; -#endif //CONFIG_P2P +#endif /* CONFIG_P2P */ #ifdef CONFIG_INTEL_WIDI if (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_NONE) return; -#endif //CONFIG_INTEL_WIDI +#endif /* CONFIG_INTEL_WIDI */ _rtw_memset(supported_rates, 0, NDIS_802_11_LENGTH_RATES_EX); - //clear B mod if current channel is in 5G band, avoid tx cck rate in 5G band. - if(pmlmeext->cur_channel > 14) + /* clear B mod if current channel is in 5G band, avoid tx cck rate in 5G band. */ + if (pmlmeext->cur_channel > 14) wirelessmode &= ~(WIRELESS_11B); - if ((wirelessmode & WIRELESS_11B) && (wirelessmode == WIRELESS_11B)) { + if ((wirelessmode & WIRELESS_11B) && (wirelessmode == WIRELESS_11B)) _rtw_memcpy(supported_rates, rtw_basic_rate_cck, 4); - } else if (wirelessmode & WIRELESS_11B) { + else if (wirelessmode & WIRELESS_11B) _rtw_memcpy(supported_rates, rtw_basic_rate_mix, 7); - } else { + else _rtw_memcpy(supported_rates, rtw_basic_rate_ofdm, 3); - } if (wirelessmode & WIRELESS_11B) update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB); @@ -3175,94 +3069,73 @@ unsigned char check_assoc_AP(u8 *pframe, uint len) unsigned int i; PNDIS_802_11_VARIABLE_IEs pIE; - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < len;) - { + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < len;) { pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i); - - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if ((_rtw_memcmp(pIE->data, ARTHEROS_OUI1, 3)) || (_rtw_memcmp(pIE->data, ARTHEROS_OUI2, 3))) - { - 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_OUI3, 3))) - { - DBG_871X("link to Broadcom AP\n"); - return HT_IOT_PEER_BROADCOM; - } - else if (_rtw_memcmp(pIE->data, MARVELL_OUI, 3)) - { - DBG_871X("link to Marvell AP\n"); - return HT_IOT_PEER_MARVELL; - } - else if (_rtw_memcmp(pIE->data, RALINK_OUI, 3)) - { - DBG_871X("link to Ralink AP\n"); - return HT_IOT_PEER_RALINK; - } - else if (_rtw_memcmp(pIE->data, CISCO_OUI, 3)) - { - DBG_871X("link to Cisco AP\n"); - return HT_IOT_PEER_CISCO; - } - else if (_rtw_memcmp(pIE->data, REALTEK_OUI, 3)) - { - u32 Vender = HT_IOT_PEER_REALTEK; - if(pIE->Length >= 5) { - if(pIE->data[4]==1) - { - //if(pIE->data[5] & RT_HT_CAP_USE_LONG_PREAMBLE) - // bssDesc->BssHT.RT2RT_HT_Mode |= RT_HT_CAP_USE_LONG_PREAMBLE; + switch (pIE->ElementID) { + case _VENDOR_SPECIFIC_IE_: + if ((_rtw_memcmp(pIE->data, ARTHEROS_OUI1, 3)) || (_rtw_memcmp(pIE->data, ARTHEROS_OUI2, 3))) { + RTW_INFO("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_OUI3, 3))) { + RTW_INFO("link to Broadcom AP\n"); + return HT_IOT_PEER_BROADCOM; + } else if (_rtw_memcmp(pIE->data, MARVELL_OUI, 3)) { + RTW_INFO("link to Marvell AP\n"); + return HT_IOT_PEER_MARVELL; + } else if (_rtw_memcmp(pIE->data, RALINK_OUI, 3)) { + RTW_INFO("link to Ralink AP\n"); + return HT_IOT_PEER_RALINK; + } else if (_rtw_memcmp(pIE->data, CISCO_OUI, 3)) { + RTW_INFO("link to Cisco AP\n"); + return HT_IOT_PEER_CISCO; + } else if (_rtw_memcmp(pIE->data, REALTEK_OUI, 3)) { + u32 Vender = HT_IOT_PEER_REALTEK; - if(pIE->data[5] & RT_HT_CAP_USE_92SE) - { - //bssDesc->BssHT.RT2RT_HT_Mode |= RT_HT_CAP_USE_92SE; - Vender = HT_IOT_PEER_REALTEK_92SE; - } - } + if (pIE->Length >= 5) { + if (pIE->data[4] == 1) { + /* if(pIE->data[5] & RT_HT_CAP_USE_LONG_PREAMBLE) */ + /* bssDesc->BssHT.RT2RT_HT_Mode |= RT_HT_CAP_USE_LONG_PREAMBLE; */ - if(pIE->data[5] & RT_HT_CAP_USE_SOFTAP) - Vender = HT_IOT_PEER_REALTEK_SOFTAP; - - if(pIE->data[4] == 2) - { - if(pIE->data[6] & RT_HT_CAP_USE_JAGUAR_BCUT) { - Vender = HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP; - DBG_871X("link to Realtek JAGUAR_BCUTAP\n"); - } - if(pIE->data[6] & RT_HT_CAP_USE_JAGUAR_CCUT) { - Vender = HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP; - DBG_871X("link to Realtek JAGUAR_CCUTAP\n"); - } + if (pIE->data[5] & RT_HT_CAP_USE_92SE) { + /* bssDesc->BssHT.RT2RT_HT_Mode |= RT_HT_CAP_USE_92SE; */ + Vender = HT_IOT_PEER_REALTEK_92SE; + } + } + + if (pIE->data[5] & RT_HT_CAP_USE_SOFTAP) + Vender = HT_IOT_PEER_REALTEK_SOFTAP; + + if (pIE->data[4] == 2) { + if (pIE->data[6] & RT_HT_CAP_USE_JAGUAR_BCUT) { + Vender = HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP; + RTW_INFO("link to Realtek JAGUAR_BCUTAP\n"); + } + if (pIE->data[6] & RT_HT_CAP_USE_JAGUAR_CCUT) { + Vender = HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP; + RTW_INFO("link to Realtek JAGUAR_CCUTAP\n"); } } - - DBG_871X("link to Realtek AP\n"); - return Vender; } - else if (_rtw_memcmp(pIE->data, AIRGOCAP_OUI,3)) - { - DBG_871X("link to Airgo Cap\n"); - return HT_IOT_PEER_AIRGO; - } - else - { - break; - } - - default: + + RTW_INFO("link to Realtek AP\n"); + return Vender; + } else if (_rtw_memcmp(pIE->data, AIRGOCAP_OUI, 3)) { + RTW_INFO("link to Airgo Cap\n"); + return HT_IOT_PEER_AIRGO; + } else break; + + default: + break; } - + i += (pIE->Length + 2); } - - DBG_871X("link to new AP\n"); + + RTW_INFO("link to new AP\n"); return HT_IOT_PEER_UNKNOWN; } @@ -3272,61 +3145,50 @@ void update_capinfo(PADAPTER Adapter, u16 updateCap) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); BOOLEAN ShortPreamble; - // Check preamble mode, 2005.01.06, by rcnjko. - // Mark to update preamble value forever, 2008.03.18 by lanhsin - //if( pMgntInfo->RegPreambleMode == PREAMBLE_AUTO ) + /* Check preamble mode, 2005.01.06, by rcnjko. */ + /* Mark to update preamble value forever, 2008.03.18 by lanhsin */ + /* if( pMgntInfo->RegPreambleMode == PREAMBLE_AUTO ) */ { - - if(updateCap & cShortPreamble) - { // Short Preamble - if(pmlmeinfo->preamble_mode != PREAMBLE_SHORT) // PREAMBLE_LONG or PREAMBLE_AUTO - { + + if (updateCap & cShortPreamble) { + /* Short Preamble */ + if (pmlmeinfo->preamble_mode != PREAMBLE_SHORT) { /* PREAMBLE_LONG or PREAMBLE_AUTO */ ShortPreamble = _TRUE; pmlmeinfo->preamble_mode = PREAMBLE_SHORT; - rtw_hal_set_hwreg( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble ); + rtw_hal_set_hwreg(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble); } - } - else - { // Long Preamble - if(pmlmeinfo->preamble_mode != PREAMBLE_LONG) // PREAMBLE_SHORT or PREAMBLE_AUTO - { + } else { + /* Long Preamble */ + if (pmlmeinfo->preamble_mode != PREAMBLE_LONG) { /* PREAMBLE_SHORT or PREAMBLE_AUTO */ ShortPreamble = _FALSE; pmlmeinfo->preamble_mode = PREAMBLE_LONG; - rtw_hal_set_hwreg( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble ); + rtw_hal_set_hwreg(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble); } } } - if ( updateCap & cIBSS ) { - //Filen: See 802.11-2007 p.91 + if (updateCap & cIBSS) { + /* Filen: See 802.11-2007 p.91 */ pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; - } - else - { - //Filen: See 802.11-2007 p.90 - if( pmlmeext->cur_wireless_mode & (WIRELESS_11_24N | WIRELESS_11A | WIRELESS_11_5N | WIRELESS_11AC)) - { + } else { + /* Filen: See 802.11-2007 p.90 */ + if (pmlmeext->cur_wireless_mode & (WIRELESS_11_24N | WIRELESS_11A | WIRELESS_11_5N | WIRELESS_11AC)) pmlmeinfo->slotTime = SHORT_SLOT_TIME; - } - else if( pmlmeext->cur_wireless_mode & (WIRELESS_11G)) - { - if( (updateCap & cShortSlotTime) /* && (!(pMgntInfo->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)) */) - { // Short Slot Time + else if (pmlmeext->cur_wireless_mode & (WIRELESS_11G)) { + if ((updateCap & cShortSlotTime) /* && (!(pMgntInfo->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)) */) { + /* Short Slot Time */ pmlmeinfo->slotTime = SHORT_SLOT_TIME; - } - else - { // Long Slot Time + } else { + /* Long Slot Time */ pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; } - } - else - { - //B Mode + } else { + /* B Mode */ pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; } - } - - rtw_hal_set_hwreg( Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime ); + } + + rtw_hal_set_hwreg(Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime); } @@ -3342,68 +3204,60 @@ void update_wireless_mode(_adapter *padapter) u32 SIFS_Timer; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); unsigned char *rate = cur_network->SupportedRates; #ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif //CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif /* CONFIG_P2P */ ratelen = rtw_get_rateset_len(cur_network->SupportedRates); if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) - { pmlmeinfo->HT_enable = 1; - } - if(pmlmeext->cur_channel > 14) - { + if (pmlmeext->cur_channel > 14) { if (pmlmeinfo->VHT_enable) network_type = WIRELESS_11AC; else if (pmlmeinfo->HT_enable) network_type = WIRELESS_11_5N; network_type |= WIRELESS_11A; - } - else - { + } else { if (pmlmeinfo->VHT_enable) network_type = WIRELESS_11AC; else if (pmlmeinfo->HT_enable) network_type = WIRELESS_11_24N; - + if ((cckratesonly_included(rate, ratelen)) == _TRUE) - { network_type |= WIRELESS_11B; - } - else if((cckrates_included(rate, ratelen)) == _TRUE) - { + else if ((cckrates_included(rate, ratelen)) == _TRUE) network_type |= WIRELESS_11BG; - } else - { network_type |= WIRELESS_11G; - } } 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) - SIFS_Timer = 0x0a0a;//CCK + /* RTW_INFO("network_type=%02x, padapter->registrypriv.wireless_mode=%02x\n", network_type, padapter->registrypriv.wireless_mode); */ +#if 0 + if ((pmlmeext->cur_wireless_mode == WIRELESS_11G) || + (pmlmeext->cur_wireless_mode == WIRELESS_11BG)) /* WIRELESS_MODE_G) */ + SIFS_Timer = 0x0a0a;/* CCK */ else - SIFS_Timer = 0x0e0e;//pHalData->SifsTime; //OFDM -*/ - - SIFS_Timer = 0x0a0a0808; //0x0808 -> for CCK, 0x0a0a -> for OFDM - //change this value if having IOT issues. - - rtw_hal_set_hwreg( padapter, HW_VAR_RESP_SIFS, (u8 *)&SIFS_Timer); + SIFS_Timer = 0x0e0e;/* pHalData->SifsTime; //OFDM */ +#endif - rtw_hal_set_hwreg( padapter, HW_VAR_WIRELESS_MODE, (u8 *)&(pmlmeext->cur_wireless_mode)); + SIFS_Timer = 0x0a0a0808; /* 0x0808->for CCK, 0x0a0a->for OFDM + * change this value if having IOT issues. */ + + rtw_hal_set_hwreg(padapter, HW_VAR_RESP_SIFS, (u8 *)&SIFS_Timer); + + rtw_hal_set_hwreg(padapter, HW_VAR_WIRELESS_MODE, (u8 *)&(pmlmeext->cur_wireless_mode)); if ((pmlmeext->cur_wireless_mode & WIRELESS_11B) - && rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) +#ifdef CONFIG_P2P + && rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) +#endif /* CONFIG_P2P */ + ) update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB); else update_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB); @@ -3417,78 +3271,83 @@ void fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int valu struct reg_rw_parm *pwriteMacPara; struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); - if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) return; - } - if ((pwriteMacPara = (struct reg_rw_parm*)rtw_malloc(sizeof(struct reg_rw_parm))) == NULL) - { + pwriteMacPara = (struct reg_rw_parm *)rtw_malloc(sizeof(struct reg_rw_parm)); + if (pwriteMacPara == NULL) { rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); return; } - + pwriteMacPara->rw = 1; pwriteMacPara->addr = addr; pwriteMacPara->value = value; - + init_h2fwcmd_w_parm_no_rsp(ph2c, pwriteMacPara, GEN_CMD_CODE(_Write_MACREG)); rtw_enqueue_cmd(pcmdpriv, ph2c); -#endif +#endif } void update_sta_basic_rate(struct sta_info *psta, u8 wireless_mode) { - if(IsSupportedTxCCK(wireless_mode)) - { - // Only B, B/G, and B/G/N AP could use CCK rate + if (IsSupportedTxCCK(wireless_mode)) { + /* Only B, B/G, and B/G/N AP could use CCK rate */ _rtw_memcpy(psta->bssrateset, rtw_basic_rate_cck, 4); psta->bssratelen = 4; - } - else - { + } else { _rtw_memcpy(psta->bssrateset, rtw_basic_rate_ofdm, 3); psta->bssratelen = 3; } } -int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx) +int rtw_ies_get_supported_rate(u8 *ies, uint ies_len, u8 *rate_set, u8 *rate_num) { - unsigned int ie_len; - PNDIS_802_11_VARIABLE_IEs pIE; - int supportRateNum = 0; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len); - if (pIE == NULL) - { - return _FAIL; + u8 *ie; + unsigned int ie_len; + + if (!rate_set || !rate_num) + return _FALSE; + + *rate_num = 0; + + ie = rtw_get_ie(ies, _SUPPORTEDRATES_IE_, &ie_len, ies_len); + if (ie == NULL) + goto ext_rate; + + _rtw_memcpy(rate_set, ie + 2, ie_len); + *rate_num = ie_len; + +ext_rate: + ie = rtw_get_ie(ies, _EXT_SUPPORTEDRATES_IE_, &ie_len, ies_len); + if (ie) { + _rtw_memcpy(rate_set + *rate_num, ie + 2, ie_len); + *rate_num += ie_len; } - - _rtw_memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len); - supportRateNum = ie_len; - - pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len); - if (pIE) - { - _rtw_memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len); + + if (*rate_num == 0) + return _FAIL; + + if (0) { + int i; + + for (i = 0; i < *rate_num; i++) + RTW_INFO("rate:0x%02x\n", *(rate_set + i)); } return _SUCCESS; - } void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr) { struct sta_info *psta; - u16 tid, start_seq, param; - struct recv_reorder_ctrl *preorder_ctrl; - struct sta_priv *pstapriv = &padapter->stapriv; - struct ADDBA_request *preq = (struct ADDBA_request*)paddba_req; + u16 tid, start_seq, param; + struct sta_priv *pstapriv = &padapter->stapriv; + 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; + u8 size, accept = _FALSE; psta = rtw_get_stainfo(pstapriv, addr); if (!psta) @@ -3497,44 +3356,31 @@ void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr) start_seq = le16_to_cpu(preq->BA_starting_seqctrl) >> 4; param = le16_to_cpu(preq->BA_para_set); - tid = (param>>2)&0x0f; + 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); + accept = 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 */ - } + if (accept == _TRUE) + rtw_addbarsp_cmd(padapter, addr, tid, 0, size, start_seq); + else + rtw_addbarsp_cmd(padapter, addr, tid, 37, size, start_seq); /* reject ADDBA Req */ exit: return; } void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) -{ - u8* pIE; +{ + u8 *pIE; u32 *pbuf; - - pIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); - pbuf = (u32*)pIE; - pmlmeext->TSFValue = le32_to_cpu(*(pbuf+1)); - + pIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); + pbuf = (u32 *)pIE; + + pmlmeext->TSFValue = le32_to_cpu(*(pbuf + 1)); + pmlmeext->TSFValue = pmlmeext->TSFValue << 32; pmlmeext->TSFValue |= le32_to_cpu(*pbuf); @@ -3546,11 +3392,11 @@ void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext) } void adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) -{ +{ int i; - u8* pIE; + u8 *pIE; u32 *pbuf; - u64 tsf=0; + u64 tsf = 0; u32 delay_ms; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -3558,44 +3404,40 @@ void adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) pmlmeext->bcn_cnt++; pIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); - pbuf = (u32*)pIE; + pbuf = (u32 *)pIE; - tsf = le32_to_cpu(*(pbuf+1)); + tsf = le32_to_cpu(*(pbuf + 1)); tsf = tsf << 32; tsf |= le32_to_cpu(*pbuf); - //DBG_871X("%s(): tsf_upper= 0x%08x, tsf_lower=0x%08x\n", __func__, (u32)(tsf>>32), (u32)tsf); + /* RTW_INFO("%s(): tsf_upper= 0x%08x, tsf_lower=0x%08x\n", __func__, (u32)(tsf>>32), (u32)tsf); */ - //delay = (timestamp mod 1024*100)/1000 (unit: ms) - //delay_ms = do_div(tsf, (pmlmeinfo->bcn_interval*1024))/1000; - delay_ms = rtw_modular64(tsf, (pmlmeinfo->bcn_interval*1024)); - delay_ms = delay_ms/1000; + /* delay = (timestamp mod 1024*100)/1000 (unit: ms) */ + /* delay_ms = do_div(tsf, (pmlmeinfo->bcn_interval*1024))/1000; */ + delay_ms = rtw_modular64(tsf, (pmlmeinfo->bcn_interval * 1024)); + delay_ms = delay_ms / 1000; - if(delay_ms >= 8) - { + if (delay_ms >= 8) { pmlmeext->bcn_delay_cnt[8]++; - //pmlmeext->bcn_delay_ratio[8] = (pmlmeext->bcn_delay_cnt[8] * 100) /pmlmeext->bcn_cnt; - } - else - { + /* pmlmeext->bcn_delay_ratio[8] = (pmlmeext->bcn_delay_cnt[8] * 100) /pmlmeext->bcn_cnt; */ + } else { pmlmeext->bcn_delay_cnt[delay_ms]++; - //pmlmeext->bcn_delay_ratio[delay_ms] = (pmlmeext->bcn_delay_cnt[delay_ms] * 100) /pmlmeext->bcn_cnt; + /* pmlmeext->bcn_delay_ratio[delay_ms] = (pmlmeext->bcn_delay_cnt[delay_ms] * 100) /pmlmeext->bcn_cnt; */ } -/* - DBG_871X("%s(): (a)bcn_cnt = %d\n", __func__, pmlmeext->bcn_cnt); + /* + RTW_INFO("%s(): (a)bcn_cnt = %d\n", __func__, pmlmeext->bcn_cnt); - for(i=0; i<9; i++) - { - DBG_871X("%s():bcn_delay_cnt[%d]=%d, bcn_delay_ratio[%d]=%d\n", __func__, i, - pmlmeext->bcn_delay_cnt[i] , i, pmlmeext->bcn_delay_ratio[i]); - } -*/ + for(i=0; i<9; i++) + { + RTW_INFO("%s():bcn_delay_cnt[%d]=%d, bcn_delay_ratio[%d]=%d\n", __func__, i, + pmlmeext->bcn_delay_cnt[i] , i, pmlmeext->bcn_delay_ratio[i]); + } + */ - //dump for adaptive_early_32k - if(pmlmeext->bcn_cnt > 100 && (pmlmeext->adaptive_tsf_done==_TRUE)) - { + /* dump for adaptive_early_32k */ + if (pmlmeext->bcn_cnt > 100 && (pmlmeext->adaptive_tsf_done == _TRUE)) { u8 ratio_20_delay, ratio_80_delay; u8 DrvBcnEarly, DrvBcnTimeOut; @@ -3603,43 +3445,40 @@ void adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) ratio_80_delay = 0; DrvBcnEarly = 0xff; DrvBcnTimeOut = 0xff; - - DBG_871X("%s(): bcn_cnt = %d\n", __func__, pmlmeext->bcn_cnt); - for(i=0; i<9; i++) - { - pmlmeext->bcn_delay_ratio[i] = (pmlmeext->bcn_delay_cnt[i] * 100) /pmlmeext->bcn_cnt; - - - //DBG_871X("%s():bcn_delay_cnt[%d]=%d, bcn_delay_ratio[%d]=%d\n", __func__, i, - // pmlmeext->bcn_delay_cnt[i] , i, pmlmeext->bcn_delay_ratio[i]); + RTW_INFO("%s(): bcn_cnt = %d\n", __func__, pmlmeext->bcn_cnt); + + for (i = 0; i < 9; i++) { + pmlmeext->bcn_delay_ratio[i] = (pmlmeext->bcn_delay_cnt[i] * 100) / pmlmeext->bcn_cnt; + + + /* RTW_INFO("%s():bcn_delay_cnt[%d]=%d, bcn_delay_ratio[%d]=%d\n", __func__, i, */ + /* pmlmeext->bcn_delay_cnt[i] , i, pmlmeext->bcn_delay_ratio[i]); */ ratio_20_delay += pmlmeext->bcn_delay_ratio[i]; ratio_80_delay += pmlmeext->bcn_delay_ratio[i]; - - if(ratio_20_delay > 20 && DrvBcnEarly == 0xff) - { - DrvBcnEarly = i; - //DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, DrvBcnEarly); - } - if(ratio_80_delay > 80 && DrvBcnTimeOut == 0xff) - { - DrvBcnTimeOut = i; - //DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, DrvBcnTimeOut); + if (ratio_20_delay > 20 && DrvBcnEarly == 0xff) { + DrvBcnEarly = i; + /* RTW_INFO("%s(): DrvBcnEarly = %d\n", __func__, DrvBcnEarly); */ } - - //reset adaptive_early_32k cnt + + if (ratio_80_delay > 80 && DrvBcnTimeOut == 0xff) { + DrvBcnTimeOut = i; + /* RTW_INFO("%s(): DrvBcnTimeOut = %d\n", __func__, DrvBcnTimeOut); */ + } + + /* reset adaptive_early_32k cnt */ pmlmeext->bcn_delay_cnt[i] = 0; - pmlmeext->bcn_delay_ratio[i] = 0; - } + pmlmeext->bcn_delay_ratio[i] = 0; + } pmlmeext->DrvBcnEarly = DrvBcnEarly; pmlmeext->DrvBcnTimeOut = DrvBcnTimeOut; - pmlmeext->bcn_cnt = 0; - } - + pmlmeext->bcn_cnt = 0; + } + } @@ -3652,36 +3491,36 @@ void beacon_timing_control(_adapter *padapter) void dump_macid_map(void *sel, struct macid_bmp *map, u8 max_num) { - DBG_871X_SEL_NL(sel, "0x%08x\n", map->m0); + RTW_PRINT_SEL(sel, "0x%08x\n", map->m0); #if (MACID_NUM_SW_LIMIT > 32) if (max_num && max_num > 32) - DBG_871X_SEL_NL(sel, "0x%08x\n", map->m1); + RTW_PRINT_SEL(sel, "0x%08x\n", map->m1); #endif #if (MACID_NUM_SW_LIMIT > 64) if (max_num && max_num > 64) - DBG_871X_SEL_NL(sel, "0x%08x\n", map->m2); + RTW_PRINT_SEL(sel, "0x%08x\n", map->m2); #endif #if (MACID_NUM_SW_LIMIT > 96) if (max_num && max_num > 96) - DBG_871X_SEL_NL(sel, "0x%08x\n", map->m3); + RTW_PRINT_SEL(sel, "0x%08x\n", map->m3); #endif } inline bool rtw_macid_is_set(struct macid_bmp *map, u8 id) { if (id < 32) - return (map->m0 & BIT(id)); + return map->m0 & BIT(id); #if (MACID_NUM_SW_LIMIT > 32) else if (id < 64) - return (map->m1 & BIT(id-32)); + return map->m1 & BIT(id - 32); #endif #if (MACID_NUM_SW_LIMIT > 64) else if (id < 96) - return (map->m2 & BIT(id-64)); + return map->m2 & BIT(id - 64); #endif #if (MACID_NUM_SW_LIMIT > 96) else if (id < 128) - return (map->m3 & BIT(id-96)); + return map->m3 & BIT(id - 96); #endif else rtw_warn_on(1); @@ -3695,35 +3534,51 @@ inline void rtw_macid_map_set(struct macid_bmp *map, u8 id) map->m0 |= BIT(id); #if (MACID_NUM_SW_LIMIT > 32) else if (id < 64) - map->m1 |= BIT(id-32); + map->m1 |= BIT(id - 32); #endif #if (MACID_NUM_SW_LIMIT > 64) else if (id < 96) - map->m2 |= BIT(id-64); + map->m2 |= BIT(id - 64); #endif #if (MACID_NUM_SW_LIMIT > 96) else if (id < 128) - map->m3 |= BIT(id-96); + map->m3 |= BIT(id - 96); #endif else rtw_warn_on(1); } +/*Record bc's mac-id and sec-cam-id*/ +inline void rtw_iface_bcmc_id_set(_adapter *padapter, u8 mac_id) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + + macid_ctl->iface_bmc[padapter->iface_id] = mac_id; +} +inline u8 rtw_iface_bcmc_id_get(_adapter *padapter) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + + return macid_ctl->iface_bmc[padapter->iface_id]; +} + inline void rtw_macid_map_clr(struct macid_bmp *map, u8 id) { if (id < 32) map->m0 &= ~BIT(id); #if (MACID_NUM_SW_LIMIT > 32) else if (id < 64) - map->m1 &= ~BIT(id-32); + map->m1 &= ~BIT(id - 32); #endif #if (MACID_NUM_SW_LIMIT > 64) else if (id < 96) - map->m2 &= ~BIT(id-64); + map->m2 &= ~BIT(id - 64); #endif #if (MACID_NUM_SW_LIMIT > 96) else if (id < 128) - map->m3 &= ~BIT(id-96); + map->m3 &= ~BIT(id - 96); #endif else rtw_warn_on(1); @@ -3744,11 +3599,15 @@ inline s8 rtw_macid_get_if_g(struct macid_ctl_t *macid_ctl, u8 id) int i; #ifdef CONFIG_SHARED_BMC_MACID - if (rtw_macid_is_bmc(macid_ctl,id)) + if (rtw_macid_is_bmc(macid_ctl, id)) { + for (i = 0; i < CONFIG_IFACE_NUMBER; i++) + if (macid_ctl->iface_bmc[i] == id) + return i; return -1; + } #endif - for (i=0;iif_g[i], id)) return i; } @@ -3759,7 +3618,7 @@ inline s8 rtw_macid_get_ch_g(struct macid_ctl_t *macid_ctl, u8 id) { int i; - for (i=0;i<2;i++) { + for (i = 0; i < 2; i++) { if (rtw_macid_is_set(&macid_ctl->ch_g[i], id)) return i; } @@ -3770,26 +3629,36 @@ void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta) { int i; _irqL irqL; - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); struct macid_bmp *used_map = &macid_ctl->used; - //static u8 last_id = 0; /* for testing */ + /* static u8 last_id = 0; for testing */ u8 last_id = 0; + u8 is_bc_sta = _FALSE; if (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(padapter), ETH_ALEN)) { psta->mac_id = macid_ctl->num; return; } + if (_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN)) { + is_bc_sta = _TRUE; + rtw_iface_bcmc_id_set(padapter, INVALID_SEC_MAC_CAM_ID); /*init default value*/ + } + #ifdef CONFIG_SHARED_BMC_MACID - if(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN)) { - /* use shared broadcast & multicast macid 1 */ + if (is_bc_sta +#ifdef CONFIG_CONCURRENT_MODE + && (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) || check_fwstate(&padapter->mlmepriv, WIFI_NULL_STATE)) +#endif + ) { + /* use shared broadcast & multicast macid 1 for all ifaces which configure to station mode*/ _enter_critical_bh(&macid_ctl->lock, &irqL); rtw_macid_map_set(used_map, 1); rtw_macid_map_set(&macid_ctl->bmc, 1); - for (i=0;iif_g[padapter->iface_id], 1); + rtw_macid_map_set(&macid_ctl->if_g[padapter->iface_id], 1); + macid_ctl->sta[1] = psta; /* TODO ch_g? */ _exit_critical_bh(&macid_ctl->lock, &irqL); i = 1; @@ -3797,25 +3666,58 @@ void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta) } #endif +#ifdef CONFIG_MCC_MODE + if (MCC_EN(padapter)) { + if (MLME_IS_AP(padapter) || MLME_IS_GO(padapter)) + /* GO/AP assign client macid from 8 */ + last_id = 8; + } +#endif /* CONFIG_MCC_MODE */ + _enter_critical_bh(&macid_ctl->lock, &irqL); - for (i=last_id;inum;i++) { - #ifdef CONFIG_SHARED_BMC_MACID + for (i = last_id; i < macid_ctl->num; i++) { +#ifdef CONFIG_SHARED_BMC_MACID if (i == 1) continue; - #endif - if (!rtw_macid_is_used(macid_ctl, i)) - break; +#endif + +#ifdef CONFIG_MCC_MODE + /* macid 0/1 reserve for mcc for mgnt queue macid */ + if (MCC_EN(padapter)) { + if (i == MCC_ROLE_STA_GC_MGMT_QUEUE_MACID) + continue; + if (i == MCC_ROLE_SOFTAP_GO_MGMT_QUEUE_MACID) + continue; + } +#endif /* CONFIG_MCC_MODE */ + + if (is_bc_sta) {/*for SoftAP's Broadcast sta-info*/ + /*TODO:non-security AP may allociated macid = 1*/ + struct cam_ctl_t *cam_ctl = dvobj_to_sec_camctl(dvobj); + + if ((!rtw_macid_is_used(macid_ctl, i)) && (!rtw_sec_camid_is_used(cam_ctl, i))) + break; + } else { + if (!rtw_macid_is_used(macid_ctl, i)) + break; + } } if (i < macid_ctl->num) { rtw_macid_map_set(used_map, i); - if(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN)) + if (is_bc_sta) { + struct cam_ctl_t *cam_ctl = dvobj_to_sec_camctl(dvobj); + rtw_macid_map_set(&macid_ctl->bmc, i); + rtw_iface_bcmc_id_set(padapter, i); + rtw_sec_cam_map_set(&cam_ctl->used, i); + } rtw_macid_map_set(&macid_ctl->if_g[padapter->iface_id], i); + macid_ctl->sta[i] = psta; /* TODO ch_g? */ @@ -3827,18 +3729,17 @@ void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta) if (i >= macid_ctl->num) { psta->mac_id = macid_ctl->num; - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" no available macid\n" - , FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr)); + RTW_ERR(FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" no available macid\n" + , FUNC_ADPT_ARG(padapter), padapter->iface_id + 1, MAC_ARG(psta->hwaddr)); rtw_warn_on(1); goto exit; - } else { + } else goto assigned; - } assigned: psta->mac_id = i; - DBG_871X(FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" macid:%u\n" - , FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr), psta->mac_id); + RTW_INFO(FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" macid:%u\n" + , FUNC_ADPT_ARG(padapter), padapter->iface_id + 1, MAC_ARG(psta->hwaddr), psta->mac_id); exit: return; @@ -3847,21 +3748,30 @@ exit: void rtw_release_macid(_adapter *padapter, struct sta_info *psta) { _irqL irqL; - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + u8 is_bc_sta = _FALSE; if (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(padapter), ETH_ALEN)) return; + if (_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN)) + is_bc_sta = _TRUE; + #ifdef CONFIG_SHARED_BMC_MACID - if(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN)) + if (is_bc_sta +#ifdef CONFIG_CONCURRENT_MODE + && (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) || check_fwstate(&padapter->mlmepriv, WIFI_NULL_STATE)) +#endif + ) return; if (psta->mac_id == 1) { - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" with macid:%u\n" - , FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr), psta->mac_id); - rtw_warn_on(1); + RTW_ERR(FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" with macid:%u\n" + , FUNC_ADPT_ARG(padapter), padapter->iface_id + 1, MAC_ARG(psta->hwaddr), psta->mac_id); + if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) || check_fwstate(&padapter->mlmepriv, WIFI_NULL_STATE)) + rtw_warn_on(1); return; } #endif @@ -3872,17 +3782,29 @@ void rtw_release_macid(_adapter *padapter, struct sta_info *psta) int i; if (!rtw_macid_is_used(macid_ctl, psta->mac_id)) { - DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" macid:%u not used\n" - , FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr), psta->mac_id); + RTW_ERR(FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" macid:%u not used\n" + , FUNC_ADPT_ARG(padapter), padapter->iface_id + 1, MAC_ARG(psta->hwaddr), psta->mac_id); rtw_warn_on(1); } rtw_macid_map_clr(&macid_ctl->used, psta->mac_id); rtw_macid_map_clr(&macid_ctl->bmc, psta->mac_id); - for (i=0;inum)) + rtw_sec_cam_map_clr(&cam_ctl->used, id); + + rtw_iface_bcmc_id_set(padapter, INVALID_SEC_MAC_CAM_ID); + } + + for (i = 0; i < CONFIG_IFACE_NUMBER; i++) rtw_macid_map_clr(&macid_ctl->if_g[i], psta->mac_id); - for (i=0;i<2;i++) + for (i = 0; i < 2; i++) rtw_macid_map_clr(&macid_ctl->ch_g[i], psta->mac_id); + macid_ctl->sta[psta->mac_id] = NULL; } _exit_critical_bh(&macid_ctl->lock, &irqL); @@ -3890,25 +3812,87 @@ void rtw_release_macid(_adapter *padapter, struct sta_info *psta) psta->mac_id = macid_ctl->num; } -//For 8188E RA +/* For 8188E RA */ u8 rtw_search_max_mac_id(_adapter *padapter) { - u8 max_mac_id=0; + u8 max_mac_id = 0; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); int i; _irqL irqL; + /* TODO: Only search for connected macid? */ + _enter_critical_bh(&macid_ctl->lock, &irqL); - for(i=(macid_ctl->num-1); i>0 ; i--) { - if (!rtw_macid_is_used(macid_ctl, i)) + for (i = (macid_ctl->num - 1); i > 0 ; i--) { + if (rtw_macid_is_used(macid_ctl, i)) break; } _exit_critical_bh(&macid_ctl->lock, &irqL); max_mac_id = i; return max_mac_id; -} +} + +inline void rtw_macid_ctl_set_h2c_msr(struct macid_ctl_t *macid_ctl, u8 id, u8 h2c_msr) +{ + if (id >= macid_ctl->num) { + rtw_warn_on(1); + return; + } + + macid_ctl->h2c_msr[id] = h2c_msr; + if (0) + RTW_INFO("macid:%u, h2c_msr:"H2C_MSR_FMT"\n", id, H2C_MSR_ARG(&macid_ctl->h2c_msr[id])); +} + +inline void rtw_macid_ctl_set_bw(struct macid_ctl_t *macid_ctl, u8 id, u8 bw) +{ + if (id >= macid_ctl->num) { + rtw_warn_on(1); + return; + } + + macid_ctl->bw[id] = bw; + if (0) + RTW_INFO("macid:%u, bw:%s\n", id, ch_width_str(macid_ctl->bw[id])); +} + +inline void rtw_macid_ctl_set_vht_en(struct macid_ctl_t *macid_ctl, u8 id, u8 en) +{ + if (id >= macid_ctl->num) { + rtw_warn_on(1); + return; + } + + macid_ctl->vht_en[id] = en; + if (0) + RTW_INFO("macid:%u, vht_en:%u\n", id, macid_ctl->vht_en[id]); +} + +inline void rtw_macid_ctl_set_rate_bmp0(struct macid_ctl_t *macid_ctl, u8 id, u32 bmp) +{ + if (id >= macid_ctl->num) { + rtw_warn_on(1); + return; + } + + macid_ctl->rate_bmp0[id] = bmp; + if (0) + RTW_INFO("macid:%u, rate_bmp0:0x%08X\n", id, macid_ctl->rate_bmp0[id]); +} + +inline void rtw_macid_ctl_set_rate_bmp1(struct macid_ctl_t *macid_ctl, u8 id, u32 bmp) +{ + if (id >= macid_ctl->num) { + rtw_warn_on(1); + return; + } + + macid_ctl->rate_bmp1[id] = bmp; + if (0) + RTW_INFO("macid:%u, rate_bmp1:0x%08X\n", id, macid_ctl->rate_bmp1[id]); +} inline void rtw_macid_ctl_init(struct macid_ctl_t *macid_ctl) { @@ -3925,100 +3909,97 @@ unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame) { unsigned short ATIMWindow; unsigned char *pframe; - struct tx_desc *ptxdesc; - struct rtw_ieee80211_hdr *pwlanhdr; + struct tx_desc *ptxdesc; + struct rtw_ieee80211_hdr *pwlanhdr; unsigned short *fctrl; unsigned int rate_len, len = 0; struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - + _rtw_memset(beacon_frame, 0, 256); - + pframe = beacon_frame + TXDESC_SIZE; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + fctrl = &(pwlanhdr->frame_ctl); *(fctrl) = 0; - + _rtw_memcpy(pwlanhdr->addr1, bc_addr, 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); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); len = sizeof(struct rtw_ieee80211_hdr_3addr); - //timestamp will be inserted by hardware + /* timestamp will be inserted by hardware */ pframe += 8; len += 8; - // beacon interval: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + /* beacon interval: 2 bytes */ + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); pframe += 2; len += 2; - // capability info: 2 bytes + /* capability info: 2 bytes */ _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); pframe += 2; len += 2; - // SSID + /* SSID */ pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &len); - // supported rates... + /* supported rates... */ rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &len); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8) ? 8 : rate_len), cur_network->SupportedRates, &len); - // DS parameter set + /* DS parameter set */ pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &len); - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; + /* IBSS Parameter Set... */ + /* ATIMWindow = cur->Configuration.ATIMWindow; */ ATIMWindow = 0; pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &len); - //todo: ERP IE - - // EXTERNDED SUPPORTED RATE - if (rate_len > 8) - { - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &len); - } + /* todo: ERP IE */ - if ((len + TXDESC_SIZE) > 256) - { - //DBG_871X("marc: beacon frame too large\n"); + /* EXTERNDED SUPPORTED RATE */ + if (rate_len > 8) + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &len); + + if ((len + TXDESC_SIZE) > 256) { + /* RTW_INFO("marc: beacon frame too large\n"); */ return 0; } - //fill the tx descriptor + /* fill the tx descriptor */ ptxdesc = (struct tx_desc *)beacon_frame; - - //offset 0 - ptxdesc->txdw0 |= cpu_to_le32(len & 0x0000ffff); - ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000); //default = 32 bytes for TX Desc - - //offset 4 + + /* offset 0 */ + ptxdesc->txdw0 |= cpu_to_le32(len & 0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000); /* default = 32 bytes for TX Desc */ + + /* offset 4 */ ptxdesc->txdw1 |= cpu_to_le32((0x10 << QSEL_SHT) & 0x00001f00); - - //offset 8 + + /* offset 8 */ ptxdesc->txdw2 |= cpu_to_le32(BMC); ptxdesc->txdw2 |= cpu_to_le32(BK); - //offset 16 + /* offset 16 */ ptxdesc->txdw4 = 0x80000000; - - //offset 20 - ptxdesc->txdw5 = 0x00000000; //1M - - return (len + TXDESC_SIZE); + + /* offset 20 */ + ptxdesc->txdw5 = 0x00000000; /* 1M */ + + return len + TXDESC_SIZE; } #endif @@ -4026,12 +4007,12 @@ _adapter *dvobj_get_port0_adapter(struct dvobj_priv *dvobj) { _adapter *port0_iface = NULL; int i; - for (i=0;iiface_nums;i++) { - if (get_iface_type(dvobj->padapters[i]) == IFACE_PORT0) + for (i = 0; i < dvobj->iface_nums; i++) { + if (get_hw_port(dvobj->padapters[i]) == HW_PORT0) break; } - if (i<0 || i>=dvobj->iface_nums) + if (i < 0 || i >= dvobj->iface_nums) rtw_warn_on(1); else port0_iface = dvobj->padapters[i]; @@ -4046,18 +4027,18 @@ void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip) struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct in_device *my_ip_ptr = padapter->pnetdev->ip_ptr; u8 ipaddress[4]; - - if ( (pmlmeinfo->state & WIFI_FW_LINKING_STATE) || - pmlmeinfo->state & WIFI_FW_AP_STATE) { - if ( my_ip_ptr != NULL ) { + + if ((pmlmeinfo->state & WIFI_FW_LINKING_STATE) || + pmlmeinfo->state & WIFI_FW_AP_STATE) { + if (my_ip_ptr != NULL) { struct in_ifaddr *my_ifa_list = my_ip_ptr->ifa_list ; - if ( my_ifa_list != NULL ) { + if (my_ifa_list != NULL) { ipaddress[0] = my_ifa_list->ifa_address & 0xFF; ipaddress[1] = (my_ifa_list->ifa_address >> 8) & 0xFF; ipaddress[2] = (my_ifa_list->ifa_address >> 16) & 0xFF; ipaddress[3] = my_ifa_list->ifa_address >> 24; - DBG_871X("%s: %d.%d.%d.%d ==========\n", __func__, - ipaddress[0], ipaddress[1], ipaddress[2], ipaddress[3]); + RTW_INFO("%s: %d.%d.%d.%d ==========\n", __func__, + ipaddress[0], ipaddress[1], ipaddress[2], ipaddress[3]); _rtw_memcpy(pcurrentip, ipaddress, 4); } } @@ -4065,210 +4046,175 @@ void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip) } #endif #ifdef CONFIG_WOWLAN +bool rtw_wowlan_parser_pattern_cmd(u8 *input, char *pattern, + int *pattern_len, char *bit_mask) +{ + char *cp = NULL, *end = NULL; + size_t len = 0; + int pos = 0, mask_pos = 0, res = 0; + u8 member[2] = {0}; + + cp = strchr(input, '='); + if (cp) { + *cp = 0; + cp++; + input = cp; + } + + while (1) { + cp = strchr(input, ':'); + + if (cp) { + len = strlen(input) - strlen(cp); + *cp = 0; + cp++; + } else + len = 2; + + if (bit_mask && (strcmp(input, "-") == 0 || + strcmp(input, "xx") == 0 || + strcmp(input, "--") == 0)) { + /* skip this byte and leave mask bit unset */ + } else { + u8 hex; + + strncpy(member, input, len); + if (!rtw_check_pattern_valid(member, sizeof(member))) { + RTW_INFO("%s:[ERROR] pattern is invalid!!\n", + __func__); + goto error; + } + + res = sscanf(member, "%02hhx", &hex); + pattern[pos] = hex; + mask_pos = pos / 8; + if (bit_mask) + bit_mask[mask_pos] |= 1 << (pos % 8); + } + + pos++; + if (!cp) + break; + input = cp; + } + + (*pattern_len) = pos; + + return _TRUE; +error: + return _FALSE; +} + bool rtw_check_pattern_valid(u8 *input, u8 len) { int i = 0; bool res = _FALSE; - - for (i = 0 ; i < len ; i++) { - if ((input[i] <= '9' && input[i] >= '0') || - (input[i] <= 'F' && input[i] >= 'A') || - (input[i] <= 'f' && input[i] >= 'a')) - res = _TRUE; - else - res = _FALSE; - } + + if (len != 2) + goto exit; + + for (i = 0 ; i < len ; i++) + if (IsHexDigit(input[i]) == _FALSE) + goto exit; + + res = _SUCCESS; + +exit: return res; } - -bool rtw_read_from_frame_mask(_adapter *adapter, u8 idx) +void rtw_wow_pattern_sw_reset(_adapter *adapter) { - u32 data_l = 0, data_h = 0, rx_dma_buff_sz = 0, page_sz = 0; - u16 offset, rx_buf_ptr = 0; - u16 cam_start_offset = 0; - u16 ctrl_l = 0, ctrl_h = 0; - u8 count = 0, tmp = 0; - int i = 0; - bool res = _TRUE; + int i; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(adapter); - if (idx > MAX_WKFM_NUM) { - DBG_871X("[Error]: %s, pattern index is out of range\n", - __func__); - return _FALSE; + pwrctrlpriv->wowlan_pattern_idx = DEFAULT_PATTERN_NUM; + + for (i = 0 ; i < MAX_WKFM_CAM_NUM; i++) { + _rtw_memset(pwrctrlpriv->patterns[i].content, '\0', sizeof(pwrctrlpriv->patterns[i].content)); + _rtw_memset(pwrctrlpriv->patterns[i].mask, '\0', sizeof(pwrctrlpriv->patterns[i].mask)); + pwrctrlpriv->patterns[i].len = 0; + } +} + +u8 rtw_set_default_pattern(_adapter *adapter) +{ + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter); + struct registry_priv *pregistrypriv = &adapter->registrypriv; + u8 index = 0; + u8 currentip[4]; + u8 multicast_addr[3] = {0x01, 0x00, 0x5e}; + u8 multicast_ip[4] = {0xe0, 0x28, 0x28, 0x2a}; + u8 unicast_mask[5] = {0x3f, 0x70, 0x80, 0xc0, 0x03}; + u8 multicast_mask[5] = {0x07, 0x70, 0x80, 0xc0, 0x03}; + u8 ip_protocol[3] = {0x08, 0x00, 0x45}; + u8 icmp_protocol[1] = {0x01}; + u8 tcp_protocol[1] = {0x06}; + u8 udp_protocol[1] = {0x11}; + + if (pregistrypriv->default_patterns_en == _FALSE) + return 0; + + for (index = 0 ; index < DEFAULT_PATTERN_NUM ; index++) { + _rtw_memset(pwrpriv->patterns[index].content, 0, + sizeof(pwrpriv->patterns[index].content)); + _rtw_memset(pwrpriv->patterns[index].mask, 0, + sizeof(pwrpriv->patterns[index].mask)); + pwrpriv->patterns[index].len = 0; } - rtw_hal_get_def_var(adapter, HAL_DEF_RX_DMA_SZ_WOW, - (u8 *)&rx_dma_buff_sz); - - if (rx_dma_buff_sz == 0) { - DBG_871X("[Error]: %s, rx_dma_buff_sz is 0!!\n", __func__); - return _FALSE; - } + rtw_get_current_ip_address(adapter, currentip); - rtw_hal_get_def_var(adapter, HAL_DEF_RX_PAGE_SIZE, (u8 *)&page_sz); - - if (page_sz == 0) { - DBG_871X("[Error]: %s, page_sz is 0!!\n", __func__); - return _FALSE; - } - - offset = (u16)PageNum(rx_dma_buff_sz, page_sz); - cam_start_offset = offset * page_sz; - - ctrl_l = 0x0; - ctrl_h = 0x0; - - /* Enable RX packet buffer access */ - rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, RXPKT_BUF_SELECT); - - /* Read the WKFM CAM */ - for (i = 0; i < (WKFMCAM_ADDR_NUM / 2); i++) { - /* - * Set Rx packet buffer offset. - * RxBufer pointer increases 1, we can access 8 bytes in Rx packet buffer. - * CAM start offset (unit: 1 byte) = Index*WKFMCAM_SIZE - * RxBufer pointer addr = (CAM start offset + per entry offset of a WKFMCAM)/8 - * * Index: The index of the wake up frame mask - * * WKFMCAM_SIZE: the total size of one WKFM CAM - * * per entry offset of a WKFM CAM: Addr i * 4 bytes - */ - rx_buf_ptr = - (cam_start_offset + idx*WKFMCAM_SIZE + i*8) >> 3; - rtw_write16(adapter, REG_PKTBUF_DBG_CTRL, rx_buf_ptr); - - rtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_l); - data_l = rtw_read32(adapter, REG_PKTBUF_DBG_DATA_L); - data_h = rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H); - - DBG_871X("[%d]: %08x %08x\n", i, data_h, data_l); - - count = 0; - - do { - tmp = rtw_read8(adapter, REG_RXPKTBUF_CTRL); - rtw_udelay_os(2); - count++; - } while (!tmp && count < 100); - - if (count >= 100) { - DBG_871X("%s count:%d\n", __func__, count); - res = _FALSE; + /*TCP/ICMP unicast*/ + for (index = 0 ; index < DEFAULT_PATTERN_NUM ; index++) { + switch (index) { + case 0: + _rtw_memcpy(pwrpriv->patterns[index].content, + adapter_mac_addr(adapter), + ETH_ALEN); + _rtw_memcpy(pwrpriv->patterns[index].content + ETH_TYPE_OFFSET, + &ip_protocol, sizeof(ip_protocol)); + _rtw_memcpy(pwrpriv->patterns[index].content + PROTOCOL_OFFSET, + &tcp_protocol, sizeof(tcp_protocol)); + _rtw_memcpy(pwrpriv->patterns[index].content + IP_OFFSET, + ¤tip, sizeof(currentip)); + _rtw_memcpy(pwrpriv->patterns[index].mask, + &unicast_mask, sizeof(unicast_mask)); + pwrpriv->patterns[index].len = IP_OFFSET + sizeof(currentip); + break; + case 1: + _rtw_memcpy(pwrpriv->patterns[index].content, + adapter_mac_addr(adapter), + ETH_ALEN); + _rtw_memcpy(pwrpriv->patterns[index].content + ETH_TYPE_OFFSET, + &ip_protocol, sizeof(ip_protocol)); + _rtw_memcpy(pwrpriv->patterns[index].content + PROTOCOL_OFFSET, + &icmp_protocol, sizeof(icmp_protocol)); + _rtw_memcpy(pwrpriv->patterns[index].content + IP_OFFSET, + ¤tip, sizeof(currentip)); + _rtw_memcpy(pwrpriv->patterns[index].mask, + &unicast_mask, sizeof(unicast_mask)); + pwrpriv->patterns[index].len = IP_OFFSET + sizeof(currentip); + break; + case 2: + _rtw_memcpy(pwrpriv->patterns[index].content, &multicast_addr, + sizeof(multicast_addr)); + _rtw_memcpy(pwrpriv->patterns[index].content + ETH_TYPE_OFFSET, + &ip_protocol, sizeof(ip_protocol)); + _rtw_memcpy(pwrpriv->patterns[index].content + PROTOCOL_OFFSET, + &udp_protocol, sizeof(udp_protocol)); + _rtw_memcpy(pwrpriv->patterns[index].content + IP_OFFSET, + &multicast_ip, sizeof(multicast_ip)); + _rtw_memcpy(pwrpriv->patterns[index].mask, + &multicast_mask, sizeof(multicast_mask)); + pwrpriv->patterns[index].len = + IP_OFFSET + sizeof(multicast_ip); + break; } } - /* Disable RX packet buffer access */ - rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, - DISABLE_TRXPKT_BUF_ACCESS); - return res; + return index; } -bool rtw_write_to_frame_mask(_adapter *adapter, u8 idx, - struct rtl_wow_pattern *context) -{ - u32 data = 0, rx_dma_buff_sz = 0, page_sz = 0; - u16 offset, rx_buf_ptr = 0; - u16 cam_start_offset = 0; - u16 ctrl_l = 0, ctrl_h = 0; - u8 count = 0, tmp = 0; - int res = 0, i = 0; - - if (idx > MAX_WKFM_NUM) { - DBG_871X("[Error]: %s, pattern index is out of range\n", - __func__); - return _FALSE; - } - - rtw_hal_get_def_var(adapter, HAL_DEF_RX_DMA_SZ_WOW, - (u8 *)&rx_dma_buff_sz); - - if (rx_dma_buff_sz == 0) { - DBG_871X("[Error]: %s, rx_dma_buff_sz is 0!!\n", __func__); - return _FALSE; - } - - rtw_hal_get_def_var(adapter, HAL_DEF_RX_PAGE_SIZE, (u8 *)&page_sz); - - if (page_sz == 0) { - DBG_871X("[Error]: %s, page_sz is 0!!\n", __func__); - return _FALSE; - } - - offset = (u16)PageNum(rx_dma_buff_sz, page_sz); - - cam_start_offset = offset * page_sz; - - if (IS_HARDWARE_TYPE_8188E(adapter)) { - ctrl_l = 0x0001; - ctrl_h = 0x0001; - } else { - ctrl_l = 0x0f01; - ctrl_h = 0xf001; - } - - /* Enable RX packet buffer access */ - rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, RXPKT_BUF_SELECT); - - /* Write the WKFM CAM */ - for (i = 0; i < WKFMCAM_ADDR_NUM; i++) { - /* - * Set Rx packet buffer offset. - * RxBufer pointer increases 1, we can access 8 bytes in Rx packet buffer. - * CAM start offset (unit: 1 byte) = Index*WKFMCAM_SIZE - * RxBufer pointer addr = (CAM start offset + per entry offset of a WKFMCAM)/8 - * * Index: The index of the wake up frame mask - * * WKFMCAM_SIZE: the total size of one WKFM CAM - * * per entry offset of a WKFM CAM: Addr i * 4 bytes - */ - rx_buf_ptr = - (cam_start_offset + idx*WKFMCAM_SIZE + i*4) >> 3; - rtw_write16(adapter, REG_PKTBUF_DBG_CTRL, rx_buf_ptr); - - if (i == 0) { - if (context->type == PATTERN_VALID) - data = BIT(31) | context->crc; - else if (context->type == PATTERN_BROADCAST) - data |= BIT(26); - else if (context->type == PATTERN_MULTICAST) - data |= BIT(25); - else if (context->type == PATTERN_UNICAST) - data |= BIT(24); - rtw_write32(adapter, REG_PKTBUF_DBG_DATA_L, data); - rtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_l); - } else if (i == 1) { - data = 0; - rtw_write32(adapter, REG_PKTBUF_DBG_DATA_H, data); - rtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_h); - } else if (i == 2 || i == 4) { - data = context->mask[i - 2]; - rtw_write32(adapter, REG_PKTBUF_DBG_DATA_L, data); - /* write to RX packet buffer*/ - rtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_l); - } else if (i == 3 || i == 5) { - data = context->mask[i - 2]; - rtw_write32(adapter, REG_PKTBUF_DBG_DATA_H, data); - /* write to RX packet buffer*/ - rtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_h); - } - - count = 0; - do { - tmp = rtw_read8(adapter, REG_RXPKTBUF_CTRL); - rtw_udelay_os(2); - count++; - } while (tmp && count < 100); - - if (count >= 100) - res = _FALSE; - else - res = _TRUE; - } - - /* Disable RX packet buffer access */ - rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, - DISABLE_TRXPKT_BUF_ACCESS); - - return res; -} void rtw_dump_priv_pattern(_adapter *adapter, u8 idx) @@ -4279,102 +4225,94 @@ void rtw_dump_priv_pattern(_adapter *adapter, u8 idx) u8 val8 = 0; int i = 0, j = 0, len = 0, max_len = 0; - DBG_871X("=========[%d]========\n", idx); + RTW_INFO("=========[%d]========\n", idx); - DBG_871X(">>>priv_pattern_content:\n"); + RTW_INFO(">>>priv_pattern_content:\n"); p_str = str_1; max_len = sizeof(str_1); - for (i = 0 ; i < MAX_WKFM_PATTERN_SIZE/8 ; i++) { + for (i = 0 ; i < MAX_WKFM_PATTERN_SIZE / 8 ; i++) { _rtw_memset(p_str, 0, max_len); len = 0; for (j = 0 ; j < 8 ; j++) { - val8 = pwrctl->patterns[idx].content[i*8 + j]; + val8 = pwrctl->patterns[idx].content[i * 8 + j]; len += snprintf(p_str + len, max_len - len, "%02x ", val8); } - DBG_871X("%s\n", p_str); + RTW_INFO("%s\n", p_str); } - DBG_871X(">>>priv_pattern_mask:\n"); - for (i = 0 ; i < MAX_WKFM_SIZE/8 ; i++) { + RTW_INFO(">>>priv_pattern_mask:\n"); + for (i = 0 ; i < MAX_WKFM_SIZE / 8 ; i++) { _rtw_memset(p_str, 0, max_len); len = 0; for (j = 0 ; j < 8 ; j++) { - val8 = pwrctl->patterns[idx].mask[i*8 + j]; + val8 = pwrctl->patterns[idx].mask[i * 8 + j]; len += snprintf(p_str + len, max_len - len, "%02x ", val8); } - DBG_871X("%s\n", p_str); + RTW_INFO("%s\n", p_str); } + + RTW_INFO(">>>priv_pattern_len:\n"); + RTW_INFO("%s: len: %d\n", __func__, pwrctl->patterns[idx].len); } -void rtw_clean_pattern(_adapter *adapter) +void rtw_wow_pattern_sw_dump(_adapter *adapter) { - struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter); - struct rtl_wow_pattern zero_pattern; - int i = 0; + int i; - _rtw_memset(&zero_pattern, 0, sizeof(struct rtl_wow_pattern)); - - zero_pattern.type = PATTERN_INVALID; - - for (i = 0; i < MAX_WKFM_NUM; i++) - rtw_write_to_frame_mask(adapter, i, &zero_pattern); - - pwrctl->wowlan_pattern_idx = 0; - rtw_write8(adapter, REG_WKFMCAM_NUM, pwrctl->wowlan_pattern_idx); + RTW_INFO("********[RTK priv-patterns]*********\n"); + for (i = 0 ; i < MAX_WKFM_CAM_NUM; i++) + rtw_dump_priv_pattern(adapter, i); } -void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr) +void rtw_get_sec_iv(PADAPTER padapter, u8 *pcur_dot11txpn, u8 *StaAddr) { struct sta_info *psta; struct security_priv *psecpriv = &padapter->securitypriv; _rtw_memset(pcur_dot11txpn, 0, 8); - if(NULL == StaAddr) - return; + if (NULL == StaAddr) + return; psta = rtw_get_stainfo(&padapter->stapriv, StaAddr); - DBG_871X("%s(): StaAddr: %02x %02x %02x %02x %02x %02x\n", - __func__, StaAddr[0], StaAddr[1], StaAddr[2], - StaAddr[3], StaAddr[4], StaAddr[5]); + RTW_INFO("%s(): StaAddr: %02x %02x %02x %02x %02x %02x\n", + __func__, StaAddr[0], StaAddr[1], StaAddr[2], + StaAddr[3], StaAddr[4], StaAddr[5]); - if(psta) - { + if (psta) { if (psecpriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ && psta->dot11txpn.val > 0) psta->dot11txpn.val--; AES_IV(pcur_dot11txpn, psta->dot11txpn, 0); - DBG_871X("%s(): CurrentIV: %02x %02x %02x %02x %02x %02x %02x %02x \n" - , __func__, pcur_dot11txpn[0],pcur_dot11txpn[1], - pcur_dot11txpn[2],pcur_dot11txpn[3], pcur_dot11txpn[4], - pcur_dot11txpn[5],pcur_dot11txpn[6],pcur_dot11txpn[7]); + RTW_INFO("%s(): CurrentIV: %02x %02x %02x %02x %02x %02x %02x %02x\n" + , __func__, pcur_dot11txpn[0], pcur_dot11txpn[1], + pcur_dot11txpn[2], pcur_dot11txpn[3], pcur_dot11txpn[4], + pcur_dot11txpn[5], pcur_dot11txpn[6], pcur_dot11txpn[7]); } } void rtw_set_sec_pn(PADAPTER padapter) { - struct sta_info *psta; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - struct security_priv *psecpriv = &padapter->securitypriv; + struct sta_info *psta; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct security_priv *psecpriv = &padapter->securitypriv; - psta = rtw_get_stainfo(&padapter->stapriv, - get_my_bssid(&pmlmeinfo->network)); + psta = rtw_get_stainfo(&padapter->stapriv, + get_my_bssid(&pmlmeinfo->network)); - if(psta) - { - if (pwrpriv->wowlan_fw_iv > psta->dot11txpn.val) - { + if (psta) { + if (pwrpriv->wowlan_fw_iv > psta->dot11txpn.val) { if (psecpriv->dot11PrivacyAlgrthm != _NO_PRIVACY_) psta->dot11txpn.val = pwrpriv->wowlan_fw_iv + 2; } else { - DBG_871X("%s(): FW IV is smaller than driver\n", __func__); + RTW_INFO("%s(): FW IV is smaller than driver\n", __func__); psta->dot11txpn.val += 2; } - DBG_871X("%s: dot11txpn: 0x%016llx\n", __func__ ,psta->dot11txpn.val); - } + RTW_INFO("%s: dot11txpn: 0x%016llx\n", __func__ , psta->dot11txpn.val); + } } -#endif //CONFIG_WOWLAN +#endif /* CONFIG_WOWLAN */ #ifdef CONFIG_PNO_SUPPORT #define CSCAN_TLV_TYPE_SSID_IE 'S' @@ -4385,14 +4323,15 @@ void rtw_set_sec_pn(PADAPTER padapter) /* * SSIDs list parsing from cscan tlv list */ -int rtw_parse_ssid_list_tlv(char** list_str, pno_ssid_t* ssid, - int max, int *bytes_left) { - char* str; +int rtw_parse_ssid_list_tlv(char **list_str, pno_ssid_t *ssid, + int max, int *bytes_left) +{ + char *str; int idx = 0; if ((list_str == NULL) || (*list_str == NULL) || (*bytes_left < 0)) { - DBG_871X("%s error paramters\n", __func__); + RTW_INFO("%s error paramters\n", __func__); return -1; } @@ -4401,7 +4340,7 @@ int rtw_parse_ssid_list_tlv(char** list_str, pno_ssid_t* ssid, if (str[0] != CSCAN_TLV_TYPE_SSID_IE) { *list_str = str; - DBG_871X("nssid=%d left_parse=%d %d\n", idx, *bytes_left, str[0]); + RTW_INFO("nssid=%d left_parse=%d %d\n", idx, *bytes_left, str[0]); return idx; } @@ -4412,40 +4351,38 @@ int rtw_parse_ssid_list_tlv(char** list_str, pno_ssid_t* ssid, if (str[0] == 0) { /* Broadcast SSID */ ssid[idx].SSID_len = 0; - memset((char*)ssid[idx].SSID, 0x0, WLAN_SSID_MAXLEN); + memset((char *)ssid[idx].SSID, 0x0, WLAN_SSID_MAXLEN); *bytes_left -= 1; str += 1; - DBG_871X("BROADCAST SCAN left=%d\n", *bytes_left); - } - else if (str[0] <= WLAN_SSID_MAXLEN) { - /* Get proper SSID size */ + RTW_INFO("BROADCAST SCAN left=%d\n", *bytes_left); + } else if (str[0] <= WLAN_SSID_MAXLEN) { + /* Get proper SSID size */ ssid[idx].SSID_len = str[0]; *bytes_left -= 1; str += 1; /* Get SSID */ if (ssid[idx].SSID_len > *bytes_left) { - DBG_871X("%s out of memory range len=%d but left=%d\n", - __func__, ssid[idx].SSID_len, *bytes_left); + RTW_INFO("%s out of memory range len=%d but left=%d\n", + __func__, ssid[idx].SSID_len, *bytes_left); return -1; } - memcpy((char*)ssid[idx].SSID, str, ssid[idx].SSID_len); + memcpy((char *)ssid[idx].SSID, str, ssid[idx].SSID_len); *bytes_left -= ssid[idx].SSID_len; str += ssid[idx].SSID_len; - DBG_871X("%s :size=%d left=%d\n", - (char*)ssid[idx].SSID, ssid[idx].SSID_len, *bytes_left); - } - else { - DBG_871X("### SSID size more that %d\n", str[0]); + RTW_INFO("%s :size=%d left=%d\n", + (char *)ssid[idx].SSID, ssid[idx].SSID_len, *bytes_left); + } else { + RTW_INFO("### SSID size more that %d\n", str[0]); return -1; } if (idx++ > max) { - DBG_871X("%s number of SSIDs more that %d\n", __func__, idx); + RTW_INFO("%s number of SSIDs more that %d\n", __func__, idx); return -1; } } @@ -4454,7 +4391,8 @@ int rtw_parse_ssid_list_tlv(char** list_str, pno_ssid_t* ssid, return idx; } -int rtw_parse_cipher_list(struct pno_nlo_info *nlo_info, char* list_str) { +int rtw_parse_cipher_list(struct pno_nlo_info *nlo_info, char *list_str) +{ char *pch, *pnext, *pend; u8 key_len = 0, index = 0; @@ -4462,7 +4400,7 @@ int rtw_parse_cipher_list(struct pno_nlo_info *nlo_info, char* list_str) { pch = list_str; if (nlo_info == NULL || list_str == NULL) { - DBG_871X("%s error paramters\n", __func__); + RTW_INFO("%s error paramters\n", __func__); return -1; } @@ -4472,26 +4410,25 @@ int rtw_parse_cipher_list(struct pno_nlo_info *nlo_info, char* list_str) { pch = pnext + strlen(CIPHER_IE); pend = strstr(pch, "}"); if (strncmp(pch, CIPHER_NONE, - strlen(CIPHER_NONE)) == 0) { + strlen(CIPHER_NONE)) == 0) nlo_info->ssid_cipher_info[index] = 0x00; - } else if (strncmp(pch, CIPHER_WPA_PSK, - strlen(CIPHER_WPA_PSK)) == 0) { + else if (strncmp(pch, CIPHER_WPA_PSK, + strlen(CIPHER_WPA_PSK)) == 0) nlo_info->ssid_cipher_info[index] = 0x66; - } else if (strncmp(pch, CIPHER_WPA_EAP, - strlen(CIPHER_WPA_EAP)) == 0) { + else if (strncmp(pch, CIPHER_WPA_EAP, + strlen(CIPHER_WPA_EAP)) == 0) nlo_info->ssid_cipher_info[index] = 0x01; - } - index ++; + index++; pch = pend + 1; - } else { + } else break; - } } return 0; } -int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t* ssid, - int num, int pno_time, int pno_repeat, int pno_freq_expo_max) { +int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t *ssid, + int num, int pno_time, int pno_repeat, int pno_freq_expo_max) +{ int i = 0; struct file *fp; @@ -4500,7 +4437,7 @@ int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t* ssid, u8 *source = NULL; long len = 0; - DBG_871X("+%s+\n", __func__); + RTW_INFO("+%s+\n", __func__); nlo_info->fast_scan_period = pno_time; nlo_info->ssid_num = num & BIT_LEN_MASK_32(8); @@ -4511,24 +4448,24 @@ int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t* ssid, if (nlo_info->hidden_ssid_num > 8) nlo_info->hidden_ssid_num = 8; - //TODO: channel list and probe index is all empty. + /* TODO: channel list and probe index is all empty. */ for (i = 0 ; i < num ; i++) { nlo_info->ssid_length[i] = ssid[i].SSID_len; } /* cipher array */ - fp = filp_open("/data/misc/wifi/wpa_supplicant.conf", O_RDONLY, 0644); + fp = filp_open("/home/timlee/wpa_kk/wpa.conf", O_RDONLY, 0644); if (IS_ERR(fp)) { - DBG_871X("Error, wpa_supplicant.conf doesn't exist.\n"); - DBG_871X("Error, cipher array using default value.\n"); + RTW_INFO("Error, wpa_supplicant.conf doesn't exist.\n"); + RTW_INFO("Error, cipher array using default value.\n"); return 0; } len = i_size_read(fp->f_path.dentry->d_inode); if (len < 0 || len > 2048) { - DBG_871X("Error, file size is bigger than 2048.\n"); - DBG_871X("Error, cipher array using default value.\n"); + RTW_INFO("Error, file size is bigger than 2048.\n"); + RTW_INFO("Error, cipher array using default value.\n"); return 0; } @@ -4546,27 +4483,29 @@ int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t* ssid, set_fs(fs); filp_close(fp, NULL); - DBG_871X("-%s-\n", __func__); + RTW_INFO("-%s-\n", __func__); return 0; } int rtw_dev_ssid_list_set(struct pno_ssid_list *pno_ssid_list, - pno_ssid_t* ssid, u8 num) { + pno_ssid_t *ssid, u8 num) +{ int i = 0; - if(num > MAX_PNO_LIST_COUNT) + if (num > MAX_PNO_LIST_COUNT) num = MAX_PNO_LIST_COUNT; for (i = 0 ; i < num ; i++) { _rtw_memcpy(&pno_ssid_list->node[i].SSID, - ssid[i].SSID, ssid[i].SSID_len); + ssid[i].SSID, ssid[i].SSID_len); pno_ssid_list->node[i].SSID_len = ssid[i].SSID_len; } return 0; } -int rtw_dev_scan_info_set(_adapter *padapter, pno_ssid_t* ssid, - unsigned char ch, unsigned char ch_offset, unsigned short bw_mode) { +int rtw_dev_scan_info_set(_adapter *padapter, pno_ssid_t *ssid, + unsigned char ch, unsigned char ch_offset, unsigned short bw_mode) +{ struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); struct pno_scan_info *scan_info = pwrctl->pscan_info; @@ -4577,7 +4516,7 @@ int rtw_dev_scan_info_set(_adapter *padapter, pno_ssid_t* ssid, scan_info->orig_bw = bw_mode; scan_info->orig_40_offset = ch_offset; - for(i = 0 ; i < scan_info->channel_num ; i++) { + for (i = 0 ; i < scan_info->channel_num ; i++) { if (i < 11) scan_info->ssid_channel_info[i].active = 1; else @@ -4586,19 +4525,20 @@ int rtw_dev_scan_info_set(_adapter *padapter, pno_ssid_t* ssid, scan_info->ssid_channel_info[i].timeout = 100; scan_info->ssid_channel_info[i].tx_power = - PHY_GetTxPowerIndex(padapter, 0, 0x02, bw_mode, i+1); + PHY_GetTxPowerIndex(padapter, 0, 0x02, bw_mode, i + 1); - scan_info->ssid_channel_info[i].channel = i+1; + scan_info->ssid_channel_info[i].channel = i + 1; } - DBG_871X("%s, channel_num: %d, orig_ch: %d, orig_bw: %d orig_40_offset: %d\n", - __func__, scan_info->channel_num, scan_info->orig_ch, - scan_info->orig_bw, scan_info->orig_40_offset); + RTW_INFO("%s, channel_num: %d, orig_ch: %d, orig_bw: %d orig_40_offset: %d\n", + __func__, scan_info->channel_num, scan_info->orig_ch, + scan_info->orig_bw, scan_info->orig_40_offset); return 0; } -int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num, - int pno_time, int pno_repeat, int pno_freq_expo_max) { +int rtw_dev_pno_set(struct net_device *net, pno_ssid_t *ssid, int num, + int pno_time, int pno_repeat, int pno_freq_expo_max) +{ _adapter *padapter = (_adapter *)rtw_netdev_priv(net); struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); @@ -4607,26 +4547,26 @@ int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num, int ret = -1; if (num == 0) { - DBG_871X("%s, nssid is zero, no need to setup pno ssid list\n", __func__); + RTW_INFO("%s, nssid is zero, no need to setup pno ssid list\n", __func__); return 0; } if (pwrctl == NULL) { - DBG_871X("%s, ERROR: pwrctl is NULL\n", __func__); + RTW_INFO("%s, ERROR: pwrctl is NULL\n", __func__); return -1; } else { pwrctl->pnlo_info = - (pno_nlo_info_t*)rtw_zmalloc(sizeof(pno_nlo_info_t)); + (pno_nlo_info_t *)rtw_zmalloc(sizeof(pno_nlo_info_t)); pwrctl->pno_ssid_list = - (pno_ssid_list_t*)rtw_zmalloc(sizeof(pno_ssid_list_t)); + (pno_ssid_list_t *)rtw_zmalloc(sizeof(pno_ssid_list_t)); pwrctl->pscan_info = - (pno_scan_info_t*)rtw_zmalloc(sizeof(pno_scan_info_t)); + (pno_scan_info_t *)rtw_zmalloc(sizeof(pno_scan_info_t)); } if (pwrctl->pnlo_info == NULL || - pwrctl->pscan_info == NULL || - pwrctl->pno_ssid_list == NULL){ - DBG_871X("%s, ERROR: alloc nlo_info, ssid_list, scan_info fail\n", __func__); + pwrctl->pscan_info == NULL || + pwrctl->pno_ssid_list == NULL) { + RTW_INFO("%s, ERROR: alloc nlo_info, ssid_list, scan_info fail\n", __func__); goto failing; } @@ -4635,16 +4575,16 @@ int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num, pwrctl->pno_inited = _TRUE; /* NLO Info */ ret = rtw_dev_nlo_info_set(pwrctl->pnlo_info, ssid, num, - pno_time, pno_repeat, pno_freq_expo_max); + pno_time, pno_repeat, pno_freq_expo_max); /* SSID Info */ ret = rtw_dev_ssid_list_set(pwrctl->pno_ssid_list, ssid, num); /* SCAN Info */ ret = rtw_dev_scan_info_set(padapter, ssid, pmlmeext->cur_channel, - pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - DBG_871X("+%s num: %d, pno_time: %d, pno_repeat:%d, pno_freq_expo_max:%d+\n", + RTW_INFO("+%s num: %d, pno_time: %d, pno_repeat:%d, pno_freq_expo_max:%d+\n", __func__, num, pno_time, pno_repeat, pno_freq_expo_max); return 0; @@ -4667,54 +4607,40 @@ failing: } #ifdef CONFIG_PNO_SET_DEBUG -void rtw_dev_pno_debug(struct net_device *net) { +void rtw_dev_pno_debug(struct net_device *net) +{ _adapter *padapter = (_adapter *)rtw_netdev_priv(net); struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); int i = 0, j = 0; - DBG_871X("*******NLO_INFO********\n"); - DBG_871X("ssid_num: %d\n", pwrctl->pnlo_info->ssid_num); - DBG_871X("fast_scan_iterations: %d\n", - pwrctl->pnlo_info->fast_scan_iterations); - DBG_871X("fast_scan_period: %d\n", pwrctl->pnlo_info->fast_scan_period); - DBG_871X("slow_scan_period: %d\n", pwrctl->pnlo_info->slow_scan_period); - DBG_871X("ssid_length: "); - for (i = 0 ; i < MAX_PNO_LIST_COUNT ; i++) { - printk("%d, ", pwrctl->pnlo_info->ssid_length[i]); - } - DBG_871X("\n"); + RTW_INFO("*******NLO_INFO********\n"); + RTW_INFO("ssid_num: %d\n", pwrctl->pnlo_info->ssid_num); + RTW_INFO("fast_scan_iterations: %d\n", + pwrctl->pnlo_info->fast_scan_iterations); + RTW_INFO("fast_scan_period: %d\n", pwrctl->pnlo_info->fast_scan_period); + RTW_INFO("slow_scan_period: %d\n", pwrctl->pnlo_info->slow_scan_period); - DBG_871X("cipher_info: "); - for (i = 0 ; i < MAX_PNO_LIST_COUNT ; i++) { - DBG_871X("%d, ", pwrctl->pnlo_info->ssid_cipher_info[i]); - } - DBG_871X("\n"); - DBG_871X("channel_info: "); - for (i = 0 ; i < MAX_PNO_LIST_COUNT ; i++) { - DBG_871X("%d, ", pwrctl->pnlo_info->ssid_channel_info[i]); - } - DBG_871X("\n"); - DBG_871X("******SSID_LISD******\n"); for (i = 0 ; i < MAX_PNO_LIST_COUNT ; i++) { - DBG_871X("[%d]SSID: %s \n", i, - pwrctl->pno_ssid_list->node[i].SSID); + RTW_INFO("%d SSID (%s) length (%d) cipher(%x) channel(%d)\n", + i, pwrctl->pno_ssid_list->node[i].SSID, pwrctl->pnlo_info->ssid_length[i], + pwrctl->pnlo_info->ssid_cipher_info[i], pwrctl->pnlo_info->ssid_channel_info[i]); } - DBG_871X("******SCAN_INFO******\n"); - DBG_871X("ch_num: %d\n", pwrctl->pscan_info->channel_num); - DBG_871X("orig_ch: %d\n", pwrctl->pscan_info->orig_ch); - DBG_871X("orig bw: %d\n", pwrctl->pscan_info->orig_bw); - DBG_871X("orig 40 offset: %d\n", pwrctl->pscan_info->orig_40_offset); - for(i = 0 ; i < MAX_SCAN_LIST_COUNT ; i++) { - DBG_871X("[%02d] avtive:%d, timeout:%d, tx_power:%d, ch:%02d\n", - i, pwrctl->pscan_info->ssid_channel_info[i].active, - pwrctl->pscan_info->ssid_channel_info[i].timeout, - pwrctl->pscan_info->ssid_channel_info[i].tx_power, - pwrctl->pscan_info->ssid_channel_info[i].channel); + RTW_INFO("******SCAN_INFO******\n"); + RTW_INFO("ch_num: %d\n", pwrctl->pscan_info->channel_num); + RTW_INFO("orig_ch: %d\n", pwrctl->pscan_info->orig_ch); + RTW_INFO("orig bw: %d\n", pwrctl->pscan_info->orig_bw); + RTW_INFO("orig 40 offset: %d\n", pwrctl->pscan_info->orig_40_offset); + for (i = 0 ; i < MAX_SCAN_LIST_COUNT ; i++) { + RTW_INFO("[%02d] avtive:%d, timeout:%d, tx_power:%d, ch:%02d\n", + i, pwrctl->pscan_info->ssid_channel_info[i].active, + pwrctl->pscan_info->ssid_channel_info[i].timeout, + pwrctl->pscan_info->ssid_channel_info[i].tx_power, + pwrctl->pscan_info->ssid_channel_info[i].channel); } - DBG_871X("*****************\n"); + RTW_INFO("*****************\n"); } -#endif //CONFIG_PNO_SET_DEBUG -#endif //CONFIG_PNO_SUPPORT +#endif /* CONFIG_PNO_SET_DEBUG */ +#endif /* CONFIG_PNO_SUPPORT */ diff --git a/core/rtw_xmit.c b/core/rtw_xmit.c old mode 100755 new mode 100644 index 961865d..91bce15 --- a/core/rtw_xmit.c +++ b/core/rtw_xmit.c @@ -1,7 +1,7 @@ /****************************************************************************** * * 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. @@ -20,9 +20,10 @@ #define _RTW_XMIT_C_ #include +#include -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) -#error "Shall be Linux or Windows, but not both!\n" +#if defined(PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + #error "Shall be Linux or Windows, but not both!\n" #endif @@ -31,25 +32,22 @@ static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; static void _init_txservq(struct tx_servq *ptxservq) { -_func_enter_; _rtw_init_listhead(&ptxservq->tx_pending); _rtw_init_queue(&ptxservq->sta_pending); ptxservq->qcnt = 0; -_func_exit_; } void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv) -{ - -_func_enter_; +{ - _rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof (struct sta_xmit_priv)); + + _rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof(struct sta_xmit_priv)); _rtw_spinlock_init(&psta_xmitpriv->lock); - - //for(i = 0 ; i < MAX_NUMBLKS; i++) - // _init_txservq(&(psta_xmitpriv->blk_q[i])); + + /* for(i = 0 ; i < MAX_NUMBLKS; i++) */ + /* _init_txservq(&(psta_xmitpriv->blk_q[i])); */ _init_txservq(&psta_xmitpriv->be_q); _init_txservq(&psta_xmitpriv->bk_q); @@ -57,8 +55,7 @@ _func_enter_; _init_txservq(&psta_xmitpriv->vo_q); _rtw_init_listhead(&psta_xmitpriv->legacy_dz); _rtw_init_listhead(&psta_xmitpriv->apsd); - -_func_exit_; + } @@ -67,70 +64,67 @@ s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter) int i; struct xmit_buf *pxmitbuf; struct xmit_frame *pxframe; - sint res=_SUCCESS; - -_func_enter_; + sint res = _SUCCESS; + + + /* We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */ + /* _rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv)); */ - // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). - //_rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv)); - _rtw_spinlock_init(&pxmitpriv->lock); _rtw_spinlock_init(&pxmitpriv->lock_sctx); _rtw_init_sema(&pxmitpriv->xmit_sema, 0); _rtw_init_sema(&pxmitpriv->terminate_xmitthread_sema, 0); - /* + /* Please insert all the queue initializaiton using _rtw_init_queue below */ pxmitpriv->adapter = padapter; - - //for(i = 0 ; i < MAX_NUMBLKS; i++) - // _rtw_init_queue(&pxmitpriv->blk_strms[i]); - + + /* for(i = 0 ; i < MAX_NUMBLKS; i++) */ + /* _rtw_init_queue(&pxmitpriv->blk_strms[i]); */ + _rtw_init_queue(&pxmitpriv->be_pending); _rtw_init_queue(&pxmitpriv->bk_pending); _rtw_init_queue(&pxmitpriv->vi_pending); _rtw_init_queue(&pxmitpriv->vo_pending); _rtw_init_queue(&pxmitpriv->bm_pending); - //_rtw_init_queue(&pxmitpriv->legacy_dz_queue); - //_rtw_init_queue(&pxmitpriv->apsd_queue); + /* _rtw_init_queue(&pxmitpriv->legacy_dz_queue); */ + /* _rtw_init_queue(&pxmitpriv->apsd_queue); */ _rtw_init_queue(&pxmitpriv->free_xmit_queue); - /* - Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME, + /* + Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME, and initialize free_xmit_frame below. Please also apply free_txobj to link_up all the xmit_frames... */ pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4); - - if (pxmitpriv->pallocated_frame_buf == NULL){ - pxmitpriv->pxmit_frame_buf =NULL; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_frame fail!\n")); - res= _FAIL; + + if (pxmitpriv->pallocated_frame_buf == NULL) { + pxmitpriv->pxmit_frame_buf = NULL; + res = _FAIL; goto exit; } pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_frame_buf), 4); - //pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - - // ((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3); + /* pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - */ + /* ((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3); */ - pxframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf; + pxframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf; - for (i = 0; i < NR_XMITFRAME; i++) - { + for (i = 0; i < NR_XMITFRAME; i++) { _rtw_init_listhead(&(pxframe->list)); pxframe->padapter = padapter; pxframe->frame_tag = NULL_FRAMETAG; - pxframe->pkt = NULL; + pxframe->pkt = NULL; pxframe->buf_addr = NULL; pxframe->pxmitbuf = NULL; - + rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue)); pxframe++; @@ -141,26 +135,24 @@ _func_enter_; pxmitpriv->frag_len = MAX_FRAG_THRESHOLD; - //init xmit_buf + /* init xmit_buf */ _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue); _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue); pxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4); - - if (pxmitpriv->pallocated_xmitbuf == NULL){ - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_buf fail!\n")); - res= _FAIL; + + if (pxmitpriv->pallocated_xmitbuf == NULL) { + res = _FAIL; goto exit; } pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmitbuf), 4); - //pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - - // ((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3); + /* pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - */ + /* ((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3); */ - pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmitbuf; + pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf; - for (i = 0; i < NR_XMITBUFF; i++) - { + for (i = 0; i < NR_XMITBUFF; i++) { _rtw_init_listhead(&pxmitbuf->list); pxmitbuf->priv_data = NULL; @@ -168,12 +160,12 @@ _func_enter_; pxmitbuf->buf_tag = XMITBUF_DATA; /* Tx buf allocation may fail sometimes, so sleep and retry. */ - if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE)) == _FAIL) { + res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE); + if (res == _FAIL) { rtw_msleep_os(10); - res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE); - if (res == _FAIL) { + res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE); + if (res == _FAIL) goto exit; - } } #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) @@ -186,29 +178,28 @@ _func_enter_; pxmitbuf->flags = XMIT_VO_QUEUE; rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue)); - #ifdef DBG_XMIT_BUF - pxmitbuf->no=i; - #endif +#ifdef DBG_XMIT_BUF + pxmitbuf->no = i; +#endif pxmitbuf++; - + } pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF; - /* init xframe_ext queue, the same count as extbuf */ + /* init xframe_ext queue, the same count as extbuf */ _rtw_init_queue(&pxmitpriv->free_xframe_ext_queue); - + pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4); - - if (pxmitpriv->xframe_ext_alloc_addr == NULL){ + + if (pxmitpriv->xframe_ext_alloc_addr == NULL) { pxmitpriv->xframe_ext = NULL; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xframe_ext fail!\n")); - res= _FAIL; + res = _FAIL; goto exit; } pxmitpriv->xframe_ext = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->xframe_ext_alloc_addr), 4); - pxframe = (struct xmit_frame*)pxmitpriv->xframe_ext; + pxframe = (struct xmit_frame *)pxmitpriv->xframe_ext; for (i = 0; i < NR_XMIT_EXTBUFF; i++) { _rtw_init_listhead(&(pxframe->list)); @@ -216,47 +207,46 @@ _func_enter_; pxframe->padapter = padapter; pxframe->frame_tag = NULL_FRAMETAG; - pxframe->pkt = NULL; + pxframe->pkt = NULL; pxframe->buf_addr = NULL; pxframe->pxmitbuf = NULL; - + pxframe->ext_tag = 1; - + rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xframe_ext_queue.queue)); pxframe++; } pxmitpriv->free_xframe_ext_cnt = NR_XMIT_EXTBUFF; - // Init xmit extension buff + /* Init xmit extension buff */ _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue); pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4); - - if (pxmitpriv->pallocated_xmit_extbuf == NULL){ - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n")); - res= _FAIL; + + if (pxmitpriv->pallocated_xmit_extbuf == NULL) { + res = _FAIL; goto exit; } pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4); - pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf; + pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; - for (i = 0; i < NR_XMIT_EXTBUFF; i++) - { + for (i = 0; i < NR_XMIT_EXTBUFF; i++) { _rtw_init_listhead(&pxmitbuf->list); pxmitbuf->priv_data = NULL; pxmitbuf->padapter = padapter; pxmitbuf->buf_tag = XMITBUF_MGNT; - if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) { - res= _FAIL; + res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE); + if (res == _FAIL) { + res = _FAIL; goto exit; } - + #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) pxmitbuf->phead = pxmitbuf->pbuf; pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMIT_EXTBUF_SZ; @@ -265,16 +255,16 @@ _func_enter_; #endif rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue)); - #ifdef DBG_XMIT_BUF_EXT - pxmitbuf->no=i; - #endif +#ifdef DBG_XMIT_BUF_EXT + pxmitbuf->no = i; +#endif pxmitbuf++; - + } pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF; - for (i = 0; ipcmd_xmitbuf[i]; if (pxmitbuf) { _rtw_init_listhead(&pxmitbuf->list); @@ -283,8 +273,9 @@ _func_enter_; pxmitbuf->padapter = padapter; pxmitbuf->buf_tag = XMITBUF_CMD; - if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) { - res= _FAIL; + res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE); + if (res == _FAIL) { + res = _FAIL; goto exit; } @@ -294,24 +285,22 @@ _func_enter_; pxmitbuf->len = 0; pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead; #endif - pxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ; + pxmitbuf->alloc_sz = MAX_CMDBUF_SZ + XMITBUF_ALIGN_SZ; } } rtw_alloc_hwxmits(padapter); rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); - for (i = 0; i < 4; i ++) - { + for (i = 0; i < 4; i++) pxmitpriv->wmm_para_seq[i] = i; - } #ifdef CONFIG_USB_HCI - pxmitpriv->txirp_cnt=1; + pxmitpriv->txirp_cnt = 1; _rtw_init_sema(&(pxmitpriv->tx_retevt), 0); - //per AC pending irp + /* per AC pending irp */ pxmitpriv->beq_cnt = 0; pxmitpriv->bkq_cnt = 0; pxmitpriv->viq_cnt = 0; @@ -322,20 +311,19 @@ _func_enter_; #ifdef CONFIG_XMIT_ACK pxmitpriv->ack_tx = _FALSE; _rtw_mutex_init(&pxmitpriv->ack_tx_mutex); - rtw_sctx_init(&pxmitpriv->ack_tx_ops, 0); + rtw_sctx_init(&pxmitpriv->ack_tx_ops, 0); #endif rtw_hal_init_xmit_priv(padapter); exit: -_func_exit_; return res; } -void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv); -void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv) +void rtw_mfree_xmit_priv_lock(struct xmit_priv *pxmitpriv); +void rtw_mfree_xmit_priv_lock(struct xmit_priv *pxmitpriv) { _rtw_spinlock_free(&pxmitpriv->lock); _rtw_free_sema(&pxmitpriv->xmit_sema); @@ -347,8 +335,8 @@ void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv) _rtw_spinlock_free(&pxmitpriv->vo_pending.lock); _rtw_spinlock_free(&pxmitpriv->bm_pending.lock); - //_rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock); - //_rtw_spinlock_free(&pxmitpriv->apsd_queue.lock); + /* _rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock); */ + /* _rtw_spinlock_free(&pxmitpriv->apsd_queue.lock); */ _rtw_spinlock_free(&pxmitpriv->free_xmit_queue.lock); _rtw_spinlock_free(&pxmitpriv->free_xmitbuf_queue.lock); @@ -356,48 +344,43 @@ void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv) } -void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv) +void _rtw_free_xmit_priv(struct xmit_priv *pxmitpriv) { - int i; - _adapter *padapter = pxmitpriv->adapter; - struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf; + int i; + _adapter *padapter = pxmitpriv->adapter; + struct xmit_frame *pxmitframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf; struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf; - - _func_enter_; + rtw_hal_free_xmit_priv(padapter); - + rtw_mfree_xmit_priv_lock(pxmitpriv); - - if(pxmitpriv->pxmit_frame_buf==NULL) + + if (pxmitpriv->pxmit_frame_buf == NULL) goto out; - - for(i=0; ipallocated_frame_buf) { + if (pxmitpriv->pallocated_frame_buf) rtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4); - } - - if(pxmitpriv->pallocated_xmitbuf) { + + if (pxmitpriv->pallocated_xmitbuf) rtw_vmfree(pxmitpriv->pallocated_xmitbuf, NR_XMITBUFF * sizeof(struct xmit_buf) + 4); - } - /* free xframe_ext queue, the same count as extbuf */ - if ((pxmitframe = (struct xmit_frame*)pxmitpriv->xframe_ext)) { - for (i=0; ixframe_ext)) { + for (i = 0; i < NR_XMIT_EXTBUFF; i++) { rtw_os_xmit_complete(padapter, pxmitframe); pxmitframe++; } @@ -406,66 +389,335 @@ void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv) rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4); _rtw_spinlock_free(&pxmitpriv->free_xframe_ext_queue.lock); - // free xmit extension buff + /* free xmit extension buff */ _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock); pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; - for(i=0; ipallocated_xmit_extbuf) { + if (pxmitpriv->pallocated_xmit_extbuf) rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4); - } - for (i=0; ipcmd_xmitbuf[i]; - if(pxmitbuf!=NULL) - rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE); + if (pxmitbuf != NULL) + rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ + XMITBUF_ALIGN_SZ , _TRUE); } rtw_free_hwxmits(padapter); -#ifdef CONFIG_XMIT_ACK - _rtw_mutex_free(&pxmitpriv->ack_tx_mutex); -#endif - -out: - -_func_exit_; +#ifdef CONFIG_XMIT_ACK + _rtw_mutex_free(&pxmitpriv->ack_tx_mutex); +#endif +out: + return; } -u8 query_ra_short_GI(struct sta_info *psta) +u8 rtw_get_tx_bw_mode(_adapter *adapter, struct sta_info *sta) +{ + u8 bw; + + bw = sta->bw_mode; + if (MLME_STATE(adapter) & WIFI_ASOC_STATE) { + if (adapter->mlmeextpriv.cur_channel <= 14) + bw = rtw_min(bw, ADAPTER_TX_BW_2G(adapter)); + else + bw = rtw_min(bw, ADAPTER_TX_BW_5G(adapter)); + } + + return bw; +} + +void rtw_get_adapter_tx_rate_bmp_by_bw(_adapter *adapter, u8 bw, u16 *r_bmp_cck_ofdm, u32 *r_bmp_ht, u32 *r_bmp_vht) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; + u8 fix_bw = 0xFF; + u16 bmp_cck_ofdm = 0; + u32 bmp_ht = 0; + u32 bmp_vht = 0; + int i; + + if (adapter->fix_rate != 0xFF && adapter->fix_bw != 0xFF) + fix_bw = adapter->fix_bw; + + /* TODO: adapter->fix_rate */ + + for (i = 0; i < macid_ctl->num; i++) { + if (!rtw_macid_is_used(macid_ctl, i)) + continue; + if (rtw_macid_get_if_g(macid_ctl, i) != adapter->iface_id) + continue; + + if (bw == CHANNEL_WIDTH_20) /* CCK, OFDM always 20MHz */ + bmp_cck_ofdm |= macid_ctl->rate_bmp0[i] & 0x00000FFF; + + /* bypass mismatch bandwidth for HT, VHT */ + if ((fix_bw != 0xFF && fix_bw != bw) || (fix_bw == 0xFF && macid_ctl->bw[i] != bw)) + continue; + + if (macid_ctl->vht_en[i]) + bmp_vht |= (macid_ctl->rate_bmp0[i] >> 12) | (macid_ctl->rate_bmp1[i] << 20); + else + bmp_ht |= (macid_ctl->rate_bmp0[i] >> 12) | (macid_ctl->rate_bmp1[i] << 20); + } + + /* TODO: mlmeext->tx_rate*/ + +exit: + if (r_bmp_cck_ofdm) + *r_bmp_cck_ofdm = bmp_cck_ofdm; + if (r_bmp_ht) + *r_bmp_ht = bmp_ht; + if (r_bmp_vht) + *r_bmp_vht = bmp_vht; +} + +void rtw_get_shared_macid_tx_rate_bmp_by_bw(struct dvobj_priv *dvobj, u8 bw, u16 *r_bmp_cck_ofdm, u32 *r_bmp_ht, u32 *r_bmp_vht) +{ + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + u16 bmp_cck_ofdm = 0; + u32 bmp_ht = 0; + u32 bmp_vht = 0; + int i; + + for (i = 0; i < macid_ctl->num; i++) { + if (!rtw_macid_is_used(macid_ctl, i)) + continue; + if (rtw_macid_get_if_g(macid_ctl, i) != -1) + continue; + + if (bw == CHANNEL_WIDTH_20) /* CCK, OFDM always 20MHz */ + bmp_cck_ofdm |= macid_ctl->rate_bmp0[i] & 0x00000FFF; + + /* bypass mismatch bandwidth for HT, VHT */ + if (macid_ctl->bw[i] != bw) + continue; + + if (macid_ctl->vht_en[i]) + bmp_vht |= (macid_ctl->rate_bmp0[i] >> 12) | (macid_ctl->rate_bmp1[i] << 20); + else + bmp_ht |= (macid_ctl->rate_bmp0[i] >> 12) | (macid_ctl->rate_bmp1[i] << 20); + } + + if (r_bmp_cck_ofdm) + *r_bmp_cck_ofdm = bmp_cck_ofdm; + if (r_bmp_ht) + *r_bmp_ht = bmp_ht; + if (r_bmp_vht) + *r_bmp_vht = bmp_vht; +} + +void rtw_update_tx_rate_bmp(struct dvobj_priv *dvobj) +{ + struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj); + _adapter *adapter = dvobj_get_primary_adapter(dvobj); + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); + u8 bw; + u16 bmp_cck_ofdm, tmp_cck_ofdm; + u32 bmp_ht, tmp_ht, ori_bmp_ht[2]; + u8 ori_highest_ht_rate_bw_bmp; + u32 bmp_vht, tmp_vht, ori_bmp_vht[4]; + u8 ori_highest_vht_rate_bw_bmp; + int i; + + /* backup the original ht & vht highest bw bmp */ + ori_highest_ht_rate_bw_bmp = rf_ctl->highest_ht_rate_bw_bmp; + ori_highest_vht_rate_bw_bmp = rf_ctl->highest_vht_rate_bw_bmp; + + for (bw = CHANNEL_WIDTH_20; bw <= CHANNEL_WIDTH_160; bw++) { + /* backup the original ht & vht bmp */ + if (bw <= CHANNEL_WIDTH_40) + ori_bmp_ht[bw] = rf_ctl->rate_bmp_ht_by_bw[bw]; + if (bw <= CHANNEL_WIDTH_160) + ori_bmp_vht[bw] = rf_ctl->rate_bmp_vht_by_bw[bw]; + + bmp_cck_ofdm = bmp_ht = bmp_vht = 0; + if (hal_is_bw_support(dvobj_get_primary_adapter(dvobj), bw)) { + for (i = 0; i < dvobj->iface_nums; i++) { + if (!dvobj->padapters[i]) + continue; + rtw_get_adapter_tx_rate_bmp_by_bw(dvobj->padapters[i], bw, &tmp_cck_ofdm, &tmp_ht, &tmp_vht); + bmp_cck_ofdm |= tmp_cck_ofdm; + bmp_ht |= tmp_ht; + bmp_vht |= tmp_vht; + } + rtw_get_shared_macid_tx_rate_bmp_by_bw(dvobj, bw, &tmp_cck_ofdm, &tmp_ht, &tmp_vht); + bmp_cck_ofdm |= tmp_cck_ofdm; + bmp_ht |= tmp_ht; + bmp_vht |= tmp_vht; + } + if (bw == CHANNEL_WIDTH_20) + rf_ctl->rate_bmp_cck_ofdm = bmp_cck_ofdm; + if (bw <= CHANNEL_WIDTH_40) + rf_ctl->rate_bmp_ht_by_bw[bw] = bmp_ht; + if (bw <= CHANNEL_WIDTH_160) + rf_ctl->rate_bmp_vht_by_bw[bw] = bmp_vht; + } + +#ifndef DBG_HIGHEST_RATE_BMP_BW_CHANGE +#define DBG_HIGHEST_RATE_BMP_BW_CHANGE 0 +#endif + + { + u8 highest_rate_bw; + u8 highest_rate_bw_bmp; + u8 update_ht_rs = _FALSE; + u8 update_vht_rs = _FALSE; + + highest_rate_bw_bmp = BW_CAP_20M; + highest_rate_bw = CHANNEL_WIDTH_20; + for (bw = CHANNEL_WIDTH_20; bw <= CHANNEL_WIDTH_40; bw++) { + if (rf_ctl->rate_bmp_ht_by_bw[highest_rate_bw] < rf_ctl->rate_bmp_ht_by_bw[bw]) { + highest_rate_bw_bmp = ch_width_to_bw_cap(bw); + highest_rate_bw = bw; + } else if (rf_ctl->rate_bmp_ht_by_bw[highest_rate_bw] == rf_ctl->rate_bmp_ht_by_bw[bw]) + highest_rate_bw_bmp |= ch_width_to_bw_cap(bw); + } + rf_ctl->highest_ht_rate_bw_bmp = highest_rate_bw_bmp; + + if (ori_highest_ht_rate_bw_bmp != rf_ctl->highest_ht_rate_bw_bmp + || largest_bit(ori_bmp_ht[highest_rate_bw]) != largest_bit(rf_ctl->rate_bmp_ht_by_bw[highest_rate_bw]) + ) { + if (DBG_HIGHEST_RATE_BMP_BW_CHANGE) { + RTW_INFO("highest_ht_rate_bw_bmp:0x%02x=>0x%02x\n", ori_highest_ht_rate_bw_bmp, rf_ctl->highest_ht_rate_bw_bmp); + RTW_INFO("rate_bmp_ht_by_bw[%u]:0x%08x=>0x%08x\n", highest_rate_bw, ori_bmp_ht[highest_rate_bw], rf_ctl->rate_bmp_ht_by_bw[highest_rate_bw]); + } + update_ht_rs = _TRUE; + } + + highest_rate_bw_bmp = BW_CAP_20M; + highest_rate_bw = CHANNEL_WIDTH_20; + for (bw = CHANNEL_WIDTH_20; bw <= CHANNEL_WIDTH_160; bw++) { + if (rf_ctl->rate_bmp_vht_by_bw[highest_rate_bw] < rf_ctl->rate_bmp_vht_by_bw[bw]) { + highest_rate_bw_bmp = ch_width_to_bw_cap(bw); + highest_rate_bw = bw; + } else if (rf_ctl->rate_bmp_vht_by_bw[highest_rate_bw] == rf_ctl->rate_bmp_vht_by_bw[bw]) + highest_rate_bw_bmp |= ch_width_to_bw_cap(bw); + } + rf_ctl->highest_vht_rate_bw_bmp = highest_rate_bw_bmp; + + if (ori_highest_vht_rate_bw_bmp != rf_ctl->highest_vht_rate_bw_bmp + || largest_bit(ori_bmp_vht[highest_rate_bw]) != largest_bit(rf_ctl->rate_bmp_vht_by_bw[highest_rate_bw]) + ) { + if (DBG_HIGHEST_RATE_BMP_BW_CHANGE) { + RTW_INFO("highest_vht_rate_bw_bmp:0x%02x=>0x%02x\n", ori_highest_vht_rate_bw_bmp, rf_ctl->highest_vht_rate_bw_bmp); + RTW_INFO("rate_bmp_vht_by_bw[%u]:0x%08x=>0x%08x\n", highest_rate_bw, ori_bmp_vht[highest_rate_bw], rf_ctl->rate_bmp_vht_by_bw[highest_rate_bw]); + } + update_vht_rs = _TRUE; + } + + /* TODO: per rfpath and rate section handling? */ + if (update_ht_rs == _TRUE || update_vht_rs == _TRUE) + rtw_hal_set_tx_power_level(dvobj_get_primary_adapter(dvobj), hal_data->CurrentChannel); + } +} + +inline u16 rtw_get_tx_rate_bmp_cck_ofdm(struct dvobj_priv *dvobj) +{ + struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj); + + return rf_ctl->rate_bmp_cck_ofdm; +} + +inline u32 rtw_get_tx_rate_bmp_ht_by_bw(struct dvobj_priv *dvobj, u8 bw) +{ + struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj); + + return rf_ctl->rate_bmp_ht_by_bw[bw]; +} + +inline u32 rtw_get_tx_rate_bmp_vht_by_bw(struct dvobj_priv *dvobj, u8 bw) +{ + struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj); + + return rf_ctl->rate_bmp_vht_by_bw[bw]; +} + +u8 rtw_get_tx_bw_bmp_of_ht_rate(struct dvobj_priv *dvobj, u8 rate, u8 max_bw) +{ + struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj); + u8 bw; + u8 bw_bmp = 0; + u32 rate_bmp; + + if (!IS_HT_RATE(rate)) { + rtw_warn_on(1); + goto exit; + } + + rate_bmp = 1 << (rate - MGN_MCS0); + + if (max_bw > CHANNEL_WIDTH_40) + max_bw = CHANNEL_WIDTH_40; + + for (bw = CHANNEL_WIDTH_20; bw <= max_bw; bw++) { + /* RA may use lower rate for retry */ + if (rf_ctl->rate_bmp_ht_by_bw[bw] >= rate_bmp) + bw_bmp |= ch_width_to_bw_cap(bw); + } + +exit: + return bw_bmp; +} + +u8 rtw_get_tx_bw_bmp_of_vht_rate(struct dvobj_priv *dvobj, u8 rate, u8 max_bw) +{ + struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj); + u8 bw; + u8 bw_bmp = 0; + u32 rate_bmp; + + if (!IS_VHT_RATE(rate)) { + rtw_warn_on(1); + goto exit; + } + + rate_bmp = 1 << (rate - MGN_VHT1SS_MCS0); + + if (max_bw > CHANNEL_WIDTH_160) + max_bw = CHANNEL_WIDTH_160; + + for (bw = CHANNEL_WIDTH_20; bw <= max_bw; bw++) { + /* RA may use lower rate for retry */ + if (rf_ctl->rate_bmp_vht_by_bw[bw] >= rate_bmp) + bw_bmp |= ch_width_to_bw_cap(bw); + } + +exit: + return bw_bmp; +} + +u8 query_ra_short_GI(struct sta_info *psta, u8 bw) { u8 sgi = _FALSE, sgi_20m = _FALSE, sgi_40m = _FALSE, sgi_80m = _FALSE; #ifdef CONFIG_80211N_HT #ifdef CONFIG_80211AC_VHT - if (psta->vhtpriv.vht_option) { - sgi_80m= psta->vhtpriv.sgi_80m; - } -#endif //CONFIG_80211AC_VHT - { - sgi_20m = psta->htpriv.sgi_20m; - sgi_40m = psta->htpriv.sgi_40m; - } + if (psta->vhtpriv.vht_option) + sgi_80m = psta->vhtpriv.sgi_80m; +#endif + sgi_20m = psta->htpriv.sgi_20m; + sgi_40m = psta->htpriv.sgi_40m; #endif - switch(psta->bw_mode){ - case CHANNEL_WIDTH_80: - sgi = sgi_80m; - break; - case CHANNEL_WIDTH_40: - sgi = sgi_40m; - break; - case CHANNEL_WIDTH_20: - default: - sgi = sgi_20m; - break; + switch (bw) { + case CHANNEL_WIDTH_80: + sgi = sgi_80m; + break; + case CHANNEL_WIDTH_40: + sgi = sgi_40m; + break; + case CHANNEL_WIDTH_20: + default: + sgi = sgi_20m; + break; } return sgi; @@ -475,127 +727,107 @@ static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitf { u32 sz; struct pkt_attrib *pattrib = &pxmitframe->attrib; - //struct sta_info *psta = pattrib->psta; + /* struct sta_info *psta = pattrib->psta; */ struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -/* - if(pattrib->psta) - { - psta = pattrib->psta; - } - else - { - DBG_871X("%s, call rtw_get_stainfo()\n", __func__); - psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); - } - - if(psta==NULL) - { - DBG_871X("%s, psta==NUL\n", __func__); - return; - } - - if(!(psta->state &_FW_LINKED)) - { - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); - return; - } -*/ - - if (pattrib->nr_frags != 1) - { - sz = padapter->xmitpriv.frag_len; - } - else //no frag - { - sz = pattrib->last_txcmdsz; - } - - // (1) RTS_Threshold is compared to the MPDU, not MSDU. - // (2) If there are more than one frag in this MSDU, only the first frag uses protection frame. - // Other fragments are protected by previous fragment. - // So we only need to check the length of first fragment. - if(pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec) - { - if(sz > padapter->registrypriv.rts_thresh) + /* + if(pattrib->psta) { - pattrib->vcs_mode = RTS_CTS; + psta = pattrib->psta; } else { - if(pattrib->rtsen) + RTW_INFO("%s, call rtw_get_stainfo()\n", __func__); + psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); + } + + if(psta==NULL) + { + RTW_INFO("%s, psta==NUL\n", __func__); + return; + } + + if(!(psta->state &_FW_LINKED)) + { + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); + return; + } + */ + + if (pattrib->nr_frags != 1) + sz = padapter->xmitpriv.frag_len; + else /* no frag */ + sz = pattrib->last_txcmdsz; + + /* (1) RTS_Threshold is compared to the MPDU, not MSDU. */ + /* (2) If there are more than one frag in this MSDU, only the first frag uses protection frame. */ + /* Other fragments are protected by previous fragment. */ + /* So we only need to check the length of first fragment. */ + if (pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec) { + if (sz > padapter->registrypriv.rts_thresh) + pattrib->vcs_mode = RTS_CTS; + else { + if (pattrib->rtsen) pattrib->vcs_mode = RTS_CTS; - else if(pattrib->cts2self) + else if (pattrib->cts2self) pattrib->vcs_mode = CTS_TO_SELF; else pattrib->vcs_mode = NONE_VCS; } - } - else - { - while (_TRUE) - { -#if 0 //Todo - //check IOT action - if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF) - { + } else { + while (_TRUE) { +#if 0 /* Todo */ + /* check IOT action */ + if (pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF) { pattrib->vcs_mode = CTS_TO_SELF; pattrib->rts_rate = MGN_24M; break; - } - else if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE)) - { + } else if (pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS | HT_IOT_ACT_PURE_N_MODE)) { pattrib->vcs_mode = RTS_CTS; pattrib->rts_rate = MGN_24M; break; } #endif - //IOT action - if((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) && (pattrib->ampdu_en==_TRUE) && - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ )) - { + /* IOT action */ + if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) && (pattrib->ampdu_en == _TRUE) && + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) { pattrib->vcs_mode = CTS_TO_SELF; break; - } - + } - //check ERP protection - if(pattrib->rtsen || pattrib->cts2self) - { - if(pattrib->rtsen) + + /* check ERP protection */ + if (pattrib->rtsen || pattrib->cts2self) { + if (pattrib->rtsen) pattrib->vcs_mode = RTS_CTS; - else if(pattrib->cts2self) + else if (pattrib->cts2self) pattrib->vcs_mode = CTS_TO_SELF; break; } - //check HT op mode - if(pattrib->ht_en) - { + /* check HT op mode */ + if (pattrib->ht_en) { u8 HTOpMode = pmlmeinfo->HT_protection; - if((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) || - (!pmlmeext->cur_bwmode && HTOpMode == 3) ) - { + if ((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) || + (!pmlmeext->cur_bwmode && HTOpMode == 3)) { pattrib->vcs_mode = RTS_CTS; break; } } - //check rts - if(sz > padapter->registrypriv.rts_thresh) - { + /* check rts */ + if (sz > padapter->registrypriv.rts_thresh) { pattrib->vcs_mode = RTS_CTS; break; } - //to do list: check MIMO power save condition. + /* to do list: check MIMO power save condition. */ - //check AMPDU aggregation for TXOP - if((pattrib->ampdu_en==_TRUE) && (!IS_HARDWARE_TYPE_8812(padapter))) - { + /* check AMPDU aggregation for TXOP */ + if ((pattrib->ampdu_en == _TRUE) && (!IS_HARDWARE_TYPE_8812(padapter))) { pattrib->vcs_mode = RTS_CTS; break; } @@ -605,39 +837,36 @@ static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitf } } - //for debug : force driver control vrtl_carrier_sense. - if(padapter->driver_vcs_en==1) - { - //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense. - //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1. + /* for debug : force driver control vrtl_carrier_sense. */ + if (padapter->driver_vcs_en == 1) { + /* u8 driver_vcs_en; */ /* Enable=1, Disable=0 driver control vrtl_carrier_sense. */ + /* u8 driver_vcs_type; */ /* force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1. */ pattrib->vcs_mode = padapter->driver_vcs_type; - } - + } + } static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta) { struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv; + u8 bw; pattrib->rtsen = psta->rtsen; pattrib->cts2self = psta->cts2self; - + pattrib->mdata = 0; pattrib->eosp = 0; - pattrib->triggered=0; + pattrib->triggered = 0; pattrib->ampdu_spacing = 0; - - //qos_en, ht_en, init rate, ,bw, ch_offset, sgi + + /* qos_en, ht_en, init rate, ,bw, ch_offset, sgi */ pattrib->qos_en = psta->qos_option; - + pattrib->raid = psta->raid; - if (mlmeext->cur_bwmode < psta->bw_mode) - pattrib->bwmode = mlmeext->cur_bwmode; - else - pattrib->bwmode = psta->bw_mode; - - pattrib->sgi = query_ra_short_GI(psta); + bw = rtw_get_tx_bw_mode(padapter, psta); + pattrib->bwmode = rtw_min(bw, mlmeext->cur_bwmode); + pattrib->sgi = query_ra_short_GI(psta, pattrib->bwmode); pattrib->ldpc = psta->ldpc; pattrib->stbc = psta->stbc; @@ -647,27 +876,27 @@ static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattri pattrib->ch_offset = psta->htpriv.ch_offset; pattrib->ampdu_en = _FALSE; - if(padapter->driver_ampdu_spacing != 0xFF) //driver control AMPDU Density for peer sta's rx + if (padapter->driver_ampdu_spacing != 0xFF) /* driver control AMPDU Density for peer sta's rx */ pattrib->ampdu_spacing = padapter->driver_ampdu_spacing; else pattrib->ampdu_spacing = psta->htpriv.rx_ampdu_min_spacing; -#endif //CONFIG_80211N_HT - //if(pattrib->ht_en && psta->htpriv.ampdu_enable) - //{ - // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) - // pattrib->ampdu_en = _TRUE; - //} +#endif /* CONFIG_80211N_HT */ + /* if(pattrib->ht_en && psta->htpriv.ampdu_enable) */ + /* { */ + /* if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) */ + /* pattrib->ampdu_en = _TRUE; */ + /* } */ #ifdef CONFIG_TDLS - if (pattrib->direct_link==_TRUE) { + if (pattrib->direct_link == _TRUE) { psta = pattrib->ptdls_sta; pattrib->raid = psta->raid; #ifdef CONFIG_80211N_HT - pattrib->bwmode = psta->bw_mode; + pattrib->bwmode = rtw_get_tx_bw_mode(padapter, psta); pattrib->ht_en = psta->htpriv.ht_option; pattrib->ch_offset = psta->htpriv.ch_offset; - pattrib->sgi= query_ra_short_GI(psta); + pattrib->sgi = query_ra_short_GI(psta, pattrib->bwmode); #endif /* CONFIG_80211N_HT */ } #endif /* CONFIG_TDLS */ @@ -675,7 +904,7 @@ static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattri pattrib->retry_ctrl = _FALSE; #ifdef CONFIG_AUTO_AP_MODE - if(psta->isrc && psta->pid>0) + if (psta->isrc && psta->pid > 0) pattrib->pctrl = _TRUE; #endif @@ -688,57 +917,50 @@ static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib struct security_priv *psecuritypriv = &padapter->securitypriv; sint bmcast = IS_MCAST(pattrib->ra); - _rtw_memset(pattrib->dot118021x_UncstKey.skey, 0, 16); + _rtw_memset(pattrib->dot118021x_UncstKey.skey, 0, 16); _rtw_memset(pattrib->dot11tkiptxmickey.skey, 0, 16); pattrib->mac_id = psta->mac_id; - if (psta->ieee8021x_blocked == _TRUE) - { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n psta->ieee8021x_blocked == _TRUE \n")); + if (psta->ieee8021x_blocked == _TRUE) { pattrib->encrypt = 0; - if((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)) - { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npsta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n",pattrib->ether_type)); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%04x) != 0x888e\n", __FUNCTION__,pattrib->ether_type); - #endif + if ((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)) { +#ifdef DBG_TX_DROP_FRAME + RTW_INFO("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%04x) != 0x888e\n", __FUNCTION__, pattrib->ether_type); +#endif res = _FAIL; goto exit; } - } - else - { + } else { GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); - + #ifdef CONFIG_WAPI_SUPPORT - if(pattrib->ether_type == 0x88B4) - pattrib->encrypt=_NO_PRIVACY_; + if (pattrib->ether_type == 0x88B4) + pattrib->encrypt = _NO_PRIVACY_; #endif - switch(psecuritypriv->dot11AuthAlgrthm) - { - case dot11AuthAlgrthm_Open: - case dot11AuthAlgrthm_Shared: - case dot11AuthAlgrthm_Auto: - pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; - break; - case dot11AuthAlgrthm_8021X: - if(bmcast) - pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid; - else - pattrib->key_idx = 0; - break; - default: + switch (psecuritypriv->dot11AuthAlgrthm) { + case dot11AuthAlgrthm_Open: + case dot11AuthAlgrthm_Shared: + case dot11AuthAlgrthm_Auto: + pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; + break; + case dot11AuthAlgrthm_8021X: + if (bmcast) + pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid; + else pattrib->key_idx = 0; - break; + break; + default: + pattrib->key_idx = 0; + break; } - //For WPS 1.0 WEP, driver should not encrypt EAPOL Packet for WPS handshake. - if (((pattrib->encrypt ==_WEP40_)||(pattrib->encrypt ==_WEP104_)) && (pattrib->ether_type == 0x888e)) - pattrib->encrypt=_NO_PRIVACY_; - + /* For WPS 1.0 WEP, driver should not encrypt EAPOL Packet for WPS handshake. */ + if (((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) && (pattrib->ether_type == 0x888e)) + pattrib->encrypt = _NO_PRIVACY_; + } #ifdef CONFIG_TDLS @@ -746,133 +968,118 @@ static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib if (pattrib->encrypt > 0) pattrib->encrypt = _AES_; } -#endif - - switch (pattrib->encrypt) - { - case _WEP40_: - case _WEP104_: - pattrib->iv_len = 4; - pattrib->icv_len = 4; - WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - break; +#endif - case _TKIP_: - pattrib->iv_len = 8; - pattrib->icv_len = 4; + switch (pattrib->encrypt) { + case _WEP40_: + case _WEP104_: + pattrib->iv_len = 4; + pattrib->icv_len = 4; + WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + break; - if(psecuritypriv->busetkipkey==_FAIL) - { - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s psecuritypriv->busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, psecuritypriv->busetkipkey); - #endif - res =_FAIL; - goto exit; - } + case _TKIP_: + pattrib->iv_len = 8; + pattrib->icv_len = 4; - if(bmcast) - TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - TKIP_IV(pattrib->iv, psta->dot11txpn, 0); + if (psecuritypriv->busetkipkey == _FAIL) { +#ifdef DBG_TX_DROP_FRAME + RTW_INFO("DBG_TX_DROP_FRAME %s psecuritypriv->busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, psecuritypriv->busetkipkey); +#endif + res = _FAIL; + goto exit; + } + + if (bmcast) + TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + TKIP_IV(pattrib->iv, psta->dot11txpn, 0); - _rtw_memcpy(pattrib->dot11tkiptxmickey.skey, psta->dot11tkiptxmickey.skey, 16); - - break; - - case _AES_: - - pattrib->iv_len = 8; - pattrib->icv_len = 8; - - if(bmcast) - AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - AES_IV(pattrib->iv, psta->dot11txpn, 0); - - break; + _rtw_memcpy(pattrib->dot11tkiptxmickey.skey, psta->dot11tkiptxmickey.skey, 16); + + break; + + case _AES_: + + pattrib->iv_len = 8; + pattrib->icv_len = 8; + + if (bmcast) + AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + AES_IV(pattrib->iv, psta->dot11txpn, 0); + + break; #ifdef CONFIG_WAPI_SUPPORT - case _SMS4_: - pattrib->iv_len = 18; - pattrib->icv_len = 16; - rtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv); - break; + case _SMS4_: + pattrib->iv_len = 18; + pattrib->icv_len = 16; + rtw_wapi_get_iv(padapter, pattrib->ra, pattrib->iv); + break; #endif - default: - pattrib->iv_len = 0; - pattrib->icv_len = 0; - break; + default: + pattrib->iv_len = 0; + pattrib->icv_len = 0; + break; } - if(pattrib->encrypt>0) - _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16); + if (pattrib->encrypt > 0) + _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16); - RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, - ("update_attrib: encrypt=%d securitypriv.sw_encrypt=%d\n", - pattrib->encrypt, padapter->securitypriv.sw_encrypt)); if (pattrib->encrypt && - ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) - { + ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) { pattrib->bswenc = _TRUE; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_, - ("update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc=_TRUE\n", - pattrib->encrypt, padapter->securitypriv.sw_encrypt)); } else { pattrib->bswenc = _FALSE; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n")); } -#if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC) - if((pattrib->encrypt && bmcast) || (pattrib->encrypt ==_WEP40_) || (pattrib->encrypt ==_WEP104_)) - { - pattrib->bswenc = _TRUE;//force using sw enc. - } +#if defined(CONFIG_CONCURRENT_MODE) + pattrib->bmc_camid = padapter->securitypriv.dot118021x_bmc_cam_id; #endif -#ifdef DYNAMIC_CAMID_ALLOC + if (pattrib->encrypt && bmcast && _rtw_camctl_chk_flags(padapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH)) pattrib->bswenc = _TRUE; -#endif #ifdef CONFIG_WAPI_SUPPORT - if(pattrib->encrypt == _SMS4_) + if (pattrib->encrypt == _SMS4_) pattrib->bswenc = _FALSE; #endif exit: return res; - + } u8 qos_acm(u8 acm_mask, u8 priority) { u8 change_priority = priority; - switch (priority) - { - case 0: - case 3: - if(acm_mask & BIT(1)) - change_priority = 1; - break; - case 1: - case 2: - break; - case 4: - case 5: - if(acm_mask & BIT(2)) - change_priority = 0; - break; - case 6: - case 7: - if(acm_mask & BIT(3)) - change_priority = 5; - break; - default: - DBG_871X("qos_acm(): invalid pattrib->priority: %d!!!\n", priority); - break; + switch (priority) { + case 0: + case 3: + if (acm_mask & BIT(1)) + change_priority = 1; + break; + case 1: + case 2: + break; + case 4: + case 5: + if (acm_mask & BIT(2)) + change_priority = 0; + break; + case 6: + case 7: + if (acm_mask & BIT(3)) + change_priority = 5; + break; + default: + RTW_INFO("qos_acm(): invalid pattrib->priority: %d!!!\n", priority); + break; } return change_priority; @@ -886,21 +1093,21 @@ static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib) _rtw_open_pktfile(ppktfile->pkt, ppktfile); - _rtw_pktfile_read(ppktfile, (unsigned char*)ðerhdr, ETH_HLEN); + _rtw_pktfile_read(ppktfile, (unsigned char *)ðerhdr, ETH_HLEN); - // get UserPriority from IP hdr + /* get UserPriority from IP hdr */ if (pattrib->ether_type == 0x0800) { - _rtw_pktfile_read(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr)); -// UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3; + _rtw_pktfile_read(ppktfile, (u8 *)&ip_hdr, sizeof(ip_hdr)); + /* UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3; */ UserPriority = ip_hdr.tos >> 5; } -/* - else if (pattrib->ether_type == 0x888e) { - // "When priority processing of data frames is supported, - // a STA's SME should send EAPOL-Key frames at the highest priority." - UserPriority = 7; - } -*/ + /* + else if (pattrib->ether_type == 0x888e) { + + + UserPriority = 7; + } + */ pattrib->priority = UserPriority; pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; pattrib->subtype = WIFI_QOS_DATA_TYPE; @@ -915,25 +1122,24 @@ u8 rtw_check_tdls_established(_adapter *padapter, struct pkt_attrib *pattrib) 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)); + if ((pattrib->ptdls_sta != NULL) && + (pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) && + (pattrib->ether_type != 0x0806)) { + pattrib->direct_link = _TRUE; + /* RTW_INFO("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 + pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) { + pattrib->direct_link = _TRUE; +#if 0 + RTW_INFO("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; - } + if (pattrib->ether_type != 0x0806) + pattrib->direct_link = _FALSE; #endif } @@ -947,36 +1153,35 @@ s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) struct sta_priv *pstapriv = &padapter->stapriv; struct security_priv *psecuritypriv = &padapter->securitypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv= &pmlmepriv->qospriv; + struct qos_priv *pqospriv = &pmlmepriv->qospriv; + + s32 res = _SUCCESS; - s32 res=_SUCCESS; - psta = rtw_get_stainfo(pstapriv, pattrib->ra); - if (psta == NULL) { - res =_FAIL; + if (psta == NULL) { + res = _FAIL; goto exit; } pattrib->mac_id = psta->mac_id; pattrib->psta = psta; pattrib->ack_policy = 0; - // get ether_hdr_len + /* get ether_hdr_len */ pattrib->pkt_hdrlen = ETH_HLEN; - // [TDLS] TODO: setup req/rsp should be AC_BK + /* [TDLS] TODO: setup req/rsp should be AC_BK */ if (pqospriv->qos_option && psta->qos_option) { - pattrib->priority = 4; //tdls management frame should be AC_VI + pattrib->priority = 4; /* tdls management frame should be AC_VI */ pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; pattrib->subtype = WIFI_QOS_DATA_TYPE; } else { pattrib->priority = 0; pattrib->hdrlen = WLAN_HDR_A3_LEN; - pattrib->subtype = WIFI_DATA_TYPE; + pattrib->subtype = WIFI_DATA_TYPE; } - //TODO:_lock - if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL) - { + /* TODO:_lock */ + if (update_attrib_sec_info(padapter, pattrib, psta) == _FAIL) { res = _FAIL; goto exit; } @@ -989,18 +1194,18 @@ exit: return res; } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ -//get non-qos hw_ssn control register,mapping to REG_HW_SEQ0,1,2,3 +/*get non-qos hw_ssn control register,mapping to REG_HW_SEQ0,1,2,3*/ inline u8 rtw_get_hwseq_no(_adapter *padapter) { u8 hwseq_num = 0; #ifdef CONFIG_CONCURRENT_MODE - if(padapter->adapter_type == SECONDARY_ADAPTER) + if (padapter->adapter_type != PRIMARY_ADAPTER) hwseq_num = 1; - //else - // hwseq_num = 2; -#endif //CONFIG_CONCURRENT_MODE + /* else */ + /* hwseq_num = 2; */ +#endif /* CONFIG_CONCURRENT_MODE */ return hwseq_num; } static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib) @@ -1014,16 +1219,15 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr struct sta_priv *pstapriv = &padapter->stapriv; struct security_priv *psecuritypriv = &padapter->securitypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv= &pmlmepriv->qospriv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct qos_priv *pqospriv = &pmlmepriv->qospriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; sint res = _SUCCESS; - _func_enter_; DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib); _rtw_open_pktfile(pkt, &pktfile); - i = _rtw_pktfile_read(&pktfile, (u8*)ðerhdr, ETH_HLEN); + i = _rtw_pktfile_read(&pktfile, (u8 *)ðerhdr, ETH_HLEN); pattrib->ether_type = ntohs(etherhdr.h_proto); @@ -1033,155 +1237,160 @@ 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)) { + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { _rtw_memcpy(pattrib->ra, pattrib->dst, 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)) { + } 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->ra, get_bssid(pmlmepriv), 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)) { + } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN); DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap); - } - else + } else DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown); + bmcast = IS_MCAST(pattrib->ra); + if (bmcast) { + psta = rtw_get_bcmc_stainfo(padapter); + if (psta == NULL) { /* if we cannot get psta => drop the pkt */ + DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta); +#ifdef DBG_TX_DROP_FRAME + RTW_INFO("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __func__, MAC_ARG(pattrib->ra)); +#endif + res = _FAIL; + goto exit; + } + } else { + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + if (psta == NULL) { /* if we cannot get psta => drop the pkt */ + DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta); +#ifdef DBG_TX_DROP_FRAME + RTW_INFO("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __func__, MAC_ARG(pattrib->ra)); +#endif + res = _FAIL; + goto exit; + } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE && !(psta->state & _FW_LINKED)) { + DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link); + res = _FAIL; + goto exit; + } + } + + if (!(psta->state & _FW_LINKED)) { + DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link); + RTW_INFO("%s-"ADPT_FMT" psta("MAC_FMT")->state(0x%x) != _FW_LINKED\n", __func__, ADPT_ARG(padapter), MAC_ARG(psta->hwaddr), psta->state); + res = _FAIL; + goto exit; + } + pattrib->pktlen = pktfile.pkt_len; - if (ETH_P_IP == pattrib->ether_type) - { - // The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time - // to prevent DHCP protocol fail + /* TODO: 802.1Q VLAN header */ + /* TODO: IPV6 */ - u8 tmp[24]; - - _rtw_pktfile_read(&pktfile, &tmp[0], 24); + if (ETH_P_IP == pattrib->ether_type) { + u8 ip[20]; + _rtw_pktfile_read(&pktfile, ip, 20); + + if (GET_IPV4_IHL(ip) * 4 > 20) + _rtw_pktfile_read(&pktfile, NULL, GET_IPV4_IHL(ip) - 20); + + pattrib->icmp_pkt = 0; pattrib->dhcp_pkt = 0; - if (pktfile.pkt_len > 282) {//MINIMUM_DHCP_PACKET_SIZE) { - if (ETH_P_IP == pattrib->ether_type) {// IP header - if (((tmp[21] == 68) && (tmp[23] == 67)) || - ((tmp[21] == 67) && (tmp[23] == 68))) { - // 68 : UDP BOOTP client - // 67 : UDP BOOTP server - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("======================update_attrib: get DHCP Packet \n")); - // Use low rate to send DHCP packet. - //if(pMgntInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom) - //{ - // tcb_desc->DataRate = MgntQuery_TxRateExcludeCCKRates(ieee);//0xc;//ofdm 6m - // tcb_desc->bTxDisableRateFallBack = false; - //} - //else - // pTcb->DataRate = Adapter->MgntInfo.LowestBasicRate; - //RTPRINT(FDM, WA_IOT, ("DHCP TranslateHeader(), pTcb->DataRate = 0x%x\n", pTcb->DataRate)); + + if (GET_IPV4_PROTOCOL(ip) == 0x01) { /* ICMP */ + pattrib->icmp_pkt = 1; + DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp); + + } else if (GET_IPV4_PROTOCOL(ip) == 0x11) { /* UDP */ + u8 udp[8]; + + _rtw_pktfile_read(&pktfile, udp, 8); + + if ((GET_UDP_SRC(udp) == 68 && GET_UDP_DST(udp) == 67) + || (GET_UDP_SRC(udp) == 67 && GET_UDP_DST(udp) == 68) + ) { + /* 67 : UDP BOOTP server, 68 : UDP BOOTP client */ + if (pattrib->pktlen > 282) { /* MINIMUM_DHCP_PACKET_SIZE */ pattrib->dhcp_pkt = 1; DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_dhcp); + if (0) + RTW_INFO("send DHCP packet\n"); + } + } + + } else if (GET_IPV4_PROTOCOL(ip) == 0x06 /* TCP */ + && rtw_st_ctl_chk_reg_s_proto(&psta->st_ctl, 0x06) == _TRUE + ) { + u8 tcp[20]; + + _rtw_pktfile_read(&pktfile, tcp, 20); + + if (rtw_st_ctl_chk_reg_rule(&psta->st_ctl, padapter, IPV4_SRC(ip), TCP_SRC(tcp), IPV4_DST(ip), TCP_DST(tcp)) == _TRUE) { + if (GET_TCP_SYN(tcp) && GET_TCP_ACK(tcp)) { + session_tracker_add_cmd(padapter, psta + , IPV4_SRC(ip), TCP_SRC(tcp) + , IPV4_SRC(ip), TCP_DST(tcp)); + if (DBG_SESSION_TRACKER) + RTW_INFO(FUNC_ADPT_FMT" local:"IP_FMT":"PORT_FMT", remote:"IP_FMT":"PORT_FMT" SYN-ACK\n" + , FUNC_ADPT_ARG(padapter) + , IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp)) + , IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp))); + } + if (GET_TCP_FIN(tcp)) { + session_tracker_del_cmd(padapter, psta + , IPV4_SRC(ip), TCP_SRC(tcp) + , IPV4_SRC(ip), TCP_DST(tcp)); + if (DBG_SESSION_TRACKER) + RTW_INFO(FUNC_ADPT_FMT" local:"IP_FMT":"PORT_FMT", remote:"IP_FMT":"PORT_FMT" FIN\n" + , FUNC_ADPT_ARG(padapter) + , IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp)) + , IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp))); } } } - //for parsing ICMP pakcets - { - struct iphdr *piphdr = (struct iphdr *)tmp; + } else if (0x888e == pattrib->ether_type) + RTW_PRINT("send eapol packet\n"); - pattrib->icmp_pkt = 0; - if(piphdr->protocol == 0x1) // protocol type in ip header 0x1 is ICMP - { - pattrib->icmp_pkt = 1; - DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp); - } - } - - - } else if (0x888e == pattrib->ether_type) { - DBG_871X_LEVEL(_drv_always_, "send eapol packet\n"); - } - - if ( (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) - { - rtw_set_scan_deny(padapter, 3000); - } + if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1)) + rtw_mi_set_scan_deny(padapter, 3000); #ifdef CONFIG_LPS - // If EAPOL , ARP , OR DHCP packet, driver must be in active mode. + /* If EAPOL , ARP , OR DHCP packet, driver must be in active mode. */ #ifdef CONFIG_WAPI_SUPPORT - if ( (pattrib->ether_type == 0x88B4) || (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) -#else //!CONFIG_WAPI_SUPPORT + if ((pattrib->ether_type == 0x88B4) || (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1)) +#else /* !CONFIG_WAPI_SUPPORT */ #if 0 - if ( (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) -#else // only ICMP/DHCP packets is as SPECIAL_PACKET, and leave LPS when tx IMCP/DHCP packets. - //if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) - if (pattrib->icmp_pkt==1) - { + if ((pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1)) +#else /* only ICMP/DHCP packets is as SPECIAL_PACKET, and leave LPS when tx IMCP/DHCP packets. */ + /* if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) */ + if (pattrib->icmp_pkt == 1) rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1); - } - else if(pattrib->dhcp_pkt==1) -#endif + else if (pattrib->dhcp_pkt == 1) +#endif #endif { DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_active); rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1); } -#endif //CONFIG_LPS +#endif /* CONFIG_LPS */ - bmcast = IS_MCAST(pattrib->ra); - - // get sta_info - if (bmcast) { - psta = rtw_get_bcmc_stainfo(padapter); - } else { - psta = rtw_get_stainfo(pstapriv, pattrib->ra); - if (psta == NULL) { // if we cannot get psta => drop the pkt - DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta); - RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra))); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra)); - #endif - res =_FAIL; - goto exit; - } - else if((check_fwstate(pmlmepriv, WIFI_AP_STATE)==_TRUE)&&(!(psta->state & _FW_LINKED))) - { - DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link); - res =_FAIL; - goto exit; - } - } - - if(psta == NULL) - { // if we cannot get psta => drop the pkt - DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta); - RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra))); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra)); - #endif - res = _FAIL; - goto exit; - } - - if(!(psta->state &_FW_LINKED)) - { - DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link); - DBG_871X("%s, psta("MAC_FMT")->state(0x%x) != _FW_LINKED\n", __func__, MAC_ARG(psta->hwaddr), psta->state); - return _FAIL; - } #ifdef CONFIG_BEAMFORMING update_attrib_txbf_info(padapter, pattrib, psta); #endif - //TODO:_lock - if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL) - { + /* TODO:_lock */ + if (update_attrib_sec_info(padapter, pattrib, psta) == _FAIL) { DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sec); res = _FAIL; goto exit; @@ -1189,33 +1398,30 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr update_attrib_phy_info(padapter, pattrib, psta); - //DBG_8192C("%s ==> mac_id(%d)\n",__FUNCTION__,pattrib->mac_id ); - + /* RTW_INFO("%s ==> mac_id(%d)\n",__FUNCTION__,pattrib->mac_id ); */ + pattrib->psta = psta; - //TODO:_unlock - - pattrib->pctrl = 0; - + /* TODO:_unlock */ + + pattrib->pctrl = 0; + pattrib->ack_policy = 0; - // get ether_hdr_len - pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag + /* get ether_hdr_len */ + pattrib->pkt_hdrlen = ETH_HLEN;/* (pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; */ /* vlan tag */ pattrib->hdrlen = WLAN_HDR_A3_LEN; - pattrib->subtype = WIFI_DATA_TYPE; + pattrib->subtype = WIFI_DATA_TYPE; pattrib->priority = 0; - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) - { - if(pattrib->qos_en) + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE | WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) { + if (pattrib->qos_en) set_qos(&pktfile, pattrib); - } - else - { + } else { #ifdef CONFIG_TDLS if (pattrib->direct_link == _TRUE) { if (pattrib->qos_en) set_qos(&pktfile, pattrib); - } else + } else #endif { if (pqospriv->qos_option) { @@ -1227,183 +1433,160 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr } } - //pattrib->priority = 5; //force to used VI queue, for testing + /* pattrib->priority = 5; */ /* force to used VI queue, for testing */ pattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no; rtw_set_tx_chksum_offload(pkt, pattrib); exit: -_func_exit_; return res; } -static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe){ - sint curfragnum,length; - u8 *pframe, *payload,mic[8]; +static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + sint curfragnum, length; + u8 *pframe, *payload, mic[8]; struct mic_data micdata; - //struct sta_info *stainfo; - struct qos_priv *pqospriv= &(padapter->mlmepriv.qospriv); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; - u8 priority[4]={0x0,0x0,0x0,0x0}; + /* struct sta_info *stainfo; */ + struct qos_priv *pqospriv = &(padapter->mlmepriv.qospriv); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + u8 priority[4] = {0x0, 0x0, 0x0, 0x0}; u8 hw_hdr_offset = 0; sint bmcst = IS_MCAST(pattrib->ra); -/* - if(pattrib->psta) - { - stainfo = pattrib->psta; - } - else - { - DBG_871X("%s, call rtw_get_stainfo()\n", __func__); - stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]); - } - - if(stainfo==NULL) - { - DBG_871X("%s, psta==NUL\n", __func__); - return _FAIL; - } + /* + if(pattrib->psta) + { + stainfo = pattrib->psta; + } + else + { + RTW_INFO("%s, call rtw_get_stainfo()\n", __func__); + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]); + } - if(!(stainfo->state &_FW_LINKED)) - { - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state); - return _FAIL; - } -*/ + if(stainfo==NULL) + { + RTW_INFO("%s, psta==NUL\n", __func__); + return _FAIL; + } + + if(!(stainfo->state &_FW_LINKED)) + { + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state); + return _FAIL; + } + */ -_func_enter_; #ifdef CONFIG_USB_TX_AGGREGATION - hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);; + hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);; +#else +#ifdef CONFIG_TX_EARLY_MODE + hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE; #else - #ifdef CONFIG_TX_EARLY_MODE - hw_hdr_offset = TXDESC_OFFSET+ EARLY_MODE_INFO_SIZE; - #else hw_hdr_offset = TXDESC_OFFSET; - #endif -#endif - - if(pattrib->encrypt ==_TKIP_)//if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_) - { - //encode mic code - //if(stainfo!= NULL) +#endif +#endif + + if (pattrib->encrypt == _TKIP_) { /* if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_) */ + /* encode mic code */ + /* if(stainfo!= NULL) */ { - u8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; + u8 null_key[16] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; pframe = pxmitframe->buf_addr + hw_hdr_offset; - - if(bmcst) - { - if(_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)==_TRUE){ - //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); - //rtw_msleep_os(10); - return _FAIL; - } - //start to calculate the mic code - rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey); - } - else - { - if(_rtw_memcmp(&pattrib->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){ - //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); - //rtw_msleep_os(10); + + if (bmcst) { + if (_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16) == _TRUE) { + /* DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); */ + /* rtw_msleep_os(10); */ return _FAIL; } - //start to calculate the mic code + /* start to calculate the mic code */ + rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey); + } else { + if (_rtw_memcmp(&pattrib->dot11tkiptxmickey.skey[0], null_key, 16) == _TRUE) { + /* DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); */ + /* rtw_msleep_os(10); */ + return _FAIL; + } + /* start to calculate the mic code */ rtw_secmicsetkey(&micdata, &pattrib->dot11tkiptxmickey.skey[0]); } - - if(pframe[1]&1){ //ToDS==1 - rtw_secmicappend(&micdata, &pframe[16], 6); //DA - if(pframe[1]&2) //From Ds==1 + + if (pframe[1] & 1) { /* ToDS==1 */ + rtw_secmicappend(&micdata, &pframe[16], 6); /* DA */ + if (pframe[1] & 2) /* From Ds==1 */ rtw_secmicappend(&micdata, &pframe[24], 6); else - rtw_secmicappend(&micdata, &pframe[10], 6); - } - else{ //ToDS==0 - rtw_secmicappend(&micdata, &pframe[4], 6); //DA - if(pframe[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &pframe[10], 6); + } else { /* ToDS==0 */ + rtw_secmicappend(&micdata, &pframe[4], 6); /* DA */ + if (pframe[1] & 2) /* From Ds==1 */ rtw_secmicappend(&micdata, &pframe[16], 6); else rtw_secmicappend(&micdata, &pframe[10], 6); } - //if(pqospriv->qos_option==1) - if(pattrib->qos_en) - priority[0]=(u8)pxmitframe->attrib.priority; + /* if(pqospriv->qos_option==1) */ + if (pattrib->qos_en) + priority[0] = (u8)pxmitframe->attrib.priority; + - rtw_secmicappend(&micdata, &priority[0], 4); - - payload=pframe; - for(curfragnum=0;curfragnumnr_frags;curfragnum++){ - payload=(u8 *)RND4((SIZE_PTR)(payload)); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("===curfragnum=%d, pframe= 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,!!!\n", - curfragnum,*payload, *(payload+1),*(payload+2),*(payload+3),*(payload+4),*(payload+5),*(payload+6),*(payload+7))); + payload = pframe; - payload=payload+pattrib->hdrlen+pattrib->iv_len; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d",curfragnum,pattrib->hdrlen,pattrib->iv_len)); - if((curfragnum+1)==pattrib->nr_frags){ - length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0); - rtw_secmicappend(&micdata, payload,length); - payload=payload+length; - } - else{ - length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0); + for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { + payload = (u8 *)RND4((SIZE_PTR)(payload)); + + payload = payload + pattrib->hdrlen + pattrib->iv_len; + if ((curfragnum + 1) == pattrib->nr_frags) { + length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - ((pattrib->bswenc) ? pattrib->icv_len : 0); rtw_secmicappend(&micdata, payload, length); - payload=payload+length+pattrib->icv_len; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d length=%d pattrib->icv_len=%d",curfragnum,length,pattrib->icv_len)); + payload = payload + length; + } else { + length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - ((pattrib->bswenc) ? pattrib->icv_len : 0); + rtw_secmicappend(&micdata, payload, length); + payload = payload + length + pattrib->icv_len; } } - rtw_secgetmic(&micdata,&(mic[0])); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: before add mic code!!!\n")); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\n",pattrib->last_txcmdsz)); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: mic[0]=0x%.2x ,mic[1]=0x%.2x ,mic[2]=0x%.2x ,mic[3]=0x%.2x \n\ - mic[4]=0x%.2x ,mic[5]=0x%.2x ,mic[6]=0x%.2x ,mic[7]=0x%.2x !!!!\n", - mic[0],mic[1],mic[2],mic[3],mic[4],mic[5],mic[6],mic[7])); - //add mic code and add the mic code length in last_txcmdsz + rtw_secgetmic(&micdata, &(mic[0])); + /* add mic code and add the mic code length in last_txcmdsz */ - _rtw_memcpy(payload, &(mic[0]),8); - pattrib->last_txcmdsz+=8; - - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("\n ========last pkt========\n")); - payload=payload-pattrib->last_txcmdsz+8; - for(curfragnum=0;curfragnumlast_txcmdsz;curfragnum=curfragnum+8) - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(" %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x ", - *(payload+curfragnum), *(payload+curfragnum+1), *(payload+curfragnum+2),*(payload+curfragnum+3), - *(payload+curfragnum+4),*(payload+curfragnum+5),*(payload+curfragnum+6),*(payload+curfragnum+7))); - } -/* - else{ - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: rtw_get_stainfo==NULL!!!\n")); - } -*/ + _rtw_memcpy(payload, &(mic[0]), 8); + pattrib->last_txcmdsz += 8; + + payload = payload - pattrib->last_txcmdsz + 8; + } } - -_func_exit_; + return _SUCCESS; } -static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe){ +/*#define DBG_TX_SW_ENCRYPTOR*/ - struct pkt_attrib *pattrib = &pxmitframe->attrib; - //struct security_priv *psecuritypriv=&padapter->securitypriv; - -_func_enter_; +static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe) +{ - //if((psecuritypriv->sw_encrypt)||(pattrib->bswenc)) - if(pattrib->bswenc) - { - //DBG_871X("start xmitframe_swencrypt\n"); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_alert_,("### xmitframe_swencrypt\n")); - switch(pattrib->encrypt){ + struct pkt_attrib *pattrib = &pxmitframe->attrib; + /* struct security_priv *psecuritypriv=&padapter->securitypriv; */ + + + /* if((psecuritypriv->sw_encrypt)||(pattrib->bswenc)) */ + if (pattrib->bswenc) { +#ifdef DBG_TX_SW_ENCRYPTOR + RTW_INFO(ADPT_FMT" - sec_type:%s DO SW encryption\n", + ADPT_ARG(padapter), security_type_str(pattrib->encrypt)); +#endif + + switch (pattrib->encrypt) { case _WEP40_: case _WEP104_: rtw_wep_encrypt(padapter, (u8 *)pxmitframe); @@ -1412,26 +1595,23 @@ _func_enter_; rtw_tkip_encrypt(padapter, (u8 *)pxmitframe); break; case _AES_: - rtw_aes_encrypt(padapter, (u8 * )pxmitframe); + rtw_aes_encrypt(padapter, (u8 *)pxmitframe); break; #ifdef CONFIG_WAPI_SUPPORT case _SMS4_: - rtw_sms4_encrypt(padapter, (u8 * )pxmitframe); + rtw_sms4_encrypt(padapter, (u8 *)pxmitframe); #endif default: - break; + break; } - } else { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_notice_,("### xmitframe_hwencrypt\n")); } -_func_exit_; return _SUCCESS; } -s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib) +s32 rtw_make_wlanhdr(_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib) { u16 *qc; @@ -1442,98 +1622,90 @@ s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib) sint res = _SUCCESS; u16 *fctrl = &pwlanhdr->frame_ctl; - //struct sta_info *psta; + /* struct sta_info *psta; */ - //sint bmcst = IS_MCAST(pattrib->ra); + /* sint bmcst = IS_MCAST(pattrib->ra); */ -_func_enter_; -/* - psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - if(pattrib->psta != psta) - { - DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); - return; - } + /* + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + if(pattrib->psta != psta) + { + RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); + return; + } - if(psta==NULL) - { - DBG_871X("%s, psta==NUL\n", __func__); - return _FAIL; - } + if(psta==NULL) + { + RTW_INFO("%s, psta==NUL\n", __func__); + return _FAIL; + } - if(!(psta->state &_FW_LINKED)) - { - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); - return _FAIL; - } -*/ + if(!(psta->state &_FW_LINKED)) + { + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); + return _FAIL; + } + */ _rtw_memset(hdr, 0, WLANHDR_OFFSET); SetFrameSubType(fctrl, pattrib->subtype); - if (pattrib->subtype & WIFI_DATA_TYPE) - { + if (pattrib->subtype & WIFI_DATA_TYPE) { if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) { #ifdef CONFIG_TDLS - if(pattrib->direct_link == _TRUE){ - //TDLS data transfer, ToDS=0, FrDs=0 + if (pattrib->direct_link == _TRUE) { + /* TDLS data transfer, ToDS=0, FrDs=0 */ _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 + } else +#endif /* CONFIG_TDLS */ { - //to_ds = 1, fr_ds = 0; - // 1.Data transfer to AP - // 2.Arp pkt will relayed by AP - SetToDs(fctrl); + /* to_ds = 1, fr_ds = 0; */ + /* 1.Data transfer to AP */ + /* 2.Arp pkt will relayed by AP */ + SetToDs(fctrl); _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); if (pqospriv->qos_option) qos_option = _TRUE; - } - } - else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ) { - //to_ds = 0, fr_ds = 1; + } + } else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)) { + /* to_ds = 0, fr_ds = 1; */ SetFrDs(fctrl); _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN); - if(pattrib->qos_en) + if (pattrib->qos_en) qos_option = _TRUE; - } - else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { + } else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); - if(pattrib->qos_en) + if (pattrib->qos_en) qos_option = _TRUE; - } - else { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv))); + } else { res = _FAIL; goto exit; } - if(pattrib->mdata) + if (pattrib->mdata) SetMData(fctrl); if (pattrib->encrypt) SetPrivacy(fctrl); - if (qos_option) - { + if (qos_option) { qc = (unsigned short *)(hdr + pattrib->hdrlen - 2); if (pattrib->priority) @@ -1544,33 +1716,29 @@ _func_enter_; SetAckpolicy(qc, pattrib->ack_policy); } - //TODO: fill HT Control Field + /* TODO: fill HT Control Field */ - //Update Seq Num will be handled by f/w + /* Update Seq Num will be handled by f/w */ { struct sta_info *psta; psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - if(pattrib->psta != psta) - { - DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); + if (pattrib->psta != psta) { + RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); return _FAIL; } - if(psta==NULL) - { - DBG_871X("%s, psta==NUL\n", __func__); + if (psta == NULL) { + RTW_INFO("%s, psta==NUL\n", __func__); return _FAIL; } - if(!(psta->state &_FW_LINKED)) - { - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); + if (!(psta->state & _FW_LINKED)) { + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); return _FAIL; } - - if(psta) - { + + if (psta) { psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; @@ -1578,53 +1746,43 @@ _func_enter_; SetSeqNum(hdr, pattrib->seqnum); #ifdef CONFIG_80211N_HT - //check if enable ampdu - if(pattrib->ht_en && psta->htpriv.ampdu_enable) - { - if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) + /* check if enable ampdu */ + if (pattrib->ht_en && psta->htpriv.ampdu_enable) { + if (psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) pattrib->ampdu_en = _TRUE; } - //re-check if enable ampdu by BA_starting_seqctrl - if(pattrib->ampdu_en == _TRUE) - { + /* re-check if enable ampdu by BA_starting_seqctrl */ + if (pattrib->ampdu_en == _TRUE) { u16 tx_seq; tx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f]; - - //check BA_starting_seqctrl - if(SN_LESS(pattrib->seqnum, tx_seq)) - { - //DBG_871X("tx ampdu seqnum(%d) < tx_seq(%d)\n", pattrib->seqnum, tx_seq); - pattrib->ampdu_en = _FALSE;//AGG BK - } - else if(SN_EQUAL(pattrib->seqnum, tx_seq)) - { - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; - - pattrib->ampdu_en = _TRUE;//AGG EN - } - else - { - //DBG_871X("tx ampdu over run\n"); - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff; - pattrib->ampdu_en = _TRUE;//AGG EN + + /* check BA_starting_seqctrl */ + if (SN_LESS(pattrib->seqnum, tx_seq)) { + /* RTW_INFO("tx ampdu seqnum(%d) < tx_seq(%d)\n", pattrib->seqnum, tx_seq); */ + pattrib->ampdu_en = _FALSE;/* AGG BK */ + } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq + 1) & 0xfff; + + pattrib->ampdu_en = _TRUE;/* AGG EN */ + } else { + /* RTW_INFO("tx ampdu over run\n"); */ + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum + 1) & 0xfff; + pattrib->ampdu_en = _TRUE;/* AGG EN */ } } -#endif //CONFIG_80211N_HT +#endif /* CONFIG_80211N_HT */ } } - - } - else - { + + } else { } exit: -_func_exit_; return res; } @@ -1633,194 +1791,183 @@ s32 rtw_txframes_pending(_adapter *padapter) { struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) || - (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) || - (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) || - (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE)); + return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) || + (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) || + (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) || + (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE)); } s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib) -{ +{ struct sta_info *psta; struct tx_servq *ptxservq; int priority = pattrib->priority; -/* - if(pattrib->psta) - { - psta = pattrib->psta; - } - else - { - DBG_871X("%s, call rtw_get_stainfo()\n", __func__); - psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]); - } -*/ + /* + if(pattrib->psta) + { + psta = pattrib->psta; + } + else + { + RTW_INFO("%s, call rtw_get_stainfo()\n", __func__); + psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]); + } + */ psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - if(pattrib->psta != psta) - { - DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); + if (pattrib->psta != psta) { + RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); return 0; } - if(psta==NULL) - { - DBG_871X("%s, psta==NUL\n", __func__); + if (psta == NULL) { + RTW_INFO("%s, psta==NUL\n", __func__); return 0; } - if(!(psta->state &_FW_LINKED)) - { - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); + if (!(psta->state & _FW_LINKED)) { + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); return 0; } - - switch(priority) - { - case 1: - case 2: - ptxservq = &(psta->sta_xmitpriv.bk_q); - break; - case 4: - case 5: - ptxservq = &(psta->sta_xmitpriv.vi_q); - break; - case 6: - case 7: - ptxservq = &(psta->sta_xmitpriv.vo_q); - break; - case 0: - case 3: - default: - ptxservq = &(psta->sta_xmitpriv.be_q); - break; - - } - return ptxservq->qcnt; + switch (priority) { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); + break; + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); + break; + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); + break; + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); + break; + + } + + return ptxservq->qcnt; } #ifdef CONFIG_TDLS -int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) +int rtw_build_tdls_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt) { - int res=_SUCCESS; + int res = _SUCCESS; - switch(ptxmgmt->action_code){ - case TDLS_SETUP_REQUEST: - rtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe, ptxmgmt); - break; - case TDLS_SETUP_RESPONSE: - rtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt); - break; - case TDLS_SETUP_CONFIRM: - rtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe, ptxmgmt); - break; - case TDLS_TEARDOWN: - rtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe, ptxmgmt); - break; - case TDLS_DISCOVERY_REQUEST: - 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, ptxmgmt); - break; -#ifdef CONFIG_TDLS_CH_SW - case TDLS_CHANNEL_SWITCH_REQUEST: - 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, ptxmgmt); - break; -#endif - case TDLS_PEER_TRAFFIC_RESPONSE: - rtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt); - break; -#ifdef CONFIG_WFD - case TUNNELED_PROBE_REQ: - rtw_build_tunneled_probe_req_ies(padapter, pxmitframe, pframe); - break; - case TUNNELED_PROBE_RSP: - rtw_build_tunneled_probe_rsp_ies(padapter, pxmitframe, pframe); - break; -#endif //CONFIG_WFD - default: - res=_FAIL; - break; + switch (ptxmgmt->action_code) { + case TDLS_SETUP_REQUEST: + rtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe, ptxmgmt); + break; + case TDLS_SETUP_RESPONSE: + rtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt); + break; + case TDLS_SETUP_CONFIRM: + rtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe, ptxmgmt); + break; + case TDLS_TEARDOWN: + rtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe, ptxmgmt); + break; + case TDLS_DISCOVERY_REQUEST: + 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, ptxmgmt); + break; +#ifdef CONFIG_TDLS_CH_SW + case TDLS_CHANNEL_SWITCH_REQUEST: + 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, ptxmgmt); + break; +#endif + case TDLS_PEER_TRAFFIC_RESPONSE: + rtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt); + break; +#ifdef CONFIG_WFD + case TUNNELED_PROBE_REQ: + rtw_build_tunneled_probe_req_ies(padapter, pxmitframe, pframe); + break; + case TUNNELED_PROBE_RSP: + rtw_build_tunneled_probe_rsp_ies(padapter, pxmitframe, pframe); + break; +#endif /* CONFIG_WFD */ + default: + res = _FAIL; + break; } return res; } -s32 rtw_make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt) +s32 rtw_make_tdls_wlanhdr(_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt) { u16 *qc; struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct qos_priv *pqospriv = &pmlmepriv->qospriv; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta=NULL, *ptdls_sta=NULL; - u8 tdls_seq=0, baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta = NULL, *ptdls_sta = NULL; + u8 tdls_seq = 0, baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; sint res = _SUCCESS; u16 *fctrl = &pwlanhdr->frame_ctl; -_func_enter_; _rtw_memset(hdr, 0, WLANHDR_OFFSET); SetFrameSubType(fctrl, pattrib->subtype); - switch(ptxmgmt->action_code){ - case TDLS_SETUP_REQUEST: - case TDLS_SETUP_RESPONSE: - case TDLS_SETUP_CONFIRM: - case TDLS_PEER_TRAFFIC_INDICATION: + switch (ptxmgmt->action_code) { + case TDLS_SETUP_REQUEST: + case TDLS_SETUP_RESPONSE: + case TDLS_SETUP_CONFIRM: + case TDLS_PEER_TRAFFIC_INDICATION: case TDLS_PEER_PSM_REQUEST: - case TUNNELED_PROBE_REQ: - case TUNNELED_PROBE_RSP: - case TDLS_DISCOVERY_REQUEST: + case TUNNELED_PROBE_REQ: + case TUNNELED_PROBE_RSP: + case TDLS_DISCOVERY_REQUEST: + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); + break; + case TDLS_CHANNEL_SWITCH_REQUEST: + case TDLS_CHANNEL_SWITCH_RESPONSE: + case TDLS_PEER_PSM_RESPONSE: + case TDLS_PEER_TRAFFIC_RESPONSE: + _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); + tdls_seq = 1; + break; + case TDLS_TEARDOWN: + if (ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_) { + _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); + tdls_seq = 1; + } else { SetToDs(fctrl); _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); - break; - case TDLS_CHANNEL_SWITCH_REQUEST: - case TDLS_CHANNEL_SWITCH_RESPONSE: - case TDLS_PEER_PSM_RESPONSE: - case TDLS_PEER_TRAFFIC_RESPONSE: - _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); - tdls_seq=1; - break; - case TDLS_TEARDOWN: - if(ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_) - { - _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); - tdls_seq=1; - } - else - { - SetToDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); - } - break; + } + break; } if (pattrib->encrypt) SetPrivacy(fctrl); - if(ptxmgmt->action_code == TDLS_PEER_TRAFFIC_RESPONSE) - { + if (ptxmgmt->action_code == TDLS_PEER_TRAFFIC_RESPONSE) SetPwrMgt(fctrl); - } - if (pqospriv->qos_option) - { + if (pqospriv->qos_option) { qc = (unsigned short *)(hdr + pattrib->hdrlen - 2); if (pattrib->priority) SetPriority(qc, pattrib->priority); @@ -1828,29 +1975,29 @@ _func_enter_; } psta = pattrib->psta; - - // 1. update seq_num per link by sta_info - // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len - if(tdls_seq==1){ - ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); - if(ptdls_sta){ + + /* 1. update seq_num per link by sta_info */ + /* 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len */ + if (tdls_seq == 1) { + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + if (ptdls_sta) { ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; SetSeqNum(hdr, pattrib->seqnum); - if (pattrib->encrypt){ - pattrib->encrypt= _AES_; - pattrib->iv_len=8; - pattrib->icv_len=8; + if (pattrib->encrypt) { + pattrib->encrypt = _AES_; + pattrib->iv_len = 8; + pattrib->icv_len = 8; pattrib->bswenc = _FALSE; } pattrib->mac_id = ptdls_sta->mac_id; - }else{ - res=_FAIL; + } else { + res = _FAIL; goto exit; } - }else if(psta){ + } else if (psta) { psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; @@ -1860,12 +2007,11 @@ _func_enter_; exit: -_func_exit_; return res; } -s32 rtw_xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, struct tdls_txmgmt *ptxmgmt) +s32 rtw_xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, struct tdls_txmgmt *ptxmgmt) { s32 llc_sz; @@ -1878,20 +2024,18 @@ s32 rtw_xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pbuf_start; s32 bmcst = IS_MCAST(pattrib->ra); s32 res = _SUCCESS; - -_func_enter_; - if (pattrib->psta) { + + if (pattrib->psta) psta = pattrib->psta; - } else { - if(bmcst) { + else { + if (bmcst) psta = rtw_get_bcmc_stainfo(padapter); - } else { + else psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - } } - if (psta==NULL) { + if (psta == NULL) { res = _FAIL; goto exit; } @@ -1912,29 +2056,26 @@ _func_enter_; pframe = mem_start; pframe += pattrib->hdrlen; - //adding icv, if necessary... - if (pattrib->iv_len) - { - if (psta != NULL) - { - switch(pattrib->encrypt) - { - case _WEP40_: - case _WEP104_: - WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - break; - case _TKIP_: - if(bmcst) - TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - TKIP_IV(pattrib->iv, psta->dot11txpn, 0); - break; - case _AES_: - if(bmcst) - AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - AES_IV(pattrib->iv, psta->dot11txpn, 0); - break; + /* adding icv, if necessary... */ + if (pattrib->iv_len) { + if (psta != NULL) { + switch (pattrib->encrypt) { + case _WEP40_: + case _WEP104_: + WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + break; + case _TKIP_: + if (bmcst) + TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + TKIP_IV(pattrib->iv, psta->dot11txpn, 0); + break; + case _AES_: + if (bmcst) + AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + AES_IV(pattrib->iv, psta->dot11txpn, 0); + break; } } @@ -1946,38 +2087,36 @@ _func_enter_; llc_sz = rtw_put_snap(pframe, pattrib->ether_type); pframe += llc_sz; - //pattrib->pktlen will be counted in rtw_build_tdls_ies + /* pattrib->pktlen will be counted in rtw_build_tdls_ies */ pattrib->pktlen = 0; rtw_build_tdls_ies(padapter, pxmitframe, pframe, ptxmgmt); - if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { + if ((pattrib->icv_len > 0) && (pattrib->bswenc)) { pframe += pattrib->pktlen; - _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); pframe += pattrib->icv_len; } pattrib->nr_frags = 1; - pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz + - ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen; - - if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) - { + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz + + ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen; + + if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) { res = _FAIL; goto exit; } xmitframe_swencrypt(padapter, pxmitframe); - + update_attrib_vcs_info(padapter, pxmitframe); - -exit: - -_func_exit_; + +exit: + return res; } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ /* * Calculate wlan 802.11 packet MAX size from pkt_attrib @@ -1987,11 +2126,12 @@ u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib) { u32 len = 0; - len = pattrib->hdrlen + pattrib->iv_len; // WLAN Header and IV - len += SNAP_SIZE + sizeof(u16); // LLC + len = pattrib->hdrlen + pattrib->iv_len; /* WLAN Header and IV */ + len += SNAP_SIZE + sizeof(u16); /* LLC */ len += pattrib->pktlen; - if (pattrib->encrypt == _TKIP_) len += 8; // MIC - len += ((pattrib->bswenc) ? pattrib->icv_len : 0); // ICV + if (pattrib->encrypt == _TKIP_) + len += 8; /* MIC */ + len += ((pattrib->bswenc) ? pattrib->icv_len : 0); /* ICV */ return len; } @@ -2005,7 +2145,7 @@ This sub-routine will perform all the following: 3. append sta's iv/ext-iv 4. append LLC 5. move frag chunk from pframe to pxmitframe->mem -6. apply sw-encrypt, if necessary. +6. apply sw-encrypt, if necessary. */ s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe) @@ -2019,9 +2159,9 @@ s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxm u8 *pframe, *mem_start; u8 hw_hdr_offset; - //struct sta_info *psta; - //struct sta_priv *pstapriv = &padapter->stapriv; - //struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + /* struct sta_info *psta; */ + /* struct sta_priv *pstapriv = &padapter->stapriv; */ + /* struct mlme_priv *pmlmepriv = &padapter->mlmepriv; */ struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct pkt_attrib *pattrib = &pxmitframe->attrib; @@ -2031,54 +2171,52 @@ s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxm s32 bmcst = IS_MCAST(pattrib->ra); s32 res = _SUCCESS; -_func_enter_; -/* - if (pattrib->psta) - { - psta = pattrib->psta; - } else - { - DBG_871X("%s, call rtw_get_stainfo()\n", __func__); - psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - } + /* + if (pattrib->psta) + { + psta = pattrib->psta; + } else + { + RTW_INFO("%s, call rtw_get_stainfo()\n", __func__); + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + } - if(psta==NULL) - { - - DBG_871X("%s, psta==NUL\n", __func__); - return _FAIL; - } + if(psta==NULL) + { + + RTW_INFO("%s, psta==NUL\n", __func__); + return _FAIL; + } - if(!(psta->state &_FW_LINKED)) - { - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); - return _FAIL; - } -*/ - if (pxmitframe->buf_addr == NULL){ - DBG_8192C("==> %s buf_addr==NULL \n",__FUNCTION__); + if(!(psta->state &_FW_LINKED)) + { + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); + return _FAIL; + } + */ + if (pxmitframe->buf_addr == NULL) { + RTW_INFO("==> %s buf_addr==NULL\n", __FUNCTION__); return _FAIL; } pbuf_start = pxmitframe->buf_addr; - + #ifdef CONFIG_USB_TX_AGGREGATION hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); #else - #ifdef CONFIG_TX_EARLY_MODE //for SDIO && Tx Agg +#ifdef CONFIG_TX_EARLY_MODE /* for SDIO && Tx Agg */ hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE; - #else +#else hw_hdr_offset = TXDESC_OFFSET; - #endif +#endif #endif mem_start = pbuf_start + hw_hdr_offset; if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) { - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n")); - DBG_8192C("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n"); + RTW_INFO("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n"); res = _FAIL; goto exit; } @@ -2087,10 +2225,9 @@ _func_enter_; _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen); frg_inx = 0; - frg_len = pxmitpriv->frag_len - 4;//2346-4 = 2342 + frg_len = pxmitpriv->frag_len - 4;/* 2346-4 = 2342 */ - while (1) - { + while (1) { llc_sz = 0; mpdu_len = frg_len; @@ -2102,48 +2239,42 @@ _func_enter_; pframe += pattrib->hdrlen; mpdu_len -= pattrib->hdrlen; - //adding icv, if necessary... - if (pattrib->iv_len) - { -/* - //if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) - // psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); - //else - // psta = rtw_get_stainfo(pstapriv, pattrib->ra); + /* adding icv, if necessary... */ + if (pattrib->iv_len) { +#if 0 + /* if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) */ + /* psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); */ + /* else */ + /* psta = rtw_get_stainfo(pstapriv, pattrib->ra); */ - if (psta != NULL) - { - switch(pattrib->encrypt) - { - case _WEP40_: - case _WEP104_: - WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - break; - case _TKIP_: - if(bmcst) - TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - TKIP_IV(pattrib->iv, psta->dot11txpn, 0); - break; - case _AES_: - if(bmcst) - AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - AES_IV(pattrib->iv, psta->dot11txpn, 0); - break; + if (psta != NULL) { + switch (pattrib->encrypt) { + case _WEP40_: + case _WEP104_: + WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + break; + case _TKIP_: + if (bmcst) + TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + TKIP_IV(pattrib->iv, psta->dot11txpn, 0); + break; + case _AES_: + if (bmcst) + AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + AES_IV(pattrib->iv, psta->dot11txpn, 0); + break; #ifdef CONFIG_WAPI_SUPPORT - case _SMS4_: - rtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv); - break; + case _SMS4_: + rtw_wapi_get_iv(padapter, pattrib->ra, pattrib->iv); + break; #endif } } -*/ +#endif _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); - RT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_, - ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n", - padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe+1), *(pframe+2), *(pframe+3))); pframe += pattrib->iv_len; @@ -2156,78 +2287,70 @@ _func_enter_; mpdu_len -= llc_sz; } - if ((pattrib->icv_len >0) && (pattrib->bswenc)) { + if ((pattrib->icv_len > 0) && (pattrib->bswenc)) mpdu_len -= pattrib->icv_len; - } if (bmcst) { - // don't do fragment to broadcat/multicast packets + /* don't do fragment to broadcat/multicast packets */ mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen); - } else { + } else mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len); - } pframe += mem_sz; - if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { - _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); + if ((pattrib->icv_len > 0) && (pattrib->bswenc)) { + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); pframe += pattrib->icv_len; } frg_inx++; - if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE)) - { + if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE)) { pattrib->nr_frags = frg_inx; - pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags==1)? llc_sz:0) + - ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz; - + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags == 1) ? llc_sz : 0) + + ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz; + ClearMFrag(mem_start); break; - } else { - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("%s: There're still something in packet!\n", __FUNCTION__)); } addr = (SIZE_PTR)(pframe); mem_start = (unsigned char *)RND4(addr) + hw_hdr_offset; - _rtw_memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen); - + _rtw_memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen); + } - if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) - { - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n")); - DBG_8192C("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n"); + if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) { + RTW_INFO("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n"); res = _FAIL; goto exit; } xmitframe_swencrypt(padapter, pxmitframe); - if(bmcst == _FALSE) + if (bmcst == _FALSE) update_attrib_vcs_info(padapter, pxmitframe); else pattrib->vcs_mode = NONE_VCS; -exit: - -_func_exit_; +exit: + return res; } #ifdef CONFIG_IEEE80211W -//broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption +/* broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption */ s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe) { struct pkt_file pktfile; s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz; SIZE_PTR addr; - u8 *pframe, *mem_start = NULL, *tmp_buf=NULL; + u8 *pframe, *mem_start = NULL, *tmp_buf = NULL; u8 hw_hdr_offset, subtype ; struct sta_info *psta = NULL; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -2235,140 +2358,135 @@ s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame u8 *pbuf_start; s32 bmcst = IS_MCAST(pattrib->ra); s32 res = _FAIL; - u8 *BIP_AAD=NULL; - u8 *MGMT_body=NULL; - + u8 *BIP_AAD = NULL; + u8 *MGMT_body = NULL; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct rtw_ieee80211_hdr *pwlanhdr; u8 MME[_MME_IE_LENGTH_]; - + _irqL irqL; u32 ori_len; mem_start = pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET; pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - -_func_enter_; - ori_len = BIP_AAD_SIZE+pattrib->pktlen; + + ori_len = BIP_AAD_SIZE + pattrib->pktlen; tmp_buf = BIP_AAD = rtw_zmalloc(ori_len); - subtype = GetFrameSubType(pframe); //bit(7)~bit(2) - - if(BIP_AAD == NULL) + subtype = GetFrameSubType(pframe); /* bit(7)~bit(2) */ + + if (BIP_AAD == NULL) return _FAIL; - + _enter_critical_bh(&padapter->security_key_mutex, &irqL); - - - //IGTK key is not install, it may not support 802.11w - if(padapter->securitypriv.binstallBIPkey != _TRUE) - { - DBG_871X("no instll BIP key\n"); + + + /* IGTK key is not install, it may not support 802.11w */ + if (padapter->securitypriv.binstallBIPkey != _TRUE) { + RTW_INFO("no instll BIP key\n"); goto xmitframe_coalesce_success; } - //station mode doesn't need TX BIP, just ready the code - if(bmcst) - { + /* station mode doesn't need TX BIP, just ready the code */ + if (bmcst) { int frame_body_len; u8 mic[16]; - + _rtw_memset(MME, 0, _MME_IE_LENGTH_); - - //other types doesn't need the BIP - if(GetFrameSubType(pframe) != WIFI_DEAUTH && GetFrameSubType(pframe) != WIFI_DISASSOC) + + /* other types doesn't need the BIP */ + if (GetFrameSubType(pframe) != WIFI_DEAUTH && GetFrameSubType(pframe) != WIFI_DISASSOC) goto xmitframe_coalesce_fail; - + MGMT_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); pframe += pattrib->pktlen; - - //octent 0 and 1 is key index ,BIP keyid is 4 or 5, LSB only need octent 0 - MME[0]=padapter->securitypriv.dot11wBIPKeyid; - //copy packet number + + /* octent 0 and 1 is key index ,BIP keyid is 4 or 5, LSB only need octent 0 */ + MME[0] = padapter->securitypriv.dot11wBIPKeyid; + /* copy packet number */ _rtw_memcpy(&MME[2], &pmlmeext->mgnt_80211w_IPN, 6); - //increase the packet number + /* increase the packet number */ pmlmeext->mgnt_80211w_IPN++; - - //add MME IE with MIC all zero, MME string doesn't include element id and length + + /* add MME IE with MIC all zero, MME string doesn't include element id and length */ pframe = rtw_set_ie(pframe, _MME_IE_ , 16 , MME, &(pattrib->pktlen)); pattrib->last_txcmdsz = pattrib->pktlen; - // total frame length - header length + /* total frame length - header length */ frame_body_len = pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr); - - //conscruct AAD, copy frame control field + + /* conscruct AAD, copy frame control field */ _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2); ClearRetry(BIP_AAD); ClearPwrMgt(BIP_AAD); ClearMData(BIP_AAD); - //conscruct AAD, copy address 1 to address 3 - _rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18); - //copy management fram body - _rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, MGMT_body, frame_body_len); - /*//dump total packet include MME with zero MIC + /* conscruct AAD, copy address 1 to address 3 */ + _rtw_memcpy(BIP_AAD + 2, pwlanhdr->addr1, 18); + /* copy management fram body */ + _rtw_memcpy(BIP_AAD + BIP_AAD_SIZE, MGMT_body, frame_body_len); +#if 0 + /* dump total packet include MME with zero MIC */ { int i; printk("Total packet: "); - for(i=0; i < BIP_AAD_SIZE+frame_body_len; i++) + for (i = 0; i < BIP_AAD_SIZE + frame_body_len; i++) printk(" %02x ", BIP_AAD[i]); printk("\n"); - }*/ - //calculate mic - if(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey - , BIP_AAD, BIP_AAD_SIZE+frame_body_len, mic)) + } +#endif + /* calculate mic */ + if (omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey + , BIP_AAD, BIP_AAD_SIZE + frame_body_len, mic)) goto xmitframe_coalesce_fail; - - /*//dump calculated mic result + +#if 0 + /* dump calculated mic result */ { int i; printk("Calculated mic result: "); - for(i=0; i<16; i++) + for (i = 0; i < 16; i++) printk(" %02x ", mic[i]); printk("\n"); - }*/ - //copy right BIP mic value, total is 128bits, we use the 0~63 bits - _rtw_memcpy(pframe-8, mic, 8); + } +#endif + /* copy right BIP mic value, total is 128bits, we use the 0~63 bits */ + _rtw_memcpy(pframe - 8, mic, 8); /*/dump all packet after mic ok { int pp; - printk("pattrib->pktlen = %d \n", pattrib->pktlen); + printk("pattrib->pktlen = %d\n", pattrib->pktlen); for(pp=0;pp< pattrib->pktlen; pp++) printk(" %02x ", mem_start[pp]); printk("\n"); }*/ - } - else //unicast mgmt frame TX - { - //start to encrypt mgmt frame - if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC || - subtype == WIFI_REASSOCREQ || subtype == WIFI_ACTION) - { + } else { /* unicast mgmt frame TX */ + /* start to encrypt mgmt frame */ + if (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC || + subtype == WIFI_REASSOCREQ || subtype == WIFI_ACTION) { if (pattrib->psta) psta = pattrib->psta; else - { psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - } - - if(psta==NULL) - { - - DBG_871X("%s, psta==NUL\n", __func__); + + if (psta == NULL) { + + RTW_INFO("%s, psta==NUL\n", __func__); goto xmitframe_coalesce_fail; } - + if (pxmitframe->buf_addr == NULL) { - DBG_871X("%s, pxmitframe->buf_addr\n", __func__); + RTW_INFO("%s, pxmitframe->buf_addr\n", __func__); goto xmitframe_coalesce_fail; } - - //DBG_871X("%s, action frame category=%d \n", __func__, pframe[WLAN_HDR_A3_LEN]); - //according 802.11-2012 standard, these five types are not robust types - if(subtype == WIFI_ACTION && - (pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_PUBLIC || - pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_HT || - pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_UNPROTECTED_WNM || - pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_SELF_PROTECTED || - pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_P2P)) + + /* RTW_INFO("%s, action frame category=%d\n", __func__, pframe[WLAN_HDR_A3_LEN]); */ + /* according 802.11-2012 standard, these five types are not robust types */ + if (subtype == WIFI_ACTION && + (pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_PUBLIC || + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_HT || + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_UNPROTECTED_WNM || + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_SELF_PROTECTED || + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_P2P)) goto xmitframe_coalesce_fail; - //before encrypt dump the management packet content + /* before encrypt dump the management packet content */ /*{ int i; printk("Management pkt: "); @@ -2376,72 +2494,75 @@ _func_enter_; printk(" %02x ", pframe[i]); printk("=======\n"); }*/ - if(pattrib->encrypt>0) + if (pattrib->encrypt > 0) _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16); - + /* To use wrong key */ if (pattrib->key_type == IEEE80211W_WRONG_KEY) { - DBG_871X("use wrong key\n"); + RTW_INFO("use wrong key\n"); pattrib->dot118021x_UncstKey.skey[0] = 0xff; } - - //bakeup original management packet + + /* bakeup original management packet */ _rtw_memcpy(tmp_buf, pframe, pattrib->pktlen); - //move to data portion + /* move to data portion */ pframe += pattrib->hdrlen; - - //802.11w unicast management packet must be _AES_ + + /* 802.11w unicast management packet must be _AES_ */ pattrib->iv_len = 8; - //it's MIC of AES + /* it's MIC of AES */ pattrib->icv_len = 8; - - switch(pattrib->encrypt) - { - case _AES_: - //set AES IV header - AES_IV(pattrib->iv, psta->dot11wtxpn, 0); - break; - default: - goto xmitframe_coalesce_fail; + + switch (pattrib->encrypt) { + case _AES_: + /* set AES IV header */ + AES_IV(pattrib->iv, psta->dot11wtxpn, 0); + break; + default: + goto xmitframe_coalesce_fail; } - //insert iv header into management frame + /* insert iv header into management frame */ _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); pframe += pattrib->iv_len; - //copy mgmt data portion after CCMP header - _rtw_memcpy(pframe, tmp_buf+pattrib->hdrlen, pattrib->pktlen-pattrib->hdrlen); - //move pframe to end of mgmt pkt - pframe += pattrib->pktlen-pattrib->hdrlen; - //add 8 bytes CCMP IV header to length + /* copy mgmt data portion after CCMP header */ + _rtw_memcpy(pframe, tmp_buf + pattrib->hdrlen, pattrib->pktlen - pattrib->hdrlen); + /* move pframe to end of mgmt pkt */ + pframe += pattrib->pktlen - pattrib->hdrlen; + /* add 8 bytes CCMP IV header to length */ pattrib->pktlen += pattrib->iv_len; - /*//dump management packet include AES IV header +#if 0 + /* dump management packet include AES IV header */ { int i; printk("Management pkt + IV: "); - //for(i=0; ipktlen; i++) - //printk(" %02x ", mem_start[i]); + /* for(i=0; ipktlen; i++) */ + printk("@@@@@@@@@@@@@\n"); - }*/ - - if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { - _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); + } +#endif + + if ((pattrib->icv_len > 0) && (pattrib->bswenc)) { + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); pframe += pattrib->icv_len; } - //add 8 bytes MIC + /* add 8 bytes MIC */ pattrib->pktlen += pattrib->icv_len; - //set final tx command size + /* set final tx command size */ pattrib->last_txcmdsz = pattrib->pktlen; - - //set protected bit must be beofre SW encrypt + + /* set protected bit must be beofre SW encrypt */ SetPrivacy(mem_start); - /*//dump management packet include AES header +#if 0 + /* dump management packet include AES header */ { int i; printk("prepare to enc Management pkt + IV: "); - for(i=0; ipktlen; i++) - printk(" %02x ", mem_start[i]); + for (i = 0; i < pattrib->pktlen; i++) + printk(" %02x ", mem_start[i]); printk("@@@@@@@@@@@@@\n"); - }*/ - //software encrypt + } +#endif + /* software encrypt */ xmitframe_swencrypt(padapter, pxmitframe); } } @@ -2449,17 +2570,15 @@ _func_enter_; xmitframe_coalesce_success: _exit_critical_bh(&padapter->security_key_mutex, &irqL); rtw_mfree(BIP_AAD, ori_len); -_func_exit_; return _SUCCESS; - + xmitframe_coalesce_fail: _exit_critical_bh(&padapter->security_key_mutex, &irqL); rtw_mfree(BIP_AAD, ori_len); -_func_exit_; return _FAIL; } -#endif //CONFIG_IEEE80211W +#endif /* CONFIG_IEEE80211W */ /* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header * IEEE LLC/SNAP header contains 8 octets @@ -2473,7 +2592,6 @@ s32 rtw_put_snap(u8 *data, u16 h_proto) struct ieee80211_snap_hdr *snap; u8 *oui; -_func_enter_; snap = (struct ieee80211_snap_hdr *)data; snap->dsap = 0xaa; @@ -2484,14 +2602,13 @@ _func_enter_; oui = P802_1H_OUI; else oui = RFC1042_OUI; - + snap->oui[0] = oui[0]; snap->oui[1] = oui[1]; snap->oui[2] = oui[2]; *(u16 *)(data + SNAP_SIZE) = htons(h_proto); -_func_exit_; return SNAP_SIZE + sizeof(u16); } @@ -2504,44 +2621,36 @@ void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len) sint erp_len; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct registry_priv *pregistrypriv = &padapter->registrypriv; - -_func_enter_; - - switch(pxmitpriv->vcs_setting) - { - case DISABLE_VCS: - pxmitpriv->vcs = NONE_VCS; - break; - - case ENABLE_VCS: - break; - - case AUTO_VCS: - default: - perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len); - if(perp == NULL) - { - pxmitpriv->vcs = NONE_VCS; - } - else - { - protection = (*(perp + 2)) & BIT(1); - if (protection) - { - if(pregistrypriv->vcs_type == RTS_CTS) - pxmitpriv->vcs = RTS_CTS; - else - pxmitpriv->vcs = CTS_TO_SELF; - } - else - pxmitpriv->vcs = NONE_VCS; - } - break; - + + switch (pxmitpriv->vcs_setting) { + case DISABLE_VCS: + pxmitpriv->vcs = NONE_VCS; + break; + + case ENABLE_VCS: + break; + + case AUTO_VCS: + default: + perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len); + if (perp == NULL) + pxmitpriv->vcs = NONE_VCS; + else { + protection = (*(perp + 2)) & BIT(1); + if (protection) { + if (pregistrypriv->vcs_type == RTS_CTS) + pxmitpriv->vcs = RTS_CTS; + else + pxmitpriv->vcs = CTS_TO_SELF; + } else + pxmitpriv->vcs = NONE_VCS; + } + + break; + } -_func_exit_; } @@ -2553,8 +2662,7 @@ void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz struct mlme_priv *pmlmepriv = &padapter->mlmepriv; u8 pkt_num = 1; - if ((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) - { + if ((pxmitframe->frame_tag & 0x0f) == DATA_FRAMETAG) { #if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) pkt_num = pxmitframe->agg_num; #endif @@ -2565,27 +2673,25 @@ void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz pxmitpriv->tx_bytes += sz; psta = pxmitframe->attrib.psta; - if (psta) - { + if (psta) { pstats = &psta->sta_stats; pstats->tx_pkts += pkt_num; pstats->tx_bytes += sz; #ifdef CONFIG_TDLS - if(pxmitframe->attrib.ptdls_sta != NULL) - { + if (pxmitframe->attrib.ptdls_sta != NULL) { pstats = &(pxmitframe->attrib.ptdls_sta->sta_stats); pstats->tx_pkts += pkt_num; pstats->tx_bytes += sz; } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ } - + #ifdef CONFIG_CHECK_LEAVE_LPS - //traffic_check_for_leave_lps(padapter, _TRUE); -#endif //CONFIG_LPS - + /* traffic_check_for_leave_lps(padapter, _TRUE); */ +#endif /* CONFIG_LPS */ + } } @@ -2594,7 +2700,6 @@ static struct xmit_buf *__rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv, { struct xmit_buf *pxmitbuf = NULL; -_func_enter_; pxmitbuf = &pxmitpriv->pcmd_xmitbuf[buf_type]; if (pxmitbuf != NULL) { @@ -2608,20 +2713,22 @@ _func_enter_; #endif #ifdef CONFIG_PCI_HCI pxmitbuf->len = 0; +#ifdef CONFIG_TRX_BD_ARCH + /*pxmitbuf->buf_desc = NULL;*/ +#else pxmitbuf->desc = NULL; +#endif #endif if (pxmitbuf->sctx) { - DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__); + RTW_INFO("%s pxmitbuf->sctx is not NULL\n", __func__); rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC); } - } else { - DBG_871X("%s fail, no xmitbuf available !!!\n", __func__); - } + } else + RTW_INFO("%s fail, no xmitbuf available !!!\n", __func__); exit: -_func_exit_; return pxmitbuf; } @@ -2632,14 +2739,15 @@ struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pcmdframe; struct xmit_buf *pxmitbuf; - if ((pcmdframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL) - { - DBG_871X("%s, alloc xmitframe fail\n", __FUNCTION__); + pcmdframe = rtw_alloc_xmitframe(pxmitpriv); + if (pcmdframe == NULL) { + RTW_INFO("%s, alloc xmitframe fail\n", __FUNCTION__); return NULL; } - if ((pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type)) == NULL) { - DBG_871X("%s, alloc xmitbuf fail\n", __FUNCTION__); + pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type); + if (pxmitbuf == NULL) { + RTW_INFO("%s, alloc xmitbuf fail\n", __FUNCTION__); rtw_free_xmitframe(pxmitpriv, pcmdframe); return NULL; } @@ -2663,13 +2771,12 @@ struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv) _list *plist, *phead; _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; -_func_enter_; _enter_critical(&pfree_queue->lock, &irqL); - if(_rtw_queue_empty(pfree_queue) == _TRUE) { + if (_rtw_queue_empty(pfree_queue) == _TRUE) pxmitbuf = NULL; - } else { + else { phead = get_list_head(pfree_queue); @@ -2680,14 +2787,13 @@ _func_enter_; rtw_list_delete(&(pxmitbuf->list)); } - if (pxmitbuf != NULL) - { + if (pxmitbuf != NULL) { pxmitpriv->free_xmit_extbuf_cnt--; - #ifdef DBG_XMIT_BUF_EXT - DBG_871X("DBG_XMIT_BUF_EXT ALLOC no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt); - #endif - - +#ifdef DBG_XMIT_BUF_EXT + RTW_INFO("DBG_XMIT_BUF_EXT ALLOC no=%d, free_xmit_extbuf_cnt=%d\n", pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt); +#endif + + pxmitbuf->priv_data = NULL; #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) @@ -2697,11 +2803,15 @@ _func_enter_; #endif #ifdef CONFIG_PCI_HCI pxmitbuf->len = 0; +#ifdef CONFIG_TRX_BD_ARCH + /*pxmitbuf->buf_desc = NULL;*/ +#else pxmitbuf->desc = NULL; +#endif #endif if (pxmitbuf->sctx) { - DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__); + RTW_INFO("%s pxmitbuf->sctx is not NULL\n", __func__); rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC); } @@ -2709,7 +2819,6 @@ _func_enter_; _exit_critical(&pfree_queue->lock, &irqL); -_func_exit_; return pxmitbuf; } @@ -2719,12 +2828,9 @@ s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) _irqL irqL; _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; -_func_enter_; - if(pxmitbuf==NULL) - { + if (pxmitbuf == NULL) return _FAIL; - } _enter_critical(&pfree_queue->lock, &irqL); @@ -2732,16 +2838,15 @@ _func_enter_; rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue)); pxmitpriv->free_xmit_extbuf_cnt++; - #ifdef DBG_XMIT_BUF_EXT - DBG_871X("DBG_XMIT_BUF_EXT FREE no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmit_extbuf_cnt); - #endif +#ifdef DBG_XMIT_BUF_EXT + RTW_INFO("DBG_XMIT_BUF_EXT FREE no=%d, free_xmit_extbuf_cnt=%d\n", pxmitbuf->no , pxmitpriv->free_xmit_extbuf_cnt); +#endif _exit_critical(&pfree_queue->lock, &irqL); -_func_exit_; return _SUCCESS; -} +} struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv) { @@ -2750,15 +2855,14 @@ struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv) _list *plist, *phead; _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; -_func_enter_; - //DBG_871X("+rtw_alloc_xmitbuf\n"); + /* RTW_INFO("+rtw_alloc_xmitbuf\n"); */ _enter_critical(&pfree_xmitbuf_queue->lock, &irqL); - if(_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) { + if (_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) pxmitbuf = NULL; - } else { + else { phead = get_list_head(pfree_xmitbuf_queue); @@ -2769,13 +2873,12 @@ _func_enter_; rtw_list_delete(&(pxmitbuf->list)); } - if (pxmitbuf != NULL) - { + if (pxmitbuf != NULL) { pxmitpriv->free_xmitbuf_cnt--; - #ifdef DBG_XMIT_BUF - DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt); - #endif - //DBG_871X("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); +#ifdef DBG_XMIT_BUF + RTW_INFO("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n", pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt); +#endif + /* RTW_INFO("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); */ pxmitbuf->priv_data = NULL; @@ -2787,24 +2890,25 @@ _func_enter_; #endif #ifdef CONFIG_PCI_HCI pxmitbuf->len = 0; +#ifdef CONFIG_TRX_BD_ARCH + /*pxmitbuf->buf_desc = NULL;*/ +#else pxmitbuf->desc = NULL; +#endif #endif if (pxmitbuf->sctx) { - DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__); + RTW_INFO("%s pxmitbuf->sctx is not NULL\n", __func__); rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC); } } - #ifdef DBG_XMIT_BUF +#ifdef DBG_XMIT_BUF else - { - DBG_871X("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n"); - } - #endif + RTW_INFO("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n"); +#endif _exit_critical(&pfree_xmitbuf_queue->lock, &irqL); -_func_exit_; return pxmitbuf; } @@ -2814,71 +2918,63 @@ s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) _irqL irqL; _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; -_func_enter_; - //DBG_871X("+rtw_free_xmitbuf\n"); + /* RTW_INFO("+rtw_free_xmitbuf\n"); */ - if(pxmitbuf==NULL) - { + if (pxmitbuf == NULL) return _FAIL; - } if (pxmitbuf->sctx) { - DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__); + RTW_INFO("%s pxmitbuf->sctx is not NULL\n", __func__); rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_FREE); } - if(pxmitbuf->buf_tag == XMITBUF_CMD) { - } - else if(pxmitbuf->buf_tag == XMITBUF_MGNT) { + if (pxmitbuf->buf_tag == XMITBUF_CMD) { + } else if (pxmitbuf->buf_tag == XMITBUF_MGNT) rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf); - } - else - { + else { _enter_critical(&pfree_xmitbuf_queue->lock, &irqL); - rtw_list_delete(&pxmitbuf->list); + rtw_list_delete(&pxmitbuf->list); rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue)); pxmitpriv->free_xmitbuf_cnt++; - //DBG_871X("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); - #ifdef DBG_XMIT_BUF - DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmitbuf_cnt); - #endif + /* RTW_INFO("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); */ +#ifdef DBG_XMIT_BUF + RTW_INFO("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n", pxmitbuf->no , pxmitpriv->free_xmitbuf_cnt); +#endif _exit_critical(&pfree_xmitbuf_queue->lock, &irqL); } -_func_exit_; - return _SUCCESS; -} + return _SUCCESS; +} void rtw_init_xmitframe(struct xmit_frame *pxframe) { - if (pxframe != NULL)//default value setting - { + if (pxframe != NULL) { /* default value setting */ pxframe->buf_addr = NULL; pxframe->pxmitbuf = NULL; _rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib)); - //pxframe->attrib.psta = NULL; + /* pxframe->attrib.psta = NULL; */ pxframe->frame_tag = DATA_FRAMETAG; #ifdef CONFIG_USB_HCI pxframe->pkt = NULL; #ifdef USB_PACKET_OFFSET_SZ - pxframe->pkt_offset = (PACKET_OFFSET_SZ/8); + pxframe->pkt_offset = (PACKET_OFFSET_SZ / 8); #else - pxframe->pkt_offset = 1;//default use pkt_offset to fill tx desc + pxframe->pkt_offset = 1;/* default use pkt_offset to fill tx desc */ #endif #ifdef CONFIG_USB_TX_AGGREGATION pxframe->agg_num = 1; #endif -#endif //#ifdef CONFIG_USB_HCI +#endif /* #ifdef CONFIG_USB_HCI */ #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) pxframe->pg_num = 1; @@ -2903,11 +2999,11 @@ Otherwise, we must use _enter/_exit critical to protect free_xmit_queue... Must be very very cautious... */ -struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pfree_xmit_queue) +struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)/* (_queue *pfree_xmit_queue) */ { /* Please remember to use all the osdep_service api, - and lock/unlock or _enter/_exit critical to protect + and lock/unlock or _enter/_exit critical to protect pfree_xmit_queue */ @@ -2916,12 +3012,10 @@ struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pf _list *plist, *phead; _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue; -_func_enter_; _enter_critical_bh(&pfree_xmit_queue->lock, &irqL); if (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe:%d\n", pxmitpriv->free_xmitframe_cnt)); pxframe = NULL; } else { phead = get_list_head(pfree_xmit_queue); @@ -2932,14 +3026,12 @@ _func_enter_; rtw_list_delete(&(pxframe->list)); pxmitpriv->free_xmitframe_cnt--; - RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt)); } _exit_critical_bh(&pfree_xmit_queue->lock, &irqL); rtw_init_xmitframe(pxframe); -_func_exit_; return pxframe; } @@ -2951,12 +3043,10 @@ struct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv) _list *plist, *phead; _queue *queue = &pxmitpriv->free_xframe_ext_queue; -_func_enter_; _enter_critical_bh(&queue->lock, &irqL); if (_rtw_queue_empty(queue) == _TRUE) { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe_ext:%d\n", pxmitpriv->free_xframe_ext_cnt)); pxframe = NULL; } else { phead = get_list_head(queue); @@ -2965,14 +3055,12 @@ _func_enter_; rtw_list_delete(&(pxframe->list)); pxmitpriv->free_xframe_ext_cnt--; - RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe_ext():free_xmitframe_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt)); } _exit_critical_bh(&queue->lock, &irqL); rtw_init_xmitframe(pxframe); -_func_exit_; return pxframe; } @@ -2983,10 +3071,10 @@ struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv) u8 *alloc_addr; alloc_addr = rtw_zmalloc(sizeof(struct xmit_frame) + 4); - + if (alloc_addr == NULL) goto exit; - + pxframe = (struct xmit_frame *)N_BYTE_ALIGMENT((SIZE_PTR)(alloc_addr), 4); pxframe->alloc_addr = alloc_addr; @@ -3000,54 +3088,50 @@ struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv) rtw_init_xmitframe(pxframe); - DBG_871X("################## %s ##################\n", __func__); + RTW_INFO("################## %s ##################\n", __func__); exit: return pxframe; } s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe) -{ +{ _irqL irqL; _queue *queue = NULL; _adapter *padapter = pxmitpriv->adapter; _pkt *pndis_pkt = NULL; -_func_enter_; if (pxmitframe == NULL) { - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("======rtw_free_xmitframe():pxmitframe==NULL!!!!!!!!!!\n")); goto exit; } - if (pxmitframe->pkt){ + if (pxmitframe->pkt) { pndis_pkt = pxmitframe->pkt; pxmitframe->pkt = NULL; } if (pxmitframe->alloc_addr) { - DBG_871X("################## %s with alloc_addr ##################\n", __func__); + RTW_INFO("################## %s with alloc_addr ##################\n", __func__); rtw_mfree(pxmitframe->alloc_addr, sizeof(struct xmit_frame) + 4); goto check_pkt_complete; } if (pxmitframe->ext_tag == 0) queue = &pxmitpriv->free_xmit_queue; - else if(pxmitframe->ext_tag == 1) + else if (pxmitframe->ext_tag == 1) queue = &pxmitpriv->free_xframe_ext_queue; else rtw_warn_on(1); _enter_critical_bh(&queue->lock, &irqL); - rtw_list_delete(&pxmitframe->list); + rtw_list_delete(&pxmitframe->list); rtw_list_insert_tail(&pxmitframe->list, get_list_head(queue)); if (pxmitframe->ext_tag == 0) { pxmitpriv->free_xmitframe_cnt++; - RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt)); - } else if(pxmitframe->ext_tag == 1) { + } else if (pxmitframe->ext_tag == 1) { pxmitpriv->free_xframe_ext_cnt++; - RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xframe_ext_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt)); } else { } @@ -3055,12 +3139,11 @@ _func_enter_; check_pkt_complete: - if(pndis_pkt) + if (pndis_pkt) rtw_os_pkt_complete(padapter, pndis_pkt); exit: -_func_exit_; return _SUCCESS; } @@ -3069,38 +3152,32 @@ void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue) { _irqL irqL; _list *plist, *phead; - struct xmit_frame *pxmitframe; + struct xmit_frame *pxmitframe; -_func_enter_; _enter_critical_bh(&(pframequeue->lock), &irqL); phead = get_list_head(pframequeue); plist = get_next(phead); - - while (rtw_end_of_queue_search(phead, plist) == _FALSE) - { - + + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { + pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list); - plist = get_next(plist); - - rtw_free_xmitframe(pxmitpriv,pxmitframe); - + plist = get_next(plist); + + rtw_free_xmitframe(pxmitpriv, pxmitframe); + } _exit_critical_bh(&(pframequeue->lock), &irqL); -_func_exit_; } s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe) { DBG_COUNTER(padapter->tx_logs.core_tx_enqueue); - if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL) - { - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, - ("rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\n")); -// pxmitframe->pkt = NULL; + if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL) { + /* pxmitframe->pkt = NULL; */ return _FAIL; } @@ -3110,47 +3187,46 @@ s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe) static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue) { _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; + struct xmit_frame *pxmitframe = NULL; xmitframe_phead = get_list_head(pframe_queue); xmitframe_plist = get_next(xmitframe_phead); - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { + 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); */ -/*#ifdef RTK_DMP_PLATFORM -#ifdef CONFIG_USB_TX_AGGREGATION - if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2)) - { - pxmitframe = NULL; + /*#ifdef RTK_DMP_PLATFORM + #ifdef CONFIG_USB_TX_AGGREGATION + if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2)) + { + pxmitframe = NULL; - tasklet_schedule(&pxmitpriv->xmit_tasklet); + tasklet_schedule(&pxmitpriv->xmit_tasklet); - break; - } -#endif -#endif*/ + break; + } + #endif + #endif*/ rtw_list_delete(&pxmitframe->list); ptxservq->qcnt--; - //rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending); + /* rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending); */ - //ptxservq->qcnt--; + /* ptxservq->qcnt--; */ - break; + break; - //pxmitframe = NULL; + /* pxmitframe = NULL; */ } return pxmitframe; } -struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry) +struct xmit_frame *rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry) { _irqL irqL0; _list *sta_plist, *sta_phead; @@ -3162,60 +3238,57 @@ struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmi struct registry_priv *pregpriv = &padapter->registrypriv; int i, inx[4]; #ifdef CONFIG_USB_HCI -// int j, tmp, acirp_cnt[4]; + /* int j, tmp, acirp_cnt[4]; */ #endif -_func_enter_; - inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3; + inx[0] = 0; + inx[1] = 1; + inx[2] = 2; + inx[3] = 3; - if(pregpriv->wifi_spec==1) - { + if (pregpriv->wifi_spec == 1) { int j, tmp, acirp_cnt[4]; #if 0 - if(flagswmm_para_seq[j]; #endif } _enter_critical_bh(&pxmitpriv->lock, &irqL0); - for(i = 0; i < entry; i++) - { + for (i = 0; i < entry; i++) { phwxmit = phwxmit_i + inx[i]; - //_enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0); + /* _enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0); */ sta_phead = get_list_head(phwxmit->sta_queue); sta_plist = get_next(sta_phead); - while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE) - { + while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE) { - ptxservq= LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending); + ptxservq = LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending); pframe_queue = &ptxservq->sta_pending; pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue); - if(pxmitframe) - { + if (pxmitframe) { phwxmit->accnt--; - //Remove sta node when there is no pending packets. - if(_rtw_queue_empty(pframe_queue)) //must be done after get_next and before break + /* Remove sta node when there is no pending packets. */ + if (_rtw_queue_empty(pframe_queue)) /* must be done after get_next and before break */ rtw_list_delete(&ptxservq->tx_pending); - //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); + /* _exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); */ goto exit; } @@ -3224,7 +3297,7 @@ _func_enter_; } - //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); + /* _exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); */ } @@ -3232,7 +3305,6 @@ exit: _exit_critical_bh(&pxmitpriv->lock, &irqL0); -_func_exit_; return pxmitframe; } @@ -3240,108 +3312,92 @@ _func_exit_; #if 1 struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac) { - struct tx_servq *ptxservq=NULL; - -_func_enter_; + struct tx_servq *ptxservq = NULL; - switch (up) + + switch (up) { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); + *(ac) = 3; + break; + + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); + *(ac) = 1; + break; + + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); + *(ac) = 0; + break; + + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); + *(ac) = 2; + break; + + } + + + return ptxservq; +} +#else +__inline static struct tx_servq *rtw_get_sta_pending +(_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up) +{ + struct tx_servq *ptxservq; + struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; + + +#ifdef CONFIG_RTL8711 + + if (IS_MCAST(psta->hwaddr)) { + ptxservq = &(psta->sta_xmitpriv.be_q); /* we will use be_q to queue bc/mc frames in BCMC_stainfo */ + *ppstapending = &padapter->xmitpriv.bm_pending; + } else +#endif { + switch (up) { case 1: case 2: ptxservq = &(psta->sta_xmitpriv.bk_q); - *(ac) = 3; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n")); + *ppstapending = &padapter->xmitpriv.bk_pending; + (phwxmits + 3)->accnt++; break; case 4: case 5: ptxservq = &(psta->sta_xmitpriv.vi_q); - *(ac) = 1; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n")); + *ppstapending = &padapter->xmitpriv.vi_pending; + (phwxmits + 1)->accnt++; break; case 6: case 7: ptxservq = &(psta->sta_xmitpriv.vo_q); - *(ac) = 0; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n")); + *ppstapending = &padapter->xmitpriv.vo_pending; + (phwxmits + 0)->accnt++; break; case 0: case 3: default: ptxservq = &(psta->sta_xmitpriv.be_q); - *(ac) = 2; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n")); - break; - - } - -_func_exit_; - - return ptxservq; -} -#else -__inline static struct tx_servq *rtw_get_sta_pending - (_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up) -{ - struct tx_servq *ptxservq; - struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; - -_func_enter_; - -#ifdef CONFIG_RTL8711 - - if(IS_MCAST(psta->hwaddr)) - { - ptxservq = &(psta->sta_xmitpriv.be_q); // we will use be_q to queue bc/mc frames in BCMC_stainfo - *ppstapending = &padapter->xmitpriv.bm_pending; - } - else -#endif - { - switch (up) - { - case 1: - case 2: - ptxservq = &(psta->sta_xmitpriv.bk_q); - *ppstapending = &padapter->xmitpriv.bk_pending; - (phwxmits+3)->accnt++; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n")); - break; - - case 4: - case 5: - ptxservq = &(psta->sta_xmitpriv.vi_q); - *ppstapending = &padapter->xmitpriv.vi_pending; - (phwxmits+1)->accnt++; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n")); - break; - - case 6: - case 7: - ptxservq = &(psta->sta_xmitpriv.vo_q); - *ppstapending = &padapter->xmitpriv.vo_pending; - (phwxmits+0)->accnt++; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n")); - break; - - case 0: - case 3: - default: - ptxservq = &(psta->sta_xmitpriv.be_q); - *ppstapending = &padapter->xmitpriv.be_pending; - (phwxmits+2)->accnt++; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n")); + *ppstapending = &padapter->xmitpriv.be_pending; + (phwxmits + 2)->accnt++; break; - + } } -_func_exit_; - return ptxservq; + return ptxservq; } #endif @@ -3351,7 +3407,7 @@ _func_exit_; */ s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe) { - //_irqL irqL0; + /* _irqL irqL0; */ u8 ac_index; struct sta_info *psta; struct tx_servq *ptxservq; @@ -3360,63 +3416,57 @@ s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe) struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; sint res = _SUCCESS; -_func_enter_; DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class); -/* - if (pattrib->psta) { - psta = pattrib->psta; - } else { - DBG_871X("%s, call rtw_get_stainfo()\n", __func__); - psta = rtw_get_stainfo(pstapriv, pattrib->ra); - } -*/ + /* + if (pattrib->psta) { + psta = pattrib->psta; + } else { + RTW_INFO("%s, call rtw_get_stainfo()\n", __func__); + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + } + */ psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - if(pattrib->psta != psta) - { + if (pattrib->psta != psta) { DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_sta); - DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); + RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); return _FAIL; } if (psta == NULL) { DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_nosta); res = _FAIL; - DBG_8192C("rtw_xmit_classifier: psta == NULL\n"); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n")); + RTW_INFO("rtw_xmit_classifier: psta == NULL\n"); goto exit; } - if(!(psta->state &_FW_LINKED)) - { + if (!(psta->state & _FW_LINKED)) { DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_fwlink); - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); return _FAIL; } ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index)); - //_enter_critical(&pstapending->lock, &irqL0); + /* _enter_critical(&pstapending->lock, &irqL0); */ - if (rtw_is_list_empty(&ptxservq->tx_pending)) { + if (rtw_is_list_empty(&ptxservq->tx_pending)) rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue)); - } - //_enter_critical(&ptxservq->sta_pending.lock, &irqL1); + /* _enter_critical(&ptxservq->sta_pending.lock, &irqL1); */ rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending)); ptxservq->qcnt++; phwxmits[ac_index].accnt++; - //_exit_critical(&ptxservq->sta_pending.lock, &irqL1); + /* _exit_critical(&ptxservq->sta_pending.lock, &irqL1); */ - //_exit_critical(&pstapending->lock, &irqL0); + /* _exit_critical(&pstapending->lock, &irqL0); */ exit: -_func_exit_; return res; } @@ -3430,64 +3480,58 @@ void rtw_alloc_hwxmits(_adapter *padapter) pxmitpriv->hwxmits = NULL; - pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry); + pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof(struct hw_xmit) * pxmitpriv->hwxmit_entry); - if(pxmitpriv->hwxmits == NULL) - { - DBG_871X("alloc hwxmits fail!...\n"); + if (pxmitpriv->hwxmits == NULL) { + RTW_INFO("alloc hwxmits fail!...\n"); return; } - + hwxmits = pxmitpriv->hwxmits; - if(pxmitpriv->hwxmit_entry == 5) - { - //pxmitpriv->bmc_txqueue.head = 0; - //hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue; + if (pxmitpriv->hwxmit_entry == 5) { + /* pxmitpriv->bmc_txqueue.head = 0; */ + /* hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue; */ hwxmits[0] .sta_queue = &pxmitpriv->bm_pending; - - //pxmitpriv->vo_txqueue.head = 0; - //hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue; + + /* pxmitpriv->vo_txqueue.head = 0; */ + /* hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue; */ hwxmits[1] .sta_queue = &pxmitpriv->vo_pending; - //pxmitpriv->vi_txqueue.head = 0; - //hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue; + /* pxmitpriv->vi_txqueue.head = 0; */ + /* hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue; */ hwxmits[2] .sta_queue = &pxmitpriv->vi_pending; - - //pxmitpriv->bk_txqueue.head = 0; - //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; + + /* pxmitpriv->bk_txqueue.head = 0; */ + /* hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; */ hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; - //pxmitpriv->be_txqueue.head = 0; - //hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue; + /* pxmitpriv->be_txqueue.head = 0; */ + /* hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue; */ hwxmits[4] .sta_queue = &pxmitpriv->be_pending; - - } - else if(pxmitpriv->hwxmit_entry == 4) - { - //pxmitpriv->vo_txqueue.head = 0; - //hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue; + } else if (pxmitpriv->hwxmit_entry == 4) { + + /* pxmitpriv->vo_txqueue.head = 0; */ + /* hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue; */ hwxmits[0] .sta_queue = &pxmitpriv->vo_pending; - //pxmitpriv->vi_txqueue.head = 0; - //hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue; + /* pxmitpriv->vi_txqueue.head = 0; */ + /* hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue; */ hwxmits[1] .sta_queue = &pxmitpriv->vi_pending; - //pxmitpriv->be_txqueue.head = 0; - //hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue; + /* pxmitpriv->be_txqueue.head = 0; */ + /* hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue; */ hwxmits[2] .sta_queue = &pxmitpriv->be_pending; - - //pxmitpriv->bk_txqueue.head = 0; - //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; + + /* pxmitpriv->bk_txqueue.head = 0; */ + /* hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; */ hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; - } - else - { - + } else { + } - + } @@ -3497,22 +3541,19 @@ void rtw_free_hwxmits(_adapter *padapter) struct xmit_priv *pxmitpriv = &padapter->xmitpriv; hwxmits = pxmitpriv->hwxmits; - if(hwxmits) - rtw_mfree((u8 *)hwxmits, (sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry)); + if (hwxmits) + rtw_mfree((u8 *)hwxmits, (sizeof(struct hw_xmit) * pxmitpriv->hwxmit_entry)); } void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry) { sint i; -_func_enter_; - for(i = 0; i < entry; i++, phwxmit++) - { - //_rtw_spinlock_init(&phwxmit->xmit_lock); - //_rtw_init_listhead(&phwxmit->pending); - //phwxmit->txcmdcnt = 0; + for (i = 0; i < entry; i++, phwxmit++) { + /* _rtw_spinlock_init(&phwxmit->xmit_lock); */ + /* _rtw_init_listhead(&phwxmit->pending); */ + /* phwxmit->txcmdcnt = 0; */ phwxmit->accnt = 0; } -_func_exit_; } #ifdef CONFIG_BR_EXT @@ -3521,217 +3562,212 @@ int rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb) struct sk_buff *skb = *pskb; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; _irqL irqL; - //if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) + /* if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) */ { void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb); - int res, is_vlan_tag=0, i, do_nat25=1; - unsigned short vlan_hdr=0; + int res, is_vlan_tag = 0, i, do_nat25 = 1; + unsigned short vlan_hdr = 0; void *br_port = NULL; - //mac_clone_handle_frame(priv, skb); + /* mac_clone_handle_frame(priv, skb); */ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) br_port = padapter->pnetdev->br_port; -#else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) +#else /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */ rcu_read_lock(); br_port = rcu_dereference(padapter->pnetdev->rx_handler_data); rcu_read_unlock(); -#endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) +#endif /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */ _enter_critical_bh(&padapter->br_ext_lock, &irqL); - if ( !(skb->data[0] & 1) && - br_port && - memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) && - *((unsigned short *)(skb->data+MACADDRLEN*2)) != __constant_htons(ETH_P_8021Q) && - *((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP) && - !memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) { - memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); + if (!(skb->data[0] & 1) && + br_port && + memcmp(skb->data + MACADDRLEN, padapter->br_mac, MACADDRLEN) && + *((unsigned short *)(skb->data + MACADDRLEN * 2)) != __constant_htons(ETH_P_8021Q) && + *((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_IP) && + !memcmp(padapter->scdb_mac, skb->data + MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) { + memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); padapter->scdb_entry->ageing_timer = jiffies; _exit_critical_bh(&padapter->br_ext_lock, &irqL); - } - else - //if (!priv->pmib->ethBrExtInfo.nat25_disable) + } else + /* if (!priv->pmib->ethBrExtInfo.nat25_disable) */ { -// if (priv->dev->br_port && -// !memcmp(skb->data+MACADDRLEN, priv->br_mac, MACADDRLEN)) { + /* if (priv->dev->br_port && + * !memcmp(skb->data+MACADDRLEN, priv->br_mac, MACADDRLEN)) { */ #if 1 - if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) { + if (*((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_8021Q)) { is_vlan_tag = 1; - vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2)); - for (i=0; i<6; i++) - *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2)); + vlan_hdr = *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)); + for (i = 0; i < 6; i++) + *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2 - i * 2)) = *((unsigned short *)(skb->data + MACADDRLEN * 2 - 2 - i * 2)); skb_pull(skb, 4); } - //if SA == br_mac && skb== IP => copy SIP to br_ip ?? why - if (!memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) && - (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP))) - memcpy(padapter->br_ip, skb->data+WLAN_ETHHDR_LEN+12, 4); + /* if SA == br_mac && skb== IP => copy SIP to br_ip ?? why */ + if (!memcmp(skb->data + MACADDRLEN, padapter->br_mac, MACADDRLEN) && + (*((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_IP))) + memcpy(padapter->br_ip, skb->data + WLAN_ETHHDR_LEN + 12, 4); - if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)) { - if (memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN)) { + if (*((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_IP)) { + if (memcmp(padapter->scdb_mac, skb->data + MACADDRLEN, MACADDRLEN)) { void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, unsigned char *ipAddr); - - if ((padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter, - skb->data+MACADDRLEN, skb->data+WLAN_ETHHDR_LEN+12)) != NULL) { - memcpy(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN); - memcpy(padapter->scdb_ip, skb->data+WLAN_ETHHDR_LEN+12, 4); + + padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter, + skb->data + MACADDRLEN, skb->data + WLAN_ETHHDR_LEN + 12); + if (padapter->scdb_entry != NULL) { + memcpy(padapter->scdb_mac, skb->data + MACADDRLEN, MACADDRLEN); + memcpy(padapter->scdb_ip, skb->data + WLAN_ETHHDR_LEN + 12, 4); padapter->scdb_entry->ageing_timer = jiffies; do_nat25 = 0; } - } - else { + } else { if (padapter->scdb_entry) { padapter->scdb_entry->ageing_timer = jiffies; do_nat25 = 0; - } - else { + } else { memset(padapter->scdb_mac, 0, MACADDRLEN); memset(padapter->scdb_ip, 0, 4); } } } _exit_critical_bh(&padapter->br_ext_lock, &irqL); -#endif // 1 - if (do_nat25) - { +#endif /* 1 */ + if (do_nat25) { int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method); if (nat25_db_handle(padapter, skb, NAT25_CHECK) == 0) { struct sk_buff *newskb; if (is_vlan_tag) { skb_push(skb, 4); - for (i=0; i<6; i++) - *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2)); - *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q); - *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr; + for (i = 0; i < 6; i++) + *((unsigned short *)(skb->data + i * 2)) = *((unsigned short *)(skb->data + 4 + i * 2)); + *((unsigned short *)(skb->data + MACADDRLEN * 2)) = __constant_htons(ETH_P_8021Q); + *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)) = vlan_hdr; } newskb = rtw_skb_copy(skb); if (newskb == NULL) { - //priv->ext_stats.tx_drops++; + /* priv->ext_stats.tx_drops++; */ DEBUG_ERR("TX DROP: rtw_skb_copy fail!\n"); - //goto stop_proc; + /* goto stop_proc; */ return -1; } rtw_skb_free(skb); *pskb = skb = newskb; if (is_vlan_tag) { - vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2)); - for (i=0; i<6; i++) - *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2)); + vlan_hdr = *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)); + for (i = 0; i < 6; i++) + *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2 - i * 2)) = *((unsigned short *)(skb->data + MACADDRLEN * 2 - 2 - i * 2)); skb_pull(skb, 4); } } if (skb_is_nonlinear(skb)) DEBUG_ERR("%s(): skb_is_nonlinear!!\n", __FUNCTION__); - + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)) res = skb_linearize(skb, GFP_ATOMIC); -#else // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)) +#else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)) */ res = skb_linearize(skb); -#endif // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)) - if (res < 0) { - DEBUG_ERR("TX DROP: skb_linearize fail!\n"); - //goto free_and_stop; - return -1; +#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)) */ + if (res < 0) { + DEBUG_ERR("TX DROP: skb_linearize fail!\n"); + /* goto free_and_stop; */ + return -1; } - + res = nat25_db_handle(padapter, skb, NAT25_INSERT); if (res < 0) { if (res == -2) { - //priv->ext_stats.tx_drops++; + /* priv->ext_stats.tx_drops++; */ DEBUG_ERR("TX DROP: nat25_db_handle fail!\n"); - //goto free_and_stop; + /* goto free_and_stop; */ return -1; } - // we just print warning message and let it go - //DEBUG_WARN("%s()-%d: nat25_db_handle INSERT Warning!\n", __FUNCTION__, __LINE__); - //return -1; // return -1 will cause system crash on 2011/08/30! + /* we just print warning message and let it go */ + /* DEBUG_WARN("%s()-%d: nat25_db_handle INSERT Warning!\n", __FUNCTION__, __LINE__); */ + /* return -1; */ /* return -1 will cause system crash on 2011/08/30! */ return 0; } } - memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); + memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); dhcp_flag_bcast(padapter, skb); if (is_vlan_tag) { skb_push(skb, 4); - for (i=0; i<6; i++) - *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2)); - *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q); - *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr; + for (i = 0; i < 6; i++) + *((unsigned short *)(skb->data + i * 2)) = *((unsigned short *)(skb->data + 4 + i * 2)); + *((unsigned short *)(skb->data + MACADDRLEN * 2)) = __constant_htons(ETH_P_8021Q); + *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)) = vlan_hdr; } } -#if 0 - else{ - if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) { +#if 0 + else { + if (*((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_8021Q)) is_vlan_tag = 1; - } - - if(is_vlan_tag){ - if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A_VALN(skb->data)){ - memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); - } - }else - { - if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A(skb->data)){ - memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); - } - } - } -#endif // 0 - // check if SA is equal to our MAC - if (memcmp(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) { - //priv->ext_stats.tx_drops++; + if (is_vlan_tag) { + if (ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A_VALN(skb->data)) + memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); + } else { + if (ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A(skb->data)) + memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN); + } + } +#endif /* 0 */ + + /* check if SA is equal to our MAC */ + if (memcmp(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) { + /* priv->ext_stats.tx_drops++; */ DEBUG_ERR("TX DROP: untransformed frame SA:%02X%02X%02X%02X%02X%02X!\n", - skb->data[6],skb->data[7],skb->data[8],skb->data[9],skb->data[10],skb->data[11]); - //goto free_and_stop; + skb->data[6], skb->data[7], skb->data[8], skb->data[9], skb->data[10], skb->data[11]); + /* goto free_and_stop; */ return -1; } } return 0; } -#endif // CONFIG_BR_EXT +#endif /* CONFIG_BR_EXT */ u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe) { u32 addr; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - - switch(pattrib->qsel) - { - case 0: - case 3: - addr = BE_QUEUE_INX; - break; - case 1: - case 2: - addr = BK_QUEUE_INX; - break; - case 4: - case 5: - addr = VI_QUEUE_INX; - break; - case 6: - case 7: - addr = VO_QUEUE_INX; - break; - case 0x10: - addr = BCN_QUEUE_INX; - break; - case 0x11://BC/MC in PS (HIQ) - addr = HIGH_QUEUE_INX; - break; - case 0x12: - default: - addr = MGT_QUEUE_INX; - break; - + struct pkt_attrib *pattrib = &pxmitframe->attrib; + + switch (pattrib->qsel) { + case 0: + case 3: + addr = BE_QUEUE_INX; + break; + case 1: + case 2: + addr = BK_QUEUE_INX; + break; + case 4: + case 5: + addr = VI_QUEUE_INX; + break; + case 6: + case 7: + addr = VO_QUEUE_INX; + break; + case 0x10: + addr = BCN_QUEUE_INX; + break; + case 0x11: /* BC/MC in PS (HIQ) */ + addr = HIGH_QUEUE_INX; + break; + case 0x13: + addr = TXCMD_QUEUE_INX; + break; + case 0x12: + default: + addr = MGT_QUEUE_INX; + break; + } return addr; @@ -3741,25 +3777,33 @@ u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe) static void do_queue_select(_adapter *padapter, struct pkt_attrib *pattrib) { u8 qsel; - + qsel = pattrib->priority; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("### do_queue_select priority=%d ,qsel = %d\n",pattrib->priority ,qsel)); -#ifdef CONFIG_CONCURRENT_MODE -// if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) -// qsel = 7;// +#ifdef CONFIG_CONCURRENT_MODE + /* if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) + * qsel = 7; */ #endif - - pattrib->qsel = qsel; -} -static inline void dump_buf(u8 *buf, u32 len) -{ - u32 i; - printk("-----------------Len %d----------------\n", len); - for(i=0; imcc_adapterpriv.role == MCC_ROLE_GO + || padapter->mcc_adapterpriv.role == MCC_ROLE_AP) { + pattrib->qsel = QSLT_VO; /* AP interface VO queue */ + } else { + pattrib->qsel = QSLT_BE; /* STA interface BE queue */ + } + } else + /* Not Under MCC */ + pattrib->qsel = qsel; + } else + /* Not enable MCC */ + pattrib->qsel = qsel; +#else /* !CONFIG_MCC_MODE */ + pattrib->qsel = qsel; +#endif /* CONFIG_MCC_MODE */ } /* @@ -3781,11 +3825,9 @@ s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev) u16 frame_ctl; unsigned char src_mac_addr[6]; unsigned char dst_mac_addr[6]; - struct ieee80211_hdr *dot11_hdr; + struct rtw_ieee80211_hdr *dot11_hdr; struct ieee80211_radiotap_header *rtap_hdr; _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - - //DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); if (skb) rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, skb->truesize); @@ -3801,19 +3843,18 @@ s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev) if (unlikely(skb->len < rtap_len)) goto fail; - if(rtap_len != 12) - { - DBG_8192C("radiotap len (should be 14): %d\n", rtap_len); + if (rtap_len != 12) { + RTW_INFO("radiotap len (should be 14): %d\n", rtap_len); goto fail; - } + } /* Skip the ratio tap header */ skb_pull(skb, rtap_len); - dot11_hdr = (struct ieee80211_hdr *)skb->data; - frame_ctl = le16_to_cpu(dot11_hdr->frame_control); + dot11_hdr = (struct rtw_ieee80211_hdr *)skb->data; + frame_ctl = le16_to_cpu(dot11_hdr->frame_ctl); /* Check if the QoS bit is set */ - + if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) { struct xmit_frame *pmgntframe; @@ -3827,7 +3868,8 @@ s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev) u8 category, action; int type = -1; - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) { + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) { rtw_udelay_os(500); goto fail; } @@ -3841,14 +3883,14 @@ s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev) pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - _rtw_memcpy(pframe, (void*)buf, len); + _rtw_memcpy(pframe, (void *)buf, len); pattrib->pktlen = len; pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - if(is_broadcast_mac_addr(pwlanhdr->addr3) || is_broadcast_mac_addr(pwlanhdr->addr1)) - pattrib->rate = MGN_24M; + if (is_broadcast_mac_addr(pwlanhdr->addr3) || is_broadcast_mac_addr(pwlanhdr->addr1)) + pattrib->rate = MGN_24M; pmlmeext->mgnt_seq = GetSequence(pwlanhdr); pattrib->seqnum = pmlmeext->mgnt_seq; @@ -3870,7 +3912,8 @@ s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev) u8 category, action; int type = -1; - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) goto fail; pattrib = &pmgntframe->attrib; @@ -3881,7 +3924,7 @@ s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev) pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - _rtw_memcpy(pframe, (void*)buf, len); + _rtw_memcpy(pframe, (void *)buf, len); pattrib->pktlen = len; @@ -3896,12 +3939,12 @@ s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev) dump_mgntframe(padapter, pmgntframe); } - - fail: - - rtw_skb_free(skb); - - return 0; + +fail: + + rtw_skb_free(skb); + + return 0; } /* @@ -3924,7 +3967,7 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt) #ifdef CONFIG_BR_EXT struct mlme_priv *pmlmepriv = &padapter->mlmepriv; void *br_port = NULL; -#endif // CONFIG_BR_EXT +#endif /* CONFIG_BR_EXT */ s32 res; @@ -3937,14 +3980,14 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt) if (rtw_get_passing_time_ms(start) > 2000) { if (drop_cnt) - DBG_871X("DBG_TX_DROP_FRAME %s no more pxmitframe, drop_cnt:%u\n", __FUNCTION__, drop_cnt); + RTW_INFO("DBG_TX_DROP_FRAME %s no more pxmitframe, drop_cnt:%u\n", __FUNCTION__, drop_cnt); start = rtw_get_current_time(); drop_cnt = 0; } if (pxmitframe == NULL) { - drop_cnt ++; - RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n")); + drop_cnt++; + /*RTW_INFO("%s-"ADPT_FMT" no more xmitframe\n", __func__, ADPT_ARG(padapter));*/ DBG_COUNTER(padapter->tx_logs.core_tx_err_pxmitframe); return -1; } @@ -3953,42 +3996,43 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt) #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) br_port = padapter->pnetdev->br_port; -#else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) +#else /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */ rcu_read_lock(); br_port = rcu_dereference(padapter->pnetdev->rx_handler_data); rcu_read_unlock(); -#endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) +#endif /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */ - if( br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) - { + if (br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE) == _TRUE) { res = rtw_br_client_tx(padapter, ppkt); - if (res == -1) - { + if (res == -1) { rtw_free_xmitframe(pxmitpriv, pxmitframe); DBG_COUNTER(padapter->tx_logs.core_tx_err_brtx); return -1; } - } + } -#endif // CONFIG_BR_EXT +#endif /* CONFIG_BR_EXT */ res = update_attrib(padapter, *ppkt, &pxmitframe->attrib); +#ifdef CONFIG_MCC_MODE + /* record data kernel TX to driver to check MCC concurrent TX */ + rtw_hal_mcc_calc_tx_bytes_from_kernel(padapter, pxmitframe->attrib.pktlen); +#endif /* CONFIG_MCC_MODE */ + #ifdef CONFIG_WAPI_SUPPORT - if(pxmitframe->attrib.ether_type != 0x88B4) - { - if(rtw_wapi_drop_for_key_absent(padapter, pxmitframe->attrib.ra)) - { - WAPI_TRACE(WAPI_RX,"drop for key absend when tx \n"); + if (pxmitframe->attrib.ether_type != 0x88B4) { + if (rtw_wapi_drop_for_key_absent(padapter, pxmitframe->attrib.ra)) { + WAPI_TRACE(WAPI_RX, "drop for key absend when tx\n"); res = _FAIL; } } #endif if (res == _FAIL) { - RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: update attrib fail\n")); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__); - #endif + /*RTW_INFO("%s-"ADPT_FMT" update attrib fail\n", __func__, ADPT_ARG(padapter));*/ +#ifdef DBG_TX_DROP_FRAME + RTW_INFO("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__); +#endif rtw_free_xmitframe(pxmitpriv, pxmitframe); return -1; } @@ -4000,16 +4044,15 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt) #ifdef CONFIG_AP_MODE _enter_critical_bh(&pxmitpriv->lock, &irqL0); - if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE) - { + if (xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE) { _exit_critical_bh(&pxmitpriv->lock, &irqL0); DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue); - return 1; + return 1; } _exit_critical_bh(&pxmitpriv->lock, &irqL0); #endif - //pre_xmitframe + /* pre_xmitframe */ if (rtw_hal_xmit(padapter, pxmitframe) == _FALSE) return 1; @@ -4019,75 +4062,72 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt) #ifdef CONFIG_TDLS sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe) { - sint ret=_FALSE; + sint ret = _FALSE; _irqL irqL; - struct sta_info *ptdls_sta=NULL; + struct sta_info *ptdls_sta = NULL; struct sta_priv *pstapriv = &padapter->stapriv; struct pkt_attrib *pattrib = &pxmitframe->attrib; struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); int i; - - ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); - if(ptdls_sta==NULL){ - return ret; - }else if(ptdls_sta->tdls_sta_state&TDLS_LINKED_STATE){ - if(pattrib->triggered==1) - { + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + if (ptdls_sta == NULL) + return ret; + else if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) { + + if (pattrib->triggered == 1) { ret = _TRUE; return ret; } - _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - - if(ptdls_sta->state&WIFI_SLEEP_STATE) - { + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + if (ptdls_sta->state & WIFI_SLEEP_STATE) { rtw_list_delete(&pxmitframe->list); - - //_enter_critical_bh(&psta->sleep_q.lock, &irqL); - + + /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */ + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q)); - + ptdls_sta->sleepq_len++; ptdls_sta->sleepq_ac_len++; - //indicate 4-AC queue bit in TDLS peer traffic indication - switch(pattrib->priority) - { - case 1: - case 2: - ptdls_sta->uapsd_bk |= BIT(1); - break; - case 4: - case 5: - ptdls_sta->uapsd_vi |= BIT(1); - break; - case 6: - case 7: - ptdls_sta->uapsd_vo |= BIT(1); - break; - case 0: - case 3: - default: - ptdls_sta->uapsd_be |= BIT(1); - break; + /* indicate 4-AC queue bit in TDLS peer traffic indication */ + switch (pattrib->priority) { + case 1: + case 2: + ptdls_sta->uapsd_bk |= BIT(1); + break; + case 4: + case 5: + ptdls_sta->uapsd_vi |= BIT(1); + break; + case 6: + case 7: + ptdls_sta->uapsd_vo |= BIT(1); + break; + case 0: + case 3: + default: + ptdls_sta->uapsd_be |= BIT(1); + break; } /* Transmit TDLS PTI via AP */ - if(ptdls_sta->sleepq_len==1) + if (ptdls_sta->sleepq_len == 1) rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ISSUE_PTI); ret = _TRUE; } - _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); } return ret; - + } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ #define RTW_HIQ_FILTER_ALLOW_ALL 0 #define RTW_HIQ_FILTER_ALLOW_SPECIAL 1 @@ -4099,36 +4139,32 @@ inline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe) _adapter *adapter = xmitframe->padapter; struct registry_priv *registry = &adapter->registrypriv; -if (rtw_get_intf_type(adapter) != RTW_PCIE) { + if (rtw_get_intf_type(adapter) != RTW_PCIE) { - if (adapter->registrypriv.wifi_spec == 1) { - allow = _TRUE; - } else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) { - - struct pkt_attrib *attrib = &xmitframe->attrib; - - if (attrib->ether_type == 0x0806 - || attrib->ether_type == 0x888e - #ifdef CONFIG_WAPI_SUPPORT - || attrib->ether_type == 0x88B4 - #endif - || attrib->dhcp_pkt - ) { - if (0) - DBG_871X(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter) - , attrib->ether_type, attrib->dhcp_pkt?" DHCP":""); + if (adapter->registrypriv.wifi_spec == 1) allow = _TRUE; - } + else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) { + + struct pkt_attrib *attrib = &xmitframe->attrib; + + if (attrib->ether_type == 0x0806 + || attrib->ether_type == 0x888e +#ifdef CONFIG_WAPI_SUPPORT + || attrib->ether_type == 0x88B4 +#endif + || attrib->dhcp_pkt + ) { + if (0) + RTW_INFO(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter) + , attrib->ether_type, attrib->dhcp_pkt ? " DHCP" : ""); + allow = _TRUE; + } + } else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) + allow = _TRUE; + else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) { + } else + rtw_warn_on(1); } - else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) { - allow = _TRUE; - } - else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) { - } - else { - rtw_warn_on(1); - } -} return allow; } @@ -4137,8 +4173,8 @@ if (rtw_get_intf_type(adapter) != RTW_PCIE) { sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe) { _irqL irqL; - sint ret=_FALSE; - struct sta_info *psta=NULL; + sint ret = _FALSE; + struct sta_info *psta = NULL; struct sta_priv *pstapriv = &padapter->stapriv; struct pkt_attrib *pattrib = &pxmitframe->attrib; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -4146,181 +4182,158 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p bool update_tim = _FALSE; #ifdef CONFIG_TDLS - if( padapter->tdlsinfo.link_established == _TRUE ) - { + if (padapter->tdlsinfo.link_established == _TRUE) ret = xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pxmitframe); - } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE) - { + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE) { DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_fwstate); - return ret; + return ret; } -/* - if(pattrib->psta) - { - psta = pattrib->psta; - } - else - { - DBG_871X("%s, call rtw_get_stainfo()\n", __func__); - psta=rtw_get_stainfo(pstapriv, pattrib->ra); - } -*/ + /* + if(pattrib->psta) + { + psta = pattrib->psta; + } + else + { + RTW_INFO("%s, call rtw_get_stainfo()\n", __func__); + psta=rtw_get_stainfo(pstapriv, pattrib->ra); + } + */ psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - if(pattrib->psta != psta) - { + if (pattrib->psta != psta) { DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_sta); - DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); + RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta); return _FALSE; } - if(psta==NULL) - { + if (psta == NULL) { DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_nosta); - DBG_871X("%s, psta==NUL\n", __func__); + RTW_INFO("%s, psta==NUL\n", __func__); return _FALSE; } - if(!(psta->state &_FW_LINKED)) - { + if (!(psta->state & _FW_LINKED)) { DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_link); - DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); + RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state); return _FALSE; } - if(pattrib->triggered==1) - { + if (pattrib->triggered == 1) { DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_trigger); - //DBG_871X("directly xmit pspoll_triggered packet\n"); + /* RTW_INFO("directly xmit pspoll_triggered packet\n"); */ - //pattrib->triggered=0; + /* pattrib->triggered=0; */ if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE) - pattrib->qsel = QSLT_HIGH;//HIQ + pattrib->qsel = QSLT_HIGH;/* HIQ */ return ret; } - if(bmcst) - { - _enter_critical_bh(&psta->sleep_q.lock, &irqL); - - if(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode - { - //pattrib->qsel = QSLT_HIGH;//HIQ - + if (bmcst) { + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + if (pstapriv->sta_dz_bitmap) { /* if anyone sta is in ps mode */ + /* pattrib->qsel = QSLT_HIGH; */ /* HIQ */ + rtw_list_delete(&pxmitframe->list); - - //_enter_critical_bh(&psta->sleep_q.lock, &irqL); - + + /*_enter_critical_bh(&psta->sleep_q.lock, &irqL);*/ + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); - + psta->sleepq_len++; if (!(pstapriv->tim_bitmap & BIT(0))) update_tim = _TRUE; - pstapriv->tim_bitmap |= BIT(0);// + pstapriv->tim_bitmap |= BIT(0); pstapriv->sta_dz_bitmap |= BIT(0); - //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); - if (padapter->registrypriv.wifi_spec == 1) { - /* - *if (update_tim == _TRUE) - * rtw_chk_hi_queue_cmd(padapter); - */ - } else { + /* RTW_INFO("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); */ + if (update_tim == _TRUE) { + if (is_broadcast_mac_addr(pattrib->ra)) + _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC"); + else + _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC"); + } else + chk_bmc_sleepq_cmd(padapter); - if (update_tim == _TRUE) { - if (is_broadcast_mac_addr(pattrib->ra)) - _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC"); - else - _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC"); - } else { - chk_bmc_sleepq_cmd(padapter); - } - } + /*_exit_critical_bh(&psta->sleep_q.lock, &irqL);*/ - //_exit_critical_bh(&psta->sleep_q.lock, &irqL); - - ret = _TRUE; + ret = _TRUE; DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast); - - } - - _exit_critical_bh(&psta->sleep_q.lock, &irqL); - - return ret; - - } - - _enter_critical_bh(&psta->sleep_q.lock, &irqL); - - if(psta->state&WIFI_SLEEP_STATE) - { - u8 wmmps_ac=0; - - if(pstapriv->sta_dz_bitmap&BIT(psta->aid)) - { + } + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + + return ret; + + } + + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + if (psta->state & WIFI_SLEEP_STATE) { + u8 wmmps_ac = 0; + + if (pstapriv->sta_dz_bitmap & BIT(psta->aid)) { rtw_list_delete(&pxmitframe->list); - - //_enter_critical_bh(&psta->sleep_q.lock, &irqL); - + + /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */ + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); - + psta->sleepq_len++; - switch(pattrib->priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(0); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(0); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(0); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(0); - break; + switch (pattrib->priority) { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk & BIT(0); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi & BIT(0); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo & BIT(0); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be & BIT(0); + break; } - if(wmmps_ac) + if (wmmps_ac) psta->sleepq_ac_len++; - if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac))) - { + if (((psta->has_legacy_ac) && (!wmmps_ac)) || ((!psta->has_legacy_ac) && (wmmps_ac))) { if (!(pstapriv->tim_bitmap & BIT(psta->aid))) update_tim = _TRUE; pstapriv->tim_bitmap |= BIT(psta->aid); - //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); + /* RTW_INFO("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); */ - if(update_tim == _TRUE) - { - //DBG_871X("sleepq_len==1, update BCNTIM\n"); - //upate BCN for TIM IE + if (update_tim == _TRUE) { + /* RTW_INFO("sleepq_len==1, update BCNTIM\n"); */ + /* upate BCN for TIM IE */ _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer UC"); } } - //_exit_critical_bh(&psta->sleep_q.lock, &irqL); + /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */ - //if(psta->sleepq_len > (NR_XMITFRAME>>3)) - //{ - // wakeup_sta_to_xmit(padapter, psta); - //} + /* if(psta->sleepq_len > (NR_XMITFRAME>>3)) */ + /* { */ + /* wakeup_sta_to_xmit(padapter, psta); */ + /* } */ ret = _TRUE; @@ -4329,10 +4342,10 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p } - _exit_critical_bh(&psta->sleep_q.lock, &irqL); + _exit_critical_bh(&psta->sleep_q.lock, &irqL); return ret; - + } static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_info *psta, _queue *pframequeue) @@ -4342,64 +4355,60 @@ static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_ u8 ac_index; struct tx_servq *ptxservq; struct pkt_attrib *pattrib; - struct xmit_frame *pxmitframe; + struct xmit_frame *pxmitframe; struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; - + phead = get_list_head(pframequeue); plist = get_next(phead); - - while (rtw_end_of_queue_search(phead, plist) == _FALSE) - { + + while (rtw_end_of_queue_search(phead, plist) == _FALSE) { pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list); plist = get_next(plist); - + pattrib = &pxmitframe->attrib; pattrib->triggered = 0; - - ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe); - if(_TRUE == ret) - { + ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe); + + if (_TRUE == ret) { ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index)); ptxservq->qcnt--; phwxmits[ac_index].accnt--; + } else { + /* RTW_INFO("xmitframe_enqueue_for_sleeping_sta return _FALSE\n"); */ } - else - { - //DBG_871X("xmitframe_enqueue_for_sleeping_sta return _FALSE\n"); - } - + } - + } void stop_sta_xmit(_adapter *padapter, struct sta_info *psta) -{ - _irqL irqL0; +{ + _irqL irqL0; struct sta_info *psta_bmc; struct sta_xmit_priv *pstaxmitpriv; - struct sta_priv *pstapriv = &padapter->stapriv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - + struct sta_priv *pstapriv = &padapter->stapriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + pstaxmitpriv = &psta->sta_xmitpriv; - //for BC/MC Frames + /* for BC/MC Frames */ psta_bmc = rtw_get_bcmc_stainfo(padapter); - - + + _enter_critical_bh(&pxmitpriv->lock, &irqL0); psta->state |= WIFI_SLEEP_STATE; - + #ifdef CONFIG_TDLS - if( !(psta->tdls_sta_state & TDLS_LINKED_STATE) ) -#endif //CONFIG_TDLS - pstapriv->sta_dz_bitmap |= BIT(psta->aid); - - + if (!(psta->tdls_sta_state & TDLS_LINKED_STATE)) +#endif /* CONFIG_TDLS */ + pstapriv->sta_dz_bitmap |= BIT(psta->aid); + + dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vo_q.sta_pending); rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending)); @@ -4411,94 +4420,88 @@ void stop_sta_xmit(_adapter *padapter, struct sta_info *psta) dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->be_q.sta_pending); rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending)); - + dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->bk_q.sta_pending); rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending)); #ifdef CONFIG_TDLS if (!(psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta_bmc != NULL)) { -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ - //for BC/MC Frames - pstaxmitpriv = &psta_bmc->sta_xmitpriv; - dequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending); - rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending)); - + /* for BC/MC Frames */ + pstaxmitpriv = &psta_bmc->sta_xmitpriv; + dequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending); + rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending)); -#ifdef CONFIG_TDLS - } -#endif //CONFIG_TDLS + +#ifdef CONFIG_TDLS + } +#endif /* CONFIG_TDLS */ _exit_critical_bh(&pxmitpriv->lock, &irqL0); - -} + +} void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) -{ - _irqL irqL; - u8 update_mask=0, wmmps_ac=0; +{ + _irqL irqL; + u8 update_mask = 0, wmmps_ac = 0; struct sta_info *psta_bmc; _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; + struct xmit_frame *pxmitframe = NULL; struct sta_priv *pstapriv = &padapter->stapriv; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; psta_bmc = rtw_get_bcmc_stainfo(padapter); - - //_enter_critical_bh(&psta->sleep_q.lock, &irqL); + + /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */ _enter_critical_bh(&pxmitpriv->lock, &irqL); xmitframe_phead = get_list_head(&psta->sleep_q); xmitframe_plist = get_next(xmitframe_phead); - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { + 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); - switch(pxmitframe->attrib.priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(1); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(1); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(1); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(1); - break; + switch (pxmitframe->attrib.priority) { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk & BIT(1); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi & BIT(1); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo & BIT(1); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be & BIT(1); + break; } psta->sleepq_len--; - if(psta->sleepq_len>0) + if (psta->sleepq_len > 0) pxmitframe->attrib.mdata = 1; else pxmitframe->attrib.mdata = 0; - if(wmmps_ac) - { + if (wmmps_ac) { psta->sleepq_ac_len--; - if(psta->sleepq_ac_len>0) - { + if (psta->sleepq_ac_len > 0) { pxmitframe->attrib.mdata = 1; pxmitframe->attrib.eosp = 0; - } - else - { + } else { pxmitframe->attrib.mdata = 0; pxmitframe->attrib.eosp = 1; } @@ -4506,47 +4509,44 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) pxmitframe->attrib.triggered = 1; -/* - _exit_critical_bh(&psta->sleep_q.lock, &irqL); - if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(padapter, pxmitframe); - } - _enter_critical_bh(&psta->sleep_q.lock, &irqL); -*/ + /* + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + */ rtw_hal_xmitframe_enqueue(padapter, pxmitframe); } - if(psta->sleepq_len==0) - { + if (psta->sleepq_len == 0) { #ifdef CONFIG_TDLS - if( psta->tdls_sta_state & TDLS_LINKED_STATE ) - { - if(psta->state&WIFI_SLEEP_STATE) + if (psta->tdls_sta_state & TDLS_LINKED_STATE) { + if (psta->state & WIFI_SLEEP_STATE) psta->state ^= WIFI_SLEEP_STATE; _exit_critical_bh(&pxmitpriv->lock, &irqL); return; } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ if (pstapriv->tim_bitmap & BIT(psta->aid)) { - //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); - //upate BCN for TIM IE - //update_BCNTIM(padapter); + /* RTW_INFO("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); */ + /* upate BCN for TIM IE */ + /* update_BCNTIM(padapter); */ update_mask = BIT(0); } pstapriv->tim_bitmap &= ~BIT(psta->aid); - if(psta->state&WIFI_SLEEP_STATE) + if (psta->state & WIFI_SLEEP_STATE) psta->state ^= WIFI_SLEEP_STATE; - if(psta->state & WIFI_STA_ALIVE_CHK_STATE) - { - DBG_871X("%s alive check\n", __func__); + if (psta->state & WIFI_STA_ALIVE_CHK_STATE) { + RTW_INFO("%s alive check\n", __func__); psta->expire_to = pstapriv->expire_to; psta->state ^= WIFI_STA_ALIVE_CHK_STATE; } @@ -4554,17 +4554,15 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); } - //for BC/MC Frames - if(!psta_bmc) + /* for BC/MC Frames */ + if (!psta_bmc) goto _exit; - if((pstapriv->sta_dz_bitmap&0xfffe) == 0x0)//no any sta in ps mode - { + if ((pstapriv->sta_dz_bitmap & 0xfffe) == 0x0) { /* no any sta in ps mode */ xmitframe_phead = get_list_head(&psta_bmc->sleep_q); xmitframe_plist = get_next(xmitframe_phead); - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { + 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); @@ -4572,102 +4570,98 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) rtw_list_delete(&pxmitframe->list); psta_bmc->sleepq_len--; - if(psta_bmc->sleepq_len>0) + if (psta_bmc->sleepq_len > 0) pxmitframe->attrib.mdata = 1; else pxmitframe->attrib.mdata = 0; pxmitframe->attrib.triggered = 1; -/* - _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); - if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(padapter, pxmitframe); - } - _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + /* + _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); -*/ + */ rtw_hal_xmitframe_enqueue(padapter, pxmitframe); } - if(psta_bmc->sleepq_len==0) - { + if (psta_bmc->sleepq_len == 0) { if (pstapriv->tim_bitmap & BIT(0)) { - //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); - //upate BCN for TIM IE - //update_BCNTIM(padapter); + /* RTW_INFO("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); */ + /* upate BCN for TIM IE */ + /* update_BCNTIM(padapter); */ update_mask |= BIT(1); } pstapriv->tim_bitmap &= ~BIT(0); pstapriv->sta_dz_bitmap &= ~BIT(0); } - } + } _exit: - //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + /* _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); */ _exit_critical_bh(&pxmitpriv->lock, &irqL); - if(update_mask) - { - //update_BCNTIM(padapter); - if ((update_mask & (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))) + if (update_mask) { + /* update_BCNTIM(padapter); */ + if ((update_mask & (BIT(0) | BIT(1))) == (BIT(0) | BIT(1))) _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC&BMC"); else if ((update_mask & BIT(1)) == BIT(1)) _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear BMC"); else _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC"); } - + } void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta) { _irqL irqL; - u8 wmmps_ac=0; + u8 wmmps_ac = 0; _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; + struct xmit_frame *pxmitframe = NULL; struct sta_priv *pstapriv = &padapter->stapriv; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - //_enter_critical_bh(&psta->sleep_q.lock, &irqL); + /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */ _enter_critical_bh(&pxmitpriv->lock, &irqL); xmitframe_phead = get_list_head(&psta->sleep_q); xmitframe_plist = get_next(xmitframe_phead); - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { + 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); - switch(pxmitframe->attrib.priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(1); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(1); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(1); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(1); - break; + switch (pxmitframe->attrib.priority) { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk & BIT(1); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi & BIT(1); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo & BIT(1); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be & BIT(1); + break; } - - if(!wmmps_ac) + + if (!wmmps_ac) continue; rtw_list_delete(&pxmitframe->list); @@ -4675,13 +4669,10 @@ void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta) psta->sleepq_len--; psta->sleepq_ac_len--; - if(psta->sleepq_ac_len>0) - { + if (psta->sleepq_ac_len > 0) { pxmitframe->attrib.mdata = 1; pxmitframe->attrib.eosp = 0; - } - else - { + } else { pxmitframe->attrib.mdata = 0; pxmitframe->attrib.eosp = 1; } @@ -4689,28 +4680,26 @@ void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta) pxmitframe->attrib.triggered = 1; rtw_hal_xmitframe_enqueue(padapter, pxmitframe); - if((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac)) - { + if ((psta->sleepq_ac_len == 0) && (!psta->has_legacy_ac) && (wmmps_ac)) { #ifdef CONFIG_TDLS - if(psta->tdls_sta_state & TDLS_LINKED_STATE ) - { - //_exit_critical_bh(&psta->sleep_q.lock, &irqL); + if (psta->tdls_sta_state & TDLS_LINKED_STATE) { + /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */ goto exit; } -#endif //CONFIG_TDLS +#endif /* CONFIG_TDLS */ pstapriv->tim_bitmap &= ~BIT(psta->aid); - //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); - //upate BCN for TIM IE - //update_BCNTIM(padapter); + /* RTW_INFO("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); */ + /* upate BCN for TIM IE */ + /* update_BCNTIM(padapter); */ update_beacon(padapter, _TIM_IE_, NULL, _TRUE); - //update_mask = BIT(0); + /* update_mask = BIT(0); */ } - - } + + } exit: - //_exit_critical_bh(&psta->sleep_q.lock, &irqL); + /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */ _exit_critical_bh(&pxmitpriv->lock, &irqL); return; @@ -4734,14 +4723,10 @@ void enqueue_pending_xmitbuf( rtw_list_insert_tail(&pxmitbuf->list, get_list_head(pqueue)); _exit_critical_bh(&pqueue->lock, &irql); - - #if defined(CONFIG_SDIO_HCI) && defined(CONFIG_CONCURRENT_MODE) - if (pri_adapter->adapter_type > PRIMARY_ADAPTER) - pri_adapter = pri_adapter->pbuddy_adapter; -#endif //SDIO_HCI + CONCURRENT + pri_adapter = GET_PRIMARY_ADAPTER(pri_adapter); +#endif /*SDIO_HCI + CONCURRENT*/ _rtw_up_sema(&(pri_adapter->xmitpriv.xmit_sema)); - } void enqueue_pending_xmitbuf_to_head( @@ -4749,10 +4734,7 @@ void enqueue_pending_xmitbuf_to_head( struct xmit_buf *pxmitbuf) { _irqL irql; - _queue *pqueue; - _adapter *pri_adapter = pxmitpriv->adapter; - - pqueue = &pxmitpriv->pending_xmitbuf_queue; + _queue *pqueue = &pxmitpriv->pending_xmitbuf_queue; _enter_critical_bh(&pqueue->lock, &irql); rtw_list_delete(&pxmitbuf->list); @@ -4760,7 +4742,7 @@ void enqueue_pending_xmitbuf_to_head( _exit_critical_bh(&pqueue->lock, &irql); } -struct xmit_buf* dequeue_pending_xmitbuf( +struct xmit_buf *dequeue_pending_xmitbuf( struct xmit_priv *pxmitpriv) { _irqL irql; @@ -4773,8 +4755,7 @@ struct xmit_buf* dequeue_pending_xmitbuf( _enter_critical_bh(&pqueue->lock, &irql); - if (_rtw_queue_empty(pqueue) == _FALSE) - { + if (_rtw_queue_empty(pqueue) == _FALSE) { _list *plist, *phead; phead = get_list_head(pqueue); @@ -4788,14 +4769,14 @@ struct xmit_buf* dequeue_pending_xmitbuf( return pxmitbuf; } -struct xmit_buf* dequeue_pending_xmitbuf_under_survey( +struct xmit_buf *dequeue_pending_xmitbuf_under_survey( struct xmit_priv *pxmitpriv) { _irqL irql; struct xmit_buf *pxmitbuf; -#ifdef CONFIG_USB_HCI +#ifdef CONFIG_USB_HCI struct xmit_frame *pxmitframe; -#endif +#endif _queue *pqueue; @@ -4804,8 +4785,7 @@ struct xmit_buf* dequeue_pending_xmitbuf_under_survey( _enter_critical_bh(&pqueue->lock, &irql); - if (_rtw_queue_empty(pqueue) == _FALSE) - { + if (_rtw_queue_empty(pqueue) == _FALSE) { _list *plist, *phead; u8 type; @@ -4813,28 +4793,24 @@ struct xmit_buf* dequeue_pending_xmitbuf_under_survey( plist = phead; do { plist = get_next(plist); - if (plist == phead) break; - + if (plist == phead) + break; + pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list); #ifdef CONFIG_USB_HCI - pxmitframe = (struct xmit_frame*)pxmitbuf->priv_data; - if(pxmitframe) - { + pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; + if (pxmitframe) type = GetFrameSubType(pxmitbuf->pbuf + TXDESC_SIZE + pxmitframe->pkt_offset * PACKET_OFFSET_SZ); - } else - { - DBG_871X("%s, !!!ERROR!!! For USB, TODO ITEM \n", __FUNCTION__); - } + RTW_INFO("%s, !!!ERROR!!! For USB, TODO ITEM\n", __FUNCTION__); #else type = GetFrameSubType(pxmitbuf->pbuf + TXDESC_OFFSET); #endif if ((type == WIFI_PROBEREQ) || - (type == WIFI_DATA_NULL) || - (type == WIFI_QOS_DATA_NULL)) - { + (type == WIFI_DATA_NULL) || + (type == WIFI_QOS_DATA_NULL)) { rtw_list_delete(&pxmitbuf->list); break; } @@ -4858,7 +4834,7 @@ sint check_pending_xmitbuf( _enter_critical_bh(&pqueue->lock, &irql); - if(_rtw_queue_empty(pqueue) == _FALSE) + if (_rtw_queue_empty(pqueue) == _FALSE) ret = _TRUE; _exit_critical_bh(&pqueue->lock, &irql); @@ -4917,6 +4893,17 @@ bool rtw_xmit_ac_blocked(_adapter *adapter) } } +#ifdef CONFIG_MCC_MODE + if (MCC_EN(adapter)) { + if (rtw_hal_check_mcc_status(adapter, MCC_STATUS_DOING_MCC)) { + if (MCC_STOP(adapter)) { + blocked = _TRUE; + goto exit; + } + } + } +#endif /* CONFIG_MCC_MODE */ + exit: return blocked; } @@ -4924,7 +4911,7 @@ exit: void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms) { sctx->timeout_ms = timeout_ms; - sctx->submit_time= rtw_get_current_time(); + sctx->submit_time = rtw_get_current_time(); #ifdef PLATFORM_LINUX /* TODO: add condition wating interface for other os */ init_completion(&sctx->done); #endif @@ -4934,30 +4921,28 @@ void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms) int rtw_sctx_wait(struct submit_ctx *sctx, const char *msg) { int ret = _FAIL; - unsigned long expire; + unsigned long expire; int status = 0; #ifdef PLATFORM_LINUX - expire= sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT; + expire = sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT; if (!wait_for_completion_timeout(&sctx->done, expire)) { /* timeout, do something?? */ status = RTW_SCTX_DONE_TIMEOUT; - DBG_871X("%s timeout: %s\n", __func__, msg); - } else { + RTW_INFO("%s timeout: %s\n", __func__, msg); + } else status = sctx->status; - } #endif - if (status == RTW_SCTX_DONE_SUCCESS) { + if (status == RTW_SCTX_DONE_SUCCESS) ret = _SUCCESS; - } return ret; } bool rtw_sctx_chk_waring_status(int status) { - switch(status) { + switch (status) { case RTW_SCTX_DONE_UNKNOWN: case RTW_SCTX_DONE_BUF_ALLOC: case RTW_SCTX_DONE_BUF_FREE: @@ -4974,11 +4959,11 @@ void rtw_sctx_done_err(struct submit_ctx **sctx, int status) { if (*sctx) { if (rtw_sctx_chk_waring_status(status)) - DBG_871X("%s status:%d\n", __func__, status); + RTW_INFO("%s status:%d\n", __func__, status); (*sctx)->status = status; - #ifdef PLATFORM_LINUX +#ifdef PLATFORM_LINUX complete(&((*sctx)->done)); - #endif +#endif *sctx = NULL; } } @@ -5025,13 +5010,13 @@ int rtw_ack_tx_polling(struct xmit_priv *pxmitpriv, u32 timeout_ms) pack_tx_ops->status = RTW_SCTX_DONE_DEV_REMOVE; break; } - + rtw_msleep_os(10); } while (rtw_get_passing_time_ms(pack_tx_ops->submit_time) < timeout_ms); if (pack_tx_ops->status == RTW_SCTX_SUBMITTED) { pack_tx_ops->status = RTW_SCTX_DONE_TIMEOUT; - DBG_871X("%s timeout\n", __func__); + RTW_INFO("%s timeout\n", __func__); } if (pack_tx_ops->status == RTW_SCTX_DONE_SUCCESS) @@ -5059,12 +5044,10 @@ int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms) void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status) { struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops; - - if (pxmitpriv->ack_tx) { - rtw_sctx_done_err(&pack_tx_ops, status); - } else { - DBG_871X("%s ack_tx not set\n", __func__); - } -} -#endif //CONFIG_XMIT_ACK + if (pxmitpriv->ack_tx) + rtw_sctx_done_err(&pack_tx_ops, status); + else + RTW_INFO("%s ack_tx not set\n", __func__); +} +#endif /* CONFIG_XMIT_ACK */ diff --git a/hal/HalPwrSeqCmd.c b/hal/HalPwrSeqCmd.c old mode 100755 new mode 100644 index 732c4d8..de709b1 --- a/hal/HalPwrSeqCmd.c +++ b/hal/HalPwrSeqCmd.c @@ -1,183 +1,161 @@ -/****************************************************************************** - * - * 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 - * - * - ******************************************************************************/ -/*++ -Copyright (c) Realtek Semiconductor Corp. All rights reserved. - -Module Name: - HalPwrSeqCmd.c - -Abstract: - Implement HW Power sequence configuration CMD handling routine for Realtek devices. - -Major Change History: - When Who What - ---------- --------------- ------------------------------- - 2011-10-26 Lucas Modify to be compatible with SD4-CE driver. - 2011-07-07 Roger Create. - ---*/ -#include - - -// -// Description: -// This routine deal with the Power Configuration CMDs parsing for RTL8723/RTL8188E Series IC. -// -// Assumption: -// We should follow specific format which was released from HW SD. -// -// 2011.07.07, added by Roger. -// -u8 HalPwrSeqCmdParsing( - PADAPTER padapter, - u8 CutVersion, - u8 FabVersion, - u8 InterfaceType, - WLAN_PWR_CFG PwrSeqCmd[]) -{ - WLAN_PWR_CFG PwrCfgCmd = {0}; - u8 bPollingBit = _FALSE; - u32 AryIdx = 0; - u8 value = 0; - u32 offset = 0; - u32 pollingCount = 0; // polling autoload done. - u32 maxPollingCnt = 5000; - - do { - PwrCfgCmd = PwrSeqCmd[AryIdx]; - - RT_TRACE(_module_hal_init_c_ , _drv_info_, - ("HalPwrSeqCmdParsing: offset(%#x) cut_msk(%#x) fab_msk(%#x) interface_msk(%#x) base(%#x) cmd(%#x) msk(%#x) value(%#x)\n", - GET_PWR_CFG_OFFSET(PwrCfgCmd), - GET_PWR_CFG_CUT_MASK(PwrCfgCmd), - GET_PWR_CFG_FAB_MASK(PwrCfgCmd), - GET_PWR_CFG_INTF_MASK(PwrCfgCmd), - GET_PWR_CFG_BASE(PwrCfgCmd), - GET_PWR_CFG_CMD(PwrCfgCmd), - GET_PWR_CFG_MASK(PwrCfgCmd), - GET_PWR_CFG_VALUE(PwrCfgCmd))); - - //2 Only Handle the command whose FAB, CUT, and Interface are matched - if ((GET_PWR_CFG_FAB_MASK(PwrCfgCmd) & FabVersion) && - (GET_PWR_CFG_CUT_MASK(PwrCfgCmd) & CutVersion) && - (GET_PWR_CFG_INTF_MASK(PwrCfgCmd) & InterfaceType)) - { - switch (GET_PWR_CFG_CMD(PwrCfgCmd)) - { - case PWR_CMD_READ: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_READ\n")); - break; - - case PWR_CMD_WRITE: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_WRITE\n")); - offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); - -#ifdef CONFIG_SDIO_HCI - // - // We should deal with interface specific address mapping for some interfaces, e.g., SDIO interface - // 2011.07.07. - // - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - { - // Read Back SDIO Local value - value = SdioLocalCmd52Read1Byte(padapter, offset); - - value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd)); - value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)); - - // Write Back SDIO Local value - SdioLocalCmd52Write1Byte(padapter, offset, value); - } - else -#endif - { -#ifdef CONFIG_GSPI_HCI - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - offset = SPI_LOCAL_OFFSET | offset; -#endif - // Read the value from system register - value = rtw_read8(padapter, offset); - - value=value&(~(GET_PWR_CFG_MASK(PwrCfgCmd))); - value=value|(GET_PWR_CFG_VALUE(PwrCfgCmd)&GET_PWR_CFG_MASK(PwrCfgCmd)); - - // Write the value back to sytem register - rtw_write8(padapter, offset, value); - } - break; - - case PWR_CMD_POLLING: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_POLLING\n")); - - bPollingBit = _FALSE; - offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); -#ifdef CONFIG_GSPI_HCI - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - offset = SPI_LOCAL_OFFSET | offset; -#endif - do { -#ifdef CONFIG_SDIO_HCI - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - value = SdioLocalCmd52Read1Byte(padapter, offset); - else -#endif - value = rtw_read8(padapter, offset); - - value=value&GET_PWR_CFG_MASK(PwrCfgCmd); - if (value == (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd))) - bPollingBit = _TRUE; - else - rtw_udelay_os(10); - - if (pollingCount++ > maxPollingCnt) { - DBG_871X_LEVEL(_drv_err_, "HalPwrSeqCmdParsing: Fail to polling Offset[%#x]=%02x\n", offset, value); - return _FALSE; - } - } while (!bPollingBit); - - break; - - case PWR_CMD_DELAY: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_DELAY\n")); - if (GET_PWR_CFG_VALUE(PwrCfgCmd) == PWRSEQ_DELAY_US) - rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)); - else - rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)*1000); - break; - - case PWR_CMD_END: - // When this command is parsed, end the process - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_END\n")); - return _TRUE; - break; - - default: - RT_TRACE(_module_hal_init_c_ , _drv_err_, ("HalPwrSeqCmdParsing: Unknown CMD!!\n")); - break; - } - } - - AryIdx++;//Add Array Index - }while(1); - - return _TRUE; -} - - +/****************************************************************************** + * + * 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 + * + * + ******************************************************************************/ +/*++ +Copyright (c) Realtek Semiconductor Corp. All rights reserved. + +Module Name: + HalPwrSeqCmd.c + +Abstract: + Implement HW Power sequence configuration CMD handling routine for Realtek devices. + +Major Change History: + When Who What + ---------- --------------- ------------------------------- + 2011-10-26 Lucas Modify to be compatible with SD4-CE driver. + 2011-07-07 Roger Create. + +--*/ +#include + + +/* + * Description: + * This routine deal with the Power Configuration CMDs parsing for RTL8723/RTL8188E Series IC. + * + * Assumption: + * We should follow specific format which was released from HW SD. + * + * 2011.07.07, added by Roger. + * */ +u8 HalPwrSeqCmdParsing( + PADAPTER padapter, + u8 CutVersion, + u8 FabVersion, + u8 InterfaceType, + WLAN_PWR_CFG PwrSeqCmd[]) +{ + WLAN_PWR_CFG PwrCfgCmd = {0}; + u8 bPollingBit = _FALSE; + u32 AryIdx = 0; + u8 value = 0; + u32 offset = 0; + u32 pollingCount = 0; /* polling autoload done. */ + u32 maxPollingCnt = 5000; + + do { + PwrCfgCmd = PwrSeqCmd[AryIdx]; + + + /* 2 Only Handle the command whose FAB, CUT, and Interface are matched */ + if ((GET_PWR_CFG_FAB_MASK(PwrCfgCmd) & FabVersion) && + (GET_PWR_CFG_CUT_MASK(PwrCfgCmd) & CutVersion) && + (GET_PWR_CFG_INTF_MASK(PwrCfgCmd) & InterfaceType)) { + switch (GET_PWR_CFG_CMD(PwrCfgCmd)) { + case PWR_CMD_READ: + break; + + case PWR_CMD_WRITE: + offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); + +#ifdef CONFIG_SDIO_HCI + /* */ + /* We should deal with interface specific address mapping for some interfaces, e.g., SDIO interface */ + /* 2011.07.07. */ + /* */ + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) { + /* Read Back SDIO Local value */ + value = SdioLocalCmd52Read1Byte(padapter, offset); + + value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd)); + value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)); + + /* Write Back SDIO Local value */ + SdioLocalCmd52Write1Byte(padapter, offset, value); + } else +#endif + { +#ifdef CONFIG_GSPI_HCI + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + offset = SPI_LOCAL_OFFSET | offset; +#endif + /* Read the value from system register */ + value = rtw_read8(padapter, offset); + + value = value & (~(GET_PWR_CFG_MASK(PwrCfgCmd))); + value = value | (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)); + + /* Write the value back to sytem register */ + rtw_write8(padapter, offset, value); + } + break; + + case PWR_CMD_POLLING: + + bPollingBit = _FALSE; + offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); +#ifdef CONFIG_GSPI_HCI + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + offset = SPI_LOCAL_OFFSET | offset; +#endif + do { +#ifdef CONFIG_SDIO_HCI + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + value = SdioLocalCmd52Read1Byte(padapter, offset); + else +#endif + value = rtw_read8(padapter, offset); + + value = value & GET_PWR_CFG_MASK(PwrCfgCmd); + if (value == (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd))) + bPollingBit = _TRUE; + else + rtw_udelay_os(10); + + if (pollingCount++ > maxPollingCnt) { + RTW_ERR("HalPwrSeqCmdParsing: Fail to polling Offset[%#x]=%02x\n", offset, value); + return _FALSE; + } + } while (!bPollingBit); + + break; + + case PWR_CMD_DELAY: + if (GET_PWR_CFG_VALUE(PwrCfgCmd) == PWRSEQ_DELAY_US) + rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)); + else + rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd) * 1000); + break; + + case PWR_CMD_END: + /* When this command is parsed, end the process */ + return _TRUE; + break; + + default: + break; + } + } + + AryIdx++;/* Add Array Index */ + } while (1); + + return _TRUE; +} diff --git a/hal/btc/HalBtc8188c2Ant.c b/hal/btc/HalBtc8188c2Ant.c old mode 100755 new mode 100644 diff --git a/hal/btc/HalBtc8188c2Ant.h b/hal/btc/HalBtc8188c2Ant.h old mode 100755 new mode 100644 diff --git a/hal/btc/HalBtc8192d2Ant.c b/hal/btc/HalBtc8192d2Ant.c old mode 100755 new mode 100644 diff --git a/hal/btc/HalBtc8192d2Ant.h b/hal/btc/HalBtc8192d2Ant.h old mode 100755 new mode 100644 diff --git a/hal/btc/HalBtc8192e1Ant.c b/hal/btc/HalBtc8192e1Ant.c old mode 100755 new mode 100644 index 86e006d..8a4d977 --- a/hal/btc/HalBtc8192e1Ant.c +++ b/hal/btc/HalBtc8192e1Ant.c @@ -1,3738 +1,3417 @@ -//============================================================ -// Description: -// -// This file is for RTL8192E Co-exist mechanism -// -// History -// 2012/11/15 Cosa first check in. -// -//============================================================ - -//============================================================ -// 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 -//============================================================ -static COEX_DM_8192E_1ANT GLCoexDm8192e1Ant; -static PCOEX_DM_8192E_1ANT pCoexDm=&GLCoexDm8192e1Ant; -static COEX_STA_8192E_1ANT GLCoexSta8192e1Ant; -static PCOEX_STA_8192E_1ANT pCoexSta=&GLCoexSta8192e1Ant; - -const char *const GLBtInfoSrc8192e1Ant[]={ - "BT Info[wifi fw]", - "BT Info[bt rsp]", - "BT Info[bt auto report]", -}; - -u4Byte GLCoexVerDate8192e1Ant=20140527; -u4Byte GLCoexVer8192e1Ant=0x4f; - -//============================================================ -// local function proto type if needed -//============================================================ -//============================================================ -// local function start with halbtc8192e1ant_ -//============================================================ -u1Byte -halbtc8192e1ant_BtRssiState( - u1Byte levelNum, - u1Byte rssiThresh, - u1Byte rssiThresh1 - ) -{ - s4Byte btRssi=0; - u1Byte btRssiState=pCoexSta->preBtRssiState; - - btRssi = pCoexSta->btRssi; - - if(levelNum == 2) - { - if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) || - (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)) - { - if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) - { - btRssiState = BTC_RSSI_STATE_HIGH; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else - { - if(btRssi < rssiThresh) - { - btRssiState = BTC_RSSI_STATE_LOW; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - else if(levelNum == 3) - { - if(rssiThresh > rssiThresh1) - { - 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)) - { - if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) - { - btRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || - (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM)) - { - if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) - { - btRssiState = BTC_RSSI_STATE_HIGH; - } - else if(btRssi < rssiThresh) - { - btRssiState = BTC_RSSI_STATE_LOW; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - } - } - else - { - if(btRssi < rssiThresh1) - { - btRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - - pCoexSta->preBtRssiState = btRssiState; - - return btRssiState; -} - -u1Byte -halbtc8192e1ant_WifiRssiState( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte index, - IN u1Byte levelNum, - IN u1Byte rssiThresh, - IN u1Byte rssiThresh1 - ) -{ - s4Byte wifiRssi=0; - u1Byte wifiRssiState=pCoexSta->preWifiRssiState[index]; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi); - - if(levelNum == 2) - { - if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)) - { - if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) - { - wifiRssiState = BTC_RSSI_STATE_HIGH; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else - { - if(wifiRssi < rssiThresh) - { - wifiRssiState = BTC_RSSI_STATE_LOW; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - else if(levelNum == 3) - { - if(rssiThresh > rssiThresh1) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); - return pCoexSta->preWifiRssiState[index]; - } - - if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)) - { - if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) - { - wifiRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM)) - { - if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) - { - wifiRssiState = BTC_RSSI_STATE_HIGH; - } - else if(wifiRssi < rssiThresh) - { - wifiRssiState = BTC_RSSI_STATE_LOW; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - } - } - else - { - if(wifiRssi < rssiThresh1) - { - wifiRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - - pCoexSta->preWifiRssiState[index] = wifiRssiState; - - return wifiRssiState; -} - -VOID -halbtc8192e1ant_UpdateRaMask( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u4Byte disRateMask - ) -{ - pCoexDm->curRaMask = disRateMask; - - if( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask)) - { - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask); - } - 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, u4Tmp1; - u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0; - 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; - - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx); - regHPTx = u4Tmp & bMaskLWord; - regHPRx = (u4Tmp & bMaskHWord)>>16; - - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx); - regLPTx = u4Tmp & bMaskLWord; - regLPRx = (u4Tmp & bMaskHWord)>>16; - - pCoexSta->highPriorityTx = regHPTx; - pCoexSta->highPriorityRx = regHPRx; - pCoexSta->lowPriorityTx = regLPTx; - pCoexSta->lowPriorityRx = 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_MonitorWiFiCtr( - IN PBTC_COEXIST pBtCoexist - ) -{ - u4Byte u4Tmp; - u2Byte u2Tmp[3]; - s4Byte wifiRssi=0; - BOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE; - static u1Byte nCCKLockCounter = 0; - - 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) - { - 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); - - 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; - - -} - -BOOLEAN -halbtc8192e1ant_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 -halbtc8192e1ant_UpdateBtLinkInfo( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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; - 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; - } - - // 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; - - // check if Hid only - if( !pBtLinkInfo->bScoExist && - !pBtLinkInfo->bA2dpExist && - !pBtLinkInfo->bPanExist && - pBtLinkInfo->bHidExist ) - pBtLinkInfo->bHidOnly = TRUE; - else - pBtLinkInfo->bHidOnly = FALSE; -} - -u1Byte -halbtc8192e1ant_ActionAlgorithm( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BOOLEAN bBtHsOn=FALSE; - u1Byte algorithm=BT_8192E_1ANT_COEX_ALGO_UNDEFINED; - u1Byte numOfDiffProfile=0; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - - if(!pBtLinkInfo->bBtLinkExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); - return algorithm; - } - - if(pBtLinkInfo->bScoExist) - numOfDiffProfile++; - if(pBtLinkInfo->bHidExist) - numOfDiffProfile++; - if(pBtLinkInfo->bPanExist) - numOfDiffProfile++; - if(pBtLinkInfo->bA2dpExist) - numOfDiffProfile++; - - if(numOfDiffProfile == 1) - { - if(pBtLinkInfo->bScoExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO only\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; - } - else - { - if(pBtLinkInfo->bHidExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID only\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_HID; - } - else if(pBtLinkInfo->bA2dpExist) - { - 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) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(HS) only\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_PANHS; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(EDR) only\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR; - } - } - } - } - else if(numOfDiffProfile == 2) - { - if(pBtLinkInfo->bScoExist) - { - if(pBtLinkInfo->bHidExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_HID; - } - else if(pBtLinkInfo->bA2dpExist) - { - 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) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(HS)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(EDR)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; - } - } - } - else - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bA2dpExist ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP; - } - else if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(HS)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(EDR)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; - } - } - else if( pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(HS)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(EDR)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP; - } - } - } - } - else if(numOfDiffProfile == 3) - { - if(pBtLinkInfo->bScoExist) - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bA2dpExist ) - { - 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 && - pBtLinkInfo->bPanExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(HS)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; - } - } - else if( pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; - } - } - } - else - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n")); - algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR; - } - } - } - } - else if(numOfDiffProfile >= 3) - { - if(pBtLinkInfo->bScoExist) - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n")); - - } - else - { - 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; - } - } - } - } - - return algorithm; -} - -VOID -halbtc8192e1ant_SetBtAutoReport( - IN PBTC_COEXIST pBtCoexist, - 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 -halbtc8192e1ant_BtAutoReport( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bEnableAutoReport - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", - (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); - pCoexDm->bCurBtAutoReport = bEnableAutoReport; - - if(!bForceExec) - { - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) - return; - } - halbtc8192e1ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport); - - pCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport; -} - -VOID -halbtc8192e1ant_SetSwPenaltyTxRateAdaptive( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bLowPenaltyRa - ) -{ - u1Byte H2C_Parameter[6] ={0}; - - H2C_Parameter[0] = 0x6; // opCode, 0x6= Retry_Penalty - - if(bLowPenaltyRa) - { - 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 - } - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", - (bLowPenaltyRa? "ON!!":"OFF!!") )); - - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); -} - -VOID -halbtc8192e1ant_LowPenaltyRa( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bLowPenaltyRa - ) -{ - pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; - - if(!bForceExec) - { - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) - return; - } - halbtc8192e1ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa); - - pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa; -} - -VOID -halbtc8192e1ant_SetCoexTable( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte val0x6c0, - IN u4Byte val0x6c4, - IN u4Byte val0x6c8, - IN u1Byte val0x6cc - ) -{ - 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); - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[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 - ) -{ - 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) - { - if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && - (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && - (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && - (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) ) - return; - } - halbtc8192e1ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc); - - pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0; - pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4; - pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8; - pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc; -} - -VOID -halbtc8192e1ant_CoexTableWithType( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte type - ) -{ - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** CoexTable(%d) **********\n", type)); - - pCoexSta->nCoexTableType = type; - - switch(type) - { - case 0: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3); - break; - case 1: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); - break; - case 2: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3); - break; - case 3: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); - break; - case 4: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3); - break; - case 5: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaa5a5a5a, 0xffffff, 0x3); - break; - case 6: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3); - break; - case 7: - halbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3); - break; - default: - break; - } -} - -VOID -halbtc8192e1ant_SetFwIgnoreWlanAct( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bEnable - ) -{ - u1Byte H2C_Parameter[1] ={0}; - - if(bEnable) - { - H2C_Parameter[0] |= BIT0; // function enable - } - - 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 -halbtc8192e1ant_IgnoreWlanAct( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bEnable - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", - (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); - pCoexDm->bCurIgnoreWlanAct = bEnable; - - if(!bForceExec) - { - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) - return; - } - halbtc8192e1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable); - - pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct; -} - -VOID -halbtc8192e1ant_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 -halbtc8192e1ant_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; - } - } - halbtc8192e1ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal); - - pCoexDm->preLps = pCoexDm->curLps; - 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, - IN u1Byte antPosType, - IN BOOLEAN bInitHwCfg, - IN BOOLEAN bWifiOff - ) -{ - u4Byte u4Tmp=0; - - if(bInitHwCfg) - { - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x944, 0x24); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x930, 0x700700); - if(pBtCoexist->chipInterface == BTC_INTF_USB) - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30430004); - else - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30030004); - - // 0x4c[27][24]='00', Set Antenna to BB - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c); - u4Tmp &= ~BIT24; - u4Tmp &= ~BIT27; - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp); - } - else if(bWifiOff) - { - if(pBtCoexist->chipInterface == BTC_INTF_USB) - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30430004); - else - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30030004); - - // 0x4c[27][24]='11', Set Antenna to BT, 0x64[8:7]=0, 0x64[2]=1 - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c); - u4Tmp |= BIT24; - u4Tmp |= BIT27; - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp); - } - - // ext switch setting - switch(antPosType) - { - case BTC_ANT_PATH_WIFI: - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x4); - break; - case BTC_ANT_PATH_BT: - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x20); - break; - default: - case BTC_ANT_PATH_PTA: - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x4); - break; - } -} - -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, - IN BOOLEAN bForceExec, - IN BOOLEAN bTurnOn, - IN u1Byte type - ) -{ - 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; - - 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) - { - if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && - (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) - return; - } - - 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, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val); - break; - case 1: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 2: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 3: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val); - break; - case 4: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0); - break; - case 5: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x11); - break; - case 6: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11); - break; - case 7: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0); - break; - case 8: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); - break; - case 9: - 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, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 12: - 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); - break; - case 18: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); - break; - case 20: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10); - break; - case 21: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11); - break; - case 22: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10); - break; - case 23: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18); - break; - case 24: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18); - break; - case 25: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - break; - case 26: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - break; - case 27: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98); - break; - case 28: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0); - break; - case 29: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10); - break; - case 30: - 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, 0x61, 0x35, 0x3, 0x11, 0x11); - break; - case 33: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90); - break; - case 34: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10); - break; - case 35: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10); - break; - case 36: - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 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 */ - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24); - break; - } - } - else - { - - // disable PS tdma - switch(type) - { - case 8: //PTA Control - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0); - halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE); - break; - case 0: - default: //Software control, Antenna at BT side - halbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); - halbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE); - break; - 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; - } - } - 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_CoexAllOff( - IN PBTC_COEXIST pBtCoexist - ) -{ - // sw all off - halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); - - // hw all off - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); -} - -BOOLEAN -halbtc8192e1ant_IsCommonAction( - IN PBTC_COEXIST pBtCoexist - ) -{ - BOOLEAN bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); - - if(!bWifiConnected && - BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) - { - 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) ) - { - 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) ) - { - 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) ) - { - 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) ) - { - 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; - } - - return bCommon; -} - - -VOID -halbtc8192e1ant_TdmaDurationAdjustForAcl( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte wifiStatus - ) -{ - 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; - - 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) || - (BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) ) - { - if( pCoexDm->curPsTdma != 1 && - pCoexDm->curPsTdma != 2 && - pCoexDm->curPsTdma != 3 && - pCoexDm->curPsTdma != 9 ) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - - up = 0; - dn = 0; - m = 1; - n= 3; - result = 0; - WaitCount = 0; - } - return; - } - - if(!pCoexDm->bAutoTdmaAdjust) - { - pCoexDm->bAutoTdmaAdjust = TRUE; - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); - - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - //============ - up = 0; - dn = 0; - m = 1; - n= 3; - result = 0; - WaitCount = 0; - } - else - { - //accquire the BT TRx retry count from BT_Info byte2 - retryCount = pCoexSta->btRetryCnt; - btInfoExt = pCoexSta->btInfoExt; - - if ( (pCoexSta->lowPriorityTx) > 1050 || (pCoexSta->lowPriorityRx) > 1250 ) - retryCount++; - - result = 0; - WaitCount++; - - if(retryCount == 0) // no retry in the last 2-second duration - { - up++; - dn--; - - if (dn <= 0) - dn = 0; - - 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++; - - if (up <= 0) - up = 0; - - if (dn == 2) // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration - { - if (WaitCount <= 2) - 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 //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration - { - 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")); - } - - if(result == -1) - { - if( (BT_INFO_8192E_1ANT_A2DP_BASIC_RATE(btInfoExt)) && - ((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) ) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(pCoexDm->curPsTdma == 1) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(pCoexDm->curPsTdma == 9) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - } - else if(result == 1) - { - if( (BT_INFO_8192E_1ANT_A2DP_BASIC_RATE(btInfoExt)) && - ((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) ) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(pCoexDm->curPsTdma == 9) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); - 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 && - pCoexDm->curPsTdma != 9 && - pCoexDm->curPsTdma != 11 ) - { - // recover to previous adjust type - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType); - } - } -} - -VOID -halbtc8192e1ant_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 - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); - } - } - else // NO PS state - { - if(bNewPsState) - { - // will enter LPS state, turn off psTdma first - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); - } - else - { - // keep state under NO PS state, do nothing. - } - } -} - -VOID -halbtc8192e1ant_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: - halbtc8192e1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE); - 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. - 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 - ) -{ - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); -} - -VOID -halbtc8192e1ant_MonitorBtEnableDisable( - IN PBTC_COEXIST pBtCoexist - ) -{ - static BOOLEAN bPreBtDisabled=FALSE; - static u4Byte btDisableCnt=0; - BOOLEAN bBtActive=TRUE, bBtDisabled=FALSE; - - // This function check if bt is disabled - - if( pCoexSta->highPriorityTx == 0 && - pCoexSta->highPriorityRx == 0 && - pCoexSta->lowPriorityTx == 0 && - pCoexSta->lowPriorityRx == 0) - { - bBtActive = FALSE; - } - if( pCoexSta->highPriorityTx == 0xffff && - pCoexSta->highPriorityRx == 0xffff && - pCoexSta->lowPriorityTx == 0xffff && - pCoexSta->lowPriorityRx == 0xffff) - { - bBtActive = FALSE; - } - if(bBtActive) - { - btDisableCnt = 0; - bBtDisabled = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); - } - else - { - 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); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); - halbtc8192e1ant_ActionWifiOnly(pBtCoexist); - } - } - if(bPreBtDisabled != bBtDisabled) - { - 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_ACT_LEAVE_LPS, NULL); - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL); - } - } -} - -//============================================= -// -// Software Coex Mechanism start -// -//============================================= - -// 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) -VOID -halbtc8192e1ant_ActionA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); -} - -VOID -halbtc8192e1ant_ActionA2dpPanHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); -} - -VOID -halbtc8192e1ant_ActionPanEdr( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); -} - -//PAN(HS) only -VOID -halbtc8192e1ant_ActionPanHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); -} - -//PAN(EDR)+A2DP -VOID -halbtc8192e1ant_ActionPanEdrA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); -} - -VOID -halbtc8192e1ant_ActionPanEdrHid( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); -} - -// HID+A2DP+PAN(EDR) -VOID -halbtc8192e1ant_ActionHidA2dpPanEdr( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); -} - -VOID -halbtc8192e1ant_ActionHidA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); -} - -*/ - -//============================================= -// -// Non-Software Coex Mechanism start -// -//============================================= -VOID -halbtc8192e1ant_ActionWifiMultiPort( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); -} - -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); - } - else if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist)) - { - // SCO/HID/A2DP busy - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - - 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_WIFI_NATIVE, 0x0, 0x0); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); - } -} - -VOID -halbtc8192e1ant_ActionBtScoHidOnlyBusy( - IN PBTC_COEXIST pBtCoexist, - 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 - - 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_ActionWifiConnectedBtAclBusy( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte wifiStatus - ) -{ - u1Byte btRssiState; - - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - btRssiState = halbtc8192e1ant_BtRssiState(2, 28, 0); - - if ( (pCoexSta->lowPriorityRx >= 1000) && (pCoexSta->lowPriorityRx != 65535) ) - { - pBtLinkInfo->bSlaveRole = TRUE; - } - else - { - pBtLinkInfo->bSlaveRole = FALSE; - } - - if(pBtLinkInfo->bHidOnly) //HID - { - halbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus); - pCoexDm->bAutoTdmaAdjust = FALSE; - return; - } - else if(pBtLinkInfo->bA2dpOnly) //A2DP - { - if(BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus) - { - 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 if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) || - (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; - } - else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist) //HID+A2DP - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->bAutoTdmaAdjust = FALSE; - - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); - } - 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 - { - //BT no-profile busy (0x9) - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; - } -} - -VOID -halbtc8192e1ant_ActionWifiNotConnected( - IN PBTC_COEXIST pBtCoexist - ) -{ - // power save state - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // tdma and coex table - halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); -} - -VOID -halbtc8192e1ant_ActionWifiNotConnectedScan( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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) - { - 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); - - // 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 -halbtc8192e1ant_ActionWifiConnectedScan( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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) - { - 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_ActionWifiConnectedSpecialPacket( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // 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 -halbtc8192e1ant_ActionWifiConnected( - IN PBTC_COEXIST pBtCoexist - ) -{ - BOOLEAN bWifiBusy=FALSE; - BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BOOLEAN bUnder4way=FALSE, bApEnable=FALSE; - u4Byte wifiBw; - - 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); - 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) - { - 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(!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); - - // tdma and coex table - if(!bWifiBusy) - { - if(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) - { - halbtc8192e1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, - BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE); - } - 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_IDLE); - } - else - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - - 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_ACL_BUSY == pCoexDm->btStatus) - { - halbtc8192e1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, - BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY); - } - 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_BUSY); - } - else - { - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - - if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 ) - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - else - halbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); - } - } -} - -VOID -halbtc8192e1ant_RunSwCoexistMechanism( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte algorithm=0; - - algorithm = halbtc8192e1ant_ActionAlgorithm(pBtCoexist); - pCoexDm->curAlgorithm = algorithm; - - if(halbtc8192e1ant_IsCommonAction(pBtCoexist)) - { - - } - else - { - switch(pCoexDm->curAlgorithm) - { - case BT_8192E_1ANT_COEX_ALGO_SCO: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = SCO.\n")); - //halbtc8192e1ant_ActionSco(pBtCoexist); - break; - case BT_8192E_1ANT_COEX_ALGO_HID: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID.\n")); - //halbtc8192e1ant_ActionHid(pBtCoexist); - break; - case BT_8192E_1ANT_COEX_ALGO_A2DP: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP.\n")); - //halbtc8192e1ant_ActionA2dp(pBtCoexist); - break; - case BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); - //halbtc8192e1ant_ActionA2dpPanHs(pBtCoexist); - break; - case BT_8192E_1ANT_COEX_ALGO_PANEDR: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR).\n")); - //halbtc8192e1ant_ActionPanEdr(pBtCoexist); - break; - case BT_8192E_1ANT_COEX_ALGO_PANHS: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HS mode.\n")); - //halbtc8192e1ant_ActionPanHs(pBtCoexist); - break; - case BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); - //halbtc8192e1ant_ActionPanEdrA2dp(pBtCoexist); - break; - case BT_8192E_1ANT_COEX_ALGO_PANEDR_HID: - 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: - 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: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP.\n")); - //halbtc8192e1ant_ActionHidA2dp(pBtCoexist); - break; - default: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = coexist All Off!!\n")); - //halbtc8192e1ant_CoexAllOff(pBtCoexist); - break; - } - pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; - } -} - -VOID -halbtc8192e1ant_RunCoexistMechanism( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); - - if(pBtCoexist->bManualControl) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); - return; - } - - if(pBtCoexist->bStopCoexDm) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); - return; - } - - if(pCoexSta->bUnderIps) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi is under IPS !!!\n")); - return; - } - - 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) ) - { - 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) - { - 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 - { - bMiracastPlusBt = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); - } - - if ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) ) - { - halbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); - - if(pBtLinkInfo->bScoExist) - halbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5); - else - halbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); - - halbtc8192e1ant_SwMechanism(pBtCoexist, TRUE); - halbtc8192e1ant_RunSwCoexistMechanism(pBtCoexist); //just print debug message - } - else - { - 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; - } - - - if(!bWifiConnected) - { - BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - - 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) - { - if (bScan) - halbtc8192e1ant_ActionWifiNotConnectedScan(pBtCoexist); - else - halbtc8192e1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); - } - else - halbtc8192e1ant_ActionWifiNotConnected(pBtCoexist); - } - else // wifi LPS/Busy - { - halbtc8192e1ant_ActionWifiConnected(pBtCoexist); - } -} - -VOID -halbtc8192e1ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ) -{ - // force to reset coex mechanism - - // sw all off - halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE); - - //halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - halbtc8192e1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); - - pCoexSta->popEventCnt = 0; -} - -VOID -halbtc8192e1ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bWifiOnly - ) -{ - u4Byte u4Tmp=0; - u2Byte u2Tmp=0; - u1Byte u1Tmp=0; - - 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); - - halbtc8192e1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); - - // antenna switch control parameter - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x858, 0x55555555); - - // coex parameters - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1); - // 0x790[5:0]=0x5 - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790); - u1Tmp &= 0xc0; - u1Tmp |= 0x5; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp); - - // enable counter statistics - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); - - // enable PTA - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20); - // enable mailbox interface - u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x40); - u2Tmp |= BIT9; - pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x40, u2Tmp); - - // enable PTA I2C mailbox - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x101); - u1Tmp |= BIT4; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x101, u1Tmp); - - // enable bt clock when wifi is disabled. - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x93); - u1Tmp |= BIT0; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x93, u1Tmp); - // enable bt clock when suspend. - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7); - u1Tmp |= BIT0; - 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 - ) -{ - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); - - pBtCoexist->bStopCoexDm = FALSE; - - halbtc8192e1ant_InitCoexDm(pBtCoexist); - - halbtc8192e1ant_QueryBtInfo(pBtCoexist); -} - -VOID -EXhalbtc8192e1ant_DisplayCoexInfo( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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 fwVer=0, btPatchVer=0; - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============"); - CL_PRINTF(cliBuf); - - if(pBtCoexist->bManualControl) - { - 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); - } - if(pBtCoexist->bStopCoexDm) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[Coex is STOPPED]============"); - 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); - CL_PRINTF(cliBuf); - - 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", \ - GLCoexVerDate8192e1Ant, GLCoexVer8192e1Ant, fwVer, btPatchVer, btPatchVer); - 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); - - // wifi status - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); - CL_PRINTF(cliBuf); - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS); - - 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]", \ - ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"): ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle": - ( (BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))), - pCoexSta->btRssi, 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); - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO); - - 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_PRINTF(cliBuf); - - for(i=0; ibtInfoC2hCnt[i]) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8192e1Ant[i], \ - pCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1], - pCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3], - pCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5], - pCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]); - CL_PRINTF(cliBuf); - } - } - - if(!pBtCoexist->bManualControl) - { - // 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 = %s/ %s/ %d ", "DelBA/ BtCtrlAgg/ AggSize", \ - (pBtCoexist->btInfo.bRejectAggPkt? "Yes":"No"), (pBtCoexist->btInfo.bBtCtrlAggBufSize? "Yes":"No"), - pBtCoexist->btInfo.aggBufSize); - CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Rate Mask", \ - pBtCoexist->btInfo.raMask); - CL_PRINTF(cliBuf); - - // Fw mechanism - 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", \ - 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 = 0x%x ", "Latest error condition(should be 0)", \ - pCoexDm->errorCondition); - CL_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "IgnWlanAct", \ - pCoexDm->bCurIgnoreWlanAct); - CL_PRINTF(cliBuf); - } - - // Hw setting - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============"); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc04); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xd04); - u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x90c); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0xc04/ 0xd04/ 0x90c", \ - u4Tmp[0], u4Tmp[1], u4Tmp[2]); - CL_PRINTF(cliBuf); - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x778", \ - u1Tmp[0]); - CL_PRINTF(cliBuf); - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x92c); - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x92c/ 0x930", \ - (u1Tmp[0]), u4Tmp[0]); - CL_PRINTF(cliBuf); - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40); - u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4f); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x40/ 0x4f", \ - u1Tmp[0], u1Tmp[1]); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522", \ - u4Tmp[0], u1Tmp[0]); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0xc50(dig)", \ - u4Tmp[0]); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4); - u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8); - 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(hp rx[31:16]/tx[15:0])", \ - pCoexSta->highPriorityRx, pCoexSta->highPriorityTx); - CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x774(lp rx[31:16]/tx[15:0])", \ - pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx); - CL_PRINTF(cliBuf); -#if(BT_AUTO_REPORT_ONLY_8192E_1ANT == 1) - halbtc8192e1ant_MonitorBtCtr(pBtCoexist); -#endif - - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS); -} - -VOID -EXhalbtc8192e1ant_IpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - u4Byte u4Tmp=0; - - if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm) - return; - - if(BTC_IPS_ENTER == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); - pCoexSta->bUnderIps = 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) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); - pCoexSta->bUnderIps = FALSE; - - halbtc8192e1ant_InitHwConfig(pBtCoexist, FALSE); - halbtc8192e1ant_InitCoexDm(pBtCoexist); - halbtc8192e1ant_QueryBtInfo(pBtCoexist); - } -} - -VOID -EXhalbtc8192e1ant_LpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm) - return; - - if(BTC_LPS_ENABLE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); - pCoexSta->bUnderLps = TRUE; - } - else if(BTC_LPS_DISABLE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); - pCoexSta->bUnderLps = FALSE; - } -} - -VOID -EXhalbtc8192e1ant_ScanNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - 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 ) - 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); - return; - } - else if(bBtHsOn) - { - halbtc8192e1ant_ActionHs(pBtCoexist); - return; - } - - if(BTC_SCAN_START == type) - { - //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); - if(!bWifiConnected) // non-connected scan - { - halbtc8192e1ant_ActionWifiNotConnectedScan(pBtCoexist); - } - else // wifi is connected - { - halbtc8192e1ant_ActionWifiConnectedScan(pBtCoexist); - } - } - else if(BTC_SCAN_FINISH == type) - { - //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); - if(!bWifiConnected) // non-connected scan - { - halbtc8192e1ant_ActionWifiNotConnected(pBtCoexist); - } - else - { - halbtc8192e1ant_ActionWifiConnected(pBtCoexist); - } - } -} - -VOID -EXhalbtc8192e1ant_ConnectNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - 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) - { - halbtc8192e1ant_ActionBtInquiry(pBtCoexist); - return; - } - else if(bBtHsOn) - { - halbtc8192e1ant_ActionHs(pBtCoexist); - return; - } - - if(BTC_ASSOCIATE_START == type) - { - //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); - halbtc8192e1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); - } - else if(BTC_ASSOCIATE_FINISH == type) - { - //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 - { - halbtc8192e1ant_ActionWifiNotConnected(pBtCoexist); - } - else - { - halbtc8192e1ant_ActionWifiConnected(pBtCoexist); - } - } -} - -VOID -EXhalbtc8192e1ant_MediaStatusNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - u1Byte H2C_Parameter[3] ={0}; - u4Byte wifiBw; - u1Byte wifiCentralChnl; - BOOLEAN bWifiUnderBMode = FALSE; - - if(pBtCoexist->bManualControl || - pBtCoexist->bStopCoexDm || - pBtCoexist->btInfo.bBtDisabled ) - return; - - if(BTC_MEDIA_CONNECT == type) - { - 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 - { - 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 - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl); - if( (BTC_MEDIA_CONNECT == type) && - (wifiCentralChnl <= 14) ) - { - //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) - 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]; - - 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); -} - -VOID -EXhalbtc8192e1ant_SpecialPacketNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - 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) - { - halbtc8192e1ant_ActionBtInquiry(pBtCoexist); - return; - } - else if(bBtHsOn) - { - halbtc8192e1ant_ActionHs(pBtCoexist); - return; - } - - if( BTC_PACKET_DHCP == type || - BTC_PACKET_EAPOL == type || - ( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) ) - { - halbtc8192e1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - } -} - -VOID -EXhalbtc8192e1ant_BtInfoNotify( - IN PBTC_COEXIST pBtCoexist, - IN pu1Byte tmpBuf, - IN u1Byte length - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - u1Byte btInfo=0; - u1Byte i, rspSource=0; - BOOLEAN bWifiConnected=FALSE; - BOOLEAN bBtBusy=FALSE; - - pCoexSta->bC2hBtInfoReqSent = FALSE; - - rspSource = tmpBuf[0]&0xf; - if(rspSource >= BT_INFO_SRC_8192E_1ANT_MAX) - rspSource = BT_INFO_SRC_8192E_1ANT_WIFI_FW; - pCoexSta->btInfoC2hCnt[rspSource]++; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); - for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; - if(i == 1) - btInfo = tmpBuf[i]; - if(i == length-1) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); - } - } - - 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-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) - { - 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) - { - EXhalbtc8192e1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT); - } - else - { - EXhalbtc8192e1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); - } - } - - if(pCoexSta->btInfoExt & BIT3) - { - if(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) - { - 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. - } -#if(BT_AUTO_REPORT_ONLY_8192E_1ANT == 0) - 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 - if(btInfo & BT_INFO_8192E_1ANT_B_INQ_PAGE) - pCoexSta->bC2hBtInquiryPage = TRUE; - else - pCoexSta->bC2hBtInquiryPage = FALSE; - - // set link exist status - if(!(btInfo&BT_INFO_8192E_1ANT_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_8192E_1ANT_B_FTP) - pCoexSta->bPanExist = TRUE; - else - pCoexSta->bPanExist = FALSE; - if(btInfo & BT_INFO_8192E_1ANT_B_A2DP) - pCoexSta->bA2dpExist = TRUE; - else - pCoexSta->bA2dpExist = FALSE; - if(btInfo & BT_INFO_8192E_1ANT_B_HID) - pCoexSta->bHidExist = TRUE; - else - pCoexSta->bHidExist = FALSE; - if(btInfo & BT_INFO_8192E_1ANT_B_SCO_ESCO) - pCoexSta->bScoExist = TRUE; - else - pCoexSta->bScoExist = FALSE; - } - - 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; - 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; - 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; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); - } - 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; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); - } - else - { - pCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_MAX; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); - } - - 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; - else - bBtBusy = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy); - - halbtc8192e1ant_RunCoexistMechanism(pBtCoexist); -} - -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")); - - 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 -EXhalbtc8192e1ant_HaltNotify( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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 -EXhalbtc8192e1ant_PnpNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte pnpState - ) -{ - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify\n")); - - if(BTC_WIFI_PNP_SLEEP == pnpState) - { - 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, 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 - ) -{ - static u1Byte disVerInfoCnt=0; - u4Byte fwVer=0, btPatchVer=0; - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); - - if(disVerInfoCnt <= 5) - { - 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)); - 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); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", - GLCoexVerDate8192e1Ant, GLCoexVer8192e1Ant, fwVer, btPatchVer, btPatchVer)); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); - } - -#if(BT_AUTO_REPORT_ONLY_8192E_1ANT == 0) - halbtc8192e1ant_QueryBtInfo(pBtCoexist); - halbtc8192e1ant_MonitorBtEnableDisable(pBtCoexist); -#else - halbtc8192e1ant_MonitorBtCtr(pBtCoexist); - halbtc8192e1ant_MonitorWiFiCtr(pBtCoexist); - - if( halbtc8192e1ant_IsWifiStatusChanged(pBtCoexist) || - pCoexDm->bAutoTdmaAdjust ) - { - - halbtc8192e1ant_RunCoexistMechanism(pBtCoexist); - } - - pCoexSta->specialPktPeriodCnt++; -#endif -} - - -VOID -EXhalbtc8192e1ant_DbgControl( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte opCode, - IN u1Byte opLen, - IN pu1Byte pData - ) -{ - switch(opCode) - { - case BTC_DBG_SET_COEX_NORMAL: - pBtCoexist->bManualControl = FALSE; - halbtc8192e1ant_InitCoexDm(pBtCoexist); - break; - case BTC_DBG_SET_COEX_WIFI_ONLY: - pBtCoexist->bManualControl = TRUE; - halbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); - break; - case BTC_DBG_SET_COEX_BT_ONLY: - // todo - break; - default: - break; - } -} - -#endif - +/* ************************************************************ + * Description: + * + * This file is for RTL8192E Co-exist mechanism + * + * History + * 2012/11/15 Cosa first check in. + * + * ************************************************************ */ + +/* ************************************************************ + * include files + * ************************************************************ */ +#include "Mp_Precomp.h" + +#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) + +#if (RTL8192E_SUPPORT == 1) +/* ************************************************************ + * Global variables, these are static variables + * ************************************************************ */ +static u8 *trace_buf = &gl_btc_trace_buf[0]; +static struct coex_dm_8192e_1ant glcoex_dm_8192e_1ant; +static struct coex_dm_8192e_1ant *coex_dm = &glcoex_dm_8192e_1ant; +static struct coex_sta_8192e_1ant glcoex_sta_8192e_1ant; +static struct coex_sta_8192e_1ant *coex_sta = &glcoex_sta_8192e_1ant; + +const char *const glbt_info_src_8192e_1ant[] = { + "BT Info[wifi fw]", + "BT Info[bt rsp]", + "BT Info[bt auto report]", +}; + +u32 glcoex_ver_date_8192e_1ant = 20140527; +u32 glcoex_ver_8192e_1ant = 0x4f; + +/* ************************************************************ + * local function proto type if needed + * ************************************************************ + * ************************************************************ + * local function start with halbtc8192e1ant_ + * ************************************************************ */ +u8 halbtc8192e1ant_bt_rssi_state(u8 level_num, u8 rssi_thresh, u8 rssi_thresh1) +{ + s32 bt_rssi = 0; + u8 bt_rssi_state = coex_sta->pre_bt_rssi_state; + + bt_rssi = coex_sta->bt_rssi; + + if (level_num == 2) { + if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) || + (coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_STAY_LOW)) { + if (bt_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) + bt_rssi_state = BTC_RSSI_STATE_HIGH; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else { + if (bt_rssi < rssi_thresh) + bt_rssi_state = BTC_RSSI_STATE_LOW; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } else if (level_num == 3) { + if (rssi_thresh > rssi_thresh1) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Rssi thresh error!!\n"); + BTC_TRACE(trace_buf); + return coex_sta->pre_bt_rssi_state; + } + + if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) || + (coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_STAY_LOW)) { + if (bt_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) + bt_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else if ((coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_MEDIUM) || + (coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_STAY_MEDIUM)) { + if (bt_rssi >= (rssi_thresh1 + + BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) + bt_rssi_state = BTC_RSSI_STATE_HIGH; + else if (bt_rssi < rssi_thresh) + bt_rssi_state = BTC_RSSI_STATE_LOW; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM; + } else { + if (bt_rssi < rssi_thresh1) + bt_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } + + coex_sta->pre_bt_rssi_state = bt_rssi_state; + + return bt_rssi_state; +} + +u8 halbtc8192e1ant_wifi_rssi_state(IN struct btc_coexist *btcoexist, + IN u8 index, IN u8 level_num, IN u8 rssi_thresh, IN u8 rssi_thresh1) +{ + s32 wifi_rssi = 0; + u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index]; + + btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi); + + if (level_num == 2) { + if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW) + || + (coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_STAY_LOW)) { + if (wifi_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) + wifi_rssi_state = BTC_RSSI_STATE_HIGH; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else { + if (wifi_rssi < rssi_thresh) + wifi_rssi_state = BTC_RSSI_STATE_LOW; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } else if (level_num == 3) { + if (rssi_thresh > rssi_thresh1) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi RSSI thresh error!!\n"); + BTC_TRACE(trace_buf); + return coex_sta->pre_wifi_rssi_state[index]; + } + + if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW) + || + (coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_STAY_LOW)) { + if (wifi_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) + wifi_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else if ((coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_MEDIUM) || + (coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_STAY_MEDIUM)) { + if (wifi_rssi >= (rssi_thresh1 + + BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT)) + wifi_rssi_state = BTC_RSSI_STATE_HIGH; + else if (wifi_rssi < rssi_thresh) + wifi_rssi_state = BTC_RSSI_STATE_LOW; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM; + } else { + if (wifi_rssi < rssi_thresh1) + wifi_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } + + coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state; + + return wifi_rssi_state; +} + +void halbtc8192e1ant_update_ra_mask(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u32 dis_rate_mask) +{ + coex_dm->cur_ra_mask = dis_rate_mask; + + if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) + btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK, + &coex_dm->cur_ra_mask); + coex_dm->pre_ra_mask = coex_dm->cur_ra_mask; +} + +void halbtc8192e1ant_auto_rate_fallback_retry(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + boolean wifi_under_b_mode = false; + + coex_dm->cur_arfr_type = type; + + if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) { + switch (coex_dm->cur_arfr_type) { + case 0: /* normal mode */ + btcoexist->btc_write_4byte(btcoexist, 0x430, + coex_dm->backup_arfr_cnt1); + btcoexist->btc_write_4byte(btcoexist, 0x434, + coex_dm->backup_arfr_cnt2); + break; + case 1: + btcoexist->btc_get(btcoexist, + BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + if (wifi_under_b_mode) { + btcoexist->btc_write_4byte(btcoexist, + 0x430, 0x0); + btcoexist->btc_write_4byte(btcoexist, + 0x434, 0x01010101); + } else { + btcoexist->btc_write_4byte(btcoexist, + 0x430, 0x0); + btcoexist->btc_write_4byte(btcoexist, + 0x434, 0x04030201); + } + break; + default: + break; + } + } + + coex_dm->pre_arfr_type = coex_dm->cur_arfr_type; +} + +void halbtc8192e1ant_retry_limit(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + coex_dm->cur_retry_limit_type = type; + + if (force_exec || + (coex_dm->pre_retry_limit_type != + coex_dm->cur_retry_limit_type)) { + switch (coex_dm->cur_retry_limit_type) { + case 0: /* normal mode */ + btcoexist->btc_write_2byte(btcoexist, 0x42a, + coex_dm->backup_retry_limit); + break; + case 1: /* retry limit=8 */ + btcoexist->btc_write_2byte(btcoexist, 0x42a, + 0x0808); + break; + default: + break; + } + } + + coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type; +} + +void halbtc8192e1ant_ampdu_max_time(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + coex_dm->cur_ampdu_time_type = type; + + if (force_exec || + (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) { + switch (coex_dm->cur_ampdu_time_type) { + case 0: /* normal mode */ + btcoexist->btc_write_1byte(btcoexist, 0x456, + coex_dm->backup_ampdu_max_time); + break; + case 1: /* AMPDU timw = 0x38 * 32us */ + btcoexist->btc_write_1byte(btcoexist, 0x456, + 0x38); + break; + default: + break; + } + } + + coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type; +} + +void halbtc8192e1ant_limited_tx(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 ra_mask_type, IN u8 arfr_type, + IN u8 retry_limit_type, IN u8 ampdu_time_type) +{ + switch (ra_mask_type) { + case 0: /* normal mode */ + halbtc8192e1ant_update_ra_mask(btcoexist, force_exec, + 0x0); + break; + case 1: /* disable cck 1/2 */ + halbtc8192e1ant_update_ra_mask(btcoexist, force_exec, + 0x00000003); + break; + case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */ + halbtc8192e1ant_update_ra_mask(btcoexist, force_exec, + 0x0001f1f7); + break; + default: + break; + } + + halbtc8192e1ant_auto_rate_fallback_retry(btcoexist, force_exec, + arfr_type); + halbtc8192e1ant_retry_limit(btcoexist, force_exec, retry_limit_type); + halbtc8192e1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type); +} + +void halbtc8192e1ant_limited_rx(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean rej_ap_agg_pkt, + IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size) +{ + boolean reject_rx_agg = rej_ap_agg_pkt; + boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size; + u8 rx_agg_size = agg_buf_size; + + /* ============================================ */ + /* Rx Aggregation related setting */ + /* ============================================ */ + btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, + &reject_rx_agg); + /* decide BT control aggregation buf size or not */ + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, + &bt_ctrl_rx_agg_size); + /* aggregation buf size, only work when BT control Rx aggregation size. */ + btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size); + /* real update aggregation setting */ + btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); + + +} + +void halbtc8192e1ant_query_bt_info(IN struct btc_coexist *btcoexist) +{ + u8 h2c_parameter[1] = {0}; + + coex_sta->c2h_bt_info_req_sent = true; + + h2c_parameter[0] |= BIT(0); /* trigger */ + + btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter); +} + +void halbtc8192e1ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist) +{ + u32 reg_hp_txrx, reg_lp_txrx, u32tmp; + u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0; + static u8 num_of_bt_counter_chk = 0; + + /* to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS */ + /* if (! (btcoexist->btc_read_1byte(btcoexist, 0x76e) & 0x8) ) */ + + if (coex_sta->under_ips) { + coex_sta->high_priority_tx = 65535; + coex_sta->high_priority_rx = 65535; + coex_sta->low_priority_tx = 65535; + coex_sta->low_priority_rx = 65535; + return; + } + + reg_hp_txrx = 0x770; + reg_lp_txrx = 0x774; + + u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx); + reg_hp_tx = u32tmp & MASKLWORD; + reg_hp_rx = (u32tmp & MASKHWORD) >> 16; + + u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx); + reg_lp_tx = u32tmp & MASKLWORD; + reg_lp_rx = (u32tmp & MASKHWORD) >> 16; + + coex_sta->high_priority_tx = reg_hp_tx; + coex_sta->high_priority_rx = reg_hp_rx; + coex_sta->low_priority_tx = reg_lp_tx; + coex_sta->low_priority_rx = reg_lp_rx; + + if ((coex_sta->low_priority_tx >= 1050) && + (!coex_sta->c2h_bt_inquiry_page)) + coex_sta->pop_event_cnt++; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n", + reg_hp_rx, reg_hp_tx, reg_lp_rx, reg_lp_tx); + BTC_TRACE(trace_buf); + + /* reset counter */ + btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc); + + if ((reg_hp_tx == 0) && (reg_hp_rx == 0) && (reg_lp_tx == 0) && + (reg_lp_rx == 0)) { + num_of_bt_counter_chk++; + if (num_of_bt_counter_chk >= 3) { + halbtc8192e1ant_query_bt_info(btcoexist); + num_of_bt_counter_chk = 0; + } + } +} + + +void halbtc8192e1ant_monitor_wifi_ctr(IN struct btc_coexist *btcoexist) +{ + s32 wifi_rssi = 0; + boolean wifi_busy = false, wifi_under_b_mode = false; + static u8 cck_lock_counter = 0; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + + if (coex_sta->under_ips) { + coex_sta->crc_ok_cck = 0; + coex_sta->crc_ok_11g = 0; + coex_sta->crc_ok_11n = 0; + coex_sta->crc_ok_11n_agg = 0; + + coex_sta->crc_err_cck = 0; + coex_sta->crc_err_11g = 0; + coex_sta->crc_err_11n = 0; + coex_sta->crc_err_11n_agg = 0; + } else { + coex_sta->crc_ok_cck = btcoexist->btc_read_4byte(btcoexist, + 0xf88); + coex_sta->crc_ok_11g = btcoexist->btc_read_2byte(btcoexist, + 0xf94); + coex_sta->crc_ok_11n = btcoexist->btc_read_2byte(btcoexist, + 0xf90); + coex_sta->crc_ok_11n_agg = btcoexist->btc_read_2byte(btcoexist, + 0xfb8); + + coex_sta->crc_err_cck = btcoexist->btc_read_4byte(btcoexist, + 0xf84); + coex_sta->crc_err_11g = btcoexist->btc_read_2byte(btcoexist, + 0xf96); + coex_sta->crc_err_11n = btcoexist->btc_read_2byte(btcoexist, + 0xf92); + coex_sta->crc_err_11n_agg = btcoexist->btc_read_2byte(btcoexist, + 0xfba); + } + + + /* reset counter */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0); + + if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) { + if ((coex_dm->bt_status == BT_8192E_1ANT_BT_STATUS_ACL_BUSY) || + (coex_dm->bt_status == + BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY) || + (coex_dm->bt_status == + BT_8192E_1ANT_BT_STATUS_SCO_BUSY)) { + if (coex_sta->crc_ok_cck > (coex_sta->crc_ok_11g + + coex_sta->crc_ok_11n + + coex_sta->crc_ok_11n_agg)) { + if (cck_lock_counter < 5) + cck_lock_counter++; + } else { + if (cck_lock_counter > 0) + cck_lock_counter--; + } + + } else { + if (cck_lock_counter > 0) + cck_lock_counter--; + } + } else { + if (cck_lock_counter > 0) + cck_lock_counter--; + } + + if (!coex_sta->pre_ccklock) { + + if (cck_lock_counter >= 5) + coex_sta->cck_lock = true; + else + coex_sta->cck_lock = false; + } else { + if (cck_lock_counter == 0) + coex_sta->cck_lock = false; + else + coex_sta->cck_lock = true; + } + + coex_sta->pre_ccklock = coex_sta->cck_lock; + + +} + +boolean halbtc8192e1ant_is_wifi_status_changed(IN struct btc_coexist *btcoexist) +{ + static boolean pre_wifi_busy = false, pre_under_4way = false, + pre_bt_hs_on = false; + boolean wifi_busy = false, under_4way = false, bt_hs_on = false; + boolean wifi_connected = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, + &under_4way); + + if (wifi_connected) { + if (wifi_busy != pre_wifi_busy) { + pre_wifi_busy = wifi_busy; + return true; + } + if (under_4way != pre_under_4way) { + pre_under_4way = under_4way; + return true; + } + if (bt_hs_on != pre_bt_hs_on) { + pre_bt_hs_on = bt_hs_on; + return true; + } + } + + return false; +} + +void halbtc8192e1ant_update_bt_link_info(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean bt_hs_on = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + + bt_link_info->bt_link_exist = coex_sta->bt_link_exist; + bt_link_info->sco_exist = coex_sta->sco_exist; + bt_link_info->a2dp_exist = coex_sta->a2dp_exist; + bt_link_info->pan_exist = coex_sta->pan_exist; + bt_link_info->hid_exist = coex_sta->hid_exist; + + /* work around for HS mode. */ + if (bt_hs_on) { + bt_link_info->pan_exist = true; + bt_link_info->bt_link_exist = true; + } + + /* check if Sco only */ + if (bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + !bt_link_info->hid_exist) + bt_link_info->sco_only = true; + else + bt_link_info->sco_only = false; + + /* check if A2dp only */ + if (!bt_link_info->sco_exist && + bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + !bt_link_info->hid_exist) + bt_link_info->a2dp_only = true; + else + bt_link_info->a2dp_only = false; + + /* check if Pan only */ + if (!bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + bt_link_info->pan_exist && + !bt_link_info->hid_exist) + bt_link_info->pan_only = true; + else + bt_link_info->pan_only = false; + + /* check if Hid only */ + if (!bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + bt_link_info->hid_exist) + bt_link_info->hid_only = true; + else + bt_link_info->hid_only = false; +} + +u8 halbtc8192e1ant_action_algorithm(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean bt_hs_on = false; + u8 algorithm = BT_8192E_1ANT_COEX_ALGO_UNDEFINED; + u8 num_of_diff_profile = 0; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + + if (!bt_link_info->bt_link_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], No BT link exists!!!\n"); + BTC_TRACE(trace_buf); + return algorithm; + } + + if (bt_link_info->sco_exist) + num_of_diff_profile++; + if (bt_link_info->hid_exist) + num_of_diff_profile++; + if (bt_link_info->pan_exist) + num_of_diff_profile++; + if (bt_link_info->a2dp_exist) + num_of_diff_profile++; + + if (num_of_diff_profile == 1) { + if (bt_link_info->sco_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO only\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; + } else { + if (bt_link_info->hid_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID only\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_1ANT_COEX_ALGO_HID; + } else if (bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = A2DP only\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_1ANT_COEX_ALGO_A2DP; + } else if (bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = PAN(HS) only\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_PANHS; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = PAN(EDR) only\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_PANEDR; + } + } + } + } else if (num_of_diff_profile == 2) { + if (bt_link_info->sco_exist) { + if (bt_link_info->hid_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_1ANT_COEX_ALGO_HID; + } else if (bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + A2DP ==> SCO\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; + } else if (bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; + } + } + } else { + if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + A2DP\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP; + } else if (bt_link_info->hid_exist && + bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_HID_A2DP; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; + } + } else if (bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = A2DP + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP; + } + } + } + } else if (num_of_diff_profile == 3) { + if (bt_link_info->sco_exist) { + if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_1ANT_COEX_ALGO_HID; + } else if (bt_link_info->hid_exist && + bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_HID_A2DP; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; + } + } else if (bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_1ANT_COEX_ALGO_SCO; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; + } + } + } else { + if (bt_link_info->hid_exist && + bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_HID_A2DP; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR; + } + } + } + } else if (num_of_diff_profile >= 3) { + if (bt_link_info->sco_exist) { + if (bt_link_info->hid_exist && + bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_1ANT_COEX_ALGO_PANEDR_HID; + } + } + } + } + + return algorithm; +} + +void halbtc8192e1ant_set_bt_auto_report(IN struct btc_coexist *btcoexist, + IN boolean enable_auto_report) +{ + u8 h2c_parameter[1] = {0}; + + h2c_parameter[0] = 0; + + if (enable_auto_report) + h2c_parameter[0] |= BIT(0); + + btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter); +} + +void halbtc8192e1ant_bt_auto_report(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean enable_auto_report) +{ + coex_dm->cur_bt_auto_report = enable_auto_report; + + if (!force_exec) { + if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report) + return; + } + halbtc8192e1ant_set_bt_auto_report(btcoexist, + coex_dm->cur_bt_auto_report); + + coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report; +} + +void halbtc8192e1ant_set_sw_penalty_tx_rate_adaptive(IN struct btc_coexist + *btcoexist, IN boolean low_penalty_ra) +{ + u8 h2c_parameter[6] = {0}; + + h2c_parameter[0] = 0x6; /* op_code, 0x6= Retry_Penalty */ + + if (low_penalty_ra) { + h2c_parameter[1] |= BIT(0); + 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 */ + } + + btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter); +} + +void halbtc8192e1ant_low_penalty_ra(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean low_penalty_ra) +{ + coex_dm->cur_low_penalty_ra = low_penalty_ra; + + if (!force_exec) { + if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra) + return; + } + halbtc8192e1ant_set_sw_penalty_tx_rate_adaptive(btcoexist, + coex_dm->cur_low_penalty_ra); + + coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra; +} + +void halbtc8192e1ant_set_coex_table(IN struct btc_coexist *btcoexist, + IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc) +{ + btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0); + + btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4); + + btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8); + + btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc); +} + +void halbtc8192e1ant_coex_table(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4, + IN u32 val0x6c8, IN u8 val0x6cc) +{ + coex_dm->cur_val0x6c0 = val0x6c0; + coex_dm->cur_val0x6c4 = val0x6c4; + coex_dm->cur_val0x6c8 = val0x6c8; + coex_dm->cur_val0x6cc = val0x6cc; + + if (!force_exec) { + if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) && + (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) && + (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) && + (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc)) + return; + } + halbtc8192e1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8, + val0x6cc); + + coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0; + coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4; + coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8; + coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc; +} + +void halbtc8192e1ant_coex_table_with_type(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** CoexTable(%d) **********\n", type); + BTC_TRACE(trace_buf); + + coex_sta->coex_table_type = type; + + switch (type) { + case 0: + halbtc8192e1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0x55555555, 0xffffff, 0x3); + break; + case 1: + halbtc8192e1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 2: + halbtc8192e1ant_coex_table(btcoexist, force_exec, + 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 3: + halbtc8192e1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 4: + halbtc8192e1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3); + break; + case 5: + halbtc8192e1ant_coex_table(btcoexist, force_exec, + 0x5a5a5a5a, 0xaa5a5a5a, 0xffffff, 0x3); + break; + case 6: + halbtc8192e1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3); + break; + case 7: + halbtc8192e1ant_coex_table(btcoexist, force_exec, + 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3); + break; + default: + break; + } +} + +void halbtc8192e1ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist, + IN boolean enable) +{ + u8 h2c_parameter[1] = {0}; + + if (enable) { + h2c_parameter[0] |= BIT(0); /* function enable */ + } + + btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter); +} + +void halbtc8192e1ant_ignore_wlan_act(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean enable) +{ + coex_dm->cur_ignore_wlan_act = enable; + + if (!force_exec) { + if (coex_dm->pre_ignore_wlan_act == + coex_dm->cur_ignore_wlan_act) + return; + } + halbtc8192e1ant_set_fw_ignore_wlan_act(btcoexist, enable); + + coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act; +} + +void halbtc8192e1ant_set_lps_rpwm(IN struct btc_coexist *btcoexist, + IN u8 lps_val, IN u8 rpwm_val) +{ + u8 lps = lps_val; + u8 rpwm = rpwm_val; + + btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps); + btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm); +} + +void halbtc8192e1ant_lps_rpwm(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val) +{ + coex_dm->cur_lps = lps_val; + coex_dm->cur_rpwm = rpwm_val; + + if (!force_exec) { + if ((coex_dm->pre_lps == coex_dm->cur_lps) && + (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) + return; + } + halbtc8192e1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val); + + coex_dm->pre_lps = coex_dm->cur_lps; + coex_dm->pre_rpwm = coex_dm->cur_rpwm; +} + +void halbtc8192e1ant_sw_mechanism(IN struct btc_coexist *btcoexist, + IN boolean low_penalty_ra) +{ + halbtc8192e1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra); +} + +void halbtc8192e1ant_set_ant_path(IN struct btc_coexist *btcoexist, + IN u8 ant_pos_type, IN boolean init_hwcfg, IN boolean wifi_off) +{ + u32 u32tmp = 0; + + if (init_hwcfg) { + btcoexist->btc_write_1byte(btcoexist, 0x944, 0x24); + btcoexist->btc_write_4byte(btcoexist, 0x930, 0x700700); + if (btcoexist->chip_interface == BTC_INTF_USB) + btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30430004); + else + btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30030004); + + /* 0x4c[27][24]='00', Set Antenna to BB */ + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c); + u32tmp &= ~BIT(24); + u32tmp &= ~BIT(27); + btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp); + } else if (wifi_off) { + if (btcoexist->chip_interface == BTC_INTF_USB) + btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30430004); + else + btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30030004); + + /* 0x4c[27][24]='11', Set Antenna to BT, 0x64[8:7]=0, 0x64[2]=1 */ + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c); + u32tmp |= BIT(24); + u32tmp |= BIT(27); + btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp); + } + + /* ext switch setting */ + switch (ant_pos_type) { + case BTC_ANT_PATH_WIFI: + btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4); + break; + case BTC_ANT_PATH_BT: + btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20); + break; + default: + case BTC_ANT_PATH_PTA: + btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4); + break; + } +} + +void halbtc8192e1ant_set_fw_pstdma(IN struct btc_coexist *btcoexist, + IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5) +{ + u8 h2c_parameter[5] = {0}; + u8 real_byte1 = byte1, real_byte5 = byte5; + boolean ap_enable = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, + &ap_enable); + + if (ap_enable) { + if (byte1 & BIT(4) && !(byte1 & BIT(5))) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], FW for 1Ant AP mode\n"); + BTC_TRACE(trace_buf); + real_byte1 &= ~BIT(4); + real_byte1 |= BIT(5); + + real_byte5 |= BIT(5); + real_byte5 &= ~BIT(6); + } + } + + h2c_parameter[0] = real_byte1; + h2c_parameter[1] = byte2; + h2c_parameter[2] = byte3; + h2c_parameter[3] = byte4; + h2c_parameter[4] = real_byte5; + + coex_dm->ps_tdma_para[0] = real_byte1; + coex_dm->ps_tdma_para[1] = byte2; + coex_dm->ps_tdma_para[2] = byte3; + coex_dm->ps_tdma_para[3] = byte4; + coex_dm->ps_tdma_para[4] = real_byte5; + + btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter); +} + + +void halbtc8192e1ant_ps_tdma(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean turn_on, IN u8 type) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_busy = false; + u8 rssi_adjust_val = 0; + u8 ps_tdma_byte4_val = 0x50, ps_tdma_byte0_val = 0x51, + ps_tdma_byte3_val = 0x10; + s8 wifi_duration_adjust = 0x0; + + coex_dm->cur_ps_tdma_on = turn_on; + coex_dm->cur_ps_tdma = type; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + if (coex_dm->cur_ps_tdma_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** TDMA(on, %d) **********\n", + coex_dm->cur_ps_tdma); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** TDMA(off, %d) **********\n", + coex_dm->cur_ps_tdma); + BTC_TRACE(trace_buf); + } + + if (!force_exec) { + if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) && + (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma)) + return; + } + + if (coex_sta->scan_ap_num <= 5) + wifi_duration_adjust = 5; + else if (coex_sta->scan_ap_num >= 40) + wifi_duration_adjust = -15; + else if (coex_sta->scan_ap_num >= 20) + wifi_duration_adjust = -10; + + if (!coex_sta->force_lps_on) { /* only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30 */ + ps_tdma_byte0_val = 0x61; /* no null-pkt */ + ps_tdma_byte3_val = 0x11; /* no tx-pause at BT-slot */ + ps_tdma_byte4_val = 0x10; /* 0x778 = d/1 toggle */ + } + + if ((type == 3) || (type == 13) || (type == 14)) + ps_tdma_byte4_val = ps_tdma_byte4_val & + 0xbf; /* no dynamic slot for multi-profile */ + + if (bt_link_info->slave_role == true) + ps_tdma_byte4_val = ps_tdma_byte4_val | + 0x1; /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */ + + if (turn_on) { + switch (type) { + default: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x51, + 0x1a, 0x1a, 0x0, ps_tdma_byte4_val); + break; + case 1: + halbtc8192e1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x3a + + wifi_duration_adjust, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 2: + halbtc8192e1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x2d + + wifi_duration_adjust, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 3: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x51, + 0x1d, 0x1d, 0x0, ps_tdma_byte4_val); + break; + case 4: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x93, + 0x15, 0x3, 0x14, 0x0); + break; + case 5: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x61, + 0x15, 0x3, 0x11, 0x11); + break; + case 6: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x61, + 0x20, 0x3, 0x11, 0x11); + break; + case 7: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x13, + 0xc, 0x5, 0x0, 0x0); + break; + case 8: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x93, + 0x25, 0x3, 0x10, 0x0); + break; + case 9: + halbtc8192e1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x3, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 10: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x13, + 0xa, 0xa, 0x0, 0x40); + break; + case 11: + halbtc8192e1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 12: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x51, + 0x0a, 0x0a, 0x0, 0x50); + break; + case 13: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x51, + 0x12, 0x12, 0x0, ps_tdma_byte4_val); + break; + case 14: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x51, + 0x21, 0x3, 0x10, ps_tdma_byte4_val); + break; + case 15: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x13, + 0xa, 0x3, 0x8, 0x0); + break; + case 16: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x93, + 0x15, 0x3, 0x10, 0x0); + break; + case 18: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x93, + 0x25, 0x3, 0x10, 0x0); + break; + case 20: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x61, + 0x3f, 0x03, 0x11, 0x10); + break; + case 21: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x61, + 0x25, 0x03, 0x11, 0x11); + break; + case 22: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x61, + 0x25, 0x03, 0x11, 0x10); + break; + case 23: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0xe3, + 0x25, 0x3, 0x31, 0x18); + break; + case 24: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0xe3, + 0x15, 0x3, 0x31, 0x18); + break; + case 25: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0xe3, + 0xa, 0x3, 0x31, 0x18); + break; + case 26: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0xe3, + 0xa, 0x3, 0x31, 0x18); + break; + case 27: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0xe3, + 0x25, 0x3, 0x31, 0x98); + break; + case 28: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x69, + 0x25, 0x3, 0x31, 0x0); + break; + case 29: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0xab, + 0x1a, 0x1a, 0x1, 0x10); + break; + case 30: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x51, + 0x30, 0x3, 0x10, 0x10); + break; + case 31: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0xd3, + 0x1a, 0x1a, 0, 0x58); + break; + case 32: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x61, + 0x35, 0x3, 0x11, 0x11); + break; + case 33: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0xa3, + 0x25, 0x3, 0x30, 0x90); + break; + case 34: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x53, + 0x1a, 0x1a, 0x0, 0x10); + break; + case 35: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x63, + 0x1a, 0x1a, 0x0, 0x10); + break; + case 36: + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0xd3, + 0x12, 0x3, 0x14, 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 */ + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x23, + 0x18, 0x00, 0x10, 0x24); + break; + } + } else { + + /* disable PS tdma */ + switch (type) { + case 8: /* PTA Control */ + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x8, + 0x0, 0x0, 0x0, 0x0); + halbtc8192e1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_PTA, false, false); + break; + case 0: + default: /* Software control, Antenna at BT side */ + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x0, + 0x0, 0x0, 0x0, 0x0); + halbtc8192e1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_BT, false, false); + break; + case 9: /* Software control, Antenna at WiFi side */ + halbtc8192e1ant_set_fw_pstdma(btcoexist, 0x0, + 0x0, 0x0, 0x0, 0x0); + halbtc8192e1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_WIFI, false, false); + break; + } + } + rssi_adjust_val = 0; + btcoexist->btc_set(btcoexist, + BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssi_adjust_val); + + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + btcoexist->btc_read_4byte(btcoexist, 0x948), + btcoexist->btc_read_1byte(btcoexist, 0x765), + btcoexist->btc_read_1byte(btcoexist, 0x67)); + BTC_TRACE(trace_buf); + /* update pre state */ + coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on; + coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma; +} + +void halbtc8192e1ant_coex_all_off(IN struct btc_coexist *btcoexist) +{ + /* sw all off */ + halbtc8192e1ant_sw_mechanism(btcoexist, false); + + /* hw all off */ + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); +} + +boolean halbtc8192e1ant_is_common_action(IN struct btc_coexist *btcoexist) +{ + boolean common = false, wifi_connected = false, wifi_busy = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + if (!wifi_connected && + BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else if (wifi_connected && + (BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi connected + BT non connected-idle!!\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else if (!wifi_connected && + (BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi non connected-idle + BT connected-idle!!\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else if (wifi_connected && + (BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi connected + BT connected-idle!!\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else if (!wifi_connected && + (BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE != coex_dm->bt_status)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi non connected-idle + BT Busy!!\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else { + if (wifi_busy) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi Connected-Busy + BT Busy!!\n"); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi Connected-Idle + BT Busy!!\n"); + BTC_TRACE(trace_buf); + } + + common = false; + } + + return common; +} + + +void halbtc8192e1ant_tdma_duration_adjust_for_acl(IN struct btc_coexist + *btcoexist, IN u8 wifi_status) +{ + static s32 up, dn, m, n, wait_count; + s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */ + u8 retry_count = 0, bt_info_ext; + boolean wifi_busy = false; + /*static boolean pre_wifi_busy = false;*/ + + if (BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifi_status) + wifi_busy = true; + else + wifi_busy = false; + + if ((BT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == + wifi_status) || + (BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifi_status) || + (BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SPECIFIC_PKT == + wifi_status)) { + if (coex_dm->cur_ps_tdma != 1 && + coex_dm->cur_ps_tdma != 2 && + coex_dm->cur_ps_tdma != 3 && + coex_dm->cur_ps_tdma != 9) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 9); + coex_dm->ps_tdma_du_adj_type = 9; + + up = 0; + dn = 0; + m = 1; + n = 3; + result = 0; + wait_count = 0; + } + return; + } + + if (!coex_dm->auto_tdma_adjust) { + coex_dm->auto_tdma_adjust = true; + + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2); + coex_dm->ps_tdma_du_adj_type = 2; + /* ============ */ + up = 0; + dn = 0; + m = 1; + n = 3; + result = 0; + wait_count = 0; + } else { + /* accquire the BT TRx retry count from BT_Info byte2 */ + retry_count = coex_sta->bt_retry_cnt; + bt_info_ext = coex_sta->bt_info_ext; + + if ((coex_sta->low_priority_tx) > 1050 || + (coex_sta->low_priority_rx) > 1250) + retry_count++; + + result = 0; + wait_count++; + + if (retry_count == + 0) { /* no retry in the last 2-second duration */ + up++; + dn--; + + if (dn <= 0) + dn = 0; + + if (up >= n) { /* if retry count during continuous n*2 seconds is 0, enlarge WiFi duration */ + wait_count = 0; + n = 3; + up = 0; + dn = 0; + result = 1; + } + } else if (retry_count <= + 3) { /* <=3 retry in the last 2-second duration */ + up--; + dn++; + + if (up <= 0) + up = 0; + + if (dn == 2) { /* if continuous 2 retry count(every 2 seconds) >0 and < 3, reduce WiFi duration */ + if (wait_count <= 2) + m++; /* to avoid loop between the two levels */ + else + m = 1; + + if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */ + m = 20; + + n = 3 * m; + up = 0; + dn = 0; + wait_count = 0; + result = -1; + } + } else { /* retry count > 3, once retry count > 3, to reduce WiFi duration */ + if (wait_count == 1) + m++; /* to avoid loop between the two levels */ + else + m = 1; + + if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */ + m = 20; + + n = 3 * m; + up = 0; + dn = 0; + wait_count = 0; + result = -1; + } + + if (result == -1) { + if ((BT_INFO_8192E_1ANT_A2DP_BASIC_RATE(bt_info_ext)) && + ((coex_dm->cur_ps_tdma == 1) || + (coex_dm->cur_ps_tdma == 2))) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 9); + coex_dm->ps_tdma_du_adj_type = 9; + } else if (coex_dm->cur_ps_tdma == 1) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = 2; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 9); + coex_dm->ps_tdma_du_adj_type = 9; + } else if (coex_dm->cur_ps_tdma == 9) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = 11; + } + } else if (result == 1) { + if ((BT_INFO_8192E_1ANT_A2DP_BASIC_RATE(bt_info_ext)) && + ((coex_dm->cur_ps_tdma == 1) || + (coex_dm->cur_ps_tdma == 2))) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 9); + coex_dm->ps_tdma_du_adj_type = 9; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 9); + coex_dm->ps_tdma_du_adj_type = 9; + } else if (coex_dm->cur_ps_tdma == 9) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = 2; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 1); + coex_dm->ps_tdma_du_adj_type = 1; + } + } else { /* no change */ + /* Bryant Modify + if(wifi_busy != pre_wifi_busy) + { + pre_wifi_busy = wifi_busy; + halbtc8192e1ant_ps_tdma(btcoexist, FORCE_EXEC, true, coex_dm->cur_ps_tdma); + } + */ + } + + if (coex_dm->cur_ps_tdma != 1 && + coex_dm->cur_ps_tdma != 2 && + coex_dm->cur_ps_tdma != 9 && + coex_dm->cur_ps_tdma != 11) { + /* recover to previous adjust type */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + coex_dm->ps_tdma_du_adj_type); + } + } +} + +void halbtc8192e1ant_ps_tdma_check_for_power_save_state( + IN struct btc_coexist *btcoexist, IN boolean new_ps_state) +{ + u8 lps_mode = 0x0; + + btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode); + + if (lps_mode) { /* already under LPS state */ + if (new_ps_state) { + /* keep state under LPS, do nothing. */ + } else { + /* will leave LPS state, turn off psTdma first */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 0); + } + } else { /* NO PS state */ + if (new_ps_state) { + /* will enter LPS state, turn off psTdma first */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 0); + } else { + /* keep state under NO PS state, do nothing. */ + } + } +} + +void halbtc8192e1ant_power_save_state(IN struct btc_coexist *btcoexist, + IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val) +{ + boolean low_pwr_disable = false; + + switch (ps_type) { + case BTC_PS_WIFI_NATIVE: + /* recover to original 32k low power setting */ + low_pwr_disable = false; + btcoexist->btc_set(btcoexist, + BTC_SET_ACT_DISABLE_LOW_POWER, + &low_pwr_disable); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, + NULL); + coex_sta->force_lps_on = false; + break; + case BTC_PS_LPS_ON: + halbtc8192e1ant_ps_tdma_check_for_power_save_state( + btcoexist, true); + halbtc8192e1ant_lps_rpwm(btcoexist, NORMAL_EXEC, + lps_val, rpwm_val); + /* when coex force to enter LPS, do not enter 32k low power. */ + low_pwr_disable = true; + btcoexist->btc_set(btcoexist, + BTC_SET_ACT_DISABLE_LOW_POWER, + &low_pwr_disable); + /* power save must executed before psTdma. */ + btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, + NULL); + coex_sta->force_lps_on = true; + break; + case BTC_PS_LPS_OFF: + halbtc8192e1ant_ps_tdma_check_for_power_save_state( + btcoexist, false); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, + NULL); + coex_sta->force_lps_on = false; + break; + default: + break; + } +} + +void halbtc8192e1ant_action_wifi_only(IN struct btc_coexist *btcoexist) +{ + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 9); +} + +void halbtc8192e1ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist) +{ + static u32 bt_disable_cnt = 0; + boolean bt_active = true, bt_disabled = false; + + /* This function check if bt is disabled */ + + if (coex_sta->high_priority_tx == 0 && + coex_sta->high_priority_rx == 0 && + coex_sta->low_priority_tx == 0 && + coex_sta->low_priority_rx == 0) + bt_active = false; + if (coex_sta->high_priority_tx == 0xffff && + coex_sta->high_priority_rx == 0xffff && + coex_sta->low_priority_tx == 0xffff && + coex_sta->low_priority_rx == 0xffff) + bt_active = false; + if (bt_active) { + bt_disable_cnt = 0; + bt_disabled = false; + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, + &bt_disabled); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is enabled !!\n"); + BTC_TRACE(trace_buf); + } else { + bt_disable_cnt++; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], bt all counters=0, %d times!!\n", + bt_disable_cnt); + BTC_TRACE(trace_buf); + if (bt_disable_cnt >= 2) { + bt_disabled = true; + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, + &bt_disabled); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is disabled !!\n"); + BTC_TRACE(trace_buf); + halbtc8192e1ant_action_wifi_only(btcoexist); + } + } + if (coex_sta->bt_disabled != bt_disabled) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is from %s to %s!!\n", + (coex_sta->bt_disabled ? "disabled" : "enabled"), + (bt_disabled ? "disabled" : "enabled")); + BTC_TRACE(trace_buf); + coex_sta->bt_disabled = bt_disabled; + if (!bt_disabled) { + } else { + btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, + NULL); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, + NULL); + } + } +} + +/* ********************************************* + * + * Software Coex Mechanism start + * + * ********************************************* */ + +/* SCO only or SCO+PAN(HS) */ + +/* +void halbtc8192e1ant_action_sco(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, true); +} + + +void halbtc8192e1ant_action_hid(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, true); +} + + +void halbtc8192e1ant_action_a2dp(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, false); +} + +void halbtc8192e1ant_action_a2dp_pan_hs(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, false); +} + +void halbtc8192e1ant_action_pan_edr(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, false); +} + + +void halbtc8192e1ant_action_pan_hs(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, false); +} + + +void halbtc8192e1ant_action_pan_edr_a2dp(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, false); +} + +void halbtc8192e1ant_action_pan_edr_hid(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, true); +} + + +void halbtc8192e1ant_action_hid_a2dp_pan_edr(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, true); +} + +void halbtc8192e1ant_action_hid_a2dp(IN struct btc_coexist* btcoexist) +{ + halbtc8192e1ant_sw_mechanism(btcoexist, true); +} + +*/ + +/* ********************************************* + * + * Non-Software Coex Mechanism start + * + * ********************************************* */ +void halbtc8192e1ant_action_wifi_multi_port(IN struct btc_coexist *btcoexist) +{ + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); +} + +void halbtc8192e1ant_action_hs(IN struct btc_coexist *btcoexist) +{ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); +} + +void halbtc8192e1ant_action_bt_inquiry(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, ap_enable = false, wifi_busy = false, + bt_busy = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, + &ap_enable); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy); + + if ((!wifi_connected) && (!coex_sta->wifi_is_high_pri_task)) { + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } else if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) || + (bt_link_info->a2dp_exist)) { + /* SCO/HID/A2DP busy */ + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else if ((bt_link_info->pan_exist) || (wifi_busy)) { + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else { + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7); + } +} + +void halbtc8192e1ant_action_bt_sco_hid_only_busy(IN struct btc_coexist + *btcoexist, IN u8 wifi_status) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + + /* tdma and coex table */ + + if (bt_link_info->sco_exist) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5); + } else { /* HID */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5); + } +} + +void halbtc8192e1ant_action_wifi_connected_bt_acl_busy(IN struct btc_coexist + *btcoexist, IN u8 wifi_status) +{ + u8 bt_rssi_state; + + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + bt_rssi_state = halbtc8192e1ant_bt_rssi_state(2, 28, 0); + + if ((coex_sta->low_priority_rx >= 1000) && + (coex_sta->low_priority_rx != 65535)) + bt_link_info->slave_role = true; + else + bt_link_info->slave_role = false; + + if (bt_link_info->hid_only) { /* HID */ + halbtc8192e1ant_action_bt_sco_hid_only_busy(btcoexist, + wifi_status); + coex_dm->auto_tdma_adjust = false; + return; + } else if (bt_link_info->a2dp_only) { /* A2DP */ + if (BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifi_status) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; + } else { + halbtc8192e1ant_tdma_duration_adjust_for_acl(btcoexist, + wifi_status); +#if 0 + if (coex_sta->cck_lock) + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 3); + else +#endif + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = true; + } + } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) || + (bt_link_info->hid_exist && bt_link_info->a2dp_exist && + bt_link_info->pan_exist)) { /* A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; + } else if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { /* HID+A2DP */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14); + coex_dm->auto_tdma_adjust = false; + + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3); + } else if ((bt_link_info->pan_only) || (bt_link_info->hid_exist && + bt_link_info->pan_exist)) { /* PAN(OPP,FTP), HID+PAN(OPP,FTP) */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; + } else { + /* BT no-profile busy (0x9) */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; + } +} + +void halbtc8192e1ant_action_wifi_not_connected(IN struct btc_coexist *btcoexist) +{ + /* power save state */ + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + /* tdma and coex table */ + halbtc8192e1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); +} + +void halbtc8192e1ant_action_wifi_not_connected_scan(IN struct btc_coexist + *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + /* tdma and coex table */ + if (BT_8192E_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + if (bt_link_info->a2dp_exist) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else if (bt_link_info->a2dp_exist && + bt_link_info->pan_exist) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 22); + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 20); + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } + } else if ((BT_8192E_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8192e1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN); + } else { + /* Bryant Add */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + } +} + +void halbtc8192e1ant_action_wifi_not_connected_asso_auth( + IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + /* tdma and coex table */ + if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) || + (bt_link_info->a2dp_exist)) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else if (bt_link_info->pan_exist) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + } +} + +void halbtc8192e1ant_action_wifi_connected_scan(IN struct btc_coexist + *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + /* tdma and coex table */ + if (BT_8192E_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + if (bt_link_info->a2dp_exist) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else if (bt_link_info->a2dp_exist && + bt_link_info->pan_exist) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 22); + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 20); + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } + } else if ((BT_8192E_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8192e1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN); + } else { + /* Bryant Add */ + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + } +} + +void halbtc8192e1ant_action_wifi_connected_specific_packet( + IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + /* tdma and coex table */ + if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) || + (bt_link_info->a2dp_exist)) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else if (bt_link_info->pan_exist) { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + } +} + +void halbtc8192e1ant_action_wifi_connected(IN struct btc_coexist *btcoexist) +{ + boolean wifi_busy = false; + boolean scan = false, link = false, roam = false; + boolean under_4way = false, ap_enable = false; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CoexForWifiConnect()===>\n"); + BTC_TRACE(trace_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, + &under_4way); + if (under_4way) { + halbtc8192e1ant_action_wifi_connected_specific_packet(btcoexist); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n"); + BTC_TRACE(trace_buf); + return; + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); + if (scan || link || roam) { + if (scan) + halbtc8192e1ant_action_wifi_connected_scan(btcoexist); + else + halbtc8192e1ant_action_wifi_connected_specific_packet( + btcoexist); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n"); + BTC_TRACE(trace_buf); + return; + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, + &ap_enable); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + /* power save state */ + if (!ap_enable && + BT_8192E_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status && + !btcoexist->bt_link_info.hid_only) { + if (btcoexist->bt_link_info.a2dp_only) { /* A2DP */ + if (!wifi_busy) + halbtc8192e1ant_power_save_state(btcoexist, + BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else { /* busy */ + if (coex_sta->scan_ap_num >= + BT_8192E_1ANT_WIFI_NOISY_THRESH) /* no force LPS, no PS-TDMA, use pure TDMA */ + halbtc8192e1ant_power_save_state( + btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + else + halbtc8192e1ant_power_save_state( + btcoexist, BTC_PS_LPS_ON, 0x50, + 0x4); + } + } else if ((coex_sta->pan_exist == false) && + (coex_sta->a2dp_exist == false) && + (coex_sta->hid_exist == false)) + halbtc8192e1ant_power_save_state(btcoexist, + BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e1ant_power_save_state(btcoexist, + BTC_PS_LPS_ON, 0x50, 0x4); + } else + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + + /* tdma and coex table */ + if (!wifi_busy) { + if (BT_8192E_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + halbtc8192e1ant_action_wifi_connected_bt_acl_busy( + btcoexist, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE); + } else if ((BT_8192E_1ANT_BT_STATUS_SCO_BUSY == + coex_dm->bt_status) || + (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8192e1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE); + } else { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 8); + + if ((coex_sta->high_priority_tx) + + (coex_sta->high_priority_rx) <= 60) + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 2); + else + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 7); + } + } else { + if (BT_8192E_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + halbtc8192e1ant_action_wifi_connected_bt_acl_busy( + btcoexist, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY); + } else if ((BT_8192E_1ANT_BT_STATUS_SCO_BUSY == + coex_dm->bt_status) || + (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8192e1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY); + } else { + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 8); + + if ((coex_sta->high_priority_tx) + + (coex_sta->high_priority_rx) <= 60) + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 2); + else + halbtc8192e1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 7); + } + } +} + +void halbtc8192e1ant_run_sw_coexist_mechanism(IN struct btc_coexist *btcoexist) +{ + u8 algorithm = 0; + + algorithm = halbtc8192e1ant_action_algorithm(btcoexist); + coex_dm->cur_algorithm = algorithm; + + if (halbtc8192e1ant_is_common_action(btcoexist)) { + + } else { + switch (coex_dm->cur_algorithm) { + case BT_8192E_1ANT_COEX_ALGO_SCO: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = SCO.\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_sco(btcoexist); */ + break; + case BT_8192E_1ANT_COEX_ALGO_HID: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = HID.\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_hid(btcoexist); */ + break; + case BT_8192E_1ANT_COEX_ALGO_A2DP: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = A2DP.\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_a2dp(btcoexist); */ + break; + case BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = A2DP+PAN(HS).\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_a2dp_pan_hs(btcoexist); */ + break; + case BT_8192E_1ANT_COEX_ALGO_PANEDR: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = PAN(EDR).\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_pan_edr(btcoexist); */ + break; + case BT_8192E_1ANT_COEX_ALGO_PANHS: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = HS mode.\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_pan_hs(btcoexist); */ + break; + case BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = PAN+A2DP.\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_pan_edr_a2dp(btcoexist); */ + break; + case BT_8192E_1ANT_COEX_ALGO_PANEDR_HID: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = PAN(EDR)+HID.\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_pan_edr_hid(btcoexist); */ + break; + case BT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = HID+A2DP+PAN.\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_hid_a2dp_pan_edr(btcoexist); */ + break; + case BT_8192E_1ANT_COEX_ALGO_HID_A2DP: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = HID+A2DP.\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_action_hid_a2dp(btcoexist); */ + break; + default: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = coexist All Off!!\n"); + BTC_TRACE(trace_buf); + /* halbtc8192e1ant_coex_all_off(btcoexist); */ + break; + } + coex_dm->pre_algorithm = coex_dm->cur_algorithm; + } +} + +void halbtc8192e1ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, bt_hs_on = false; + boolean increase_scan_dev_num = false; + boolean bt_ctrl_agg_buf_size = false; + boolean miracast_plus_bt = false; + u8 agg_buf_size = 5; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism()===>\n"); + BTC_TRACE(trace_buf); + + if (btcoexist->manual_control) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n"); + BTC_TRACE(trace_buf); + return; + } + + if (btcoexist->stop_coex_dm) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n"); + BTC_TRACE(trace_buf); + return; + } + + if (coex_sta->under_ips) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi is under IPS !!!\n"); + BTC_TRACE(trace_buf); + return; + } + + if ((BT_8192E_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) || + (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) + increase_scan_dev_num = true; + + btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, + &increase_scan_dev_num); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + num_of_wifi_link = wifi_link_status >> 16; + + if ((num_of_wifi_link >= 2) || + (wifi_link_status & WIFI_P2P_GO_CONNECTED)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n", + num_of_wifi_link, wifi_link_status); + BTC_TRACE(trace_buf); + + if (bt_link_info->bt_link_exist) { + halbtc8192e1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, + 0, 1); + miracast_plus_bt = true; + } else { + halbtc8192e1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, + 0, 0); + miracast_plus_bt = false; + } + btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT, + &miracast_plus_bt); + halbtc8192e1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + + if ((bt_link_info->a2dp_exist) && + (coex_sta->c2h_bt_inquiry_page)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], BT Is Inquirying\n"); + BTC_TRACE(trace_buf); + halbtc8192e1ant_action_bt_inquiry(btcoexist); + } else + halbtc8192e1ant_action_wifi_multi_port(btcoexist); + + return; + } else { + miracast_plus_bt = false; + btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT, + &miracast_plus_bt); + } + + if ((bt_link_info->bt_link_exist) && (wifi_connected)) { + halbtc8192e1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1); + + if (bt_link_info->sco_exist) + halbtc8192e1ant_limited_rx(btcoexist, NORMAL_EXEC, + false, true, 0x5); + else + halbtc8192e1ant_limited_rx(btcoexist, NORMAL_EXEC, + false, true, 0x8); + + halbtc8192e1ant_sw_mechanism(btcoexist, true); + halbtc8192e1ant_run_sw_coexist_mechanism( + btcoexist); /* just print debug message */ + } else { + halbtc8192e1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + + halbtc8192e1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, + 0x5); + + halbtc8192e1ant_sw_mechanism(btcoexist, false); + halbtc8192e1ant_run_sw_coexist_mechanism( + btcoexist); /* just print debug message */ + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + if (coex_sta->c2h_bt_inquiry_page) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], BT Is Inquirying\n"); + BTC_TRACE(trace_buf); + halbtc8192e1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8192e1ant_action_hs(btcoexist); + return; + } + + + if (!wifi_connected) { + boolean scan = false, link = false, roam = false; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi is non connected-idle !!!\n"); + BTC_TRACE(trace_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); + + if (scan || link || roam) { + if (scan) + halbtc8192e1ant_action_wifi_not_connected_scan( + btcoexist); + else + halbtc8192e1ant_action_wifi_not_connected_asso_auth( + btcoexist); + } else + halbtc8192e1ant_action_wifi_not_connected(btcoexist); + } else /* wifi LPS/Busy */ + halbtc8192e1ant_action_wifi_connected(btcoexist); +} + +void halbtc8192e1ant_init_coex_dm(IN struct btc_coexist *btcoexist) +{ + /* force to reset coex mechanism */ + + /* sw all off */ + halbtc8192e1ant_sw_mechanism(btcoexist, false); + + /* halbtc8192e1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); */ + halbtc8192e1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); + + coex_sta->pop_event_cnt = 0; +} + +void halbtc8192e1ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean wifi_only) +{ + u16 u16tmp = 0; + u8 u8tmp = 0; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], 1Ant Init HW Config!!\n"); + BTC_TRACE(trace_buf); + + /* antenna sw ctrl to bt */ + halbtc8192e1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, true, false); + + halbtc8192e1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); + + /* antenna switch control parameter */ + btcoexist->btc_write_4byte(btcoexist, 0x858, 0x55555555); + + /* coex parameters */ + btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1); + /* 0x790[5:0]=0x5 */ + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790); + u8tmp &= 0xc0; + u8tmp |= 0x5; + btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp); + + /* enable counter statistics */ + btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4); + + /* enable PTA */ + btcoexist->btc_write_1byte(btcoexist, 0x40, 0x20); + /* enable mailbox interface */ + u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x40); + u16tmp |= BIT(9); + btcoexist->btc_write_2byte(btcoexist, 0x40, u16tmp); + + /* enable PTA I2C mailbox */ + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x101); + u8tmp |= BIT(4); + btcoexist->btc_write_1byte(btcoexist, 0x101, u8tmp); + + /* enable bt clock when wifi is disabled. */ + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x93); + u8tmp |= BIT(0); + btcoexist->btc_write_1byte(btcoexist, 0x93, u8tmp); + /* enable bt clock when suspend. */ + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x7); + u8tmp |= BIT(0); + btcoexist->btc_write_1byte(btcoexist, 0x7, u8tmp); +} + + +/* +void halbtc8192e1ant_wifi_off_hw_cfg(IN struct btc_coexist* btcoexist) +{ + + +} +*/ + +/* ************************************************************ + * work around function start with wa_halbtc8192e1ant_ + * ************************************************************ + * ************************************************************ + * extern function start with ex_halbtc8192e1ant_ + * ************************************************************ */ +void ex_halbtc8192e1ant_power_on_setting(IN struct btc_coexist *btcoexist) +{ +#if 0 + struct btc_board_info *board_info = &btcoexist->board_info; + u8 u8tmp = 0x0; + u16 u16tmp = 0x0; + + btcoexist->stop_coex_dm = true; + + btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20); + + /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */ + u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2); + btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT(0) | BIT(1)); + + /* set GRAN_BT = 1 */ + btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18); + /* set WLAN_ACT = 0 */ + btcoexist->btc_write_1byte(btcoexist, 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 (btcoexist->chip_interface == BTC_INTF_USB) { + /* fixed at S0 for USB interface */ + btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0); + + u8tmp |= 0x1; /* antenna inverse */ + btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp); + + board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT; + } else { + /* for PCIE and SDIO interface, we check efuse 0xc3[6] */ + if (board_info->single_ant_path == 0) { + /* set to S1 */ + btcoexist->btc_write_4byte(btcoexist, 0x948, 0x280); + board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT; + } else if (board_info->single_ant_path == 1) { + /* set to S0 */ + btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0); + u8tmp |= 0x1; /* antenna inverse */ + board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT; + } + + if (btcoexist->chip_interface == BTC_INTF_PCI) + btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384, + u8tmp); + else if (btcoexist->chip_interface == BTC_INTF_SDIO) + btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60, + u8tmp); + } +#endif +} + +void ex_halbtc8192e1ant_pre_load_firmware(IN struct btc_coexist *btcoexist) +{ +} + +void ex_halbtc8192e1ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean wifi_only) +{ + halbtc8192e1ant_init_hw_config(btcoexist, wifi_only); + btcoexist->stop_coex_dm = false; +} + +void ex_halbtc8192e1ant_init_coex_dm(IN struct btc_coexist *btcoexist) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Coex Mechanism Init!!\n"); + BTC_TRACE(trace_buf); + + btcoexist->stop_coex_dm = false; + + halbtc8192e1ant_init_coex_dm(btcoexist); + + halbtc8192e1ant_query_bt_info(btcoexist); +} + +void ex_halbtc8192e1ant_display_coex_info(IN struct btc_coexist *btcoexist) +{ + struct btc_board_info *board_info = &btcoexist->board_info; + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + u8 *cli_buf = btcoexist->cli_buf; + u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0; + u32 u32tmp[4]; + u32 fw_ver = 0, bt_patch_ver = 0; + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[BT Coexist info]============"); + CL_PRINTF(cli_buf); + + if (btcoexist->manual_control) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[Under Manual Control]============"); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n =========================================="); + CL_PRINTF(cli_buf); + } + if (btcoexist->stop_coex_dm) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[Coex is STOPPED]============"); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n =========================================="); + CL_PRINTF(cli_buf); + } + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", + "Ant PG number/ Ant mechanism:", + board_info->pg_ant_num, board_info->btdm_ant_num); + CL_PRINTF(cli_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)", + "CoexVer/ FwVer/ PatchVer", + glcoex_ver_date_8192e_1ant, glcoex_ver_8192e_1ant, fw_ver, + bt_patch_ver, bt_patch_ver); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", + "Wifi channel informed to BT", + coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1], + coex_dm->wifi_chnl_info[2]); + CL_PRINTF(cli_buf); + + /* wifi status */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Wifi Status]============"); + CL_PRINTF(cli_buf); + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[BT Status]============"); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", + "BT [status/ rssi/ retryCnt]", + ((coex_sta->bt_disabled) ? ("disabled") : (( + coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") + : ((BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status) ? "non-connected idle" : + ((BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) + ? "connected-idle" : "busy")))), + coex_sta->bt_rssi, coex_sta->bt_retry_cnt); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", + "SCO/HID/PAN/A2DP", + bt_link_info->sco_exist, bt_link_info->hid_exist, + bt_link_info->pan_exist, bt_link_info->a2dp_exist); + CL_PRINTF(cli_buf); + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO); + + bt_info_ext = coex_sta->bt_info_ext; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", + "BT Info A2DP rate", + (bt_info_ext & BIT(0)) ? "Basic rate" : "EDR rate"); + CL_PRINTF(cli_buf); + + for (i = 0; i < BT_INFO_SRC_8192E_1ANT_MAX; i++) { + if (coex_sta->bt_info_c2h_cnt[i]) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", + glbt_info_src_8192e_1ant[i], + coex_sta->bt_info_c2h[i][0], + coex_sta->bt_info_c2h[i][1], + coex_sta->bt_info_c2h[i][2], + coex_sta->bt_info_c2h[i][3], + coex_sta->bt_info_c2h[i][4], + coex_sta->bt_info_c2h[i][5], + coex_sta->bt_info_c2h[i][6], + coex_sta->bt_info_c2h_cnt[i]); + CL_PRINTF(cli_buf); + } + } + + if (!btcoexist->manual_control) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[mechanisms]============"); + CL_PRINTF(cli_buf); + + ps_tdma_case = coex_dm->cur_ps_tdma; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)", + "PS TDMA", + coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1], + coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3], + coex_dm->ps_tdma_para[4], ps_tdma_case, + coex_dm->auto_tdma_adjust); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", + "Latest error condition(should be 0)", + coex_dm->error_condition); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", + "IgnWlanAct", + coex_dm->cur_ignore_wlan_act); + CL_PRINTF(cli_buf); + } + + /* Hw setting */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Hw setting]============"); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc04); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xd04); + u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x90c); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", + "0xc04/ 0xd04/ 0x90c", + u32tmp[0], u32tmp[1], u32tmp[2]); + CL_PRINTF(cli_buf); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x778", + u8tmp[0]); + CL_PRINTF(cli_buf); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x92c); + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x930); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "0x92c/ 0x930", + (u8tmp[0]), u32tmp[0]); + CL_PRINTF(cli_buf); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40); + u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x4f); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "0x40/ 0x4f", + u8tmp[0], u8tmp[1]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "0x550(bcn ctrl)/0x522", + u32tmp[0], u8tmp[0]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0xc50(dig)", + u32tmp[0]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4); + u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", + "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", + u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", + "0x770(hp rx[31:16]/tx[15:0])", + coex_sta->high_priority_rx, coex_sta->high_priority_tx); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", + "0x774(lp rx[31:16]/tx[15:0])", + coex_sta->low_priority_rx, coex_sta->low_priority_tx); + CL_PRINTF(cli_buf); +#if (BT_AUTO_REPORT_ONLY_8192E_1ANT == 1) + halbtc8192e1ant_monitor_bt_ctr(btcoexist); +#endif + + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS); +} + +void ex_halbtc8192e1ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type) +{ + if (btcoexist->manual_control || btcoexist->stop_coex_dm) + return; + + if (BTC_IPS_ENTER == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], IPS ENTER notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_ips = true; + + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + halbtc8192e1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, + true); + } else if (BTC_IPS_LEAVE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], IPS LEAVE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_ips = false; + + halbtc8192e1ant_init_hw_config(btcoexist, false); + halbtc8192e1ant_init_coex_dm(btcoexist); + halbtc8192e1ant_query_bt_info(btcoexist); + } +} + +void ex_halbtc8192e1ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type) +{ + if (btcoexist->manual_control || btcoexist->stop_coex_dm) + return; + + if (BTC_LPS_ENABLE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], LPS ENABLE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_lps = true; + } else if (BTC_LPS_DISABLE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], LPS DISABLE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_lps = false; + } +} + +void ex_halbtc8192e1ant_scan_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + boolean wifi_connected = false, bt_hs_on = false; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0; + boolean bt_ctrl_agg_buf_size = false; + u8 agg_buf_size = 5; + + u8 u8tmpa, u8tmpb; + u32 u32tmp; + + if (btcoexist->manual_control || + btcoexist->stop_coex_dm) + return; + + if (BTC_SCAN_START == type) { + coex_sta->wifi_is_high_pri_task = true; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCAN START notify\n"); + BTC_TRACE(trace_buf); + + halbtc8192e1ant_ps_tdma(btcoexist, FORCE_EXEC, false, + 8); /* Force antenna setup for no scan result issue */ + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948); + u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765); + u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67); + + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + u32tmp, u8tmpa, u8tmpb); + BTC_TRACE(trace_buf); + } else { + coex_sta->wifi_is_high_pri_task = false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCAN FINISH notify\n"); + BTC_TRACE(trace_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, + &coex_sta->scan_ap_num); + } + + if (coex_sta->bt_disabled) + return; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + + halbtc8192e1ant_query_bt_info(btcoexist); + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + num_of_wifi_link = wifi_link_status >> 16; + if (num_of_wifi_link >= 2) { + halbtc8192e1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8192e1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + halbtc8192e1ant_action_wifi_multi_port(btcoexist); + return; + } + + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8192e1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8192e1ant_action_hs(btcoexist); + return; + } + + if (BTC_SCAN_START == type) { + if (!wifi_connected) /* non-connected scan */ + halbtc8192e1ant_action_wifi_not_connected_scan( + btcoexist); + else /* wifi is connected */ + halbtc8192e1ant_action_wifi_connected_scan(btcoexist); + } else if (BTC_SCAN_FINISH == type) { + if (!wifi_connected) /* non-connected scan */ + halbtc8192e1ant_action_wifi_not_connected(btcoexist); + else + halbtc8192e1ant_action_wifi_connected(btcoexist); + } +} + +void ex_halbtc8192e1ant_connect_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + boolean wifi_connected = false, bt_hs_on = false; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0; + boolean bt_ctrl_agg_buf_size = false; + u8 agg_buf_size = 5; + + if (btcoexist->manual_control || + btcoexist->stop_coex_dm || + coex_sta->bt_disabled) + return; + + if (BTC_ASSOCIATE_START == type) { + coex_sta->wifi_is_high_pri_task = true; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CONNECT START notify\n"); + BTC_TRACE(trace_buf); + coex_dm->arp_cnt = 0; + } else { + coex_sta->wifi_is_high_pri_task = false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CONNECT FINISH notify\n"); + BTC_TRACE(trace_buf); + /* coex_dm->arp_cnt = 0; */ + } + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + num_of_wifi_link = wifi_link_status >> 16; + if (num_of_wifi_link >= 2) { + halbtc8192e1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8192e1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + halbtc8192e1ant_action_wifi_multi_port(btcoexist); + return; + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8192e1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8192e1ant_action_hs(btcoexist); + return; + } + + if (BTC_ASSOCIATE_START == type) + halbtc8192e1ant_action_wifi_not_connected_asso_auth(btcoexist); + else if (BTC_ASSOCIATE_FINISH == type) { + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + if (!wifi_connected) /* non-connected scan */ + halbtc8192e1ant_action_wifi_not_connected(btcoexist); + else + halbtc8192e1ant_action_wifi_connected(btcoexist); + } +} + +void ex_halbtc8192e1ant_media_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + u8 h2c_parameter[3] = {0}; + u32 wifi_bw; + u8 wifi_central_chnl; + boolean wifi_under_b_mode = false; + + if (btcoexist->manual_control || + btcoexist->stop_coex_dm || + coex_sta->bt_disabled) + return; + + if (BTC_MEDIA_CONNECT == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], MEDIA connect notify\n"); + BTC_TRACE(trace_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + + /* Set CCK Tx/Rx high Pri except 11b mode */ + if (wifi_under_b_mode) { + btcoexist->btc_write_1byte(btcoexist, 0x6cd, + 0x00); /* CCK Tx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cf, + 0x00); /* CCK Rx */ + } else { + btcoexist->btc_write_1byte(btcoexist, 0x6cd, + 0x10); /* CCK Tx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cf, + 0x10); /* CCK Rx */ + } + + coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist, + 0x430); + coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist, + 0x434); + coex_dm->backup_retry_limit = btcoexist->btc_read_2byte( + btcoexist, 0x42a); + coex_dm->backup_ampdu_max_time = btcoexist->btc_read_1byte( + btcoexist, 0x456); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], MEDIA disconnect notify\n"); + BTC_TRACE(trace_buf); + coex_dm->arp_cnt = 0; + + btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */ + } + + /* only 2.4G we need to inform bt the chnl mask */ + btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, + &wifi_central_chnl); + if ((BTC_MEDIA_CONNECT == type) && + (wifi_central_chnl <= 14)) { + /* h2c_parameter[0] = 0x1; */ + h2c_parameter[0] = 0x0; + h2c_parameter[1] = wifi_central_chnl; + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); + if (BTC_WIFI_BW_HT40 == wifi_bw) + h2c_parameter[2] = 0x30; + else + h2c_parameter[2] = 0x20; + } + + coex_dm->wifi_chnl_info[0] = h2c_parameter[0]; + coex_dm->wifi_chnl_info[1] = h2c_parameter[1]; + coex_dm->wifi_chnl_info[2] = h2c_parameter[2]; + + btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter); +} + +void ex_halbtc8192e1ant_specific_packet_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + boolean bt_hs_on = false; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0; + boolean bt_ctrl_agg_buf_size = false; + u8 agg_buf_size = 5; + + if (btcoexist->manual_control || + btcoexist->stop_coex_dm || + coex_sta->bt_disabled) + return; + + if (BTC_PACKET_DHCP == type || + BTC_PACKET_EAPOL == type || + BTC_PACKET_ARP == type) { + if (BTC_PACKET_ARP == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], specific Packet ARP notify\n"); + BTC_TRACE(trace_buf); + + coex_dm->arp_cnt++; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ARP Packet Count = %d\n", + coex_dm->arp_cnt); + BTC_TRACE(trace_buf); + + if (coex_dm->arp_cnt >= + 10) /* if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecificPacket(btcoexist) */ + coex_sta->wifi_is_high_pri_task = false; + else + coex_sta->wifi_is_high_pri_task = true; + } else { + coex_sta->wifi_is_high_pri_task = true; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], specific Packet DHCP or EAPOL notify\n"); + BTC_TRACE(trace_buf); + } + } else { + coex_sta->wifi_is_high_pri_task = false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], specific Packet [Type = %d] notify\n", type); + BTC_TRACE(trace_buf); + } + + coex_sta->specific_pkt_period_cnt = 0; + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + num_of_wifi_link = wifi_link_status >> 16; + if (num_of_wifi_link >= 2) { + halbtc8192e1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8192e1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + halbtc8192e1ant_action_wifi_multi_port(btcoexist); + return; + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8192e1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8192e1ant_action_hs(btcoexist); + return; + } + + if (BTC_PACKET_DHCP == type || + BTC_PACKET_EAPOL == type || + ((BTC_PACKET_ARP == type) && (coex_sta->wifi_is_high_pri_task))) + halbtc8192e1ant_action_wifi_connected_specific_packet(btcoexist); +} + +void ex_halbtc8192e1ant_bt_info_notify(IN struct btc_coexist *btcoexist, + IN u8 *tmp_buf, IN u8 length) +{ + u8 bt_info = 0; + u8 i, rsp_source = 0; + boolean wifi_connected = false; + boolean bt_busy = false; + + coex_sta->c2h_bt_info_req_sent = false; + + rsp_source = tmp_buf[0] & 0xf; + if (rsp_source >= BT_INFO_SRC_8192E_1ANT_MAX) + rsp_source = BT_INFO_SRC_8192E_1ANT_WIFI_FW; + coex_sta->bt_info_c2h_cnt[rsp_source]++; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Bt info[%d], length=%d, hex data=[", rsp_source, + length); + BTC_TRACE(trace_buf); + for (i = 0; i < length; i++) { + coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i]; + if (i == 1) + bt_info = tmp_buf[i]; + if (i == length - 1) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x]\n", + tmp_buf[i]); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x, ", + tmp_buf[i]); + BTC_TRACE(trace_buf); + } + } + + if (BT_INFO_SRC_8192E_1ANT_WIFI_FW != rsp_source) { + coex_sta->bt_retry_cnt = /* [3:0] */ + coex_sta->bt_info_c2h[rsp_source][2] & 0xf; + + if (coex_sta->bt_retry_cnt >= 1) + coex_sta->pop_event_cnt++; + + if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20) + coex_sta->c2h_bt_page = true; + else + coex_sta->c2h_bt_page = false; + + coex_sta->bt_rssi = + coex_sta->bt_info_c2h[rsp_source][3] * 2 - 90; + /* coex_sta->bt_info_c2h[rsp_source][3]*2+10; */ + + coex_sta->bt_info_ext = + coex_sta->bt_info_c2h[rsp_source][4]; + + coex_sta->bt_tx_rx_mask = (coex_sta->bt_info_c2h[rsp_source][2] + & 0x40); + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK, + &coex_sta->bt_tx_rx_mask); + if (!coex_sta->bt_tx_rx_mask) { + /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_set_bt_reg(btcoexist, 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 (coex_sta->bt_info_ext & BIT(1)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + if (wifi_connected) + ex_halbtc8192e1ant_media_status_notify( + btcoexist, BTC_MEDIA_CONNECT); + else + ex_halbtc8192e1ant_media_status_notify( + btcoexist, BTC_MEDIA_DISCONNECT); + } + + if (coex_sta->bt_info_ext & BIT(3)) { + if (!btcoexist->manual_control && + !btcoexist->stop_coex_dm) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"); + BTC_TRACE(trace_buf); + halbtc8192e1ant_ignore_wlan_act(btcoexist, + FORCE_EXEC, false); + } + } else { + /* BT already NOT ignore Wlan active, do nothing here. */ + } +#if (BT_AUTO_REPORT_ONLY_8192E_1ANT == 0) + if ((coex_sta->bt_info_ext & BIT(4))) { + /* BT auto report already enabled, do nothing */ + } else + halbtc8192e1ant_bt_auto_report(btcoexist, FORCE_EXEC, + true); +#endif + } + + /* check BIT2 first ==> check if bt is under inquiry or page scan */ + if (bt_info & BT_INFO_8192E_1ANT_B_INQ_PAGE) + coex_sta->c2h_bt_inquiry_page = true; + else + coex_sta->c2h_bt_inquiry_page = false; + + /* set link exist status */ + if (!(bt_info & BT_INFO_8192E_1ANT_B_CONNECTION)) { + coex_sta->bt_link_exist = false; + coex_sta->pan_exist = false; + coex_sta->a2dp_exist = false; + coex_sta->hid_exist = false; + coex_sta->sco_exist = false; + } else { /* connection exists */ + coex_sta->bt_link_exist = true; + if (bt_info & BT_INFO_8192E_1ANT_B_FTP) + coex_sta->pan_exist = true; + else + coex_sta->pan_exist = false; + if (bt_info & BT_INFO_8192E_1ANT_B_A2DP) + coex_sta->a2dp_exist = true; + else + coex_sta->a2dp_exist = false; + if (bt_info & BT_INFO_8192E_1ANT_B_HID) + coex_sta->hid_exist = true; + else + coex_sta->hid_exist = false; + if (bt_info & BT_INFO_8192E_1ANT_B_SCO_ESCO) + coex_sta->sco_exist = true; + else + coex_sta->sco_exist = false; + } + + halbtc8192e1ant_update_bt_link_info(btcoexist); + + bt_info = bt_info & + 0x1f; /* mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41) */ + + if (!(bt_info & BT_INFO_8192E_1ANT_B_CONNECTION)) { + coex_dm->bt_status = BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n"); + BTC_TRACE(trace_buf); + } else if (bt_info == + BT_INFO_8192E_1ANT_B_CONNECTION) { /* connection exists but no busy */ + coex_dm->bt_status = BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n"); + BTC_TRACE(trace_buf); + } else if ((bt_info & BT_INFO_8192E_1ANT_B_SCO_ESCO) || + (bt_info & BT_INFO_8192E_1ANT_B_SCO_BUSY)) { + coex_dm->bt_status = BT_8192E_1ANT_BT_STATUS_SCO_BUSY; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n"); + BTC_TRACE(trace_buf); + } else if (bt_info & BT_INFO_8192E_1ANT_B_ACL_BUSY) { + if (BT_8192E_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status) + coex_dm->auto_tdma_adjust = false; + coex_dm->bt_status = BT_8192E_1ANT_BT_STATUS_ACL_BUSY; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n"); + BTC_TRACE(trace_buf); + } else { + coex_dm->bt_status = BT_8192E_1ANT_BT_STATUS_MAX; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n"); + BTC_TRACE(trace_buf); + } + + if ((BT_8192E_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) || + (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) + bt_busy = true; + else + bt_busy = false; + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy); + + halbtc8192e1ant_run_coexist_mechanism(btcoexist); +} + +void ex_halbtc8192e1ant_rf_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + u32 u32tmp; + u8 u8tmpa, u8tmpb, u8tmpc; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], RF Status notify\n"); + BTC_TRACE(trace_buf); + + if (BTC_RF_ON == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RF is turned ON!!\n"); + BTC_TRACE(trace_buf); + btcoexist->stop_coex_dm = false; + } else if (BTC_RF_OFF == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RF is turned OFF!!\n"); + BTC_TRACE(trace_buf); + + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + halbtc8192e1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0); + halbtc8192e1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, + true); + + halbtc8192e1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true); + btcoexist->stop_coex_dm = true; + + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948); + u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765); + u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67); + u8tmpc = btcoexist->btc_read_1byte(btcoexist, 0x76e); + + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n", + u32tmp, u8tmpa, u8tmpb, u8tmpc); + BTC_TRACE(trace_buf); + + } +} + +void ex_halbtc8192e1ant_halt_notify(IN struct btc_coexist *btcoexist) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Halt notify\n"); + BTC_TRACE(trace_buf); + + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + halbtc8192e1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0); + halbtc8192e1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, true); + + halbtc8192e1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true); + + ex_halbtc8192e1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT); + + btcoexist->stop_coex_dm = true; +} + +void ex_halbtc8192e1ant_pnp_notify(IN struct btc_coexist *btcoexist, + IN u8 pnp_state) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Pnp notify\n"); + BTC_TRACE(trace_buf); + + if (BTC_WIFI_PNP_SLEEP == pnp_state) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Pnp notify to SLEEP\n"); + BTC_TRACE(trace_buf); + + halbtc8192e1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + halbtc8192e1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + halbtc8192e1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, + true); + + /* Sinda 20150819, workaround for driver skip leave IPS/LPS to speed up sleep time. */ + /* Driver do not leave IPS/LPS when driver is going to sleep, so BTCoexistence think wifi is still under IPS/LPS */ + /* BT should clear UnderIPS/UnderLPS state to avoid mismatch state after wakeup. */ + coex_sta->under_ips = false; + coex_sta->under_lps = false; + btcoexist->stop_coex_dm = true; + } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Pnp notify to WAKE UP\n"); + BTC_TRACE(trace_buf); + btcoexist->stop_coex_dm = false; + halbtc8192e1ant_init_hw_config(btcoexist, false); + halbtc8192e1ant_init_coex_dm(btcoexist); + halbtc8192e1ant_query_bt_info(btcoexist); + } +} + +void ex_halbtc8192e1ant_coex_dm_reset(IN struct btc_coexist *btcoexist) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], *****************Coex DM Reset*****************\n"); + BTC_TRACE(trace_buf); + + halbtc8192e1ant_init_hw_config(btcoexist, false); + /* btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); */ + /* btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x2, 0xfffff, 0x0); */ + halbtc8192e1ant_init_coex_dm(btcoexist); +} + +void ex_halbtc8192e1ant_periodical(IN struct btc_coexist *btcoexist) +{ +#if (BT_AUTO_REPORT_ONLY_8192E_1ANT == 0) + halbtc8192e1ant_query_bt_info(btcoexist); + halbtc8192e1ant_monitor_bt_enable_disable(btcoexist); +#else + halbtc8192e1ant_monitor_bt_ctr(btcoexist); + halbtc8192e1ant_monitor_wifi_ctr(btcoexist); + + if (halbtc8192e1ant_is_wifi_status_changed(btcoexist) || + coex_dm->auto_tdma_adjust) + + halbtc8192e1ant_run_coexist_mechanism(btcoexist); + + coex_sta->specific_pkt_period_cnt++; +#endif +} + + +void ex_halbtc8192e1ant_dbg_control(IN struct btc_coexist *btcoexist, + IN u8 op_code, IN u8 op_len, IN u8 *pdata) +{ + switch (op_code) { + case BTC_DBG_SET_COEX_NORMAL: + btcoexist->manual_control = false; + halbtc8192e1ant_init_coex_dm(btcoexist); + break; + case BTC_DBG_SET_COEX_WIFI_ONLY: + btcoexist->manual_control = true; + halbtc8192e1ant_power_save_state(btcoexist, + BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 9); + break; + case BTC_DBG_SET_COEX_BT_ONLY: + /* todo */ + break; + default: + break; + } +} + +#endif /* #if (RTL8192E_SUPPORT == 1) */ + +#endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */ \ No newline at end of file diff --git a/hal/btc/HalBtc8192e1Ant.h b/hal/btc/HalBtc8192e1Ant.h old mode 100755 new mode 100644 index 02914bc..e75127c --- a/hal/btc/HalBtc8192e1Ant.h +++ b/hal/btc/HalBtc8192e1Ant.h @@ -1,254 +1,226 @@ -//=========================================== -// The following is for 8192E 1ANT BT Co-exist definition -//=========================================== -#define BT_AUTO_REPORT_ONLY_8192E_1ANT 1 - -#define BT_INFO_8192E_1ANT_B_FTP BIT7 -#define BT_INFO_8192E_1ANT_B_A2DP BIT6 -#define BT_INFO_8192E_1ANT_B_HID BIT5 -#define BT_INFO_8192E_1ANT_B_SCO_BUSY BIT4 -#define BT_INFO_8192E_1ANT_B_ACL_BUSY BIT3 -#define BT_INFO_8192E_1ANT_B_INQ_PAGE BIT2 -#define BT_INFO_8192E_1ANT_B_SCO_ESCO BIT1 -#define BT_INFO_8192E_1ANT_B_CONNECTION BIT0 - -#define BT_INFO_8192E_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_) \ - (((_BT_INFO_EXT_&BIT0))? TRUE:FALSE) - -#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, - BT_INFO_SRC_8192E_1ANT_BT_ACTIVE_SEND = 0x2, - BT_INFO_SRC_8192E_1ANT_MAX -}BT_INFO_SRC_8192E_1ANT,*PBT_INFO_SRC_8192E_1ANT; - -typedef enum _BT_8192E_1ANT_BT_STATUS{ - BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0, - BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE = 0x1, - BT_8192E_1ANT_BT_STATUS_INQ_PAGE = 0x2, - BT_8192E_1ANT_BT_STATUS_ACL_BUSY = 0x3, - BT_8192E_1ANT_BT_STATUS_SCO_BUSY = 0x4, - BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY = 0x5, - BT_8192E_1ANT_BT_STATUS_MAX -}BT_8192E_1ANT_BT_STATUS,*PBT_8192E_1ANT_BT_STATUS; - -typedef enum _BT_8192E_1ANT_WIFI_STATUS{ - BT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE = 0x0, - BT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN = 0x1, - BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN = 0x2, - BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT = 0x3, - BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE = 0x4, - BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY = 0x5, - BT_8192E_1ANT_WIFI_STATUS_MAX -}BT_8192E_1ANT_WIFI_STATUS,*PBT_8192E_1ANT_WIFI_STATUS; - -typedef enum _BT_8192E_1ANT_COEX_ALGO{ - BT_8192E_1ANT_COEX_ALGO_UNDEFINED = 0x0, - BT_8192E_1ANT_COEX_ALGO_SCO = 0x1, - BT_8192E_1ANT_COEX_ALGO_HID = 0x2, - BT_8192E_1ANT_COEX_ALGO_A2DP = 0x3, - BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS = 0x4, - BT_8192E_1ANT_COEX_ALGO_PANEDR = 0x5, - BT_8192E_1ANT_COEX_ALGO_PANHS = 0x6, - BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP = 0x7, - BT_8192E_1ANT_COEX_ALGO_PANEDR_HID = 0x8, - BT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9, - BT_8192E_1ANT_COEX_ALGO_HID_A2DP = 0xa, - BT_8192E_1ANT_COEX_ALGO_MAX = 0xb, -}BT_8192E_1ANT_COEX_ALGO,*PBT_8192E_1ANT_COEX_ALGO; - -typedef struct _COEX_DM_8192E_1ANT{ - // fw mechanism - BOOLEAN bCurIgnoreWlanAct; - BOOLEAN bPreIgnoreWlanAct; - u1Byte prePsTdma; - u1Byte curPsTdma; - u1Byte psTdmaPara[5]; - u1Byte psTdmaDuAdjType; - BOOLEAN bAutoTdmaAdjust; - BOOLEAN bPrePsTdmaOn; - BOOLEAN bCurPsTdmaOn; - BOOLEAN bPreBtAutoReport; - BOOLEAN bCurBtAutoReport; - u1Byte preLps; - u1Byte curLps; - u1Byte preRpwm; - u1Byte curRpwm; - - // sw mechanism - BOOLEAN bPreLowPenaltyRa; - BOOLEAN bCurLowPenaltyRa; - u4Byte preVal0x6c0; - u4Byte curVal0x6c0; - u4Byte preVal0x6c4; - u4Byte curVal0x6c4; - u4Byte preVal0x6c8; - 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; - u1Byte curAlgorithm; - u1Byte btStatus; - u1Byte wifiChnlInfo[3]; - - 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; - -typedef struct _COEX_STA_8192E_1ANT{ - BOOLEAN bBtLinkExist; - BOOLEAN bScoExist; - BOOLEAN bA2dpExist; - BOOLEAN bHidExist; - BOOLEAN bPanExist; - - BOOLEAN bUnderLps; - BOOLEAN bUnderIps; - u4Byte specialPktPeriodCnt; - u4Byte highPriorityTx; - u4Byte highPriorityRx; - u4Byte lowPriorityTx; - u4Byte lowPriorityRx; - 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; - -//=========================================== -// The following is interface which will notify coex module. -//=========================================== -VOID -EXhalbtc8192e1ant_PowerOnSetting( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e1ant_PreLoadFirmware( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e1ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bWifiOnly - ); -VOID -EXhalbtc8192e1ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e1ant_IpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e1ant_LpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e1ant_ScanNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e1ant_ConnectNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e1ant_MediaStatusNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e1ant_SpecialPacketNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e1ant_BtInfoNotify( - IN PBTC_COEXIST pBtCoexist, - IN pu1Byte tmpBuf, - IN u1Byte length - ); -VOID -EXhalbtc8192e1ant_RfStatusNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e1ant_HaltNotify( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e1ant_PnpNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte pnpState - ); -VOID -EXhalbtc8192e1ant_CoexDmReset( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e1ant_Periodical( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e1ant_DisplayCoexInfo( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e1ant_DbgControl( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte opCode, - IN u1Byte opLen, - IN pu1Byte pData - ); - + +#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) + +#if (RTL8192E_SUPPORT == 1) + +/* ******************************************* + * The following is for 8192E 1ANT BT Co-exist definition + * ******************************************* */ +#define BT_AUTO_REPORT_ONLY_8192E_1ANT 1 + +#define BT_INFO_8192E_1ANT_B_FTP BIT(7) +#define BT_INFO_8192E_1ANT_B_A2DP BIT(6) +#define BT_INFO_8192E_1ANT_B_HID BIT(5) +#define BT_INFO_8192E_1ANT_B_SCO_BUSY BIT(4) +#define BT_INFO_8192E_1ANT_B_ACL_BUSY BIT(3) +#define BT_INFO_8192E_1ANT_B_INQ_PAGE BIT(2) +#define BT_INFO_8192E_1ANT_B_SCO_ESCO BIT(1) +#define BT_INFO_8192E_1ANT_B_CONNECTION BIT(0) + +#define BT_INFO_8192E_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_) \ + (((_BT_INFO_EXT_&BIT(0))) ? true : false) + +#define BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT 2 + +#define BT_8192E_1ANT_WIFI_NOISY_THRESH 30 /* max: 255 */ + +enum bt_info_src_8192e_1ant { + BT_INFO_SRC_8192E_1ANT_WIFI_FW = 0x0, + BT_INFO_SRC_8192E_1ANT_BT_RSP = 0x1, + BT_INFO_SRC_8192E_1ANT_BT_ACTIVE_SEND = 0x2, + BT_INFO_SRC_8192E_1ANT_MAX +}; + +enum bt_8192e_1ant_bt_status { + BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0, + BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE = 0x1, + BT_8192E_1ANT_BT_STATUS_INQ_PAGE = 0x2, + BT_8192E_1ANT_BT_STATUS_ACL_BUSY = 0x3, + BT_8192E_1ANT_BT_STATUS_SCO_BUSY = 0x4, + BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY = 0x5, + BT_8192E_1ANT_BT_STATUS_MAX +}; + +enum bt_8192e_1ant_wifi_status { + BT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE = 0x0, + BT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN = 0x1, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN = 0x2, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SPECIFIC_PKT = 0x3, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE = 0x4, + BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY = 0x5, + BT_8192E_1ANT_WIFI_STATUS_MAX +}; + +enum bt_8192e_1ant_coex_algo { + BT_8192E_1ANT_COEX_ALGO_UNDEFINED = 0x0, + BT_8192E_1ANT_COEX_ALGO_SCO = 0x1, + BT_8192E_1ANT_COEX_ALGO_HID = 0x2, + BT_8192E_1ANT_COEX_ALGO_A2DP = 0x3, + BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS = 0x4, + BT_8192E_1ANT_COEX_ALGO_PANEDR = 0x5, + BT_8192E_1ANT_COEX_ALGO_PANHS = 0x6, + BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP = 0x7, + BT_8192E_1ANT_COEX_ALGO_PANEDR_HID = 0x8, + BT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9, + BT_8192E_1ANT_COEX_ALGO_HID_A2DP = 0xa, + BT_8192E_1ANT_COEX_ALGO_MAX = 0xb, +}; + +struct coex_dm_8192e_1ant { + /* fw mechanism */ + boolean cur_ignore_wlan_act; + boolean pre_ignore_wlan_act; + u8 pre_ps_tdma; + u8 cur_ps_tdma; + u8 ps_tdma_para[5]; + u8 ps_tdma_du_adj_type; + boolean auto_tdma_adjust; + boolean pre_ps_tdma_on; + boolean cur_ps_tdma_on; + boolean pre_bt_auto_report; + boolean cur_bt_auto_report; + u8 pre_lps; + u8 cur_lps; + u8 pre_rpwm; + u8 cur_rpwm; + + /* sw mechanism */ + boolean pre_low_penalty_ra; + boolean cur_low_penalty_ra; + u32 pre_val0x6c0; + u32 cur_val0x6c0; + u32 pre_val0x6c4; + u32 cur_val0x6c4; + u32 pre_val0x6c8; + u32 cur_val0x6c8; + u8 pre_val0x6cc; + u8 cur_val0x6cc; + boolean limited_dig; + + u32 backup_arfr_cnt1; /* Auto Rate Fallback Retry cnt */ + u32 backup_arfr_cnt2; /* Auto Rate Fallback Retry cnt */ + u16 backup_retry_limit; + u8 backup_ampdu_max_time; + + /* algorithm related */ + u8 pre_algorithm; + u8 cur_algorithm; + u8 bt_status; + u8 wifi_chnl_info[3]; + + u32 pre_ra_mask; + u32 cur_ra_mask; + u8 pre_arfr_type; + u8 cur_arfr_type; + u8 pre_retry_limit_type; + u8 cur_retry_limit_type; + u8 pre_ampdu_time_type; + u8 cur_ampdu_time_type; + u32 arp_cnt; + + u8 error_condition; +}; + +struct coex_sta_8192e_1ant { + boolean bt_disabled; + boolean bt_link_exist; + boolean sco_exist; + boolean a2dp_exist; + boolean hid_exist; + boolean pan_exist; + + boolean under_lps; + boolean under_ips; + u32 specific_pkt_period_cnt; + u32 high_priority_tx; + u32 high_priority_rx; + u32 low_priority_tx; + u32 low_priority_rx; + s8 bt_rssi; + boolean bt_tx_rx_mask; + u8 pre_bt_rssi_state; + u8 pre_wifi_rssi_state[4]; + boolean c2h_bt_info_req_sent; + u8 bt_info_c2h[BT_INFO_SRC_8192E_1ANT_MAX][10]; + u32 bt_info_c2h_cnt[BT_INFO_SRC_8192E_1ANT_MAX]; + boolean c2h_bt_inquiry_page; + boolean c2h_bt_page; /* Add for win8.1 page out issue */ + boolean wifi_is_high_pri_task; /* Add for win8.1 page out issue */ + u8 bt_retry_cnt; + u8 bt_info_ext; + u32 pop_event_cnt; + u8 scan_ap_num; + + u32 crc_ok_cck; + u32 crc_ok_11g; + u32 crc_ok_11n; + u32 crc_ok_11n_agg; + + u32 crc_err_cck; + u32 crc_err_11g; + u32 crc_err_11n; + u32 crc_err_11n_agg; + + boolean cck_lock; + boolean pre_ccklock; + u8 coex_table_type; + + boolean force_lps_on; +}; + +/* ******************************************* + * The following is interface which will notify coex module. + * ******************************************* */ +void ex_halbtc8192e1ant_power_on_setting(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e1ant_pre_load_firmware(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e1ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean wifi_only); +void ex_halbtc8192e1ant_init_coex_dm(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e1ant_ips_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e1ant_lps_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e1ant_scan_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e1ant_connect_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e1ant_media_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e1ant_specific_packet_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e1ant_bt_info_notify(IN struct btc_coexist *btcoexist, + IN u8 *tmp_buf, IN u8 length); +void ex_halbtc8192e1ant_rf_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e1ant_halt_notify(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e1ant_pnp_notify(IN struct btc_coexist *btcoexist, + IN u8 pnp_state); +void ex_halbtc8192e1ant_coex_dm_reset(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e1ant_periodical(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e1ant_display_coex_info(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e1ant_dbg_control(IN struct btc_coexist *btcoexist, + IN u8 op_code, IN u8 op_len, IN u8 *pdata); + +#else /* #if (RTL8192E_SUPPORT == 1) */ +#define ex_halbtc8192e1ant_power_on_setting(btcoexist) +#define ex_halbtc8192e1ant_pre_load_firmware(btcoexist) +#define ex_halbtc8192e1ant_init_hw_config(btcoexist, wifi_only) +#define ex_halbtc8192e1ant_init_coex_dm(btcoexist) +#define ex_halbtc8192e1ant_ips_notify(btcoexist, type) +#define ex_halbtc8192e1ant_lps_notify(btcoexist, type) +#define ex_halbtc8192e1ant_scan_notify(btcoexist, type) +#define ex_halbtc8192e1ant_connect_notify(btcoexist, type) +#define ex_halbtc8192e1ant_media_status_notify(btcoexist, type) +#define ex_halbtc8192e1ant_specific_packet_notify(btcoexist, type) +#define ex_halbtc8192e1ant_bt_info_notify(btcoexist, tmp_buf, length) +#define ex_halbtc8192e1ant_rf_status_notify(btcoexist, type) +#define ex_halbtc8192e1ant_halt_notify(btcoexist) +#define ex_halbtc8192e1ant_pnp_notify(btcoexist, pnp_state) +#define ex_halbtc8192e1ant_coex_dm_reset(btcoexist) +#define ex_halbtc8192e1ant_periodical(btcoexist) +#define ex_halbtc8192e1ant_display_coex_info(btcoexist) +#define ex_halbtc8192e1ant_dbg_control(btcoexist, op_code, op_len, pdata) + +#endif + +#endif diff --git a/hal/btc/HalBtc8192e2Ant.c b/hal/btc/HalBtc8192e2Ant.c old mode 100755 new mode 100644 index 648e669..b7af2c0 --- a/hal/btc/HalBtc8192e2Ant.c +++ b/hal/btc/HalBtc8192e2Ant.c @@ -1,5027 +1,4068 @@ -//============================================================ -// Description: -// -// This file is for RTL8192E Co-exist mechanism -// -// History -// 2012/11/15 Cosa first check in. -// -//============================================================ - -//============================================================ -// include files -//============================================================ -#include "Mp_Precomp.h" -#if(BT_30_SUPPORT == 1) -//============================================================ -// Global variables, these are static variables -//============================================================ -static COEX_DM_8192E_2ANT GLCoexDm8192e2Ant; -static PCOEX_DM_8192E_2ANT pCoexDm=&GLCoexDm8192e2Ant; -static COEX_STA_8192E_2ANT GLCoexSta8192e2Ant; -static PCOEX_STA_8192E_2ANT pCoexSta=&GLCoexSta8192e2Ant; - -const char *const GLBtInfoSrc8192e2Ant[]={ - "BT Info[wifi fw]", - "BT Info[bt rsp]", - "BT Info[bt auto report]", -}; - -u4Byte GLCoexVerDate8192e2Ant=20150615; -u4Byte GLCoexVer8192e2Ant=0x41; - -//============================================================ -// local function proto type if needed -//============================================================ -//============================================================ -// local function start with halbtc8192e2ant_ -//============================================================ -u1Byte -halbtc8192e2ant_BtRssiState( - u1Byte levelNum, - u1Byte rssiThresh, - u1Byte rssiThresh1 - ) -{ - s4Byte btRssi=0; - u1Byte btRssiState=pCoexSta->preBtRssiState; - - btRssi = pCoexSta->btRssi; - - if(levelNum == 2) - { - if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) || - (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)) - { - if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) - { - btRssiState = BTC_RSSI_STATE_HIGH; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else - { - if(btRssi < rssiThresh) - { - btRssiState = BTC_RSSI_STATE_LOW; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - else if(levelNum == 3) - { - if(rssiThresh > rssiThresh1) - { - 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)) - { - if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) - { - btRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || - (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM)) - { - if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) - { - btRssiState = BTC_RSSI_STATE_HIGH; - } - else if(btRssi < rssiThresh) - { - btRssiState = BTC_RSSI_STATE_LOW; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - } - } - else - { - if(btRssi < rssiThresh1) - { - btRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - - pCoexSta->preBtRssiState = btRssiState; - - return btRssiState; -} - -u1Byte -halbtc8192e2ant_WifiRssiState( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte index, - IN u1Byte levelNum, - IN u1Byte rssiThresh, - IN u1Byte rssiThresh1 - ) -{ - s4Byte wifiRssi=0; - u1Byte wifiRssiState=pCoexSta->preWifiRssiState[index]; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi); - - if(levelNum == 2) - { - if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)) - { - if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) - { - wifiRssiState = BTC_RSSI_STATE_HIGH; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else - { - if(wifiRssi < rssiThresh) - { - wifiRssiState = BTC_RSSI_STATE_LOW; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - else if(levelNum == 3) - { - if(rssiThresh > rssiThresh1) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); - return pCoexSta->preWifiRssiState[index]; - } - - if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)) - { - if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) - { - wifiRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM)) - { - if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) - { - wifiRssiState = BTC_RSSI_STATE_HIGH; - } - else if(wifiRssi < rssiThresh) - { - wifiRssiState = BTC_RSSI_STATE_LOW; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - } - } - else - { - if(wifiRssi < rssiThresh1) - { - wifiRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - - pCoexSta->preWifiRssiState[index] = wifiRssiState; - - return wifiRssiState; -} - -VOID -halbtc8192e2ant_MonitorBtEnableDisable( - IN PBTC_COEXIST pBtCoexist - ) -{ - static BOOLEAN bPreBtDisabled=FALSE; - static u4Byte btDisableCnt=0; - BOOLEAN bBtActive=TRUE, bBtDisabled=FALSE; - - // This function check if bt is disabled - - if( pCoexSta->highPriorityTx == 0 && - pCoexSta->highPriorityRx == 0 && - pCoexSta->lowPriorityTx == 0 && - pCoexSta->lowPriorityRx == 0) - { - bBtActive = FALSE; - } - if( pCoexSta->highPriorityTx == 0xffff && - pCoexSta->highPriorityRx == 0xffff && - pCoexSta->lowPriorityTx == 0xffff && - pCoexSta->lowPriorityRx == 0xffff) - { - bBtActive = FALSE; - } - if(bBtActive) - { - btDisableCnt = 0; - bBtDisabled = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); - } - else - { - 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); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); - } - } - if(bPreBtDisabled != bBtDisabled) - { - 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 - { - } - } -} - -u4Byte -halbtc8192e2ant_DecideRaMask( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte ssType, - IN u4Byte raMaskType - ) -{ - u4Byte disRaMask=0x0; - - switch(raMaskType) - { - case 0: // normal mode - if(ssType == 2) - disRaMask = 0x0; // enable 2ss - else - disRaMask = 0xfff00000; // disable 2ss - break; - case 1: // disable cck 1/2 - if(ssType == 2) - disRaMask = 0x00000003; // enable 2ss - else - disRaMask = 0xfff00003; // disable 2ss - break; - case 2: // disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 - if(ssType == 2) - disRaMask = 0x0001f1f7; // enable 2ss - else - disRaMask = 0xfff1f1f7; // disable 2ss - break; - default: - break; - } - - return disRaMask; -} - -VOID -halbtc8192e2ant_UpdateRaMask( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u4Byte disRateMask - ) -{ - pCoexDm->curRaMask = disRateMask; - - if( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask)) - { - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask); - } - pCoexDm->preRaMask = pCoexDm->curRaMask; -} - -VOID -halbtc8192e2ant_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 -halbtc8192e2ant_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 -halbtc8192e2ant_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 -halbtc8192e2ant_LimitedTx( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte raMaskType, - IN u1Byte arfrType, - IN u1Byte retryLimitType, - IN u1Byte ampduTimeType - ) -{ - u4Byte disRaMask=0x0; - - pCoexDm->curRaMaskType = raMaskType; - disRaMask = halbtc8192e2ant_DecideRaMask(pBtCoexist, pCoexDm->curSsType, raMaskType); - halbtc8192e2ant_UpdateRaMask(pBtCoexist, bForceExec, disRaMask); - - halbtc8192e2ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType); - halbtc8192e2ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType); - halbtc8192e2ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType); -} - -VOID -halbtc8192e2ant_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 -halbtc8192e2ant_MonitorBtCtr( - IN PBTC_COEXIST pBtCoexist - ) -{ - u4Byte regHPTxRx, regLPTxRx, u4Tmp; - u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0; - u1Byte u1Tmp; - - regHPTxRx = 0x770; - regLPTxRx = 0x774; - - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx); - regHPTx = u4Tmp & bMaskLWord; - regHPRx = (u4Tmp & bMaskHWord)>>16; - - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx); - regLPTx = u4Tmp & bMaskLWord; - regLPRx = (u4Tmp & bMaskHWord)>>16; - - pCoexSta->highPriorityTx = regHPTx; - pCoexSta->highPriorityRx = regHPRx; - pCoexSta->lowPriorityTx = regLPTx; - pCoexSta->lowPriorityRx = regLPRx; - - 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)); - 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 -halbtc8192e2ant_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); -} - -BOOLEAN -halbtc8192e2ant_IsWifiStatusChanged( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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 = 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; -} - -VOID -halbtc8192e2ant_UpdateBtLinkInfo( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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; - 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; - } - - // 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; - - // check if Hid only - if( !pBtLinkInfo->bScoExist && - !pBtLinkInfo->bA2dpExist && - !pBtLinkInfo->bPanExist && - pBtLinkInfo->bHidExist ) - pBtLinkInfo->bHidOnly = TRUE; - else - pBtLinkInfo->bHidOnly = FALSE; -} - -u1Byte -halbtc8192e2ant_ActionAlgorithm( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - BOOLEAN bBtHsOn=FALSE; - u1Byte algorithm=BT_8192E_2ANT_COEX_ALGO_UNDEFINED; - u1Byte numOfDiffProfile=0; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - - if(!pBtLinkInfo->bBtLinkExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); - return algorithm; - } - - if(pBtLinkInfo->bScoExist) - numOfDiffProfile++; - if(pBtLinkInfo->bHidExist) - numOfDiffProfile++; - if(pBtLinkInfo->bPanExist) - numOfDiffProfile++; - if(pBtLinkInfo->bA2dpExist) - numOfDiffProfile++; - - - if(numOfDiffProfile == 1) - { - if(pBtLinkInfo->bScoExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO only\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; - } - else - { - if(pBtLinkInfo->bHidExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID only\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_HID; - } - else if(pBtLinkInfo->bA2dpExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP only\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_A2DP; - } - else if(pBtLinkInfo->bPanExist) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(HS) only\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_PANHS; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], PAN(EDR) only\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR; - } - } - } - } - else if(numOfDiffProfile == 2) - { - if(pBtLinkInfo->bScoExist) - { - if(pBtLinkInfo->bHidExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; - } - else if(pBtLinkInfo->bA2dpExist) - { - 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) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(HS)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + PAN(EDR)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_SCO_PAN; - } - } - } - else - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bA2dpExist ) - { - if(pStackInfo->numOfHid >= 2) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID*2 + A2DP\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP; - } - } - else if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(HS)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_HID; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + PAN(EDR)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; - } - } - else if( pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(HS)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], A2DP + PAN(EDR)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP; - } - } - } - } - else if(numOfDiffProfile == 3) - { - if(pBtLinkInfo->bScoExist) - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bA2dpExist ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP ==> HID\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; - } - else if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(HS)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + PAN(EDR)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_SCO_PAN; - } - } - else if( pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(HS)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; - } - } - } - else - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(HS)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], HID + A2DP + PAN(EDR)\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR; - } - } - } - } - else if(numOfDiffProfile >= 3) - { - if(pBtLinkInfo->bScoExist) - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n")); - - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); - algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; - } - } - } - } - - return algorithm; -} - -VOID -halbtc8192e2ant_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; - - 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); -} - -VOID -halbtc8192e2ant_SetFwDecBtPwr( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte decBtPwrLvl - ) -{ - u1Byte H2C_Parameter[1] ={0}; - - H2C_Parameter[0] = decBtPwrLvl; - - 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); -} - -VOID -halbtc8192e2ant_DecBtPwr( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte decBtPwrLvl - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s Dec BT power level = %d\n", - (bForceExec? "force to":""), decBtPwrLvl)); - pCoexDm->curBtDecPwrLvl = decBtPwrLvl; - - if(!bForceExec) - { - 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) - return; -#endif - } - halbtc8192e2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl); - - pCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl; -} - -VOID -halbtc8192e2ant_SetBtAutoReport( - IN PBTC_COEXIST pBtCoexist, - 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 -halbtc8192e2ant_BtAutoReport( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bEnableAutoReport - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", - (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); - pCoexDm->bCurBtAutoReport = bEnableAutoReport; - - if(!bForceExec) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", - pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport)); - - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) - return; - } - halbtc8192e2ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport); - - pCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport; -} - -VOID -halbtc8192e2ant_FwDacSwingLvl( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte fwDacSwingLvl - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s set FW Dac Swing level = %d\n", - (bForceExec? "force to":""), fwDacSwingLvl)); - pCoexDm->curFwDacSwingLvl = fwDacSwingLvl; - - if(!bForceExec) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", - pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl)); - - if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) - return; - } - - halbtc8192e2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl); - - pCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl; -} - -VOID -halbtc8192e2ant_SetSwRfRxLpfCorner( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bRxRfShrinkOn - ) -{ - if(bRxRfShrinkOn) - { - //Shrink RF Rx LPF corner - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Shrink RF Rx LPF corner!!\n")); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc); - } - else - { - //Resume RF Rx LPF corner - // After initialized, we can use pCoexDm->btRf0x1eBackup - if(pBtCoexist->bInitilized) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Resume RF Rx LPF corner!!\n")); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup); - } - } -} - -VOID -halbtc8192e2ant_RfShrink( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bRxRfShrinkOn - ) -{ - 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) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", - pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink)); - - if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) - return; - } - halbtc8192e2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink); - - pCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink; -} - -VOID -halbtc8192e2ant_SetSwPenaltyTxRateAdaptive( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bLowPenaltyRa - ) -{ - u1Byte H2C_Parameter[6] ={0}; - - H2C_Parameter[0] = 0x6; // opCode, 0x6= Retry_Penalty - - if(bLowPenaltyRa) - { - 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 - } - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", - (bLowPenaltyRa? "ON!!":"OFF!!")) ); - - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); -} - -VOID -halbtc8192e2ant_LowPenaltyRa( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bLowPenaltyRa - ) -{ - //return; - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn LowPenaltyRA = %s\n", - (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF"))); - pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; - - if(!bForceExec) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", - pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa)); - - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) - return; - } - halbtc8192e2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa); - - pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa; -} - -VOID -halbtc8192e2ant_SetDacSwingReg( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte level - ) -{ - u1Byte val=(u1Byte)level; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Write SwDacSwing = 0x%x\n", level)); - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x883, 0x3e, val); -} - -VOID -halbtc8192e2ant_SetSwFullTimeDacSwing( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bSwDacSwingOn, - IN u4Byte swDacSwingLvl - ) -{ - if(bSwDacSwingOn) - { - halbtc8192e2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl); - } - else - { - halbtc8192e2ant_SetDacSwingReg(pBtCoexist, 0x18); - } -} - - -VOID -halbtc8192e2ant_DacSwing( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bDacSwingOn, - IN u4Byte dacSwingLvl - ) -{ - 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) - { - 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)); - - if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) && - (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) ) - return; - } - delay_ms(30); - halbtc8192e2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl); - - pCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn; - pCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl; -} - -VOID -halbtc8192e2ant_SetAdcBackOff( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bAdcBackOff - ) -{ - if(bAdcBackOff) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level On!\n")); - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x3); - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BB BackOff Level Off!\n")); - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x1); - } -} - -VOID -halbtc8192e2ant_AdcBackOff( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bAdcBackOff - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn AdcBackOff = %s\n", - (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF"))); - pCoexDm->bCurAdcBackOff = bAdcBackOff; - - if(!bForceExec) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", - pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff)); - - if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) - return; - } - halbtc8192e2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff); - - pCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff; -} - -VOID -halbtc8192e2ant_SetAgcTable( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bAgcTableEn - ) -{ - 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, 0x0a1A0001); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x091B0001); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x081C0001); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x071D0001); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x061E0001); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x051F0001); - } - 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); - } - -#if 0 - //=================RF Gain - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000); - if(bAgcTableEn) - { - 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 - { - 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); -#endif - -} - -VOID -halbtc8192e2ant_AgcTable( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bAgcTableEn - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s %s Agc Table\n", - (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable"))); - pCoexDm->bCurAgcTableEn = bAgcTableEn; - - if(!bForceExec) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", - pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn)); - - if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) - return; - } - halbtc8192e2ant_SetAgcTable(pBtCoexist, bAgcTableEn); - - pCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn; -} - -VOID -halbtc8192e2ant_SetCoexTable( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte val0x6c0, - IN u4Byte val0x6c4, - IN u4Byte val0x6c8, - IN u1Byte val0x6cc - ) -{ - 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); - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); -} - -VOID -halbtc8192e2ant_CoexTable( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u4Byte val0x6c0, - IN u4Byte val0x6c4, - IN u4Byte val0x6c8, - IN u1Byte val0x6cc - ) -{ - 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; - pCoexDm->curVal0x6c8 = val0x6c8; - pCoexDm->curVal0x6cc = val0x6cc; - - if(!bForceExec) - { - 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)); - 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) && - (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && - (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && - (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) ) - return; - } - halbtc8192e2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc); - - pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0; - pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4; - pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8; - pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc; -} - -VOID -halbtc8192e2ant_CoexTableWithType( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte type - ) -{ - pCoexSta->nCoexTableType = type; - - switch(type) - { - case 0: - halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); - break; - case 1: - halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3); - break; - case 2: - halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5ffb5ffb, 0xffffff, 0x3); - break; - case 3: - halbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5fdf5fdf, 0x5fdb5fdb, 0xffffff, 0x3); - break; - 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; - } -} - -VOID -halbtc8192e2ant_SetFwIgnoreWlanAct( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bEnable - ) -{ - u1Byte H2C_Parameter[1] ={0}; - - if(bEnable) - { - H2C_Parameter[0] |= BIT0; // function enable - } - - 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, - IN BOOLEAN bForceExec, - IN BOOLEAN bEnable - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", - (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); - pCoexDm->bCurIgnoreWlanAct = bEnable; - - if(!bForceExec) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", - pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct)); - - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) - return; - } - halbtc8192e2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable); - - 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, - 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 -halbtc8192e2ant_SwMechanism1( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bShrinkRxLPF, - IN BOOLEAN bLowPenaltyRA, - IN BOOLEAN bLimitedDIG, - IN BOOLEAN bBTLNAConstrain - ) -{ - /* - u4Byte wifiBw; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - - if(BTC_WIFI_BW_HT40 != wifiBw) //only shrink RF Rx LPF for HT40 - { - if (bShrinkRxLPF) - bShrinkRxLPF = FALSE; - } - */ - - halbtc8192e2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF); - //halbtc8192e2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA); -} - -VOID -halbtc8192e2ant_SwMechanism2( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bAGCTableShift, - IN BOOLEAN bADCBackOff, - IN BOOLEAN bSWDACSwing, - IN u4Byte dacSwingLvl - ) -{ - halbtc8192e2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift); - //halbtc8192e2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff); - halbtc8192e2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl); -} - -VOID -halbtc8192e2ant_SetAntPath( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte antPosType, - IN BOOLEAN bInitHwCfg, - IN BOOLEAN bWifiOff - ) -{ - u4Byte u4Tmp=0; - - if(bInitHwCfg) - { - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x944, 0x24); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x930, 0x700700); - if(pBtCoexist->chipInterface == BTC_INTF_USB) - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30430004); - else - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30030004); - - // 0x4c[27][24]='00', Set Antenna to BB - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c); - u4Tmp &= ~BIT24; - u4Tmp &= ~BIT27; - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp); - } - else if(bWifiOff) - { - if(pBtCoexist->chipInterface == BTC_INTF_USB) - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30430004); - else - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30030004); - - // 0x4c[27][24]='11', Set Antenna to BT, 0x64[8:7]=0, 0x64[2]=1 - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c); - u4Tmp |= BIT24; - u4Tmp |= BIT27; - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp); - } - - // ext switch setting - switch(antPosType) - { - case BTC_ANT_PATH_WIFI: - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x4); - break; - case BTC_ANT_PATH_BT: - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x20); - break; - default: - case BTC_ANT_PATH_PTA: - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x4); - break; - } -} - -VOID -halbtc8192e2ant_PsTdma( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bTurnOn, - IN u1Byte type - ) -{ - BOOLEAN bTurnOnByCnt=FALSE; - u1Byte psTdmaTypeByCnt=0; - s1Byte nWiFiDurationAdjust = 0x0; - - 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) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", - pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn)); - 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: //d1,wb - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x11, 0x10); - break; - case 2: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x11, 0x10); - break; - case 3: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x11, 0x10); - break; - case 4: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x11, 0x10); - break; - case 5: //d1,pb,TXpause - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x3c, 0x03, 0x90, 0x10); - break; - case 6: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x32, 0x03, 0x90, 0x10); - break; - case 7: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x28, 0x03, 0x90, 0x10); - break; - case 8: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x1e, 0x03, 0x90, 0x10); - break; - case 9: //d1,bb - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x31, 0x10); - break; - case 10: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x31, 0x10); - break; - case 11: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x31, 0x10); - break; - case 12: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x31, 0x10); - break; - case 13: //d1,bb,TXpause - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x30, 0x10); - break; - case 14: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x30, 0x10); - break; - case 15: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x30, 0x10); - break; - case 16: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x30, 0x10); - break; - case 17: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x03, 0x10, 0x10); - break; - case 18: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90); - break; - case 19: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90); - break; - case 20: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90); - break; - case 21: - 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, 0x3a, 0x03, 0x90, 0x50); - break; - case 86: - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x21, 0x03, 0x90, 0x50); - break; - - } - } - else - { - // disable PS tdma - switch(type) - { - default: - case 0: //ANT2PTA, 0x778=1 - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0); - halbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE); - break; - case 1: //ANT2BT, 0x778=3 - halbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x8, 0x0); - delay_ms(5); - halbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE); - break; - - } - } - - // update pre state - pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn; - pCoexDm->prePsTdma = pCoexDm->curPsTdma; -} - -VOID -halbtc8192e2ant_SetSwitchSsType( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte ssType - ) -{ - u1Byte mimoPs=BTC_MIMO_PS_DYNAMIC; - u4Byte disRaMask=0x0; - - 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); - - if(ssType == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1); - // 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) - { - halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xc04, 0x33); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xd04, 0x3); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x90c, 0x81121313); - // 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; - } - - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_SEND_MIMO_PS, &mimoPs); // set rx 1ss or 2ss -} - -VOID -halbtc8192e2ant_SwitchSsType( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte newSsType - ) -{ - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], %s Switch SS Type = %d\n", - (bForceExec? "force to":""), newSsType)); - pCoexDm->curSsType = newSsType; - - if(!bForceExec) - { - if(pCoexDm->preSsType == pCoexDm->curSsType) - return; - } - halbtc8192e2ant_SetSwitchSsType(pBtCoexist, pCoexDm->curSsType); - - 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; - BOOLEAN bApEnable=FALSE; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); - - if(bApEnable) - { - psType = BTC_PS_WIFI_NATIVE; - lpsVal = 0x0; - rpwmVal = 0x0; - } - - 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); - - // sw all off - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - - // hw all off - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); -} - -VOID -halbtc8192e2ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ) -{ - // 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); - - halbtc8192e2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); - halbtc8192e2ant_SwitchSsType(pBtCoexist, FORCE_EXEC, 2); - - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); -} - -VOID -halbtc8192e2ant_ActionBtInquiry( - IN PBTC_COEXIST pBtCoexist - ) -{ -// BOOLEAN bLowPwrDisable=TRUE; - -// pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - -// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - - 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); - - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); -} - -VOID -halbtc8192e2ant_ActionWiFiLinkProcess( - IN PBTC_COEXIST pBtCoexist - ) -{ - -} - -BOOLEAN -halbtc8192e2ant_IsCommonAction( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - 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(pBtLinkInfo->bScoExist || pBtLinkInfo->bHidExist) - { - halbtc8192e2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 0, 0, 0); - } - else - { - halbtc8192e2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - } - - if(!bWifiConnected) - { -// 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_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); - } - else - { -// halbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1); - } - - halbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6); - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - - bCommon = TRUE; - } - else - { - if(BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) - { -// bLowPwrDisable = FALSE; -// pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - - 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); - - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - - bCommon = TRUE; - } - else if(BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) - { -// bLowPwrDisable = TRUE; -// pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - - if(bBtHsOn) - return FALSE; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT 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); - - halbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - - bCommon = TRUE; - } - else - { -// bLowPwrDisable = TRUE; -// pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable); - - if(bWifiBusy) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n")); - bCommon = FALSE; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n")); - - 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); - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); - bCommon = TRUE; - } - } - } - - return bCommon; -} - - -VOID -halbtc8192e2ant_TdmaDurationAdjust( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bScoHid, - IN BOOLEAN bTxPause, - IN u1Byte maxInterval - ) -{ - static s4Byte up,dn,m,n,WaitCount; - s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration - u1Byte retryCount=0; - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjust()\n")); - - if(!pCoexDm->bAutoTdmaAdjust) - { - pCoexDm->bAutoTdmaAdjust = TRUE; - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); - { - if(bScoHid) - { - if(bTxPause) - { - if(maxInterval == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - pCoexDm->psTdmaDuAdjType = 13; - } - else if(maxInterval == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->psTdmaDuAdjType = 14; - } - else if(maxInterval == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - } - else - { - if(maxInterval == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(maxInterval == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - pCoexDm->psTdmaDuAdjType = 10; - } - else if(maxInterval == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - } - } - else - { - if(bTxPause) - { - if(maxInterval == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - pCoexDm->psTdmaDuAdjType = 5; - } - else if(maxInterval == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - pCoexDm->psTdmaDuAdjType = 6; - } - else if(maxInterval == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - } - else - { - if(maxInterval == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); - pCoexDm->psTdmaDuAdjType = 1; - } - else if(maxInterval == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(maxInterval == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - } - } - } - //============ - up = 0; - dn = 0; - m = 1; - n= 3; - result = 0; - WaitCount = 0; - } - else - { - //accquire the BT TRx retry count from BT_Info byte2 - retryCount = pCoexSta->btRetryCnt; - 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(retryCount == 0) // no retry in the last 2-second duration - { - up++; - dn--; - - if (dn <= 0) - dn = 0; - - 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++; - - if (up <= 0) - up = 0; - - if (dn == 2) // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration - { - if (WaitCount <= 2) - 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 //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration - { - 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")); - } - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval)); - if(maxInterval == 1) - { - if(bTxPause) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); - - if(pCoexDm->curPsTdma == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - pCoexDm->psTdmaDuAdjType = 5; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - pCoexDm->psTdmaDuAdjType = 6; - } - else if(pCoexDm->curPsTdma == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 4) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8); - pCoexDm->psTdmaDuAdjType = 8; - } - if(pCoexDm->curPsTdma == 9) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - pCoexDm->psTdmaDuAdjType = 13; - } - else if(pCoexDm->curPsTdma == 10) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->psTdmaDuAdjType = 14; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 12) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16); - pCoexDm->psTdmaDuAdjType = 16; - } - - if(result == -1) - { - if(pCoexDm->curPsTdma == 5) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - pCoexDm->psTdmaDuAdjType = 6; - } - else if(pCoexDm->curPsTdma == 6) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 7) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8); - pCoexDm->psTdmaDuAdjType = 8; - } - else if(pCoexDm->curPsTdma == 13) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->psTdmaDuAdjType = 14; - } - else if(pCoexDm->curPsTdma == 14) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 15) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16); - pCoexDm->psTdmaDuAdjType = 16; - } - } - else if (result == 1) - { - if(pCoexDm->curPsTdma == 8) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 7) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - pCoexDm->psTdmaDuAdjType = 6; - } - else if(pCoexDm->curPsTdma == 6) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - pCoexDm->psTdmaDuAdjType = 5; - } - else if(pCoexDm->curPsTdma == 16) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 15) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->psTdmaDuAdjType = 14; - } - else if(pCoexDm->curPsTdma == 14) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - pCoexDm->psTdmaDuAdjType = 13; - } - } - } - else - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); - if(pCoexDm->curPsTdma == 5) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); - pCoexDm->psTdmaDuAdjType = 1; - } - else if(pCoexDm->curPsTdma == 6) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 7) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 8) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4); - pCoexDm->psTdmaDuAdjType = 4; - } - if(pCoexDm->curPsTdma == 13) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(pCoexDm->curPsTdma == 14) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - pCoexDm->psTdmaDuAdjType = 10; - } - else if(pCoexDm->curPsTdma == 15) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 16) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12); - pCoexDm->psTdmaDuAdjType = 12; - } - - if(result == -1) - { - if(pCoexDm->curPsTdma == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4); - pCoexDm->psTdmaDuAdjType = 4; - } - else if(pCoexDm->curPsTdma == 9) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - pCoexDm->psTdmaDuAdjType = 10; - } - else if(pCoexDm->curPsTdma == 10) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12); - pCoexDm->psTdmaDuAdjType = 12; - } - } - else if (result == 1) - { - if(pCoexDm->curPsTdma == 4) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); - pCoexDm->psTdmaDuAdjType = 1; - } - else if(pCoexDm->curPsTdma == 12) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - pCoexDm->psTdmaDuAdjType = 10; - } - else if(pCoexDm->curPsTdma == 10) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - } - } - } - else if(maxInterval == 2) - { - if(bTxPause) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); - if(pCoexDm->curPsTdma == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - pCoexDm->psTdmaDuAdjType = 6; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - pCoexDm->psTdmaDuAdjType = 6; - } - else if(pCoexDm->curPsTdma == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 4) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8); - pCoexDm->psTdmaDuAdjType = 8; - } - if(pCoexDm->curPsTdma == 9) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->psTdmaDuAdjType = 14; - } - else if(pCoexDm->curPsTdma == 10) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->psTdmaDuAdjType = 14; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 12) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16); - pCoexDm->psTdmaDuAdjType = 16; - } - if(result == -1) - { - if(pCoexDm->curPsTdma == 5) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - pCoexDm->psTdmaDuAdjType = 6; - } - else if(pCoexDm->curPsTdma == 6) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 7) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8); - pCoexDm->psTdmaDuAdjType = 8; - } - else if(pCoexDm->curPsTdma == 13) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->psTdmaDuAdjType = 14; - } - else if(pCoexDm->curPsTdma == 14) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 15) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16); - pCoexDm->psTdmaDuAdjType = 16; - } - } - else if (result == 1) - { - if(pCoexDm->curPsTdma == 8) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 7) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - pCoexDm->psTdmaDuAdjType = 6; - } - else if(pCoexDm->curPsTdma == 6) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - pCoexDm->psTdmaDuAdjType = 6; - } - else if(pCoexDm->curPsTdma == 16) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 15) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->psTdmaDuAdjType = 14; - } - else if(pCoexDm->curPsTdma == 14) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->psTdmaDuAdjType = 14; - } - } - } - else - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); - if(pCoexDm->curPsTdma == 5) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 6) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 7) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 8) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4); - pCoexDm->psTdmaDuAdjType = 4; - } - if(pCoexDm->curPsTdma == 13) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - pCoexDm->psTdmaDuAdjType = 10; - } - else if(pCoexDm->curPsTdma == 14) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - pCoexDm->psTdmaDuAdjType = 10; - } - else if(pCoexDm->curPsTdma == 15) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 16) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12); - pCoexDm->psTdmaDuAdjType = 12; - } - if(result == -1) - { - if(pCoexDm->curPsTdma == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4); - pCoexDm->psTdmaDuAdjType = 4; - } - else if(pCoexDm->curPsTdma == 9) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - pCoexDm->psTdmaDuAdjType = 10; - } - else if(pCoexDm->curPsTdma == 10) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12); - pCoexDm->psTdmaDuAdjType = 12; - } - } - else if (result == 1) - { - if(pCoexDm->curPsTdma == 4) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 12) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - pCoexDm->psTdmaDuAdjType = 10; - } - else if(pCoexDm->curPsTdma == 10) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); - pCoexDm->psTdmaDuAdjType = 10; - } - } - } - } - else if(maxInterval == 3) - { - if(bTxPause) - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 1\n")); - if(pCoexDm->curPsTdma == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 4) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8); - pCoexDm->psTdmaDuAdjType = 8; - } - if(pCoexDm->curPsTdma == 9) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 10) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 12) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16); - pCoexDm->psTdmaDuAdjType = 16; - } - if(result == -1) - { - if(pCoexDm->curPsTdma == 5) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 6) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 7) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8); - pCoexDm->psTdmaDuAdjType = 8; - } - else if(pCoexDm->curPsTdma == 13) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 14) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 15) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16); - pCoexDm->psTdmaDuAdjType = 16; - } - } - else if (result == 1) - { - if(pCoexDm->curPsTdma == 8) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 7) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 6) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7); - pCoexDm->psTdmaDuAdjType = 7; - } - else if(pCoexDm->curPsTdma == 16) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 15) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - else if(pCoexDm->curPsTdma == 14) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15); - pCoexDm->psTdmaDuAdjType = 15; - } - } - } - else - { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TxPause = 0\n")); - if(pCoexDm->curPsTdma == 5) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 6) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 7) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 8) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4); - pCoexDm->psTdmaDuAdjType = 4; - } - if(pCoexDm->curPsTdma == 13) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 14) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 15) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 16) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12); - pCoexDm->psTdmaDuAdjType = 12; - } - if(result == -1) - { - if(pCoexDm->curPsTdma == 1) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4); - pCoexDm->psTdmaDuAdjType = 4; - } - else if(pCoexDm->curPsTdma == 9) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 10) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12); - pCoexDm->psTdmaDuAdjType = 12; - } - } - else if (result == 1) - { - if(pCoexDm->curPsTdma == 4) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 3) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - pCoexDm->psTdmaDuAdjType = 3; - } - else if(pCoexDm->curPsTdma == 12) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 11) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - else if(pCoexDm->curPsTdma == 10) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - } - } - } - } - - // if current PsTdma not match with the recorded one (when scan, dhcp...), - // then we have to adjust it back to the previous record one. - if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) - { - BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - 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); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam); - - if( !bScan && !bLink && !bRoam) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType); - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n")); - } - } -} - -VOID -halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow( - IN PBTC_COEXIST pBtCoexist//, - //IN u1Byte wifiStatus - ) -{ - 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; - - up = 0; - dn = 0; - m = 1; - n= 3; - result = 0; - WaitCount = 0; - } - return; - } -#endif - pCoexDm->bAutoTdmaAdjust = FALSE; - - retryCount = pCoexSta->btRetryCnt; - btInfoExt = pCoexSta->btInfoExt; - - if(!pCoexDm->bAutoTdmaAdjustLowRssi) - { - pCoexDm->bAutoTdmaAdjustLowRssi = TRUE; - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjustForWifiRssiLow()!!\n")); - -/* - if(BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(btInfoExt)) - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83); - pCoexDm->psTdmaDuAdjType = 83; - } - else -*/ - { - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 81); - pCoexDm->psTdmaDuAdjType = 81; - } - //============ - up = 0; - dn = 0; - m = 1; - n= 3; - result = 0; - WaitCount = 0; - } - 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 - { - up++; - dn--; - - if (dn <= 0) - dn = 0; - - 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++; - - if (up <= 0) - up = 0; - - if (dn == 2) // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration - { - if (WaitCount <= 2) - 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 //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration - { - 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")); - } - - if(result == -1) - { -/* - 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) - { -/* - 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; - } - - } - - if( pCoexDm->curPsTdma != 80 && - pCoexDm->curPsTdma != 81 && - pCoexDm->curPsTdma != 82 && - pCoexDm->curPsTdma != 83 && - pCoexDm->curPsTdma != 84 ) - { - // recover to previous adjust type - halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType); - } - } -} - -VOID -halbtc8192e2ant_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: // 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); - - // 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); -} - - -// 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); - - // 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); -} - -VOID -halbtc8192e2ant_ActionScoPan( - 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_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); - - // 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); - - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - - if(anttype == 0)//ANTTYPE = 0 92E 2ant with SPDT - { - // 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 == 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 (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_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); - } - } - 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); - } - } - - // 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_ActionA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; - u4Byte wifiBw; - u1Byte anttype=0; - - 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); - -// anttype = 4; - - if(anttype == 0)//ANTTYPE = 0 92E 2ant with SPDT - { - // 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); - } - } - 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, 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(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, 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(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_ActionA2dpPanHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH; - u4Byte wifiBw; - - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - -// 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); - } - 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( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 2); - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - } - - // sw mechanism - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - halbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE); - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); -} - -VOID -halbtc8192e2ant_ActionPanEdr( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; - u4Byte wifiBw; - u1Byte btThresh0=0, btThresh1=0; - - 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(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, 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(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,FALSE,0x18); //open space - else //low RSSI - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); -} - -//PAN(HS) only -VOID -halbtc8192e2ant_ActionPanHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte wifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH; - u4Byte wifiBw; - - wifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0); - btRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42); - -// 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); - - if( (btRssiState == BTC_RSSI_STATE_LOW) || - (btRssiState == BTC_RSSI_STATE_STAY_LOW) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0); - } - else if( (btRssiState == BTC_RSSI_STATE_MEDIUM) || - (btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2); - } - else if( (btRssiState == BTC_RSSI_STATE_HIGH) || - (btRssiState == BTC_RSSI_STATE_STAY_HIGH) ) - { - halbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4); - } - 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_ActionPanEdrA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; - u4Byte wifiBw; - u1Byte btThresh0=0, btThresh1=0; - - 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((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, 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_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); - 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,FALSE,0x18); //open space - else //low RSSI - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); -} - -VOID -halbtc8192e2ant_ActionPanEdrHid( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; - u4Byte wifiBw; - u1Byte btThresh0=0, btThresh1=0; - - 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((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); - - // 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); - 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,FALSE,0x18); //open space - else //low RSSI - halbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18); -} - -// HID+A2DP+PAN(EDR) -VOID -halbtc8192e2ant_ActionHidA2dpPanEdr( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH; - u4Byte wifiBw; - u1Byte btThresh0=0, btThresh1=0; - - 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((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); - } - -/* - // 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,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; - - 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 - { - // 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)) - { - 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_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); - halbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83); - halbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8); - } - } - 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)) - { - 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_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 -halbtc8192e2ant_RunCoexistMechanism( - IN PBTC_COEXIST pBtCoexist - ) -{ - BOOLEAN bWifiUnder5G=FALSE; - u1Byte btInfoOriginal=0, btRetryCnt=0; - u1Byte algorithm=0; - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n")); - - if(pBtCoexist->bManualControl) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); - return; - } - - if(pCoexSta->bUnderIps) - { - 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)) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is under inquiry/page scan !!\n")); - halbtc8192e2ant_ActionBtInquiry(pBtCoexist); - return; - } - - pCoexDm->curAlgorithm = algorithm; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm)); - - if(halbtc8192e2ant_IsCommonAction(pBtCoexist)) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant common.\n")); - pCoexDm->bAutoTdmaAdjust = FALSE; - pCoexDm->bAutoTdmaAdjustLowRssi = 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; - pCoexDm->bAutoTdmaAdjustLowRssi = FALSE; - } - switch(pCoexDm->curAlgorithm) - { - case BT_8192E_2ANT_COEX_ALGO_SCO: - 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: - 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: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID.\n")); - halbtc8192e2ant_ActionHid(pBtCoexist); - break; - case BT_8192E_2ANT_COEX_ALGO_A2DP: - 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: - 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: - 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: - 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: - 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: - 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: - 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: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n")); - halbtc8192e2ant_ActionHidA2dp(pBtCoexist); - break; - default: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action 2-Ant, algorithm = undefined!!\n")); - halbtc8192e2ant_ActionUndefined(pBtCoexist); - break; - } - pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; - } -} - -VOID -halbtc8192e2ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bBackUp - ) -{ - u4Byte u4Tmp=0; - u2Byte u2Tmp=0; - u1Byte u1Tmp=0; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 2Ant Init HW Config!!\n")); - - if(bBackUp) - { - // backup rf 0x1e value - pCoexDm->btRf0x1eBackup = - pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff); - - pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430); - pCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434); - pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a); - pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456); - } - - // antenna sw ctrl to bt - halbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE); - - halbtc8192e2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); - - // antenna switch control parameter - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x858, 0x55555555); - - // coex parameters - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3); - // 0x790[5:0]=0x5 - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790); - u1Tmp &= 0xc0; - u1Tmp |= 0x5; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp); - - // enable counter statistics - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); - - // enable PTA - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20); - // enable mailbox interface - u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x40); - u2Tmp |= BIT9; - pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x40, u2Tmp); - - // enable PTA I2C mailbox - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x101); - u1Tmp |= BIT4; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x101, u1Tmp); - - // enable bt clock when wifi is disabled. - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x93); - u1Tmp |= BIT0; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x93, u1Tmp); - // enable bt clock when suspend. - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7); - u1Tmp |= BIT0; - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp); -} - -//============================================================ -// work around function start with wa_halbtc8192e2ant_ -//============================================================ -//============================================================ -// extern function start with EXhalbtc8192e2ant_ -//============================================================ -VOID -EXhalbtc8192e2ant_PowerOnSetting( - IN PBTC_COEXIST pBtCoexist - ) -{ -} - -VOID -EXhalbtc8192e2ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bWifiOnly - ) -{ - halbtc8192e2ant_InitHwConfig(pBtCoexist, TRUE); -} - -VOID -EXhalbtc8192e2ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ) -{ - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); - - halbtc8192e2ant_InitCoexDm(pBtCoexist); -} - -VOID -EXhalbtc8192e2ant_DisplayCoexInfo( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - pu1Byte cliBuf=pBtCoexist->cliBuf; - u1Byte u1Tmp[4], i, btInfoExt, psTdmaCase=0; - u2Byte u2Tmp[4]; - 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); - - if(pBtCoexist->bManualControl) - { - 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 = %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); - - 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", \ - GLCoexVerDate8192e2Ant, GLCoexVer8192e2Ant, fwVer, btPatchVer, btPatchVer); - 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); - - // wifi status - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); - CL_PRINTF(cliBuf); - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS); - - 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]", \ - ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"): ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle": - ( (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))), - pCoexSta->btRssi, pCoexSta->btRetryCnt); - CL_PRINTF(cliBuf); - - 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); - - 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_PRINTF(cliBuf); - - for(i=0; ibtInfoC2hCnt[i]) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8192e2Ant[i], \ - pCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1], - pCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3], - pCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5], - pCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]); - 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); - 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); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ", "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \ - pCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl); - CL_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Rate Mask", \ - pBtCoexist->btInfo.raMask); - CL_PRINTF(cliBuf); - - // Fw mechanism - 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", \ - 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/ %d ", "DecBtPwr/ IgnWlanAct", \ - pCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct); - CL_PRINTF(cliBuf); - - // Hw setting - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============"); - CL_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "RF-A, 0x1e initVal", \ - pCoexDm->btRf0x1eBackup); - CL_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", "backup ARFR1/ARFR2/RL/AMaxTime", \ - pCoexDm->backupArfrCnt1, pCoexDm->backupArfrCnt2, pCoexDm->backupRetryLimit, pCoexDm->backupAmpduMaxTime); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434); - u2Tmp[0] = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", "0x430/0x434/0x42a/0x456", \ - u4Tmp[0], u4Tmp[1], u2Tmp[0], u1Tmp[0]); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc04); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xd04); - u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x90c); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0xc04/ 0xd04/ 0x90c", \ - u4Tmp[0], u4Tmp[1], u4Tmp[2]); - CL_PRINTF(cliBuf); - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x778", \ - u1Tmp[0]); - CL_PRINTF(cliBuf); - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x92c); - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x92c/ 0x930", \ - (u1Tmp[0]), u4Tmp[0]); - CL_PRINTF(cliBuf); - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40); - u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4f); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x40/ 0x4f", \ - u1Tmp[0], u1Tmp[1]); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522", \ - u4Tmp[0], u1Tmp[0]); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0xc50(dig)", \ - u4Tmp[0]); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4); - u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8); - 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(hp rx[31:16]/tx[15:0])", \ - pCoexSta->highPriorityRx, pCoexSta->highPriorityTx); - CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x774(lp rx[31:16]/tx[15:0])", \ - pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx); - CL_PRINTF(cliBuf); -#if(BT_AUTO_REPORT_ONLY_8192E_2ANT == 1) - halbtc8192e2ant_MonitorBtCtr(pBtCoexist); -#endif - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS); -} - - -VOID -EXhalbtc8192e2ant_IpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - if(BTC_IPS_ENTER == type) - { - 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) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); - pCoexSta->bUnderIps = FALSE; - } -} - -VOID -EXhalbtc8192e2ant_LpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - if(BTC_LPS_ENABLE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); - pCoexSta->bUnderLps = TRUE; - } - else if(BTC_LPS_DISABLE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); - pCoexSta->bUnderLps = FALSE; - } -} - -VOID -EXhalbtc8192e2ant_ScanNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - if(BTC_SCAN_START == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); - } - else if(BTC_SCAN_FINISH == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum); - - } -} - -VOID -EXhalbtc8192e2ant_ConnectNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - if(BTC_ASSOCIATE_START == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); - } - else if(BTC_ASSOCIATE_FINISH == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT FINISH notify\n")); - } -} - -VOID -EXhalbtc8192e2ant_MediaStatusNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - u1Byte H2C_Parameter[3] ={0}; - u4Byte wifiBw; - u1Byte wifiCentralChnl; - - if(pBtCoexist->bManualControl || - pBtCoexist->bStopCoexDm || - pBtCoexist->btInfo.bBtDisabled ) - return; - - if(BTC_MEDIA_CONNECT == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); - } - else - { - 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) && - (wifiCentralChnl <= 14) ) - { - H2C_Parameter[0] = 0x1; - H2C_Parameter[1] = wifiCentralChnl; - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - if(BTC_WIFI_BW_HT40 == wifiBw) - 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]; - - 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); -} - -VOID -EXhalbtc8192e2ant_SpecialPacketNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - if(type == BTC_PACKET_DHCP) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], DHCP Packet notify\n")); - } -} - -VOID -EXhalbtc8192e2ant_BtInfoNotify( - IN PBTC_COEXIST pBtCoexist, - IN pu1Byte tmpBuf, - 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; - - pCoexSta->bC2hBtInfoReqSent = FALSE; - - rspSource = tmpBuf[0]&0xf; - if(rspSource >= BT_INFO_SRC_8192E_2ANT_MAX) - rspSource = BT_INFO_SRC_8192E_2ANT_WIFI_FW; - pCoexSta->btInfoC2hCnt[rspSource]++; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); - for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; - if(i == 1) - btInfo = tmpBuf[i]; - if(i == length-1) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); - } - } - - if(BT_INFO_SRC_8192E_2ANT_WIFI_FW != rspSource) - { - pCoexSta->btRetryCnt = // [3:0] - pCoexSta->btInfoC2h[rspSource][2]&0xf; - - pCoexSta->btRssi = - pCoexSta->btInfoC2h[rspSource][3]*2+10; - - pCoexSta->btInfoExt = - pCoexSta->btInfoC2h[rspSource][4]; - - // 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")); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - - if(bWifiConnected) - { - EXhalbtc8192e2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT); - } - else - { - EXhalbtc8192e2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); - } - } - - if( (pCoexSta->btInfoExt & BIT3) ) - { - if(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) - { - 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); - } - } - else - { - // BT already NOT ignore Wlan active, do nothing here. - } - -#if(BT_AUTO_REPORT_ONLY_8192E_2ANT == 0) - if( (pCoexSta->btInfoExt & BIT4) ) - { - // BT auto report already enabled, do nothing - } - else - { - halbtc8192e2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE); - } -#endif - } - - // check BIT2 first ==> check if bt is under inquiry or page scan - if(btInfo & BT_INFO_8192E_2ANT_B_INQ_PAGE) - pCoexSta->bC2hBtInquiryPage = TRUE; - else - pCoexSta->bC2hBtInquiryPage = FALSE; - - // set link exist status - if(!(btInfo&BT_INFO_8192E_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_8192E_2ANT_B_FTP) - pCoexSta->bPanExist = TRUE; - else - pCoexSta->bPanExist = FALSE; - if(btInfo & BT_INFO_8192E_2ANT_B_A2DP) - pCoexSta->bA2dpExist = TRUE; - else - pCoexSta->bA2dpExist = FALSE; - if(btInfo & BT_INFO_8192E_2ANT_B_HID) - pCoexSta->bHidExist = TRUE; - else - pCoexSta->bHidExist = FALSE; - if(btInfo & BT_INFO_8192E_2ANT_B_SCO_ESCO) - pCoexSta->bScoExist = TRUE; - else - pCoexSta->bScoExist = FALSE; - } - - halbtc8192e2ant_UpdateBtLinkInfo(pBtCoexist); - - if(!(btInfo&BT_INFO_8192E_2ANT_B_CONNECTION)) - { - pCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE; - 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; - 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; - 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; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); - } - else - { - pCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_MAX; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); - } - - if( (BT_8192E_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || - (BT_8192E_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8192E_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); - - halbtc8192e2ant_RunCoexistMechanism(pBtCoexist); -} - -VOID -EXhalbtc8192e2ant_HaltNotify( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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); - EXhalbtc8192e2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); -} - -VOID -EXhalbtc8192e2ant_Periodical( - IN PBTC_COEXIST pBtCoexist - ) -{ - static u1Byte disVerInfoCnt=0; - u4Byte fwVer=0, btPatchVer=0; - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); - - if(disVerInfoCnt <= 5) - { - 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)); - 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); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", - GLCoexVerDate8192e2Ant, GLCoexVer8192e2Ant, fwVer, btPatchVer, btPatchVer)); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); - } - -#if(BT_AUTO_REPORT_ONLY_8192E_2ANT == 0) - halbtc8192e2ant_QueryBtInfo(pBtCoexist); - halbtc8192e2ant_MonitorBtCtr(pBtCoexist); - halbtc8192e2ant_MonitorBtEnableDisable(pBtCoexist); -#else - if( halbtc8192e2ant_IsWifiStatusChanged(pBtCoexist) || - pCoexDm->bAutoTdmaAdjust) - { - halbtc8192e2ant_RunCoexistMechanism(pBtCoexist); - } -#endif -} - - -#endif - +/* ************************************************************ + * Description: + * + * This file is for RTL8192E Co-exist mechanism + * + * History + * 2012/11/15 Cosa first check in. + * + * ************************************************************ */ + +/* ************************************************************ + * include files + * ************************************************************ */ +#include "Mp_Precomp.h" + + +#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) + +#if (RTL8192E_SUPPORT == 1) +/* ************************************************************ + * Global variables, these are static variables + * ************************************************************ */ +static u8 *trace_buf = &gl_btc_trace_buf[0]; +static struct coex_dm_8192e_2ant glcoex_dm_8192e_2ant; +static struct coex_dm_8192e_2ant *coex_dm = &glcoex_dm_8192e_2ant; +static struct coex_sta_8192e_2ant glcoex_sta_8192e_2ant; +static struct coex_sta_8192e_2ant *coex_sta = &glcoex_sta_8192e_2ant; + +const char *const glbt_info_src_8192e_2ant[] = { + "BT Info[wifi fw]", + "BT Info[bt rsp]", + "BT Info[bt auto report]", +}; + +u32 glcoex_ver_date_8192e_2ant = 20160412; +u32 glcoex_ver_8192e_2ant = 0x42; + +/* ************************************************************ + * local function proto type if needed + * ************************************************************ + * ************************************************************ + * local function start with halbtc8192e2ant_ + * ************************************************************ */ +u8 halbtc8192e2ant_bt_rssi_state(u8 level_num, u8 rssi_thresh, u8 rssi_thresh1) +{ + s32 bt_rssi = 0; + u8 bt_rssi_state = coex_sta->pre_bt_rssi_state; + + bt_rssi = coex_sta->bt_rssi; + + if (level_num == 2) { + if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) || + (coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_STAY_LOW)) { + if (bt_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) + bt_rssi_state = BTC_RSSI_STATE_HIGH; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else { + if (bt_rssi < rssi_thresh) + bt_rssi_state = BTC_RSSI_STATE_LOW; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } else if (level_num == 3) { + if (rssi_thresh > rssi_thresh1) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Rssi thresh error!!\n"); + BTC_TRACE(trace_buf); + return coex_sta->pre_bt_rssi_state; + } + + if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) || + (coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_STAY_LOW)) { + if (bt_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) + bt_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else if ((coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_MEDIUM) || + (coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_STAY_MEDIUM)) { + if (bt_rssi >= (rssi_thresh1 + + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) + bt_rssi_state = BTC_RSSI_STATE_HIGH; + else if (bt_rssi < rssi_thresh) + bt_rssi_state = BTC_RSSI_STATE_LOW; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM; + } else { + if (bt_rssi < rssi_thresh1) + bt_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } + + coex_sta->pre_bt_rssi_state = bt_rssi_state; + + return bt_rssi_state; +} + +u8 halbtc8192e2ant_wifi_rssi_state(IN struct btc_coexist *btcoexist, + IN u8 index, IN u8 level_num, IN u8 rssi_thresh, IN u8 rssi_thresh1) +{ + s32 wifi_rssi = 0; + u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index]; + + btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi); + + if (level_num == 2) { + if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW) + || + (coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_STAY_LOW)) { + if (wifi_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) + wifi_rssi_state = BTC_RSSI_STATE_HIGH; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else { + if (wifi_rssi < rssi_thresh) + wifi_rssi_state = BTC_RSSI_STATE_LOW; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } else if (level_num == 3) { + if (rssi_thresh > rssi_thresh1) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi RSSI thresh error!!\n"); + BTC_TRACE(trace_buf); + return coex_sta->pre_wifi_rssi_state[index]; + } + + if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW) + || + (coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_STAY_LOW)) { + if (wifi_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) + wifi_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else if ((coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_MEDIUM) || + (coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_STAY_MEDIUM)) { + if (wifi_rssi >= (rssi_thresh1 + + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) + wifi_rssi_state = BTC_RSSI_STATE_HIGH; + else if (wifi_rssi < rssi_thresh) + wifi_rssi_state = BTC_RSSI_STATE_LOW; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM; + } else { + if (wifi_rssi < rssi_thresh1) + wifi_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } + + coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state; + + return wifi_rssi_state; +} + +void halbtc8192e2ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist) +{ + static u32 bt_disable_cnt = 0; + boolean bt_active = true, bt_disabled = false; + + /* This function check if bt is disabled */ + + if (coex_sta->high_priority_tx == 0 && + coex_sta->high_priority_rx == 0 && + coex_sta->low_priority_tx == 0 && + coex_sta->low_priority_rx == 0) + bt_active = false; + if (coex_sta->high_priority_tx == 0xffff && + coex_sta->high_priority_rx == 0xffff && + coex_sta->low_priority_tx == 0xffff && + coex_sta->low_priority_rx == 0xffff) + bt_active = false; + if (bt_active) { + bt_disable_cnt = 0; + bt_disabled = false; + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, + &bt_disabled); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is enabled !!\n"); + BTC_TRACE(trace_buf); + } else { + bt_disable_cnt++; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], bt all counters=0, %d times!!\n", + bt_disable_cnt); + BTC_TRACE(trace_buf); + if (bt_disable_cnt >= 2) { + bt_disabled = true; + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, + &bt_disabled); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is disabled !!\n"); + BTC_TRACE(trace_buf); + } + } + if (coex_sta->bt_disabled != bt_disabled) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is from %s to %s!!\n", + (coex_sta->bt_disabled ? "disabled" : "enabled"), + (bt_disabled ? "disabled" : "enabled")); + BTC_TRACE(trace_buf); + coex_sta->bt_disabled = bt_disabled; + if (!bt_disabled) { + } else { + } + } +} + +u32 halbtc8192e2ant_decide_ra_mask(IN struct btc_coexist *btcoexist, + IN u8 ss_type, IN u32 ra_mask_type) +{ + u32 dis_ra_mask = 0x0; + + switch (ra_mask_type) { + case 0: /* normal mode */ + if (ss_type == 2) + dis_ra_mask = 0x0; /* enable 2ss */ + else + dis_ra_mask = 0xfff00000; /* disable 2ss */ + break; + case 1: /* disable cck 1/2 */ + if (ss_type == 2) + dis_ra_mask = 0x00000003; /* enable 2ss */ + else + dis_ra_mask = 0xfff00003; /* disable 2ss */ + break; + case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */ + if (ss_type == 2) + dis_ra_mask = 0x0001f1f7; /* enable 2ss */ + else + dis_ra_mask = 0xfff1f1f7; /* disable 2ss */ + break; + default: + break; + } + + return dis_ra_mask; +} + +void halbtc8192e2ant_update_ra_mask(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u32 dis_rate_mask) +{ + coex_dm->cur_ra_mask = dis_rate_mask; + + if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) + btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK, + &coex_dm->cur_ra_mask); + coex_dm->pre_ra_mask = coex_dm->cur_ra_mask; +} + +void halbtc8192e2ant_auto_rate_fallback_retry(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + boolean wifi_under_b_mode = false; + + coex_dm->cur_arfr_type = type; + + if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) { + switch (coex_dm->cur_arfr_type) { + case 0: /* normal mode */ + btcoexist->btc_write_4byte(btcoexist, 0x430, + coex_dm->backup_arfr_cnt1); + btcoexist->btc_write_4byte(btcoexist, 0x434, + coex_dm->backup_arfr_cnt2); + break; + case 1: + btcoexist->btc_get(btcoexist, + BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + if (wifi_under_b_mode) { + btcoexist->btc_write_4byte(btcoexist, + 0x430, 0x0); + btcoexist->btc_write_4byte(btcoexist, + 0x434, 0x01010101); + } else { + btcoexist->btc_write_4byte(btcoexist, + 0x430, 0x0); + btcoexist->btc_write_4byte(btcoexist, + 0x434, 0x04030201); + } + break; + default: + break; + } + } + + coex_dm->pre_arfr_type = coex_dm->cur_arfr_type; +} + +void halbtc8192e2ant_retry_limit(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + coex_dm->cur_retry_limit_type = type; + + if (force_exec || + (coex_dm->pre_retry_limit_type != + coex_dm->cur_retry_limit_type)) { + switch (coex_dm->cur_retry_limit_type) { + case 0: /* normal mode */ + btcoexist->btc_write_2byte(btcoexist, 0x42a, + coex_dm->backup_retry_limit); + break; + case 1: /* retry limit=8 */ + btcoexist->btc_write_2byte(btcoexist, 0x42a, + 0x0808); + break; + default: + break; + } + } + + coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type; +} + +void halbtc8192e2ant_ampdu_max_time(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + coex_dm->cur_ampdu_time_type = type; + + if (force_exec || + (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) { + switch (coex_dm->cur_ampdu_time_type) { + case 0: /* normal mode */ + btcoexist->btc_write_1byte(btcoexist, 0x456, + coex_dm->backup_ampdu_max_time); + break; + case 1: /* AMPDU timw = 0x38 * 32us */ + btcoexist->btc_write_1byte(btcoexist, 0x456, + 0x38); + break; + default: + break; + } + } + + coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type; +} + +void halbtc8192e2ant_limited_tx(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 ra_mask_type, IN u8 arfr_type, + IN u8 retry_limit_type, IN u8 ampdu_time_type) +{ + u32 dis_ra_mask = 0x0; + + coex_dm->cur_ra_mask_type = ra_mask_type; + dis_ra_mask = halbtc8192e2ant_decide_ra_mask(btcoexist, + coex_dm->cur_ss_type, ra_mask_type); + halbtc8192e2ant_update_ra_mask(btcoexist, force_exec, dis_ra_mask); + + halbtc8192e2ant_auto_rate_fallback_retry(btcoexist, force_exec, + arfr_type); + halbtc8192e2ant_retry_limit(btcoexist, force_exec, retry_limit_type); + halbtc8192e2ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type); +} + +void halbtc8192e2ant_limited_rx(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean rej_ap_agg_pkt, + IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size) +{ + boolean reject_rx_agg = rej_ap_agg_pkt; + boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size; + u8 rx_agg_size = agg_buf_size; + + /* ============================================ */ + /* Rx Aggregation related setting */ + /* ============================================ */ + btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, + &reject_rx_agg); + /* decide BT control aggregation buf size or not */ + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, + &bt_ctrl_rx_agg_size); + /* aggregation buf size, only work when BT control Rx aggregation size. */ + btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size); + /* real update aggregation setting */ + btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); + + +} + +void halbtc8192e2ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist) +{ + u32 reg_hp_txrx, reg_lp_txrx, u32tmp; + u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0; + + reg_hp_txrx = 0x770; + reg_lp_txrx = 0x774; + + u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx); + reg_hp_tx = u32tmp & MASKLWORD; + reg_hp_rx = (u32tmp & MASKHWORD) >> 16; + + u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx); + reg_lp_tx = u32tmp & MASKLWORD; + reg_lp_rx = (u32tmp & MASKHWORD) >> 16; + + coex_sta->high_priority_tx = reg_hp_tx; + coex_sta->high_priority_rx = reg_hp_rx; + coex_sta->low_priority_tx = reg_lp_tx; + coex_sta->low_priority_rx = reg_lp_rx; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx); + BTC_TRACE(trace_buf); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", + reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx); + BTC_TRACE(trace_buf); + + /* reset counter */ + btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc); +} + +void halbtc8192e2ant_query_bt_info(IN struct btc_coexist *btcoexist) +{ + u8 h2c_parameter[1] = {0}; + + coex_sta->c2h_bt_info_req_sent = true; + + h2c_parameter[0] |= BIT(0); /* trigger */ + + btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter); +} + +boolean halbtc8192e2ant_is_wifi_status_changed(IN struct btc_coexist *btcoexist) +{ + static boolean pre_wifi_busy = false, pre_under_4way = false, + pre_bt_hs_on = false; + boolean wifi_busy = false, under_4way = false, bt_hs_on = false; + boolean wifi_connected = false; + u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH; + + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, + &under_4way); + + if (wifi_connected) { + if (wifi_busy != pre_wifi_busy) { + pre_wifi_busy = wifi_busy; + return true; + } + if (under_4way != pre_under_4way) { + pre_under_4way = under_4way; + return true; + } + if (bt_hs_on != pre_bt_hs_on) { + pre_bt_hs_on = bt_hs_on; + return true; + } + + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); + + if ((BTC_RSSI_STATE_HIGH == wifi_rssi_state) || (BTC_RSSI_STATE_LOW == wifi_rssi_state)) + return true; + } + + return false; +} + +void halbtc8192e2ant_update_bt_link_info(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean bt_hs_on = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + + bt_link_info->bt_link_exist = coex_sta->bt_link_exist; + bt_link_info->sco_exist = coex_sta->sco_exist; + bt_link_info->a2dp_exist = coex_sta->a2dp_exist; + bt_link_info->pan_exist = coex_sta->pan_exist; + bt_link_info->hid_exist = coex_sta->hid_exist; + + /* work around for HS mode. */ + if (bt_hs_on) { + bt_link_info->pan_exist = true; + bt_link_info->bt_link_exist = true; + } + + /* check if Sco only */ + if (bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + !bt_link_info->hid_exist) + bt_link_info->sco_only = true; + else + bt_link_info->sco_only = false; + + /* check if A2dp only */ + if (!bt_link_info->sco_exist && + bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + !bt_link_info->hid_exist) + bt_link_info->a2dp_only = true; + else + bt_link_info->a2dp_only = false; + + /* check if Pan only */ + if (!bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + bt_link_info->pan_exist && + !bt_link_info->hid_exist) + bt_link_info->pan_only = true; + else + bt_link_info->pan_only = false; + + /* check if Hid only */ + if (!bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + bt_link_info->hid_exist) + bt_link_info->hid_only = true; + else + bt_link_info->hid_only = false; +} + +u8 halbtc8192e2ant_action_algorithm(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + struct btc_stack_info *stack_info = &btcoexist->stack_info; + boolean bt_hs_on = false; + u8 algorithm = BT_8192E_2ANT_COEX_ALGO_UNDEFINED; + u8 num_of_diff_profile = 0; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + + if (!bt_link_info->bt_link_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], No BT link exists!!!\n"); + BTC_TRACE(trace_buf); + return algorithm; + } + + if (bt_link_info->sco_exist) + num_of_diff_profile++; + if (bt_link_info->hid_exist) + num_of_diff_profile++; + if (bt_link_info->pan_exist) + num_of_diff_profile++; + if (bt_link_info->a2dp_exist) + num_of_diff_profile++; + + if (num_of_diff_profile == 1) { + if (bt_link_info->sco_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO only\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; + } else { + if (bt_link_info->hid_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], HID only\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_HID; + } else if (bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], A2DP only\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_A2DP; + } else if (bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], PAN(HS) only\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_PANHS; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], PAN(EDR) only\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_PANEDR; + } + } + } + } else if (num_of_diff_profile == 2) { + if (bt_link_info->sco_exist) { + if (bt_link_info->hid_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + HID\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; + } else if (bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + A2DP ==> SCO\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; + } else if (bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_SCO_PAN; + } + } + } else { + if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { + if (stack_info->num_of_hid >= 2) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], HID*2 + A2DP\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], HID + A2DP\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_HID_A2DP; + } + } else if (bt_link_info->hid_exist && + bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], HID + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_HID; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], HID + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; + } + } else if (bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], A2DP + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP; + } + } + } + } else if (num_of_diff_profile == 3) { + if (bt_link_info->sco_exist) { + if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + HID + A2DP ==> HID\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; + } else if (bt_link_info->hid_exist && + bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + HID + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + HID + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_SCO_PAN; + } + } else if (bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; + } + } + } else { + if (bt_link_info->hid_exist && + bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], HID + A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_HID_A2DP; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], HID + A2DP + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR; + } + } + } + } else if (num_of_diff_profile >= 3) { + if (bt_link_info->sco_exist) { + if (bt_link_info->hid_exist && + bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; + } + } + } + } + + return algorithm; +} + +void halbtc8192e2ant_set_fw_dac_swing_level(IN struct btc_coexist *btcoexist, + IN u8 dac_swing_lvl) +{ + u8 h2c_parameter[1] = {0}; + + /* There are several type of dacswing */ + /* 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */ + h2c_parameter[0] = dac_swing_lvl; + + btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter); +} + +void halbtc8192e2ant_set_fw_dec_bt_pwr(IN struct btc_coexist *btcoexist, + IN u8 dec_bt_pwr_lvl) +{ + u8 h2c_parameter[1] = {0}; + + h2c_parameter[0] = dec_bt_pwr_lvl; + + btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter); +} + +void halbtc8192e2ant_dec_bt_pwr(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 dec_bt_pwr_lvl) +{ + coex_dm->cur_bt_dec_pwr_lvl = dec_bt_pwr_lvl; + + if (!force_exec) { +#if 0 /* work around, avoid h2c command fail. */ + if (coex_dm->pre_bt_dec_pwr_lvl == coex_dm->cur_bt_dec_pwr_lvl) + return; +#endif + } + halbtc8192e2ant_set_fw_dec_bt_pwr(btcoexist, + coex_dm->cur_bt_dec_pwr_lvl); + + coex_dm->pre_bt_dec_pwr_lvl = coex_dm->cur_bt_dec_pwr_lvl; +} + +void halbtc8192e2ant_set_bt_auto_report(IN struct btc_coexist *btcoexist, + IN boolean enable_auto_report) +{ + u8 h2c_parameter[1] = {0}; + + h2c_parameter[0] = 0; + + if (enable_auto_report) + h2c_parameter[0] |= BIT(0); + + btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter); +} + +void halbtc8192e2ant_bt_auto_report(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean enable_auto_report) +{ + coex_dm->cur_bt_auto_report = enable_auto_report; + + if (!force_exec) { + if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report) + return; + } + halbtc8192e2ant_set_bt_auto_report(btcoexist, + coex_dm->cur_bt_auto_report); + + coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report; +} + +void halbtc8192e2ant_fw_dac_swing_lvl(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 fw_dac_swing_lvl) +{ + coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl; + + if (!force_exec) { + if (coex_dm->pre_fw_dac_swing_lvl == + coex_dm->cur_fw_dac_swing_lvl) + return; + } + + halbtc8192e2ant_set_fw_dac_swing_level(btcoexist, + coex_dm->cur_fw_dac_swing_lvl); + + coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl; +} + +void halbtc8192e2ant_set_sw_rf_rx_lpf_corner(IN struct btc_coexist *btcoexist, + IN boolean rx_rf_shrink_on) +{ + if (rx_rf_shrink_on) { + /* Shrink RF Rx LPF corner */ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Shrink RF Rx LPF corner!!\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff, + 0xffffc); + } else { + /* Resume RF Rx LPF corner */ + /* After initialized, we can use coex_dm->bt_rf_0x1e_backup */ + if (btcoexist->initilized) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Resume RF Rx LPF corner!!\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, + 0xfffff, coex_dm->bt_rf_0x1e_backup); + } + } +} + +void halbtc8192e2ant_rf_shrink(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean rx_rf_shrink_on) +{ + coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on; + + if (!force_exec) { + if (coex_dm->pre_rf_rx_lpf_shrink == + coex_dm->cur_rf_rx_lpf_shrink) + return; + } + halbtc8192e2ant_set_sw_rf_rx_lpf_corner(btcoexist, + coex_dm->cur_rf_rx_lpf_shrink); + + coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink; +} + +void halbtc8192e2ant_set_sw_penalty_tx_rate_adaptive(IN struct btc_coexist + *btcoexist, IN boolean low_penalty_ra) +{ + u8 h2c_parameter[6] = {0}; + + h2c_parameter[0] = 0x6; /* op_code, 0x6= Retry_Penalty */ + + if (low_penalty_ra) { + h2c_parameter[1] |= BIT(0); + 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 */ + } + + btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter); +} + +void halbtc8192e2ant_low_penalty_ra(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean low_penalty_ra) +{ + coex_dm->cur_low_penalty_ra = low_penalty_ra; + + if (!force_exec) { + if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra) + return; + } + halbtc8192e2ant_set_sw_penalty_tx_rate_adaptive(btcoexist, + coex_dm->cur_low_penalty_ra); + + coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra; +} + +void halbtc8192e2ant_set_dac_swing_reg(IN struct btc_coexist *btcoexist, + IN u32 level) +{ + u8 val = (u8)level; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Write SwDacSwing = 0x%x\n", level); + BTC_TRACE(trace_buf); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val); +} + +void halbtc8192e2ant_set_sw_full_time_dac_swing(IN struct btc_coexist + *btcoexist, IN boolean sw_dac_swing_on, IN u32 sw_dac_swing_lvl) +{ + if (sw_dac_swing_on) + halbtc8192e2ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl); + else + halbtc8192e2ant_set_dac_swing_reg(btcoexist, 0x18); +} + + +void halbtc8192e2ant_dac_swing(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean dac_swing_on, IN u32 dac_swing_lvl) +{ + coex_dm->cur_dac_swing_on = dac_swing_on; + coex_dm->cur_dac_swing_lvl = dac_swing_lvl; + + if (!force_exec) { + if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) && + (coex_dm->pre_dac_swing_lvl == + coex_dm->cur_dac_swing_lvl)) + return; + } + delay_ms(30); + halbtc8192e2ant_set_sw_full_time_dac_swing(btcoexist, dac_swing_on, + dac_swing_lvl); + + coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on; + coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl; +} + +void halbtc8192e2ant_set_adc_back_off(IN struct btc_coexist *btcoexist, + IN boolean adc_back_off) +{ + if (adc_back_off) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BB BackOff Level On!\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc05, 0x30, 0x3); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BB BackOff Level Off!\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc05, 0x30, 0x1); + } +} + +void halbtc8192e2ant_adc_back_off(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean adc_back_off) +{ + coex_dm->cur_adc_back_off = adc_back_off; + + if (!force_exec) { + if (coex_dm->pre_adc_back_off == coex_dm->cur_adc_back_off) + return; + } + halbtc8192e2ant_set_adc_back_off(btcoexist, coex_dm->cur_adc_back_off); + + coex_dm->pre_adc_back_off = coex_dm->cur_adc_back_off; +} + +void halbtc8192e2ant_set_agc_table(IN struct btc_coexist *btcoexist, + IN boolean agc_table_en) +{ + /* =================BB AGC Gain Table */ + if (agc_table_en) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BB Agc Table On!\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x0a1A0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x091B0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x081C0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x071D0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x061E0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x051F0001); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BB Agc Table Off!\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xaa1A0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa91B0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa81C0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa71D0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa61E0001); + btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa51F0001); + } +} + +void halbtc8192e2ant_agc_table(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean agc_table_en) +{ + coex_dm->cur_agc_table_en = agc_table_en; + + if (!force_exec) { + if (coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en) + return; + } + halbtc8192e2ant_set_agc_table(btcoexist, agc_table_en); + + coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en; +} + +void halbtc8192e2ant_set_coex_table(IN struct btc_coexist *btcoexist, + IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc) +{ + btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0); + + btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4); + + btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8); + + btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc); +} + +void halbtc8192e2ant_coex_table(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4, + IN u32 val0x6c8, IN u8 val0x6cc) +{ + coex_dm->cur_val0x6c0 = val0x6c0; + coex_dm->cur_val0x6c4 = val0x6c4; + coex_dm->cur_val0x6c8 = val0x6c8; + coex_dm->cur_val0x6cc = val0x6cc; + + if (!force_exec) { + if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) && + (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) && + (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) && + (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc)) + return; + } + halbtc8192e2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8, + val0x6cc); + + coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0; + coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4; + coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8; + coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc; +} + +void halbtc8192e2ant_coex_table_with_type(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + switch (type) { + case 0: + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 1: + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 2: + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 3: + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5fdf5fdf, 0x5fdb5fdb, 0xffffff, 0x3); + break; + case 4: + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0xdfffdfff, 0x5ffb5ffb, 0xffffff, 0x3); + break; + case 5: + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5ddd5ddd, 0x5fdb5fdb, 0xffffff, 0x3); + break; + case 6: + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5fff5fff, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 7: + if (coex_sta->scan_ap_num <= NOISY_AP_NUM_THRESH_8192E) + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0xffffffff, 0xfafafafa, 0xffffff, 0x3); + else + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0xffffffff, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 8: + halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5f5f5f5f, 0x5a5a5a5a, 0xffffff, 0x3); + break; + default: + break; + } +} + +void halbtc8192e2ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist, + IN boolean enable) +{ + u8 h2c_parameter[1] = {0}; + + if (enable) { + h2c_parameter[0] |= BIT(0); /* function enable */ + } + + btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter); +} + +void halbtc8192e2ant_ignore_wlan_act(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean enable) +{ + coex_dm->cur_ignore_wlan_act = enable; + + if (!force_exec) { + if (coex_dm->pre_ignore_wlan_act == + coex_dm->cur_ignore_wlan_act) + return; + } + halbtc8192e2ant_set_fw_ignore_wlan_act(btcoexist, enable); + + coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act; +} + +void halbtc8192e2ant_set_lps_rpwm(IN struct btc_coexist *btcoexist, + IN u8 lps_val, IN u8 rpwm_val) +{ + u8 lps = lps_val; + u8 rpwm = rpwm_val; + + btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps); + btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm); +} + +void halbtc8192e2ant_lps_rpwm(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val) +{ + coex_dm->cur_lps = lps_val; + coex_dm->cur_rpwm = rpwm_val; + + if (!force_exec) { + if ((coex_dm->pre_lps == coex_dm->cur_lps) && + (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) + return; + } + halbtc8192e2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val); + + coex_dm->pre_lps = coex_dm->cur_lps; + coex_dm->pre_rpwm = coex_dm->cur_rpwm; +} + +void halbtc8192e2ant_set_fw_pstdma(IN struct btc_coexist *btcoexist, + IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5) +{ + u8 h2c_parameter[5] = {0}; + u8 realByte1 = byte1, realByte5 = byte5; + boolean bApEnable = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + if (bApEnable) { + if ((byte1 & BIT4) && !(byte1 & BIT5)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], FW for 1Ant AP mode\n"); + realByte1 &= ~BIT4; + realByte1 |= BIT5; + + realByte5 |= BIT5; + realByte5 &= ~BIT6; + } + } + + h2c_parameter[0] = byte1; + h2c_parameter[1] = byte2; + h2c_parameter[2] = byte3; + h2c_parameter[3] = byte4; + h2c_parameter[4] = byte5; + + coex_dm->ps_tdma_para[0] = byte1; + coex_dm->ps_tdma_para[1] = byte2; + coex_dm->ps_tdma_para[2] = byte3; + coex_dm->ps_tdma_para[3] = byte4; + coex_dm->ps_tdma_para[4] = byte5; + + btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter); +} + +void halbtc8192e2ant_sw_mechanism1(IN struct btc_coexist *btcoexist, + IN boolean shrink_rx_lpf, IN boolean low_penalty_ra, + IN boolean limited_dig, IN boolean bt_lna_constrain) +{ + /* + u32 wifi_bw; + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); + + if(BTC_WIFI_BW_HT40 != wifi_bw) + { + if (shrink_rx_lpf) + shrink_rx_lpf = false; + } + */ + + halbtc8192e2ant_rf_shrink(btcoexist, NORMAL_EXEC, shrink_rx_lpf); + /* halbtc8192e2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra); */ +} + +void halbtc8192e2ant_sw_mechanism2(IN struct btc_coexist *btcoexist, + IN boolean agc_table_shift, IN boolean adc_back_off, + IN boolean sw_dac_swing, IN u32 dac_swing_lvl) +{ + halbtc8192e2ant_agc_table(btcoexist, NORMAL_EXEC, agc_table_shift); + /* halbtc8192e2ant_adc_back_off(btcoexist, NORMAL_EXEC, adc_back_off); */ + halbtc8192e2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing, + dac_swing_lvl); +} + +void halbtc8192e2ant_set_ant_path(IN struct btc_coexist *btcoexist, + IN u8 ant_pos_type, IN boolean init_hwcfg, IN boolean wifi_off) +{ + u32 u32tmp = 0; + + if (init_hwcfg) { + btcoexist->btc_write_1byte(btcoexist, 0x944, 0x24); + btcoexist->btc_write_4byte(btcoexist, 0x930, 0x700700); + if (btcoexist->chip_interface == BTC_INTF_USB) + btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30430004); + else + btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30030004); + + /* 0x4c[27][24]='00', Set Antenna to BB */ + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c); + u32tmp &= ~BIT(24); + u32tmp &= ~BIT(27); + btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp); + } else if (wifi_off) { + if (btcoexist->chip_interface == BTC_INTF_USB) + btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30430004); + else + btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30030004); + + /* 0x4c[27][24]='11', Set Antenna to BT, 0x64[8:7]=0, 0x64[2]=1 */ + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c); + u32tmp |= BIT(24); + u32tmp |= BIT(27); + btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp); + } + + /* ext switch setting */ + switch (ant_pos_type) { + case BTC_ANT_PATH_WIFI: + btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4); + break; + case BTC_ANT_PATH_BT: + btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20); + break; + default: + case BTC_ANT_PATH_PTA: + btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4); + break; + } +} + +void halbtc8192e2ant_ps_tdma(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean turn_on, IN u8 type) +{ + s8 nWiFiDurationAdjust = 0x0; + + coex_dm->cur_ps_tdma_on = turn_on; + coex_dm->cur_ps_tdma = type; + + if (!force_exec) { + if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) && + (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma)) + return; + } + + if (coex_sta->scan_ap_num >= 40) + nWiFiDurationAdjust = -15; + else if (coex_sta->scan_ap_num >= 20) + nWiFiDurationAdjust = -10; + + if (turn_on) { + switch (type) { + case 1: + default: /*d1,wb*/ + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x3c, 0x03, 0x11, 0x10); + break; + case 2: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x32, 0x03, 0x11, 0x10); + break; + case 3: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x28, 0x03, 0x11, 0x10); + break; + case 4: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1e, 0x03, 0x11, 0x10); + break; + case 5: /*d1,pb,TXpause*/ + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x3c, 0x03, 0x90, 0x10); + break; + case 6: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x32, 0x03, 0x90, 0x10); + break; + case 7: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x28, 0x03, 0x90, 0x10); + break; + case 8: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x1e, 0x03, 0x90, 0x10); + break; + case 9: /*d1,bb*/ + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x3c, 0x03, 0x31, 0x10); + break; + case 10: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x32, 0x03, 0x31, 0x10); + break; + case 11: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x28, 0x03, 0x31, 0x10); + break; + case 12: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1e, 0x03, 0x31, 0x10); + break; + case 13: /*d1,bb,TXpause*/ + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x3c, 0x03, 0x30, 0x10); + break; + case 14: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x32, 0x03, 0x30, 0x10); + break; + case 15: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x28, 0x03, 0x30, 0x10); + break; + case 16: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1e, 0x03, 0x30, 0x10); + break; + case 17: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x61, 0x20, 0x03, 0x10, 0x10); + break; + case 18: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90); + break; + case 19: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90); + break; + case 20: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x25, 0x25, 0x60, 0x90); + break; + case 21: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x61, 0x35, 0x03, 0x11, 0x11); + break; + case 22: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x14, 0x03, 0x11, 0x14); + break; + case 23: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x14, 0x03, 0x90, 0x14); + break; + case 24: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x14, 0x03, 0x31, 0x14); + break; + case 25: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x14, 0x03, 0x30, 0x14); + break; + case 71: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); + break; + case 80: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x3c, 0x3, 0x10, 0x50); + break; + case 81: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x3a+nWiFiDurationAdjust, 0x3, 0x10, 0x50); + break; + case 82: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x30+nWiFiDurationAdjust, 0x03, 0x10, 0x50); + break; + case 83: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x21, 0x03, 0x10, 0x50); + break; + case 84: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x15, 0x3, 0x10, 0x50); + break; + case 85: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x3a, 0x03, 0x10, 0x50); + break; + case 86: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x21, 0x03, 0x10, 0x50); + break; + case 87: + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x14, 0x03, 0x10, 0x54); + break; + + } + } else { + /* disable PS tdma */ + switch (type) { + default: + case 0: /* ANT2PTA, 0x778=1 */ + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x8, + 0x0, 0x0, 0x0, 0x0); + halbtc8192e2ant_set_ant_path(btcoexist, + BTC_ANT_PATH_PTA, false, false); + break; + case 1: /* ANT2BT, 0x778=3 */ + halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x0, + 0x0, 0x0, 0x8, 0x0); + delay_ms(5); + halbtc8192e2ant_set_ant_path(btcoexist, + BTC_ANT_PATH_BT, false, false); + break; + + } + } + + /* update pre state */ + coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on; + coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma; +} + +void halbtc8192e2ant_set_switch_ss_type(IN struct btc_coexist *btcoexist, + IN u8 ss_type) +{ + u8 mimo_ps = BTC_MIMO_PS_DYNAMIC; + u32 dis_ra_mask = 0x0; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], REAL set SS Type = %d\n", ss_type); + BTC_TRACE(trace_buf); + + dis_ra_mask = halbtc8192e2ant_decide_ra_mask(btcoexist, ss_type, + coex_dm->cur_ra_mask_type); + halbtc8192e2ant_update_ra_mask(btcoexist, FORCE_EXEC, dis_ra_mask); + + if (ss_type == 1) { + halbtc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1); + /* switch ofdm path */ + btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x11); + btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x1); + btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81111111); + /* switch cck patch */ + /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x1); */ + /* btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x81); */ + mimo_ps = BTC_MIMO_PS_STATIC; + } else if (ss_type == 2) { + halbtc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0); + btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x33); + btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x3); + btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81121313); + /* remove, if 0xe77[2]=0x0 then CCK will fail, advised by Jenyu */ + /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x0); */ + /* btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x41); */ + mimo_ps = BTC_MIMO_PS_DYNAMIC; + } + + btcoexist->btc_set(btcoexist, BTC_SET_ACT_SEND_MIMO_PS, + &mimo_ps); /* set rx 1ss or 2ss */ +} + +void halbtc8192e2ant_switch_ss_type(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 new_ss_type) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], %s Switch SS Type = %d\n", + (force_exec ? "force to" : ""), new_ss_type); + BTC_TRACE(trace_buf); + coex_dm->cur_ss_type = new_ss_type; + + if (!force_exec) { + if (coex_dm->pre_ss_type == coex_dm->cur_ss_type) + return; + } + halbtc8192e2ant_set_switch_ss_type(btcoexist, coex_dm->cur_ss_type); + + coex_dm->pre_ss_type = coex_dm->cur_ss_type; +} + +void halbtc8192e2ant_ps_tdma_check_for_power_save_state( + IN struct btc_coexist *btcoexist, IN boolean new_ps_state) +{ + u8 lps_mode = 0x0; + + btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode); + + if (lps_mode) { /* already under LPS state */ + if (new_ps_state) { + /* keep state under LPS, do nothing. */ + } else { + /* will leave LPS state, turn off psTdma first */ + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 0); + } + } else { /* NO PS state */ + if (new_ps_state) { + /* will enter LPS state, turn off psTdma first */ + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 0); + } else { + /* keep state under NO PS state, do nothing. */ + } + } +} + +void halbtc8192e2ant_power_save_state(IN struct btc_coexist *btcoexist, + IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val) +{ + boolean low_pwr_disable = false; + boolean bApEnable = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); + + if (bApEnable) { + ps_type = BTC_PS_WIFI_NATIVE; + lps_val = 0x0; + rpwm_val = 0x0; + } + switch (ps_type) { + case BTC_PS_WIFI_NATIVE: + btcoexist->btc_set(btcoexist, + BTC_SET_ACT_DISABLE_LOW_POWER, + &low_pwr_disable); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, + NULL); + break; + case BTC_PS_LPS_ON: + halbtc8192e2ant_ps_tdma_check_for_power_save_state( + btcoexist, true); + halbtc8192e2ant_lps_rpwm(btcoexist, NORMAL_EXEC, + lps_val, rpwm_val); + btcoexist->btc_set(btcoexist, + BTC_SET_ACT_DISABLE_LOW_POWER, + &low_pwr_disable); + /* power save must executed before psTdma. */ + btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, + NULL); + break; + default: + break; + } +} + + +void halbtc8192e2ant_coex_all_off(IN struct btc_coexist *btcoexist) +{ + /* fw all off */ + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); + + /* sw all off */ + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + + /* hw all off */ + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); +} + +void halbtc8192e2ant_init_coex_dm(IN struct btc_coexist *btcoexist) +{ + /* force to reset coex mechanism */ + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6); + halbtc8192e2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0); + + halbtc8192e2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); + halbtc8192e2ant_switch_ss_type(btcoexist, FORCE_EXEC, 2); + + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); +} + +void halbtc8192e2ant_action_bt_inquiry(IN struct btc_coexist *btcoexist) +{ + + +/* halbtc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);*/ + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 21); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); + + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); +} + +boolean halbtc8192e2ant_is_common_action(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean common = false, wifi_connected = false, wifi_busy = false; + boolean bt_hs_on = false, low_pwr_disable = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + if (bt_link_info->sco_exist || bt_link_info->hid_exist) + halbtc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 0, 0, 0); + else + halbtc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + + if (!wifi_connected) { + + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi non-connected idle!!\n"); + BTC_TRACE(trace_buf); + + if ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status) || + (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == + coex_dm->bt_status)) { +/* halbtc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 2);*/ + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + } else { +/* halbtc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);*/ + halbtc8192e2ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 1); + } + + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); + + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, + false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, + 0x18); + + common = true; + } else { + if (BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status) { + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi connected + BT non connected-idle!!\n"); + BTC_TRACE(trace_buf); + + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); +/* halbtc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 2);*/ + + halbtc8192e2ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 1); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 0); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, + 6); + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); + + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, + false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, + false, 0x18); + + common = true; + } else if (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == + coex_dm->bt_status) { + + if (bt_hs_on) + return false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi connected + BT connected-idle!!\n"); + BTC_TRACE(trace_buf); + + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); +/* halbtc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 2);*/ + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 0); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, + 6); + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); + + halbtc8192e2ant_sw_mechanism1(btcoexist, true, false, + false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, + false, 0x18); + + common = true; + } else { + + if (wifi_busy) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi Connected-Busy + BT Busy!!\n"); + BTC_TRACE(trace_buf); + common = false; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi Connected-Idle + BT Busy!!\n"); + BTC_TRACE(trace_buf); + + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); +/* halbtc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);*/ + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 21); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, + NORMAL_EXEC, 6); + halbtc8192e2ant_dec_bt_pwr(btcoexist, + NORMAL_EXEC, 0); + halbtc8192e2ant_sw_mechanism1(btcoexist, false, + false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, + false, false, 0x18); + common = true; + } + } + } + + return common; +} +void halbtc8192e2ant_tdma_duration_adjust(IN struct btc_coexist *btcoexist, + IN boolean sco_hid, IN boolean tx_pause, IN u8 max_interval) +{ + static s32 up, dn, m, n, wait_count; + s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */ + u8 retry_count = 0; + + + if (!coex_dm->auto_tdma_adjust) { + coex_dm->auto_tdma_adjust = true; + { + if (sco_hid) { + if (tx_pause) { + if (max_interval == 1) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 13); + coex_dm->ps_tdma_du_adj_type = + 13; + } else if (max_interval == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 14); + coex_dm->ps_tdma_du_adj_type = + 14; + } else if (max_interval == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } else { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } + } else { + if (max_interval == 1) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 9); + coex_dm->ps_tdma_du_adj_type = + 9; + } else if (max_interval == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 10); + coex_dm->ps_tdma_du_adj_type = + 10; + } else if (max_interval == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } else { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } + } + } else { + if (tx_pause) { + if (max_interval == 1) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 5); + coex_dm->ps_tdma_du_adj_type = + 5; + } else if (max_interval == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 6); + coex_dm->ps_tdma_du_adj_type = + 6; + } else if (max_interval == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } + } else { + if (max_interval == 1) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 1); + coex_dm->ps_tdma_du_adj_type = + 1; + } else if (max_interval == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = + 2; + } else if (max_interval == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } + } + } + } + /* ============ */ + up = 0; + dn = 0; + m = 1; + n = 3; + result = 0; + wait_count = 0; + } else { + /* accquire the BT TRx retry count from BT_Info byte2 */ + retry_count = coex_sta->bt_retry_cnt; + result = 0; + wait_count++; + + if (retry_count == + 0) { /* no retry in the last 2-second duration */ + up++; + dn--; + + if (dn <= 0) + dn = 0; + + if (up >= n) { /* if retry count during continuous n*2 seconds is 0, enlarge WiFi duration */ + wait_count = 0; + n = 3; + up = 0; + dn = 0; + result = 1; + } + } else if (retry_count <= + 3) { /* <=3 retry in the last 2-second duration */ + up--; + dn++; + + if (up <= 0) + up = 0; + + if (dn == 2) { /* if continuous 2 retry count(every 2 seconds) >0 and < 3, reduce WiFi duration */ + if (wait_count <= 2) + m++; /* to avoid loop between the two levels */ + else + m = 1; + + if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */ + m = 20; + + n = 3 * m; + up = 0; + dn = 0; + wait_count = 0; + result = -1; + } + } else { /* retry count > 3, once retry count > 3, to reduce WiFi duration */ + if (wait_count == 1) + m++; /* to avoid loop between the two levels */ + else + m = 1; + + if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */ + m = 20; + + n = 3 * m; + up = 0; + dn = 0; + wait_count = 0; + result = -1; + } + + if (max_interval == 1) { + if (tx_pause) { + if (coex_dm->cur_ps_tdma == 1) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 5); + coex_dm->ps_tdma_du_adj_type = 5; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 6); + coex_dm->ps_tdma_du_adj_type = 6; + } else if (coex_dm->cur_ps_tdma == 3) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 7); + coex_dm->ps_tdma_du_adj_type = 7; + } else if (coex_dm->cur_ps_tdma == 4) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 8); + coex_dm->ps_tdma_du_adj_type = 8; + } + if (coex_dm->cur_ps_tdma == 9) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 13); + coex_dm->ps_tdma_du_adj_type = 13; + } else if (coex_dm->cur_ps_tdma == 10) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 14); + coex_dm->ps_tdma_du_adj_type = 14; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 15); + coex_dm->ps_tdma_du_adj_type = 15; + } else if (coex_dm->cur_ps_tdma == 12) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 16); + coex_dm->ps_tdma_du_adj_type = 16; + } + + if (result == -1) { + if (coex_dm->cur_ps_tdma == 5) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 6); + coex_dm->ps_tdma_du_adj_type = + 6; + } else if (coex_dm->cur_ps_tdma == 6) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else if (coex_dm->cur_ps_tdma == 7) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 8); + coex_dm->ps_tdma_du_adj_type = + 8; + } else if (coex_dm->cur_ps_tdma == 13) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 14); + coex_dm->ps_tdma_du_adj_type = + 14; + } else if (coex_dm->cur_ps_tdma == 14) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } else if (coex_dm->cur_ps_tdma == 15) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 16); + coex_dm->ps_tdma_du_adj_type = + 16; + } + } else if (result == 1) { + if (coex_dm->cur_ps_tdma == 8) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else if (coex_dm->cur_ps_tdma == 7) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 6); + coex_dm->ps_tdma_du_adj_type = + 6; + } else if (coex_dm->cur_ps_tdma == 6) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 5); + coex_dm->ps_tdma_du_adj_type = + 5; + } else if (coex_dm->cur_ps_tdma == 16) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } else if (coex_dm->cur_ps_tdma == 15) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 14); + coex_dm->ps_tdma_du_adj_type = + 14; + } else if (coex_dm->cur_ps_tdma == 14) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 13); + coex_dm->ps_tdma_du_adj_type = + 13; + } + } + } else { + if (coex_dm->cur_ps_tdma == 5) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 1); + coex_dm->ps_tdma_du_adj_type = 1; + } else if (coex_dm->cur_ps_tdma == 6) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 2); + coex_dm->ps_tdma_du_adj_type = 2; + } else if (coex_dm->cur_ps_tdma == 7) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 3); + coex_dm->ps_tdma_du_adj_type = 3; + } else if (coex_dm->cur_ps_tdma == 8) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 4); + coex_dm->ps_tdma_du_adj_type = 4; + } + if (coex_dm->cur_ps_tdma == 13) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 9); + coex_dm->ps_tdma_du_adj_type = 9; + } else if (coex_dm->cur_ps_tdma == 14) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 10); + coex_dm->ps_tdma_du_adj_type = 10; + } else if (coex_dm->cur_ps_tdma == 15) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 11); + coex_dm->ps_tdma_du_adj_type = 11; + } else if (coex_dm->cur_ps_tdma == 16) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 12); + coex_dm->ps_tdma_du_adj_type = 12; + } + + if (result == -1) { + if (coex_dm->cur_ps_tdma == 1) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = + 2; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else if (coex_dm->cur_ps_tdma == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 4); + coex_dm->ps_tdma_du_adj_type = + 4; + } else if (coex_dm->cur_ps_tdma == 9) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 10); + coex_dm->ps_tdma_du_adj_type = + 10; + } else if (coex_dm->cur_ps_tdma == 10) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 12); + coex_dm->ps_tdma_du_adj_type = + 12; + } + } else if (result == 1) { + if (coex_dm->cur_ps_tdma == 4) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else if (coex_dm->cur_ps_tdma == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = + 2; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 1); + coex_dm->ps_tdma_du_adj_type = + 1; + } else if (coex_dm->cur_ps_tdma == 1) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 71); + coex_dm->ps_tdma_du_adj_type = + 71; + } else if (coex_dm->cur_ps_tdma == 12) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 10); + coex_dm->ps_tdma_du_adj_type = + 10; + } else if (coex_dm->cur_ps_tdma == 10) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 9); + coex_dm->ps_tdma_du_adj_type = + 9; + } + } + } + } else if (max_interval == 2) { + if (tx_pause) { + if (coex_dm->cur_ps_tdma == 1) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 6); + coex_dm->ps_tdma_du_adj_type = 6; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 6); + coex_dm->ps_tdma_du_adj_type = 6; + } else if (coex_dm->cur_ps_tdma == 3) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 7); + coex_dm->ps_tdma_du_adj_type = 7; + } else if (coex_dm->cur_ps_tdma == 4) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 8); + coex_dm->ps_tdma_du_adj_type = 8; + } + if (coex_dm->cur_ps_tdma == 9) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 14); + coex_dm->ps_tdma_du_adj_type = 14; + } else if (coex_dm->cur_ps_tdma == 10) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 14); + coex_dm->ps_tdma_du_adj_type = 14; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 15); + coex_dm->ps_tdma_du_adj_type = 15; + } else if (coex_dm->cur_ps_tdma == 12) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 16); + coex_dm->ps_tdma_du_adj_type = 16; + } + if (result == -1) { + if (coex_dm->cur_ps_tdma == 5) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 6); + coex_dm->ps_tdma_du_adj_type = + 6; + } else if (coex_dm->cur_ps_tdma == 6) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else if (coex_dm->cur_ps_tdma == 7) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 8); + coex_dm->ps_tdma_du_adj_type = + 8; + } else if (coex_dm->cur_ps_tdma == 13) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 14); + coex_dm->ps_tdma_du_adj_type = + 14; + } else if (coex_dm->cur_ps_tdma == 14) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } else if (coex_dm->cur_ps_tdma == 15) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 16); + coex_dm->ps_tdma_du_adj_type = + 16; + } + } else if (result == 1) { + if (coex_dm->cur_ps_tdma == 8) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else if (coex_dm->cur_ps_tdma == 7) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 6); + coex_dm->ps_tdma_du_adj_type = + 6; + } else if (coex_dm->cur_ps_tdma == 6) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 6); + coex_dm->ps_tdma_du_adj_type = + 6; + } else if (coex_dm->cur_ps_tdma == 16) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } else if (coex_dm->cur_ps_tdma == 15) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 14); + coex_dm->ps_tdma_du_adj_type = + 14; + } else if (coex_dm->cur_ps_tdma == 14) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 14); + coex_dm->ps_tdma_du_adj_type = + 14; + } + } + } else { + if (coex_dm->cur_ps_tdma == 5) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 2); + coex_dm->ps_tdma_du_adj_type = 2; + } else if (coex_dm->cur_ps_tdma == 6) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 2); + coex_dm->ps_tdma_du_adj_type = 2; + } else if (coex_dm->cur_ps_tdma == 7) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 3); + coex_dm->ps_tdma_du_adj_type = 3; + } else if (coex_dm->cur_ps_tdma == 8) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 4); + coex_dm->ps_tdma_du_adj_type = 4; + } + if (coex_dm->cur_ps_tdma == 13) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 10); + coex_dm->ps_tdma_du_adj_type = 10; + } else if (coex_dm->cur_ps_tdma == 14) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 10); + coex_dm->ps_tdma_du_adj_type = 10; + } else if (coex_dm->cur_ps_tdma == 15) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 11); + coex_dm->ps_tdma_du_adj_type = 11; + } else if (coex_dm->cur_ps_tdma == 16) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 12); + coex_dm->ps_tdma_du_adj_type = 12; + } + if (result == -1) { + if (coex_dm->cur_ps_tdma == 1) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = + 2; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else if (coex_dm->cur_ps_tdma == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 4); + coex_dm->ps_tdma_du_adj_type = + 4; + } else if (coex_dm->cur_ps_tdma == 9) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 10); + coex_dm->ps_tdma_du_adj_type = + 10; + } else if (coex_dm->cur_ps_tdma == 10) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 12); + coex_dm->ps_tdma_du_adj_type = + 12; + } + } else if (result == 1) { + if (coex_dm->cur_ps_tdma == 4) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else if (coex_dm->cur_ps_tdma == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = + 2; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = + 2; + } else if (coex_dm->cur_ps_tdma == 12) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 10); + coex_dm->ps_tdma_du_adj_type = + 10; + } else if (coex_dm->cur_ps_tdma == 10) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 10); + coex_dm->ps_tdma_du_adj_type = + 10; + } + } + } + } else if (max_interval == 3) { + if (tx_pause) { + if (coex_dm->cur_ps_tdma == 1) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 7); + coex_dm->ps_tdma_du_adj_type = 7; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 7); + coex_dm->ps_tdma_du_adj_type = 7; + } else if (coex_dm->cur_ps_tdma == 3) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 7); + coex_dm->ps_tdma_du_adj_type = 7; + } else if (coex_dm->cur_ps_tdma == 4) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 8); + coex_dm->ps_tdma_du_adj_type = 8; + } + if (coex_dm->cur_ps_tdma == 9) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 15); + coex_dm->ps_tdma_du_adj_type = 15; + } else if (coex_dm->cur_ps_tdma == 10) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 15); + coex_dm->ps_tdma_du_adj_type = 15; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 15); + coex_dm->ps_tdma_du_adj_type = 15; + } else if (coex_dm->cur_ps_tdma == 12) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 16); + coex_dm->ps_tdma_du_adj_type = 16; + } + if (result == -1) { + if (coex_dm->cur_ps_tdma == 5) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else if (coex_dm->cur_ps_tdma == 6) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else if (coex_dm->cur_ps_tdma == 7) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 8); + coex_dm->ps_tdma_du_adj_type = + 8; + } else if (coex_dm->cur_ps_tdma == 13) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } else if (coex_dm->cur_ps_tdma == 14) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } else if (coex_dm->cur_ps_tdma == 15) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 16); + coex_dm->ps_tdma_du_adj_type = + 16; + } + } else if (result == 1) { + if (coex_dm->cur_ps_tdma == 8) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else if (coex_dm->cur_ps_tdma == 7) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else if (coex_dm->cur_ps_tdma == 6) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 7); + coex_dm->ps_tdma_du_adj_type = + 7; + } else if (coex_dm->cur_ps_tdma == 16) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } else if (coex_dm->cur_ps_tdma == 15) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } else if (coex_dm->cur_ps_tdma == 14) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 15); + coex_dm->ps_tdma_du_adj_type = + 15; + } + } + } else { + if (coex_dm->cur_ps_tdma == 5) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 3); + coex_dm->ps_tdma_du_adj_type = 3; + } else if (coex_dm->cur_ps_tdma == 6) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 3); + coex_dm->ps_tdma_du_adj_type = 3; + } else if (coex_dm->cur_ps_tdma == 7) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 3); + coex_dm->ps_tdma_du_adj_type = 3; + } else if (coex_dm->cur_ps_tdma == 8) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 4); + coex_dm->ps_tdma_du_adj_type = 4; + } + if (coex_dm->cur_ps_tdma == 13) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 11); + coex_dm->ps_tdma_du_adj_type = 11; + } else if (coex_dm->cur_ps_tdma == 14) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 11); + coex_dm->ps_tdma_du_adj_type = 11; + } else if (coex_dm->cur_ps_tdma == 15) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 11); + coex_dm->ps_tdma_du_adj_type = 11; + } else if (coex_dm->cur_ps_tdma == 16) { + halbtc8192e2ant_ps_tdma(btcoexist, + NORMAL_EXEC, true, 12); + coex_dm->ps_tdma_du_adj_type = 12; + } + if (result == -1) { + if (coex_dm->cur_ps_tdma == 1) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else if (coex_dm->cur_ps_tdma == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 4); + coex_dm->ps_tdma_du_adj_type = + 4; + } else if (coex_dm->cur_ps_tdma == 9) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } else if (coex_dm->cur_ps_tdma == 10) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 12); + coex_dm->ps_tdma_du_adj_type = + 12; + } + } else if (result == 1) { + if (coex_dm->cur_ps_tdma == 4) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else if (coex_dm->cur_ps_tdma == 3) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 3); + coex_dm->ps_tdma_du_adj_type = + 3; + } else if (coex_dm->cur_ps_tdma == 12) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } else if (coex_dm->cur_ps_tdma == 11) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } else if (coex_dm->cur_ps_tdma == 10) { + halbtc8192e2ant_ps_tdma( + btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = + 11; + } + } + } + } + } + + /* if current PsTdma not match with the recorded one (when scan, dhcp...), */ + /* then we have to adjust it back to the previous record one. */ + if (coex_dm->cur_ps_tdma != coex_dm->ps_tdma_du_adj_type) { + boolean scan = false, link = false, roam = false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], PsTdma type dismatch!!!, cur_ps_tdma=%d, recordPsTdma=%d\n", + coex_dm->cur_ps_tdma, coex_dm->ps_tdma_du_adj_type); + BTC_TRACE(trace_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); + + if (!scan && !link && !roam) + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + coex_dm->ps_tdma_du_adj_type); + else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"); + BTC_TRACE(trace_buf); + } + } +} + +/* ****************** + * pstdma for wifi rssi low + * ****************** */ +void halbtc8192e2ant_tdma_duration_adjust_for_wifi_rssi_low( + IN struct btc_coexist *btcoexist/* , */ /* IN u8 wifi_status */) +{ + static s32 up, dn, m, n, wait_count; + s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */ + u8 retry_count = 0, bt_info_ext; + + coex_dm->auto_tdma_adjust = false; + + retry_count = coex_sta->bt_retry_cnt; + bt_info_ext = coex_sta->bt_info_ext; + + if (!coex_dm->auto_tdma_adjust_low_rssi) { + coex_dm->auto_tdma_adjust_low_rssi = true; + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 81); + coex_dm->ps_tdma_du_adj_type = 81; + /* ============ */ + up = 0; + dn = 0; + m = 1; + n = 3; + result = 0; + wait_count = 0; + } else { + /*acquire the BT TRx retry count from BT_Info byte2*/ + /* retry_count = coex_sta->bt_retry_cnt;*/ + /* bt_info_ext = coex_sta->bt_info_ext; */ + result = 0; + wait_count++; + + if ((coex_sta->low_priority_tx) > 1050 || + (coex_sta->low_priority_rx) > 1250) + retry_count++; + + if (retry_count == + 0) { /* no retry in the last 2-second duration */ + up++; + dn--; + + if (dn <= 0) + dn = 0; + + if (up >= n) { /* if retry count during continuous n*2 seconds is 0, enlarge WiFi duration */ + wait_count = 0; + n = 3; + up = 0; + dn = 0; + result = 1; + } + } else if (retry_count <= + 3) { /* <=3 retry in the last 2-second duration */ + up--; + dn++; + + if (up <= 0) + up = 0; + + if (dn == 2) { /* if continuous 2 retry count(every 2 seconds) >0 and < 3, reduce WiFi duration */ + if (wait_count <= 2) + m++; /* to avoid loop between the two levels */ + else + m = 1; + + if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */ + m = 20; + + n = 3 * m; + up = 0; + dn = 0; + wait_count = 0; + result = -1; + } + } else { /* retry count > 3, once retry count > 3, to reduce WiFi duration */ + if (wait_count == 1) + m++; /* to avoid loop between the two levels */ + else + m = 1; + + if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */ + m = 20; + + n = 3 * m; + up = 0; + dn = 0; + wait_count = 0; + result = -1; + } + + if (result == -1) { + if (coex_dm->cur_ps_tdma == 80) { + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 81); + coex_dm->ps_tdma_du_adj_type = 81; + } else if (coex_dm->cur_ps_tdma == 81) { + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 82); + coex_dm->ps_tdma_du_adj_type = 82; + } else if (coex_dm->cur_ps_tdma == 82) { + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 83); + coex_dm->ps_tdma_du_adj_type = 83; + } else if (coex_dm->cur_ps_tdma == 83) { + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 84); + coex_dm->ps_tdma_du_adj_type = 84; + } + } else if (result == 1) { + if (coex_dm->cur_ps_tdma == 84) { + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 83); + coex_dm->ps_tdma_du_adj_type = 83; + } else if (coex_dm->cur_ps_tdma == 83) { + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 82); + coex_dm->ps_tdma_du_adj_type = 82; + } else if (coex_dm->cur_ps_tdma == 82) { + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 81); + coex_dm->ps_tdma_du_adj_type = 81; + } else if ((coex_dm->cur_ps_tdma == 81) && (coex_sta->scan_ap_num <= 5)) { + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 81); + coex_dm->ps_tdma_du_adj_type = 81; + } + } + + if (coex_dm->cur_ps_tdma != 80 && + coex_dm->cur_ps_tdma != 81 && + coex_dm->cur_ps_tdma != 82 && + coex_dm->cur_ps_tdma != 83 && + coex_dm->cur_ps_tdma != 84) { + /* recover to previous adjust type */ + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + coex_dm->ps_tdma_du_adj_type); + } + } +} + + +void halbtc8192e2ant_get_bt_rssi_threshold(IN struct btc_coexist *btcoexist, + IN u8 *pThres0, IN u8 *pThres1) +{ + u8 ant_type; + + struct btc_board_info *board_info = &btcoexist->board_info; + + ant_type = board_info->ant_type; + + switch (ant_type) { + 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; + } +} + + + + +/* SCO only or SCO+PAN(HS) */ +void halbtc8192e2ant_action_sco(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; + u32 wifi_bw; + u8 btThresh0 = 0, btThresh1 = 0; + + halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &btThresh0, &btThresh1); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, btThresh0, btThresh1); + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + else + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + else + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); +} + +void halbtc8192e2ant_action_sco_pan(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; + u32 wifi_bw; + u8 btThresh0 = 0, btThresh1 = 0; + + + halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &btThresh0, &btThresh1); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, btThresh0, btThresh1); + + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); + + if ((BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))) + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + else + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + + + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10); + else + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 86); + + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num < NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num > NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); +} + + +void halbtc8192e2ant_action_hid(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; + u32 wifi_bw; + u8 anttype = 0; + + btcoexist->btc_get(btcoexist, BTC_GET_U1_ANT_TYPE, &anttype); + + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42); + + if (anttype == 0) { + /*ANTTYPE = 0 92E 2ant with SPDT*/ + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } else if (anttype == 1) { + /*92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation*/ + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } else if (anttype == 2) { + /*ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation*/ + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3); + } else { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3); + } + } else if (anttype == 3) { + /*ANTTYPE = 3, 92E 3ant with good ant. isolation*/ + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } else { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } + } + + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); +} + +/* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */ +void halbtc8192e2ant_action_a2dp(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; + u32 wifi_bw; + boolean long_dist = false; + u8 anttype = 0; + + btcoexist->btc_get(btcoexist, BTC_GET_U1_ANT_TYPE, &anttype); + + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42); + + if (anttype == 0) { + /*ANTTYPE = 0 92E 2ant with SPDT*/ + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 87); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7); + } else if (anttype == 1) { + /*92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation*/ + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 25); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7); + } else { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 87); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7); + } + } else if (anttype == 2) { + /*ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation*/ + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5); + } else { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 87); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7); + } + } else if (anttype == 3) { + /*ANTTYPE = 3, 92E 3ant with good ant. isolation*/ + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } + + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num < NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num > NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, true, 0x06); + else + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); +} + +void halbtc8192e2ant_action_a2dp_pan_hs(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; + u32 wifi_bw; + + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42); + + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + + if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || + (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { + halbtc8192e2ant_tdma_duration_adjust(btcoexist, false, true, 2); + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); + } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || + (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { + halbtc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 2); + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); + } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || + (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { + halbtc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 2); + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); + } + + /* sw mechanism */ + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); + if (BTC_WIFI_BW_HT40 == wifi_bw) { + if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || + (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { + halbtc8192e2ant_sw_mechanism1(btcoexist, true, false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, true, false, true, 0x6); + } else { + halbtc8192e2ant_sw_mechanism1(btcoexist, true, false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, true, 0x6); + } + } else { + if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || + (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, true, false, true, 0x6); + } else { + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, true, 0x6); + } + } +} + +void halbtc8192e2ant_action_pan_edr(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; + u32 wifi_bw; + u8 btThresh0 = 0, btThresh1 = 0; + + halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &btThresh0, &btThresh1); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, btThresh0, btThresh1); + /*wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0);*/ + wifi_rssi_state = BTC_RSSI_STATE_LOW; + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + else + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1); + else + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 85); + + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num < NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num > NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); +} + +/* PAN(HS) only */ +void halbtc8192e2ant_action_pan_hs(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; + u32 wifi_bw; + + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, + 0); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42); + + /* halbtc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);*/ + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + + if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || + (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); + else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || + (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); + else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || + (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) + halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); + if (BTC_WIFI_BW_HT40 == wifi_bw) { + if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || + (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { + halbtc8192e2ant_sw_mechanism1(btcoexist, true, false, + false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, true, false, + false, 0x18); + } else { + halbtc8192e2ant_sw_mechanism1(btcoexist, true, false, + false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, + false, 0x18); + } + } else { + if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || + (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, + false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, true, false, + false, 0x18); + } else { + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, + false, false); + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, + false, 0x18); + } + } +} + +/* PAN(EDR)+A2DP */ +void halbtc8192e2ant_action_pan_edr_a2dp(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; + u32 wifi_bw; + u8 btThresh0 = 0, btThresh1 = 0; + + halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &btThresh0, &btThresh1); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, btThresh0, btThresh1); + /*wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0);*/ + wifi_rssi_state = BTC_RSSI_STATE_LOW; + + if ((BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))) + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + else + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 4); + else + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 86); + + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num < NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num > NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + +} + +void halbtc8192e2ant_action_pan_edr_hid(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; + u32 wifi_bw; + u8 btThresh0 = 0, btThresh1 = 0; + + halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &btThresh0, &btThresh1); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, btThresh0, btThresh1); + + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); + + if ((BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))) + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3); + else + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10); + else + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 86); + + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num < NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num > NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + + +} + +/* HID+A2DP+PAN(EDR) */ +void halbtc8192e2ant_action_hid_a2dp_pan_edr(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; + u32 wifi_bw; + u8 btThresh0 = 0, btThresh1 = 0; + + halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &btThresh0, &btThresh1); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, btThresh0, btThresh1); + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); + + if ((BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))) + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3); + else + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 4); + else + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 86); + + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num < NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num > NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); +} + +void halbtc8192e2ant_action_hid_a2dp(IN struct btc_coexist *btcoexist) +{ + u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; + u32 wifi_bw; + u8 btThresh0 = 0, btThresh1 = 0, anttype = 0; + + btcoexist->btc_get(btcoexist, BTC_GET_U1_ANT_TYPE, &anttype); + + wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); + bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42); + + if (anttype == 0) { + /*92E 2ant with SPDT*/ + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 87); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8); + + } else if (anttype == 1) { + /*92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation*/ + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 25); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8); + } else { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 87); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8); + } + } else if (anttype == 2) { + /*ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation*/ + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 25); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8); + } else { + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 87); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8); + } + } else if (anttype == 3) { + /*ANTTYPE = 3, 92E 3ant with good ant. isolation*/ + halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); + halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } + + halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); + halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); + halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); + if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num < NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); + else if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) && + (coex_sta->scan_ap_num > NOISY_AP_NUM_THRESH_8192E)) + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, true, 0x06); + else + halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); +} + +void halbtc8192e2ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist) +{ + u8 algorithm = 0; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism()===>\n"); + BTC_TRACE(trace_buf); + + if (btcoexist->manual_control) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n"); + BTC_TRACE(trace_buf); + return; + } + + if (coex_sta->under_ips) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi is under IPS !!!\n"); + BTC_TRACE(trace_buf); + return; + } + + algorithm = halbtc8192e2ant_action_algorithm(btcoexist); + if (coex_sta->c2h_bt_inquiry_page && + (BT_8192E_2ANT_COEX_ALGO_PANHS != algorithm)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is under inquiry/page scan !!\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_bt_inquiry(btcoexist); + return; + } + + coex_dm->cur_algorithm = algorithm; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Algorithm = %d\n", + coex_dm->cur_algorithm); + BTC_TRACE(trace_buf); + + if (halbtc8192e2ant_is_common_action(btcoexist)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant common.\n"); + BTC_TRACE(trace_buf); + coex_dm->auto_tdma_adjust = false; + coex_dm->auto_tdma_adjust_low_rssi = false; + + } else { + if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], pre_algorithm=%d, cur_algorithm=%d\n", + coex_dm->pre_algorithm, coex_dm->cur_algorithm); + BTC_TRACE(trace_buf); + coex_dm->auto_tdma_adjust = false; + coex_dm->auto_tdma_adjust_low_rssi = false; + + } + switch (coex_dm->cur_algorithm) { + case BT_8192E_2ANT_COEX_ALGO_SCO: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = SCO.\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_sco(btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_SCO_PAN: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = SCO+PAN(EDR).\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_sco_pan(btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_HID: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = HID.\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_hid(btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_A2DP: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = A2DP.\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_a2dp(btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_a2dp_pan_hs(btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_PANEDR: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_pan_edr(btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_PANHS: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = HS mode.\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_pan_hs(btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_pan_edr_a2dp(btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_PANEDR_HID: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_pan_edr_hid(btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_hid_a2dp_pan_edr( + btcoexist); + break; + case BT_8192E_2ANT_COEX_ALGO_HID_A2DP: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_action_hid_a2dp(btcoexist); + break; + default: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action 2-Ant, algorithm = unknown!!\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_coex_all_off(btcoexist); + break; + } + coex_dm->pre_algorithm = coex_dm->cur_algorithm; + } +} + +void halbtc8192e2ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean back_up) +{ + u16 u16tmp = 0; + u8 u8tmp = 0; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], 2Ant Init HW Config!!\n"); + BTC_TRACE(trace_buf); + + if (back_up) { + /* backup rf 0x1e value */ + coex_dm->bt_rf_0x1e_backup = + btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, + 0xfffff); + + coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist, + 0x430); + coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist, + 0x434); + coex_dm->backup_retry_limit = btcoexist->btc_read_2byte( + btcoexist, 0x42a); + coex_dm->backup_ampdu_max_time = btcoexist->btc_read_1byte( + btcoexist, 0x456); + } + + /* antenna sw ctrl to bt */ + halbtc8192e2ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, true, false); + + halbtc8192e2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); + + /* antenna switch control parameter */ + btcoexist->btc_write_4byte(btcoexist, 0x858, 0x55555555); + + /* coex parameters */ + btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3); + /* 0x790[5:0]=0x5 */ + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790); + u8tmp &= 0xc0; + u8tmp |= 0x5; + btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp); + + /* enable counter statistics */ + btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4); + + /* enable PTA */ + btcoexist->btc_write_1byte(btcoexist, 0x40, 0x20); + /* enable mailbox interface */ + u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x40); + u16tmp |= BIT(9); + btcoexist->btc_write_2byte(btcoexist, 0x40, u16tmp); + + /* enable PTA I2C mailbox */ + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x101); + u8tmp |= BIT(4); + btcoexist->btc_write_1byte(btcoexist, 0x101, u8tmp); + + /* enable bt clock when wifi is disabled. */ + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x93); + u8tmp |= BIT(0); + btcoexist->btc_write_1byte(btcoexist, 0x93, u8tmp); + /* enable bt clock when suspend. */ + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x7); + u8tmp |= BIT(0); + btcoexist->btc_write_1byte(btcoexist, 0x7, u8tmp); +} + +/* ************************************************************ + * work around function start with wa_halbtc8192e2ant_ + * ************************************************************ + * ************************************************************ + * extern function start with ex_halbtc8192e2ant_ + * ************************************************************ */ +void ex_halbtc8192e2ant_power_on_setting(IN struct btc_coexist *btcoexist) +{ +} + +void ex_halbtc8192e2ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean wifi_only) +{ + halbtc8192e2ant_init_hw_config(btcoexist, true); +} + +void ex_halbtc8192e2ant_init_coex_dm(IN struct btc_coexist *btcoexist) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Coex Mechanism Init!!\n"); + BTC_TRACE(trace_buf); + + halbtc8192e2ant_init_coex_dm(btcoexist); +} + +void ex_halbtc8192e2ant_display_coex_info(IN struct btc_coexist *btcoexist) +{ + struct btc_board_info *board_info = &btcoexist->board_info; + struct btc_stack_info *stack_info = &btcoexist->stack_info; + u8 *cli_buf = btcoexist->cli_buf; + u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0; + u16 u16tmp[4]; + u32 u32tmp[4]; + u32 fw_ver = 0, bt_patch_ver = 0; + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[BT Coexist info]============"); + CL_PRINTF(cli_buf); + + if (btcoexist->manual_control) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[Under Manual Control]============"); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n =========================================="); + CL_PRINTF(cli_buf); + } + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", + "Ant PG number/ Ant mechanism:", + board_info->pg_ant_num, board_info->btdm_ant_num); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Antenna type:", + board_info->ant_type); + CL_PRINTF(cli_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)", + "CoexVer/ FwVer/ PatchVer", + glcoex_ver_date_8192e_2ant, glcoex_ver_8192e_2ant, fw_ver, + bt_patch_ver, bt_patch_ver); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", + "Wifi channel informed to BT", + coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1], + coex_dm->wifi_chnl_info[2]); + CL_PRINTF(cli_buf); + + /* wifi status */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Wifi Status]============"); + CL_PRINTF(cli_buf); + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[BT Status]============"); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", + "BT [status/ rssi/ retryCnt]", + ((coex_sta->bt_disabled) ? ("disabled") : (( + coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") + : ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status) ? "non-connected idle" : + ((BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) + ? "connected-idle" : "busy")))), + coex_sta->bt_rssi, coex_sta->bt_retry_cnt); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", + "SCO/HID/PAN/A2DP", + stack_info->sco_exist, stack_info->hid_exist, + stack_info->pan_exist, stack_info->a2dp_exist); + CL_PRINTF(cli_buf); + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO); + + bt_info_ext = coex_sta->bt_info_ext; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", + "BT Info A2DP rate", + (bt_info_ext & BIT(0)) ? "Basic rate" : "EDR rate"); + CL_PRINTF(cli_buf); + + for (i = 0; i < BT_INFO_SRC_8192E_2ANT_MAX; i++) { + if (coex_sta->bt_info_c2h_cnt[i]) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", + glbt_info_src_8192e_2ant[i], + coex_sta->bt_info_c2h[i][0], + coex_sta->bt_info_c2h[i][1], + coex_sta->bt_info_c2h[i][2], + coex_sta->bt_info_c2h[i][3], + coex_sta->bt_info_c2h[i][4], + coex_sta->bt_info_c2h[i][5], + coex_sta->bt_info_c2h[i][6], + coex_sta->bt_info_c2h_cnt[i]); + CL_PRINTF(cli_buf); + } + } + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "SS Type", + coex_dm->cur_ss_type); + CL_PRINTF(cli_buf); + + /* Sw mechanism */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Sw mechanism]============"); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", + "SM1[ShRf/ LpRA/ LimDig]", + coex_dm->cur_rf_rx_lpf_shrink, coex_dm->cur_low_penalty_ra, + coex_dm->limited_dig); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ", + "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", + coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off, + coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl); + CL_PRINTF(cli_buf); + + /* Fw mechanism */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Fw mechanism]============"); + CL_PRINTF(cli_buf); + + ps_tdma_case = coex_dm->cur_ps_tdma; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)", + "PS TDMA", + coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1], + coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3], + coex_dm->ps_tdma_para[4], ps_tdma_case, + coex_dm->auto_tdma_adjust); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", + "DecBtPwr/ IgnWlanAct", + coex_dm->cur_bt_dec_pwr_lvl, coex_dm->cur_ignore_wlan_act); + CL_PRINTF(cli_buf); + + /* Hw setting */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Hw setting]============"); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", + "RF-A, 0x1e initVal", + coex_dm->bt_rf_0x1e_backup); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", + "backup ARFR1/ARFR2/RL/AMaxTime", + coex_dm->backup_arfr_cnt1, coex_dm->backup_arfr_cnt2, + coex_dm->backup_retry_limit, + coex_dm->backup_ampdu_max_time); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434); + u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", + "0x430/0x434/0x42a/0x456", + u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc04); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xd04); + u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x90c); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", + "0xc04/ 0xd04/ 0x90c", + u32tmp[0], u32tmp[1], u32tmp[2]); + CL_PRINTF(cli_buf); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x778", + u8tmp[0]); + CL_PRINTF(cli_buf); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x92c); + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x930); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "0x92c/ 0x930", + (u8tmp[0]), u32tmp[0]); + CL_PRINTF(cli_buf); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40); + u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x4f); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "0x40/ 0x4f", + u8tmp[0], u8tmp[1]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "0x550(bcn ctrl)/0x522", + u32tmp[0], u8tmp[0]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0xc50(dig)", + u32tmp[0]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4); + u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", + "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", + u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", + "0x770(hp rx[31:16]/tx[15:0])", + coex_sta->high_priority_rx, coex_sta->high_priority_tx); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", + "0x774(lp rx[31:16]/tx[15:0])", + coex_sta->low_priority_rx, coex_sta->low_priority_tx); + CL_PRINTF(cli_buf); +#if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 1) + halbtc8192e2ant_monitor_bt_ctr(btcoexist); +#endif + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS); +} + + +void ex_halbtc8192e2ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type) +{ + if (BTC_IPS_ENTER == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], IPS ENTER notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_ips = true; + halbtc8192e2ant_coex_all_off(btcoexist); + halbtc8192e2ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, + true); + } else if (BTC_IPS_LEAVE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], IPS LEAVE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_ips = false; + } +} + +void ex_halbtc8192e2ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type) +{ + if (BTC_LPS_ENABLE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], LPS ENABLE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_lps = true; + } else if (BTC_LPS_DISABLE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], LPS DISABLE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_lps = false; + } +} + +void ex_halbtc8192e2ant_scan_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + if (BTC_SCAN_START == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCAN START notify\n"); + BTC_TRACE(trace_buf); + } else if (BTC_SCAN_FINISH == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCAN FINISH notify\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &coex_sta->scan_ap_num); + + } +} + +void ex_halbtc8192e2ant_connect_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + if (BTC_ASSOCIATE_START == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CONNECT START notify\n"); + BTC_TRACE(trace_buf); + } else if (BTC_ASSOCIATE_FINISH == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CONNECT FINISH notify\n"); + BTC_TRACE(trace_buf); + } +} + +void ex_halbtc8192e2ant_media_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + u8 h2c_parameter[3] = {0}; + u32 wifi_bw; + u8 wifi_central_chnl; + + if (btcoexist->manual_control || + btcoexist->stop_coex_dm || + coex_sta->bt_disabled) + return; + + if (BTC_MEDIA_CONNECT == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], MEDIA connect notify\n"); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], MEDIA disconnect notify\n"); + BTC_TRACE(trace_buf); + } + + /* only 2.4G we need to inform bt the chnl mask */ + btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, + &wifi_central_chnl); + if ((BTC_MEDIA_CONNECT == type) && + (wifi_central_chnl <= 14)) { + h2c_parameter[0] = 0x1; + h2c_parameter[1] = wifi_central_chnl; + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); + if (BTC_WIFI_BW_HT40 == wifi_bw) + h2c_parameter[2] = 0x30; + else + h2c_parameter[2] = 0x20; + } + + coex_dm->wifi_chnl_info[0] = h2c_parameter[0]; + coex_dm->wifi_chnl_info[1] = h2c_parameter[1]; + coex_dm->wifi_chnl_info[2] = h2c_parameter[2]; + + btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter); +} + +void ex_halbtc8192e2ant_specific_packet_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + if (type == BTC_PACKET_DHCP) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], DHCP Packet notify\n"); + BTC_TRACE(trace_buf); + } +} + +void ex_halbtc8192e2ant_bt_info_notify(IN struct btc_coexist *btcoexist, + IN u8 *tmp_buf, IN u8 length) +{ + u8 bt_info = 0; + u8 i, rsp_source = 0; + boolean bt_busy = false, limited_dig = false; + boolean wifi_connected = false; + + coex_sta->c2h_bt_info_req_sent = false; + + rsp_source = tmp_buf[0] & 0xf; + if (rsp_source >= BT_INFO_SRC_8192E_2ANT_MAX) + rsp_source = BT_INFO_SRC_8192E_2ANT_WIFI_FW; + coex_sta->bt_info_c2h_cnt[rsp_source]++; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Bt info[%d], length=%d, hex data=[", rsp_source, + length); + BTC_TRACE(trace_buf); + for (i = 0; i < length; i++) { + coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i]; + if (i == 1) + bt_info = tmp_buf[i]; + if (i == length - 1) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x]\n", + tmp_buf[i]); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x, ", + tmp_buf[i]); + BTC_TRACE(trace_buf); + } + } + + if (BT_INFO_SRC_8192E_2ANT_WIFI_FW != rsp_source) { + coex_sta->bt_retry_cnt = /* [3:0] */ + coex_sta->bt_info_c2h[rsp_source][2] & 0xf; + + coex_sta->bt_rssi = + coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10; + + coex_sta->bt_info_ext = + coex_sta->bt_info_c2h[rsp_source][4]; + + /* Here we need to resend some wifi info to BT */ + /* because bt is reset and loss of the info. */ + if ((coex_sta->bt_info_ext & BIT(1))) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + if (wifi_connected) + ex_halbtc8192e2ant_media_status_notify( + btcoexist, BTC_MEDIA_CONNECT); + else + ex_halbtc8192e2ant_media_status_notify( + btcoexist, BTC_MEDIA_DISCONNECT); + } + + if ((coex_sta->bt_info_ext & BIT(3))) { + if (!btcoexist->manual_control && + !btcoexist->stop_coex_dm) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"); + BTC_TRACE(trace_buf); + halbtc8192e2ant_ignore_wlan_act(btcoexist, + FORCE_EXEC, false); + } + } else { + /* BT already NOT ignore Wlan active, do nothing here. */ + } + +#if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 0) + if ((coex_sta->bt_info_ext & BIT(4))) { + /* BT auto report already enabled, do nothing */ + } else + halbtc8192e2ant_bt_auto_report(btcoexist, FORCE_EXEC, + true); +#endif + } + + /* check BIT2 first ==> check if bt is under inquiry or page scan */ + if (bt_info & BT_INFO_8192E_2ANT_B_INQ_PAGE) + coex_sta->c2h_bt_inquiry_page = true; + else + coex_sta->c2h_bt_inquiry_page = false; + + /* set link exist status */ + if (!(bt_info & BT_INFO_8192E_2ANT_B_CONNECTION)) { + coex_sta->bt_link_exist = false; + coex_sta->pan_exist = false; + coex_sta->a2dp_exist = false; + coex_sta->hid_exist = false; + coex_sta->sco_exist = false; + } else { /* connection exists */ + coex_sta->bt_link_exist = true; + if (bt_info & BT_INFO_8192E_2ANT_B_FTP) + coex_sta->pan_exist = true; + else + coex_sta->pan_exist = false; + if (bt_info & BT_INFO_8192E_2ANT_B_A2DP) + coex_sta->a2dp_exist = true; + else + coex_sta->a2dp_exist = false; + if (bt_info & BT_INFO_8192E_2ANT_B_HID) + coex_sta->hid_exist = true; + else + coex_sta->hid_exist = false; + if (bt_info & BT_INFO_8192E_2ANT_B_SCO_ESCO) + coex_sta->sco_exist = true; + else + coex_sta->sco_exist = false; + } + + halbtc8192e2ant_update_bt_link_info(btcoexist); + + if (!(bt_info & BT_INFO_8192E_2ANT_B_CONNECTION)) { + coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n"); + BTC_TRACE(trace_buf); + } else if (bt_info == + BT_INFO_8192E_2ANT_B_CONNECTION) { /* connection exists but no busy */ + coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n"); + BTC_TRACE(trace_buf); + } else if ((bt_info & BT_INFO_8192E_2ANT_B_SCO_ESCO) || + (bt_info & BT_INFO_8192E_2ANT_B_SCO_BUSY)) { + coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_SCO_BUSY; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n"); + BTC_TRACE(trace_buf); + } else if (bt_info & BT_INFO_8192E_2ANT_B_ACL_BUSY) { + coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_ACL_BUSY; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n"); + BTC_TRACE(trace_buf); + } else { + coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_MAX; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n"); + BTC_TRACE(trace_buf); + } + + if ((BT_8192E_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) || + (BT_8192E_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) { + bt_busy = true; + limited_dig = true; + } else { + bt_busy = false; + limited_dig = false; + } + + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy); + + coex_dm->limited_dig = limited_dig; + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig); + + halbtc8192e2ant_run_coexist_mechanism(btcoexist); +} + +void ex_halbtc8192e2ant_halt_notify(IN struct btc_coexist *btcoexist) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Halt notify\n"); + BTC_TRACE(trace_buf); + + halbtc8192e2ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, true); + halbtc8192e2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true); + ex_halbtc8192e2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT); +} + +void ex_halbtc8192e2ant_periodical(IN struct btc_coexist *btcoexist) +{ +#if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 0) + halbtc8192e2ant_query_bt_info(btcoexist); + halbtc8192e2ant_monitor_bt_ctr(btcoexist); + halbtc8192e2ant_monitor_bt_enable_disable(btcoexist); +#else + if (halbtc8192e2ant_is_wifi_status_changed(btcoexist) || + coex_dm->auto_tdma_adjust) + halbtc8192e2ant_run_coexist_mechanism(btcoexist); +#endif +} + +#endif + +#endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */ + diff --git a/hal/btc/HalBtc8192e2Ant.h b/hal/btc/HalBtc8192e2Ant.h old mode 100755 new mode 100644 index 1876bf4..085f992 --- a/hal/btc/HalBtc8192e2Ant.h +++ b/hal/btc/HalBtc8192e2Ant.h @@ -1,231 +1,199 @@ -//=========================================== -// The following is for 8192E 2Ant BT Co-exist definition -//=========================================== -#define BT_AUTO_REPORT_ONLY_8192E_2ANT 0 - -#define BT_INFO_8192E_2ANT_B_FTP BIT7 -#define BT_INFO_8192E_2ANT_B_A2DP BIT6 -#define BT_INFO_8192E_2ANT_B_HID BIT5 -#define BT_INFO_8192E_2ANT_B_SCO_BUSY BIT4 -#define BT_INFO_8192E_2ANT_B_ACL_BUSY BIT3 -#define BT_INFO_8192E_2ANT_B_INQ_PAGE BIT2 -#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, - BT_INFO_SRC_8192E_2ANT_BT_RSP = 0x1, - BT_INFO_SRC_8192E_2ANT_BT_ACTIVE_SEND = 0x2, - BT_INFO_SRC_8192E_2ANT_MAX -}BT_INFO_SRC_8192E_2ANT,*PBT_INFO_SRC_8192E_2ANT; - -typedef enum _BT_8192E_2ANT_BT_STATUS{ - BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0, - BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1, - BT_8192E_2ANT_BT_STATUS_INQ_PAGE = 0x2, - BT_8192E_2ANT_BT_STATUS_ACL_BUSY = 0x3, - BT_8192E_2ANT_BT_STATUS_SCO_BUSY = 0x4, - BT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY = 0x5, - BT_8192E_2ANT_BT_STATUS_MAX -}BT_8192E_2ANT_BT_STATUS,*PBT_8192E_2ANT_BT_STATUS; - -typedef enum _BT_8192E_2ANT_COEX_ALGO{ - BT_8192E_2ANT_COEX_ALGO_UNDEFINED = 0x0, - BT_8192E_2ANT_COEX_ALGO_SCO = 0x1, - BT_8192E_2ANT_COEX_ALGO_SCO_PAN = 0x2, - BT_8192E_2ANT_COEX_ALGO_HID = 0x3, - BT_8192E_2ANT_COEX_ALGO_A2DP = 0x4, - BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS = 0x5, - BT_8192E_2ANT_COEX_ALGO_PANEDR = 0x6, - BT_8192E_2ANT_COEX_ALGO_PANHS = 0x7, - BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP = 0x8, - BT_8192E_2ANT_COEX_ALGO_PANEDR_HID = 0x9, - BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR = 0xa, - BT_8192E_2ANT_COEX_ALGO_HID_A2DP = 0xb, - BT_8192E_2ANT_COEX_ALGO_MAX = 0xc -}BT_8192E_2ANT_COEX_ALGO,*PBT_8192E_2ANT_COEX_ALGO; - -typedef struct _COEX_DM_8192E_2ANT{ - // fw mechanism - u1Byte preBtDecPwrLvl; - u1Byte curBtDecPwrLvl; - u1Byte preFwDacSwingLvl; - u1Byte curFwDacSwingLvl; - BOOLEAN bCurIgnoreWlanAct; - BOOLEAN bPreIgnoreWlanAct; - u1Byte prePsTdma; - u1Byte curPsTdma; - u1Byte psTdmaPara[5]; - 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; - BOOLEAN bCurRfRxLpfShrink; - u4Byte btRf0x1eBackup; - BOOLEAN bPreLowPenaltyRa; - BOOLEAN bCurLowPenaltyRa; - BOOLEAN bPreDacSwingOn; - u4Byte preDacSwingLvl; - BOOLEAN bCurDacSwingOn; - u4Byte curDacSwingLvl; - BOOLEAN bPreAdcBackOff; - BOOLEAN bCurAdcBackOff; - BOOLEAN bPreAgcTableEn; - BOOLEAN bCurAgcTableEn; - u4Byte preVal0x6c0; - u4Byte curVal0x6c0; - u4Byte preVal0x6c4; - u4Byte curVal0x6c4; - u4Byte preVal0x6c8; - 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; - u1Byte curAlgorithm; - u1Byte btStatus; - u1Byte wifiChnlInfo[3]; - - u1Byte preSsType; - u1Byte curSsType; - - u4Byte preRaMask; - u4Byte curRaMask; - u1Byte curRaMaskType; - u1Byte preArfrType; - u1Byte curArfrType; - u1Byte preRetryLimitType; - u1Byte curRetryLimitType; - u1Byte preAmpduTimeType; - u1Byte curAmpduTimeType; -} COEX_DM_8192E_2ANT, *PCOEX_DM_8192E_2ANT; - -typedef struct _COEX_STA_8192E_2ANT{ - BOOLEAN bBtLinkExist; - BOOLEAN bScoExist; - BOOLEAN bA2dpExist; - BOOLEAN bHidExist; - BOOLEAN bPanExist; - - BOOLEAN bUnderLps; - BOOLEAN bUnderIps; - u4Byte highPriorityTx; - u4Byte highPriorityRx; - u4Byte lowPriorityTx; - u4Byte lowPriorityRx; - u1Byte btRssi; - u1Byte preBtRssiState; - u1Byte preWifiRssiState[4]; - BOOLEAN bC2hBtInfoReqSent; - u1Byte btInfoC2h[BT_INFO_SRC_8192E_2ANT_MAX][10]; - u4Byte btInfoC2hCnt[BT_INFO_SRC_8192E_2ANT_MAX]; - 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; - -//=========================================== -// The following is interface which will notify coex module. -//=========================================== -VOID -EXhalbtc8192e2ant_PowerOnSetting( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e2ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bWifiOnly - ); -VOID -EXhalbtc8192e2ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e2ant_IpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e2ant_LpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e2ant_ScanNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e2ant_ConnectNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e2ant_MediaStatusNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e2ant_SpecialPacketNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8192e2ant_BtInfoNotify( - IN PBTC_COEXIST pBtCoexist, - IN pu1Byte tmpBuf, - IN u1Byte length - ); -VOID -EXhalbtc8192e2ant_HaltNotify( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e2ant_Periodical( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8192e2ant_DisplayCoexInfo( - IN PBTC_COEXIST pBtCoexist - ); - + +#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) + +#if (RTL8192E_SUPPORT == 1) +/* ******************************************* + * The following is for 8192E 2Ant BT Co-exist definition + * ******************************************* */ +#define BT_AUTO_REPORT_ONLY_8192E_2ANT 0 + +#define BT_INFO_8192E_2ANT_B_FTP BIT(7) +#define BT_INFO_8192E_2ANT_B_A2DP BIT(6) +#define BT_INFO_8192E_2ANT_B_HID BIT(5) +#define BT_INFO_8192E_2ANT_B_SCO_BUSY BIT(4) +#define BT_INFO_8192E_2ANT_B_ACL_BUSY BIT(3) +#define BT_INFO_8192E_2ANT_B_INQ_PAGE BIT(2) +#define BT_INFO_8192E_2ANT_B_SCO_ESCO BIT(1) +#define BT_INFO_8192E_2ANT_B_CONNECTION BIT(0) + +#define BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT 2 +#define NOISY_AP_NUM_THRESH_8192E 10 + +enum bt_info_src_8192e_2ant { + BT_INFO_SRC_8192E_2ANT_WIFI_FW = 0x0, + BT_INFO_SRC_8192E_2ANT_BT_RSP = 0x1, + BT_INFO_SRC_8192E_2ANT_BT_ACTIVE_SEND = 0x2, + BT_INFO_SRC_8192E_2ANT_MAX +}; + +enum bt_8192e_2ant_bt_status { + BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0, + BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1, + BT_8192E_2ANT_BT_STATUS_INQ_PAGE = 0x2, + BT_8192E_2ANT_BT_STATUS_ACL_BUSY = 0x3, + BT_8192E_2ANT_BT_STATUS_SCO_BUSY = 0x4, + BT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY = 0x5, + BT_8192E_2ANT_BT_STATUS_MAX +}; + +enum bt_8192e_2ant_coex_algo { + BT_8192E_2ANT_COEX_ALGO_UNDEFINED = 0x0, + BT_8192E_2ANT_COEX_ALGO_SCO = 0x1, + BT_8192E_2ANT_COEX_ALGO_SCO_PAN = 0x2, + BT_8192E_2ANT_COEX_ALGO_HID = 0x3, + BT_8192E_2ANT_COEX_ALGO_A2DP = 0x4, + BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS = 0x5, + BT_8192E_2ANT_COEX_ALGO_PANEDR = 0x6, + BT_8192E_2ANT_COEX_ALGO_PANHS = 0x7, + BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP = 0x8, + BT_8192E_2ANT_COEX_ALGO_PANEDR_HID = 0x9, + BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR = 0xa, + BT_8192E_2ANT_COEX_ALGO_HID_A2DP = 0xb, + BT_8192E_2ANT_COEX_ALGO_MAX = 0xc +}; + +struct coex_dm_8192e_2ant { + /* fw mechanism */ + u8 pre_bt_dec_pwr_lvl; + u8 cur_bt_dec_pwr_lvl; + u8 pre_fw_dac_swing_lvl; + u8 cur_fw_dac_swing_lvl; + boolean cur_ignore_wlan_act; + boolean pre_ignore_wlan_act; + u8 pre_ps_tdma; + u8 cur_ps_tdma; + u8 ps_tdma_para[5]; + u8 ps_tdma_du_adj_type; + boolean reset_tdma_adjust; + boolean auto_tdma_adjust; + boolean auto_tdma_adjust_low_rssi; + boolean pre_ps_tdma_on; + boolean cur_ps_tdma_on; + boolean pre_bt_auto_report; + boolean cur_bt_auto_report; + + /* sw mechanism */ + boolean pre_rf_rx_lpf_shrink; + boolean cur_rf_rx_lpf_shrink; + u32 bt_rf_0x1e_backup; + boolean pre_low_penalty_ra; + boolean cur_low_penalty_ra; + boolean pre_dac_swing_on; + u32 pre_dac_swing_lvl; + boolean cur_dac_swing_on; + u32 cur_dac_swing_lvl; + boolean pre_adc_back_off; + boolean cur_adc_back_off; + boolean pre_agc_table_en; + boolean cur_agc_table_en; + u32 pre_val0x6c0; + u32 cur_val0x6c0; + u32 pre_val0x6c4; + u32 cur_val0x6c4; + u32 pre_val0x6c8; + u32 cur_val0x6c8; + u8 pre_val0x6cc; + u8 cur_val0x6cc; + boolean limited_dig; + + u32 backup_arfr_cnt1; /* Auto Rate Fallback Retry cnt */ + u32 backup_arfr_cnt2; /* Auto Rate Fallback Retry cnt */ + u16 backup_retry_limit; + u8 backup_ampdu_max_time; + + /* algorithm related */ + u8 pre_algorithm; + u8 cur_algorithm; + u8 bt_status; + u8 wifi_chnl_info[3]; + + u8 pre_ss_type; + u8 cur_ss_type; + + u8 pre_lps; + u8 cur_lps; + u8 pre_rpwm; + u8 cur_rpwm; + + + u32 pre_ra_mask; + u32 cur_ra_mask; + u8 cur_ra_mask_type; + u8 pre_arfr_type; + u8 cur_arfr_type; + u8 pre_retry_limit_type; + u8 cur_retry_limit_type; + u8 pre_ampdu_time_type; + u8 cur_ampdu_time_type; +}; + +struct coex_sta_8192e_2ant { + boolean bt_disabled; + boolean bt_link_exist; + boolean sco_exist; + boolean a2dp_exist; + boolean hid_exist; + boolean pan_exist; + + boolean under_lps; + boolean under_ips; + u32 high_priority_tx; + u32 high_priority_rx; + u32 low_priority_tx; + u32 low_priority_rx; + u8 bt_rssi; + u8 pre_bt_rssi_state; + u8 pre_wifi_rssi_state[4]; + boolean c2h_bt_info_req_sent; + u8 bt_info_c2h[BT_INFO_SRC_8192E_2ANT_MAX][10]; + u32 bt_info_c2h_cnt[BT_INFO_SRC_8192E_2ANT_MAX]; + boolean c2h_bt_inquiry_page; + u8 bt_retry_cnt; + u8 bt_info_ext; + u8 scan_ap_num; +}; + +/* ******************************************* + * The following is interface which will notify coex module. + * ******************************************* */ +void ex_halbtc8192e2ant_power_on_setting(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e2ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean wifi_only); +void ex_halbtc8192e2ant_init_coex_dm(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e2ant_ips_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e2ant_lps_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e2ant_scan_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e2ant_connect_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e2ant_media_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e2ant_specific_packet_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8192e2ant_bt_info_notify(IN struct btc_coexist *btcoexist, + IN u8 *tmp_buf, IN u8 length); +void ex_halbtc8192e2ant_halt_notify(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e2ant_periodical(IN struct btc_coexist *btcoexist); +void ex_halbtc8192e2ant_display_coex_info(IN struct btc_coexist *btcoexist); + +#else /* #if (RTL8192E_SUPPORT == 1) */ +#define ex_halbtc8192e2ant_power_on_setting(btcoexist) +#define ex_halbtc8192e2ant_init_hw_config(btcoexist, wifi_only) +#define ex_halbtc8192e2ant_init_coex_dm(btcoexist) +#define ex_halbtc8192e2ant_ips_notify(btcoexist, type) +#define ex_halbtc8192e2ant_lps_notify(btcoexist, type) +#define ex_halbtc8192e2ant_scan_notify(btcoexist, type) +#define ex_halbtc8192e2ant_connect_notify(btcoexist, type) +#define ex_halbtc8192e2ant_media_status_notify(btcoexist, type) +#define ex_halbtc8192e2ant_specific_packet_notify(btcoexist, type) +#define ex_halbtc8192e2ant_bt_info_notify(btcoexist, tmp_buf, length) +#define ex_halbtc8192e2ant_halt_notify(btcoexist) +#define ex_halbtc8192e2ant_periodical(btcoexist) +#define ex_halbtc8192e2ant_display_coex_info(btcoexist) + +#endif + +#endif + diff --git a/hal/btc/HalBtc8703b1Ant.c b/hal/btc/HalBtc8703b1Ant.c old mode 100755 new mode 100644 index 7ae274b..0225669 --- a/hal/btc/HalBtc8703b1Ant.c +++ b/hal/btc/HalBtc8703b1Ant.c @@ -1,4999 +1,4592 @@ -//============================================================ -// Description: -// -// This file is for RTL8703B Co-exist mechanism -// -// History -// 2012/11/15 Cosa first check in. -// -//============================================================ - -//============================================================ -// include files -//============================================================ -#include "Mp_Precomp.h" - -#if WPP_SOFTWARE_TRACE -#include "HalBtc8703b1Ant.tmh" -#endif - -//#include -#if(BT_30_SUPPORT == 1) -//============================================================ -// Global variables, these are static variables -//============================================================ -static COEX_DM_8703B_1ANT GLCoexDm8703b1Ant; -static PCOEX_DM_8703B_1ANT pCoexDm=&GLCoexDm8703b1Ant; -static COEX_STA_8703B_1ANT GLCoexSta8703b1Ant; -static PCOEX_STA_8703B_1ANT pCoexSta=&GLCoexSta8703b1Ant; -static PSDSCAN_STA_8703B_1ANT GLPsdScan8703b1Ant; -static PPSDSCAN_STA_8703B_1ANT pPsdScan = &GLPsdScan8703b1Ant; - - -const char *const GLBtInfoSrc8703b1Ant[]={ - "BT Info[wifi fw]", - "BT Info[bt rsp]", - "BT Info[bt auto report]", -}; - -u4Byte GLCoexVerDate8703b1Ant=20150413; -u4Byte GLCoexVer8703b1Ant=0x01; - -//============================================================ -// local function proto type if needed -//============================================================ -//============================================================ -// local function start with halbtc8703b1ant_ -//============================================================ -u1Byte -halbtc8703b1ant_BtRssiState( - u1Byte levelNum, - u1Byte rssiThresh, - u1Byte rssiThresh1 - ) -{ - s4Byte btRssi=0; - u1Byte btRssiState=pCoexSta->preBtRssiState; - - btRssi = pCoexSta->btRssi; - - if(levelNum == 2) - { - if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) || - (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)) - { - if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) - { - btRssiState = BTC_RSSI_STATE_HIGH; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else - { - if(btRssi < rssiThresh) - { - btRssiState = BTC_RSSI_STATE_LOW; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - else if(levelNum == 3) - { - if(rssiThresh > rssiThresh1) - { - 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)) - { - if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) - { - btRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || - (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM)) - { - if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) - { - btRssiState = BTC_RSSI_STATE_HIGH; - } - else if(btRssi < rssiThresh) - { - btRssiState = BTC_RSSI_STATE_LOW; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - } - } - else - { - if(btRssi < rssiThresh1) - { - btRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - - pCoexSta->preBtRssiState = btRssiState; - - return btRssiState; -} - -u1Byte -halbtc8703b1ant_WifiRssiState( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte index, - IN u1Byte levelNum, - IN u1Byte rssiThresh, - IN u1Byte rssiThresh1 - ) -{ - s4Byte wifiRssi=0; - u1Byte wifiRssiState=pCoexSta->preWifiRssiState[index]; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi); - - if(levelNum == 2) - { - if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)) - { - if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) - { - wifiRssiState = BTC_RSSI_STATE_HIGH; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else - { - if(wifiRssi < rssiThresh) - { - wifiRssiState = BTC_RSSI_STATE_LOW; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - else if(levelNum == 3) - { - if(rssiThresh > rssiThresh1) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); - return pCoexSta->preWifiRssiState[index]; - } - - if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)) - { - if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) - { - wifiRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM)) - { - if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) - { - wifiRssiState = BTC_RSSI_STATE_HIGH; - } - else if(wifiRssi < rssiThresh) - { - wifiRssiState = BTC_RSSI_STATE_LOW; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - } - } - else - { - if(wifiRssi < rssiThresh1) - { - wifiRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - - pCoexSta->preWifiRssiState[index] = wifiRssiState; - - return wifiRssiState; -} - -VOID -halbtc8703b1ant_UpdateRaMask( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u4Byte disRateMask - ) -{ - pCoexDm->curRaMask = disRateMask; - - if( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask)) - { - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask); - } - pCoexDm->preRaMask = pCoexDm->curRaMask; -} - -VOID -halbtc8703b1ant_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 -halbtc8703b1ant_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 -halbtc8703b1ant_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 -halbtc8703b1ant_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 - halbtc8703b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0); - break; - case 1: // disable cck 1/2 - halbtc8703b1ant_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 - halbtc8703b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7); - break; - default: - break; - } - - halbtc8703b1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType); - halbtc8703b1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType); - halbtc8703b1ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType); -} - -VOID -halbtc8703b1ant_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 -halbtc8703b1ant_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 -halbtc8703b1ant_MonitorBtCtr( - IN PBTC_COEXIST pBtCoexist - ) -{ - u4Byte regHPTxRx, regLPTxRx, u4Tmp, u4Tmp1; - u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0; - 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; - - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx); - regHPTx = u4Tmp & bMaskLWord; - regHPRx = (u4Tmp & bMaskHWord)>>16; - - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx); - regLPTx = u4Tmp & bMaskLWord; - regLPRx = (u4Tmp & bMaskHWord)>>16; - - pCoexSta->highPriorityTx = regHPTx; - pCoexSta->highPriorityRx = regHPRx; - pCoexSta->lowPriorityTx = regLPTx; - pCoexSta->lowPriorityRx = 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) - { - halbtc8703b1ant_QueryBtInfo(pBtCoexist); - NumOfBtCounterChk = 0; - } - } -} - - -VOID -halbtc8703b1ant_MonitorWiFiCtr( - IN PBTC_COEXIST pBtCoexist - ) -{ - u4Byte u4Tmp; - u2Byte u2Tmp[3]; - 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); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode); - - 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); - - if ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode)) - { - TotalCnt = pCoexSta->nCRCOK_CCK + pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + - pCoexSta->nCRCOK_11nAgg; - - if ( (pCoexDm->btStatus == BT_8703B_1ANT_BT_STATUS_ACL_BUSY) || - (pCoexDm->btStatus == BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY) || - (pCoexDm->btStatus == BT_8703B_1ANT_BT_STATUS_SCO_BUSY) ) - { - if (pCoexSta->nCRCOK_CCK >(TotalCnt -pCoexSta->nCRCOK_CCK)) - { - if (nCCKLockCounter < 3) - nCCKLockCounter++; - } - else - { - if (nCCKLockCounter > 0) - nCCKLockCounter--; - } - - } - else - { - if (nCCKLockCounter > 0) - nCCKLockCounter--; - } - } - else - { - if (nCCKLockCounter > 0) - nCCKLockCounter--; - } - - if (!pCoexSta->bPreCCKLock) - { - - if (nCCKLockCounter >= 3) - pCoexSta->bCCKLock = TRUE; - else - pCoexSta->bCCKLock = FALSE; - } - else - { - if (nCCKLockCounter == 0) - pCoexSta->bCCKLock = FALSE; - else - pCoexSta->bCCKLock = TRUE; - } - - if (pCoexSta->bCCKLock) - pCoexSta->bCCKEverLock = TRUE; - - pCoexSta->bPreCCKLock = pCoexSta->bCCKLock; - - -} - -BOOLEAN -halbtc8703b1ant_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 -halbtc8703b1ant_UpdateBtLinkInfo( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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; - pBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist; - pBtLinkInfo->bPanExist = pCoexSta->bPanExist; - pBtLinkInfo->bHidExist = pCoexSta->bHidExist; - pBtLinkInfo->bBtHiPriLinkExist = pCoexSta->bBtHiPriLinkExist; - - // work around for HS mode. - if(bBtHsOn) - { - pBtLinkInfo->bPanExist = TRUE; - pBtLinkInfo->bBtLinkExist = TRUE; - } - - // 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; - - // check if Hid only - if( !pBtLinkInfo->bScoExist && - !pBtLinkInfo->bA2dpExist && - !pBtLinkInfo->bPanExist && - pBtLinkInfo->bHidExist ) - pBtLinkInfo->bHidOnly = TRUE; - else - pBtLinkInfo->bHidOnly = FALSE; -} - -VOID -halbtc8703b1ant_UpdateWifiChannelInfo( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - u1Byte H2C_Parameter[3] ={0}; - u4Byte wifiBw; - u1Byte wifiCentralChnl; - BOOLEAN bWifiUnderBMode = FALSE; - - // 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) && - (wifiCentralChnl <= 14) ) - { - H2C_Parameter[0] = 0x1; //enable BT AFH skip WL channel for 8703b because BT Rx LO interference - //H2C_Parameter[0] = 0x0; - H2C_Parameter[1] = wifiCentralChnl; - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); - if(BTC_WIFI_BW_HT40 == wifiBw) - 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]; - - 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); - -} - -u1Byte -halbtc8703b1ant_ActionAlgorithm( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BOOLEAN bBtHsOn=FALSE; - u1Byte algorithm=BT_8703B_1ANT_COEX_ALGO_UNDEFINED; - u1Byte numOfDiffProfile=0; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - - if(!pBtLinkInfo->bBtLinkExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); - return algorithm; - } - - if(pBtLinkInfo->bScoExist) - numOfDiffProfile++; - if(pBtLinkInfo->bHidExist) - numOfDiffProfile++; - if(pBtLinkInfo->bPanExist) - numOfDiffProfile++; - if(pBtLinkInfo->bA2dpExist) - numOfDiffProfile++; - - if(numOfDiffProfile == 1) - { - if(pBtLinkInfo->bScoExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO only\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_SCO; - } - else - { - if(pBtLinkInfo->bHidExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID only\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_HID; - } - else if(pBtLinkInfo->bA2dpExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP only\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_A2DP; - } - else if(pBtLinkInfo->bPanExist) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(HS) only\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_PANHS; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(EDR) only\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR; - } - } - } - } - else if(numOfDiffProfile == 2) - { - if(pBtLinkInfo->bScoExist) - { - if(pBtLinkInfo->bHidExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_HID; - } - else if(pBtLinkInfo->bA2dpExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP ==> SCO\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_SCO; - } - else if(pBtLinkInfo->bPanExist) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(HS)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_SCO; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(EDR)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; - } - } - } - else - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bA2dpExist ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP; - } - else if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(HS)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(EDR)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; - } - } - else if( pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(HS)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_A2DP_PANHS; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(EDR)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_A2DP; - } - } - } - } - else if(numOfDiffProfile == 3) - { - if(pBtLinkInfo->bScoExist) - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bA2dpExist ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_HID; - } - else if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(HS)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; - } - } - else if( pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_SCO; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; - } - } - } - else - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP_PANEDR; - } - } - } - } - else if(numOfDiffProfile >= 3) - { - if(pBtLinkInfo->bScoExist) - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n")); - - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n")); - algorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; - } - } - } - } - - return algorithm; -} - -VOID -halbtc8703b1ant_SetBtAutoReport( - IN PBTC_COEXIST pBtCoexist, - 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 -halbtc8703b1ant_BtAutoReport( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bEnableAutoReport - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", - (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); - pCoexDm->bCurBtAutoReport = bEnableAutoReport; - - if(!bForceExec) - { - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) - return; - } - halbtc8703b1ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport); - - pCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport; -} - -VOID -halbtc8703b1ant_SetSwPenaltyTxRateAdaptive( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bLowPenaltyRa - ) -{ - u1Byte H2C_Parameter[6] ={0}; - - H2C_Parameter[0] = 0x6; // opCode, 0x6= Retry_Penalty - - if(bLowPenaltyRa) - { - 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 - } - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", - (bLowPenaltyRa? "ON!!":"OFF!!") )); - - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); -} - -VOID -halbtc8703b1ant_LowPenaltyRa( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bLowPenaltyRa - ) -{ - pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; - - if(!bForceExec) - { - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) - return; - } - halbtc8703b1ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa); - - pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa; -} - -u4Byte -halbtc8703b1ant_LTECoex_InDirectReadReg( -IN PBTC_COEXIST pBtCoexist, -IN u2Byte RegAddr -) -{ - u4Byte j =0; - - - //wait for ready bit before access 0x7c0 - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x7c0, 0x800F0000|RegAddr); - - do - { - j++; - }while( ((pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7c3) & BIT5) ==0) && (j fBtcRead4Byte(pBtCoexist, 0x7c8)); //get read data - -} - -VOID -halbtc8703b1ant_LTECoex_InDirectWriteReg( -IN PBTC_COEXIST pBtCoexist, -IN u2Byte RegAddr, -IN u4Byte BitMask, -IN u4Byte RegValue -) -{ - u4Byte val, i=0, j=0, bitpos = 0; - - - if (BitMask == 0x0) - return; - if (BitMask == 0xffffffff) - { - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x7c4, RegValue); //put write data - - //wait for ready bit before access 0x7c0 - do - { - j++; - }while( ((pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7c3) & BIT5) ==0) && (j fBtcWrite4Byte(pBtCoexist, 0x7c0, 0xc00F0000|RegAddr); - } - else - { - for(i=0; i<=31; i++) - { - if ( ((BitMask >> i) & 0x1) == 0x1) - { - bitpos = i; - break; - } - } - - //read back register value before write - val = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, RegAddr); - val = (val & (~BitMask)) | (RegValue << bitpos); - - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x7c4, val); //put write data - - //wait for ready bit before access 0x7c0 - do - { - j++; - }while( ((pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7c3) & BIT5) ==0) && (j fBtcWrite4Byte(pBtCoexist, 0x7c0, 0xc00F0000|RegAddr); - - } - -} - -void -halbtc8703b1ant_LTECoex_Enable( -IN PBTC_COEXIST pBtCoexist, -IN BOOLEAN bEnable -) -{ - u1Byte val; - - val = (bEnable)? 1 : 0; - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, 0x80, val); //0x38[7] - -} - -void -halbtc8703b1ant_LTECoex_PathControlOwner( -IN PBTC_COEXIST pBtCoexist, -IN BOOLEAN bWiFiControl -) -{ - u1Byte val; - - val = (bWiFiControl)? 1 : 0; - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x73, 0x4, val); //0x70[26] - -} - -void -halbtc8703b1ant_LTECoex_Set_GNT_BT( -IN PBTC_COEXIST pBtCoexist, -IN u1Byte nControlBlock, -IN BOOLEAN bSWControl, -IN u1Byte nState -) -{ - u4Byte val=0, BitMask; - - nState = nState & 0x1; - val = (bSWControl)? ((nState<<1) | 0x1) : 0; - - switch(nControlBlock) - { - case RFC_AND_BB: - default: - BitMask = 0xc000; - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[15:14] - BitMask = 0x0c00; - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[11:10] - break; - case RFC_ONLY: - BitMask = 0xc000; - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[15:14] - break; - case BB_ONLY: - BitMask = 0x0c00; - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[11:10] - break; - - } - -} - -void -halbtc8703b1ant_LTECoex_Set_GNT_WL( -IN PBTC_COEXIST pBtCoexist, -IN u1Byte nControlBlock, -IN BOOLEAN bSWControl, -IN u1Byte nState -) -{ - u4Byte val=0, BitMask; - - nState = nState & 0x1; - val = (bSWControl)? ((nState<<1) | 0x1) : 0; - - switch(nControlBlock) - { - case RFC_AND_BB: - default: - BitMask = 0x3000; - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[13:12] - BitMask = 0x0300; - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[9:8] - break; - case RFC_ONLY: - BitMask = 0x3000; - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[13:12] - break; - case BB_ONLY: - BitMask = 0x0300; - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[9:8] - break; - - } - -} - -void -halbtc8703b1ant_LTECoex_Set_CoexTable( -IN PBTC_COEXIST pBtCoexist, -IN u1Byte nTableType, -IN u2Byte nTableContent -) -{ - u2Byte RegAddr = 0x0000; - - switch(nTableType) - { - case WL_VS_LTE: - RegAddr = 0xa0; - break; - case BT_VS_LTE: - RegAddr = 0xa4; - break; - } - - if (RegAddr != 0x0000) - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, RegAddr, 0xffff, nTableContent); // 0xa0[15:0] or 0xa4[15:0] - - -} - - -void -halbtc8703b1ant_LTECoex_Set_BreakTable( -IN PBTC_COEXIST pBtCoexist, -IN u1Byte nTableType, -IN u1Byte nTableContent -) -{ - u2Byte RegAddr = 0x0000; - - switch(nTableType) - { - case WL_BREAK_LTE: - RegAddr = 0xa8; - break; - case BT_BREAK_LTE: - RegAddr = 0xac; - break; - case LTE_BREAK_WL: - RegAddr = 0xb0; - break; - case LTE_BREAK_BT: - RegAddr = 0xb4; - break; - } - - if (RegAddr != 0x0000) - halbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, RegAddr, 0xff, nTableContent); // 0xa8[15:0] or 0xb4[15:0] - - -} - -VOID -halbtc8703b1ant_SetCoexTable( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte val0x6c0, - IN u4Byte val0x6c4, - IN u4Byte val0x6c8, - IN u1Byte val0x6cc - ) -{ - 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); - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); -} - -VOID -halbtc8703b1ant_CoexTable( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u4Byte val0x6c0, - IN u4Byte val0x6c4, - IN u4Byte val0x6c8, - IN u1Byte 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) - { - if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && - (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && - (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && - (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) ) - return; - } - halbtc8703b1ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc); - - pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0; - pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4; - pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8; - pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc; -} - -VOID -halbtc8703b1ant_CoexTableWithType( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte type - ) -{ - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - - u4Byte nBreakTable; - u1Byte nSelectTable; - - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type)); - - pCoexSta->nCoexTableType = type; - - if (pCoexSta->bConCurrentRxModeOn == true) - { - nBreakTable = 0xf0ffffff; //set WL hi-pri can break BT - nSelectTable = 0xb; //set Tx response = Hi-Pri (ex: Transmitting ACK,BA,CTS) - } - else - { - nBreakTable = 0xffffff; - nSelectTable = 0x3; - } - - switch(type) - { - case 0: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, nBreakTable, nSelectTable); - break; - case 1: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, nBreakTable, nSelectTable); - break; - case 2: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa5a5a5a, 0xaa5a5a5a, nBreakTable, nSelectTable); - break; - case 3: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa555555, 0xaa5a5a5a, nBreakTable, nSelectTable); - break; - case 4: - if ( (pCoexSta->bCCKEverLock) && (pCoexSta->nScanAPNum <= 5) ) - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa555555, 0xaaaa5a5a, nBreakTable, nSelectTable); - else - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa555555, 0xaa5a5a5a, nBreakTable, nSelectTable); - break; - case 5: - if ( (pCoexSta->bCCKEverLock) && (pCoexSta->nScanAPNum <= 5) ) - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa555555, 0xaaaa5a5a, nBreakTable, nSelectTable); - else - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa5a5a5a, 0xaa5a5a5a, nBreakTable, nSelectTable); - break; - case 6: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, nBreakTable, nSelectTable); - break; - case 7: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, nBreakTable, nSelectTable); - break; - case 8: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable); - break; - case 9: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable); - break; - case 10: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable); - break; - case 11: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable); - break; - case 12: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable); - break; - case 13: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0xaaaaaaaa, nBreakTable, nSelectTable); - break; - case 14: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5ada5ada, nBreakTable, nSelectTable); - break; - case 15: - halbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0xaaaaaaaa, nBreakTable, nSelectTable); - break; - default: - break; - } -} - -VOID -halbtc8703b1ant_SetFwIgnoreWlanAct( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bEnable - ) -{ - u1Byte H2C_Parameter[1] ={0}; - - if(bEnable) - { - H2C_Parameter[0] |= BIT0; // function enable - } - - 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 -halbtc8703b1ant_IgnoreWlanAct( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bEnable - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", - (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); - pCoexDm->bCurIgnoreWlanAct = bEnable; - - if(!bForceExec) - { - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) - return; - } - halbtc8703b1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable); - - pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct; -} - -VOID -halbtc8703b1ant_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 -halbtc8703b1ant_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; - } - } - halbtc8703b1ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal); - - pCoexDm->preLps = pCoexDm->curLps; - pCoexDm->preRpwm = pCoexDm->curRpwm; -} - -VOID -halbtc8703b1ant_SwMechanism( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bLowPenaltyRA - ) -{ - halbtc8703b1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA); -} - -VOID -halbtc8703b1ant_SetAntPath( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte antPosType, - IN BOOLEAN bForceExec, - IN BOOLEAN bInitHwCfg, - IN BOOLEAN bWifiOff - ) -{ - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - u4Byte fwVer=0, u4Tmp=0, cntBtCalChk=0; - BOOLEAN bPgExtSwitch=FALSE; - BOOLEAN bUseExtSwitch=FALSE; - BOOLEAN bIsInMpMode = FALSE; - u1Byte H2C_Parameter[2] ={0}, u1Tmp = 0; - u4Byte u4Tmp1=0, u4Tmp2=0; - - pCoexDm->curAntPosType = antPosType; - -#if 1 - u4Tmp1 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38); - u4Tmp2 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x54); - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x73); - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** (Before Setup) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n", u1Tmp, u4Tmp1, u4Tmp2)); -#endif - - if(bInitHwCfg) - { - //Disable LTE Coex Function in WiFi side (this should be on if LTE coex is required) - halbtc8703b1ant_LTECoex_Enable(pBtCoexist, 0x0); - - //GNT_WL_LTE always = 1 (this should be config if LTE coex is required) - halbtc8703b1ant_LTECoex_Set_CoexTable(pBtCoexist, WL_VS_LTE, 0xffff); - - //GNT_BT_LTE always = 1 (this should be config if LTE coex is required) - halbtc8703b1ant_LTECoex_Set_CoexTable(pBtCoexist, BT_VS_LTE, 0xffff); - - // Wait If BT IQK running, because Path control owner is at BT during BT IQK (setup by WiFi firmware) - while(cntBtCalChk <= 20) - { - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49d); - cntBtCalChk++; - if(u1Tmp & BIT0) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n", cntBtCalChk)); - delay_ms(50); - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n", cntBtCalChk)); - break; - } - } - - //set Path control owner to WL at initial step - halbtc8703b1ant_LTECoex_PathControlOwner(pBtCoexist, WLSIDE_CONTROL); - } - else if(bWifiOff) - { - //Disable LTE Coex Function in WiFi side - halbtc8703b1ant_LTECoex_Enable(pBtCoexist, 0x0); - - //if MP mode - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode); - if(bIsInMpMode) - halbtc8703b1ant_LTECoex_PathControlOwner(pBtCoexist, WLSIDE_CONTROL); //set Path control owner to BT - else - halbtc8703b1ant_LTECoex_PathControlOwner(pBtCoexist, BTSIDE_CONTROL);//set Path control owner to WiFi - } - else - { - // - } - - - if(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType) || bInitHwCfg || bWifiOff) - { - // internal switch setting - switch(antPosType) - { - case BTC_ANT_PATH_WIFI: - // set GNT_BT to low - halbtc8703b1ant_LTECoex_Set_GNT_BT(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_LOW); - //Set GNT_WL to high - halbtc8703b1ant_LTECoex_Set_GNT_WL(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_HIGH); - break; - case BTC_ANT_PATH_BT: - // set GNT_BT to high - halbtc8703b1ant_LTECoex_Set_GNT_BT(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_HIGH); - //Set GNT_WL to low - halbtc8703b1ant_LTECoex_Set_GNT_WL(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_LOW); - break; - default: - case BTC_ANT_PATH_PTA: - // set GNT_BT to PTA - halbtc8703b1ant_LTECoex_Set_GNT_BT(pBtCoexist, RFC_AND_BB, CONTROL_BY_PTA, SET_BY_HW); - //Set GNT_WL to PTA - halbtc8703b1ant_LTECoex_Set_GNT_WL(pBtCoexist, RFC_AND_BB, CONTROL_BY_PTA, SET_BY_HW); - break; - } - } - -#if 1 - u4Tmp1 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38); - u4Tmp2 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x54); - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x73); - - if(bInitHwCfg) - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** (After Init) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n", u1Tmp, u4Tmp1, u4Tmp2)); - else if (bWifiOff) - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** (After WiFi off) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n", u1Tmp, u4Tmp1, u4Tmp2)); - else - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** (After Run time) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n", u1Tmp, u4Tmp1, u4Tmp2)); -#endif - - pCoexDm->preAntPosType = pCoexDm->curAntPosType; -} - - -VOID -halbtc8703b1ant_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 -halbtc8703b1ant_PsTdma( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bTurnOn, - IN u1Byte type - ) -{ - 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; - - pCoexDm->bCurPsTdmaOn = bTurnOn; - pCoexDm->curPsTdma = type; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); - - if (bWifiBusy != bPreWifiBusy) - { - 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 (pCoexSta->nScanAPNum <= 5) - nWiFiDurationAdjust = 5; - //nWiFiDurationAdjust = 2; - else if (pCoexSta->nScanAPNum >= 40) - nWiFiDurationAdjust = -15; - else if (pCoexSta->nScanAPNum >= 20) - nWiFiDurationAdjust = -10; - - 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, no dynamic slot - } - 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)) - { - 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) && (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) - { - default: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val); - break; - case 1: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 2: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 3: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 4: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0); - break; - case 5: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x15, 0x3, psTdmaByte3Val, 0x11); - break; - case 6: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x20, 0x3, psTdmaByte3Val, 0x11); - break; - case 7: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0); - break; - case 8: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); - break; - case 9: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 10: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40); - break; - case 11: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 12: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50); - break; - case 13: - if (pCoexSta->nScanAPNum <= 3) // for Lenovo CPT test A2DP + OPP - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x3, psTdmaByte3Val, psTdmaByte4Val); - else - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 14: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 15: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0); - break; - case 16: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0); - break; - case 18: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); - break; - case 20: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3f, 0x03, psTdmaByte3Val, 0x10); - break; - case 21: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11); - break; - case 22: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x10); - break; - case 23: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18); - break; - case 24: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18); - break; - case 25: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - break; - case 26: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - break; - case 27: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98); - break; - case 28: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0); - break; - case 29: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10); - break; - case 30: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10); - break; - case 31: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58); - break; - case 32: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 33: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, 0x10); - break; - case 34: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10); - break; - case 35: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10); - break; - case 36: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 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 */ - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24); - break; - - //for 1-Ant translate to 2-Ant - case 101: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 102: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 103: - //halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val); - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 105: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x15, 0x3, psTdmaByte3Val, 0x11); - break; - case 106: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x20, 0x3, psTdmaByte3Val, 0x11); - break; - case 109: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 111: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 113: - //halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val); - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 114: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 120: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3f, 0x03, psTdmaByte3Val, 0x10); - break; - case 122: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x10); - break; - case 132: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 133: - halbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x11); - break; - - } - } - else - { - - // disable PS tdma - switch(type) - { - case 8: //PTA Control - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0); - break; - case 0: - default: //Software control, Antenna at BT side - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); - break; - case 1: // 2-Ant, 0x778=3, antenna control by antenna diversity - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0); - break; -#if 0 - case 9: //Software control, Antenna at WiFi side - halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE); - break; -#endif - } - } - 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; -} - -BOOLEAN -halbtc8703b1ant_IsCommonAction( - IN PBTC_COEXIST pBtCoexist - ) -{ - BOOLEAN bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); - - if(!bWifiConnected && - BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); - - //halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); - - bCommon = TRUE; - } - else if(bWifiConnected && - (BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); - - //halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); - - bCommon = TRUE; - } - else if(!bWifiConnected && - (BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); - - //halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); - - bCommon = TRUE; - } - else if(bWifiConnected && - (BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); - - //halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); - - bCommon = TRUE; - } - else if(!bWifiConnected && - (BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); - - //halbtc8703b1ant_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; - } - - return bCommon; -} - - -VOID -halbtc8703b1ant_TdmaDurationAdjustForAcl( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte wifiStatus - ) -{ - 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; - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); - - if(BT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifiStatus) - bWifiBusy = TRUE; - else - bWifiBusy = FALSE; - - if( (BT_8703B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) || - (BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) || - (BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) ) - { - if( pCoexDm->curPsTdma != 1 && - pCoexDm->curPsTdma != 2 && - pCoexDm->curPsTdma != 3 && - pCoexDm->curPsTdma != 9 ) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - - up = 0; - dn = 0; - m = 1; - n= 3; - result = 0; - WaitCount = 0; - } - return; - } - - if(!pCoexDm->bAutoTdmaAdjust) - { - pCoexDm->bAutoTdmaAdjust = TRUE; - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); - - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - //============ - up = 0; - dn = 0; - m = 1; - n= 3; - result = 0; - WaitCount = 0; - } - else - { - //accquire the BT TRx retry count from BT_Info byte2 - retryCount = pCoexSta->btRetryCnt; - btInfoExt = pCoexSta->btInfoExt; - - if ( (pCoexSta->lowPriorityTx) > 1050 || (pCoexSta->lowPriorityRx) > 1250 ) - retryCount++; - - result = 0; - WaitCount++; - - if(retryCount == 0) // no retry in the last 2-second duration - { - up++; - dn--; - - if (dn <= 0) - dn = 0; - - 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++; - - if (up <= 0) - up = 0; - - if (dn == 2) // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration - { - if (WaitCount <= 2) - 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 //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration - { - 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")); - } - - if(result == -1) - { -/* if( (BT_INFO_8703B_1ANT_A2DP_BASIC_RATE(btInfoExt)) && - ((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) ) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else */ if(pCoexDm->curPsTdma == 1) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(pCoexDm->curPsTdma == 9) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - } - else if(result == 1) - { -/* if( (BT_INFO_8703B_1ANT_A2DP_BASIC_RATE(btInfoExt)) && - ((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) ) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else */ if(pCoexDm->curPsTdma == 11) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(pCoexDm->curPsTdma == 9) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); - pCoexDm->psTdmaDuAdjType = 1; - } - } - else //no change - { - /* Bryant Modify - if(bWifiBusy != bPreWifiBusy) //if busy / idle change - { - bPreWifiBusy = bWifiBusy; - halbtc8703b1ant_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 && - pCoexDm->curPsTdma != 9 && - pCoexDm->curPsTdma != 11 ) - { - // recover to previous adjust type - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType); - } - } -} - -VOID -halbtc8703b1ant_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 - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - } - } - else // NO PS state - { - if(bNewPsState) - { - // will enter LPS state, turn off psTdma first - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - } - else - { - // keep state under NO PS state, do nothing. - } - } -} - -VOID -halbtc8703b1ant_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: - halbtc8703b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE); - halbtc8703b1ant_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: - halbtc8703b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE); - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL); - pCoexSta->bForceLpsOn = FALSE; - break; - default: - break; - } -} - -VOID -halbtc8703b1ant_ActionWifiOnly( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); - halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); -} - -VOID -halbtc8703b1ant_MonitorBtEnableDisable( - IN PBTC_COEXIST pBtCoexist - ) -{ - static BOOLEAN bPreBtDisabled=FALSE; - static u4Byte btDisableCnt=0; - BOOLEAN bBtActive=TRUE, bBtDisabled=FALSE; - - // This function check if bt is disabled - - if( pCoexSta->highPriorityTx == 0 && - pCoexSta->highPriorityRx == 0 && - pCoexSta->lowPriorityTx == 0 && - pCoexSta->lowPriorityRx == 0) - { - bBtActive = FALSE; - } - if( pCoexSta->highPriorityTx == 0xffff && - pCoexSta->highPriorityRx == 0xffff && - pCoexSta->lowPriorityTx == 0xffff && - pCoexSta->lowPriorityRx == 0xffff) - { - bBtActive = FALSE; - } - if(bBtActive) - { - btDisableCnt = 0; - bBtDisabled = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is enabled !!\n")); - } - else - { - 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); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is disabled !!\n")); - halbtc8703b1ant_ActionWifiOnly(pBtCoexist); - } - } - if(bPreBtDisabled != bBtDisabled) - { - 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_ACT_LEAVE_LPS, NULL); - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL); - } - } -} - -//============================================= -// -// Software Coex Mechanism start -// -//============================================= - -// SCO only or SCO+PAN(HS) - -/* -VOID -halbtc8703b1ant_ActionSco( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, TRUE); -} - - -VOID -halbtc8703b1ant_ActionHid( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, TRUE); -} - -//A2DP only / PAN(EDR) only/ A2DP+PAN(HS) -VOID -halbtc8703b1ant_ActionA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); -} - -VOID -halbtc8703b1ant_ActionA2dpPanHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); -} - -VOID -halbtc8703b1ant_ActionPanEdr( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); -} - -//PAN(HS) only -VOID -halbtc8703b1ant_ActionPanHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); -} - -//PAN(EDR)+A2DP -VOID -halbtc8703b1ant_ActionPanEdrA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); -} - -VOID -halbtc8703b1ant_ActionPanEdrHid( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, TRUE); -} - -// HID+A2DP+PAN(EDR) -VOID -halbtc8703b1ant_ActionHidA2dpPanEdr( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, TRUE); -} - -VOID -halbtc8703b1ant_ActionHidA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_SwMechanism(pBtCoexist, TRUE); -} - -*/ - -//============================================= -// -// Non-Software Coex Mechanism start -// -//============================================= -VOID -halbtc8703b1ant_ActionBtWhckTest( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); -} - -VOID -halbtc8703b1ant_ActionWifiMultiPort( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); -} - -VOID -halbtc8703b1ant_ActionHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); -} - -VOID -halbtc8703b1ant_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) ) - { - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - } - else if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) ) - { - // SCO/HID/A2DP busy - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else if ( (pBtLinkInfo->bPanExist) || (bWifiBusy) ) - { - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - //for BT inquiry/page fail after S4 resume - //halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else - { - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); - - - //halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - //halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } -} - -VOID -halbtc8703b1ant_ActionBtScoHidOnlyBusy( - IN PBTC_COEXIST pBtCoexist, - 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 - - if(pBtLinkInfo->bScoExist) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); - } - else //HID - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); - } -} - -VOID -halbtc8703b1ant_ActionWifiConnectedBtAclBusy( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte wifiStatus - ) -{ - u1Byte btRssiState; - - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - btRssiState = halbtc8703b1ant_BtRssiState(2, 28, 0); - - if ( (pCoexSta->lowPriorityRx >= 950) && (!pCoexSta->bUnderIps) ) - { - pBtLinkInfo->bSlaveRole = TRUE; - } - else - { - pBtLinkInfo->bSlaveRole = FALSE; - } - - if(pBtLinkInfo->bHidOnly) //HID - { - halbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus); - pCoexDm->bAutoTdmaAdjust = FALSE; - return; - } - else if(pBtLinkInfo->bA2dpOnly) //A2DP - { - if(BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; - } - else - { - halbtc8703b1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = TRUE; - } - } - else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) || - (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; - } - else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist) //HID+A2DP - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->bAutoTdmaAdjust = FALSE; - - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; - } - else - { - //BT no-profile busy (0x9) - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 33); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; - } -} - -VOID -halbtc8703b1ant_ActionWifiNotConnected( - IN PBTC_COEXIST pBtCoexist - ) -{ - // power save state - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // tdma and coex table - halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); -} - -VOID -halbtc8703b1ant_ActionWifiNotConnectedScan( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // tdma and coex table - if(BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) - { - if (pBtLinkInfo->bA2dpExist) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - } - else if( (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { - halbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN); - } - else - { - //Bryant Add - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - } -} - -VOID -halbtc8703b1ant_ActionWifiNotConnectedAssoAuth( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // tdma and coex table - if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) ) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4); - } - else if (pBtLinkInfo->bPanExist) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4); - } - else - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2); - } -} - -VOID -halbtc8703b1ant_ActionWifiConnectedScan( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // tdma and coex table - if(BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) - { - if (pBtLinkInfo->bA2dpExist) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - } - else if( (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { - halbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN); - } - else - { - //Bryant Add - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - } -} - -VOID -halbtc8703b1ant_ActionWifiConnectedSpecialPacket( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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; - - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // tdma and coex table - if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist)) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); - } - else if (pBtLinkInfo->bA2dpExist) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else if(pBtLinkInfo->bPanExist) - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - } -} - -VOID -halbtc8703b1ant_ActionWifiConnected( - IN PBTC_COEXIST pBtCoexist - ) -{ - BOOLEAN bWifiBusy=FALSE; - BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BOOLEAN bUnder4way=FALSE, bApEnable=FALSE; - u4Byte wifiBw; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect()===>\n")); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way); - if(bUnder4way) - { - halbtc8703b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - 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) - { - if(bScan) - halbtc8703b1ant_ActionWifiConnectedScan(pBtCoexist); - else - halbtc8703b1ant_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(!bApEnable && BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) - { - if(pBtCoexist->btLinkInfo.bA2dpOnly) //A2DP - { - if(!bWifiBusy) - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - else //busy - { - if (pCoexSta->nScanAPNum >= BT_8703B_1ANT_WIFI_NOISY_THRESH) //no force LPS, no PS-TDMA, use pure TDMA - { - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - } - else - { - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); - } - } - } - else if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE)) - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - else - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); - } - else - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // tdma and coex table - if(!bWifiBusy) - { - if(BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) - { - halbtc8703b1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE); - } - else if( (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { - halbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE); - } - else - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 ) - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - else - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); - } - } - else - { - if(BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) - { - halbtc8703b1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY); - } - else if( (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { - halbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY); - } - else - { - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 ) - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); - else - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); - } - } -} - -VOID -halbtc8703b1ant_RunSwCoexistMechanism( - IN PBTC_COEXIST pBtCoexist - ) -{ - u1Byte algorithm=0; - - algorithm = halbtc8703b1ant_ActionAlgorithm(pBtCoexist); - pCoexDm->curAlgorithm = algorithm; - - if(halbtc8703b1ant_IsCommonAction(pBtCoexist)) - { - - } - else - { - switch(pCoexDm->curAlgorithm) - { - case BT_8703B_1ANT_COEX_ALGO_SCO: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = SCO.\n")); - //halbtc8703b1ant_ActionSco(pBtCoexist); - break; - case BT_8703B_1ANT_COEX_ALGO_HID: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID.\n")); - //halbtc8703b1ant_ActionHid(pBtCoexist); - break; - case BT_8703B_1ANT_COEX_ALGO_A2DP: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP.\n")); - //halbtc8703b1ant_ActionA2dp(pBtCoexist); - break; - case BT_8703B_1ANT_COEX_ALGO_A2DP_PANHS: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); - //halbtc8703b1ant_ActionA2dpPanHs(pBtCoexist); - break; - case BT_8703B_1ANT_COEX_ALGO_PANEDR: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR).\n")); - //halbtc8703b1ant_ActionPanEdr(pBtCoexist); - break; - case BT_8703B_1ANT_COEX_ALGO_PANHS: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HS mode.\n")); - //halbtc8703b1ant_ActionPanHs(pBtCoexist); - break; - case BT_8703B_1ANT_COEX_ALGO_PANEDR_A2DP: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); - //halbtc8703b1ant_ActionPanEdrA2dp(pBtCoexist); - break; - case BT_8703B_1ANT_COEX_ALGO_PANEDR_HID: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n")); - //halbtc8703b1ant_ActionPanEdrHid(pBtCoexist); - break; - case BT_8703B_1ANT_COEX_ALGO_HID_A2DP_PANEDR: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n")); - //halbtc8703b1ant_ActionHidA2dpPanEdr(pBtCoexist); - break; - case BT_8703B_1ANT_COEX_ALGO_HID_A2DP: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP.\n")); - //halbtc8703b1ant_ActionHidA2dp(pBtCoexist); - break; - default: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = coexist All Off!!\n")); - //halbtc8703b1ant_CoexAllOff(pBtCoexist); - break; - } - pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; - } -} - -VOID -halbtc8703b1ant_RunCoexistMechanism( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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; - u1Byte iotPeer=BTC_IOT_PEER_UNKNOWN; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); - - if(pBtCoexist->bManualControl) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); - return; - } - - if(pBtCoexist->bStopCoexDm) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); - return; - } - - if(pCoexSta->bUnderIps) - { - 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")); - halbtc8703b1ant_ActionBtWhckTest(pBtCoexist); - return; - } - - if( (BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || - (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8703B_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) - { - halbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); - bMiracastPlusBt = TRUE; - } - else - { - halbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - bMiracastPlusBt = FALSE; - } - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); - - if ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], BT Is Inquirying \n") ); - halbtc8703b1ant_ActionBtInquiry(pBtCoexist); - } - else - halbtc8703b1ant_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); - - if ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) ) - { - halbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_IOT_PEER, &iotPeer); - - if(BTC_IOT_PEER_CISCO != iotPeer) - { - if(pBtLinkInfo->bScoExist)//if (pBtLinkInfo->bBtHiPriLinkExist) - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5); - else - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); - } - else - { - if(pBtLinkInfo->bScoExist) - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5); - else - { - if (BTC_WIFI_BW_HT40==wifiBw) - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x10); - else - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); - } - } - - halbtc8703b1ant_SwMechanism(pBtCoexist, TRUE); - halbtc8703b1ant_RunSwCoexistMechanism(pBtCoexist); //just print debug message - } - else - { - halbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); - - halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); - halbtc8703b1ant_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") ); - halbtc8703b1ant_ActionBtInquiry(pBtCoexist); - return; - } - else if(bBtHsOn) - { - halbtc8703b1ant_ActionHs(pBtCoexist); - return; - } - - - if(!bWifiConnected) - { - BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - - 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) - { - if (bScan) - halbtc8703b1ant_ActionWifiNotConnectedScan(pBtCoexist); - else - halbtc8703b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); - } - else - halbtc8703b1ant_ActionWifiNotConnected(pBtCoexist); - } - else // wifi LPS/Busy - { - halbtc8703b1ant_ActionWifiConnected(pBtCoexist); - } -} - -u4Byte -halbtc8703b1ant_PSD_Log2Base( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte val - - ) -{ - u1Byte i,j; - u4Byte tmp, tmp2, val_integerdB=0, tindex, shiftcount=0; - u4Byte result,val_fractiondB=0,Table_fraction[21]= {0,432, 332, 274, 232, 200, - 174, 151,132,115,100,86,74,62,51,42, - 32,23,15,7,0}; - - if (val == 0) - return 0; - - tmp = val; - - while(1) - { - if (tmp == 1) - break; - else - { - tmp = (tmp >> 1); - shiftcount++; - } - } - - - val_integerdB = shiftcount+1; - - tmp2=1; - for (j=1; j<= val_integerdB;j++) - tmp2 = tmp2*2; - - tmp = (val*100) /tmp2; - tindex = tmp/5; - - if (tindex > 20) - tindex = 20; - - val_fractiondB = Table_fraction[tindex]; - - result = val_integerdB*100 - val_fractiondB; - - return (result); - - -} - -VOID -halbtc8703b1ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ) -{ - // force to reset coex mechanism - - // sw all off - halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE); - - //halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - //halbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); - - pCoexSta->popEventCnt = 0; -} - -VOID -halbtc8703b1ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bBackUp, - IN BOOLEAN bWifiOnly - ) -{ - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - u4Byte u4Tmp=0;//, fwVer; - u2Byte u2Tmp=0; - u1Byte u1Tmp=0, u1Tmpa=0, u1Tmpb=0; - u1Byte H2C_Parameter[2] ={0}; - - u4Byte u4Tmp1=0, u4Tmp2=0; - - - u4Tmp1 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38); - u4Tmp2 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x54); - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** (Before Init HW config) 0x38= 0x%x, 0x54= 0x%x**********\n", u4Tmp1, u4Tmp2)); - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 1Ant Init HW Config!!\n")); - - - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x550, 0x8, 0x1); //enable TBTT nterrupt - - //BT report packet sample rate - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, 0x5); - - // Enable BT counter statistics - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1); - - //Enable PTA (3-wire function form BT side) - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1); - - //Enable PTA (tx/rx signal form WiFi side) - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x4c6, 0x10, 0x1); - - //enable GNT_WL/GNT_BT debug signal to GPIO14/15 - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x73, 0x8, 0x1); - - //enable GNT_WL - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x4e, 0x40, 0x0); - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x1, 0x0); - - halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - - //Antenna config - if(bWifiOnly) - { - pCoexSta->bConCurrentRxModeOn = false; - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FORCE_EXEC, TRUE, FALSE); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FORCE_EXEC, FALSE, FALSE); - } - else - { - pCoexSta->bConCurrentRxModeOn = true; - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x953, 0x2, 0x1); - //RF 0x1[0] = 0 -> Set GNT_WL_RF_Rx always = 1 for con-current Rx - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0x1, 0x0); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, TRUE, FALSE); - } - - // PTA parameter - halbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); - -} - - - -VOID -halbtc8703b1ant_PSD_ShowData( - IN PBTC_COEXIST pBtCoexist - ) -{ - pu1Byte cliBuf=pBtCoexist->cliBuf; - u4Byte nDeltaFreqPerPoint; - u4Byte freq,freq1,freq2,n=0,i=0, j=0, m=0, PsdRep1, PsdRep2; - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n\n============[PSD info] (%d)============\n", - pPsdScan->nPSDGenCount); - CL_PRINTF(cliBuf); - - if (pPsdScan->nPSDGenCount == 0) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n No Data !!\n"); - CL_PRINTF(cliBuf); - return; - } - - if (pPsdScan->nPSDPoint == 0) - nDeltaFreqPerPoint = 0; - else - nDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint; - - //if (pPsdScan->bIsPSDShowMaxOnly) - if (0) - { - 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) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq = %d.0%d MHz", - freq1, freq2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq = %d.%d MHz", - freq1, freq2); - - if (PsdRep2 < 10) - 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)\n", - PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue); - - CL_PRINTF(cliBuf); - } - else - { - m = pPsdScan->nPSDStartPoint; - n = pPsdScan->nPSDStartPoint; - i = 1; - j = 1; - - while(1) - { - do - { - freq = ((pPsdScan->nRealCentFreq-20) * 1000000 + m * nDeltaFreqPerPoint); - freq1 = freq/1000000; - freq2 = freq/1000 - freq1 * 1000; - - if (i ==1) - { - if (freq2 == 0) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq%6d.000", freq1); - else if (freq2 < 100) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq%6d.0%2d", freq1,freq2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq%6d.%3d", freq1,freq2); - } - else if ( (i%8 == 0) || (m == pPsdScan->nPSDStopPoint) ) - { - if (freq2 == 0) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.000\n", freq1); - else if (freq2 < 100) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.0%2d\n", freq1,freq2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.%3d\n", freq1,freq2); - } - else - { - if (freq2 == 0) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.000", freq1); - else if (freq2 < 100) - 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++; - CL_PRINTF(cliBuf); - - }while( (i <= 8) && (m <= pPsdScan->nPSDStopPoint)); - - - do - { - PsdRep1 = pPsdScan->nPSDReport_MaxHold[n]/100; - PsdRep2 = pPsdScan->nPSDReport_MaxHold[n] - PsdRep1 * 100; - - if (j ==1) - { - if (PsdRep2 <10) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Val %7d.0%d", PsdRep1,PsdRep2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Val %7d.%d", PsdRep1,PsdRep2); - } - else if ( (j%8 == 0) || (n == pPsdScan->nPSDStopPoint) ) - { - if (PsdRep2 <10) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.0%d\n", PsdRep1,PsdRep2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.%d\n", PsdRep1,PsdRep2); - } - else - { - if (PsdRep2 <10) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.0%d", PsdRep1,PsdRep2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.%d", PsdRep1,PsdRep2); - } - - j++; - n++; - CL_PRINTF(cliBuf); - - } while( (j <= 8) && (n <= pPsdScan->nPSDStopPoint)); - - if ( (m > pPsdScan->nPSDStopPoint) || (n > pPsdScan->nPSDStopPoint) ) - break; - else - { - i = 1; - j = 1; - } - - } - } - - -} - -VOID -halbtc8703b1ant_PSD_MaxHoldData( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte GenCount - ) -{ - u4Byte i=0, i_max=0, val_max=0, j; - - if (GenCount== 1) - { - memcpy(pPsdScan->nPSDReport_MaxHold, pPsdScan->nPSDReport, BT_8703B_1ANT_ANTDET_PSD_POINTS*sizeof(u4Byte)); - - 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])); - } - - 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]; - - //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 -halbtc8703b1ant_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; - - return psd_report; -} - - -VOID -halbtc8703b1ant_PSD_SweepPoint( -IN PBTC_COEXIST pBtCoexist, - IN u4Byte centFreq, - IN s4Byte offset, - IN u4Byte span, - IN u4Byte points, - IN u4Byte avgnum - ) -{ - u4Byte i,val,n,k=0; - u4Byte nPoints=0, psd_report=0; - u4Byte nStartP=0, nStopP=0, nDeltaFreqPerPoint=156250; - u4Byte nPSDCenterFreq=20*10^6, freq,freq1,freq2; - BOOLEAN outloop = FALSE; - u1Byte flag = 0; - u4Byte tmp, PsdRep1, PsdRep2; - u4Byte WiFi_OriginalChannel = 1; - - pPsdScan->bIsPSDRunning = TRUE; - - do - { - switch(flag) - { - case 0: //Get PSD parameters - default: - //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; - - //PSD point setup - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808); - val &= 0xffff0fff; - - switch(pPsdScan->nPSDPoint) - { - case 128: - val |= 0x0; - break; - case 256: - default: - val |=0x00004000; - break; - case 512: - val |= 0x00008000; - break; - case 1024: - val |= 0x0000c000; - break; - } - - switch(pPsdScan->nPSDAvgNum) - { - case 1: - val |= 0x0; - break; - case 8: - val |=0x00001000; - break; - case 16: - val |= 0x00002000; - break; - case 32: - default: - val |= 0x00003000; - break; - } - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val); - - //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); - //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; - //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; - //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), Stop PSD Poin Matrix Index = %d\n",pPsdScan->nPSDStopPoint)); - - flag = 2; - break; - case 2: //set RF channel/BW/Mode - - //set 3-wire off - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c); - val |= 0x00300000; - pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val); - - //CCK off - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800); - 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); - 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); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x1); - - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); - - flag = 3; - break; - case 3: - memset(pPsdScan->nPSDReport,0, pPsdScan->nPSDPoint*sizeof(u4Byte)); - nStartP = pPsdScan->nPSDStartPoint + pPsdScan->nPSDStartBase; - nStopP = pPsdScan->nPSDStopPoint + pPsdScan->nPSDStartBase + 1; - - i = nStartP; - - while (i < nStopP) - { - if (i >= nPoints) - { - psd_report = halbtc8703b1ant_PSD_GetData(pBtCoexist,i-nPoints); - } - else - { - psd_report = halbtc8703b1ant_PSD_GetData(pBtCoexist,i); - } - - if (psd_report == 0) - tmp = 0; - else - //tmp = 20*log10((double)psd_report); - //20*log2(x)/log2(10), log2Base return theresult of the psd_report*100 - tmp = 6 * halbtc8703b1ant_PSD_Log2Base(pBtCoexist, psd_report); - - n = i-pPsdScan->nPSDStartBase; - pPsdScan->nPSDReport[n] = tmp; - PsdRep1 = pPsdScan->nPSDReport[n] /100; - PsdRep2 = pPsdScan->nPSDReport[n] - PsdRep1 * 100; - - freq = ((centFreq-20) * 1000000 + n * nDeltaFreqPerPoint); - freq1 = freq/1000000; - freq2 = freq/1000 - freq1 * 1000; -/* - if (freq2 < 100) - RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.0%d MHz)", n, freq1, freq2)); - else - RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.%d MHz)", n, freq1, freq2)); - - if (PsdRep2 < 10) - RT_TRACE(COMP_COEX, DBG_LOUD, (", PSDReport = %d (%d.0%d dB)\n",psd_report, PsdRep1, PsdRep2)); - else - RT_TRACE(COMP_COEX, DBG_LOUD, (", PSDReport = %d (%d.%d dB)\n",psd_report, PsdRep1,PsdRep2)); -*/ - i++; - - k=0; - - //Add Delay between PSD point - while(1) - { - if (k++ > 20000) - break; - } - - //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint()==============\n")); - } - - flag = 100; - break; - case 99: //error - - outloop = TRUE; - break; - case 100: //recovery - - //set 3-wire on - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c); - val &=0xffcfffff; - pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val); - - //CCK on - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800); - val |= 0x01000000; - pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val); - - //PSD off - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808); - val &=0xffbfffff; - 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); - - //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; - - } - - }while (!outloop); - - - - pPsdScan->bIsPSDRunning = FALSE; - - -} - -//============================================================ -// work around function start with wa_halbtc8703b1ant_ -//============================================================ -//============================================================ -// extern function start with EXhalbtc8703b1ant_ -//============================================================ -VOID -EXhalbtc8703b1ant_PowerOnSetting( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - u1Byte u1Tmp=0x0; - u2Byte u2Tmp=0x0; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx Execute 8703b 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; - - // 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 Path control owner to WiFi - halbtc8703b1ant_LTECoex_PathControlOwner(pBtCoexist, WLSIDE_CONTROL); - - // set GNT_BT to high - halbtc8703b1ant_LTECoex_Set_GNT_BT(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_HIGH); - //Set GNT_WL to low - halbtc8703b1ant_LTECoex_Set_GNT_WL(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_LOW); - - // 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 - - u1Tmp = 0; - pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT; - - if(pBtCoexist->chipInterface == BTC_INTF_USB) - { - pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp); - } - else if(pBtCoexist->chipInterface == BTC_INTF_SDIO) - { - pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp); - } - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** LTE coex Reg 0x38 (Power-On) = 0x%x**********\n", halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38))); - - -#if 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 -EXhalbtc8703b1ant_PreLoadFirmware( - IN PBTC_COEXIST pBtCoexist - ) -{ -} - -VOID -EXhalbtc8703b1ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bWifiOnly - ) -{ - halbtc8703b1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly); - pBtCoexist->bStopCoexDm = FALSE; -} - -VOID -EXhalbtc8703b1ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ) -{ - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); - - pBtCoexist->bStopCoexDm = FALSE; - - halbtc8703b1ant_InitCoexDm(pBtCoexist); - - halbtc8703b1ant_QueryBtInfo(pBtCoexist); -} - -VOID -EXhalbtc8703b1ant_DisplayCoexInfo( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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; - u2Byte u2Tmp[4]; - 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); - - if(pBtCoexist->bManualControl) - { - 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); - } - if(pBtCoexist->bStopCoexDm) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[Coex is STOPPED]============"); - CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n =========================================="); - CL_PRINTF(cliBuf); - } - - 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); - CL_PRINTF(cliBuf); - - 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", \ - GLCoexVerDate8703b1Ant, GLCoexVer8703b1Ant, fwVer, btPatchVer, btPatchVer); - 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", "WifibHiPri/ Ccklock/ CckEverLock", \ - (pCoexSta->bWiFiIsHighPriTask? "Yes":"No"), - (pCoexSta->bCCKLock? "Yes":"No"), - (pCoexSta->bCCKEverLock? "Yes":"No")); - CL_PRINTF(cliBuf); - - // wifi status - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); - CL_PRINTF(cliBuf); - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============"); - CL_PRINTF(cliBuf); - - 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_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle": - ( (BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))), - pCoexSta->btRssi, pCoexSta->btRetryCnt, pCoexSta->popEventCnt); - CL_PRINTF(cliBuf); - - if (PopReportIn10s >= 5) - { - pCoexSta->popEventCnt = 0; - 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_PRINTF(cliBuf); - - if (pStackInfo->bProfileNotified) - { - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO); - } - else - { - btInfoExt = pCoexSta->btInfoExt; - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s", "BT Role/A2DP rate", \ - (pBtLinkInfo->bSlaveRole )? "Slave":"Master", (btInfoExt&BIT0)? "BR":"EDR"); - CL_PRINTF(cliBuf); - } - - - for(i=0; ibtInfoC2hCnt[i]) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8703b1Ant[i], \ - pCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1], - pCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3], - pCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5], - pCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]); - CL_PRINTF(cliBuf); - } - } - - - if(pBtCoexist->bManualControl) - { - 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_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ 0x%x", "SM[LowPenaltyRA]/RA Mask", \ - pCoexDm->bCurLowPenaltyRa, pBtCoexist->btInfo.raMask); - CL_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %d ", "NoAggr/ CtrlAggr/ AggrSize", \ - (pBtCoexist->btInfo.bRejectAggPkt? "Yes":"No"), (pBtCoexist->btInfo.bBtCtrlAggBufSize? "Yes":"No"), - pBtCoexist->btInfo.aggBufSize); - CL_PRINTF(cliBuf); - - // 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 (%s,%s)", "PS TDMA", \ - pCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1], - pCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3], - 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", "WL/BT Coex Table Type", \ - pCoexSta->nCoexTableType); - 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(coexTable)", \ - u4Tmp[0], u4Tmp[1], u4Tmp[2]); - CL_PRINTF(cliBuf); - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778); - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6cc); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x778/0x6cc/IgnWlanAct", \ - u1Tmp[0], u4Tmp[0], pCoexDm->bCurIgnoreWlanAct); - CL_PRINTF(cliBuf); - - u4Tmp[0] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xa0); - u4Tmp[1] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xa4); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "LTE Coex Table W_L/B_L", \ - u4Tmp[0]&0xffff, u4Tmp[1]&0xffff); - CL_PRINTF(cliBuf); - - u4Tmp[0] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xa8); - u4Tmp[1] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xac); - u4Tmp[2] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xb0); - u4Tmp[3] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xb4); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "LTE Break Table W_L/B_L/L_W/L_B", \ - u4Tmp[0]&0xffff, u4Tmp[1]&0xffff, u4Tmp[2]&0xffff, u4Tmp[3]&0xffff); - CL_PRINTF(cliBuf); - - // Hw setting - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============"); - CL_PRINTF(cliBuf); - - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434); - u2Tmp[0] = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", "0x430/0x434/0x42a/0x456", \ - u4Tmp[0], u4Tmp[1], u2Tmp[0], u1Tmp[0]); - CL_PRINTF(cliBuf); - - - u4Tmp[0] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x73); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %s", "LTE CoexOn/Path Ctrl Owner", \ - ((u4Tmp[0]&BIT7)>> 7), ((u1Tmp[0]&BIT2)? "WL":"BT")); - CL_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "LTE 3Wire/OPMode/UART/UARTMode", \ - ((u4Tmp[0]&BIT6)>> 6), ((u4Tmp[0]&(BIT5|BIT4))>> 4),((u4Tmp[0]&BIT3)>> 3), (u4Tmp[0]&(BIT2|BIT1|BIT0))); - CL_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %s", "GNT_WL_SWCtrl/GNT_BT_SWCtrl/Dbg", \ - ((u4Tmp[0]&BIT12)>> 12), ((u4Tmp[0]&BIT14)>> 14), ((u1Tmp[0]&BIT3)? "On":"Off")); - CL_PRINTF(cliBuf); - - u4Tmp[0] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x54); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "GNT_WL/GNT_BT/LTE_Busy/UART_Busy", \ - ((u4Tmp[0]&BIT2)>> 2), ((u4Tmp[0]&BIT3)>> 3), ((u4Tmp[0]&BIT1)>> 1), (u4Tmp[0]&BIT0)); - CL_PRINTF(cliBuf); - - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4c6); - u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x4c6[4]/0x40[5] (WL/BT PTA)", \ - ((u1Tmp[0] & BIT4)>>4), ((u1Tmp[1] & BIT5)>>5)); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522); - u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x953); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ %s", "0x550(bcn ctrl)/0x522/4-RxAGC", \ - u4Tmp[0], u1Tmp[0], (u1Tmp[1]&0x2)? "On": "Off"); - CL_PRINTF(cliBuf); - - 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); - - 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]; - - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0xc50/OFDM-CCA/OFDM-FA/CCK-FA", \ - u4Tmp[1]&0xff, 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); - - 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)", \ - pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx); - CL_PRINTF(cliBuf); -#if(BT_AUTO_REPORT_ONLY_8703B_1ANT == 1) - //halbtc8703b1ant_MonitorBtCtr(pBtCoexist); -#endif - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS); -} - - -VOID -EXhalbtc8703b1ant_IpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - u4Byte u4Tmp=0; - - if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm) - return; - - if(BTC_IPS_ENTER == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); - pCoexSta->bUnderIps = TRUE; - - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE); - halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - } - else if(BTC_IPS_LEAVE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); - - halbtc8703b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); - halbtc8703b1ant_InitCoexDm(pBtCoexist); - halbtc8703b1ant_QueryBtInfo(pBtCoexist); - - pCoexSta->bUnderIps = FALSE; - } -} - -VOID -EXhalbtc8703b1ant_LpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm) - return; - - if(BTC_LPS_ENABLE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); - pCoexSta->bUnderLps = TRUE; - } - else if(BTC_LPS_DISABLE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); - pCoexSta->bUnderLps = FALSE; - } -} - -VOID -EXhalbtc8703b1ant_ScanNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - 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 ) - return; - - if(BTC_SCAN_START == type) - { - pCoexSta->bWiFiIsHighPriTask = TRUE; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); - halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue - halbtc8703b1ant_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); - - halbtc8703b1ant_QueryBtInfo(pBtCoexist); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); - numOfWifiLink = wifiLinkStatus>>16; - if(numOfWifiLink >= 2) - { - halbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); - halbtc8703b1ant_ActionWifiMultiPort(pBtCoexist); - return; - } - - if(pCoexSta->bC2hBtInquiryPage) - { - halbtc8703b1ant_ActionBtInquiry(pBtCoexist); - return; - } - else if(bBtHsOn) - { - halbtc8703b1ant_ActionHs(pBtCoexist); - return; - } - - if(BTC_SCAN_START == type) - { - //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); - if(!bWifiConnected) // non-connected scan - { - halbtc8703b1ant_ActionWifiNotConnectedScan(pBtCoexist); - } - else // wifi is connected - { - halbtc8703b1ant_ActionWifiConnectedScan(pBtCoexist); - } - } - else if(BTC_SCAN_FINISH == type) - { - //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); - if(!bWifiConnected) // non-connected scan - { - halbtc8703b1ant_ActionWifiNotConnected(pBtCoexist); - } - else - { - halbtc8703b1ant_ActionWifiConnected(pBtCoexist); - } - } -} - -VOID -EXhalbtc8703b1ant_ConnectNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - 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; - halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue - halbtc8703b1ant_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) - { - halbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); - halbtc8703b1ant_ActionWifiMultiPort(pBtCoexist); - return; - } - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - if(pCoexSta->bC2hBtInquiryPage) - { - halbtc8703b1ant_ActionBtInquiry(pBtCoexist); - return; - } - else if(bBtHsOn) - { - halbtc8703b1ant_ActionHs(pBtCoexist); - return; - } - - if(BTC_ASSOCIATE_START == type) - { - //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); - halbtc8703b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); - } - else if(BTC_ASSOCIATE_FINISH == type) - { - //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 - { - halbtc8703b1ant_ActionWifiNotConnected(pBtCoexist); - } - else - { - halbtc8703b1ant_ActionWifiConnected(pBtCoexist); - } - } -} - -VOID -EXhalbtc8703b1ant_MediaStatusNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - u1Byte H2C_Parameter[3] ={0}; - u4Byte wifiBw; - u1Byte wifiCentralChnl; - BOOLEAN bWifiUnderBMode = FALSE; - - if(pBtCoexist->bManualControl || - pBtCoexist->bStopCoexDm || - pBtCoexist->btInfo.bBtDisabled ) - return; - - if(BTC_MEDIA_CONNECT == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], MEDIA connect notify\n")); - halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); - 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 - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //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 - { - 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 - - pCoexSta->bCCKEverLock = FALSE; - } - - halbtc8703b1ant_UpdateWifiChannelInfo(pBtCoexist, type); - -} - -VOID -EXhalbtc8703b1ant_SpecialPacketNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - BOOLEAN bBtHsOn=FALSE; - u4Byte wifiLinkStatus=0; - u4Byte numOfWifiLink=0; - 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 ) - 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) && (!bUnder4way)) // 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) - { - halbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - halbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); - halbtc8703b1ant_ActionWifiMultiPort(pBtCoexist); - return; - } - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - if(pCoexSta->bC2hBtInquiryPage) - { - halbtc8703b1ant_ActionBtInquiry(pBtCoexist); - return; - } - else if(bBtHsOn) - { - halbtc8703b1ant_ActionHs(pBtCoexist); - return; - } - - if( BTC_PACKET_DHCP == type || - BTC_PACKET_EAPOL == type || - ( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) ) - { - halbtc8703b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - } -} - -VOID -EXhalbtc8703b1ant_BtInfoNotify( - IN PBTC_COEXIST pBtCoexist, - IN pu1Byte tmpBuf, - IN u1Byte length - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - u1Byte btInfo=0; - u1Byte i, rspSource=0; - BOOLEAN bWifiConnected=FALSE; - BOOLEAN bBtBusy=FALSE; - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - - pCoexSta->bC2hBtInfoReqSent = FALSE; - - rspSource = tmpBuf[0]&0xf; - if(rspSource >= BT_INFO_SRC_8703B_1ANT_MAX) - rspSource = BT_INFO_SRC_8703B_1ANT_WIFI_FW; - pCoexSta->btInfoC2hCnt[rspSource]++; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); - for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; - if(i == 1) - btInfo = tmpBuf[i]; - if(i == length-1) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); - } - } - - // if 0xff, it means BT is under WHCK test - if (btInfo == 0xff) - pCoexSta->bBtWhckTest = TRUE; - else - pCoexSta->bBtWhckTest = FALSE; - - if(BT_INFO_SRC_8703B_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-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); - - - // 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")); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - if(bWifiConnected) - { - halbtc8703b1ant_UpdateWifiChannelInfo(pBtCoexist, BTC_MEDIA_CONNECT); - } - else - { - halbtc8703b1ant_UpdateWifiChannelInfo(pBtCoexist, BTC_MEDIA_DISCONNECT); - } - } - - if(pCoexSta->btInfoExt & BIT3) - { - if(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n")); - halbtc8703b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE); - } - } - else - { - // BT already NOT ignore Wlan active, do nothing here. - } -#if(BT_AUTO_REPORT_ONLY_8703B_1ANT == 0) - if( (pCoexSta->btInfoExt & BIT4) ) - { - // BT auto report already enabled, do nothing - } - else - { - halbtc8703b1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE); - } -#endif - } - - // check BIT2 first ==> check if bt is under inquiry or page scan - if(btInfo & BT_INFO_8703B_1ANT_B_INQ_PAGE) - pCoexSta->bC2hBtInquiryPage = TRUE; - else - pCoexSta->bC2hBtInquiryPage = FALSE; - - pCoexSta->nNumOfProfile = 0; - - // set link exist status - if(!(btInfo&BT_INFO_8703B_1ANT_B_CONNECTION)) - { - pCoexSta->bBtLinkExist = FALSE; - pCoexSta->bPanExist = FALSE; - pCoexSta->bA2dpExist = FALSE; - pCoexSta->bHidExist = FALSE; - pCoexSta->bScoExist = FALSE; - - pCoexSta->bBtHiPriLinkExist = FALSE; - } - else // connection exists - { - pCoexSta->bBtLinkExist = TRUE; - if(btInfo & BT_INFO_8703B_1ANT_B_FTP) - { - pCoexSta->bPanExist = TRUE; - pCoexSta->nNumOfProfile++; - } - else - pCoexSta->bPanExist = FALSE; - if(btInfo & BT_INFO_8703B_1ANT_B_A2DP) - { - pCoexSta->bA2dpExist = TRUE; - pCoexSta->nNumOfProfile++; - } - else - pCoexSta->bA2dpExist = FALSE; - if(btInfo & BT_INFO_8703B_1ANT_B_HID) - { - pCoexSta->bHidExist = TRUE; - pCoexSta->nNumOfProfile++; - } - else - pCoexSta->bHidExist = FALSE; - if(btInfo & BT_INFO_8703B_1ANT_B_SCO_ESCO) - { - pCoexSta->bScoExist = TRUE; - pCoexSta->nNumOfProfile++; - } - else - pCoexSta->bScoExist = 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; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT HID = true (Hi-Pri > 160)!\n")); - } - } - - //Add Hi-Pri Tx/Rx counter to avoid false detection - if (((pCoexSta->bHidExist) || (pCoexSta->bScoExist)) && (pCoexSta->highPriorityTx + pCoexSta->highPriorityRx >= 160) - && (!pCoexSta->bC2hBtInquiryPage)) - pCoexSta->bBtHiPriLinkExist = TRUE; - else - pCoexSta->bBtHiPriLinkExist = FALSE; - - if((btInfo&BT_INFO_8703B_1ANT_B_ACL_BUSY) && (pCoexSta->nNumOfProfile == 0)) - { - if (pCoexSta->lowPriorityTx + pCoexSta->lowPriorityRx >= 160) - { - pCoexSta->bPanExist = TRUE; - pCoexSta->nNumOfProfile++; - pCoexSta->wrongProfileNotification++; - btInfo = btInfo | 0x88; - } - } - } - - halbtc8703b1ant_UpdateBtLinkInfo(pBtCoexist); - - btInfo = btInfo & 0x1f; //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41) - - if(!(btInfo&BT_INFO_8703B_1ANT_B_CONNECTION)) - { - pCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n")); - } - else if(btInfo == BT_INFO_8703B_1ANT_B_CONNECTION) // connection exists but no busy - { - pCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n")); - } - else if((btInfo&BT_INFO_8703B_1ANT_B_SCO_ESCO) || - (btInfo&BT_INFO_8703B_1ANT_B_SCO_BUSY)) - { - pCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_SCO_BUSY; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n")); - } - else if(btInfo&BT_INFO_8703B_1ANT_B_ACL_BUSY) - { - if(BT_8703B_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus) - pCoexDm->bAutoTdmaAdjust = FALSE; - pCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_ACL_BUSY; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n")); - } - else - { - pCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_MAX; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n")); - } - - if( (BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || - (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - bBtBusy = TRUE; - else - bBtBusy = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy); - - halbtc8703b1ant_RunCoexistMechanism(pBtCoexist); -} - -VOID -EXhalbtc8703b1ant_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")); - - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE); - halbtc8703b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); - pBtCoexist->bStopCoexDm = TRUE; - - } -} - -VOID -EXhalbtc8703b1ant_HaltNotify( - IN PBTC_COEXIST pBtCoexist - ) -{ - u4Byte u4Tmp; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Halt notify\n")); - - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE); - - halbtc8703b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE); - - EXhalbtc8703b1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); - - pBtCoexist->bStopCoexDm = TRUE; -} - -VOID -EXhalbtc8703b1ant_PnpNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte pnpState - ) -{ - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify\n")); - - if(BTC_WIFI_PNP_SLEEP == pnpState) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Pnp notify to SLEEP\n")); - - halbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); - halbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE); - halbtc8703b1ant_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; - halbtc8703b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); - halbtc8703b1ant_InitCoexDm(pBtCoexist); - halbtc8703b1ant_QueryBtInfo(pBtCoexist); - } -} - -VOID -EXhalbtc8703b1ant_CoexDmReset( - IN PBTC_COEXIST pBtCoexist - ) -{ - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], *****************Coex DM Reset*****************\n")); - - halbtc8703b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); - //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); - //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0); - halbtc8703b1ant_InitCoexDm(pBtCoexist); -} - -VOID -EXhalbtc8703b1ant_Periodical( - IN PBTC_COEXIST pBtCoexist - ) -{ - static u1Byte disVerInfoCnt=0; - u4Byte fwVer=0, btPatchVer=0; - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ==========================Periodical===========================\n")); - - if(disVerInfoCnt <= 5) - { - 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)); - 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); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", - GLCoexVerDate8703b1Ant, GLCoexVer8703b1Ant, fwVer, btPatchVer, btPatchVer)); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ****************************************************************\n")); - } - -#if(BT_AUTO_REPORT_ONLY_8703B_1ANT == 0) - halbtc8703b1ant_QueryBtInfo(pBtCoexist); - halbtc8703b1ant_MonitorBtEnableDisable(pBtCoexist); -#else - halbtc8703b1ant_MonitorBtCtr(pBtCoexist); - halbtc8703b1ant_MonitorWiFiCtr(pBtCoexist); -#if BT_8703B_1ANT_ANTDET_ENABLE - halbtc8703b1ant_MonitorBtEnableDisable(pBtCoexist); -#endif - - if( halbtc8703b1ant_IsWifiStatusChanged(pBtCoexist) || - pCoexDm->bAutoTdmaAdjust ) - { - - halbtc8703b1ant_RunCoexistMechanism(pBtCoexist); - } - - pCoexSta->specialPktPeriodCnt++; - - // sample to set bt to execute Ant detection - //pBtCoexist->fBtcSetBtAntDetection(pBtCoexist, 20, 14); -/* - if (pPsdScan->bIsAntDetEnable) - { - if (pPsdScan->nPSDGenCount > pPsdScan->realseconds) - pPsdScan->nPSDGenCount = 0; - - halbtc8703b1ant_AntennaDetection(pBtCoexist, pPsdScan->realcentFreq, pPsdScan->realoffset, pPsdScan->realspan, pPsdScan->realseconds); - pPsdScan->nPSDGenTotalCount +=2; - pPsdScan->nPSDGenCount += 2; - } -*/ -#endif -} - -VOID -EXhalbtc8703b1ant_AntennaDetection( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte centFreq, - IN u4Byte offset, - IN u4Byte span, - IN u4Byte seconds - ) -{ - //No Antenna Detection required because 8730b is only 1-Ant -} - -VOID -EXhalbtc8703b1ant_AntennaIsolation( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte centFreq, - IN u4Byte offset, - IN u4Byte span, - IN u4Byte seconds - ) -{ - - -} - -VOID -EXhalbtc8703b1ant_PSDScan( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte centFreq, - IN u4Byte offset, - IN u4Byte span, - IN u4Byte seconds - ) -{ - - -} - -VOID -EXhalbtc8703b1ant_DisplayAntDetection( - IN PBTC_COEXIST pBtCoexist - ) -{ - -} - - -#endif - +/* ************************************************************ + * Description: + * + * This file is for RTL8703B Co-exist mechanism + * + * History + * 2012/11/15 Cosa first check in. + * + * ************************************************************ */ + +/* ************************************************************ + * include files + * ************************************************************ */ +#include "Mp_Precomp.h" + +#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) + +#if (RTL8703B_SUPPORT == 1) +/* ************************************************************ + * Global variables, these are static variables + * ************************************************************ */ +static u8 *trace_buf = &gl_btc_trace_buf[0]; +static struct coex_dm_8703b_1ant glcoex_dm_8703b_1ant; +static struct coex_dm_8703b_1ant *coex_dm = &glcoex_dm_8703b_1ant; +static struct coex_sta_8703b_1ant glcoex_sta_8703b_1ant; +static struct coex_sta_8703b_1ant *coex_sta = &glcoex_sta_8703b_1ant; +static struct psdscan_sta_8703b_1ant gl_psd_scan_8703b_1ant; +static struct psdscan_sta_8703b_1ant *psd_scan = &gl_psd_scan_8703b_1ant; + + +const char *const glbt_info_src_8703b_1ant[] = { + "BT Info[wifi fw]", + "BT Info[bt rsp]", + "BT Info[bt auto report]", +}; + +u32 glcoex_ver_date_8703b_1ant = 20160218; +u32 glcoex_ver_8703b_1ant = 0x09; + +/* ************************************************************ + * local function proto type if needed + * ************************************************************ + * ************************************************************ + * local function start with halbtc8703b1ant_ + * ************************************************************ */ +u8 halbtc8703b1ant_bt_rssi_state(u8 level_num, u8 rssi_thresh, u8 rssi_thresh1) +{ + s32 bt_rssi = 0; + u8 bt_rssi_state = coex_sta->pre_bt_rssi_state; + + bt_rssi = coex_sta->bt_rssi; + + if (level_num == 2) { + if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) || + (coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_STAY_LOW)) { + if (bt_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) + bt_rssi_state = BTC_RSSI_STATE_HIGH; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else { + if (bt_rssi < rssi_thresh) + bt_rssi_state = BTC_RSSI_STATE_LOW; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } else if (level_num == 3) { + if (rssi_thresh > rssi_thresh1) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Rssi thresh error!!\n"); + BTC_TRACE(trace_buf); + return coex_sta->pre_bt_rssi_state; + } + + if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) || + (coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_STAY_LOW)) { + if (bt_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) + bt_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else if ((coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_MEDIUM) || + (coex_sta->pre_bt_rssi_state == + BTC_RSSI_STATE_STAY_MEDIUM)) { + if (bt_rssi >= (rssi_thresh1 + + BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) + bt_rssi_state = BTC_RSSI_STATE_HIGH; + else if (bt_rssi < rssi_thresh) + bt_rssi_state = BTC_RSSI_STATE_LOW; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM; + } else { + if (bt_rssi < rssi_thresh1) + bt_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } + + coex_sta->pre_bt_rssi_state = bt_rssi_state; + + return bt_rssi_state; +} + +u8 halbtc8703b1ant_wifi_rssi_state(IN struct btc_coexist *btcoexist, + IN u8 index, IN u8 level_num, IN u8 rssi_thresh, IN u8 rssi_thresh1) +{ + s32 wifi_rssi = 0; + u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index]; + + btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi); + + if (level_num == 2) { + if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW) + || + (coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_STAY_LOW)) { + if (wifi_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) + wifi_rssi_state = BTC_RSSI_STATE_HIGH; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else { + if (wifi_rssi < rssi_thresh) + wifi_rssi_state = BTC_RSSI_STATE_LOW; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } else if (level_num == 3) { + if (rssi_thresh > rssi_thresh1) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi RSSI thresh error!!\n"); + BTC_TRACE(trace_buf); + return coex_sta->pre_wifi_rssi_state[index]; + } + + if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW) + || + (coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_STAY_LOW)) { + if (wifi_rssi >= (rssi_thresh + + BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) + wifi_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW; + } else if ((coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_MEDIUM) || + (coex_sta->pre_wifi_rssi_state[index] == + BTC_RSSI_STATE_STAY_MEDIUM)) { + if (wifi_rssi >= (rssi_thresh1 + + BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT)) + wifi_rssi_state = BTC_RSSI_STATE_HIGH; + else if (wifi_rssi < rssi_thresh) + wifi_rssi_state = BTC_RSSI_STATE_LOW; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM; + } else { + if (wifi_rssi < rssi_thresh1) + wifi_rssi_state = BTC_RSSI_STATE_MEDIUM; + else + wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH; + } + } + + coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state; + + return wifi_rssi_state; +} + +void halbtc8703b1ant_update_ra_mask(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u32 dis_rate_mask) +{ + coex_dm->cur_ra_mask = dis_rate_mask; + + if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) + btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK, + &coex_dm->cur_ra_mask); + coex_dm->pre_ra_mask = coex_dm->cur_ra_mask; +} + +void halbtc8703b1ant_auto_rate_fallback_retry(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + boolean wifi_under_b_mode = false; + + coex_dm->cur_arfr_type = type; + + if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) { + switch (coex_dm->cur_arfr_type) { + case 0: /* normal mode */ + btcoexist->btc_write_4byte(btcoexist, 0x430, + coex_dm->backup_arfr_cnt1); + btcoexist->btc_write_4byte(btcoexist, 0x434, + coex_dm->backup_arfr_cnt2); + break; + case 1: + btcoexist->btc_get(btcoexist, + BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + if (wifi_under_b_mode) { + btcoexist->btc_write_4byte(btcoexist, + 0x430, 0x0); + btcoexist->btc_write_4byte(btcoexist, + 0x434, 0x01010101); + } else { + btcoexist->btc_write_4byte(btcoexist, + 0x430, 0x0); + btcoexist->btc_write_4byte(btcoexist, + 0x434, 0x04030201); + } + break; + default: + break; + } + } + + coex_dm->pre_arfr_type = coex_dm->cur_arfr_type; +} + +void halbtc8703b1ant_retry_limit(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + coex_dm->cur_retry_limit_type = type; + + if (force_exec || + (coex_dm->pre_retry_limit_type != + coex_dm->cur_retry_limit_type)) { + switch (coex_dm->cur_retry_limit_type) { + case 0: /* normal mode */ + btcoexist->btc_write_2byte(btcoexist, 0x42a, + coex_dm->backup_retry_limit); + break; + case 1: /* retry limit=8 */ + btcoexist->btc_write_2byte(btcoexist, 0x42a, + 0x0808); + break; + default: + break; + } + } + + coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type; +} + +void halbtc8703b1ant_ampdu_max_time(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + coex_dm->cur_ampdu_time_type = type; + + if (force_exec || + (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) { + switch (coex_dm->cur_ampdu_time_type) { + case 0: /* normal mode */ + btcoexist->btc_write_1byte(btcoexist, 0x456, + coex_dm->backup_ampdu_max_time); + break; + case 1: /* AMPDU timw = 0x38 * 32us */ + btcoexist->btc_write_1byte(btcoexist, 0x456, + 0x38); + break; + default: + break; + } + } + + coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type; +} + +void halbtc8703b1ant_limited_tx(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 ra_mask_type, IN u8 arfr_type, + IN u8 retry_limit_type, IN u8 ampdu_time_type) +{ + switch (ra_mask_type) { + case 0: /* normal mode */ + halbtc8703b1ant_update_ra_mask(btcoexist, force_exec, + 0x0); + break; + case 1: /* disable cck 1/2 */ + halbtc8703b1ant_update_ra_mask(btcoexist, force_exec, + 0x00000003); + break; + case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */ + halbtc8703b1ant_update_ra_mask(btcoexist, force_exec, + 0x0001f1f7); + break; + default: + break; + } + + halbtc8703b1ant_auto_rate_fallback_retry(btcoexist, force_exec, + arfr_type); + halbtc8703b1ant_retry_limit(btcoexist, force_exec, retry_limit_type); + halbtc8703b1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type); +} + +void halbtc8703b1ant_limited_rx(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean rej_ap_agg_pkt, + IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size) +{ + boolean reject_rx_agg = rej_ap_agg_pkt; + boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size; + u8 rx_agg_size = agg_buf_size; + + /* ============================================ */ + /* Rx Aggregation related setting */ + /* ============================================ */ + btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, + &reject_rx_agg); + /* decide BT control aggregation buf size or not */ + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, + &bt_ctrl_rx_agg_size); + /* aggregation buf size, only work when BT control Rx aggregation size. */ + btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size); + /* real update aggregation setting */ + btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); + + +} + +void halbtc8703b1ant_query_bt_info(IN struct btc_coexist *btcoexist) +{ + u8 h2c_parameter[1] = {0}; + + coex_sta->c2h_bt_info_req_sent = true; + + h2c_parameter[0] |= BIT(0); /* trigger */ + + btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter); +} + +void halbtc8703b1ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist) +{ + u32 reg_hp_txrx, reg_lp_txrx, u32tmp; + u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0; + static u8 num_of_bt_counter_chk = 0, cnt_slave = 0; + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + + /* to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS */ + /* if (! (btcoexist->btc_read_1byte(btcoexist, 0x76e) & 0x8) ) */ + + reg_hp_txrx = 0x770; + reg_lp_txrx = 0x774; + + u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx); + reg_hp_tx = u32tmp & MASKLWORD; + reg_hp_rx = (u32tmp & MASKHWORD) >> 16; + + u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx); + reg_lp_tx = u32tmp & MASKLWORD; + reg_lp_rx = (u32tmp & MASKHWORD) >> 16; + + coex_sta->high_priority_tx = reg_hp_tx; + coex_sta->high_priority_rx = reg_hp_rx; + coex_sta->low_priority_tx = reg_lp_tx; + coex_sta->low_priority_rx = reg_lp_rx; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n", + reg_hp_rx, reg_hp_tx, reg_lp_rx, reg_lp_tx); + + BTC_TRACE(trace_buf); + + /* reset counter */ + btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc); + + if ((coex_sta->low_priority_tx > 1150) && + (!coex_sta->c2h_bt_inquiry_page)) + coex_sta->pop_event_cnt++; + + if ((coex_sta->low_priority_rx >= 1150) && (coex_sta->low_priority_rx >= coex_sta->low_priority_tx) + && (!coex_sta->under_ips) && (!coex_sta->c2h_bt_inquiry_page) && (coex_sta->bt_link_exist)) { + if (cnt_slave >= 3) { + bt_link_info->slave_role = true; + cnt_slave = 3; + } else + cnt_slave++; + } else { + if (cnt_slave == 0) { + bt_link_info->slave_role = false; + cnt_slave = 0; + } else + cnt_slave--; + + } + + if ((coex_sta->high_priority_tx == 0) && (coex_sta->high_priority_rx == 0) && (coex_sta->low_priority_tx == 0) && + (coex_sta->low_priority_rx == 0)) { + num_of_bt_counter_chk++; + if (num_of_bt_counter_chk >= 3) { + halbtc8703b1ant_query_bt_info(btcoexist); + num_of_bt_counter_chk = 0; + } + } + + +#if 0 + /* Add Hi-Pri Tx/Rx counter to avoid false detection */ + if (((coex_sta->hid_exist) || (coex_sta->sco_exist)) && + (coex_sta->high_priority_tx + coex_sta->high_priority_rx + >= 160) + && (!coex_sta->c2h_bt_inquiry_page)) + coex_sta->bt_hi_pri_link_exist = true; + else + coex_sta->bt_hi_pri_link_exist = false; + + if ((coex_sta->acl_busy) && + (coex_sta->num_of_profile == 0)) { + if (coex_sta->low_priority_tx + + coex_sta->low_priority_rx >= 160) { + coex_sta->pan_exist = true; + coex_sta->num_of_profile++; + coex_sta->wrong_profile_notification++; + } + } +#endif + +} + + +void halbtc8703b1ant_monitor_wifi_ctr(IN struct btc_coexist *btcoexist) +{ + s32 wifi_rssi = 0; + boolean wifi_busy = false, wifi_under_b_mode = false; + static u8 cck_lock_counter = 0; + u32 total_cnt; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + + if (coex_sta->under_ips) { + coex_sta->crc_ok_cck = 0; + coex_sta->crc_ok_11g = 0; + coex_sta->crc_ok_11n = 0; + coex_sta->crc_ok_11n_agg = 0; + + coex_sta->crc_err_cck = 0; + coex_sta->crc_err_11g = 0; + coex_sta->crc_err_11n = 0; + coex_sta->crc_err_11n_agg = 0; + } else { + coex_sta->crc_ok_cck = btcoexist->btc_read_4byte(btcoexist, + 0xf88); + coex_sta->crc_ok_11g = btcoexist->btc_read_2byte(btcoexist, + 0xf94); + coex_sta->crc_ok_11n = btcoexist->btc_read_2byte(btcoexist, + 0xf90); + coex_sta->crc_ok_11n_agg = btcoexist->btc_read_2byte(btcoexist, + 0xfb8); + + coex_sta->crc_err_cck = btcoexist->btc_read_4byte(btcoexist, + 0xf84); + coex_sta->crc_err_11g = btcoexist->btc_read_2byte(btcoexist, + 0xf96); + coex_sta->crc_err_11n = btcoexist->btc_read_2byte(btcoexist, + 0xf92); + coex_sta->crc_err_11n_agg = btcoexist->btc_read_2byte(btcoexist, + 0xfba); + } + + + /* reset counter */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0); + + if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) { + total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g + + coex_sta->crc_ok_11n + + coex_sta->crc_ok_11n_agg; + + if ((coex_dm->bt_status == BT_8703B_1ANT_BT_STATUS_ACL_BUSY) || + (coex_dm->bt_status == + BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY) || + (coex_dm->bt_status == + BT_8703B_1ANT_BT_STATUS_SCO_BUSY)) { + if (coex_sta->crc_ok_cck > (total_cnt - + coex_sta->crc_ok_cck)) { + if (cck_lock_counter < 3) + cck_lock_counter++; + } else { + if (cck_lock_counter > 0) + cck_lock_counter--; + } + + } else { + if (cck_lock_counter > 0) + cck_lock_counter--; + } + } else { + if (cck_lock_counter > 0) + cck_lock_counter--; + } + + if (!coex_sta->pre_ccklock) { + + if (cck_lock_counter >= 3) + coex_sta->cck_lock = true; + else + coex_sta->cck_lock = false; + } else { + if (cck_lock_counter == 0) + coex_sta->cck_lock = false; + else + coex_sta->cck_lock = true; + } + + if (coex_sta->cck_lock) + coex_sta->cck_ever_lock = true; + + coex_sta->pre_ccklock = coex_sta->cck_lock; + + +} + +boolean halbtc8703b1ant_is_wifibt_status_changed(IN struct btc_coexist *btcoexist) +{ + static boolean pre_wifi_busy = false, pre_under_4way = false, + pre_bt_hs_on = false, pre_bt_off = false; + boolean wifi_busy = false, under_4way = false, bt_hs_on = false; + boolean wifi_connected = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, + &under_4way); + + if (coex_sta->bt_disabled != pre_bt_off) { + pre_bt_off = coex_sta->bt_disabled; + + if (coex_sta->bt_disabled) + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is disabled !!\n"); + else + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is enabled !!\n"); + + BTC_TRACE(trace_buf); + return true; + } + + if (wifi_connected) { + if (wifi_busy != pre_wifi_busy) { + pre_wifi_busy = wifi_busy; + return true; + } + if (under_4way != pre_under_4way) { + pre_under_4way = under_4way; + return true; + } + if (bt_hs_on != pre_bt_hs_on) { + pre_bt_hs_on = bt_hs_on; + return true; + } + } + + return false; +} + +void halbtc8703b1ant_update_bt_link_info(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean bt_hs_on = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + + bt_link_info->bt_link_exist = coex_sta->bt_link_exist; + bt_link_info->sco_exist = coex_sta->sco_exist; + bt_link_info->a2dp_exist = coex_sta->a2dp_exist; + bt_link_info->pan_exist = coex_sta->pan_exist; + bt_link_info->hid_exist = coex_sta->hid_exist; + bt_link_info->bt_hi_pri_link_exist = coex_sta->bt_hi_pri_link_exist; + bt_link_info->acl_busy = coex_sta->acl_busy; + + /* work around for HS mode. */ + if (bt_hs_on) { + bt_link_info->pan_exist = true; + bt_link_info->bt_link_exist = true; + } + + /* check if Sco only */ + if (bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + !bt_link_info->hid_exist) + bt_link_info->sco_only = true; + else + bt_link_info->sco_only = false; + + /* check if A2dp only */ + if (!bt_link_info->sco_exist && + bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + !bt_link_info->hid_exist) + bt_link_info->a2dp_only = true; + else + bt_link_info->a2dp_only = false; + + /* check if Pan only */ + if (!bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + bt_link_info->pan_exist && + !bt_link_info->hid_exist) + bt_link_info->pan_only = true; + else + bt_link_info->pan_only = false; + + /* check if Hid only */ + if (!bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + bt_link_info->hid_exist) + bt_link_info->hid_only = true; + else + bt_link_info->hid_only = false; +} + +void halbtc8703b1ant_update_wifi_channel_info(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + u8 h2c_parameter[3] = {0}; + u32 wifi_bw; + u8 wifi_central_chnl; + + /* only 2.4G we need to inform bt the chnl mask */ + btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, + &wifi_central_chnl); + if ((BTC_MEDIA_CONNECT == type) && + (wifi_central_chnl <= 14)) { + h2c_parameter[0] = + 0x1; /* enable BT AFH skip WL channel for 8703b because BT Rx LO interference */ + /* h2c_parameter[0] = 0x0; */ + h2c_parameter[1] = wifi_central_chnl; + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); + if (BTC_WIFI_BW_HT40 == wifi_bw) + h2c_parameter[2] = 0x30; + else + h2c_parameter[2] = 0x20; + } + + coex_dm->wifi_chnl_info[0] = h2c_parameter[0]; + coex_dm->wifi_chnl_info[1] = h2c_parameter[1]; + coex_dm->wifi_chnl_info[2] = h2c_parameter[2]; + + btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter); + +} + +void halbtc8703b1ant_set_bt_auto_report(IN struct btc_coexist *btcoexist, + IN boolean enable_auto_report) +{ + u8 h2c_parameter[1] = {0}; + + h2c_parameter[0] = 0; + + if (enable_auto_report) + h2c_parameter[0] |= BIT(0); + + btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter); +} + +void halbtc8703b1ant_bt_auto_report(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean enable_auto_report) +{ + coex_dm->cur_bt_auto_report = enable_auto_report; + + if (!force_exec) { + if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report) + return; + } + halbtc8703b1ant_set_bt_auto_report(btcoexist, + coex_dm->cur_bt_auto_report); + + coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report; +} + +void halbtc8703b1ant_set_fw_low_penalty_ra(IN struct btc_coexist + *btcoexist, IN boolean low_penalty_ra) +{ + u8 h2c_parameter[6] = {0}; + + h2c_parameter[0] = 0x6; /* op_code, 0x6= Retry_Penalty */ + + if (low_penalty_ra) { + h2c_parameter[1] |= BIT(0); + 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 */ + } + + btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter); +} + +void halbtc8703b1ant_low_penalty_ra(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean low_penalty_ra) +{ + coex_dm->cur_low_penalty_ra = low_penalty_ra; + + if (!force_exec) { + if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra) + return; + } + halbtc8703b1ant_set_fw_low_penalty_ra(btcoexist, + coex_dm->cur_low_penalty_ra); + + coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra; +} + +void halbtc8703b1ant_write_score_board( + IN struct btc_coexist *btcoexist, + IN u16 bitpos, + IN BOOLEAN state +) +{ + + static u16 originalval = 0x8002; + + if (state) + originalval = originalval | bitpos; + else + originalval = originalval & (~bitpos); + + + btcoexist->btc_write_2byte(btcoexist, 0xaa, originalval); +#if 0 + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "\n [BTCoex], ********** Write Scoreboard = %x**********\n", + originalval); + BTC_TRACE(trace_buf); +#endif + +} + +void halbtc8703b1ant_read_score_board( + IN struct btc_coexist *btcoexist, + IN u16 *score_board_val +) +{ + + *score_board_val = (btcoexist->btc_read_2byte(btcoexist, + 0xaa)) & 0x7fff; +} + +void halbtc8703b1ant_post_activestate_to_bt( + IN struct btc_coexist *btcoexist, + IN boolean wifi_active +) +{ + + if (wifi_active) + halbtc8703b1ant_write_score_board(btcoexist, (u16) BIT(0), TRUE); + else + halbtc8703b1ant_write_score_board(btcoexist, (u16) BIT(0), FALSE); + + /* The BT should set "No Shunt-down" mode if WL = Active for BT Synthesizer on/off interference WL Lo issue at 8703b b-cut. */ + +} + +void halbtc8703b1ant_post_onoffState_to_bt( + IN struct btc_coexist *btcoexist, + IN boolean wifi_on +) +{ + + if (wifi_on) + halbtc8703b1ant_write_score_board(btcoexist, (u16) BIT(1), TRUE); + else + halbtc8703b1ant_write_score_board(btcoexist, (u16) BIT(1), FALSE); + +} + +void halbtc8703b1ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist) +{ + static u32 bt_disable_cnt = 0; + boolean bt_active = true, bt_disabled = false; + u16 u16tmp; + + /* This function check if bt is disabled */ +#if 1 + if (coex_sta->high_priority_tx == 0 && + coex_sta->high_priority_rx == 0 && + coex_sta->low_priority_tx == 0 && + coex_sta->low_priority_rx == 0) + bt_active = false; + if (coex_sta->high_priority_tx == 0xffff && + coex_sta->high_priority_rx == 0xffff && + coex_sta->low_priority_tx == 0xffff && + coex_sta->low_priority_rx == 0xffff) + bt_active = false; + + +#else /* 8703b BT can't show correct on/off status in scoreboard[1] 2015/11/26 */ + + halbtc8703b1ant_read_score_board(btcoexist, &u16tmp); + + bt_active = u16tmp & BIT(1); + + +#endif + + if (bt_active) { + bt_disable_cnt = 0; + bt_disabled = false; + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, + &bt_disabled); + } else { + + bt_disable_cnt++; + if (bt_disable_cnt >= 2) { + bt_disabled = true; + bt_disable_cnt = 2; + } + + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, + &bt_disabled); + } + + + if (coex_sta->bt_disabled != bt_disabled) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is from %s to %s!!\n", + (coex_sta->bt_disabled ? "disabled" : "enabled"), + (bt_disabled ? "disabled" : "enabled")); + BTC_TRACE(trace_buf); + coex_sta->bt_disabled = bt_disabled; + + } +} + +void halbtc8703b1ant_enable_gnt_to_gpio(IN struct btc_coexist *btcoexist, + IN boolean isenable) +{ + +#if (BT_8703B_1ANT_ENABLE_GNTBT_TO_GPIO14 == 1) + if (isenable) { + /* enable GNT_WL/GNT_BT debug signal to GPIO14/15 */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x1); + + /* enable GNT_BT debug to GPIO */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e, 0x40, 0x0); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x1, 0x0); + } else { + /* enable GNT_WL/GNT_BT debug signal to GPIO14/15 */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x0); + + /* Disable GNT_BT debug to GPIO, and enable chip_wakeup_host */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e, 0x40, 0x1); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x1, 0x1); + } +#endif +} + +u32 halbtc8703b1ant_ltecoex_indirect_read_reg(IN struct btc_coexist *btcoexist, + IN u16 reg_addr) +{ + u32 j = 0; + + + /* wait for ready bit before access 0x7c0 */ + btcoexist->btc_write_4byte(btcoexist, 0x7c0, 0x800F0000 | reg_addr); + + do { + j++; + } while (((btcoexist->btc_read_1byte(btcoexist, + 0x7c3)&BIT(5)) == 0) && + (j < BT_8703B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT)); + + + return btcoexist->btc_read_4byte(btcoexist, + 0x7c8); /* get read data */ + +} + +void halbtc8703b1ant_ltecoex_indirect_write_reg(IN struct btc_coexist *btcoexist, + IN u16 reg_addr, IN u32 bit_mask, IN u32 reg_value) +{ + u32 val, i = 0, j = 0, bitpos = 0; + + + if (bit_mask == 0x0) + return; + if (bit_mask == 0xffffffff) { + btcoexist->btc_write_4byte(btcoexist, 0x7c4, + reg_value); /* put write data */ + + /* wait for ready bit before access 0x7c0 */ + do { + j++; + } while (((btcoexist->btc_read_1byte(btcoexist, + 0x7c3)&BIT(5)) == 0) && + (j < BT_8703B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT)); + + + btcoexist->btc_write_4byte(btcoexist, 0x7c0, + 0xc00F0000 | reg_addr); + } else { + for (i = 0; i <= 31; i++) { + if (((bit_mask >> i) & 0x1) == 0x1) { + bitpos = i; + break; + } + } + + /* read back register value before write */ + val = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, + reg_addr); + val = (val & (~bit_mask)) | (reg_value << bitpos); + + btcoexist->btc_write_4byte(btcoexist, 0x7c4, + val); /* put write data */ + + /* wait for ready bit before access 0x7c0 */ + do { + j++; + } while (((btcoexist->btc_read_1byte(btcoexist, + 0x7c3)&BIT(5)) == 0) && + (j < BT_8703B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT)); + + + btcoexist->btc_write_4byte(btcoexist, 0x7c0, + 0xc00F0000 | reg_addr); + + } + +} + +void halbtc8703b1ant_ltecoex_enable(IN struct btc_coexist *btcoexist, + IN boolean enable) +{ + u8 val; + + val = (enable) ? 1 : 0; + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, 0x38, 0x80, + val); /* 0x38[7] */ + +} + +void halbtc8703b1ant_sw_mechanism(IN struct btc_coexist *btcoexist, + IN boolean low_penalty_ra) +{ + halbtc8703b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra); +} + +void halbtc8703b1ant_ltecoex_pathcontrol_owner(IN struct btc_coexist *btcoexist, + IN boolean wifi_control) +{ + u8 val; + + val = (wifi_control) ? 1 : 0; + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x4, + val); /* 0x70[26] */ + +} + +void halbtc8703b1ant_ltecoex_set_gnt_bt(IN struct btc_coexist *btcoexist, + IN u8 control_block, IN boolean sw_control, IN u8 state) +{ + u32 val = 0, bit_mask; + + state = state & 0x1; + val = (sw_control) ? ((state << 1) | 0x1) : 0; + + switch (control_block) { + case BT_8703B_1ANT_GNT_BLOCK_RFC_BB: + default: + bit_mask = 0xc000; + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, + 0x38, bit_mask, val); /* 0x38[15:14] */ + bit_mask = 0x0c00; + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, + 0x38, bit_mask, val); /* 0x38[11:10] */ + break; + case BT_8703B_1ANT_GNT_BLOCK_RFC: + bit_mask = 0xc000; + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, + 0x38, bit_mask, val); /* 0x38[15:14] */ + break; + case BT_8703B_1ANT_GNT_BLOCK_BB: + bit_mask = 0x0c00; + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, + 0x38, bit_mask, val); /* 0x38[11:10] */ + break; + + } + +} + +void halbtc8703b1ant_ltecoex_set_gnt_wl(IN struct btc_coexist *btcoexist, + IN u8 control_block, IN boolean sw_control, IN u8 state) +{ + u32 val = 0, bit_mask; + + state = state & 0x1; + val = (sw_control) ? ((state << 1) | 0x1) : 0; + + switch (control_block) { + case BT_8703B_1ANT_GNT_BLOCK_RFC_BB: + default: + bit_mask = 0x3000; + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, + 0x38, bit_mask, val); /* 0x38[13:12] */ + bit_mask = 0x0300; + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, + 0x38, bit_mask, val); /* 0x38[9:8] */ + break; + case BT_8703B_1ANT_GNT_BLOCK_RFC: + bit_mask = 0x3000; + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, + 0x38, bit_mask, val); /* 0x38[13:12] */ + break; + case BT_8703B_1ANT_GNT_BLOCK_BB: + bit_mask = 0x0300; + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, + 0x38, bit_mask, val); /* 0x38[9:8] */ + break; + + } + +} + +void halbtc8703b1ant_ltecoex_set_coex_table(IN struct btc_coexist *btcoexist, + IN u8 table_type, IN u16 table_content) +{ + u16 reg_addr = 0x0000; + + switch (table_type) { + case BT_8703B_1ANT_CTT_WL_VS_LTE: + reg_addr = 0xa0; + break; + case BT_8703B_1ANT_CTT_BT_VS_LTE: + reg_addr = 0xa4; + break; + } + + if (reg_addr != 0x0000) + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, reg_addr, + 0xffff, table_content); /* 0xa0[15:0] or 0xa4[15:0] */ + + +} + + +void halbtc8703b1ant_ltecoex_set_break_table(IN struct btc_coexist *btcoexist, + IN u8 table_type, IN u8 table_content) +{ + u16 reg_addr = 0x0000; + + switch (table_type) { + case BT_8703B_1ANT_LBTT_WL_BREAK_LTE: + reg_addr = 0xa8; + break; + case BT_8703B_1ANT_LBTT_BT_BREAK_LTE: + reg_addr = 0xac; + break; + case BT_8703B_1ANT_LBTT_LTE_BREAK_WL: + reg_addr = 0xb0; + break; + case BT_8703B_1ANT_LBTT_LTE_BREAK_BT: + reg_addr = 0xb4; + break; + } + + if (reg_addr != 0x0000) + halbtc8703b1ant_ltecoex_indirect_write_reg(btcoexist, reg_addr, + 0xff, table_content); /* 0xa8[15:0] or 0xb4[15:0] */ + + +} + +void halbtc8703b1ant_set_coex_table(IN struct btc_coexist *btcoexist, + IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc) +{ + btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0); + + btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4); + + btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8); + + btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc); +} + +void halbtc8703b1ant_coex_table(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4, + IN u32 val0x6c8, IN u8 val0x6cc) +{ + coex_dm->cur_val0x6c0 = val0x6c0; + coex_dm->cur_val0x6c4 = val0x6c4; + coex_dm->cur_val0x6c8 = val0x6c8; + coex_dm->cur_val0x6cc = val0x6cc; + + if (!force_exec) { + if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) && + (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) && + (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) && + (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc)) + return; + } + halbtc8703b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8, + val0x6cc); + + coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0; + coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4; + coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8; + coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc; +} + +void halbtc8703b1ant_coex_table_with_type(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + u32 break_table; + u8 select_table; + + coex_sta->coex_table_type = type; + + if (coex_sta->concurrent_rx_mode_on == true) { + break_table = 0xf0ffffff; /* set WL hi-pri can break BT */ + select_table = + 0xb; /* set Tx response = Hi-Pri (ex: Transmitting ACK,BA,CTS) */ + } else { + break_table = 0xffffff; + select_table = 0x3; + } + + switch (type) { + case 0: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0x55555555, break_table, + select_table); + break; + case 1: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0x5a5a5a5a, break_table, + select_table); + break; + case 2: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0xaa5a5a5a, 0xaa5a5a5a, break_table, + select_table); + break; + case 3: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0xaa555555, 0xaa5a5a5a, break_table, + select_table); + break; + case 4: + halbtc8703b1ant_coex_table(btcoexist, + force_exec, 0xaa555555, 0xaa5a5a5a, + break_table, select_table); + break; + case 5: + halbtc8703b1ant_coex_table(btcoexist, + force_exec, 0x5a5a5a5a, 0x5a5a5a5a, + break_table, select_table); + break; + case 6: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0xaaaaaaaa, break_table, + select_table); + break; + case 7: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0xaaaaaaaa, 0xaaaaaaaa, break_table, + select_table); + break; + case 8: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, break_table, + select_table); + break; + case 9: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, break_table, + select_table); + break; + case 10: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, break_table, + select_table); + break; + case 11: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, break_table, + select_table); + break; + case 12: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, break_table, + select_table); + break; + case 13: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x5fff5fff, 0xaaaaaaaa, break_table, + select_table); + break; + case 14: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x5fff5fff, 0x5ada5ada, break_table, + select_table); + break; + case 15: + halbtc8703b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0xaaaaaaaa, break_table, + select_table); + break; + default: + break; + } +} + +void halbtc8703b1ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist, + IN boolean enable) +{ + u8 h2c_parameter[1] = {0}; + + if (enable) { + h2c_parameter[0] |= BIT(0); /* function enable */ + } + + btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter); +} + +void halbtc8703b1ant_ignore_wlan_act(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean enable) +{ + coex_dm->cur_ignore_wlan_act = enable; + + if (!force_exec) { + if (coex_dm->pre_ignore_wlan_act == + coex_dm->cur_ignore_wlan_act) + return; + } + halbtc8703b1ant_set_fw_ignore_wlan_act(btcoexist, enable); + + coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act; +} + +void halbtc8703b1ant_set_lps_rpwm(IN struct btc_coexist *btcoexist, + IN u8 lps_val, IN u8 rpwm_val) +{ + u8 lps = lps_val; + u8 rpwm = rpwm_val; + + btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps); + btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm); +} + +void halbtc8703b1ant_lps_rpwm(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val) +{ + coex_dm->cur_lps = lps_val; + coex_dm->cur_rpwm = rpwm_val; + + if (!force_exec) { + if ((coex_dm->pre_lps == coex_dm->cur_lps) && + (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) + return; + } + halbtc8703b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val); + + coex_dm->pre_lps = coex_dm->cur_lps; + coex_dm->pre_rpwm = coex_dm->cur_rpwm; +} + +void halbtc8703b1ant_ps_tdma_check_for_power_save_state( + IN struct btc_coexist *btcoexist, IN boolean new_ps_state) +{ + u8 lps_mode = 0x0; + u8 h2c_parameter[5] = {0x8, 0, 0, 0, 0}; + + btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode); + + if (lps_mode) { /* already under LPS state */ + if (new_ps_state) { + /* keep state under LPS, do nothing. */ + } else { + /* will leave LPS state, turn off psTdma first */ + /*halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 8); */ + btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter); + } + } else { /* NO PS state */ + if (new_ps_state) { + /* will enter LPS state, turn off psTdma first */ + /*halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 8);*/ + btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter); + } else { + /* keep state under NO PS state, do nothing. */ + } + } +} + +void halbtc8703b1ant_power_save_state(IN struct btc_coexist *btcoexist, + IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val) +{ + boolean low_pwr_disable = false; + + switch (ps_type) { + case BTC_PS_WIFI_NATIVE: + /* recover to original 32k low power setting */ + coex_sta->force_lps_on = false; + low_pwr_disable = false; + btcoexist->btc_set(btcoexist, + BTC_SET_ACT_DISABLE_LOW_POWER, + &low_pwr_disable); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, + NULL); + + break; + case BTC_PS_LPS_ON: + coex_sta->force_lps_on = true; + halbtc8703b1ant_ps_tdma_check_for_power_save_state( + btcoexist, true); + halbtc8703b1ant_lps_rpwm(btcoexist, NORMAL_EXEC, + lps_val, rpwm_val); + /* when coex force to enter LPS, do not enter 32k low power. */ + low_pwr_disable = true; + btcoexist->btc_set(btcoexist, + BTC_SET_ACT_DISABLE_LOW_POWER, + &low_pwr_disable); + /* power save must executed before psTdma. */ + btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, + NULL); + + break; + case BTC_PS_LPS_OFF: + coex_sta->force_lps_on = false; + halbtc8703b1ant_ps_tdma_check_for_power_save_state( + btcoexist, false); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, + NULL); + + break; + default: + break; + } +} + + + +void halbtc8703b1ant_set_fw_pstdma(IN struct btc_coexist *btcoexist, + IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5) +{ + u8 h2c_parameter[5] = {0}; + u8 real_byte1 = byte1, real_byte5 = byte5; + boolean ap_enable = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, + &ap_enable); + + if (ap_enable) { + if (byte1 & BIT(4) && !(byte1 & BIT(5))) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], FW for 1Ant AP mode\n"); + BTC_TRACE(trace_buf); + real_byte1 &= ~BIT(4); + real_byte1 |= BIT(5); + + real_byte5 |= BIT(5); + real_byte5 &= ~BIT(6); + + halbtc8703b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + } + } else if (byte1 & BIT(4) && !(byte1 & BIT(5))) { + + halbtc8703b1ant_power_save_state( + btcoexist, BTC_PS_LPS_ON, 0x50, + 0x4); + } else { + halbtc8703b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + } + + + h2c_parameter[0] = real_byte1; + h2c_parameter[1] = byte2; + h2c_parameter[2] = byte3; + h2c_parameter[3] = byte4; + h2c_parameter[4] = real_byte5; + + coex_dm->ps_tdma_para[0] = real_byte1; + coex_dm->ps_tdma_para[1] = byte2; + coex_dm->ps_tdma_para[2] = byte3; + coex_dm->ps_tdma_para[3] = byte4; + coex_dm->ps_tdma_para[4] = real_byte5; + + btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter); +} + + +void halbtc8703b1ant_ps_tdma(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean turn_on, IN u8 type) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_busy = false; + u8 rssi_adjust_val = 0; + static u8 psTdmaByte4Modify = 0x0, pre_psTdmaByte4Modify = 0x0; + static boolean pre_wifi_busy = false; + + coex_dm->cur_ps_tdma_on = turn_on; + coex_dm->cur_ps_tdma = type; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + if (wifi_busy != pre_wifi_busy) { + force_exec = true; + pre_wifi_busy = wifi_busy; + } + + /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */ + if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist)) + psTdmaByte4Modify = 0x1; + else + psTdmaByte4Modify = 0x0; + + if (pre_psTdmaByte4Modify != psTdmaByte4Modify) { + + force_exec = true; + pre_psTdmaByte4Modify = psTdmaByte4Modify; + } + + if (!force_exec) { + if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) && + (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma)) + return; + } + + if (coex_dm->cur_ps_tdma_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** TDMA(on, %d) **********\n", + coex_dm->cur_ps_tdma); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** TDMA(off, %d) **********\n", + coex_dm->cur_ps_tdma); + BTC_TRACE(trace_buf); + } + + if (turn_on) { + + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8, + 0x1); /* enable TBTT nterrupt */ + } + + + if (turn_on) { + switch (type) { + default: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x35, 0x03, 0x11, 0x11); + break; + + case 3: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x51, 0x3a, 0x03, 0x10, 0x10); + break; + case 4: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x51, 0x21, 0x03, 0x10, 0x10); + break; + case 5: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x15, 0x03, 0x11, 0x11); + break; + case 6: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x20, 0x03, 0x11, 0x11); + break; + case 7: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x51, 0x10, 0x03, 0x10, 0x14 | psTdmaByte4Modify); + break; + case 8: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x51, 0x10, 0x03, 0x10, 0x14 | psTdmaByte4Modify); + break; + case 13: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x51, 0x25, 0x03, 0x10, 0x10 | psTdmaByte4Modify); + break; + case 14: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x51, 0x15, 0x03, 0x10, 0x10 | psTdmaByte4Modify); + break; + case 15: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x51, 0x20, 0x03, 0x10, 0x10 | psTdmaByte4Modify); + break; + case 17: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x10, 0x03, 0x11, 0x14 | psTdmaByte4Modify); + break; + case 19: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x15, 0x03, 0x11, 0x10); + break; + case 20: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x30, 0x03, 0x11, 0x10); + break; + case 21: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x30, 0x03, 0x11, 0x10); + break; + case 22: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x25, 0x03, 0x11, 0x10); + break; + case 32: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x35, 0x03, 0x11, 0x11); + break; + case 33: + halbtc8703b1ant_set_fw_pstdma(btcoexist, + 0x61, 0x35, 0x03, 0x11, 0x10); + break; + + } + } else { + + /* disable PS tdma */ + switch (type) { + case 8: /* PTA Control */ + halbtc8703b1ant_set_fw_pstdma(btcoexist, 0x8, + 0x0, 0x0, 0x0, 0x0); + break; + case 0: + default: /* Software control, Antenna at BT side */ + halbtc8703b1ant_set_fw_pstdma(btcoexist, 0x0, + 0x0, 0x0, 0x0, 0x0); + break; + case 1: /* 2-Ant, 0x778=3, antenna control by antenna diversity */ + halbtc8703b1ant_set_fw_pstdma(btcoexist, 0x0, + 0x0, 0x0, 0x48, 0x0); + break; + } + } + + /* update pre state */ + coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on; + coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma; +} + +void halbtc8703b1ant_set_ant_path(IN struct btc_coexist *btcoexist, + IN u8 ant_pos_type, IN boolean force_exec, IN boolean init_hwcfg, + IN boolean wifi_off) +{ + u32 cnt_bt_cal_chk = 0; + boolean is_in_mp_mode = false; + u8 u8tmp = 0; + u32 u32tmp1 = 0, u32tmp2 = 0; + + coex_dm->cur_ant_pos_type = ant_pos_type; + +#if 1 + u32tmp1 = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, + 0x38); + u32tmp2 = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, + 0x54); + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** (Before Ant Setup) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n", + u8tmp, u32tmp1, u32tmp2); + BTC_TRACE(trace_buf); +#endif + + if (init_hwcfg) { + /* Disable LTE Coex Function in WiFi side (this should be on if LTE coex is required) */ + halbtc8703b1ant_ltecoex_enable(btcoexist, 0x0); + + /* GNT_WL_LTE always = 1 (this should be config if LTE coex is required) */ + halbtc8703b1ant_ltecoex_set_coex_table(btcoexist, + BT_8703B_1ANT_CTT_WL_VS_LTE, 0xffff); + + /* GNT_BT_LTE always = 1 (this should be config if LTE coex is required) */ + halbtc8703b1ant_ltecoex_set_coex_table(btcoexist, + BT_8703B_1ANT_CTT_BT_VS_LTE, 0xffff); + + /* Wait If BT IQK running, because Path control owner is at BT during BT IQK (setup by WiFi firmware) */ + while (cnt_bt_cal_chk <= 20) { + u8tmp = btcoexist->btc_read_1byte(btcoexist, + 0x49d); + cnt_bt_cal_chk++; + if (u8tmp & BIT(0)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n", + cnt_bt_cal_chk); + BTC_TRACE(trace_buf); + delay_ms(50); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n", + cnt_bt_cal_chk); + BTC_TRACE(trace_buf); + break; + } + } + + /* set Path control owner to WL at initial step */ + halbtc8703b1ant_ltecoex_pathcontrol_owner(btcoexist, + BT_8703B_1ANT_PCO_WLSIDE); + + /* set GNT_BT to SW high */ + halbtc8703b1ant_ltecoex_set_gnt_bt(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_SW, + BT_8703B_1ANT_SIG_STA_SET_TO_HIGH); + /* Set GNT_WL to SW low */ + halbtc8703b1ant_ltecoex_set_gnt_wl(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_SW, + BT_8703B_1ANT_SIG_STA_SET_TO_LOW); + + coex_sta->gnt_control_by_PTA = false; + + } else if (wifi_off) { + /* Disable LTE Coex Function in WiFi side */ + halbtc8703b1ant_ltecoex_enable(btcoexist, 0x0); + + /* set Path control owner to BT */ + halbtc8703b1ant_ltecoex_pathcontrol_owner(btcoexist, + BT_8703B_1ANT_PCO_BTSIDE); + + coex_sta->gnt_control_by_PTA = false; + } else { + + halbtc8703b1ant_ltecoex_pathcontrol_owner(btcoexist, + BT_8703B_1ANT_PCO_WLSIDE); + + + if (force_exec || + (coex_dm->cur_ant_pos_type != coex_dm->pre_ant_pos_type) || + init_hwcfg || wifi_off) { + /* internal switch setting */ + switch (ant_pos_type) { + case BTC_ANT_PATH_WIFI: + /* set GNT_BT to low */ + halbtc8703b1ant_ltecoex_set_gnt_bt(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_SW, + BT_8703B_1ANT_SIG_STA_SET_TO_LOW); + /* Set GNT_WL to high */ + halbtc8703b1ant_ltecoex_set_gnt_wl(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_SW, + BT_8703B_1ANT_SIG_STA_SET_TO_HIGH); + + coex_sta->gnt_control_by_PTA = false; + break; + case BTC_ANT_PATH_BT: + /*halbtc8703b1ant_ltecoex_pathcontrol_owner( + btcoexist, BT_8703B_1ANT_PCO_BTSIDE);*/ + /* set GNT_BT to high */ + halbtc8703b1ant_ltecoex_set_gnt_bt(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_SW, + BT_8703B_1ANT_SIG_STA_SET_TO_HIGH); + /* Set GNT_WL to low */ + halbtc8703b1ant_ltecoex_set_gnt_wl(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_SW, + BT_8703B_1ANT_SIG_STA_SET_TO_LOW); + + coex_sta->gnt_control_by_PTA = false; + break; + default: + case BTC_ANT_PATH_PTA: + /* set GNT_BT to PTA */ + halbtc8703b1ant_ltecoex_set_gnt_bt(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_PTA, + BT_8703B_1ANT_SIG_STA_SET_BY_HW); + /* Set GNT_WL to PTA */ + halbtc8703b1ant_ltecoex_set_gnt_wl(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_PTA, + BT_8703B_1ANT_SIG_STA_SET_BY_HW); + + coex_sta->gnt_control_by_PTA = true; + break; + } + } + } + +#if 1 + u32tmp1 = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38); + u32tmp2 = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54); + u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73); + + if (init_hwcfg) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** (After Ant-Setup Init) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n", + u8tmp, u32tmp1, u32tmp2); + BTC_TRACE(trace_buf); + } else if (wifi_off) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** (After Ant-Setup WiFi off) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n", + u8tmp, u32tmp1, u32tmp2); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** (After Ant-Setup Run time) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n", + u8tmp, u32tmp1, u32tmp2); + BTC_TRACE(trace_buf); + } +#endif + + coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type; +} + + +boolean halbtc8703b1ant_is_common_action(IN struct btc_coexist *btcoexist) +{ + boolean common = false, wifi_connected = false, wifi_busy = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + if (!wifi_connected && + BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n"); + BTC_TRACE(trace_buf); + + /* halbtc8703b1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else if (wifi_connected && + (BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi connected + BT non connected-idle!!\n"); + BTC_TRACE(trace_buf); + + /* halbtc8703b1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else if (!wifi_connected && + (BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi non connected-idle + BT connected-idle!!\n"); + BTC_TRACE(trace_buf); + + /* halbtc8703b1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else if (wifi_connected && + (BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi connected + BT connected-idle!!\n"); + BTC_TRACE(trace_buf); + + /* halbtc8703b1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else if (!wifi_connected && + (BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE != coex_dm->bt_status)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi non connected-idle + BT Busy!!\n"); + BTC_TRACE(trace_buf); + + /* halbtc8703b1ant_sw_mechanism(btcoexist, false); */ + + common = true; + } else { + if (wifi_busy) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi Connected-Busy + BT Busy!!\n"); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Wifi Connected-Idle + BT Busy!!\n"); + BTC_TRACE(trace_buf); + } + + common = false; + } + + return common; +} + +/* ********************************************* + * + * Software Coex Mechanism start + * + * ********************************************* */ + +/* SCO only or SCO+PAN(HS) */ + +/* +void halbtc8703b1ant_action_sco(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, true); +} + + +void halbtc8703b1ant_action_hid(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, true); +} + + +void halbtc8703b1ant_action_a2dp(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, false); +} + +void halbtc8703b1ant_action_a2dp_pan_hs(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, false); +} + +void halbtc8703b1ant_action_pan_edr(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, false); +} + + +void halbtc8703b1ant_action_pan_hs(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, false); +} + + +void halbtc8703b1ant_action_pan_edr_a2dp(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, false); +} + +void halbtc8703b1ant_action_pan_edr_hid(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, true); +} + + +void halbtc8703b1ant_action_hid_a2dp_pan_edr(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, true); +} + +void halbtc8703b1ant_action_hid_a2dp(IN struct btc_coexist* btcoexist) +{ + halbtc8703b1ant_sw_mechanism(btcoexist, true); +} + +*/ + +/* ********************************************* + * + * Non-Software Coex Mechanism start + * + * ********************************************* */ +u8 halbtc8703b1ant_action_algorithm(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean bt_hs_on = false; + u8 algorithm = BT_8703B_1ANT_COEX_ALGO_UNDEFINED; + u8 num_of_diff_profile = 0; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + + if (!bt_link_info->bt_link_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], No BT link exists!!!\n"); + BTC_TRACE(trace_buf); + return algorithm; + } + + if (bt_link_info->sco_exist) + num_of_diff_profile++; + if (bt_link_info->hid_exist) + num_of_diff_profile++; + if (bt_link_info->pan_exist) + num_of_diff_profile++; + if (bt_link_info->a2dp_exist) + num_of_diff_profile++; + + if (num_of_diff_profile == 1) { + if (bt_link_info->sco_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO only\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8703B_1ANT_COEX_ALGO_SCO; + } else { + if (bt_link_info->hid_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID only\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8703B_1ANT_COEX_ALGO_HID; + } else if (bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = A2DP only\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8703B_1ANT_COEX_ALGO_A2DP; + } else if (bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = PAN(HS) only\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_PANHS; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = PAN(EDR) only\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_PANEDR; + } + } + } + } else if (num_of_diff_profile == 2) { + if (bt_link_info->sco_exist) { + if (bt_link_info->hid_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8703B_1ANT_COEX_ALGO_HID; + } else if (bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + A2DP ==> SCO\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8703B_1ANT_COEX_ALGO_SCO; + } else if (bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8703B_1ANT_COEX_ALGO_SCO; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; + } + } + } else { + if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + A2DP\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP; + } else if (bt_link_info->hid_exist && + bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_HID_A2DP; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; + } + } else if (bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_A2DP_PANHS; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = A2DP + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_PANEDR_A2DP; + } + } + } + } else if (num_of_diff_profile == 3) { + if (bt_link_info->sco_exist) { + if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8703B_1ANT_COEX_ALGO_HID; + } else if (bt_link_info->hid_exist && + bt_link_info->pan_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_HID_A2DP; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; + } + } else if (bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = BT_8703B_1ANT_COEX_ALGO_SCO; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; + } + } + } else { + if (bt_link_info->hid_exist && + bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_HID_A2DP; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_HID_A2DP_PANEDR; + } + } + } + } else if (num_of_diff_profile >= 3) { + if (bt_link_info->sco_exist) { + if (bt_link_info->hid_exist && + bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { + if (bt_hs_on) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n"); + BTC_TRACE(trace_buf); + + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n"); + BTC_TRACE(trace_buf); + algorithm = + BT_8703B_1ANT_COEX_ALGO_PANEDR_HID; + } + } + } + } + + return algorithm; +} + + + +void halbtc8703b1ant_action_bt_whck_test(IN struct btc_coexist *btcoexist) +{ + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, + false, false); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); +} + +void halbtc8703b1ant_action_wifi_only(IN struct btc_coexist *btcoexist) +{ + halbtc8703b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, + false, false); + halbtc8703b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); +} + +void halbtc8703b1ant_action_wifi_multi_port(IN struct btc_coexist *btcoexist) +{ + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, + false, false); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); +} + +void halbtc8703b1ant_action_hs(IN struct btc_coexist *btcoexist) +{ + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); +} + +void halbtc8703b1ant_action_bt_inquiry(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, ap_enable = false, wifi_busy = false, + bt_busy = false; + boolean wifi_scan = false, wifi_link = false, wifi_roam = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, + &ap_enable); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &wifi_scan); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &wifi_link); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &wifi_roam); + + if ((wifi_link) || (wifi_roam) || (coex_sta->wifi_is_high_pri_task)) { + + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6); + + } else if ((wifi_scan) && (coex_sta->bt_create_connection)) { + + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6); + + } else if ((!wifi_connected) && (!wifi_scan)) { + + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } else if ((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) { + + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + + } else if (bt_link_info->a2dp_exist) { + + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else if (wifi_scan) { + + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + + } else if (wifi_busy) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 21); + + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 19); + + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } +} + +void halbtc8703b1ant_action_bt_sco_hid_only_busy(IN struct btc_coexist + *btcoexist, IN u8 wifi_status) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + + /* tdma and coex table */ + + if (bt_link_info->sco_exist) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5); + } else { /* HID */ + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5); + } +} + +void halbtc8703b1ant_action_wifi_connected_bt_acl_busy(IN struct btc_coexist + *btcoexist, IN u8 wifi_status) +{ + + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_busy = false; + + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + + if (bt_link_info->hid_only) { /* HID */ + halbtc8703b1ant_action_bt_sco_hid_only_busy(btcoexist, + wifi_status); + coex_dm->auto_tdma_adjust = false; + return; + } else if (bt_link_info->a2dp_only) { /* A2DP */ + if (BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifi_status) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; + } else { + + if (coex_sta->scan_ap_num >= + BT_8703B_1ANT_WIFI_NOISY_THRESH) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 17); + } else { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 7); + } + + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = true; + } + } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) || + (bt_link_info->hid_exist && bt_link_info->a2dp_exist && + bt_link_info->pan_exist)) { /* A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) */ + + if (wifi_busy) { + + if ((coex_sta->a2dp_bit_pool > 40) && (coex_sta->a2dp_bit_pool < 255)) + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 15); + else + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13); + } else + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14); + + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1); + coex_dm->auto_tdma_adjust = false; + } else if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { /* HID+A2DP */ + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 8); + coex_dm->auto_tdma_adjust = false; + + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1); + } else if ((bt_link_info->pan_only) || (bt_link_info->hid_exist && + bt_link_info->pan_exist)) { /* PAN(OPP,FTP), HID+PAN(OPP,FTP) */ + if (BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifi_status) + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 4); + else + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3); + + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1); + coex_dm->auto_tdma_adjust = false; + } else { + /* BT no-profile busy (0x9) */ + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; + } +} + +void halbtc8703b1ant_action_wifi_not_connected(IN struct btc_coexist *btcoexist) +{ + + /* tdma and coex table */ + halbtc8703b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, + false, false); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); +} + +void halbtc8703b1ant_action_wifi_not_connected_scan(IN struct btc_coexist + *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, bt_hs_on = false; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0; + boolean bt_ctrl_agg_buf_size = false; + u8 agg_buf_size = 5; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + + num_of_wifi_link = wifi_link_status >> 16; + + if (num_of_wifi_link >= 2) { + halbtc8703b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8703b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + + if (coex_sta->c2h_bt_inquiry_page) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], BT Is Inquirying\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_action_bt_inquiry(btcoexist); + } else + halbtc8703b1ant_action_wifi_multi_port(btcoexist); + return; + } + + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8703b1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8703b1ant_action_hs(btcoexist); + return; + } + + /* tdma and coex table */ + if (BT_8703B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + if (bt_link_info->a2dp_exist) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else if (bt_link_info->a2dp_exist && + bt_link_info->pan_exist) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 22); + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } + } else if ((BT_8703B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8703b1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN); + } else { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + } +} + +void halbtc8703b1ant_action_wifi_not_connected_asso_auth( + IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, bt_hs_on = false; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0; + boolean bt_ctrl_agg_buf_size = false; + u8 agg_buf_size = 5; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + + num_of_wifi_link = wifi_link_status >> 16; + + if (num_of_wifi_link >= 2) { + halbtc8703b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8703b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + + if (coex_sta->c2h_bt_inquiry_page) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], BT Is Inquirying\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_action_bt_inquiry(btcoexist); + } else + halbtc8703b1ant_action_wifi_multi_port(btcoexist); + return; + } + + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8703b1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8703b1ant_action_hs(btcoexist); + return; + } + + /* tdma and coex table */ + if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) || + (bt_link_info->a2dp_exist)) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + halbtc8703b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4); + } else if (bt_link_info->pan_exist) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + halbtc8703b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4); + } else { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8703b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2); + } +} + +void halbtc8703b1ant_action_wifi_connected_scan(IN struct btc_coexist + *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, bt_hs_on = false; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0; + boolean bt_ctrl_agg_buf_size = false; + u8 agg_buf_size = 5; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + + num_of_wifi_link = wifi_link_status >> 16; + + if (num_of_wifi_link >= 2) { + halbtc8703b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8703b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + + if (coex_sta->c2h_bt_inquiry_page) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], BT Is Inquirying\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_action_bt_inquiry(btcoexist); + } else + halbtc8703b1ant_action_wifi_multi_port(btcoexist); + return; + } + + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8703b1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8703b1ant_action_hs(btcoexist); + return; + } + + /* tdma and coex table */ + if (BT_8703B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + if (bt_link_info->a2dp_exist) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else if (bt_link_info->a2dp_exist && + bt_link_info->pan_exist) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 22); + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } + } else if ((BT_8703B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8703b1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN); + } else { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + } +} + +void halbtc8703b1ant_action_wifi_connected_specific_packet( + IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, bt_hs_on = false; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0; + boolean bt_ctrl_agg_buf_size = false; + u8 agg_buf_size = 5; + boolean wifi_busy = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + + num_of_wifi_link = wifi_link_status >> 16; + + if (num_of_wifi_link >= 2) { + halbtc8703b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8703b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + + if (coex_sta->c2h_bt_inquiry_page) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], BT Is Inquirying\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_action_bt_inquiry(btcoexist); + } else + halbtc8703b1ant_action_wifi_multi_port(btcoexist); + return; + } + + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8703b1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8703b1ant_action_hs(btcoexist); + return; + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + /* no specific packet process for both WiFi and BT very busy */ + if ((wifi_busy) && ((bt_link_info->pan_exist) || + (coex_sta->num_of_profile >= 2))) + return; + + /* tdma and coex table */ + if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5); + } else if (bt_link_info->a2dp_exist) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else if (bt_link_info->pan_exist) { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + } +} + +void halbtc8703b1ant_action_wifi_connected(IN struct btc_coexist *btcoexist) +{ + boolean wifi_busy = false; + boolean scan = false, link = false, roam = false; + boolean under_4way = false, ap_enable = false; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CoexForWifiConnect()===>\n"); + BTC_TRACE(trace_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, + &under_4way); + if (under_4way) { + halbtc8703b1ant_action_wifi_connected_specific_packet(btcoexist); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n"); + BTC_TRACE(trace_buf); + return; + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); + if (scan || link || roam) { + if (scan) + halbtc8703b1ant_action_wifi_connected_scan(btcoexist); + else + halbtc8703b1ant_action_wifi_connected_specific_packet( + btcoexist); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n"); + BTC_TRACE(trace_buf); + return; + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, + &ap_enable); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + + /* tdma and coex table */ + if (!wifi_busy) { + if (BT_8703B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + halbtc8703b1ant_action_wifi_connected_bt_acl_busy( + btcoexist, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE); + } else if ((BT_8703B_1ANT_BT_STATUS_SCO_BUSY == + coex_dm->bt_status) || + (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8703b1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE); + } else { + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 8); + halbtc8703b1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_PTA, NORMAL_EXEC, false, false); + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 2); + } + } else { + if (BT_8703B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + halbtc8703b1ant_action_wifi_connected_bt_acl_busy( + btcoexist, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY); + } else if ((BT_8703B_1ANT_BT_STATUS_SCO_BUSY == + coex_dm->bt_status) || + (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8703b1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY); + } else { + /* halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); */ + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8703b1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_PTA, NORMAL_EXEC, false, false); + /* halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); */ + halbtc8703b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } + } +} + +void halbtc8703b1ant_run_sw_coexist_mechanism(IN struct btc_coexist *btcoexist) +{ + u8 algorithm = 0; + + algorithm = halbtc8703b1ant_action_algorithm(btcoexist); + coex_dm->cur_algorithm = algorithm; + + if (halbtc8703b1ant_is_common_action(btcoexist)) { + + } else { + switch (coex_dm->cur_algorithm) { + case BT_8703B_1ANT_COEX_ALGO_SCO: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = SCO.\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_sco(btcoexist); */ + break; + case BT_8703B_1ANT_COEX_ALGO_HID: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = HID.\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_hid(btcoexist); */ + break; + case BT_8703B_1ANT_COEX_ALGO_A2DP: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = A2DP.\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_a2dp(btcoexist); */ + break; + case BT_8703B_1ANT_COEX_ALGO_A2DP_PANHS: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = A2DP+PAN(HS).\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_a2dp_pan_hs(btcoexist); */ + break; + case BT_8703B_1ANT_COEX_ALGO_PANEDR: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = PAN(EDR).\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_pan_edr(btcoexist); */ + break; + case BT_8703B_1ANT_COEX_ALGO_PANHS: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = HS mode.\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_pan_hs(btcoexist); */ + break; + case BT_8703B_1ANT_COEX_ALGO_PANEDR_A2DP: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = PAN+A2DP.\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_pan_edr_a2dp(btcoexist); */ + break; + case BT_8703B_1ANT_COEX_ALGO_PANEDR_HID: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = PAN(EDR)+HID.\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_pan_edr_hid(btcoexist); */ + break; + case BT_8703B_1ANT_COEX_ALGO_HID_A2DP_PANEDR: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = HID+A2DP+PAN.\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_hid_a2dp_pan_edr(btcoexist); */ + break; + case BT_8703B_1ANT_COEX_ALGO_HID_A2DP: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = HID+A2DP.\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_action_hid_a2dp(btcoexist); */ + break; + default: + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Action algorithm = coexist All Off!!\n"); + BTC_TRACE(trace_buf); + /* halbtc8703b1ant_coex_all_off(btcoexist); */ + break; + } + coex_dm->pre_algorithm = coex_dm->cur_algorithm; + } +} + +void halbtc8703b1ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, bt_hs_on = false; + boolean increase_scan_dev_num = false; + boolean bt_ctrl_agg_buf_size = false; + boolean miracast_plus_bt = false; + u8 agg_buf_size = 5; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0, wifi_bw; + u8 iot_peer = BTC_IOT_PEER_UNKNOWN; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism()===>\n"); + BTC_TRACE(trace_buf); + + if (btcoexist->manual_control) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n"); + BTC_TRACE(trace_buf); + return; + } + + if (btcoexist->stop_coex_dm) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n"); + BTC_TRACE(trace_buf); + return; + } + + if (coex_sta->under_ips) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi is under IPS !!!\n"); + BTC_TRACE(trace_buf); + return; + } + + if (coex_sta->bt_whck_test) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is under WHCK TEST!!!\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_action_bt_whck_test(btcoexist); + return; + } + + if (coex_sta->bt_disabled) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is disabled !!!\n"); + halbtc8703b1ant_action_wifi_only(btcoexist); + return; + } + + if ((BT_8703B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) || + (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) + increase_scan_dev_num = true; + + btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, + &increase_scan_dev_num); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + num_of_wifi_link = wifi_link_status >> 16; + + if ((num_of_wifi_link >= 2) || + (wifi_link_status & WIFI_P2P_GO_CONNECTED)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n", + num_of_wifi_link, wifi_link_status); + BTC_TRACE(trace_buf); + + if (bt_link_info->bt_link_exist) { + halbtc8703b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, + 0, 1); + miracast_plus_bt = true; + } else { + halbtc8703b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + miracast_plus_bt = false; + } + btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT, + &miracast_plus_bt); + halbtc8703b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + + if (coex_sta->c2h_bt_inquiry_page) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], BT Is Inquirying\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_action_bt_inquiry(btcoexist); + } else + halbtc8703b1ant_action_wifi_multi_port(btcoexist); + + return; + } else { + miracast_plus_bt = false; + btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT, + &miracast_plus_bt); + } + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); + + if ((bt_link_info->bt_link_exist) && (wifi_connected)) { + halbtc8703b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1); + + btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer); + + if (BTC_IOT_PEER_CISCO != iot_peer) { + if (bt_link_info->sco_exist) /* if (bt_link_info->bt_hi_pri_link_exist) */ + halbtc8703b1ant_limited_rx(btcoexist, + NORMAL_EXEC, true, false, 0x5); + else + halbtc8703b1ant_limited_rx(btcoexist, + NORMAL_EXEC, false, false, 0x5); + } else { + if (bt_link_info->sco_exist) + halbtc8703b1ant_limited_rx(btcoexist, + NORMAL_EXEC, true, false, 0x5); + else { + if (BTC_WIFI_BW_HT40 == wifi_bw) + halbtc8703b1ant_limited_rx(btcoexist, + NORMAL_EXEC, false, true, 0x10); + else + halbtc8703b1ant_limited_rx(btcoexist, + NORMAL_EXEC, false, true, 0x8); + } + } + + halbtc8703b1ant_sw_mechanism(btcoexist, true); + halbtc8703b1ant_run_sw_coexist_mechanism( + btcoexist); /* just print debug message */ + } else { + halbtc8703b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + + halbtc8703b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, + 0x5); + + halbtc8703b1ant_sw_mechanism(btcoexist, false); + halbtc8703b1ant_run_sw_coexist_mechanism( + btcoexist); /* just print debug message */ + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + if (coex_sta->c2h_bt_inquiry_page) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], BT Is Inquirying\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8703b1ant_action_hs(btcoexist); + return; + } + + + if (!wifi_connected) { + boolean scan = false, link = false, roam = false; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi is non connected-idle !!!\n"); + BTC_TRACE(trace_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); + + if (scan || link || roam) { + if (scan) + halbtc8703b1ant_action_wifi_not_connected_scan( + btcoexist); + else + halbtc8703b1ant_action_wifi_not_connected_asso_auth( + btcoexist); + } else + halbtc8703b1ant_action_wifi_not_connected(btcoexist); + } else /* wifi LPS/Busy */ + halbtc8703b1ant_action_wifi_connected(btcoexist); +} + +u32 halbtc8703b1ant_psd_log2base(IN struct btc_coexist *btcoexist, IN u32 val) +{ + u8 j; + u32 tmp, tmp2, val_integerd_b = 0, tindex, shiftcount = 0; + u32 result, val_fractiond_b = 0, table_fraction[21] = {0, 432, 332, 274, 232, 200, + 174, 151, 132, 115, 100, 86, 74, 62, 51, 42, + 32, 23, 15, 7, 0 + }; + + if (val == 0) + return 0; + + tmp = val; + + while (1) { + if (tmp == 1) + break; + else { + tmp = (tmp >> 1); + shiftcount++; + } + } + + + val_integerd_b = shiftcount + 1; + + tmp2 = 1; + for (j = 1; j <= val_integerd_b; j++) + tmp2 = tmp2 * 2; + + tmp = (val * 100) / tmp2; + tindex = tmp / 5; + + if (tindex > 20) + tindex = 20; + + val_fractiond_b = table_fraction[tindex]; + + result = val_integerd_b * 100 - val_fractiond_b; + + return result; + + +} + +void halbtc8703b1ant_init_coex_dm(IN struct btc_coexist *btcoexist) +{ + /* force to reset coex mechanism */ + + /* sw all off */ + halbtc8703b1ant_sw_mechanism(btcoexist, false); + + /* halbtc8703b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); */ + /* halbtc8703b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); */ + + coex_sta->pop_event_cnt = 0; +} + +void halbtc8703b1ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean back_up, IN boolean wifi_only) +{ + u32 u32tmp0 = 0, u32tmp1 = 0, u32tmp2 = 0; + + u32tmp0 = btcoexist->btc_read_4byte(btcoexist, 0x70), + u32tmp1 = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38); + u32tmp2 = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "\n [BTCoex], ********** 0x70/ 0x38/ 0x54 (Before Init HW config) = 0x%x/ 0x%x/ 0x%x**********\n", + u32tmp0, + u32tmp1, u32tmp2); + BTC_TRACE(trace_buf); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], 1Ant Init HW Config!!\n"); + BTC_TRACE(trace_buf); + + /* 0xf0[15:12] --> Chip Cut information */ + coex_sta->cut_version = (btcoexist->btc_read_1byte(btcoexist, + 0xf1) & 0xf0) >> 4; + + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8, + 0x1); /* enable TBTT nterrupt */ + + /* BT report packet sample rate */ + btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5); + + /* Enable BT counter statistics */ + btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1); + + /* Enable PTA (3-wire function form BT side) */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x41, 0x02, 0x1); + + /* Enable PTA (tx/rx signal form WiFi side) */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4c6, 0x10, 0x1); + + halbtc8703b1ant_enable_gnt_to_gpio(btcoexist, FALSE); + + if (btcoexist->btc_read_1byte(btcoexist, 0x80) == 0xc6) + halbtc8703b1ant_post_onoffState_to_bt(btcoexist, true); + + halbtc8703b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); + + /* Antenna config */ + if (wifi_only) { + coex_sta->concurrent_rx_mode_on = false; + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI, + FORCE_EXEC, true, false); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI, + FORCE_EXEC, false, false); + } else { + coex_sta->concurrent_rx_mode_on = true; + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x953, 0x2, 0x1); + /* RF 0x1[0] = 0->Set GNT_WL_RF_Rx always = 1 for con-current Rx */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0x1, 0x0); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, + FORCE_EXEC, true, false); + } + + /* PTA parameter */ + halbtc8703b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); + + u32tmp0 = btcoexist->btc_read_4byte(btcoexist, 0x70), + u32tmp1 = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38); + u32tmp2 = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** 0x70/ 0x38/ 0x54 (After Init HW config) = 0x%x/ 0x%x/ 0x%x**********\n", + u32tmp0, + u32tmp1, u32tmp2); + BTC_TRACE(trace_buf); + +} + + + +void halbtc8703b1ant_psd_showdata(IN struct btc_coexist *btcoexist) +{ + u8 *cli_buf = btcoexist->cli_buf; + u32 delta_freq_per_point; + u32 freq, freq1, freq2, n = 0, i = 0, j = 0, m = 0, psd_rep1, psd_rep2; + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n\n============[PSD info] (%d)============\n", + psd_scan->psd_gen_count); + CL_PRINTF(cli_buf); + + if (psd_scan->psd_gen_count == 0) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n No data !!\n"); + CL_PRINTF(cli_buf); + return; + } + + if (psd_scan->psd_point == 0) + delta_freq_per_point = 0; + else + delta_freq_per_point = psd_scan->psd_band_width / + psd_scan->psd_point; + + /* if (psd_scan->is_psd_show_max_only) */ + if (0) { + psd_rep1 = psd_scan->psd_max_value / 100; + psd_rep2 = psd_scan->psd_max_value - psd_rep1 * 100; + + freq = ((psd_scan->real_cent_freq - 20) * 1000000 + + psd_scan->psd_max_value_point * delta_freq_per_point); + freq1 = freq / 1000000; + freq2 = freq / 1000 - freq1 * 1000; + + if (freq2 < 100) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq = %d.0%d MHz", + freq1, freq2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq = %d.%d MHz", + freq1, freq2); + + if (psd_rep2 < 10) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + ", Value = %d.0%d dB, (%d)\n", + psd_rep1, psd_rep2, psd_scan->psd_max_value); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + ", Value = %d.%d dB, (%d)\n", + psd_rep1, psd_rep2, psd_scan->psd_max_value); + + CL_PRINTF(cli_buf); + } else { + m = psd_scan->psd_start_point; + n = psd_scan->psd_start_point; + i = 1; + j = 1; + + while (1) { + do { + freq = ((psd_scan->real_cent_freq - 20) * 1000000 + m * + delta_freq_per_point); + freq1 = freq / 1000000; + freq2 = freq / 1000 - freq1 * 1000; + + if (i == 1) { + if (freq2 == 0) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq%6d.000", freq1); + else if (freq2 < 100) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq%6d.0%2d", freq1, + freq2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq%6d.%3d", freq1, + freq2); + } else if ((i % 8 == 0) || + (m == psd_scan->psd_stop_point)) { + if (freq2 == 0) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.000\n", freq1); + else if (freq2 < 100) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.0%2d\n", freq1, freq2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.%3d\n", freq1, freq2); + } else { + if (freq2 == 0) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.000", freq1); + else if (freq2 < 100) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.0%2d", freq1, freq2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.%3d", freq1, freq2); + } + + i++; + m++; + CL_PRINTF(cli_buf); + + } while ((i <= 8) && (m <= psd_scan->psd_stop_point)); + + + do { + psd_rep1 = psd_scan->psd_report_max_hold[n] / 100; + psd_rep2 = psd_scan->psd_report_max_hold[n] - psd_rep1 * + 100; + + if (j == 1) { + if (psd_rep2 < 10) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Val %7d.0%d", psd_rep1, + psd_rep2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Val %7d.%d", psd_rep1, + psd_rep2); + } else if ((j % 8 == 0) || + (n == psd_scan->psd_stop_point)) { + if (psd_rep2 < 10) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%7d.0%d\n", psd_rep1, + psd_rep2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%7d.%d\n", psd_rep1, psd_rep2); + } else { + if (psd_rep2 < 10) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%7d.0%d", psd_rep1, psd_rep2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%7d.%d", psd_rep1, psd_rep2); + } + + j++; + n++; + CL_PRINTF(cli_buf); + + } while ((j <= 8) && (n <= psd_scan->psd_stop_point)); + + if ((m > psd_scan->psd_stop_point) || + (n > psd_scan->psd_stop_point)) + break; + else { + i = 1; + j = 1; + } + + } + } + + +} + +void halbtc8703b1ant_psd_maxholddata(IN struct btc_coexist *btcoexist, + IN u32 gen_count) +{ + u32 i = 0, i_max = 0, val_max = 0; + + if (gen_count == 1) { + memcpy(psd_scan->psd_report_max_hold, + psd_scan->psd_report, + BT_8703B_1ANT_ANTDET_PSD_POINTS * sizeof(u32)); + + for (i = psd_scan->psd_start_point; + i <= psd_scan->psd_stop_point; i++) { + + } + + psd_scan->psd_max_value_point = 0; + psd_scan->psd_max_value = 0; + + } else { + for (i = psd_scan->psd_start_point; + i <= psd_scan->psd_stop_point; i++) { + if (psd_scan->psd_report[i] > + psd_scan->psd_report_max_hold[i]) + psd_scan->psd_report_max_hold[i] = + psd_scan->psd_report[i]; + + /* search Max Value */ + if (i == psd_scan->psd_start_point) { + i_max = i; + val_max = psd_scan->psd_report_max_hold[i]; + } else { + if (psd_scan->psd_report_max_hold[i] > + val_max) { + i_max = i; + val_max = psd_scan->psd_report_max_hold[i]; + } + } + + + } + + psd_scan->psd_max_value_point = i_max; + psd_scan->psd_max_value = val_max; + + } + + +} + +u32 halbtc8703b1ant_psd_getdata(IN struct btc_coexist *btcoexist, IN u32 point) +{ + /* 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 */ + + u32 val = 0, psd_report = 0; + + val = btcoexist->btc_read_4byte(btcoexist, 0x808); + + val &= 0xffbffc00; + val |= point; + + btcoexist->btc_write_4byte(btcoexist, 0x808, val); + + val |= 0x00400000; + btcoexist->btc_write_4byte(btcoexist, 0x808, val); + + + val = btcoexist->btc_read_4byte(btcoexist, 0x8b4); + + psd_report = val & 0x0000ffff; + + return psd_report; +} + + +boolean halbtc8703b1ant_psd_sweep_point(IN struct btc_coexist *btcoexist, + IN u32 cent_freq, IN s32 offset, IN u32 span, IN u32 points, + IN u32 avgnum, IN u32 loopcnt) +{ + u32 i = 0, val = 0, n = 0, k = 0, j, point_index = 0; + u32 points1 = 0, psd_report = 0; + u32 start_p = 0, stop_p = 0, delta_freq_per_point = 156250; + u32 psd_center_freq = 20 * 10 ^ 6; + boolean outloop = false, scan , roam, is_sweep_ok = true; + u8 flag = 0; + u32 tmp = 0, u32tmp1 = 0; + u32 wifi_original_channel = 1; + + psd_scan->is_psd_running = true; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx PSD Sweep Start!!\n"); + BTC_TRACE(trace_buf); + + do { + switch (flag) { + case 0: /* Get PSD parameters */ + default: + + psd_scan->psd_band_width = 40 * 1000000; + psd_scan->psd_point = points; + psd_scan->psd_start_base = points / 2; + psd_scan->psd_avg_num = avgnum; + psd_scan->real_cent_freq = cent_freq; + psd_scan->real_offset = offset; + psd_scan->real_span = span; + + + points1 = psd_scan->psd_point; + delta_freq_per_point = psd_scan->psd_band_width / + psd_scan->psd_point; + + /* PSD point setup */ + val = btcoexist->btc_read_4byte(btcoexist, 0x808); + val &= 0xffff0fff; + + switch (psd_scan->psd_point) { + case 128: + val |= 0x0; + break; + case 256: + default: + val |= 0x00004000; + break; + case 512: + val |= 0x00008000; + break; + case 1024: + val |= 0x0000c000; + break; + } + + switch (psd_scan->psd_avg_num) { + case 1: + val |= 0x0; + break; + case 8: + val |= 0x00001000; + break; + case 16: + val |= 0x00002000; + break; + case 32: + default: + val |= 0x00003000; + break; + } + btcoexist->btc_write_4byte(btcoexist, 0x808, val); + + flag = 1; + break; + case 1: /* calculate the PSD point index from freq/offset/span */ + psd_center_freq = psd_scan->psd_band_width / 2 + + offset * (1000000); + + start_p = psd_scan->psd_start_base + (psd_center_freq - + span * (1000000) / 2) / delta_freq_per_point; + psd_scan->psd_start_point = start_p - + psd_scan->psd_start_base; + + stop_p = psd_scan->psd_start_base + (psd_center_freq + + span * (1000000) / 2) / delta_freq_per_point; + psd_scan->psd_stop_point = stop_p - + psd_scan->psd_start_base - 1; + + flag = 2; + break; + case 2: /* set RF channel/BW/Mode */ + + /* set 3-wire off */ + val = btcoexist->btc_read_4byte(btcoexist, 0x88c); + val |= 0x00300000; + btcoexist->btc_write_4byte(btcoexist, 0x88c, val); + + /* CCK off */ + val = btcoexist->btc_read_4byte(btcoexist, 0x800); + val &= 0xfeffffff; + btcoexist->btc_write_4byte(btcoexist, 0x800, val); + + /* Tx-pause on */ + btcoexist->btc_write_1byte(btcoexist, 0x522, 0x6f); + + /* store WiFi original channel */ + wifi_original_channel = btcoexist->btc_get_rf_reg( + btcoexist, BTC_RF_A, 0x18, 0x3ff); + + /* Set RF channel */ + if (cent_freq == 2484) + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, + 0x18, 0x3ff, 0xe); + else + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, + 0x18, 0x3ff, (cent_freq - 2412) / 5 + + 1); /* WiFi TRx Mask on */ + + /* save original RCK value */ + u32tmp1 = btcoexist->btc_get_rf_reg( + btcoexist, BTC_RF_A, 0x1d, 0xfffff); + + /* Enter debug mode */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xde, + 0x2, 0x1); + + /* Set RF Rx filter corner */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1d, + 0xfffff, 0x2e); + + + /* Set RF mode = Rx, RF Gain = 0x320a0 */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x0, + 0xfffff, 0x320a0); + + while (1) { + if (k++ > BT_8703B_1ANT_ANTDET_SWEEPPOINT_DELAY) + break; + } + flag = 3; + break; + case 3: + psd_scan->psd_gen_count = 0; + for (j = 1; j <= loopcnt; j++) { + + btcoexist->btc_get(btcoexist, + BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, + BTC_GET_BL_WIFI_ROAM, &roam); + + if (scan || roam) { + is_sweep_ok = false; + break; + } + memset(psd_scan->psd_report, 0, + psd_scan->psd_point * sizeof(u32)); + start_p = psd_scan->psd_start_point + + psd_scan->psd_start_base; + stop_p = psd_scan->psd_stop_point + + psd_scan->psd_start_base + 1; + + i = start_p; + point_index = 0; + + while (i < stop_p) { + if (i >= points1) + psd_report = + halbtc8703b1ant_psd_getdata( + btcoexist, i - points1); + else + psd_report = + halbtc8703b1ant_psd_getdata( + btcoexist, i); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "Point=%d, psd_raw_data = 0x%08x\n", + i, psd_report); + BTC_TRACE(trace_buf); + if (psd_report == 0) + tmp = 0; + else + /* tmp = 20*log10((double)psd_report); */ + /* 20*log2(x)/log2(10), log2Base return theresult of the psd_report*100 */ + tmp = 6 * halbtc8703b1ant_psd_log2base( + btcoexist, psd_report); + + n = i - psd_scan->psd_start_base; + psd_scan->psd_report[n] = tmp; + + + halbtc8703b1ant_psd_maxholddata( + btcoexist, j); + + i++; + + } + + psd_scan->psd_gen_count = j; + } + + flag = 100; + break; + case 99: /* error */ + + outloop = true; + break; + case 100: /* recovery */ + + /* set 3-wire on */ + val = btcoexist->btc_read_4byte(btcoexist, 0x88c); + val &= 0xffcfffff; + btcoexist->btc_write_4byte(btcoexist, 0x88c, val); + + /* CCK on */ + val = btcoexist->btc_read_4byte(btcoexist, 0x800); + val |= 0x01000000; + btcoexist->btc_write_4byte(btcoexist, 0x800, val); + + /* Tx-pause off */ + btcoexist->btc_write_1byte(btcoexist, 0x522, 0x0); + + /* PSD off */ + val = btcoexist->btc_read_4byte(btcoexist, 0x808); + val &= 0xffbfffff; + btcoexist->btc_write_4byte(btcoexist, 0x808, val); + + /* restore RF Rx filter corner */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1d, + 0xfffff, u32tmp1); + + /* Exit debug mode */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xde, + 0x2, 0x0); + + /* restore WiFi original channel */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x18, + 0x3ff, wifi_original_channel); + + outloop = true; + break; + + } + + } while (!outloop); + + + + psd_scan->is_psd_running = false; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx PSD Sweep Stop!!\n"); + BTC_TRACE(trace_buf); + return is_sweep_ok; + +} + +/* ************************************************************ + * work around function start with wa_halbtc8703b1ant_ + * ************************************************************ + * ************************************************************ + * extern function start with ex_halbtc8703b1ant_ + * ************************************************************ */ +void ex_halbtc8703b1ant_power_on_setting(IN struct btc_coexist *btcoexist) +{ + struct btc_board_info *board_info = &btcoexist->board_info; + u8 u8tmp = 0x0; + u16 u16tmp = 0x0; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx Execute 8703b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n"); + BTC_TRACE(trace_buf); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "Ant Det Finish = %s, Ant Det Number = %d\n", + (board_info->btdm_ant_det_finish ? "Yes" : "No"), + board_info->btdm_ant_num_by_ant_det); + BTC_TRACE(trace_buf); + + btcoexist->stop_coex_dm = true; + + /* enable BB, REG_SYS_FUNC_EN such that we can write BB/MAC reg correctly. */ + u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2); + btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT(0) | BIT(1)); + + /* set Path control owner to WiFi */ + halbtc8703b1ant_ltecoex_pathcontrol_owner(btcoexist, + BT_8703B_1ANT_PCO_WLSIDE); + + /* set GNT_BT to high */ + halbtc8703b1ant_ltecoex_set_gnt_bt(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_SW, + BT_8703B_1ANT_SIG_STA_SET_TO_HIGH); + /* Set GNT_WL to low */ + halbtc8703b1ant_ltecoex_set_gnt_wl(btcoexist, + BT_8703B_1ANT_GNT_BLOCK_RFC_BB, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_SW, + BT_8703B_1ANT_SIG_STA_SET_TO_LOW); + + /* set WLAN_ACT = 0 */ + btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4); + + halbtc8703b1ant_enable_gnt_to_gpio(btcoexist, FALSE); + + /* */ + /* 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 */ + + u8tmp = 0; + board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT; + + if (btcoexist->chip_interface == BTC_INTF_USB) + btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp); + else if (btcoexist->chip_interface == BTC_INTF_SDIO) + btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60, u8tmp); + + + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** 0x70(MAC)/0x38/0x54 (Power-On) =0x%x/ 0x%x/ 0x%x**********\n", + btcoexist->btc_read_4byte(btcoexist, 0x70), + halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38), + halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54)); + BTC_TRACE(trace_buf); + + +} + +void ex_halbtc8703b1ant_pre_load_firmware(IN struct btc_coexist *btcoexist) +{ +} + +void ex_halbtc8703b1ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean wifi_only) +{ + halbtc8703b1ant_init_hw_config(btcoexist, true, wifi_only); + btcoexist->stop_coex_dm = false; +} + +void ex_halbtc8703b1ant_init_coex_dm(IN struct btc_coexist *btcoexist) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Coex Mechanism Init!!\n"); + BTC_TRACE(trace_buf); + + halbtc8703b1ant_init_coex_dm(btcoexist); +} + +void ex_halbtc8703b1ant_display_coex_info(IN struct btc_coexist *btcoexist) +{ + struct btc_board_info *board_info = &btcoexist->board_info; + struct btc_stack_info *stack_info = &btcoexist->stack_info; + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + u8 *cli_buf = btcoexist->cli_buf; + u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0; + u16 u16tmp[4]; + u32 u32tmp[4]; + u32 fa_of_dm, fa_cck; + u32 fw_ver = 0, bt_patch_ver = 0; + static u8 pop_report_in_10s = 0; + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[BT Coexist info]============"); + CL_PRINTF(cli_buf); + + if (btcoexist->manual_control) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[Under Manual Control]============"); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n =========================================="); + CL_PRINTF(cli_buf); + } + if (btcoexist->stop_coex_dm) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[Coex is STOPPED]============"); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n =========================================="); + CL_PRINTF(cli_buf); + } + + if (psd_scan->ant_det_try_count == 0) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", + "Ant PG Num/ Mech/ Pos", + board_info->pg_ant_num, board_info->btdm_ant_num, + board_info->btdm_ant_pos); + CL_PRINTF(cli_buf); + } else { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %d/ %d/ %d (%d/%d/%d)", + "Ant PG Num/ Mech(Ant_Det)/ Pos", + board_info->pg_ant_num, board_info->btdm_ant_num_by_ant_det, + board_info->btdm_ant_pos, + psd_scan->ant_det_try_count, psd_scan->ant_det_fail_count, + psd_scan->ant_det_result); + CL_PRINTF(cli_buf); + + if (board_info->btdm_ant_det_finish) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", + "Ant Det PSD Value", + psd_scan->ant_det_peak_val); + CL_PRINTF(cli_buf); + } + } + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", + "BT stack/ hci ext ver", + ((stack_info->profile_notified) ? "Yes" : "No"), + stack_info->hci_version); + CL_PRINTF(cli_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)/ %c", + "Version Coex/ Fw/ Patch/ Cut", + glcoex_ver_date_8703b_1ant, glcoex_ver_8703b_1ant, fw_ver, + bt_patch_ver, bt_patch_ver, coex_sta->cut_version + 65); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", + "Wifi channel informed to BT", + coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1], + coex_dm->wifi_chnl_info[2]); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s", + "WifibHiPri/ Ccklock/ CckEverLock", + (coex_sta->wifi_is_high_pri_task ? "Yes" : "No"), + (coex_sta->cck_lock ? "Yes" : "No"), + (coex_sta->cck_ever_lock ? "Yes" : "No")); + CL_PRINTF(cli_buf); + + /* wifi status */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Wifi Status]============"); + CL_PRINTF(cli_buf); + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[BT Status]============"); + CL_PRINTF(cli_buf); + + pop_report_in_10s++; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d/ %d] ", + "BT [status/ rssi/ retryCnt/ popCnt]", + ((coex_sta->bt_disabled) ? ("disabled") : (( + coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page") + : ((BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status) ? "non-connected idle" : + ((BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) + ? "connected-idle" : "busy")))), + coex_sta->bt_rssi - 100, coex_sta->bt_retry_cnt, + coex_sta->pop_event_cnt); + CL_PRINTF(cli_buf); + + if (pop_report_in_10s >= 5) { + coex_sta->pop_event_cnt = 0; + pop_report_in_10s = 0; + } + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %d / %d / %d / %d / %d", + "SCO/HID/PAN/A2DP/Hi-Pri", + bt_link_info->sco_exist, bt_link_info->hid_exist, + bt_link_info->pan_exist, bt_link_info->a2dp_exist, + bt_link_info->bt_hi_pri_link_exist); + CL_PRINTF(cli_buf); + + if (stack_info->profile_notified) + btcoexist->btc_disp_dbg_msg(btcoexist, + BTC_DBG_DISP_BT_LINK_INFO); + else { + bt_info_ext = coex_sta->bt_info_ext; + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s / %d", + "Role/A2DP Rate/Bitpool", + ((bt_link_info->slave_role) ? "Slave" : "Master"), + (bt_info_ext & BIT(0)) ? "BR" : "EDR", coex_sta->a2dp_bit_pool); + CL_PRINTF(cli_buf); + } + + + for (i = 0; i < BT_INFO_SRC_8703B_1ANT_MAX; i++) { + if (coex_sta->bt_info_c2h_cnt[i]) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", + glbt_info_src_8703b_1ant[i], + coex_sta->bt_info_c2h[i][0], + coex_sta->bt_info_c2h[i][1], + coex_sta->bt_info_c2h[i][2], + coex_sta->bt_info_c2h[i][3], + coex_sta->bt_info_c2h[i][4], + coex_sta->bt_info_c2h[i][5], + coex_sta->bt_info_c2h[i][6], + coex_sta->bt_info_c2h_cnt[i]); + CL_PRINTF(cli_buf); + } + } + + if (btcoexist->manual_control) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[mechanisms] (before Manual)============"); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[mechanisms]============"); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", + "SM[LowPenaltyRA]", + coex_dm->cur_low_penalty_ra); + CL_PRINTF(cli_buf); + + ps_tdma_case = coex_dm->cur_ps_tdma; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)", + "PS TDMA", + coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1], + coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3], + coex_dm->ps_tdma_para[4], ps_tdma_case, + (coex_dm->cur_ps_tdma_on ? "On" : "Off"), + (coex_dm->auto_tdma_adjust ? "Adj" : "Fix")); + + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", + "WL/BT Coex Table Type", + coex_sta->coex_table_type); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4); + u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", + "0x6c0/0x6c4/0x6c8(coexTable)", + u32tmp[0], u32tmp[1], u32tmp[2]); + CL_PRINTF(cli_buf); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778); + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", + "0x778/0x6cc/IgnWlanAct", + u8tmp[0], u32tmp[0], coex_dm->cur_ignore_wlan_act); + CL_PRINTF(cli_buf); + + u32tmp[0] = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, + 0xa0); + u32tmp[1] = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, + 0xa4); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "LTE Coex Table W_L/B_L", + u32tmp[0] & 0xffff, u32tmp[1] & 0xffff); + CL_PRINTF(cli_buf); + + u32tmp[0] = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, + 0xa8); + u32tmp[1] = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, + 0xac); + u32tmp[2] = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, + 0xb0); + u32tmp[3] = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, + 0xb4); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", + "LTE Break Table W_L/B_L/L_W/L_B", + u32tmp[0] & 0xffff, u32tmp[1] & 0xffff, + u32tmp[2] & 0xffff, u32tmp[3] & 0xffff); + CL_PRINTF(cli_buf); + + /* Hw setting */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Hw setting]============"); + CL_PRINTF(cli_buf); + + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434); + u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", + "0x430/0x434/0x42a/0x456", + u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]); + CL_PRINTF(cli_buf); + + + u32tmp[0] = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x73); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %s", + "LTE CoexOn/Path Ctrl Owner", + (int)((u32tmp[0] & BIT(7)) >> 7), ((u8tmp[0] & BIT(2)) ? "WL" : "BT")); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", + "LTE 3Wire/OPMode/UART/UARTMode", + (int)((u32tmp[0] & BIT(6)) >> 6), (int)((u32tmp[0] & (BIT(5) | BIT(4))) >> 4), + (int)((u32tmp[0] & BIT(3)) >> 3), + (int)(u32tmp[0] & (BIT(2) | BIT(1) | BIT(0)))); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %s", + "GNT_WL_SWCtrl/GNT_BT_SWCtrl/Dbg", + (int)((u32tmp[0] & BIT(12)) >> 12), (int)((u32tmp[0] & BIT(14)) >> 14), + ((u8tmp[0] & BIT(3)) ? "On" : "Off")); + CL_PRINTF(cli_buf); + + u32tmp[0] = halbtc8703b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", + "GNT_WL/GNT_BT/LTE_Busy/UART_Busy", + (int)((u32tmp[0] & BIT(2)) >> 2), (int)((u32tmp[0] & BIT(3)) >> 3), + (int)((u32tmp[0] & BIT(1)) >> 1), (int)(u32tmp[0] & BIT(0))); + CL_PRINTF(cli_buf); + + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x4c6); + u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "0x4c6[4]/0x40[5] (WL/BT PTA)", + (int)((u8tmp[0] & BIT(4)) >> 4), (int)((u8tmp[1] & BIT(5)) >> 5)); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522); + u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x953); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ %s", + "0x550(bcn ctrl)/0x522/4-RxAGC", + u32tmp[0], u8tmp[0], (u8tmp[1] & 0x2) ? "On" : "Off"); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4); + u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8); + u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b); + u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c); + + fa_of_dm = ((u32tmp[0] & 0xffff0000) >> 16) + ((u32tmp[1] & 0xffff0000) + >> 16) + (u32tmp[1] & 0xffff) + (u32tmp[2] & 0xffff) + + ((u32tmp[3] & 0xffff0000) >> 16) + (u32tmp[3] & + 0xffff) ; + fa_cck = (u8tmp[0] << 8) + u8tmp[1]; + + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xc50); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", + "0xc50/OFDM-CCA/OFDM-FA/CCK-FA", + u32tmp[1] & 0xff, u32tmp[0] & 0xffff, fa_of_dm, fa_cck); + CL_PRINTF(cli_buf); + + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", + "CRC_OK CCK/11g/11n/11n-Agg", + coex_sta->crc_ok_cck, coex_sta->crc_ok_11g, + coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_agg); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", + "CRC_Err CCK/11g/11n/11n-Agg", + coex_sta->crc_err_cck, coex_sta->crc_err_11g, + coex_sta->crc_err_11n, coex_sta->crc_err_11n_agg); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", + "0x770(high-pri rx/tx)", + coex_sta->high_priority_rx, coex_sta->high_priority_tx); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", + "0x774(low-pri rx/tx)", + coex_sta->low_priority_rx, coex_sta->low_priority_tx); + CL_PRINTF(cli_buf); + + halbtc8703b1ant_read_score_board(btcoexist, &u16tmp[0]); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %04x", + "ScoreBoard[14:0] (from BT)", u16tmp[0]); + CL_PRINTF(cli_buf); + + + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS); +} + + +void ex_halbtc8703b1ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type) +{ + if (btcoexist->manual_control || btcoexist->stop_coex_dm) + return; + + if (BTC_IPS_ENTER == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], IPS ENTER notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_ips = true; + coex_sta->under_lps = false; + + /* Write WL "Active" in Score-board for LPS off */ + halbtc8703b1ant_post_activestate_to_bt(btcoexist, false); + + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, + FORCE_EXEC, false, true); + halbtc8703b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } else if (BTC_IPS_LEAVE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], IPS LEAVE notify\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_post_activestate_to_bt(btcoexist, true); + + halbtc8703b1ant_init_hw_config(btcoexist, false, false); + halbtc8703b1ant_init_coex_dm(btcoexist); + halbtc8703b1ant_query_bt_info(btcoexist); + + coex_sta->under_ips = false; + } +} + +void ex_halbtc8703b1ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type) +{ + if (btcoexist->manual_control || btcoexist->stop_coex_dm) + return; + + if (BTC_LPS_ENABLE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], LPS ENABLE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_lps = true; + coex_sta->under_ips = false; + + if (coex_sta->force_lps_on == true) { /* LPS No-32K */ + /* Write WL "Active" in Score-board for PS-TDMA */ + halbtc8703b1ant_post_activestate_to_bt(btcoexist, true); + + } else { /* LPS-32K, need check if this h2c 0x71 can work?? (2015/08/28) */ + /* Write WL "Non-Active" in Score-board for Native-PS */ + halbtc8703b1ant_post_activestate_to_bt(btcoexist, false); + + } + } else if (BTC_LPS_DISABLE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], LPS DISABLE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_lps = false; + + + /* Write WL "Active" in Score-board for LPS off */ + halbtc8703b1ant_post_activestate_to_bt(btcoexist, true); + + } +} + +void ex_halbtc8703b1ant_scan_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + boolean wifi_connected = false; + + if (btcoexist->manual_control || + btcoexist->stop_coex_dm) + return; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + + halbtc8703b1ant_query_bt_info(btcoexist); + + if (BTC_SCAN_START == type) { + + coex_sta->wifi_is_high_pri_task = true; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCAN START notify\n"); + BTC_TRACE(trace_buf); + + halbtc8703b1ant_post_activestate_to_bt(btcoexist, true); + halbtc8703b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, + 8); + + /* Force antenna setup for no scan result issue */ + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + FORCE_EXEC, false, false); + + if (!wifi_connected) /* non-connected scan */ + halbtc8703b1ant_action_wifi_not_connected_scan(btcoexist); + else /* wifi is connected */ + halbtc8703b1ant_action_wifi_connected_scan(btcoexist); + + } else { + + coex_sta->wifi_is_high_pri_task = false; + + btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, + &coex_sta->scan_ap_num); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCAN FINISH notify (Scan-AP = %d)\n", coex_sta->scan_ap_num); + BTC_TRACE(trace_buf); + + if (!wifi_connected) + halbtc8703b1ant_action_wifi_not_connected(btcoexist); + else + halbtc8703b1ant_action_wifi_connected(btcoexist); + } + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCAN START Notify() end\n"); + BTC_TRACE(trace_buf); + +} + +void ex_halbtc8703b1ant_connect_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + boolean wifi_connected = false; + + if (btcoexist->manual_control || + btcoexist->stop_coex_dm) + return; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + + if (BTC_ASSOCIATE_START == type) { + coex_sta->wifi_is_high_pri_task = true; + halbtc8703b1ant_post_activestate_to_bt(btcoexist, true); + halbtc8703b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, + 8); + + /* Force antenna setup for no scan result issue */ + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + FORCE_EXEC, false, false); + /* psd_scan->ant_det_is_ant_det_available = TRUE; */ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CONNECT START notify\n"); + BTC_TRACE(trace_buf); + coex_dm->arp_cnt = 0; + + halbtc8703b1ant_action_wifi_not_connected_asso_auth(btcoexist); + } else { + coex_sta->wifi_is_high_pri_task = false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CONNECT FINISH notify\n"); + BTC_TRACE(trace_buf); + + if (!wifi_connected) /* non-connected scan */ + halbtc8703b1ant_action_wifi_not_connected(btcoexist); + else + halbtc8703b1ant_action_wifi_connected(btcoexist); + } + +} + +void ex_halbtc8703b1ant_media_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + boolean wifi_under_b_mode = false; + + if (btcoexist->manual_control || + btcoexist->stop_coex_dm) + return; + + if (BTC_MEDIA_CONNECT == type) { + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], MEDIA connect notify\n"); + BTC_TRACE(trace_buf); + + halbtc8703b1ant_post_activestate_to_bt(btcoexist, true); + halbtc8703b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, + 8); + + /* Force antenna setup for no scan result issue */ + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + FORCE_EXEC, false, false); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + + /* Set CCK Tx/Rx high Pri except 11b mode */ + if (wifi_under_b_mode) { + btcoexist->btc_write_1byte(btcoexist, 0x6cd, + 0x00); /* CCK Tx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cf, + 0x00); /* CCK Rx */ + } else { + /* btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x10); */ /*CCK Tx */ + /* btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x10); */ /*CCK Rx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cd, + 0x00); /* CCK Tx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cf, + 0x10); /* CCK Rx */ + } + + coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist, + 0x430); + coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist, + 0x434); + coex_dm->backup_retry_limit = btcoexist->btc_read_2byte( + btcoexist, 0x42a); + coex_dm->backup_ampdu_max_time = btcoexist->btc_read_1byte( + btcoexist, 0x456); + } else { + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], MEDIA disconnect notify\n"); + BTC_TRACE(trace_buf); + + halbtc8703b1ant_post_activestate_to_bt(btcoexist, false); + + btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */ + + coex_sta->cck_ever_lock = false; + } + + halbtc8703b1ant_update_wifi_channel_info(btcoexist, type); + +} + +void ex_halbtc8703b1ant_specific_packet_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + boolean under_4way = false; + + if (btcoexist->manual_control || + btcoexist->stop_coex_dm || + coex_sta->bt_disabled) + return; + + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, + &under_4way); + + if (under_4way) { + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], specific Packet ---- under_4way!!\n"); + BTC_TRACE(trace_buf); + + coex_sta->wifi_is_high_pri_task = true; + coex_sta->specific_pkt_period_cnt = 2; + } else if (BTC_PACKET_ARP == type) { + + coex_dm->arp_cnt++; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], specific Packet ARP notify -cnt = %d\n", coex_dm->arp_cnt); + BTC_TRACE(trace_buf); + + } else { + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], specific Packet DHCP or EAPOL notify [Type = %d]\n", type); + BTC_TRACE(trace_buf); + + coex_sta->wifi_is_high_pri_task = true; + coex_sta->specific_pkt_period_cnt = 2; + } + + if (coex_sta->wifi_is_high_pri_task) + halbtc8703b1ant_action_wifi_connected_specific_packet(btcoexist); +} + +void ex_halbtc8703b1ant_bt_info_notify(IN struct btc_coexist *btcoexist, + IN u8 *tmp_buf, IN u8 length) +{ + u8 bt_info = 0; + u8 i, rsp_source = 0; + boolean wifi_connected = false; + boolean bt_busy = false; + + coex_sta->c2h_bt_info_req_sent = false; + + rsp_source = tmp_buf[0] & 0xf; + if (rsp_source >= BT_INFO_SRC_8703B_1ANT_MAX) + rsp_source = BT_INFO_SRC_8703B_1ANT_WIFI_FW; + coex_sta->bt_info_c2h_cnt[rsp_source]++; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Bt info[%d], length=%d, hex data=[", rsp_source, + length); + BTC_TRACE(trace_buf); + for (i = 0; i < length; i++) { + coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i]; + if (i == 1) + bt_info = tmp_buf[i]; + if (i == length - 1) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x]\n", + tmp_buf[i]); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x, ", + tmp_buf[i]); + BTC_TRACE(trace_buf); + } + } + + if (BT_INFO_SRC_8703B_1ANT_WIFI_FW != rsp_source) { + + /* if 0xff, it means BT is under WHCK test */ + if (bt_info == 0xff) + coex_sta->bt_whck_test = true; + else + coex_sta->bt_whck_test = false; + + coex_sta->bt_retry_cnt = /* [3:0] */ + coex_sta->bt_info_c2h[rsp_source][2] & 0xf; + + if (coex_sta->bt_retry_cnt >= 1) + coex_sta->pop_event_cnt++; + + if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20) + coex_sta->c2h_bt_page = true; + else + coex_sta->c2h_bt_page = false; + + if (coex_sta->bt_info_c2h[rsp_source][2] & 0x80) + coex_sta->bt_create_connection = true; + else + coex_sta->bt_create_connection = false; + + /* unit: %, value-100 to translate to unit: dBm */ + coex_sta->bt_rssi = coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10; + + /* coex_sta->bt_info_c2h[rsp_source][3]*2+10; */ + + if ((coex_sta->bt_info_c2h[rsp_source][1] & 0x49) == 0x49) { + coex_sta->a2dp_bit_pool = + coex_sta->bt_info_c2h[rsp_source][6]; + } else + coex_sta->a2dp_bit_pool = 0; + + if (coex_sta->bt_info_c2h[rsp_source][1] & 0x9) + coex_sta->acl_busy = true; + else + coex_sta->acl_busy = false; + + coex_sta->bt_info_ext = + coex_sta->bt_info_c2h[rsp_source][4]; + + /* Here we need to resend some wifi info to BT */ + /* because bt is reset and loss of the info. */ + + if ((!btcoexist->manual_control) && (!btcoexist->stop_coex_dm)) { + + /* Re-Init */ + if (coex_sta->bt_info_ext & BIT(1)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n"); + BTC_TRACE(trace_buf); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + if (wifi_connected) + halbtc8703b1ant_update_wifi_channel_info(btcoexist, + BTC_MEDIA_CONNECT); + else + halbtc8703b1ant_update_wifi_channel_info(btcoexist, + BTC_MEDIA_DISCONNECT); + } + + /* If Ignore_WLanAct && not SetUp_Link */ + if ((coex_sta->bt_info_ext & BIT(3)) && (!(coex_sta->bt_info_ext & BIT(2)))) { + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_ignore_wlan_act(btcoexist, + FORCE_EXEC, false); + } + } + + /* check BIT2 first ==> check if bt is under inquiry or page scan */ + if (bt_info & BT_INFO_8703B_1ANT_B_INQ_PAGE) + coex_sta->c2h_bt_inquiry_page = true; + else + coex_sta->c2h_bt_inquiry_page = false; + + } + + coex_sta->num_of_profile = 0; + + /* set link exist status */ + if (!(bt_info & BT_INFO_8703B_1ANT_B_CONNECTION)) { + coex_sta->bt_link_exist = false; + coex_sta->pan_exist = false; + coex_sta->a2dp_exist = false; + coex_sta->hid_exist = false; + coex_sta->sco_exist = false; + + coex_sta->bt_hi_pri_link_exist = false; + } else { /* connection exists */ + coex_sta->bt_link_exist = true; + if (bt_info & BT_INFO_8703B_1ANT_B_FTP) { + coex_sta->pan_exist = true; + coex_sta->num_of_profile++; + } else + coex_sta->pan_exist = false; + if (bt_info & BT_INFO_8703B_1ANT_B_A2DP) { + coex_sta->a2dp_exist = true; + coex_sta->num_of_profile++; + } else + coex_sta->a2dp_exist = false; + if (bt_info & BT_INFO_8703B_1ANT_B_HID) { + coex_sta->hid_exist = true; + coex_sta->num_of_profile++; + } else + coex_sta->hid_exist = false; + if (bt_info & BT_INFO_8703B_1ANT_B_SCO_ESCO) { + coex_sta->sco_exist = true; + coex_sta->num_of_profile++; + } else + coex_sta->sco_exist = false; + + } + + + + halbtc8703b1ant_update_bt_link_info(btcoexist); + + bt_info = bt_info & + 0x1f; /* mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41) */ + + if (!(bt_info & BT_INFO_8703B_1ANT_B_CONNECTION)) { + coex_dm->bt_status = BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n"); + BTC_TRACE(trace_buf); + } else if (bt_info == + BT_INFO_8703B_1ANT_B_CONNECTION) { /* connection exists but no busy */ + coex_dm->bt_status = BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n"); + BTC_TRACE(trace_buf); + } else if ((bt_info & BT_INFO_8703B_1ANT_B_SCO_ESCO) || + (bt_info & BT_INFO_8703B_1ANT_B_SCO_BUSY)) { + coex_dm->bt_status = BT_8703B_1ANT_BT_STATUS_SCO_BUSY; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n"); + BTC_TRACE(trace_buf); + } else if (bt_info & BT_INFO_8703B_1ANT_B_ACL_BUSY) { + if (BT_8703B_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status) + coex_dm->auto_tdma_adjust = false; + coex_dm->bt_status = BT_8703B_1ANT_BT_STATUS_ACL_BUSY; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n"); + BTC_TRACE(trace_buf); + } else { + coex_dm->bt_status = BT_8703B_1ANT_BT_STATUS_MAX; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n"); + BTC_TRACE(trace_buf); + } + + if ((BT_8703B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) || + (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) + bt_busy = true; + else + bt_busy = false; + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy); + + if (btcoexist->manual_control) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), No run_coexist_mechanism return for Manual CTRL<===\n"); + BTC_TRACE(trace_buf); + return; + } + + if (btcoexist->stop_coex_dm) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BtInfoNotify(), No run_coexist_mechanism return for Stop Coex DM <===\n"); + BTC_TRACE(trace_buf); + return; + } + + /* don't run coex mechanism while receve BTInfo if GNT_WL/GNT_BT control by SW */ + if (!coex_sta->gnt_control_by_PTA) + return; + + halbtc8703b1ant_run_coexist_mechanism(btcoexist); +} + +void ex_halbtc8703b1ant_rf_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], RF Status notify\n"); + BTC_TRACE(trace_buf); + + if (BTC_RF_ON == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RF is turned ON!!\n"); + BTC_TRACE(trace_buf); + + coex_sta->wl_rf_off_on_event = true; + btcoexist->stop_coex_dm = false; + + halbtc8703b1ant_post_activestate_to_bt(btcoexist, true); + halbtc8703b1ant_post_onoffState_to_bt(btcoexist, true); + + /* halbtc8703b1ant_init_hw_config(btcoexist, false, false); */ + } else if (BTC_RF_OFF == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RF is turned OFF!!\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_post_activestate_to_bt(btcoexist, false); + halbtc8703b1ant_post_onoffState_to_bt(btcoexist, false); + + halbtc8703b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, + FORCE_EXEC, false, true); + + btcoexist->stop_coex_dm = true; + coex_sta->wl_rf_off_on_event = false; + + } +} + +void ex_halbtc8703b1ant_halt_notify(IN struct btc_coexist *btcoexist) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Halt notify\n"); + BTC_TRACE(trace_buf); + + halbtc8703b1ant_post_activestate_to_bt(btcoexist, false); + halbtc8703b1ant_post_onoffState_to_bt(btcoexist, false); + + halbtc8703b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, FORCE_EXEC, + false, true); + + ex_halbtc8703b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT); + + halbtc8703b1ant_enable_gnt_to_gpio(btcoexist, FALSE); + + btcoexist->stop_coex_dm = true; +} + +void ex_halbtc8703b1ant_pnp_notify(IN struct btc_coexist *btcoexist, + IN u8 pnp_state) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Pnp notify\n"); + BTC_TRACE(trace_buf); + + if (BTC_WIFI_PNP_SLEEP == pnp_state) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Pnp notify to SLEEP\n"); + BTC_TRACE(trace_buf); + + halbtc8703b1ant_post_activestate_to_bt(btcoexist, false); + halbtc8703b1ant_post_onoffState_to_bt(btcoexist, false); + + halbtc8703b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + halbtc8703b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, + FORCE_EXEC, false, true); + + btcoexist->stop_coex_dm = true; + } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Pnp notify to WAKE UP\n"); + BTC_TRACE(trace_buf); + halbtc8703b1ant_post_activestate_to_bt(btcoexist, true); + halbtc8703b1ant_post_onoffState_to_bt(btcoexist, true); + + btcoexist->stop_coex_dm = false; + } +} + +void ex_halbtc8703b1ant_coex_dm_reset(IN struct btc_coexist *btcoexist) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], *****************Coex DM Reset*****************\n"); + BTC_TRACE(trace_buf); + + halbtc8703b1ant_init_hw_config(btcoexist, false, false); + /* btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); */ + /* btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x2, 0xfffff, 0x0); */ + halbtc8703b1ant_init_coex_dm(btcoexist); +} + +void ex_halbtc8703b1ant_periodical(IN struct btc_coexist *btcoexist) +{ + +#if (BT_AUTO_REPORT_ONLY_8703B_1ANT == 0) + halbtc8703b1ant_query_bt_info(btcoexist); +#endif + + halbtc8703b1ant_monitor_bt_ctr(btcoexist); + halbtc8703b1ant_monitor_wifi_ctr(btcoexist); + + halbtc8703b1ant_monitor_bt_enable_disable(btcoexist); + + /* for 4-way, DHCP, EAPOL packet */ + if (coex_sta->specific_pkt_period_cnt > 0) { + + coex_sta->specific_pkt_period_cnt--; + + if ((coex_sta->specific_pkt_period_cnt == 0) && (coex_sta->wifi_is_high_pri_task)) + coex_sta->wifi_is_high_pri_task = false; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ***************** Hi-Pri Task = %s*****************\n", (coex_sta->wifi_is_high_pri_task ? "Yes" : "No")); + BTC_TRACE(trace_buf); + + } + + if (halbtc8703b1ant_is_wifibt_status_changed(btcoexist)) + halbtc8703b1ant_run_coexist_mechanism(btcoexist); +} + +void ex_halbtc8703b1ant_antenna_detection(IN struct btc_coexist *btcoexist, + IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds) +{ + /* No Antenna Detection required because 8730b is only 1-Ant */ +} + +void ex_halbtc8703b1ant_antenna_isolation(IN struct btc_coexist *btcoexist, + IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds) +{ + + +} + +void ex_halbtc8703b1ant_psd_scan(IN struct btc_coexist *btcoexist, + IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds) +{ + + +} + +void ex_halbtc8703b1ant_display_ant_detection(IN struct btc_coexist *btcoexist) +{ + +} + +#endif + +#endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */ diff --git a/hal/btc/HalBtc8703b1Ant.h b/hal/btc/HalBtc8703b1Ant.h old mode 100755 new mode 100644 index bf5e8a0..cf167a5 --- a/hal/btc/HalBtc8703b1Ant.h +++ b/hal/btc/HalBtc8703b1Ant.h @@ -1,373 +1,348 @@ -//=========================================== -// The following is for 8703B 1ANT BT Co-exist definition -//=========================================== -#define BT_AUTO_REPORT_ONLY_8703B_1ANT 1 - -#define BT_INFO_8703B_1ANT_B_FTP BIT7 -#define BT_INFO_8703B_1ANT_B_A2DP BIT6 -#define BT_INFO_8703B_1ANT_B_HID BIT5 -#define BT_INFO_8703B_1ANT_B_SCO_BUSY BIT4 -#define BT_INFO_8703B_1ANT_B_ACL_BUSY BIT3 -#define BT_INFO_8703B_1ANT_B_INQ_PAGE BIT2 -#define BT_INFO_8703B_1ANT_B_SCO_ESCO BIT1 -#define BT_INFO_8703B_1ANT_B_CONNECTION BIT0 - -#define BT_INFO_8703B_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_) \ - (((_BT_INFO_EXT_&BIT0))? TRUE:FALSE) - -#define BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT 2 - -#define BT_8703B_1ANT_WIFI_NOISY_THRESH 30 //max: 255 - -//for Antenna detection -#define BT_8703B_1ANT_ANTDET_PSDTHRES_BACKGROUND 50 -#define BT_8703B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION 70 -#define BT_8703B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION 55 -#define BT_8703B_1ANT_ANTDET_PSDTHRES_1ANT 35 -#define BT_8703B_1ANT_ANTDET_RETRY_INTERVAL 10 //retry timer if ant det is fail, unit: second -#define BT_8703B_1ANT_ANTDET_ENABLE 0 -#define BT_8703B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE 0 - -#define BT_8703B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT 30000 - -enum _SIGNAL_STATE{ - SET_TO_LOW=0, - SET_TO_HIGH=1, - SET_BY_HW=0 -}; - -enum _PATH_CONTRL_OWNER{ - BTSIDE_CONTROL=0, - WLSIDE_CONTROL=1 -}; - -enum _GNT_CONTROL_TYPE{ - CONTROL_BY_PTA=0, - CONTROL_BY_SW=1 -}; - -enum _GNT_CONTROL_BLOCK{ - RFC_AND_BB=0, - RFC_ONLY=1, - BB_ONLY=2 -}; - -enum _LTE_COEXTABLE_TYPE{ - WL_VS_LTE=0, - BT_VS_LTE=1 -}; - -enum _LTE_BREAKTABLE_TYPE{ - WL_BREAK_LTE=0, - BT_BREAK_LTE=1, - LTE_BREAK_WL=2, - LTE_BREAK_BT=3 -}; - - -typedef enum _BT_INFO_SRC_8703B_1ANT{ - BT_INFO_SRC_8703B_1ANT_WIFI_FW = 0x0, - BT_INFO_SRC_8703B_1ANT_BT_RSP = 0x1, - BT_INFO_SRC_8703B_1ANT_BT_ACTIVE_SEND = 0x2, - BT_INFO_SRC_8703B_1ANT_MAX -}BT_INFO_SRC_8703B_1ANT,*PBT_INFO_SRC_8703B_1ANT; - -typedef enum _BT_8703B_1ANT_BT_STATUS{ - BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0, - BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE = 0x1, - BT_8703B_1ANT_BT_STATUS_INQ_PAGE = 0x2, - BT_8703B_1ANT_BT_STATUS_ACL_BUSY = 0x3, - BT_8703B_1ANT_BT_STATUS_SCO_BUSY = 0x4, - BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY = 0x5, - BT_8703B_1ANT_BT_STATUS_MAX -}BT_8703B_1ANT_BT_STATUS,*PBT_8703B_1ANT_BT_STATUS; - -typedef enum _BT_8703B_1ANT_WIFI_STATUS{ - BT_8703B_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE = 0x0, - BT_8703B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN = 0x1, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN = 0x2, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT = 0x3, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE = 0x4, - BT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY = 0x5, - BT_8703B_1ANT_WIFI_STATUS_MAX -}BT_8703B_1ANT_WIFI_STATUS,*PBT_8703B_1ANT_WIFI_STATUS; - -typedef enum _BT_8703B_1ANT_COEX_ALGO{ - BT_8703B_1ANT_COEX_ALGO_UNDEFINED = 0x0, - BT_8703B_1ANT_COEX_ALGO_SCO = 0x1, - BT_8703B_1ANT_COEX_ALGO_HID = 0x2, - BT_8703B_1ANT_COEX_ALGO_A2DP = 0x3, - BT_8703B_1ANT_COEX_ALGO_A2DP_PANHS = 0x4, - BT_8703B_1ANT_COEX_ALGO_PANEDR = 0x5, - BT_8703B_1ANT_COEX_ALGO_PANHS = 0x6, - BT_8703B_1ANT_COEX_ALGO_PANEDR_A2DP = 0x7, - BT_8703B_1ANT_COEX_ALGO_PANEDR_HID = 0x8, - BT_8703B_1ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9, - BT_8703B_1ANT_COEX_ALGO_HID_A2DP = 0xa, - BT_8703B_1ANT_COEX_ALGO_MAX = 0xb, -}BT_8703B_1ANT_COEX_ALGO,*PBT_8703B_1ANT_COEX_ALGO; - -typedef struct _COEX_DM_8703B_1ANT{ - // hw setting - u1Byte preAntPosType; - u1Byte curAntPosType; - // fw mechanism - BOOLEAN bCurIgnoreWlanAct; - BOOLEAN bPreIgnoreWlanAct; - u1Byte prePsTdma; - u1Byte curPsTdma; - u1Byte psTdmaPara[5]; - u1Byte psTdmaDuAdjType; - BOOLEAN bAutoTdmaAdjust; - BOOLEAN bPrePsTdmaOn; - BOOLEAN bCurPsTdmaOn; - BOOLEAN bPreBtAutoReport; - BOOLEAN bCurBtAutoReport; - u1Byte preLps; - u1Byte curLps; - u1Byte preRpwm; - u1Byte curRpwm; - - // sw mechanism - BOOLEAN bPreLowPenaltyRa; - BOOLEAN bCurLowPenaltyRa; - u4Byte preVal0x6c0; - u4Byte curVal0x6c0; - u4Byte preVal0x6c4; - u4Byte curVal0x6c4; - u4Byte preVal0x6c8; - 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; - u1Byte curAlgorithm; - u1Byte btStatus; - u1Byte wifiChnlInfo[3]; - - u4Byte preRaMask; - u4Byte curRaMask; - u1Byte preArfrType; - u1Byte curArfrType; - u1Byte preRetryLimitType; - u1Byte curRetryLimitType; - u1Byte preAmpduTimeType; - u1Byte curAmpduTimeType; - u4Byte nArpCnt; - - u1Byte errorCondition; -} COEX_DM_8703B_1ANT, *PCOEX_DM_8703B_1ANT; - -typedef struct _COEX_STA_8703B_1ANT{ - BOOLEAN bBtLinkExist; - BOOLEAN bScoExist; - BOOLEAN bA2dpExist; - BOOLEAN bHidExist; - BOOLEAN bPanExist; - BOOLEAN bBtHiPriLinkExist; - u1Byte nNumOfProfile; - - BOOLEAN bUnderLps; - BOOLEAN bUnderIps; - u4Byte specialPktPeriodCnt; - u4Byte highPriorityTx; - u4Byte highPriorityRx; - u4Byte lowPriorityTx; - u4Byte lowPriorityRx; - s1Byte btRssi; - BOOLEAN bBtTxRxMask; - u1Byte preBtRssiState; - u1Byte preWifiRssiState[4]; - BOOLEAN bC2hBtInfoReqSent; - u1Byte btInfoC2h[BT_INFO_SRC_8703B_1ANT_MAX][10]; - u4Byte btInfoC2hCnt[BT_INFO_SRC_8703B_1ANT_MAX]; - BOOLEAN bBtWhckTest; - 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; - BOOLEAN bCCKEverLock; - u1Byte nCoexTableType; - - BOOLEAN bForceLpsOn; - u4Byte wrongProfileNotification; - - BOOLEAN bConCurrentRxModeOn; -}COEX_STA_8703B_1ANT, *PCOEX_STA_8703B_1ANT; - -#define BT_8703B_1ANT_ANTDET_PSD_POINTS 256 //MAX:1024 -#define BT_8703B_1ANT_ANTDET_PSD_AVGNUM 1 //MAX:3 -#define BT_8703B_1ANT_ANTDET_BUF_LEN 16 - -typedef struct _PSDSCAN_STA_8703B_1ANT{ - -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_8703B_1ANT_ANTDET_BUF_LEN]; -u1Byte nAntDet_PeakFreq[BT_8703B_1ANT_ANTDET_BUF_LEN]; -u4Byte bAntDet_TryCount; -u4Byte bAntDet_FailCount; -u4Byte nAntDet_IntevalCount; -u4Byte nAntDet_ThresOffset; - -u4Byte nRealCentFreq; -s4Byte nRealOffset; -u4Byte nRealSpan; - -u4Byte nPSDBandWidth; //unit: Hz -u4Byte nPSDPoint; //128/256/512/1024 -u4Byte nPSDReport[1024]; //unit:dB (20logx), 0~255 -u4Byte nPSDReport_MaxHold[1024]; //unit:dB (20logx), 0~255 -u4Byte nPSDStartPoint; -u4Byte nPSDStopPoint; -u4Byte nPSDMaxValuePoint; -u4Byte nPSDMaxValue; -u4Byte nPSDStartBase; -u4Byte nPSDAvgNum; // 1/8/16/32 -u4Byte nPSDGenCount; -BOOLEAN bIsPSDRunning; -BOOLEAN bIsPSDShowMaxOnly; -} PSDSCAN_STA_8703B_1ANT, *PPSDSCAN_STA_8703B_1ANT; - -//=========================================== -// The following is interface which will notify coex module. -//=========================================== -VOID -EXhalbtc8703b1ant_PowerOnSetting( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8703b1ant_PreLoadFirmware( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8703b1ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bWifiOnly - ); -VOID -EXhalbtc8703b1ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8703b1ant_IpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8703b1ant_LpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8703b1ant_ScanNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8703b1ant_ConnectNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8703b1ant_MediaStatusNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8703b1ant_SpecialPacketNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8703b1ant_BtInfoNotify( - IN PBTC_COEXIST pBtCoexist, - IN pu1Byte tmpBuf, - IN u1Byte length - ); -VOID -EXhalbtc8703b1ant_RfStatusNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ); -VOID -EXhalbtc8703b1ant_HaltNotify( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8703b1ant_PnpNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte pnpState - ); -VOID -EXhalbtc8703b1ant_CoexDmReset( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8703b1ant_Periodical( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8703b1ant_DisplayCoexInfo( - IN PBTC_COEXIST pBtCoexist - ); -VOID -EXhalbtc8703b1ant_AntennaDetection( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte centFreq, - IN u4Byte offset, - IN u4Byte span, - IN u4Byte seconds - ); -VOID -EXhalbtc8703b1ant_AntennaIsolation( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte centFreq, - IN u4Byte offset, - IN u4Byte span, - IN u4Byte seconds - ); - -VOID -EXhalbtc8703b1ant_PSDScan( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte centFreq, - IN u4Byte offset, - IN u4Byte span, - IN u4Byte seconds - ); -VOID -EXhalbtc8703b1ant_DisplayAntDetection( - IN PBTC_COEXIST pBtCoexist - ); - + +#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) + +#if (RTL8703B_SUPPORT == 1) +/* ******************************************* + * The following is for 8703B 1ANT BT Co-exist definition + * ******************************************* */ +#define BT_AUTO_REPORT_ONLY_8703B_1ANT 1 +#define BT_8703B_1ANT_ENABLE_GNTBT_TO_GPIO14 0 + +#define BT_INFO_8703B_1ANT_B_FTP BIT(7) +#define BT_INFO_8703B_1ANT_B_A2DP BIT(6) +#define BT_INFO_8703B_1ANT_B_HID BIT(5) +#define BT_INFO_8703B_1ANT_B_SCO_BUSY BIT(4) +#define BT_INFO_8703B_1ANT_B_ACL_BUSY BIT(3) +#define BT_INFO_8703B_1ANT_B_INQ_PAGE BIT(2) +#define BT_INFO_8703B_1ANT_B_SCO_ESCO BIT(1) +#define BT_INFO_8703B_1ANT_B_CONNECTION BIT(0) + +#define BT_INFO_8703B_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_) \ + (((_BT_INFO_EXT_&BIT(0))) ? true : false) + +#define BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT 2 + +#define BT_8703B_1ANT_WIFI_NOISY_THRESH 50 /* max: 255 */ + +/* for Antenna detection */ +#define BT_8703B_1ANT_ANTDET_PSDTHRES_BACKGROUND 50 +#define BT_8703B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION 70 +#define BT_8703B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION 55 +#define BT_8703B_1ANT_ANTDET_PSDTHRES_1ANT 35 +#define BT_8703B_1ANT_ANTDET_RETRY_INTERVAL 10 /* retry timer if ant det is fail, unit: second */ +#define BT_8703B_1ANT_ANTDET_SWEEPPOINT_DELAY 40000 +#define BT_8703B_1ANT_ANTDET_ENABLE 0 +#define BT_8703B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE 0 + +#define BT_8703B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT 30000 + +enum bt_8703b_1ant_signal_state { + BT_8703B_1ANT_SIG_STA_SET_TO_LOW = 0x0, + BT_8703B_1ANT_SIG_STA_SET_BY_HW = 0x0, + BT_8703B_1ANT_SIG_STA_SET_TO_HIGH = 0x1, + BT_8703B_1ANT_SIG_STA_MAX +}; + +enum bt_8703b_1ant_path_ctrl_owner { + BT_8703B_1ANT_PCO_BTSIDE = 0x0, + BT_8703B_1ANT_PCO_WLSIDE = 0x1, + BT_8703B_1ANT_PCO_MAX +}; + +enum bt_8703b_1ant_gnt_ctrl_type { + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_PTA = 0x0, + BT_8703B_1ANT_GNT_TYPE_CTRL_BY_SW = 0x1, + BT_8703B_1ANT_GNT_TYPE_MAX +}; + +enum bt_8703b_1ant_gnt_ctrl_block { + BT_8703B_1ANT_GNT_BLOCK_RFC_BB = 0x0, + BT_8703B_1ANT_GNT_BLOCK_RFC = 0x1, + BT_8703B_1ANT_GNT_BLOCK_BB = 0x2, + BT_8703B_1ANT_GNT_BLOCK_MAX +}; + +enum bt_8703b_1ant_lte_coex_table_type { + BT_8703B_1ANT_CTT_WL_VS_LTE = 0x0, + BT_8703B_1ANT_CTT_BT_VS_LTE = 0x1, + BT_8703B_1ANT_CTT_MAX +}; + +enum bt_8703b_1ant_lte_break_table_type { + BT_8703B_1ANT_LBTT_WL_BREAK_LTE = 0x0, + BT_8703B_1ANT_LBTT_BT_BREAK_LTE = 0x1, + BT_8703B_1ANT_LBTT_LTE_BREAK_WL = 0x2, + BT_8703B_1ANT_LBTT_LTE_BREAK_BT = 0x3, + BT_8703B_1ANT_LBTT_MAX +}; + +enum bt_info_src_8703b_1ant { + BT_INFO_SRC_8703B_1ANT_WIFI_FW = 0x0, + BT_INFO_SRC_8703B_1ANT_BT_RSP = 0x1, + BT_INFO_SRC_8703B_1ANT_BT_ACTIVE_SEND = 0x2, + BT_INFO_SRC_8703B_1ANT_MAX +}; + +enum bt_8703b_1ant_bt_status { + BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0, + BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE = 0x1, + BT_8703B_1ANT_BT_STATUS_INQ_PAGE = 0x2, + BT_8703B_1ANT_BT_STATUS_ACL_BUSY = 0x3, + BT_8703B_1ANT_BT_STATUS_SCO_BUSY = 0x4, + BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY = 0x5, + BT_8703B_1ANT_BT_STATUS_MAX +}; + +enum bt_8703b_1ant_wifi_status { + BT_8703B_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE = 0x0, + BT_8703B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN = 0x1, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN = 0x2, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SPECIFIC_PKT = 0x3, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE = 0x4, + BT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY = 0x5, + BT_8703B_1ANT_WIFI_STATUS_MAX +}; + +enum bt_8703b_1ant_coex_algo { + BT_8703B_1ANT_COEX_ALGO_UNDEFINED = 0x0, + BT_8703B_1ANT_COEX_ALGO_SCO = 0x1, + BT_8703B_1ANT_COEX_ALGO_HID = 0x2, + BT_8703B_1ANT_COEX_ALGO_A2DP = 0x3, + BT_8703B_1ANT_COEX_ALGO_A2DP_PANHS = 0x4, + BT_8703B_1ANT_COEX_ALGO_PANEDR = 0x5, + BT_8703B_1ANT_COEX_ALGO_PANHS = 0x6, + BT_8703B_1ANT_COEX_ALGO_PANEDR_A2DP = 0x7, + BT_8703B_1ANT_COEX_ALGO_PANEDR_HID = 0x8, + BT_8703B_1ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9, + BT_8703B_1ANT_COEX_ALGO_HID_A2DP = 0xa, + BT_8703B_1ANT_COEX_ALGO_MAX = 0xb, +}; + +struct coex_dm_8703b_1ant { + /* hw setting */ + u8 pre_ant_pos_type; + u8 cur_ant_pos_type; + /* fw mechanism */ + boolean cur_ignore_wlan_act; + boolean pre_ignore_wlan_act; + u8 pre_ps_tdma; + u8 cur_ps_tdma; + u8 ps_tdma_para[5]; + u8 ps_tdma_du_adj_type; + boolean auto_tdma_adjust; + boolean pre_ps_tdma_on; + boolean cur_ps_tdma_on; + boolean pre_bt_auto_report; + boolean cur_bt_auto_report; + u8 pre_lps; + u8 cur_lps; + u8 pre_rpwm; + u8 cur_rpwm; + + /* sw mechanism */ + boolean pre_low_penalty_ra; + boolean cur_low_penalty_ra; + u32 pre_val0x6c0; + u32 cur_val0x6c0; + u32 pre_val0x6c4; + u32 cur_val0x6c4; + u32 pre_val0x6c8; + u32 cur_val0x6c8; + u8 pre_val0x6cc; + u8 cur_val0x6cc; + boolean limited_dig; + + u32 backup_arfr_cnt1; /* Auto Rate Fallback Retry cnt */ + u32 backup_arfr_cnt2; /* Auto Rate Fallback Retry cnt */ + u16 backup_retry_limit; + u8 backup_ampdu_max_time; + + /* algorithm related */ + u8 pre_algorithm; + u8 cur_algorithm; + u8 bt_status; + u8 wifi_chnl_info[3]; + + u32 pre_ra_mask; + u32 cur_ra_mask; + u8 pre_arfr_type; + u8 cur_arfr_type; + u8 pre_retry_limit_type; + u8 cur_retry_limit_type; + u8 pre_ampdu_time_type; + u8 cur_ampdu_time_type; + u32 arp_cnt; + + u8 error_condition; +}; + +struct coex_sta_8703b_1ant { + boolean bt_disabled; + boolean bt_link_exist; + boolean sco_exist; + boolean a2dp_exist; + boolean hid_exist; + boolean pan_exist; + boolean bt_hi_pri_link_exist; + u8 num_of_profile; + + boolean under_lps; + boolean under_ips; + u32 specific_pkt_period_cnt; + u32 high_priority_tx; + u32 high_priority_rx; + u32 low_priority_tx; + u32 low_priority_rx; + s8 bt_rssi; + boolean bt_tx_rx_mask; + u8 pre_bt_rssi_state; + u8 pre_wifi_rssi_state[4]; + boolean c2h_bt_info_req_sent; + u8 bt_info_c2h[BT_INFO_SRC_8703B_1ANT_MAX][10]; + u32 bt_info_c2h_cnt[BT_INFO_SRC_8703B_1ANT_MAX]; + boolean bt_whck_test; + boolean c2h_bt_inquiry_page; + boolean c2h_bt_page; /* Add for win8.1 page out issue */ + boolean wifi_is_high_pri_task; /* Add for win8.1 page out issue */ + u8 bt_retry_cnt; + u8 bt_info_ext; + u32 pop_event_cnt; + u8 scan_ap_num; + + u32 crc_ok_cck; + u32 crc_ok_11g; + u32 crc_ok_11n; + u32 crc_ok_11n_agg; + + u32 crc_err_cck; + u32 crc_err_11g; + u32 crc_err_11n; + u32 crc_err_11n_agg; + + boolean cck_lock; + boolean pre_ccklock; + boolean cck_ever_lock; + u8 coex_table_type; + + boolean force_lps_on; + u32 wrong_profile_notification; + + boolean concurrent_rx_mode_on; + + u16 score_board; + + u8 a2dp_bit_pool; + u8 cut_version; + boolean acl_busy; + boolean wl_rf_off_on_event; + boolean bt_create_connection; + boolean gnt_control_by_PTA; +}; + +#define BT_8703B_1ANT_ANTDET_PSD_POINTS 256 /* MAX:1024 */ +#define BT_8703B_1ANT_ANTDET_PSD_AVGNUM 1 /* MAX:3 */ +#define BT_8703B_1ANT_ANTDET_BUF_LEN 16 + +struct psdscan_sta_8703b_1ant { + + u32 ant_det_bt_le_channel; /* BT LE Channel ex:2412 */ + u32 ant_det_bt_tx_time; + u32 ant_det_pre_psdscan_peak_val; + boolean ant_det_is_ant_det_available; + u32 ant_det_psd_scan_peak_val; + boolean ant_det_is_btreply_available; + u32 ant_det_psd_scan_peak_freq; + + u8 ant_det_result; + u8 ant_det_peak_val[BT_8703B_1ANT_ANTDET_BUF_LEN]; + u8 ant_det_peak_freq[BT_8703B_1ANT_ANTDET_BUF_LEN]; + u32 ant_det_try_count; + u32 ant_det_fail_count; + u32 ant_det_inteval_count; + u32 ant_det_thres_offset; + + u32 real_cent_freq; + s32 real_offset; + u32 real_span; + + u32 psd_band_width; /* unit: Hz */ + u32 psd_point; /* 128/256/512/1024 */ + u32 psd_report[1024]; /* unit:dB (20logx), 0~255 */ + u32 psd_report_max_hold[1024]; /* unit:dB (20logx), 0~255 */ + u32 psd_start_point; + u32 psd_stop_point; + u32 psd_max_value_point; + u32 psd_max_value; + u32 psd_start_base; + u32 psd_avg_num; /* 1/8/16/32 */ + u32 psd_gen_count; + boolean is_psd_running; + boolean is_psd_show_max_only; +}; + +/* ******************************************* + * The following is interface which will notify coex module. + * ******************************************* */ +void ex_halbtc8703b1ant_power_on_setting(IN struct btc_coexist *btcoexist); +void ex_halbtc8703b1ant_pre_load_firmware(IN struct btc_coexist *btcoexist); +void ex_halbtc8703b1ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean wifi_only); +void ex_halbtc8703b1ant_init_coex_dm(IN struct btc_coexist *btcoexist); +void ex_halbtc8703b1ant_ips_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8703b1ant_lps_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8703b1ant_scan_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8703b1ant_connect_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8703b1ant_media_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8703b1ant_specific_packet_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8703b1ant_bt_info_notify(IN struct btc_coexist *btcoexist, + IN u8 *tmp_buf, IN u8 length); +void ex_halbtc8703b1ant_rf_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type); +void ex_halbtc8703b1ant_halt_notify(IN struct btc_coexist *btcoexist); +void ex_halbtc8703b1ant_pnp_notify(IN struct btc_coexist *btcoexist, + IN u8 pnp_state); +void ex_halbtc8703b1ant_coex_dm_reset(IN struct btc_coexist *btcoexist); +void ex_halbtc8703b1ant_periodical(IN struct btc_coexist *btcoexist); +void ex_halbtc8703b1ant_display_coex_info(IN struct btc_coexist *btcoexist); +void ex_halbtc8703b1ant_antenna_detection(IN struct btc_coexist *btcoexist, + IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds); +void ex_halbtc8703b1ant_antenna_isolation(IN struct btc_coexist *btcoexist, + IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds); + +void ex_halbtc8703b1ant_psd_scan(IN struct btc_coexist *btcoexist, + IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds); +void ex_halbtc8703b1ant_display_ant_detection(IN struct btc_coexist *btcoexist); + +#else +#define ex_halbtc8703b1ant_power_on_setting(btcoexist) +#define ex_halbtc8703b1ant_pre_load_firmware(btcoexist) +#define ex_halbtc8703b1ant_init_hw_config(btcoexist, wifi_only) +#define ex_halbtc8703b1ant_init_coex_dm(btcoexist) +#define ex_halbtc8703b1ant_ips_notify(btcoexist, type) +#define ex_halbtc8703b1ant_lps_notify(btcoexist, type) +#define ex_halbtc8703b1ant_scan_notify(btcoexist, type) +#define ex_halbtc8703b1ant_connect_notify(btcoexist, type) +#define ex_halbtc8703b1ant_media_status_notify(btcoexist, type) +#define ex_halbtc8703b1ant_specific_packet_notify(btcoexist, type) +#define ex_halbtc8703b1ant_bt_info_notify(btcoexist, tmp_buf, length) +#define ex_halbtc8703b1ant_rf_status_notify(btcoexist, type) +#define ex_halbtc8703b1ant_halt_notify(btcoexist) +#define ex_halbtc8703b1ant_pnp_notify(btcoexist, pnp_state) +#define ex_halbtc8703b1ant_coex_dm_reset(btcoexist) +#define ex_halbtc8703b1ant_periodical(btcoexist) +#define ex_halbtc8703b1ant_display_coex_info(btcoexist) +#define ex_halbtc8703b1ant_antenna_detection(btcoexist, cent_freq, offset, span, seconds) +#define ex_halbtc8703b1ant_antenna_isolation(btcoexist, cent_freq, offset, span, seconds) +#define ex_halbtc8703b1ant_psd_scan(btcoexist, cent_freq, offset, span, seconds) +#define ex_halbtc8703b1ant_display_ant_detection(btcoexist) + +#endif + + +#endif diff --git a/hal/btc/HalBtc8723a1Ant.c b/hal/btc/HalBtc8723a1Ant.c old mode 100755 new mode 100644 diff --git a/hal/btc/HalBtc8723a1Ant.h b/hal/btc/HalBtc8723a1Ant.h old mode 100755 new mode 100644 diff --git a/hal/btc/HalBtc8723a2Ant.c b/hal/btc/HalBtc8723a2Ant.c old mode 100755 new mode 100644 diff --git a/hal/btc/HalBtc8723a2Ant.h b/hal/btc/HalBtc8723a2Ant.h old mode 100755 new mode 100644 diff --git a/hal/btc/HalBtc8723b1Ant.c b/hal/btc/HalBtc8723b1Ant.c old mode 100755 new mode 100644 index 265ef13..565b3bb --- a/hal/btc/HalBtc8723b1Ant.c +++ b/hal/btc/HalBtc8723b1Ant.c @@ -1,1056 +1,549 @@ -//============================================================ -// Description: -// -// This file is for RTL8723B Co-exist mechanism -// -// History -// 2012/11/15 Cosa first check in. -// -//============================================================ +/* ************************************************************ + * Description: + * + * This file is for RTL8723B Co-exist mechanism + * + * History + * 2012/11/15 Cosa first check in. + * + * ************************************************************ */ -//============================================================ -// include files -//============================================================ +/* ************************************************************ + * include files + * ************************************************************ */ #include "Mp_Precomp.h" -#if WPP_SOFTWARE_TRACE -#include "HalBtc8723b1Ant.tmh" -#endif +#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) -//#include -#if(BT_30_SUPPORT == 1) -//============================================================ -// Global variables, these are static variables -//============================================================ -static COEX_DM_8723B_1ANT GLCoexDm8723b1Ant; -static PCOEX_DM_8723B_1ANT pCoexDm=&GLCoexDm8723b1Ant; -static COEX_STA_8723B_1ANT GLCoexSta8723b1Ant; -static PCOEX_STA_8723B_1ANT pCoexSta=&GLCoexSta8723b1Ant; -static PSDSCAN_STA_8723B_1ANT GLPsdScan8723b1Ant; -static PPSDSCAN_STA_8723B_1ANT pPsdScan = &GLPsdScan8723b1Ant; +#if (RTL8723B_SUPPORT == 1) +/* ************************************************************ + * Global variables, these are static variables + * ************************************************************ */ +static u8 *trace_buf = &gl_btc_trace_buf[0]; +static struct coex_dm_8723b_1ant glcoex_dm_8723b_1ant; +static struct coex_dm_8723b_1ant *coex_dm = &glcoex_dm_8723b_1ant; +static struct coex_sta_8723b_1ant glcoex_sta_8723b_1ant; +static struct coex_sta_8723b_1ant *coex_sta = &glcoex_sta_8723b_1ant; +static struct psdscan_sta_8723b_1ant gl_psd_scan_8723b_1ant; +static struct psdscan_sta_8723b_1ant *psd_scan = &gl_psd_scan_8723b_1ant; -const char *const GLBtInfoSrc8723b1Ant[]={ +const char *const glbt_info_src_8723b_1ant[]={ "BT Info[wifi fw]", "BT Info[bt rsp]", "BT Info[bt auto report]", }; -u4Byte GLCoexVerDate8723b1Ant=20150119; -u4Byte GLCoexVer8723b1Ant=0x58; +u32 glcoex_ver_date_8723b_1ant = 20151015; +u32 glcoex_ver_8723b_1ant = 0x63; -//============================================================ -// local function proto type if needed -//============================================================ -//============================================================ -// local function start with halbtc8723b1ant_ -//============================================================ -u1Byte -halbtc8723b1ant_BtRssiState( - u1Byte levelNum, - u1Byte rssiThresh, - u1Byte rssiThresh1 - ) +/* ************************************************************ + * local function proto type if needed + * ************************************************************ + * ************************************************************ + * local function start with halbtc8723b1ant_ + * ************************************************************ */ + +void halbtc8723b1ant_update_ra_mask(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u32 dis_rate_mask) { - s4Byte btRssi=0; - u1Byte btRssiState=pCoexSta->preBtRssiState; - - btRssi = pCoexSta->btRssi; - - if(levelNum == 2) - { - if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) || - (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)) - { - if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) - { - btRssiState = BTC_RSSI_STATE_HIGH; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else - { - if(btRssi < rssiThresh) - { - btRssiState = BTC_RSSI_STATE_LOW; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - else if(levelNum == 3) - { - if(rssiThresh > rssiThresh1) - { - 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)) - { - if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) - { - btRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) || - (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM)) - { - if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) - { - btRssiState = BTC_RSSI_STATE_HIGH; - } - else if(btRssi < rssiThresh) - { - btRssiState = BTC_RSSI_STATE_LOW; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - } - } - else - { - if(btRssi < rssiThresh1) - { - btRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - btRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - - pCoexSta->preBtRssiState = btRssiState; - - return btRssiState; -} - -u1Byte -halbtc8723b1ant_WifiRssiState( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte index, - IN u1Byte levelNum, - IN u1Byte rssiThresh, - IN u1Byte rssiThresh1 - ) -{ - s4Byte wifiRssi=0; - u1Byte wifiRssiState=pCoexSta->preWifiRssiState[index]; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi); + coex_dm->cur_ra_mask = dis_rate_mask; - if(levelNum == 2) - { - if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)) - { - if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) - { - wifiRssiState = BTC_RSSI_STATE_HIGH; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else - { - if(wifiRssi < rssiThresh) - { - wifiRssiState = BTC_RSSI_STATE_LOW; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - else if(levelNum == 3) - { - if(rssiThresh > rssiThresh1) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], wifi RSSI thresh error!!\n")); - return pCoexSta->preWifiRssiState[index]; - } - - if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)) - { - if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) - { - wifiRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_LOW; - } - } - else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) || - (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM)) - { - if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT)) - { - wifiRssiState = BTC_RSSI_STATE_HIGH; - } - else if(wifiRssi < rssiThresh) - { - wifiRssiState = BTC_RSSI_STATE_LOW; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM; - } - } - else - { - if(wifiRssi < rssiThresh1) - { - wifiRssiState = BTC_RSSI_STATE_MEDIUM; - } - else - { - wifiRssiState = BTC_RSSI_STATE_STAY_HIGH; - } - } - } - - pCoexSta->preWifiRssiState[index] = wifiRssiState; - - return wifiRssiState; + if( force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) + btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK, + &coex_dm->cur_ra_mask); + coex_dm->pre_ra_mask = coex_dm->cur_ra_mask; } -VOID -halbtc8723b1ant_UpdateRaMask( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u4Byte disRateMask - ) +void halbtc8723b1ant_auto_rate_fallback_retry(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) { - pCoexDm->curRaMask = disRateMask; - - if( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask)) - { - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask); - } - pCoexDm->preRaMask = pCoexDm->curRaMask; -} + boolean wifi_under_b_mode = false; -VOID -halbtc8723b1ant_AutoRateFallbackRetry( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte type - ) -{ - BOOLEAN bWifiUnderBMode=FALSE; - - pCoexDm->curArfrType = type; + coex_dm->cur_arfr_type = 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 -halbtc8723b1ant_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 -halbtc8723b1ant_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 -halbtc8723b1ant_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 - halbtc8723b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0); + if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) { + switch (coex_dm->cur_arfr_type) { + case 0: /* normal mode */ + btcoexist->btc_write_4byte(btcoexist, 0x430, + coex_dm->backup_arfr_cnt1); + btcoexist->btc_write_4byte(btcoexist, 0x434, + coex_dm->backup_arfr_cnt2); break; - case 1: // disable cck 1/2 - halbtc8723b1ant_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 - halbtc8723b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7); + case 1: + btcoexist->btc_get(btcoexist, + BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + if (wifi_under_b_mode) { + btcoexist->btc_write_4byte(btcoexist, + 0x430, 0x0); + btcoexist->btc_write_4byte(btcoexist, + 0x434, 0x01010101); + } else { + btcoexist->btc_write_4byte(btcoexist, + 0x430, 0x0); + btcoexist->btc_write_4byte(btcoexist, + 0x434, 0x04030201); + } break; default: break; + } } - halbtc8723b1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType); - halbtc8723b1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType); - halbtc8723b1ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType); + coex_dm->pre_arfr_type = coex_dm->cur_arfr_type; } -VOID -halbtc8723b1ant_LimitedRx( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bRejApAggPkt, - IN BOOLEAN bBtCtrlAggBufSize, - IN u1Byte aggBufSize - ) +void halbtc8723b1ant_retry_limit(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) { - BOOLEAN bRejectRxAgg=bRejApAggPkt; - BOOLEAN bBtCtrlRxAggSize=bBtCtrlAggBufSize; - u1Byte rxAggSize=aggBufSize; + coex_dm->cur_retry_limit_type = type; - //============================================ - // 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); + if (force_exec || + (coex_dm->pre_retry_limit_type != + coex_dm->cur_retry_limit_type)) { + switch (coex_dm->cur_retry_limit_type) { + case 0: /* normal mode */ + btcoexist->btc_write_2byte(btcoexist, 0x42a, + coex_dm->backup_retry_limit); + break; + case 1: /* retry limit=8 */ + btcoexist->btc_write_2byte(btcoexist, 0x42a, + 0x0808); + break; + default: + break; + } + } + + coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type; +} + +void halbtc8723b1ant_ampdu_max_time(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) +{ + coex_dm->cur_ampdu_time_type = type; + + if (force_exec || + (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) { + switch (coex_dm->cur_ampdu_time_type) { + case 0: /* normal mode */ + btcoexist->btc_write_1byte(btcoexist, 0x456, + coex_dm->backup_ampdu_max_time); + break; + case 1: /* AMPDU timw = 0x38 * 32us */ + btcoexist->btc_write_1byte(btcoexist, 0x456, + 0x38); + break; + default: + break; + } + } + + coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type; +} + +void halbtc8723b1ant_limited_tx(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 ra_mask_type, IN u8 arfr_type, + IN u8 retry_limit_type, IN u8 ampdu_time_type) +{ + switch (ra_mask_type) { + case 0: /* normal mode */ + halbtc8723b1ant_update_ra_mask(btcoexist, force_exec, + 0x0); + break; + case 1: /* disable cck 1/2 */ + halbtc8723b1ant_update_ra_mask(btcoexist, force_exec, + 0x00000003); + break; + case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */ + halbtc8723b1ant_update_ra_mask(btcoexist, force_exec, + 0x0001f1f7); + break; + default: + break; + } + + halbtc8723b1ant_auto_rate_fallback_retry(btcoexist, force_exec, + arfr_type); + halbtc8723b1ant_retry_limit(btcoexist, force_exec, retry_limit_type); + halbtc8723b1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type); +} + +void halbtc8723b1ant_limited_rx(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean rej_ap_agg_pkt, + IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size) +{ + boolean reject_rx_agg = rej_ap_agg_pkt; + boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size; + u8 rx_agg_size = agg_buf_size; + + /* ============================================ */ + /* Rx Aggregation related setting */ + /* ============================================ */ + btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, + &reject_rx_agg); + /* decide BT control aggregation buf size or not */ + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, + &bt_ctrl_rx_agg_size); + /* aggregation buf size, only work when BT control Rx aggregation size. */ + btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size); + /* real update aggregation setting */ + btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); } -VOID -halbtc8723b1ant_QueryBtInfo( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_query_bt_info(IN struct btc_coexist *btcoexist) { - u1Byte H2C_Parameter[1] ={0}; + u8 h2c_parameter[1] = {0}; - pCoexSta->bC2hBtInfoReqSent = TRUE; + coex_sta->c2h_bt_info_req_sent = true; - H2C_Parameter[0] |= BIT0; // trigger + h2c_parameter[0] |= BIT(0); /* 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); + btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter); } -VOID -halbtc8723b1ant_MonitorBtCtr( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist) { - u4Byte regHPTxRx, regLPTxRx, u4Tmp, u4Tmp1; - u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0; - u1Byte u1Tmp, u1Tmp1; - s4Byte wifiRssi; - static u4Byte NumOfBtCounterChk = 0; + u32 reg_hp_txrx, reg_lp_txrx, u32tmp; + u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0; + static u32 num_of_bt_counter_chk = 0; + + reg_hp_txrx = 0x770; + reg_lp_txrx = 0x774; + + u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx); + reg_hp_tx = u32tmp & MASKLWORD; + reg_hp_rx = (u32tmp & MASKHWORD) >> 16; + + u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx); + reg_lp_tx = u32tmp & MASKLWORD; + reg_lp_rx = (u32tmp & MASKHWORD) >> 16; + + coex_sta->high_priority_tx = reg_hp_tx; + coex_sta->high_priority_rx = reg_hp_rx; + coex_sta->low_priority_tx = reg_lp_tx; + coex_sta->low_priority_rx = reg_lp_rx; + + if ((coex_sta->low_priority_tx > 1050) && + (!coex_sta->c2h_bt_inquiry_page)) + coex_sta->pop_event_cnt++; + + /* reset counter */ + btcoexist->btc_write_1byte(btcoexist, 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 ((reg_hp_tx == 0) && (reg_hp_rx == 0) && (reg_lp_tx == 0) && + (reg_lp_rx == 0)) { + num_of_bt_counter_chk++; + if (num_of_bt_counter_chk == 3) + halbtc8723b1ant_query_bt_info(btcoexist); + } else + num_of_bt_counter_chk = 0; +} + + +void halbtc8723b1ant_monitor_wifi_ctr(IN struct btc_coexist *btcoexist) +{ + s32 wifi_rssi = 0; + boolean wifi_busy = false, wifi_under_b_mode = false; + static u8 cck_lock_counter = 0; + u32 total_cnt; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + + if (coex_sta->under_ips) { + coex_sta->crc_ok_cck = 0; + coex_sta->crc_ok_11g = 0; + coex_sta->crc_ok_11n = 0; + coex_sta->crc_ok_11n_agg = 0; + + coex_sta->crc_err_cck = 0; + coex_sta->crc_err_11g = 0; + coex_sta->crc_err_11n = 0; + coex_sta->crc_err_11n_agg = 0; + } else { + coex_sta->crc_ok_cck = btcoexist->btc_read_4byte(btcoexist, + 0xf88); + coex_sta->crc_ok_11g = btcoexist->btc_read_2byte(btcoexist, + 0xf94); + coex_sta->crc_ok_11n = btcoexist->btc_read_2byte(btcoexist, + 0xf90); + coex_sta->crc_ok_11n_agg = btcoexist->btc_read_2byte(btcoexist, + 0xfb8); + + coex_sta->crc_err_cck = btcoexist->btc_read_4byte(btcoexist, + 0xf84); + coex_sta->crc_err_11g = btcoexist->btc_read_2byte(btcoexist, + 0xf96); + coex_sta->crc_err_11n = btcoexist->btc_read_2byte(btcoexist, + 0xf92); + coex_sta->crc_err_11n_agg = btcoexist->btc_read_2byte(btcoexist, + 0xfba); + } + + + /* reset counter */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0); + + if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) { + total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g + + coex_sta->crc_ok_11n + + coex_sta->crc_ok_11n_agg; - //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; - - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx); - regHPTx = u4Tmp & bMaskLWord; - regHPRx = (u4Tmp & bMaskHWord)>>16; - - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx); - regLPTx = u4Tmp & bMaskLWord; - regLPRx = (u4Tmp & bMaskHWord)>>16; - - pCoexSta->highPriorityTx = regHPTx; - pCoexSta->highPriorityRx = regHPRx; - pCoexSta->lowPriorityTx = regLPTx; - pCoexSta->lowPriorityRx = 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); - - // 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) -{ - halbtc8723b1ant_QueryBtInfo(pBtCoexist); - } - } - else - { - NumOfBtCounterChk = 0; - } - } - - -VOID -halbtc8723b1ant_MonitorWiFiCtr( - IN PBTC_COEXIST pBtCoexist - ) -{ - u4Byte u4Tmp; - u2Byte u2Tmp[3]; - 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); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode); - - 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); - - 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 >(TotalCnt -pCoexSta->nCRCOK_CCK)) - { - if (nCCKLockCounter < 3) - nCCKLockCounter++; - } - else - { - if (nCCKLockCounter > 0) - nCCKLockCounter--; + if ( (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) || + (coex_dm->bt_status == + BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) || + (coex_dm->bt_status == + BT_8723B_1ANT_BT_STATUS_SCO_BUSY)) { + if (coex_sta->crc_ok_cck > (total_cnt - +coex_sta->crc_ok_cck)) { + if (cck_lock_counter < 3) + cck_lock_counter++; + } else { + if (cck_lock_counter > 0) + cck_lock_counter--; } + } else { + if (cck_lock_counter > 0) + cck_lock_counter--; } - else - { - if (nCCKLockCounter > 0) - nCCKLockCounter--; - } - } - else - { - if (nCCKLockCounter > 0) - nCCKLockCounter--; + } else { + if (cck_lock_counter > 0) + cck_lock_counter--; } - if (!pCoexSta->bPreCCKLock) - { + if (!coex_sta->pre_ccklock) { - if (nCCKLockCounter >= 3) - pCoexSta->bCCKLock = TRUE; + if (cck_lock_counter >= 3) + coex_sta->cck_lock = true; else - pCoexSta->bCCKLock = FALSE; - } - else - { - if (nCCKLockCounter == 0) - pCoexSta->bCCKLock = FALSE; + coex_sta->cck_lock = false; + } else { + if (cck_lock_counter == 0) + coex_sta->cck_lock = false; else - pCoexSta->bCCKLock = TRUE; + coex_sta->cck_lock = true; } - if (pCoexSta->bCCKLock) - pCoexSta->bCCKEverLock = TRUE; - - pCoexSta->bPreCCKLock = pCoexSta->bCCKLock; - + if (coex_sta->cck_lock) + coex_sta->cck_ever_lock = true; + + coex_sta->pre_ccklock = coex_sta->cck_lock; + } -BOOLEAN -halbtc8723b1ant_IsWifiStatusChanged( - IN PBTC_COEXIST pBtCoexist - ) +boolean halbtc8723b1ant_is_wifi_status_changed(IN struct btc_coexist *btcoexist) { - static BOOLEAN bPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE; - BOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE; - BOOLEAN bWifiConnected=FALSE; - u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH; + static boolean pre_wifi_busy = false, pre_under_4way = false, + pre_bt_hs_on = false; + boolean wifi_busy = false, under_4way = false, bt_hs_on = false; + boolean wifi_connected = 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); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, + &under_4way); - if(bWifiConnected) - { - if(bWifiBusy != bPreWifiBusy) - { - bPreWifiBusy = bWifiBusy; - return TRUE; + if (wifi_connected) { + if (wifi_busy != pre_wifi_busy) { + pre_wifi_busy = wifi_busy; + return true; } - if(bUnder4way != bPreUnder4way) - { - bPreUnder4way = bUnder4way; - return TRUE; + if (under_4way != pre_under_4way) { + pre_under_4way = under_4way; + return true; } - if(bBtHsOn != bPreBtHsOn) - { - bPreBtHsOn = bBtHsOn; - return TRUE; + if (bt_hs_on != pre_bt_hs_on) { + pre_bt_hs_on = bt_hs_on; + return true; } - + } - return FALSE; + return false; } -VOID -halbtc8723b1ant_UpdateBtLinkInfo( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_update_bt_link_info(IN struct btc_coexist *btcoexist) { - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BOOLEAN bBtHsOn=FALSE; + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean bt_hs_on = false; - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); - pBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist; - pBtLinkInfo->bScoExist = pCoexSta->bScoExist; - pBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist; - pBtLinkInfo->bPanExist = pCoexSta->bPanExist; - pBtLinkInfo->bHidExist = pCoexSta->bHidExist; - pBtLinkInfo->bBtHiPriLinkExist = pCoexSta->bBtHiPriLinkExist; + bt_link_info->bt_link_exist = coex_sta->bt_link_exist; + bt_link_info->sco_exist = coex_sta->sco_exist; + bt_link_info->a2dp_exist = coex_sta->a2dp_exist; + bt_link_info->pan_exist = coex_sta->pan_exist; + bt_link_info->hid_exist = coex_sta->hid_exist; + bt_link_info->bt_hi_pri_link_exist = coex_sta->bt_hi_pri_link_exist; - // work around for HS mode. - if(bBtHsOn) - { - pBtLinkInfo->bPanExist = TRUE; - pBtLinkInfo->bBtLinkExist = TRUE; + /* work around for HS mode. */ + if (bt_hs_on) { + bt_link_info->pan_exist = true; + bt_link_info->bt_link_exist = true; } - // check if Sco only - if( pBtLinkInfo->bScoExist && - !pBtLinkInfo->bA2dpExist && - !pBtLinkInfo->bPanExist && - !pBtLinkInfo->bHidExist ) - pBtLinkInfo->bScoOnly = TRUE; + /* check if Sco only */ + if( bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + !bt_link_info->hid_exist ) + bt_link_info->sco_only = true; else - pBtLinkInfo->bScoOnly = FALSE; + bt_link_info->sco_only = false; - // check if A2dp only - if( !pBtLinkInfo->bScoExist && - pBtLinkInfo->bA2dpExist && - !pBtLinkInfo->bPanExist && - !pBtLinkInfo->bHidExist ) - pBtLinkInfo->bA2dpOnly = TRUE; + /* check if A2dp only */ + if( !bt_link_info->sco_exist && + bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + !bt_link_info->hid_exist ) + bt_link_info->a2dp_only = true; else - pBtLinkInfo->bA2dpOnly = FALSE; + bt_link_info->a2dp_only = false; - // check if Pan only - if( !pBtLinkInfo->bScoExist && - !pBtLinkInfo->bA2dpExist && - pBtLinkInfo->bPanExist && - !pBtLinkInfo->bHidExist ) - pBtLinkInfo->bPanOnly = TRUE; + /* check if Pan only */ + if( !bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + bt_link_info->pan_exist && + !bt_link_info->hid_exist ) + bt_link_info->pan_only = true; else - pBtLinkInfo->bPanOnly = FALSE; + bt_link_info->pan_only = false; - // check if Hid only - if( !pBtLinkInfo->bScoExist && - !pBtLinkInfo->bA2dpExist && - !pBtLinkInfo->bPanExist && - pBtLinkInfo->bHidExist ) - pBtLinkInfo->bHidOnly = TRUE; + /* check if Hid only */ + if( !bt_link_info->sco_exist && + !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && + bt_link_info->hid_exist ) + bt_link_info->hid_only = true; else - pBtLinkInfo->bHidOnly = FALSE; + bt_link_info->hid_only = false; } -u1Byte -halbtc8723b1ant_ActionAlgorithm( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_set_bt_auto_report(IN struct btc_coexist *btcoexist, + IN boolean enable_auto_report) { - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BOOLEAN bBtHsOn=FALSE; - u1Byte algorithm=BT_8723B_1ANT_COEX_ALGO_UNDEFINED; - u1Byte numOfDiffProfile=0; + u8 h2c_parameter[1] = {0}; - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); + h2c_parameter[0] = 0; - if(!pBtLinkInfo->bBtLinkExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], No BT link exists!!!\n")); - return algorithm; - } + if (enable_auto_report) + h2c_parameter[0] |= BIT(0); - if(pBtLinkInfo->bScoExist) - numOfDiffProfile++; - if(pBtLinkInfo->bHidExist) - numOfDiffProfile++; - if(pBtLinkInfo->bPanExist) - numOfDiffProfile++; - if(pBtLinkInfo->bA2dpExist) - numOfDiffProfile++; - - if(numOfDiffProfile == 1) - { - if(pBtLinkInfo->bScoExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO only\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_SCO; - } - else - { - if(pBtLinkInfo->bHidExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID only\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_HID; - } - else if(pBtLinkInfo->bA2dpExist) - { - 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) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(HS) only\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_PANHS; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = PAN(EDR) only\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR; - } - } - } - } - else if(numOfDiffProfile == 2) - { - if(pBtLinkInfo->bScoExist) - { - if(pBtLinkInfo->bHidExist) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_HID; - } - else if(pBtLinkInfo->bA2dpExist) - { - 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) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(HS)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_SCO; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + PAN(EDR)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID; - } - } - } - else - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bA2dpExist ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP; - } - else if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(HS)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + PAN(EDR)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID; - } - } - else if( pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(HS)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = A2DP + PAN(EDR)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP; - } - } - } - } - else if(numOfDiffProfile == 3) - { - if(pBtLinkInfo->bScoExist) - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bA2dpExist ) - { - 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 && - pBtLinkInfo->bPanExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(HS)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID; - } - } - else if( pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_SCO; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID; - } - } - } - else - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP; - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n")); - algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR; - } - } - } - } - else if(numOfDiffProfile >= 3) - { - if(pBtLinkInfo->bScoExist) - { - if( pBtLinkInfo->bHidExist && - pBtLinkInfo->bPanExist && - pBtLinkInfo->bA2dpExist ) - { - if(bBtHsOn) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n")); - - } - else - { - 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; - } - } - } - } - - return algorithm; + btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter); } -VOID -halbtc8723b1ant_SetBtAutoReport( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bEnableAutoReport - ) +void halbtc8723b1ant_bt_auto_report(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean enable_auto_report) { - u1Byte H2C_Parameter[1] ={0}; - - H2C_Parameter[0] = 0; + coex_dm->cur_bt_auto_report = enable_auto_report; - 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 -halbtc8723b1ant_BtAutoReport( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bEnableAutoReport - ) -{ - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s BT Auto report = %s\n", - (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled"))); - pCoexDm->bCurBtAutoReport = bEnableAutoReport; - - if(!bForceExec) - { - if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) + if (!force_exec) { + if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report) return; } - halbtc8723b1ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport); + halbtc8723b1ant_set_bt_auto_report(btcoexist, + coex_dm->cur_bt_auto_report); - pCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport; + coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report; } -VOID -halbtc8723b1ant_SetSwPenaltyTxRateAdaptive( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bLowPenaltyRa - ) +void halbtc8723b1ant_set_sw_penalty_tx_rate_adaptive(IN struct btc_coexist + *btcoexist, IN boolean low_penalty_ra) { - u1Byte H2C_Parameter[6] ={0}; - - H2C_Parameter[0] = 0x6; // opCode, 0x6= Retry_Penalty + u8 h2c_parameter[6] = {0}; - if(bLowPenaltyRa) - { - 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 + h2c_parameter[0] = 0x6; /* op_code, 0x6= Retry_Penalty */ + + if (low_penalty_ra) { + h2c_parameter[1] |= BIT(0); + 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 */ } - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set WiFi Low-Penalty Retry: %s", - (bLowPenaltyRa? "ON!!":"OFF!!") )); - - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter); + btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter); } -VOID -halbtc8723b1ant_LowPenaltyRa( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bLowPenaltyRa - ) +void halbtc8723b1ant_low_penalty_ra(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean low_penalty_ra) { - pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa; + coex_dm->cur_low_penalty_ra = low_penalty_ra; - if(!bForceExec) - { - if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) + if (!force_exec) { + if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra) return; } - halbtc8723b1ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa); + halbtc8723b1ant_set_sw_penalty_tx_rate_adaptive(btcoexist, + coex_dm->cur_low_penalty_ra); - pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa; + coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra; } -VOID -halbtc8723b1ant_SetCoexTable( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte val0x6c0, - IN u4Byte val0x6c4, - IN u4Byte val0x6c8, - IN u1Byte val0x6cc - ) +void halbtc8723b1ant_set_coex_table(IN struct btc_coexist *btcoexist, + IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc) { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0)); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0); + btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0); - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4)); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4); + btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4); - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8)); - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8); + btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8); - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc)); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc); + btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc); } -VOID -halbtc8723b1ant_CoexTable( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u4Byte val0x6c0, - IN u4Byte val0x6c4, - IN u4Byte val0x6c8, - IN u1Byte val0x6cc - ) +void halbtc8723b1ant_coex_table(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4, + IN u32 val0x6c8, IN u8 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; + coex_dm->cur_val0x6c0 = val0x6c0; + coex_dm->cur_val0x6c4 = val0x6c4; + coex_dm->cur_val0x6c8 = val0x6c8; + coex_dm->cur_val0x6cc = val0x6cc; - if(!bForceExec) - { - if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) && - (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) && - (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) && - (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) ) + if (!force_exec) { + if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) && + (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) && + (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) && + (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc)) return; } - halbtc8723b1ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc); + halbtc8723b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8, + val0x6cc); - pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0; - pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4; - pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8; - pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc; + coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0; + coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4; + coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8; + coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc; } -VOID -halbtc8723b1ant_CoexTableWithType( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte type - ) +void halbtc8723b1ant_coex_table_with_type(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 type) { - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + struct btc_board_info *board_info = &btcoexist->board_info; #if BT_8723B_1ANT_ANTDET_ENABLE -#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE - if (pBoardInfo->btdmAntNumByAntDet == 2) - { +#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE + if (board_info->btdm_ant_num_by_ant_det == 2) { if (type == 3) type = 14; else if (type == 4) @@ -1061,4578 +554,4292 @@ halbtc8723b1ant_CoexTableWithType( #endif #endif - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type)); - - pCoexSta->nCoexTableType = type; - - switch(type) - { - case 0: - halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3); - break; - case 1: - halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); - break; - case 2: - halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3); - break; - case 3: - halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); - break; - case 4: - if ( pCoexSta->bCCKEverLock) - halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3); - else - halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3); - break; - case 5: - 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); - break; - 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; + coex_sta->coex_table_type = type; + + switch (type) { + case 0: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0x55555555, 0xffffff, 0x3); + break; + case 1: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 2: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 3: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3); + break; + case 4: + if ((coex_sta->cck_ever_lock) && + (coex_sta->scan_ap_num <= 5)) + halbtc8723b1ant_coex_table(btcoexist, + force_exec, 0x55555555, 0xaaaa5a5a, + 0xffffff, 0x3); + else + halbtc8723b1ant_coex_table(btcoexist, + force_exec, 0x55555555, 0x5a5a5a5a, + 0xffffff, 0x3); + break; + case 5: + if ((coex_sta->cck_ever_lock) && + (coex_sta->scan_ap_num <= 5)) + halbtc8723b1ant_coex_table(btcoexist, + force_exec, 0x5a5a5a5a, 0x5aaa5a5a, + 0xffffff, 0x3); + else + halbtc8723b1ant_coex_table(btcoexist, + force_exec, 0x5a5a5a5a, 0x5aaa5a5a, + 0xffffff, 0x3); + break; + case 6: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3); + break; + case 7: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3); + break; + case 8: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 9: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 10: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 11: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 12: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3); + break; + case 13: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3); + break; + case 14: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3); + break; + case 15: + halbtc8723b1ant_coex_table(btcoexist, force_exec, + 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3); + break; + default: + break; } } -VOID -halbtc8723b1ant_SetFwIgnoreWlanAct( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bEnable - ) +void halbtc8723b1ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist, + IN boolean enable) { - u1Byte H2C_Parameter[1] ={0}; - - if(bEnable) - { - H2C_Parameter[0] |= BIT0; // function enable - } - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", - H2C_Parameter[0])); + u8 h2c_parameter[1] = {0}; - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter); + if (enable) { + h2c_parameter[0] |= BIT(0); /* function enable */ + } + + btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter); } -VOID -halbtc8723b1ant_IgnoreWlanAct( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bEnable - ) +void halbtc8723b1ant_ignore_wlan_act(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean enable) { - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], %s turn Ignore WlanAct %s\n", - (bForceExec? "force to":""), (bEnable? "ON":"OFF"))); - pCoexDm->bCurIgnoreWlanAct = bEnable; + coex_dm->cur_ignore_wlan_act = enable; - if(!bForceExec) - { - if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct) + if (!force_exec) { + if (coex_dm->pre_ignore_wlan_act == + coex_dm->cur_ignore_wlan_act) return; } - halbtc8723b1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable); + halbtc8723b1ant_set_fw_ignore_wlan_act(btcoexist, enable); - pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct; + coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act; } -VOID -halbtc8723b1ant_SetLpsRpwm( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte lpsVal, - IN u1Byte rpwmVal - ) +void halbtc8723b1ant_set_lps_rpwm(IN struct btc_coexist *btcoexist, + IN u8 lps_val, IN u8 rpwm_val) { - u1Byte lps=lpsVal; - u1Byte rpwm=rpwmVal; - - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps); - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm); + u8 lps = lps_val; + u8 rpwm = rpwm_val; + + btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps); + btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm); } -VOID -halbtc8723b1ant_LpsRpwm( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN u1Byte lpsVal, - IN u1Byte rpwmVal - ) +void halbtc8723b1ant_lps_rpwm(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val) { - 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; + coex_dm->cur_lps = lps_val; + coex_dm->cur_rpwm = rpwm_val; - if(!bForceExec) - { - if( (pCoexDm->preLps == pCoexDm->curLps) && - (pCoexDm->preRpwm == pCoexDm->curRpwm) ) - { + if (!force_exec) { + if ((coex_dm->pre_lps == coex_dm->cur_lps) && + (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) return; - } } - halbtc8723b1ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal); + halbtc8723b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val); - pCoexDm->preLps = pCoexDm->curLps; - pCoexDm->preRpwm = pCoexDm->curRpwm; + coex_dm->pre_lps = coex_dm->cur_lps; + coex_dm->pre_rpwm = coex_dm->cur_rpwm; } -VOID -halbtc8723b1ant_SwMechanism( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bLowPenaltyRA - ) +void halbtc8723b1ant_sw_mechanism(IN struct btc_coexist *btcoexist, + IN boolean low_penalty_ra) { - halbtc8723b1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA); + halbtc8723b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra); } -VOID -halbtc8723b1ant_SetAntPath( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte antPosType, - IN BOOLEAN bForceExec, - IN BOOLEAN bInitHwCfg, - IN BOOLEAN bWifiOff - ) +void halbtc8723b1ant_set_ant_path(IN struct btc_coexist *btcoexist, + IN u8 ant_pos_type, IN boolean force_exec, IN boolean init_hwcfg, + IN boolean wifi_off) { - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - u4Byte fwVer=0, u4Tmp=0, cntBtCalChk=0; - BOOLEAN bPgExtSwitch=FALSE; - BOOLEAN bUseExtSwitch=FALSE; - BOOLEAN bIsInMpMode = FALSE; - u1Byte H2C_Parameter[2] ={0}, u1Tmp = 0; + struct btc_board_info *board_info = &btcoexist->board_info; + u32 fw_ver = 0, u32tmp = 0, cnt_bt_cal_chk = 0; + boolean pg_ext_switch = false; + boolean use_ext_switch = false; + boolean is_in_mp_mode = false; + u8 h2c_parameter[2] = {0}, u8tmp = 0; - pCoexDm->curAntPosType = antPosType; - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); // [31:16]=fw ver, [15:0]=fw sub ver + coex_dm->cur_ant_pos_type = ant_pos_type; - if((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch) - bUseExtSwitch = TRUE; + btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, + &fw_ver); /* [31:16]=fw ver, [15:0]=fw sub ver */ + + if ((fw_ver > 0 && fw_ver < 0xc0000) || pg_ext_switch) + use_ext_switch = 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; - } + if (ant_pos_type == BTC_ANT_PATH_PTA) { + if ((board_info->btdm_ant_det_finish) && + (board_info->btdm_ant_num_by_ant_det == 2)) { + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) + ant_pos_type = BTC_ANT_PATH_WIFI; + else + ant_pos_type = BTC_ANT_PATH_BT; } -#endif + } +#endif #endif - if(bInitHwCfg) - { - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi TRx Mask on - //remove due to interrupt is disabled that polling c2h will fail and delay 100ms. - //pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT TRx Mask on + if (init_hwcfg) { + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, + 0x780); /* WiFi TRx Mask on */ + /* remove due to interrupt is disabled that polling c2h will fail and delay 100ms. */ + /* btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT TRx Mask on */ - if(fwVer >= 0x180000) - { - /* Use H2C to set GNT_BT to HIGH */ - H2C_Parameter[0] = 1; - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter); + if (fw_ver >= 0x180000) { + /* Use H2C to set GNT_BT to HIGH */ + h2c_parameter[0] = 1; + btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1, + h2c_parameter); + } else { + /* set grant_bt to high */ + btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18); } - else - { - // set grant_bt to high - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); - } - //set wlan_act control by PTA - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); + /* set wlan_act control by PTA */ + btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4); - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, + 0x0); /* BT select s0/s1 is controlled by BT */ - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff); - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3); - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77); - } - else if(bWifiOff) - { - if(fwVer >= 0x180000) - { - /* Use H2C to set GNT_BT to HIGH */ - H2C_Parameter[0] = 1; - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x39, 0x8, 0x1); + btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3); + btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77); + } else if (wifi_off) { + if (fw_ver >= 0x180000) { + /* Use H2C to set GNT_BT to HIGH */ + h2c_parameter[0] = 1; + btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1, + h2c_parameter); + } else { + /* set grant_bt to high */ + btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18); } + /* set wlan_act to always low */ + btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, + &is_in_mp_mode); + if (!is_in_mp_mode) + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, + 0x20, 0x0); /* BT select s0/s1 is controlled by BT */ else - { - // set grant_bt to high - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); - } - //set wlan_act to always low - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode); - if(!bIsInMpMode) - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT - else - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi - - // 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL BT Vendor 0xac=0xf002 - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c); - u4Tmp &= ~BIT23; - u4Tmp &= ~BIT24; - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp); - } - else - { + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, + 0x20, 0x1); /* BT select s0/s1 is controlled by WiFi */ + + /* 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL BT Vendor 0xac=0xf002 */ + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c); + u32tmp &= ~BIT(23); + u32tmp &= ~BIT(24); + btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp); + } else { /* Use H2C to set GNT_BT to LOW */ - if(fwVer >= 0x180000) - { - if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765) != 0) - { - H2C_Parameter[0] = 0; - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter); - } - } - else - { - // BT calibration check - while(cntBtCalChk <= 20) - { - u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49d); - cntBtCalChk++; - if(u1Tmp & BIT0) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n", cntBtCalChk)); + if (fw_ver >= 0x180000) { + if (btcoexist->btc_read_1byte(btcoexist, 0x765) != 0) { + h2c_parameter[0] = 0; + btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1, + h2c_parameter); + } + } else { + /* BT calibration check */ + while (cnt_bt_cal_chk <= 20) { + u8tmp = btcoexist->btc_read_1byte(btcoexist, + 0x49d); + cnt_bt_cal_chk++; + if (u8tmp & BIT(0)) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n", + cnt_bt_cal_chk); + BTC_TRACE(trace_buf); delay_ms(50); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n", + cnt_bt_cal_chk); + BTC_TRACE(trace_buf); + break; } + } + + /* set grant_bt to PTA */ + btcoexist->btc_write_1byte(btcoexist, 0x765, 0x0); + } + + if (btcoexist->btc_read_1byte(btcoexist, 0x76e) != 0xc) { + /* set wlan_act control by PTA */ + btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc); + } + + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, + 0x1); /* BT select s0/s1 is controlled by WiFi */ + } + + if (use_ext_switch) { + if (init_hwcfg) { + /* 0x4c[23]=0, 0x4c[24]=1 Antenna control by WL/BT */ + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c); + u32tmp &= ~BIT(23); + u32tmp |= BIT(24); + btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp); + + btcoexist->btc_write_4byte(btcoexist, 0x948, + 0x0); /* fixed internal switch S1->WiFi, S0->BT */ + + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) { + /* tell firmware "no antenna inverse" */ + h2c_parameter[0] = 0; + h2c_parameter[1] = 1; /* ext switch type */ + btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, + h2c_parameter); + } else { + /* tell firmware "antenna inverse" */ + h2c_parameter[0] = 1; + h2c_parameter[1] = 1; /* ext switch type */ + btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, + h2c_parameter); + } + } + + if (force_exec || + (coex_dm->cur_ant_pos_type != + coex_dm->pre_ant_pos_type)) { + /* ext switch setting */ + switch (ant_pos_type) { + case BTC_ANT_PATH_WIFI: + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) + btcoexist->btc_write_1byte_bitmask( + btcoexist, 0x92c, 0x3, + 0x1); else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n", cntBtCalChk)); - break; - } - } - - // set grant_bt to PTA - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0); - } - - if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) != 0xc) - { - //set wlan_act control by PTA - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); - } - - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi - } - - if(bUseExtSwitch) - { - if(bInitHwCfg) - { - // 0x4c[23]=0, 0x4c[24]=1 Antenna control by WL/BT - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c); - u4Tmp &=~BIT23; - u4Tmp |= BIT24; - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp); - - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT - - if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) - { - //tell firmware "no antenna inverse" - H2C_Parameter[0] = 0; - H2C_Parameter[1] = 1; //ext switch type - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter); - } - else - { - //tell firmware "antenna inverse" - H2C_Parameter[0] = 1; - H2C_Parameter[1] = 1; //ext switch type - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter); + btcoexist->btc_write_1byte_bitmask( + btcoexist, 0x92c, 0x3, + 0x2); + break; + case BTC_ANT_PATH_BT: + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) + btcoexist->btc_write_1byte_bitmask( + btcoexist, 0x92c, 0x3, + 0x2); + else + btcoexist->btc_write_1byte_bitmask( + btcoexist, 0x92c, 0x3, + 0x1); + break; + default: + case BTC_ANT_PATH_PTA: + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) + btcoexist->btc_write_1byte_bitmask( + btcoexist, 0x92c, 0x3, + 0x1); + else + btcoexist->btc_write_1byte_bitmask( + btcoexist, 0x92c, 0x3, + 0x2); + break; } } - - if(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType)) - { - // ext switch setting - switch(antPosType) - { - case BTC_ANT_PATH_WIFI: - if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1); - else - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2); - break; - case BTC_ANT_PATH_BT: - if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2); - else - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1); - break; - default: - case BTC_ANT_PATH_PTA: - if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1); - else - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2); - break; + } else { + if (init_hwcfg) { + /* 0x4c[23]=1, 0x4c[24]=0 Antenna control by 0x64 */ + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c); + u32tmp |= BIT(23); + u32tmp &= ~BIT(24); + btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp); + + /* Fix Ext switch Main->S1, Aux->S0 */ + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1, + 0x0); + + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) { + + /* tell firmware "no antenna inverse" */ + h2c_parameter[0] = 0; + h2c_parameter[1] = + 0; /* internal switch type */ + btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, + h2c_parameter); + } else { + + /* tell firmware "antenna inverse" */ + h2c_parameter[0] = 1; + h2c_parameter[1] = + 0; /* internal switch type */ + btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, + h2c_parameter); } } - } - else - { - if(bInitHwCfg) - { - // 0x4c[23]=1, 0x4c[24]=0 Antenna control by 0x64 - u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c); - u4Tmp |= BIT23; - u4Tmp &=~BIT24; - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp); - //Fix Ext switch Main->S1, Aux->S0 - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); - - if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) - { - - //tell firmware "no antenna inverse" - H2C_Parameter[0] = 0; - H2C_Parameter[1] = 0; //internal switch type - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter); - } - else - { - - //tell firmware "antenna inverse" - H2C_Parameter[0] = 1; - H2C_Parameter[1] = 0; //internal switch type - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter); - } - } - - if(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType)) - { - // internal switch setting - switch(antPosType) - { - case BTC_ANT_PATH_WIFI: - if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); - else - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); - break; - case BTC_ANT_PATH_BT: - if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); - else - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); - break; - default: - case BTC_ANT_PATH_PTA: - if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x200); - else - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x80); - break; + if (force_exec || + (coex_dm->cur_ant_pos_type != + coex_dm->pre_ant_pos_type)) { + /* internal switch setting */ + switch (ant_pos_type) { + case BTC_ANT_PATH_WIFI: + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) + btcoexist->btc_write_4byte( + btcoexist, 0x948, 0x0); + else + btcoexist->btc_write_4byte( + btcoexist, 0x948, + 0x280); + break; + case BTC_ANT_PATH_BT: + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) + btcoexist->btc_write_4byte( + btcoexist, 0x948, + 0x280); + else + btcoexist->btc_write_4byte( + btcoexist, 0x948, 0x0); + break; + default: + case BTC_ANT_PATH_PTA: + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) + btcoexist->btc_write_4byte( + btcoexist, 0x948, + 0x200); + else + btcoexist->btc_write_4byte( + btcoexist, 0x948, 0x80); + break; } } } - pCoexDm->preAntPosType = pCoexDm->curAntPosType; + coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type; } -VOID -halbtc8723b1ant_SetAntPathDCut( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bAntennaAux, //For 1-Ant--> 1: Antenna at S0, 0: Antenna at S1. Set 0 for 2-Ant - IN BOOLEAN bExtSwitch, // 1: Ext Switch (SPDT) exist on module, 0: no Ext Switch (SPDT) exist on module - IN BOOLEAN bTwoAntenna, // 1: 2-Antenna, 0:1-Antenna - IN u1Byte antennaPos, //Set Antenna Pos, For 1-Ant: BTC_ANT_PATH_WIFI, BTC_ANT_PATH_BT, BTC_ANT_PATH_PTA, For 2-Ant:BTC_ANT_WIFI_AT_MAIN, BTC_ANT_WIFI_AT_Aux - IN u1Byte wifiState //BTC_WIFI_STAT_INIT, BTC_WIFI_STAT_IQK, BTC_WIFI_STAT_NORMAL_OFF, BTC_WIFI_STAT_MP_OFF, BTC_WIFI_STAT_NORMAL, BTC_WIFI_STAT_ANT_DIV - ) +void halbtc8723b1ant_set_fw_pstdma(IN struct btc_coexist *btcoexist, + IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5) { - u1Byte dataLen=5; - u1Byte buf[6] = {0}; + u8 h2c_parameter[5] = {0}; + u8 real_byte1 = byte1, real_byte5 = byte5; + boolean ap_enable = false; - 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)); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, + &ap_enable); - buf[0] = dataLen; - - if(bAntennaAux) - buf[1] = 0x1; - - if(bExtSwitch) - buf[2] = 0x1; - - if(bTwoAntenna) - buf[3] = 0x1; + if (ap_enable) { + if (byte1 & BIT(4) && !(byte1 & BIT(5))) { + real_byte1 &= ~BIT(4); + real_byte1 |= BIT(5); - buf[4] = antennaPos; - - buf[5] = wifiState; - - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_8723B_ANT, (PVOID)&buf[0]); -} - -VOID -halbtc8723b1ant_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; + real_byte5 |= BIT(5); + real_byte5 &= ~BIT(6); } } - H2C_Parameter[0] = realByte1; - H2C_Parameter[1] = byte2; - H2C_Parameter[2] = byte3; - H2C_Parameter[3] = byte4; - H2C_Parameter[4] = realByte5; + h2c_parameter[0] = real_byte1; + h2c_parameter[1] = byte2; + h2c_parameter[2] = byte3; + h2c_parameter[3] = byte4; + h2c_parameter[4] = real_byte5; - 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])); + coex_dm->ps_tdma_para[0] = real_byte1; + coex_dm->ps_tdma_para[1] = byte2; + coex_dm->ps_tdma_para[2] = byte3; + coex_dm->ps_tdma_para[3] = byte4; + coex_dm->ps_tdma_para[4] = real_byte5; - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter); + btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter); } -VOID -halbtc8723b1ant_PsTdma( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bForceExec, - IN BOOLEAN bTurnOn, - IN u1Byte type - ) +void halbtc8723b1ant_ps_tdma(IN struct btc_coexist *btcoexist, + IN boolean force_exec, IN boolean turn_on, IN u8 type) { - 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; + struct btc_board_info *board_info = &btcoexist->board_info; + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_busy = false; + u8 rssi_adjust_val = 0; + u8 ps_tdma_byte4_val = 0x50, ps_tdma_byte0_val = 0x51, + ps_tdma_byte3_val = 0x10; + s8 wifi_duration_adjust = 0x0; + static boolean pre_wifi_busy = false; - pCoexDm->bCurPsTdmaOn = bTurnOn; - pCoexDm->curPsTdma = type; + coex_dm->cur_ps_tdma_on = turn_on; + coex_dm->cur_ps_tdma = 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 + if (board_info->btdm_ant_num_by_ant_det == 2) { + if (turn_on) + type = type + + 100; /* for WiFi RSSI low or BT RSSI low */ else - type = 1; //always translate to TDMA(off,1) for TDMA-off case + type = 1; /* always translate to TDMA(off,1) for TDMA-off case */ } #endif #endif - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); - if (bWifiBusy != bPreWifiBusy) - { - 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 (wifi_busy != pre_wifi_busy) { + force_exec = true; + pre_wifi_busy = wifi_busy; } - if(!bForceExec) - { - if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) && - (pCoexDm->prePsTdma == pCoexDm->curPsTdma) ) + if (!force_exec) { + if( (coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) && + (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma) ) return; } - if (pCoexSta->nScanAPNum <= 5) - { - nWiFiDurationAdjust = 5; + if (coex_sta->scan_ap_num <= 5) { + wifi_duration_adjust = 5; - if (pCoexSta->nA2DPBitPool >= 35) - nWiFiDurationAdjust = -10; - else if (pCoexSta->nA2DPBitPool >= 45) - nWiFiDurationAdjust = -15; - } - else if (pCoexSta->nScanAPNum >= 40) - { - nWiFiDurationAdjust = -15; + if (coex_sta->a2dp_bit_pool >= 35) + wifi_duration_adjust = -10; + else if (coex_sta->a2dp_bit_pool >= 45) + wifi_duration_adjust = -15; + } else if (coex_sta->scan_ap_num >= 40) { + wifi_duration_adjust = -15; - if (pCoexSta->nA2DPBitPool < 35) - nWiFiDurationAdjust = -5; - else if (pCoexSta->nA2DPBitPool < 45) - nWiFiDurationAdjust = -10; - } - else if (pCoexSta->nScanAPNum >= 20) - { - nWiFiDurationAdjust = -10; + if (coex_sta->a2dp_bit_pool < 35) + wifi_duration_adjust = -5; + else if (coex_sta->a2dp_bit_pool < 45) + wifi_duration_adjust = -10; + } else if (coex_sta->scan_ap_num >= 20) { + wifi_duration_adjust = -10; - if (pCoexSta->nA2DPBitPool >= 45) - nWiFiDurationAdjust = -15; - } - else - { - nWiFiDurationAdjust = 0; + if (coex_sta->a2dp_bit_pool >= 45) + wifi_duration_adjust = -15; + } else { + wifi_duration_adjust = 0; - if (pCoexSta->nA2DPBitPool >= 35) - nWiFiDurationAdjust = -10; - else if (pCoexSta->nA2DPBitPool >= 45) - nWiFiDurationAdjust = -15; + if (coex_sta->a2dp_bit_pool >= 35) + wifi_duration_adjust = -10; + else if (coex_sta->a2dp_bit_pool >= 45) + wifi_duration_adjust = -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, no dynamic slot - } - else - { - psTdmaByte0Val = 0x51; //null-pkt - psTdmaByte3Val = 0x10; //tx-pause at BT-slot - psTdmaByte4Val = 0x50; // 0x778 = d/1 toggle, dynamic slot + if ((type == 1) || (type == 2) || (type == 9) || (type == 11) || + (type == 101) + || (type == 102) || (type == 109) || (type == 101)) { + if (!coex_sta->force_lps_on) { /* Native power save TDMA, only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30 */ + ps_tdma_byte0_val = 0x61; /* no null-pkt */ + ps_tdma_byte3_val = 0x11; /* no tx-pause at BT-slot */ + ps_tdma_byte4_val = + 0x10; /* 0x778 = d/1 toggle, no dynamic slot */ + } else { + ps_tdma_byte0_val = 0x51; /* null-pkt */ + ps_tdma_byte3_val = 0x10; /* tx-pause at BT-slot */ + ps_tdma_byte4_val = + 0x50; /* 0x778 = d/1 toggle, dynamic slot */ } - } - else if ((type == 3) || (type == 13) || (type == 14) || (type == 103) || (type == 113) || (type == 114)) - { - 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) && (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) - { - default: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val); - break; - case 1: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 2: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 3: - 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, psTdmaByte0Val, 0x15, 0x3, psTdmaByte3Val, 0x11); - break; - case 6: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x20, 0x3, psTdmaByte3Val, 0x11); - break; - case 7: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0); - break; - case 8: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); - break; - case 9: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 10: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40); - break; - case 11: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val); - break; - case 12: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50); - break; - case 13: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 14: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 15: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0); - break; - case 16: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0); - break; - case 18: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0); - break; - case 20: - 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, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x10); - break; - case 23: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18); - break; - case 24: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18); - break; - case 25: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - break; - case 26: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18); - break; - case 27: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98); - break; - case 28: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0); - break; - case 29: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10); - break; - case 30: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10); - break; - case 31: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58); - break; - case 32: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, psTdmaByte4Val); - break; - case 33: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, 0x10); - break; - case 34: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10); - break; - case 35: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10); - break; - case 36: - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 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 */ - 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 - { - - // disable PS tdma - switch(type) - { - case 8: //PTA Control - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0); - break; - case 0: - default: //Software control, Antenna at BT side - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); - break; - case 1: // 2-Ant, 0x778=3, antenna control by antenna diversity - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0); - break; + } else if ((type == 3) || (type == 13) || (type == 14) || + (type == 103) || (type == 113) || (type == 114)) { + ps_tdma_byte0_val = 0x51; /* null-pkt */ + ps_tdma_byte3_val = 0x10; /* tx-pause at BT-slot */ + ps_tdma_byte4_val = + 0x10; /* 0x778 = d/1 toggle, no dynamic slot */ #if 0 - case 9: //Software control, Antenna at WiFi side - halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); - //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_NORMAL); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE); - break; + if (!wifi_busy) + ps_tdma_byte4_val = ps_tdma_byte4_val | + 0x1; /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */ #endif + } else { /* native power save case */ + ps_tdma_byte0_val = 0x61; /* no null-pkt */ + ps_tdma_byte3_val = 0x11; /* no tx-pause at BT-slot */ + ps_tdma_byte4_val = + 0x11; /* 0x778 = d/1 toggle, no dynamic slot */ + /* psTdmaByte4Va is not defne for 0x778 = d/1, 1/1 case */ + } + + /* if (bt_link_info->slave_role == true) */ + if ((bt_link_info->slave_role == true) && (bt_link_info->a2dp_exist)) + ps_tdma_byte4_val = ps_tdma_byte4_val | + 0x1; /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */ + + if (type > 100) { + ps_tdma_byte0_val = ps_tdma_byte0_val | + 0x82; /* set antenna control by SW */ + ps_tdma_byte3_val = ps_tdma_byte3_val | + 0x60; /* set antenna no toggle, control by antenna diversity */ + } + + + if (turn_on) { + switch (type) { + default: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51, + 0x1a, 0x1a, 0x0, ps_tdma_byte4_val); + break; + case 1: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x3a + + wifi_duration_adjust, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 2: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x2d + + wifi_duration_adjust, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 3: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x30, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 4: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x93, + 0x15, 0x3, 0x14, 0x0); + break; + case 5: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x1f, 0x3, + ps_tdma_byte3_val, 0x11); + break; + case 6: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x20, 0x3, + ps_tdma_byte3_val, 0x11); + break; + case 7: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x13, + 0xc, 0x5, 0x0, 0x0); + break; + case 8: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x93, + 0x25, 0x3, 0x10, 0x0); + break; + case 9: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x3, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 10: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x13, + 0xa, 0xa, 0x0, 0x40); + break; + case 11: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 12: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51, + 0x0a, 0x0a, 0x0, 0x50); + break; + case 13: + if (coex_sta->scan_ap_num <= 3) + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x40, 0x3, + ps_tdma_byte3_val, + ps_tdma_byte4_val); + else + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x3, + ps_tdma_byte3_val, + ps_tdma_byte4_val); + break; + case 14: + if (coex_sta->scan_ap_num <= 3) + halbtc8723b1ant_set_fw_pstdma(btcoexist, + 0x51, 0x30, 0x3, 0x10, 0x50); + else + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x3, + ps_tdma_byte3_val, + ps_tdma_byte4_val); + break; + case 15: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x13, + 0xa, 0x3, 0x8, 0x0); + break; + case 16: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x93, + 0x15, 0x3, 0x10, 0x0); + break; + case 18: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x93, + 0x25, 0x3, 0x10, 0x0); + break; + case 20: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x3f, 0x03, + ps_tdma_byte3_val, 0x10); + break; + case 21: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x61, + 0x25, 0x03, 0x11, 0x11); + break; + case 22: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x25, 0x03, + ps_tdma_byte3_val, 0x10); + break; + case 23: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3, + 0x25, 0x3, 0x31, 0x18); + break; + case 24: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3, + 0x15, 0x3, 0x31, 0x18); + break; + case 25: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3, + 0xa, 0x3, 0x31, 0x18); + break; + case 26: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3, + 0xa, 0x3, 0x31, 0x18); + break; + case 27: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3, + 0x25, 0x3, 0x31, 0x98); + break; + case 28: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x69, + 0x25, 0x3, 0x31, 0x0); + break; + case 29: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xab, + 0x1a, 0x1a, 0x1, 0x10); + break; + case 30: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51, + 0x30, 0x3, 0x10, 0x10); + break; + case 31: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xd3, + 0x1a, 0x1a, 0, 0x58); + break; + case 32: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x35, 0x3, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 33: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x35, 0x3, + ps_tdma_byte3_val, 0x10); + break; + case 34: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x53, + 0x1a, 0x1a, 0x0, 0x10); + break; + case 35: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x63, + 0x1a, 0x1a, 0x0, 0x10); + break; + case 36: + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xd3, + 0x12, 0x3, 0x14, 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 */ + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x23, + 0x18, 0x00, 0x10, 0x24); + break; + + /* for 1-Ant translate to 2-Ant */ + case 101: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x3a + + wifi_duration_adjust, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 102: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x2d + + wifi_duration_adjust, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 103: + /* halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51, 0x1d, 0x1d, 0x0, ps_tdma_byte4_val); */ + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x3a, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 105: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x15, 0x3, + ps_tdma_byte3_val, 0x11); + break; + case 106: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x20, 0x3, + ps_tdma_byte3_val, 0x11); + break; + case 109: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x3, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 111: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 113: + /* halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51, 0x12, 0x12, 0x0, ps_tdma_byte4_val); */ + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x3, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 114: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x21, 0x3, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 120: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x3f, 0x03, + ps_tdma_byte3_val, 0x10); + break; + case 122: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x25, 0x03, + ps_tdma_byte3_val, 0x10); + break; + case 132: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x25, 0x03, + ps_tdma_byte3_val, ps_tdma_byte4_val); + break; + case 133: + halbtc8723b1ant_set_fw_pstdma(btcoexist, + ps_tdma_byte0_val, 0x25, 0x03, + ps_tdma_byte3_val, 0x11); + break; + + } + } else { + + /* disable PS tdma */ + switch (type) { + case 8: /* PTA Control */ + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x8, + 0x0, 0x0, 0x0, 0x0); + break; + case 0: + default: /* Software control, Antenna at BT side */ + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x0, + 0x0, 0x0, 0x0, 0x0); + break; + case 1: /* 2-Ant, 0x778=3, antenna control by antenna diversity */ + halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x0, + 0x0, 0x0, 0x48, 0x0); + break; } } - rssiAdjustVal =0; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal); + rssi_adjust_val = 0; + btcoexist->btc_set(btcoexist, + BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssi_adjust_val); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + btcoexist->btc_read_4byte(btcoexist, 0x948), + btcoexist->btc_read_1byte(btcoexist, 0x765), + btcoexist->btc_read_1byte(btcoexist, 0x67)); + BTC_TRACE(trace_buf); - 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; + /* update pre state */ + coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on; + coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma; } -BOOLEAN -halbtc8723b1ant_IsCommonAction( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_tdma_duration_adjust_for_acl(IN struct btc_coexist + *btcoexist, IN u8 wifi_status) { - BOOLEAN bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE; + static s32 up, dn, m, n, wait_count; + s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */ + u8 retry_count = 0, bt_info_ext; + boolean wifi_busy = false; - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); - - if(!bWifiConnected && - BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n")); - - //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); - - bCommon = TRUE; - } - else if(bWifiConnected && - (BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT non connected-idle!!\n")); - - //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); - - bCommon = TRUE; - } - else if(!bWifiConnected && - (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n")); - - //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); - - bCommon = TRUE; - } - else if(bWifiConnected && - (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi connected + BT connected-idle!!\n")); - - //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); - - bCommon = TRUE; - } - else if(!bWifiConnected && - (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n")); - - //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); - - bCommon = TRUE; - } + if (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifi_status) + wifi_busy = 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; - } - - return bCommon; -} + wifi_busy = false; - -VOID -halbtc8723b1ant_TdmaDurationAdjustForAcl( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte wifiStatus - ) -{ - 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; - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], TdmaDurationAdjustForAcl()\n")); - - if(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifiStatus) - bWifiBusy = TRUE; - else - bWifiBusy = FALSE; - - if( (BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) || - (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) || - (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) ) - { - if( pCoexDm->curPsTdma != 1 && - pCoexDm->curPsTdma != 2 && - pCoexDm->curPsTdma != 3 && - pCoexDm->curPsTdma != 9 ) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; + if ((BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == + wifi_status) || + (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifi_status) || + (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIFIC_PKT == + wifi_status)) { + if (coex_dm->cur_ps_tdma != 1 && + coex_dm->cur_ps_tdma != 2 && + coex_dm->cur_ps_tdma != 3 && + coex_dm->cur_ps_tdma != 9) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 9); + coex_dm->ps_tdma_du_adj_type = 9; up = 0; dn = 0; m = 1; - n= 3; + n = 3; result = 0; - WaitCount = 0; - } + wait_count = 0; + } return; } - if(!pCoexDm->bAutoTdmaAdjust) - { - pCoexDm->bAutoTdmaAdjust = TRUE; - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n")); + if (!coex_dm->auto_tdma_adjust) { + coex_dm->auto_tdma_adjust = true; - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - //============ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2); + coex_dm->ps_tdma_du_adj_type = 2; + /* ============ */ up = 0; dn = 0; m = 1; - n= 3; + n = 3; result = 0; - WaitCount = 0; - } - else - { - //accquire the BT TRx retry count from BT_Info byte2 - retryCount = pCoexSta->btRetryCnt; - btInfoExt = pCoexSta->btInfoExt; + wait_count = 0; + } else { + /* accquire the BT TRx retry count from BT_Info byte2 */ + retry_count = coex_sta->bt_retry_cnt; + bt_info_ext = coex_sta->bt_info_ext; + + if ((coex_sta->low_priority_tx) > 1050 || + (coex_sta->low_priority_rx) > 1250) + retry_count++; - if ( (pCoexSta->lowPriorityTx) > 1050 || (pCoexSta->lowPriorityRx) > 1250 ) - retryCount++; - result = 0; - WaitCount++; - - if(retryCount == 0) // no retry in the last 2-second duration - { + wait_count++; + + if (retry_count == + 0) { /* no retry in the last 2-second duration */ up++; dn--; if (dn <= 0) - dn = 0; + dn = 0; - if(up >= n) // if ³sÄò n ­Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration - { - WaitCount = 0; + if (up >= n) { /* if retry count during continuous n*2 seconds is 0, enlarge WiFi duration */ + wait_count = 0; n = 3; up = 0; dn = 0; - result = 1; - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], Increase wifi duration!!\n")); + result = 1; } - } - else if (retryCount <= 3) // <=3 retry in the last 2-second duration - { - up--; + } else if (retry_count <= + 3) { /* <=3 retry in the last 2-second duration */ + up--; dn++; if (up <= 0) up = 0; - if (dn == 2) // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration - { - if (WaitCount <= 2) - m++; // Á×§K¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^ + if (dn == 2) { /* if continuous 2 retry count(every 2 seconds) >0 and < 3, reduce WiFi duration */ + if (wait_count <= 2) + m++; /* to avoid loop between the two levels */ else m = 1; - if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration. + if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */ m = 20; - n = 3*m; + 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")); + wait_count = 0; + result = -1; } - } - else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration - { - if (WaitCount == 1) - m++; // Á×§K¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^ + } else { /* retry count > 3, once retry count > 3, to reduce WiFi duration */ + if (wait_count == 1) + m++; /* to avoid loop between the two levels */ else m = 1; - if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration. + if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */ m = 20; - n = 3*m; + n = 3 * m; up = 0; dn = 0; - WaitCount = 0; + wait_count = 0; result = -1; - 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)) && - ((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) ) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; + if (result == -1) { + /* if( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(bt_info_ext)) && + ((coex_dm->cur_ps_tdma == 1) ||(coex_dm->cur_ps_tdma == 2)) ) + { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9); + coex_dm->ps_tdma_du_adj_type = 9; + } + else */ if (coex_dm->cur_ps_tdma == 1) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = 2; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 9); + coex_dm->ps_tdma_du_adj_type = 9; + } else if (coex_dm->cur_ps_tdma == 9) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 11); + coex_dm->ps_tdma_du_adj_type = 11; } - else */ if(pCoexDm->curPsTdma == 1) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; + } else if (result == 1) { + /* if( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(bt_info_ext)) && + ((coex_dm->cur_ps_tdma == 1) ||(coex_dm->cur_ps_tdma == 2)) ) + { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9); + coex_dm->ps_tdma_du_adj_type = 9; + } + else */ if (coex_dm->cur_ps_tdma == 11) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 9); + coex_dm->ps_tdma_du_adj_type = 9; + } else if (coex_dm->cur_ps_tdma == 9) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 2); + coex_dm->ps_tdma_du_adj_type = 2; + } else if (coex_dm->cur_ps_tdma == 2) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, + true, 1); + coex_dm->ps_tdma_du_adj_type = 1; } - else if(pCoexDm->curPsTdma == 2) + } else { /* no change */ + /* Bryant Modify + if(wifi_busy != pre_wifi_busy) { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(pCoexDm->curPsTdma == 9) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11); - pCoexDm->psTdmaDuAdjType = 11; - } - } - else if(result == 1) - { -/* 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) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9); - pCoexDm->psTdmaDuAdjType = 9; - } - else if(pCoexDm->curPsTdma == 9) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2); - pCoexDm->psTdmaDuAdjType = 2; - } - else if(pCoexDm->curPsTdma == 2) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1); - pCoexDm->psTdmaDuAdjType = 1; - } - } - else //no change - { - /* Bryant Modify - if(bWifiBusy != bPreWifiBusy) //if busy / idle change - { - bPreWifiBusy = bWifiBusy; - halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, pCoexDm->curPsTdma); + pre_wifi_busy = wifi_busy; + halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, true, coex_dm->cur_ps_tdma); } */ - - RT_TRACE(COMP_COEX, DBG_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n", - pCoexDm->curPsTdma)); + } - if( pCoexDm->curPsTdma != 1 && - pCoexDm->curPsTdma != 2 && - pCoexDm->curPsTdma != 9 && - pCoexDm->curPsTdma != 11 ) - { - // recover to previous adjust type - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType); + if (coex_dm->cur_ps_tdma != 1 && + coex_dm->cur_ps_tdma != 2 && + coex_dm->cur_ps_tdma != 9 && + coex_dm->cur_ps_tdma != 11) { + /* recover to previous adjust type */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + coex_dm->ps_tdma_du_adj_type); } } } -VOID -halbtc8723b1ant_PsTdmaCheckForPowerSaveState( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bNewPsState - ) +void halbtc8723b1ant_ps_tdma_check_for_power_save_state( + IN struct btc_coexist *btcoexist, IN boolean new_ps_state) { - u1Byte lpsMode=0x0; + u8 lps_mode = 0x0; - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode); - - if(lpsMode) // already under LPS state - { - if(bNewPsState) - { - // keep state under LPS, do nothing. + btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode); + + if (lps_mode) { /* already under LPS state */ + if (new_ps_state) { + /* keep state under LPS, do nothing. */ + } else { + /* will leave LPS state, turn off psTdma first */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 8); } + } else { /* NO PS state */ + if (new_ps_state) { + /* will enter LPS state, turn off psTdma first */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 8); + } else { + /* keep state under NO PS state, do nothing. */ + } + } +} + +void halbtc8723b1ant_power_save_state(IN struct btc_coexist *btcoexist, + IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val) +{ + boolean low_pwr_disable = false; + + switch (ps_type) { + case BTC_PS_WIFI_NATIVE: + /* recover to original 32k low power setting */ + low_pwr_disable = false; + btcoexist->btc_set(btcoexist, + BTC_SET_ACT_DISABLE_LOW_POWER, + &low_pwr_disable); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, + NULL); + coex_sta->force_lps_on = false; + break; + case BTC_PS_LPS_ON: + halbtc8723b1ant_ps_tdma_check_for_power_save_state( + btcoexist, true); + halbtc8723b1ant_lps_rpwm(btcoexist, NORMAL_EXEC, + lps_val, rpwm_val); + /* when coex force to enter LPS, do not enter 32k low power. */ + low_pwr_disable = true; + btcoexist->btc_set(btcoexist, + BTC_SET_ACT_DISABLE_LOW_POWER, + &low_pwr_disable); + /* power save must executed before psTdma. */ + btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, + NULL); + coex_sta->force_lps_on = true; + break; + case BTC_PS_LPS_OFF: + halbtc8723b1ant_ps_tdma_check_for_power_save_state( + btcoexist, false); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, + NULL); + coex_sta->force_lps_on = false; + break; + default: + break; + } +} + +void halbtc8723b1ant_action_wifi_only(IN struct btc_coexist *btcoexist) +{ + halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); + halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, + false, false); +} + +void halbtc8723b1ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist) +{ + static u32 bt_disable_cnt = 0; + boolean bt_active = true, bt_disabled = false; + + /* This function check if bt is disabled */ + + if (coex_sta->high_priority_tx == 0 && + coex_sta->high_priority_rx == 0 && + coex_sta->low_priority_tx == 0 && + coex_sta->low_priority_rx == 0) + bt_active = false; + if (coex_sta->high_priority_tx == 0xffff && + coex_sta->high_priority_rx == 0xffff && + coex_sta->low_priority_tx == 0xffff && + coex_sta->low_priority_rx == 0xffff) + bt_active = false; + if (bt_active) { + bt_disable_cnt = 0; + bt_disabled = false; + } else { + bt_disable_cnt++; + if (bt_disable_cnt >= 2) + bt_disabled = true; + } + if (coex_sta->bt_disabled != bt_disabled) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is from %s to %s!!\n", + (coex_sta->bt_disabled ? "disabled" : "enabled"), + (bt_disabled ? "disabled" : "enabled")); + BTC_TRACE(trace_buf); + + coex_sta->bt_disabled = bt_disabled; + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, + &bt_disabled); + if (bt_disabled) { + halbtc8723b1ant_action_wifi_only(btcoexist); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, + NULL); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, + NULL); + } + } +} + +/* ********************************************* + * + * Non-Software Coex Mechanism start + * + * ********************************************* */ +void halbtc8723b1ant_action_bt_whck_test(IN struct btc_coexist *btcoexist) +{ + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, + false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); +} + +void halbtc8723b1ant_action_wifi_multi_port(IN struct btc_coexist *btcoexist) +{ + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, + false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); +} + +void halbtc8723b1ant_action_hs(IN struct btc_coexist *btcoexist) +{ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); +} + +void halbtc8723b1ant_action_bt_inquiry(IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, ap_enable = false, wifi_busy = false, + bt_busy = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, + &ap_enable); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy); + + if (coex_sta->bt_abnormal_scan) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 33); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7); + } else if ((!wifi_connected) && (!coex_sta->wifi_is_high_pri_task)) { + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } else if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) || + (bt_link_info->a2dp_exist)) { + /* SCO/HID/A2DP busy */ + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + + if (coex_sta->c2h_bt_remote_name_req) + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 33); else - { - // will leave LPS state, turn off psTdma first - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - } - } - else // NO PS state - { - if(bNewPsState) - { - // will enter LPS state, turn off psTdma first - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - } + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else if ((bt_link_info->pan_exist) || (wifi_busy)) { + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + + if (coex_sta->c2h_bt_remote_name_req) + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 33); else - { - // keep state under NO PS state, do nothing. - } + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else { + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); + + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7); + } } -VOID -halbtc8723b1ant_PowerSaveState( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte psType, - IN u1Byte lpsVal, - IN u1Byte rpwmVal - ) +void halbtc8723b1ant_action_bt_sco_hid_only_busy(IN struct btc_coexist + *btcoexist, IN u8 wifi_status) { - 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: - halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE); - halbtc8723b1ant_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: - halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE); - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL); - pCoexSta->bForceLpsOn = FALSE; - break; - default: - break; + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + + /* tdma and coex table */ + + if (bt_link_info->sco_exist) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5); + } else { /* HID */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5); } } -VOID -halbtc8723b1ant_ActionWifiOnly( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(IN struct btc_coexist + *btcoexist, IN u8 wifi_status) { - halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); - halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE); -} + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; -VOID -halbtc8723b1ant_MonitorBtEnableDisable( - IN PBTC_COEXIST pBtCoexist - ) -{ - static BOOLEAN bPreBtDisabled=FALSE; - static u4Byte btDisableCnt=0; - BOOLEAN bBtActive=TRUE, bBtDisabled=FALSE; - - // This function check if bt is disabled - - if( pCoexSta->highPriorityTx == 0 && - pCoexSta->highPriorityRx == 0 && - pCoexSta->lowPriorityTx == 0 && - pCoexSta->lowPriorityRx == 0) - { - bBtActive = FALSE; - } - if( pCoexSta->highPriorityTx == 0xffff && - pCoexSta->highPriorityRx == 0xffff && - pCoexSta->lowPriorityTx == 0xffff && - pCoexSta->lowPriorityRx == 0xffff) - { - bBtActive = FALSE; - } - if(bBtActive) - { - btDisableCnt = 0; - bBtDisabled = FALSE; - } + if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips)) + bt_link_info->slave_role = true; else - { - btDisableCnt++; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], bt all counters=0, %d times!!\n", btDisableCnt)); - if(btDisableCnt >= 2) - { - bBtDisabled = TRUE; - } - } - if(bPreBtDisabled != bBtDisabled) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], BT is from %s to %s!!\n", (bPreBtDisabled ? "disabled":"enabled"), - (bBtDisabled ? "disabled":"enabled"))); + bt_link_info->slave_role = false; - bPreBtDisabled = bBtDisabled; - 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); - } - } -} - -//============================================= -// -// Software Coex Mechanism start -// -//============================================= - -// SCO only or SCO+PAN(HS) - -/* -VOID -halbtc8723b1ant_ActionSco( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE); -} - - -VOID -halbtc8723b1ant_ActionHid( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE); -} - -//A2DP only / PAN(EDR) only/ A2DP+PAN(HS) -VOID -halbtc8723b1ant_ActionA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); -} - -VOID -halbtc8723b1ant_ActionA2dpPanHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); -} - -VOID -halbtc8723b1ant_ActionPanEdr( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); -} - -//PAN(HS) only -VOID -halbtc8723b1ant_ActionPanHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); -} - -//PAN(EDR)+A2DP -VOID -halbtc8723b1ant_ActionPanEdrA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); -} - -VOID -halbtc8723b1ant_ActionPanEdrHid( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE); -} - -// HID+A2DP+PAN(EDR) -VOID -halbtc8723b1ant_ActionHidA2dpPanEdr( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE); -} - -VOID -halbtc8723b1ant_ActionHidA2dp( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE); -} - -*/ - -//============================================= -// -// Non-Software Coex Mechanism start -// -//============================================= -VOID -halbtc8723b1ant_ActionBtWhckTest( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); -} - -VOID -halbtc8723b1ant_ActionWifiMultiPort( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); -} - -VOID -halbtc8723b1ant_ActionHs( - IN PBTC_COEXIST pBtCoexist - ) -{ - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); -} - -VOID -halbtc8723b1ant_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) ) - { - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - } - else if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) ) - { - // 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); - } - else if ( (pBtLinkInfo->bPanExist) || (bWifiBusy) ) - { - 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); - } - else - { - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); - - } -} - -VOID -halbtc8723b1ant_ActionBtScoHidOnlyBusy( - IN PBTC_COEXIST pBtCoexist, - 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 - - if(pBtLinkInfo->bScoExist) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); - } - else //HID - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); - } -} - -VOID -halbtc8723b1ant_ActionWifiConnectedBtAclBusy( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte wifiStatus - ) -{ - u1Byte btRssiState; - - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - btRssiState = halbtc8723b1ant_BtRssiState(2, 28, 0); - - if ( (pCoexSta->lowPriorityRx >= 950) && (!pCoexSta->bUnderIps) ) - { - pBtLinkInfo->bSlaveRole = TRUE; - } - else - { - pBtLinkInfo->bSlaveRole = FALSE; - } - - if(pBtLinkInfo->bHidOnly) //HID - { - halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus); - pCoexDm->bAutoTdmaAdjust = FALSE; + if (bt_link_info->hid_only) { /* HID */ + halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist, + wifi_status); + coex_dm->auto_tdma_adjust = false; return; - } - else if(pBtLinkInfo->bA2dpOnly) //A2DP - { - if(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; + } else if (bt_link_info->a2dp_only) { /* A2DP */ + if (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifi_status) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; + } else { + halbtc8723b1ant_tdma_duration_adjust_for_acl(btcoexist, + wifi_status); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = true; } - else - { - halbtc8723b1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = TRUE; - } - } - else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) || - (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; - } - else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist) //HID+A2DP - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); - pCoexDm->bAutoTdmaAdjust = FALSE; + } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) || + (bt_link_info->hid_exist && bt_link_info->a2dp_exist && + bt_link_info->pan_exist)) { /* A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; + } else if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { /* HID+A2DP */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14); + coex_dm->auto_tdma_adjust = false; - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3); - } - else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; - } - else - { - //BT no-profile busy (0x9) - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 33); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - pCoexDm->bAutoTdmaAdjust = FALSE; - } -} - -VOID -halbtc8723b1ant_ActionWifiNotConnected( - IN PBTC_COEXIST pBtCoexist - ) -{ - // power save state - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // tdma and coex table - halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); -} - -VOID -halbtc8723b1ant_ActionWifiNotConnectedScan( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - - // tdma and coex table - if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) - { - if (pBtLinkInfo->bA2dpExist) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - } - else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { - halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, - BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN); - } - else - { - //Bryant Add - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else if ((bt_link_info->pan_only) || (bt_link_info->hid_exist && + bt_link_info->pan_exist)) { /* PAN(OPP,FTP), HID+PAN(OPP,FTP) */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; + } else { + /* BT no-profile busy (0x9) */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + coex_dm->auto_tdma_adjust = false; } } -VOID -halbtc8723b1ant_ActionWifiNotConnectedAssoAuth( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_action_wifi_not_connected(IN struct btc_coexist *btcoexist) { - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + /* power save state */ + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); - // tdma and coex table - if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) ) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4); - } - else if (pBtLinkInfo->bPanExist) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4); - } - else - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2); - } + /* tdma and coex table */ + halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, + false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); } -VOID -halbtc8723b1ant_ActionWifiConnectedScan( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_action_wifi_not_connected_scan(IN struct btc_coexist + *btcoexist) { - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; - // tdma and coex table - if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) - { - if (pBtLinkInfo->bA2dpExist) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + /* tdma and coex table */ + if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + if (bt_link_info->a2dp_exist) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else if (bt_link_info->a2dp_exist && + bt_link_info->pan_exist) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 22); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 20); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); } - else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); + } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN); + } else { + /* Bryant Add */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); + } +} + +void halbtc8723b1ant_action_wifi_not_connected_asso_auth( + IN struct btc_coexist *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + /* tdma and coex table */ + if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) || + (bt_link_info->a2dp_exist)) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4); + } else if (bt_link_info->pan_exist) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4); + } else { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2); + } +} + +void halbtc8723b1ant_action_wifi_connected_scan(IN struct btc_coexist + *btcoexist) +{ + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); + + /* tdma and coex table */ + if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + if (bt_link_info->a2dp_exist) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else if (bt_link_info->a2dp_exist && + bt_link_info->pan_exist) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 22); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } else { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 20); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); } - else - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - } - else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { - halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, - BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN); - } - else - { - //Bryant Add - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist, + BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN); + } else { + /* Bryant Add */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); } } -VOID -halbtc8723b1ant_ActionWifiConnectedSpecialPacket( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_action_wifi_connected_specific_packet( + IN struct btc_coexist *btcoexist) { - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BOOLEAN bWifiBusy = FALSE; + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_busy = false; - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); - //no special packet process for both WiFi and BT very busy - if ((bWifiBusy) && ((pBtLinkInfo->bPanExist) || (pCoexSta->nNumOfProfile >= 2))) - return; + /* no specific packet process for both WiFi and BT very busy */ + if ((wifi_busy) && ((bt_link_info->pan_exist) || + (coex_sta->num_of_profile >= 2))) + return; - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, + 0x0); - // tdma and coex table - 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); - } - else if(pBtLinkInfo->bPanExist) - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); - } - else - { - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); + /* tdma and coex table */ + if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5); + } else if (bt_link_info->a2dp_exist) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else if (bt_link_info->pan_exist) { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); + } else { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + NORMAL_EXEC, false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); } } -VOID -halbtc8723b1ant_ActionWifiConnected( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_action_wifi_connected(IN struct btc_coexist *btcoexist) { - BOOLEAN bWifiBusy=FALSE; - BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - BOOLEAN bUnder4way=FALSE, bApEnable=FALSE; - u4Byte wifiBw; + boolean wifi_busy = false; + boolean scan = false, link = false, roam = false; + boolean under_4way = false, ap_enable = false; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect()===>\n")); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CoexForWifiConnect()===>\n"); + BTC_TRACE(trace_buf); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way); - if(bUnder4way) - { - halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n")); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, + &under_4way); + if (under_4way) { + halbtc8723b1ant_action_wifi_connected_specific_packet(btcoexist); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n"); + BTC_TRACE(trace_buf); 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) - { - if(bScan) - halbtc8723b1ant_ActionWifiConnectedScan(pBtCoexist); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); + if (scan || link || roam) { + if (scan) + halbtc8723b1ant_action_wifi_connected_scan(btcoexist); else - halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n")); + halbtc8723b1ant_action_wifi_connected_specific_packet( + btcoexist); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n"); + BTC_TRACE(trace_buf); return; } - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, + &ap_enable); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); - // power save state - if(!bApEnable && BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly) - { - if(pBtCoexist->btLinkInfo.bA2dpOnly) //A2DP - { - if(!bWifiBusy) - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - else //busy - { - if (pCoexSta->nScanAPNum >= BT_8723B_1ANT_WIFI_NOISY_THRESH) //no force LPS, no PS-TDMA, use pure TDMA - { - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); - } + /* power save state */ + if (!ap_enable && + BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status && + !btcoexist->bt_link_info.hid_only) { + if (btcoexist->bt_link_info.a2dp_only) { /* A2DP */ + if (!wifi_busy) + halbtc8723b1ant_power_save_state(btcoexist, + BTC_PS_WIFI_NATIVE, 0x0, 0x0); + else { /* busy */ + if (coex_sta->scan_ap_num >= + BT_8723B_1ANT_WIFI_NOISY_THRESH) /* no force LPS, no PS-TDMA, use pure TDMA */ + halbtc8723b1ant_power_save_state( + btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); else - { - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); - } + halbtc8723b1ant_power_save_state( + btcoexist, BTC_PS_LPS_ON, 0x50, + 0x4); } - } - else if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE)) - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + } else if ((coex_sta->pan_exist == false) && + (coex_sta->a2dp_exist == false) && + (coex_sta->hid_exist == false)) + halbtc8723b1ant_power_save_state(btcoexist, + BTC_PS_WIFI_NATIVE, 0x0, 0x0); else - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); - } - else - halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); + halbtc8723b1ant_power_save_state(btcoexist, + BTC_PS_LPS_ON, 0x50, 0x4); + } else + halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, + 0x0, 0x0); - // tdma and coex table - if(!bWifiBusy) - { - if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) - { - halbtc8723b1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, + /* tdma and coex table */ + if (!wifi_busy) { + if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + halbtc8723b1ant_action_wifi_connected_bt_acl_busy( + btcoexist, BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE); - } - else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { - halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, + } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY == + coex_dm->bt_status) || + (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist, BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE); + } else { + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 8); + halbtc8723b1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_PTA, NORMAL_EXEC, false, false); + /* if ((coex_sta->high_priority_tx) + + (coex_sta->high_priority_rx) <= 60) */ + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 2); + /* else + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 7); */ } - else - { - 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); - else - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); - } - } - else - { - if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) - { - halbtc8723b1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, + } else { + if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) { + halbtc8723b1ant_action_wifi_connected_bt_acl_busy( + btcoexist, BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY); - } - else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) ) - { - halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, + } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY == + coex_dm->bt_status) || + (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == + coex_dm->bt_status)) { + halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist, BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY); - } - else - { - 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); + } else { + /* halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, + 8); + halbtc8723b1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_PTA, NORMAL_EXEC, false, false); + if ((coex_sta->high_priority_tx) + + (coex_sta->high_priority_rx) <= 60) + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 2); else - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 7); */ + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, + 32); + halbtc8723b1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_PTA, NORMAL_EXEC, false, false); + halbtc8723b1ant_coex_table_with_type(btcoexist, + NORMAL_EXEC, 4); + } } } -VOID -halbtc8723b1ant_RunSwCoexistMechanism( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist) { - u1Byte algorithm=0; + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + boolean wifi_connected = false, bt_hs_on = false, wifi_busy = false; + boolean increase_scan_dev_num = false; + boolean bt_ctrl_agg_buf_size = false; + boolean miracast_plus_bt = false; + u8 agg_buf_size = 5; + u32 wifi_link_status = 0; + u32 num_of_wifi_link = 0, wifi_bw; + u8 iot_peer = BTC_IOT_PEER_UNKNOWN; - algorithm = halbtc8723b1ant_ActionAlgorithm(pBtCoexist); - pCoexDm->curAlgorithm = algorithm; - - if(halbtc8723b1ant_IsCommonAction(pBtCoexist)) - { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism()===>\n"); + BTC_TRACE(trace_buf); + if (btcoexist->manual_control) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n"); + BTC_TRACE(trace_buf); + return; } - else - { - switch(pCoexDm->curAlgorithm) - { - case BT_8723B_1ANT_COEX_ALGO_SCO: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = SCO.\n")); - //halbtc8723b1ant_ActionSco(pBtCoexist); - break; - case BT_8723B_1ANT_COEX_ALGO_HID: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID.\n")); - //halbtc8723b1ant_ActionHid(pBtCoexist); - break; - case BT_8723B_1ANT_COEX_ALGO_A2DP: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP.\n")); - //halbtc8723b1ant_ActionA2dp(pBtCoexist); - break; - case BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n")); - //halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist); - break; - case BT_8723B_1ANT_COEX_ALGO_PANEDR: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN(EDR).\n")); - //halbtc8723b1ant_ActionPanEdr(pBtCoexist); - break; - case BT_8723B_1ANT_COEX_ALGO_PANHS: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HS mode.\n")); - //halbtc8723b1ant_ActionPanHs(pBtCoexist); - break; - case BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = PAN+A2DP.\n")); - //halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist); - break; - case BT_8723B_1ANT_COEX_ALGO_PANEDR_HID: - 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: - 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: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = HID+A2DP.\n")); - //halbtc8723b1ant_ActionHidA2dp(pBtCoexist); - break; - default: - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Action algorithm = coexist All Off!!\n")); - //halbtc8723b1ant_CoexAllOff(pBtCoexist); - break; + + if (btcoexist->stop_coex_dm) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n"); + BTC_TRACE(trace_buf); + return; + } + + if (coex_sta->under_ips) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi is under IPS !!!\n"); + BTC_TRACE(trace_buf); + return; + } + + if (coex_sta->bt_whck_test) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], BT is under WHCK TEST!!!\n"); + BTC_TRACE(trace_buf); + halbtc8723b1ant_action_bt_whck_test(btcoexist); + return; + } + + if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) || + (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || + (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) + increase_scan_dev_num = true; + + btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, + &increase_scan_dev_num); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + num_of_wifi_link = wifi_link_status >> 16; + + if ((num_of_wifi_link >= 2) || + (wifi_link_status & WIFI_P2P_GO_CONNECTED)) { + if (bt_link_info->bt_link_exist) { + halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, + 0, 1); + miracast_plus_bt = true; + } else { + halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, + 0, 0); + miracast_plus_bt = false; } - pCoexDm->preAlgorithm = pCoexDm->curAlgorithm; - } -} + btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT, + &miracast_plus_bt); + halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); -VOID -halbtc8723b1ant_RunCoexistMechanism( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE, bWifiBusy = 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; - u1Byte iotPeer=BTC_IOT_PEER_UNKNOWN; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism()===>\n")); - - if(pBtCoexist->bManualControl) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n")); - return; - } - - if(pBtCoexist->bStopCoexDm) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n")); - return; - } - - if(pCoexSta->bUnderIps) - { - 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")); - halbtc8723b1ant_ActionBtWhckTest(pBtCoexist); - return; - } - - if( (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) || - (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) || - (BT_8723B_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_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)) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) ); - - if(pBtLinkInfo->bBtLinkExist) - { - halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); - bMiracastPlusBt = TRUE; - } + if (((bt_link_info->a2dp_exist) || (wifi_busy)) && + (coex_sta->c2h_bt_inquiry_page)) + halbtc8723b1ant_action_bt_inquiry(btcoexist); else - { - halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - bMiracastPlusBt = FALSE; - } - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); + halbtc8723b1ant_action_wifi_multi_port(btcoexist); - if (( (pBtLinkInfo->bA2dpExist) || (bWifiBusy) ) && (pCoexSta->bC2hBtInquiryPage) ) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], BT Is Inquirying \n") ); - halbtc8723b1ant_ActionBtInquiry(pBtCoexist); - } - else - halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist); - return; - } - else - { - bMiracastPlusBt = FALSE; - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt); + } else { + miracast_plus_bt = false; + btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT, + &miracast_plus_bt); } - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); - if ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) ) - { - halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); + if ((bt_link_info->bt_link_exist) && (wifi_connected)) { + halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_IOT_PEER, &iotPeer); + btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer); - if(BTC_IOT_PEER_CISCO != iotPeer) - { - if(pBtLinkInfo->bScoExist)//if (pBtLinkInfo->bBtHiPriLinkExist) - //halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5); - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); + /* if(BTC_IOT_PEER_CISCO != iot_peer) */ + if ((BTC_IOT_PEER_CISCO != iot_peer) && + (BTC_IOT_PEER_BROADCOM != iot_peer)) { + if (bt_link_info->sco_exist) /* if (bt_link_info->bt_hi_pri_link_exist) */ + /* halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, true, false, 0x5); */ + halbtc8723b1ant_limited_rx(btcoexist, + NORMAL_EXEC, false, false, 0x5); else - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); - //halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); - } - else - { - 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); + halbtc8723b1ant_limited_rx(btcoexist, + NORMAL_EXEC, false, false, 0x5); + /* halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, true, 0x8); */ + } else { + if (bt_link_info->sco_exist) + halbtc8723b1ant_limited_rx(btcoexist, + NORMAL_EXEC, true, false, 0x5); + else { + if (BTC_WIFI_BW_HT40 == wifi_bw) + halbtc8723b1ant_limited_rx(btcoexist, + NORMAL_EXEC, false, true, 0x10); else - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8); + halbtc8723b1ant_limited_rx(btcoexist, + NORMAL_EXEC, false, true, 0x8); } } - halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE); - halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); //just print debug message - } - else - { - halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8723b1ant_sw_mechanism(btcoexist, true); + } else { + halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5); + halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, + 0x5); - halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); - halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message + halbtc8723b1ant_sw_mechanism(btcoexist, false); } - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - if(pCoexSta->bC2hBtInquiryPage) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("############# [BTCoex], BT Is Inquirying \n") ); - halbtc8723b1ant_ActionBtInquiry(pBtCoexist); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8723b1ant_action_bt_inquiry(btcoexist); return; - } - else if(bBtHsOn) - { - halbtc8723b1ant_ActionHs(pBtCoexist); + } else if (bt_hs_on) { + halbtc8723b1ant_action_hs(btcoexist); return; } - - if(!bWifiConnected) - { - BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE; - - 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 (!wifi_connected) { + boolean scan = false, link = false, roam = false; - if(bScan || bLink || bRoam) - { - if (bScan) - halbtc8723b1ant_ActionWifiNotConnectedScan(pBtCoexist); - else - halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); - } - else - halbtc8723b1ant_ActionWifiNotConnected(pBtCoexist); - } - else // wifi LPS/Busy - { - halbtc8723b1ant_ActionWifiConnected(pBtCoexist); - } + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], wifi is non connected-idle !!!\n"); + BTC_TRACE(trace_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); + + if (scan || link || roam) { + if (scan) + halbtc8723b1ant_action_wifi_not_connected_scan( + btcoexist); + else + halbtc8723b1ant_action_wifi_not_connected_asso_auth( + btcoexist); + } else + halbtc8723b1ant_action_wifi_not_connected(btcoexist); + } else /* wifi LPS/Busy */ + halbtc8723b1ant_action_wifi_connected(btcoexist); } -u4Byte -halbtc8723b1ant_PSD_Log2Base( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte val - - ) +void halbtc8723b1ant_init_coex_dm(IN struct btc_coexist *btcoexist) { - u1Byte i,j; - u4Byte tmp, tmp2, val_integerdB=0, tindex, shiftcount=0; - u4Byte result,val_fractiondB=0,Table_fraction[21]= {0,432, 332, 274, 232, 200, - 174, 151,132,115,100,86,74,62,51,42, - 32,23,15,7,0}; + /* force to reset coex mechanism */ + + /* sw all off */ + halbtc8723b1ant_sw_mechanism(btcoexist, false); + + /* halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); */ + /* halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); */ + + coex_sta->pop_event_cnt = 0; +} + +void halbtc8723b1ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean back_up, IN boolean wifi_only) +{ + u32 u32tmp = 0; /* , fw_ver; */ + u8 u8tmpa = 0, u8tmpb = 0; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], 1Ant Init HW Config!!\n"); + BTC_TRACE(trace_buf); + + psd_scan->ant_det_is_ant_det_available = false; + + /* 0xf0[15:12] --> Chip Cut information */ + coex_sta->cut_version = (btcoexist->btc_read_1byte(btcoexist, + 0xf1) & 0xf0) >> 4; + + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8, + 0x1); /* enable TBTT nterrupt */ + + /* 0x790[5:0]=0x5 */ + btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5); + + /* Enable counter statistics */ + /* btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA */ + btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1); + btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1); + + + /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi */ + + halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); + + /* Antenna config */ + if (wifi_only) + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI, + FORCE_EXEC, true, false); + else + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, + FORCE_EXEC, true, false); + + /* PTA parameter */ + halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); + + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948); + u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765); + u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + u32tmp, u8tmpa, u8tmpb); + BTC_TRACE(trace_buf); +} + +void halbtc8723b1ant_mechanism_switch(IN struct btc_coexist *btcoexist, + IN boolean bSwitchTo2Antenna) +{ + + if (bSwitchTo2Antenna) { /* 1-Ant -> 2-Ant */ + /* un-lock TRx Mask setup for 8723b f-cut */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd, 0x80, 0x1); + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf, 0x1, 0x1); + /* WiFi TRx Mask on */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, + 0x0); + + /* BT TRx Mask un-lock 0x2c[0], 0x30[0] = 1 */ + btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x2c, + 0x7c45); + btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x30, + 0x7c45); + + /* BT TRx Mask on */ + btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x3c, 0x1); + + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, + FORCE_EXEC, false, false); + } else { + /* WiFi TRx Mask on */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, + 0x780); + + /* lock TRx Mask setup for 8723b f-cut */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd, 0x80, 0x0); + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf, 0x1, 0x0); + + /* BT TRx Mask on */ + btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x3c, 0x15); + + /* BT TRx Mask ock 0x2c[0], 0x30[0] = 0 */ + btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x2c, + 0x7c44); + btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x30, + 0x7c44); + + + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + FORCE_EXEC, false, false); + } + +} + +u32 halbtc8723b1ant_psd_log2base(IN struct btc_coexist *btcoexist, IN u32 val) +{ + u8 j; + u32 tmp, tmp2, val_integerd_b = 0, tindex, shiftcount = 0; + u32 result, val_fractiond_b = 0, table_fraction[21] = {0, 432, 332, 274, 232, 200, + 174, 151, 132, 115, 100, 86, 74, 62, 51, 42, + 32, 23, 15, 7, 0 + }; if (val == 0) - return 0; + return 0; tmp = val; - while(1) - { + while (1) { if (tmp == 1) - break; - else - { + break; + else { tmp = (tmp >> 1); - shiftcount++; + shiftcount++; } } - - val_integerdB = shiftcount+1; - tmp2=1; - for (j=1; j<= val_integerdB;j++) - tmp2 = tmp2*2; - - tmp = (val*100) /tmp2; - tindex = tmp/5; + val_integerd_b = shiftcount + 1; + + tmp2 = 1; + for (j = 1; j <= val_integerd_b; j++) + tmp2 = tmp2 * 2; + + tmp = (val * 100) / tmp2; + tindex = tmp / 5; if (tindex > 20) - tindex = 20; + tindex = 20; - val_fractiondB = Table_fraction[tindex]; + val_fractiond_b = table_fraction[tindex]; - result = val_integerdB*100 - val_fractiondB; + result = val_integerd_b * 100 - val_fractiond_b; - return (result); + return result; } -VOID -halbtc8723b1ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_psd_show_antenna_detect_result(IN struct btc_coexist + *btcoexist) { - // force to reset coex mechanism - - // sw all off - halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE); + u8 *cli_buf = btcoexist->cli_buf; + struct btc_board_info *board_info = &btcoexist->board_info; - //halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - //halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n============[Antenna Detection info] ============\n"); + CL_PRINTF(cli_buf); - pCoexSta->popEventCnt = 0; -} - -VOID -halbtc8723b1ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bBackUp, - IN BOOLEAN bWifiOnly - ) -{ - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - u4Byte u4Tmp=0;//, fwVer; - u2Byte u2Tmp=0; - u1Byte u1Tmp=0, u1Tmpa=0, u1Tmpb=0; - u1Byte H2C_Parameter[2] ={0}; - - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], 1Ant Init HW Config!!\n")); - - pPsdScan->nAntDet_IsAntDetAvailable = FALSE; - - //0xf0[15:12] --> Chip Cut information - pCoexSta->nCutVersion = (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xf1) & 0xf0) >> 4; - -#if 0//move to BTC_MEDIA_CONNECT - if(bBackUp) - { - pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430); - pCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434); - pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a); - pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456); - } -#endif - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x550, 0x8, 0x1); //enable TBTT nterrupt - - // 0x790[5:0]=0x5 - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, 0x5); - - // Enable counter statistics - //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA - pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1); - pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1); - - - //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi - - halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); - - //Antenna config - if(bWifiOnly) - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FORCE_EXEC, TRUE, FALSE); + if (psd_scan->ant_det_result == 1) + CL_SPRINTF(cli_buf, 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 (psd_scan->ant_det_result == 2) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (%d~%d)", + "Ant Det Result", "2-Antenna (Good-Isolation)", + BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION + + psd_scan->ant_det_thres_offset, + BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION); else - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, TRUE, FALSE); + CL_SPRINTF(cli_buf, 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 + + psd_scan->ant_det_thres_offset); -#if 0 - if(bWifiOnly) - { - halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_INIT); - halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s ", + "Antenna Detection Finish", + (board_info->btdm_ant_det_finish + ? "Yes" : "No")); + CL_PRINTF(cli_buf); + + switch (psd_scan->ant_det_result) { + case 0: + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(BT is not available)"); + break; + case 1: /* 2-Ant bad-isolation */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(BT is available)"); + break; + case 2: /* 2-Ant good-isolation */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(BT is available)"); + break; + case 3: /* 1-Ant */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(BT is available)"); + break; + case 4: + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(Uncertainty result)"); + break; + case 5: + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "(Pre-Scan fai)"); + break; + case 6: + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(WiFi is Scanning)"); + break; + case 7: + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(BT is not idle)"); + break; + case 8: + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(Abort by WiFi Scanning)"); + break; + case 9: + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(Antenna Init is not ready)"); + break; + case 10: + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(BT is Inquiry or page)"); + break; + case 11: + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "(BT is Disabled)"); + break; } - else - halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_INIT); -#endif - - - - // PTA parameter - halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0); - - 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)); -} - - - - - -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_PRINTF(cli_buf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Ant Detect Total Count",pPsdScan->bAntDet_TryCount); - CL_PRINTF(cliBuf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", + "Ant Detect Total Count", psd_scan->ant_det_try_count); + CL_PRINTF(cli_buf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Ant Detect Fail Count",pPsdScan->bAntDet_FailCount); - CL_PRINTF(cliBuf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", + "Ant Detect Fail Count", psd_scan->ant_det_fail_count); + CL_PRINTF(cli_buf); - 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) + if ((!board_info->btdm_ant_det_finish) && + (psd_scan->ant_det_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(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Response", + (psd_scan->ant_det_result ? "ok" : "fail")); + CL_PRINTF(cli_buf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s MHz", "PSD Scan Peak Freq", pPsdScan->nAntDet_PeakFreq); - CL_PRINTF(cliBuf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ms", "BT Tx Time", + psd_scan->ant_det_bt_tx_time); + CL_PRINTF(cli_buf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "TFBGA Package", - (pBoardInfo->bTfbgaPackage)? "Yes":"No"); - CL_PRINTF(cliBuf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "BT Tx Ch", + psd_scan->ant_det_bt_le_channel); + CL_PRINTF(cli_buf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "PSD Threshold Offset", pPsdScan->nAntDet_ThresOffset); - CL_PRINTF(cliBuf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", + "WiFi PSD Cent-Ch/Offset/Span", + psd_scan->real_cent_freq, psd_scan->real_offset, + psd_scan->real_span); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d dB", + "PSD Pre-Scan Peak Value", + psd_scan->ant_det_pre_psdscan_peak_val / 100); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (<= %d)", + "PSD Pre-Scan result", + (psd_scan->ant_det_result != 5 ? "ok" : "fail"), + BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND + + psd_scan->ant_det_thres_offset); + CL_PRINTF(cli_buf); + + if (psd_scan->ant_det_result == 5) + return; + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s dB", + "PSD Scan Peak Value", psd_scan->ant_det_peak_val); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s MHz", + "PSD Scan Peak Freq", psd_scan->ant_det_peak_freq); + CL_PRINTF(cli_buf); + + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "TFBGA Package", + (board_info->tfbga_package) ? "Yes" : "No"); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", + "PSD Threshold Offset", psd_scan->ant_det_thres_offset); + CL_PRINTF(cli_buf); } -VOID -halbtc8723b1ant_PSD_ShowData( - IN PBTC_COEXIST pBtCoexist - ) +void halbtc8723b1ant_psd_showdata(IN struct btc_coexist *btcoexist) { - pu1Byte cliBuf=pBtCoexist->cliBuf; - u4Byte nDeltaFreqPerPoint; - u4Byte freq,freq1,freq2,n=0,i=0, j=0, m=0, PsdRep1, PsdRep2; + u8 *cli_buf = btcoexist->cli_buf; + u32 delta_freq_per_point; + u32 freq, freq1, freq2, n = 0, i = 0, j = 0, m = 0, psd_rep1, psd_rep2; - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n\n============[PSD info] (%d)============\n", - pPsdScan->nPSDGenCount); - CL_PRINTF(cliBuf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n\n============[PSD info] (%d)============\n", + psd_scan->psd_gen_count); + CL_PRINTF(cli_buf); - if (pPsdScan->nPSDGenCount == 0) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n No Data !!\n"); - CL_PRINTF(cliBuf); + if (psd_scan->psd_gen_count == 0) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n No data !!\n"); + CL_PRINTF(cli_buf); return; } - if (pPsdScan->nPSDPoint == 0) - nDeltaFreqPerPoint = 0; - else - nDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint; - - //if (pPsdScan->bIsPSDShowMaxOnly) - if (0) - { - 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) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq = %d.0%d MHz", - freq1, freq2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq = %d.%d MHz", - freq1, freq2); - - if (PsdRep2 < 10) - 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)\n", - PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue); - - CL_PRINTF(cliBuf); - } + if (psd_scan->psd_point == 0) + delta_freq_per_point = 0; else - { - m = pPsdScan->nPSDStartPoint; - n = pPsdScan->nPSDStartPoint; + delta_freq_per_point = psd_scan->psd_band_width / + psd_scan->psd_point; + + /* if (psd_scan->is_psd_show_max_only) */ + if (0) { + psd_rep1 = psd_scan->psd_max_value / 100; + psd_rep2 = psd_scan->psd_max_value - psd_rep1 * 100; + + freq = ((psd_scan->real_cent_freq - 20) * 1000000 + + psd_scan->psd_max_value_point * delta_freq_per_point); + freq1 = freq / 1000000; + freq2 = freq / 1000 - freq1 * 1000; + + if (freq2 < 100) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq = %d.0%d MHz", + freq1, freq2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq = %d.%d MHz", + freq1, freq2); + + if (psd_rep2 < 10) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + ", Value = %d.0%d dB, (%d)\n", + psd_rep1, psd_rep2, psd_scan->psd_max_value); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + ", Value = %d.%d dB, (%d)\n", + psd_rep1, psd_rep2, psd_scan->psd_max_value); + + CL_PRINTF(cli_buf); + } else { + m = psd_scan->psd_start_point; + n = psd_scan->psd_start_point; i = 1; - j = 1; + j = 1; - while(1) - { - do - { - freq = ((pPsdScan->nRealCentFreq-20) * 1000000 + m * nDeltaFreqPerPoint); - freq1 = freq/1000000; - freq2 = freq/1000 - freq1 * 1000; - - if (i ==1) - { - if (freq2 == 0) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq%6d.000", freq1); - else if (freq2 < 100) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq%6d.0%2d", freq1,freq2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq%6d.%3d", freq1,freq2); - } - else if ( (i%8 == 0) || (m == pPsdScan->nPSDStopPoint) ) - { - if (freq2 == 0) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.000\n", freq1); - else if (freq2 < 100) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.0%2d\n", freq1,freq2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.%3d\n", freq1,freq2); - } - else - { - if (freq2 == 0) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.000", freq1); - else if (freq2 < 100) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.0%2d", freq1,freq2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.%3d", freq1,freq2); + while (1) { + do { + freq = ((psd_scan->real_cent_freq - 20) * 1000000 + m * + delta_freq_per_point); + freq1 = freq / 1000000; + freq2 = freq / 1000 - freq1 * 1000; + + if (i == 1) { + if (freq2 == 0) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq%6d.000", freq1); + else if (freq2 < 100) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq%6d.0%2d", freq1, + freq2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Freq%6d.%3d", freq1, + freq2); + } else if ((i % 8 == 0) || + (m == psd_scan->psd_stop_point)) { + if (freq2 == 0) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.000\n", freq1); + else if (freq2 < 100) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.0%2d\n", freq1, freq2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.%3d\n", freq1, freq2); + } else { + if (freq2 == 0) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.000", freq1); + else if (freq2 < 100) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.0%2d", freq1, freq2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%6d.%3d", freq1, freq2); + } + + i++; + m++; + CL_PRINTF(cli_buf); + + } while ((i <= 8) && (m <= psd_scan->psd_stop_point)); + + + do { + psd_rep1 = psd_scan->psd_report_max_hold[n] / 100; + psd_rep2 = psd_scan->psd_report_max_hold[n] - psd_rep1 * + 100; + + if (j == 1) { + if (psd_rep2 < 10) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Val %7d.0%d", psd_rep1, + psd_rep2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n Val %7d.%d", psd_rep1, + psd_rep2); + } else if ((j % 8 == 0) || + (n == psd_scan->psd_stop_point)) { + if (psd_rep2 < 10) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%7d.0%d\n", psd_rep1, + psd_rep2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%7d.%d\n", psd_rep1, psd_rep2); + } else { + if (psd_rep2 < 10) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%7d.0%d", psd_rep1, psd_rep2); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "%7d.%d", psd_rep1, psd_rep2); + } + + j++; + n++; + CL_PRINTF(cli_buf); + + } while ((j <= 8) && (n <= psd_scan->psd_stop_point)); + + if ((m > psd_scan->psd_stop_point) || + (n > psd_scan->psd_stop_point)) + break; + else { + i = 1; + j = 1; } - i++; - m++; - CL_PRINTF(cliBuf); - - }while( (i <= 8) && (m <= pPsdScan->nPSDStopPoint)); - - - do - { - PsdRep1 = pPsdScan->nPSDReport_MaxHold[n]/100; - PsdRep2 = pPsdScan->nPSDReport_MaxHold[n] - PsdRep1 * 100; - - if (j ==1) - { - if (PsdRep2 <10) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Val %7d.0%d", PsdRep1,PsdRep2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Val %7d.%d", PsdRep1,PsdRep2); - } - else if ( (j%8 == 0) || (n == pPsdScan->nPSDStopPoint) ) - { - if (PsdRep2 <10) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.0%d\n", PsdRep1,PsdRep2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.%d\n", PsdRep1,PsdRep2); - } - else - { - if (PsdRep2 <10) - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.0%d", PsdRep1,PsdRep2); - else - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.%d", PsdRep1,PsdRep2); - } - - j++; - n++; - CL_PRINTF(cliBuf); - - } while( (j <= 8) && (n <= pPsdScan->nPSDStopPoint)); - - if ( (m > pPsdScan->nPSDStopPoint) || (n > pPsdScan->nPSDStopPoint) ) - break; - else - { - i = 1; - j = 1; } - - } } } -VOID -halbtc8723b1ant_PSD_MaxHoldData( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte GenCount - ) +void halbtc8723b1ant_psd_max_holddata(IN struct btc_coexist *btcoexist, + IN u32 gen_count) { - 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)); + u32 i = 0, i_max = 0, val_max = 0; - 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])); - } + if (gen_count == 1) { + memcpy(psd_scan->psd_report_max_hold, + psd_scan->psd_report, + BT_8723B_1ANT_ANTDET_PSD_POINTS * sizeof(u32)); - pPsdScan->nPSDMaxValuePoint = 0; - pPsdScan->nPSDMaxValue = 0; + psd_scan->psd_max_value_point = 0; + psd_scan->psd_max_value = 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]; + } else { + for (i = psd_scan->psd_start_point; + i <= psd_scan->psd_stop_point; i++) { + if (psd_scan->psd_report[i] > + psd_scan->psd_report_max_hold[i]) + psd_scan->psd_report_max_hold[i] = + psd_scan->psd_report[i]; - //search Max Value - if (i ==pPsdScan->nPSDStartPoint ) - { + /* search Max Value */ + if (i == psd_scan->psd_start_point) { + i_max = i; + val_max = psd_scan->psd_report_max_hold[i]; + } else { + if (psd_scan->psd_report_max_hold[i] > + val_max) { i_max = i; - val_max = pPsdScan->nPSDReport_MaxHold[i]; + val_max = psd_scan->psd_report_max_hold[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)); } + psd_scan->psd_max_value_point = i_max; + psd_scan->psd_max_value = val_max; + + } + } -u4Byte -halbtc8723b1ant_PSD_GetData( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte nPoint - ) +u32 halbtc8723b1ant_psd_getdata(IN struct btc_coexist *btcoexist, IN u32 point) { - //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 + /* 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); + u32 val = 0, psd_report = 0; + int k = 0; + + val = btcoexist->btc_read_4byte(btcoexist, 0x808); val &= 0xffbffc00; - val |= nPoint; - - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val); + val |= point; + + btcoexist->btc_write_4byte(btcoexist, 0x808, val); val |= 0x00400000; - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val); + btcoexist->btc_write_4byte(btcoexist, 0x808, val); + while (1) { + if (k++ > BT_8723B_1ANT_ANTDET_SWEEPPOINT_DELAY) + break; + } - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x8b4); + val = btcoexist->btc_read_4byte(btcoexist, 0x8b4); psd_report = val & 0x0000ffff; - + return psd_report; } -VOID -halbtc8723b1ant_PSD_SweepPoint( -IN PBTC_COEXIST pBtCoexist, - IN u4Byte centFreq, - IN s4Byte offset, - IN u4Byte span, - IN u4Byte points, - IN u4Byte avgnum - ) +boolean halbtc8723b1ant_psd_sweep_point(IN struct btc_coexist *btcoexist, + IN u32 cent_freq, IN s32 offset, IN u32 span, IN u32 points, + IN u32 avgnum, IN u32 loopcnt) { - u4Byte i,val,n,k=0; - u4Byte nPoints=0, psd_report=0; - u4Byte nStartP=0, nStopP=0, nDeltaFreqPerPoint=156250; - u4Byte nPSDCenterFreq=20*10^6, freq,freq1,freq2; - BOOLEAN outloop = FALSE; - u1Byte flag = 0; - u4Byte tmp, PsdRep1, PsdRep2; - u4Byte WiFi_OriginalChannel = 1; + u32 i, val, n, k = 0, j, point_index = 0; + u32 points1 = 0, psd_report = 0; + u32 start_p = 0, stop_p = 0, delta_freq_per_point = 156250; + u32 psd_center_freq = 20 * 10 ^ 6; + boolean outloop = false, scan , roam, is_sweep_ok = true; + u8 flag = 0; + u32 tmp; + u32 wifi_original_channel = 1; - pPsdScan->bIsPSDRunning = TRUE; - - do - { - switch(flag) - { - case 0: //Get PSD parameters - default: - //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), centFreq=0x%x, offset=0x%x, span=0x%x\n", - // centFreq, offset, span)); + psd_scan->is_psd_running = true; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx PSD Sweep Start!!\n"); + BTC_TRACE(trace_buf); - 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; + do { + switch (flag) { + case 0: /* Get PSD parameters */ + default: - //PSD point setup - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808); - val &= 0xffff0fff; - - switch(pPsdScan->nPSDPoint) - { - case 128: - val |= 0x0; - break; - case 256: - default: - val |=0x00004000; - break; - case 512: - val |= 0x00008000; - break; - case 1024: - val |= 0x0000c000; - break; - } - - switch(pPsdScan->nPSDAvgNum) - { - case 1: - val |= 0x0; - break; - case 8: - val |=0x00001000; - break; - case 16: - val |= 0x00002000; - break; - case 32: - default: - val |= 0x00003000; - break; + psd_scan->psd_band_width = 40 * 1000000; + psd_scan->psd_point = points; + psd_scan->psd_start_base = points / 2; + psd_scan->psd_avg_num = avgnum; + psd_scan->real_cent_freq = cent_freq; + psd_scan->real_offset = offset; + psd_scan->real_span = span; + + + points1 = psd_scan->psd_point; + delta_freq_per_point = psd_scan->psd_band_width / + psd_scan->psd_point; + + /* PSD point setup */ + val = btcoexist->btc_read_4byte(btcoexist, 0x808); + val &= 0xffff0fff; + + switch (psd_scan->psd_point) { + case 128: + val |= 0x0; + break; + case 256: + default: + val |= 0x00004000; + break; + case 512: + val |= 0x00008000; + break; + case 1024: + val |= 0x0000c000; + break; } - pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val); - //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD BW= %d, DeltaFreq=%d\n" - // , pPsdScan->nPSDBandWidth, nDeltaFreqPerPoint)); + switch (psd_scan->psd_avg_num) { + case 1: + val |= 0x0; + break; + case 8: + val |= 0x00001000; + break; + case 16: + val |= 0x00002000; + break; + case 32: + default: + val |= 0x00003000; + break; + } + btcoexist->btc_write_4byte(btcoexist, 0x808, val); + flag = 1; break; - case 1: //calculate the PSD point index from freq/offset/span - nPSDCenterFreq = pPsdScan->nPSDBandWidth /2 +offset*(1000000); - //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; - //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), Start PSD Poin Matrix Index = %d\n", pPsdScan->nPSDStartPoint)); + case 1: /* calculate the PSD point index from freq/offset/span */ + psd_center_freq = psd_scan->psd_band_width / 2 + + offset * (1000000); - nStopP = pPsdScan->nPSDStartBase + (nPSDCenterFreq + span *(1000000)/2) /nDeltaFreqPerPoint; - pPsdScan->nPSDStopPoint = nStopP - pPsdScan->nPSDStartBase-1; - //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), Stop PSD Poin Matrix Index = %d\n",pPsdScan->nPSDStopPoint)); + start_p = psd_scan->psd_start_base + (psd_center_freq - + span * (1000000) / 2) / delta_freq_per_point; + psd_scan->psd_start_point = start_p - + psd_scan->psd_start_base; + + stop_p = psd_scan->psd_start_base + (psd_center_freq + + span * (1000000) / 2) / delta_freq_per_point; + psd_scan->psd_stop_point = stop_p - + psd_scan->psd_start_base - 1; flag = 2; break; - case 2: //set RF channel/BW/Mode + case 2: /* set RF channel/BW/Mode */ - //set 3-wire off - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c); + /* set 3-wire off */ + val = btcoexist->btc_read_4byte(btcoexist, 0x88c); val |= 0x00300000; - pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val); + btcoexist->btc_write_4byte(btcoexist, 0x88c, val); - //CCK off - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800); + /* CCK off */ + val = btcoexist->btc_read_4byte(btcoexist, 0x800); val &= 0xfeffffff; - pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val); + btcoexist->btc_write_4byte(btcoexist, 0x800, val); - //store WiFi original channel - WiFi_OriginalChannel = pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff); + /* store WiFi original channel */ + wifi_original_channel = btcoexist->btc_get_rf_reg( + btcoexist, BTC_RF_A, 0x18, 0x3ff); - //Set RF channel - if (centFreq == 2484) - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, 0xe); + /* Set RF channel */ + if (cent_freq == 2484) + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, + 0x18, 0x3ff, 0xe); else - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, (centFreq-2412)/5 + 1); //WiFi TRx Mask on + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, + 0x18, 0x3ff, (cent_freq - 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 RF Rx filter corner */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, + 0xfffff, 0x3e4); - //Set TRx mask off - //un-lock TRx Mask setup - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x1); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x1); + /* Set TRx mask off */ + /* un-lock TRx Mask setup */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd, + 0x80, 0x1); + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf, + 0x1, 0x1); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, + 0xfffff, 0x0); + /* Set RF mode = Rx, RF Gain = 0x8a0 */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x0, + 0xfffff, 0x308a0); + + while (1) { + if (k++ > BT_8723B_1ANT_ANTDET_SWEEPPOINT_DELAY) + break; + } flag = 3; break; - case 3: - memset(pPsdScan->nPSDReport,0, pPsdScan->nPSDPoint*sizeof(u4Byte)); - nStartP = pPsdScan->nPSDStartPoint + pPsdScan->nPSDStartBase; - nStopP = pPsdScan->nPSDStopPoint + pPsdScan->nPSDStartBase + 1; - - i = nStartP; + case 3: + psd_scan->psd_gen_count = 0; + for (j = 1; j <= loopcnt; j++) { - while (i < nStopP) - { - if (i >= nPoints) - { - psd_report = halbtc8723b1ant_PSD_GetData(pBtCoexist,i-nPoints); + btcoexist->btc_get(btcoexist, + BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, + BTC_GET_BL_WIFI_ROAM, &roam); + + if (scan || roam) { + is_sweep_ok = false; + break; } - else - { - psd_report = halbtc8723b1ant_PSD_GetData(pBtCoexist,i); + memset(psd_scan->psd_report, 0, + psd_scan->psd_point * sizeof(u32)); + start_p = psd_scan->psd_start_point + + psd_scan->psd_start_base; + stop_p = psd_scan->psd_stop_point + + psd_scan->psd_start_base + 1; + + i = start_p; + point_index = 0; + + while (i < stop_p) { + if (i >= points1) + psd_report = + halbtc8723b1ant_psd_getdata( + btcoexist, i - points1); + else + psd_report = + halbtc8723b1ant_psd_getdata( + btcoexist, i); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "Point=%d, psd_raw_data = 0x%08x\n", + i, psd_report); + BTC_TRACE(trace_buf); + if (psd_report == 0) + tmp = 0; + else + /* tmp = 20*log10((double)psd_report); */ + /* 20*log2(x)/log2(10), log2Base return theresult of the psd_report*100 */ + tmp = 6 * halbtc8723b1ant_psd_log2base( + btcoexist, psd_report); + + n = i - psd_scan->psd_start_base; + psd_scan->psd_report[n] = tmp; + + + halbtc8723b1ant_psd_max_holddata( + btcoexist, j); + + i++; + } - if (psd_report == 0) - tmp = 0; - else - //tmp = 20*log10((double)psd_report); - //20*log2(x)/log2(10), log2Base return theresult of the psd_report*100 - tmp = 6 * halbtc8723b1ant_PSD_Log2Base(pBtCoexist, psd_report); - - n = i-pPsdScan->nPSDStartBase; - pPsdScan->nPSDReport[n] = tmp; - PsdRep1 = pPsdScan->nPSDReport[n] /100; - PsdRep2 = pPsdScan->nPSDReport[n] - PsdRep1 * 100; - - freq = ((centFreq-20) * 1000000 + n * nDeltaFreqPerPoint); - freq1 = freq/1000000; - freq2 = freq/1000 - freq1 * 1000; -/* - if (freq2 < 100) - RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.0%d MHz)", n, freq1, freq2)); - else - RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.%d MHz)", n, freq1, freq2)); - - if (PsdRep2 < 10) - RT_TRACE(COMP_COEX, DBG_LOUD, (", PSDReport = %d (%d.0%d dB)\n",psd_report, PsdRep1, PsdRep2)); - else - RT_TRACE(COMP_COEX, DBG_LOUD, (", PSDReport = %d (%d.%d dB)\n",psd_report, PsdRep1,PsdRep2)); -*/ - i++; - - k=0; - - //Add Delay between PSD point - while(1) - { - if (k++ > 20000) - break; - } - - //RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx SweepPSDPoint()==============\n")); - } + psd_scan->psd_gen_count = j; + } flag = 100; break; - case 99: //error + case 99: /* error */ - outloop = TRUE; + outloop = true; break; - case 100: //recovery + case 100: /* recovery */ - //set 3-wire on - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c); - val &=0xffcfffff; - pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val); + /* set 3-wire on */ + val = btcoexist->btc_read_4byte(btcoexist, 0x88c); + val &= 0xffcfffff; + btcoexist->btc_write_4byte(btcoexist, 0x88c, val); - //CCK on - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800); + /* CCK on */ + val = btcoexist->btc_read_4byte(btcoexist, 0x800); val |= 0x01000000; - pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val); + btcoexist->btc_write_4byte(btcoexist, 0x800, val); - //PSD off - val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808); - val &=0xffbfffff; - pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x808,val); - - //TRx Mask on - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); + /* PSD off */ + val = btcoexist->btc_read_4byte(btcoexist, 0x808); + val &= 0xffbfffff; + btcoexist->btc_write_4byte(btcoexist, 0x808, val); - //lock TRx Mask setup - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x0); - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x0); + /* TRx Mask on */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, + 0xfffff, 0x780); - //Set RF Rx filter corner - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0x0); + /* lock TRx Mask setup */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd, + 0x80, 0x0); + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf, + 0x1, 0x0); - //restore WiFi original channel - pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, WiFi_OriginalChannel); - - outloop = TRUE; + /* Set RF Rx filter corner */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, + 0xfffff, 0x0); + + /* restore WiFi original channel */ + btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x18, + 0x3ff, wifi_original_channel); + + outloop = true; break; - } - - }while (!outloop); + } + + } while (!outloop); - pPsdScan->bIsPSDRunning = FALSE; + psd_scan->is_psd_running = false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx PSD Sweep Stop!!\n"); + BTC_TRACE(trace_buf); + return is_sweep_ok; } -VOID -halbtc8723b1ant_PSD_AntennaDetection( - IN PBTC_COEXIST pBtCoexist, - IN u4Byte BTTxTime, - IN u4Byte BTLEChannel - ) +void halbtc8723b1ant_psd_antenna_detection(IN struct btc_coexist *btcoexist, + IN u32 bt_tx_time, IN u32 bt_le_channel) { - 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}; + u32 i = 0; + u32 wlpsd_cent_freq = 2484, wlpsd_span = 2, wlpsd_sweep_count = 50; + s32 wlpsd_offset = -4; + u8 bt_le_ch[13] = {3,6,8,11,13,16,18,21,23,26,28,31,33}; - u1Byte H2C_Parameter[3] ={0},u1Tmpa,u1Tmpb; + u8 h2c_parameter[3] ={0},u8tmpa,u8tmpb; - u1Byte state=0; - BOOLEAN outloop = FALSE, BTResp = FALSE, bScan ,bRoam; - u4Byte freq,freq1,freq2,PsdRep1, PsdRep2, nDeltaFreqPerPoint,u4Tmp; - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; + u8 state=0; + boolean outloop = false, bt_resp = false; + u32 freq, freq1, freq2, psd_rep1, psd_rep2, delta_freq_per_point, + u32tmp; + struct btc_board_info *board_info = &btcoexist->board_info; - pBoardInfo->btdmAntDetFinish = FALSE; - memset(pPsdScan->nAntDet_PeakVal, 0, 16*sizeof(UCHAR)); - memset(pPsdScan->nAntDet_PeakFreq, 0, 16*sizeof(UCHAR)); + board_info->btdm_ant_det_finish = false; + memset(psd_scan->ant_det_peak_val, 0, 16*sizeof(u8)); + memset(psd_scan->ant_det_peak_freq, 0, 16*sizeof(u8)); - if (pBoardInfo->bTfbgaPackage) //for TFBGA - pPsdScan->nAntDet_ThresOffset = 5; + if (board_info->tfbga_package) /* for TFBGA */ + psd_scan->ant_det_thres_offset = 5; else - pPsdScan->nAntDet_ThresOffset = 0; + psd_scan->ant_det_thres_offset = 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); - - RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Set Antenna to BT!!\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])); - - pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter); - - 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++) - { - 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); - } - - pPsdScan->nAntDet_PrePSDScanPeakVal = pPsdScan->nPSDMaxValue; - - 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++) - { - 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); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan); - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam); - - if (bScan ||bRoam) - { - pBoardInfo->btdmAntDetFinish = FALSE; - pBoardInfo->btdmAntNumByAntDet = 1; - pPsdScan->nAntDet_Result = 8; - state = 99; + do { + switch (state) { + case 0: + if (bt_le_channel == 39) + wlpsd_cent_freq = 2484; + else { + for (i = 1; i <= 13; i++) { + if (bt_le_ch[i - 1] == + bt_le_channel) { + wlpsd_cent_freq = 2412 + + (i - 1) * 5; 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) - { - 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 - { - 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); - } - - if (PsdRep2 < 10) - { - 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 - { - 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) - { - 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")); } + if (i == 14) { + + BTC_SPRINTF(trace_buf, + BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Abort!!, Invalid LE channel = %d\n ", + bt_le_channel); + BTC_TRACE(trace_buf); + outloop = true; + break; + } + } + + wlpsd_sweep_count = bt_tx_time * 238 / + 100; /* bt_tx_time/0.42 */ + wlpsd_sweep_count = wlpsd_sweep_count / 5; + + if (wlpsd_sweep_count % 5 != 0) + wlpsd_sweep_count = (wlpsd_sweep_count / + 5 + 1) * 5; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), BT_LETxTime=%d, BT_LECh = %d\n", + bt_tx_time, bt_le_channel); + BTC_TRACE(trace_buf); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), wlpsd_cent_freq=%d, wlpsd_offset = %d, wlpsd_span = %d, wlpsd_sweep_count = %d\n", + wlpsd_cent_freq, + wlpsd_offset, + wlpsd_span, + wlpsd_sweep_count); + BTC_TRACE(trace_buf); + + state = 1; + break; + case 1: /* stop coex DM & set antenna path */ + /* Stop Coex DM */ + btcoexist->stop_coex_dm = true; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Stop Coex DM!!\n"); + BTC_TRACE(trace_buf); + + /* set native power save */ + halbtc8723b1ant_power_save_state(btcoexist, + BTC_PS_WIFI_NATIVE, 0x0, 0x0); + + /* Set TDMA off, */ + halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, + false, 0); + + /* Set coex table */ + halbtc8723b1ant_coex_table_with_type(btcoexist, + FORCE_EXEC, 0); + + if (board_info->btdm_ant_pos == + BTC_ANTENNA_AT_MAIN_PORT) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna at Main Port\n"); + BTC_TRACE(trace_buf); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna at Aux Port\n"); + BTC_TRACE(trace_buf); + } + + /* Set Antenna path, switch WiFi to un-certain antenna port */ + halbtc8723b1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_BT, FORCE_EXEC, false, + false); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Set Antenna to BT!!\n"); + BTC_TRACE(trace_buf); + + /* Set AFH mask on at WiFi channel 2472MHz +/- 10MHz */ + h2c_parameter[0] = 0x1; + h2c_parameter[1] = 0xd; + h2c_parameter[2] = 0x14; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Set AFH on, Cent-Ch= %d, Mask=%d\n", + h2c_parameter[1], + h2c_parameter[2]); + BTC_TRACE(trace_buf); + + btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, + h2c_parameter); + + u32tmp = btcoexist->btc_read_4byte(btcoexist, + 0x948); + u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765); + u8tmpb = btcoexist->btc_read_1byte(btcoexist, + 0x778); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x778=0x%x\n", + u32tmp, u8tmpa, u8tmpb); + BTC_TRACE(trace_buf); + + state = 2; + break; + case 2: /* Pre-sweep background psd */ + if (!halbtc8723b1ant_psd_sweep_point(btcoexist, + wlpsd_cent_freq, wlpsd_offset, wlpsd_span, + BT_8723B_1ANT_ANTDET_PSD_POINTS, + BT_8723B_1ANT_ANTDET_PSD_AVGNUM, 3)) { + board_info->btdm_ant_det_finish = false; + board_info->btdm_ant_num_by_ant_det = 1; + psd_scan->ant_det_result = 8; 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!!")); + psd_scan->ant_det_pre_psdscan_peak_val = + psd_scan->psd_max_value; - //Resume Coex DM - pBtCoexist->bStopCoexDm = FALSE; - RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Resume Coex DM\n!!")); + if (psd_scan->psd_max_value > + (BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND + + psd_scan->ant_det_thres_offset) * 100) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Abort Antenna Detection!! becaus background = %d > thres (%d)\n", + psd_scan->psd_max_value / 100, + BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND + + psd_scan->ant_det_thres_offset); + BTC_TRACE(trace_buf); + board_info->btdm_ant_det_finish = false; + board_info->btdm_ant_num_by_ant_det = 1; + psd_scan->ant_det_result = 5; + state = 99; + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Start Antenna Detection!! becaus background = %d <= thres (%d)\n", + psd_scan->psd_max_value / 100, + BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND + + psd_scan->ant_det_thres_offset); + BTC_TRACE(trace_buf); + state = 3; + } + break; + case 3: + bt_resp = btcoexist->btc_set_bt_ant_detection( + btcoexist, (u8)(bt_tx_time & 0xff), + (u8)(bt_le_channel & 0xff)); - //stimulate coex running - halbtc8723b1ant_RunCoexistMechanism(pBtCoexist); - RT_TRACE(COMP_COEX, DBG_LOUD, ("xxxxxxxxxxxxxxxx AntennaDetect(), Stimulate Coex running\n!!")); - - outloop = TRUE; + if (!halbtc8723b1ant_psd_sweep_point(btcoexist, + wlpsd_cent_freq, wlpsd_offset, + wlpsd_span, + BT_8723B_1ANT_ANTDET_PSD_POINTS, + BT_8723B_1ANT_ANTDET_PSD_AVGNUM, + wlpsd_sweep_count)) { + board_info->btdm_ant_det_finish + = false; + board_info->btdm_ant_num_by_ant_det + = 1; + psd_scan->ant_det_result = 8; + state = 99; break; } - - }while(!outloop); - + psd_scan->ant_det_psd_scan_peak_val = + psd_scan->psd_max_value; + psd_scan->ant_det_psd_scan_peak_freq = + psd_scan->psd_max_value_point; + state = 4; + break; + case 4: - } - -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) - { - 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 - { - halbtc8723b1ant_PSD_AntennaDetection(pBtCoexist, pPsdScan->nAntDet_BTTxTime, pPsdScan->nAntDet_BTLEChannel); - } - - if (!pBoardInfo->btdmAntDetFinish) - AntDetFailCount++; - - pPsdScan->bAntDet_FailCount = AntDetFailCount; - -} - - -//============================================================ -// work around function start with wa_halbtc8723b1ant_ -//============================================================ -//============================================================ -// extern function start with EXhalbtc8723b1ant_ -//============================================================ -VOID -EXhalbtc8723b1ant_PowerOnSetting( - IN PBTC_COEXIST pBtCoexist - ) -{ - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; - 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); - - // 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); - } - } -} - -VOID -EXhalbtc8723b1ant_PreLoadFirmware( - IN PBTC_COEXIST pBtCoexist - ) -{ -} - -VOID -EXhalbtc8723b1ant_InitHwConfig( - IN PBTC_COEXIST pBtCoexist, - IN BOOLEAN bWifiOnly - ) -{ - halbtc8723b1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly); - pBtCoexist->bStopCoexDm = FALSE; -} - -VOID -EXhalbtc8723b1ant_InitCoexDm( - IN PBTC_COEXIST pBtCoexist - ) -{ - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Coex Mechanism Init!!\n")); - - pBtCoexist->bStopCoexDm = FALSE; - - halbtc8723b1ant_InitCoexDm(pBtCoexist); - - halbtc8723b1ant_QueryBtInfo(pBtCoexist); -} - -VOID -EXhalbtc8723b1ant_DisplayCoexInfo( - IN PBTC_COEXIST pBtCoexist - ) -{ - 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; - u2Byte u2Tmp[4]; - 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); - - if(pBtCoexist->bManualControl) - { - 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); - } - if(pBtCoexist->bStopCoexDm) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[Coex is STOPPED]============"); - CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n =========================================="); - CL_PRINTF(cliBuf); - } - - 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); - CL_PRINTF(cliBuf); - - 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)/ %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", "WifibHiPri/ Ccklock/ CckEverLock", \ - (pCoexSta->bWiFiIsHighPriTask? "Yes":"No"), - (pCoexSta->bCCKLock? "Yes":"No"), - (pCoexSta->bCCKEverLock? "Yes":"No")); - CL_PRINTF(cliBuf); - - // wifi status - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============"); - CL_PRINTF(cliBuf); - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============"); - CL_PRINTF(cliBuf); - - 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_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))), - pCoexSta->btRssi, pCoexSta->btRetryCnt, pCoexSta->popEventCnt); - CL_PRINTF(cliBuf); - - 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) - { - 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/ %d", "A2DP Rate/Bitpool", \ - (btInfoExt&BIT0)? "BR":"EDR", pCoexSta->nA2DPBitPool); - CL_PRINTF(cliBuf); - - for(i=0; ibtInfoC2hCnt[i]) - { - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8723b1Ant[i], \ - pCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1], - pCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3], - pCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5], - pCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]); - CL_PRINTF(cliBuf); - } - } - - - if(pBtCoexist->bManualControl) - { - 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_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "SM[LowPenaltyRA]", \ - pCoexDm->bCurLowPenaltyRa); - CL_PRINTF(cliBuf); - - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %d ", "DelBA/ BtCtrlAgg/ AggSize", \ - (pBtCoexist->btInfo.bRejectAggPkt? "Yes":"No"), (pBtCoexist->btInfo.bBtCtrlAggBufSize? "Yes":"No"), - pBtCoexist->btInfo.aggBufSize); - CL_PRINTF(cliBuf); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Rate Mask", \ - pBtCoexist->btInfo.raMask); - CL_PRINTF(cliBuf); - - // 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; - if (pBoardInfo->btdmAntNumByAntDet == 2) - { - if (pCoexDm->bCurPsTdmaOn) - psTdmaCase = psTdmaCase +100; //for WiFi RSSI low or BT RSSI low + if (psd_scan->psd_point == 0) + delta_freq_per_point = 0; 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->bCurPsTdmaOn? "On":"Off"), - (pCoexDm->bAutoTdmaAdjust? "Adj":"Fix") ); - - 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", "IgnWlanAct", \ - pCoexDm->bCurIgnoreWlanAct); - CL_PRINTF(cliBuf); - - /* - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \ - pCoexDm->errorCondition); - CL_PRINTF(cliBuf); - */ + delta_freq_per_point = + psd_scan->psd_band_width / + psd_scan->psd_point; - // Hw setting - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============"); - CL_PRINTF(cliBuf); + psd_rep1 = psd_scan->psd_max_value / 100; + psd_rep2 = psd_scan->psd_max_value - psd_rep1 * + 100; - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", "backup ARFR1/ARFR2/RL/AMaxTime", \ - pCoexDm->backupArfrCnt1, pCoexDm->backupArfrCnt2, pCoexDm->backupRetryLimit, pCoexDm->backupAmpduMaxTime); - CL_PRINTF(cliBuf); + freq = ((psd_scan->real_cent_freq - 20) * + 1000000 + psd_scan->psd_max_value_point + * delta_freq_per_point); + freq1 = freq / 1000000; + freq2 = freq / 1000 - freq1 * 1000; - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434); - u2Tmp[0] = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", "0x430/0x434/0x42a/0x456", \ - u4Tmp[0], u4Tmp[1], u2Tmp[0], u1Tmp[0]); - CL_PRINTF(cliBuf); - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778); - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6cc); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x778/0x6cc/0x880[29:25]", \ - u1Tmp[0], u4Tmp[0], (u4Tmp[1]&0x3e000000) >> 25); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x764); - u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x948/ 0x67[5] / 0x764 / 0x76e", \ - u4Tmp[0], ((u1Tmp[0]&0x20)>> 5), (u4Tmp[1] & 0xffff), u1Tmp[1]); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x92c); - u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930); - u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x944); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]", \ - u4Tmp[0]&0x3, u4Tmp[1]&0xff, u4Tmp[2]&0x3); - CL_PRINTF(cliBuf); - - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x39); - u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40); - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c); - u1Tmp[2] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x64); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x38[11]/0x40/0x4c[24:23]/0x64[0]", \ - ((u1Tmp[0] & 0x8)>>3), u1Tmp[1], ((u4Tmp[0]&0x01800000)>>23), u1Tmp[2]&0x1); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550); - u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522); - CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522", \ - u4Tmp[0], u1Tmp[0]); - CL_PRINTF(cliBuf); - - u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50); - 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, 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); - - 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(coexTable)", \ - u4Tmp[0], u4Tmp[1], u4Tmp[2]); - CL_PRINTF(cliBuf); - - 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)", \ - pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx); - CL_PRINTF(cliBuf); -#if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 1) - //halbtc8723b1ant_MonitorBtCtr(pBtCoexist); -#endif - pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS); -} - - -VOID -EXhalbtc8723b1ant_IpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - u4Byte u4Tmp=0; - - if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm) - return; - - if(BTC_IPS_ENTER == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS ENTER notify\n")); - pCoexSta->bUnderIps = TRUE; - - halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); - halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE); - halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); - //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF); - } - else if(BTC_IPS_LEAVE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], IPS LEAVE notify\n")); - - halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE); - halbtc8723b1ant_InitCoexDm(pBtCoexist); - halbtc8723b1ant_QueryBtInfo(pBtCoexist); - - pCoexSta->bUnderIps = FALSE; - } -} - -VOID -EXhalbtc8723b1ant_LpsNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - if(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm) - return; - - if(BTC_LPS_ENABLE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS ENABLE notify\n")); - pCoexSta->bUnderLps = TRUE; - } - else if(BTC_LPS_DISABLE == type) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], LPS DISABLE notify\n")); - pCoexSta->bUnderLps = FALSE; - } -} - -VOID -EXhalbtc8723b1ant_ScanNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - 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 ) - return; - - if(BTC_SCAN_START == type) - { - pCoexSta->bWiFiIsHighPriTask = TRUE; - 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); - 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); - - halbtc8723b1ant_QueryBtInfo(pBtCoexist); - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus); - numOfWifiLink = wifiLinkStatus>>16; - if(numOfWifiLink >= 2) - { - halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); - halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist); - return; - } - - if(pCoexSta->bC2hBtInquiryPage) - { - halbtc8723b1ant_ActionBtInquiry(pBtCoexist); - return; - } - else if(bBtHsOn) - { - halbtc8723b1ant_ActionHs(pBtCoexist); - return; - } - - if(BTC_SCAN_START == type) - { - //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN START notify\n")); - if(!bWifiConnected) // non-connected scan - { - halbtc8723b1ant_ActionWifiNotConnectedScan(pBtCoexist); - } - else // wifi is connected - { - halbtc8723b1ant_ActionWifiConnectedScan(pBtCoexist); - } - } - else if(BTC_SCAN_FINISH == type) - { - //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], SCAN FINISH notify\n")); - if(!bWifiConnected) // non-connected scan - { - halbtc8723b1ant_ActionWifiNotConnected(pBtCoexist); - } - else - { - halbtc8723b1ant_ActionWifiConnected(pBtCoexist); - } - } -} - -VOID -EXhalbtc8723b1ant_ConnectNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - 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; - 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); - 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) - { - halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); - halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist); - return; - } - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - if(pCoexSta->bC2hBtInquiryPage) - { - halbtc8723b1ant_ActionBtInquiry(pBtCoexist); - return; - } - else if(bBtHsOn) - { - halbtc8723b1ant_ActionHs(pBtCoexist); - return; - } - - if(BTC_ASSOCIATE_START == type) - { - //RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], CONNECT START notify\n")); - halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist); - } - else if(BTC_ASSOCIATE_FINISH == type) - { - //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 - { - halbtc8723b1ant_ActionWifiNotConnected(pBtCoexist); - } - else - { - halbtc8723b1ant_ActionWifiConnected(pBtCoexist); - } - } -} - -VOID -EXhalbtc8723b1ant_MediaStatusNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - u1Byte H2C_Parameter[3] ={0}; - u4Byte wifiBw; - u1Byte wifiCentralChnl; - BOOLEAN bWifiUnderBMode = FALSE; - - if(pBtCoexist->bManualControl || - pBtCoexist->bStopCoexDm || - pBtCoexist->btInfo.bBtDisabled ) - return; - - if(BTC_MEDIA_CONNECT == type) - { - 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 - 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 - { - 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 - - pCoexSta->bCCKEverLock = FALSE; - } - - // 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) && - (wifiCentralChnl <= 14) ) - { - //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) - 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]; - - 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); -} - -VOID -EXhalbtc8723b1ant_SpecialPacketNotify( - IN PBTC_COEXIST pBtCoexist, - IN u1Byte type - ) -{ - BOOLEAN bBtHsOn=FALSE; - u4Byte wifiLinkStatus=0; - u4Byte numOfWifiLink=0; - 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 ) - 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) && (!bUnder4way)) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) - { - pCoexSta->bWiFiIsHighPriTask = FALSE; - } - else - { - pCoexSta->bWiFiIsHighPriTask = TRUE; + if (freq2 < 100) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Max Value: Freq = %d.0%d MHz", + freq1, freq2); + BTC_TRACE(trace_buf); + CL_SPRINTF(psd_scan->ant_det_peak_freq, + BT_8723B_1ANT_ANTDET_BUF_LEN, + "%d.0%d", freq1, freq2); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Max Value: Freq = %d.%d MHz", + freq1, freq2); + BTC_TRACE(trace_buf); + CL_SPRINTF(psd_scan->ant_det_peak_freq, + BT_8723B_1ANT_ANTDET_BUF_LEN, + "%d.%d", freq1, freq2); } + + if (psd_rep2 < 10) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + ", Value = %d.0%d dB\n", + psd_rep1, psd_rep2); + BTC_TRACE(trace_buf); + CL_SPRINTF(psd_scan->ant_det_peak_val, + BT_8723B_1ANT_ANTDET_BUF_LEN, + "%d.0%d", psd_rep1, psd_rep2); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + ", Value = %d.%d dB\n", + psd_rep1, psd_rep2); + BTC_TRACE(trace_buf); + CL_SPRINTF(psd_scan->ant_det_peak_val, + BT_8723B_1ANT_ANTDET_BUF_LEN, + "%d.%d", psd_rep1, psd_rep2); + } + + psd_scan->ant_det_is_btreply_available = true; + + if (bt_resp == false) { + psd_scan->ant_det_is_btreply_available = + false; + psd_scan->ant_det_result = 0; + board_info->btdm_ant_det_finish = false; + board_info->btdm_ant_num_by_ant_det = 1; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), BT Response = Fail\n "); + BTC_TRACE(trace_buf); + } else if (psd_scan->psd_max_value > + (BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION) + * 100) { + psd_scan->ant_det_result = 1; + board_info->btdm_ant_det_finish = true; + board_info->btdm_ant_num_by_ant_det = 2; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 2-Ant, Bad-Isolation!!\n"); + BTC_TRACE(trace_buf); + } else if (psd_scan->psd_max_value > + (BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION + + psd_scan->ant_det_thres_offset) * 100) { + psd_scan->ant_det_result = 2; + board_info->btdm_ant_det_finish = true; + board_info->btdm_ant_num_by_ant_det = 2; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 2-Ant, Good-Isolation!!\n"); + BTC_TRACE(trace_buf); + } else if (psd_scan->psd_max_value > + (BT_8723B_1ANT_ANTDET_PSDTHRES_1ANT) * + 100) { + psd_scan->ant_det_result = 3; + board_info->btdm_ant_det_finish = true; + board_info->btdm_ant_num_by_ant_det = 1; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 1-Ant!!\n"); + BTC_TRACE(trace_buf); + } else { + psd_scan->ant_det_result = 4; + board_info->btdm_ant_det_finish = false; + board_info->btdm_ant_num_by_ant_det = 1; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 1-Ant, un-certainity!!\n"); + BTC_TRACE(trace_buf); + } + + 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; + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Set AFH on, Cent-Ch= %d, Mask=%d\n", + h2c_parameter[1], h2c_parameter[2]); + BTC_TRACE(trace_buf); + + btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, + h2c_parameter); + + /* Set Antenna Path */ + halbtc8723b1ant_set_ant_path(btcoexist, + BTC_ANT_PATH_PTA, FORCE_EXEC, false, + false); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Set Antenna to PTA\n!!"); + BTC_TRACE(trace_buf); + + /* Resume Coex DM */ + btcoexist->stop_coex_dm = false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Resume Coex DM\n!!"); + BTC_TRACE(trace_buf); + + /* stimulate coex running */ + halbtc8723b1ant_run_coexist_mechanism( + btcoexist); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx AntennaDetect(), Stimulate Coex running\n!!"); + BTC_TRACE(trace_buf); + + outloop = true; + break; } - else - { - pCoexSta->bWiFiIsHighPriTask = TRUE; - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], special Packet DHCP or EAPOL notify\n")); + + } while (!outloop); + + + +} + +void halbtc8723b1ant_psd_antenna_detection_check(IN struct btc_coexist + *btcoexist) +{ + static u32 ant_det_count = 0, ant_det_fail_count = 0; + struct btc_board_info *board_info = &btcoexist->board_info; + + boolean scan, roam; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); + + + /* psd_scan->ant_det_bt_tx_time = 20; */ + psd_scan->ant_det_bt_tx_time = + BT_8723B_1ANT_ANTDET_BTTXTIME; /* 0.42ms*50 = 20ms (0.42ms = 1 PSD sweep) */ + psd_scan->ant_det_bt_le_channel = BT_8723B_1ANT_ANTDET_BTTXCHANNEL; + + ant_det_count++; + + psd_scan->ant_det_try_count = ant_det_count; + + if (scan || roam) { + board_info->btdm_ant_det_finish = false; + psd_scan->ant_det_result = 6; + } else if (coex_sta->bt_disabled) { + board_info->btdm_ant_det_finish = false; + psd_scan->ant_det_result = 11; + } else if (coex_sta->num_of_profile >= 1) { + board_info->btdm_ant_det_finish = false; + psd_scan->ant_det_result = 7; + } else if ( + !psd_scan->ant_det_is_ant_det_available) { /* Antenna initial setup is not ready */ + board_info->btdm_ant_det_finish = false; + psd_scan->ant_det_result = 9; + } else if (coex_sta->c2h_bt_inquiry_page) { + board_info->btdm_ant_det_finish = false; + psd_scan->ant_det_result = 10; + } else + halbtc8723b1ant_psd_antenna_detection(btcoexist, + psd_scan->ant_det_bt_tx_time, + psd_scan->ant_det_bt_le_channel); + + if (!board_info->btdm_ant_det_finish) + ant_det_fail_count++; + + psd_scan->ant_det_fail_count = ant_det_fail_count; + +} + + +/* ************************************************************ + * work around function start with wa_halbtc8723b1ant_ + * ************************************************************ + * ************************************************************ + * extern function start with ex_halbtc8723b1ant_ + * ************************************************************ */ +void ex_halbtc8723b1ant_power_on_setting(IN struct btc_coexist *btcoexist) +{ + struct btc_board_info *board_info = &btcoexist->board_info; + u8 u8tmp=0x0; + u16 u16tmp=0x0; + u32 value; + + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "xxxxxxxxxxxxxxxx Execute 8723b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n"); + BTC_TRACE(trace_buf); + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "Ant Det Finish = %s, Ant Det Number = %d\n", + (board_info->btdm_ant_det_finish ? "Yes" : "No"), + board_info->btdm_ant_num_by_ant_det); + BTC_TRACE(trace_buf); + + + btcoexist->stop_coex_dm = true; + + btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20); + + /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */ + u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2); + btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT(0) | BIT(1)); + + /* set GRAN_BT = 1 */ + btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18); + /* set WLAN_ACT = 0 */ + btcoexist->btc_write_1byte(btcoexist, 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(btcoexist->chip_interface == BTC_INTF_USB) { + /* fixed at S0 for USB interface */ + btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0); + + u8tmp |= 0x1; /* antenna inverse */ + btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp); + + board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT; + } else { + /* for PCIE and SDIO interface, we check efuse 0xc3[6] */ + if (board_info->single_ant_path == 0) { + /* set to S1 */ + btcoexist->btc_write_4byte(btcoexist, 0x948, 0x280); + board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT; + value = 1; + } else if (board_info->single_ant_path == 1) { + /* set to S0 */ + btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0); + u8tmp |= 0x1; /* antenna inverse */ + board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT; + value = 0; } - } - 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) - { - halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); - halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize); - halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist); - return; - } - - pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn); - if(pCoexSta->bC2hBtInquiryPage) - { - halbtc8723b1ant_ActionBtInquiry(pBtCoexist); - return; - } - else if(bBtHsOn) - { - halbtc8723b1ant_ActionHs(pBtCoexist); - return; - } - - if( BTC_PACKET_DHCP == type || - BTC_PACKET_EAPOL == type || - ( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) ) - { - halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist); + btcoexist->btc_set(btcoexist, BTC_SET_ACT_ANTPOSREGRISTRY_CTRL, + &value); + + if(btcoexist->chip_interface == BTC_INTF_PCI) + btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384, + u8tmp); + else if(btcoexist->chip_interface == BTC_INTF_SDIO) + btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60, + u8tmp); } } -VOID -EXhalbtc8723b1ant_BtInfoNotify( - IN PBTC_COEXIST pBtCoexist, - IN pu1Byte tmpBuf, - IN u1Byte length - ) +void ex_halbtc8723b1ant_pre_load_firmware(IN struct btc_coexist *btcoexist) { - PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo; - u1Byte btInfo=0; - u1Byte i, rspSource=0; - BOOLEAN bWifiConnected=FALSE; - BOOLEAN bBtBusy=FALSE; - PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo; +} + +void ex_halbtc8723b1ant_init_hw_config(IN struct btc_coexist *btcoexist, + IN boolean wifi_only) +{ + halbtc8723b1ant_init_hw_config(btcoexist, true, wifi_only); + btcoexist->stop_coex_dm = false; +} + +void ex_halbtc8723b1ant_init_coex_dm(IN struct btc_coexist *btcoexist) +{ + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], Coex Mechanism Init!!\n"); + BTC_TRACE(trace_buf); + + btcoexist->stop_coex_dm = false; - pCoexSta->bC2hBtInfoReqSent = FALSE; + halbtc8723b1ant_init_coex_dm(btcoexist); - rspSource = tmpBuf[0]&0xf; - if(rspSource >= BT_INFO_SRC_8723B_1ANT_MAX) - rspSource = BT_INFO_SRC_8723B_1ANT_WIFI_FW; - pCoexSta->btInfoC2hCnt[rspSource]++; + halbtc8723b1ant_query_bt_info(btcoexist); +} - RT_TRACE(COMP_COEX, DBG_LOUD, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length)); - for(i=0; ibtInfoC2h[rspSource][i] = tmpBuf[i]; - if(i == 1) - btInfo = tmpBuf[i]; - if(i == length-1) - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x]\n", tmpBuf[i])); - } - else - { - RT_TRACE(COMP_COEX, DBG_LOUD, ("0x%02x, ", tmpBuf[i])); +void ex_halbtc8723b1ant_display_coex_info(IN struct btc_coexist *btcoexist) +{ + struct btc_board_info *board_info = &btcoexist->board_info; + struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + u8 *cli_buf = btcoexist->cli_buf; + u8 u8tmp[4], i, bt_info_ext, ps_tdma_case=0; + u16 u16tmp[4]; + u32 u32tmp[4]; + u32 fa_ofdm, fa_cck; + u32 fw_ver=0, bt_patch_ver=0; + static u8 pop_report_in_10s = 0; + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[BT Coexist info]============"); + CL_PRINTF(cli_buf); + + if(btcoexist->manual_control) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[Under Manual Control]============"); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n =========================================="); + CL_PRINTF(cli_buf); + } + if(btcoexist->stop_coex_dm) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n ============[Coex is STOPPED]============"); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n =========================================="); + CL_PRINTF(cli_buf); + } + + if (psd_scan->ant_det_try_count == 0) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", + "Ant PG Num/ Mech/ Pos", + board_info->pg_ant_num, board_info->btdm_ant_num, + board_info->btdm_ant_pos); + CL_PRINTF(cli_buf); + } else { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %d/ %d/ %d (%d/%d/%d)", + "Ant PG Num/ Mech(Ant_Det)/ Pos", + board_info->pg_ant_num, board_info->btdm_ant_num_by_ant_det, + board_info->btdm_ant_pos, + psd_scan->ant_det_try_count, psd_scan->ant_det_fail_count, + psd_scan->ant_det_result); + CL_PRINTF(cli_buf); + + if (board_info->btdm_ant_det_finish) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", + "Ant Det PSD Value", + psd_scan->ant_det_peak_val); + CL_PRINTF(cli_buf); } } - // if 0xff, it means BT is under WHCK test - if (btInfo == 0xff) - pCoexSta->bBtWhckTest = TRUE; - else - pCoexSta->bBtWhckTest = FALSE; + btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver); + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)/ %c", + "Version Coex/ Fw/ Patch/ Cut", + glcoex_ver_date_8723b_1ant, glcoex_ver_8723b_1ant, fw_ver, + bt_patch_ver, bt_patch_ver, coex_sta->cut_version + 65); + CL_PRINTF(cli_buf); - if(BT_INFO_SRC_8723B_1ANT_WIFI_FW != rspSource) - { - pCoexSta->btRetryCnt = // [3:0] - pCoexSta->btInfoC2h[rspSource][2]&0xf; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", + "Wifi channel informed to BT", + coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1], + coex_dm->wifi_chnl_info[2]); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s", + "WifibHiPri/ Ccklock/ CckEverLock", + (coex_sta->wifi_is_high_pri_task ? "Yes" : "No"), + (coex_sta->cck_lock ? "Yes" : "No"), + (coex_sta->cck_ever_lock ? "Yes" : "No")); + CL_PRINTF(cli_buf); - if (pCoexSta->btRetryCnt >= 1) - pCoexSta->popEventCnt++; + /* wifi status */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Wifi Status]============"); + CL_PRINTF(cli_buf); + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS); - if (pCoexSta->btInfoC2h[rspSource][2]&0x20) - pCoexSta->bC2hBtRemoteNameReq = TRUE; - else - pCoexSta->bC2hBtRemoteNameReq = FALSE; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[BT Status]============"); + CL_PRINTF(cli_buf); - pCoexSta->btRssi = - pCoexSta->btInfoC2h[rspSource][3]*2-90; - //pCoexSta->btInfoC2h[rspSource][3]*2+10; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", + "BT Abnormal scan", + (coex_sta->bt_abnormal_scan) ? "Yes" : "No"); + CL_PRINTF(cli_buf); + + pop_report_in_10s++; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d/ %d] ", + "BT [status/ rssi/ retryCnt/ popCnt]", + ((coex_sta->bt_disabled)? ("disabled"): (( + coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") + : ((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == + coex_dm->bt_status) ? "non-connected idle" : + ((BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) + ? "connected-idle" : "busy")))), + coex_sta->bt_rssi, coex_sta->bt_retry_cnt, + coex_sta->pop_event_cnt); + CL_PRINTF(cli_buf); + + if (pop_report_in_10s >= 5) { + coex_sta->pop_event_cnt = 0; + pop_report_in_10s = 0; + } - pCoexSta->btInfoExt = - pCoexSta->btInfoC2h[rspSource][4]; - - if (pCoexSta->btInfoC2h[rspSource][1] == 0x49) - { - pCoexSta->nA2DPBitPool = - pCoexSta->btInfoC2h[rspSource][6]; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %d / %d / %d / %d / %d / %d", + "SCO/HID/PAN/A2DP/NameReq/WHQL", + bt_link_info->sco_exist, bt_link_info->hid_exist, + bt_link_info->pan_exist, bt_link_info->a2dp_exist, + coex_sta->c2h_bt_remote_name_req, + coex_sta->bt_whck_test); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", + "BT Role", + (bt_link_info->slave_role) ? "Slave" : "Master"); + CL_PRINTF(cli_buf); + + bt_info_ext = coex_sta->bt_info_ext; + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %d", + "A2DP Rate/Bitpool", + (bt_info_ext & BIT(0)) ? "BR" : "EDR", coex_sta->a2dp_bit_pool); + CL_PRINTF(cli_buf); + + for (i = 0; i < BT_INFO_SRC_8723B_1ANT_MAX; i++) { + if (coex_sta->bt_info_c2h_cnt[i]) { + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", + glbt_info_src_8723b_1ant[i], + coex_sta->bt_info_c2h[i][0], + coex_sta->bt_info_c2h[i][1], + coex_sta->bt_info_c2h[i][2], + coex_sta->bt_info_c2h[i][3], + coex_sta->bt_info_c2h[i][4], + coex_sta->bt_info_c2h[i][5], + coex_sta->bt_info_c2h[i][6], + coex_sta->bt_info_c2h_cnt[i]); + CL_PRINTF(cli_buf); } - else - pCoexSta->nA2DPBitPool = 0; + } - pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40); - pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask); + + if(btcoexist->manual_control) + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[mechanisms] (before Manual)============"); + else + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[mechanisms]============"); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", + "SM[LowPenaltyRA]", + coex_dm->cur_low_penalty_ra); + CL_PRINTF(cli_buf); + + ps_tdma_case = coex_dm->cur_ps_tdma; + if (board_info->btdm_ant_num_by_ant_det == 2) { + if (coex_dm->cur_ps_tdma_on) + ps_tdma_case = ps_tdma_case + + 100; /* for WiFi RSSI low or BT RSSI low */ + else + ps_tdma_case = + 1; /* always translate to TDMA(off,1) for TDMA-off case */ + } + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)", + "PS TDMA", + coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1], + coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3], + coex_dm->ps_tdma_para[4], ps_tdma_case, + (coex_dm->cur_ps_tdma_on ? "On" : "Off"), + (coex_dm->auto_tdma_adjust ? "Adj" : "Fix")); + + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", + "Coex Table Type", + coex_sta->coex_table_type); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", + "IgnWlanAct", + coex_dm->cur_ignore_wlan_act); + CL_PRINTF(cli_buf); + + /* + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", + coex_dm->error_condition); + CL_PRINTF(cli_buf); + */ + + /* Hw setting */ + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", + "============[Hw setting]============"); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", + "backup ARFR1/ARFR2/RL/AMaxTime", + coex_dm->backup_arfr_cnt1, coex_dm->backup_arfr_cnt2, + coex_dm->backup_retry_limit, + coex_dm->backup_ampdu_max_time); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434); + u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x", + "0x430/0x434/0x42a/0x456", + u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]); + CL_PRINTF(cli_buf); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778); + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x880); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", + "0x778/0x6cc/0x880[29:25]", + u8tmp[0], u32tmp[0], (u32tmp[1] & 0x3e000000) >> 25); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x764); + u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x76e); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", + "0x948/ 0x67[5] / 0x764 / 0x76e", + u32tmp[0], ((u8tmp[0] & 0x20) >> 5), (u32tmp[1] & 0xffff), + u8tmp[1]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930); + u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", + "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]", + u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3); + CL_PRINTF(cli_buf); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39); + u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40); + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c); + u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, + "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", + "0x38[11]/0x40/0x4c[24:23]/0x64[0]", + ((u8tmp[0] & 0x8) >> 3), u8tmp[1], + ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "0x550(bcn ctrl)/0x522", + u32tmp[0], u8tmp[0]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50); + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", + "0xc50(dig)/0x49c(null-drop)", + u32tmp[0] & 0xff, u8tmp[0]); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4); + u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8); + u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0); + + u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b); + u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c); + + fa_ofdm = ((u32tmp[0] & 0xffff0000) >> 16) + ((u32tmp[1] & 0xffff0000) + >> 16) + (u32tmp[1] & 0xffff) + (u32tmp[2] & 0xffff) + + ((u32tmp[3] & 0xffff0000) >> 16) + (u32tmp[3] & + 0xffff) ; + fa_cck = (u8tmp[0] << 8) + u8tmp[1]; + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", + "OFDM-CCA/OFDM-FA/CCK-FA", + u32tmp[0] & 0xffff, fa_ofdm, fa_cck); + CL_PRINTF(cli_buf); + + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", + "CRC_OK CCK/11g/11n/11n-Agg", + coex_sta->crc_ok_cck, coex_sta->crc_ok_11g, + coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_agg); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", + "CRC_Err CCK/11g/11n/11n-Agg", + coex_sta->crc_err_cck, coex_sta->crc_err_11g, + coex_sta->crc_err_11n, coex_sta->crc_err_11n_agg); + CL_PRINTF(cli_buf); + + u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0); + u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4); + u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", + "0x6c0/0x6c4/0x6c8(coexTable)", + u32tmp[0], u32tmp[1], u32tmp[2]); + CL_PRINTF(cli_buf); + + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", + "0x770(high-pri rx/tx)", + coex_sta->high_priority_rx, coex_sta->high_priority_tx); + CL_PRINTF(cli_buf); + CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", + "0x774(low-pri rx/tx)", + coex_sta->low_priority_rx, coex_sta->low_priority_tx); + CL_PRINTF(cli_buf); +#if (BT_AUTO_REPORT_ONLY_8723B_1ANT == 1) + /* halbtc8723b1ant_monitor_bt_ctr(btcoexist); */ +#endif + btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS); +} + + +void ex_halbtc8723b1ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type) +{ + if(btcoexist->manual_control || btcoexist->stop_coex_dm) + return; + + if (BTC_IPS_ENTER == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], IPS ENTER notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_ips = true; + + halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, + FORCE_EXEC, false, true); + halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); + } else if (BTC_IPS_LEAVE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], IPS LEAVE notify\n"); + BTC_TRACE(trace_buf); + + halbtc8723b1ant_init_hw_config(btcoexist, false, false); + halbtc8723b1ant_init_coex_dm(btcoexist); + halbtc8723b1ant_query_bt_info(btcoexist); + + coex_sta->under_ips = false; + } +} + +void ex_halbtc8723b1ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type) +{ + if(btcoexist->manual_control || btcoexist->stop_coex_dm) + return; + + if (BTC_LPS_ENABLE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], LPS ENABLE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_lps = true; + } else if (BTC_LPS_DISABLE == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], LPS DISABLE notify\n"); + BTC_TRACE(trace_buf); + coex_sta->under_lps = false; + } +} + +void ex_halbtc8723b1ant_scan_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + boolean wifi_connected=false, bt_hs_on=false; + u32 wifi_link_status=0; + u32 num_of_wifi_link=0; + boolean bt_ctrl_agg_buf_size=false; + u8 agg_buf_size=5; + + u8 u8tmpa, u8tmpb; + u32 u32tmp; + + if(btcoexist->manual_control || + btcoexist->stop_coex_dm ) + return; + + if (BTC_SCAN_START == type) { + coex_sta->wifi_is_high_pri_task = true; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCAN START notify\n"); + BTC_TRACE(trace_buf); + psd_scan->ant_det_is_ant_det_available = true; + halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, + 8); /* Force antenna setup for no scan result issue */ + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + FORCE_EXEC, false, false); + u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948); + u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765); + u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67); + + + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n", + u32tmp, u8tmpa, u8tmpb); + BTC_TRACE(trace_buf); + } else { + coex_sta->wifi_is_high_pri_task = false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], SCAN FINISH notify\n"); + BTC_TRACE(trace_buf); + + btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, + &coex_sta->scan_ap_num); + } + + if(coex_sta->bt_disabled) + return; + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, +&wifi_connected); + + halbtc8723b1ant_query_bt_info(btcoexist); + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + num_of_wifi_link = wifi_link_status>>16; + if (num_of_wifi_link >= 2) { + halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + halbtc8723b1ant_action_wifi_multi_port(btcoexist); + return; + } + + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8723b1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8723b1ant_action_hs(btcoexist); + return; + } + + if (BTC_SCAN_START == type) { + if (!wifi_connected) /* non-connected scan */ + halbtc8723b1ant_action_wifi_not_connected_scan( + btcoexist); + else /* wifi is connected */ + halbtc8723b1ant_action_wifi_connected_scan(btcoexist); + } else if (BTC_SCAN_FINISH == type) { + if (!wifi_connected) /* non-connected scan */ + halbtc8723b1ant_action_wifi_not_connected(btcoexist); + else + halbtc8723b1ant_action_wifi_connected(btcoexist); + } +} + +void ex_halbtc8723b1ant_connect_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + boolean wifi_connected=false, bt_hs_on=false; + u32 wifi_link_status=0; + u32 num_of_wifi_link=0; + boolean bt_ctrl_agg_buf_size=false; + u8 agg_buf_size=5; + + if(btcoexist->manual_control || + btcoexist->stop_coex_dm || + coex_sta->bt_disabled ) + return; + + if (BTC_ASSOCIATE_START == type) { + coex_sta->wifi_is_high_pri_task = true; + psd_scan->ant_det_is_ant_det_available = true; + halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, + 8); /* Force antenna setup for no scan result issue */ + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + FORCE_EXEC, false, false); + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CONNECT START notify\n"); + BTC_TRACE(trace_buf); + coex_dm->arp_cnt = 0; + } else { + coex_sta->wifi_is_high_pri_task = false; + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], CONNECT FINISH notify\n"); + BTC_TRACE(trace_buf); + /* coex_dm->arp_cnt = 0; */ + } + + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS, + &wifi_link_status); + num_of_wifi_link = wifi_link_status >> 16; + if (num_of_wifi_link >= 2) { + halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); + halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, + bt_ctrl_agg_buf_size, agg_buf_size); + halbtc8723b1ant_action_wifi_multi_port(btcoexist); + return; + } + + btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); + if (coex_sta->c2h_bt_inquiry_page) { + halbtc8723b1ant_action_bt_inquiry(btcoexist); + return; + } else if (bt_hs_on) { + halbtc8723b1ant_action_hs(btcoexist); + return; + } + + if (BTC_ASSOCIATE_START == type) + halbtc8723b1ant_action_wifi_not_connected_asso_auth(btcoexist); + else if (BTC_ASSOCIATE_FINISH == type) { + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, + &wifi_connected); + if (!wifi_connected) /* non-connected scan */ + halbtc8723b1ant_action_wifi_not_connected(btcoexist); + else + halbtc8723b1ant_action_wifi_connected(btcoexist); + } +} + +void ex_halbtc8723b1ant_media_status_notify(IN struct btc_coexist *btcoexist, + IN u8 type) +{ + u8 h2c_parameter[3] ={0}; + u32 wifi_bw; + u8 wifi_central_chnl; + boolean wifi_under_b_mode = false; + + if(btcoexist->manual_control || + btcoexist->stop_coex_dm || + coex_sta->bt_disabled ) + return; + + if (BTC_MEDIA_CONNECT == type) { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], MEDIA connect notify\n"); + BTC_TRACE(trace_buf); + halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, + 8); /* Force antenna setup for no scan result issue */ + halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, + FORCE_EXEC, false, false); + psd_scan->ant_det_is_ant_det_available = true; + btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, + &wifi_under_b_mode); + + /* Set CCK Tx/Rx high Pri except 11b mode */ + if (wifi_under_b_mode) { + btcoexist->btc_write_1byte(btcoexist, 0x6cd, + 0x00); /* CCK Tx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cf, + 0x00); /* CCK Rx */ + } else { + btcoexist->btc_write_1byte(btcoexist, 0x6cd, + 0x00); /* CCK Tx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cf, + 0x10); /* CCK Rx */ + } + + coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist, + 0x430); + coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist, + 0x434); + coex_dm->backup_retry_limit = btcoexist->btc_read_2byte( + btcoexist, 0x42a); + coex_dm->backup_ampdu_max_time = btcoexist->btc_read_1byte( + btcoexist, 0x456); + } else { + BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, + "[BTCoex], MEDIA disconnect notify\n"); + BTC_TRACE(trace_buf); + coex_dm->arp_cnt = 0; + + btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */ + btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */ + + coex_sta->cck_ever_lock = false; + } + + /* only 2.4G we need to inform bt the chnl mask */ + btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, + &wifi_central_chnl); + if ((BTC_MEDIA_CONNECT == type) && + (wifi_central_chnl <= 14)) { + /* h2c_parameter[0] = 0x1; */ + h2c_parameter[0] = 0x0; + h2c_parameter[1] = wifi_central_chnl; + btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_