mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
net: wireless: rockchip_wlan: update rtl8723ds
update rtl8723ds wifi driver to version v5.2.15.1_25011.20171107_COEX20171025-2020 Change-Id: Ifbf94c2ebc7c7d8e529910d77f6094d0ae4f7907 Signed-off-by: Alex Zhao <zzc@rock-chips.com>
This commit is contained in:
parent
5ea7a94a66
commit
c56fa46c21
|
|
@ -21,7 +21,6 @@ EXTRA_CFLAGS += -Wno-date-time # Fix compile error && warning on gcc 4.9 and lat
|
|||
endif
|
||||
|
||||
EXTRA_CFLAGS += -I$(src)/include
|
||||
EXTRA_CFLAGS += -I$(src)/hal/phydm
|
||||
|
||||
EXTRA_LDFLAGS += --strip-debug
|
||||
|
||||
|
|
@ -56,10 +55,11 @@ CONFIG_INTEL_WIDI = n
|
|||
CONFIG_WAPI_SUPPORT = n
|
||||
CONFIG_EFUSE_CONFIG_FILE = y
|
||||
CONFIG_EXT_CLK = n
|
||||
CONFIG_TRAFFIC_PROTECT = y
|
||||
CONFIG_TRAFFIC_PROTECT = n
|
||||
CONFIG_LOAD_PHY_PARA_FROM_FILE = y
|
||||
CONFIG_TXPWR_BY_RATE_EN = y
|
||||
CONFIG_TXPWR_LIMIT_EN = n
|
||||
CONFIG_RTW_CHPLAN = 0xFF
|
||||
CONFIG_RTW_ADAPTIVITY_EN = disable
|
||||
CONFIG_RTW_ADAPTIVITY_MODE = normal
|
||||
CONFIG_SIGNAL_SCALE_MAPPING = n
|
||||
|
|
@ -72,15 +72,17 @@ CONFIG_MCC_MODE = n
|
|||
CONFIG_APPEND_VENDOR_IE_ENABLE = n
|
||||
CONFIG_RTW_NAPI = y
|
||||
CONFIG_RTW_GRO = y
|
||||
CONFIG_RTW_IPCAM_APPLICATION = n
|
||||
CONFIG_RTW_REPEATER_SON = n
|
||||
########################## Debug ###########################
|
||||
CONFIG_RTW_DEBUG = n
|
||||
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
|
||||
CONFIG_RTW_LOG_LEVEL = 2
|
||||
######################## Wake On Lan ##########################
|
||||
CONFIG_WOWLAN = n
|
||||
CONFIG_WAKEUP_TYPE = 0x7 #bit2: deauth, bit1: unicast, bit0: magic pkt.
|
||||
CONFIG_GPIO_WAKEUP = n
|
||||
CONFIG_DEFAULT_PATTERNS_EN = n
|
||||
CONFIG_WAKEUP_GPIO_IDX = default
|
||||
CONFIG_HIGH_ACTIVE = n
|
||||
CONFIG_PNO_SUPPORT = n
|
||||
|
|
@ -92,7 +94,6 @@ CONFIG_RTW_SDIO_PM_KEEP_POWER = y
|
|||
CONFIG_MP_VHT_HW_TX_MODE = n
|
||||
###################### Platform Related #######################
|
||||
CONFIG_PLATFORM_I386_PC = n
|
||||
CONFIG_PLATFORM_ARM_NV_TK1 = n
|
||||
CONFIG_PLATFORM_ANDROID_X86 = n
|
||||
CONFIG_PLATFORM_ANDROID_INTEL_X86 = n
|
||||
CONFIG_PLATFORM_JB_X86 = n
|
||||
|
|
@ -144,11 +145,13 @@ CONFIG_PLATFORM_RTK119X = n
|
|||
CONFIG_PLATFORM_RTK129X = n
|
||||
CONFIG_PLATFORM_NOVATEK_NT72668 = n
|
||||
CONFIG_PLATFORM_HISILICON = n
|
||||
CONFIG_PLATFORM_NV_TK1 = n
|
||||
CONFIG_PLATFORM_RTL8197D = n
|
||||
###############################################################
|
||||
|
||||
CONFIG_DRVEXT_MODULE = n
|
||||
|
||||
export TopDIR ?= $(shell pwd)
|
||||
export TopDIR ?= $(shell pwd)/drivers/net/wireless/rockchip_wlan/rtl8723ds
|
||||
|
||||
########### COMMON #################################
|
||||
ifeq ($(CONFIG_GSPI_HCI), y)
|
||||
|
|
@ -202,63 +205,41 @@ _HAL_INTFS_FILES := hal/hal_intf.o \
|
|||
hal/hal_com_phycfg.o \
|
||||
hal/hal_phy.o \
|
||||
hal/hal_dm.o \
|
||||
hal/hal_dm_acs.o \
|
||||
hal/hal_btcoex_wifionly.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
|
||||
|
||||
|
||||
_OUTSRC_FILES := hal/phydm/phydm_debug.o \
|
||||
hal/phydm/phydm_antdiv.o\
|
||||
hal/phydm/phydm_antdect.o\
|
||||
hal/phydm/phydm_interface.o\
|
||||
hal/phydm/phydm_hwconfig.o\
|
||||
hal/phydm/phydm.o\
|
||||
hal/phydm/halphyrf_ce.o\
|
||||
hal/phydm/phydm_edcaturbocheck.o\
|
||||
hal/phydm/phydm_dig.o\
|
||||
hal/phydm/phydm_pathdiv.o\
|
||||
hal/phydm/phydm_rainfo.o\
|
||||
hal/phydm/phydm_dynamicbbpowersaving.o\
|
||||
hal/phydm/phydm_powertracking_ce.o\
|
||||
hal/phydm/phydm_dynamictxpower.o\
|
||||
hal/phydm/phydm_adaptivity.o\
|
||||
hal/phydm/phydm_cfotracking.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/phydm_hal_txbf_api.o\
|
||||
hal/phydm/phydm_kfree.o\
|
||||
hal/phydm/phydm_ccx.o
|
||||
|
||||
|
||||
EXTRA_CFLAGS += -I$(src)/platform
|
||||
_PLATFORM_FILES := platform/platform_ops.o
|
||||
|
||||
ifeq ($(CONFIG_BT_COEXIST), y)
|
||||
EXTRA_CFLAGS += -I$(src)/hal/btc
|
||||
_OUTSRC_FILES += hal/btc/HalBtc8192e1Ant.o \
|
||||
hal/btc/HalBtc8192e2Ant.o \
|
||||
hal/btc/HalBtc8723b1Ant.o \
|
||||
hal/btc/HalBtc8723b2Ant.o \
|
||||
hal/btc/HalBtc8812a1Ant.o \
|
||||
hal/btc/HalBtc8812a2Ant.o \
|
||||
hal/btc/HalBtc8821a1Ant.o \
|
||||
hal/btc/HalBtc8821a2Ant.o \
|
||||
hal/btc/HalBtc8821aCsr2Ant.o \
|
||||
hal/btc/HalBtc8703b1Ant.o \
|
||||
_BTC_FILES += hal/btc/halbtc8723bwifionly.o \
|
||||
hal/btc/halbtc8822bwifionly.o \
|
||||
hal/btc/halbtc8821cwifionly.o
|
||||
ifeq ($(CONFIG_BT_COEXIST), y)
|
||||
_BTC_FILES += hal/btc/halbtc8192e1ant.o \
|
||||
hal/btc/halbtc8192e2ant.o \
|
||||
hal/btc/halbtc8723b1ant.o \
|
||||
hal/btc/halbtc8723b2ant.o \
|
||||
hal/btc/halbtc8812a1ant.o \
|
||||
hal/btc/halbtc8812a2ant.o \
|
||||
hal/btc/halbtc8821a1ant.o \
|
||||
hal/btc/halbtc8821a2ant.o \
|
||||
hal/btc/halbtc8703b1ant.o \
|
||||
hal/btc/halbtc8723d1ant.o \
|
||||
hal/btc/halbtc8723d2ant.o \
|
||||
hal/btc/HalBtc8822b1Ant.o \
|
||||
hal/btc/halbtc8822b1ant.o \
|
||||
hal/btc/halbtc8822b2ant.o \
|
||||
hal/btc/halbtc8821c1ant.o \
|
||||
hal/btc/halbtc8821c2ant.o
|
||||
endif
|
||||
|
||||
|
||||
include $(TopDIR)/hal/phydm/phydm.mk
|
||||
########### HAL_RTL8188E #################################
|
||||
ifeq ($(CONFIG_RTL8188E), y)
|
||||
|
||||
|
|
@ -318,17 +299,6 @@ ifeq ($(CONFIG_SDIO_HCI), y)
|
|||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_SDIO.o
|
||||
endif
|
||||
|
||||
#hal/OUTSRC/$(RTL871X)/Hal8188EFWImg_CE.o
|
||||
_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8188e_mac.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8188e_bb.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8188e_rf.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8188e_t_fw.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8188e_s_fw.o\
|
||||
hal/phydm/$(RTL871X)/halphyrf_8188e_ce.o\
|
||||
hal/phydm/$(RTL871X)/phydm_regconfig8188e.o\
|
||||
hal/phydm/$(RTL871X)/hal8188erateadaptive.o\
|
||||
hal/phydm/$(RTL871X)/phydm_rtl8188e.o
|
||||
|
||||
endif
|
||||
|
||||
########### HAL_RTL8192E #################################
|
||||
|
|
@ -380,15 +350,9 @@ endif
|
|||
ifeq ($(CONFIG_PCI_HCI), y)
|
||||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8192E_PCIE.o
|
||||
endif
|
||||
|
||||
#hal/OUTSRC/$(RTL871X)/HalHWImg8188E_FW.o
|
||||
_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8192e_mac.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8192e_bb.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8192e_rf.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8192e_fw.o\
|
||||
hal/phydm/$(RTL871X)/halphyrf_8192e_ce.o\
|
||||
hal/phydm/$(RTL871X)/phydm_regconfig8192e.o\
|
||||
hal/phydm/$(RTL871X)/phydm_rtl8192e.o
|
||||
ifeq ($(CONFIG_SDIO_HCI), y)
|
||||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8192E_SDIO.o
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
|
@ -449,20 +413,14 @@ endif
|
|||
ifeq ($(CONFIG_PCI_HCI), y)
|
||||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8821A_PCIE.o
|
||||
endif
|
||||
ifeq ($(CONFIG_SDIO_HCI), y)
|
||||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8821A_SDIO.o
|
||||
endif
|
||||
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\
|
||||
hal/phydm/$(RTL871X)/halhwimg8812a_rf.o\
|
||||
hal/phydm/$(RTL871X)/halphyrf_8812a_ce.o\
|
||||
hal/phydm/$(RTL871X)/phydm_regconfig8812a.o\
|
||||
hal/phydm/$(RTL871X)/phydm_rtl8812a.o\
|
||||
hal/phydm/txbf/haltxbfjaguar.o
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_RTL8821A), y)
|
||||
|
|
@ -489,16 +447,6 @@ 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\
|
||||
hal/phydm/rtl8821a/halhwimg8821a_rf.o\
|
||||
hal/phydm/rtl8812a/halphyrf_8812a_ce.o\
|
||||
hal/phydm/rtl8821a/halphyrf_8821a_ce.o\
|
||||
hal/phydm/rtl8821a/phydm_regconfig8821a.o\
|
||||
hal/phydm/rtl8821a/phydm_rtl8821a.o\
|
||||
hal/phydm/rtl8821a/phydm_iqk_8821a_ce.o\
|
||||
hal/phydm/txbf/haltxbfjaguar.o
|
||||
|
||||
endif
|
||||
|
||||
|
|
@ -530,7 +478,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/$(RTL871X)/hal8723b_fw.o
|
||||
|
||||
_HAL_INTFS_FILES += \
|
||||
hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \
|
||||
|
|
@ -550,23 +498,17 @@ endif
|
|||
ifeq ($(CONFIG_PCI_HCI), y)
|
||||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723B_PCIE.o
|
||||
endif
|
||||
|
||||
_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8723b_bb.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8723b_mac.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8723b_rf.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8723b_fw.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8723b_mp.o\
|
||||
hal/phydm/$(RTL871X)/phydm_regconfig8723b.o\
|
||||
hal/phydm/$(RTL871X)/halphyrf_8723b_ce.o\
|
||||
hal/phydm/$(RTL871X)/phydm_rtl8723b.o
|
||||
ifeq ($(CONFIG_SDIO_HCI), y)
|
||||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723B_SDIO.o
|
||||
endif
|
||||
|
||||
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
|
||||
#EXTRA_CFLAGS += -DCONFIG_MP_VHT_HW_TX_MODE
|
||||
#CONFIG_MP_VHT_HW_TX_MODE = y
|
||||
##########################################
|
||||
RTL871X = rtl8814a
|
||||
ifeq ($(CONFIG_USB_HCI), y)
|
||||
|
|
@ -592,7 +534,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/$(RTL871X)/hal8814a_fw.o
|
||||
|
||||
|
||||
_HAL_INTFS_FILES += \
|
||||
|
|
@ -618,16 +560,6 @@ ifeq ($(CONFIG_PCI_HCI), y)
|
|||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8814A_PCIE.o
|
||||
endif
|
||||
|
||||
_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8814a_bb.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8814a_mac.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8814a_rf.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8814a_fw.o\
|
||||
hal/phydm/$(RTL871X)/phydm_iqk_8814a.o\
|
||||
hal/phydm/$(RTL871X)/phydm_regconfig8814a.o\
|
||||
hal/phydm/$(RTL871X)/halphyrf_8814a_ce.o\
|
||||
hal/phydm/$(RTL871X)/phydm_rtl8814a.o\
|
||||
hal/phydm/txbf/haltxbf8814a.o
|
||||
|
||||
endif
|
||||
|
||||
########### HAL_RTL8723C #################################
|
||||
|
|
@ -659,7 +591,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/$(RTL871X)/hal8703b_fw.o
|
||||
|
||||
_HAL_INTFS_FILES += \
|
||||
hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \
|
||||
|
|
@ -680,12 +612,6 @@ ifeq ($(CONFIG_PCI_HCI), y)
|
|||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8703B_PCIE.o
|
||||
endif
|
||||
|
||||
_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8703b_bb.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8703b_mac.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8703b_rf.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8703b_fw.o\
|
||||
hal/phydm/$(RTL871X)/phydm_regconfig8703b.o\
|
||||
hal/phydm/$(RTL871X)/halphyrf_8703b.o
|
||||
endif
|
||||
|
||||
########### HAL_RTL8723D #################################
|
||||
|
|
@ -740,13 +666,6 @@ 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 #################################
|
||||
|
|
@ -775,7 +694,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/$(RTL871X)/hal8188f_fw.o
|
||||
|
||||
_HAL_INTFS_FILES += \
|
||||
hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \
|
||||
|
|
@ -797,14 +716,6 @@ ifeq ($(CONFIG_SDIO_HCI), y)
|
|||
_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188F_SDIO.o
|
||||
endif
|
||||
|
||||
_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8188f_bb.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8188f_mac.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8188f_rf.o\
|
||||
hal/phydm/$(RTL871X)/halhwimg8188f_fw.o\
|
||||
hal/phydm/$(RTL871X)/phydm_regconfig8188f.o\
|
||||
hal/phydm/$(RTL871X)/halphyrf_8188f.o \
|
||||
hal/phydm/$(RTL871X)/phydm_rtl8188f.o
|
||||
|
||||
endif
|
||||
|
||||
########### HAL_RTL8822B #################################
|
||||
|
|
@ -815,12 +726,6 @@ 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
|
||||
endif
|
||||
|
||||
########### AUTO_CFG #################################
|
||||
|
|
@ -891,7 +796,7 @@ EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"$(USER_EFUSE_MAP_PATH)\"
|
|||
else ifeq ($(MODULE_NAME), 8189es)
|
||||
EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_8189e.map\"
|
||||
else ifeq ($(MODULE_NAME), 8723ds)
|
||||
EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/firmware/wifi_efuse_8723ds.map\"
|
||||
EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/vendor/etc/firmware/wifi_efuse_8723ds.map\"
|
||||
else
|
||||
EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_$(MODULE_NAME).map\"
|
||||
endif
|
||||
|
|
@ -917,8 +822,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=\"\"
|
||||
EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH=\"/lib/firmware/\"
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_TXPWR_BY_RATE_EN), n)
|
||||
|
|
@ -937,6 +841,10 @@ else ifeq ($(CONFIG_TXPWR_LIMIT_EN), auto)
|
|||
EXTRA_CFLAGS += -DCONFIG_TXPWR_LIMIT_EN=2
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_RTW_CHPLAN), 0xFF)
|
||||
EXTRA_CFLAGS += -DCONFIG_RTW_CHPLAN=$(CONFIG_RTW_CHPLAN)
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_CALIBRATE_TX_POWER_BY_REGULATORY
|
||||
endif
|
||||
|
|
@ -966,13 +874,10 @@ EXTRA_CFLAGS += -DCONFIG_IEEE80211W
|
|||
endif
|
||||
|
||||
ifeq ($(CONFIG_WOWLAN), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_WOWLAN
|
||||
EXTRA_CFLAGS += -DCONFIG_WOWLAN -DRTW_WAKEUP_EVENT=$(CONFIG_WAKEUP_TYPE)
|
||||
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)
|
||||
|
|
@ -1018,9 +923,6 @@ EXTRA_CFLAGS += -DCONFIG_BR_EXT
|
|||
EXTRA_CFLAGS += '-DCONFIG_BR_EXT_BRNAME="'$(BR_NAME)'"'
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_ANTENNA_DIVERSITY), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_ANTENNA_DIVERSITY
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_TDLS), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_TDLS
|
||||
|
|
@ -1042,6 +944,17 @@ ifeq ($(CONFIG_RTW_GRO), y)
|
|||
EXTRA_CFLAGS += -DCONFIG_RTW_GRO
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_RTW_REPEATER_SON), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_RTW_REPEATER_SON
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_RTW_IPCAM_APPLICATION), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_RTW_IPCAM_APPLICATION
|
||||
ifeq ($(CONFIG_WIFI_MONITOR), n)
|
||||
EXTRA_CFLAGS += -DCONFIG_WIFI_MONITOR
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_MP_VHT_HW_TX_MODE), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_MP_VHT_HW_TX_MODE
|
||||
ifeq ($(CONFIG_PLATFORM_I386_PC), y)
|
||||
|
|
@ -1074,6 +987,30 @@ KVER := $(shell uname -r)
|
|||
KSRC := /lib/modules/$(KVER)/build
|
||||
MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
|
||||
INSTALL_PREFIX :=
|
||||
STAGINGMODDIR := /lib/modules/$(KVER)/kernel/drivers/staging
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PLATFORM_NV_TK1), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_PLATFORM_NV_TK1
|
||||
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
|
||||
# default setting for Android 4.1, 4.2
|
||||
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
|
||||
EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
|
||||
EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_PLATFORM_ANDROID
|
||||
# Enable this for Android 5.0
|
||||
EXTRA_CFLAGS += -DCONFIG_RADIO_WORK
|
||||
EXTRA_CFLAGS += -DRTW_VENDOR_EXT_SUPPORT
|
||||
EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
|
||||
ARCH ?= arm
|
||||
# for ubuntu environment
|
||||
#CROSS_COMPILE ?=
|
||||
#KVER := $(shell uname -r)
|
||||
#KSRC := /lib/modules/$(KVER)/build
|
||||
#MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
|
||||
#INSTALL_PREFIX :=
|
||||
CROSS_COMPILE := /mnt/newdisk/android_sdk/nvidia_tk1/android_L/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
|
||||
KSRC :=/mnt/newdisk/android_sdk/nvidia_tk1/android_L/out/target/product/shieldtablet/obj/KERNEL/
|
||||
MODULE_NAME = wlan
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PLATFORM_ACTIONS_ATM702X), y)
|
||||
|
|
@ -1155,8 +1092,12 @@ endif
|
|||
ifeq ($(CONFIG_PLATFORM_MSTAR), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
|
||||
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
|
||||
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR -DCONFIG_USE_USB_BUFFER_ALLOC_TX -DCONFIG_FIX_NR_BULKIN_BUFFER -DCONFIG_PREALLOC_RX_SKB_BUFFER
|
||||
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
|
||||
EXTRA_CFLAGS += -DCONFIG_PLATFORM_MSTAR
|
||||
EXTRA_CFLAGS += -DCONFIG_PLATFORM_MSTAR_HIGH
|
||||
ifeq ($(CONFIG_USB_HCI), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX -DCONFIG_FIX_NR_BULKIN_BUFFER
|
||||
endif
|
||||
ARCH:=arm
|
||||
CROSS_COMPILE:= /usr/src/bin/arm-none-linux-gnueabi-
|
||||
KVER:= 3.1.10
|
||||
|
|
@ -1174,6 +1115,7 @@ endif
|
|||
|
||||
ifeq ($(CONFIG_PLATFORM_ANDROID_INTEL_X86), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_PLATFORM_ANDROID_INTEL_X86
|
||||
EXTRA_CFLAGS += -DCONFIG_PLATFORM_INTEL_CHT_ANDROID60 # Kernel 3.14 but has been applied some 4.3 patch
|
||||
EXTRA_CFLAGS += -DCONFIG_PLATFORM_INTEL_BYT
|
||||
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID
|
||||
EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
|
||||
|
|
@ -1195,22 +1137,6 @@ KSRC := /home/android_sdk/android-x86_JB/out/target/product/x86/obj/kernel/
|
|||
MODULE_NAME :=wlan
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PLATFORM_ARM_NV_TK1), y)
|
||||
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_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
|
||||
EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_PLATFORM_ANDROID
|
||||
# Enable this for Android 5.0
|
||||
EXTRA_CFLAGS += -DCONFIG_RADIO_WORK
|
||||
EXTRA_CFLAGS += -DRTW_VENDOR_EXT_SUPPORT
|
||||
ARCH := arm
|
||||
CROSS_COMPILE := /mnt/newdisk/isaac/nvidia/android_ara_5.1/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
|
||||
KSRC :=/mnt/newdisk/isaac/nvidia/android_ara_5.1/out/target/product/jetson/obj/kernel/
|
||||
MODULE_NAME = wlan
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PLATFORM_ARM_PXA2XX), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
|
||||
ARCH := arm
|
||||
|
|
@ -1473,17 +1399,6 @@ KVER:= 2.6.31.6
|
|||
KSRC:= ../code/linux-2.6.31.6-2020/
|
||||
endif
|
||||
|
||||
#Add setting for MN10300
|
||||
ifeq ($(CONFIG_PLATFORM_MN10300), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MN10300
|
||||
ARCH := mn10300
|
||||
CROSS_COMPILE := mn10300-linux-
|
||||
KVER := 2.6.32.2
|
||||
KSRC := /home/winuser/work/Plat_sLD2T_V3010/usr/src/linux-2.6.32.2
|
||||
INSTALL_PREFIX :=
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(CONFIG_PLATFORM_ARM_SUNxI), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
|
||||
EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUNxI
|
||||
|
|
@ -1717,7 +1632,7 @@ 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_IFACE_NUMBER=3
|
||||
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
|
||||
#EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION
|
||||
EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION
|
||||
|
|
@ -1727,9 +1642,9 @@ 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
|
||||
ifeq ($(CONFIG_SDIO_HCI), y)
|
||||
_PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o
|
||||
endif
|
||||
|
||||
ARCH := arm
|
||||
|
||||
|
|
@ -1737,8 +1652,8 @@ ARCH := arm
|
|||
#CROSS_COMPILE := arm-linux-gnueabihf-
|
||||
KVER := 3.10.24
|
||||
#KSRC :=/home/android_sdk/Allwinner/a20/android-kitkat44/lichee/linux-3.4
|
||||
CROSS_COMPILE := $(CROSS)
|
||||
KSRC := $(LINUX_KERNEL_PATH)
|
||||
CROSS_COMPILE := /home/realtek/software_phoenix/phoenix/toolchain/usr/local/arm-2013.11/bin/arm-linux-gnueabihf-
|
||||
KSRC := /home/realtek/software_phoenix/linux-kernel
|
||||
MODULE_NAME := 8192eu
|
||||
|
||||
endif
|
||||
|
|
@ -1752,22 +1667,31 @@ 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
|
||||
# Enable this for Android 5.0
|
||||
EXTRA_CFLAGS += -DCONFIG_RADIO_WORK
|
||||
ifeq ($(CONFIG_RTL8821C)$(CONFIG_SDIO_HCI),yy)
|
||||
EXTRA_CFLAGS += -DCONFIG_WAKEUP_GPIO_INPUT_MODE
|
||||
EXTRA_CFLAGS += -DCONFIG_BT_WAKE_HST_OPEN_DRAIN
|
||||
endif
|
||||
EXTRA_CFLAGS += -Wno-error=date-time
|
||||
|
||||
# default setting for Android 7.0
|
||||
ifeq ($(RTK_ANDROID_VERSION), nougat)
|
||||
EXTRA_CFLAGS += -DRTW_P2P_GROUP_INTERFACE=1
|
||||
endif
|
||||
#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
|
||||
|
||||
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
|
||||
#KVER := 4.1.10
|
||||
#CROSS_COMPILE := $(CROSS)
|
||||
#KSRC := $(LINUX_KERNEL_PATH)
|
||||
CROSS_COMPILE := /home/android_sdk/DHC/trunk-6.0.0_r1-QA160627/phoenix/toolchain/asdk64-4.9.4-a53-EL-3.10-g2.19-a64nt-160307/bin/asdk64-linux-
|
||||
KSRC := /home/android_sdk/DHC/trunk-6.0.0_r1-QA160627/linux-kernel
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PLATFORM_NOVATEK_NT72668), y)
|
||||
|
|
@ -1795,6 +1719,14 @@ KSRC := /home/android_sdk/Telechips/v13.05_r1-tcc-android-4.2.2_tcc893x-evm_buil
|
|||
MODULE_NAME := wlan
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PLATFORM_RTL8197D), y)
|
||||
EXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN -DCONFIG_PLATFORM_RTL8197D
|
||||
export DIR_LINUX=$(shell pwd)/../SDK/rlxlinux-sdk321-v50/linux-2.6.30
|
||||
ARCH ?= rlx
|
||||
CROSS_COMPILE:= $(DIR_LINUX)/../toolchain/rsdk-1.5.5-5281-EB-2.6.30-0.9.30.3-110714/bin/rsdk-linux-
|
||||
KSRC := $(DIR_LINUX)
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_MULTIDRV), y)
|
||||
|
||||
ifeq ($(CONFIG_SDIO_HCI), y)
|
||||
|
|
@ -1838,13 +1770,17 @@ rtk_core := core/rtw_cmd.o \
|
|||
core/rtw_ap.o \
|
||||
core/rtw_xmit.o \
|
||||
core/rtw_p2p.o \
|
||||
core/rtw_rson.o \
|
||||
core/rtw_tdls.o \
|
||||
core/rtw_br_ext.o \
|
||||
core/rtw_iol.o \
|
||||
core/rtw_sreset.o \
|
||||
core/rtw_btcoex_wifionly.o \
|
||||
core/rtw_btcoex.o \
|
||||
core/rtw_beamforming.o \
|
||||
core/rtw_odm.o \
|
||||
core/rtw_rm.o \
|
||||
core/rtw_rm_fsm.o \
|
||||
core/efuse/rtw_efuse.o
|
||||
|
||||
ifeq ($(CONFIG_SDIO_HCI), y)
|
||||
|
|
@ -1860,7 +1796,8 @@ $(MODULE_NAME)-$(CONFIG_WAPI_SUPPORT) += core/rtw_wapi.o \
|
|||
|
||||
$(MODULE_NAME)-y += $(_OS_INTFS_FILES)
|
||||
$(MODULE_NAME)-y += $(_HAL_INTFS_FILES)
|
||||
$(MODULE_NAME)-y += $(_OUTSRC_FILES)
|
||||
$(MODULE_NAME)-y += $(_PHYDM_FILES)
|
||||
$(MODULE_NAME)-y += $(_BTC_FILES)
|
||||
$(MODULE_NAME)-y += $(_PLATFORM_FILES)
|
||||
|
||||
$(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o
|
||||
|
|
@ -1891,6 +1828,40 @@ uninstall:
|
|||
rm -f $(MODDESTDIR)/$(MODULE_NAME).ko
|
||||
/sbin/depmod -a ${KVER}
|
||||
|
||||
backup_rtlwifi:
|
||||
@echo "Making backup rtlwifi drivers"
|
||||
ifneq (,$(wildcard $(STAGINGMODDIR)/rtl*))
|
||||
@tar cPf $(wildcard $(STAGINGMODDIR))/backup_rtlwifi_driver.tar $(wildcard $(STAGINGMODDIR)/rtl*)
|
||||
@rm -rf $(wildcard $(STAGINGMODDIR)/rtl*)
|
||||
endif
|
||||
ifneq (,$(wildcard $(MODDESTDIR)realtek))
|
||||
@tar cPf $(MODDESTDIR)backup_rtlwifi_driver.tar $(MODDESTDIR)realtek
|
||||
@rm -fr $(MODDESTDIR)realtek
|
||||
endif
|
||||
ifneq (,$(wildcard $(MODDESTDIR)rtl*))
|
||||
@tar cPf $(MODDESTDIR)../backup_rtlwifi_driver.tar $(wildcard $(MODDESTDIR)rtl*)
|
||||
@rm -fr $(wildcard $(MODDESTDIR)rtl*)
|
||||
endif
|
||||
@/sbin/depmod -a ${KVER}
|
||||
@echo "Please reboot your system"
|
||||
|
||||
restore_rtlwifi:
|
||||
@echo "Restoring backups"
|
||||
ifneq (,$(wildcard $(STAGINGMODDIR)/backup_rtlwifi_driver.tar))
|
||||
@tar xPf $(STAGINGMODDIR)/backup_rtlwifi_driver.tar
|
||||
@rm $(STAGINGMODDIR)/backup_rtlwifi_driver.tar
|
||||
endif
|
||||
ifneq (,$(wildcard $(MODDESTDIR)backup_rtlwifi_driver.tar))
|
||||
@tar xPf $(MODDESTDIR)backup_rtlwifi_driver.tar
|
||||
@rm $(MODDESTDIR)backup_rtlwifi_driver.tar
|
||||
endif
|
||||
ifneq (,$(wildcard $(MODDESTDIR)../backup_rtlwifi_driver.tar))
|
||||
@tar xPf $(MODDESTDIR)../backup_rtlwifi_driver.tar
|
||||
@rm $(MODDESTDIR)../backup_rtlwifi_driver.tar
|
||||
endif
|
||||
@/sbin/depmod -a ${KVER}
|
||||
@echo "Please reboot your system"
|
||||
|
||||
config_r:
|
||||
@echo "make config"
|
||||
/bin/bash script/Configure script/config.in
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_BR_EXT_C_
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
*
|
||||
******************************************************************************/
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
@ -36,7 +31,7 @@ void MPh2c_timeout_handle(void *FunctionContext)
|
|||
RTW_INFO("[MPT], MPh2c_timeout_handle\n");
|
||||
|
||||
pAdapter = (PADAPTER)FunctionContext;
|
||||
pMptCtx = &pAdapter->mppriv.MptCtx;
|
||||
pMptCtx = &pAdapter->mppriv.mpt_ctx;
|
||||
|
||||
pMptCtx->bMPh2c_timeout = _TRUE;
|
||||
|
||||
|
|
@ -48,7 +43,7 @@ void MPh2c_timeout_handle(void *FunctionContext)
|
|||
|
||||
u32 WaitC2Hevent(PADAPTER pAdapter, u8 *C2H_event, u32 delay_time)
|
||||
{
|
||||
PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
|
||||
PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx);
|
||||
pMptCtx->bMPh2c_timeout = _FALSE;
|
||||
|
||||
if (pAdapter->registrypriv.mp_mode == 0) {
|
||||
|
|
@ -107,7 +102,7 @@ mptbt_SendH2c(
|
|||
{
|
||||
/* KIRQL OldIrql = KeGetCurrentIrql(); */
|
||||
BT_CTRL_STATUS h2cStatus = BT_STATUS_H2C_SUCCESS;
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx);
|
||||
u1Byte i;
|
||||
|
||||
RTW_INFO("[MPT], mptbt_SendH2c()=========>\n");
|
||||
|
|
@ -205,7 +200,7 @@ mptbt_BtFwOpCodeProcess(
|
|||
{
|
||||
u1Byte H2C_Parameter[6] = {0};
|
||||
PBT_H2C pH2c = (PBT_H2C)&H2C_Parameter[0];
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx);
|
||||
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;
|
||||
|
|
@ -266,7 +261,7 @@ mptbt_BtReady(
|
|||
u1Byte retStatus = BT_STATUS_BT_OP_SUCCESS;
|
||||
u1Byte btOpcode;
|
||||
u1Byte btOpcodeVer = 0;
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx);
|
||||
PBT_EXT_C2H pExtC2h = (PBT_EXT_C2H)&pMptCtx->c2hBuf[0];
|
||||
u1Byte i;
|
||||
u1Byte btFwVer = 0, bdAddr[6] = {0};
|
||||
|
|
@ -353,16 +348,16 @@ mptbt_BtReady(
|
|||
|
||||
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);
|
||||
phy_set_bb_reg(Adapter, 0x824, 0xF, 0x0);
|
||||
phy_set_bb_reg(Adapter, 0x824, 0x700000, 0x0);
|
||||
phy_set_rf_reg(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);
|
||||
phy_set_bb_reg(Adapter, 0x824, 0x700000, 0x3);
|
||||
phy_set_bb_reg(Adapter, 0x824, 0xF, 0x2);
|
||||
phy_set_rf_reg(Adapter, RF_PATH_A, 0x0, 0xF0000, 0x3);
|
||||
}
|
||||
|
||||
u4Byte mptbt_switch_RF(PADAPTER Adapter, u1Byte Enter)
|
||||
|
|
@ -468,10 +463,10 @@ MPTBT_FwC2hBtMpCtrl(
|
|||
)
|
||||
{
|
||||
u32 i;
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx);
|
||||
PBT_EXT_C2H pExtC2h = (PBT_EXT_C2H)tmpBuf;
|
||||
|
||||
if (Adapter->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0) {
|
||||
if (GET_HAL_DATA(Adapter)->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0) {
|
||||
/* RTW_INFO("Ignore C2H BT MP Info since not in MP mode\n"); */
|
||||
return;
|
||||
}
|
||||
|
|
@ -537,7 +532,7 @@ mptbt_BtGetGeneral(
|
|||
IN PBT_RSP_CMD pBtRsp
|
||||
)
|
||||
{
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx);
|
||||
PBT_EXT_C2H pExtC2h = (PBT_EXT_C2H)&pMptCtx->c2hBuf[0];
|
||||
u1Byte h2cParaBuf[6] = {0};
|
||||
u1Byte h2cParaLen = 0;
|
||||
|
|
@ -1512,7 +1507,7 @@ mptbt_BtControlProcess(
|
|||
{
|
||||
u1Byte H2C_Parameter[6] = {0};
|
||||
PBT_H2C pH2c = (PBT_H2C)&H2C_Parameter[0];
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
|
||||
PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx);
|
||||
PBT_REQ_CMD pBtReq = (PBT_REQ_CMD)pInBuf;
|
||||
PBT_RSP_CMD pBtRsp;
|
||||
u1Byte i;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2013 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,18 +11,11 @@
|
|||
* 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
|
||||
*
|
||||
*
|
||||
******************************************************************************/
|
||||
#ifdef CONFIG_BT_COEXIST
|
||||
|
||||
*****************************************************************************/
|
||||
#include <drv_types.h>
|
||||
#include <hal_btcoex.h>
|
||||
#include <hal_data.h>
|
||||
|
||||
#ifdef CONFIG_BT_COEXIST
|
||||
#include <hal_btcoex.h>
|
||||
|
||||
void rtw_btcoex_Initialize(PADAPTER padapter)
|
||||
{
|
||||
|
|
@ -34,6 +27,16 @@ void rtw_btcoex_PowerOnSetting(PADAPTER padapter)
|
|||
hal_btcoex_PowerOnSetting(padapter);
|
||||
}
|
||||
|
||||
void rtw_btcoex_AntInfoSetting(PADAPTER padapter)
|
||||
{
|
||||
hal_btcoex_AntInfoSetting(padapter);
|
||||
}
|
||||
|
||||
void rtw_btcoex_PowerOffSetting(PADAPTER padapter)
|
||||
{
|
||||
hal_btcoex_PowerOffSetting(padapter);
|
||||
}
|
||||
|
||||
void rtw_btcoex_PreLoadFirmware(PADAPTER padapter)
|
||||
{
|
||||
hal_btcoex_PreLoadFirmware(padapter);
|
||||
|
|
@ -240,6 +243,16 @@ void rtw_btcoex_switchband_notify(u8 under_scan, u8 band_type)
|
|||
hal_btcoex_switchband_notify(under_scan, band_type);
|
||||
}
|
||||
|
||||
void rtw_btcoex_WlFwDbgInfoNotify(PADAPTER padapter, u8* tmpBuf, u8 length)
|
||||
{
|
||||
hal_btcoex_WlFwDbgInfoNotify(padapter, tmpBuf, length);
|
||||
}
|
||||
|
||||
void rtw_btcoex_rx_rate_change_notify(PADAPTER padapter, u8 is_data_frame, u8 rate_id)
|
||||
{
|
||||
hal_btcoex_rx_rate_change_notify(padapter, is_data_frame, rate_id);
|
||||
}
|
||||
|
||||
void rtw_btcoex_SwitchBtTRxMask(PADAPTER padapter)
|
||||
{
|
||||
hal_btcoex_SwitchBtTRxMask(padapter);
|
||||
|
|
@ -377,11 +390,23 @@ 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);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RF4CE_COEXIST
|
||||
void rtw_btcoex_SetRf4ceLinkState(PADAPTER padapter, u8 state)
|
||||
{
|
||||
hal_btcoex_set_rf4ce_link_state(state);
|
||||
}
|
||||
|
||||
u8 rtw_btcoex_GetRf4ceLinkState(PADAPTER padapter)
|
||||
{
|
||||
return hal_btcoex_get_rf4ce_link_state();
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ==================================================
|
||||
* Below Functions are called by BT-Coex
|
||||
* ================================================== */
|
||||
|
|
@ -403,7 +428,7 @@ void rtw_btcoex_LPS_Enter(PADAPTER padapter)
|
|||
rtw_set_ps_mode(padapter, PS_MODE_MIN, 0, lpsVal, "BTCOEX");
|
||||
}
|
||||
|
||||
void rtw_btcoex_LPS_Leave(PADAPTER padapter)
|
||||
u8 rtw_btcoex_LPS_Leave(PADAPTER padapter)
|
||||
{
|
||||
struct pwrctrl_priv *pwrpriv;
|
||||
|
||||
|
|
@ -415,6 +440,8 @@ void rtw_btcoex_LPS_Leave(PADAPTER padapter)
|
|||
LPS_RF_ON_check(padapter, 100);
|
||||
pwrpriv->bpower_saving = _FALSE;
|
||||
}
|
||||
|
||||
return _TRUE;
|
||||
}
|
||||
|
||||
u16 rtw_btcoex_btreg_read(PADAPTER padapter, u8 type, u16 addr, u32 *data)
|
||||
|
|
@ -459,7 +486,7 @@ u8 rtw_btcoex_get_pg_rfe_type(PADAPTER padapter)
|
|||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
|
||||
return pHalData->RFEType;
|
||||
return pHalData->rfe_type;
|
||||
}
|
||||
|
||||
u8 rtw_btcoex_is_tfbga_package_type(PADAPTER padapter)
|
||||
|
|
@ -468,7 +495,7 @@ u8 rtw_btcoex_is_tfbga_package_type(PADAPTER padapter)
|
|||
|
||||
#ifdef CONFIG_RTL8723B
|
||||
if ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA80)
|
||||
|| (pHalData->PackageType == PACKAGE_TFBGA90))
|
||||
|| (pHalData->PackageType == PACKAGE_TFBGA90))
|
||||
return _TRUE;
|
||||
#endif
|
||||
|
||||
|
|
@ -480,7 +507,7 @@ u8 rtw_btcoex_get_ant_div_cfg(PADAPTER padapter)
|
|||
PHAL_DATA_TYPE pHalData;
|
||||
|
||||
pHalData = GET_HAL_DATA(padapter);
|
||||
|
||||
|
||||
return (pHalData->AntDivCfg == 0) ? _FALSE : _TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -1339,14 +1366,14 @@ void rtw_btcoex_recvmsgbysocket(void *data)
|
|||
/* attend ack */
|
||||
pcoex_info->BT_attend = _TRUE;
|
||||
RTW_INFO("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_btcoex_pta_off_on_notify(pbtcoexadapter, pcoex_info->BT_attend);
|
||||
break;
|
||||
|
||||
case RX_ATTEND_REQ:
|
||||
pcoex_info->BT_attend = _TRUE;
|
||||
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:
|
||||
|
|
@ -1354,21 +1381,21 @@ void rtw_btcoex_recvmsgbysocket(void *data)
|
|||
pcoex_info->BT_attend = _TRUE;
|
||||
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*/
|
||||
pcoex_info->BT_attend = _TRUE;
|
||||
RTW_INFO("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_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;
|
||||
RTW_INFO("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_btcoex_pta_off_on_notify(pbtcoexadapter, pcoex_info->BT_attend);
|
||||
break;
|
||||
|
||||
case RX_BT_LEAVE:
|
||||
|
|
@ -1376,7 +1403,7 @@ void rtw_btcoex_recvmsgbysocket(void *data)
|
|||
rtw_btcoex_sendmsgbysocket(pbtcoexadapter, leave_ack, sizeof(leave_ack), _FALSE); /* no ack */
|
||||
pcoex_info->BT_attend = _FALSE;
|
||||
RTW_INFO("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_btcoex_pta_off_on_notify(pbtcoexadapter, pcoex_info->BT_attend);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -1545,7 +1572,7 @@ void rtw_btcoex_init_socket(_adapter *padapter)
|
|||
pbtcoexadapter = padapter;
|
||||
/* We expect BT is off if BT don't send ack to wifi */
|
||||
RTW_INFO("We expect BT is off if BT send ack to wifi\n");
|
||||
rtw_btcoex_BTOffOnNotify(pbtcoexadapter, _FALSE);
|
||||
rtw_btcoex_pta_off_on_notify(pbtcoexadapter, _FALSE);
|
||||
if (rtw_btcoex_create_kernel_socket(padapter) == _SUCCESS)
|
||||
pcoex_info->is_exist = _TRUE;
|
||||
else {
|
||||
|
|
@ -1715,3 +1742,22 @@ void rtw_btcoex_SendScanNotify(PADAPTER padapter, u8 scanType)
|
|||
}
|
||||
#endif /* CONFIG_BT_COEXIST_SOCKET_TRX */
|
||||
#endif /* CONFIG_BT_COEXIST */
|
||||
|
||||
void rtw_btcoex_set_ant_info(PADAPTER padapter)
|
||||
{
|
||||
#ifdef CONFIG_BT_COEXIST
|
||||
PHAL_DATA_TYPE hal = GET_HAL_DATA(padapter);
|
||||
|
||||
if (hal->EEPROMBluetoothCoexist == _TRUE) {
|
||||
u8 bMacPwrCtrlOn = _FALSE;
|
||||
|
||||
rtw_btcoex_AntInfoSetting(padapter);
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
|
||||
if (bMacPwrCtrlOn == _TRUE)
|
||||
rtw_btcoex_PowerOnSetting(padapter);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
rtw_btcoex_wifionly_AntInfoSetting(padapter);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,42 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2013 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <drv_types.h>
|
||||
#include <hal_btcoex_wifionly.h>
|
||||
#include <hal_data.h>
|
||||
|
||||
void rtw_btcoex_wifionly_switchband_notify(PADAPTER padapter)
|
||||
{
|
||||
hal_btcoex_wifionly_switchband_notify(padapter);
|
||||
}
|
||||
|
||||
void rtw_btcoex_wifionly_scan_notify(PADAPTER padapter)
|
||||
{
|
||||
hal_btcoex_wifionly_scan_notify(padapter);
|
||||
}
|
||||
|
||||
void rtw_btcoex_wifionly_hw_config(PADAPTER padapter)
|
||||
{
|
||||
hal_btcoex_wifionly_hw_config(padapter);
|
||||
}
|
||||
|
||||
void rtw_btcoex_wifionly_initialize(PADAPTER padapter)
|
||||
{
|
||||
hal_btcoex_wifionly_initlizevariables(padapter);
|
||||
}
|
||||
|
||||
void rtw_btcoex_wifionly_AntInfoSetting(PADAPTER padapter)
|
||||
{
|
||||
hal_btcoex_wifionly_AntInfoSetting(padapter);
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_CMD_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
@ -38,8 +33,7 @@ sint _rtw_init_cmd_priv(struct cmd_priv *pcmdpriv)
|
|||
|
||||
_rtw_init_sema(&(pcmdpriv->cmd_queue_sema), 0);
|
||||
/* _rtw_init_sema(&(pcmdpriv->cmd_done_sema), 0); */
|
||||
_rtw_init_sema(&(pcmdpriv->terminate_cmdthread_sema), 0);
|
||||
|
||||
_rtw_init_sema(&(pcmdpriv->start_cmdthread_sema), 0);
|
||||
|
||||
_rtw_init_queue(&(pcmdpriv->cmd_queue));
|
||||
|
||||
|
|
@ -151,7 +145,6 @@ sint _rtw_init_evt_priv(struct evt_priv *pevtpriv)
|
|||
#ifdef CONFIG_EVENT_THREAD_MODE
|
||||
|
||||
_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) {
|
||||
|
|
@ -204,8 +197,6 @@ void _rtw_free_evt_priv(struct evt_priv *pevtpriv)
|
|||
|
||||
#ifdef CONFIG_EVENT_THREAD_MODE
|
||||
_rtw_free_sema(&(pevtpriv->evt_notify));
|
||||
_rtw_free_sema(&(pevtpriv->terminate_evtthread_sema));
|
||||
|
||||
|
||||
if (pevtpriv->evt_allocated_buf)
|
||||
rtw_mfree(pevtpriv->evt_allocated_buf, MAX_EVTSZ + 4);
|
||||
|
|
@ -236,7 +227,7 @@ void _rtw_free_cmd_priv(struct cmd_priv *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->terminate_cmdthread_sema));
|
||||
_rtw_free_sema(&(pcmdpriv->start_cmdthread_sema));
|
||||
|
||||
if (pcmdpriv->cmd_allocated_buf)
|
||||
rtw_mfree(pcmdpriv->cmd_allocated_buf, MAX_CMDSZ + CMDBUFF_ALIGN_SZ);
|
||||
|
|
@ -532,12 +523,10 @@ void rtw_free_cmd_obj(struct cmd_obj *pcmd)
|
|||
|
||||
void rtw_stop_cmd_thread(_adapter *adapter)
|
||||
{
|
||||
if (adapter->cmdThread &&
|
||||
ATOMIC_READ(&(adapter->cmdpriv.cmdthd_running)) == _TRUE &&
|
||||
adapter->cmdpriv.stop_req == 0) {
|
||||
adapter->cmdpriv.stop_req = 1;
|
||||
if (adapter->cmdThread) {
|
||||
_rtw_up_sema(&adapter->cmdpriv.cmd_queue_sema);
|
||||
_rtw_down_sema(&adapter->cmdpriv.terminate_cmdthread_sema);
|
||||
rtw_thread_stop(adapter->cmdThread);
|
||||
adapter->cmdThread = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -546,7 +535,7 @@ thread_return rtw_cmd_thread(thread_context context)
|
|||
u8 ret;
|
||||
struct cmd_obj *pcmd;
|
||||
u8 *pcmdbuf, *prspbuf;
|
||||
u32 cmd_start_time;
|
||||
systime cmd_start_time;
|
||||
u32 cmd_process_time;
|
||||
u8(*cmd_hdl)(_adapter *padapter, u8 *pbuf);
|
||||
void (*pcmd_callback)(_adapter *dev, struct cmd_obj *pcmd);
|
||||
|
|
@ -559,10 +548,8 @@ thread_return rtw_cmd_thread(thread_context context)
|
|||
|
||||
pcmdbuf = pcmdpriv->cmd_buf;
|
||||
prspbuf = pcmdpriv->rsp_buf;
|
||||
|
||||
pcmdpriv->stop_req = 0;
|
||||
ATOMIC_SET(&(pcmdpriv->cmdthd_running), _TRUE);
|
||||
_rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
|
||||
_rtw_up_sema(&pcmdpriv->start_cmdthread_sema);
|
||||
|
||||
|
||||
while (1) {
|
||||
|
|
@ -572,16 +559,10 @@ thread_return rtw_cmd_thread(thread_context context)
|
|||
}
|
||||
|
||||
if (RTW_CANNOT_RUN(padapter)) {
|
||||
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) {
|
||||
RTW_PRINT(FUNC_ADPT_FMT" stop_req:%u, break\n", FUNC_ADPT_ARG(padapter), pcmdpriv->stop_req);
|
||||
RTW_DBG(FUNC_ADPT_FMT "- bDriverStopped(%s) bSurpriseRemoved(%s)\n",
|
||||
FUNC_ADPT_ARG(padapter),
|
||||
rtw_is_drv_stopped(padapter) ? "True" : "False",
|
||||
rtw_is_surprise_removed(padapter) ? "True" : "False");
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -681,8 +662,7 @@ thread_return rtw_cmd_thread(thread_context context)
|
|||
_enter_critical_mutex(&(pcmd->padapter->cmdpriv.sctx_mutex), NULL);
|
||||
if (pcmd->sctx) {
|
||||
if (0)
|
||||
RTW_PRINT(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
|
||||
|
|
@ -738,14 +718,22 @@ thread_return rtw_cmd_thread(thread_context context)
|
|||
rtw_mfree(extra_parm->pbuf, extra_parm->size);
|
||||
}
|
||||
|
||||
_enter_critical_mutex(&(pcmd->padapter->cmdpriv.sctx_mutex), NULL);
|
||||
if (pcmd->sctx) {
|
||||
if (0)
|
||||
RTW_PRINT(FUNC_ADPT_FMT" pcmd->sctx\n", FUNC_ADPT_ARG(pcmd->padapter));
|
||||
rtw_sctx_done_err(&pcmd->sctx, RTW_SCTX_DONE_CMD_DROP);
|
||||
}
|
||||
_exit_critical_mutex(&(pcmd->padapter->cmdpriv.sctx_mutex), NULL);
|
||||
|
||||
rtw_free_cmd_obj(pcmd);
|
||||
} while (1);
|
||||
|
||||
_rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
|
||||
RTW_INFO(FUNC_ADPT_FMT " Exit\n", FUNC_ADPT_ARG(padapter));
|
||||
|
||||
rtw_thread_wait_stop();
|
||||
|
||||
thread_exit();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -854,13 +842,21 @@ u8 rtw_setstandby_cmd(_adapter *padapter, uint action)
|
|||
return ret;
|
||||
}
|
||||
|
||||
void rtw_init_sitesurvey_parm(_adapter *padapter, struct sitesurvey_parm *pparm)
|
||||
{
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
|
||||
_rtw_memset(pparm, 0, sizeof(struct sitesurvey_parm));
|
||||
pparm->scan_mode = pmlmepriv->scan_mode;
|
||||
}
|
||||
|
||||
/*
|
||||
rtw_sitesurvey_cmd(~)
|
||||
### NOTE:#### (!!!!)
|
||||
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)
|
||||
u8 rtw_sitesurvey_cmd(_adapter *padapter, struct sitesurvey_parm *pparm)
|
||||
{
|
||||
u8 res = _FAIL;
|
||||
struct cmd_obj *ph2c;
|
||||
|
|
@ -871,7 +867,6 @@ u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *ssid, int ssid_num,
|
|||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
#endif /* CONFIG_P2P */
|
||||
|
||||
|
||||
#ifdef CONFIG_LPS
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
|
||||
rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1);
|
||||
|
|
@ -892,60 +887,25 @@ u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *ssid, int ssid_num,
|
|||
return _FAIL;
|
||||
}
|
||||
|
||||
if (pparm)
|
||||
_rtw_memcpy(psurveyPara, pparm, sizeof(struct sitesurvey_parm));
|
||||
else
|
||||
psurveyPara->scan_mode = pmlmepriv->scan_mode;
|
||||
|
||||
rtw_free_network_queue(padapter, _FALSE);
|
||||
|
||||
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey));
|
||||
|
||||
/* psurveyPara->bsslimit = 48; */
|
||||
psurveyPara->scan_mode = pmlmepriv->scan_mode;
|
||||
|
||||
/* prepare ssid list */
|
||||
if (ssid) {
|
||||
int i;
|
||||
for (i = 0; i < ssid_num && i < RTW_SSID_SCAN_AMOUNT; i++) {
|
||||
if (ssid[i].SsidLength) {
|
||||
_rtw_memcpy(&psurveyPara->ssid[i], &ssid[i], sizeof(NDIS_802_11_SSID));
|
||||
psurveyPara->ssid_num++;
|
||||
if (0)
|
||||
RTW_INFO(FUNC_ADPT_FMT" ssid:(%s, %d)\n", FUNC_ADPT_ARG(padapter),
|
||||
psurveyPara->ssid[i].Ssid, psurveyPara->ssid[i].SsidLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* prepare channel list */
|
||||
if (ch) {
|
||||
int i;
|
||||
for (i = 0; i < ch_num && i < RTW_CHANNEL_SCAN_AMOUNT; i++) {
|
||||
if (ch[i].hw_value && !(ch[i].flags & RTW_IEEE80211_CHAN_DISABLED)) {
|
||||
_rtw_memcpy(&psurveyPara->ch[i], &ch[i], sizeof(struct rtw_ieee80211_channel));
|
||||
psurveyPara->ch_num++;
|
||||
if (0)
|
||||
RTW_INFO(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter),
|
||||
psurveyPara->ch[i].hw_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set_fwstate(pmlmepriv, _FW_UNDER_SURVEY);
|
||||
|
||||
res = rtw_enqueue_cmd(pcmdpriv, ph2c);
|
||||
|
||||
if (res == _SUCCESS) {
|
||||
u32 scan_timeout_ms;
|
||||
|
||||
pmlmepriv->scan_start_time = rtw_get_current_time();
|
||||
|
||||
#ifdef CONFIG_SCAN_BACKOP
|
||||
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 */
|
||||
mlme_set_scan_to_timer(pmlmepriv, CONC_SCANNING_TIMEOUT_SINGLE_BAND);
|
||||
} else
|
||||
#endif /* CONFIG_SCAN_BACKOP */
|
||||
mlme_set_scan_to_timer(pmlmepriv, SCANNING_TIMEOUT);
|
||||
scan_timeout_ms = rtw_scan_timeout_decision(padapter);
|
||||
mlme_set_scan_to_timer(pmlmepriv,scan_timeout_ms);
|
||||
|
||||
rtw_led_control(padapter, LED_CTL_SITE_SURVEY);
|
||||
} else
|
||||
|
|
@ -1268,7 +1228,7 @@ static u8 rtw_createbss_cmd(_adapter *adapter, int flags, bool adhoc
|
|||
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)) {
|
||||
if (!rtw_chset_is_chbw_valid(adapter_to_chset(adapter), req_ch, req_bw, req_offset)) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
|
@ -1371,6 +1331,7 @@ u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network *pnetwork)
|
|||
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);
|
||||
struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
|
||||
u32 tmp_len;
|
||||
u8 *ptmp = NULL;
|
||||
#ifdef CONFIG_RTW_80211R
|
||||
|
|
@ -1408,12 +1369,9 @@ u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network *pnetwork)
|
|||
set_fwstate(pmlmepriv, WIFI_STATION_STATE);
|
||||
break;
|
||||
|
||||
case Ndis802_11APMode:
|
||||
case Ndis802_11AutoUnknown:
|
||||
case Ndis802_11InfrastructureMax:
|
||||
case Ndis802_11Monitor:
|
||||
default:
|
||||
rtw_warn_on(1);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1461,6 +1419,9 @@ u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network *pnetwork)
|
|||
pqospriv->qos_option = 0;
|
||||
|
||||
if (pregistrypriv->wmm_enable) {
|
||||
#ifdef CONFIG_WMMPS_STA
|
||||
rtw_uapsd_use_default_setting(padapter);
|
||||
#endif /* CONFIG_WMMPS_STA */
|
||||
tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength);
|
||||
|
||||
if (psecnetwork->IELength != tmp_len) {
|
||||
|
|
@ -1483,8 +1444,6 @@ u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network *pnetwork)
|
|||
(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,
|
||||
|
|
@ -1497,7 +1456,7 @@ u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network *pnetwork)
|
|||
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))
|
||||
&& (!rfctl->country_ent || COUNTRY_CHPLAN_EN_11AC(rfctl->country_ent))
|
||||
) {
|
||||
rtw_restructure_vht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0],
|
||||
pnetwork->network.IELength, &psecnetwork->IELength);
|
||||
|
|
@ -1580,11 +1539,13 @@ u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network *pnetwork)
|
|||
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, int flags) /* for sta_mode */
|
||||
{
|
||||
struct cmd_obj *cmdobj = NULL;
|
||||
struct disconnect_parm *param = NULL;
|
||||
struct cmd_priv *cmdpriv = &padapter->cmdpriv;
|
||||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
struct submit_ctx sctx;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
|
||||
|
|
@ -1597,8 +1558,13 @@ u8 rtw_disassoc_cmd(_adapter *padapter, u32 deauth_timeout_ms, bool enqueue) /*
|
|||
}
|
||||
param->deauth_timeout_ms = deauth_timeout_ms;
|
||||
|
||||
if (enqueue) {
|
||||
/* need enqueue, prepare cmd_obj and enqueue */
|
||||
if (flags & RTW_CMDF_DIRECTLY) {
|
||||
/* no need to enqueue, do the cmd hdl directly and free cmd parameter */
|
||||
if (disconnect_hdl(padapter, (u8 *)param) != H2C_SUCCESS)
|
||||
res = _FAIL;
|
||||
rtw_mfree((u8 *)param, sizeof(*param));
|
||||
|
||||
} else {
|
||||
cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(*cmdobj));
|
||||
if (cmdobj == NULL) {
|
||||
res = _FAIL;
|
||||
|
|
@ -1606,12 +1572,18 @@ u8 rtw_disassoc_cmd(_adapter *padapter, u32 deauth_timeout_ms, bool enqueue) /*
|
|||
goto exit;
|
||||
}
|
||||
init_h2fwcmd_w_parm_no_rsp(cmdobj, param, _DisConnect_CMD_);
|
||||
if (flags & RTW_CMDF_WAIT_ACK) {
|
||||
cmdobj->sctx = &sctx;
|
||||
rtw_sctx_init(&sctx, 2000);
|
||||
}
|
||||
res = rtw_enqueue_cmd(cmdpriv, cmdobj);
|
||||
} else {
|
||||
/* no need to enqueue, do the cmd hdl directly and free cmd parameter */
|
||||
if (H2C_SUCCESS != disconnect_hdl(padapter, (u8 *)param))
|
||||
res = _FAIL;
|
||||
rtw_mfree((u8 *)param, sizeof(*param));
|
||||
if (res == _SUCCESS && (flags & RTW_CMDF_WAIT_ACK)) {
|
||||
rtw_sctx_wait(&sctx, __func__);
|
||||
_enter_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
|
||||
if (sctx.status == RTW_SCTX_SUBMITTED)
|
||||
cmdobj->sctx = NULL;
|
||||
_exit_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
|
|
@ -1674,7 +1646,7 @@ u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 key_type, bool
|
|||
goto exit;
|
||||
}
|
||||
|
||||
_rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);
|
||||
_rtw_memcpy(psetstakey_para->addr, sta->cmn.mac_addr, ETH_ALEN);
|
||||
|
||||
if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
|
||||
psetstakey_para->algorithm = (unsigned char) psecuritypriv->dot11PrivacyAlgrthm;
|
||||
|
|
@ -1736,10 +1708,14 @@ u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue)
|
|||
s16 cam_id = 0;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
if (!sta) {
|
||||
RTW_ERR("%s sta == NULL\n", __func__);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (!enqueue) {
|
||||
while ((cam_id = rtw_camid_search(padapter, sta->hwaddr, -1, -1)) >= 0) {
|
||||
RTW_PRINT("clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(sta->hwaddr), cam_id);
|
||||
while ((cam_id = rtw_camid_search(padapter, sta->cmn.mac_addr, -1, -1)) >= 0) {
|
||||
RTW_PRINT("clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(sta->cmn.mac_addr), cam_id);
|
||||
clear_cam_entry(padapter, cam_id);
|
||||
rtw_camid_free(padapter, cam_id);
|
||||
}
|
||||
|
|
@ -1769,7 +1745,7 @@ u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue)
|
|||
ph2c->rsp = (u8 *) psetstakey_rsp;
|
||||
ph2c->rspsz = sizeof(struct set_stakey_rsp);
|
||||
|
||||
_rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);
|
||||
_rtw_memcpy(psetstakey_para->addr, sta->cmn.mac_addr, ETH_ALEN);
|
||||
|
||||
psetstakey_para->algorithm = _NO_PRIVACY_;
|
||||
|
||||
|
|
@ -2088,12 +2064,12 @@ u8 rtw_dynamic_chk_wk_cmd(_adapter *padapter)
|
|||
|
||||
}
|
||||
|
||||
u8 rtw_set_ch_cmd(_adapter *padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue)
|
||||
u8 rtw_set_chbw_cmd(_adapter *padapter, u8 ch, u8 bw, u8 ch_offset, u8 flags)
|
||||
{
|
||||
struct cmd_obj *pcmdobj;
|
||||
struct set_ch_parm *set_ch_parm;
|
||||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
|
||||
struct submit_ctx sctx;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
|
||||
|
|
@ -2112,7 +2088,13 @@ u8 rtw_set_ch_cmd(_adapter *padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue)
|
|||
set_ch_parm->bw = bw;
|
||||
set_ch_parm->ch_offset = ch_offset;
|
||||
|
||||
if (enqueue) {
|
||||
if (flags & RTW_CMDF_DIRECTLY) {
|
||||
/* no need to enqueue, do the cmd hdl directly and free cmd parameter */
|
||||
if (H2C_SUCCESS != rtw_set_chbw_hdl(padapter, (u8 *)set_ch_parm))
|
||||
res = _FAIL;
|
||||
|
||||
rtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm));
|
||||
} else {
|
||||
/* need enqueue, prepare cmd_obj and enqueue */
|
||||
pcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj));
|
||||
if (pcmdobj == NULL) {
|
||||
|
|
@ -2122,13 +2104,21 @@ u8 rtw_set_ch_cmd(_adapter *padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue)
|
|||
}
|
||||
|
||||
init_h2fwcmd_w_parm_no_rsp(pcmdobj, set_ch_parm, GEN_CMD_CODE(_SetChannel));
|
||||
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))
|
||||
res = _FAIL;
|
||||
|
||||
rtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm));
|
||||
if (flags & RTW_CMDF_WAIT_ACK) {
|
||||
pcmdobj->sctx = &sctx;
|
||||
rtw_sctx_init(&sctx, 10 * 1000);
|
||||
}
|
||||
|
||||
res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
|
||||
|
||||
if (res == _SUCCESS && (flags & RTW_CMDF_WAIT_ACK)) {
|
||||
rtw_sctx_wait(&sctx, __func__);
|
||||
_enter_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
|
||||
if (sctx.status == RTW_SCTX_SUBMITTED)
|
||||
pcmdobj->sctx = NULL;
|
||||
_exit_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* do something based on res... */
|
||||
|
|
@ -2239,7 +2229,7 @@ inline u8 rtw_set_country_cmd(_adapter *adapter, int flags, const char *country_
|
|||
|
||||
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);
|
||||
return _rtw_set_chplan_cmd(adapter, flags, RTW_CHPLAN_UNSPECIFIED, ent, swconfig);
|
||||
}
|
||||
|
||||
u8 rtw_led_blink_cmd(_adapter *padapter, PVOID pLed)
|
||||
|
|
@ -2564,7 +2554,9 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
|
|||
LPS_Leave(padapter, "TRAFFIC_BUSY");
|
||||
else {
|
||||
#ifdef CONFIG_CONCURRENT_MODE
|
||||
#ifndef CONFIG_FW_MULTI_PORT_SUPPORT
|
||||
if (padapter->hw_port == HW_PORT0)
|
||||
#endif
|
||||
#endif
|
||||
rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_TRAFFIC_BUSY, 1);
|
||||
}
|
||||
|
|
@ -2589,6 +2581,12 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
|
|||
|
||||
session_tracker_chk_cmd(padapter, NULL);
|
||||
|
||||
#ifdef CONFIG_BEAMFORMING
|
||||
#ifdef RTW_BEAMFORMING_VERSION_2
|
||||
rtw_bf_update_traffic(padapter);
|
||||
#endif /* RTW_BEAMFORMING_VERSION_2 */
|
||||
#endif /* CONFIG_BEAMFORMING */
|
||||
|
||||
pmlmepriv->LinkDetectInfo.NumRxOkInPeriod = 0;
|
||||
pmlmepriv->LinkDetectInfo.NumTxOkInPeriod = 0;
|
||||
pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod = 0;
|
||||
|
|
@ -2616,20 +2614,23 @@ static void dynamic_update_bcn_check(_adapter *padapter)
|
|||
if (!MLME_IS_AP(padapter))
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_80211N_HT
|
||||
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)
|
||||
|
|
@ -2644,9 +2645,9 @@ static void dynamic_update_bcn_check(_adapter *padapter)
|
|||
ATOMIC_SET(&pmlmepriv->olbc_ht, _FALSE);
|
||||
count = 0;
|
||||
}
|
||||
|
||||
count ++;
|
||||
}
|
||||
#endif /* CONFIG_80211N_HT */
|
||||
}
|
||||
void rtw_iface_dynamic_chk_wk_hdl(_adapter *padapter)
|
||||
{
|
||||
|
|
@ -2654,7 +2655,7 @@ void rtw_iface_dynamic_chk_wk_hdl(_adapter *padapter)
|
|||
|
||||
#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
|
||||
#ifdef CONFIG_AP_MODE
|
||||
if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
|
||||
if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter))
|
||||
expire_timeout_chk(padapter);
|
||||
#endif
|
||||
#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */
|
||||
|
|
@ -2837,7 +2838,7 @@ u8 rtw_lps_ctrl_wk_cmd(_adapter *padapter, u8 lps_ctrl_type, u8 enqueue)
|
|||
|
||||
void rtw_dm_in_lps_hdl(_adapter *padapter)
|
||||
{
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_DM_IN_LPS, NULL);
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_DM_IN_LPS_LCLK, NULL);
|
||||
}
|
||||
|
||||
u8 rtw_dm_in_lps_wk_cmd(_adapter *padapter)
|
||||
|
|
@ -3250,6 +3251,79 @@ inline u8 p2p_cancel_roch_cmd(_adapter *adapter, u64 cookie, struct wireless_dev
|
|||
{
|
||||
return _p2p_roch_cmd(adapter, cookie, wdev, NULL, 0, 0, flags);
|
||||
}
|
||||
|
||||
inline u8 rtw_mgnt_tx_cmd(_adapter *adapter, u8 tx_ch, u8 no_cck, const u8 *buf, size_t len, int wait_ack, u8 flags)
|
||||
{
|
||||
struct cmd_obj *cmdobj;
|
||||
struct drvextra_cmd_parm *parm;
|
||||
struct mgnt_tx_parm *mgnt_parm;
|
||||
struct cmd_priv *pcmdpriv = &adapter->cmdpriv;
|
||||
struct submit_ctx sctx;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
mgnt_parm = (struct mgnt_tx_parm *)rtw_zmalloc(sizeof(struct mgnt_tx_parm));
|
||||
if (mgnt_parm == NULL) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
mgnt_parm->tx_ch = tx_ch;
|
||||
mgnt_parm->no_cck = no_cck;
|
||||
mgnt_parm->buf = buf;
|
||||
mgnt_parm->len = len;
|
||||
mgnt_parm->wait_ack = wait_ack;
|
||||
|
||||
if (flags & RTW_CMDF_DIRECTLY) {
|
||||
/* no need to enqueue, do the cmd hdl directly and free cmd parameter */
|
||||
if (H2C_SUCCESS != rtw_mgnt_tx_handler(adapter, (u8 *)mgnt_parm))
|
||||
res = _FAIL;
|
||||
rtw_mfree((u8 *)mgnt_parm, sizeof(*mgnt_parm));
|
||||
} else {
|
||||
/* need enqueue, prepare cmd_obj and enqueue */
|
||||
parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
|
||||
if (parm == NULL) {
|
||||
rtw_mfree((u8 *)mgnt_parm, sizeof(*mgnt_parm));
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
parm->ec_id = MGNT_TX_WK_CID;
|
||||
parm->type = 0;
|
||||
parm->size = sizeof(*mgnt_parm);
|
||||
parm->pbuf = (u8 *)mgnt_parm;
|
||||
|
||||
cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(*cmdobj));
|
||||
if (cmdobj == NULL) {
|
||||
res = _FAIL;
|
||||
rtw_mfree((u8 *)mgnt_parm, sizeof(*mgnt_parm));
|
||||
rtw_mfree((u8 *)parm, sizeof(*parm));
|
||||
goto exit;
|
||||
}
|
||||
|
||||
init_h2fwcmd_w_parm_no_rsp(cmdobj, parm, GEN_CMD_CODE(_Set_Drv_Extra));
|
||||
|
||||
if (flags & RTW_CMDF_WAIT_ACK) {
|
||||
cmdobj->sctx = &sctx;
|
||||
rtw_sctx_init(&sctx, 10 * 1000);
|
||||
}
|
||||
|
||||
res = rtw_enqueue_cmd(pcmdpriv, cmdobj);
|
||||
|
||||
if (res == _SUCCESS && (flags & RTW_CMDF_WAIT_ACK)) {
|
||||
rtw_sctx_wait(&sctx, __func__);
|
||||
_enter_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
|
||||
if (sctx.status == RTW_SCTX_SUBMITTED)
|
||||
cmdobj->sctx = NULL;
|
||||
_exit_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
|
||||
if (sctx.status != RTW_SCTX_DONE_SUCCESS)
|
||||
res = _FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_IOCTL_CFG80211 */
|
||||
#endif /* CONFIG_P2P */
|
||||
|
||||
|
|
@ -3300,7 +3374,7 @@ static void rtw_chk_hi_queue_hdl(_adapter *padapter)
|
|||
{
|
||||
struct sta_info *psta_bmc;
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
u32 start = rtw_get_current_time();
|
||||
systime start = rtw_get_current_time();
|
||||
u8 empty = _FALSE;
|
||||
|
||||
psta_bmc = rtw_get_bcmc_stainfo(padapter);
|
||||
|
|
@ -3411,7 +3485,7 @@ u8 rtw_dfs_master_hdl(_adapter *adapter)
|
|||
for (i = 0; i < dvobj->iface_nums; i++) {
|
||||
if (!dvobj->padapters[i])
|
||||
continue;
|
||||
if (check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_AP_STATE)
|
||||
if (check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_AP_STATE | WIFI_MESH_STATE)
|
||||
&& check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_ASOC_STATE))
|
||||
break;
|
||||
}
|
||||
|
|
@ -3420,7 +3494,7 @@ u8 rtw_dfs_master_hdl(_adapter *adapter)
|
|||
/* what? */
|
||||
rtw_warn_on(1);
|
||||
} else {
|
||||
rtw_chset_update_non_ocp(dvobj->padapters[i]->mlmeextpriv.channel_set
|
||||
rtw_chset_update_non_ocp(rfctl->channel_set
|
||||
, rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset);
|
||||
rfctl->radar_detected = 1;
|
||||
|
||||
|
|
@ -3440,6 +3514,11 @@ u8 rtw_dfs_master_hdl(_adapter *adapter)
|
|||
|
||||
rtw_hal_set_hwreg(adapter, HW_VAR_TXPAUSE, &pause);
|
||||
rfctl->cac_start_time = rfctl->cac_end_time = RTW_CAC_STOPPED;
|
||||
|
||||
if (rtw_mi_check_fwstate(adapter, WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _FALSE) {
|
||||
ResumeTxBeacon(adapter);
|
||||
rtw_mi_tx_beacon_hdl(adapter);
|
||||
}
|
||||
}
|
||||
|
||||
set_timer:
|
||||
|
|
@ -3483,9 +3562,9 @@ u8 rtw_dfs_master_cmd(_adapter *adapter, bool enqueue)
|
|||
return res;
|
||||
}
|
||||
|
||||
void rtw_dfs_master_timer_hdl(RTW_TIMER_HDL_ARGS)
|
||||
void rtw_dfs_master_timer_hdl(void *ctx)
|
||||
{
|
||||
_adapter *adapter = (_adapter *)FunctionContext;
|
||||
_adapter *adapter = (_adapter *)ctx;
|
||||
|
||||
rtw_dfs_master_cmd(adapter, _TRUE);
|
||||
}
|
||||
|
|
@ -3509,6 +3588,9 @@ void rtw_dfs_master_enable(_adapter *adapter, u8 ch, u8 bw, u8 offset)
|
|||
|
||||
rfctl->radar_detected = 0;
|
||||
|
||||
if (IS_CH_WAITING(rfctl))
|
||||
StopTxBeacon(adapter);
|
||||
|
||||
if (!rfctl->dfs_master_enabled) {
|
||||
RTW_INFO(FUNC_ADPT_FMT" set dfs_master_enabled\n", FUNC_ADPT_ARG(adapter));
|
||||
rfctl->dfs_master_enabled = 1;
|
||||
|
|
@ -3547,6 +3629,11 @@ void rtw_dfs_master_disable(_adapter *adapter, u8 ch, u8 bw, u8 offset, bool by_
|
|||
rfctl->cac_start_time = rfctl->cac_end_time = RTW_CAC_STOPPED;
|
||||
_cancel_timer_ex(&adapter->mlmepriv.dfs_master_timer);
|
||||
|
||||
if (rtw_mi_check_fwstate(adapter, WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _FALSE) {
|
||||
ResumeTxBeacon(adapter);
|
||||
rtw_mi_tx_beacon_hdl(adapter);
|
||||
}
|
||||
|
||||
if (overlap_radar_detect_ch) {
|
||||
u8 pause = 0x00;
|
||||
|
||||
|
|
@ -3583,12 +3670,27 @@ void rtw_dfs_master_status_apply(_adapter *adapter, u8 self_action)
|
|||
case MLME_STA_CONNECTED:
|
||||
MSTATE_STA_LD_NUM(&mstate)++;
|
||||
break;
|
||||
case MLME_STA_DISCONNECTED:
|
||||
break;
|
||||
#ifdef CONFIG_AP_MODE
|
||||
case MLME_AP_STARTED:
|
||||
MSTATE_AP_NUM(&mstate)++;
|
||||
break;
|
||||
case MLME_AP_STOPPED:
|
||||
case MLME_STA_DISCONNECTED:
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_RTW_MESH
|
||||
case MLME_MESH_STARTED:
|
||||
MSTATE_MESH_NUM(&mstate)++;
|
||||
break;
|
||||
case MLME_MESH_STOPPED:
|
||||
break;
|
||||
#endif
|
||||
case MLME_ACTION_NONE:
|
||||
/* caller without effect of decision */
|
||||
break;
|
||||
default:
|
||||
rtw_warn_on(1);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -3609,7 +3711,7 @@ void rtw_dfs_master_status_apply(_adapter *adapter, u8 self_action)
|
|||
|
||||
if (MSTATE_STA_LD_NUM(&mstate) > 0) {
|
||||
/* rely on AP on which STA mode connects */
|
||||
if (rtw_is_dfs_ch(u_ch, u_bw, u_offset))
|
||||
if (rtw_is_dfs_chbw(u_ch, u_bw, u_offset))
|
||||
ld_sta_in_dfs = _TRUE;
|
||||
goto apply;
|
||||
}
|
||||
|
|
@ -3619,20 +3721,21 @@ void rtw_dfs_master_status_apply(_adapter *adapter, u8 self_action)
|
|||
goto apply;
|
||||
}
|
||||
|
||||
if (MSTATE_AP_NUM(&mstate) == 0) {
|
||||
/* No working AP mode */
|
||||
if (!MSTATE_AP_NUM(&mstate) && !MSTATE_MESH_NUM(&mstate)) {
|
||||
/* No working AP/Mesh mode */
|
||||
goto apply;
|
||||
}
|
||||
|
||||
if (rtw_is_dfs_ch(u_ch, u_bw, u_offset))
|
||||
if (rtw_is_dfs_chbw(u_ch, u_bw, u_offset))
|
||||
needed = _TRUE;
|
||||
|
||||
apply:
|
||||
|
||||
RTW_INFO(FUNC_ADPT_FMT" needed:%d, self_action:%u\n"
|
||||
, FUNC_ADPT_ARG(adapter), needed, self_action);
|
||||
RTW_INFO(FUNC_ADPT_FMT" ld_sta_num:%u, lg_sta_num:%u, ap_num:%u, %u,%u,%u\n"
|
||||
, FUNC_ADPT_ARG(adapter), MSTATE_STA_LD_NUM(&mstate), MSTATE_STA_LG_NUM(&mstate), MSTATE_AP_NUM(&mstate)
|
||||
RTW_INFO(FUNC_ADPT_FMT" ld_sta_num:%u, lg_sta_num:%u, ap_num:%u, mesh_num:%u, %u,%u,%u\n"
|
||||
, FUNC_ADPT_ARG(adapter), MSTATE_STA_LD_NUM(&mstate), MSTATE_STA_LG_NUM(&mstate)
|
||||
, MSTATE_AP_NUM(&mstate), MSTATE_MESH_NUM(&mstate)
|
||||
, u_ch, u_bw, u_offset);
|
||||
|
||||
if (needed == _TRUE)
|
||||
|
|
@ -3841,6 +3944,160 @@ u8 rtw_test_h2c_cmd(_adapter *adapter, u8 *buf, u8 len)
|
|||
return res;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MP_INCLUDED
|
||||
static s32 rtw_mp_cmd_hdl(_adapter *padapter, u8 mp_cmd_id)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
int ret = H2C_SUCCESS;
|
||||
uint status = _SUCCESS;
|
||||
u8 rfreg0;
|
||||
|
||||
if (mp_cmd_id == MP_START) {
|
||||
if (padapter->registrypriv.mp_mode == 0) {
|
||||
rtw_intf_stop(padapter);
|
||||
rtw_hal_deinit(padapter);
|
||||
padapter->registrypriv.mp_mode = 1;
|
||||
#ifdef CONFIG_RF_POWER_TRIM
|
||||
if (!IS_HARDWARE_TYPE_8814A(padapter) && !IS_HARDWARE_TYPE_8822B(padapter)) {
|
||||
padapter->registrypriv.RegPwrTrimEnable = 1;
|
||||
rtw_hal_read_chip_info(padapter);
|
||||
}
|
||||
#endif /*CONFIG_RF_POWER_TRIM*/
|
||||
rtw_reset_drv_sw(padapter);
|
||||
status = rtw_hal_init(padapter);
|
||||
if (status == _FAIL) {
|
||||
ret = H2C_REJECTED;
|
||||
goto exit;
|
||||
}
|
||||
#ifndef RTW_HALMAC
|
||||
rtw_intf_start(padapter);
|
||||
#endif /* !RTW_HALMAC */
|
||||
#ifdef RTW_HALMAC /*for New IC*/
|
||||
MPT_InitializeAdapter(padapter, 1);
|
||||
#endif /* CONFIG_MP_INCLUDED */
|
||||
}
|
||||
|
||||
if (padapter->registrypriv.mp_mode == 0) {
|
||||
ret = H2C_REJECTED;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (padapter->mppriv.mode == MP_OFF) {
|
||||
if (mp_start_test(padapter) == _FAIL) {
|
||||
ret = H2C_REJECTED;
|
||||
goto exit;
|
||||
}
|
||||
padapter->mppriv.mode = MP_ON;
|
||||
MPT_PwrCtlDM(padapter, 0);
|
||||
}
|
||||
padapter->mppriv.bmac_filter = _FALSE;
|
||||
#ifdef CONFIG_RTL8723B
|
||||
#ifdef CONFIG_USB_HCI
|
||||
rtw_write32(padapter, 0x765, 0x0000);
|
||||
rtw_write32(padapter, 0x948, 0x0280);
|
||||
#else
|
||||
rtw_write32(padapter, 0x765, 0x0000);
|
||||
rtw_write32(padapter, 0x948, 0x0000);
|
||||
#endif
|
||||
#ifdef CONFIG_FOR_RTL8723BS_VQ0
|
||||
rtw_write32(padapter, 0x765, 0x0000);
|
||||
rtw_write32(padapter, 0x948, 0x0280);
|
||||
#endif
|
||||
rtw_write8(padapter, 0x66, 0x27); /*Open BT uart Log*/
|
||||
rtw_write8(padapter, 0xc50, 0x20); /*for RX init Gain*/
|
||||
#endif
|
||||
odm_write_dig(&pHalData->odmpriv, 0x20);
|
||||
|
||||
} else if (mp_cmd_id == MP_STOP) {
|
||||
if (padapter->registrypriv.mp_mode == 1) {
|
||||
MPT_DeInitAdapter(padapter);
|
||||
rtw_intf_stop(padapter);
|
||||
rtw_hal_deinit(padapter);
|
||||
padapter->registrypriv.mp_mode = 0;
|
||||
rtw_reset_drv_sw(padapter);
|
||||
status = rtw_hal_init(padapter);
|
||||
if (status == _FAIL) {
|
||||
ret = H2C_REJECTED;
|
||||
goto exit;
|
||||
}
|
||||
#ifndef RTW_HALMAC
|
||||
rtw_intf_start(padapter);
|
||||
#endif /* !RTW_HALMAC */
|
||||
}
|
||||
|
||||
if (padapter->mppriv.mode != MP_OFF) {
|
||||
mp_stop_test(padapter);
|
||||
padapter->mppriv.mode = MP_OFF;
|
||||
}
|
||||
|
||||
} else {
|
||||
RTW_INFO(FUNC_ADPT_FMT"invalid id:%d\n", FUNC_ADPT_ARG(padapter), mp_cmd_id);
|
||||
ret = H2C_PARAMETERS_ERROR;
|
||||
rtw_warn_on(1);
|
||||
}
|
||||
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
u8 rtw_mp_cmd(_adapter *adapter, u8 mp_cmd_id, u8 flags)
|
||||
{
|
||||
struct cmd_obj *cmdobj;
|
||||
struct drvextra_cmd_parm *parm;
|
||||
struct cmd_priv *pcmdpriv = &adapter->cmdpriv;
|
||||
struct submit_ctx sctx;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
|
||||
if (parm == NULL) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
parm->ec_id = MP_CMD_WK_CID;
|
||||
parm->type = mp_cmd_id;
|
||||
parm->size = 0;
|
||||
parm->pbuf = NULL;
|
||||
|
||||
if (flags & RTW_CMDF_DIRECTLY) {
|
||||
/* no need to enqueue, do the cmd hdl directly and free cmd parameter */
|
||||
if (H2C_SUCCESS != rtw_mp_cmd_hdl(adapter, mp_cmd_id))
|
||||
res = _FAIL;
|
||||
rtw_mfree((u8 *)parm, sizeof(*parm));
|
||||
} else {
|
||||
/* need enqueue, prepare cmd_obj and enqueue */
|
||||
cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(*cmdobj));
|
||||
if (cmdobj == NULL) {
|
||||
res = _FAIL;
|
||||
rtw_mfree((u8 *)parm, sizeof(*parm));
|
||||
goto exit;
|
||||
}
|
||||
|
||||
init_h2fwcmd_w_parm_no_rsp(cmdobj, parm, GEN_CMD_CODE(_Set_Drv_Extra));
|
||||
|
||||
if (flags & RTW_CMDF_WAIT_ACK) {
|
||||
cmdobj->sctx = &sctx;
|
||||
rtw_sctx_init(&sctx, 10 * 1000);
|
||||
}
|
||||
|
||||
res = rtw_enqueue_cmd(pcmdpriv, cmdobj);
|
||||
|
||||
if (res == _SUCCESS && (flags & RTW_CMDF_WAIT_ACK)) {
|
||||
rtw_sctx_wait(&sctx, __func__);
|
||||
_enter_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
|
||||
if (sctx.status == RTW_SCTX_SUBMITTED)
|
||||
cmdobj->sctx = NULL;
|
||||
_exit_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
|
||||
if (sctx.status != RTW_SCTX_DONE_SUCCESS)
|
||||
res = _FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
return res;
|
||||
}
|
||||
#endif /*CONFIG_MP_INCLUDED*/
|
||||
|
||||
#ifdef CONFIG_RTW_CUSTOMER_STR
|
||||
static s32 rtw_customer_str_cmd_hdl(_adapter *adapter, u8 write, const u8 *cstr)
|
||||
{
|
||||
|
|
@ -4442,11 +4699,28 @@ u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf)
|
|||
case TEST_H2C_CID:
|
||||
rtw_hal_fill_h2c_cmd(padapter, pdrvextra_cmd->pbuf[0], pdrvextra_cmd->size - 1, &pdrvextra_cmd->pbuf[1]);
|
||||
break;
|
||||
case MP_CMD_WK_CID:
|
||||
#ifdef CONFIG_MP_INCLUDED
|
||||
ret = rtw_mp_cmd_hdl(padapter, pdrvextra_cmd->type);
|
||||
#endif
|
||||
break;
|
||||
#ifdef CONFIG_RTW_CUSTOMER_STR
|
||||
case CUSTOMER_STR_WK_CID:
|
||||
ret = rtw_customer_str_cmd_hdl(padapter, pdrvextra_cmd->type, pdrvextra_cmd->pbuf);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTW_REPEATER_SON
|
||||
case RSON_SCAN_WK_CID:
|
||||
rtw_rson_scan_cmd_hdl(padapter, pdrvextra_cmd->type);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IOCTL_CFG80211
|
||||
case MGNT_TX_WK_CID:
|
||||
ret = rtw_mgnt_tx_handler(padapter, pdrvextra_cmd->pbuf);
|
||||
break;
|
||||
#endif /* CONFIG_IOCTL_CFG80211 */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -4526,7 +4800,6 @@ void rtw_joinbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd)
|
|||
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;
|
||||
|
|
@ -4536,7 +4809,7 @@ void rtw_create_ibss_post_hdl(_adapter *padapter, int status)
|
|||
if (status != H2C_SUCCESS)
|
||||
_set_timer(&pmlmepriv->assoc_timer, 1);
|
||||
|
||||
_cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled);
|
||||
_cancel_timer_ex(&pmlmepriv->assoc_timer);
|
||||
|
||||
_enter_critical_bh(&pmlmepriv->lock, &irqL);
|
||||
|
||||
|
|
@ -4592,7 +4865,7 @@ void rtw_setstaKey_cmdrsp_callback(_adapter *padapter , struct cmd_obj *pcmd)
|
|||
goto exit;
|
||||
}
|
||||
|
||||
/* psta->aid = psta->mac_id = psetstakey_rsp->keyid; */ /* CAM_ID(CAM_ENTRY) */
|
||||
/* psta->cmn.aid = psta->cmn.mac_id = psetstakey_rsp->keyid; */ /* CAM_ID(CAM_ENTRY) */
|
||||
|
||||
exit:
|
||||
|
||||
|
|
@ -4614,7 +4887,7 @@ void rtw_setassocsta_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd)
|
|||
goto exit;
|
||||
}
|
||||
|
||||
psta->aid = psta->mac_id = passocsta_rsp->cam_id;
|
||||
psta->cmn.aid = psta->cmn.mac_id = passocsta_rsp->cam_id;
|
||||
|
||||
_enter_critical_bh(&pmlmepriv->lock, &irqL);
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_EEPROM_C_
|
||||
|
||||
#include <drv_conf.h>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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 _IEEE80211_C
|
||||
|
||||
#ifdef CONFIG_PLATFORM_INTEL_BYT
|
||||
|
|
@ -853,23 +848,26 @@ u8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen)
|
|||
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 *rtw_get_wps_ie_from_scan_queue(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen, enum bss_type frame_type)
|
||||
{
|
||||
u8 *wps = NULL;
|
||||
|
||||
RTW_INFO("[%s] frame_type = %d\n", __FUNCTION__, frame_type);
|
||||
switch (frame_type) {
|
||||
case 1:
|
||||
case 3: {
|
||||
case BSS_TYPE_BCN:
|
||||
case BSS_TYPE_PROB_RSP: {
|
||||
/* 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: {
|
||||
case BSS_TYPE_PROB_REQ: {
|
||||
/* Probe Request */
|
||||
wps = rtw_get_wps_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , wps_ie, wps_ielen);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
case BSS_TYPE_UNDEF:
|
||||
break;
|
||||
}
|
||||
return wps;
|
||||
}
|
||||
|
|
@ -1236,6 +1234,10 @@ ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len,
|
|||
elems->vht_op_mode_notify = pos;
|
||||
elems->vht_op_mode_notify_len = elen;
|
||||
break;
|
||||
case _EID_RRM_EN_CAP_IE_:
|
||||
elems->rm_en_cap = pos;
|
||||
elems->rm_en_cap_len = elen;
|
||||
break;
|
||||
default:
|
||||
unknown++;
|
||||
if (!show_errors)
|
||||
|
|
@ -2589,13 +2591,43 @@ u8 rtw_ht_mcsset_to_nss(u8 *supp_mcs_set)
|
|||
return nss;
|
||||
}
|
||||
|
||||
u32 rtw_ht_mcs_set_to_bitmap(u8 *mcs_set, u8 nss)
|
||||
{
|
||||
u8 i;
|
||||
u32 bitmap = 0;
|
||||
|
||||
for (i = 0; i < nss; i++)
|
||||
bitmap |= mcs_set[i] << (i * 8);
|
||||
|
||||
RTW_INFO("ht_mcs_set=%02x %02x %02x %02x, nss=%u, bitmap=%08x\n"
|
||||
, mcs_set[0], mcs_set[1], mcs_set[2], mcs_set[3], nss, bitmap);
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
/* 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[3]) {
|
||||
if (MCS_rate[3] & BIT(7))
|
||||
max_rate = (bw_40MHz) ? ((short_GI) ? 6000 : 5400) : ((short_GI) ? 2889 : 2600);
|
||||
else if (MCS_rate[3] & BIT(6))
|
||||
max_rate = (bw_40MHz) ? ((short_GI) ? 5400 : 4860) : ((short_GI) ? 2600 : 2340);
|
||||
else if (MCS_rate[3] & BIT(5))
|
||||
max_rate = (bw_40MHz) ? ((short_GI) ? 4800 : 4320) : ((short_GI) ? 2311 : 2080);
|
||||
else if (MCS_rate[3] & BIT(4))
|
||||
max_rate = (bw_40MHz) ? ((short_GI) ? 3600 : 3240) : ((short_GI) ? 1733 : 1560);
|
||||
else if (MCS_rate[3] & BIT(3))
|
||||
max_rate = (bw_40MHz) ? ((short_GI) ? 2400 : 2160) : ((short_GI) ? 1156 : 1040);
|
||||
else if (MCS_rate[3] & BIT(2))
|
||||
max_rate = (bw_40MHz) ? ((short_GI) ? 1800 : 1620) : ((short_GI) ? 867 : 780);
|
||||
else if (MCS_rate[3] & BIT(1))
|
||||
max_rate = (bw_40MHz) ? ((short_GI) ? 1200 : 1080) : ((short_GI) ? 578 : 520);
|
||||
else if (MCS_rate[3] & BIT(0))
|
||||
max_rate = (bw_40MHz) ? ((short_GI) ? 600 : 540) : ((short_GI) ? 289 : 260);
|
||||
} else if (MCS_rate[2]) {
|
||||
if (MCS_rate[2] & BIT(7))
|
||||
max_rate = (bw_40MHz) ? ((short_GI) ? 4500 : 4050) : ((short_GI) ? 2167 : 1950);
|
||||
else if (MCS_rate[2] & BIT(6))
|
||||
|
|
@ -2707,3 +2739,4 @@ const char *action_public_str(u8 action)
|
|||
action = (action >= ACT_PUBLIC_MAX) ? ACT_PUBLIC_MAX : action;
|
||||
return _action_public_str[action];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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
|
||||
*
|
||||
*
|
||||
******************************************************************************/
|
||||
*****************************************************************************/
|
||||
/*
|
||||
|
||||
The purpose of rtw_io.c
|
||||
|
|
@ -56,7 +51,7 @@ jackson@realtek.com.tw
|
|||
#error "Shall be Linux or Windows, but not both!\n"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SDIO_HCI
|
||||
#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_PLATFORM_RTL8197D)
|
||||
#define rtw_le16_to_cpu(val) val
|
||||
#define rtw_le32_to_cpu(val) val
|
||||
#define rtw_cpu_to_le16(val) val
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_IOCTL_QUERY_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_IOCTL_RTL_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
@ -432,13 +427,14 @@ NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv)
|
|||
{
|
||||
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
|
||||
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
|
||||
struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
|
||||
|
||||
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 ;
|
||||
*(u16 *)poid_par_priv->information_buf = rfctl->ChannelPlan;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
@ -446,13 +442,14 @@ NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv *poid_par_priv)
|
|||
{
|
||||
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
|
||||
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
|
||||
struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
|
||||
|
||||
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 ;
|
||||
rfctl->ChannelPlan = *(u16 *)poid_par_priv->information_buf;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_IOCTL_SET_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
@ -79,6 +74,7 @@ u8 rtw_do_join(_adapter *padapter)
|
|||
_list *plist, *phead;
|
||||
u8 *pibss = NULL;
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct sitesurvey_parm parm;
|
||||
_queue *queue = &(pmlmepriv->scanned_queue);
|
||||
u8 ret = _SUCCESS;
|
||||
|
||||
|
|
@ -96,6 +92,10 @@ u8 rtw_do_join(_adapter *padapter)
|
|||
|
||||
pmlmepriv->to_join = _TRUE;
|
||||
|
||||
rtw_init_sitesurvey_parm(padapter, &parm);
|
||||
_rtw_memcpy(&parm.ssid[0], &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));
|
||||
parm.ssid_num = 1;
|
||||
|
||||
if (_rtw_queue_empty(queue) == _TRUE) {
|
||||
_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
|
||||
_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
|
||||
|
|
@ -107,7 +107,7 @@ u8 rtw_do_join(_adapter *padapter)
|
|||
|| rtw_to_roam(padapter) > 0
|
||||
) {
|
||||
/* submit site_survey_cmd */
|
||||
ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0);
|
||||
ret = rtw_sitesurvey_cmd(padapter, &parm);
|
||||
if (_SUCCESS != ret) {
|
||||
pmlmepriv->to_join = _FALSE;
|
||||
}
|
||||
|
|
@ -161,7 +161,7 @@ u8 rtw_do_join(_adapter *padapter)
|
|||
/* 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);
|
||||
rtw_sitesurvey_cmd(padapter, &parm);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -173,7 +173,7 @@ u8 rtw_do_join(_adapter *padapter)
|
|||
|| 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);
|
||||
ret = rtw_sitesurvey_cmd(padapter, &parm);
|
||||
if (_SUCCESS != ret) {
|
||||
pmlmepriv->to_join = _FALSE;
|
||||
}
|
||||
|
|
@ -302,7 +302,7 @@ u8 rtw_set_802_11_bssid(_adapter *padapter, u8 *bssid)
|
|||
goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */
|
||||
} else {
|
||||
|
||||
rtw_disassoc_cmd(padapter, 0, _TRUE);
|
||||
rtw_disassoc_cmd(padapter, 0, 0);
|
||||
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
|
||||
rtw_indicate_disconnect(padapter, 0, _FALSE);
|
||||
|
|
@ -374,7 +374,7 @@ u8 rtw_set_802_11_ssid(_adapter *padapter, NDIS_802_11_SSID *ssid)
|
|||
|
||||
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);
|
||||
rtw_disassoc_cmd(padapter, 0, 0);
|
||||
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
|
||||
rtw_indicate_disconnect(padapter, 0, _FALSE);
|
||||
|
|
@ -395,7 +395,7 @@ u8 rtw_set_802_11_ssid(_adapter *padapter, NDIS_802_11_SSID *ssid)
|
|||
#endif
|
||||
} else {
|
||||
|
||||
rtw_disassoc_cmd(padapter, 0, _TRUE);
|
||||
rtw_disassoc_cmd(padapter, 0, 0);
|
||||
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
|
||||
rtw_indicate_disconnect(padapter, 0, _FALSE);
|
||||
|
|
@ -514,8 +514,8 @@ u8 rtw_set_802_11_infrastructure_mode(_adapter *padapter,
|
|||
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);
|
||||
|
||||
|
||||
u8 ap2sta_mode = _FALSE;
|
||||
u8 ret = _TRUE;
|
||||
|
||||
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)); */
|
||||
|
|
@ -523,7 +523,7 @@ u8 rtw_set_802_11_infrastructure_mode(_adapter *padapter,
|
|||
if (*pold_state == Ndis802_11APMode) {
|
||||
/* change to other mode from Ndis802_11APMode */
|
||||
cur_network->join_res = -1;
|
||||
|
||||
ap2sta_mode = _TRUE;
|
||||
#ifdef CONFIG_NATIVEAP_MLME
|
||||
stop_ap_mode(padapter);
|
||||
#endif
|
||||
|
|
@ -532,7 +532,7 @@ u8 rtw_set_802_11_infrastructure_mode(_adapter *padapter,
|
|||
_enter_critical_bh(&pmlmepriv->lock, &irqL);
|
||||
|
||||
if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) || (*pold_state == Ndis802_11IBSS))
|
||||
rtw_disassoc_cmd(padapter, 0, _TRUE);
|
||||
rtw_disassoc_cmd(padapter, 0, 0);
|
||||
|
||||
if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ||
|
||||
(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))
|
||||
|
|
@ -555,6 +555,9 @@ u8 rtw_set_802_11_infrastructure_mode(_adapter *padapter,
|
|||
|
||||
case Ndis802_11Infrastructure:
|
||||
set_fwstate(pmlmepriv, WIFI_STATION_STATE);
|
||||
|
||||
if (ap2sta_mode)
|
||||
rtw_init_bcmc_stainfo(padapter);
|
||||
break;
|
||||
|
||||
case Ndis802_11APMode:
|
||||
|
|
@ -572,6 +575,9 @@ u8 rtw_set_802_11_infrastructure_mode(_adapter *padapter,
|
|||
case Ndis802_11Monitor:
|
||||
set_fwstate(pmlmepriv, WIFI_MONITOR_STATE);
|
||||
break;
|
||||
default:
|
||||
ret = _FALSE;
|
||||
rtw_warn_on(1);
|
||||
}
|
||||
|
||||
/* SecClearAllKeys(adapter); */
|
||||
|
|
@ -580,8 +586,7 @@ u8 rtw_set_802_11_infrastructure_mode(_adapter *padapter,
|
|||
_exit_critical_bh(&pmlmepriv->lock, &irqL);
|
||||
}
|
||||
|
||||
|
||||
return _TRUE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -595,7 +600,7 @@ u8 rtw_set_802_11_disassociate(_adapter *padapter)
|
|||
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
|
||||
|
||||
rtw_disassoc_cmd(padapter, 0, _TRUE);
|
||||
rtw_disassoc_cmd(padapter, 0, 0);
|
||||
rtw_indicate_disconnect(padapter, 0, _FALSE);
|
||||
/* modify for CONFIG_IEEE80211W, none 11w can use it */
|
||||
rtw_free_assoc_resources_cmd(padapter);
|
||||
|
|
@ -610,21 +615,21 @@ u8 rtw_set_802_11_disassociate(_adapter *padapter)
|
|||
}
|
||||
|
||||
#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)
|
||||
u8 rtw_set_802_11_bssid_list_scan(_adapter *padapter, struct sitesurvey_parm *pparm)
|
||||
{
|
||||
_irqL irqL;
|
||||
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);
|
||||
res = rtw_sitesurvey_cmd(padapter, pparm);
|
||||
_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)
|
||||
u8 rtw_set_802_11_bssid_list_scan(_adapter *padapter, struct sitesurvey_parm *pparm)
|
||||
{
|
||||
_irqL irqL;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
|
@ -656,7 +661,7 @@ u8 rtw_set_802_11_bssid_list_scan(_adapter *padapter, NDIS_802_11_SSID *pssid, i
|
|||
|
||||
_enter_critical_bh(&pmlmepriv->lock, &irqL);
|
||||
|
||||
res = rtw_sitesurvey_cmd(padapter, pssid, ssid_max_num, NULL, 0, ch, ch_num);
|
||||
res = rtw_sitesurvey_cmd(padapter, pparm);
|
||||
|
||||
_exit_critical_bh(&pmlmepriv->lock, &irqL);
|
||||
}
|
||||
|
|
@ -1022,9 +1027,6 @@ u8 rtw_set_802_11_add_key(_adapter *padapter, NDIS_802_11_KEY *key)
|
|||
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);
|
||||
|
|
@ -1150,22 +1152,20 @@ u16 rtw_get_cur_max_rate(_adapter *adapter)
|
|||
if (psta == NULL)
|
||||
return 0;
|
||||
|
||||
short_GI = query_ra_short_GI(psta, psta->bw_mode);
|
||||
short_GI = query_ra_short_GI(psta, rtw_get_tx_bw_mode(adapter, psta));
|
||||
|
||||
#ifdef CONFIG_80211N_HT
|
||||
if (IsSupportedHT(psta->wireless_mode)) {
|
||||
if (is_supported_ht(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
|
||||
);
|
||||
max_rate = rtw_mcs_rate(rf_type
|
||||
, (psta->cmn.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))
|
||||
max_rate = ((rtw_vht_mcs_to_data_rate(psta->bw_mode, short_GI, pmlmepriv->vhtpriv.vht_highest_rate) + 1) >> 1) * 10;
|
||||
else if (is_supported_vht(psta->wireless_mode))
|
||||
max_rate = ((rtw_vht_mcs_to_data_rate(psta->cmn.bw_mode, short_GI, pmlmepriv->vhtpriv.vht_highest_rate) + 1) >> 1) * 10;
|
||||
#endif /* CONFIG_80211AC_VHT */
|
||||
else
|
||||
#endif /* CONFIG_80211N_HT */
|
||||
|
|
@ -1228,7 +1228,8 @@ int rtw_set_country(_adapter *adapter, const char *country_code)
|
|||
#ifdef CONFIG_RTW_IOCTL_SET_COUNTRY
|
||||
return rtw_set_country_cmd(adapter, RTW_CMDF_WAIT_ACK, country_code, 1);
|
||||
#else
|
||||
return _FAIL;
|
||||
RTW_INFO("%s(): not applied\n", __func__);
|
||||
return _SUCCESS;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
*
|
||||
******************************************************************************/
|
||||
*****************************************************************************/
|
||||
|
||||
#include <drv_types.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <drv_types.h>
|
||||
#include <rtw_mem.h>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2015 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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 <drv_types.h>
|
||||
|
|
@ -32,6 +27,82 @@ void rtw_mi_update_union_chan_inf(_adapter *adapter, u8 ch, u8 offset , u8 bw)
|
|||
iface_state->union_offset = offset;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_P2P
|
||||
static u8 _rtw_mi_p2p_listen_scan_chk(_adapter *adapter)
|
||||
{
|
||||
int i;
|
||||
_adapter *iface;
|
||||
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
|
||||
u8 p2p_listen_scan_state = _FALSE;
|
||||
|
||||
for (i = 0; i < dvobj->iface_nums; i++) {
|
||||
iface = dvobj->padapters[i];
|
||||
if (rtw_p2p_chk_state(&iface->wdinfo, P2P_STATE_LISTEN) ||
|
||||
rtw_p2p_chk_state(&iface->wdinfo, P2P_STATE_SCAN)) {
|
||||
p2p_listen_scan_state = _TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return p2p_listen_scan_state;
|
||||
}
|
||||
#endif
|
||||
u8 rtw_mi_stayin_union_ch_chk(_adapter *adapter)
|
||||
{
|
||||
u8 rst = _TRUE;
|
||||
u8 u_ch, u_bw, u_offset;
|
||||
u8 o_ch, o_bw, o_offset;
|
||||
|
||||
u_ch = rtw_mi_get_union_chan(adapter);
|
||||
u_bw = rtw_mi_get_union_bw(adapter);
|
||||
u_offset = rtw_mi_get_union_offset(adapter);
|
||||
|
||||
o_ch = rtw_get_oper_ch(adapter);
|
||||
o_bw = rtw_get_oper_bw(adapter);
|
||||
o_offset = rtw_get_oper_choffset(adapter);
|
||||
|
||||
if ((u_ch != o_ch) || (u_bw != o_bw) || (u_offset != o_offset))
|
||||
rst = _FALSE;
|
||||
|
||||
#ifdef DBG_IFACE_STATUS
|
||||
if (rst == _FALSE) {
|
||||
RTW_ERR("%s Not stay in union channel\n", __func__);
|
||||
if (GET_HAL_DATA(adapter)->bScanInProcess == _TRUE)
|
||||
RTW_ERR("ScanInProcess\n");
|
||||
#ifdef CONFIG_P2P
|
||||
if (_rtw_mi_p2p_listen_scan_chk(adapter))
|
||||
RTW_ERR("P2P in listen or scan state\n");
|
||||
#endif
|
||||
RTW_ERR("union ch, bw, offset: %u,%u,%u\n", u_ch, u_bw, u_offset);
|
||||
RTW_ERR("oper ch, bw, offset: %u,%u,%u\n", o_ch, o_bw, o_offset);
|
||||
RTW_ERR("=========================\n");
|
||||
}
|
||||
#endif
|
||||
return rst;
|
||||
}
|
||||
|
||||
u8 rtw_mi_stayin_union_band_chk(_adapter *adapter)
|
||||
{
|
||||
u8 rst = _TRUE;
|
||||
u8 u_ch, o_ch;
|
||||
u8 u_band, o_band;
|
||||
|
||||
u_ch = rtw_mi_get_union_chan(adapter);
|
||||
o_ch = rtw_get_oper_ch(adapter);
|
||||
u_band = (u_ch > 14) ? BAND_ON_5G : BAND_ON_2_4G;
|
||||
o_band = (o_ch > 14) ? BAND_ON_5G : BAND_ON_2_4G;
|
||||
|
||||
if (u_ch != o_ch)
|
||||
if(u_band != o_band)
|
||||
rst = _FALSE;
|
||||
|
||||
#ifdef DBG_IFACE_STATUS
|
||||
if (rst == _FALSE)
|
||||
RTW_ERR("%s Not stay in union band\n", __func__);
|
||||
#endif
|
||||
|
||||
return rst;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
|
|
@ -110,8 +181,12 @@ inline int rtw_mi_get_ch_setting_union_no_self(_adapter *adapter, u8 *ch, u8 *bw
|
|||
return _rtw_mi_get_ch_setting_union(adapter, ch, bw, offset, 0);
|
||||
}
|
||||
|
||||
#define MI_STATUS_SELF_ONLY 0
|
||||
#define MI_STATUS_OTHERS_ONLY 1
|
||||
#define MI_STATUS_ALL 2
|
||||
|
||||
/* For now, not return union_ch/bw/offset */
|
||||
void _rtw_mi_status(_adapter *adapter, struct mi_state *mstate, bool include_self)
|
||||
void _rtw_mi_status(_adapter *adapter, struct mi_state *mstate, u8 target_sel)
|
||||
{
|
||||
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
|
||||
_adapter *iface;
|
||||
|
|
@ -122,23 +197,32 @@ void _rtw_mi_status(_adapter *adapter, struct mi_state *mstate, bool include_sel
|
|||
for (i = 0; i < dvobj->iface_nums; i++) {
|
||||
iface = dvobj->padapters[i];
|
||||
|
||||
if (include_self == _FALSE && iface == adapter)
|
||||
if (target_sel == MI_STATUS_SELF_ONLY && iface != adapter)
|
||||
continue;
|
||||
if (target_sel == MI_STATUS_OTHERS_ONLY && iface == adapter)
|
||||
continue;
|
||||
|
||||
if (check_fwstate(&iface->mlmepriv, WIFI_STATION_STATE) == _TRUE) {
|
||||
MSTATE_STA_NUM(mstate)++;
|
||||
if (check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE)
|
||||
if (check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE) {
|
||||
MSTATE_STA_LD_NUM(mstate)++;
|
||||
|
||||
#ifdef CONFIG_TDLS
|
||||
if (iface->tdlsinfo.link_established == _TRUE)
|
||||
MSTATE_TDLS_LD_NUM(mstate)++;
|
||||
#endif
|
||||
}
|
||||
if (check_fwstate(&iface->mlmepriv, _FW_UNDER_LINKING) == _TRUE)
|
||||
MSTATE_STA_LG_NUM(mstate)++;
|
||||
|
||||
#ifdef CONFIG_AP_MODE
|
||||
} else if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE
|
||||
&& check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE
|
||||
) {
|
||||
MSTATE_AP_NUM(mstate)++;
|
||||
if (iface->stapriv.asoc_sta_count > 2)
|
||||
MSTATE_AP_LD_NUM(mstate)++;
|
||||
#endif
|
||||
|
||||
} else if (check_fwstate(&iface->mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE) == _TRUE
|
||||
&& check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE
|
||||
|
|
@ -146,11 +230,29 @@ void _rtw_mi_status(_adapter *adapter, struct mi_state *mstate, bool include_sel
|
|||
MSTATE_ADHOC_NUM(mstate)++;
|
||||
if (iface->stapriv.asoc_sta_count > 2)
|
||||
MSTATE_ADHOC_LD_NUM(mstate)++;
|
||||
|
||||
#ifdef CONFIG_RTW_MESH
|
||||
} else if (check_fwstate(&iface->mlmepriv, WIFI_MESH_STATE) == _TRUE
|
||||
&& check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE
|
||||
) {
|
||||
MSTATE_MESH_NUM(mstate)++;
|
||||
if (iface->stapriv.asoc_sta_count > 2)
|
||||
MSTATE_MESH_LD_NUM(mstate)++;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
if (check_fwstate(&iface->mlmepriv, WIFI_UNDER_WPS) == _TRUE)
|
||||
MSTATE_WPS_NUM(mstate)++;
|
||||
|
||||
if (check_fwstate(&iface->mlmepriv, WIFI_SITE_MONITOR) == _TRUE) {
|
||||
MSTATE_SCAN_NUM(mstate)++;
|
||||
|
||||
if (mlmeext_scan_state(&iface->mlmeextpriv) != SCAN_DISABLE
|
||||
&& mlmeext_scan_state(&iface->mlmeextpriv) != SCAN_BACK_OP)
|
||||
MSTATE_SCAN_ENTER_NUM(mstate)++;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IOCTL_CFG80211
|
||||
if (rtw_cfg80211_get_is_mgmt_tx(iface))
|
||||
MSTATE_MGMT_TX_NUM(mstate)++;
|
||||
|
|
@ -165,32 +267,79 @@ void _rtw_mi_status(_adapter *adapter, struct mi_state *mstate, bool include_sel
|
|||
|
||||
inline void rtw_mi_status(_adapter *adapter, struct mi_state *mstate)
|
||||
{
|
||||
return _rtw_mi_status(adapter, mstate, 1);
|
||||
return _rtw_mi_status(adapter, mstate, MI_STATUS_ALL);
|
||||
}
|
||||
|
||||
inline void rtw_mi_status_no_self(_adapter *adapter, struct mi_state *mstate)
|
||||
{
|
||||
return _rtw_mi_status(adapter, mstate, 0);
|
||||
return _rtw_mi_status(adapter, mstate, MI_STATUS_OTHERS_ONLY);
|
||||
}
|
||||
|
||||
inline void rtw_mi_status_no_others(_adapter *adapter, struct mi_state *mstate)
|
||||
{
|
||||
return _rtw_mi_status(adapter, mstate, MI_STATUS_SELF_ONLY);
|
||||
}
|
||||
|
||||
/* For now, not handle union_ch/bw/offset */
|
||||
inline void rtw_mi_status_merge(struct mi_state *d, struct mi_state *a)
|
||||
{
|
||||
d->sta_num += a->sta_num;
|
||||
d->ld_sta_num += a->ld_sta_num;
|
||||
d->lg_sta_num += a->lg_sta_num;
|
||||
#ifdef CONFIG_TDLS
|
||||
d->ld_tdls_num += a->ld_tdls_num;
|
||||
#endif
|
||||
#ifdef CONFIG_AP_MODE
|
||||
d->ap_num += a->ap_num;
|
||||
d->ld_ap_num += a->ld_ap_num;
|
||||
#endif
|
||||
d->adhoc_num += a->adhoc_num;
|
||||
d->ld_adhoc_num += a->ld_adhoc_num;
|
||||
#ifdef CONFIG_RTW_MESH
|
||||
d->mesh_num += a->mesh_num;
|
||||
d->ld_mesh_num += a->ld_mesh_num;
|
||||
#endif
|
||||
d->scan_num += a->scan_num;
|
||||
d->scan_enter_num += a->scan_enter_num;
|
||||
d->uwps_num += a->uwps_num;
|
||||
#ifdef CONFIG_IOCTL_CFG80211
|
||||
#ifdef CONFIG_P2P
|
||||
d->roch_num += a->roch_num;
|
||||
#endif
|
||||
d->mgmt_tx_num += a->mgmt_tx_num;
|
||||
#endif
|
||||
}
|
||||
|
||||
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", DEV_STA_NUM(dvobj));
|
||||
RTW_PRINT_SEL(sel, "linking_sta_num:%d\n", DEV_STA_LG_NUM(dvobj));
|
||||
RTW_PRINT_SEL(sel, "linked_sta_num:%d\n", DEV_STA_LD_NUM(dvobj));
|
||||
#ifdef CONFIG_TDLS
|
||||
RTW_PRINT_SEL(sel, "linked_tdls_num:%d\n", DEV_TDLS_LD_NUM(dvobj));
|
||||
#endif
|
||||
#ifdef CONFIG_AP_MODE
|
||||
RTW_PRINT_SEL(sel, "ap_num:%d\n", DEV_AP_NUM(dvobj));
|
||||
RTW_PRINT_SEL(sel, "linked_ap_num:%d\n", DEV_AP_LD_NUM(dvobj));
|
||||
#endif
|
||||
RTW_PRINT_SEL(sel, "adhoc_num:%d\n", DEV_ADHOC_NUM(dvobj));
|
||||
RTW_PRINT_SEL(sel, "linked_adhoc_num:%d\n", DEV_ADHOC_LD_NUM(dvobj));
|
||||
#ifdef CONFIG_RTW_MESH
|
||||
RTW_PRINT_SEL(sel, "mesh_num:%d\n", DEV_MESH_NUM(dvobj));
|
||||
RTW_PRINT_SEL(sel, "linked_mesh_num:%d\n", DEV_MESH_LD_NUM(dvobj));
|
||||
#endif
|
||||
#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, "scan_num:%d\n", DEV_STA_NUM(dvobj));
|
||||
RTW_PRINT_SEL(sel, "under_wps_num:%d\n", DEV_WPS_NUM(dvobj));
|
||||
#if defined(CONFIG_IOCTL_CFG80211)
|
||||
#if defined(CONFIG_P2P)
|
||||
RTW_PRINT_SEL(sel, "roch_num:%d\n", DEV_ROCH_NUM(dvobj));
|
||||
#endif
|
||||
RTW_PRINT_SEL(sel, "mgmt_tx_num:%d\n", DEV_MGMT_TX_NUM(dvobj));
|
||||
#endif
|
||||
RTW_PRINT_SEL(sel, "under_wps_num:%d\n", DEV_WPS_NUM(dvobj));
|
||||
RTW_PRINT_SEL(sel, "union_ch:%d\n", DEV_U_CH(dvobj));
|
||||
RTW_PRINT_SEL(sel, "union_bw:%d\n", DEV_U_BW(dvobj));
|
||||
RTW_PRINT_SEL(sel, "union_offset:%d\n", DEV_U_OFFSET(dvobj));
|
||||
|
|
@ -214,7 +363,6 @@ inline void rtw_mi_update_iface_status(struct mlme_priv *pmlmepriv, sint state)
|
|||
_adapter *iface;
|
||||
|
||||
if (state == WIFI_MONITOR_STATE
|
||||
|| state == WIFI_SITE_MONITOR
|
||||
|| state == 0xFFFFFFFF
|
||||
)
|
||||
return;
|
||||
|
|
@ -252,11 +400,11 @@ u8 rtw_mi_check_status(_adapter *adapter, u8 type)
|
|||
|
||||
switch (type) {
|
||||
case MI_LINKED:
|
||||
if (MSTATE_STA_LD_NUM(iface_state) || MSTATE_AP_NUM(iface_state) || MSTATE_ADHOC_NUM(iface_state)) /*check_fwstate(&iface->mlmepriv, _FW_LINKED)*/
|
||||
if (MSTATE_STA_LD_NUM(iface_state) || MSTATE_AP_NUM(iface_state) || MSTATE_ADHOC_NUM(iface_state) || MSTATE_MESH_NUM(iface_state)) /*check_fwstate(&iface->mlmepriv, _FW_LINKED)*/
|
||||
ret = _TRUE;
|
||||
break;
|
||||
case MI_ASSOC:
|
||||
if (MSTATE_STA_LD_NUM(iface_state) || MSTATE_AP_LD_NUM(iface_state) || MSTATE_ADHOC_LD_NUM(iface_state))
|
||||
if (MSTATE_STA_LD_NUM(iface_state) || MSTATE_AP_LD_NUM(iface_state) || MSTATE_ADHOC_LD_NUM(iface_state) || MSTATE_MESH_LD_NUM(iface_state))
|
||||
ret = _TRUE;
|
||||
break;
|
||||
case MI_UNDER_WPS:
|
||||
|
|
@ -282,6 +430,17 @@ u8 rtw_mi_check_status(_adapter *adapter, u8 type)
|
|||
ret = _TRUE;
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_RTW_MESH
|
||||
case MI_MESH:
|
||||
if (MSTATE_MESH_NUM(iface_state))
|
||||
ret = _TRUE;
|
||||
break;
|
||||
case MI_MESH_ASSOC:
|
||||
if (MSTATE_MESH_LD_NUM(iface_state))
|
||||
ret = _TRUE;
|
||||
break;
|
||||
#endif
|
||||
|
||||
case MI_STA_NOLINK: /* this is misleading, but not used now */
|
||||
if (MSTATE_STA_NUM(iface_state) && (!(MSTATE_STA_LD_NUM(iface_state) || MSTATE_STA_LG_NUM(iface_state))))
|
||||
ret = _TRUE;
|
||||
|
|
@ -301,28 +460,6 @@ u8 rtw_mi_check_status(_adapter *adapter, u8 type)
|
|||
return ret;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
* return value : 0 is failed or have not interface meet condition
|
||||
* return value : !0 is success or interface numbers which meet condition
|
||||
|
|
@ -351,27 +488,77 @@ static u8 _rtw_mi_process(_adapter *padapter, bool exclude_self,
|
|||
}
|
||||
return ret;
|
||||
}
|
||||
static u8 _rtw_mi_netif_stop_queue(_adapter *padapter, void *data)
|
||||
static u8 _rtw_mi_process_without_schk(_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) {
|
||||
if ((exclude_self) && (iface == padapter))
|
||||
continue;
|
||||
|
||||
if (ops_func)
|
||||
if (ops_func(iface, data) == _TRUE)
|
||||
ret++;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u8 _rtw_mi_netif_caroff_qstop(_adapter *padapter, void *data)
|
||||
{
|
||||
bool carrier_off = *(bool *)data;
|
||||
struct net_device *pnetdev = padapter->pnetdev;
|
||||
|
||||
if (carrier_off)
|
||||
netif_carrier_off(pnetdev);
|
||||
rtw_netif_carrier_off(pnetdev);
|
||||
rtw_netif_stop_queue(pnetdev);
|
||||
return _TRUE;
|
||||
}
|
||||
u8 rtw_mi_netif_stop_queue(_adapter *padapter, bool carrier_off)
|
||||
u8 rtw_mi_netif_caroff_qstop(_adapter *padapter)
|
||||
{
|
||||
bool in_data = carrier_off;
|
||||
|
||||
return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_netif_stop_queue);
|
||||
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_caroff_qstop);
|
||||
}
|
||||
u8 rtw_mi_buddy_netif_stop_queue(_adapter *padapter, bool carrier_off)
|
||||
u8 rtw_mi_buddy_netif_caroff_qstop(_adapter *padapter)
|
||||
{
|
||||
bool in_data = carrier_off;
|
||||
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_caroff_qstop);
|
||||
}
|
||||
|
||||
return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_netif_stop_queue);
|
||||
static u8 _rtw_mi_netif_caron_qstart(_adapter *padapter, void *data)
|
||||
{
|
||||
struct net_device *pnetdev = padapter->pnetdev;
|
||||
|
||||
rtw_netif_carrier_on(pnetdev);
|
||||
rtw_netif_start_queue(pnetdev);
|
||||
return _TRUE;
|
||||
}
|
||||
u8 rtw_mi_netif_caron_qstart(_adapter *padapter)
|
||||
{
|
||||
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_caron_qstart);
|
||||
}
|
||||
u8 rtw_mi_buddy_netif_caron_qstart(_adapter *padapter)
|
||||
{
|
||||
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_caron_qstart);
|
||||
}
|
||||
|
||||
static u8 _rtw_mi_netif_stop_queue(_adapter *padapter, void *data)
|
||||
{
|
||||
struct net_device *pnetdev = padapter->pnetdev;
|
||||
|
||||
rtw_netif_stop_queue(pnetdev);
|
||||
return _TRUE;
|
||||
}
|
||||
u8 rtw_mi_netif_stop_queue(_adapter *padapter)
|
||||
{
|
||||
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_stop_queue);
|
||||
}
|
||||
u8 rtw_mi_buddy_netif_stop_queue(_adapter *padapter)
|
||||
{
|
||||
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_stop_queue);
|
||||
}
|
||||
|
||||
static u8 _rtw_mi_netif_wake_queue(_adapter *padapter, void *data)
|
||||
|
|
@ -408,6 +595,23 @@ 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_netif_carrier_off(_adapter *padapter, void *data)
|
||||
{
|
||||
struct net_device *pnetdev = padapter->pnetdev;
|
||||
|
||||
if (pnetdev)
|
||||
rtw_netif_carrier_off(pnetdev);
|
||||
return _TRUE;
|
||||
}
|
||||
u8 rtw_mi_netif_carrier_off(_adapter *padapter)
|
||||
{
|
||||
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_carrier_off);
|
||||
}
|
||||
u8 rtw_mi_buddy_netif_carrier_off(_adapter *padapter)
|
||||
{
|
||||
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_carrier_off);
|
||||
}
|
||||
|
||||
static u8 _rtw_mi_scan_abort(_adapter *adapter, void *data)
|
||||
{
|
||||
bool bwait = *(bool *)data;
|
||||
|
|
@ -447,18 +651,27 @@ 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)
|
||||
static void _rtw_mi_stop_drv_threads(_adapter *adapter, bool exclude_self)
|
||||
{
|
||||
rtw_stop_drv_threads(adapter);
|
||||
return _TRUE;
|
||||
int i;
|
||||
_adapter *iface = NULL;
|
||||
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
|
||||
|
||||
for (i = 0; i < dvobj->iface_nums; i++) {
|
||||
iface = dvobj->padapters[i];
|
||||
if ((iface) && (iface->bup == _TRUE))
|
||||
if ((exclude_self) && (iface == adapter))
|
||||
continue;
|
||||
rtw_stop_drv_threads(iface);
|
||||
}
|
||||
}
|
||||
void rtw_mi_stop_drv_threads(_adapter *adapter)
|
||||
{
|
||||
_rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_stop_drv_threads);
|
||||
_rtw_mi_stop_drv_threads(adapter, _FALSE);
|
||||
}
|
||||
void rtw_mi_buddy_stop_drv_threads(_adapter *adapter)
|
||||
{
|
||||
_rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_stop_drv_threads);
|
||||
_rtw_mi_stop_drv_threads(adapter, _TRUE);
|
||||
}
|
||||
|
||||
static u8 _rtw_mi_cancel_all_timer(_adapter *adapter, void *data)
|
||||
|
|
@ -482,11 +695,11 @@ static u8 _rtw_mi_reset_drv_sw(_adapter *adapter, void *data)
|
|||
}
|
||||
void rtw_mi_reset_drv_sw(_adapter *adapter)
|
||||
{
|
||||
_rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_reset_drv_sw);
|
||||
_rtw_mi_process_without_schk(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);
|
||||
_rtw_mi_process_without_schk(adapter, _TRUE, NULL, _rtw_mi_reset_drv_sw);
|
||||
}
|
||||
|
||||
static u8 _rtw_mi_intf_start(_adapter *adapter, void *data)
|
||||
|
|
@ -565,58 +778,14 @@ void rtw_mi_buddy_set_scan_deny(_adapter *adapter, u32 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);
|
||||
}
|
||||
#endif /*CONFIG_SET_SCAN_DENY_TIMER*/
|
||||
|
||||
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
|
||||
if (!MLME_IS_STA(padapter)
|
||||
&& 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);
|
||||
RTW_INFO(ADPT_FMT" - update_beacon\n", ADPT_ARG(padapter));
|
||||
update_beacon(padapter, 0xFF, NULL, _TRUE);
|
||||
}
|
||||
return _TRUE;
|
||||
}
|
||||
|
|
@ -635,7 +804,7 @@ 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_hal_get_hwreg(padapter, HW_VAR_MAC_ADDR, mac_addr);
|
||||
RTW_INFO(ADPT_FMT"MAC Address ="MAC_FMT"\n", ADPT_ARG(padapter), MAC_ARG(mac_addr));
|
||||
return _TRUE;
|
||||
}
|
||||
|
|
@ -984,9 +1153,9 @@ u8 rtw_mi_buddy_sreset_adapter_hdl(_adapter *padapter, u8 bstart)
|
|||
}
|
||||
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
|
||||
) {
|
||||
if ((MLME_IS_AP(adapter) || MLME_IS_MESH(adapter))
|
||||
&& 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)
|
||||
|
|
@ -1009,7 +1178,7 @@ 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 (MLME_IS_AP(adapter) || MLME_IS_MESH(adapter)) {
|
||||
if (pmlmepriv->update_bcn == _TRUE)
|
||||
set_tx_beacon_cmd(adapter);
|
||||
}
|
||||
|
|
@ -1195,7 +1364,7 @@ static s32 _rtw_mi_buddy_clone_bcmc_packet(_adapter *adapter, union recv_frame *
|
|||
rtw_dbg_skb_process(adapter, precvframe, pcloneframe);
|
||||
#endif
|
||||
|
||||
if (pattrib->physt && pphy_status)
|
||||
if (pphy_status)
|
||||
rx_query_phy_status(pcloneframe, pphy_status);
|
||||
|
||||
ret = rtw_recv_entry(pcloneframe);
|
||||
|
|
@ -1217,6 +1386,8 @@ void rtw_mi_buddy_clone_bcmc_packet(_adapter *padapter, union recv_frame *precvf
|
|||
struct recv_priv *precvpriv = &padapter->recvpriv;/*primary_padapter*/
|
||||
_queue *pfree_recv_queue = &precvpriv->free_recv_queue;
|
||||
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
|
||||
u8 *fhead = get_recvframe_data(precvframe);
|
||||
u8 type = GetFrameType(fhead);
|
||||
|
||||
for (i = 0; i < dvobj->iface_nums; i++) {
|
||||
iface = dvobj->padapters[i];
|
||||
|
|
@ -1224,6 +1395,8 @@ void rtw_mi_buddy_clone_bcmc_packet(_adapter *padapter, union recv_frame *precvf
|
|||
continue;
|
||||
if (rtw_is_adapter_up(iface) == _FALSE || iface->registered == 0)
|
||||
continue;
|
||||
if (type == WIFI_DATA_TYPE && !adapter_allow_bmc_data_rx(iface))
|
||||
continue;
|
||||
|
||||
pcloneframe = rtw_alloc_recvframe(pfree_recv_queue);
|
||||
if (pcloneframe) {
|
||||
|
|
@ -1284,3 +1457,4 @@ void rtw_mi_update_ap_bmc_camid(_adapter *padapter, u8 camid_a, u8 camid_b)
|
|||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_MP_C_
|
||||
#include <drv_types.h>
|
||||
#ifdef PLATFORM_FREEBSD
|
||||
|
|
@ -342,7 +337,6 @@ s32 init_mp_priv(PADAPTER padapter)
|
|||
pmppriv->antenna_rx = ANTENNA_AB;
|
||||
break;
|
||||
case RF_2T2R:
|
||||
case RF_2T2R_GREEN:
|
||||
pmppriv->antenna_tx = ANTENNA_AB;
|
||||
pmppriv->antenna_rx = ANTENNA_AB;
|
||||
break;
|
||||
|
|
@ -353,7 +347,7 @@ s32 init_mp_priv(PADAPTER padapter)
|
|||
}
|
||||
|
||||
pHalData->AntennaRxPath = pmppriv->antenna_rx;
|
||||
pHalData->AntennaTxPath = pmppriv->antenna_tx;
|
||||
pHalData->antenna_tx_path = pmppriv->antenna_tx;
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
|
@ -394,135 +388,204 @@ static VOID PHY_SetRFPathSwitch_default(
|
|||
|
||||
void mpt_InitHWConfig(PADAPTER Adapter)
|
||||
{
|
||||
PHAL_DATA_TYPE hal;
|
||||
|
||||
hal = GET_HAL_DATA(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. */
|
||||
|
||||
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_set_mac_reg(Adapter, 0x64, BIT20, 0x0); /* 0x66[4]=0 */
|
||||
phy_set_mac_reg(Adapter, 0x64, BIT24, 0x0); /* 0x66[8]=0 */
|
||||
phy_set_mac_reg(Adapter, 0x40, BIT4, 0x0); /* 0x40[4]=0 */
|
||||
phy_set_mac_reg(Adapter, 0x40, BIT3, 0x1); /* 0x40[3]=1 */
|
||||
phy_set_mac_reg(Adapter, 0x4C, BIT24, 0x1); /* 0x4C[24:23]=10 */
|
||||
phy_set_mac_reg(Adapter, 0x4C, BIT23, 0x0); /* 0x4C[24:23]=10 */
|
||||
phy_set_bb_reg(Adapter, 0x944, BIT1 | BIT0, 0x3); /* 0x944[1:0]=11 */
|
||||
phy_set_bb_reg(Adapter, 0x930, bMaskByte0, 0x77);/* 0x930[7:0]=77 */
|
||||
phy_set_mac_reg(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 */
|
||||
phy_set_mac_reg(Adapter, 0x778, 0x3, 0x3); /* Turn off hardware PTA control (Asked by Scott) */
|
||||
phy_set_mac_reg(Adapter, 0x64, bMaskDWord, 0x36000000);/* Fix BT S0/S1 */
|
||||
phy_set_mac_reg(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*/
|
||||
phy_set_bb_reg(Adapter, 0xA00, BIT8, 0x0); /*0xA01[0] = 0*/
|
||||
} else if (IS_HARDWARE_TYPE_8821(Adapter)) {
|
||||
/* <20131121, VincentL> Add for 8821AU DPDT setting and fix switching antenna issue (Asked by Rock)
|
||||
<20131122, VincentL> Enable for all 8821A/8811AU (Asked by Alex)*/
|
||||
PHY_SetMacReg(Adapter, 0x4C, BIT23, 0x0); /*0x4C[23:22]=01*/
|
||||
PHY_SetMacReg(Adapter, 0x4C, BIT22, 0x1); /*0x4C[23:22]=01*/
|
||||
phy_set_mac_reg(Adapter, 0x4C, BIT23, 0x0); /*0x4C[23:22]=01*/
|
||||
phy_set_mac_reg(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*/
|
||||
phy_set_mac_reg(Adapter, 0x4C , BIT23, 0); /*select DPDT_P and DPDT_N as output pin*/
|
||||
#ifdef CONFIG_RTL8814A
|
||||
else if (IS_HARDWARE_TYPE_8814A(Adapter))
|
||||
PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8814A, 0x2000);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8812A
|
||||
else if (IS_HARDWARE_TYPE_8812(Adapter)) {
|
||||
rtw_write32(Adapter, 0x520, rtw_read32(Adapter, 0x520) | 0x8000);
|
||||
rtw_write32(Adapter, 0x524, rtw_read32(Adapter, 0x524) & (~0x800));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_RTL8822B
|
||||
else if (IS_HARDWARE_TYPE_8822B(Adapter))
|
||||
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_set_bb_reg(Adapter, 0x70, bMaskByte3, 0x0e);
|
||||
RTW_INFO(" 0x73 = 0x%x\n", phy_query_bb_reg(Adapter, 0x70, bMaskByte3));
|
||||
phy_set_bb_reg(Adapter, 0x1704, bMaskDWord, 0x0000ff00);
|
||||
RTW_INFO(" 0x1704 = 0x%x\n", phy_query_bb_reg(Adapter, 0x1704, bMaskDWord));
|
||||
phy_set_bb_reg(Adapter, 0x1700, bMaskDWord, 0xc00f0038);
|
||||
RTW_INFO(" 0x1700 = 0x%x\n", phy_query_bb_reg(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 */
|
||||
|
||||
#ifdef CONFIG_RTL8812A
|
||||
#define PHY_IQCalibrate(_Adapter, b) PHY_IQCalibrate_8812A(_Adapter, b)
|
||||
#define PHY_LCCalibrate(_Adapter) PHY_LCCalibrate_8812A(&(GET_HAL_DATA(_Adapter)->odmpriv))
|
||||
#define PHY_SetRFPathSwitch(_Adapter, b) PHY_SetRFPathSwitch_8812A(_Adapter, b)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8821A
|
||||
#define PHY_IQCalibrate(_Adapter, b) PHY_IQCalibrate_8821A(&(GET_HAL_DATA(_Adapter)->odmpriv), b)
|
||||
#define PHY_LCCalibrate(_Adapter) PHY_LCCalibrate_8821A(&(GET_HAL_DATA(_Adapter)->odmpriv))
|
||||
#define PHY_SetRFPathSwitch(_Adapter, b) PHY_SetRFPathSwitch_8812A(_Adapter, b)
|
||||
#endif
|
||||
|
||||
#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 */
|
||||
|
||||
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)
|
||||
#endif
|
||||
|
||||
#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_SetRFPathSwitch_8703B(a, b)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8188F
|
||||
static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery)
|
||||
{
|
||||
PHY_IQCalibrate_8188F(padapter, bReCovery, _FALSE);
|
||||
else if (IS_HARDWARE_TYPE_8188F(Adapter)) {
|
||||
if (IS_A_CUT(hal->version_id) || IS_B_CUT(hal->version_id)) {
|
||||
RTW_INFO("%s() Active large power detection\n", __func__);
|
||||
phy_active_large_power_detection_8188f(&(GET_HAL_DATA(Adapter)->odmpriv));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery)
|
||||
{
|
||||
halrf_iqk_trigger(&(GET_HAL_DATA(padapter)->odmpriv), bReCovery);
|
||||
}
|
||||
|
||||
#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)
|
||||
{
|
||||
halrf_lck_trigger(&(GET_HAL_DATA(padapter)->odmpriv));
|
||||
}
|
||||
|
||||
static u8 PHY_QueryRFPathSwitch(PADAPTER padapter)
|
||||
{
|
||||
u8 bmain = 0;
|
||||
/*
|
||||
if (IS_HARDWARE_TYPE_8723B(padapter)) {
|
||||
#ifdef CONFIG_RTL8723B
|
||||
bmain = PHY_QueryRFPathSwitch_8723B(padapter);
|
||||
#endif
|
||||
|
||||
} else if (IS_HARDWARE_TYPE_8188E(padapter)) {
|
||||
#ifdef CONFIG_RTL8188E
|
||||
bmain = PHY_QueryRFPathSwitch_8188E(padapter);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8814A(padapter)) {
|
||||
#ifdef CONFIG_RTL8814A
|
||||
bmain = PHY_QueryRFPathSwitch_8814A(padapter);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) {
|
||||
#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
|
||||
bmain = PHY_QueryRFPathSwitch_8812A(padapter);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8192E(padapter)) {
|
||||
#ifdef CONFIG_RTL8192E
|
||||
bmain = PHY_QueryRFPathSwitch_8192E(padapter);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8703B(padapter)) {
|
||||
#ifdef CONFIG_RTL8703B
|
||||
bmain = PHY_QueryRFPathSwitch_8703B(padapter);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8188F(padapter)) {
|
||||
#ifdef CONFIG_RTL8188F
|
||||
bmain = PHY_QueryRFPathSwitch_8188F(padapter);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8822B(padapter)) {
|
||||
#ifdef CONFIG_RTL8822B
|
||||
#define PHY_IQCalibrate(a, b) PHY_IQCalibrate_8822B(a, b)
|
||||
#define PHY_LCCalibrate(a)
|
||||
#define PHY_SetRFPathSwitch(a, b) PHY_SetRFPathSwitch_8822B(a, b)
|
||||
#endif /* CONFIG_RTL8822B */
|
||||
|
||||
bmain = PHY_QueryRFPathSwitch_8822B(padapter);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8723D(padapter)) {
|
||||
#ifdef CONFIG_RTL8723D
|
||||
#define PHY_IQCalibrate(a, b) PHY_IQCalibrate_8723D(a, b)
|
||||
#define PHY_LCCalibrate(a) PHY_LCCalibrate_8723D(&(GET_HAL_DATA(a)->odmpriv))
|
||||
#define PHY_SetRFPathSwitch(a, b) PHY_SetRFPathSwitch_8723D(a, b)
|
||||
bmain = PHY_QueryRFPathSwitch_8723D(padapter);
|
||||
#endif
|
||||
} else
|
||||
*/
|
||||
|
||||
if (IS_HARDWARE_TYPE_8821C(padapter)) {
|
||||
#ifdef CONFIG_RTL8821C
|
||||
bmain = phy_query_rf_path_switch_8821c(padapter);
|
||||
#endif
|
||||
}
|
||||
|
||||
return bmain;
|
||||
}
|
||||
|
||||
static void PHY_SetRFPathSwitch(PADAPTER padapter , BOOLEAN bMain) {
|
||||
|
||||
if (IS_HARDWARE_TYPE_8723B(padapter)) {
|
||||
#ifdef CONFIG_RTL8723B
|
||||
phy_set_rf_path_switch_8723b(padapter, bMain);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8188E(padapter)) {
|
||||
#ifdef CONFIG_RTL8188E
|
||||
phy_set_rf_path_switch_8188e(padapter, bMain);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8814A(padapter)) {
|
||||
#ifdef CONFIG_RTL8814A
|
||||
phy_set_rf_path_switch_8814a(padapter, bMain);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) {
|
||||
#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
|
||||
phy_set_rf_path_switch_8812a(padapter, bMain);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8192E(padapter)) {
|
||||
#ifdef CONFIG_RTL8192E
|
||||
phy_set_rf_path_switch_8192e(padapter, bMain);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8703B(padapter)) {
|
||||
#ifdef CONFIG_RTL8703B
|
||||
phy_set_rf_path_switch_8703b(padapter, bMain);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8188F(padapter)) {
|
||||
#ifdef CONFIG_RTL8188F
|
||||
phy_set_rf_path_switch_8188f(padapter, bMain);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8822B(padapter)) {
|
||||
#ifdef CONFIG_RTL8822B
|
||||
phy_set_rf_path_switch_8822b(padapter, bMain);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8723D(padapter)) {
|
||||
#ifdef CONFIG_RTL8723D
|
||||
phy_set_rf_path_switch_8723d(padapter, bMain);
|
||||
#endif
|
||||
} else if (IS_HARDWARE_TYPE_8821C(padapter)) {
|
||||
#ifdef CONFIG_RTL8821C
|
||||
phy_set_rf_path_switch_8821c(padapter, bMain);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ANTENNA_DIVERSITY
|
||||
u8 rtw_mp_set_antdiv(PADAPTER padapter, BOOLEAN bMain)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
u8 cur_ant, change_ant;
|
||||
|
||||
if (!pHalData->AntDivCfg)
|
||||
return _FALSE;
|
||||
/*rtw_hal_get_odm_var(padapter, HAL_ODM_ANTDIV_SELECT, &cur_ant, NULL);*/
|
||||
change_ant = (bMain == MAIN_ANT) ? MAIN_ANT : AUX_ANT;
|
||||
|
||||
RTW_INFO("%s: config %s\n", __func__, (bMain == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
|
||||
rtw_antenna_select_cmd(padapter, change_ant, _FALSE);
|
||||
|
||||
return _TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8821C
|
||||
#define PHY_IQCalibrate(a, b)
|
||||
#define PHY_LCCalibrate(a)
|
||||
#define PHY_SetRFPathSwitch(a, b)
|
||||
#endif /* CONFIG_RTL8821C */
|
||||
s32
|
||||
MPT_InitializeAdapter(
|
||||
IN PADAPTER pAdapter,
|
||||
|
|
@ -531,7 +594,7 @@ MPT_InitializeAdapter(
|
|||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
|
||||
s32 rtStatus = _SUCCESS;
|
||||
PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
|
||||
PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.mpt_ctx;
|
||||
u32 ledsetting;
|
||||
struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv;
|
||||
|
||||
|
|
@ -545,7 +608,7 @@ MPT_InitializeAdapter(
|
|||
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);
|
||||
rtw_init_timer(&pMptCtx->MPh2c_timeout_timer, pAdapter, MPh2c_timeout_handle, pAdapter);
|
||||
#endif
|
||||
|
||||
mpt_InitHWConfig(pAdapter);
|
||||
|
|
@ -555,13 +618,13 @@ MPT_InitializeAdapter(
|
|||
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_set_bb_reg(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_set_rf_reg(pAdapter, RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E);
|
||||
else
|
||||
PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);
|
||||
phy_set_rf_reg(pAdapter, RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);
|
||||
}
|
||||
/*set ant to wifi side in mp mode*/
|
||||
rtw_write16(pAdapter, 0x870, 0x300);
|
||||
|
|
@ -570,7 +633,7 @@ MPT_InitializeAdapter(
|
|||
|
||||
pMptCtx->bMptWorkItemInProgress = _FALSE;
|
||||
pMptCtx->CurrMptAct = NULL;
|
||||
pMptCtx->MptRfPath = ODM_RF_PATH_A;
|
||||
pMptCtx->mpt_rf_path = RF_PATH_A;
|
||||
/* ------------------------------------------------------------------------- */
|
||||
/* Don't accept any packets */
|
||||
rtw_write32(pAdapter, REG_RCR, 0);
|
||||
|
|
@ -584,25 +647,25 @@ MPT_InitializeAdapter(
|
|||
|
||||
PHY_LCCalibrate(pAdapter);
|
||||
PHY_IQCalibrate(pAdapter, _FALSE);
|
||||
/* dm_CheckTXPowerTracking(&pHalData->odmpriv); */ /* trigger thermal meter */
|
||||
/* dm_check_txpowertracking(&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);
|
||||
pMptCtx->backup0x52_RF_A = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);
|
||||
pMptCtx->backup0x52_RF_B = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0);
|
||||
pMptCtx->backup0xc50 = (u1Byte)phy_query_bb_reg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0);
|
||||
pMptCtx->backup0xc58 = (u1Byte)phy_query_bb_reg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0);
|
||||
pMptCtx->backup0xc30 = (u1Byte)phy_query_bb_reg(pAdapter, rOFDM0_RxDetector1, bMaskByte0);
|
||||
pMptCtx->backup0x52_RF_A = (u1Byte)phy_query_rf_reg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);
|
||||
pMptCtx->backup0x52_RF_B = (u1Byte)phy_query_rf_reg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0);
|
||||
#ifdef CONFIG_RTL8188E
|
||||
rtw_write32(pAdapter, REG_MACID_NO_LINK_0, 0x0);
|
||||
rtw_write32(pAdapter, REG_MACID_NO_LINK_1, 0x0);
|
||||
#endif
|
||||
#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);
|
||||
pHalData->BackUp_IG_REG_4_Chnl_Section[0] = (u1Byte)phy_query_bb_reg(pAdapter, rA_IGI_Jaguar, bMaskByte0);
|
||||
pHalData->BackUp_IG_REG_4_Chnl_Section[1] = (u1Byte)phy_query_bb_reg(pAdapter, rB_IGI_Jaguar, bMaskByte0);
|
||||
pHalData->BackUp_IG_REG_4_Chnl_Section[2] = (u1Byte)phy_query_bb_reg(pAdapter, rC_IGI_Jaguar2, bMaskByte0);
|
||||
pHalData->BackUp_IG_REG_4_Chnl_Section[3] = (u1Byte)phy_query_bb_reg(pAdapter, rD_IGI_Jaguar2, bMaskByte0);
|
||||
}
|
||||
#endif
|
||||
return rtStatus;
|
||||
|
|
@ -630,7 +693,7 @@ MPT_DeInitAdapter(
|
|||
IN PADAPTER pAdapter
|
||||
)
|
||||
{
|
||||
PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
|
||||
PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.mpt_ctx;
|
||||
|
||||
pMptCtx->bMptDrvUnload = _TRUE;
|
||||
#if defined(CONFIG_RTL8723B)
|
||||
|
|
@ -638,7 +701,7 @@ MPT_DeInitAdapter(
|
|||
_cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer);
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8723B)
|
||||
PHY_SetBBReg(pAdapter, 0xA01, BIT0, 1); /* /suggestion by jerry for MP Rx. */
|
||||
phy_set_bb_reg(pAdapter, 0xA01, BIT0, 1); /* /suggestion by jerry for MP Rx. */
|
||||
#endif
|
||||
#if 0 /* for Windows */
|
||||
PlatformFreeWorkItem(&(pMptCtx->MptWorkItem));
|
||||
|
|
@ -653,15 +716,15 @@ MPT_DeInitAdapter(
|
|||
|
||||
static u8 mpt_ProStartTest(PADAPTER padapter)
|
||||
{
|
||||
PMPT_CONTEXT pMptCtx = &padapter->mppriv.MptCtx;
|
||||
PMPT_CONTEXT pMptCtx = &padapter->mppriv.mpt_ctx;
|
||||
|
||||
pMptCtx->bMassProdTest = _TRUE;
|
||||
pMptCtx->bStartContTx = _FALSE;
|
||||
pMptCtx->is_start_cont_tx = _FALSE;
|
||||
pMptCtx->bCckContTx = _FALSE;
|
||||
pMptCtx->bOfdmContTx = _FALSE;
|
||||
pMptCtx->bSingleCarrier = _FALSE;
|
||||
pMptCtx->bCarrierSuppression = _FALSE;
|
||||
pMptCtx->bSingleTone = _FALSE;
|
||||
pMptCtx->is_carrier_suppression = _FALSE;
|
||||
pMptCtx->is_single_tone = _FALSE;
|
||||
pMptCtx->HWTxmode = PACKETS_TX;
|
||||
|
||||
return _SUCCESS;
|
||||
|
|
@ -692,63 +755,56 @@ void rtw_mp_trigger_lck(PADAPTER padapter)
|
|||
PHY_LCCalibrate(padapter);
|
||||
}
|
||||
|
||||
static void disable_dm(PADAPTER padapter)
|
||||
static void init_mp_data(PADAPTER padapter)
|
||||
{
|
||||
u8 v8;
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
|
||||
struct PHY_DM_STRUCT *pDM_Odm = &pHalData->odmpriv;
|
||||
|
||||
/* 3 1. disable firmware dynamic mechanism */
|
||||
/* disable Power Training, Rate Adaptive */
|
||||
/*disable BCN*/
|
||||
v8 = rtw_read8(padapter, REG_BCN_CTRL);
|
||||
v8 &= ~EN_BCN_FUNCTION;
|
||||
rtw_write8(padapter, REG_BCN_CTRL, v8);
|
||||
|
||||
/* 3 2. disable driver dynamic mechanism */
|
||||
rtw_phydm_func_disable_all(padapter);
|
||||
|
||||
/* 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 */
|
||||
pDM_Odm->rf_calibrate_info.txpowertrack_control = _FALSE;
|
||||
}
|
||||
|
||||
|
||||
void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
|
||||
struct PHY_DM_STRUCT *pDM_Odm = &pHalData->odmpriv;
|
||||
u32 rf_ability;
|
||||
|
||||
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;
|
||||
rf_ability = ((u32)halrf_cmn_info_get(pDM_Odm, HALRF_CMNINFO_ABILITY)) | HAL_RF_TX_PWR_TRACK;
|
||||
halrf_cmn_info_set(pDM_Odm, HALRF_CMNINFO_ABILITY, rf_ability);
|
||||
|
||||
pDM_Odm->rf_calibrate_info.txpowertrack_control = _TRUE;
|
||||
padapter->mppriv.mp_dm = 1;
|
||||
|
||||
} else {
|
||||
RTW_INFO("in MPT_PwrCtlDM stop\n");
|
||||
disable_dm(padapter);
|
||||
pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;
|
||||
rf_ability = ((u32)halrf_cmn_info_get(pDM_Odm, HALRF_CMNINFO_ABILITY)) & ~HAL_RF_TX_PWR_TRACK;
|
||||
halrf_cmn_info_set(pDM_Odm, HALRF_CMNINFO_ABILITY, rf_ability);
|
||||
pDM_Odm->rf_calibrate_info.txpowertrack_control = _FALSE;
|
||||
padapter->mppriv.mp_dm = 0;
|
||||
{
|
||||
TXPWRTRACK_CFG c;
|
||||
struct _TXPWRTRACK_CFG c;
|
||||
u1Byte chnl = 0 ;
|
||||
_rtw_memset(&c, 0, sizeof(TXPWRTRACK_CFG));
|
||||
ConfigureTxpowerTrack(pDM_Odm, &c);
|
||||
ODM_ClearTxPowerTrackingState(pDM_Odm);
|
||||
if (*c.ODM_TxPwrTrackSetPwr) {
|
||||
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);
|
||||
_rtw_memset(&c, 0, sizeof(struct _TXPWRTRACK_CFG));
|
||||
configure_txpower_track(pDM_Odm, &c);
|
||||
odm_clear_txpowertracking_state(pDM_Odm);
|
||||
if (*c.odm_tx_pwr_track_set_pwr) {
|
||||
if (pDM_Odm->support_ic_type == ODM_RTL8188F)
|
||||
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_A, chnl);
|
||||
else if (pDM_Odm->support_ic_type == ODM_RTL8723D) {
|
||||
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, 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);
|
||||
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_A, chnl);
|
||||
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_B, chnl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -812,7 +868,7 @@ u32 mp_join(PADAPTER padapter, u8 mode)
|
|||
|
||||
/* init mp_start_test status */
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
|
||||
rtw_disassoc_cmd(padapter, 500, _TRUE);
|
||||
rtw_disassoc_cmd(padapter, 500, 0);
|
||||
rtw_indicate_disconnect(padapter, 0, _FALSE);
|
||||
rtw_free_assoc_resources(padapter, 1);
|
||||
}
|
||||
|
|
@ -841,7 +897,7 @@ u32 mp_join(PADAPTER padapter, u8 mode)
|
|||
set_fwstate(pmlmepriv, WIFI_STATION_STATE);
|
||||
/* 3 3. join psudo AdHoc */
|
||||
tgt_network->join_res = 1;
|
||||
tgt_network->aid = psta->aid = 1;
|
||||
tgt_network->aid = psta->cmn.aid = 1;
|
||||
|
||||
_rtw_memcpy(&padapter->registrypriv.dev_network, &bssid, length);
|
||||
rtw_update_registrypriv_dev_network(padapter);
|
||||
|
|
@ -866,6 +922,7 @@ u32 mp_join(PADAPTER padapter, u8 mode)
|
|||
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));
|
||||
rtw_hal_rcr_set_chk_bssid(padapter, MLME_ADHOC_STARTED);
|
||||
|
||||
report_join_res(padapter, 1);
|
||||
pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;
|
||||
|
|
@ -890,17 +947,10 @@ s32 mp_start_test(PADAPTER padapter)
|
|||
|
||||
padapter->registrypriv.mp_mode = 1;
|
||||
|
||||
/* 3 disable dynamic mechanism */
|
||||
disable_dm(padapter);
|
||||
init_mp_data(padapter);
|
||||
#ifdef CONFIG_RTL8814A
|
||||
rtl8814_InitHalDm(padapter);
|
||||
#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 */
|
||||
|
|
@ -925,7 +975,7 @@ s32 mp_start_test(PADAPTER padapter)
|
|||
|
||||
/* 3 0. update mp_priv */
|
||||
|
||||
if (padapter->registrypriv.rf_config == RF_MAX_TYPE) {
|
||||
if (!RF_TYPE_VALID(padapter->registrypriv.rf_config)) {
|
||||
/* switch (phal->rf_type) { */
|
||||
switch (GET_RF_TYPE(padapter)) {
|
||||
case RF_1T1R:
|
||||
|
|
@ -938,7 +988,6 @@ s32 mp_start_test(PADAPTER padapter)
|
|||
pmppriv->antenna_rx = ANTENNA_AB;
|
||||
break;
|
||||
case RF_2T2R:
|
||||
case RF_2T2R_GREEN:
|
||||
pmppriv->antenna_tx = ANTENNA_AB;
|
||||
pmppriv->antenna_rx = ANTENNA_AB;
|
||||
break;
|
||||
|
|
@ -1146,6 +1195,10 @@ void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter , BOOLEAN bMain)
|
|||
|
||||
}
|
||||
|
||||
u8 MP_PHY_QueryRFPathSwitch(PADAPTER pAdapter)
|
||||
{
|
||||
return PHY_QueryRFPathSwitch(pAdapter);
|
||||
}
|
||||
|
||||
s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther)
|
||||
{
|
||||
|
|
@ -1185,18 +1238,6 @@ void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)
|
|||
hal_mpt_SetCarrierSuppressionTx(pAdapter, bStart);
|
||||
}
|
||||
|
||||
void SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart)
|
||||
{
|
||||
PhySetTxPowerLevel(pAdapter);
|
||||
hal_mpt_SetCCKContinuousTx(pAdapter, bStart);
|
||||
}
|
||||
|
||||
void SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart)
|
||||
{
|
||||
PhySetTxPowerLevel(pAdapter);
|
||||
hal_mpt_SetOFDMContinuousTx(pAdapter, bStart);
|
||||
} /* mpt_StartOfdmContTx */
|
||||
|
||||
void SetContinuousTx(PADAPTER pAdapter, u8 bStart)
|
||||
{
|
||||
PhySetTxPowerLevel(pAdapter);
|
||||
|
|
@ -1246,6 +1287,48 @@ static struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv)
|
|||
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCIE_HCI
|
||||
static u8 check_nic_enough_desc(_adapter *padapter, struct pkt_attrib *pattrib)
|
||||
{
|
||||
u32 prio;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct rtw_tx_ring *ring;
|
||||
|
||||
switch (pattrib->qsel) {
|
||||
case 0:
|
||||
case 3:
|
||||
prio = BE_QUEUE_INX;
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
prio = BK_QUEUE_INX;
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
prio = VI_QUEUE_INX;
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
prio = VO_QUEUE_INX;
|
||||
break;
|
||||
default:
|
||||
prio = BE_QUEUE_INX;
|
||||
break;
|
||||
}
|
||||
|
||||
ring = &pxmitpriv->tx_ring[prio];
|
||||
|
||||
/*
|
||||
* for now we reserve two free descriptor as a safety boundary
|
||||
* between the tail and the head
|
||||
*/
|
||||
if ((ring->entries - ring->qlen) >= 2)
|
||||
return _TRUE;
|
||||
else
|
||||
return _FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
static thread_return mp_xmit_packet_thread(thread_context context)
|
||||
{
|
||||
struct xmit_frame *pxmitframe;
|
||||
|
|
@ -1264,6 +1347,12 @@ static thread_return mp_xmit_packet_thread(thread_context context)
|
|||
RTW_INFO("%s:pkTx Start\n", __func__);
|
||||
while (1) {
|
||||
pxmitframe = alloc_mp_xmitframe(pxmitpriv);
|
||||
#ifdef CONFIG_PCIE_HCI
|
||||
if(check_nic_enough_desc(padapter, &pmptx->attrib) == _FALSE) {
|
||||
rtw_usleep_os(1000);
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
if (pxmitframe == NULL) {
|
||||
if (pmptx->stop ||
|
||||
RTW_CANNOT_RUN(padapter))
|
||||
|
|
@ -1299,7 +1388,8 @@ static thread_return mp_xmit_packet_thread(thread_context context)
|
|||
pmptx->pallocated_buf = NULL;
|
||||
pmptx->stop = 1;
|
||||
|
||||
thread_exit();
|
||||
thread_exit(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc)
|
||||
|
|
@ -1662,13 +1752,13 @@ static void Rtw_MPSetMacTxEDCA(PADAPTER padapter)
|
|||
|
||||
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));
|
||||
phy_set_mac_reg(padapter, 0x458 , bMaskDWord , 0x0);
|
||||
/*RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" ,__func__, phy_query_bb_reg(padapter, 0x460, bMaskDWord));*/
|
||||
phy_set_mac_reg(padapter, 0x460 , bMaskLWord , 0x0); /* fast EDCA queue packet interval & time out value*/
|
||||
/*phy_set_mac_reg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);*/
|
||||
/*phy_set_mac_reg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);*/
|
||||
/*phy_set_mac_reg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);*/
|
||||
RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" , __func__, phy_query_bb_reg(padapter, 0x460, bMaskDWord));
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1696,13 +1786,12 @@ void SetPacketTx(PADAPTER padapter)
|
|||
_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
|
||||
_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
|
||||
bmcast = IS_MCAST(pattrib->ra);
|
||||
if (bmcast) {
|
||||
pattrib->mac_id = 1;
|
||||
if (bmcast)
|
||||
pattrib->psta = rtw_get_bcmc_stainfo(padapter);
|
||||
} else {
|
||||
pattrib->mac_id = 0;
|
||||
else
|
||||
pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
|
||||
}
|
||||
|
||||
pattrib->mac_id = pattrib->psta->cmn.mac_id;
|
||||
pattrib->mbssid = 0;
|
||||
|
||||
pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen;
|
||||
|
|
@ -1777,7 +1866,7 @@ void SetPacketTx(PADAPTER padapter)
|
|||
|
||||
/* 3 4. make wlan header, make_wlanhdr() */
|
||||
hdr = (struct rtw_ieee80211_hdr *)pkt_start;
|
||||
SetFrameSubType(&hdr->frame_ctl, pattrib->subtype);
|
||||
set_frame_sub_type(&hdr->frame_ctl, pattrib->subtype);
|
||||
|
||||
_rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); /* DA */
|
||||
_rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); /* SA */
|
||||
|
|
@ -1821,8 +1910,10 @@ void SetPacketTx(PADAPTER padapter)
|
|||
/* 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))
|
||||
RTW_INFO("Create PktTx Thread Fail !!!!!\n");
|
||||
if (IS_ERR(pmp_priv->tx.PktTxThread)) {
|
||||
RTW_ERR("Create PktTx Thread Fail !!!!!\n");
|
||||
pmp_priv->tx.PktTxThread = NULL;
|
||||
}
|
||||
#endif
|
||||
#ifdef PLATFORM_FREEBSD
|
||||
{
|
||||
|
|
@ -1849,7 +1940,7 @@ void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB)
|
|||
|
||||
if (bStartRx) {
|
||||
#ifdef CONFIG_RTL8723B
|
||||
PHY_SetMacReg(pAdapter, 0xe70, BIT23 | BIT22, 0x3); /* Power on adc (in RX_WAIT_CCA state) */
|
||||
phy_set_mac_reg(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
|
||||
pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AMF | RCR_HTC_LOC_CTRL;
|
||||
|
|
@ -1877,7 +1968,7 @@ void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB)
|
|||
pHalData->ReceiveConfig |= RCR_AB;
|
||||
} else {
|
||||
#ifdef CONFIG_RTL8723B
|
||||
PHY_SetMacReg(pAdapter, 0xe70, BIT23 | BIT22, 0x00); /* Power off adc (in RX_WAIT_CCA state) */
|
||||
phy_set_mac_reg(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
|
||||
pHalData->ReceiveConfig = 0;
|
||||
|
|
@ -2107,7 +2198,7 @@ void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv)
|
|||
#endif
|
||||
|
||||
u8
|
||||
MptToMgntRate(
|
||||
mpt_to_mgnt_rate(
|
||||
IN ULONG MptRateIdx
|
||||
)
|
||||
{
|
||||
|
|
@ -2291,7 +2382,7 @@ MptToMgntRate(
|
|||
|
||||
case MPT_RATE_LAST: /* fully automatiMGN_VHT2SS_MCS1; */
|
||||
default:
|
||||
RTW_INFO("<===MptToMgntRate(), Invalid Rate: %d!!\n", MptRateIdx);
|
||||
RTW_INFO("<===mpt_to_mgnt_rate(), Invalid Rate: %d!!\n", MptRateIdx);
|
||||
return 0x0;
|
||||
}
|
||||
}
|
||||
|
|
@ -2556,7 +2647,7 @@ u8 HwRateToMPTRate(u8 rate)
|
|||
break;
|
||||
|
||||
default:
|
||||
RTW_INFO("HwRateToMRate(): Non supported Rate [%x]!!!\n", rate);
|
||||
RTW_INFO("hw_rate_to_m_rate(): Non supported Rate [%x]!!!\n", rate);
|
||||
break;
|
||||
}
|
||||
return ret_rate;
|
||||
|
|
@ -2592,6 +2683,17 @@ u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr)
|
|||
return _FAIL;
|
||||
}
|
||||
|
||||
u8 rtw_mp_mode_check(PADAPTER pAdapter)
|
||||
{
|
||||
PADAPTER primary_adapter = GET_PRIMARY_ADAPTER(pAdapter);
|
||||
|
||||
if (primary_adapter->registrypriv.mp_mode == 1)
|
||||
return _TRUE;
|
||||
else
|
||||
return _FALSE;
|
||||
}
|
||||
|
||||
|
||||
ULONG mpt_ProQueryCalTxPower(
|
||||
PADAPTER pAdapter,
|
||||
u8 RfPath
|
||||
|
|
@ -2599,24 +2701,24 @@ ULONG mpt_ProQueryCalTxPower(
|
|||
{
|
||||
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
|
||||
PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
|
||||
PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx);
|
||||
|
||||
ULONG TxPower = 1;
|
||||
u1Byte rate = 0;
|
||||
struct txpwr_idx_comp tic;
|
||||
u8 mgn_rate = MptToMgntRate(pMptCtx->MptRateIndex);
|
||||
u8 mgn_rate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index);
|
||||
|
||||
TxPower = rtw_hal_get_tx_power_index(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel, &tic);
|
||||
TxPower = rtw_hal_get_tx_power_index(pAdapter, RfPath, mgn_rate, pHalData->current_channel_bw, pHalData->current_channel, &tic);
|
||||
|
||||
RTW_INFO("bw=%d, ch=%d, rate=%d, txPower:%u = %u + (%d=%d:%d) + (%d) + (%d)\n",
|
||||
pHalData->CurrentChannelBW, pHalData->CurrentChannel, mgn_rate
|
||||
pHalData->current_channel_bw, pHalData->current_channel, 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;
|
||||
pMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)TxPower;
|
||||
pMptCtx->TxPwrLevel[ODM_RF_PATH_C] = (u8)TxPower;
|
||||
pMptCtx->TxPwrLevel[ODM_RF_PATH_D] = (u8)TxPower;
|
||||
pMptCtx->TxPwrLevel[RF_PATH_A] = (u8)TxPower;
|
||||
pMptCtx->TxPwrLevel[RF_PATH_B] = (u8)TxPower;
|
||||
pMptCtx->TxPwrLevel[RF_PATH_C] = (u8)TxPower;
|
||||
pMptCtx->TxPwrLevel[RF_PATH_D] = (u8)TxPower;
|
||||
hal_mpt_SetTxPower(pAdapter);
|
||||
|
||||
return TxPower;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_MP_IOCTL_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
@ -2439,7 +2434,7 @@ unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)
|
|||
|
||||
fctrl = &(pwlanhdr->frame_ctl);
|
||||
*(fctrl) = 0;
|
||||
SetFrameSubType(pframe, WIFI_DATA);
|
||||
set_frame_sub_type(pframe, WIFI_DATA);
|
||||
|
||||
_rtw_memcpy(pwlanhdr->addr1, pethhdr->h_dest, ETH_ALEN);
|
||||
_rtw_memcpy(pwlanhdr->addr2, pethhdr->h_source, ETH_ALEN);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2013 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,185 +11,57 @@
|
|||
* 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 <rtw_odm.h>
|
||||
#include <hal_data.h>
|
||||
|
||||
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_SNIFFER",
|
||||
/* BIT6 */"ODM_COMP_ANT_DIV",
|
||||
/* BIT7 */"ODM_COMP_DFS",
|
||||
/* BIT8 */"ODM_COMP_NOISY_DETECT",
|
||||
/* BIT9 */"ODM_COMP_RATE_ADAPTIVE",
|
||||
/* BIT10 */"ODM_COMP_PATH_DIV",
|
||||
/* BIT11 */"ODM_COMP_CCX",
|
||||
/* BIT12 */"ODM_COMP_DYNAMIC_PRICCA",
|
||||
/* BIT13 */NULL,
|
||||
/* 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 */"ODM_COMP_INIT",
|
||||
/* BIT30 */"ODM_COMP_COMMON",
|
||||
};
|
||||
|
||||
#define RTW_ODM_COMP_MAX 31
|
||||
|
||||
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 */NULL,
|
||||
/* BIT8 */"ODM_BB_PWR_TRAIN",
|
||||
/* BIT9 */"ODM_BB_RATE_ADAPTIVE",
|
||||
/* BIT10 */"ODM_BB_PATH_DIV",
|
||||
/* BIT11 */NULL,
|
||||
/* BIT12 */NULL,
|
||||
/* BIT13 */"ODM_BB_ADAPTIVITY",
|
||||
/* BIT14 */"ODM_BB_CFO_TRACKING",
|
||||
/* BIT15 */"ODM_BB_NHM_CNT",
|
||||
/* BIT16 */"ODM_BB_PRIMARY_CCA",
|
||||
/* BIT17 */"ODM_BB_TXBF",
|
||||
/* BIT18 */"ODM_BB_DYNAMIC_ARFR",
|
||||
/* 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)
|
||||
u32 rtw_phydm_ability_ops(_adapter *adapter, HAL_PHYDM_OPS ops, u32 ability)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
|
||||
DM_ODM_T *odm = &pHalData->odmpriv;
|
||||
int cnt = 0;
|
||||
u64 dbg_comp = 0;
|
||||
int i;
|
||||
struct PHY_DM_STRUCT *podmpriv = &pHalData->odmpriv;
|
||||
u32 result = 0;
|
||||
|
||||
rtw_hal_get_odm_var(adapter, HAL_ODM_DBG_FLAG, &dbg_comp, NULL);
|
||||
|
||||
RTW_PRINT_SEL(sel, "odm.DebugComponents = 0x%016llx\n", dbg_comp);
|
||||
for (i = 0; i < RTW_ODM_COMP_MAX; i++) {
|
||||
if (odm_comp_str[i])
|
||||
RTW_PRINT_SEL(sel, "%cBIT%-2d %s\n",
|
||||
(BIT0 & (dbg_comp >> i)) ? '+' : ' ', i, odm_comp_str[i]);
|
||||
switch (ops) {
|
||||
case HAL_PHYDM_DIS_ALL_FUNC:
|
||||
podmpriv->support_ability = DYNAMIC_FUNC_DISABLE;
|
||||
halrf_cmn_info_set(podmpriv, HALRF_CMNINFO_ABILITY, DYNAMIC_FUNC_DISABLE);
|
||||
break;
|
||||
case HAL_PHYDM_FUNC_SET:
|
||||
podmpriv->support_ability |= ability;
|
||||
break;
|
||||
case HAL_PHYDM_FUNC_CLR:
|
||||
podmpriv->support_ability &= ~(ability);
|
||||
break;
|
||||
case HAL_PHYDM_ABILITY_BK:
|
||||
/* dm flag backup*/
|
||||
podmpriv->bk_support_ability = podmpriv->support_ability;
|
||||
pHalData->bk_rf_ability = halrf_cmn_info_get(podmpriv, HALRF_CMNINFO_ABILITY);
|
||||
break;
|
||||
case HAL_PHYDM_ABILITY_RESTORE:
|
||||
/* restore dm flag */
|
||||
podmpriv->support_ability = podmpriv->bk_support_ability;
|
||||
halrf_cmn_info_set(podmpriv, HALRF_CMNINFO_ABILITY, pHalData->bk_rf_ability);
|
||||
break;
|
||||
case HAL_PHYDM_ABILITY_SET:
|
||||
podmpriv->support_ability = ability;
|
||||
break;
|
||||
case HAL_PHYDM_ABILITY_GET:
|
||||
result = podmpriv->support_ability;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void rtw_odm_dbg_comp_set(_adapter *adapter, u64 comps)
|
||||
{
|
||||
rtw_hal_set_odm_var(adapter, HAL_ODM_DBG_FLAG, &comps, _FALSE);
|
||||
}
|
||||
|
||||
void rtw_odm_dbg_level_msg(void *sel, _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;
|
||||
|
||||
rtw_hal_get_odm_var(adapter, HAL_ODM_DBG_LEVEL, &dbg_level, NULL);
|
||||
RTW_PRINT_SEL(sel, "odm.DebugLevel = %u\n", dbg_level);
|
||||
for (i = 0; i < RTW_ODM_DBG_LEVEL_NUM; i++) {
|
||||
if (odm_dbg_level_str[i])
|
||||
RTW_PRINT_SEL(sel, "%u %s\n", i, odm_dbg_level_str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
inline void rtw_odm_dbg_level_set(_adapter *adapter, u32 level)
|
||||
{
|
||||
rtw_hal_set_odm_var(adapter, HAL_ODM_DBG_LEVEL, &level, _FALSE);
|
||||
}
|
||||
|
||||
void rtw_odm_ability_msg(void *sel, _adapter *adapter)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
|
||||
DM_ODM_T *odm = &pHalData->odmpriv;
|
||||
int cnt = 0;
|
||||
u32 ability = 0;
|
||||
int i;
|
||||
|
||||
ability = rtw_phydm_ability_get(adapter);
|
||||
RTW_PRINT_SEL(sel, "odm.SupportAbility = 0x%08x\n", ability);
|
||||
for (i = 0; i < RTW_ODM_ABILITY_MAX; i++) {
|
||||
if (odm_ability_str[i])
|
||||
RTW_PRINT_SEL(sel, "%cBIT%-2d %s\n",
|
||||
(BIT0 << i) & ability ? '+' : ' ', i, odm_ability_str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
inline void rtw_odm_ability_set(_adapter *adapter, u32 ability)
|
||||
{
|
||||
rtw_phydm_ability_set(adapter, ability);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* set ODM_CMNINFO_IC_TYPE based on chip_type */
|
||||
void rtw_odm_init_ic_type(_adapter *adapter)
|
||||
{
|
||||
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
|
||||
DM_ODM_T *odm = &hal_data->odmpriv;
|
||||
struct PHY_DM_STRUCT *odm = adapter_to_phydm(adapter);
|
||||
u4Byte ic_type = chip_type_to_odm_ic_type(rtw_get_chip_type(adapter));
|
||||
|
||||
rtw_warn_on(!ic_type);
|
||||
|
||||
ODM_CmnInfoInit(odm, ODM_CMNINFO_IC_TYPE, ic_type);
|
||||
}
|
||||
|
||||
inline void rtw_odm_set_force_igi_lb(_adapter *adapter, u8 lb)
|
||||
{
|
||||
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
|
||||
|
||||
hal_data->u1ForcedIgiLb = lb;
|
||||
}
|
||||
|
||||
inline u8 rtw_odm_get_force_igi_lb(_adapter *adapter)
|
||||
{
|
||||
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
|
||||
|
||||
return hal_data->u1ForcedIgiLb;
|
||||
odm_cmn_info_init(odm, ODM_CMNINFO_IC_TYPE, ic_type);
|
||||
}
|
||||
|
||||
void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter)
|
||||
|
|
@ -203,9 +75,6 @@ void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter)
|
|||
void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter)
|
||||
{
|
||||
struct registry_priv *regsty = &adapter->registrypriv;
|
||||
struct mlme_priv *mlme = &adapter->mlmepriv;
|
||||
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
|
||||
DM_ODM_T *odm = &hal_data->odmpriv;
|
||||
|
||||
RTW_PRINT_SEL(sel, "RTW_ADAPTIVITY_EN_");
|
||||
|
||||
|
|
@ -281,51 +150,48 @@ bool rtw_odm_adaptivity_needed(_adapter *adapter)
|
|||
|
||||
void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
|
||||
DM_ODM_T *odm = &pHalData->odmpriv;
|
||||
struct PHY_DM_STRUCT *odm = adapter_to_phydm(adapter);
|
||||
|
||||
rtw_odm_adaptivity_config_msg(sel, adapter);
|
||||
|
||||
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");
|
||||
, "th_l2h_ini", "th_edcca_hl_diff", "th_l2h_ini_mode2", "th_edcca_hl_diff_mode2", "edcca_enable");
|
||||
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
|
||||
, odm->TH_EDCCA_HL_diff_mode2
|
||||
, odm->EDCCA_enable
|
||||
, (u8)odm->th_l2h_ini
|
||||
, odm->th_edcca_hl_diff
|
||||
, (u8)odm->th_l2h_ini_mode2
|
||||
, odm->th_edcca_hl_diff_mode2
|
||||
, odm->edcca_enable
|
||||
);
|
||||
|
||||
RTW_PRINT_SEL(sel, "%15s %9s\n", "AdapEnableState", "Adap_Flag");
|
||||
RTW_PRINT_SEL(sel, "%-15x %-9x\n"
|
||||
, odm->Adaptivity_enable
|
||||
, odm->adaptivity_enable
|
||||
, odm->adaptivity_flag
|
||||
);
|
||||
}
|
||||
|
||||
void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff, s8 TH_L2H_ini_mode2, s8 TH_EDCCA_HL_diff_mode2, u8 EDCCA_enable)
|
||||
void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 th_l2h_ini, s8 th_edcca_hl_diff, s8 th_l2h_ini_mode2, s8 th_edcca_hl_diff_mode2, u8 edcca_enable)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
|
||||
DM_ODM_T *odm = &pHalData->odmpriv;
|
||||
struct PHY_DM_STRUCT *odm = adapter_to_phydm(adapter);
|
||||
|
||||
odm->TH_L2H_ini = TH_L2H_ini;
|
||||
odm->TH_EDCCA_HL_diff = TH_EDCCA_HL_diff;
|
||||
odm->TH_L2H_ini_mode2 = TH_L2H_ini_mode2;
|
||||
odm->TH_EDCCA_HL_diff_mode2 = TH_EDCCA_HL_diff_mode2;
|
||||
odm->EDCCA_enable = EDCCA_enable;
|
||||
odm->th_l2h_ini = th_l2h_ini;
|
||||
odm->th_edcca_hl_diff = th_edcca_hl_diff;
|
||||
odm->th_l2h_ini_mode2 = th_l2h_ini_mode2;
|
||||
odm->th_edcca_hl_diff_mode2 = th_edcca_hl_diff_mode2;
|
||||
odm->edcca_enable = edcca_enable;
|
||||
}
|
||||
|
||||
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);
|
||||
struct PHY_DM_STRUCT *odm = adapter_to_phydm(adapter);
|
||||
|
||||
RTW_PRINT_SEL(sel, "RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n",
|
||||
HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);
|
||||
RTW_PRINT_SEL(sel, "rx_rate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n",
|
||||
HDATA_RATE(odm->rx_rate), odm->RSSI_A, odm->RSSI_B);
|
||||
}
|
||||
|
||||
|
||||
void rtw_odm_acquirespinlock(_adapter *adapter, RT_SPINLOCK_TYPE type)
|
||||
void rtw_odm_acquirespinlock(_adapter *adapter, enum rt_spinlock_type type)
|
||||
{
|
||||
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
|
||||
_irqL irqL;
|
||||
|
|
@ -338,7 +204,7 @@ void rtw_odm_acquirespinlock(_adapter *adapter, RT_SPINLOCK_TYPE type)
|
|||
}
|
||||
}
|
||||
|
||||
void rtw_odm_releasespinlock(_adapter *adapter, RT_SPINLOCK_TYPE type)
|
||||
void rtw_odm_releasespinlock(_adapter *adapter, enum rt_spinlock_type type)
|
||||
{
|
||||
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
|
||||
_irqL irqL;
|
||||
|
|
@ -351,34 +217,46 @@ void rtw_odm_releasespinlock(_adapter *adapter, RT_SPINLOCK_TYPE type)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DFS_MASTER
|
||||
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);
|
||||
#ifdef CONFIG_DFS_MASTER
|
||||
struct PHY_DM_STRUCT *pDM_Odm = adapter_to_phydm(adapter);
|
||||
|
||||
return pDM_Odm->DFS_RegionDomain;
|
||||
return pDM_Odm->dfs_region_domain;
|
||||
#else
|
||||
return PHYDM_DFS_DOMAIN_UNKNOWN;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline u8 rtw_odm_dfs_domain_unknown(_adapter *adapter)
|
||||
{
|
||||
#ifdef CONFIG_DFS_MASTER
|
||||
return rtw_odm_get_dfs_domain(adapter) == PHYDM_DFS_DOMAIN_UNKNOWN;
|
||||
#else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DFS_MASTER
|
||||
inline VOID rtw_odm_radar_detect_reset(_adapter *adapter)
|
||||
{
|
||||
phydm_radar_detect_reset(GET_ODM(adapter));
|
||||
phydm_radar_detect_reset(adapter_to_phydm(adapter));
|
||||
}
|
||||
|
||||
inline VOID rtw_odm_radar_detect_disable(_adapter *adapter)
|
||||
{
|
||||
phydm_radar_detect_disable(GET_ODM(adapter));
|
||||
phydm_radar_detect_disable(adapter_to_phydm(adapter));
|
||||
}
|
||||
|
||||
/* called after ch, bw is set */
|
||||
inline VOID rtw_odm_radar_detect_enable(_adapter *adapter)
|
||||
{
|
||||
phydm_radar_detect_enable(GET_ODM(adapter));
|
||||
phydm_radar_detect_enable(adapter_to_phydm(adapter));
|
||||
}
|
||||
|
||||
inline BOOLEAN rtw_odm_radar_detect(_adapter *adapter)
|
||||
{
|
||||
return phydm_radar_detect(GET_ODM(adapter));
|
||||
return phydm_radar_detect(adapter_to_phydm(adapter));
|
||||
}
|
||||
#endif /* CONFIG_DFS_MASTER */
|
||||
|
||||
|
|
@ -390,12 +268,11 @@ void rtw_odm_parse_rx_phy_status_chinfo(union recv_frame *rframe, u8 *phys)
|
|||
|
||||
#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)
|
||||
_adapter *adapter = rframe->u.hdr.adapter;
|
||||
struct PHY_DM_STRUCT *phydm = adapter_to_phydm(adapter);
|
||||
struct rx_pkt_attrib *attrib = &rframe->u.hdr.attrib;
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
|
||||
PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
|
||||
u8 *wlanhdr = get_recvframe_data(rframe);
|
||||
|
||||
if (pDM_Odm->SupportICType & ODM_IC_PHY_STATUE_NEW_TYPE) {
|
||||
if (phydm->support_ic_type & ODM_IC_PHY_STATUE_NEW_TYPE) {
|
||||
/*
|
||||
* 8723D:
|
||||
* type_0(CCK)
|
||||
|
|
@ -424,7 +301,7 @@ void rtw_odm_parse_rx_phy_status_chinfo(union recv_frame *rframe, u8 *phys)
|
|||
*/
|
||||
|
||||
if ((*phys & 0xf) == 0) {
|
||||
struct _Phy_Status_Rpt_Jaguar2_Type0 *phys_t0 = (struct _Phy_Status_Rpt_Jaguar2_Type0 *)phys;
|
||||
struct _phy_status_rpt_jaguar2_type0 *phys_t0 = (struct _phy_status_rpt_jaguar2_type0 *)phys;
|
||||
|
||||
if (DBG_RX_PHYSTATUS_CHINFO) {
|
||||
RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, l_rxsc:%u)\n"
|
||||
|
|
@ -437,13 +314,13 @@ void rtw_odm_parse_rx_phy_status_chinfo(union recv_frame *rframe, u8 *phys)
|
|||
}
|
||||
|
||||
} else if ((*phys & 0xf) == 1) {
|
||||
struct _Phy_Status_Rpt_Jaguar2_Type1 *phys_t1 = (struct _Phy_Status_Rpt_Jaguar2_Type1 *)phys;
|
||||
struct _phy_status_rpt_jaguar2_type1 *phys_t1 = (struct _phy_status_rpt_jaguar2_type1 *)phys;
|
||||
u8 rxsc = (attrib->data_rate > DESC_RATE11M && attrib->data_rate < DESC_RATEMCS0) ? phys_t1->l_rxsc : phys_t1->ht_rxsc;
|
||||
u8 pkt_cch = 0;
|
||||
u8 pkt_bw = CHANNEL_WIDTH_20;
|
||||
|
||||
#if ODM_IC_11N_SERIES_SUPPORT
|
||||
if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {
|
||||
if (phydm->support_ic_type & ODM_IC_11N_SERIES) {
|
||||
/* RXSC N-series */
|
||||
#define RXSC_DUP 0
|
||||
#define RXSC_LSC 1
|
||||
|
|
@ -471,7 +348,7 @@ void rtw_odm_parse_rx_phy_status_chinfo(union recv_frame *rframe, u8 *phys)
|
|||
#endif /* ODM_IC_11N_SERIES_SUPPORT */
|
||||
|
||||
#if ODM_IC_11AC_SERIES_SUPPORT
|
||||
if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {
|
||||
if (phydm->support_ic_type & ODM_IC_11AC_SERIES) {
|
||||
/* RXSC AC-series */
|
||||
#define RXSC_DUP 0 /* 0: RX from all SC of current rf_mode */
|
||||
|
||||
|
|
@ -558,7 +435,7 @@ void rtw_odm_parse_rx_phy_status_chinfo(union recv_frame *rframe, u8 *phys)
|
|||
attrib->ch = pkt_cch;
|
||||
|
||||
} else {
|
||||
struct _Phy_Status_Rpt_Jaguar2_Type2 *phys_t2 = (struct _Phy_Status_Rpt_Jaguar2_Type2 *)phys;
|
||||
struct _phy_status_rpt_jaguar2_type2 *phys_t2 = (struct _phy_status_rpt_jaguar2_type2 *)phys;
|
||||
|
||||
if (DBG_RX_PHYSTATUS_CHINFO) {
|
||||
RTW_PRINT("phys_t%u ta="MAC_FMT" %s, %s(band:%u, ch:%u, l_rxsc:%u, ht_rxsc:%u)\n"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_P2P_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
@ -85,7 +80,7 @@ static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf)
|
|||
pcur += ETH_ALEN;
|
||||
|
||||
/* P2P interface address */
|
||||
_rtw_memcpy(pcur, psta->hwaddr, ETH_ALEN);
|
||||
_rtw_memcpy(pcur, psta->cmn.mac_addr, ETH_ALEN);
|
||||
pcur += ETH_ALEN;
|
||||
|
||||
*pcur = psta->dev_cap;
|
||||
|
|
@ -182,7 +177,7 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da)
|
|||
|
||||
SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
||||
pmlmeext->mgnt_seq++;
|
||||
SetFrameSubType(pframe, WIFI_ACTION);
|
||||
set_frame_sub_type(pframe, WIFI_ACTION);
|
||||
|
||||
pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
|
|
@ -242,7 +237,7 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s
|
|||
|
||||
SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
||||
pmlmeext->mgnt_seq++;
|
||||
SetFrameSubType(pframe, WIFI_ACTION);
|
||||
set_frame_sub_type(pframe, WIFI_ACTION);
|
||||
|
||||
pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
|
|
@ -320,7 +315,7 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr,
|
|||
|
||||
SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
||||
pmlmeext->mgnt_seq++;
|
||||
SetFrameSubType(pframe, WIFI_ACTION);
|
||||
set_frame_sub_type(pframe, WIFI_ACTION);
|
||||
|
||||
pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
|
|
@ -424,7 +419,7 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8
|
|||
|
||||
SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
|
||||
pmlmeext->mgnt_seq++;
|
||||
SetFrameSubType(pframe, WIFI_ACTION);
|
||||
set_frame_sub_type(pframe, WIFI_ACTION);
|
||||
|
||||
pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
|
|
@ -757,6 +752,7 @@ u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunnel
|
|||
_adapter *padapter = pwdinfo->padapter;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct wifi_display_info *pwfd_info = padapter->wdinfo.wfd_info;
|
||||
u16 v16 = 0;
|
||||
|
||||
if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST))
|
||||
goto exit;
|
||||
|
|
@ -794,36 +790,43 @@ u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunnel
|
|||
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);
|
||||
v16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT;
|
||||
RTW_PUT_BE16(wfdie + wfdielen, v16);
|
||||
} 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);
|
||||
v16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT;
|
||||
RTW_PUT_BE16(wfdie + wfdielen, v16);
|
||||
}
|
||||
} 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);
|
||||
v16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT;
|
||||
RTW_PUT_BE16(wfdie + wfdielen, v16);
|
||||
} 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);
|
||||
v16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT;
|
||||
RTW_PUT_BE16(wfdie + wfdielen, v16);
|
||||
}
|
||||
}
|
||||
} 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);
|
||||
v16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT;
|
||||
RTW_PUT_BE16(wfdie + wfdielen, v16);
|
||||
} 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);
|
||||
v16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT;
|
||||
RTW_PUT_BE16(wfdie + wfdielen, v16);
|
||||
}
|
||||
}
|
||||
} 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);
|
||||
|
||||
if (pwdinfo->wfd_tdls_enable) {
|
||||
v16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT;
|
||||
RTW_PUT_BE16(wfdie + wfdielen, v16);
|
||||
} else {
|
||||
v16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT;
|
||||
RTW_PUT_BE16(wfdie + wfdielen, v16);
|
||||
}
|
||||
}
|
||||
|
||||
wfdielen += 2;
|
||||
|
|
@ -2328,7 +2331,7 @@ u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint l
|
|||
if (!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
|
||||
return P2P_STATUS_FAIL_REQUEST_UNABLE;
|
||||
|
||||
frame_type = GetFrameSubType(pframe);
|
||||
frame_type = get_frame_sub_type(pframe);
|
||||
if (frame_type == WIFI_ASSOCREQ)
|
||||
ie_offset = _ASOCREQ_IE_OFFSET_;
|
||||
else /* WIFI_REASSOCREQ */
|
||||
|
|
@ -2467,7 +2470,7 @@ u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le
|
|||
|
||||
/* _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); */
|
||||
/* issue GO Discoverability Request */
|
||||
issue_group_disc_req(pwdinfo, psta->hwaddr);
|
||||
issue_group_disc_req(pwdinfo, psta->cmn.mac_addr);
|
||||
/* _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); */
|
||||
|
||||
status = P2P_STATUS_SUCCESS;
|
||||
|
|
@ -2491,7 +2494,7 @@ u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le
|
|||
|
||||
|
||||
/* issue Device Discoverability Response */
|
||||
issue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken);
|
||||
issue_p2p_devdisc_resp(pwdinfo, get_addr2_ptr(pframe), status, dialogToken);
|
||||
|
||||
|
||||
return (status == P2P_STATUS_SUCCESS) ? _TRUE : _FALSE;
|
||||
|
|
@ -2535,7 +2538,7 @@ u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint l
|
|||
break;
|
||||
}
|
||||
}
|
||||
issue_p2p_provision_resp(pwdinfo, GetAddr2Ptr(pframe), frame_body, uconfig_method);
|
||||
issue_p2p_provision_resp(pwdinfo, get_addr2_ptr(pframe), frame_body, uconfig_method);
|
||||
}
|
||||
}
|
||||
RTW_INFO("[%s] config method = %s\n", __FUNCTION__, pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req);
|
||||
|
|
@ -2571,26 +2574,15 @@ u8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8
|
|||
return ch_no;
|
||||
}
|
||||
|
||||
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)
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
return _FAIL;
|
||||
}
|
||||
|
||||
u8 rtw_p2p_ch_inclusion(struct mlme_ext_priv *pmlmeext, u8 *peer_ch_list, u8 peer_ch_num, u8 *ch_list_inclusioned)
|
||||
u8 rtw_p2p_ch_inclusion(_adapter *adapter, u8 *peer_ch_list, u8 peer_ch_num, u8 *ch_list_inclusioned)
|
||||
{
|
||||
struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
|
||||
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) {
|
||||
for (j = temp; j < rfctl->max_chan_nums; j++) {
|
||||
if (*(peer_ch_list + i) == rfctl->channel_set[j].ChannelNum) {
|
||||
ch_list_inclusioned[ch_no++] = *(peer_ch_list + i);
|
||||
temp = j;
|
||||
break;
|
||||
|
|
@ -2715,7 +2707,7 @@ u8 process_p2p_group_negotation_req(struct wifidirect_info *pwdinfo, u8 *pframe,
|
|||
|
||||
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);
|
||||
ch_num_inclusioned = rtw_p2p_ch_inclusion(padapter, peer_ch_list, peer_ch_num, ch_list_inclusioned);
|
||||
|
||||
if (ch_num_inclusioned == 0) {
|
||||
RTW_INFO("[%s] No common channel in channel list!\n", __FUNCTION__);
|
||||
|
|
@ -2910,7 +2902,7 @@ u8 process_p2p_group_negotation_resp(struct wifidirect_info *pwdinfo, u8 *pframe
|
|||
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);
|
||||
ch_num_inclusioned = rtw_p2p_ch_inclusion(padapter, peer_ch_list, peer_ch_num, ch_list_inclusioned);
|
||||
|
||||
if (ch_num_inclusioned == 0) {
|
||||
RTW_INFO("[%s] No common channel in channel list!\n", __FUNCTION__);
|
||||
|
|
@ -3004,9 +2996,8 @@ u8 process_p2p_group_negotation_confirm(struct wifidirect_info *pwdinfo, u8 *pfr
|
|||
result = attr_content;
|
||||
|
||||
if (attr_content == P2P_STATUS_SUCCESS) {
|
||||
u8 bcancelled = 0;
|
||||
|
||||
_cancel_timer(&pwdinfo->restore_p2p_state_timer, &bcancelled);
|
||||
_cancel_timer_ex(&pwdinfo->restore_p2p_state_timer);
|
||||
|
||||
/* Commented by Albert 20100911 */
|
||||
/* Todo: Need to handle the case which both Intents are the same. */
|
||||
|
|
@ -3073,7 +3064,7 @@ u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le
|
|||
|
||||
/* todo: check NoA attribute */
|
||||
|
||||
issue_p2p_presence_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken);
|
||||
issue_p2p_presence_resp(pwdinfo, get_addr2_ptr(pframe), status, dialogToken);
|
||||
|
||||
return _TRUE;
|
||||
}
|
||||
|
|
@ -3082,19 +3073,20 @@ void find_phase_handler(_adapter *padapter)
|
|||
{
|
||||
struct wifidirect_info *pwdinfo = &padapter->wdinfo;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
NDIS_802_11_SSID ssid;
|
||||
struct sitesurvey_parm parm;
|
||||
_irqL irqL;
|
||||
u8 _status = 0;
|
||||
|
||||
|
||||
_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_init_sitesurvey_parm(padapter, &parm);
|
||||
_rtw_memcpy(&parm.ssid[0].Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN);
|
||||
parm.ssid[0].SsidLength = P2P_WILDCARD_SSID_LEN;
|
||||
parm.ssid_num = 1;
|
||||
|
||||
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);
|
||||
_status = rtw_sitesurvey_cmd(padapter, &parm);
|
||||
_exit_critical_bh(&pmlmepriv->lock, &irqL);
|
||||
|
||||
|
||||
|
|
@ -3119,7 +3111,7 @@ void restore_p2p_state_handler(_adapter *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);
|
||||
rtw_back_opch(padapter);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
@ -3193,8 +3185,7 @@ void p2p_concurrent_handler(_adapter *padapter)
|
|||
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);
|
||||
|
||||
rtw_mi_buddy_issue_nulldata(padapter, NULL, 0, 3, 500);
|
||||
rtw_back_opch(padapter);
|
||||
|
||||
} else if (pwdinfo->driver_interface == DRIVER_WEXT) {
|
||||
if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) {
|
||||
|
|
@ -3204,8 +3195,7 @@ void p2p_concurrent_handler(_adapter *padapter)
|
|||
RTW_INFO("[%s] P2P_STATE_IDLE, ext_listen_period = %d\n", __FUNCTION__, pwdinfo->ext_listen_period);
|
||||
|
||||
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);
|
||||
rtw_leave_opch(padapter);
|
||||
set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);
|
||||
}
|
||||
|
||||
|
|
@ -3218,6 +3208,7 @@ void p2p_concurrent_handler(_adapter *padapter)
|
|||
/* 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) ||
|
||||
|
|
@ -3237,17 +3228,19 @@ void p2p_concurrent_handler(_adapter *padapter)
|
|||
rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
|
||||
}
|
||||
rtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE);
|
||||
rtw_mi_buddy_issue_nulldata(padapter, NULL, 0, 3, 500);
|
||||
rtw_back_opch(padapter);
|
||||
}
|
||||
|
||||
/* 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, union_ch, union_offset, union_bw);
|
||||
rtw_mi_buddy_issue_nulldata(padapter, NULL, 0, 3, 500);
|
||||
rtw_back_opch(padapter);
|
||||
|
||||
} 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);
|
||||
|
|
@ -3282,10 +3275,134 @@ void p2p_concurrent_handler(_adapter *padapter)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_IOCTL_CFG80211
|
||||
static u8 _stay_in_cur_chan(_adapter *padapter)
|
||||
{
|
||||
int i;
|
||||
_adapter *iface;
|
||||
struct mlme_priv *pmlmepriv;
|
||||
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
|
||||
u8 rst = _FALSE;
|
||||
|
||||
for (i = 0; i < dvobj->iface_nums; i++) {
|
||||
iface = dvobj->padapters[i];
|
||||
if (iface) {
|
||||
pmlmepriv = &iface->mlmepriv;
|
||||
|
||||
if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING | WIFI_UNDER_WPS) == _TRUE) {
|
||||
RTW_ERR(ADPT_FMT"- _FW_UNDER_LINKING |WIFI_UNDER_WPS (mlme state:0x%x)\n",
|
||||
ADPT_ARG(iface), get_fwstate(&iface->mlmepriv));
|
||||
rst = _TRUE;
|
||||
break;
|
||||
}
|
||||
#ifdef CONFIG_AP_MODE
|
||||
if (MLME_IS_AP(iface) || MLME_IS_MESH(iface)) {
|
||||
if (rtw_ap_sta_linking_state_check(iface) == _TRUE) {
|
||||
RTW_ERR(ADPT_FMT"- SoftAP/Mesh -have sta under linking\n", ADPT_ARG(iface));
|
||||
rst = _TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
return rst;
|
||||
}
|
||||
|
||||
static int ro_ch_handler(_adapter *adapter, u8 *buf)
|
||||
{
|
||||
/* TODO: move remain on channel logical here */
|
||||
return H2C_SUCCESS;
|
||||
int ret = H2C_SUCCESS;
|
||||
struct p2p_roch_parm *roch_parm = (struct p2p_roch_parm *)buf;
|
||||
struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter);
|
||||
struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &adapter->cfg80211_wdinfo;
|
||||
struct wifidirect_info *pwdinfo = &adapter->wdinfo;
|
||||
struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
|
||||
u8 ready_on_channel = _FALSE;
|
||||
u8 remain_ch;
|
||||
unsigned int duration;
|
||||
|
||||
_enter_critical_mutex(&pwdev_priv->roch_mutex, NULL);
|
||||
|
||||
if (rtw_cfg80211_get_is_roch(adapter) != _TRUE)
|
||||
goto exit;
|
||||
|
||||
remain_ch = (u8) ieee80211_frequency_to_channel(roch_parm->ch.center_freq);
|
||||
duration = roch_parm->duration;
|
||||
|
||||
RTW_INFO(FUNC_ADPT_FMT" ch:%u duration:%d, cookie:0x%llx\n"
|
||||
, FUNC_ADPT_ARG(adapter), remain_ch, roch_parm->duration, roch_parm->cookie);
|
||||
|
||||
if (roch_parm->wdev && roch_parm->cookie) {
|
||||
if (pcfg80211_wdinfo->ro_ch_wdev != roch_parm->wdev) {
|
||||
RTW_WARN(FUNC_ADPT_FMT" ongoing wdev:%p, wdev:%p\n"
|
||||
, FUNC_ADPT_ARG(adapter), pcfg80211_wdinfo->ro_ch_wdev, roch_parm->wdev);
|
||||
rtw_warn_on(1);
|
||||
}
|
||||
|
||||
if (pcfg80211_wdinfo->remain_on_ch_cookie != roch_parm->cookie) {
|
||||
RTW_WARN(FUNC_ADPT_FMT" ongoing cookie:0x%llx, cookie:0x%llx\n"
|
||||
, FUNC_ADPT_ARG(adapter), pcfg80211_wdinfo->remain_on_ch_cookie, roch_parm->cookie);
|
||||
rtw_warn_on(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (_stay_in_cur_chan(adapter) == _TRUE) {
|
||||
remain_ch = rtw_mi_get_union_chan(adapter);
|
||||
RTW_INFO(FUNC_ADPT_FMT" stay in union ch:%d\n", FUNC_ADPT_ARG(adapter), remain_ch);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CONCURRENT_MODE
|
||||
if (rtw_mi_check_status(adapter, MI_LINKED) && (0 != rtw_mi_get_union_chan(adapter))) {
|
||||
if ((remain_ch != rtw_mi_get_union_chan(adapter)) && !check_fwstate(&adapter->mlmepriv, _FW_LINKED)) {
|
||||
if (
|
||||
#ifdef RTW_ROCH_BACK_OP
|
||||
ATOMIC_READ(&pwdev_priv->switch_ch_to) == 1 ||
|
||||
#endif
|
||||
(remain_ch != pmlmeext->cur_channel)) {
|
||||
|
||||
rtw_leave_opch(adapter);
|
||||
|
||||
#ifdef RTW_ROCH_BACK_OP
|
||||
RTW_INFO("%s, set switch ch timer, duration=%d\n", __func__, duration - pwdinfo->ext_listen_interval);
|
||||
ATOMIC_SET(&pwdev_priv->switch_ch_to, 0);
|
||||
_set_timer(&pwdinfo->ap_p2p_switch_timer, duration - pwdinfo->ext_listen_interval);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
ready_on_channel = _TRUE;
|
||||
} else
|
||||
#endif /* CONFIG_CONCURRENT_MODE */
|
||||
{
|
||||
if (remain_ch != rtw_get_oper_ch(adapter))
|
||||
ready_on_channel = _TRUE;
|
||||
}
|
||||
|
||||
if (ready_on_channel == _TRUE) {
|
||||
#ifndef RTW_SINGLE_WIPHY
|
||||
if (!check_fwstate(&adapter->mlmepriv, _FW_LINKED))
|
||||
#endif
|
||||
{
|
||||
#ifdef CONFIG_CONCURRENT_MODE
|
||||
if (rtw_get_oper_ch(adapter) != remain_ch)
|
||||
#endif
|
||||
{
|
||||
/* if (!padapter->mlmepriv.LinkDetectInfo.bBusyTraffic) */
|
||||
set_channel_bwmode(adapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BT_COEXIST
|
||||
rtw_btcoex_ScanNotify(adapter, _TRUE);
|
||||
#endif
|
||||
|
||||
RTW_INFO("%s, set ro ch timer, duration=%d\n", __func__, duration);
|
||||
_set_timer(&pcfg80211_wdinfo->remain_on_ch_timer, duration);
|
||||
|
||||
exit:
|
||||
_exit_critical_mutex(&pwdev_priv->roch_mutex, NULL);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cancel_ro_ch_handler(_adapter *padapter, u8 *buf)
|
||||
|
|
@ -3338,6 +3455,8 @@ static int cancel_ro_ch_handler(_adapter *padapter, u8 *buf)
|
|||
}
|
||||
|
||||
set_channel_bwmode(padapter, ch, offset, bw);
|
||||
if (rtw_mi_check_status(padapter, MI_LINKED))
|
||||
rtw_back_opch(padapter);
|
||||
|
||||
rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
|
||||
#ifdef CONFIG_DEBUG_CFG80211
|
||||
|
|
@ -3380,6 +3499,11 @@ static void rtw_change_p2pie_op_ch(_adapter *padapter, const u8 *frame_body, u32
|
|||
u8 *ies, *p2p_ie;
|
||||
u32 ies_len, p2p_ielen;
|
||||
|
||||
#ifdef CONFIG_MCC_MODE
|
||||
if (MCC_EN(padapter))
|
||||
return;
|
||||
#endif /* CONFIG_MCC_MODE */
|
||||
|
||||
ies = (u8 *)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);
|
||||
ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
|
||||
|
||||
|
|
@ -3406,6 +3530,11 @@ static void rtw_change_p2pie_ch_list(_adapter *padapter, const u8 *frame_body, u
|
|||
u8 *ies, *p2p_ie;
|
||||
u32 ies_len, p2p_ielen;
|
||||
|
||||
#ifdef CONFIG_MCC_MODE
|
||||
if (MCC_EN(padapter))
|
||||
return;
|
||||
#endif /* CONFIG_MCC_MODE */
|
||||
|
||||
ies = (u8 *)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);
|
||||
ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
|
||||
|
||||
|
|
@ -3532,6 +3661,11 @@ static void rtw_cfg80211_adjust_p2pie_channel(_adapter *padapter, const u8 *fram
|
|||
u32 ies_len, p2p_ielen;
|
||||
u8 union_ch = rtw_mi_get_union_chan(padapter);
|
||||
|
||||
#ifdef CONFIG_MCC_MODE
|
||||
if (MCC_EN(padapter))
|
||||
return;
|
||||
#endif /* CONFIG_MCC_MODE */
|
||||
|
||||
ies = (u8 *)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);
|
||||
ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
|
||||
|
||||
|
|
@ -3881,7 +4015,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
|
|||
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);
|
||||
_rtw_memcpy(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : get_addr2_ptr(buf), ETH_ALEN);
|
||||
if (iaddr)
|
||||
_rtw_memcpy(tx ? nego_info->iface_addr : nego_info->peer_iface_addr, iaddr, ETH_ALEN);
|
||||
nego_info->active = tx ? 1 : 0;
|
||||
|
|
@ -3935,7 +4069,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
|
|||
iaddr = cont;
|
||||
|
||||
if (nego_info->token == dialogToken && nego_info->state == 0
|
||||
&& _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE
|
||||
&& _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : get_addr2_ptr(buf), ETH_ALEN) == _TRUE
|
||||
) {
|
||||
if (iaddr)
|
||||
_rtw_memcpy(tx ? nego_info->iface_addr : nego_info->peer_iface_addr, iaddr, ETH_ALEN);
|
||||
|
|
@ -3987,7 +4121,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
|
|||
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
|
||||
&& _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : get_addr2_ptr(buf), ETH_ALEN) == _TRUE
|
||||
) {
|
||||
nego_info->status = (status == -1) ? 0xff : status;
|
||||
nego_info->conf_op_ch = (op_ch == -1) ? 0 : op_ch;
|
||||
|
|
@ -4035,7 +4169,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
|
|||
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);
|
||||
_rtw_memcpy(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : get_addr2_ptr(buf), ETH_ALEN);
|
||||
if (gbssid)
|
||||
_rtw_memcpy(invit_info->group_bssid, gbssid, ETH_ALEN);
|
||||
invit_info->active = tx ? 1 : 0;
|
||||
|
|
@ -4095,7 +4229,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
|
|||
gbssid = cont;
|
||||
|
||||
if (invit_info->token == dialogToken && invit_info->state == 0
|
||||
&& _rtw_memcmp(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE
|
||||
&& _rtw_memcmp(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : get_addr2_ptr(buf), ETH_ALEN) == _TRUE
|
||||
) {
|
||||
invit_info->status = (status == -1) ? 0xff : status;
|
||||
invit_info->rsp_op_ch = op_ch;
|
||||
|
|
@ -4173,24 +4307,23 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
|
|||
|
||||
switch (OUI_Subtype) {
|
||||
case P2P_NOTICE_OF_ABSENCE:
|
||||
RTW_INFO("RTW_%s:P2P_NOTICE_OF_ABSENCE, dialogToken=%d\n", (tx == _TRUE) ? "TX" : "RX", dialogToken);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
RTW_INFO("RTW_%s:OUI_Subtype=%d, dialogToken=%d\n", (tx == _TRUE) ? "Tx" : "Rx", OUI_Subtype, dialogToken);
|
||||
break;
|
||||
}
|
||||
|
||||
} else
|
||||
RTW_INFO("RTW_%s:action frame category=%d\n", (tx == _TRUE) ? "TX" : "RX", category);
|
||||
}
|
||||
|
||||
return is_p2p_frame;
|
||||
}
|
||||
|
|
@ -4201,7 +4334,7 @@ void rtw_init_cfg80211_wifidirect_info(_adapter *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);
|
||||
rtw_init_timer(&pcfg80211_wdinfo->remain_on_ch_timer, padapter, ro_ch_timer_process, padapter);
|
||||
}
|
||||
#endif /* CONFIG_IOCTL_CFG80211 */
|
||||
|
||||
|
|
@ -4328,8 +4461,10 @@ void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength)
|
|||
if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
|
||||
return;
|
||||
#ifdef CONFIG_CONCURRENT_MODE
|
||||
#ifndef CONFIG_FW_MULTI_PORT_SUPPORT
|
||||
if (padapter->hw_port != HW_PORT0)
|
||||
return;
|
||||
#endif
|
||||
#endif
|
||||
if (IELength <= _BEACON_IE_OFFSET_)
|
||||
return;
|
||||
|
|
@ -4406,7 +4541,8 @@ 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);
|
||||
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
u32 ps_deny = 0;
|
||||
|
||||
/* Pre action for p2p state */
|
||||
switch (p2p_ps_state) {
|
||||
|
|
@ -4428,6 +4564,16 @@ void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state)
|
|||
}
|
||||
break;
|
||||
case P2P_PS_ENABLE:
|
||||
_enter_pwrlock(&adapter_to_pwrctl(padapter)->lock);
|
||||
ps_deny = rtw_ps_deny_get(padapter);
|
||||
_exit_pwrlock(&adapter_to_pwrctl(padapter)->lock);
|
||||
|
||||
if ((ps_deny & (PS_DENY_SCAN | PS_DENY_JOIN))
|
||||
|| rtw_mi_check_fwstate(padapter, (_FW_UNDER_SURVEY | _FW_UNDER_LINKING))) {
|
||||
pwdinfo->p2p_ps_mode = P2P_PS_NONE;
|
||||
RTW_DBG(FUNC_ADPT_FMT" Block P2P PS under site survey or LINKING\n", FUNC_ADPT_ARG(padapter));
|
||||
return;
|
||||
}
|
||||
if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {
|
||||
#ifdef CONFIG_MCC_MODE
|
||||
if (MCC_EN(padapter)) {
|
||||
|
|
@ -4475,7 +4621,9 @@ u8 p2p_ps_wk_cmd(_adapter *padapter, u8 p2p_ps_state, u8 enqueue)
|
|||
|
||||
if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)
|
||||
#ifdef CONFIG_CONCURRENT_MODE
|
||||
#ifndef CONFIG_FW_MULTI_PORT_SUPPORT
|
||||
|| (padapter->hw_port != HW_PORT0)
|
||||
#endif
|
||||
#endif
|
||||
)
|
||||
return res;
|
||||
|
|
@ -4853,13 +5001,13 @@ 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);
|
||||
rtw_init_timer(&pwdinfo->find_phase_timer, padapter, find_phase_timer_process, padapter);
|
||||
rtw_init_timer(&pwdinfo->restore_p2p_state_timer, padapter, restore_p2p_state_timer_process, padapter);
|
||||
rtw_init_timer(&pwdinfo->pre_tx_scan_timer, padapter, pre_tx_scan_timer_process, padapter);
|
||||
rtw_init_timer(&pwdinfo->reset_ch_sitesurvey, padapter, reset_ch_sitesurvey_timer_process, padapter);
|
||||
rtw_init_timer(&pwdinfo->reset_ch_sitesurvey2, padapter, 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);
|
||||
rtw_init_timer(&pwdinfo->ap_p2p_switch_timer, padapter, ap_p2p_switch_timer_process, padapter);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_PWRCTRL_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
@ -158,7 +153,7 @@ int ips_leave(_adapter *padapter)
|
|||
_exit_pwrlock(&pwrpriv->lock);
|
||||
|
||||
if (_SUCCESS == ret)
|
||||
ODM_DMReset(&GET_HAL_DATA(padapter)->odmpriv);
|
||||
odm_dm_reset(&GET_HAL_DATA(padapter)->odmpriv);
|
||||
|
||||
#ifdef CONFIG_BT_COEXIST
|
||||
if (_SUCCESS == ret)
|
||||
|
|
@ -200,7 +195,7 @@ bool rtw_pwr_unassociated_idle(_adapter *adapter)
|
|||
goto exit;
|
||||
}
|
||||
|
||||
if (adapter_to_pwrctl(adapter)->ips_deny_time >= rtw_get_current_time()) {
|
||||
if (time_after(adapter_to_pwrctl(adapter)->ips_deny_time, rtw_get_current_time())) {
|
||||
/* RTW_INFO("%s ips_deny_time\n", __func__); */
|
||||
goto exit;
|
||||
}
|
||||
|
|
@ -216,19 +211,20 @@ bool rtw_pwr_unassociated_idle(_adapter *adapter)
|
|||
#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)
|
||||
|| rtw_cfg80211_get_is_roch(iface) == _TRUE
|
||||
#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
|
||||
)
|
||||
|| check_fwstate(pmlmepriv, WIFI_UNDER_LINKING | WIFI_UNDER_WPS)
|
||||
|| MLME_IS_AP(iface)
|
||||
|| MLME_IS_MESH(iface)
|
||||
|| check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE)
|
||||
#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211)
|
||||
|| rtw_cfg80211_get_is_roch(iface) == _TRUE
|
||||
#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;
|
||||
|
||||
}
|
||||
|
|
@ -393,10 +389,9 @@ void rtw_ps_processor(_adapter *padapter)
|
|||
return;
|
||||
}
|
||||
|
||||
void pwr_state_check_handler(RTW_TIMER_HDL_ARGS);
|
||||
void pwr_state_check_handler(RTW_TIMER_HDL_ARGS)
|
||||
void pwr_state_check_handler(void *ctx)
|
||||
{
|
||||
_adapter *padapter = (_adapter *)FunctionContext;
|
||||
_adapter *padapter = (_adapter *)ctx;
|
||||
rtw_ps_cmd(padapter);
|
||||
}
|
||||
|
||||
|
|
@ -404,7 +399,7 @@ void pwr_state_check_handler(RTW_TIMER_HDL_ARGS)
|
|||
void traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets)
|
||||
{
|
||||
#ifdef CONFIG_CHECK_LEAVE_LPS
|
||||
static u32 start_time = 0;
|
||||
static systime start_time = 0;
|
||||
static u32 xmit_cnt = 0;
|
||||
u8 bLeaveLPS = _FALSE;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
|
@ -456,6 +451,61 @@ void traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets)
|
|||
#endif /* CONFIG_CHECK_LEAVE_LPS */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_LPS_LCLK
|
||||
u8 rtw_cpwm_polling(_adapter *adapter, u8 cpwm_orig)
|
||||
{
|
||||
u8 result = _FAIL;
|
||||
u8 cpwm_now;
|
||||
u8 poll_cnt = 0;
|
||||
systime start_time;
|
||||
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
|
||||
struct debug_priv *pdbgpriv = &(adapter_to_dvobj(adapter)->drv_dbg);
|
||||
|
||||
/*RTW_INFO("%s.....\n", __func__);*/
|
||||
|
||||
start_time = rtw_get_current_time();
|
||||
|
||||
/* polling cpwm */
|
||||
do {
|
||||
rtw_msleep_os(1);
|
||||
poll_cnt++;
|
||||
cpwm_now = 0;
|
||||
rtw_hal_get_hwreg(adapter, HW_VAR_CPWM, &cpwm_now);
|
||||
|
||||
if ((cpwm_orig ^ cpwm_now) & 0x80) {
|
||||
pwrpriv->cpwm = PS_STATE_S4;
|
||||
pwrpriv->cpwm_tog = cpwm_now & PS_TOGGLE;
|
||||
#ifdef DBG_CHECK_FW_PS_STATE
|
||||
RTW_INFO("%s: polling cpwm OK! poll_cnt=%d, cpwm_orig=%02x, cpwm_now=%02x , 0x100=0x%x\n"
|
||||
, __func__, poll_cnt, cpwm_orig, cpwm_now, rtw_read8(adapter, REG_CR));
|
||||
if (rtw_fw_ps_state(adapter) == _FAIL) {
|
||||
RTW_INFO("leave 32k but fw state in 32k\n");
|
||||
pdbgpriv->dbg_rpwm_toogle_cnt++;
|
||||
}
|
||||
#endif /* DBG_CHECK_FW_PS_STATE */
|
||||
result = _SUCCESS;
|
||||
break;
|
||||
}
|
||||
|
||||
if (rtw_get_passing_time_ms(start_time) > LPS_RPWM_WAIT_MS) {
|
||||
RTW_ERR("%s: polling cpwm timeout! poll_cnt=%d, cpwm_orig=%02x, cpwm_now=%02x\n"
|
||||
, __func__, poll_cnt, cpwm_orig, cpwm_now);
|
||||
#ifdef DBG_CHECK_FW_PS_STATE
|
||||
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 */
|
||||
|
||||
#ifdef CONFIG_LPS_RPWM_TIMER
|
||||
_set_timer(&pwrpriv->pwr_rpwm_timer, 1);
|
||||
#endif /* CONFIG_LPS_RPWM_TIMER */
|
||||
break;
|
||||
}
|
||||
} while (1);
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Description:
|
||||
* This function MUST be called under power lock protect
|
||||
|
|
@ -469,9 +519,9 @@ void rtw_set_rpwm(PADAPTER padapter, u8 pslv)
|
|||
{
|
||||
u8 rpwm;
|
||||
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
|
||||
#ifdef CONFIG_DETECT_CPWM_BY_POLLING
|
||||
#ifdef CONFIG_LPS_LCLK
|
||||
u8 cpwm_orig;
|
||||
#endif /* CONFIG_DETECT_CPWM_BY_POLLING */
|
||||
#endif
|
||||
struct dvobj_priv *psdpriv = padapter->dvobj;
|
||||
struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
|
||||
|
||||
|
|
@ -487,6 +537,7 @@ void rtw_set_rpwm(PADAPTER padapter, u8 pslv)
|
|||
#ifdef CONFIG_LPS_LCLK
|
||||
|| ((pwrpriv->rpwm >= PS_STATE_S2) && (pslv >= PS_STATE_S2))
|
||||
#endif
|
||||
|| (pwrpriv->lps_level == LPS_NORMAL)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -500,12 +551,9 @@ void rtw_set_rpwm(PADAPTER padapter, u8 pslv)
|
|||
return;
|
||||
}
|
||||
|
||||
if (rtw_is_drv_stopped(padapter)) {
|
||||
|
||||
if (pslv < PS_STATE_S2) {
|
||||
if (rtw_is_drv_stopped(padapter))
|
||||
if (pslv < PS_STATE_S2)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
rpwm = pslv | pwrpriv->tog;
|
||||
#ifdef CONFIG_LPS_LCLK
|
||||
|
|
@ -516,7 +564,7 @@ void rtw_set_rpwm(PADAPTER padapter, u8 pslv)
|
|||
|
||||
pwrpriv->rpwm = pslv;
|
||||
|
||||
#ifdef CONFIG_DETECT_CPWM_BY_POLLING
|
||||
#ifdef CONFIG_LPS_LCLK
|
||||
cpwm_orig = 0;
|
||||
if (rpwm & PS_ACK)
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig);
|
||||
|
|
@ -534,47 +582,15 @@ void rtw_set_rpwm(PADAPTER padapter, u8 pslv)
|
|||
/* 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;
|
||||
|
||||
start_time = rtw_get_current_time();
|
||||
|
||||
/* 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) {
|
||||
pwrpriv->cpwm = PS_STATE_S4;
|
||||
pwrpriv->cpwm_tog = cpwm_now & PS_TOGGLE;
|
||||
#ifdef DBG_CHECK_FW_PS_STATE
|
||||
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 */
|
||||
break;
|
||||
}
|
||||
|
||||
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) {
|
||||
RTW_INFO("rpwm timeout and fw ps state in 32k\n");
|
||||
pdbgpriv->dbg_rpwm_timeout_fail_cnt++;
|
||||
}
|
||||
#endif /* DBG_CHECK_FW_PS_STATE */
|
||||
#ifdef CONFIG_LPS_RPWM_TIMER
|
||||
_set_timer(&pwrpriv->pwr_rpwm_timer, 1);
|
||||
#endif /* CONFIG_LPS_RPWM_TIMER */
|
||||
break;
|
||||
}
|
||||
} while (1);
|
||||
#endif /* CONFIG_DETECT_CPWM_BY_POLLING */
|
||||
rtw_cpwm_polling(padapter, cpwm_orig);
|
||||
#else
|
||||
#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)
|
||||
rtw_cpwm_polling(padapter, cpwm_orig);
|
||||
#endif /*#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) || defined(CONFIG_P2P_WOWLAN)*/
|
||||
#endif /*#ifdef CONFIG_DETECT_CPWM_BY_POLLING*/
|
||||
} else
|
||||
#endif /* CONFIG_LPS_LCLK */
|
||||
{
|
||||
|
|
@ -585,7 +601,7 @@ void rtw_set_rpwm(PADAPTER padapter, u8 pslv)
|
|||
|
||||
u8 PS_RDY_CHECK(_adapter *padapter)
|
||||
{
|
||||
u32 curr_time, delta_time;
|
||||
u32 delta_ms;
|
||||
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
#ifdef CONFIG_P2P
|
||||
|
|
@ -607,26 +623,24 @@ u8 PS_RDY_CHECK(_adapter *padapter)
|
|||
return _FALSE;
|
||||
#endif
|
||||
|
||||
curr_time = rtw_get_current_time();
|
||||
|
||||
delta_time = curr_time - pwrpriv->DelayLPSLastTimeStamp;
|
||||
|
||||
if (delta_time < LPS_DELAY_TIME)
|
||||
delta_ms = rtw_get_passing_time_ms(pwrpriv->DelayLPSLastTimeStamp);
|
||||
if (delta_ms < LPS_DELAY_MS)
|
||||
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)
|
||||
|| rtw_cfg80211_get_is_roch(padapter) == _TRUE
|
||||
#endif
|
||||
|| rtw_is_scan_deny(padapter)
|
||||
#ifdef CONFIG_TDLS
|
||||
/* TDLS link is established. */
|
||||
|| (padapter->tdlsinfo.link_established == _TRUE)
|
||||
#endif /* CONFIG_TDLS */
|
||||
)
|
||||
|| check_fwstate(pmlmepriv, WIFI_UNDER_LINKING | WIFI_UNDER_WPS)
|
||||
|| MLME_IS_AP(padapter)
|
||||
|| MLME_IS_MESH(padapter)
|
||||
|| check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE)
|
||||
#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211)
|
||||
|| rtw_cfg80211_get_is_roch(padapter) == _TRUE
|
||||
#endif
|
||||
|| rtw_is_scan_deny(padapter)
|
||||
#ifdef 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)) {
|
||||
|
|
@ -647,7 +661,7 @@ void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable)
|
|||
{
|
||||
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
|
||||
int cnt = 0;
|
||||
u32 start_time;
|
||||
systime start_time;
|
||||
u8 val8 = 0;
|
||||
u8 cpwm_orig = 0, cpwm_now = 0;
|
||||
u8 parm[H2C_INACTIVE_PS_LEN] = {0};
|
||||
|
|
@ -689,11 +703,11 @@ void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable)
|
|||
/* H2C done, enter 32k */
|
||||
if (val8 == 0) {
|
||||
/* ser rpwm to enter 32k */
|
||||
val8 = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1);
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_RPWM_TOG, &val8);
|
||||
RTW_INFO("%s: read rpwm=%02x\n", __FUNCTION__, val8);
|
||||
val8 += 0x80;
|
||||
val8 |= BIT(0);
|
||||
rtw_write8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1, val8);
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&val8));
|
||||
RTW_INFO("%s: write rpwm=%02x\n", __FUNCTION__, val8);
|
||||
adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80;
|
||||
cnt = val8 = 0;
|
||||
|
|
@ -722,11 +736,10 @@ void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable)
|
|||
rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig);
|
||||
|
||||
/* ser rpwm */
|
||||
val8 = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1);
|
||||
val8 &= 0x80;
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_RPWM_TOG, &val8);
|
||||
val8 += 0x80;
|
||||
val8 |= BIT(6);
|
||||
rtw_write8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1, val8);
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&val8));
|
||||
RTW_INFO("%s: write rpwm=%02x\n", __FUNCTION__, val8);
|
||||
adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80;
|
||||
|
||||
|
|
@ -764,6 +777,7 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode
|
|||
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
|
||||
struct dvobj_priv *psdpriv = padapter->dvobj;
|
||||
struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
|
||||
struct registry_priv *pregistrypriv = &padapter->registrypriv;
|
||||
#ifdef CONFIG_P2P
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
#endif /* CONFIG_P2P */
|
||||
|
|
@ -774,6 +788,9 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode
|
|||
_list *plist, *phead;
|
||||
struct sta_info *ptdls_sta;
|
||||
#endif /* CONFIG_TDLS */
|
||||
#ifdef CONFIG_LPS_PG
|
||||
u8 lps_pg_hdl_id = 0;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
|
@ -786,15 +803,28 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode
|
|||
return;
|
||||
|
||||
#ifndef CONFIG_BT_COEXIST
|
||||
if ((pwrpriv->smart_ps == smart_ps) &&
|
||||
(pwrpriv->bcn_ant_mode == bcn_ant_mode))
|
||||
return;
|
||||
#ifdef CONFIG_WMMPS_STA
|
||||
if (!rtw_is_wmmps_mode(padapter))
|
||||
#endif /* CONFIG_WMMPS_STA */
|
||||
if ((pwrpriv->smart_ps == smart_ps) &&
|
||||
(pwrpriv->bcn_ant_mode == bcn_ant_mode))
|
||||
return;
|
||||
#endif /* !CONFIG_BT_COEXIST */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FW_MULTI_PORT_SUPPORT
|
||||
if (PS_MODE_ACTIVE != ps_mode) {
|
||||
rtw_set_ps_rsvd_page(padapter);
|
||||
rtw_set_default_port_id(padapter);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LPS_PG
|
||||
if ((PS_MODE_ACTIVE != ps_mode) && (pwrpriv->blpspg_info_up))
|
||||
rtw_hal_set_lps_pg_info(padapter);
|
||||
if ((PS_MODE_ACTIVE != ps_mode) && (pwrpriv->blpspg_info_up)) {
|
||||
/*rtw_hal_set_lps_pg_info(padapter);*/
|
||||
lps_pg_hdl_id = LPS_PG_INFO_CFG;
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_LPS_PG_HANDLE, (u8 *)(&lps_pg_hdl_id));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LPS_LCLK
|
||||
|
|
@ -835,7 +865,7 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode
|
|||
ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
|
||||
|
||||
if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)
|
||||
issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 0, 0);
|
||||
issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->cmn.mac_addr, 0, 0, 0);
|
||||
plist = get_next(plist);
|
||||
}
|
||||
}
|
||||
|
|
@ -848,7 +878,8 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode
|
|||
if (pwrpriv->wowlan_mode == _TRUE ||
|
||||
pwrpriv->wowlan_ap_mode == _TRUE ||
|
||||
pwrpriv->wowlan_p2p_mode == _TRUE) {
|
||||
u32 start_time, delay_ms;
|
||||
systime start_time;
|
||||
u32 delay_ms;
|
||||
u8 val8;
|
||||
delay_ms = 20;
|
||||
start_time = rtw_get_current_time();
|
||||
|
|
@ -867,8 +898,22 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode
|
|||
rtw_usleep_os(100);
|
||||
} while (1);
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_LPS_PG
|
||||
if (pwrpriv->lps_level == LPS_PG) {
|
||||
lps_pg_hdl_id = LPS_PG_REDLEMEM;
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_LPS_PG_HANDLE, (u8 *)(&lps_pg_hdl_id));
|
||||
}
|
||||
#endif
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
|
||||
|
||||
#ifdef CONFIG_LPS_PG
|
||||
if (pwrpriv->lps_level == LPS_PG) {
|
||||
lps_pg_hdl_id = LPS_PG_RESEND_H2C;
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_LPS_PG_HANDLE, (u8 *)(&lps_pg_hdl_id));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LPS_POFF
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_LPS_POFF_SET_MODE,
|
||||
(u8 *)(&ps_mode));
|
||||
|
|
@ -908,7 +953,7 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode
|
|||
ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
|
||||
|
||||
if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)
|
||||
issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 1, 0, 0);
|
||||
issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->cmn.mac_addr, 1, 0, 0);
|
||||
plist = get_next(plist);
|
||||
}
|
||||
}
|
||||
|
|
@ -927,6 +972,11 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode
|
|||
pwrpriv->pwr_mode = ps_mode;
|
||||
pwrpriv->smart_ps = smart_ps;
|
||||
pwrpriv->bcn_ant_mode = bcn_ant_mode;
|
||||
|
||||
#ifdef CONFIG_WMMPS_STA
|
||||
pwrpriv->wmm_smart_ps = pregistrypriv->wmm_smart_ps;
|
||||
#endif /* CONFIG_WMMPS_STA */
|
||||
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
|
||||
|
||||
#ifdef CONFIG_P2P_PS
|
||||
|
|
@ -971,7 +1021,7 @@ void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode
|
|||
*/
|
||||
s32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms)
|
||||
{
|
||||
u32 start_time;
|
||||
systime start_time;
|
||||
u8 bAwake = _FALSE;
|
||||
s32 err = 0;
|
||||
|
||||
|
|
@ -1014,7 +1064,7 @@ void LPS_Enter(PADAPTER padapter, const char *msg)
|
|||
|
||||
|
||||
/* RTW_INFO("+LeisurePSEnter\n"); */
|
||||
if (_FALSE == padapter->bFWReady)
|
||||
if (GET_HAL_DATA(padapter)->bFWReady == _FALSE)
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_BT_COEXIST
|
||||
|
|
@ -1030,9 +1080,11 @@ void LPS_Enter(PADAPTER padapter, const char *msg)
|
|||
if (n_assoc_iface != 1)
|
||||
return;
|
||||
|
||||
#ifndef CONFIG_FW_MULTI_PORT_SUPPORT
|
||||
/* Skip lps enter request for adapter not 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)
|
||||
|
|
@ -1049,6 +1101,12 @@ void LPS_Enter(PADAPTER padapter, const char *msg)
|
|||
/* 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) {
|
||||
|
||||
#ifdef CONFIG_WMMPS_STA
|
||||
if (rtw_is_wmmps_mode(padapter))
|
||||
msg = "WMMPS_IDLE";
|
||||
#endif /* CONFIG_WMMPS_STA */
|
||||
|
||||
sprintf(buf, "WIFI-%s", msg);
|
||||
pwrpriv->bpower_saving = _TRUE;
|
||||
rtw_set_ps_mode(padapter, pwrpriv->power_mgnt, padapter->registrypriv.smart_ps, 0, buf);
|
||||
|
|
@ -1086,6 +1144,12 @@ void LPS_Leave(PADAPTER padapter, const char *msg)
|
|||
|
||||
if (pwrpriv->bLeisurePs) {
|
||||
if (pwrpriv->pwr_mode != PS_MODE_ACTIVE) {
|
||||
|
||||
#ifdef CONFIG_WMMPS_STA
|
||||
if (rtw_is_wmmps_mode(padapter))
|
||||
msg = "WMMPS_BUSY";
|
||||
#endif /* CONFIG_WMMPS_STA */
|
||||
|
||||
sprintf(buf, "WIFI-%s", msg);
|
||||
rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, buf);
|
||||
|
||||
|
|
@ -1104,6 +1168,20 @@ void LPS_Leave(PADAPTER padapter, const char *msg)
|
|||
* RTW_INFO("-LeisurePSLeave\n"); */
|
||||
|
||||
}
|
||||
|
||||
void rtw_wow_lps_level_decide(_adapter *adapter, u8 wow_en)
|
||||
{
|
||||
#if defined(CONFIG_USB_HCI) && defined(CONFIG_LPS_LCLK)
|
||||
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
|
||||
struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);
|
||||
|
||||
if (wow_en) {
|
||||
pwrpriv->lps_level_bk = pwrpriv->lps_level;
|
||||
pwrpriv->lps_level = LPS_LCLK;
|
||||
} else
|
||||
pwrpriv->lps_level = pwrpriv->lps_level_bk;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
void LeaveAllPowerSaveModeDirect(PADAPTER Adapter)
|
||||
|
|
@ -1115,7 +1193,7 @@ void LeaveAllPowerSaveModeDirect(PADAPTER Adapter)
|
|||
struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
|
||||
#ifndef CONFIG_DETECT_CPWM_BY_POLLING
|
||||
u8 cpwm_orig, cpwm_now;
|
||||
u32 start_time;
|
||||
systime start_time;
|
||||
#endif /* CONFIG_DETECT_CPWM_BY_POLLING */
|
||||
|
||||
|
||||
|
|
@ -1200,7 +1278,7 @@ void LeaveAllPowerSaveModeDirect(PADAPTER Adapter)
|
|||
} else
|
||||
#endif
|
||||
{
|
||||
#if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS)
|
||||
#if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_RTL8188E)
|
||||
#ifdef CONFIG_IPS
|
||||
if (_FALSE == ips_leave(pri_padapter))
|
||||
RTW_INFO("======> ips_leave fail.............\n");
|
||||
|
|
@ -1250,7 +1328,13 @@ void LeaveAllPowerSaveMode(IN PADAPTER Adapter)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_P2P_PS
|
||||
p2p_ps_wk_cmd(Adapter, P2P_PS_DISABLE, enqueue);
|
||||
for (i = 0; i < dvobj->iface_nums; i++) {
|
||||
_adapter *iface = dvobj->padapters[i];
|
||||
struct wifidirect_info *pwdinfo = &(iface->wdinfo);
|
||||
|
||||
if (pwdinfo->p2p_ps_mode > P2P_PS_NONE)
|
||||
p2p_ps_wk_cmd(iface, P2P_PS_DISABLE, enqueue);
|
||||
}
|
||||
#endif /* CONFIG_P2P_PS */
|
||||
|
||||
#ifdef CONFIG_LPS
|
||||
|
|
@ -1289,7 +1373,7 @@ void LPS_Leave_check(
|
|||
PADAPTER padapter)
|
||||
{
|
||||
struct pwrctrl_priv *pwrpriv;
|
||||
u32 start_time;
|
||||
systime start_time;
|
||||
u8 bReady;
|
||||
|
||||
|
||||
|
|
@ -1339,6 +1423,11 @@ void cpwm_int_hdl(
|
|||
{
|
||||
struct pwrctrl_priv *pwrpriv;
|
||||
|
||||
if (!padapter)
|
||||
goto exit;
|
||||
|
||||
if (RTW_CANNOT_RUN(padapter))
|
||||
goto exit;
|
||||
|
||||
pwrpriv = adapter_to_pwrctl(padapter);
|
||||
#if 0
|
||||
|
|
@ -1378,7 +1467,7 @@ 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;
|
||||
|
||||
/* RTW_INFO("%s\n",__FUNCTION__); */
|
||||
|
|
@ -1387,6 +1476,15 @@ static void cpwm_event_callback(struct work_struct *work)
|
|||
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)
|
||||
{
|
||||
|
|
@ -1397,9 +1495,15 @@ 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];
|
||||
padapter = dvobj_get_primary_adapter(dvobj);
|
||||
/* RTW_INFO("+%s: rpwm=0x%02X cpwm=0x%02X\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); */
|
||||
|
||||
if (!padapter)
|
||||
return;
|
||||
|
||||
if (RTW_CANNOT_RUN(padapter))
|
||||
return;
|
||||
|
||||
_enter_pwrlock(&pwrpriv->lock);
|
||||
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);
|
||||
|
|
@ -1446,6 +1550,12 @@ static void pwr_rpwm_timeout_handler(void *FunctionContext)
|
|||
|
||||
padapter = (PADAPTER)FunctionContext;
|
||||
pwrpriv = adapter_to_pwrctl(padapter);
|
||||
if (!padapter)
|
||||
return;
|
||||
|
||||
if (RTW_CANNOT_RUN(padapter))
|
||||
return;
|
||||
|
||||
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)) {
|
||||
|
|
@ -1881,7 +1991,8 @@ void rtw_unregister_evt_alive(PADAPTER padapter)
|
|||
void rtw_init_pwrctrl_priv(PADAPTER padapter)
|
||||
{
|
||||
struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
|
||||
int i = 0;
|
||||
struct registry_priv *registry_par = &padapter->registrypriv;
|
||||
|
||||
u8 val8 = 0;
|
||||
|
||||
#if defined(CONFIG_CONCURRENT_MODE)
|
||||
|
|
@ -1905,10 +2016,14 @@ void rtw_init_pwrctrl_priv(PADAPTER padapter)
|
|||
|
||||
pwrctrlpriv->ips_mode = padapter->registrypriv.ips_mode;
|
||||
pwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode;
|
||||
pwrctrlpriv->ips_deny_time = rtw_get_current_time();
|
||||
pwrctrlpriv->lps_level = padapter->registrypriv.lps_level;
|
||||
|
||||
pwrctrlpriv->pwr_state_check_interval = RTW_PWR_STATE_CHK_INTERVAL;
|
||||
pwrctrlpriv->pwr_state_check_cnts = 0;
|
||||
#ifdef CONFIG_AUTOSUSPEND
|
||||
pwrctrlpriv->bInternalAutoSuspend = _FALSE;
|
||||
#endif
|
||||
pwrctrlpriv->bInSuspend = _FALSE;
|
||||
pwrctrlpriv->bkeepfwalive = _FALSE;
|
||||
|
||||
|
|
@ -1948,18 +2063,21 @@ void rtw_init_pwrctrl_priv(PADAPTER padapter)
|
|||
|
||||
_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);
|
||||
rtw_init_timer(&pwrctrlpriv->pwr_rpwm_timer, padapter, pwr_rpwm_timeout_handler, padapter);
|
||||
#endif /* CONFIG_LPS_RPWM_TIMER */
|
||||
#endif /* CONFIG_LPS_LCLK */
|
||||
|
||||
rtw_init_timer(&pwrctrlpriv->pwr_state_check_timer, padapter, pwr_state_check_handler);
|
||||
rtw_init_timer(&pwrctrlpriv->pwr_state_check_timer, padapter, pwr_state_check_handler, padapter);
|
||||
|
||||
pwrctrlpriv->wowlan_mode = _FALSE;
|
||||
pwrctrlpriv->wowlan_ap_mode = _FALSE;
|
||||
pwrctrlpriv->wowlan_p2p_mode = _FALSE;
|
||||
pwrctrlpriv->wowlan_in_resume = _FALSE;
|
||||
pwrctrlpriv->wowlan_last_wake_reason = 0;
|
||||
|
||||
#ifdef CONFIG_RESUME_IN_WORKQUEUE
|
||||
|
|
@ -1975,30 +2093,38 @@ void rtw_init_pwrctrl_priv(PADAPTER padapter)
|
|||
#ifdef CONFIG_GPIO_WAKEUP
|
||||
/*default low active*/
|
||||
pwrctrlpriv->is_high_active = HIGH_ACTIVE;
|
||||
|
||||
#ifdef CONFIG_WAKEUP_GPIO_INPUT_MODE
|
||||
if (pwrctrlpriv->is_high_active == 0)
|
||||
rtw_hal_set_input_gpio(padapter, WAKEUP_GPIO_IDX);
|
||||
else
|
||||
rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, 0);
|
||||
#else
|
||||
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);
|
||||
RTW_INFO("%s: set GPIO_%d %d as default.\n",
|
||||
__func__, WAKEUP_GPIO_IDX, val8);
|
||||
#endif /*CONFIG_WAKEUP_GPIO_INPUT_MODE*/
|
||||
#endif /* CONFIG_GPIO_WAKEUP */
|
||||
|
||||
#ifdef CONFIG_WOWLAN
|
||||
pwrctrlpriv->wowlan_pattern_idx = DEFAULT_PATTERN_NUM;
|
||||
pwrctrlpriv->wowlan_in_resume = _FALSE;
|
||||
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;
|
||||
}
|
||||
|
||||
if (registry_par->wakeup_event & BIT(1))
|
||||
pwrctrlpriv->default_patterns_en = _TRUE;
|
||||
else
|
||||
pwrctrlpriv->default_patterns_en = _FALSE;
|
||||
|
||||
rtw_wow_pattern_sw_reset(padapter);
|
||||
#ifdef CONFIG_PNO_SUPPORT
|
||||
pwrctrlpriv->pno_inited = _FALSE;
|
||||
pwrctrlpriv->pnlo_info = NULL;
|
||||
pwrctrlpriv->pscan_info = NULL;
|
||||
pwrctrlpriv->pno_ssid_list = NULL;
|
||||
#endif /* CONFIG_PNO_SUPPORT */
|
||||
#ifdef CONFIG_WOW_PATTERN_HW_CAM
|
||||
_rtw_mutex_init(&pwrctrlpriv->wowlan_pattern_cam_mutex);
|
||||
#endif
|
||||
pwrctrlpriv->wowlan_aoac_rpt_loc = 0;
|
||||
#endif /* CONFIG_WOWLAN */
|
||||
|
||||
|
|
@ -2045,6 +2171,10 @@ void rtw_free_pwrctrl_priv(PADAPTER adapter)
|
|||
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)
|
||||
|
|
@ -2063,7 +2193,7 @@ 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);
|
||||
|
||||
RTW_INFO("%s\n", __FUNCTION__);
|
||||
|
||||
|
|
@ -2118,7 +2248,7 @@ 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);
|
||||
|
||||
RTW_INFO("%s\n", __FUNCTION__);
|
||||
|
||||
|
|
@ -2171,7 +2301,7 @@ 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);
|
||||
|
||||
RTW_INFO("%s\n", __FUNCTION__);
|
||||
if (pwrpriv->do_late_resume) {
|
||||
|
|
@ -2236,7 +2366,7 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller)
|
|||
struct mlme_priv *pmlmepriv;
|
||||
int ret = _SUCCESS;
|
||||
int i;
|
||||
u32 start = rtw_get_current_time();
|
||||
systime start = rtw_get_current_time();
|
||||
|
||||
/* for LPS */
|
||||
LeaveAllPowerSaveMode(padapter);
|
||||
|
|
@ -2245,7 +2375,7 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller)
|
|||
padapter = GET_PRIMARY_ADAPTER(padapter);
|
||||
pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
if (pwrpriv->ips_deny_time < rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms))
|
||||
if (time_after(rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms), pwrpriv->ips_deny_time))
|
||||
pwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms);
|
||||
|
||||
|
||||
|
|
@ -2271,7 +2401,11 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller)
|
|||
}
|
||||
#endif
|
||||
|
||||
if (pwrpriv->bInternalAutoSuspend == _FALSE && pwrpriv->bInSuspend) {
|
||||
if (pwrpriv->bInSuspend
|
||||
#ifdef CONFIG_AUTOSUSPEND
|
||||
&& pwrpriv->bInternalAutoSuspend == _FALSE
|
||||
#endif
|
||||
) {
|
||||
RTW_INFO("%s wait bInSuspend...\n", __func__);
|
||||
while (pwrpriv->bInSuspend
|
||||
&& ((rtw_get_passing_time_ms(start) <= 3000 && !rtw_is_do_late_resume(pwrpriv))
|
||||
|
|
@ -2285,17 +2419,21 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller)
|
|||
}
|
||||
|
||||
/* System suspend is not allowed to wakeup */
|
||||
if ((pwrpriv->bInternalAutoSuspend == _FALSE) && (_TRUE == pwrpriv->bInSuspend)) {
|
||||
if ((_TRUE == pwrpriv->bInSuspend)
|
||||
#ifdef CONFIG_AUTOSUSPEND
|
||||
&& (pwrpriv->bInternalAutoSuspend == _FALSE)
|
||||
#endif
|
||||
) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* block??? */
|
||||
#ifdef CONFIG_AUTOSUSPEND
|
||||
/* usb autosuspend block??? */
|
||||
if ((pwrpriv->bInternalAutoSuspend == _TRUE) && (padapter->net_closed == _TRUE)) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
#endif
|
||||
/* 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)
|
||||
|
|
@ -2363,7 +2501,7 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller)
|
|||
}
|
||||
|
||||
exit:
|
||||
if (pwrpriv->ips_deny_time < rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms))
|
||||
if (time_after(rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms), pwrpriv->ips_deny_time))
|
||||
pwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms);
|
||||
return ret;
|
||||
|
||||
|
|
@ -2389,6 +2527,19 @@ int rtw_pm_set_lps(_adapter *padapter, u8 mode)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int rtw_pm_set_lps_level(_adapter *padapter, u8 level)
|
||||
{
|
||||
int ret = 0;
|
||||
struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
|
||||
|
||||
if (level < LPS_LEVEL_MAX)
|
||||
pwrctrlpriv->lps_level = level;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtw_pm_set_ips(_adapter *padapter, u8 mode)
|
||||
{
|
||||
struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
2415
drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_rm.c
Normal file
2415
drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_rm.c
Normal file
File diff suppressed because it is too large
Load Diff
998
drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_rm_fsm.c
Normal file
998
drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_rm_fsm.c
Normal file
|
|
@ -0,0 +1,998 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <drv_types.h>
|
||||
#include <hal_data.h>
|
||||
#include "rtw_rm_fsm.h"
|
||||
|
||||
#ifdef CONFIG_RTW_80211K
|
||||
|
||||
struct fsm_state {
|
||||
u8 *name;
|
||||
int(*fsm_func)(struct rm_obj *prm, enum RM_EV_ID evid);
|
||||
};
|
||||
|
||||
static void rm_state_initial(struct rm_obj *prm);
|
||||
static void rm_state_goto(struct rm_obj *prm, enum RM_STATE rm_state);
|
||||
static void rm_state_run(struct rm_obj *prm, enum RM_EV_ID evid);
|
||||
static struct rm_event *rm_dequeue_ev(_queue *queue);
|
||||
static struct rm_obj *rm_dequeue_rm(_queue *queue);
|
||||
|
||||
void rm_timer_callback(void *data)
|
||||
{
|
||||
int i;
|
||||
_adapter *padapter = (_adapter *)data;
|
||||
struct rm_priv *prmpriv = &padapter->rmpriv;
|
||||
struct rm_clock *pclock;
|
||||
|
||||
|
||||
/* deal with clock */
|
||||
for (i=0;i<RM_TIMER_NUM;i++) {
|
||||
pclock = &prmpriv->clock[i];
|
||||
if (pclock->prm == NULL
|
||||
||(ATOMIC_READ(&(pclock->counter)) == 0))
|
||||
continue;
|
||||
|
||||
ATOMIC_DEC(&(pclock->counter));
|
||||
|
||||
if (ATOMIC_READ(&(pclock->counter)) == 0)
|
||||
rm_post_event(pclock->prm->psta->padapter,
|
||||
pclock->prm->rmid, prmpriv->clock[i].evid);
|
||||
}
|
||||
_set_timer(&prmpriv->rm_timer, CLOCK_UNIT);
|
||||
}
|
||||
|
||||
int rtw_init_rm(_adapter *padapter)
|
||||
{
|
||||
struct rm_priv *prmpriv = &padapter->rmpriv;
|
||||
|
||||
|
||||
RTW_INFO("RM: %s\n",__func__);
|
||||
_rtw_init_queue(&(prmpriv->rm_queue));
|
||||
_rtw_init_queue(&(prmpriv->ev_queue));
|
||||
|
||||
/* bit 0-7 */
|
||||
prmpriv->rm_en_cap_def[0] = 0
|
||||
/*| BIT(RM_LINK_MEAS_CAP_EN)*/
|
||||
| BIT(RM_NB_REP_CAP_EN)
|
||||
/*| BIT(RM_PARAL_MEAS_CAP_EN)*/
|
||||
| BIT(RM_REPEAT_MEAS_CAP_EN)
|
||||
| BIT(RM_BCN_PASSIVE_MEAS_CAP_EN)
|
||||
| BIT(RM_BCN_ACTIVE_MEAS_CAP_EN)
|
||||
| BIT(RM_BCN_TABLE_MEAS_CAP_EN)
|
||||
/*| BIT(RM_BCN_MEAS_REP_COND_CAP_EN)*/;
|
||||
|
||||
/* bit 8-15 */
|
||||
prmpriv->rm_en_cap_def[1] = 0
|
||||
/*| BIT(RM_FRAME_MEAS_CAP_EN - 8)*/
|
||||
#ifdef CONFIG_RTW_ACS
|
||||
| BIT(RM_CH_LOAD_CAP_EN - 8)
|
||||
| BIT(RM_NOISE_HISTO_CAP_EN - 8)
|
||||
#endif
|
||||
/*| BIT(RM_STATIS_MEAS_CAP_EN - 8)*/
|
||||
/*| BIT(RM_LCI_MEAS_CAP_EN - 8)*/
|
||||
/*| BIT(RM_LCI_AMIMUTH_CAP_EN - 8)*/
|
||||
/*| BIT(RM_TRANS_STREAM_CAT_MEAS_CAP_EN - 8)*/
|
||||
/*| BIT(RM_TRIG_TRANS_STREAM_CAT_MEAS_CAP_EN - 8)*/;
|
||||
|
||||
/* bit 16-23 */
|
||||
prmpriv->rm_en_cap_def[2] = 0
|
||||
/*| BIT(RM_AP_CH_REP_CAP_EN - 16)*/
|
||||
/*| BIT(RM_RM_MIB_CAP_EN - 16)*/
|
||||
/*| BIT(RM_OP_CH_MAX_MEAS_DUR0 - 16)*/
|
||||
/*| BIT(RM_OP_CH_MAX_MEAS_DUR1 - 16)*/
|
||||
/*| BIT(RM_OP_CH_MAX_MEAS_DUR2 - 16)*/
|
||||
/*| BIT(RM_NONOP_CH_MAX_MEAS_DUR0 - 16)*/
|
||||
/*| BIT(RM_NONOP_CH_MAX_MEAS_DUR1 - 16)*/
|
||||
/*| BIT(RM_NONOP_CH_MAX_MEAS_DUR2 - 16)*/;
|
||||
|
||||
/* bit 24-31 */
|
||||
prmpriv->rm_en_cap_def[3] = 0
|
||||
/*| BIT(RM_MEAS_PILOT_CAP0 - 24)*/
|
||||
/*| BIT(RM_MEAS_PILOT_CAP1 - 24)*/
|
||||
/*| BIT(RM_MEAS_PILOT_CAP2 - 24)*/
|
||||
/*| BIT(RM_MEAS_PILOT_TRANS_INFO_CAP_EN - 24)*/
|
||||
/*| BIT(RM_NB_REP_TSF_OFFSET_CAP_EN - 24)*/
|
||||
| BIT(RM_RCPI_MEAS_CAP_EN - 24)
|
||||
| BIT(RM_RSNI_MEAS_CAP_EN - 24)
|
||||
/*| BIT(RM_BSS_AVG_ACCESS_DELAY_CAP_EN - 24)*/;
|
||||
|
||||
/* bit 32-39 */
|
||||
prmpriv->rm_en_cap_def[4] = 0
|
||||
/*| BIT(RM_BSS_AVG_ACCESS_DELAY_CAP_EN - 32)*/
|
||||
/*| BIT(RM_AVALB_ADMIS_CAPACITY_CAP_EN - 32)*/
|
||||
/*| BIT(RM_ANT_CAP_EN - 32)*/;
|
||||
|
||||
prmpriv->enable = _TRUE;
|
||||
|
||||
/* clock timer */
|
||||
rtw_init_timer(&prmpriv->rm_timer,
|
||||
padapter, rm_timer_callback, padapter);
|
||||
_set_timer(&prmpriv->rm_timer, CLOCK_UNIT);
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
int rtw_deinit_rm(_adapter *padapter)
|
||||
{
|
||||
struct rm_priv *prmpriv = &padapter->rmpriv;
|
||||
struct rm_obj *prm;
|
||||
struct rm_event *pev;
|
||||
|
||||
|
||||
RTW_INFO("RM: %s\n",__func__);
|
||||
prmpriv->enable = _FALSE;
|
||||
_cancel_timer_ex(&prmpriv->rm_timer);
|
||||
|
||||
/* free all events and measurements */
|
||||
while((pev = rm_dequeue_ev(&prmpriv->ev_queue)) != NULL)
|
||||
rtw_mfree((void *)pev, sizeof(struct rm_event));
|
||||
|
||||
while((prm = rm_dequeue_rm(&prmpriv->rm_queue)) != NULL)
|
||||
rm_state_run(prm, RM_EV_cancel);
|
||||
|
||||
_rtw_deinit_queue(&(prmpriv->rm_queue));
|
||||
_rtw_deinit_queue(&(prmpriv->ev_queue));
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
int rtw_free_rm_priv(_adapter *padapter)
|
||||
{
|
||||
return rtw_deinit_rm(padapter);
|
||||
}
|
||||
|
||||
static int rm_enqueue_ev(_queue *queue, struct rm_event *obj, bool to_head)
|
||||
{
|
||||
_irqL irqL;
|
||||
|
||||
|
||||
if (obj == NULL)
|
||||
return _FAIL;
|
||||
|
||||
_enter_critical(&queue->lock, &irqL);
|
||||
|
||||
if (to_head)
|
||||
rtw_list_insert_head(&obj->list, &queue->queue);
|
||||
else
|
||||
rtw_list_insert_tail(&obj->list, &queue->queue);
|
||||
|
||||
_exit_critical(&queue->lock, &irqL);
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static void rm_set_clock(struct rm_obj *prm, u32 ms, enum RM_EV_ID evid)
|
||||
{
|
||||
ATOMIC_SET(&(prm->pclock->counter), (ms/CLOCK_UNIT));
|
||||
prm->pclock->evid = evid;
|
||||
}
|
||||
|
||||
static struct rm_clock *rm_alloc_clock(_adapter *padapter, struct rm_obj *prm)
|
||||
{
|
||||
int i;
|
||||
struct rm_priv *prmpriv = &padapter->rmpriv;
|
||||
struct rm_clock *pclock = NULL;
|
||||
|
||||
|
||||
for (i=0;i<RM_TIMER_NUM;i++) {
|
||||
pclock = &prmpriv->clock[i];
|
||||
|
||||
if (pclock->prm == NULL) {
|
||||
pclock->prm = prm;
|
||||
ATOMIC_SET(&(pclock->counter), 0);
|
||||
pclock->evid = RM_EV_max;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return pclock;
|
||||
}
|
||||
|
||||
static void rm_cancel_clock(struct rm_obj *prm)
|
||||
{
|
||||
ATOMIC_SET(&(prm->pclock->counter), 0);
|
||||
prm->pclock->evid = RM_EV_max;
|
||||
}
|
||||
|
||||
static void rm_free_clock(struct rm_clock *pclock)
|
||||
{
|
||||
pclock->prm = NULL;
|
||||
ATOMIC_SET(&(pclock->counter), 0);
|
||||
pclock->evid = RM_EV_max;
|
||||
}
|
||||
|
||||
static int is_list_linked(const struct list_head *head)
|
||||
{
|
||||
return head->prev != NULL;
|
||||
}
|
||||
|
||||
void rm_free_rmobj(struct rm_obj *prm)
|
||||
{
|
||||
if (is_list_linked(&prm->list))
|
||||
rtw_list_delete(&prm->list);
|
||||
|
||||
if (prm->q.pssid)
|
||||
rtw_mfree(prm->q.pssid, strlen(prm->q.pssid)+1);
|
||||
|
||||
if (prm->q.opt.bcn.req_start)
|
||||
rtw_mfree(prm->q.opt.bcn.req_start,
|
||||
prm->q.opt.bcn.req_len);
|
||||
|
||||
if (prm->pclock)
|
||||
rm_free_clock(prm->pclock);
|
||||
|
||||
rtw_mfree((void *)prm, sizeof(struct rm_obj));
|
||||
}
|
||||
|
||||
struct rm_obj *rm_alloc_rmobj(_adapter *padapter)
|
||||
{
|
||||
struct rm_obj *prm;
|
||||
|
||||
|
||||
prm = (struct rm_obj *)rtw_malloc(sizeof(struct rm_obj));
|
||||
if (prm == NULL)
|
||||
return NULL;
|
||||
|
||||
_rtw_memset(prm, 0, sizeof(struct rm_obj));
|
||||
|
||||
/* alloc timer */
|
||||
if ((prm->pclock = rm_alloc_clock(padapter, prm)) == NULL) {
|
||||
rm_free_rmobj(prm);
|
||||
return NULL;
|
||||
}
|
||||
return prm;
|
||||
}
|
||||
|
||||
int rm_enqueue_rmobj(_adapter *padapter, struct rm_obj *prm, bool to_head)
|
||||
{
|
||||
_irqL irqL;
|
||||
struct rm_priv *prmpriv = &padapter->rmpriv;
|
||||
_queue *queue = &prmpriv->rm_queue;
|
||||
|
||||
|
||||
if (prm == NULL)
|
||||
return _FAIL;
|
||||
|
||||
_enter_critical(&queue->lock, &irqL);
|
||||
if (to_head)
|
||||
rtw_list_insert_head(&prm->list, &queue->queue);
|
||||
else
|
||||
rtw_list_insert_tail(&prm->list, &queue->queue);
|
||||
_exit_critical(&queue->lock, &irqL);
|
||||
|
||||
rm_state_initial(prm);
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static struct rm_obj *rm_dequeue_rm(_queue *queue)
|
||||
{
|
||||
_irqL irqL;
|
||||
struct rm_obj *prm;
|
||||
|
||||
|
||||
_enter_critical(&queue->lock, &irqL);
|
||||
if (rtw_is_list_empty(&(queue->queue)))
|
||||
prm = NULL;
|
||||
else {
|
||||
prm = LIST_CONTAINOR(get_next(&(queue->queue)),
|
||||
struct rm_obj, list);
|
||||
/* rtw_list_delete(&prm->list); */
|
||||
}
|
||||
_exit_critical(&queue->lock, &irqL);
|
||||
|
||||
return prm;
|
||||
}
|
||||
|
||||
static struct rm_event *rm_dequeue_ev(_queue *queue)
|
||||
{
|
||||
_irqL irqL;
|
||||
struct rm_event *ev;
|
||||
|
||||
|
||||
_enter_critical(&queue->lock, &irqL);
|
||||
if (rtw_is_list_empty(&(queue->queue)))
|
||||
ev = NULL;
|
||||
else {
|
||||
ev = LIST_CONTAINOR(get_next(&(queue->queue)),
|
||||
struct rm_event, list);
|
||||
rtw_list_delete(&ev->list);
|
||||
}
|
||||
_exit_critical(&queue->lock, &irqL);
|
||||
|
||||
return ev;
|
||||
}
|
||||
|
||||
static struct rm_obj *_rm_get_rmobj(_queue *queue, u32 rmid)
|
||||
{
|
||||
_irqL irqL;
|
||||
_list *phead, *plist;
|
||||
struct rm_obj *prm = NULL;
|
||||
|
||||
|
||||
if (rmid == 0)
|
||||
return NULL;
|
||||
|
||||
_enter_critical(&queue->lock, &irqL);
|
||||
|
||||
phead = get_list_head(queue);
|
||||
plist = get_next(phead);
|
||||
while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
|
||||
|
||||
prm = LIST_CONTAINOR(plist, struct rm_obj, list);
|
||||
if (rmid == (prm->rmid)) {
|
||||
_exit_critical(&queue->lock, &irqL);
|
||||
return prm;
|
||||
}
|
||||
plist = get_next(plist);
|
||||
}
|
||||
_exit_critical(&queue->lock, &irqL);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct sta_info *rm_get_psta(_adapter *padapter, u32 rmid)
|
||||
{
|
||||
struct rm_priv *prmpriv = &padapter->rmpriv;
|
||||
struct rm_obj *prm;
|
||||
|
||||
|
||||
prm = _rm_get_rmobj(&prmpriv->rm_queue, rmid);
|
||||
|
||||
if (prm)
|
||||
return prm->psta;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct rm_obj *rm_get_rmobj(_adapter *padapter, u32 rmid)
|
||||
{
|
||||
struct rm_priv *prmpriv = &padapter->rmpriv;
|
||||
|
||||
return _rm_get_rmobj(&prmpriv->rm_queue, rmid);
|
||||
}
|
||||
|
||||
u8 rtw_rm_post_envent_cmd(_adapter *padapter, u32 rmid, u8 evid)
|
||||
{
|
||||
struct cmd_obj *pcmd;
|
||||
struct rm_event *pev;
|
||||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
|
||||
pcmd = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj));
|
||||
if (pcmd == NULL) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
pev = (struct rm_event*)rtw_zmalloc(sizeof(struct rm_event));
|
||||
|
||||
if (pev == NULL) {
|
||||
rtw_mfree((u8 *) pcmd, sizeof(struct cmd_obj));
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
pev->rmid = rmid;
|
||||
pev->evid = evid;
|
||||
|
||||
init_h2fwcmd_w_parm_no_rsp(pcmd, pev, GEN_CMD_CODE(_RM_POST_EVENT));
|
||||
res = rtw_enqueue_cmd(pcmdpriv, pcmd);
|
||||
exit:
|
||||
return res;
|
||||
}
|
||||
|
||||
int rm_post_event(_adapter *padapter, u32 rmid, enum RM_EV_ID evid)
|
||||
{
|
||||
if (padapter->rmpriv.enable == _FALSE)
|
||||
return _FALSE;
|
||||
|
||||
RTW_INFO("RM: post asyn %s to rmid=%x\n", rm_event_name(evid), rmid);
|
||||
rtw_rm_post_envent_cmd(padapter, rmid, evid);
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
int _rm_post_event(_adapter *padapter, u32 rmid, enum RM_EV_ID evid)
|
||||
{
|
||||
struct rm_priv *prmpriv = &padapter->rmpriv;
|
||||
struct rm_event *pev;
|
||||
|
||||
if (evid >= RM_EV_max || rmid == 0)
|
||||
return _FALSE;
|
||||
|
||||
pev = (struct rm_event *)rtw_malloc(sizeof(struct rm_event));
|
||||
if (pev == NULL)
|
||||
return _FALSE;
|
||||
|
||||
pev->rmid = rmid;
|
||||
pev->evid = evid;
|
||||
|
||||
RTW_INFO("RM: post sync %s to rmid=%x\n", rm_event_name(evid), rmid);
|
||||
rm_enqueue_ev(&prmpriv->ev_queue, pev, FALSE);
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static void rm_bcast_aid_handler(_adapter *padapter, struct rm_event *pev)
|
||||
{
|
||||
_irqL irqL;
|
||||
_list *phead, *plist;
|
||||
_queue *queue = &padapter->rmpriv.rm_queue;
|
||||
struct rm_obj *prm;
|
||||
|
||||
|
||||
_enter_critical(&queue->lock, &irqL);
|
||||
phead = get_list_head(queue);
|
||||
plist = get_next(phead);
|
||||
while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
|
||||
|
||||
prm = LIST_CONTAINOR(plist, struct rm_obj, list);
|
||||
plist = get_next(plist);
|
||||
if (RM_GET_AID(pev->rmid) == RM_GET_AID(prm->rmid)) {
|
||||
_exit_critical(&queue->lock, &irqL);
|
||||
rm_state_run(prm, pev->evid);
|
||||
_enter_critical(&queue->lock, &irqL);
|
||||
}
|
||||
}
|
||||
_exit_critical(&queue->lock, &irqL);
|
||||
return;
|
||||
}
|
||||
|
||||
/* main handler of RM (Resource Management) */
|
||||
void rm_handler(_adapter *padapter, struct rm_event *pe)
|
||||
{
|
||||
int i;
|
||||
struct rm_priv *prmpriv = &padapter->rmpriv;
|
||||
struct rm_obj *prm;
|
||||
struct rm_event *pev;
|
||||
|
||||
|
||||
/* dequeue event */
|
||||
while((pev = rm_dequeue_ev(&prmpriv->ev_queue)) != NULL)
|
||||
{
|
||||
if (RM_IS_ID_FOR_ALL(pev->rmid)) {
|
||||
/* apply to all aid mateched measurement */
|
||||
rm_bcast_aid_handler(padapter, pev);
|
||||
rtw_mfree((void *)pev, sizeof(struct rm_event));
|
||||
continue;
|
||||
}
|
||||
|
||||
/* retrieve rmobj */
|
||||
prm = _rm_get_rmobj(&prmpriv->rm_queue, pev->rmid);
|
||||
if (prm == NULL) {
|
||||
RTW_ERR("RM: rmid=%x event=%s doesn't find rm obj\n",
|
||||
pev->rmid, rm_event_name(pev->evid));
|
||||
rtw_mfree((void *)pev, sizeof(struct rm_event));
|
||||
return;
|
||||
}
|
||||
/* run state machine */
|
||||
rm_state_run(prm, pev->evid);
|
||||
rtw_mfree((void *)pev, sizeof(struct rm_event));
|
||||
}
|
||||
}
|
||||
|
||||
static int rm_issue_meas_req(struct rm_obj *prm)
|
||||
{
|
||||
switch (prm->q.action_code) {
|
||||
case RM_ACT_RADIO_MEAS_REQ:
|
||||
switch (prm->q.m_type) {
|
||||
case bcn_req:
|
||||
case ch_load_req:
|
||||
case noise_histo_req:
|
||||
issue_radio_meas_req(prm);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
} /* meas_type */
|
||||
break;
|
||||
case RM_ACT_NB_REP_REQ:
|
||||
/* issue neighbor request */
|
||||
issue_nb_req(prm);
|
||||
break;
|
||||
case RM_ACT_LINK_MEAS_REQ:
|
||||
default:
|
||||
return _FALSE;
|
||||
} /* action_code */
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* RM state machine
|
||||
*/
|
||||
|
||||
static int rm_state_idle(struct rm_obj *prm, enum RM_EV_ID evid)
|
||||
{
|
||||
_adapter *padapter = prm->psta->padapter;
|
||||
u8 val8;
|
||||
u32 val32;
|
||||
|
||||
|
||||
prm->p.category = RTW_WLAN_CATEGORY_RADIO_MEAS;
|
||||
|
||||
switch (evid) {
|
||||
case RM_EV_state_in:
|
||||
switch (prm->q.action_code) {
|
||||
case RM_ACT_RADIO_MEAS_REQ:
|
||||
/* copy attrib from meas_req to meas_rep */
|
||||
prm->p.action_code = RM_ACT_RADIO_MEAS_REP;
|
||||
prm->p.diag_token = prm->q.diag_token;
|
||||
prm->p.e_id = _MEAS_RSP_IE_;
|
||||
prm->p.m_token = prm->q.m_token;
|
||||
prm->p.m_type = prm->q.m_type;
|
||||
prm->p.rpt = prm->q.rpt;
|
||||
prm->p.ch_num = prm->q.ch_num;
|
||||
prm->p.op_class = prm->q.op_class;
|
||||
|
||||
if (prm->q.m_type == ch_load_req
|
||||
|| prm->q.m_type == noise_histo_req) {
|
||||
/*
|
||||
* phydm measure current ch periodically
|
||||
* scan current ch is not necessary
|
||||
*/
|
||||
val8 = padapter->mlmeextpriv.cur_channel;
|
||||
if (prm->q.ch_num == val8)
|
||||
prm->poll_mode = 1;
|
||||
}
|
||||
RTW_INFO("RM: rmid=%x %s switch in repeat=%u\n",
|
||||
prm->rmid, rm_type_req_name(prm->q.m_type),
|
||||
prm->q.rpt);
|
||||
break;
|
||||
case RM_ACT_NB_REP_REQ:
|
||||
prm->p.action_code = RM_ACT_NB_REP_RESP;
|
||||
RTW_INFO("RM: rmid=%x Neighbor request switch in\n",
|
||||
prm->rmid);
|
||||
break;
|
||||
case RM_ACT_LINK_MEAS_REQ:
|
||||
prm->p.action_code = RM_ACT_LINK_MEAS_REP;
|
||||
rm_set_rep_mode(prm, MEAS_REP_MOD_INCAP);
|
||||
RTW_INFO("RM: rmid=%x Link meas switch in\n",
|
||||
prm->rmid);
|
||||
break;
|
||||
default:
|
||||
prm->p.action_code = prm->q.action_code;
|
||||
rm_set_rep_mode(prm, MEAS_REP_MOD_INCAP);
|
||||
RTW_INFO("RM: rmid=%x recv unknown action %d\n",
|
||||
prm->rmid,prm->p.action_code);
|
||||
break;
|
||||
} /* switch() */
|
||||
|
||||
if (prm->rmid & RM_MASTER) {
|
||||
if (rm_issue_meas_req(prm) == _SUCCESS)
|
||||
rm_state_goto(prm, RM_ST_WAIT_MEAS);
|
||||
else
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
} else {
|
||||
rm_state_goto(prm, RM_ST_DO_MEAS);
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
if (prm->p.m_mode) {
|
||||
issue_null_reply(prm);
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
}
|
||||
if (prm->q.rand_intvl) {
|
||||
/* get low tsf to generate random interval */
|
||||
val32 = rtw_read32(padapter, REG_TSFTR);
|
||||
val32 = val32 % prm->q.rand_intvl;
|
||||
RTW_INFO("RM: rmid=%x rand_intval=%d, rand=%d\n",
|
||||
prm->rmid, (int)prm->q.rand_intvl,val32);
|
||||
rm_set_clock(prm, prm->q.rand_intvl,
|
||||
RM_EV_delay_timer_expire);
|
||||
return _SUCCESS;
|
||||
}
|
||||
break;
|
||||
case RM_EV_delay_timer_expire:
|
||||
rm_state_goto(prm, RM_ST_DO_MEAS);
|
||||
break;
|
||||
case RM_EV_cancel:
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
break;
|
||||
case RM_EV_state_out:
|
||||
rm_cancel_clock(prm);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
/* we do the measuring */
|
||||
static int rm_state_do_meas(struct rm_obj *prm, enum RM_EV_ID evid)
|
||||
{
|
||||
_adapter *padapter = prm->psta->padapter;
|
||||
u8 val8;
|
||||
u64 val64;
|
||||
|
||||
|
||||
switch (evid) {
|
||||
case RM_EV_state_in:
|
||||
if (prm->q.action_code == RM_ACT_RADIO_MEAS_REQ) {
|
||||
switch (prm->q.m_type) {
|
||||
case bcn_req:
|
||||
if (prm->q.m_mode == bcn_req_bcn_table) {
|
||||
RTW_INFO("RM: rmid=%x Beacon table\n",
|
||||
prm->rmid);
|
||||
_rm_post_event(padapter, prm->rmid,
|
||||
RM_EV_survey_done);
|
||||
return _SUCCESS;
|
||||
}
|
||||
break;
|
||||
case ch_load_req:
|
||||
case noise_histo_req:
|
||||
if (prm->poll_mode)
|
||||
_rm_post_event(padapter, prm->rmid,
|
||||
RM_EV_survey_done);
|
||||
return _SUCCESS;
|
||||
default:
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
if (!ready_for_scan(prm)) {
|
||||
prm->wait_busy = RM_BUSY_TRAFFIC_TIMES;
|
||||
RTW_INFO("RM: wait busy traffic - %d\n",
|
||||
prm->wait_busy);
|
||||
rm_set_clock(prm, RM_WAIT_BUSY_TIMEOUT,
|
||||
RM_EV_busy_timer_expire);
|
||||
return _SUCCESS;
|
||||
}
|
||||
}
|
||||
_rm_post_event(padapter, prm->rmid, RM_EV_start_meas);
|
||||
break;
|
||||
case RM_EV_start_meas:
|
||||
if (prm->q.action_code == RM_ACT_RADIO_MEAS_REQ) {
|
||||
/* resotre measurement start time */
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_TSF, (u8 *)&val64);
|
||||
prm->meas_start_time = val64;
|
||||
|
||||
switch (prm->q.m_type) {
|
||||
case bcn_req:
|
||||
val8 = 1; /* Enable free run counter */
|
||||
rtw_hal_set_hwreg(padapter,
|
||||
HW_VAR_FREECNT, &val8);
|
||||
rm_sitesurvey(prm);
|
||||
break;
|
||||
case ch_load_req:
|
||||
case noise_histo_req:
|
||||
rm_sitesurvey(prm);
|
||||
break;
|
||||
default:
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* handle measurement timeout */
|
||||
rm_set_clock(prm, RM_MEAS_TIMEOUT, RM_EV_meas_timer_expire);
|
||||
break;
|
||||
case RM_EV_survey_done:
|
||||
if (prm->q.action_code == RM_ACT_RADIO_MEAS_REQ) {
|
||||
switch (prm->q.m_type) {
|
||||
case bcn_req:
|
||||
rm_cancel_clock(prm);
|
||||
rm_state_goto(prm, RM_ST_SEND_REPORT);
|
||||
return _SUCCESS;
|
||||
case ch_load_req:
|
||||
case noise_histo_req:
|
||||
retrieve_radio_meas_result(prm);
|
||||
|
||||
if (rm_radio_meas_report_cond(prm) == _SUCCESS)
|
||||
rm_state_goto(prm, RM_ST_SEND_REPORT);
|
||||
else
|
||||
rm_set_clock(prm, RM_COND_INTVL,
|
||||
RM_EV_retry_timer_expire);
|
||||
break;
|
||||
default:
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RM_EV_meas_timer_expire:
|
||||
RTW_INFO("RM: rmid=%x measurement timeount\n",prm->rmid);
|
||||
rm_set_rep_mode(prm, MEAS_REP_MOD_REFUSE);
|
||||
issue_null_reply(prm);
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
break;
|
||||
case RM_EV_busy_timer_expire:
|
||||
if (!ready_for_scan(prm) && prm->wait_busy--) {
|
||||
RTW_INFO("RM: wait busy - %d\n",prm->wait_busy);
|
||||
rm_set_clock(prm, RM_WAIT_BUSY_TIMEOUT,
|
||||
RM_EV_busy_timer_expire);
|
||||
break;
|
||||
}
|
||||
else if (prm->wait_busy <= 0) {
|
||||
RTW_INFO("RM: wait busy timeout\n");
|
||||
rm_set_rep_mode(prm, MEAS_REP_MOD_REFUSE);
|
||||
issue_null_reply(prm);
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
}
|
||||
_rm_post_event(padapter, prm->rmid, RM_EV_start_meas);
|
||||
break;
|
||||
case RM_EV_request_timer_expire:
|
||||
rm_set_rep_mode(prm, MEAS_REP_MOD_REFUSE);
|
||||
issue_null_reply(prm);
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
break;
|
||||
case RM_EV_retry_timer_expire:
|
||||
/* expired due to meas condition mismatch, meas again */
|
||||
_rm_post_event(padapter, prm->rmid, RM_EV_start_meas);
|
||||
break;
|
||||
case RM_EV_cancel:
|
||||
rm_set_rep_mode(prm, MEAS_REP_MOD_REFUSE);
|
||||
issue_null_reply(prm);
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
break;
|
||||
case RM_EV_state_out:
|
||||
rm_cancel_clock(prm);
|
||||
/* resotre measurement end time */
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_TSF, (u8 *)&val64);
|
||||
_rtw_memcpy(&prm->meas_end_time, (char *)&val64, sizeof(u64));
|
||||
|
||||
val8 = 0; /* Disable free run counter */
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_FREECNT, &val8);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static int rm_state_wait_meas(struct rm_obj *prm, enum RM_EV_ID evid)
|
||||
{
|
||||
u8 val8;
|
||||
u64 val64;
|
||||
|
||||
|
||||
switch (evid) {
|
||||
case RM_EV_state_in:
|
||||
/* we create meas_req, waiting for peer report */
|
||||
rm_set_clock(prm, RM_REQ_TIMEOUT,
|
||||
RM_EV_request_timer_expire);
|
||||
break;
|
||||
case RM_EV_recv_rep:
|
||||
rm_state_goto(prm, RM_ST_RECV_REPORT);
|
||||
break;
|
||||
case RM_EV_request_timer_expire:
|
||||
case RM_EV_cancel:
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
break;
|
||||
case RM_EV_state_out:
|
||||
rm_cancel_clock(prm);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static int rm_state_send_report(struct rm_obj *prm, enum RM_EV_ID evid)
|
||||
{
|
||||
u8 val8;
|
||||
|
||||
|
||||
switch (evid) {
|
||||
case RM_EV_state_in:
|
||||
/* we have to issue report */
|
||||
switch (prm->q.m_type) {
|
||||
case bcn_req:
|
||||
issue_beacon_rep(prm);
|
||||
break;
|
||||
case ch_load_req:
|
||||
case noise_histo_req:
|
||||
issue_radio_meas_rep(prm);
|
||||
break;
|
||||
default:
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
/* check repeat */
|
||||
if (prm->p.rpt) {
|
||||
RTW_INFO("RM: rmid=%x repeat=%u/%u\n",
|
||||
prm->rmid, prm->p.rpt,
|
||||
prm->q.rpt);
|
||||
prm->p.rpt--;
|
||||
/*
|
||||
* we recv meas_req,
|
||||
* delay for a wihile and than meas again
|
||||
*/
|
||||
if (prm->poll_mode)
|
||||
rm_set_clock(prm, RM_REPT_POLL_INTVL,
|
||||
RM_EV_repeat_delay_expire);
|
||||
else
|
||||
rm_set_clock(prm, RM_REPT_SCAN_INTVL,
|
||||
RM_EV_repeat_delay_expire);
|
||||
return _SUCCESS;
|
||||
}
|
||||
/* we are done */
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
break;
|
||||
case RM_EV_repeat_delay_expire:
|
||||
rm_state_goto(prm, RM_ST_DO_MEAS);
|
||||
break;
|
||||
case RM_EV_cancel:
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
break;
|
||||
case RM_EV_state_out:
|
||||
rm_cancel_clock(prm);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static int rm_state_recv_report(struct rm_obj *prm, enum RM_EV_ID evid)
|
||||
{
|
||||
u8 val8;
|
||||
|
||||
|
||||
switch (evid) {
|
||||
case RM_EV_state_in:
|
||||
/* we issue meas_req, got peer's meas report */
|
||||
switch (prm->p.action_code) {
|
||||
case RM_ACT_RADIO_MEAS_REP:
|
||||
/* check refuse, incapable and repeat */
|
||||
val8 = prm->p.m_mode;
|
||||
if (val8) {
|
||||
RTW_INFO("RM: rmid=%x peer reject (%s repeat=%d)\n",
|
||||
prm->rmid,
|
||||
val8|MEAS_REP_MOD_INCAP?"INCAP":
|
||||
val8|MEAS_REP_MOD_REFUSE?"REFUSE":
|
||||
val8|MEAS_REP_MOD_LATE?"LATE":"",
|
||||
prm->p.rpt);
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
}
|
||||
break;
|
||||
case RM_ACT_NB_REP_RESP:
|
||||
/* report to upper layer if needing */
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
default:
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
return _SUCCESS;
|
||||
}
|
||||
/* check repeat */
|
||||
if (prm->p.rpt) {
|
||||
RTW_INFO("RM: rmid=%x repeat=%u/%u\n",
|
||||
prm->rmid, prm->p.rpt,
|
||||
prm->q.rpt);
|
||||
prm->p.rpt--;
|
||||
/* waitting more report */
|
||||
rm_state_goto(prm, RM_ST_WAIT_MEAS);
|
||||
break;
|
||||
}
|
||||
/* we are done */
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
break;
|
||||
case RM_EV_cancel:
|
||||
rm_state_goto(prm, RM_ST_END);
|
||||
break;
|
||||
case RM_EV_state_out:
|
||||
rm_cancel_clock(prm);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static int rm_state_end(struct rm_obj *prm, enum RM_EV_ID evid)
|
||||
{
|
||||
switch (evid) {
|
||||
case RM_EV_state_in:
|
||||
_rm_post_event(prm->psta->padapter, prm->rmid, RM_EV_state_out);
|
||||
break;
|
||||
|
||||
case RM_EV_cancel:
|
||||
case RM_EV_state_out:
|
||||
default:
|
||||
rm_free_rmobj(prm);
|
||||
break;
|
||||
}
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
struct fsm_state rm_fsm[] = {
|
||||
{"RM_ST_IDLE", rm_state_idle},
|
||||
{"RM_ST_DO_MEAS", rm_state_do_meas},
|
||||
{"RM_ST_WAIT_MEAS", rm_state_wait_meas},
|
||||
{"RM_ST_SEND_REPORT", rm_state_send_report},
|
||||
{"RM_ST_RECV_REPORT", rm_state_recv_report},
|
||||
{"RM_ST_END", rm_state_end}
|
||||
};
|
||||
|
||||
char *rm_state_name(enum RM_STATE state)
|
||||
{
|
||||
return rm_fsm[state].name;
|
||||
}
|
||||
|
||||
char *rm_event_name(enum RM_EV_ID evid)
|
||||
{
|
||||
switch(evid) {
|
||||
case RM_EV_state_in:
|
||||
return "RM_EV_state_in";
|
||||
case RM_EV_busy_timer_expire:
|
||||
return "RM_EV_busy_timer_expire";
|
||||
case RM_EV_delay_timer_expire:
|
||||
return "RM_EV_delay_timer_expire";
|
||||
case RM_EV_meas_timer_expire:
|
||||
return "RM_EV_meas_timer_expire";
|
||||
case RM_EV_repeat_delay_expire:
|
||||
return "RM_EV_repeat_delay_expire";
|
||||
case RM_EV_retry_timer_expire:
|
||||
return "RM_EV_retry_timer_expire";
|
||||
case RM_EV_request_timer_expire:
|
||||
return "RM_EV_request_timer_expire";
|
||||
case RM_EV_wait_report:
|
||||
return "RM_EV_wait_report";
|
||||
case RM_EV_start_meas:
|
||||
return "RM_EV_start_meas";
|
||||
case RM_EV_survey_done:
|
||||
return "RM_EV_survey_done";
|
||||
case RM_EV_recv_rep:
|
||||
return "RM_EV_recv_report";
|
||||
case RM_EV_cancel:
|
||||
return "RM_EV_cancel";
|
||||
case RM_EV_state_out:
|
||||
return "RM_EV_state_out";
|
||||
case RM_EV_max:
|
||||
return "RM_EV_max";
|
||||
default:
|
||||
return "RM_EV_unknown";
|
||||
}
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
static void rm_state_initial(struct rm_obj *prm)
|
||||
{
|
||||
prm->state = RM_ST_IDLE;
|
||||
|
||||
RTW_INFO("\n");
|
||||
RTW_INFO("RM: rmid=%x %-18s -> %s\n",prm->rmid,
|
||||
"new measurement", rm_fsm[prm->state].name);
|
||||
|
||||
rm_post_event(prm->psta->padapter, prm->rmid, RM_EV_state_in);
|
||||
}
|
||||
|
||||
static void rm_state_run(struct rm_obj *prm, enum RM_EV_ID evid)
|
||||
{
|
||||
RTW_INFO("RM: rmid=%x %-18s %s\n",prm->rmid,
|
||||
rm_fsm[prm->state].name,rm_event_name(evid));
|
||||
|
||||
rm_fsm[prm->state].fsm_func(prm, evid);
|
||||
}
|
||||
|
||||
static void rm_state_goto(struct rm_obj *prm, enum RM_STATE rm_state)
|
||||
{
|
||||
if (prm->state == rm_state)
|
||||
return;
|
||||
|
||||
rm_state_run(prm, RM_EV_state_out);
|
||||
|
||||
RTW_INFO("\n");
|
||||
RTW_INFO("RM: rmid=%x %-18s -> %s\n",prm->rmid,
|
||||
rm_fsm[prm->state].name, rm_fsm[rm_state].name);
|
||||
|
||||
prm->state = rm_state;
|
||||
rm_state_run(prm, RM_EV_state_in);
|
||||
}
|
||||
#endif /* CONFIG_RTW_80211K */
|
||||
592
drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_rson.c
Normal file
592
drivers/net/wireless/rockchip_wlan/rtl8723ds/core/rtw_rson.c
Normal file
|
|
@ -0,0 +1,592 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* 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_RSON_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
||||
#ifdef CONFIG_RTW_REPEATER_SON
|
||||
|
||||
/******** Custommize Part ***********************/
|
||||
|
||||
unsigned char RTW_RSON_OUI[] = {0xFA, 0xFA, 0xFA};
|
||||
#define RSON_SCORE_DIFF_TH 8
|
||||
|
||||
/*
|
||||
Calculate the corresponding score.
|
||||
*/
|
||||
inline u8 rtw_cal_rson_score(struct rtw_rson_struct *cand_rson_data, NDIS_802_11_RSSI Rssi)
|
||||
{
|
||||
if ((cand_rson_data->hopcnt == RTW_RSON_HC_NOTREADY)
|
||||
|| (cand_rson_data->connectible == RTW_RSON_DENYCONNECT))
|
||||
return RTW_RSON_SCORE_NOTCNNT;
|
||||
|
||||
return RTW_RSON_SCORE_MAX - (cand_rson_data->hopcnt * 10) + (Rssi/10);
|
||||
}
|
||||
|
||||
/*************************************************/
|
||||
|
||||
|
||||
static u8 rtw_rson_block_bssid_idx = 0;
|
||||
u8 rtw_rson_block_bssid[10][6] = {
|
||||
/*{0x02, 0xE0, 0x4C, 0x07, 0xC3, 0xF6}*/
|
||||
};
|
||||
|
||||
/* fake root, regard a real AP as a SO root */
|
||||
static u8 rtw_rson_root_bssid_idx = 0;
|
||||
u8 rtw_rson_root_bssid[10][6] = {
|
||||
/*{0x1c, 0x5f, 0x2b, 0x5a, 0x60, 0x24}*/
|
||||
};
|
||||
|
||||
int is_match_bssid(u8 *mac, u8 bssid_array[][6], int num)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
if (_rtw_memcmp(mac, bssid_array[i], 6) == _TRUE)
|
||||
return _TRUE;
|
||||
return _FALSE;
|
||||
}
|
||||
|
||||
void init_rtw_rson_data(struct dvobj_priv *dvobj)
|
||||
{
|
||||
/*Aries todo. if pdvobj->rson_data.ver == 1 */
|
||||
dvobj->rson_data.ver = RTW_RSON_VER;
|
||||
dvobj->rson_data.id = CONFIG_RTW_REPEATER_SON_ID;
|
||||
#ifdef CONFIG_RTW_REPEATER_SON_ROOT
|
||||
dvobj->rson_data.hopcnt = RTW_RSON_HC_ROOT;
|
||||
dvobj->rson_data.connectible = RTW_RSON_ALLOWCONNECT;
|
||||
#else
|
||||
dvobj->rson_data.hopcnt = RTW_RSON_HC_NOTREADY;
|
||||
dvobj->rson_data.connectible = RTW_RSON_DENYCONNECT;
|
||||
#endif
|
||||
dvobj->rson_data.loading = 0;
|
||||
_rtw_memset(dvobj->rson_data.res, 0xAA, sizeof(dvobj->rson_data.res));
|
||||
}
|
||||
|
||||
void rtw_rson_get_property_str(_adapter *padapter, char *rson_data_str)
|
||||
{
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
|
||||
|
||||
sprintf(rson_data_str, "version : \t%d\nid : \t\t%08x\nhop count : \t%d\nconnectible : \t%s\nloading : \t%d\nreserve : \t%16ph\n",
|
||||
pdvobj->rson_data.ver,
|
||||
pdvobj->rson_data.id,
|
||||
pdvobj->rson_data.hopcnt,
|
||||
pdvobj->rson_data.connectible ? "connectable":"unconnectable",
|
||||
pdvobj->rson_data.loading,
|
||||
pdvobj->rson_data.res);
|
||||
}
|
||||
|
||||
int str2hexbuf(char *str, u8 *hexbuf, int len)
|
||||
{
|
||||
u8 *p;
|
||||
int i, slen, idx = 0;
|
||||
|
||||
p = (unsigned char *)str;
|
||||
if ((*p != '0') || (*(p+1) != 'x'))
|
||||
return _FALSE;
|
||||
slen = strlen(str);
|
||||
if (slen > (len*2) + 2)
|
||||
return _FALSE;
|
||||
p += 2;
|
||||
for (i = 0 ; i < len; i++, idx = idx+2) {
|
||||
hexbuf[i] = key_2char2num(p[idx], p[idx + 1]);
|
||||
if (slen <= idx+2)
|
||||
break;
|
||||
}
|
||||
return _TRUE;
|
||||
}
|
||||
|
||||
int rtw_rson_set_property(_adapter *padapter, char *field, char *value)
|
||||
{
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
|
||||
int num = 0;
|
||||
|
||||
if (_rtw_memcmp(field, (u8 *)"ver", 3) == _TRUE)
|
||||
pdvobj->rson_data.ver = rtw_atoi(value);
|
||||
else if (_rtw_memcmp(field, (u8 *)"id", 2) == _TRUE)
|
||||
num = sscanf(value, "%08x", &(pdvobj->rson_data.id));
|
||||
else if (_rtw_memcmp(field, (u8 *)"hc", 2) == _TRUE)
|
||||
num = sscanf(value, "%hhu", &(pdvobj->rson_data.hopcnt));
|
||||
else if (_rtw_memcmp(field, (u8 *)"cnt", 3) == _TRUE)
|
||||
num = sscanf(value, "%hhu", &(pdvobj->rson_data.connectible));
|
||||
else if (_rtw_memcmp(field, (u8 *)"loading", 2) == _TRUE)
|
||||
num = sscanf(value, "%hhu", &(pdvobj->rson_data.loading));
|
||||
else if (_rtw_memcmp(field, (u8 *)"res", 2) == _TRUE) {
|
||||
str2hexbuf(value, pdvobj->rson_data.res, 16);
|
||||
return 1;
|
||||
} else
|
||||
return _FALSE;
|
||||
return num;
|
||||
}
|
||||
|
||||
/*
|
||||
return : TRUE -- competitor is taking advantage than condidate
|
||||
FALSE -- we should continue keeping candidate
|
||||
*/
|
||||
int rtw_rson_choose(struct wlan_network **candidate, struct wlan_network *competitor)
|
||||
{
|
||||
s16 comp_score = 0, cand_score = 0;
|
||||
struct rtw_rson_struct rson_cand, rson_comp;
|
||||
|
||||
if (is_match_bssid(competitor->network.MacAddress, rtw_rson_block_bssid, rtw_rson_block_bssid_idx) == _TRUE)
|
||||
return _FALSE;
|
||||
|
||||
if ((competitor == NULL)
|
||||
|| (rtw_get_rson_struct(&(competitor->network), &rson_comp) != _TRUE)
|
||||
|| (rson_comp.id != CONFIG_RTW_REPEATER_SON_ID))
|
||||
return _FALSE;
|
||||
|
||||
comp_score = rtw_cal_rson_score(&rson_comp, competitor->network.Rssi);
|
||||
if (comp_score == RTW_RSON_SCORE_NOTCNNT)
|
||||
return _FALSE;
|
||||
|
||||
if (*candidate == NULL)
|
||||
return _TRUE;
|
||||
if (rtw_get_rson_struct(&((*candidate)->network), &rson_cand) != _TRUE)
|
||||
return _FALSE;
|
||||
|
||||
cand_score = rtw_cal_rson_score(&rson_cand, (*candidate)->network.Rssi);
|
||||
RTW_INFO("%s: competitor_score=%d, candidate_score=%d\n", __func__, comp_score, cand_score);
|
||||
if (comp_score - cand_score > RSON_SCORE_DIFF_TH)
|
||||
return _TRUE;
|
||||
|
||||
return _FALSE;
|
||||
}
|
||||
|
||||
inline u8 rtw_rson_varify_ie(u8 *p)
|
||||
{
|
||||
u8 *ptr = NULL;
|
||||
u8 ver;
|
||||
u32 id;
|
||||
u8 hopcnt;
|
||||
u8 allcnnt;
|
||||
|
||||
ptr = p + 2 + sizeof(RTW_RSON_OUI);
|
||||
ver = *ptr;
|
||||
|
||||
/* for (ver == 1) */
|
||||
if (ver != 1)
|
||||
return _FALSE;
|
||||
|
||||
return _TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
Parsing RTK self-organization vendor IE
|
||||
*/
|
||||
int rtw_get_rson_struct(WLAN_BSSID_EX *bssid, struct rtw_rson_struct *rson_data)
|
||||
{
|
||||
sint limit = 0;
|
||||
u32 len;
|
||||
u8 *p;
|
||||
|
||||
if ((rson_data == NULL) || (bssid == NULL))
|
||||
return -EINVAL;
|
||||
|
||||
/* Default */
|
||||
rson_data->id = 0;
|
||||
rson_data->ver = 0;
|
||||
rson_data->hopcnt = 0;
|
||||
rson_data->connectible = 0;
|
||||
rson_data->loading = 0;
|
||||
/* fake root */
|
||||
if (is_match_bssid(bssid->MacAddress, rtw_rson_root_bssid, rtw_rson_root_bssid_idx) == _TRUE) {
|
||||
rson_data->id = CONFIG_RTW_REPEATER_SON_ID;
|
||||
rson_data->ver = RTW_RSON_VER;
|
||||
rson_data->hopcnt = RTW_RSON_HC_ROOT;
|
||||
rson_data->connectible = RTW_RSON_ALLOWCONNECT;
|
||||
rson_data->loading = 0;
|
||||
return _TRUE;
|
||||
}
|
||||
limit = bssid->IELength - _BEACON_IE_OFFSET_;
|
||||
|
||||
for (p = bssid->IEs + _BEACON_IE_OFFSET_; ; p += (len + 2)) {
|
||||
p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &len, limit);
|
||||
limit -= len;
|
||||
if ((p == NULL) || (len == 0))
|
||||
break;
|
||||
if (p && (_rtw_memcmp(p + 2, RTW_RSON_OUI, sizeof(RTW_RSON_OUI)) == _TRUE)
|
||||
&& rtw_rson_varify_ie(p)) {
|
||||
p = p + 2 + sizeof(RTW_RSON_OUI);
|
||||
rson_data->ver = *p;
|
||||
/* for (ver == 1) */
|
||||
p = p + 1;
|
||||
rson_data->id = le32_to_cpup((__le32 *)p);
|
||||
p = p + 4;
|
||||
rson_data->hopcnt = *p;
|
||||
p = p + 1;
|
||||
rson_data->connectible = *p;
|
||||
p = p + 1;
|
||||
rson_data->loading = *p;
|
||||
|
||||
return _TRUE;
|
||||
}
|
||||
}
|
||||
return -EBADMSG;
|
||||
}
|
||||
|
||||
u32 rtw_rson_append_ie(_adapter *padapter, unsigned char *pframe, u32 *len)
|
||||
{
|
||||
u8 *ptr, *ori, ie_len = 0;
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
/* static int iii = 0;*/
|
||||
|
||||
if ((!pdvobj) || (!pframe))
|
||||
return 0;
|
||||
ptr = ori = pframe;
|
||||
*ptr++ = _VENDOR_SPECIFIC_IE_;
|
||||
*ptr++ = ie_len = sizeof(RTW_RSON_OUI)+sizeof(pdvobj->rson_data);
|
||||
_rtw_memcpy(ptr, RTW_RSON_OUI, sizeof(RTW_RSON_OUI));
|
||||
ptr = ptr + sizeof(RTW_RSON_OUI);
|
||||
*ptr++ = pdvobj->rson_data.ver;
|
||||
*(s32 *)ptr = cpu_to_le32(pdvobj->rson_data.id);
|
||||
ptr = ptr + sizeof(pdvobj->rson_data.id);
|
||||
*ptr++ = pdvobj->rson_data.hopcnt;
|
||||
*ptr++ = pdvobj->rson_data.connectible;
|
||||
*ptr++ = pdvobj->rson_data.loading;
|
||||
_rtw_memcpy(ptr, pdvobj->rson_data.res, sizeof(pdvobj->rson_data.res));
|
||||
pframe = ptr;
|
||||
/*
|
||||
iii = iii % 20;
|
||||
if (iii++ == 0)
|
||||
RTW_INFO("%s : RTW RSON IE : %20ph\n", __func__, ori);
|
||||
*/
|
||||
*len += (ie_len+2);
|
||||
return ie_len;
|
||||
|
||||
}
|
||||
|
||||
void rtw_rson_do_disconnect(_adapter *padapter)
|
||||
{
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
|
||||
|
||||
RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
|
||||
#ifndef CONFIG_RTW_REPEATER_SON_ROOT
|
||||
pdvobj->rson_data.ver = RTW_RSON_VER;
|
||||
pdvobj->rson_data.id = CONFIG_RTW_REPEATER_SON_ID;
|
||||
pdvobj->rson_data.hopcnt = RTW_RSON_HC_NOTREADY;
|
||||
pdvobj->rson_data.connectible = RTW_RSON_DENYCONNECT;
|
||||
pdvobj->rson_data.loading = 0;
|
||||
rtw_mi_tx_beacon_hdl(padapter);
|
||||
#endif
|
||||
}
|
||||
|
||||
void rtw_rson_join_done(_adapter *padapter)
|
||||
{
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
|
||||
WLAN_BSSID_EX *cur_network = NULL;
|
||||
struct rtw_rson_struct rson_data;
|
||||
|
||||
RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
|
||||
if (!padapter->mlmepriv.cur_network_scanned)
|
||||
return;
|
||||
cur_network = &(padapter->mlmepriv.cur_network_scanned->network);
|
||||
if (rtw_get_rson_struct(cur_network, &rson_data) != _TRUE) {
|
||||
RTW_ERR("%s: try to join a improper network(%s)\n", __func__, cur_network->Ssid.Ssid);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_RTW_REPEATER_SON_ROOT
|
||||
/* update rson_data */
|
||||
pdvobj->rson_data.ver = RTW_RSON_VER;
|
||||
pdvobj->rson_data.id = rson_data.id;
|
||||
pdvobj->rson_data.hopcnt = rson_data.hopcnt + 1;
|
||||
pdvobj->rson_data.connectible = RTW_RSON_ALLOWCONNECT;
|
||||
pdvobj->rson_data.loading = 0;
|
||||
rtw_mi_tx_beacon_hdl(padapter);
|
||||
#endif
|
||||
}
|
||||
|
||||
int rtw_rson_isupdate_roamcan(struct mlme_priv *mlme
|
||||
, struct wlan_network **candidate, struct wlan_network *competitor)
|
||||
{
|
||||
struct rtw_rson_struct rson_cand, rson_comp, rson_curr;
|
||||
s16 comp_score, cand_score, curr_score;
|
||||
|
||||
if ((competitor == NULL)
|
||||
|| (rtw_get_rson_struct(&(competitor->network), &rson_comp) != _TRUE)
|
||||
|| (rson_comp.id != CONFIG_RTW_REPEATER_SON_ID))
|
||||
return _FALSE;
|
||||
|
||||
if ((!mlme->cur_network_scanned)
|
||||
|| (mlme->cur_network_scanned == competitor)
|
||||
|| (rtw_get_rson_struct(&(mlme->cur_network_scanned->network), &rson_curr)) != _TRUE)
|
||||
return _FALSE;
|
||||
|
||||
if (rtw_get_passing_time_ms((u32)competitor->last_scanned) >= mlme->roam_scanr_exp_ms)
|
||||
return _FALSE;
|
||||
|
||||
comp_score = rtw_cal_rson_score(&rson_comp, competitor->network.Rssi);
|
||||
curr_score = rtw_cal_rson_score(&rson_curr, mlme->cur_network_scanned->network.Rssi);
|
||||
if (comp_score - curr_score < RSON_SCORE_DIFF_TH)
|
||||
return _FALSE;
|
||||
|
||||
if (*candidate == NULL)
|
||||
return _TRUE;
|
||||
|
||||
if (rtw_get_rson_struct(&((*candidate)->network), &rson_cand) != _TRUE) {
|
||||
RTW_ERR("%s : Unable to get rson_struct from candidate(%s -- " MAC_FMT")\n",
|
||||
__func__, (*candidate)->network.Ssid.Ssid, MAC_ARG((*candidate)->network.MacAddress));
|
||||
return _FALSE;
|
||||
}
|
||||
cand_score = rtw_cal_rson_score(&rson_cand, (*candidate)->network.Rssi);
|
||||
RTW_DBG("comp_score=%d , cand_score=%d , curr_score=%d\n", comp_score, cand_score, curr_score);
|
||||
if (cand_score < comp_score)
|
||||
return _TRUE;
|
||||
|
||||
#if 0 /* Handle 11R protocol */
|
||||
#ifdef CONFIG_RTW_80211R
|
||||
if (rtw_chk_ft_flags(adapter, RTW_FT_SUPPORTED)) {
|
||||
ptmp = rtw_get_ie(&competitor->network.IEs[12], _MDIE_, &mdie_len, competitor->network.IELength-12);
|
||||
if (ptmp) {
|
||||
if (!_rtw_memcmp(&pftpriv->mdid, ptmp+2, 2))
|
||||
goto exit;
|
||||
|
||||
/*The candidate don't support over-the-DS*/
|
||||
if (rtw_chk_ft_flags(adapter, RTW_FT_STA_OVER_DS_SUPPORTED)) {
|
||||
if ((rtw_chk_ft_flags(adapter, RTW_FT_OVER_DS_SUPPORTED) && !(*(ptmp+4) & 0x01)) ||
|
||||
(!rtw_chk_ft_flags(adapter, RTW_FT_OVER_DS_SUPPORTED) && (*(ptmp+4) & 0x01))) {
|
||||
RTW_INFO("FT: ignore the candidate(" MAC_FMT ") for over-the-DS\n", MAC_ARG(competitor->network.MacAddress));
|
||||
rtw_clr_ft_flags(adapter, RTW_FT_OVER_DS_SUPPORTED);
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
} else
|
||||
goto exit;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return _FALSE;
|
||||
}
|
||||
|
||||
void rtw_rson_show_survey_info(struct seq_file *m, _list *plist, _list *phead)
|
||||
{
|
||||
struct wlan_network *pnetwork = NULL;
|
||||
struct rtw_rson_struct rson_data;
|
||||
s16 rson_score;
|
||||
u16 index = 0;
|
||||
|
||||
RTW_PRINT_SEL(m, "%5s %-17s %3s %5s %14s %10s %-3s %5s %32s\n", "index", "bssid", "ch", "id", "hop_cnt", "loading", "RSSI", "score", "ssid");
|
||||
while (1) {
|
||||
if (rtw_end_of_queue_search(phead, plist) == _TRUE)
|
||||
break;
|
||||
|
||||
pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
|
||||
if (!pnetwork)
|
||||
break;
|
||||
|
||||
_rtw_memset(&rson_data, 0, sizeof(rson_data));
|
||||
rson_score = 0;
|
||||
if (rtw_get_rson_struct(&(pnetwork->network), &rson_data) == _TRUE)
|
||||
rson_score = rtw_cal_rson_score(&rson_data, pnetwork->network.Rssi);
|
||||
RTW_PRINT_SEL(m, "%5d "MAC_FMT" %3d 0x%08x %6d %10d %6d %6d %32s\n",
|
||||
++index,
|
||||
MAC_ARG(pnetwork->network.MacAddress),
|
||||
pnetwork->network.Configuration.DSConfig,
|
||||
rson_data.id,
|
||||
rson_data.hopcnt,
|
||||
rson_data.loading,
|
||||
(int)pnetwork->network.Rssi,
|
||||
rson_score,
|
||||
pnetwork->network.Ssid.Ssid);
|
||||
plist = get_next(plist);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
Description : As a AP role, We need to check the qualify of associating STA.
|
||||
We also need to check if we are ready to be associated.
|
||||
|
||||
return : TRUE -- AP REJECT this STA
|
||||
FALSE -- AP ACCEPT this STA
|
||||
*/
|
||||
u8 rtw_rson_ap_check_sta(_adapter *padapter, u8 *pframe, uint pkt_len, unsigned short ie_offset)
|
||||
{
|
||||
struct wlan_network *pnetwork = NULL;
|
||||
struct rtw_rson_struct rson_target;
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
|
||||
int len = 0;
|
||||
u8 ret = _FALSE;
|
||||
u8 *p;
|
||||
|
||||
#ifndef CONFIG_RTW_REPEATER_SON_ROOT
|
||||
_rtw_memset(&rson_target, 0, sizeof(rson_target));
|
||||
for (p = pframe + WLAN_HDR_A3_LEN + ie_offset; ; p += (len + 2)) {
|
||||
p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &len, pkt_len - WLAN_HDR_A3_LEN - ie_offset);
|
||||
|
||||
if ((p == NULL) || (len == 0))
|
||||
break;
|
||||
|
||||
if (p && (_rtw_memcmp(p + 2, RTW_RSON_OUI, sizeof(RTW_RSON_OUI)) == _TRUE)
|
||||
&& rtw_rson_varify_ie(p)) {
|
||||
p = p + 2 + sizeof(RTW_RSON_OUI);
|
||||
rson_target.ver = *p;
|
||||
/* for (ver == 1) */
|
||||
p = p + 1;
|
||||
rson_target.id = le32_to_cpup((__le32 *)p);
|
||||
p = p + 4;
|
||||
rson_target.hopcnt = *p;
|
||||
p = p + 1;
|
||||
rson_target.connectible = *p;
|
||||
p = p + 1;
|
||||
rson_target.loading = *p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (rson_target.id == 0) /* Normal STA, not a RSON STA */
|
||||
ret = _FALSE;
|
||||
else if (rson_target.id != pdvobj->rson_data.id) {
|
||||
ret = _TRUE;
|
||||
RTW_INFO("%s : Reject AssoReq because RSON ID not match, STA=%08x, our=%08x\n",
|
||||
__func__, rson_target.id, pdvobj->rson_data.id);
|
||||
} else if ((pdvobj->rson_data.hopcnt == RTW_RSON_HC_NOTREADY)
|
||||
|| (pdvobj->rson_data.connectible == RTW_RSON_DENYCONNECT)) {
|
||||
ret = _TRUE;
|
||||
RTW_INFO("%s : Reject AssoReq becuase our hopcnt=%d or connectbile=%d\n",
|
||||
__func__, pdvobj->rson_data.hopcnt, pdvobj->rson_data.connectible);
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
u8 rtw_rson_scan_wk_cmd(_adapter *padapter, int op)
|
||||
{
|
||||
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));
|
||||
if (ph2c == NULL) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
|
||||
if (pdrvextra_cmd_parm == NULL) {
|
||||
rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj));
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
pdrvextra_cmd_parm->ec_id = RSON_SCAN_WK_CID;
|
||||
pdrvextra_cmd_parm->type = op;
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
void rtw_rson_scan_cmd_hdl(_adapter *padapter, int op)
|
||||
{
|
||||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
u8 val8;
|
||||
|
||||
if (mlmeext_chk_scan_state(pmlmeext, SCAN_DISABLE) != _FALSE)
|
||||
return;
|
||||
if (op == RSON_SCAN_PROCESS) {
|
||||
padapter->rtw_rson_scanstage = RSON_SCAN_PROCESS;
|
||||
val8 = 0x1e;
|
||||
rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &val8, _FALSE);
|
||||
val8 = 1;
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
|
||||
issue_probereq(padapter, NULL, NULL);
|
||||
/* stop rson_scan after 100ms */
|
||||
_set_timer(&(pmlmeext->rson_scan_timer), 100);
|
||||
} else if (op == RSON_SCAN_DISABLE) {
|
||||
padapter->rtw_rson_scanstage = RSON_SCAN_DISABLE;
|
||||
val8 = 0;
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
|
||||
val8 = 0xff;
|
||||
rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &val8, _FALSE);
|
||||
/* report_surveydone_event(padapter);*/
|
||||
if (pmlmepriv->to_join == _TRUE) {
|
||||
if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) != _TRUE) {
|
||||
int s_ret;
|
||||
|
||||
set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
|
||||
pmlmepriv->to_join = _FALSE;
|
||||
s_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv);
|
||||
if (s_ret == _SUCCESS)
|
||||
_set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
|
||||
else if (s_ret == 2) {
|
||||
_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
|
||||
rtw_indicate_connect(padapter);
|
||||
} else {
|
||||
RTW_INFO("try_to_join, but select scanning queue fail, to_roam:%d\n", rtw_to_roam(padapter));
|
||||
if (rtw_to_roam(padapter) != 0) {
|
||||
if (rtw_dec_to_roam(padapter) == 0) {
|
||||
rtw_set_to_roam(padapter, 0);
|
||||
#ifdef CONFIG_INTEL_WIDI
|
||||
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);
|
||||
RTW_INFO("change to widi listen\n");
|
||||
}
|
||||
#endif /* CONFIG_INTEL_WIDI */
|
||||
rtw_free_assoc_resources(padapter, 1);
|
||||
rtw_indicate_disconnect(padapter, 0, _FALSE);
|
||||
} else
|
||||
pmlmepriv->to_join = _TRUE;
|
||||
} else
|
||||
rtw_indicate_disconnect(padapter, 0, _FALSE);
|
||||
_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (rtw_chk_roam_flags(padapter, RTW_ROAM_ACTIVE)) {
|
||||
if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)
|
||||
&& check_fwstate(pmlmepriv, _FW_LINKED)) {
|
||||
if (rtw_select_roaming_candidate(pmlmepriv) == _SUCCESS) {
|
||||
#ifdef CONFIG_RTW_80211R
|
||||
if (rtw_chk_ft_flags(padapter, RTW_FT_OVER_DS_SUPPORTED)) {
|
||||
start_clnt_ft_action(adapter, (u8 *)pmlmepriv->roam_network->network.MacAddress);
|
||||
} else {
|
||||
/*wait a little time to retrieve packets buffered in the current ap while scan*/
|
||||
_set_timer(&pmlmeext->ft_roam_timer, 30);
|
||||
}
|
||||
#else
|
||||
receive_disconnect(padapter, pmlmepriv->cur_network.network.MacAddress
|
||||
, WLAN_REASON_ACTIVE_ROAM, _FALSE);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
issue_action_BSSCoexistPacket(padapter);
|
||||
issue_action_BSSCoexistPacket(padapter);
|
||||
issue_action_BSSCoexistPacket(padapter);
|
||||
}
|
||||
} else {
|
||||
RTW_ERR("%s : improper parameter -- op = %d\n", __func__, op);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_RTW_REPEATER_SON */
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2015 - 2016 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2015 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,11 +11,7 @@
|
|||
* 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 <drv_types.h> /* struct dvobj_priv and etc. */
|
||||
|
|
@ -39,22 +35,61 @@
|
|||
*/
|
||||
static u8 sdio_io(struct dvobj_priv *d, u32 addr, void *buf, size_t len, u8 write, u8 cmd52)
|
||||
{
|
||||
u32 addr_drv; /* address with driver defined bit */
|
||||
int err;
|
||||
u8 retry = 0;
|
||||
u8 stop_retry = _FALSE; /* flag for stopping retry or not */
|
||||
|
||||
|
||||
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);
|
||||
if (rtw_is_surprise_removed(dvobj_get_primary_adapter(d))) {
|
||||
RTW_ERR("%s: bSurpriseRemoved, skip %s 0x%05x, %zu bytes\n",
|
||||
__FUNCTION__, write?"write":"read", addr, len);
|
||||
return _FAIL;
|
||||
}
|
||||
|
||||
addr_drv = addr;
|
||||
if (cmd52)
|
||||
addr_drv = RTW_SDIO_ADDR_CMD52_GEN(addr_drv);
|
||||
|
||||
do {
|
||||
if (write)
|
||||
err = d->intf_ops->write(d, addr_drv, buf, len, 0);
|
||||
else
|
||||
err = d->intf_ops->read(d, addr_drv, buf, len, 0);
|
||||
if (!err) {
|
||||
if (retry) {
|
||||
RTW_INFO("%s: Retry %s OK! addr=0x%05x %zu bytes, retry=%u,%u\n",
|
||||
__FUNCTION__, write?"write":"read",
|
||||
addr, len, retry, ATOMIC_READ(&d->continual_io_error));
|
||||
RTW_INFO_DUMP("Data: ", buf, len);
|
||||
}
|
||||
rtw_reset_continual_io_error(d);
|
||||
break;
|
||||
}
|
||||
RTW_ERR("%s: %s FAIL! error(%d) addr=0x%05x %zu bytes, retry=%u,%u\n",
|
||||
__FUNCTION__, write?"write":"read", err, addr, len,
|
||||
retry, ATOMIC_READ(&d->continual_io_error));
|
||||
|
||||
retry++;
|
||||
stop_retry = rtw_inc_and_chk_continual_io_error(d);
|
||||
if ((err == -1) || (stop_retry == _TRUE) || (retry > SD_IO_TRY_CNT)) {
|
||||
/* critical error, unrecoverable */
|
||||
RTW_ERR("%s: Fatal error! Set surprise remove flag ON! (retry=%u,%u)\n",
|
||||
__FUNCTION__, retry, ATOMIC_READ(&d->continual_io_error));
|
||||
rtw_set_surprise_removed(dvobj_get_primary_adapter(d));
|
||||
return _FAIL;
|
||||
}
|
||||
|
||||
/* WLAN IOREG or SDIO Local */
|
||||
if ((addr & 0x10000) || !(addr & 0xE000)) {
|
||||
RTW_WARN("%s: Retry %s addr=0x%05x %zu bytes, retry=%u,%u\n",
|
||||
__FUNCTION__, write?"write":"read", addr, len,
|
||||
retry, ATOMIC_READ(&d->continual_io_error));
|
||||
continue;
|
||||
}
|
||||
return _FAIL;
|
||||
} while (1);
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -88,11 +123,8 @@ u8 rtw_sdio_f0_read(struct dvobj_priv *d, u32 addr, void *buf, size_t len)
|
|||
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__);
|
||||
if (err)
|
||||
ret = _FAIL;
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_SECURITY_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
@ -826,7 +821,7 @@ u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe)
|
|||
if (stainfo != NULL) {
|
||||
|
||||
if (IS_MCAST(prxattrib->ra)) {
|
||||
static u32 start = 0;
|
||||
static systime start = 0;
|
||||
static u32 no_gkey_bc_cnt = 0;
|
||||
static u32 no_gkey_mc_cnt = 0;
|
||||
|
||||
|
|
@ -1376,7 +1371,7 @@ static sint aes_cipher(u8 *key, uint hdrlen,
|
|||
u8 mic[8];
|
||||
/* uint offset = 0; */
|
||||
uint frtype = GetFrameType(pframe);
|
||||
uint frsubtype = GetFrameSubType(pframe);
|
||||
uint frsubtype = get_frame_sub_type(pframe);
|
||||
|
||||
frsubtype = frsubtype >> 4;
|
||||
|
||||
|
|
@ -1685,7 +1680,7 @@ static sint aes_decipher(u8 *key, uint hdrlen,
|
|||
|
||||
/* uint offset = 0; */
|
||||
uint frtype = GetFrameType(pframe);
|
||||
uint frsubtype = GetFrameSubType(pframe);
|
||||
uint frsubtype = get_frame_sub_type(pframe);
|
||||
frsubtype = frsubtype >> 4;
|
||||
|
||||
|
||||
|
|
@ -1953,7 +1948,7 @@ u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe)
|
|||
if (stainfo != NULL) {
|
||||
|
||||
if (IS_MCAST(prxattrib->ra)) {
|
||||
static u32 start = 0;
|
||||
static systime start = 0;
|
||||
static u32 no_gkey_bc_cnt = 0;
|
||||
static u32 no_gkey_mc_cnt = 0;
|
||||
|
||||
|
|
@ -1993,7 +1988,7 @@ u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe)
|
|||
|
||||
prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;
|
||||
if (psecuritypriv->dot118021XGrpKeyid != prxattrib->key_index) {
|
||||
RTW_INFO("not match packet_index=%d, install_index=%d\n"
|
||||
RTW_DBG("not match packet_index=%d, install_index=%d\n"
|
||||
, prxattrib->key_index, psecuritypriv->dot118021XGrpKeyid);
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
|
|
@ -2210,7 +2205,7 @@ static int sha256_process(struct sha256_state *md, unsigned char *in,
|
|||
unsigned long n;
|
||||
#define block_size 64
|
||||
|
||||
if (md->curlen > sizeof(md->buf))
|
||||
if (md->curlen >= sizeof(md->buf))
|
||||
return -1;
|
||||
|
||||
while (inlen > 0) {
|
||||
|
|
@ -2888,11 +2883,11 @@ void wpa_tdls_generate_tpk(_adapter *padapter, PVOID sta)
|
|||
* added by the KDF anyway..
|
||||
*/
|
||||
|
||||
if (os_memcmp(adapter_mac_addr(padapter), psta->hwaddr, ETH_ALEN) < 0) {
|
||||
if (os_memcmp(adapter_mac_addr(padapter), psta->cmn.mac_addr, ETH_ALEN) < 0) {
|
||||
_rtw_memcpy(data, adapter_mac_addr(padapter), ETH_ALEN);
|
||||
_rtw_memcpy(data + ETH_ALEN, psta->hwaddr, ETH_ALEN);
|
||||
_rtw_memcpy(data + ETH_ALEN, psta->cmn.mac_addr, ETH_ALEN);
|
||||
} else {
|
||||
_rtw_memcpy(data, psta->hwaddr, ETH_ALEN);
|
||||
_rtw_memcpy(data, psta->cmn.mac_addr, ETH_ALEN);
|
||||
_rtw_memcpy(data + ETH_ALEN, adapter_mac_addr(padapter), ETH_ALEN);
|
||||
}
|
||||
_rtw_memcpy(data + 2 * ETH_ALEN, get_bssid(pmlmepriv), ETH_ALEN);
|
||||
|
|
@ -3071,25 +3066,6 @@ int tdls_verify_mic(u8 *kck, u8 trans_seq,
|
|||
}
|
||||
#endif /* CONFIG_TDLS */
|
||||
|
||||
void rtw_use_tkipkey_handler(RTW_TIMER_HDL_ARGS)
|
||||
{
|
||||
_adapter *padapter = (_adapter *)FunctionContext;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
if (RTW_CANNOT_RUN(padapter)) {
|
||||
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
padapter->securitypriv.busetkipkey = _TRUE;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* Restore HW wep key setting according to key_mask */
|
||||
void rtw_sec_restore_wep_key(_adapter *adapter)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
*
|
||||
******************************************************************************/
|
||||
*****************************************************************************/
|
||||
|
||||
#include <drv_types.h>
|
||||
#include <hal_data.h>
|
||||
|
|
@ -219,6 +214,7 @@ void sreset_restore_network_station(_adapter *padapter)
|
|||
{
|
||||
u8 join_type = 0;
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
|
||||
rtw_hal_rcr_set_chk_bssid(padapter, MLME_STA_CONNECTING);
|
||||
}
|
||||
|
||||
Set_MSR(padapter, (pmlmeinfo->state & 0x3));
|
||||
|
|
@ -240,8 +236,8 @@ void sreset_restore_network_status(_adapter *padapter)
|
|||
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));
|
||||
} else if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter)) {
|
||||
RTW_INFO(FUNC_ADPT_FMT" %s\n", FUNC_ADPT_ARG(padapter), MLME_IS_AP(padapter) ? "AP" : "MESH");
|
||||
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));
|
||||
|
|
@ -273,7 +269,7 @@ void sreset_stop_adapter(_adapter *padapter)
|
|||
|
||||
if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) {
|
||||
rtw_set_to_roam(padapter, 0);
|
||||
_rtw_join_timeout_handler(padapter);
|
||||
rtw_join_timeout_handler(padapter);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -311,7 +307,7 @@ void sreset_reset(_adapter *padapter)
|
|||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
_irqL irqL;
|
||||
u32 start = rtw_get_current_time();
|
||||
systime start = rtw_get_current_time();
|
||||
struct dvobj_priv *psdpriv = padapter->dvobj;
|
||||
struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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_STA_MGT_C_
|
||||
|
||||
#include <drv_types.h>
|
||||
|
|
@ -133,6 +128,46 @@ inline bool rtw_st_ctl_chk_reg_rule(struct st_ctl_t *st_ctl, _adapter *adapter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
void rtw_st_ctl_rx(struct sta_info *sta, u8 *ehdr_pos)
|
||||
{
|
||||
_adapter *adapter = sta->padapter;
|
||||
struct ethhdr *etherhdr = (struct ethhdr *)ehdr_pos;
|
||||
|
||||
if (ntohs(etherhdr->h_proto) == ETH_P_IP) {
|
||||
u8 *ip = ehdr_pos + ETH_HLEN;
|
||||
|
||||
if (GET_IPV4_PROTOCOL(ip) == 0x06 /* TCP */
|
||||
&& rtw_st_ctl_chk_reg_s_proto(&sta->st_ctl, 0x06) == _TRUE
|
||||
) {
|
||||
u8 *tcp = ip + GET_IPV4_IHL(ip) * 4;
|
||||
|
||||
if (rtw_st_ctl_chk_reg_rule(&sta->st_ctl, adapter, IPV4_DST(ip), TCP_DST(tcp), IPV4_SRC(ip), TCP_SRC(tcp)) == _TRUE) {
|
||||
if (GET_TCP_SYN(tcp) && GET_TCP_ACK(tcp)) {
|
||||
session_tracker_add_cmd(adapter, sta
|
||||
, IPV4_DST(ip), TCP_DST(tcp)
|
||||
, IPV4_SRC(ip), TCP_SRC(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(adapter)
|
||||
, IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp))
|
||||
, IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp)));
|
||||
}
|
||||
if (GET_TCP_FIN(tcp)) {
|
||||
session_tracker_del_cmd(adapter, sta
|
||||
, IPV4_DST(ip), TCP_DST(tcp)
|
||||
, IPV4_SRC(ip), TCP_SRC(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(adapter)
|
||||
, IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp))
|
||||
, IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#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)
|
||||
|
||||
|
|
@ -165,8 +200,6 @@ void dump_st_ctl(void *sel, struct st_ctl_t *st_ctl)
|
|||
void _rtw_init_stainfo(struct sta_info *psta);
|
||||
void _rtw_init_stainfo(struct sta_info *psta)
|
||||
{
|
||||
|
||||
|
||||
_rtw_memset((u8 *)psta, 0, sizeof(struct sta_info));
|
||||
|
||||
_rtw_spinlock_init(&psta->lock);
|
||||
|
|
@ -177,50 +210,21 @@ void _rtw_init_stainfo(struct sta_info *psta)
|
|||
/* _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;
|
||||
|
||||
#ifdef CONFIG_RTW_80211R
|
||||
psta->ft_pairwise_key_installed = _FALSE;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NATIVEAP_MLME
|
||||
psta->nonerp_set = 0;
|
||||
psta->no_short_slot_time_set = 0;
|
||||
psta->no_short_preamble_set = 0;
|
||||
psta->no_ht_gf_set = 0;
|
||||
psta->no_ht_set = 0;
|
||||
psta->ht_20mhz_set = 0;
|
||||
psta->ht_40mhz_intolerant = 0;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TX_MCAST2UNI
|
||||
psta->under_exist_checking = 0;
|
||||
#endif /* CONFIG_TX_MCAST2UNI */
|
||||
|
||||
psta->keep_alive_trycnt = 0;
|
||||
|
||||
#endif /* CONFIG_AP_MODE */
|
||||
|
||||
rtw_st_ctl_init(&psta->st_ctl);
|
||||
|
||||
|
||||
}
|
||||
|
||||
u32 _rtw_init_sta_priv(struct sta_priv *pstapriv)
|
||||
|
|
@ -293,6 +297,9 @@ u32 _rtw_init_sta_priv(struct sta_priv *pstapriv)
|
|||
_rtw_init_queue(&(pstapriv->acl_list.acl_node_q));
|
||||
#endif
|
||||
|
||||
#if CONFIG_RTW_PRE_LINK_STA
|
||||
rtw_pre_link_sta_ctl_init(pstapriv);
|
||||
#endif
|
||||
|
||||
return _SUCCESS;
|
||||
|
||||
|
|
@ -431,6 +438,10 @@ u32 _rtw_free_sta_priv(struct sta_priv *pstapriv)
|
|||
_rtw_deinit_queue(&(pstapriv->acl_list.acl_node_q));
|
||||
#endif
|
||||
|
||||
#if CONFIG_RTW_PRE_LINK_STA
|
||||
rtw_pre_link_sta_ctl_deinit(pstapriv);
|
||||
#endif
|
||||
|
||||
if (pstapriv->pallocated_stainfo_buf)
|
||||
rtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info) * NUM_STA + 4);
|
||||
}
|
||||
|
|
@ -439,11 +450,19 @@ u32 _rtw_free_sta_priv(struct sta_priv *pstapriv)
|
|||
}
|
||||
|
||||
|
||||
static void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl)
|
||||
{
|
||||
_adapter *padapter = preorder_ctrl->padapter;
|
||||
|
||||
#if defined(CONFIG_80211N_HT) && defined(CONFIG_RECV_REORDERING_CTRL)
|
||||
rtw_init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter, rtw_reordering_ctrl_timeout_handler, preorder_ctrl);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* 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;
|
||||
_list *phash_list;
|
||||
struct sta_info *psta;
|
||||
|
|
@ -467,14 +486,11 @@ struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)
|
|||
rtw_list_delete(&(psta->list));
|
||||
|
||||
/* _exit_critical_bh(&(pfree_sta_queue->lock), &irqL); */
|
||||
|
||||
tmp_aid = psta->aid;
|
||||
|
||||
_rtw_init_stainfo(psta);
|
||||
|
||||
psta->padapter = pstapriv->padapter;
|
||||
|
||||
_rtw_memcpy(psta->hwaddr, hwaddr, ETH_ALEN);
|
||||
_rtw_memcpy(psta->cmn.mac_addr, hwaddr, ETH_ALEN);
|
||||
|
||||
index = wifi_mac_hash(hwaddr);
|
||||
|
||||
|
|
@ -498,13 +514,14 @@ struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)
|
|||
* 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++)
|
||||
for (i = 0; i < 16; i++) {
|
||||
_rtw_memcpy(&psta->sta_recvpriv.rxcache.tid_rxseq[i], &wRxSeqInitialValue, 2);
|
||||
_rtw_memset(&psta->sta_recvpriv.rxcache.iv[i], 0, sizeof(psta->sta_recvpriv.rxcache.iv[i]));
|
||||
}
|
||||
|
||||
|
||||
init_addba_retry_timer(pstapriv->padapter, psta);
|
||||
rtw_init_timer(&psta->addba_retry_timer, psta->padapter, addba_timer_hdl, psta);
|
||||
#ifdef CONFIG_IEEE80211W
|
||||
init_dot11w_expire_timer(pstapriv->padapter, psta);
|
||||
rtw_init_timer(&psta->dot11w_expire_timer, psta->padapter, sa_query_timer_hdl, psta);
|
||||
#endif /* CONFIG_IEEE80211W */
|
||||
#ifdef CONFIG_TDLS
|
||||
rtw_init_tdls_timer(pstapriv->padapter, psta);
|
||||
|
|
@ -513,16 +530,14 @@ struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)
|
|||
/* 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->tid = i;
|
||||
preorder_ctrl->enable = _FALSE;
|
||||
|
||||
preorder_ctrl->indicate_seq = 0xffff;
|
||||
#ifdef DBG_RX_SEQ
|
||||
RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d\n", __FUNCTION__, __LINE__,
|
||||
preorder_ctrl->indicate_seq);
|
||||
#endif
|
||||
#ifdef DBG_RX_SEQ
|
||||
RTW_INFO("DBG_RX_SEQ "FUNC_ADPT_FMT" tid:%u SN_CLEAR indicate_seq:%d\n"
|
||||
, FUNC_ADPT_ARG(pstapriv->padapter), i, preorder_ctrl->indicate_seq);
|
||||
#endif
|
||||
preorder_ctrl->wend_b = 0xffff;
|
||||
/* preorder_ctrl->wsize_b = (NR_RECVBUFF-2); */
|
||||
preorder_ctrl->wsize_b = 64;/* 64; */
|
||||
|
|
@ -535,14 +550,14 @@ struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)
|
|||
|
||||
|
||||
/* init for DM */
|
||||
psta->rssi_stat.UndecoratedSmoothedPWDB = (-1);
|
||||
psta->rssi_stat.UndecoratedSmoothedCCK = (-1);
|
||||
psta->cmn.rssi_stat.rssi = (-1);
|
||||
psta->cmn.rssi_stat.rssi_cck = (-1);
|
||||
psta->cmn.rssi_stat.rssi_ofdm = (-1);
|
||||
#ifdef CONFIG_ATMEL_RC_PATCH
|
||||
psta->flag_atmel_rc = 0;
|
||||
#endif
|
||||
/* init for the sequence number of received management frame */
|
||||
psta->RxMgmtFrameSeqNum = 0xffff;
|
||||
psta->ra_rpt_linked = _FALSE;
|
||||
|
||||
rtw_alloc_macid(pstapriv->padapter, psta);
|
||||
|
||||
|
|
@ -571,18 +586,32 @@ u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta)
|
|||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
struct hw_xmit *phwxmit;
|
||||
int pending_qcnt[4];
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
||||
|
||||
int pending_qcnt[4];
|
||||
u8 is_pre_link_sta = _FALSE;
|
||||
|
||||
if (psta == NULL)
|
||||
goto exit;
|
||||
|
||||
_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
|
||||
rtw_list_delete(&psta->hash_list);
|
||||
pstapriv->asoc_sta_count--;
|
||||
_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
|
||||
rtw_mi_update_iface_status(&(padapter->mlmepriv), 0);
|
||||
#ifdef CONFIG_RTW_80211K
|
||||
rm_post_event(padapter, RM_ID_FOR_ALL(psta->cmn.aid), RM_EV_cancel);
|
||||
#endif
|
||||
|
||||
is_pre_link_sta = rtw_is_pre_link_sta(pstapriv, psta->cmn.mac_addr);
|
||||
|
||||
if (is_pre_link_sta == _FALSE) {
|
||||
_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
|
||||
rtw_list_delete(&psta->hash_list);
|
||||
pstapriv->asoc_sta_count--;
|
||||
_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
|
||||
rtw_mi_update_iface_status(&(padapter->mlmepriv), 0);
|
||||
} else {
|
||||
_enter_critical_bh(&psta->lock, &irqL0);
|
||||
psta->state = WIFI_FW_PRE_LINK;
|
||||
_exit_critical_bh(&psta->lock, &irqL0);
|
||||
}
|
||||
|
||||
_enter_critical_bh(&psta->lock, &irqL0);
|
||||
psta->state &= ~_FW_LINKED;
|
||||
|
|
@ -694,12 +723,13 @@ u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta)
|
|||
|
||||
}
|
||||
|
||||
if (!((psta->state & WIFI_AP_STATE) || MacAddr_isBcst(psta->hwaddr)))
|
||||
if (!((psta->state & WIFI_AP_STATE) || MacAddr_isBcst(psta->cmn.mac_addr)) && is_pre_link_sta == _FALSE)
|
||||
rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _FALSE);
|
||||
|
||||
|
||||
/* release mac id for non-bc/mc station, */
|
||||
rtw_release_macid(pstapriv->padapter, psta);
|
||||
if (is_pre_link_sta == _FALSE)
|
||||
rtw_release_macid(pstapriv->padapter, psta);
|
||||
|
||||
#ifdef CONFIG_AP_MODE
|
||||
|
||||
|
|
@ -732,14 +762,16 @@ u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta)
|
|||
|
||||
#ifdef CONFIG_NATIVEAP_MLME
|
||||
|
||||
pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
|
||||
pstapriv->tim_bitmap &= ~BIT(psta->aid);
|
||||
if (pmlmeinfo->state == _HW_STATE_AP_) {
|
||||
pstapriv->sta_dz_bitmap &= ~BIT(psta->cmn.aid);
|
||||
pstapriv->tim_bitmap &= ~BIT(psta->cmn.aid);
|
||||
|
||||
/* rtw_indicate_sta_disassoc_event(padapter, 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;
|
||||
if ((psta->cmn.aid > 0) && (pstapriv->sta_aid[psta->cmn.aid - 1] == psta)) {
|
||||
pstapriv->sta_aid[psta->cmn.aid - 1] = NULL;
|
||||
psta->cmn.aid = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NATIVEAP_MLME */
|
||||
|
|
@ -752,19 +784,18 @@ u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta)
|
|||
|
||||
rtw_st_ctl_deinit(&psta->st_ctl);
|
||||
|
||||
_rtw_spinlock_free(&psta->lock);
|
||||
if (is_pre_link_sta == _FALSE) {
|
||||
_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); */
|
||||
/* _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:
|
||||
|
||||
|
||||
return _SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
/* free all stainfo which in sta_hash[all] */
|
||||
|
|
@ -796,8 +827,9 @@ void rtw_free_all_stainfo(_adapter *padapter)
|
|||
plist = get_next(plist);
|
||||
|
||||
if (pbcmc_stainfo != psta) {
|
||||
rtw_list_delete(&psta->hash_list);
|
||||
/* rtw_free_stainfo(padapter , psta); */
|
||||
if (rtw_is_pre_link_sta(pstapriv, psta->cmn.mac_addr) == _FALSE)
|
||||
rtw_list_delete(&psta->hash_list);
|
||||
|
||||
stainfo_offset = rtw_stainfo_offset(pstapriv, psta);
|
||||
if (stainfo_offset_valid(stainfo_offset))
|
||||
free_sta_list[free_sta_num++] = stainfo_offset;
|
||||
|
|
@ -855,7 +887,7 @@ struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)
|
|||
|
||||
psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
|
||||
|
||||
if ((_rtw_memcmp(psta->hwaddr, addr, ETH_ALEN)) == _TRUE) {
|
||||
if ((_rtw_memcmp(psta->cmn.mac_addr, addr, ETH_ALEN)) == _TRUE) {
|
||||
/* if found the matched address */
|
||||
break;
|
||||
}
|
||||
|
|
@ -887,9 +919,10 @@ u32 rtw_init_bcmc_stainfo(_adapter *padapter)
|
|||
goto exit;
|
||||
}
|
||||
#ifdef CONFIG_BEAMFORMING
|
||||
psta->txbf_gid = 63;
|
||||
psta->txbf_paid = 0;
|
||||
psta->cmn.bf_info.g_id = 63;
|
||||
psta->cmn.bf_info.p_aid = 0;
|
||||
#endif
|
||||
|
||||
ptxservq = &(psta->sta_xmitpriv.be_q);
|
||||
|
||||
/*
|
||||
|
|
@ -976,3 +1009,196 @@ void dump_macaddr_acl(void *sel, _adapter *adapter)
|
|||
}
|
||||
}
|
||||
#endif /* CONFIG_RTW_MACADDR_ACL */
|
||||
|
||||
bool rtw_is_pre_link_sta(struct sta_priv *stapriv, u8 *addr)
|
||||
{
|
||||
#if CONFIG_RTW_PRE_LINK_STA
|
||||
struct pre_link_sta_ctl_t *pre_link_sta_ctl = &stapriv->pre_link_sta_ctl;
|
||||
struct sta_info *sta = NULL;
|
||||
u8 exist = _FALSE;
|
||||
int i;
|
||||
_irqL irqL;
|
||||
|
||||
_enter_critical_bh(&(pre_link_sta_ctl->lock), &irqL);
|
||||
for (i = 0; i < RTW_PRE_LINK_STA_NUM; i++) {
|
||||
if (pre_link_sta_ctl->node[i].valid == _TRUE
|
||||
&& _rtw_memcmp(pre_link_sta_ctl->node[i].addr, addr, ETH_ALEN) == _TRUE
|
||||
) {
|
||||
exist = _TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
_exit_critical_bh(&(pre_link_sta_ctl->lock), &irqL);
|
||||
|
||||
return exist;
|
||||
#else
|
||||
return _FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if CONFIG_RTW_PRE_LINK_STA
|
||||
struct sta_info *rtw_pre_link_sta_add(struct sta_priv *stapriv, u8 *hwaddr)
|
||||
{
|
||||
struct pre_link_sta_ctl_t *pre_link_sta_ctl = &stapriv->pre_link_sta_ctl;
|
||||
struct pre_link_sta_node_t *node = NULL;
|
||||
struct sta_info *sta = NULL;
|
||||
u8 exist = _FALSE;
|
||||
int i;
|
||||
_irqL irqL;
|
||||
|
||||
if (rtw_check_invalid_mac_address(hwaddr, _FALSE) == _TRUE)
|
||||
goto exit;
|
||||
|
||||
_enter_critical_bh(&(pre_link_sta_ctl->lock), &irqL);
|
||||
for (i = 0; i < RTW_PRE_LINK_STA_NUM; i++) {
|
||||
if (pre_link_sta_ctl->node[i].valid == _TRUE
|
||||
&& _rtw_memcmp(pre_link_sta_ctl->node[i].addr, hwaddr, ETH_ALEN) == _TRUE
|
||||
) {
|
||||
node = &pre_link_sta_ctl->node[i];
|
||||
exist = _TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (node == NULL && pre_link_sta_ctl->node[i].valid == _FALSE)
|
||||
node = &pre_link_sta_ctl->node[i];
|
||||
}
|
||||
|
||||
if (exist == _FALSE && node) {
|
||||
_rtw_memcpy(node->addr, hwaddr, ETH_ALEN);
|
||||
node->valid = _TRUE;
|
||||
pre_link_sta_ctl->num++;
|
||||
}
|
||||
_exit_critical_bh(&(pre_link_sta_ctl->lock), &irqL);
|
||||
|
||||
if (node == NULL)
|
||||
goto exit;
|
||||
|
||||
sta = rtw_get_stainfo(stapriv, hwaddr);
|
||||
if (sta)
|
||||
goto odm_hook;
|
||||
|
||||
sta = rtw_alloc_stainfo(stapriv, hwaddr);
|
||||
if (!sta)
|
||||
goto exit;
|
||||
|
||||
sta->state = WIFI_FW_PRE_LINK;
|
||||
|
||||
odm_hook:
|
||||
rtw_hal_set_odm_var(stapriv->padapter, HAL_ODM_STA_INFO, sta, _TRUE);
|
||||
|
||||
exit:
|
||||
return sta;
|
||||
}
|
||||
|
||||
void rtw_pre_link_sta_del(struct sta_priv *stapriv, u8 *hwaddr)
|
||||
{
|
||||
struct pre_link_sta_ctl_t *pre_link_sta_ctl = &stapriv->pre_link_sta_ctl;
|
||||
struct pre_link_sta_node_t *node = NULL;
|
||||
struct sta_info *sta = NULL;
|
||||
u8 exist = _FALSE;
|
||||
int i;
|
||||
_irqL irqL;
|
||||
|
||||
if (rtw_check_invalid_mac_address(hwaddr, _FALSE) == _TRUE)
|
||||
goto exit;
|
||||
|
||||
_enter_critical_bh(&(pre_link_sta_ctl->lock), &irqL);
|
||||
for (i = 0; i < RTW_PRE_LINK_STA_NUM; i++) {
|
||||
if (pre_link_sta_ctl->node[i].valid == _TRUE
|
||||
&& _rtw_memcmp(pre_link_sta_ctl->node[i].addr, hwaddr, ETH_ALEN) == _TRUE
|
||||
) {
|
||||
node = &pre_link_sta_ctl->node[i];
|
||||
exist = _TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (exist == _TRUE && node) {
|
||||
node->valid = _FALSE;
|
||||
pre_link_sta_ctl->num--;
|
||||
}
|
||||
_exit_critical_bh(&(pre_link_sta_ctl->lock), &irqL);
|
||||
|
||||
if (exist == _FALSE)
|
||||
goto exit;
|
||||
|
||||
sta = rtw_get_stainfo(stapriv, hwaddr);
|
||||
if (!sta)
|
||||
goto exit;
|
||||
|
||||
if (sta->state == WIFI_FW_PRE_LINK)
|
||||
rtw_free_stainfo(stapriv->padapter, sta);
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
void rtw_pre_link_sta_ctl_reset(struct sta_priv *stapriv)
|
||||
{
|
||||
struct pre_link_sta_ctl_t *pre_link_sta_ctl = &stapriv->pre_link_sta_ctl;
|
||||
struct pre_link_sta_node_t *node = NULL;
|
||||
struct sta_info *sta = NULL;
|
||||
int i, j = 0;
|
||||
_irqL irqL;
|
||||
|
||||
u8 addrs[RTW_PRE_LINK_STA_NUM][ETH_ALEN];
|
||||
|
||||
_rtw_memset(addrs, 0, RTW_PRE_LINK_STA_NUM * ETH_ALEN);
|
||||
|
||||
_enter_critical_bh(&(pre_link_sta_ctl->lock), &irqL);
|
||||
for (i = 0; i < RTW_PRE_LINK_STA_NUM; i++) {
|
||||
if (pre_link_sta_ctl->node[i].valid == _FALSE)
|
||||
continue;
|
||||
_rtw_memcpy(&(addrs[j][0]), pre_link_sta_ctl->node[i].addr, ETH_ALEN);
|
||||
pre_link_sta_ctl->node[i].valid = _FALSE;
|
||||
pre_link_sta_ctl->num--;
|
||||
j++;
|
||||
}
|
||||
_exit_critical_bh(&(pre_link_sta_ctl->lock), &irqL);
|
||||
|
||||
for (i = 0; i < j; i++) {
|
||||
sta = rtw_get_stainfo(stapriv, &(addrs[i][0]));
|
||||
if (!sta)
|
||||
continue;
|
||||
|
||||
if (sta->state == WIFI_FW_PRE_LINK)
|
||||
rtw_free_stainfo(stapriv->padapter, sta);
|
||||
}
|
||||
}
|
||||
|
||||
void rtw_pre_link_sta_ctl_init(struct sta_priv *stapriv)
|
||||
{
|
||||
struct pre_link_sta_ctl_t *pre_link_sta_ctl = &stapriv->pre_link_sta_ctl;
|
||||
int i;
|
||||
|
||||
_rtw_spinlock_init(&pre_link_sta_ctl->lock);
|
||||
pre_link_sta_ctl->num = 0;
|
||||
for (i = 0; i < RTW_PRE_LINK_STA_NUM; i++)
|
||||
pre_link_sta_ctl->node[i].valid = _FALSE;
|
||||
}
|
||||
|
||||
void rtw_pre_link_sta_ctl_deinit(struct sta_priv *stapriv)
|
||||
{
|
||||
struct pre_link_sta_ctl_t *pre_link_sta_ctl = &stapriv->pre_link_sta_ctl;
|
||||
int i;
|
||||
|
||||
rtw_pre_link_sta_ctl_reset(stapriv);
|
||||
|
||||
_rtw_spinlock_free(&pre_link_sta_ctl->lock);
|
||||
}
|
||||
|
||||
void dump_pre_link_sta_ctl(void *sel, struct sta_priv *stapriv)
|
||||
{
|
||||
struct pre_link_sta_ctl_t *pre_link_sta_ctl = &stapriv->pre_link_sta_ctl;
|
||||
int i;
|
||||
|
||||
RTW_PRINT_SEL(sel, "num:%d/%d\n", pre_link_sta_ctl->num, RTW_PRE_LINK_STA_NUM);
|
||||
|
||||
for (i = 0; i < RTW_PRE_LINK_STA_NUM; i++) {
|
||||
if (pre_link_sta_ctl->node[i].valid == _FALSE)
|
||||
continue;
|
||||
RTW_PRINT_SEL(sel, MAC_FMT"\n", MAC_ARG(pre_link_sta_ctl->node[i].addr));
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_RTW_PRE_LINK_STA */
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,15 +11,11 @@
|
|||
* 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_VHT_C
|
||||
|
||||
#include <drv_types.h>
|
||||
#include <hal_data.h>
|
||||
|
||||
#ifdef CONFIG_80211AC_VHT
|
||||
/* 20/40/80, ShortGI, MCS Rate */
|
||||
|
|
@ -101,7 +97,7 @@ u8 rtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map)
|
|||
return nss;
|
||||
}
|
||||
|
||||
void rtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map)
|
||||
void rtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map)
|
||||
{
|
||||
u8 i, j;
|
||||
u8 cur_rate, target_rate;
|
||||
|
|
@ -143,6 +139,8 @@ void rtw_vht_use_default_setting(_adapter *padapter)
|
|||
u8 mu_bfer, mu_bfee;
|
||||
#endif /* CONFIG_BEAMFORMING */
|
||||
u8 rf_type = 0;
|
||||
u8 tx_nss, rx_nss;
|
||||
struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter);
|
||||
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;
|
||||
|
|
@ -224,119 +222,53 @@ void rtw_vht_use_default_setting(_adapter *padapter)
|
|||
pvhtpriv->ampdu_len = pregistrypriv->ampdu_factor;
|
||||
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
|
||||
tx_nss = rtw_min(rf_type_to_rf_tx_cnt(rf_type), hal_spec->tx_nss_num);
|
||||
rx_nss = rtw_min(rf_type_to_rf_rx_cnt(rf_type), hal_spec->rx_nss_num);
|
||||
|
||||
if (rf_type == RF_3T3R)
|
||||
pvhtpriv->vht_mcs_map[0] = 0xea; /* support 1SS MCS 0~9 2SS MCS 0~9 3SS MCS 0~9 */
|
||||
else if (rf_type == RF_2T2R)
|
||||
pvhtpriv->vht_mcs_map[0] = 0xfa; /* support 1SS MCS 0~9 2SS MCS 0~9 */
|
||||
else
|
||||
pvhtpriv->vht_mcs_map[0] = 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 */
|
||||
}
|
||||
|
||||
/* for now, vhtpriv.vht_mcs_map comes from RX NSS */
|
||||
rtw_vht_nss_to_mcsmap(rx_nss, pvhtpriv->vht_mcs_map, pregistrypriv->vht_rx_mcs_map);
|
||||
pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map);
|
||||
}
|
||||
|
||||
u64 rtw_vht_rate_to_bitmap(u8 *pVHTRate)
|
||||
u64 rtw_vht_mcs_map_to_bitmap(u8 *mcs_map, u8 nss)
|
||||
{
|
||||
u8 i, j, tmp;
|
||||
u64 bitmap = 0;
|
||||
u8 bits_nss = nss * 2;
|
||||
|
||||
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_nss; i += 2, j += 10) {
|
||||
/* every two bits means single sptial stream */
|
||||
tmpRate = (pVHTRate[0] >> i) & 3;
|
||||
tmp = (mcs_map[i / 8] >> i) & 3;
|
||||
|
||||
switch (tmpRate) {
|
||||
switch (tmp) {
|
||||
case 2:
|
||||
RateBitmap = RateBitmap | (0x03ff << j);
|
||||
bitmap = bitmap | (0x03ff << j);
|
||||
break;
|
||||
case 1:
|
||||
RateBitmap = RateBitmap | (0x01ff << j);
|
||||
bitmap = bitmap | (0x01ff << j);
|
||||
break;
|
||||
|
||||
case 0:
|
||||
RateBitmap = RateBitmap | (0x00ff << j);
|
||||
bitmap = bitmap | (0x00ff << j);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTW_INFO("RateBitmap=%016llx , pVHTRate[0]=%02x, pVHTRate[1]=%02x\n", RateBitmap, pVHTRate[0], pVHTRate[1]);
|
||||
return RateBitmap;
|
||||
|
||||
RTW_INFO("vht_mcs_map=%02x %02x, nss=%u => bitmap=%016llx\n"
|
||||
, mcs_map[0], mcs_map[1], nss, bitmap);
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
void update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
|
||||
#ifdef CONFIG_BEAMFORMING
|
||||
void update_sta_vht_info_apmode_bf_cap(_adapter *padapter, struct sta_info *psta)
|
||||
{
|
||||
struct sta_info *psta = (struct sta_info *)sta;
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
struct vht_priv *pvhtpriv_ap = &pmlmepriv->vhtpriv;
|
||||
struct vht_priv *pvhtpriv_sta = &psta->vhtpriv;
|
||||
struct ht_priv *phtpriv_sta = &psta->htpriv;
|
||||
u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, bw_mode = 0;
|
||||
u16 cur_beamform_cap = 0;
|
||||
u8 *pcap_mcs;
|
||||
|
||||
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) */
|
||||
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)) {
|
||||
SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX));
|
||||
RTW_INFO("Current STA(%d) VHT LDPC = %02X\n", psta->aid, cur_ldpc_cap);
|
||||
}
|
||||
pvhtpriv_sta->ldpc_cap = cur_ldpc_cap;
|
||||
|
||||
if (psta->bw_mode > pmlmeext->cur_bwmode)
|
||||
psta->bw_mode = pmlmeext->cur_bwmode;
|
||||
|
||||
if (psta->bw_mode == CHANNEL_WIDTH_80) {
|
||||
/* 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;
|
||||
/* 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 */
|
||||
pvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI160M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE;
|
||||
/* 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));
|
||||
RTW_INFO("Current STA(%d) VHT STBC = %02X\n", psta->aid, cur_stbc_cap);
|
||||
}
|
||||
pvhtpriv_sta->stbc_cap = cur_stbc_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)) {
|
||||
|
|
@ -352,9 +284,65 @@ void update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
|
|||
/*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);
|
||||
}
|
||||
pvhtpriv_sta->beamform_cap = cur_beamform_cap;
|
||||
|
||||
if (cur_beamform_cap)
|
||||
RTW_INFO("Current STA(%d) VHT Beamforming Setting = %02X\n", psta->aid, cur_beamform_cap);
|
||||
RTW_INFO("Current STA(%d) VHT Beamforming Setting = %02X\n", psta->cmn.aid, cur_beamform_cap);
|
||||
|
||||
pvhtpriv_sta->beamform_cap = cur_beamform_cap;
|
||||
psta->cmn.bf_info.vht_beamform_cap = cur_beamform_cap;
|
||||
}
|
||||
#endif
|
||||
|
||||
void update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
|
||||
{
|
||||
struct sta_info *psta = (struct sta_info *)sta;
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
struct vht_priv *pvhtpriv_ap = &pmlmepriv->vhtpriv;
|
||||
struct vht_priv *pvhtpriv_sta = &psta->vhtpriv;
|
||||
u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, bw_mode = 0;
|
||||
u8 *pcap_mcs;
|
||||
|
||||
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->cmn.bw_mode) */
|
||||
psta->cmn.bw_mode = bw_mode;
|
||||
psta->cmn.ra_info.is_vht_enable = _TRUE;
|
||||
|
||||
/* 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));
|
||||
RTW_INFO("Current STA(%d) VHT LDPC = %02X\n", psta->cmn.aid, cur_ldpc_cap);
|
||||
}
|
||||
pvhtpriv_sta->ldpc_cap = cur_ldpc_cap;
|
||||
|
||||
if (psta->cmn.bw_mode > pmlmeext->cur_bwmode)
|
||||
psta->cmn.bw_mode = pmlmeext->cur_bwmode;
|
||||
|
||||
if (psta->cmn.bw_mode == CHANNEL_WIDTH_80) {
|
||||
/* 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;
|
||||
/* RTW_INFO("Current STA ShortGI80MHz = %d\n", pvhtpriv_sta->sgi_80m); */
|
||||
} else if (psta->cmn.bw_mode >= CHANNEL_WIDTH_160) {
|
||||
/* 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;
|
||||
/* 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));
|
||||
RTW_INFO("Current STA(%d) VHT STBC = %02X\n", psta->cmn.aid, cur_stbc_cap);
|
||||
}
|
||||
pvhtpriv_sta->stbc_cap = cur_stbc_cap;
|
||||
|
||||
#ifdef CONFIG_BEAMFORMING
|
||||
update_sta_vht_info_apmode_bf_cap(padapter, psta);
|
||||
#endif
|
||||
|
||||
/* B23 B24 B25 Maximum A-MPDU Length Exponent */
|
||||
|
|
@ -362,9 +350,7 @@ void update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
|
|||
|
||||
pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pvhtpriv_sta->vht_cap);
|
||||
_rtw_memcpy(pvhtpriv_sta->vht_mcs_map, pcap_mcs, 2);
|
||||
|
||||
pvhtpriv_sta->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv_sta->vht_mcs_map);
|
||||
|
||||
}
|
||||
|
||||
void update_hw_vht_param(_adapter *padapter)
|
||||
|
|
@ -383,14 +369,14 @@ void update_hw_vht_param(_adapter *padapter)
|
|||
|
||||
void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
|
||||
{
|
||||
struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter);
|
||||
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);
|
||||
u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, rf_type = RF_1T1R;
|
||||
u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, rf_type = RF_1T1R, tx_nss = 0;
|
||||
u16 cur_beamform_cap = 0;
|
||||
u8 *pcap_mcs;
|
||||
u8 vht_mcs[2];
|
||||
|
||||
if (pIE == NULL)
|
||||
return;
|
||||
|
|
@ -489,18 +475,9 @@ void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
|
|||
pvhtpriv->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pIE->data);
|
||||
|
||||
pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pIE->data);
|
||||
_rtw_memcpy(vht_mcs, pcap_mcs, 2);
|
||||
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
|
||||
if ((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
|
||||
vht_mcs[0] |= 0xfc;
|
||||
else if (rf_type == RF_2T2R)
|
||||
vht_mcs[0] |= 0xf0;
|
||||
else if (rf_type == RF_3T3R)
|
||||
vht_mcs[0] |= 0xc0;
|
||||
|
||||
_rtw_memcpy(pvhtpriv->vht_mcs_map, vht_mcs, 2);
|
||||
|
||||
tx_nss = rtw_min(rf_type_to_rf_tx_cnt(rf_type), hal_spec->tx_nss_num);
|
||||
rtw_vht_nss_to_mcsmap(tx_nss, pvhtpriv->vht_mcs_map, pcap_mcs);
|
||||
pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map);
|
||||
}
|
||||
|
||||
|
|
@ -526,7 +503,6 @@ void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta)
|
|||
u8 target_bw;
|
||||
u8 target_rxss, current_rxss;
|
||||
u8 update_ra = _FALSE;
|
||||
u8 vht_mcs_map[2] = {};
|
||||
|
||||
if (pvhtpriv->vht_option == _FALSE)
|
||||
return;
|
||||
|
|
@ -534,23 +510,25 @@ void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta)
|
|||
target_bw = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(pframe);
|
||||
target_rxss = (GET_VHT_OPERATING_MODE_FIELD_RX_NSS(pframe) + 1);
|
||||
|
||||
if (target_bw != psta->bw_mode) {
|
||||
if (target_bw != psta->cmn.bw_mode) {
|
||||
if (hal_is_bw_support(padapter, target_bw)
|
||||
&& REGSTY_IS_BW_5G_SUPPORT(regsty, target_bw)
|
||||
) {
|
||||
update_ra = _TRUE;
|
||||
psta->bw_mode = target_bw;
|
||||
psta->cmn.bw_mode = target_bw;
|
||||
}
|
||||
}
|
||||
|
||||
current_rxss = rtw_vht_mcsmap_to_nss(psta->vhtpriv.vht_mcs_map);
|
||||
if (target_rxss != current_rxss) {
|
||||
u8 vht_mcs_map[2] = {};
|
||||
|
||||
update_ra = _TRUE;
|
||||
|
||||
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);
|
||||
rtw_hal_update_sta_ra_info(padapter, psta);
|
||||
}
|
||||
|
||||
if (update_ra)
|
||||
|
|
@ -563,12 +541,10 @@ u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel)
|
|||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv;
|
||||
/* struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; */
|
||||
u8 ChnlWidth, center_freq, bw_mode, rf_type = 0;
|
||||
u8 ChnlWidth, center_freq, bw_mode;
|
||||
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 */
|
||||
|
|
@ -589,34 +565,7 @@ u32 rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel)
|
|||
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;
|
||||
case RF_1T2R:
|
||||
case RF_2T2R:
|
||||
case RF_2T2R_GREEN:
|
||||
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;
|
||||
case RF_4T4R:
|
||||
operation[3] = 0xaa;
|
||||
operation[4] = 0xff;
|
||||
break;
|
||||
default:
|
||||
RTW_INFO("%s, %d, unknown rf type\n", __func__, __LINE__);
|
||||
}
|
||||
_rtw_memcpy(operation + 3, pvhtpriv->vht_mcs_map, 2);
|
||||
|
||||
rtw_set_ie(pbuf, EID_VHTOperation, 5, operation, &len);
|
||||
|
||||
|
|
@ -629,18 +578,11 @@ u32 rtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw)
|
|||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv;
|
||||
u32 len = 0;
|
||||
u8 opmode = 0, rf_type = 0;
|
||||
u8 opmode = 0;
|
||||
u8 chnl_width, rx_nss;
|
||||
|
||||
chnl_width = bw;
|
||||
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
|
||||
if (rf_type == RF_3T3R)
|
||||
rx_nss = 3;
|
||||
else if (rf_type == RF_2T2R)
|
||||
rx_nss = 2;
|
||||
else
|
||||
rx_nss = 1;
|
||||
rx_nss = rtw_vht_mcsmap_to_nss(pvhtpriv->vht_mcs_map);
|
||||
|
||||
SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&opmode, chnl_width);
|
||||
SET_VHT_OPERATING_MODE_FIELD_RX_NSS(&opmode, (rx_nss - 1));
|
||||
|
|
@ -663,6 +605,8 @@ u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf)
|
|||
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_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
||||
|
||||
pcap = pvhtpriv->vht_cap;
|
||||
_rtw_memset(pcap, 0, 32);
|
||||
|
|
@ -695,47 +639,68 @@ u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf)
|
|||
SET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 0);
|
||||
|
||||
/* B4 Rx LDPC */
|
||||
if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX))
|
||||
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 */
|
||||
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); */
|
||||
|
||||
/* B7 Tx STBC */
|
||||
if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX))
|
||||
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_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);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BEAMFORMING
|
||||
/* B11 SU Beamformer Capable */
|
||||
if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) {
|
||||
SET_VHT_CAPABILITY_ELE_SU_BFER(pcap, 1);
|
||||
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))
|
||||
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 */
|
||||
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");
|
||||
|
||||
rtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMEE_CAP, (u8 *)&rf_num);
|
||||
|
||||
/* IOT action suggested by Yu Chen 2017/3/3 */
|
||||
if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_BROADCOM) &&
|
||||
!GET_VHT_CAPABILITY_ELE_MU_BFER(&pvhtpriv->beamform_cap))
|
||||
rf_num = (rf_num >= 2 ? 2 : rf_num);
|
||||
|
||||
/* B13 14 15 Compressed Steering Number of Beamformer Antennas Supported */
|
||||
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))
|
||||
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");
|
||||
}
|
||||
}
|
||||
#endif/*CONFIG_BEAMFORMING*/
|
||||
|
||||
/* B21 VHT TXOP PS */
|
||||
SET_VHT_CAPABILITY_ELE_TXOP_PS(pcap, 0);
|
||||
|
|
@ -854,4 +819,48 @@ void VHTOnAssocRsp(_adapter *padapter)
|
|||
rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MAX_TIME, (u8 *)(&pvhtpriv->vht_highest_rate));
|
||||
}
|
||||
|
||||
void rtw_vht_ies_attach(_adapter *padapter, WLAN_BSSID_EX *pnetwork)
|
||||
{
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
u8 cap_len, operation_len;
|
||||
uint len = 0;
|
||||
sint ie_len = 0;
|
||||
u8 *p = NULL;
|
||||
|
||||
p = rtw_get_ie(pnetwork->IEs + _BEACON_IE_OFFSET_, EID_VHTCapability, &ie_len,
|
||||
(pnetwork->IELength - _BEACON_IE_OFFSET_));
|
||||
if (p && ie_len > 0)
|
||||
return;
|
||||
|
||||
rtw_vht_use_default_setting(padapter);
|
||||
|
||||
/* VHT Operation mode notifiy bit in Extended IE (127) */
|
||||
SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(pmlmepriv->ext_capab_ie_data, 1);
|
||||
pmlmepriv->ext_capab_ie_len = 10;
|
||||
rtw_set_ie(pnetwork->IEs + pnetwork->IELength, EID_EXTCapability, 8, pmlmepriv->ext_capab_ie_data, &len);
|
||||
pnetwork->IELength += pmlmepriv->ext_capab_ie_len;
|
||||
|
||||
/* VHT Capabilities element */
|
||||
cap_len = rtw_build_vht_cap_ie(padapter, pnetwork->IEs + pnetwork->IELength);
|
||||
pnetwork->IELength += cap_len;
|
||||
|
||||
/* VHT Operation element */
|
||||
operation_len = rtw_build_vht_operation_ie(padapter, pnetwork->IEs + pnetwork->IELength,
|
||||
pnetwork->Configuration.DSConfig);
|
||||
pnetwork->IELength += operation_len;
|
||||
|
||||
pmlmepriv->vhtpriv.vht_option = _TRUE;
|
||||
}
|
||||
|
||||
void rtw_vht_ies_detach(_adapter *padapter, WLAN_BSSID_EX *pnetwork)
|
||||
{
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
|
||||
rtw_remove_bcn_ie(padapter, pnetwork, EID_EXTCapability);
|
||||
rtw_remove_bcn_ie(padapter, pnetwork, EID_VHTCapability);
|
||||
rtw_remove_bcn_ie(padapter, pnetwork, EID_VHTOperation);
|
||||
|
||||
pmlmepriv->vhtpriv.vht_option = _FALSE;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_80211AC_VHT */
|
||||
|
|
|
|||
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifdef CONFIG_WAPI_SUPPORT
|
||||
|
||||
#include <linux/unistd.h>
|
||||
|
|
@ -368,7 +382,7 @@ u8 rtw_wapi_is_wai_packet(_adapter *padapter, u8 *pkt_data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
pTaddr = GetAddr2Ptr(pkt_data);
|
||||
pTaddr = get_addr2_ptr(pkt_data);
|
||||
if (list_empty(&pWapiInfo->wapiSTAUsedList))
|
||||
bFind = false;
|
||||
else {
|
||||
|
|
@ -423,7 +437,7 @@ void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame)
|
|||
else
|
||||
precv_hdr->UserPriority = 0;
|
||||
|
||||
pTA = GetAddr2Ptr(ptr);
|
||||
pTA = get_addr2_ptr(ptr);
|
||||
_rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6);
|
||||
pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2;
|
||||
_rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16);
|
||||
|
|
@ -438,7 +452,8 @@ add to support WAPI to N-mode
|
|||
*****************************************************************************/
|
||||
u8 rtw_wapi_check_for_drop(
|
||||
_adapter *padapter,
|
||||
union recv_frame *precv_frame
|
||||
union recv_frame *precv_frame,
|
||||
u8 *ehdr_ops
|
||||
)
|
||||
{
|
||||
PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
|
||||
|
|
@ -449,7 +464,7 @@ u8 rtw_wapi_check_for_drop(
|
|||
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;
|
||||
u8 *ptr = ehdr_ops;
|
||||
int i;
|
||||
|
||||
WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__);
|
||||
|
|
|
|||
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifdef CONFIG_WAPI_SUPPORT
|
||||
|
||||
#include <linux/unistd.h>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* 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.
|
||||
|
||||
|
|
@ -54,9 +49,11 @@ u8 HalPwrSeqCmdParsing(
|
|||
{
|
||||
WLAN_PWR_CFG PwrCfgCmd = {0};
|
||||
u8 bPollingBit = _FALSE;
|
||||
u8 bHWICSupport = _FALSE;
|
||||
u32 AryIdx = 0;
|
||||
u8 value = 0;
|
||||
u32 offset = 0;
|
||||
u8 flag = 0;
|
||||
u32 pollingCount = 0; /* polling autoload done. */
|
||||
u32 maxPollingCnt = 5000;
|
||||
|
||||
|
|
@ -111,6 +108,14 @@ u8 HalPwrSeqCmdParsing(
|
|||
|
||||
bPollingBit = _FALSE;
|
||||
offset = GET_PWR_CFG_OFFSET(PwrCfgCmd);
|
||||
|
||||
rtw_hal_get_hwreg(padapter, HW_VAR_PWR_CMD, &bHWICSupport);
|
||||
if (bHWICSupport && offset == 0x06) {
|
||||
flag = 0;
|
||||
maxPollingCnt = 100000;
|
||||
} else
|
||||
maxPollingCnt = 5000;
|
||||
|
||||
#ifdef CONFIG_GSPI_HCI
|
||||
if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO)
|
||||
offset = SPI_LOCAL_OFFSET | offset;
|
||||
|
|
@ -131,7 +136,26 @@ u8 HalPwrSeqCmdParsing(
|
|||
|
||||
if (pollingCount++ > maxPollingCnt) {
|
||||
RTW_ERR("HalPwrSeqCmdParsing: Fail to polling Offset[%#x]=%02x\n", offset, value);
|
||||
return _FALSE;
|
||||
|
||||
/* For PCIE + USB package poll power bit timeout issue only modify 8821AE and 8723BE */
|
||||
if (bHWICSupport && offset == 0x06 && flag == 0) {
|
||||
|
||||
RTW_ERR("[WARNING] PCIE polling(0x%X) timeout(%d), Toggle 0x04[3] and try again.\n", offset, maxPollingCnt);
|
||||
if (IS_HARDWARE_TYPE_8723DE(padapter))
|
||||
PlatformEFIOWrite1Byte(padapter, 0x40, (PlatformEFIORead1Byte(padapter, 0x40)) & (~BIT3));
|
||||
|
||||
PlatformEFIOWrite1Byte(padapter, 0x04, PlatformEFIORead1Byte(padapter, 0x04) | BIT3);
|
||||
PlatformEFIOWrite1Byte(padapter, 0x04, PlatformEFIORead1Byte(padapter, 0x04) & ~BIT3);
|
||||
|
||||
if (IS_HARDWARE_TYPE_8723DE(padapter))
|
||||
PlatformEFIOWrite1Byte(padapter, 0x40, PlatformEFIORead1Byte(padapter, 0x40)|BIT3);
|
||||
|
||||
/* Retry Polling Process one more time */
|
||||
pollingCount = 0;
|
||||
flag = 1;
|
||||
} else {
|
||||
return _FALSE;
|
||||
}
|
||||
}
|
||||
} while (!bPollingBit);
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,149 +0,0 @@
|
|||
//===========================================
|
||||
// The following is for 8188C 2Ant BT Co-exist definition
|
||||
//===========================================
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8188C_2ANT 6
|
||||
|
||||
typedef enum _BT_INFO_SRC_8188C_2ANT{
|
||||
BT_INFO_SRC_8188C_2ANT_WIFI_FW = 0x0,
|
||||
BT_INFO_SRC_8188C_2ANT_BT_RSP = 0x1,
|
||||
BT_INFO_SRC_8188C_2ANT_BT_ACTIVE_SEND = 0x2,
|
||||
BT_INFO_SRC_8188C_2ANT_MAX
|
||||
}BT_INFO_SRC_8188C_2ANT,*PBT_INFO_SRC_8188C_2ANT;
|
||||
|
||||
typedef enum _BT_8188C_2ANT_BT_STATUS{
|
||||
BT_8188C_2ANT_BT_STATUS_IDLE = 0x0,
|
||||
BT_8188C_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1,
|
||||
BT_8188C_2ANT_BT_STATUS_NON_IDLE = 0x2,
|
||||
BT_8188C_2ANT_BT_STATUS_MAX
|
||||
}BT_8188C_2ANT_BT_STATUS,*PBT_8188C_2ANT_BT_STATUS;
|
||||
|
||||
typedef enum _BT_8188C_2ANT_COEX_ALGO{
|
||||
BT_8188C_2ANT_COEX_ALGO_UNDEFINED = 0x0,
|
||||
BT_8188C_2ANT_COEX_ALGO_SCO = 0x1,
|
||||
BT_8188C_2ANT_COEX_ALGO_HID = 0x2,
|
||||
BT_8188C_2ANT_COEX_ALGO_A2DP = 0x3,
|
||||
BT_8188C_2ANT_COEX_ALGO_PAN = 0x4,
|
||||
BT_8188C_2ANT_COEX_ALGO_HID_A2DP = 0x5,
|
||||
BT_8188C_2ANT_COEX_ALGO_HID_PAN = 0x6,
|
||||
BT_8188C_2ANT_COEX_ALGO_PAN_A2DP = 0x7,
|
||||
BT_8188C_2ANT_COEX_ALGO_MAX
|
||||
}BT_8188C_2ANT_COEX_ALGO,*PBT_8188C_2ANT_COEX_ALGO;
|
||||
|
||||
typedef struct _COEX_DM_8188C_2ANT{
|
||||
// fw mechanism
|
||||
BOOLEAN bPreBalanceOn;
|
||||
BOOLEAN bCurBalanceOn;
|
||||
|
||||
// diminishWifi
|
||||
BOOLEAN bPreDacOn;
|
||||
BOOLEAN bCurDacOn;
|
||||
BOOLEAN bPreInterruptOn;
|
||||
BOOLEAN bCurInterruptOn;
|
||||
u1Byte preFwDacSwingLvl;
|
||||
u1Byte curFwDacSwingLvl;
|
||||
BOOLEAN bPreNavOn;
|
||||
BOOLEAN bCurNavOn;
|
||||
|
||||
// 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;
|
||||
u4Byte preVal0x6cc;
|
||||
u4Byte curVal0x6cc;
|
||||
//BOOLEAN bLimitedDig;
|
||||
|
||||
// algorithm related
|
||||
u1Byte preAlgorithm;
|
||||
u1Byte curAlgorithm;
|
||||
//u1Byte btStatus;
|
||||
//u1Byte wifiChnlInfo[3];
|
||||
} COEX_DM_8188C_2ANT, *PCOEX_DM_8188C_2ANT;
|
||||
|
||||
typedef struct _COEX_STA_8188C_2ANT{
|
||||
u1Byte preWifiRssiState[4];
|
||||
BOOLEAN bBtBusy;
|
||||
BOOLEAN bBtUplink;
|
||||
BOOLEAN bBtDownLink;
|
||||
BOOLEAN bA2dpBusy;
|
||||
}COEX_STA_8188C_2ANT, *PCOEX_STA_8188C_2ANT;
|
||||
|
||||
//===========================================
|
||||
// The following is interface which will notify coex module.
|
||||
//===========================================
|
||||
VOID
|
||||
EXhalbtc8188c2ant_PowerOnSetting(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_InitHwConfig(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN BOOLEAN bWifiOnly
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_InitCoexDm(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_IpsNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_LpsNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_ScanNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_ConnectNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_MediaStatusNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_SpecialPacketNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_HaltNotify(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_Periodical(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_BtInfoNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN pu1Byte tmpBuf,
|
||||
IN u1Byte length
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8188c2ant_DisplayCoexInfo(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,170 +0,0 @@
|
|||
//===========================================
|
||||
// The following is for 8192D 2Ant BT Co-exist definition
|
||||
//===========================================
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8192D_2ANT 6
|
||||
|
||||
typedef enum _BT_INFO_SRC_8192D_2ANT{
|
||||
BT_INFO_SRC_8192D_2ANT_WIFI_FW = 0x0,
|
||||
BT_INFO_SRC_8192D_2ANT_BT_RSP = 0x1,
|
||||
BT_INFO_SRC_8192D_2ANT_BT_ACTIVE_SEND = 0x2,
|
||||
BT_INFO_SRC_8192D_2ANT_MAX
|
||||
}BT_INFO_SRC_8192D_2ANT,*PBT_INFO_SRC_8192D_2ANT;
|
||||
|
||||
typedef enum _BT_8192D_2ANT_BT_STATUS{
|
||||
BT_8192D_2ANT_BT_STATUS_IDLE = 0x0,
|
||||
BT_8192D_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1,
|
||||
BT_8192D_2ANT_BT_STATUS_NON_IDLE = 0x2,
|
||||
BT_8192D_2ANT_BT_STATUS_MAX
|
||||
}BT_8192D_2ANT_BT_STATUS,*PBT_8192D_2ANT_BT_STATUS;
|
||||
|
||||
typedef enum _BT_8192D_2ANT_COEX_ALGO{
|
||||
BT_8192D_2ANT_COEX_ALGO_UNDEFINED = 0x0,
|
||||
BT_8192D_2ANT_COEX_ALGO_SCO = 0x1,
|
||||
BT_8192D_2ANT_COEX_ALGO_HID = 0x2,
|
||||
BT_8192D_2ANT_COEX_ALGO_A2DP = 0x3,
|
||||
BT_8192D_2ANT_COEX_ALGO_PAN = 0x4,
|
||||
BT_8192D_2ANT_COEX_ALGO_HID_A2DP = 0x5,
|
||||
BT_8192D_2ANT_COEX_ALGO_HID_PAN = 0x6,
|
||||
BT_8192D_2ANT_COEX_ALGO_PAN_A2DP = 0x7,
|
||||
BT_8192D_2ANT_COEX_ALGO_MAX
|
||||
}BT_8192D_2ANT_COEX_ALGO,*PBT_8192D_2ANT_COEX_ALGO;
|
||||
|
||||
typedef struct _COEX_DM_8192D_2ANT{
|
||||
// fw mechanism
|
||||
BOOLEAN bPreBalanceOn;
|
||||
BOOLEAN bCurBalanceOn;
|
||||
|
||||
// diminishWifi
|
||||
BOOLEAN bPreDacOn;
|
||||
BOOLEAN bCurDacOn;
|
||||
BOOLEAN bPreInterruptOn;
|
||||
BOOLEAN bCurInterruptOn;
|
||||
u1Byte preFwDacSwingLvl;
|
||||
u1Byte curFwDacSwingLvl;
|
||||
BOOLEAN bPreNavOn;
|
||||
BOOLEAN bCurNavOn;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//BOOLEAN bPreDecBtPwr;
|
||||
//BOOLEAN bCurDecBtPwr;
|
||||
|
||||
//u1Byte preFwDacSwingLvl;
|
||||
//u1Byte curFwDacSwingLvl;
|
||||
//BOOLEAN bCurIgnoreWlanAct;
|
||||
//BOOLEAN bPreIgnoreWlanAct;
|
||||
//u1Byte prePsTdma;
|
||||
//u1Byte curPsTdma;
|
||||
//u1Byte psTdmaPara[5];
|
||||
//u1Byte psTdmaDuAdjType;
|
||||
//BOOLEAN bResetTdmaAdjust;
|
||||
//BOOLEAN bPrePsTdmaOn;
|
||||
//BOOLEAN bCurPsTdmaOn;
|
||||
//BOOLEAN bPreBtAutoReport;
|
||||
//BOOLEAN bCurBtAutoReport;
|
||||
|
||||
// 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;
|
||||
u4Byte preVal0x6cc;
|
||||
u4Byte curVal0x6cc;
|
||||
//BOOLEAN bLimitedDig;
|
||||
|
||||
// algorithm related
|
||||
u1Byte preAlgorithm;
|
||||
u1Byte curAlgorithm;
|
||||
//u1Byte btStatus;
|
||||
//u1Byte wifiChnlInfo[3];
|
||||
} COEX_DM_8192D_2ANT, *PCOEX_DM_8192D_2ANT;
|
||||
|
||||
typedef struct _COEX_STA_8192D_2ANT{
|
||||
u1Byte preWifiRssiState[4];
|
||||
BOOLEAN bBtBusy;
|
||||
BOOLEAN bBtUplink;
|
||||
BOOLEAN bBtDownLink;
|
||||
BOOLEAN bA2dpBusy;
|
||||
}COEX_STA_8192D_2ANT, *PCOEX_STA_8192D_2ANT;
|
||||
|
||||
//===========================================
|
||||
// The following is interface which will notify coex module.
|
||||
//===========================================
|
||||
VOID
|
||||
EXhalbtc8192d2ant_PowerOnSetting(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_InitHwConfig(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN BOOLEAN bWifiOnly
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_InitCoexDm(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_IpsNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_LpsNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_ScanNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_ConnectNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_MediaStatusNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_SpecialPacketNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_HaltNotify(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_Periodical(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_BtInfoNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN pu1Byte tmpBuf,
|
||||
IN u1Byte length
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8192d2ant_DisplayCoexInfo(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,171 +0,0 @@
|
|||
//===========================================
|
||||
// The following is for 8723A 1Ant BT Co-exist definition
|
||||
//===========================================
|
||||
#define BT_INFO_8723A_1ANT_B_FTP BIT7
|
||||
#define BT_INFO_8723A_1ANT_B_A2DP BIT6
|
||||
#define BT_INFO_8723A_1ANT_B_HID BIT5
|
||||
#define BT_INFO_8723A_1ANT_B_SCO_BUSY BIT4
|
||||
#define BT_INFO_8723A_1ANT_B_ACL_BUSY BIT3
|
||||
#define BT_INFO_8723A_1ANT_B_INQ_PAGE BIT2
|
||||
#define BT_INFO_8723A_1ANT_B_SCO_ESCO BIT1
|
||||
#define BT_INFO_8723A_1ANT_B_CONNECTION BIT0
|
||||
|
||||
typedef enum _BT_STATE_8723A_1ANT{
|
||||
BT_STATE_8723A_1ANT_DISABLED = 0,
|
||||
BT_STATE_8723A_1ANT_NO_CONNECTION = 1,
|
||||
BT_STATE_8723A_1ANT_CONNECT_IDLE = 2,
|
||||
BT_STATE_8723A_1ANT_INQ_OR_PAG = 3,
|
||||
BT_STATE_8723A_1ANT_ACL_ONLY_BUSY = 4,
|
||||
BT_STATE_8723A_1ANT_SCO_ONLY_BUSY = 5,
|
||||
BT_STATE_8723A_1ANT_ACL_SCO_BUSY = 6,
|
||||
BT_STATE_8723A_1ANT_HID_BUSY = 7,
|
||||
BT_STATE_8723A_1ANT_HID_SCO_BUSY = 8,
|
||||
BT_STATE_8723A_1ANT_MAX
|
||||
}BT_STATE_8723A_1ANT, *PBT_STATE_8723A_1ANT;
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8723A_1ANT 2
|
||||
|
||||
typedef enum _BT_INFO_SRC_8723A_1ANT{
|
||||
BT_INFO_SRC_8723A_1ANT_WIFI_FW = 0x0,
|
||||
BT_INFO_SRC_8723A_1ANT_BT_RSP = 0x1,
|
||||
BT_INFO_SRC_8723A_1ANT_BT_ACTIVE_SEND = 0x2,
|
||||
BT_INFO_SRC_8723A_1ANT_MAX
|
||||
}BT_INFO_SRC_8723A_1ANT,*PBT_INFO_SRC_8723A_1ANT;
|
||||
|
||||
typedef enum _BT_8723A_1ANT_BT_STATUS{
|
||||
BT_8723A_1ANT_BT_STATUS_IDLE = 0x0,
|
||||
BT_8723A_1ANT_BT_STATUS_CONNECTED_IDLE = 0x1,
|
||||
BT_8723A_1ANT_BT_STATUS_NON_IDLE = 0x2,
|
||||
BT_8723A_1ANT_BT_STATUS_MAX
|
||||
}BT_8723A_1ANT_BT_STATUS,*PBT_8723A_1ANT_BT_STATUS;
|
||||
|
||||
typedef enum _BT_8723A_1ANT_COEX_ALGO{
|
||||
BT_8723A_1ANT_COEX_ALGO_UNDEFINED = 0x0,
|
||||
BT_8723A_1ANT_COEX_ALGO_SCO = 0x1,
|
||||
BT_8723A_1ANT_COEX_ALGO_HID = 0x2,
|
||||
BT_8723A_1ANT_COEX_ALGO_A2DP = 0x3,
|
||||
BT_8723A_1ANT_COEX_ALGO_PANEDR = 0x4,
|
||||
BT_8723A_1ANT_COEX_ALGO_PANHS = 0x5,
|
||||
BT_8723A_1ANT_COEX_ALGO_PANEDR_A2DP = 0x6,
|
||||
BT_8723A_1ANT_COEX_ALGO_PANEDR_HID = 0x7,
|
||||
BT_8723A_1ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x8,
|
||||
BT_8723A_1ANT_COEX_ALGO_HID_A2DP = 0x9,
|
||||
BT_8723A_1ANT_COEX_ALGO_MAX
|
||||
}BT_8723A_1ANT_COEX_ALGO,*PBT_8723A_1ANT_COEX_ALGO;
|
||||
|
||||
typedef struct _COEX_DM_8723A_1ANT{
|
||||
// fw mechanism
|
||||
BOOLEAN bCurIgnoreWlanAct;
|
||||
BOOLEAN bPreIgnoreWlanAct;
|
||||
u1Byte prePsTdma;
|
||||
u1Byte curPsTdma;
|
||||
u1Byte psTdmaPara[5];
|
||||
u1Byte psTdmaDuAdjType;
|
||||
u4Byte psTdmaMonitorCnt;
|
||||
u4Byte psTdmaGlobalCnt;
|
||||
BOOLEAN bResetTdmaAdjust;
|
||||
BOOLEAN bPrePsTdmaOn;
|
||||
BOOLEAN bCurPsTdmaOn;
|
||||
|
||||
// sw mechanism
|
||||
BOOLEAN bPreRfRxLpfShrink;
|
||||
BOOLEAN bCurRfRxLpfShrink;
|
||||
u4Byte btRf0x1eBackup;
|
||||
BOOLEAN bPreLowPenaltyRa;
|
||||
BOOLEAN bCurLowPenaltyRa;
|
||||
u4Byte preVal0x6c0;
|
||||
u4Byte curVal0x6c0;
|
||||
u4Byte preVal0x6c8;
|
||||
u4Byte curVal0x6c8;
|
||||
u1Byte preVal0x6cc;
|
||||
u1Byte curVal0x6cc;
|
||||
BOOLEAN bLimitedDig;
|
||||
|
||||
// algorithm related
|
||||
u1Byte preAlgorithm;
|
||||
u1Byte curAlgorithm;
|
||||
u1Byte btStatus;
|
||||
u1Byte wifiChnlInfo[3];
|
||||
} COEX_DM_8723A_1ANT, *PCOEX_DM_8723A_1ANT;
|
||||
|
||||
typedef struct _COEX_STA_8723A_1ANT{
|
||||
u4Byte highPriorityTx;
|
||||
u4Byte highPriorityRx;
|
||||
u4Byte lowPriorityTx;
|
||||
u4Byte lowPriorityRx;
|
||||
u1Byte btRssi;
|
||||
u1Byte preBtRssiState;
|
||||
u1Byte preBtRssiState1;
|
||||
u1Byte preWifiRssiState[4];
|
||||
BOOLEAN bC2hBtInfoReqSent;
|
||||
u1Byte btInfoC2h[BT_INFO_SRC_8723A_1ANT_MAX][10];
|
||||
u4Byte btInfoC2hCnt[BT_INFO_SRC_8723A_1ANT_MAX];
|
||||
BOOLEAN bC2hBtInquiryPage;
|
||||
u1Byte btRetryCnt;
|
||||
u1Byte btInfoExt;
|
||||
//BOOLEAN bHoldForStackOperation;
|
||||
//u1Byte bHoldPeriodCnt;
|
||||
// this is for c2h hang work-around
|
||||
u4Byte c2hHangDetectCnt;
|
||||
}COEX_STA_8723A_1ANT, *PCOEX_STA_8723A_1ANT;
|
||||
|
||||
//===========================================
|
||||
// The following is interface which will notify coex module.
|
||||
//===========================================
|
||||
VOID
|
||||
EXhalbtc8723a1ant_InitHwConfig(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_InitCoexDm(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_IpsNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_LpsNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_ScanNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_ConnectNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_MediaStatusNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_SpecialPacketNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_BtInfoNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN pu1Byte tmpBuf,
|
||||
IN u1Byte length
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_HaltNotify(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_Periodical(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a1ant_DisplayCoexInfo(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,184 +0,0 @@
|
|||
//===========================================
|
||||
// The following is for 8723A 2Ant BT Co-exist definition
|
||||
//===========================================
|
||||
#define BT_INFO_8723A_2ANT_B_FTP BIT7
|
||||
#define BT_INFO_8723A_2ANT_B_A2DP BIT6
|
||||
#define BT_INFO_8723A_2ANT_B_HID BIT5
|
||||
#define BT_INFO_8723A_2ANT_B_SCO_BUSY BIT4
|
||||
#define BT_INFO_8723A_2ANT_B_ACL_BUSY BIT3
|
||||
#define BT_INFO_8723A_2ANT_B_INQ_PAGE BIT2
|
||||
#define BT_INFO_8723A_2ANT_B_SCO_ESCO BIT1
|
||||
#define BT_INFO_8723A_2ANT_B_CONNECTION BIT0
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT 2
|
||||
|
||||
typedef enum _BT_INFO_SRC_8723A_2ANT{
|
||||
BT_INFO_SRC_8723A_2ANT_WIFI_FW = 0x0,
|
||||
BT_INFO_SRC_8723A_2ANT_BT_RSP = 0x1,
|
||||
BT_INFO_SRC_8723A_2ANT_BT_ACTIVE_SEND = 0x2,
|
||||
BT_INFO_SRC_8723A_2ANT_MAX
|
||||
}BT_INFO_SRC_8723A_2ANT,*PBT_INFO_SRC_8723A_2ANT;
|
||||
|
||||
typedef enum _BT_8723A_2ANT_BT_STATUS{
|
||||
BT_8723A_2ANT_BT_STATUS_IDLE = 0x0,
|
||||
BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1,
|
||||
BT_8723A_2ANT_BT_STATUS_NON_IDLE = 0x2,
|
||||
BT_8723A_2ANT_BT_STATUS_MAX
|
||||
}BT_8723A_2ANT_BT_STATUS,*PBT_8723A_2ANT_BT_STATUS;
|
||||
|
||||
typedef enum _BT_8723A_2ANT_COEX_ALGO{
|
||||
BT_8723A_2ANT_COEX_ALGO_UNDEFINED = 0x0,
|
||||
BT_8723A_2ANT_COEX_ALGO_SCO = 0x1,
|
||||
BT_8723A_2ANT_COEX_ALGO_HID = 0x2,
|
||||
BT_8723A_2ANT_COEX_ALGO_A2DP = 0x3,
|
||||
BT_8723A_2ANT_COEX_ALGO_PANEDR = 0x4,
|
||||
BT_8723A_2ANT_COEX_ALGO_PANHS = 0x5,
|
||||
BT_8723A_2ANT_COEX_ALGO_PANEDR_A2DP = 0x6,
|
||||
BT_8723A_2ANT_COEX_ALGO_PANEDR_HID = 0x7,
|
||||
BT_8723A_2ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x8,
|
||||
BT_8723A_2ANT_COEX_ALGO_HID_A2DP = 0x9,
|
||||
BT_8723A_2ANT_COEX_ALGO_MAX
|
||||
}BT_8723A_2ANT_COEX_ALGO,*PBT_8723A_2ANT_COEX_ALGO;
|
||||
|
||||
typedef struct _COEX_DM_8723A_2ANT{
|
||||
// fw mechanism
|
||||
BOOLEAN bPreDecBtPwr;
|
||||
BOOLEAN bCurDecBtPwr;
|
||||
//BOOLEAN bPreBtLnaConstrain;
|
||||
//BOOLEAN bCurBtLnaConstrain;
|
||||
//u1Byte bPreBtPsdMode;
|
||||
//u1Byte bCurBtPsdMode;
|
||||
u1Byte preFwDacSwingLvl;
|
||||
u1Byte curFwDacSwingLvl;
|
||||
BOOLEAN bCurIgnoreWlanAct;
|
||||
BOOLEAN bPreIgnoreWlanAct;
|
||||
u1Byte prePsTdma;
|
||||
u1Byte curPsTdma;
|
||||
u1Byte psTdmaPara[5];
|
||||
u1Byte psTdmaDuAdjType;
|
||||
BOOLEAN bResetTdmaAdjust;
|
||||
BOOLEAN bPrePsTdmaOn;
|
||||
BOOLEAN bCurPsTdmaOn;
|
||||
//BOOLEAN bPreBtAutoReport;
|
||||
//BOOLEAN bCurBtAutoReport;
|
||||
|
||||
// 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 preVal0x6c8;
|
||||
u4Byte curVal0x6c8;
|
||||
u1Byte preVal0x6cc;
|
||||
u1Byte curVal0x6cc;
|
||||
BOOLEAN bLimitedDig;
|
||||
|
||||
// algorithm related
|
||||
u1Byte preAlgorithm;
|
||||
u1Byte curAlgorithm;
|
||||
u1Byte btStatus;
|
||||
u1Byte wifiChnlInfo[3];
|
||||
} COEX_DM_8723A_2ANT, *PCOEX_DM_8723A_2ANT;
|
||||
|
||||
typedef struct _COEX_STA_8723A_2ANT{
|
||||
u4Byte highPriorityTx;
|
||||
u4Byte highPriorityRx;
|
||||
u4Byte lowPriorityTx;
|
||||
u4Byte lowPriorityRx;
|
||||
u1Byte btRssi;
|
||||
u1Byte preBtRssiState;
|
||||
u1Byte preBtRssiState1;
|
||||
u1Byte preWifiRssiState[4];
|
||||
BOOLEAN bC2hBtInfoReqSent;
|
||||
u1Byte btInfoC2h[BT_INFO_SRC_8723A_2ANT_MAX][10];
|
||||
u4Byte btInfoC2hCnt[BT_INFO_SRC_8723A_2ANT_MAX];
|
||||
BOOLEAN bC2hBtInquiryPage;
|
||||
u1Byte btRetryCnt;
|
||||
u1Byte btInfoExt;
|
||||
BOOLEAN bHoldForStackOperation;
|
||||
u1Byte bHoldPeriodCnt;
|
||||
// this is for c2h hang work-around
|
||||
u4Byte c2hHangDetectCnt;
|
||||
}COEX_STA_8723A_2ANT, *PCOEX_STA_8723A_2ANT;
|
||||
|
||||
//===========================================
|
||||
// The following is interface which will notify coex module.
|
||||
//===========================================
|
||||
VOID
|
||||
EXhalbtc8723a2ant_PowerOnSetting(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_InitHwConfig(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN BOOLEAN bWifiOnly
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_InitCoexDm(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_IpsNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_LpsNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_ScanNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_ConnectNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_MediaStatusNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_SpecialPacketNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_HaltNotify(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_Periodical(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_BtInfoNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN pu1Byte tmpBuf,
|
||||
IN u1Byte length
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_StackOperationNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtc8723a2ant_DisplayCoexInfo(
|
||||
IN PBTC_COEXIST pBtCoexist
|
||||
);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,188 +0,0 @@
|
|||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
#if (RTL8821A_SUPPORT == 1)
|
||||
|
||||
/* *******************************************
|
||||
* The following is for 8821A_CSR 2Ant BT Co-exist definition
|
||||
* ******************************************* */
|
||||
#define BT_INFO_8821A_CSR_2ANT_B_FTP BIT(7)
|
||||
#define BT_INFO_8821A_CSR_2ANT_B_A2DP BIT(6)
|
||||
#define BT_INFO_8821A_CSR_2ANT_B_HID BIT(5)
|
||||
#define BT_INFO_8821A_CSR_2ANT_B_SCO_BUSY BIT(4)
|
||||
#define BT_INFO_8821A_CSR_2ANT_B_ACL_BUSY BIT(3)
|
||||
#define BT_INFO_8821A_CSR_2ANT_B_INQ_PAGE BIT(2)
|
||||
#define BT_INFO_8821A_CSR_2ANT_B_SCO_ESCO BIT(1)
|
||||
#define BT_INFO_8821A_CSR_2ANT_B_CONNECTION BIT(0)
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT 2
|
||||
|
||||
enum bt_info_src_8821a_csr_2ant {
|
||||
BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW = 0x0,
|
||||
BT_INFO_SRC_8821A_CSR_2ANT_BT_RSP = 0x1,
|
||||
BT_INFO_SRC_8821A_CSR_2ANT_BT_ACTIVE_SEND = 0x2,
|
||||
BT_INFO_SRC_8821A_CSR_2ANT_MAX
|
||||
};
|
||||
|
||||
enum bt_8821a_csr_2ant_bt_status {
|
||||
BT_8821A_CSR_2ANT_BT_STATUS_IDLE = 0x0,
|
||||
BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1,
|
||||
BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE = 0x2,
|
||||
BT_8821A_CSR_2ANT_BT_STATUS_MAX
|
||||
};
|
||||
|
||||
enum bt_8821a_csr_2ant_coex_algo {
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_UNDEFINED = 0x0,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_SCO = 0x1,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_HID = 0x2,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_A2DP = 0x3,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS = 0x4,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR = 0x5,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_PANHS = 0x6,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP = 0x7,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID = 0x8,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP = 0xa,
|
||||
BT_8821A_CSR_2ANT_COEX_ALGO_MAX = 0xb,
|
||||
};
|
||||
|
||||
struct coex_dm_8821a_csr_2ant {
|
||||
/* fw mechanism */
|
||||
boolean pre_dec_bt_pwr;
|
||||
boolean cur_dec_bt_pwr;
|
||||
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[6];
|
||||
u8 ps_tdma_du_adj_type;
|
||||
boolean reset_tdma_adjust;
|
||||
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 pre_ra_mask;
|
||||
u32 cur_ra_mask;
|
||||
|
||||
u8 cur_ampdu_num_type;
|
||||
u8 pre_ampdu_num_type;
|
||||
u16 backup_ampdu_max_num;
|
||||
|
||||
u8 cur_ampdu_time_type;
|
||||
u8 pre_ampdu_time_type;
|
||||
u8 backup_ampdu_max_time;
|
||||
|
||||
u8 cur_arfr_type;
|
||||
u8 pre_arfr_type;
|
||||
u32 backup_arfr_cnt1;
|
||||
u32 backup_arfr_cnt2;
|
||||
|
||||
u8 cur_retry_limit_type;
|
||||
u8 pre_retry_limit_type;
|
||||
u16 backup_retry_limit;
|
||||
|
||||
/* algorithm related */
|
||||
u8 pre_algorithm;
|
||||
u8 cur_algorithm;
|
||||
u8 bt_status;
|
||||
u8 wifi_chnl_info[3];
|
||||
};
|
||||
|
||||
struct coex_sta_8821a_csr_2ant {
|
||||
boolean bt_disabled;
|
||||
boolean bt_link_exist;
|
||||
boolean sco_exist;
|
||||
boolean a2dp_exist;
|
||||
boolean slave;
|
||||
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_8821A_CSR_2ANT_MAX][10];
|
||||
u32 bt_info_c2h_cnt[BT_INFO_SRC_8821A_CSR_2ANT_MAX];
|
||||
boolean c2h_bt_inquiry_page;
|
||||
u8 bt_retry_cnt;
|
||||
u8 bt_info_ext;
|
||||
};
|
||||
|
||||
/* *******************************************
|
||||
* The following is interface which will notify coex module.
|
||||
* ******************************************* */
|
||||
void ex_halbtc8821aCsr2ant_power_on_setting(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821aCsr2ant_init_hw_config(IN struct btc_coexist *btcoexist,
|
||||
IN boolean wifi_only);
|
||||
void ex_halbtc8821aCsr2ant_init_coex_dm(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821aCsr2ant_ips_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821aCsr2ant_lps_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821aCsr2ant_scan_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821aCsr2ant_connect_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821aCsr2ant_media_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821aCsr2ant_specific_packet_notify(IN struct btc_coexist
|
||||
*btcoexist, IN u8 type);
|
||||
void ex_halbtc8821aCsr2ant_bt_info_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8821aCsr2ant_halt_notify(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821aCsr2ant_pnp_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 pnp_state);
|
||||
void ex_halbtc8821aCsr2ant_periodical(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821aCsr2ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
||||
|
||||
#else
|
||||
#define ex_halbtc8821aCsr2ant_power_on_setting(btcoexist)
|
||||
#define ex_halbtc8821aCsr2ant_init_hw_config(btcoexist, wifi_only)
|
||||
#define ex_halbtc8821aCsr2ant_init_coex_dm(btcoexist)
|
||||
#define ex_halbtc8821aCsr2ant_ips_notify(btcoexist, type)
|
||||
#define ex_halbtc8821aCsr2ant_lps_notify(btcoexist, type)
|
||||
#define ex_halbtc8821aCsr2ant_scan_notify(btcoexist, type)
|
||||
#define ex_halbtc8821aCsr2ant_connect_notify(btcoexist, type)
|
||||
#define ex_halbtc8821aCsr2ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8821aCsr2ant_specific_packet_notify(btcoexist, type)
|
||||
#define ex_halbtc8821aCsr2ant_bt_info_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8821aCsr2ant_halt_notify(btcoexist)
|
||||
#define ex_halbtc8821aCsr2ant_pnp_notify(btcoexist, pnp_state)
|
||||
#define ex_halbtc8821aCsr2ant_periodical(btcoexist)
|
||||
#define ex_halbtc8821aCsr2ant_display_coex_info(btcoexist)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
/* ************************************************************
|
||||
* Description:
|
||||
*
|
||||
|
|
@ -11,7 +25,7 @@
|
|||
/* ************************************************************
|
||||
* include files
|
||||
* ************************************************************ */
|
||||
#include "Mp_Precomp.h"
|
||||
#include "mp_precomp.h"
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -916,9 +930,8 @@ void halbtc8192e1ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist,
|
|||
{
|
||||
u8 h2c_parameter[1] = {0};
|
||||
|
||||
if (enable) {
|
||||
if (enable)
|
||||
h2c_parameter[0] |= BIT(0); /* function enable */
|
||||
}
|
||||
|
||||
btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
|
||||
}
|
||||
|
|
@ -1432,7 +1445,7 @@ void halbtc8192e1ant_tdma_duration_adjust_for_acl(IN struct btc_coexist
|
|||
result = 0;
|
||||
wait_count = 0;
|
||||
} else {
|
||||
/* accquire the BT TRx retry count from BT_Info byte2 */
|
||||
/* 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;
|
||||
|
||||
|
|
@ -1845,6 +1858,7 @@ void halbtc8192e1ant_action_wifi_connected_bt_acl_busy(IN struct btc_coexist
|
|||
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) &&
|
||||
|
|
@ -2319,12 +2333,12 @@ void halbtc8192e1ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist)
|
|||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
|
@ -3414,4 +3428,4 @@ void ex_halbtc8192e1ant_dbg_control(IN struct btc_coexist *btcoexist,
|
|||
|
||||
#endif /* #if (RTL8192E_SUPPORT == 1) */
|
||||
|
||||
#endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */
|
||||
#endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */
|
||||
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -17,7 +31,7 @@
|
|||
#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
|
||||
#define NOISY_AP_NUM_THRESH_8192E 10
|
||||
|
||||
enum bt_info_src_8192e_2ant {
|
||||
BT_INFO_SRC_8192E_2ANT_WIFI_FW = 0x0,
|
||||
|
|
@ -134,6 +148,7 @@ struct coex_sta_8192e_2ant {
|
|||
boolean a2dp_exist;
|
||||
boolean hid_exist;
|
||||
boolean pan_exist;
|
||||
boolean force_lps_on;
|
||||
|
||||
boolean under_lps;
|
||||
boolean under_ips;
|
||||
|
|
@ -151,6 +166,21 @@ struct coex_sta_8192e_2ant {
|
|||
u8 bt_retry_cnt;
|
||||
u8 bt_info_ext;
|
||||
u8 scan_ap_num;
|
||||
u32 bt_coex_supported_version;
|
||||
u32 cnt_setup_link;
|
||||
u32 cnt_wifi_high_pri;
|
||||
boolean is_setup_link;
|
||||
boolean wifi_is_high_pri_task;
|
||||
|
||||
u32 crc_ok_cck;
|
||||
u32 crc_ok_11g;
|
||||
u32 crc_ok_11n;
|
||||
u32 crc_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_vht;
|
||||
};
|
||||
|
||||
/* *******************************************
|
||||
|
|
@ -197,3 +227,4 @@ void ex_halbtc8192e2ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
|||
|
||||
#endif
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -18,7 +32,7 @@
|
|||
#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)
|
||||
(((_BT_INFO_EXT_&BIT(0))) ? TRUE : FALSE)
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT 2
|
||||
|
||||
|
|
@ -118,6 +132,26 @@ enum bt_8703b_1ant_coex_algo {
|
|||
BT_8703B_1ANT_COEX_ALGO_MAX = 0xb,
|
||||
};
|
||||
|
||||
enum bt_8703b_1ant_phase {
|
||||
BT_8703B_1ANT_PHASE_COEX_INIT = 0x0,
|
||||
BT_8703B_1ANT_PHASE_WLANONLY_INIT = 0x1,
|
||||
BT_8703B_1ANT_PHASE_WLAN_OFF = 0x2,
|
||||
BT_8703B_1ANT_PHASE_2G_RUNTIME = 0x3,
|
||||
BT_8703B_1ANT_PHASE_5G_RUNTIME = 0x4,
|
||||
BT_8703B_1ANT_PHASE_BTMPMODE = 0x5,
|
||||
BT_8703B_1ANT_PHASE_ANTENNA_DET = 0x6,
|
||||
BT_8703B_1ANT_PHASE_MAX
|
||||
};
|
||||
|
||||
enum bt_8703b_1ant_Scoreboard {
|
||||
BT_8703B_1ANT_SCOREBOARD_ACTIVE = BIT(0),
|
||||
BT_8703B_1ANT_SCOREBOARD_ONOFF = BIT(1),
|
||||
BT_8703B_1ANT_SCOREBOARD_SCAN = BIT(2),
|
||||
BT_8703B_1ANT_SCOREBOARD_UNDERTEST = BIT(3),
|
||||
BT_8703B_1ANT_SCOREBOARD_WLBUSY = BIT(6)
|
||||
};
|
||||
|
||||
|
||||
struct coex_dm_8703b_1ant {
|
||||
/* hw setting */
|
||||
u8 pre_ant_pos_type;
|
||||
|
|
@ -177,66 +211,112 @@ struct coex_dm_8703b_1ant {
|
|||
};
|
||||
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
boolean is_hiPri_rx_overhead;
|
||||
s8 bt_rssi;
|
||||
boolean bt_tx_rx_mask;
|
||||
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 */
|
||||
boolean bt_whck_test;
|
||||
boolean c2h_bt_inquiry_page;
|
||||
boolean c2h_bt_remote_name_req;
|
||||
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;
|
||||
u8 bt_info_ext2;
|
||||
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_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_agg;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
boolean cck_lock;
|
||||
boolean cck_lock_ever;
|
||||
boolean cck_lock_warn;
|
||||
|
||||
boolean cck_lock;
|
||||
boolean pre_ccklock;
|
||||
boolean cck_ever_lock;
|
||||
u8 coex_table_type;
|
||||
boolean force_lps_ctrl;
|
||||
|
||||
boolean force_lps_on;
|
||||
u32 wrong_profile_notification;
|
||||
|
||||
boolean concurrent_rx_mode_on;
|
||||
boolean concurrent_rx_mode_on;
|
||||
|
||||
u16 score_board;
|
||||
u8 isolation_btween_wb; /* 0~ 50 */
|
||||
|
||||
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;
|
||||
|
||||
u32 bt_coex_supported_feature;
|
||||
u32 bt_coex_supported_version;
|
||||
|
||||
u8 bt_ble_scan_type;
|
||||
u32 bt_ble_scan_para[3];
|
||||
|
||||
boolean run_time_state;
|
||||
boolean freeze_coexrun_by_btinfo;
|
||||
|
||||
boolean is_A2DP_3M;
|
||||
boolean voice_over_HOGP;
|
||||
u8 bt_info;
|
||||
boolean is_autoslot;
|
||||
u8 forbidden_slot;
|
||||
u8 hid_busy_num;
|
||||
u8 hid_pair_cnt;
|
||||
|
||||
u32 cnt_RemoteNameReq;
|
||||
u32 cnt_setupLink;
|
||||
u32 cnt_ReInit;
|
||||
u32 cnt_IgnWlanAct;
|
||||
u32 cnt_Page;
|
||||
u32 cnt_RoleSwitch;
|
||||
|
||||
u16 bt_reg_vendor_ac;
|
||||
u16 bt_reg_vendor_ae;
|
||||
|
||||
boolean is_setupLink;
|
||||
u8 wl_noisy_level;
|
||||
u32 gnt_error_cnt;
|
||||
|
||||
u8 bt_afh_map[10];
|
||||
u8 bt_relink_downcount;
|
||||
boolean is_tdma_btautoslot;
|
||||
boolean is_tdma_btautoslot_hang;
|
||||
|
||||
boolean is_rf_state_off;
|
||||
|
||||
boolean is_hid_low_pri_tx_overhead;
|
||||
boolean is_bt_multi_link;
|
||||
boolean is_bt_a2dp_sink;
|
||||
|
||||
u8 wl_fw_dbg_info[10];
|
||||
u8 wl_rx_rate;
|
||||
u8 wl_rts_rx_rate;
|
||||
};
|
||||
|
||||
#define BT_8703B_1ANT_ANTDET_PSD_POINTS 256 /* MAX:1024 */
|
||||
|
|
@ -302,6 +382,10 @@ 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_wl_fwdbginfo_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8703b1ant_rx_rate_change_notify(IN struct btc_coexist *btcoexist,
|
||||
IN BOOLEAN is_data_frame, IN u8 btc_rate_id);
|
||||
void ex_halbtc8703b1ant_rf_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8703b1ant_halt_notify(IN struct btc_coexist *btcoexist);
|
||||
|
|
@ -331,6 +415,8 @@ void ex_halbtc8703b1ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
|||
#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_wl_fwdbginfo_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8703b1ant_rx_rate_change_notify(btcoexist, is_data_frame, btc_rate_id)
|
||||
#define ex_halbtc8703b1ant_rf_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8703b1ant_halt_notify(btcoexist)
|
||||
#define ex_halbtc8703b1ant_pnp_notify(btcoexist, pnp_state)
|
||||
|
|
@ -346,3 +432,4 @@ void ex_halbtc8703b1ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
|||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,288 +1,307 @@
|
|||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
#if (RTL8723B_SUPPORT == 1)
|
||||
/* *******************************************
|
||||
* The following is for 8723B 1ANT BT Co-exist definition
|
||||
* ******************************************* */
|
||||
#define BT_AUTO_REPORT_ONLY_8723B_1ANT 1
|
||||
|
||||
#define BT_INFO_8723B_1ANT_B_FTP BIT(7)
|
||||
#define BT_INFO_8723B_1ANT_B_A2DP BIT(6)
|
||||
#define BT_INFO_8723B_1ANT_B_HID BIT(5)
|
||||
#define BT_INFO_8723B_1ANT_B_SCO_BUSY BIT(4)
|
||||
#define BT_INFO_8723B_1ANT_B_ACL_BUSY BIT(3)
|
||||
#define BT_INFO_8723B_1ANT_B_INQ_PAGE BIT(2)
|
||||
#define BT_INFO_8723B_1ANT_B_SCO_ESCO BIT(1)
|
||||
#define BT_INFO_8723B_1ANT_B_CONNECTION BIT(0)
|
||||
|
||||
#define BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_) \
|
||||
(((_BT_INFO_EXT_&BIT(0))) ? true : false)
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT 2
|
||||
|
||||
#define BT_8723B_1ANT_WIFI_NOISY_THRESH 50 /* 30 //max: 255 */
|
||||
|
||||
/* for Antenna detection */
|
||||
#define BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND 50
|
||||
#define BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION 70
|
||||
#define BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION 55
|
||||
#define BT_8723B_1ANT_ANTDET_PSDTHRES_1ANT 32
|
||||
#define BT_8723B_1ANT_ANTDET_RETRY_INTERVAL 10 /* retry timer if ant det is fail, unit: second */
|
||||
#define BT_8723B_1ANT_ANTDET_SWEEPPOINT_DELAY 40000
|
||||
#define BT_8723B_1ANT_ANTDET_ENABLE 1
|
||||
#define BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE 1
|
||||
#define BT_8723B_1ANT_ANTDET_BTTXTIME 100
|
||||
#define BT_8723B_1ANT_ANTDET_BTTXCHANNEL 39
|
||||
|
||||
enum bt_info_src_8723b_1ant {
|
||||
BT_INFO_SRC_8723B_1ANT_WIFI_FW = 0x0,
|
||||
BT_INFO_SRC_8723B_1ANT_BT_RSP = 0x1,
|
||||
BT_INFO_SRC_8723B_1ANT_BT_ACTIVE_SEND = 0x2,
|
||||
BT_INFO_SRC_8723B_1ANT_MAX
|
||||
};
|
||||
|
||||
enum bt_8723b_1ant_bt_status {
|
||||
BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0,
|
||||
BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE = 0x1,
|
||||
BT_8723B_1ANT_BT_STATUS_INQ_PAGE = 0x2,
|
||||
BT_8723B_1ANT_BT_STATUS_ACL_BUSY = 0x3,
|
||||
BT_8723B_1ANT_BT_STATUS_SCO_BUSY = 0x4,
|
||||
BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY = 0x5,
|
||||
BT_8723B_1ANT_BT_STATUS_MAX
|
||||
};
|
||||
|
||||
enum bt_8723b_1ant_wifi_status {
|
||||
BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE = 0x0,
|
||||
BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN = 0x1,
|
||||
BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN = 0x2,
|
||||
BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIFIC_PKT = 0x3,
|
||||
BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE = 0x4,
|
||||
BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY = 0x5,
|
||||
BT_8723B_1ANT_WIFI_STATUS_MAX
|
||||
};
|
||||
|
||||
enum bt_8723b_1ant_coex_algo {
|
||||
BT_8723B_1ANT_COEX_ALGO_UNDEFINED = 0x0,
|
||||
BT_8723B_1ANT_COEX_ALGO_SCO = 0x1,
|
||||
BT_8723B_1ANT_COEX_ALGO_HID = 0x2,
|
||||
BT_8723B_1ANT_COEX_ALGO_A2DP = 0x3,
|
||||
BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS = 0x4,
|
||||
BT_8723B_1ANT_COEX_ALGO_PANEDR = 0x5,
|
||||
BT_8723B_1ANT_COEX_ALGO_PANHS = 0x6,
|
||||
BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP = 0x7,
|
||||
BT_8723B_1ANT_COEX_ALGO_PANEDR_HID = 0x8,
|
||||
BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9,
|
||||
BT_8723B_1ANT_COEX_ALGO_HID_A2DP = 0xa,
|
||||
BT_8723B_1ANT_COEX_ALGO_MAX = 0xb,
|
||||
};
|
||||
|
||||
struct coex_dm_8723b_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;
|
||||
|
||||
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 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_8723b_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 bt_abnormal_scan;
|
||||
|
||||
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;
|
||||
boolean c2h_bt_info_req_sent;
|
||||
u8 bt_info_c2h[BT_INFO_SRC_8723B_1ANT_MAX][10];
|
||||
u32 bt_info_c2h_cnt[BT_INFO_SRC_8723B_1ANT_MAX];
|
||||
boolean bt_whck_test;
|
||||
boolean c2h_bt_inquiry_page;
|
||||
boolean c2h_bt_remote_name_req;
|
||||
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;
|
||||
|
||||
u8 a2dp_bit_pool;
|
||||
u8 cut_version;
|
||||
};
|
||||
|
||||
#define BT_8723B_1ANT_ANTDET_PSD_POINTS 256 /* MAX:1024 */
|
||||
#define BT_8723B_1ANT_ANTDET_PSD_AVGNUM 1 /* MAX:3 */
|
||||
#define BT_8723B_1ANT_ANTDET_BUF_LEN 16
|
||||
|
||||
struct psdscan_sta_8723b_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_8723B_1ANT_ANTDET_BUF_LEN];
|
||||
u8 ant_det_peak_freq[BT_8723B_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_halbtc8723b1ant_power_on_setting(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_pre_load_firmware(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_init_hw_config(IN struct btc_coexist *btcoexist,
|
||||
IN boolean wifi_only);
|
||||
void ex_halbtc8723b1ant_init_coex_dm(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_ips_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_lps_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_scan_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_connect_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_media_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_bt_info_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8723b1ant_rf_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_halt_notify(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_pnp_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 pnp_state);
|
||||
void ex_halbtc8723b1ant_coex_dm_reset(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_periodical(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_antenna_detection(IN struct btc_coexist *btcoexist,
|
||||
IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds);
|
||||
|
||||
void ex_halbtc8723b1ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
||||
|
||||
#else
|
||||
#define ex_halbtc8723b1ant_power_on_setting(btcoexist)
|
||||
#define ex_halbtc8723b1ant_pre_load_firmware(btcoexist)
|
||||
#define ex_halbtc8723b1ant_init_hw_config(btcoexist, wifi_only)
|
||||
#define ex_halbtc8723b1ant_init_coex_dm(btcoexist)
|
||||
#define ex_halbtc8723b1ant_ips_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_lps_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_scan_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_connect_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_specific_packet_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_bt_info_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8723b1ant_rf_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_halt_notify(btcoexist)
|
||||
#define ex_halbtc8723b1ant_pnp_notify(btcoexist, pnp_state)
|
||||
#define ex_halbtc8723b1ant_coex_dm_reset(btcoexist)
|
||||
#define ex_halbtc8723b1ant_periodical(btcoexist)
|
||||
#define ex_halbtc8723b1ant_display_coex_info(btcoexist)
|
||||
#define ex_halbtc8723b1ant_antenna_detection(btcoexist, cent_freq, offset, span, seconds)
|
||||
#define ex_halbtc8723b1ant_display_ant_detection(btcoexist)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
#if (RTL8723B_SUPPORT == 1)
|
||||
/* *******************************************
|
||||
* The following is for 8723B 1ANT BT Co-exist definition
|
||||
* ******************************************* */
|
||||
#define BT_AUTO_REPORT_ONLY_8723B_1ANT 1
|
||||
|
||||
#define BT_INFO_8723B_1ANT_B_FTP BIT(7)
|
||||
#define BT_INFO_8723B_1ANT_B_A2DP BIT(6)
|
||||
#define BT_INFO_8723B_1ANT_B_HID BIT(5)
|
||||
#define BT_INFO_8723B_1ANT_B_SCO_BUSY BIT(4)
|
||||
#define BT_INFO_8723B_1ANT_B_ACL_BUSY BIT(3)
|
||||
#define BT_INFO_8723B_1ANT_B_INQ_PAGE BIT(2)
|
||||
#define BT_INFO_8723B_1ANT_B_SCO_ESCO BIT(1)
|
||||
#define BT_INFO_8723B_1ANT_B_CONNECTION BIT(0)
|
||||
|
||||
#define BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_) \
|
||||
(((_BT_INFO_EXT_&BIT(0))) ? true : false)
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT 2
|
||||
|
||||
#define BT_8723B_1ANT_WIFI_NOISY_THRESH 50 /* 30 /max: 255 */
|
||||
|
||||
/* for Antenna detection */
|
||||
#define BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND 50
|
||||
#define BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION 70
|
||||
#define BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION 48
|
||||
#define BT_8723B_1ANT_ANTDET_PSDTHRES_1ANT 32
|
||||
#define BT_8723B_1ANT_ANTDET_RETRY_INTERVAL 10 /* retry timer if ant det is fail, unit: second */
|
||||
#define BT_8723B_1ANT_ANTDET_SWEEPPOINT_DELAY 40000
|
||||
#define BT_8723B_1ANT_ANTDET_ENABLE 1
|
||||
#define BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE 1
|
||||
#define BT_8723B_1ANT_ANTDET_BTTXTIME 100
|
||||
#define BT_8723B_1ANT_ANTDET_BTTXCHANNEL 39
|
||||
|
||||
enum bt_info_src_8723b_1ant {
|
||||
BT_INFO_SRC_8723B_1ANT_WIFI_FW = 0x0,
|
||||
BT_INFO_SRC_8723B_1ANT_BT_RSP = 0x1,
|
||||
BT_INFO_SRC_8723B_1ANT_BT_ACTIVE_SEND = 0x2,
|
||||
BT_INFO_SRC_8723B_1ANT_MAX
|
||||
};
|
||||
|
||||
enum bt_8723b_1ant_bt_status {
|
||||
BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0,
|
||||
BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE = 0x1,
|
||||
BT_8723B_1ANT_BT_STATUS_INQ_PAGE = 0x2,
|
||||
BT_8723B_1ANT_BT_STATUS_ACL_BUSY = 0x3,
|
||||
BT_8723B_1ANT_BT_STATUS_SCO_BUSY = 0x4,
|
||||
BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY = 0x5,
|
||||
BT_8723B_1ANT_BT_STATUS_MAX
|
||||
};
|
||||
|
||||
enum bt_8723b_1ant_wifi_status {
|
||||
BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE = 0x0,
|
||||
BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN = 0x1,
|
||||
BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN = 0x2,
|
||||
BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIFIC_PKT = 0x3,
|
||||
BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE = 0x4,
|
||||
BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY = 0x5,
|
||||
BT_8723B_1ANT_WIFI_STATUS_MAX
|
||||
};
|
||||
|
||||
enum bt_8723b_1ant_coex_algo {
|
||||
BT_8723B_1ANT_COEX_ALGO_UNDEFINED = 0x0,
|
||||
BT_8723B_1ANT_COEX_ALGO_SCO = 0x1,
|
||||
BT_8723B_1ANT_COEX_ALGO_HID = 0x2,
|
||||
BT_8723B_1ANT_COEX_ALGO_A2DP = 0x3,
|
||||
BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS = 0x4,
|
||||
BT_8723B_1ANT_COEX_ALGO_PANEDR = 0x5,
|
||||
BT_8723B_1ANT_COEX_ALGO_PANHS = 0x6,
|
||||
BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP = 0x7,
|
||||
BT_8723B_1ANT_COEX_ALGO_PANEDR_HID = 0x8,
|
||||
BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9,
|
||||
BT_8723B_1ANT_COEX_ALGO_HID_A2DP = 0xa,
|
||||
BT_8723B_1ANT_COEX_ALGO_MAX = 0xb,
|
||||
};
|
||||
|
||||
struct coex_dm_8723b_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;
|
||||
|
||||
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 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_8723b_1ant {
|
||||
boolean bt_disabled;
|
||||
boolean bt_enable_disable_change;
|
||||
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 bt_abnormal_scan;
|
||||
|
||||
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;
|
||||
boolean c2h_bt_info_req_sent;
|
||||
u8 bt_info_c2h[BT_INFO_SRC_8723B_1ANT_MAX][10];
|
||||
u32 bt_info_c2h_cnt[BT_INFO_SRC_8723B_1ANT_MAX];
|
||||
boolean bt_whck_test;
|
||||
boolean c2h_bt_inquiry_page;
|
||||
boolean c2h_bt_remote_name_req;
|
||||
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_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
boolean cck_lock;
|
||||
boolean pre_ccklock;
|
||||
boolean cck_ever_lock;
|
||||
u8 coex_table_type;
|
||||
|
||||
boolean force_lps_on;
|
||||
u32 wrong_profile_notification;
|
||||
u32 bt_coex_supported_version;
|
||||
u8 a2dp_bit_pool;
|
||||
u8 cut_version;
|
||||
};
|
||||
|
||||
#define BT_8723B_1ANT_ANTDET_PSD_POINTS 256 /* MAX:1024 */
|
||||
#define BT_8723B_1ANT_ANTDET_PSD_AVGNUM 1 /* MAX:3 */
|
||||
#define BT_8723B_1ANT_ANTDET_BUF_LEN 16
|
||||
|
||||
struct psdscan_sta_8723b_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_8723B_1ANT_ANTDET_BUF_LEN];
|
||||
u8 ant_det_peak_freq[BT_8723B_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_halbtc8723b1ant_power_on_setting(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_pre_load_firmware(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_init_hw_config(IN struct btc_coexist *btcoexist,
|
||||
IN boolean wifi_only);
|
||||
void ex_halbtc8723b1ant_init_coex_dm(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_ips_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_lps_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_scan_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_set_antenna_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_connect_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_media_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_bt_info_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8723b1ant_rf_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723b1ant_halt_notify(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_pnp_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 pnp_state);
|
||||
void ex_halbtc8723b1ant_coex_dm_reset(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_periodical(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8723b1ant_antenna_detection(IN struct btc_coexist *btcoexist,
|
||||
IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds);
|
||||
|
||||
void ex_halbtc8723b1ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
||||
|
||||
#else
|
||||
#define ex_halbtc8723b1ant_power_on_setting(btcoexist)
|
||||
#define ex_halbtc8723b1ant_pre_load_firmware(btcoexist)
|
||||
#define ex_halbtc8723b1ant_init_hw_config(btcoexist, wifi_only)
|
||||
#define ex_halbtc8723b1ant_init_coex_dm(btcoexist)
|
||||
#define ex_halbtc8723b1ant_ips_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_lps_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_scan_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_set_antenna_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_connect_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_specific_packet_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_bt_info_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8723b1ant_rf_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8723b1ant_halt_notify(btcoexist)
|
||||
#define ex_halbtc8723b1ant_pnp_notify(btcoexist, pnp_state)
|
||||
#define ex_halbtc8723b1ant_coex_dm_reset(btcoexist)
|
||||
#define ex_halbtc8723b1ant_periodical(btcoexist)
|
||||
#define ex_halbtc8723b1ant_display_coex_info(btcoexist)
|
||||
#define ex_halbtc8723b1ant_antenna_detection(btcoexist, cent_freq, offset, span, seconds)
|
||||
#define ex_halbtc8723b1ant_display_ant_detection(btcoexist)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -148,12 +162,14 @@ struct coex_sta_8723b_2ant {
|
|||
u32 crc_ok_cck;
|
||||
u32 crc_ok_11g;
|
||||
u32 crc_ok_11n;
|
||||
u32 crc_ok_11n_agg;
|
||||
u32 crc_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_agg;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
u32 bt_coex_supported_version;
|
||||
|
||||
u8 coex_table_type;
|
||||
boolean force_lps_on;
|
||||
|
|
@ -212,3 +228,4 @@ void ex_halbtc8723b2ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
|||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include "mp_precomp.h"
|
||||
|
||||
|
||||
VOID
|
||||
ex_hal8723b_wifi_only_hw_config(
|
||||
IN struct wifi_only_cfg *pwifionlycfg
|
||||
)
|
||||
{
|
||||
struct wifi_only_haldata *pwifionly_haldata = &pwifionlycfg->haldata_info;
|
||||
|
||||
|
||||
halwifionly_write1byte(pwifionlycfg, 0x778, 0x3); /* Set pta for wifi first priority, 0x1 need to reference pta table to determine wifi and bt priority */
|
||||
halwifionly_bitmaskwrite1byte(pwifionlycfg, 0x40, 0x20, 0x1);
|
||||
|
||||
/* Set Antenna path to Wifi */
|
||||
halwifionly_write2byte(pwifionlycfg, 0x0765, 0x8); /* Set pta for wifi first priority, 0x0 need to reference pta table to determine wifi and bt priority */
|
||||
halwifionly_write2byte(pwifionlycfg, 0x076e, 0xc);
|
||||
|
||||
halwifionly_write4byte(pwifionlycfg, 0x000006c0, 0xaaaaaaaa); /* pta table, 0xaaaaaaaa means wifi is higher priority than bt */
|
||||
halwifionly_write4byte(pwifionlycfg, 0x000006c4, 0xaaaaaaaa);
|
||||
|
||||
halwifionly_bitmaskwrite1byte(pwifionlycfg, 0x67, 0x20, 0x1); /* BT select s0/s1 is controlled by WiFi */
|
||||
|
||||
/* 0x948 setting */
|
||||
if (pwifionlycfg->chip_interface == WIFIONLY_INTF_PCI) {
|
||||
/* HP Foxconn NGFF at S0
|
||||
not sure HP pg correct or not(EEPROMBluetoothSingleAntPath), so here we just write
|
||||
0x948=0x280 for HP HW id NIC. */
|
||||
if (pwifionly_haldata->customer_id == CUSTOMER_HP_1) {
|
||||
halwifionly_write4byte(pwifionlycfg, 0x948, 0x280);
|
||||
halwifionly_phy_set_rf_reg(pwifionlycfg, 0, 0x1, 0xfffff, 0x0); /* WiFi TRx Mask off */
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (pwifionly_haldata->efuse_pg_antnum == 2) {
|
||||
halwifionly_write4byte(pwifionlycfg, 0x948, 0x0);
|
||||
} else {
|
||||
/* 3Attention !!! For 8723BU !!!!
|
||||
For 8723BU single ant case: jira [USB-1237]
|
||||
Because of 8723BU S1 has HW problem, we only can use S0 instead.
|
||||
Whether Efuse 0xc3 [6] is 0 or 1, we should always use S0 and write 0x948 to 80/280
|
||||
|
||||
--------------------------------------------------
|
||||
BT Team :
|
||||
When in Single Ant case, Reg[0x948] has two case : 0x80 or 0x200
|
||||
When in Two Ant case, Reg[0x948] has two case : 0x280 or 0x0
|
||||
Efuse 0xc3 [6] Antenna Path
|
||||
0xc3 [6] = 0 ==> S1 ==> 0x948 = 0/40/200
|
||||
0xc3 [6] = 1 ==> S0 ==> 0x948 = 80/240/280 */
|
||||
|
||||
if (pwifionlycfg->chip_interface == WIFIONLY_INTF_USB)
|
||||
halwifionly_write4byte(pwifionlycfg, 0x948, 0x80);
|
||||
else {
|
||||
if (pwifionly_haldata->efuse_pg_antpath == 0)
|
||||
halwifionly_write4byte(pwifionlycfg, 0x948, 0x0);
|
||||
else
|
||||
halwifionly_write4byte(pwifionlycfg, 0x948, 0x280);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* after 8723B F-cut, TRx Mask should be set when 0x948=0x0 or 0x280
|
||||
PHY_SetRFReg(Adapter, 0, 0x1, 0xfffff, 0x780); WiFi TRx Mask on */
|
||||
halwifionly_phy_set_rf_reg(pwifionlycfg, 0, 0x1, 0xfffff, 0x0); /*WiFi TRx Mask off */
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __INC_HAL8723BWIFIONLYHWCFG_H
|
||||
#define __INC_HAL8723BWIFIONLYHWCFG_H
|
||||
|
||||
VOID
|
||||
ex_hal8723b_wifi_only_hw_config(
|
||||
IN struct wifi_only_cfg *pwifionlycfg
|
||||
);
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,18 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -19,7 +34,7 @@
|
|||
#define BT_INFO_8723D_1ANT_B_CONNECTION BIT(0)
|
||||
|
||||
#define BT_INFO_8723D_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_) \
|
||||
(((_BT_INFO_EXT_&BIT(0))) ? true : false)
|
||||
(((_BT_INFO_EXT_&BIT(0))) ? TRUE : FALSE)
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8723D_1ANT 2
|
||||
|
||||
|
|
@ -140,6 +155,8 @@ enum bt_8723d_1ant_Scoreboard {
|
|||
BT_8723D_1ANT_SCOREBOARD_ONOFF = BIT(1),
|
||||
BT_8723D_1ANT_SCOREBOARD_SCAN = BIT(2),
|
||||
BT_8723D_1ANT_SCOREBOARD_UNDERTEST = BIT(3),
|
||||
BT_8723D_1ANT_SCOREBOARD_RXGAIN = BIT(4),
|
||||
BT_8723D_1ANT_SCOREBOARD_DKTOPP2M = BIT(5),
|
||||
BT_8723D_1ANT_SCOREBOARD_WLBUSY = BIT(6)
|
||||
};
|
||||
|
||||
|
|
@ -246,12 +263,11 @@ struct coex_sta_8723d_1ant {
|
|||
u32 crc_err_11n_vht;
|
||||
|
||||
boolean cck_lock;
|
||||
boolean pre_ccklock;
|
||||
boolean cck_ever_lock;
|
||||
boolean cck_lock_ever;
|
||||
boolean cck_lock_warn;
|
||||
|
||||
u8 coex_table_type;
|
||||
|
||||
boolean force_lps_on;
|
||||
|
||||
boolean force_lps_ctrl;
|
||||
boolean concurrent_rx_mode_on;
|
||||
|
||||
u16 score_board;
|
||||
|
|
@ -297,6 +313,27 @@ struct coex_sta_8723d_1ant {
|
|||
u8 bt_relink_downcount;
|
||||
boolean is_tdma_btautoslot;
|
||||
boolean is_tdma_btautoslot_hang;
|
||||
|
||||
boolean is_rf_state_off;
|
||||
|
||||
boolean is_hid_low_pri_tx_overhead;
|
||||
boolean is_bt_multi_link;
|
||||
boolean is_bt_a2dp_sink;
|
||||
|
||||
u8 wl_fw_dbg_info[10];
|
||||
u8 wl_rx_rate;
|
||||
u8 wl_rts_rx_rate;
|
||||
|
||||
u16 score_board_WB;
|
||||
|
||||
boolean is_hid_rcu;
|
||||
boolean is_ble_scan_toggle;
|
||||
|
||||
u16 legacy_forbidden_slot;
|
||||
u16 le_forbidden_slot;
|
||||
u8 bt_a2dp_vendor_id;
|
||||
u32 bt_a2dp_device_name;
|
||||
boolean is_bt_opp_exist;
|
||||
};
|
||||
|
||||
#define BT_8723D_1ANT_ANTDET_PSD_POINTS 256 /* MAX:1024 */
|
||||
|
|
@ -365,6 +402,10 @@ void ex_halbtc8723d1ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
|
|||
IN u8 type);
|
||||
void ex_halbtc8723d1ant_bt_info_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8723d1ant_wl_fwdbginfo_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8723d1ant_rx_rate_change_notify(IN struct btc_coexist *btcoexist,
|
||||
IN BOOLEAN is_data_frame, IN u8 btc_rate_id);
|
||||
void ex_halbtc8723d1ant_rf_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723d1ant_halt_notify(IN struct btc_coexist *btcoexist);
|
||||
|
|
@ -396,6 +437,8 @@ void ex_halbtc8723d1ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
|||
#define ex_halbtc8723d1ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8723d1ant_specific_packet_notify(btcoexist, type)
|
||||
#define ex_halbtc8723d1ant_bt_info_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8723d1ant_wl_fwdbginfo_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8723d1ant_rx_rate_change_notify(btcoexist, is_data_frame, btc_rate_id)
|
||||
#define ex_halbtc8723d1ant_rf_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8723d1ant_halt_notify(btcoexist)
|
||||
#define ex_halbtc8723d1ant_pnp_notify(btcoexist, pnp_state)
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,18 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -120,6 +135,7 @@ enum bt_8723d_2ant_coex_algo {
|
|||
BT_8723D_2ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9,
|
||||
BT_8723D_2ANT_COEX_ALGO_HID_A2DP = 0xa,
|
||||
BT_8723D_2ANT_COEX_ALGO_NOPROFILEBUSY = 0xb,
|
||||
BT_8723D_2ANT_COEX_ALGO_A2DPSINK = 0xc,
|
||||
BT_8723D_2ANT_COEX_ALGO_MAX
|
||||
};
|
||||
|
||||
|
|
@ -132,6 +148,7 @@ enum bt_8723d_2ant_phase {
|
|||
BT_8723D_2ANT_PHASE_BTMPMODE = 0x5,
|
||||
BT_8723D_2ANT_PHASE_ANTENNA_DET = 0x6,
|
||||
BT_8723D_2ANT_PHASE_COEX_POWERON = 0x7,
|
||||
BT_8723D_2ANT_PHASE_2G_FREERUN = 0x8,
|
||||
BT_8723D_2ANT_PHASE_MAX
|
||||
};
|
||||
|
||||
|
|
@ -140,6 +157,7 @@ enum bt_8723d_2ant_Scoreboard {
|
|||
BT_8723D_2ANT_SCOREBOARD_ONOFF = BIT(1),
|
||||
BT_8723D_2ANT_SCOREBOARD_SCAN = BIT(2),
|
||||
BT_8723D_2ANT_SCOREBOARD_UNDERTEST = BIT(3),
|
||||
BT_8723D_2ANT_SCOREBOARD_RXGAIN = BIT(4),
|
||||
BT_8723D_2ANT_SCOREBOARD_WLBUSY = BIT(6)
|
||||
};
|
||||
|
||||
|
|
@ -249,11 +267,16 @@ struct coex_sta_8723d_2ant {
|
|||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
u32 acc_crc_ratio;
|
||||
u32 now_crc_ratio;
|
||||
u32 cnt_crcok_max_in_10s;
|
||||
|
||||
boolean cck_lock;
|
||||
boolean pre_ccklock;
|
||||
boolean cck_ever_lock;
|
||||
boolean cck_lock_ever;
|
||||
boolean cck_lock_warn;
|
||||
|
||||
u8 coex_table_type;
|
||||
boolean force_lps_on;
|
||||
boolean force_lps_ctrl;
|
||||
|
||||
u8 dis_ver_info_cnt;
|
||||
|
||||
|
|
@ -311,6 +334,28 @@ struct coex_sta_8723d_2ant {
|
|||
boolean is_tdma_btautoslot_hang;
|
||||
|
||||
boolean is_eSCO_mode;
|
||||
|
||||
boolean is_rf_state_off;
|
||||
|
||||
boolean is_hid_low_pri_tx_overhead;
|
||||
boolean is_bt_multi_link;
|
||||
boolean is_bt_a2dp_sink;
|
||||
|
||||
u8 wl_fw_dbg_info[10];
|
||||
u8 wl_rx_rate;
|
||||
u8 wl_rts_rx_rate;
|
||||
|
||||
u16 score_board_WB;
|
||||
boolean is_2g_freerun;
|
||||
|
||||
boolean is_hid_rcu;
|
||||
boolean is_ble_scan_toggle;
|
||||
|
||||
u16 legacy_forbidden_slot;
|
||||
u16 le_forbidden_slot;
|
||||
u8 bt_a2dp_vendor_id;
|
||||
u32 bt_a2dp_device_name;
|
||||
boolean is_bt_opp_exist;
|
||||
};
|
||||
|
||||
#define BT_8723D_2ANT_ANTDET_PSD_POINTS 256 /* MAX:1024 */
|
||||
|
|
@ -380,6 +425,10 @@ void ex_halbtc8723d2ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
|
|||
IN u8 type);
|
||||
void ex_halbtc8723d2ant_bt_info_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8723d2ant_wl_fwdbginfo_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8723d2ant_rx_rate_change_notify(IN struct btc_coexist *btcoexist,
|
||||
IN BOOLEAN is_data_frame, IN u8 btc_rate_id);
|
||||
void ex_halbtc8723d2ant_rf_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8723d2ant_halt_notify(IN struct btc_coexist *btcoexist);
|
||||
|
|
@ -406,6 +455,8 @@ void ex_halbtc8723d2ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
|||
#define ex_halbtc8723d2ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8723d2ant_specific_packet_notify(btcoexist, type)
|
||||
#define ex_halbtc8723d2ant_bt_info_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8723d2ant_wl_fwdbginfo_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8723d2ant_rx_rate_change_notify(btcoexist, is_data_frame, btc_rate_id)
|
||||
#define ex_halbtc8723d2ant_rf_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8723d2ant_halt_notify(btcoexist)
|
||||
#define ex_halbtc8723d2ant_pnp_notify(btcoexist, pnp_state)
|
||||
|
|
|
|||
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
/* ************************************************************
|
||||
* Description:
|
||||
*
|
||||
|
|
@ -11,7 +25,7 @@
|
|||
/* ************************************************************
|
||||
* include files
|
||||
* ************************************************************ */
|
||||
#include "Mp_Precomp.h"
|
||||
#include "mp_precomp.h"
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -1444,7 +1458,7 @@ void halbtc8812a1ant_tdma_duration_adjust_for_acl(IN struct btc_coexist
|
|||
result = 0;
|
||||
wait_count = 0;
|
||||
} else {
|
||||
/* accquire the BT TRx retry count from BT_Info byte2 */
|
||||
/* 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;
|
||||
|
||||
|
|
@ -1868,6 +1882,7 @@ void halbtc8812a1ant_action_wifi_connected_bt_acl_busy(IN struct btc_coexist
|
|||
u8 bt_rssi_state;
|
||||
|
||||
struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
|
||||
|
||||
bt_rssi_state = halbtc8812a1ant_bt_rssi_state(2, 28, 0);
|
||||
|
||||
if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips))
|
||||
|
|
@ -2347,12 +2362,12 @@ void halbtc8812a1ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist)
|
|||
halbtc8812a1ant_action_wifi_multi_port(btcoexist);
|
||||
|
||||
return;
|
||||
} else {
|
||||
miracast_plus_bt = false;
|
||||
btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
|
||||
&miracast_plus_bt);
|
||||
}
|
||||
|
||||
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)) {
|
||||
|
|
@ -3375,6 +3390,7 @@ void ex_halbtc8812a1ant_dbg_control(IN struct btc_coexist *btcoexist,
|
|||
u8 data_len = 4;
|
||||
u8 buf[6] = {0};
|
||||
u8 dec_bt_pwr = 0, pwr_level = 0;
|
||||
|
||||
if (op_len == 2) {
|
||||
dec_bt_pwr = pdata[0];
|
||||
pwr_level = pdata[1];
|
||||
|
|
@ -3403,6 +3419,7 @@ void ex_halbtc8812a1ant_dbg_control(IN struct btc_coexist *btcoexist,
|
|||
{
|
||||
u8 data_len = 5;
|
||||
u8 buf[6] = {0};
|
||||
|
||||
if (op_len == 3) {
|
||||
buf[0] = data_len;
|
||||
buf[1] = 0x5; /* OP_Code */
|
||||
|
|
@ -3430,6 +3447,7 @@ void ex_halbtc8812a1ant_dbg_control(IN struct btc_coexist *btcoexist,
|
|||
{
|
||||
u8 data_len = 3;
|
||||
u8 buf[6] = {0};
|
||||
|
||||
if (op_len == 1) {
|
||||
buf[0] = data_len;
|
||||
buf[1] = 0x1; /* OP_Code */
|
||||
|
|
@ -3454,4 +3472,4 @@ void ex_halbtc8812a1ant_dbg_control(IN struct btc_coexist *btcoexist,
|
|||
|
||||
#endif
|
||||
|
||||
#endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */
|
||||
#endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */
|
||||
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -21,6 +35,7 @@
|
|||
(((_BT_INFO_EXT_&BIT(0))) ? true : false)
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT 2
|
||||
#define NOISY_AP_NUM_THRESH_8812A 50
|
||||
|
||||
enum bt_info_src_8812a_2ant {
|
||||
BT_INFO_SRC_8812A_2ANT_WIFI_FW = 0x0,
|
||||
|
|
@ -122,6 +137,9 @@ struct coex_dm_8812a_2ant {
|
|||
u8 cur_retry_limit_type;
|
||||
u8 pre_ampdu_time_type;
|
||||
u8 cur_ampdu_time_type;
|
||||
|
||||
boolean cur_enable_pta;
|
||||
boolean pre_enable_pta;
|
||||
};
|
||||
|
||||
struct coex_sta_8812a_2ant {
|
||||
|
|
@ -149,6 +167,22 @@ struct coex_sta_8812a_2ant {
|
|||
boolean c2h_bt_inquiry_page;
|
||||
u8 bt_retry_cnt;
|
||||
u8 bt_info_ext;
|
||||
u8 scan_ap_num;
|
||||
boolean pre_bt_disabled;
|
||||
u32 pre_bt_info_c2h_cnt_bt_rsp;
|
||||
u32 pre_bt_info_c2h_cnt_bt_send;
|
||||
boolean force_lps_on;
|
||||
u32 bt_coex_supported_version;
|
||||
|
||||
u32 crc_ok_cck;
|
||||
u32 crc_ok_11g;
|
||||
u32 crc_ok_11n;
|
||||
u32 crc_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_vht;
|
||||
};
|
||||
|
||||
/* *******************************************
|
||||
|
|
@ -180,6 +214,8 @@ void ex_halbtc8812a2ant_periodical(IN struct btc_coexist *btcoexist);
|
|||
void ex_halbtc8812a2ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8812a2ant_dbg_control(IN struct btc_coexist *btcoexist,
|
||||
IN u8 op_code, IN u8 op_len, IN u8 *pdata);
|
||||
void ex_halbtc8812a2ant_pta_off_on_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 bt_status);
|
||||
|
||||
#else
|
||||
#define ex_halbtc8812a2ant_power_on_setting(btcoexist)
|
||||
|
|
@ -197,6 +233,9 @@ void ex_halbtc8812a2ant_dbg_control(IN struct btc_coexist *btcoexist,
|
|||
#define ex_halbtc8812a2ant_periodical(btcoexist)
|
||||
#define ex_halbtc8812a2ant_display_coex_info(btcoexist)
|
||||
#define ex_halbtc8812a2ant_dbg_control(btcoexist, op_code, op_len, pdata)
|
||||
#define ex_halbtc8812a2ant_pta_off_on_notify(btcoexist, bt_status)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -133,7 +147,21 @@ struct coex_sta_8821a_1ant {
|
|||
u32 high_priority_rx;
|
||||
u32 low_priority_tx;
|
||||
u32 low_priority_rx;
|
||||
|
||||
u32 crc_ok_cck;
|
||||
u32 crc_ok_11g;
|
||||
u32 crc_ok_11n;
|
||||
u32 crc_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
u32 bt_coex_supported_version;
|
||||
u8 cut_version;
|
||||
u8 bt_rssi;
|
||||
u8 scan_ap_num;
|
||||
boolean bt_tx_rx_mask;
|
||||
u8 pre_bt_rssi_state;
|
||||
u8 pre_wifi_rssi_state[4];
|
||||
|
|
@ -145,8 +173,7 @@ struct coex_sta_8821a_1ant {
|
|||
boolean wifi_is_high_pri_task; /* Add for win8.1 page out issue */
|
||||
u8 bt_retry_cnt;
|
||||
u8 bt_info_ext;
|
||||
boolean
|
||||
bt_whck_test; /* Add for ASUS WHQL TEST that enable wifi test bt */
|
||||
boolean bt_whck_test; /* Add for ASUS WHQL TEST that enable wifi test bt */
|
||||
};
|
||||
|
||||
/* *******************************************
|
||||
|
|
@ -162,6 +189,8 @@ void ex_halbtc8821a1ant_lps_notify(IN struct btc_coexist *btcoexist,
|
|||
IN u8 type);
|
||||
void ex_halbtc8821a1ant_scan_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821a1ant_switchband_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821a1ant_connect_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821a1ant_media_status_notify(IN struct btc_coexist *btcoexist,
|
||||
|
|
@ -183,6 +212,7 @@ void ex_halbtc8821a1ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
|||
#define ex_halbtc8821a1ant_ips_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a1ant_lps_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a1ant_scan_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a1ant_switchband_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a1ant_connect_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a1ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a1ant_specific_packet_notify(btcoexist, type)
|
||||
|
|
@ -195,3 +225,4 @@ void ex_halbtc8821a1ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
|||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -139,17 +153,19 @@ struct coex_sta_8821a_2ant {
|
|||
boolean c2h_bt_inquiry_page;
|
||||
u8 bt_retry_cnt;
|
||||
u8 bt_info_ext;
|
||||
|
||||
u8 scan_ap_num;
|
||||
u32 crc_ok_cck;
|
||||
u32 crc_ok_11g;
|
||||
u32 crc_ok_11n;
|
||||
u32 crc_ok_11n_agg;
|
||||
u32 crc_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_agg;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
u32 bt_coex_supported_version;
|
||||
u8 cut_version;
|
||||
u8 coex_table_type;
|
||||
boolean force_lps_on;
|
||||
|
||||
|
|
@ -170,6 +186,8 @@ void ex_halbtc8821a2ant_lps_notify(IN struct btc_coexist *btcoexist,
|
|||
IN u8 type);
|
||||
void ex_halbtc8821a2ant_scan_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821a2ant_switchband_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821a2ant_connect_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821a2ant_media_status_notify(IN struct btc_coexist *btcoexist,
|
||||
|
|
@ -192,6 +210,7 @@ void ex_halbtc8821a2ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
|||
#define ex_halbtc8821a2ant_ips_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a2ant_lps_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a2ant_scan_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a2ant_switchband_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a2ant_connect_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a2ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8821a2ant_specific_packet_notify(btcoexist, type)
|
||||
|
|
@ -203,3 +222,4 @@ void ex_halbtc8821a2ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
|||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,18 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -6,6 +21,7 @@
|
|||
/* *******************************************
|
||||
* The following is for 8821C 1ANT BT Co-exist definition
|
||||
* ******************************************* */
|
||||
#define BT_8821C_1ANT_COEX_DBG 0
|
||||
#define BT_AUTO_REPORT_ONLY_8821C_1ANT 1
|
||||
|
||||
#define BT_INFO_8821C_1ANT_B_FTP BIT(7)
|
||||
|
|
@ -18,11 +34,13 @@
|
|||
#define BT_INFO_8821C_1ANT_B_CONNECTION BIT(0)
|
||||
|
||||
#define BT_INFO_8821C_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_) \
|
||||
(((_BT_INFO_EXT_&BIT(0))) ? true : false)
|
||||
(((_BT_INFO_EXT_&BIT(0))) ? TRUE : FALSE)
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8821C_1ANT 2
|
||||
|
||||
#define BT_8821C_1ANT_WIFI_NOISY_THRESH 30 /* max: 255 */
|
||||
#define BT_8821C_1ANT_DEFAULT_ISOLATION 15 /* unit: dB */
|
||||
|
||||
|
||||
/* for Antenna detection */
|
||||
#define BT_8821C_1ANT_ANTDET_PSDTHRES_BACKGROUND 50
|
||||
|
|
@ -30,11 +48,11 @@
|
|||
#define BT_8821C_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION 55
|
||||
#define BT_8821C_1ANT_ANTDET_PSDTHRES_1ANT 35
|
||||
#define BT_8821C_1ANT_ANTDET_RETRY_INTERVAL 10 /* retry timer if ant det is fail, unit: second */
|
||||
#define BT_8821C_1ANT_ANTDET_SWEEPPOINT_DELAY 40000
|
||||
#define BT_8821C_1ANT_ANTDET_SWEEPPOINT_DELAY 60000
|
||||
#define BT_8821C_1ANT_ANTDET_ENABLE 0
|
||||
#define BT_8821C_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE 0
|
||||
#define BT_8821C_1ANT_ANTDET_BTTXTIME 100
|
||||
#define BT_8821C_1ANT_ANTDET_BTTXCHANNEL 39
|
||||
#define BT_8821C_1ANT_ANTDET_PSD_SWWEEPCOUNT 50
|
||||
|
||||
#define BT_8821C_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT 30000
|
||||
|
||||
|
|
@ -123,6 +141,7 @@ enum bt_8821c_1ant_coex_algo {
|
|||
enum bt_8821c_1ant_ext_ant_switch_type {
|
||||
BT_8821C_1ANT_EXT_ANT_SWITCH_USE_DPDT = 0x0,
|
||||
BT_8821C_1ANT_EXT_ANT_SWITCH_USE_SPDT = 0x1,
|
||||
BT_8821C_1ANT_EXT_ANT_SWITCH_NONE = 0x2,
|
||||
BT_8821C_1ANT_EXT_ANT_SWITCH_MAX
|
||||
};
|
||||
|
||||
|
|
@ -150,23 +169,32 @@ enum bt_8821c_1ant_ext_band_switch_pos_type {
|
|||
BT_8821C_1ANT_EXT_BAND_SWITCH_TO_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_1ant_int_block{
|
||||
enum bt_8821c_1ant_int_block {
|
||||
BT_8821C_1ANT_INT_BLOCK_SWITCH_TO_WLG_OF_BTG = 0x0,
|
||||
BT_8821C_1ANT_INT_BLOCK_SWITCH_TO_WLG_OF_WLAG = 0x1,
|
||||
BT_8821C_1ANT_INT_BLOCK_SWITCH_TO_WLA_OF_WLAG = 0x2,
|
||||
BT_8821C_1ANT_INT_BLOCK_SWITCH_TO_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_1ant_phase{
|
||||
enum bt_8821c_1ant_phase {
|
||||
BT_8821C_1ANT_PHASE_COEX_INIT = 0x0,
|
||||
BT_8821C_1ANT_PHASE_WLANONLY_INIT = 0x1,
|
||||
BT_8821C_1ANT_PHASE_WLANONLY_INIT = 0x1,
|
||||
BT_8821C_1ANT_PHASE_WLAN_OFF = 0x2,
|
||||
BT_8821C_1ANT_PHASE_2G_RUNTIME = 0x3,
|
||||
BT_8821C_1ANT_PHASE_5G_RUNTIME = 0x4,
|
||||
BT_8821C_1ANT_PHASE_BTMPMODE = 0x5,
|
||||
BT_8821C_1ANT_PHASE_ANTENNA_DET = 0x6,
|
||||
BT_8821C_1ANT_PHASE_COEX_POWERON = 0x7,
|
||||
BT_8821C_1ANT_PHASE_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_1ant_Scoreboard {
|
||||
BT_8821C_1ANT_SCOREBOARD_ACTIVE = BIT(0),
|
||||
BT_8821C_1ANT_SCOREBOARD_ONOFF = BIT(1),
|
||||
BT_8821C_1ANT_SCOREBOARD_SCAN = BIT(2),
|
||||
BT_8821C_1ANT_SCOREBOARD_UNDERTEST = BIT(3),
|
||||
BT_8821C_1ANT_SCOREBOARD_WLBUSY = BIT(6)
|
||||
};
|
||||
|
||||
struct coex_dm_8821c_1ant {
|
||||
/* hw setting */
|
||||
|
|
@ -179,7 +207,6 @@ struct coex_dm_8821c_1ant {
|
|||
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;
|
||||
|
|
@ -225,7 +252,7 @@ struct coex_dm_8821c_1ant {
|
|||
|
||||
u32 pre_ext_ant_switch_status;
|
||||
u32 cur_ext_ant_switch_status;
|
||||
|
||||
|
||||
u8 pre_ext_band_switch_status;
|
||||
u8 cur_ext_band_switch_status;
|
||||
|
||||
|
|
@ -236,90 +263,138 @@ struct coex_dm_8821c_1ant {
|
|||
};
|
||||
|
||||
struct coex_sta_8821c_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;
|
||||
boolean bt_disabled;
|
||||
boolean bt_link_exist;
|
||||
boolean sco_exist;
|
||||
boolean a2dp_exist;
|
||||
boolean hid_exist;
|
||||
boolean pan_exist;
|
||||
u8 num_of_profile;
|
||||
|
||||
boolean under_lps;
|
||||
boolean under_ips;
|
||||
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;
|
||||
boolean is_hiPri_rx_overhead;
|
||||
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_8821C_1ANT_MAX][10];
|
||||
u32 bt_info_c2h_cnt[BT_INFO_SRC_8821C_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;
|
||||
boolean bt_whck_test;
|
||||
boolean c2h_bt_inquiry_page;
|
||||
boolean c2h_bt_remote_name_req;
|
||||
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_info_ext;
|
||||
u8 bt_info_ext2;
|
||||
u32 pop_event_cnt;
|
||||
u8 scan_ap_num;
|
||||
u8 bt_retry_cnt;
|
||||
|
||||
u32 crc_ok_cck;
|
||||
u32 crc_ok_11g;
|
||||
u32 crc_ok_11n;
|
||||
u32 crc_ok_11n_agg;
|
||||
u32 crc_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_agg;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
boolean cck_lock;
|
||||
boolean cck_lock_ever;
|
||||
boolean cck_lock_warn;
|
||||
|
||||
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;
|
||||
|
||||
boolean force_lps_ctrl;
|
||||
boolean concurrent_rx_mode_on;
|
||||
u16 score_board;
|
||||
u8 isolation_btween_wb; /* 0~ 50 */
|
||||
|
||||
u8 a2dp_bit_pool;
|
||||
u8 cut_version;
|
||||
boolean acl_busy;
|
||||
boolean wl_rf_off_on_event;
|
||||
boolean bt_create_connection;
|
||||
boolean run_time_state;
|
||||
|
||||
u32 bt_coex_supported_feature;
|
||||
u32 bt_coex_supported_version;
|
||||
|
||||
u8 bt_ble_scan_type;
|
||||
u32 bt_ble_scan_para[3];
|
||||
|
||||
boolean run_time_state;
|
||||
boolean freeze_coexrun_by_btinfo;
|
||||
|
||||
boolean is_A2DP_3M;
|
||||
boolean voice_over_HOGP;
|
||||
u8 bt_info;
|
||||
boolean is_autoslot;
|
||||
u8 forbidden_slot;
|
||||
u8 hid_busy_num;
|
||||
u8 hid_pair_cnt;
|
||||
|
||||
u32 cnt_RemoteNameReq;
|
||||
u32 cnt_setupLink;
|
||||
u32 cnt_ReInit;
|
||||
u32 cnt_IgnWlanAct;
|
||||
u32 cnt_Page;
|
||||
u32 cnt_RoleSwitch;
|
||||
|
||||
u16 bt_reg_vendor_ac;
|
||||
u16 bt_reg_vendor_ae;
|
||||
|
||||
boolean is_setupLink;
|
||||
u8 wl_noisy_level;
|
||||
u32 gnt_error_cnt;
|
||||
|
||||
u8 bt_afh_map[10];
|
||||
u8 bt_relink_downcount;
|
||||
boolean is_tdma_btautoslot;
|
||||
boolean is_tdma_btautoslot_hang;
|
||||
|
||||
u8 switch_band_notify_to;
|
||||
boolean is_rf_state_off;
|
||||
|
||||
boolean is_hid_low_pri_tx_overhead;
|
||||
boolean is_bt_multi_link;
|
||||
boolean is_bt_a2dp_sink;
|
||||
boolean is_set_ps_state_fail;
|
||||
u8 cnt_set_ps_state_fail;
|
||||
|
||||
u8 wl_fw_dbg_info[10];
|
||||
u8 wl_rx_rate;
|
||||
u8 wl_rts_rx_rate;
|
||||
u8 wl_center_channel;
|
||||
|
||||
u16 score_board_WB;
|
||||
};
|
||||
|
||||
|
||||
#define BT_8821C_1ANT_EXT_BAND_SWITCH_USE_DPDT 0
|
||||
#define BT_8821C_1ANT_EXT_BAND_SWITCH_USE_SPDT 1
|
||||
#define BT_8821C_1ANT_EXT_BAND_SWITCH_USE_DPDT 0
|
||||
#define BT_8821C_1ANT_EXT_BAND_SWITCH_USE_SPDT 1
|
||||
|
||||
|
||||
struct rfe_type_8821c_1ant{
|
||||
struct rfe_type_8821c_1ant {
|
||||
|
||||
u8 rfe_module_type;
|
||||
u8 rfe_module_type;
|
||||
boolean ext_ant_switch_exist;
|
||||
u8 ext_ant_switch_type; /* 0:DPDT, 1:SPDT */
|
||||
u8 ext_ant_switch_ctrl_polarity; /* iF 0: DPDT_P=0, DPDT_N=1 => BTG to Main, WL_A+G to Aux */
|
||||
|
||||
|
||||
boolean ext_band_switch_exist;
|
||||
u8 ext_band_switch_type; /* 0:DPDT, 1:SPDT */
|
||||
u8 ext_band_switch_ctrl_polarity;
|
||||
|
||||
boolean wlg_Locate_at_btg; /* If true: WLG at BTG, If false: WLG at WLAG */
|
||||
boolean ant_at_main_port;
|
||||
|
||||
boolean ext_ant_switch_diversity; /* If diversity on */
|
||||
boolean wlg_Locate_at_btg; /* If TRUE: WLG at BTG, If FALSE: WLG at WLAG */
|
||||
|
||||
boolean ext_ant_switch_diversity; /* If diversity on */
|
||||
};
|
||||
|
||||
#define BT_8821C_1ANT_ANTDET_PSD_POINTS 256 /* MAX:1024 */
|
||||
|
|
@ -356,10 +431,13 @@ struct psdscan_sta_8821c_1ant {
|
|||
u32 psd_stop_point;
|
||||
u32 psd_max_value_point;
|
||||
u32 psd_max_value;
|
||||
u32 psd_max_value2;
|
||||
u32 psd_avg_value; /* filter loop_max_value that below BT_8821C_1ANT_ANTDET_PSDTHRES_1ANT, and average the rest*/
|
||||
u32 psd_loop_max_value[BT_8821C_1ANT_ANTDET_PSD_SWWEEPCOUNT]; /*max value in each loop */
|
||||
u32 psd_start_base;
|
||||
u32 psd_avg_num; /* 1/8/16/32 */
|
||||
u32 psd_gen_count;
|
||||
boolean is_psd_running;
|
||||
boolean is_AntDet_running;
|
||||
boolean is_psd_show_max_only;
|
||||
};
|
||||
|
||||
|
|
@ -378,7 +456,7 @@ void ex_halbtc8821c1ant_lps_notify(IN struct btc_coexist *btcoexist,
|
|||
void ex_halbtc8821c1ant_scan_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821c1ant_switchband_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
IN u8 type);
|
||||
void ex_halbtc8821c1ant_connect_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821c1ant_media_status_notify(IN struct btc_coexist *btcoexist,
|
||||
|
|
@ -387,6 +465,10 @@ void ex_halbtc8821c1ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
|
|||
IN u8 type);
|
||||
void ex_halbtc8821c1ant_bt_info_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8821c1ant_wl_fwdbginfo_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8821c1ant_rx_rate_change_notify(IN struct btc_coexist *btcoexist,
|
||||
IN BOOLEAN is_data_frame, IN u8 btc_rate_id);
|
||||
void ex_halbtc8821c1ant_rf_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821c1ant_halt_notify(IN struct btc_coexist *btcoexist);
|
||||
|
|
@ -394,6 +476,7 @@ void ex_halbtc8821c1ant_pnp_notify(IN struct btc_coexist *btcoexist,
|
|||
IN u8 pnp_state);
|
||||
void ex_halbtc8821c1ant_coex_dm_reset(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821c1ant_periodical(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821c1ant_display_simple_coex_info(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821c1ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821c1ant_antenna_detection(IN struct btc_coexist *btcoexist,
|
||||
IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds);
|
||||
|
|
@ -412,16 +495,19 @@ void ex_halbtc8821c1ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
|||
#define ex_halbtc8821c1ant_ips_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c1ant_lps_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c1ant_scan_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c1ant_switchband_notify(btcoexist,type)
|
||||
#define ex_halbtc8821c1ant_switchband_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c1ant_connect_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c1ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c1ant_specific_packet_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c1ant_bt_info_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8821c1ant_wl_fwdbginfo_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8821c1ant_rx_rate_change_notify(btcoexist, is_data_frame, btc_rate_id)
|
||||
#define ex_halbtc8821c1ant_rf_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c1ant_halt_notify(btcoexist)
|
||||
#define ex_halbtc8821c1ant_pnp_notify(btcoexist, pnp_state)
|
||||
#define ex_halbtc8821c1ant_coex_dm_reset(btcoexist)
|
||||
#define ex_halbtc8821c1ant_periodical(btcoexist)
|
||||
#define ex_halbtc8821c1ant_display_simple_coex_info(btcoexist)
|
||||
#define ex_halbtc8821c1ant_display_coex_info(btcoexist)
|
||||
#define ex_halbtc8821c1ant_antenna_detection(btcoexist, cent_freq, offset, span, seconds)
|
||||
#define ex_halbtc8821c1ant_antenna_isolation(btcoexist, cent_freq, offset, span, seconds)
|
||||
|
|
@ -430,3 +516,5 @@ void ex_halbtc8821c1ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
|||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
|
|
@ -6,6 +20,7 @@
|
|||
/* *******************************************
|
||||
* The following is for 8821C 2Ant BT Co-exist definition
|
||||
* ******************************************* */
|
||||
#define BT_8821C_2ANT_COEX_DBG 0
|
||||
#define BT_AUTO_REPORT_ONLY_8821C_2ANT 1
|
||||
|
||||
|
||||
|
|
@ -40,11 +55,12 @@
|
|||
#define BT_8821C_2ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION 52
|
||||
#define BT_8821C_2ANT_ANTDET_PSDTHRES_1ANT 40
|
||||
#define BT_8821C_2ANT_ANTDET_RETRY_INTERVAL 10 /* retry timer if ant det is fail, unit: second */
|
||||
#define BT_8821C_2ANT_ANTDET_SWEEPPOINT_DELAY 40000
|
||||
#define BT_8821C_2ANT_ANTDET_SWEEPPOINT_DELAY 60000
|
||||
#define BT_8821C_2ANT_ANTDET_ENABLE 0
|
||||
#define BT_8821C_2ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE 0
|
||||
#define BT_8821C_2ANT_ANTDET_BTTXTIME 100
|
||||
#define BT_8821C_2ANT_ANTDET_BTTXCHANNEL 39
|
||||
#define BT_8821C_2ANT_ANTDET_PSD_SWWEEPCOUNT 50
|
||||
|
||||
|
||||
#define BT_8821C_2ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT 30000
|
||||
|
||||
|
|
@ -118,9 +134,17 @@ enum bt_8821c_2ant_coex_algo {
|
|||
BT_8821C_2ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9,
|
||||
BT_8821C_2ANT_COEX_ALGO_HID_A2DP = 0xa,
|
||||
BT_8821C_2ANT_COEX_ALGO_NOPROFILEBUSY = 0xb,
|
||||
BT_8821C_2ANT_COEX_ALGO_A2DPSINK = 0xc,
|
||||
BT_8821C_2ANT_COEX_ALGO_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_2ant_ext_ant_switch_type {
|
||||
BT_8821C_2ANT_EXT_ANT_SWITCH_USE_DPDT = 0x0,
|
||||
BT_8821C_2ANT_EXT_ANT_SWITCH_USE_SPDT = 0x1,
|
||||
BT_8821C_2ANT_EXT_ANT_SWITCH_NONE = 0x2,
|
||||
BT_8821C_2ANT_EXT_ANT_SWITCH_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_2ant_ext_ant_switch_ctrl_type {
|
||||
BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW = 0x0,
|
||||
BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_PTA = 0x1,
|
||||
|
|
@ -144,23 +168,36 @@ enum bt_8821c_2ant_ext_band_switch_pos_type {
|
|||
BT_8821C_2ANT_EXT_BAND_SWITCH_TO_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_2ant_int_block{
|
||||
enum bt_8821c_2ant_int_block {
|
||||
BT_8821C_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_BTG = 0x0,
|
||||
BT_8821C_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_WLAG = 0x1,
|
||||
BT_8821C_2ANT_INT_BLOCK_SWITCH_TO_WLA_OF_WLAG = 0x2,
|
||||
BT_8821C_2ANT_INT_BLOCK_SWITCH_TO_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_2ant_phase{
|
||||
enum bt_8821c_2ant_phase {
|
||||
BT_8821C_2ANT_PHASE_COEX_INIT = 0x0,
|
||||
BT_8821C_2ANT_PHASE_WLANONLY_INIT = 0x1,
|
||||
BT_8821C_2ANT_PHASE_WLANONLY_INIT = 0x1,
|
||||
BT_8821C_2ANT_PHASE_WLAN_OFF = 0x2,
|
||||
BT_8821C_2ANT_PHASE_2G_RUNTIME = 0x3,
|
||||
BT_8821C_2ANT_PHASE_5G_RUNTIME = 0x4,
|
||||
BT_8821C_2ANT_PHASE_BTMPMODE = 0x5,
|
||||
BT_8821C_2ANT_PHASE_BTMPMODE = 0x5,
|
||||
BT_8821C_2ANT_PHASE_ANTENNA_DET = 0x6,
|
||||
BT_8821C_2ANT_PHASE_COEX_POWERON = 0x7,
|
||||
BT_8821C_2ANT_PHASE_2G_RUNTIME_CONCURRENT = 0x8,
|
||||
BT_8821C_2ANT_PHASE_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_2ant_Scoreboard {
|
||||
BT_8821C_2ANT_SCOREBOARD_ACTIVE = BIT(0),
|
||||
BT_8821C_2ANT_SCOREBOARD_ONOFF = BIT(1),
|
||||
BT_8821C_2ANT_SCOREBOARD_SCAN = BIT(2),
|
||||
BT_8821C_2ANT_SCOREBOARD_UNDERTEST = BIT(3),
|
||||
BT_8821C_2ANT_SCOREBOARD_WLBUSY = BIT(6)
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct coex_dm_8821c_2ant {
|
||||
/* hw setting */
|
||||
u32 pre_ant_pos_type;
|
||||
|
|
@ -177,7 +214,6 @@ struct coex_dm_8821c_2ant {
|
|||
u8 ps_tdma_para[5];
|
||||
u8 ps_tdma_du_adj_type;
|
||||
boolean reset_tdma_adjust;
|
||||
boolean auto_tdma_adjust;
|
||||
boolean pre_ps_tdma_on;
|
||||
boolean cur_ps_tdma_on;
|
||||
boolean pre_bt_auto_report;
|
||||
|
|
@ -227,7 +263,7 @@ struct coex_dm_8821c_2ant {
|
|||
|
||||
u32 pre_ext_ant_switch_status;
|
||||
u32 cur_ext_ant_switch_status;
|
||||
|
||||
|
||||
u8 pre_ext_band_switch_status;
|
||||
u8 cur_ext_band_switch_status;
|
||||
|
||||
|
|
@ -236,58 +272,62 @@ struct coex_dm_8821c_2ant {
|
|||
};
|
||||
|
||||
struct coex_sta_8821c_2ant {
|
||||
boolean bt_disabled;
|
||||
boolean bt_link_exist;
|
||||
boolean sco_exist;
|
||||
boolean a2dp_exist;
|
||||
boolean hid_exist;
|
||||
boolean pan_exist;
|
||||
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;
|
||||
boolean under_lps;
|
||||
boolean under_ips;
|
||||
u32 high_priority_tx;
|
||||
u32 high_priority_rx;
|
||||
u32 low_priority_tx;
|
||||
u32 low_priority_rx;
|
||||
boolean is_hiPri_rx_overhead;
|
||||
u8 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_8821C_2ANT_MAX][10];
|
||||
u32 bt_info_c2h_cnt[BT_INFO_SRC_8821C_2ANT_MAX];
|
||||
boolean bt_whck_test;
|
||||
boolean c2h_bt_inquiry_page;
|
||||
boolean c2h_bt_remote_name_req;
|
||||
u8 bt_retry_cnt;
|
||||
boolean c2h_bt_inquiry_page;
|
||||
boolean c2h_bt_remote_name_req;
|
||||
|
||||
u8 bt_info_ext;
|
||||
u8 bt_info_ext2;
|
||||
u32 pop_event_cnt;
|
||||
u8 scan_ap_num;
|
||||
u8 bt_retry_cnt;
|
||||
|
||||
u32 crc_ok_cck;
|
||||
u32 crc_ok_11g;
|
||||
u32 crc_ok_11n;
|
||||
u32 crc_ok_11n_agg;
|
||||
u32 crc_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_agg;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
|
||||
boolean cck_lock;
|
||||
boolean pre_ccklock;
|
||||
boolean cck_ever_lock;
|
||||
u32 acc_crc_ratio;
|
||||
u32 now_crc_ratio;
|
||||
u32 cnt_crcok_max_in_10s;
|
||||
|
||||
boolean cck_lock;
|
||||
boolean cck_lock_ever;
|
||||
boolean cck_lock_warn;
|
||||
|
||||
u8 coex_table_type;
|
||||
boolean force_lps_on;
|
||||
boolean force_lps_ctrl;
|
||||
|
||||
u8 dis_ver_info_cnt;
|
||||
|
||||
u8 a2dp_bit_pool;
|
||||
u8 cut_version;
|
||||
|
||||
boolean concurrent_rx_mode_on;
|
||||
boolean concurrent_rx_mode_on;
|
||||
|
||||
u16 score_board;
|
||||
u8 isolation_btween_wb; /* 0~ 50 */
|
||||
|
|
@ -298,36 +338,84 @@ struct coex_sta_8821c_2ant {
|
|||
|
||||
u8 num_of_profile;
|
||||
boolean acl_busy;
|
||||
boolean wl_rf_off_on_event;
|
||||
boolean bt_create_connection;
|
||||
boolean run_time_state;
|
||||
boolean wifi_is_high_pri_task;
|
||||
u32 specific_pkt_period_cnt;
|
||||
u32 bt_coex_supported_feature;
|
||||
u32 bt_coex_supported_version;
|
||||
|
||||
u8 bt_ble_scan_type;
|
||||
u32 bt_ble_scan_para[3];
|
||||
|
||||
boolean run_time_state;
|
||||
boolean freeze_coexrun_by_btinfo;
|
||||
|
||||
boolean is_A2DP_3M;
|
||||
boolean voice_over_HOGP;
|
||||
u8 bt_info;
|
||||
boolean is_autoslot;
|
||||
u8 forbidden_slot;
|
||||
u8 hid_busy_num;
|
||||
u8 hid_pair_cnt;
|
||||
|
||||
u32 cnt_RemoteNameReq;
|
||||
u32 cnt_setupLink;
|
||||
u32 cnt_ReInit;
|
||||
u32 cnt_IgnWlanAct;
|
||||
u32 cnt_Page;
|
||||
u32 cnt_RoleSwitch;
|
||||
|
||||
u16 bt_reg_vendor_ac;
|
||||
u16 bt_reg_vendor_ae;
|
||||
|
||||
boolean is_setupLink;
|
||||
u8 wl_noisy_level;
|
||||
u32 gnt_error_cnt;
|
||||
|
||||
u8 bt_afh_map[10];
|
||||
u8 bt_relink_downcount;
|
||||
boolean is_tdma_btautoslot;
|
||||
boolean is_tdma_btautoslot_hang;
|
||||
|
||||
boolean is_eSCO_mode;
|
||||
u8 switch_band_notify_to;
|
||||
boolean is_rf_state_off;
|
||||
|
||||
boolean is_hid_low_pri_tx_overhead;
|
||||
boolean is_bt_multi_link;
|
||||
boolean is_bt_a2dp_sink;
|
||||
boolean is_set_ps_state_fail;
|
||||
u8 cnt_set_ps_state_fail;
|
||||
|
||||
u8 wl_fw_dbg_info[10];
|
||||
u8 wl_rx_rate;
|
||||
u8 wl_rts_rx_rate;
|
||||
u8 wl_center_channel;
|
||||
|
||||
u16 score_board_WB;
|
||||
};
|
||||
|
||||
#define BT_8821C_2ANT_EXT_ANT_SWITCH_USE_DPDT 0
|
||||
#define BT_8821C_2ANT_EXT_ANT_SWITCH_USE_SPDT 1
|
||||
|
||||
#define BT_8821C_2ANT_EXT_BAND_SWITCH_USE_DPDT 0
|
||||
#define BT_8821C_2ANT_EXT_BAND_SWITCH_USE_SPDT 1
|
||||
#define BT_8821C_2ANT_EXT_BAND_SWITCH_USE_DPDT 0
|
||||
#define BT_8821C_2ANT_EXT_BAND_SWITCH_USE_SPDT 1
|
||||
|
||||
|
||||
struct rfe_type_8821c_2ant{
|
||||
struct rfe_type_8821c_2ant {
|
||||
|
||||
u8 rfe_module_type;
|
||||
u8 rfe_module_type;
|
||||
boolean ext_ant_switch_exist;
|
||||
u8 ext_ant_switch_type; /* 0:DPDT, 1:SPDT */
|
||||
u8 ext_ant_switch_ctrl_polarity; /* iF 0: DPDT_P=0, DPDT_N=1 => BTG to Main, WL_A+G to Aux */
|
||||
|
||||
|
||||
boolean ext_band_switch_exist;
|
||||
u8 ext_band_switch_type; /* 0:DPDT, 1:SPDT */
|
||||
u8 ext_band_switch_ctrl_polarity;
|
||||
|
||||
boolean wlg_Locate_at_btg; /* If true: WLG at BTG, If false: WLG at WLAG */
|
||||
boolean ant_at_main_port;
|
||||
|
||||
boolean ext_ant_switch_diversity; /* If diversity on */
|
||||
boolean wlg_Locate_at_btg; /* If TRUE: WLG at BTG, If FALSE: WLG at WLAG */
|
||||
|
||||
boolean ext_ant_switch_diversity; /* If diversity on */
|
||||
};
|
||||
|
||||
#define BT_8821C_2ANT_ANTDET_PSD_POINTS 256 /* MAX:1024 */
|
||||
|
|
@ -364,10 +452,13 @@ struct psdscan_sta_8821c_2ant {
|
|||
u32 psd_stop_point;
|
||||
u32 psd_max_value_point;
|
||||
u32 psd_max_value;
|
||||
u32 psd_max_value2;
|
||||
u32 psd_avg_value; /* filter loop_max_value that below BT_8821C_1ANT_ANTDET_PSDTHRES_1ANT, and average the rest*/
|
||||
u32 psd_loop_max_value[BT_8821C_2ANT_ANTDET_PSD_SWWEEPCOUNT]; /*max value in each loop */
|
||||
u32 psd_start_base;
|
||||
u32 psd_avg_num; /* 1/8/16/32 */
|
||||
u32 psd_gen_count;
|
||||
boolean is_psd_running;
|
||||
boolean is_AntDet_running;
|
||||
boolean is_psd_show_max_only;
|
||||
};
|
||||
|
||||
|
|
@ -387,7 +478,7 @@ void ex_halbtc8821c2ant_lps_notify(IN struct btc_coexist *btcoexist,
|
|||
void ex_halbtc8821c2ant_scan_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821c2ant_switchband_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
IN u8 type);
|
||||
void ex_halbtc8821c2ant_connect_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821c2ant_media_status_notify(IN struct btc_coexist *btcoexist,
|
||||
|
|
@ -396,12 +487,17 @@ void ex_halbtc8821c2ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
|
|||
IN u8 type);
|
||||
void ex_halbtc8821c2ant_bt_info_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8821c2ant_wl_fwdbginfo_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8821c2ant_rx_rate_change_notify(IN struct btc_coexist *btcoexist,
|
||||
IN BOOLEAN is_data_frame, IN u8 btc_rate_id);
|
||||
void ex_halbtc8821c2ant_rf_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8821c2ant_halt_notify(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821c2ant_pnp_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 pnp_state);
|
||||
void ex_halbtc8821c2ant_periodical(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821c2ant_display_simple_coex_info(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821c2ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8821c2ant_antenna_detection(IN struct btc_coexist *btcoexist,
|
||||
IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds);
|
||||
|
|
@ -416,18 +512,23 @@ void ex_halbtc8821c2ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
|||
#define ex_halbtc8821c2ant_ips_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c2ant_lps_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c2ant_scan_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c2ant_switchband_notify(btcoexist,type)
|
||||
#define ex_halbtc8821c2ant_switchband_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c2ant_connect_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c2ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c2ant_specific_packet_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c2ant_bt_info_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8821c2ant_wl_fwdbginfo_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8821c2ant_rx_rate_change_notify(btcoexist, is_data_frame, btc_rate_id)
|
||||
#define ex_halbtc8821c2ant_rf_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8821c2ant_halt_notify(btcoexist)
|
||||
#define ex_halbtc8821c2ant_pnp_notify(btcoexist, pnp_state)
|
||||
#define ex_halbtc8821c2ant_periodical(btcoexist)
|
||||
#define ex_halbtc8821c2ant_display_simple_coex_info(btcoexist)
|
||||
#define ex_halbtc8821c2ant_display_coex_info(btcoexist)
|
||||
#define ex_halbtc8821c2ant_display_ant_detection(btcoexist)
|
||||
#define ex_halbtc8821c2ant_antenna_detection(btcoexist, centFreq, offset, span, seconds)
|
||||
#define ex_halbtc8821c2ant_antenna_detection(btcoexist, cent_freq, offset, span, seconds)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,200 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include "mp_precomp.h"
|
||||
|
||||
static struct rfe_type_8821c_wifi_only gl_rfe_type_8821c_1ant;
|
||||
static struct rfe_type_8821c_wifi_only *rfe_type = &gl_rfe_type_8821c_1ant;
|
||||
|
||||
|
||||
|
||||
VOID hal8821c_wifi_only_switch_antenna(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
)
|
||||
{
|
||||
boolean switch_polatiry_inverse = false;
|
||||
u8 regval_0xcb7 = 0;
|
||||
u8 pos_type, ctrl_type;
|
||||
|
||||
if (!rfe_type->ext_ant_switch_exist)
|
||||
return;
|
||||
|
||||
/* swap control polarity if use different switch control polarity*/
|
||||
/* Normal switch polarity for DPDT, 0xcb4[29:28] = 2b'01 => BTG to Main, WLG to Aux, 0xcb4[29:28] = 2b'10 => BTG to Aux, WLG to Main */
|
||||
/* Normal switch polarity for SPDT, 0xcb4[29:28] = 2b'01 => Ant to BTG, 0xcb4[29:28] = 2b'10 => Ant to WLG */
|
||||
if (rfe_type->ext_ant_switch_ctrl_polarity)
|
||||
switch_polatiry_inverse = !switch_polatiry_inverse;
|
||||
|
||||
/* swap control polarity if 1-Ant at Aux */
|
||||
if (rfe_type->ant_at_main_port == false)
|
||||
switch_polatiry_inverse = !switch_polatiry_inverse;
|
||||
|
||||
if (is_5g)
|
||||
pos_type = BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_TO_WLA;
|
||||
else
|
||||
pos_type = BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_TO_WLG;
|
||||
|
||||
switch (pos_type) {
|
||||
default:
|
||||
case BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_TO_WLA:
|
||||
|
||||
break;
|
||||
case BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_TO_WLG:
|
||||
if (!rfe_type->wlg_Locate_at_btg)
|
||||
switch_polatiry_inverse = !switch_polatiry_inverse;
|
||||
break;
|
||||
}
|
||||
|
||||
if (pwifionlycfg->haldata_info.ant_div_cfg)
|
||||
ctrl_type = BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_BY_ANTDIV;
|
||||
else
|
||||
ctrl_type = BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_BY_BBSW;
|
||||
|
||||
|
||||
switch (ctrl_type) {
|
||||
default:
|
||||
case BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_BY_BBSW:
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x4c, 0x01800000, 0x2);
|
||||
|
||||
/* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as control pin */
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcb4, 0x000000ff, 0x77);
|
||||
|
||||
regval_0xcb7 = (switch_polatiry_inverse == false ? 0x1 : 0x2);
|
||||
|
||||
/* 0xcb4[29:28] = 2b'01 for no switch_polatiry_inverse, DPDT_SEL_N =1, DPDT_SEL_P =0 */
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcb4, 0x30000000, regval_0xcb7);
|
||||
break;
|
||||
|
||||
case BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_BY_ANTDIV:
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x4c, 0x01800000, 0x2);
|
||||
|
||||
/* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as control pin */
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcb4, 0x000000ff, 0x88);
|
||||
|
||||
/* no regval_0xcb7 setup required, because antenna switch control value by antenna diversity */
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID halbtc8821c_wifi_only_set_rfe_type(
|
||||
IN struct wifi_only_cfg *pwifionlycfg
|
||||
)
|
||||
{
|
||||
|
||||
/* the following setup should be got from Efuse in the future */
|
||||
rfe_type->rfe_module_type = (pwifionlycfg->haldata_info.rfe_type) & 0x1f;
|
||||
|
||||
rfe_type->ext_ant_switch_ctrl_polarity = 0;
|
||||
|
||||
switch (rfe_type->rfe_module_type) {
|
||||
case 0:
|
||||
default:
|
||||
rfe_type->ext_ant_switch_exist = true;
|
||||
rfe_type->ext_ant_switch_type =
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_USE_DPDT; /*2-Ant, DPDT, WLG*/
|
||||
rfe_type->wlg_Locate_at_btg = false;
|
||||
rfe_type->ant_at_main_port = true;
|
||||
break;
|
||||
case 1:
|
||||
rfe_type->ext_ant_switch_exist = true;
|
||||
rfe_type->ext_ant_switch_type =
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_USE_SPDT; /*1-Ant, Main, DPDT or SPDT, WLG */
|
||||
rfe_type->wlg_Locate_at_btg = false;
|
||||
rfe_type->ant_at_main_port = true;
|
||||
break;
|
||||
case 2:
|
||||
rfe_type->ext_ant_switch_exist = true;
|
||||
rfe_type->ext_ant_switch_type =
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_USE_SPDT; /*1-Ant, Main, DPDT or SPDT, BTG */
|
||||
rfe_type->wlg_Locate_at_btg = true;
|
||||
rfe_type->ant_at_main_port = true;
|
||||
break;
|
||||
case 3:
|
||||
rfe_type->ext_ant_switch_exist = true;
|
||||
rfe_type->ext_ant_switch_type =
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_USE_DPDT; /*1-Ant, Aux, DPDT, WLG */
|
||||
rfe_type->wlg_Locate_at_btg = false;
|
||||
rfe_type->ant_at_main_port = false;
|
||||
break;
|
||||
case 4:
|
||||
rfe_type->ext_ant_switch_exist = true;
|
||||
rfe_type->ext_ant_switch_type =
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_USE_DPDT; /*1-Ant, Aux, DPDT, BTG */
|
||||
rfe_type->wlg_Locate_at_btg = true;
|
||||
rfe_type->ant_at_main_port = false;
|
||||
break;
|
||||
case 5:
|
||||
rfe_type->ext_ant_switch_exist = false; /*2-Ant, no antenna switch, WLG*/
|
||||
rfe_type->ext_ant_switch_type =
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_NONE;
|
||||
rfe_type->wlg_Locate_at_btg = false;
|
||||
rfe_type->ant_at_main_port = true;
|
||||
break;
|
||||
case 6:
|
||||
rfe_type->ext_ant_switch_exist = false; /*2-Ant, no antenna switch, WLG*/
|
||||
rfe_type->ext_ant_switch_type =
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_NONE;
|
||||
rfe_type->wlg_Locate_at_btg = false;
|
||||
rfe_type->ant_at_main_port = true;
|
||||
break;
|
||||
case 7:
|
||||
rfe_type->ext_ant_switch_exist = true; /*2-Ant, DPDT, BTG*/
|
||||
rfe_type->ext_ant_switch_type =
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_USE_DPDT;
|
||||
rfe_type->wlg_Locate_at_btg = true;
|
||||
rfe_type->ant_at_main_port = true;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
ex_hal8821c_wifi_only_hw_config(
|
||||
IN struct wifi_only_cfg *pwifionlycfg
|
||||
)
|
||||
{
|
||||
halbtc8821c_wifi_only_set_rfe_type(pwifionlycfg);
|
||||
|
||||
/* set gnt_wl, gnt_bt control owner to WL*/
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x70, 0x400000, 0x1);
|
||||
|
||||
/*gnt_wl=1 , gnt_bt=0*/
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1704, 0xffffffff, 0x7700);
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1700, 0xffffffff, 0xc00f0038);
|
||||
}
|
||||
|
||||
VOID
|
||||
ex_hal8821c_wifi_only_scannotify(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
)
|
||||
{
|
||||
hal8821c_wifi_only_switch_antenna(pwifionlycfg, is_5g);
|
||||
}
|
||||
|
||||
VOID
|
||||
ex_hal8821c_wifi_only_switchbandnotify(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
)
|
||||
{
|
||||
hal8821c_wifi_only_switch_antenna(pwifionlycfg, is_5g);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __INC_HAL8821CWIFIONLYHWCFG_H
|
||||
#define __INC_HAL8821CWIFIONLYHWCFG_H
|
||||
|
||||
|
||||
struct rfe_type_8821c_wifi_only {
|
||||
|
||||
u8 rfe_module_type;
|
||||
boolean ext_ant_switch_exist;
|
||||
u8 ext_ant_switch_type; /* 0:DPDT, 1:SPDT */
|
||||
u8 ext_ant_switch_ctrl_polarity; /* iF 0: DPDT_P=0, DPDT_N=1 => BTG to Main, WL_A+G to Aux */
|
||||
|
||||
boolean ant_at_main_port;
|
||||
|
||||
boolean wlg_Locate_at_btg; /* If true: WLG at BTG, If false: WLG at WLAG */
|
||||
|
||||
boolean ext_ant_switch_diversity; /* If diversity on */
|
||||
};
|
||||
|
||||
enum bt_8821c_wifi_only_ext_ant_switch_type {
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_USE_DPDT = 0x0,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_USE_SPDT = 0x1,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_NONE = 0x2,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_wifi_only_ext_ant_switch_ctrl_type {
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_BY_BBSW = 0x0,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_BY_PTA = 0x1,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_BY_ANTDIV = 0x2,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_BY_MAC = 0x3,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_BY_BT = 0x4,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_CTRL_MAX
|
||||
};
|
||||
|
||||
enum bt_8821c_wifi_only_ext_ant_switch_pos_type {
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_TO_BT = 0x0,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_TO_WLG = 0x1,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_TO_WLA = 0x2,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_TO_NOCARE = 0x3,
|
||||
BT_8821C_WIFI_ONLY_EXT_ANT_SWITCH_TO_MAX
|
||||
};
|
||||
|
||||
|
||||
VOID
|
||||
hal8821c_wifi_only_switch_antenna(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
);
|
||||
|
||||
VOID
|
||||
halbtc8821c_wifi_only_set_rfe_type(
|
||||
IN struct wifi_only_cfg *pwifionlycfg
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
ex_hal8821c_wifi_only_hw_config(
|
||||
IN struct wifi_only_cfg *pwifionlycfg
|
||||
);
|
||||
VOID
|
||||
ex_hal8821c_wifi_only_scannotify(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
);
|
||||
VOID
|
||||
ex_hal8821c_wifi_only_switchbandnotify(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
);
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -6,6 +6,7 @@
|
|||
/* *******************************************
|
||||
* The following is for 8822B 1ANT BT Co-exist definition
|
||||
* ******************************************* */
|
||||
#define BT_8822B_1ANT_COEX_DBG 0
|
||||
#define BT_AUTO_REPORT_ONLY_8822B_1ANT 1
|
||||
|
||||
#define BT_INFO_8822B_1ANT_B_FTP BIT(7)
|
||||
|
|
@ -22,7 +23,8 @@
|
|||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT 2
|
||||
|
||||
#define BT_8822B_1ANT_WIFI_NOISY_THRESH 30 /* max: 255 */
|
||||
#define BT_8822B_1ANT_WIFI_NOISY_THRESH 150 /* max: 255 */
|
||||
#define BT_8822B_1ANT_DEFAULT_ISOLATION 15 /* unit: dB */
|
||||
|
||||
/* for Antenna detection */
|
||||
#define BT_8822B_1ANT_ANTDET_PSDTHRES_BACKGROUND 50
|
||||
|
|
@ -34,7 +36,7 @@
|
|||
#define BT_8822B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE 0
|
||||
|
||||
#define BT_8822B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT 30000
|
||||
#define BT_8822B_1ANT_WIFI_NOISY_THRESH 30 /* max: 255 */
|
||||
|
||||
|
||||
|
||||
enum bt_8822b_1ant_signal_state {
|
||||
|
|
@ -114,9 +116,11 @@ enum bt_8822b_1ant_coex_algo {
|
|||
BT_8822B_1ANT_COEX_ALGO_PANHS = 0x6,
|
||||
BT_8822B_1ANT_COEX_ALGO_PANEDR_A2DP = 0x7,
|
||||
BT_8822B_1ANT_COEX_ALGO_PANEDR_HID = 0x8,
|
||||
BT_8822B_1ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9,
|
||||
BT_8822B_1ANT_COEX_ALGO_HID_A2DP = 0xa,
|
||||
BT_8822B_1ANT_COEX_ALGO_MAX = 0xb,
|
||||
BT_8822B_1ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9,
|
||||
BT_8822B_1ANT_COEX_ALGO_HID_A2DP = 0xa,
|
||||
BT_8822B_1ANT_COEX_ALGO_NOPROFILEBUSY = 0xb,
|
||||
BT_8822B_1ANT_COEX_ALGO_A2DPSINK = 0xc,
|
||||
BT_8822B_1ANT_COEX_ALGO_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_1ant_ext_ant_switch_type {
|
||||
|
|
@ -142,9 +146,9 @@ enum bt_8822b_1ant_ext_ant_switch_pos_type {
|
|||
BT_8822B_1ANT_EXT_ANT_SWITCH_TO_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_1ant_phase{
|
||||
enum bt_8822b_1ant_phase {
|
||||
BT_8822B_1ANT_PHASE_COEX_INIT = 0x0,
|
||||
BT_8822B_1ANT_PHASE_WLANONLY_INIT = 0x1,
|
||||
BT_8822B_1ANT_PHASE_WLANONLY_INIT = 0x1,
|
||||
BT_8822B_1ANT_PHASE_WLAN_OFF = 0x2,
|
||||
BT_8822B_1ANT_PHASE_2G_RUNTIME = 0x3,
|
||||
BT_8822B_1ANT_PHASE_5G_RUNTIME = 0x4,
|
||||
|
|
@ -152,6 +156,14 @@ enum bt_8822b_1ant_phase{
|
|||
BT_8822B_1ANT_PHASE_MAX
|
||||
};
|
||||
|
||||
/*ADD SCOREBOARD TO FIX BT LPS 32K ISSUE WHILE WL BUSY*/
|
||||
enum bt_8822b_1ant_Scoreboard {
|
||||
BT_8822B_1ANT_SCOREBOARD_ACTIVE = BIT(0),
|
||||
BT_8822B_1ANT_SCOREBOARD_ONOFF = BIT(1),
|
||||
BT_8822B_1ANT_SCOREBOARD_SCAN = BIT(2),
|
||||
BT_8822B_1ANT_SCOREBOARD_UNDERTEST = BIT(3),
|
||||
BT_8822B_1ANT_SCOREBOARD_WLBUSY = BIT(6)
|
||||
};
|
||||
|
||||
struct coex_dm_8822b_1ant {
|
||||
/* hw setting */
|
||||
|
|
@ -173,6 +185,8 @@ struct coex_dm_8822b_1ant {
|
|||
u8 cur_lps;
|
||||
u8 pre_rpwm;
|
||||
u8 cur_rpwm;
|
||||
u8 pre_fw_dac_swing_lvl;
|
||||
u8 cur_fw_dac_swing_lvl;
|
||||
|
||||
/* sw mechanism */
|
||||
boolean pre_low_penalty_ra;
|
||||
|
|
@ -212,6 +226,8 @@ struct coex_dm_8822b_1ant {
|
|||
u32 cur_ext_ant_switch_status;
|
||||
|
||||
u8 error_condition;
|
||||
boolean pre_agc_table_en;
|
||||
boolean cur_agc_table_en;
|
||||
};
|
||||
|
||||
struct coex_sta_8822b_1ant {
|
||||
|
|
@ -221,7 +237,6 @@ struct coex_sta_8822b_1ant {
|
|||
boolean a2dp_exist;
|
||||
boolean hid_exist;
|
||||
boolean pan_exist;
|
||||
boolean bt_hi_pri_link_exist;
|
||||
u8 num_of_profile;
|
||||
|
||||
boolean under_lps;
|
||||
|
|
@ -231,63 +246,105 @@ struct coex_sta_8822b_1ant {
|
|||
u32 high_priority_rx;
|
||||
u32 low_priority_tx;
|
||||
u32 low_priority_rx;
|
||||
boolean is_hiPri_rx_overhead;
|
||||
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_8822B_1ANT_MAX][10];
|
||||
u32 bt_info_c2h_cnt[BT_INFO_SRC_8822B_1ANT_MAX];
|
||||
boolean bt_whck_test;
|
||||
boolean c2h_bt_inquiry_page;
|
||||
boolean c2h_bt_page; /* Add for win8.1 page out issue */
|
||||
boolean c2h_bt_remote_name_req;
|
||||
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;
|
||||
u8 bt_info_ext2;
|
||||
u32 pop_event_cnt;
|
||||
u8 scan_ap_num;
|
||||
u8 bt_retry_cnt;
|
||||
|
||||
u32 crc_ok_cck;
|
||||
u32 crc_ok_11g;
|
||||
u32 crc_ok_11n;
|
||||
u32 crc_ok_11n_agg;
|
||||
u32 crc_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_agg;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
boolean cck_lock;
|
||||
boolean pre_ccklock;
|
||||
boolean cck_ever_lock;
|
||||
u8 coex_table_type;
|
||||
|
||||
boolean force_lps_on;
|
||||
u32 wrong_profile_notification;
|
||||
boolean force_lps_ctrl;
|
||||
|
||||
boolean concurrent_rx_mode_on;
|
||||
|
||||
u32 special_pkt_period_cnt;
|
||||
|
||||
u16 score_board;
|
||||
u8 isolation_btween_wb; /* 0~ 50 */
|
||||
|
||||
u8 a2dp_bit_pool;
|
||||
u8 cut_version;
|
||||
boolean acl_busy;
|
||||
boolean wl_rf_off_on_event;
|
||||
boolean bt_create_connection;
|
||||
boolean run_time_state;
|
||||
boolean acl_busy;
|
||||
boolean bt_create_connection;
|
||||
|
||||
u32 bt_coex_supported_feature;
|
||||
u32 bt_coex_supported_version;
|
||||
|
||||
u8 bt_ble_scan_type;
|
||||
u32 bt_ble_scan_para[3];
|
||||
|
||||
boolean run_time_state;
|
||||
boolean freeze_coexrun_by_btinfo;
|
||||
|
||||
boolean is_A2DP_3M;
|
||||
boolean voice_over_HOGP;
|
||||
u8 bt_info;
|
||||
boolean is_autoslot;
|
||||
u8 forbidden_slot;
|
||||
u8 hid_busy_num;
|
||||
u8 hid_pair_cnt;
|
||||
|
||||
u32 cnt_RemoteNameReq;
|
||||
u32 cnt_setupLink;
|
||||
u32 cnt_ReInit;
|
||||
u32 cnt_IgnWlanAct;
|
||||
u32 cnt_Page;
|
||||
u32 cnt_RoleSwitch;
|
||||
|
||||
u16 bt_reg_vendor_ac;
|
||||
u16 bt_reg_vendor_ae;
|
||||
|
||||
boolean is_setupLink;
|
||||
u8 wl_noisy_level;
|
||||
u32 gnt_error_cnt;
|
||||
u8 bt_afh_map[10];
|
||||
u8 bt_relink_downcount;
|
||||
boolean is_tdma_btautoslot;
|
||||
boolean is_tdma_btautoslot_hang;
|
||||
|
||||
u8 switch_band_notify_to;
|
||||
boolean is_rf_state_off;
|
||||
|
||||
boolean is_hid_low_pri_tx_overhead;
|
||||
boolean is_bt_multi_link;
|
||||
boolean is_bt_a2dp_sink;
|
||||
boolean rf4ce_enabled;
|
||||
|
||||
boolean is_set_ps_state_fail;
|
||||
u8 cnt_set_ps_state_fail;
|
||||
};
|
||||
|
||||
struct rfe_type_8822b_1ant{
|
||||
struct rfe_type_8822b_1ant {
|
||||
|
||||
u8 rfe_module_type;
|
||||
u8 rfe_module_type;
|
||||
boolean ext_ant_switch_exist;
|
||||
u8 ext_ant_switch_type;
|
||||
u8 ext_ant_switch_ctrl_polarity; /* iF 0: ANTSW(rfe_sel9)=0, ANTSWB(rfe_sel8)=1 => Ant to BT/5G */
|
||||
u8 ext_ant_switch_type;
|
||||
/* iF 0: ANTSW(rfe_sel9)=0, ANTSWB(rfe_sel8)=1 => Ant to BT/5G */
|
||||
u8 ext_ant_switch_ctrl_polarity;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -330,6 +387,7 @@ struct psdscan_sta_8822b_1ant {
|
|||
u32 psd_gen_count;
|
||||
boolean is_psd_running;
|
||||
boolean is_psd_show_max_only;
|
||||
boolean is_AntDet_running;
|
||||
};
|
||||
|
||||
/* *******************************************
|
||||
|
|
@ -346,8 +404,13 @@ void ex_halbtc8822b1ant_lps_notify(IN struct btc_coexist *btcoexist,
|
|||
IN u8 type);
|
||||
void ex_halbtc8822b1ant_scan_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b1ant_scan_notify_without_bt(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b1ant_switchband_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b1ant_switchband_notify_without_bt(IN struct btc_coexist
|
||||
*btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b1ant_connect_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b1ant_media_status_notify(IN struct btc_coexist *btcoexist,
|
||||
|
|
@ -386,7 +449,9 @@ void ex_halbtc8822b1ant_dbg_control(IN struct btc_coexist *btcoexist,
|
|||
#define ex_halbtc8822b1ant_ips_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b1ant_lps_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b1ant_scan_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b1ant_scan_notify_without_bt(btcoexist, type)
|
||||
#define ex_halbtc8822b1ant_switchband_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b1ant_switchband_notify_without_bt(btcoexist, type)
|
||||
#define ex_halbtc8822b1ant_connect_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b1ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b1ant_specific_packet_notify(btcoexist, type)
|
||||
|
|
@ -404,5 +469,12 @@ void ex_halbtc8822b1ant_dbg_control(IN struct btc_coexist *btcoexist,
|
|||
#define ex_halbtc8822b1ant_display_ant_detection(btcoexist)
|
||||
#define ex_halbtc8822b1ant_dbg_control(btcoexist, op_code, op_len, pdata)
|
||||
#endif
|
||||
#else
|
||||
|
||||
void ex_halbtc8822b1ant_init_hw_config_without_bt(IN struct btc_coexist
|
||||
*btcoexist);
|
||||
void ex_halbtc8822b1ant_switch_band_without_bt(IN struct btc_coexist *btcoexist,
|
||||
IN boolean wifi_only_5g);
|
||||
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,526 @@
|
|||
|
||||
#if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
|
||||
|
||||
#if (RTL8822B_SUPPORT == 1)
|
||||
|
||||
/* *******************************************
|
||||
* The following is for 8822B 2Ant BT Co-exist definition
|
||||
* ******************************************* */
|
||||
#define BT_8822B_2ANT_COEX_DBG 0
|
||||
#define BT_AUTO_REPORT_ONLY_8822B_2ANT 1
|
||||
|
||||
|
||||
|
||||
|
||||
#define BT_INFO_8822B_2ANT_B_FTP BIT(7)
|
||||
#define BT_INFO_8822B_2ANT_B_A2DP BIT(6)
|
||||
#define BT_INFO_8822B_2ANT_B_HID BIT(5)
|
||||
#define BT_INFO_8822B_2ANT_B_SCO_BUSY BIT(4)
|
||||
#define BT_INFO_8822B_2ANT_B_ACL_BUSY BIT(3)
|
||||
#define BT_INFO_8822B_2ANT_B_INQ_PAGE BIT(2)
|
||||
#define BT_INFO_8822B_2ANT_B_SCO_ESCO BIT(1)
|
||||
#define BT_INFO_8822B_2ANT_B_CONNECTION BIT(0)
|
||||
|
||||
#define BTC_RSSI_COEX_THRESH_TOL_8822B_2ANT 2
|
||||
|
||||
|
||||
/* unit: % WiFi RSSI Threshold for 2-Ant free-run/2-Ant TDMA translation.
|
||||
* (default = 42)
|
||||
*/
|
||||
#define BT_8822B_2ANT_WIFI_RSSI_COEXSWITCH_THRES1 30
|
||||
/* unit: % BT RSSI Threshold for 2-Ant free-run/2-Ant TDMA translation.
|
||||
* (default = 46)
|
||||
*/
|
||||
#define BT_8822B_2ANT_BT_RSSI_COEXSWITCH_THRES1 20
|
||||
/* unit: % WiFi RSSI Threshold for 1-Ant TDMA/1-Ant PS-TDMA translation.
|
||||
* (default = 42)
|
||||
*/
|
||||
#define BT_8822B_2ANT_WIFI_RSSI_COEXSWITCH_THRES2 30
|
||||
/* unit: % BT RSSI Threshold for 1-Ant TDMA/1-Ant PS-TDMA translation.
|
||||
* (default = 46)
|
||||
*/
|
||||
#define BT_8822B_2ANT_BT_RSSI_COEXSWITCH_THRES2 20
|
||||
#define BT_8822B_2ANT_DEFAULT_ISOLATION 15 /* unit: dB */
|
||||
#define BT_8822B_2ANT_WIFI_MAX_TX_POWER 15 /* unit: dBm */
|
||||
#define BT_8822B_2ANT_BT_MAX_TX_POWER 3 /* unit: dBm */
|
||||
#define BT_8822B_2ANT_WIFI_SIR_THRES1 -15 /* unit: dB */
|
||||
#define BT_8822B_2ANT_WIFI_SIR_THRES2 -30 /* unit: dB */
|
||||
#define BT_8822B_2ANT_BT_SIR_THRES1 -15 /* unit: dB */
|
||||
#define BT_8822B_2ANT_BT_SIR_THRES2 -30 /* unit: dB */
|
||||
|
||||
|
||||
/* for Antenna detection */
|
||||
#define BT_8822B_2ANT_ANTDET_PSDTHRES_BACKGROUND 50
|
||||
#define BT_8822B_2ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION 70
|
||||
#define BT_8822B_2ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION 52
|
||||
#define BT_8822B_2ANT_ANTDET_PSDTHRES_1ANT 40
|
||||
#define BT_8822B_2ANT_ANTDET_RETRY_INTERVAL 10 /* retry timer if ant det is fail, unit: second */
|
||||
#define BT_8822B_2ANT_ANTDET_SWEEPPOINT_DELAY 60000
|
||||
#define BT_8822B_2ANT_ANTDET_ENABLE 0
|
||||
#define BT_8822B_2ANT_ANTDET_BTTXTIME 100
|
||||
#define BT_8822B_2ANT_ANTDET_BTTXCHANNEL 39
|
||||
#define BT_8822B_2ANT_ANTDET_PSD_SWWEEPCOUNT 50
|
||||
|
||||
|
||||
#define BT_8822B_2ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT 30000
|
||||
|
||||
enum bt_8822b_2ant_signal_state {
|
||||
BT_8822B_2ANT_SIG_STA_SET_TO_LOW = 0x0,
|
||||
BT_8822B_2ANT_SIG_STA_SET_BY_HW = 0x0,
|
||||
BT_8822B_2ANT_SIG_STA_SET_TO_HIGH = 0x1,
|
||||
BT_8822B_2ANT_SIG_STA_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_path_ctrl_owner {
|
||||
BT_8822B_2ANT_PCO_BTSIDE = 0x0,
|
||||
BT_8822B_2ANT_PCO_WLSIDE = 0x1,
|
||||
BT_8822B_2ANT_PCO_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_gnt_ctrl_type {
|
||||
BT_8822B_2ANT_GNT_TYPE_CTRL_BY_PTA = 0x0,
|
||||
BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW = 0x1,
|
||||
BT_8822B_2ANT_GNT_TYPE_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_gnt_ctrl_block {
|
||||
BT_8822B_2ANT_GNT_BLOCK_RFC_BB = 0x0,
|
||||
BT_8822B_2ANT_GNT_BLOCK_RFC = 0x1,
|
||||
BT_8822B_2ANT_GNT_BLOCK_BB = 0x2,
|
||||
BT_8822B_2ANT_GNT_BLOCK_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_lte_coex_table_type {
|
||||
BT_8822B_2ANT_CTT_WL_VS_LTE = 0x0,
|
||||
BT_8822B_2ANT_CTT_BT_VS_LTE = 0x1,
|
||||
BT_8822B_2ANT_CTT_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_lte_break_table_type {
|
||||
BT_8822B_2ANT_LBTT_WL_BREAK_LTE = 0x0,
|
||||
BT_8822B_2ANT_LBTT_BT_BREAK_LTE = 0x1,
|
||||
BT_8822B_2ANT_LBTT_LTE_BREAK_WL = 0x2,
|
||||
BT_8822B_2ANT_LBTT_LTE_BREAK_BT = 0x3,
|
||||
BT_8822B_2ANT_LBTT_MAX
|
||||
};
|
||||
|
||||
enum bt_info_src_8822b_2ant {
|
||||
BT_INFO_SRC_8822B_2ANT_WIFI_FW = 0x0,
|
||||
BT_INFO_SRC_8822B_2ANT_BT_RSP = 0x1,
|
||||
BT_INFO_SRC_8822B_2ANT_BT_ACTIVE_SEND = 0x2,
|
||||
BT_INFO_SRC_8822B_2ANT_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_bt_status {
|
||||
BT_8822B_2ANT_BT_STATUS_NON_CONNECTED_IDLE = 0x0,
|
||||
BT_8822B_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1,
|
||||
BT_8822B_2ANT_BT_STATUS_INQ_PAGE = 0x2,
|
||||
BT_8822B_2ANT_BT_STATUS_ACL_BUSY = 0x3,
|
||||
BT_8822B_2ANT_BT_STATUS_SCO_BUSY = 0x4,
|
||||
BT_8822B_2ANT_BT_STATUS_ACL_SCO_BUSY = 0x5,
|
||||
BT_8822B_2ANT_BT_STATUS_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_coex_algo {
|
||||
BT_8822B_2ANT_COEX_ALGO_UNDEFINED = 0x0,
|
||||
BT_8822B_2ANT_COEX_ALGO_SCO = 0x1,
|
||||
BT_8822B_2ANT_COEX_ALGO_HID = 0x2,
|
||||
BT_8822B_2ANT_COEX_ALGO_A2DP = 0x3,
|
||||
BT_8822B_2ANT_COEX_ALGO_A2DP_PANHS = 0x4,
|
||||
BT_8822B_2ANT_COEX_ALGO_PANEDR = 0x5,
|
||||
BT_8822B_2ANT_COEX_ALGO_PANHS = 0x6,
|
||||
BT_8822B_2ANT_COEX_ALGO_PANEDR_A2DP = 0x7,
|
||||
BT_8822B_2ANT_COEX_ALGO_PANEDR_HID = 0x8,
|
||||
BT_8822B_2ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9,
|
||||
BT_8822B_2ANT_COEX_ALGO_HID_A2DP = 0xa,
|
||||
BT_8822B_2ANT_COEX_ALGO_NOPROFILEBUSY = 0xb,
|
||||
BT_8822B_2ANT_COEX_ALGO_A2DPSINK = 0xc,
|
||||
BT_8822B_2ANT_COEX_ALGO_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_ext_ant_switch_type {
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_USE_DPDT = 0x0,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_USE_SPDT = 0x1,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_NONE = 0x2,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_ext_ant_switch_ctrl_type {
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW = 0x0,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_PTA = 0x1,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_ANTDIV = 0x2,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_MAC = 0x3,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_BT = 0x4,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_ext_ant_switch_pos_type {
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_BT = 0x0,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_WLG = 0x1,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_WLA = 0x2,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_NOCARE = 0x3,
|
||||
BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_ext_band_switch_pos_type {
|
||||
BT_8822B_2ANT_EXT_BAND_SWITCH_TO_WLG = 0x0,
|
||||
BT_8822B_2ANT_EXT_BAND_SWITCH_TO_WLA = 0x1,
|
||||
BT_8822B_2ANT_EXT_BAND_SWITCH_TO_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_int_block {
|
||||
BT_8822B_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_BTG = 0x0,
|
||||
BT_8822B_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_WLAG = 0x1,
|
||||
BT_8822B_2ANT_INT_BLOCK_SWITCH_TO_WLA_OF_WLAG = 0x2,
|
||||
BT_8822B_2ANT_INT_BLOCK_SWITCH_TO_MAX
|
||||
};
|
||||
|
||||
enum bt_8822b_2ant_phase {
|
||||
BT_8822B_2ANT_PHASE_COEX_INIT = 0x0,
|
||||
BT_8822B_2ANT_PHASE_WLANONLY_INIT = 0x1,
|
||||
BT_8822B_2ANT_PHASE_WLAN_OFF = 0x2,
|
||||
BT_8822B_2ANT_PHASE_2G_RUNTIME = 0x3,
|
||||
BT_8822B_2ANT_PHASE_5G_RUNTIME = 0x4,
|
||||
BT_8822B_2ANT_PHASE_BTMPMODE = 0x5,
|
||||
BT_8822B_2ANT_PHASE_ANTENNA_DET = 0x6,
|
||||
BT_8822B_2ANT_PHASE_COEX_POWERON = 0x7,
|
||||
BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT = 0x8,
|
||||
BT_8822B_2ANT_PHASE_MAX
|
||||
};
|
||||
|
||||
/*ADD SCOREBOARD TO FIX BT LPS 32K ISSUE WHILE WL BUSY*/
|
||||
|
||||
enum bt_8822b_2ant_Scoreboard {
|
||||
BT_8822B_2ANT_SCOREBOARD_ACTIVE = BIT(0),
|
||||
BT_8822B_2ANT_SCOREBOARD_ONOFF = BIT(1),
|
||||
BT_8822B_2ANT_SCOREBOARD_SCAN = BIT(2),
|
||||
BT_8822B_2ANT_SCOREBOARD_UNDERTEST = BIT(3),
|
||||
BT_8822B_2ANT_SCOREBOARD_WLBUSY = BIT(6)
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
struct coex_dm_8822b_2ant {
|
||||
/* hw setting */
|
||||
u32 pre_ant_pos_type;
|
||||
u32 cur_ant_pos_type;
|
||||
/* 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 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;
|
||||
|
||||
/* algorithm related */
|
||||
u8 pre_algorithm;
|
||||
u8 cur_algorithm;
|
||||
u8 bt_status;
|
||||
u8 wifi_chnl_info[3];
|
||||
|
||||
boolean need_recover0x948;
|
||||
u32 backup0x948;
|
||||
|
||||
u8 pre_lps;
|
||||
u8 cur_lps;
|
||||
u8 pre_rpwm;
|
||||
u8 cur_rpwm;
|
||||
|
||||
boolean is_switch_to_1dot5_ant;
|
||||
u8 switch_thres_offset;
|
||||
u32 arp_cnt;
|
||||
|
||||
u32 pre_ext_ant_switch_status;
|
||||
u32 cur_ext_ant_switch_status;
|
||||
|
||||
u8 pre_ext_band_switch_status;
|
||||
u8 cur_ext_band_switch_status;
|
||||
|
||||
u8 pre_int_block_status;
|
||||
u8 cur_int_block_status;
|
||||
};
|
||||
|
||||
|
||||
struct coex_sta_8822b_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;
|
||||
boolean is_hiPri_rx_overhead;
|
||||
u8 bt_rssi;
|
||||
u8 pre_bt_rssi_state;
|
||||
u8 pre_wifi_rssi_state[4];
|
||||
u8 bt_info_c2h[BT_INFO_SRC_8822B_2ANT_MAX][10];
|
||||
u32 bt_info_c2h_cnt[BT_INFO_SRC_8822B_2ANT_MAX];
|
||||
boolean bt_whck_test;
|
||||
boolean c2h_bt_inquiry_page;
|
||||
boolean c2h_bt_remote_name_req;
|
||||
|
||||
u8 bt_info_ext;
|
||||
u8 bt_info_ext2;
|
||||
u32 pop_event_cnt;
|
||||
u8 scan_ap_num;
|
||||
u8 bt_retry_cnt;
|
||||
|
||||
u32 crc_ok_cck;
|
||||
u32 crc_ok_11g;
|
||||
u32 crc_ok_11n;
|
||||
u32 crc_ok_11n_vht;
|
||||
|
||||
u32 crc_err_cck;
|
||||
u32 crc_err_11g;
|
||||
u32 crc_err_11n;
|
||||
u32 crc_err_11n_vht;
|
||||
|
||||
u32 acc_crc_ratio;
|
||||
u32 now_crc_ratio;
|
||||
|
||||
boolean cck_lock;
|
||||
boolean pre_ccklock;
|
||||
boolean cck_ever_lock;
|
||||
|
||||
u8 coex_table_type;
|
||||
boolean force_lps_ctrl;
|
||||
|
||||
u8 dis_ver_info_cnt;
|
||||
|
||||
u8 a2dp_bit_pool;
|
||||
u8 cut_version;
|
||||
|
||||
boolean concurrent_rx_mode_on;
|
||||
|
||||
u16 score_board;
|
||||
u8 isolation_btween_wb; /* 0~ 50 */
|
||||
u8 wifi_coex_thres;
|
||||
u8 bt_coex_thres;
|
||||
u8 wifi_coex_thres2;
|
||||
u8 bt_coex_thres2;
|
||||
|
||||
u8 num_of_profile;
|
||||
boolean acl_busy;
|
||||
boolean bt_create_connection;
|
||||
boolean wifi_is_high_pri_task;
|
||||
u32 specific_pkt_period_cnt;
|
||||
u32 bt_coex_supported_feature;
|
||||
u32 bt_coex_supported_version;
|
||||
|
||||
u8 bt_ble_scan_type;
|
||||
u32 bt_ble_scan_para[3];
|
||||
|
||||
boolean run_time_state;
|
||||
boolean freeze_coexrun_by_btinfo;
|
||||
|
||||
boolean is_A2DP_3M;
|
||||
boolean voice_over_HOGP;
|
||||
u8 bt_info;
|
||||
boolean is_autoslot;
|
||||
u8 forbidden_slot;
|
||||
u8 hid_busy_num;
|
||||
u8 hid_pair_cnt;
|
||||
|
||||
u32 cnt_RemoteNameReq;
|
||||
u32 cnt_setupLink;
|
||||
u32 cnt_ReInit;
|
||||
u32 cnt_IgnWlanAct;
|
||||
u32 cnt_Page;
|
||||
u32 cnt_RoleSwitch;
|
||||
|
||||
u16 bt_reg_vendor_ac;
|
||||
u16 bt_reg_vendor_ae;
|
||||
|
||||
boolean is_setupLink;
|
||||
u8 wl_noisy_level;
|
||||
u32 gnt_error_cnt;
|
||||
|
||||
u8 bt_afh_map[10];
|
||||
u8 bt_relink_downcount;
|
||||
boolean is_tdma_btautoslot;
|
||||
boolean is_tdma_btautoslot_hang;
|
||||
|
||||
boolean is_eSCO_mode;
|
||||
u8 switch_band_notify_to;
|
||||
boolean is_rf_state_off;
|
||||
|
||||
boolean is_hid_low_pri_tx_overhead;
|
||||
boolean is_bt_multi_link;
|
||||
boolean is_bt_a2dp_sink;
|
||||
|
||||
boolean is_set_ps_state_fail;
|
||||
u8 cnt_set_ps_state_fail;
|
||||
};
|
||||
|
||||
|
||||
#define BT_8822B_2ANT_EXT_BAND_SWITCH_USE_DPDT 0
|
||||
#define BT_8822B_2ANT_EXT_BAND_SWITCH_USE_SPDT 1
|
||||
|
||||
|
||||
struct rfe_type_8822b_2ant {
|
||||
|
||||
u8 rfe_module_type;
|
||||
boolean ext_ant_switch_exist;
|
||||
u8 ext_ant_switch_type; /* 0:DPDT, 1:SPDT */
|
||||
/* iF 0: DPDT_P=0, DPDT_N=1 => BTG to Main, WL_A+G to Aux */
|
||||
u8 ext_ant_switch_ctrl_polarity;
|
||||
|
||||
boolean ext_band_switch_exist;
|
||||
u8 ext_band_switch_type; /* 0:DPDT, 1:SPDT */
|
||||
u8 ext_band_switch_ctrl_polarity;
|
||||
|
||||
/* If true: WLG at BTG, If false: WLG at WLAG */
|
||||
boolean wlg_Locate_at_btg;
|
||||
|
||||
boolean ext_ant_switch_diversity; /* If diversity on */
|
||||
};
|
||||
|
||||
#define BT_8822B_2ANT_ANTDET_PSD_POINTS 256 /* MAX:1024 */
|
||||
#define BT_8822B_2ANT_ANTDET_PSD_AVGNUM 1 /* MAX:3 */
|
||||
#define BT_8822B_2ANT_ANTDET_BUF_LEN 16
|
||||
|
||||
struct psdscan_sta_8822b_2ant {
|
||||
|
||||
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_8822B_2ANT_ANTDET_BUF_LEN];
|
||||
u8 ant_det_peak_freq[BT_8822B_2ANT_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_max_value2;
|
||||
/* filter loop_max_value that below BT_8822B_1ANT_ANTDET_PSDTHRES_1ANT,
|
||||
* and average the rest
|
||||
*/
|
||||
u32 psd_avg_value;
|
||||
/*max value in each loop */
|
||||
u32 psd_loop_max_value[BT_8822B_2ANT_ANTDET_PSD_SWWEEPCOUNT];
|
||||
u32 psd_start_base;
|
||||
u32 psd_avg_num; /* 1/8/16/32 */
|
||||
u32 psd_gen_count;
|
||||
boolean is_AntDet_running;
|
||||
boolean is_psd_show_max_only;
|
||||
};
|
||||
|
||||
|
||||
/* *******************************************
|
||||
* The following is interface which will notify coex module.
|
||||
* ******************************************* */
|
||||
void ex_halbtc8822b2ant_power_on_setting(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8822b2ant_pre_load_firmware(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8822b2ant_init_hw_config(IN struct btc_coexist *btcoexist,
|
||||
IN boolean wifi_only);
|
||||
void ex_halbtc8822b2ant_init_coex_dm(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8822b2ant_ips_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b2ant_lps_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b2ant_scan_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b2ant_switchband_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b2ant_connect_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b2ant_media_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b2ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b2ant_bt_info_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 *tmp_buf, IN u8 length);
|
||||
void ex_halbtc8822b2ant_rf_status_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 type);
|
||||
void ex_halbtc8822b2ant_halt_notify(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8822b2ant_pnp_notify(IN struct btc_coexist *btcoexist,
|
||||
IN u8 pnp_state);
|
||||
void ex_halbtc8822b2ant_periodical(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8822b2ant_display_coex_info(IN struct btc_coexist *btcoexist);
|
||||
void ex_halbtc8822b2ant_antenna_detection(IN struct btc_coexist *btcoexist,
|
||||
IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds);
|
||||
void ex_halbtc8822b2ant_display_ant_detection(IN struct btc_coexist *btcoexist);
|
||||
|
||||
|
||||
#else
|
||||
#define ex_halbtc8822b2ant_power_on_setting(btcoexist)
|
||||
#define ex_halbtc8822b2ant_pre_load_firmware(btcoexist)
|
||||
#define ex_halbtc8822b2ant_init_hw_config(btcoexist, wifi_only)
|
||||
#define ex_halbtc8822b2ant_init_coex_dm(btcoexist)
|
||||
#define ex_halbtc8822b2ant_ips_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b2ant_lps_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b2ant_scan_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b2ant_switchband_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b2ant_connect_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b2ant_media_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b2ant_specific_packet_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b2ant_bt_info_notify(btcoexist, tmp_buf, length)
|
||||
#define ex_halbtc8822b2ant_rf_status_notify(btcoexist, type)
|
||||
#define ex_halbtc8822b2ant_halt_notify(btcoexist)
|
||||
#define ex_halbtc8822b2ant_pnp_notify(btcoexist, pnp_state)
|
||||
#define ex_halbtc8822b2ant_periodical(btcoexist)
|
||||
#define ex_halbtc8822b2ant_display_coex_info(btcoexist)
|
||||
#define ex_halbtc8822b2ant_display_ant_detection(btcoexist)
|
||||
#define ex_halbtc8822b2ant_antenna_detection(btcoexist, cent_freq, offset, span, seconds)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include "mp_precomp.h"
|
||||
|
||||
|
||||
VOID
|
||||
ex_hal8822b_wifi_only_hw_config(
|
||||
IN struct wifi_only_cfg *pwifionlycfg
|
||||
)
|
||||
{
|
||||
/*BB control*/
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x4c, 0x01800000, 0x2);
|
||||
/*SW control*/
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcb4, 0xff, 0x77);
|
||||
/*antenna mux switch */
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x974, 0x300, 0x3);
|
||||
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1990, 0x300, 0x0);
|
||||
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcbc, 0x80000, 0x0);
|
||||
/*switch to WL side controller and gnt_wl gnt_bt debug signal */
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x70, 0xff000000, 0x0e);
|
||||
/*gnt_wl=1 , gnt_bt=0*/
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1704, 0xffffffff, 0x7700);
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1700, 0xffffffff, 0xc00f0038);
|
||||
}
|
||||
|
||||
VOID
|
||||
ex_hal8822b_wifi_only_scannotify(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
)
|
||||
{
|
||||
hal8822b_wifi_only_switch_antenna(pwifionlycfg, is_5g);
|
||||
}
|
||||
|
||||
VOID
|
||||
ex_hal8822b_wifi_only_switchbandnotify(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
)
|
||||
{
|
||||
hal8822b_wifi_only_switch_antenna(pwifionlycfg, is_5g);
|
||||
}
|
||||
|
||||
VOID
|
||||
hal8822b_wifi_only_switch_antenna(IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
)
|
||||
{
|
||||
|
||||
if (is_5g)
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcbc, 0x300, 0x1);
|
||||
else
|
||||
halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcbc, 0x300, 0x2);
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __INC_HAL8822BWIFIONLYHWCFG_H
|
||||
#define __INC_HAL8822BWIFIONLYHWCFG_H
|
||||
|
||||
VOID
|
||||
ex_hal8822b_wifi_only_hw_config(
|
||||
IN struct wifi_only_cfg *pwifionlycfg
|
||||
);
|
||||
VOID
|
||||
ex_hal8822b_wifi_only_scannotify(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
);
|
||||
VOID
|
||||
ex_hal8822b_wifi_only_switchbandnotify(
|
||||
IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
);
|
||||
VOID
|
||||
hal8822b_wifi_only_switch_antenna(IN struct wifi_only_cfg *pwifionlycfg,
|
||||
IN u1Byte is_5g
|
||||
);
|
||||
#endif
|
||||
|
|
@ -1,6 +1,120 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __HALBTC_OUT_SRC_H__
|
||||
#define __HALBTC_OUT_SRC_H__
|
||||
|
||||
enum {
|
||||
BTC_CCK_1,
|
||||
BTC_CCK_2,
|
||||
BTC_CCK_5_5,
|
||||
BTC_CCK_11,
|
||||
BTC_OFDM_6,
|
||||
BTC_OFDM_9,
|
||||
BTC_OFDM_12,
|
||||
BTC_OFDM_18,
|
||||
BTC_OFDM_24,
|
||||
BTC_OFDM_36,
|
||||
BTC_OFDM_48,
|
||||
BTC_OFDM_54,
|
||||
BTC_MCS_0,
|
||||
BTC_MCS_1,
|
||||
BTC_MCS_2,
|
||||
BTC_MCS_3,
|
||||
BTC_MCS_4,
|
||||
BTC_MCS_5,
|
||||
BTC_MCS_6,
|
||||
BTC_MCS_7,
|
||||
BTC_MCS_8,
|
||||
BTC_MCS_9,
|
||||
BTC_MCS_10,
|
||||
BTC_MCS_11,
|
||||
BTC_MCS_12,
|
||||
BTC_MCS_13,
|
||||
BTC_MCS_14,
|
||||
BTC_MCS_15,
|
||||
BTC_MCS_16,
|
||||
BTC_MCS_17,
|
||||
BTC_MCS_18,
|
||||
BTC_MCS_19,
|
||||
BTC_MCS_20,
|
||||
BTC_MCS_21,
|
||||
BTC_MCS_22,
|
||||
BTC_MCS_23,
|
||||
BTC_MCS_24,
|
||||
BTC_MCS_25,
|
||||
BTC_MCS_26,
|
||||
BTC_MCS_27,
|
||||
BTC_MCS_28,
|
||||
BTC_MCS_29,
|
||||
BTC_MCS_30,
|
||||
BTC_MCS_31,
|
||||
BTC_VHT_1SS_MCS_0,
|
||||
BTC_VHT_1SS_MCS_1,
|
||||
BTC_VHT_1SS_MCS_2,
|
||||
BTC_VHT_1SS_MCS_3,
|
||||
BTC_VHT_1SS_MCS_4,
|
||||
BTC_VHT_1SS_MCS_5,
|
||||
BTC_VHT_1SS_MCS_6,
|
||||
BTC_VHT_1SS_MCS_7,
|
||||
BTC_VHT_1SS_MCS_8,
|
||||
BTC_VHT_1SS_MCS_9,
|
||||
BTC_VHT_2SS_MCS_0,
|
||||
BTC_VHT_2SS_MCS_1,
|
||||
BTC_VHT_2SS_MCS_2,
|
||||
BTC_VHT_2SS_MCS_3,
|
||||
BTC_VHT_2SS_MCS_4,
|
||||
BTC_VHT_2SS_MCS_5,
|
||||
BTC_VHT_2SS_MCS_6,
|
||||
BTC_VHT_2SS_MCS_7,
|
||||
BTC_VHT_2SS_MCS_8,
|
||||
BTC_VHT_2SS_MCS_9,
|
||||
BTC_VHT_3SS_MCS_0,
|
||||
BTC_VHT_3SS_MCS_1,
|
||||
BTC_VHT_3SS_MCS_2,
|
||||
BTC_VHT_3SS_MCS_3,
|
||||
BTC_VHT_3SS_MCS_4,
|
||||
BTC_VHT_3SS_MCS_5,
|
||||
BTC_VHT_3SS_MCS_6,
|
||||
BTC_VHT_3SS_MCS_7,
|
||||
BTC_VHT_3SS_MCS_8,
|
||||
BTC_VHT_3SS_MCS_9,
|
||||
BTC_VHT_4SS_MCS_0,
|
||||
BTC_VHT_4SS_MCS_1,
|
||||
BTC_VHT_4SS_MCS_2,
|
||||
BTC_VHT_4SS_MCS_3,
|
||||
BTC_VHT_4SS_MCS_4,
|
||||
BTC_VHT_4SS_MCS_5,
|
||||
BTC_VHT_4SS_MCS_6,
|
||||
BTC_VHT_4SS_MCS_7,
|
||||
BTC_VHT_4SS_MCS_8,
|
||||
BTC_VHT_4SS_MCS_9,
|
||||
BTC_MCS_32,
|
||||
BTC_UNKNOWN,
|
||||
BTC_PKT_MGNT,
|
||||
BTC_PKT_CTRL,
|
||||
BTC_PKT_UNKNOWN,
|
||||
BTC_PKT_NOT_FOR_ME,
|
||||
BTC_RATE_MAX
|
||||
};
|
||||
|
||||
enum {
|
||||
BTC_MULTIPORT_SCC,
|
||||
BTC_MULTIPORT_MCC_DUAL_CHANNEL,
|
||||
BTC_MULTIPORT_MCC_DUAL_BAND,
|
||||
BTC_MULTIPORT_MAX
|
||||
};
|
||||
|
||||
#define BTC_COEX_OFFLOAD 0
|
||||
#define BTC_TMP_BUF_SHORT 20
|
||||
|
|
@ -111,6 +225,7 @@ struct btc_board_info {
|
|||
u8 single_ant_path; /* current used for 8723b only, 1=>s0, 0=>s1 */
|
||||
boolean tfbga_package; /* for Antenna detect threshold */
|
||||
boolean btdm_ant_det_finish;
|
||||
boolean btdm_ant_det_already_init_phydm;
|
||||
u8 ant_type;
|
||||
u8 rfe_type;
|
||||
u8 ant_div_cfg;
|
||||
|
|
@ -118,6 +233,7 @@ struct btc_board_info {
|
|||
u8 ant_det_result;
|
||||
boolean ant_det_result_five_complete;
|
||||
u32 antdetval;
|
||||
u8 customerID;
|
||||
};
|
||||
|
||||
typedef enum _BTC_DBG_OPCODE {
|
||||
|
|
@ -234,7 +350,9 @@ typedef enum _BTC_GET_TYPE {
|
|||
/* type BOOLEAN */
|
||||
BTC_GET_BL_HS_OPERATION,
|
||||
BTC_GET_BL_HS_CONNECTING,
|
||||
BTC_GET_BL_WIFI_FW_READY,
|
||||
BTC_GET_BL_WIFI_CONNECTED,
|
||||
BTC_GET_BL_WIFI_DUAL_BAND_CONNECTED,
|
||||
BTC_GET_BL_WIFI_BUSY,
|
||||
BTC_GET_BL_WIFI_SCAN,
|
||||
BTC_GET_BL_WIFI_LINK,
|
||||
|
|
@ -247,6 +365,7 @@ typedef enum _BTC_GET_TYPE {
|
|||
BTC_GET_BL_EXT_SWITCH,
|
||||
BTC_GET_BL_WIFI_IS_IN_MP_MODE,
|
||||
BTC_GET_BL_IS_ASUS_8723B,
|
||||
BTC_GET_BL_RF4CE_CONNECTED,
|
||||
|
||||
/* type s4Byte */
|
||||
BTC_GET_S4_WIFI_RSSI,
|
||||
|
|
@ -261,6 +380,8 @@ typedef enum _BTC_GET_TYPE {
|
|||
BTC_GET_U4_VENDOR,
|
||||
BTC_GET_U4_SUPPORTED_VERSION,
|
||||
BTC_GET_U4_SUPPORTED_FEATURE,
|
||||
BTC_GET_U4_BT_DEVICE_INFO,
|
||||
BTC_GET_U4_BT_FORBIDDEN_SLOT_VAL,
|
||||
BTC_GET_U4_WIFI_IQK_TOTAL,
|
||||
BTC_GET_U4_WIFI_IQK_OK,
|
||||
BTC_GET_U4_WIFI_IQK_FAIL,
|
||||
|
|
@ -275,6 +396,9 @@ typedef enum _BTC_GET_TYPE {
|
|||
BTC_GET_U1_ANT_TYPE,
|
||||
BTC_GET_U1_IOT_PEER,
|
||||
|
||||
/* type u2Byte */
|
||||
BTC_GET_U2_BEACON_PERIOD,
|
||||
|
||||
/*===== for 1Ant ======*/
|
||||
BTC_GET_U1_LPS_MODE,
|
||||
|
||||
|
|
@ -285,6 +409,7 @@ typedef enum _BTC_GET_TYPE {
|
|||
typedef enum _BTC_SET_TYPE {
|
||||
/* type BOOLEAN */
|
||||
BTC_SET_BL_BT_DISABLE,
|
||||
BTC_SET_BL_BT_ENABLE_DISABLE_CHANGE,
|
||||
BTC_SET_BL_BT_TRAFFIC_BUSY,
|
||||
BTC_SET_BL_BT_LIMITED_DIG,
|
||||
BTC_SET_BL_FORCE_TO_ROAM,
|
||||
|
|
@ -313,6 +438,8 @@ typedef enum _BTC_SET_TYPE {
|
|||
BTC_SET_ACT_LEAVE_LPS,
|
||||
BTC_SET_ACT_ENTER_LPS,
|
||||
BTC_SET_ACT_NORMAL_LPS,
|
||||
BTC_SET_ACT_PRE_NORMAL_LPS,
|
||||
BTC_SET_ACT_POST_NORMAL_LPS,
|
||||
BTC_SET_ACT_DISABLE_LOW_POWER,
|
||||
BTC_SET_ACT_UPDATE_RAMASK,
|
||||
BTC_SET_ACT_SEND_MIMO_PS,
|
||||
|
|
@ -563,7 +690,7 @@ typedef u4Byte
|
|||
typedef VOID
|
||||
(*BFP_BTC_SET_RF_REG)(
|
||||
IN PVOID pBtcContext,
|
||||
IN u1Byte eRFPath,
|
||||
IN enum rf_path eRFPath,
|
||||
IN u4Byte RegAddr,
|
||||
IN u4Byte BitMask,
|
||||
IN u4Byte Data
|
||||
|
|
@ -571,7 +698,7 @@ typedef VOID
|
|||
typedef u4Byte
|
||||
(*BFP_BTC_GET_RF_REG)(
|
||||
IN PVOID pBtcContext,
|
||||
IN u1Byte eRFPath,
|
||||
IN enum rf_path eRFPath,
|
||||
IN u4Byte RegAddr,
|
||||
IN u4Byte BitMask
|
||||
);
|
||||
|
|
@ -665,6 +792,12 @@ typedef u4Byte
|
|||
IN u1Byte info_type
|
||||
);
|
||||
|
||||
typedef VOID
|
||||
(*BTC_PHYDM_MODIFY_ANTDIV_HWSW)(
|
||||
IN PVOID pDM_Odm,
|
||||
IN u1Byte type
|
||||
);
|
||||
|
||||
typedef u1Byte
|
||||
(*BFP_BTC_GET_ANT_DET_VAL_FROM_BT)(
|
||||
|
||||
|
|
@ -751,6 +884,12 @@ struct btc_bt_link_info {
|
|||
boolean acl_busy;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_RF4CE_COEXIST
|
||||
struct btc_rf4ce_info {
|
||||
u8 link_state;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct btc_statistics {
|
||||
u32 cnt_bind;
|
||||
u32 cnt_power_on;
|
||||
|
|
@ -769,6 +908,7 @@ struct btc_statistics {
|
|||
u32 cnt_coex_dm_switch;
|
||||
u32 cnt_stack_operation_notify;
|
||||
u32 cnt_dbg_ctrl;
|
||||
u32 cnt_rate_id_notify;
|
||||
};
|
||||
|
||||
struct btc_coexist {
|
||||
|
|
@ -778,6 +918,10 @@ struct btc_coexist {
|
|||
struct btc_bt_info bt_info; /*some bt info referenced by non-bt module*/
|
||||
struct btc_stack_info stack_info;
|
||||
struct btc_bt_link_info bt_link_info;
|
||||
|
||||
#ifdef CONFIG_RF4CE_COEXIST
|
||||
struct btc_rf4ce_info rf4ce_info;
|
||||
#endif
|
||||
BTC_CHIP_INTERFACE chip_interface;
|
||||
PVOID odm_priv;
|
||||
|
||||
|
|
@ -827,6 +971,7 @@ struct btc_coexist {
|
|||
BFP_BTC_GET_PHYDM_VERSION btc_get_bt_phydm_version;
|
||||
BTC_PHYDM_MODIFY_RA_PCR_THRESHLOD btc_phydm_modify_RA_PCR_threshold;
|
||||
BTC_PHYDM_CMNINFOQUERY btc_phydm_query_PHY_counter;
|
||||
BTC_PHYDM_MODIFY_ANTDIV_HWSW btc_phydm_modify_ANTDIV_HwSw;
|
||||
BFP_BTC_GET_ANT_DET_VAL_FROM_BT btc_get_ant_det_val_from_bt;
|
||||
BFP_BTC_GET_BLE_SCAN_TYPE_FROM_BT btc_get_ble_scan_type_from_bt;
|
||||
BFP_BTC_GET_BLE_SCAN_PARA_FROM_BT btc_get_ble_scan_para_from_bt;
|
||||
|
|
@ -904,6 +1049,18 @@ EXhalbtcoutsrc_RfStatusNotify(
|
|||
IN u1Byte type
|
||||
);
|
||||
VOID
|
||||
EXhalbtcoutsrc_WlFwDbgInfoNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN pu1Byte tmpBuf,
|
||||
IN u1Byte length
|
||||
);
|
||||
VOID
|
||||
EXhalbtcoutsrc_rx_rate_change_notify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN BOOLEAN is_data_frame,
|
||||
IN u1Byte btc_rate_id
|
||||
);
|
||||
VOID
|
||||
EXhalbtcoutsrc_StackOperationNotify(
|
||||
IN PBTC_COEXIST pBtCoexist,
|
||||
IN u1Byte type
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2013 Realtek Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -11,12 +11,7 @@
|
|||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
*
|
||||
******************************************************************************/
|
||||
*****************************************************************************/
|
||||
#ifndef __MP_PRECOMP_H__
|
||||
#define __MP_PRECOMP_H__
|
||||
|
||||
|
|
@ -41,10 +36,10 @@
|
|||
|
||||
#define WPP_SOFTWARE_TRACE 0
|
||||
|
||||
typedef enum _BTC_MSG_COMP_TYPE{
|
||||
typedef enum _BTC_MSG_COMP_TYPE {
|
||||
COMP_COEX = 0,
|
||||
COMP_MAX
|
||||
}BTC_MSG_COMP_TYPE;
|
||||
} BTC_MSG_COMP_TYPE;
|
||||
extern u4Byte GLBtcDbgType[];
|
||||
|
||||
#define DBG_OFF 0
|
||||
|
|
@ -64,26 +59,27 @@ extern u4Byte GLBtcDbgType[];
|
|||
#define HS_SUPPORT 0
|
||||
#endif
|
||||
|
||||
#include "HalBtcOutSrc.h"
|
||||
#include "HalBtc8188c2Ant.h"
|
||||
#include "HalBtc8192d2Ant.h"
|
||||
#include "HalBtc8192e1Ant.h"
|
||||
#include "HalBtc8192e2Ant.h"
|
||||
#include "HalBtc8723a1Ant.h"
|
||||
#include "HalBtc8723a2Ant.h"
|
||||
#include "HalBtc8723b1Ant.h"
|
||||
#include "HalBtc8723b2Ant.h"
|
||||
#include "HalBtc8812a1Ant.h"
|
||||
#include "HalBtc8812a2Ant.h"
|
||||
#include "HalBtc8821a1Ant.h"
|
||||
#include "HalBtc8821a2Ant.h"
|
||||
#include "HalBtc8821aCsr2Ant.h"
|
||||
#include "HalBtc8703b1Ant.h"
|
||||
#include "halbtcoutsrc.h"
|
||||
#include "halbtc8192e1ant.h"
|
||||
#include "halbtc8192e2ant.h"
|
||||
#include "halbtc8723b1ant.h"
|
||||
#include "halbtc8723b2ant.h"
|
||||
#include "halbtc8812a1ant.h"
|
||||
#include "halbtc8812a2ant.h"
|
||||
#include "halbtc8821a1ant.h"
|
||||
#include "halbtc8821a2ant.h"
|
||||
#include "halbtc8703b1ant.h"
|
||||
#include "halbtc8723d1ant.h"
|
||||
#include "halbtc8723d2ant.h"
|
||||
#include "HalBtc8822b1Ant.h"
|
||||
#include "halbtc8822b1ant.h"
|
||||
#include "halbtc8822b2ant.h"
|
||||
#include "halbtc8821c1ant.h"
|
||||
#include "halbtc8821c2ant.h"
|
||||
|
||||
/* for wifi only mode */
|
||||
#include "hal_btcoex_wifionly.h"
|
||||
#include "halbtc8723bwifionly.h"
|
||||
#include "halbtc8822bwifionly.h"
|
||||
#include "halbtc8821cwifionly.h"
|
||||
|
||||
#endif // __MP_PRECOMP_H__
|
||||
#endif /* __MP_PRECOMP_H__ */
|
||||
|
|
@ -1,98 +1,138 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if DEV_BUS_TYPE == RT_USB_INTERFACE
|
||||
|
||||
#if defined(CONFIG_RTL8188E)
|
||||
#include "rtl8188e/HalEfuseMask8188E_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8188E)
|
||||
#include "rtl8188e/HalEfuseMask8188E_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8812A)
|
||||
#include "rtl8812a/HalEfuseMask8812A_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8812A)
|
||||
#include "rtl8812a/HalEfuseMask8812A_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8821A)
|
||||
#include "rtl8812a/HalEfuseMask8821A_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8821A)
|
||||
#include "rtl8812a/HalEfuseMask8821A_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8192E)
|
||||
#include "rtl8192e/HalEfuseMask8192E_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8192E)
|
||||
#include "rtl8192e/HalEfuseMask8192E_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8723B)
|
||||
#include "rtl8723b/HalEfuseMask8723B_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8723B)
|
||||
#include "rtl8723b/HalEfuseMask8723B_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8814A)
|
||||
#include "rtl8814a/HalEfuseMask8814A_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8814A)
|
||||
#include "rtl8814a/HalEfuseMask8814A_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8703B)
|
||||
#include "rtl8703b/HalEfuseMask8703B_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8703B)
|
||||
#include "rtl8703b/HalEfuseMask8703B_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8723D)
|
||||
#include "rtl8723d/HalEfuseMask8723D_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8723D)
|
||||
#include "rtl8723d/HalEfuseMask8723D_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8188F)
|
||||
#include "rtl8188f/HalEfuseMask8188F_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8188F)
|
||||
#include "rtl8188f/HalEfuseMask8188F_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8822B)
|
||||
#include "rtl8822b/HalEfuseMask8822B_USB.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8822B)
|
||||
#include "rtl8822b/HalEfuseMask8822B_USB.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8821C)
|
||||
#include "rtl8821c/HalEfuseMask8821C_USB.h"
|
||||
#endif
|
||||
|
||||
#elif DEV_BUS_TYPE == RT_PCI_INTERFACE
|
||||
|
||||
#if defined(CONFIG_RTL8188E)
|
||||
#include "rtl8188e/HalEfuseMask8188E_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8188E)
|
||||
#include "rtl8188e/HalEfuseMask8188E_PCIE.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8812A)
|
||||
#include "rtl8812a/HalEfuseMask8812A_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8812A)
|
||||
#include "rtl8812a/HalEfuseMask8812A_PCIE.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8821A)
|
||||
#include "rtl8812a/HalEfuseMask8821A_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8821A)
|
||||
#include "rtl8812a/HalEfuseMask8821A_PCIE.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8192E)
|
||||
#include "rtl8192e/HalEfuseMask8192E_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8192E)
|
||||
#include "rtl8192e/HalEfuseMask8192E_PCIE.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8723B)
|
||||
#include "rtl8723b/HalEfuseMask8723B_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8723B)
|
||||
#include "rtl8723b/HalEfuseMask8723B_PCIE.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8814A)
|
||||
#include "rtl8814a/HalEfuseMask8814A_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8814A)
|
||||
#include "rtl8814a/HalEfuseMask8814A_PCIE.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8703B)
|
||||
#include "rtl8703b/HalEfuseMask8703B_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8703B)
|
||||
#include "rtl8703b/HalEfuseMask8703B_PCIE.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8822B)
|
||||
#include "rtl8822b/HalEfuseMask8822B_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8723D)
|
||||
#include "rtl8723d/HalEfuseMask8723D_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8822B)
|
||||
#include "rtl8822b/HalEfuseMask8822B_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8723D)
|
||||
#include "rtl8723d/HalEfuseMask8723D_PCIE.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8821C)
|
||||
#include "rtl8821c/HalEfuseMask8821C_PCIE.h"
|
||||
#endif
|
||||
|
||||
#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE
|
||||
#if defined(CONFIG_RTL8723B)
|
||||
#include "rtl8723b/HalEfuseMask8723B_SDIO.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8188E)
|
||||
#include "rtl8188e/HalEfuseMask8188E_SDIO.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8188E)
|
||||
#include "rtl8188e/HalEfuseMask8188E_SDIO.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8703B)
|
||||
#include "rtl8703b/HalEfuseMask8703B_SDIO.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8703B)
|
||||
#include "rtl8703b/HalEfuseMask8703B_SDIO.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8188F)
|
||||
#include "rtl8188f/HalEfuseMask8188F_SDIO.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8188F)
|
||||
#include "rtl8188f/HalEfuseMask8188F_SDIO.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8723D)
|
||||
#include "rtl8723d/HalEfuseMask8723D_SDIO.h"
|
||||
#endif
|
||||
#if defined(CONFIG_RTL8723D)
|
||||
#include "rtl8723d/HalEfuseMask8723D_SDIO.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8192E)
|
||||
#include "rtl8192e/HalEfuseMask8192E_SDIO.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8821A)
|
||||
#include "rtl8812a/HalEfuseMask8821A_SDIO.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8821C)
|
||||
#include "rtl8821c/HalEfuseMask8821C_SDIO.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTL8822B)
|
||||
#include "rtl8822b/HalEfuseMask8822B_SDIO.h"
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,22 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* 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) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*#include "Mp_Precomp.h"*/
|
||||
#include <drv_types.h>
|
||||
|
|
@ -44,7 +39,7 @@ u1Byte Array_MP_8723D_MPCIE[] = {
|
|||
0xFF,
|
||||
0xFF,
|
||||
0x7C,
|
||||
0x70,
|
||||
0x30,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
|
|
|
|||
|
|
@ -1,22 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* 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) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/******************************************************************************
|
||||
* MPCIE.TXT
|
||||
|
|
|
|||
|
|
@ -1,21 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* 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) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <drv_types.h>
|
||||
#include "HalEfuseMask8723D_SDIO.h"
|
||||
|
|
|
|||
|
|
@ -1,21 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* 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) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/******************************************************************************
|
||||
* MSDIO.TXT
|
||||
|
|
|
|||
|
|
@ -1,22 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* 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) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/* #include "Mp_Precomp.h" */
|
||||
/* #include "../odm_precomp.h" */
|
||||
|
|
|
|||
|
|
@ -1,22 +1,17 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* 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) 2007 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,178 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2016 - 2017 Realtek Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include "btc/mp_precomp.h"
|
||||
#include <hal_btcoex_wifionly.h>
|
||||
|
||||
struct wifi_only_cfg GLBtCoexistWifiOnly;
|
||||
|
||||
void halwifionly_write1byte(PVOID pwifionlyContext, u32 RegAddr, u8 Data)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
|
||||
PADAPTER Adapter = pwifionlycfg->Adapter;
|
||||
|
||||
rtw_write8(Adapter, RegAddr, Data);
|
||||
}
|
||||
|
||||
void halwifionly_write2byte(PVOID pwifionlyContext, u32 RegAddr, u16 Data)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
|
||||
PADAPTER Adapter = pwifionlycfg->Adapter;
|
||||
|
||||
rtw_write16(Adapter, RegAddr, Data);
|
||||
}
|
||||
|
||||
void halwifionly_write4byte(PVOID pwifionlyContext, u32 RegAddr, u32 Data)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
|
||||
PADAPTER Adapter = pwifionlycfg->Adapter;
|
||||
|
||||
rtw_write32(Adapter, RegAddr, Data);
|
||||
}
|
||||
|
||||
u8 halwifionly_read1byte(PVOID pwifionlyContext, u32 RegAddr)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
|
||||
PADAPTER Adapter = pwifionlycfg->Adapter;
|
||||
|
||||
return rtw_read8(Adapter, RegAddr);
|
||||
}
|
||||
|
||||
u16 halwifionly_read2byte(PVOID pwifionlyContext, u32 RegAddr)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
|
||||
PADAPTER Adapter = pwifionlycfg->Adapter;
|
||||
|
||||
return rtw_read16(Adapter, RegAddr);
|
||||
}
|
||||
|
||||
u32 halwifionly_read4byte(PVOID pwifionlyContext, u32 RegAddr)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
|
||||
PADAPTER Adapter = pwifionlycfg->Adapter;
|
||||
|
||||
return rtw_read32(Adapter, RegAddr);
|
||||
}
|
||||
|
||||
void halwifionly_bitmaskwrite1byte(PVOID pwifionlyContext, u32 regAddr, u8 bitMask, u8 data)
|
||||
{
|
||||
u8 originalValue, bitShift = 0;
|
||||
u8 i;
|
||||
|
||||
struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
|
||||
PADAPTER Adapter = pwifionlycfg->Adapter;
|
||||
|
||||
if (bitMask != 0xff) {
|
||||
originalValue = rtw_read8(Adapter, regAddr);
|
||||
for (i = 0; i <= 7; i++) {
|
||||
if ((bitMask >> i) & 0x1)
|
||||
break;
|
||||
}
|
||||
bitShift = i;
|
||||
data = ((originalValue) & (~bitMask)) | (((data << bitShift)) & bitMask);
|
||||
}
|
||||
rtw_write8(Adapter, regAddr, data);
|
||||
}
|
||||
|
||||
void halwifionly_phy_set_rf_reg(PVOID pwifionlyContext, enum rf_path eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
|
||||
PADAPTER Adapter = pwifionlycfg->Adapter;
|
||||
|
||||
phy_set_rf_reg(Adapter, eRFPath, RegAddr, BitMask, Data);
|
||||
}
|
||||
|
||||
void halwifionly_phy_set_bb_reg(PVOID pwifionlyContext, u32 RegAddr, u32 BitMask, u32 Data)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = (struct wifi_only_cfg *)pwifionlyContext;
|
||||
PADAPTER Adapter = pwifionlycfg->Adapter;
|
||||
|
||||
phy_set_bb_reg(Adapter, RegAddr, BitMask, Data);
|
||||
}
|
||||
|
||||
void hal_btcoex_wifionly_switchband_notify(PADAPTER padapter)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
u8 is_5g = _FALSE;
|
||||
|
||||
if (pHalData->current_band_type == BAND_ON_5G)
|
||||
is_5g = _TRUE;
|
||||
|
||||
if (IS_HARDWARE_TYPE_8822B(padapter))
|
||||
ex_hal8822b_wifi_only_switchbandnotify(&GLBtCoexistWifiOnly, is_5g);
|
||||
else if (IS_HARDWARE_TYPE_8821C(padapter))
|
||||
ex_hal8821c_wifi_only_switchbandnotify(&GLBtCoexistWifiOnly, is_5g);
|
||||
}
|
||||
|
||||
void hal_btcoex_wifionly_scan_notify(PADAPTER padapter)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
u8 is_5g = _FALSE;
|
||||
|
||||
if (pHalData->current_band_type == BAND_ON_5G)
|
||||
is_5g = _TRUE;
|
||||
|
||||
if (IS_HARDWARE_TYPE_8822B(padapter))
|
||||
ex_hal8822b_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
|
||||
else if (IS_HARDWARE_TYPE_8821C(padapter))
|
||||
ex_hal8821c_wifi_only_scannotify(&GLBtCoexistWifiOnly, is_5g);
|
||||
}
|
||||
|
||||
void hal_btcoex_wifionly_hw_config(PADAPTER padapter)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = &GLBtCoexistWifiOnly;
|
||||
|
||||
if (IS_HARDWARE_TYPE_8723B(padapter))
|
||||
ex_hal8723b_wifi_only_hw_config(pwifionlycfg);
|
||||
else if (IS_HARDWARE_TYPE_8822B(padapter))
|
||||
ex_hal8822b_wifi_only_hw_config(pwifionlycfg);
|
||||
else if (IS_HARDWARE_TYPE_8821C(padapter))
|
||||
ex_hal8821c_wifi_only_hw_config(pwifionlycfg);
|
||||
}
|
||||
|
||||
void hal_btcoex_wifionly_initlizevariables(PADAPTER padapter)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = &GLBtCoexistWifiOnly;
|
||||
struct wifi_only_haldata *pwifionly_haldata = &pwifionlycfg->haldata_info;
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
|
||||
_rtw_memset(&GLBtCoexistWifiOnly, 0, sizeof(GLBtCoexistWifiOnly));
|
||||
|
||||
pwifionlycfg->Adapter = padapter;
|
||||
|
||||
#ifdef CONFIG_PCI_HCI
|
||||
pwifionlycfg->chip_interface = WIFIONLY_INTF_PCI;
|
||||
#elif defined(CONFIG_USB_HCI)
|
||||
pwifionlycfg->chip_interface = WIFIONLY_INTF_USB;
|
||||
#elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
|
||||
pwifionlycfg->chip_interface = WIFIONLY_INTF_SDIO;
|
||||
#else
|
||||
pwifionlycfg->chip_interface = WIFIONLY_INTF_UNKNOWN;
|
||||
#endif
|
||||
|
||||
pwifionly_haldata->customer_id = CUSTOMER_NORMAL;
|
||||
}
|
||||
|
||||
void hal_btcoex_wifionly_AntInfoSetting(PADAPTER padapter)
|
||||
{
|
||||
struct wifi_only_cfg *pwifionlycfg = &GLBtCoexistWifiOnly;
|
||||
struct wifi_only_haldata *pwifionly_haldata = &pwifionlycfg->haldata_info;
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
|
||||
pwifionly_haldata->efuse_pg_antnum = pHalData->EEPROMBluetoothAntNum;
|
||||
pwifionly_haldata->efuse_pg_antpath = pHalData->ant_path;
|
||||
pwifionly_haldata->rfe_type = pHalData->rfe_type;
|
||||
pwifionly_haldata->ant_div_cfg = pHalData->AntDivCfg;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user