mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
add mt proprietary driver for linux 5.4 (Thx MeIsReallyBa and hanwckf)
This commit is contained in:
parent
90e48a34ba
commit
1c1aef021d
62
package/lean/mt/drivers/mt7603e/Makefile
Normal file
62
package/lean/mt/drivers/mt7603e/Makefile
Normal file
@ -0,0 +1,62 @@
|
||||
# All rights reserved.
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=mt7603e
|
||||
P4REV:=2
|
||||
PKG_VERSION:=4.1.2.0
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/mt7603_wifi
|
||||
PKG_KCONFIG:= \
|
||||
RALINK_MT7620 RALINK_RT7621 RLT_WIFI MT_WIFI_PATH FIRST_IF_MT7603E\
|
||||
FIRST_IF_EEPROM_PROM FIRST_IF_EEPROM_EFUSE FIRST_IF_EEPROM_FLASH RT_FIRST_CARD_EEPROM WIFI_BASIC_FUNC\
|
||||
MULTI_INF_SUPPORT WSC_INCLUDED WSC_V2_SUPPORT DOT11N_DRAFT3 DOT11_VHT_AC DOT11W_PMF_SUPPORT\
|
||||
TXBF_SUPPORT WMM_ACM_SUPPORT QOS_DLS_SUPPORT WAPI_SUPPORT CARRIER_DETECTION_SUPPORT\
|
||||
IGMP_SNOOP_SUPPORT BLOCK_NET_IF RATE_ADAPTION NEW_RATE_ADAPT_SUPPORT AGS_SUPPORT\
|
||||
IDS_SUPPORT WIFI_WORK_QUEUE WIFI_SKB_RECYCLE RTMP_FLASH_SUPPORT LED_CONTROL_SUPPORT\
|
||||
SINGLE_SKU_V2 HW_ANTENNA_DIVERSITY ATE_SUPPORT RT2860V2_AP_V24_DATA_STRUCTURE RT2860V2_AP_32B_DESC\
|
||||
MEMORY_OPTIMIZATION HOTSPOT HOTSPOT_R2 ACL_V2_SUPPORT UAPSD PA_LNA RLT_BBP RLT_RF RTMP_BBP RTMP_RF RLT_MAC RLT_BBP RLT_RF RTMP_MAC RTMP_BBP RTMP_RF \
|
||||
RTMP_PCI_SUPPORT RTMP_USB_SUPPORT RTMP_RBUS_SUPPORT RLT_AP_SUPPORT RALINK_MT7603E MT_MAC AP_SUPPORT\
|
||||
WDS_SUPPORT MBSS_SUPPORT NEW_MBSSID_MODE ENHANCE_NEW_MBSSID_MODE APCLI_SUPPORT MULTI_APCLI_SUPPORT \
|
||||
AIRPLAY_SUPPORT MAC_REPEATER_SUPPORT DFS_SUPPORT NINTENDO_AP DOT11K_RRM_SUPPORT RT2860V2_SNMP\
|
||||
LLTD_SUPPORT NINTENDO_AP COC_SUPPORT MULTI_CORE_SUPPORT MCAST_RATE_SPECIFIC PREVENT_ARP_SPOOFING_SUPPORT \
|
||||
EXT_BUILD_CHANNEL_LIST AUTO_CH_SELECT_ENHANCE MEMORY_OPTIMIZATION RTMP_TEMPERATURE_CALIBRATION\
|
||||
SNIFFER_SUPPORT CFG80211_SUPPORT SNIFFER_MIB_CMD ALL_NET_EVENT
|
||||
|
||||
|
||||
PKG_CONFIG_DEPENDS:=$(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_$c),CONFIG_$(c)))
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
TAR_CMD=$(HOST_TAR) -C $(1)/ $(TAR_OPTIONS)
|
||||
|
||||
define KernelPackage/mt7603e
|
||||
CATEGORY:=Kernel modules
|
||||
TITLE:=MTK wifi AP driver
|
||||
FILES:=$(PKG_BUILD_DIR)/mt7603_wifi_ap/mt7603e.ko
|
||||
SUBMENU:=Wireless Drivers
|
||||
AUTOLOAD:=$(call AutoProbe,mt7603e)
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7603e/config
|
||||
source "$(SOURCE)/config.in"
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C "$(LINUX_DIR)" V=1 \
|
||||
CROSS_COMPILE="$(TARGET_CROSS)" \
|
||||
ARCH="$(LINUX_KARCH)" \
|
||||
M="$(PKG_BUILD_DIR)/mt7603_wifi_ap" \
|
||||
$(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_MT7603E_$c),CONFIG_$(c)=$(CONFIG_MT7603E_$(c)))) \
|
||||
modules
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7603e/install
|
||||
$(INSTALL_DIR) $(1)/etc/wireless/mt7603/
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,mt7603e))
|
526
package/lean/mt/drivers/mt7603e/config.in
Normal file
526
package/lean/mt/drivers/mt7603e/config.in
Normal file
@ -0,0 +1,526 @@
|
||||
if PACKAGE_kmod-mt7603e
|
||||
|
||||
#if FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
config MT7603E_FIRST_IF_MT7603E
|
||||
bool
|
||||
default y
|
||||
depends on PACKAGE_kmod-mt7603e
|
||||
|
||||
config MT7603E_RLT_WIFI
|
||||
tristate "MT WIFI Driver"
|
||||
default y
|
||||
|
||||
config MT7603E_MT_WIFI_PATH
|
||||
string
|
||||
depends on MT7603E_RLT_WIFI
|
||||
default "rlt_wifi"
|
||||
|
||||
if MT7603E_RLT_WIFI
|
||||
menu "WiFi Generic Feature Options"
|
||||
|
||||
if MT7603E_FIRST_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 1st Card"
|
||||
default MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
#depends on ! FIRST_IF_NONE
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
endchoice
|
||||
|
||||
config MT7603E_RT_FIRST_CARD_EEPROM
|
||||
string
|
||||
#depends on ! FIRST_IF_NONE
|
||||
default "prom" if MT7603E_FIRST_IF_EEPROM_PROM
|
||||
default "efuse" if MT7603E_FIRST_IF_EEPROM_EFUSE
|
||||
default "flash" if MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
endif
|
||||
|
||||
|
||||
|
||||
|
||||
config MT7603E_MULTI_INF_SUPPORT
|
||||
bool
|
||||
#default y if !FIRST_IF_NONE && !SECOND_IF_NONE
|
||||
default y
|
||||
|
||||
#config MT7603E_WIFI_BASIC_FUNC
|
||||
# bool "Basic Functions"
|
||||
# select WIRELESS_EXT
|
||||
# select WEXT_SPY
|
||||
# select WEXT_PRIV
|
||||
|
||||
config MT7603E_WSC_INCLUDED
|
||||
bool "WSC (WiFi Simple Config)"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_WSC_V2_SUPPORT
|
||||
bool "WSC V2(WiFi Simple Config Version 2.0)"
|
||||
depends on MT7603E_MMT_WSC_INCLUDED
|
||||
default y
|
||||
config MT7603E_WSC_NFC_SUPPORT
|
||||
bool "WSC out-of-band(NFC)"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
config MT7603E_DOT11N_DRAFT3
|
||||
bool "802.11n Draft3"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
#config MT7603E_DOT11_VHT_AC
|
||||
# bool "802.11 ac"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_DOT11W_PMF_SUPPORT
|
||||
bool "PMF Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_TXBF_SUPPORT
|
||||
bool "Tx Bean Forming Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_WMM_ACM_SUPPORT
|
||||
# bool "WMM ACM"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_LLTD_SUPPORT
|
||||
bool "LLTD (Link Layer Topology Discovery Protocol)"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_QOS_DLS_SUPPORT
|
||||
bool "802.11e DLS ((Direct-Link Setup) Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WAPI_SUPPORT
|
||||
bool "WAPI Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_CARRIER_DETECTION_SUPPORT
|
||||
bool "Carrier Detect"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_IGMP_SNOOP_SUPPORT
|
||||
bool "IGMP Snooping"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_BLOCK_NET_IF
|
||||
bool "NETIF Block"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
help
|
||||
Support Net interface block while Tx-Sw queue full
|
||||
|
||||
#config MT7603E_MT_TXBF_SUPPORT
|
||||
# bool "Tx Bean Forming Support (Only 3883)"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT2883 || RALINK_RT3883
|
||||
# default n
|
||||
|
||||
#config MT7603E_MT_VIDEO_TURBINE_SUPPORT
|
||||
# bool "Video Turbine support"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_RATE_ADAPTION
|
||||
# tristate "Ralink Flow Classifier"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_NEW_RATE_ADAPT_SUPPORT
|
||||
bool "New Rate Adaptation support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_MT_NEW_RATE_ADAPT_SUPPORT
|
||||
bool "Intelligent Rate Adaption"
|
||||
# depends on WIFI_DRIVER && MT_RATE_ADAPTION
|
||||
default y
|
||||
|
||||
config MT7603E_AGS_SUPPORT
|
||||
bool "Adaptive Group Switching"
|
||||
depends on MT7603E_MT_RATE_ADAPTION
|
||||
default n
|
||||
|
||||
config MT7603E_IDS_SUPPORT
|
||||
bool "IDS (Intrusion Detection System) Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_WORK_QUEUE
|
||||
bool "Work Queue"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_SKB_RECYCLE
|
||||
bool "SKB Recycle(Linux)"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_FLASH_SUPPORT
|
||||
bool "Flash Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_LED_CONTROL_SUPPORT
|
||||
bool "LED Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_SINGLE_SKU
|
||||
bool "Single SKU"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_SINGLE_SKU_V2
|
||||
bool "Single SKU V2"
|
||||
depends on MT7603E_SINGLE_SKU && RALINK_RT6352
|
||||
default n
|
||||
|
||||
config MT7603E_HW_ANTENNA_DIVERSITY
|
||||
bool "Antenna Diversity Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT || MT7603E_RLT_STA_SUPPORT
|
||||
depends on RALINK_RT5350
|
||||
default n
|
||||
|
||||
config MT7603E_ATE_SUPPORT
|
||||
bool "ATE/QA Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_RT2860V2_AP_V24_DATA_STRUCTURE
|
||||
bool
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_RT2860V2_AP_32B_DESC
|
||||
bool "32 Byte Descriptor Support"
|
||||
# depends on WIFI_DRIVER
|
||||
depends on RALINK_RT6352 || RALINK_MT7620
|
||||
default n
|
||||
|
||||
config MT7603E_MEMORY_OPTIMIZATION
|
||||
bool "Memory Optimization"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_RTMP_INTERNAL_TX_ALC
|
||||
# bool "TSSI Compensation"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352
|
||||
# default n
|
||||
|
||||
#config MT7603E_RTMP_TEMPERATURE_CALIBRATION
|
||||
# bool "Temperature Calibration"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT6352
|
||||
# default n
|
||||
|
||||
config MT7603E_HOTSPOT
|
||||
bool "Passpoint-R1"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_MT_HOTSPOT_R2
|
||||
bool "Passpoint Release-2 Support"
|
||||
depends on HOTSPOT
|
||||
select MT7603E_MT_DOT11W_PMF_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_MT_RTMP_TEMPERATURE_TX_ALC
|
||||
bool "Temperature Tx Power Compensation"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_UAPSD
|
||||
bool "UAPSD support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
|
||||
#
|
||||
# Section for chip architectures
|
||||
#
|
||||
# "RLT MAC Support"
|
||||
config MT7603E_RLT_MAC
|
||||
bool
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RLT_BBP
|
||||
bool
|
||||
|
||||
config MT7603E_RLT_RF
|
||||
bool
|
||||
|
||||
# "RTMP MAC Support"
|
||||
config MT7603E_RTMP_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_BBP
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_RF
|
||||
bool
|
||||
|
||||
#config MT7603E_MT_EPA_ELNA
|
||||
# bool "ePAeLNA"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
#choice
|
||||
# prompt "PA,LNA Type"
|
||||
# depends on MT7603E_MT_WIFI
|
||||
#
|
||||
# config MT7603E_MT_IPA_ILNA
|
||||
# bool "iPAiLNA"
|
||||
#
|
||||
# config MT7603E_MT_IPA_ELNA
|
||||
# bool "iPAeLNA"
|
||||
#
|
||||
# config MT7603E_MT_EPA_ILNA
|
||||
# bool "ePAiLNA"
|
||||
#
|
||||
# config MT7603E_MT_EPA_ELNA
|
||||
# bool "ePAeLNA"
|
||||
#endchoice
|
||||
#
|
||||
#config MT7603E_MT_PA_LNA
|
||||
# string
|
||||
# depends on MT7603E_MT_WIFI
|
||||
# default "iPAiLNA" if MT7603E_MT_IPA_ILNA
|
||||
# default "iPAeLNA" if MT7603E_MT_IPA_ELNA
|
||||
# default "ePAiLNA" if MT7603E_MT_EPA_ILNA
|
||||
# default "ePAeLNA" if MT7603E_MT_EPA_ELNA
|
||||
#
|
||||
#
|
||||
# Section for chip architectures
|
||||
#
|
||||
# "RLT MAC Support"
|
||||
#config MT7603E_RLT_MAC
|
||||
# bool
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_RLT_BBP
|
||||
# bool
|
||||
|
||||
#config MT7603E_RLT_RF
|
||||
# bool
|
||||
|
||||
# "RTMP MAC Support"
|
||||
#config MT7603E_RTMP_MAC
|
||||
# bool
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_RTMP_BBP
|
||||
# bool
|
||||
|
||||
#config MT7603E_RTMP_RF
|
||||
# bool
|
||||
|
||||
#
|
||||
# Section for interfaces
|
||||
#
|
||||
config MT7603E_RTMP_PCI_SUPPORT
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_USB_SUPPORT
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_RBUS_SUPPORT
|
||||
bool
|
||||
|
||||
endmenu
|
||||
|
||||
menu "WiFi Operation Modes"
|
||||
choice
|
||||
prompt "Main Mode"
|
||||
default MT7603E_MT_WIFI_MODE_AP
|
||||
|
||||
config MT7603E_MT_WIFI_MODE_AP
|
||||
bool "AP"
|
||||
|
||||
config MT7603E_MT_WIFI_MODE_STA
|
||||
bool "STA"
|
||||
|
||||
config MT7603E_MT_WIFI_MODE_BOTH
|
||||
bool "APSTA"
|
||||
endchoice
|
||||
|
||||
if MT7603E_MT_WIFI_MODE_AP || MT7603E_MT_WIFI_MODE_BOTH
|
||||
|
||||
config MT7603E_RLT_AP_SUPPORT
|
||||
tristate "UnifyMAC 802.11n AP support"
|
||||
default y
|
||||
# depends on NET_RADIO
|
||||
select WIRELESS_EXT
|
||||
select WEXT_SPY
|
||||
select WEXT_PRIV
|
||||
|
||||
config MT7603E_WDS_SUPPORT
|
||||
bool "WDS"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_MBSS_SUPPORT
|
||||
bool "MBSSID"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default y
|
||||
|
||||
config MT7603E_NEW_MBSSID_MODE
|
||||
bool "New MBSSID MODE"
|
||||
depends on MT7603E_RLT_AP_SUPPORT && MT7603E_MBSS_SUPPORT
|
||||
# depends on RALINK_RT3883 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352 || RALINK_MT7620 || RALINK_MT7621
|
||||
default n
|
||||
|
||||
config MT7603E_ENHANCE_NEW_MBSSID_MODE
|
||||
bool "Enhanced MBSSID mode"
|
||||
depends on MT7603E_NEW_MBSSID_MODE
|
||||
default n
|
||||
config MT7603E_CFG80211_SUPPORT
|
||||
bool "CFG80211"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_SNIFFER_MIB_CMD
|
||||
bool "SNIFFER_MIB_CMD"
|
||||
depends on MT7603E_SNIFFER_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_ALL_NET_EVENT
|
||||
bool "ALL_NET_EVENT"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_ACL_V2_SUPPORT
|
||||
bool "ACL_V2"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
|
||||
config MT7603E_APCLI_SUPPORT
|
||||
bool "AP-Client Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default y
|
||||
config MT7603E_MULTI_APCLI_SUPPORT
|
||||
bool "MULTI AP-Client Support"
|
||||
depends on MT7603E_APCLI_SUPPORT
|
||||
default y
|
||||
config MT7603E_MAC_REPEATER_SUPPORT
|
||||
bool "MAC Repeater Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
depends on MT7603E_APCLI_SUPPORT
|
||||
depends on RALINK_RT6352 || RALINK_MT7620 || MT7603E_RALINK_MT7603E
|
||||
default y
|
||||
config MT7603E_AIRPLAY_SUPPORT
|
||||
bool "AirPlay Support"
|
||||
depends on MT7603E_APCLI_SUPPORT
|
||||
|
||||
#config MT7603E_MT_MESH_SUPPORT
|
||||
# bool "MESH Support"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_DFS_SUPPORT
|
||||
bool "DFS"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
select RALINK_TIMER_DFS
|
||||
|
||||
#config MT7603E_DOT11R_FT_SUPPORT
|
||||
# bool "802.11r Fast BSS Transition"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
#config MT7603E_DOT11K_RRM_SUPPORT
|
||||
# bool "802.11k Radio Resource Management"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_LLTD_SUPPORT
|
||||
bool "LLTD (Link Layer Topology Discovery Protocol)"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default y
|
||||
|
||||
config MT7603E_NINTENDO_AP
|
||||
bool "Nintendo AP"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_COC_SUPPORT
|
||||
bool "CoC Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default n
|
||||
|
||||
#config MT7603E_ RT2860V2_SNMP
|
||||
# bool "Net-SNMP Support"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_MCAST_RATE_SPECIFIC
|
||||
bool "User specific tx rate of mcast pkt"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
config MT7603E_PREVENT_ARP_SPOOFING_SUPPORT
|
||||
bool "Detect ARP spoof pkts attack"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
#config MT7603E_EXT_BUILD_CHANNEL_LIST
|
||||
# bool "Extension Channel List"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
#config MT7603E_AUTO_CH_SELECT_ENHANCE
|
||||
# bool "Auto Channel Selection Enhancement"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_MULTI_CORE_SUPPORT
|
||||
bool "multi core support"
|
||||
depends on TARGET_ramips_mt7621
|
||||
default n
|
||||
|
||||
endif
|
||||
|
||||
source "./src/mt7603_wifi_ap/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
#"MT7603E"
|
||||
config MT7603E_RALINK_MT7603E
|
||||
bool
|
||||
default y
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
endif
|
||||
|
||||
#if MT7603E_RLT_MAC
|
||||
# config MT7603E_RLT_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if MT7603E_RTMP_MAC
|
||||
# config MT7603E_RTMP_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if MT7603E_MT_MAC
|
||||
if MT7603E_RALINK_MT7603E
|
||||
config MT7603E_MT_MAC
|
||||
bool
|
||||
default y
|
||||
endif
|
||||
#endif MT7603E_MT_WIFI
|
||||
#endif
|
||||
#endif FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
endif
|
96
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/History.txt
Normal file
96
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/History.txt
Normal file
@ -0,0 +1,96 @@
|
||||
Release Note:
|
||||
|
||||
[V4.0.0.7]
|
||||
Host Driver:
|
||||
1. Bug fixed for TGn 4.2.12 PMK caching and 4.2.11 pre-authentication issue.
|
||||
2. Bug fixed for 802.1x issue of WEP encryption.
|
||||
3. Add UAPSD support.
|
||||
4. Add APCLI_AUTO_CONNECT_SUPPORT function.
|
||||
5. Fix MCU INT CR read/write issue.
|
||||
6. modify rate retry rule.
|
||||
7. Fix QA tool: check the writing length to write all to flash.
|
||||
8. Fix memory leak issue when command TxPwr send fail.
|
||||
9. Fix MT7603E load fw fail issue that need to adjust PCIe LDO setting to 1.2V.
|
||||
10. Fix the WSC config status( in beacon & probe resp ) is wrong when we key the wrong DUT's enrolee PIN.
|
||||
11. ATE tool:
|
||||
a. fix txpower can not be set at ATE mode issue.
|
||||
b. Add code for TxTone Power HQADLL command and iwpriv.
|
||||
12. Fix Makefile/Kconfig:
|
||||
a. we should use CONFIG_SINGLE_SKU_V2, not CONFIG_SINGLE_SKU.
|
||||
b. Remove RTMP_TEMPERATURE_TX_ALC because this driver flag is not valid. (controlled by FW)
|
||||
|
||||
F/W:
|
||||
1. Add EDCA and Slot time set command.
|
||||
2. Enable and update CCK_MRC fix.
|
||||
3. Enable TX PA dynamic GC
|
||||
4. Support negative TMAC PWR
|
||||
5. Set CR_TSSI_PA_OFFSET_HPA
|
||||
6. Lower WF0/WF1 TSSI ON TH to 0dBm
|
||||
|
||||
|
||||
[V4.0.0.6 ]
|
||||
Host Driver:
|
||||
1.Add tx power percentage function for iPA
|
||||
2. Modify AP PS, use CR replace AP PS CMD
|
||||
3.fix apcli vs DIR655 IOT can't set ba size to 21
|
||||
4.Set MSSID *7, iPhone5 connect then ping overnight, still ping fail (?¶çˆ¾PSE Redirection bit被è?èµ? STA ping fail)
|
||||
for ps retrieve function, rename "token_enq_fail" to "token_enq_all_fail" to let it more clear.
|
||||
5. MT7603 auto rate update
|
||||
6. Fix [AP][TGn]:4.2.47 Power Save, fail on step 8,each PS poll the station sends to the APUT, the APUT is expected to send only one directed data packet in response.
|
||||
7. Fix TGn 4.2.11 & 4.2.12 PMK cache is delete in Auth. Req.
|
||||
8. add PSE logical reset when detect pse abonormal condition
|
||||
9. add sw based PDMA watchdog to detect & recovery PDMA TX/RX hang
|
||||
|
||||
F/W:
|
||||
Fix PCIE FW download fail when sw reboot, reset HIF then trigger WDT.
|
||||
1. Add DMA scheduler workaround.
|
||||
2. Add Admission control.
|
||||
3. Add TX power % support.
|
||||
|
||||
|
||||
[MT7603E_DPA_LinuxAP_4.0.0.5_20140511]
|
||||
1. Fixed Cal Free IC eeprom endian issue.
|
||||
2. Fixed IOT issue with Linksys WUSB6300.
|
||||
3. AP-client repeater: fixed icv error when authmode/encryptype update.
|
||||
4. Fixed crash issue that tasklet for processing pci dma done for mcu cmd sometimes will execute after event tasklet.
|
||||
5. Update auto fall back config and algorithm.
|
||||
6. Update firmware to fixed FW re-download fail issue.
|
||||
7. Do 802.11 header endian swap for ps retrieve packet.
|
||||
8. Fixed LED command big endian issue.
|
||||
9. Fixed MlmeHardTransmitTxRing cache flush issue that will cause memory for dma and cache non sync at big endian platform.
|
||||
10. Modify check en/disable RTS/CTS conditions.
|
||||
11. Fixed radio on/off cmd parameters to correct value.
|
||||
12. Update patch for flash mode.
|
||||
13. Fixed LED RadioOff issue.
|
||||
14. ATE:
|
||||
a. fixed Tx/Rx antenna switch resulting wrong Tx power level work around.
|
||||
b. patch PCIE ASPM write efuse Add PCIe Compile flag.
|
||||
c. add iwpriv TXCONT
|
||||
d. add iwpriv for carrier suppression test TXCARR
|
||||
e. Initialize Tx power with EEPROM array when ATESTART
|
||||
f. Fix CONFIG_QA blocking setting power when only CONFIG_ATE is chosen
|
||||
|
||||
|
||||
[MT7603E_DPA_LinuxAP_4.0.0.4_20140411]
|
||||
1. Support IGMP Snooping function.
|
||||
2. Fix NewRateAdapt Error in STA mode.
|
||||
3. Fixed apcli ICV error issue to decrypt Broadcast packet from AP.
|
||||
4. Fixed BAR issues:
|
||||
a. Change SW BAR rate to CCK 1M.
|
||||
b. Send SW BAR for ap power saving to refresh peer sta side reordering buffer (Intel IOT).
|
||||
c. Add SW BAR mechanism which SN will control by wtbl per tid.
|
||||
d. Considering the BAR data rate in both 2.4G & 5G
|
||||
e. SendRefreshBar when recv. CmdPsClearRsp, this modify will make sure the 1st. packet in PSE is BAR after PS.
|
||||
5. Update new firmware for BBP issue.
|
||||
6. Upload E1/E2 default EEPROM bin file.
|
||||
7. Fixed ATE bugs for Tx power setting, BW40 channel control, and Rx issue.
|
||||
8. Change MAX_NUMBER_OF_MAC definition to support 32 association STAs.
|
||||
9. Correct ApCli entry setting to fix throughput issue.
|
||||
10. Fix sometimes software tx will stuck since Intel STA in ps mode is very frequently.
|
||||
11. Fine tune TXOP settings.
|
||||
12. Fixed the bug when spatial extension on/off.
|
||||
13. Fixed AP client TKIP/WEP connection issue with Broadcom AP.
|
||||
|
||||
|
||||
[MT7603E_DPA_LinuxAP_4.0.0.4_20140401]
|
||||
1. Init AP Driver version
|
533
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/Kconfig
Normal file
533
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/Kconfig
Normal file
@ -0,0 +1,533 @@
|
||||
if FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
config MT7603E_RLT_WIFI
|
||||
tristate "RLT 7603 WIFI Driver"
|
||||
select MT7603E_WIFI_BASIC_FUNC if MT7603E_RLT_WIFI
|
||||
|
||||
config MT7603E_MT_WIFI_PATH
|
||||
string
|
||||
depends on MT7603E_RLT_WIFI
|
||||
default "rlt_wifi"
|
||||
|
||||
if MT7603E_RLT_WIFI
|
||||
menu "WiFi Generic Feature Options"
|
||||
|
||||
if FIRST_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 1st Card"
|
||||
depends on ! FIRST_IF_NONE
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
endchoice
|
||||
|
||||
config MT7603E_RT_FIRST_CARD_EEPROM
|
||||
string
|
||||
depends on ! FIRST_IF_NONE
|
||||
default "prom" if MT7603E_FIRST_IF_EEPROM_PROM
|
||||
default "efuse" if MT7603E_FIRST_IF_EEPROM_EFUSE
|
||||
default "flash" if MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
endif
|
||||
# endif FIRST_IF_MT7603E
|
||||
|
||||
if SECOND_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 2nd Card"
|
||||
depends on ! SECOND_IF_NONE
|
||||
|
||||
config MT7603E_SECOND_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config MT7603E_SECOND_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
|
||||
config MT7603E_SECOND_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
endchoice
|
||||
|
||||
config MT7603E_RT_SECOND_CARD_EEPROM
|
||||
string
|
||||
depends on ! SECOND_IF_NONE
|
||||
default "prom" if MT7603E_SECOND_IF_EEPROM_PROM
|
||||
default "efuse" if MT7603E_SECOND_IF_EEPROM_EFUSE
|
||||
default "flash" if MT7603E_SECOND_IF_EEPROM_FLASH
|
||||
endif
|
||||
#endif SECOND_IF_MT7603E
|
||||
|
||||
config MT7603E_MULTI_INF_SUPPORT
|
||||
bool
|
||||
default y if !FIRST_IF_NONE && !SECOND_IF_NONE
|
||||
|
||||
config MT7603E_WIFI_BASIC_FUNC
|
||||
bool "Basic Functions"
|
||||
select WIRELESS_EXT
|
||||
select WEXT_SPY
|
||||
select WEXT_PRIV
|
||||
|
||||
config MT7603E_WSC_INCLUDED
|
||||
bool "WSC (WiFi Simple Config)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_WSC_V2_SUPPORT
|
||||
bool "WSC V2(WiFi Simple Config Version 2.0)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_WSC_NFC_SUPPORT
|
||||
bool "WSC out-of-band(NFC)"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_DOT11N_DRAFT3
|
||||
bool "802.11n Draft3"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_DOT11_VHT_AC
|
||||
# bool "802.11 ac"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_DOT11W_PMF_SUPPORT
|
||||
bool "PMF"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
#config MT7603E_TXBF_SUPPORT
|
||||
# bool "Tx Bean Forming Support"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_WMM_ACM_SUPPORT
|
||||
# bool "WMM ACM"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_LLTD_SUPPORT
|
||||
bool "LLTD (Link Layer Topology Discovery Protocol)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_QOS_DLS_SUPPORT
|
||||
bool "802.11e DLS ((Direct-Link Setup) Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
|
||||
config MT7603E_WAPI_SUPPORT
|
||||
bool "WAPI Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_CARRIER_DETECTION_SUPPORT
|
||||
bool "Carrier Detect"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_IGMP_SNOOP_SUPPORT
|
||||
bool "IGMP Snooping"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_BLOCK_NET_IF
|
||||
bool "NETIF Block"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
help
|
||||
Support Net interface block while Tx-Sw queue full
|
||||
|
||||
config MT7603E_TXBF_SUPPORT
|
||||
bool "Tx Bean Forming Support (Only 3883)"
|
||||
depends on WIFI_DRIVER
|
||||
depends on RALINK_RT2883 || RALINK_RT3883
|
||||
default n
|
||||
#
|
||||
# optimize dma cache mapping for internal mips platform
|
||||
#
|
||||
config MT7603E_DMA_CACHE_OPTIMIZE
|
||||
bool "optimize dma cache mapping for internal mips platform"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_VIDEO_TURBINE_SUPPORT
|
||||
# bool "Video Turbine support"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_RA_CLASSIFIER
|
||||
# tristate "Ralink Flow Classifier"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_RATE_ADAPTION
|
||||
bool "New Rate Adaptation support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_NEW_RATE_ADAPT_SUPPORT
|
||||
bool "Intelligent Rate Adaption"
|
||||
depends on WIFI_DRIVER && MT7603E_RATE_ADAPTION
|
||||
default y
|
||||
|
||||
config MT7603E_AGS_SUPPORT
|
||||
bool "Adaptive Group Switching"
|
||||
depends on WIFI_DRIVER && MT7603E_RATE_ADAPTION
|
||||
default n
|
||||
|
||||
config MT7603E_IDS_SUPPORT
|
||||
bool "IDS (Intrusion Detection System) Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_WORK_QUEUE
|
||||
bool "Work Queue"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_SKB_RECYCLE
|
||||
bool "SKB Recycle(Linux)"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_PUSH_SUPPORT
|
||||
bool "Config Push Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_EASY_SETUP_SUPPORT
|
||||
# bool "Whole Home Coverage - Easy Setup"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_EVENT_NOTIFIER_SUPPORT
|
||||
bool "Whole Home Coverage - Event Notifier"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_SMART_CARRIER_SENSE_SUPPORT
|
||||
bool "Smart Carrier Sense"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
config MT7603E_MBO_SUPPORT
|
||||
bool "MBO Support"
|
||||
depends on WIFI_DRIVER
|
||||
select INTERWORKING
|
||||
select WNM_SUPPORT
|
||||
select DOT11K_RRM_SUPPORT
|
||||
select DOT11R_FT_SUPPORT
|
||||
select DOT11W_PMF_SUPPORT
|
||||
select PASSPOINT_R2
|
||||
default n
|
||||
config MT7603E_RTMP_FLASH_SUPPORT
|
||||
bool "Flash Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_MWDS_SUPPORT
|
||||
bool "Mixed WDS(MWDS)"
|
||||
default n
|
||||
|
||||
config MT7603E_AIR_MONITOR_SUPPORT
|
||||
bool "Air Monitor Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_STA_FORCE_ROAM_SUPPORT
|
||||
bool "Sta Force Roam Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_ROAMING_ENHANCE_SUPPORT
|
||||
bool "Roaming Enhance Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_FWD_UPDATED
|
||||
bool "Wifi Forwarding Support Update"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_BTCOEX_CONCURRENT
|
||||
bool "Coexisence Event Notify between BT and WiFi"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_LED_CONTROL_SUPPORT
|
||||
bool "LED Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_SINGLE_SKU_V2
|
||||
bool "Single SKU V2"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_HW_ANTENNA_DIVERSITY
|
||||
bool "Antenna Diversity Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT || RLT_STA_SUPPORT
|
||||
depends on RALINK_RT5350
|
||||
default n
|
||||
|
||||
config MT7603E_ATE_SUPPORT
|
||||
bool "ATE/QA Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_RT2860V2_AP_V24_DATA_STRUCTURE
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_RT2860V2_AP_32B_DESC
|
||||
bool "32 Byte Descriptor Support"
|
||||
depends on WIFI_DRIVER
|
||||
depends on MT7603E_RALINK_RT6352 || RALINK_MT7620
|
||||
default n
|
||||
|
||||
config MT7603E_MEMORY_OPTIMIZATION
|
||||
bool "Memory Optimization"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_INTERNAL_TX_ALC
|
||||
bool "TSSI Compensation"
|
||||
depends on WIFI_DRIVER
|
||||
depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350 || MT7603E_RALINK_RT6352
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_TEMPERATURE_CALIBRATION
|
||||
bool "Temperature Calibration"
|
||||
depends on WIFI_DRIVER
|
||||
depends on MT7603E_RALINK_RT6352
|
||||
default n
|
||||
|
||||
config MT7603E_HOTSPOT
|
||||
bool "Passpoint-R1"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_PASSPOINT_R2
|
||||
bool "Passpoint Release-2 Support"
|
||||
depends on MT7603E_HOTSPOT
|
||||
select MT7603E_DOT11W_PMF_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_UAPSD
|
||||
bool "MT7603E_UAPSD support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
#config MT7603E_EPA_ELNA
|
||||
# bool "ePAeLNA"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
choice
|
||||
prompt "PA,LNA Type"
|
||||
depends on MT7603E_RLT_WIFI
|
||||
|
||||
config MT7603E_IPA_ILNA
|
||||
bool "iPAiLNA"
|
||||
|
||||
config MT7603E_IPA_ELNA
|
||||
bool "iPAeLNA"
|
||||
|
||||
config MT7603E_EPA_ILNA
|
||||
bool "ePAiLNA"
|
||||
|
||||
config MT7603E_EPA_ELNA
|
||||
bool "ePAeLNA"
|
||||
endchoice
|
||||
|
||||
config MT7603E_PA_LNA
|
||||
string
|
||||
depends on MT7603E_RLT_WIFI
|
||||
default "iPAiLNA" if MT7603E_IPA_ILNA
|
||||
default "iPAeLNA" if MT7603E_IPA_ELNA
|
||||
default "ePAiLNA" if MT7603E_EPA_ILNA
|
||||
default "ePAeLNA" if MT7603E_EPA_ELNA
|
||||
|
||||
#
|
||||
# Section for chip architectures
|
||||
#
|
||||
# "RLT MAC Support"
|
||||
config MT7603E_RLT_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RLT_BBP
|
||||
bool
|
||||
|
||||
config MT7603E_RLT_RF
|
||||
bool
|
||||
|
||||
# "RTMP MAC Support"
|
||||
config MT7603E_RTMP_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_BBP
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_RF
|
||||
bool
|
||||
|
||||
#
|
||||
# Section for interfaces
|
||||
#
|
||||
config MT7603E_RTMP_PCI_SUPPORT
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_USB_SUPPORT
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_RBUS_SUPPORT
|
||||
bool
|
||||
|
||||
endmenu
|
||||
|
||||
menu "WiFi Operation Modes"
|
||||
choice
|
||||
prompt "Main Mode"
|
||||
default MT7603E_WIFI_MODE_AP
|
||||
|
||||
config MT7603E_WIFI_MODE_AP
|
||||
bool "AP"
|
||||
|
||||
config MT7603E_WIFI_MODE_STA
|
||||
bool "STA"
|
||||
|
||||
config MT7603E_WIFI_MODE_BOTH
|
||||
bool "APSTA"
|
||||
endchoice
|
||||
|
||||
if MT7603E_WIFI_MODE_AP || MT7603E_WIFI_MODE_BOTH
|
||||
source "drivers/net/wireless/mtk/mt7603e/mt7603_wifi_ap/Kconfig"
|
||||
endif
|
||||
|
||||
#if MT7603E_WIFI_MODE_STA || MT7603E_WIFI_MODE_BOTH
|
||||
# source "drivers/net/wireless/rlt_wifi_sta/Kconfig"
|
||||
#endif
|
||||
endmenu
|
||||
|
||||
#"RT2860 series"
|
||||
config MT7603E_RALINK_RT28XX
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT3092"
|
||||
config MT7603E_RALINK_RT3092
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT3572"
|
||||
config MT7603E_RALINK_RT3572
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
#"RT5392"
|
||||
config MT7603E_RALINK_RT5392
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT5572"
|
||||
config MT7603E_RALINK_RT5572
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
#"RT5592"
|
||||
config MT7603E_RALINK_RT5592
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7620/RT6352"
|
||||
config MT7603E_RALINK_RT6352
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_RBUS_SUPPORT
|
||||
# select MT7603E_RTMP_TEMPERATURE_CALIBRATION
|
||||
# select MT7603E_RTMP_INTERNAL_TX_ALC
|
||||
|
||||
#"MT7610E"
|
||||
config MT7603E_RALINK_MT7610E
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7610U"
|
||||
config MT7603E_RALINK_MT7610U
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
#"RT8592"
|
||||
config MT7603E_RALINK_RT8592
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7612E"
|
||||
config MT7603E_RALINK_MT7612E
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7612U"
|
||||
config MT7603E_RALINK_MT7612U
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
#"MT7603E"
|
||||
config MT7603E_RALINK_MT7603E
|
||||
bool
|
||||
default y
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7603U"
|
||||
config MT7603E_RALINK_MT7603U
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
endif
|
||||
|
||||
#if MT7603E_RLT_MAC
|
||||
# config MT7603E_RLT_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if MT7603E_RTMP_MAC
|
||||
# config MT7603E_RTMP_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
if MT7603E_RALINK_MT7603E
|
||||
config MT7603E_MT_MAC
|
||||
bool
|
||||
default y
|
||||
endif
|
||||
|
||||
if MT7603E_RALINK_MT7603U
|
||||
config MT7603E_MT_MAC
|
||||
bool
|
||||
default y
|
||||
endif
|
||||
endif
|
||||
#endif FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
513
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/Kconfig.mt_wifi
Normal file
513
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/Kconfig.mt_wifi
Normal file
@ -0,0 +1,513 @@
|
||||
if FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
config MT_WIFI
|
||||
tristate "MT WIFI Driver"
|
||||
|
||||
config MT_WIFI_PATH
|
||||
string
|
||||
depends on MT_WIFI
|
||||
default "mt_wifi"
|
||||
|
||||
if MT_WIFI
|
||||
menu "WiFi Generic Feature Options"
|
||||
|
||||
if FIRST_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 1st Card"
|
||||
depends on ! FIRST_IF_NONE
|
||||
|
||||
config FIRST_MT_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config FIRST_MT_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
|
||||
config FIRST_MT_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
endchoice
|
||||
|
||||
config RT_FIRST_CARD_EEPROM
|
||||
string
|
||||
depends on ! FIRST_IF_NONE
|
||||
default "prom" if FIRST_MT_IF_EEPROM_PROM
|
||||
default "efuse" if FIRST_MT_IF_EEPROM_EFUSE
|
||||
default "flash" if FIRST_MT_IF_EEPROM_FLASH
|
||||
endif
|
||||
# endif FIRST_IF_MT7603E
|
||||
|
||||
if SECOND_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 2nd Card"
|
||||
depends on ! SECOND_IF_NONE
|
||||
|
||||
config SECOND_MT_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config SECOND_MT_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
|
||||
config SECOND_MT_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
endchoice
|
||||
|
||||
config RT_SECOND_CARD_EEPROM
|
||||
string
|
||||
depends on ! SECOND_IF_NONE
|
||||
default "prom" if SECOND_MT_IF_EEPROM_PROM
|
||||
default "efuse" if SECOND_MT_IF_EEPROM_EFUSE
|
||||
default "flash" if SECOND_MT_IF_EEPROM_FLASH
|
||||
endif
|
||||
#endif SECOND_IF_MT7603E
|
||||
|
||||
config MULTI_INF_SUPPORT
|
||||
bool
|
||||
default y if !FIRST_IF_NONE && !SECOND_IF_NONE
|
||||
|
||||
#config WIFI_BASIC_FUNC
|
||||
# bool "Basic Functions"
|
||||
# select WIRELESS_EXT
|
||||
# select WEXT_SPY
|
||||
# select WEXT_PRIV
|
||||
|
||||
config MT_WSC_INCLUDED
|
||||
bool "WSC (WiFi Simple Config)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_WSC_V2_SUPPORT
|
||||
bool "WSC V2(WiFi Simple Config Version 2.0)"
|
||||
depends on MT_WSC_INCLUDED
|
||||
default y
|
||||
|
||||
config MT_DOT11N_DRAFT3
|
||||
bool "802.11n Draft3"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_DOT11_VHT_AC
|
||||
bool "802.11 ac"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config WSC_NFC_SUPPORT
|
||||
bool "WSC out-of-band(NFC)"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_DOT11W_PMF_SUPPORT
|
||||
bool "PMF Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_TXBF_SUPPORT
|
||||
bool "Tx Bean Forming Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT_WMM_ACM_SUPPORT
|
||||
# bool "WMM ACM"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT_LLTD_SUPPORT
|
||||
bool "LLTD (Link Layer Topology Discovery Protocol)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_QOS_DLS_SUPPORT
|
||||
bool "802.11e DLS ((Direct-Link Setup) Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_WAPI_SUPPORT
|
||||
bool "WAPI Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_CARRIER_DETECTION_SUPPORT
|
||||
bool "Carrier Detect"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_MBO_SUPPORT
|
||||
bool "MBO Support"
|
||||
depends on WIFI_DRIVER
|
||||
select INTERWORKING
|
||||
select WNM_SUPPORT
|
||||
select DOT11K_RRM_SUPPORT
|
||||
select DOT11R_FT_SUPPORT
|
||||
select DOT11W_PMF_SUPPORT
|
||||
select PASSPOINT_R2
|
||||
default n
|
||||
|
||||
config MT_IGMP_SNOOP_SUPPORT
|
||||
bool "IGMP Snooping"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_BLOCK_NET_IF
|
||||
bool "NETIF Block"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
help
|
||||
Support Net interface block while Tx-Sw queue full
|
||||
|
||||
config MT_DMA_CACHE_OPTIMIZE
|
||||
bool "optimize dma cache mapping for internal mips platform"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT_TXBF_SUPPORT
|
||||
# bool "Tx Bean Forming Support (Only 3883)"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT2883 || RALINK_RT3883
|
||||
# default n
|
||||
|
||||
#config MT_VIDEO_TURBINE_SUPPORT
|
||||
# bool "Video Turbine support"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT_RA_CLASSIFIER
|
||||
# tristate "Ralink Flow Classifier"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT_RATE_ADAPTION
|
||||
bool "New Rate Adaptation support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_NEW_RATE_ADAPT_SUPPORT
|
||||
bool "Intelligent Rate Adaption"
|
||||
depends on WIFI_DRIVER && MT_RATE_ADAPTION
|
||||
default y
|
||||
|
||||
config MT_AGS_SUPPORT
|
||||
bool "Adaptive Group Switching"
|
||||
depends on WIFI_DRIVER && MT_RATE_ADAPTION
|
||||
default n
|
||||
|
||||
config MT_IDS_SUPPORT
|
||||
bool "IDS (Intrusion Detection System) Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_WIFI_WORK_QUEUE
|
||||
bool "Work Queue"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_WIFI_SKB_RECYCLE
|
||||
bool "SKB Recycle(Linux)"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_RTMP_FLASH_SUPPORT
|
||||
bool "Flash Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config CONFIG_PUSH_SUPPORT
|
||||
bool "Config Push Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
config CONFIG_EASY_SETUP_SUPPORT
|
||||
bool "Whole Home Coverage - Easy Setup"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config EVENT_NOTIFIER_SUPPORT
|
||||
bool "Whole Home Coverage - Event Notifier"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
config MWDS_SUPPORT
|
||||
bool "Mixed WDS(MWDS)"
|
||||
default y
|
||||
config AIR_MONITOR_SUPPORT
|
||||
bool "Air Monitor Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config STA_FORCE_ROAM_SUPPORT
|
||||
bool "Sta Force Roam Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config ROAMING_ENHANCE_SUPPORT
|
||||
bool "Roaming Enhance Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config WIFI_FWD_UPDATED
|
||||
bool "Wifi Forwarding Support Update"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_BTCOEX_CONCURRENT
|
||||
bool "Coexisence Event Notify between BT and WiFi"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_LED_CONTROL_SUPPORT
|
||||
bool "LED Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_SINGLE_SKU_V2
|
||||
bool "Single SKU V2"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_HW_ANTENNA_DIVERSITY
|
||||
bool "Antenna Diversity Support"
|
||||
depends on RLT_AP_SUPPORT || RLT_STA_SUPPORT
|
||||
depends on RALINK_RT5350
|
||||
default n
|
||||
|
||||
config MT_ATE_SUPPORT
|
||||
bool "ATE/QA Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_RT2860V2_AP_V24_DATA_STRUCTURE
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_RT2860V2_AP_32B_DESC
|
||||
bool "32 Byte Descriptor Support"
|
||||
depends on WIFI_DRIVER
|
||||
depends on RALINK_RT6352 || RALINK_MT7620
|
||||
default n
|
||||
|
||||
config MT_MEMORY_OPTIMIZATION
|
||||
bool "Memory Optimization"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT_RTMP_INTERNAL_TX_ALC
|
||||
# bool "TSSI Compensation"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352
|
||||
# default n
|
||||
|
||||
#config MT_RTMP_TEMPERATURE_CALIBRATION
|
||||
# bool "Temperature Calibration"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT6352
|
||||
# default n
|
||||
|
||||
config MT_HOTSPOT
|
||||
bool "Passpoint-R1"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_HOTSPOT_R2
|
||||
bool "Passpoint Release-2 Support"
|
||||
depends on HOTSPOT
|
||||
select MT_DOT11W_PMF_SUPPORT
|
||||
default n
|
||||
|
||||
config MT_UAPSD
|
||||
bool "UAPSD support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
#config MT_EPA_ELNA
|
||||
# bool "ePAeLNA"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
choice
|
||||
prompt "PA,LNA Type"
|
||||
depends on MT_WIFI
|
||||
|
||||
config MT_IPA_ILNA
|
||||
bool "iPAiLNA"
|
||||
|
||||
config MT_IPA_ELNA
|
||||
bool "iPAeLNA"
|
||||
|
||||
config MT_EPA_ILNA
|
||||
bool "ePAiLNA"
|
||||
|
||||
config MT_EPA_ELNA
|
||||
bool "ePAeLNA"
|
||||
endchoice
|
||||
|
||||
config MT_PA_LNA
|
||||
string
|
||||
depends on MT_WIFI
|
||||
default "iPAiLNA" if MT_IPA_ILNA
|
||||
default "iPAeLNA" if MT_IPA_ELNA
|
||||
default "ePAiLNA" if MT_EPA_ILNA
|
||||
default "ePAeLNA" if MT_EPA_ELNA
|
||||
|
||||
#
|
||||
# Section for chip architectures
|
||||
#
|
||||
# "RLT MAC Support"
|
||||
config RLT_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config RLT_BBP
|
||||
bool
|
||||
|
||||
config RLT_RF
|
||||
bool
|
||||
|
||||
# "RTMP MAC Support"
|
||||
config RTMP_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config RTMP_BBP
|
||||
bool
|
||||
|
||||
config RTMP_RF
|
||||
bool
|
||||
|
||||
#
|
||||
# Section for interfaces
|
||||
#
|
||||
config RTMP_PCI_SUPPORT
|
||||
bool
|
||||
|
||||
config RTMP_USB_SUPPORT
|
||||
bool
|
||||
|
||||
config RTMP_RBUS_SUPPORT
|
||||
bool
|
||||
|
||||
endmenu
|
||||
|
||||
menu "WiFi Operation Modes"
|
||||
choice
|
||||
prompt "Main Mode"
|
||||
default MT_WIFI_MODE_AP
|
||||
|
||||
config MT_WIFI_MODE_AP
|
||||
bool "AP"
|
||||
|
||||
config MT_WIFI_MODE_STA
|
||||
bool "STA"
|
||||
|
||||
config MT_WIFI_MODE_BOTH
|
||||
bool "APSTA"
|
||||
endchoice
|
||||
|
||||
if MT_WIFI_MODE_AP || MT_WIFI_MODE_BOTH
|
||||
source "drivers/net/wireless/mt_wifi_ap/Kconfig"
|
||||
endif
|
||||
|
||||
#if MT_WIFI_MODE_STA || MT_WIFI_MODE_BOTH
|
||||
# source "drivers/net/wireless/rlt_wifi_sta/Kconfig"
|
||||
#endif
|
||||
endmenu
|
||||
|
||||
#"RT2860 series"
|
||||
config RALINK_RT28XX
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT3092"
|
||||
config RALINK_RT3092
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT3572"
|
||||
config RALINK_RT3572
|
||||
bool
|
||||
default n
|
||||
select RTMP_USB_SUPPORT
|
||||
|
||||
#"RT5392"
|
||||
config RALINK_RT5392
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT5572"
|
||||
config RALINK_RT5572
|
||||
bool
|
||||
default n
|
||||
select RTMP_USB_SUPPORT
|
||||
|
||||
#"RT5592"
|
||||
config RALINK_RT5592
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7620/RT6352"
|
||||
config RALINK_RT6352
|
||||
bool
|
||||
default n
|
||||
select RTMP_RBUS_SUPPORT
|
||||
# select RTMP_TEMPERATURE_CALIBRATION
|
||||
# select RTMP_INTERNAL_TX_ALC
|
||||
|
||||
#"MT7610E"
|
||||
config RALINK_MT7610E
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7610U"
|
||||
config RALINK_MT7610U
|
||||
bool
|
||||
default n
|
||||
select RTMP_USB_SUPPORT
|
||||
|
||||
#"RT8592"
|
||||
config RALINK_RT8592
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7612E"
|
||||
config RALINK_MT7612E
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7612U"
|
||||
config RALINK_MT7612U
|
||||
bool
|
||||
default n
|
||||
select RTMP_USB_SUPPORT
|
||||
|
||||
#"MT7603E"
|
||||
config RALINK_MT7603E
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
endif
|
||||
|
||||
#if RLT_MAC
|
||||
# config RLT_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if RTMP_MAC
|
||||
# config RTMP_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if MT_MAC
|
||||
if RALINK_MT7603E
|
||||
config MT_MAC
|
||||
bool
|
||||
default y
|
||||
endif
|
||||
#endif MT_WIFI
|
||||
endif
|
||||
#endif FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
678
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/Makefile
Normal file
678
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/Makefile
Normal file
@ -0,0 +1,678 @@
|
||||
RT28xx_MODE = AP
|
||||
|
||||
|
||||
|
||||
TARGET = LINUX
|
||||
|
||||
|
||||
# CHIPSET
|
||||
# rt2860, rt2870, rt2880, rt2070, rt3070, rt3090, rt3572, rt3062, rt3562, rt3593, rt3573
|
||||
# rt3562(for rt3592), rt3050, rt3350, rt3352, rt5350, rt5370, rt5390, rt5572, rt5592,
|
||||
# rt8592(for rt85592),
|
||||
# mt7601e, mt7601u,
|
||||
# mt7650e, mt7630e, mt7610e, mt7650u, mt7630u, mt7610u
|
||||
# mt7662e, mt7632e, mt7612e, mt7662u, mt7632u, mt7612u
|
||||
# mt7603e, mt7603u, mt7636u, mt7636s
|
||||
|
||||
|
||||
CHIPSET = mt7603e
|
||||
|
||||
|
||||
MODULE = $(word 1, $(CHIPSET))
|
||||
|
||||
#OS ABL - YES or NO
|
||||
OSABL = NO
|
||||
|
||||
#Build Prealloc ko
|
||||
PREALLOC = NO
|
||||
|
||||
ifneq ($(TARGET),THREADX)
|
||||
#RT28xx_DIR = home directory of RT28xx source code
|
||||
RT28xx_DIR = $(shell pwd)
|
||||
endif
|
||||
|
||||
include $(RT28xx_DIR)/os/linux/config.mk
|
||||
|
||||
RTMP_SRC_DIR = $(RT28xx_DIR)/RT$(MODULE)
|
||||
|
||||
#PLATFORM: Target platform
|
||||
PLATFORM = PC
|
||||
#PLATFORM = MT53XX
|
||||
#PLATFORM = PC_AUTO_BUILD
|
||||
#PLATFORM = BB_SOC
|
||||
#PLATFORM = 5VT
|
||||
#PLATFORM = IKANOS_V160
|
||||
#PLATFORM = IKANOS_V180
|
||||
#PLATFORM = SIGMA
|
||||
#PLATFORM = SIGMA_8622
|
||||
#PLATFORM = INIC
|
||||
#PLATFORM = STAR
|
||||
#PLATFORM = IXP
|
||||
#PLATFORM = INF_TWINPASS
|
||||
#PLATFORM = INF_DANUBE
|
||||
#PLATFORM = INF_AR9
|
||||
#PLATFORM = INF_VR9
|
||||
#PLATFORM = BRCM_6358
|
||||
#PLATFORM = INF_AMAZON_SE
|
||||
#PLATFORM = CAVM_OCTEON
|
||||
#PLATFORM = CMPC
|
||||
#PLATFORM = RALINK_2880
|
||||
#PLATFORM = RALINK_3052
|
||||
#PLATFORM = SMDK
|
||||
#PLATFORM = RMI
|
||||
#PLATFORM = RMI_64
|
||||
#PLATFORM = KODAK_DC
|
||||
#PLATFORM = DM6446
|
||||
#PLATFORM = FREESCALE8377
|
||||
#PLATFORM = BL2348
|
||||
#PLATFORM = BL23570
|
||||
#PLATFORM = BLUBB
|
||||
#PLATFORM = BLPMP
|
||||
#PLATFORM = MT85XX
|
||||
#PLATFORM = NXP_TV550
|
||||
#PLATFORM = MVL5
|
||||
#PLATFORM = RALINK_3352
|
||||
#PLATFORM = UBICOM_IPX8
|
||||
#PLATFORM = INTELP6
|
||||
#PLATFORM = MT7620
|
||||
#PLATFORM = MT7621
|
||||
#PLATFORM = MSTAR
|
||||
|
||||
#APSOC
|
||||
ifeq ($(MODULE),3050)
|
||||
PLATFORM = RALINK_3050
|
||||
endif
|
||||
ifeq ($(MODULE),3052)
|
||||
PLATFORM = RALINK_3052
|
||||
endif
|
||||
ifeq ($(MODULE),3350)
|
||||
PLATFORM = RALINK_3050
|
||||
endif
|
||||
ifeq ($(MODULE),3352)
|
||||
PLATFORM = RALINK_3352
|
||||
endif
|
||||
ifeq ($(CHIPSET),mt7628)
|
||||
PLATFORM = MT7628
|
||||
endif
|
||||
|
||||
#RELEASE Package
|
||||
RELEASE = DPA
|
||||
|
||||
|
||||
ifeq ($(TARGET),LINUX)
|
||||
MAKE = make
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET), UCOS)
|
||||
MAKE = make
|
||||
endif
|
||||
ifeq ($(TARGET),THREADX)
|
||||
MAKE = gmake
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET), ECOS)
|
||||
MAKE = make
|
||||
MODULE = $(shell pwd | sed "s/.*\///" ).o
|
||||
export MODULE
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BB_SOC)
|
||||
LINUX_SRC = $(KERNEL_DIR)
|
||||
#CROSS_COMPILE = /opt/trendchip/mips-linux-uclibc/usr/bin/mips-linux-uclibc-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),5VT)
|
||||
LINUX_SRC = /home/ralink-2860-sdk-5vt-distribution/linux-2.6.17
|
||||
CROSS_COMPILE = /opt/crosstool/uClibc_v5te_le_gcc_4_1_1/bin/arm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),UBICOM_IPX8)
|
||||
LINUX_SRC = /home/sample/Customers/UBICOM/ubicom-linux-dist-2.1.1/linux-2.6.x
|
||||
CROSS_COMPILE = ubicom32-elf-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IKANOS_V160)
|
||||
LINUX_SRC = /home/sample/projects/LX_2618_RG_5_3_00r4_SRC/linux-2.6.18
|
||||
CROSS_COMPILE = mips-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IKANOS_V180)
|
||||
LINUX_SRC = /home/sample/projects/LX_BSP_VX180_5_4_0r1_ALPHA_26DEC07/linux-2.6.18
|
||||
CROSS_COMPILE = mips-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),SIGMA)
|
||||
LINUX_SRC = /root/sigma/smp86xx_kernel_source_2.7.172.0/linux-2.6.15
|
||||
CROSS_COMPILE = /root/sigma/smp86xx_toolchain_2.7.172.0/build_mipsel_nofpu/staging_dir/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),SIGMA_8622)
|
||||
LINUX_SRC = /home/snowpin/armutils_2.5.120.1/build_arm/linux-2.4.22-em86xx
|
||||
CROSS_COMPILE = /home/snowpin/armutils_2.5.120.1/toolchain/bin/arm-elf-
|
||||
CROSS_COMPILE_INCLUDE = /home/snowpin/armutils_2.5.120.1/toolchain/lib/gcc-lib/arm-elf/2.95.3
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INIC)
|
||||
UCOS_SRC = /opt/uCOS/iNIC_rt2880
|
||||
CROSS_COMPILE = /usr/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),STAR)
|
||||
LINUX_SRC = /opt/star/kernel/linux-2.4.27-star
|
||||
CROSS_COMPILE = /opt/star/tools/arm-linux/bin/arm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),RMI)
|
||||
LINUX_SRC = /opt/rmi/1.7.0/linux/src/
|
||||
CROSS_COMPILE = /opt/rmi/1.7.0/mipscross/nptl/bin/mips64-unknown-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),RMI_64)
|
||||
LINUX_SRC = /opt/rmi/1.7.0/linux_64/src/
|
||||
CROSS_COMPILE = /opt/rmi/1.7.0/mipscross/nptl/bin/mips64-unknown-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM), RALINK_2880)
|
||||
LINUX_SRC = /project/stable/RT288x/RT288x_SDK/source/linux-2.4.x
|
||||
CROSS_COMPILE = /opt/buildroot-gdb/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),RALINK_3052)
|
||||
LINUX_SRC = /home/peter/ap_soc/SDK_3_3_0_0/RT288x_SDK/source/linux-2.6.21.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-uclibc-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),FREESCALE8377)
|
||||
LINUX_SRC = /opt/ltib-mpc8377_rds-20090309/rpm/BUILD/linux-2.6.25
|
||||
CROSS_COMPILE = /opt/freescale/usr/local/gcc-4.2.187-eglibc-2.5.187/powerpc-linux-gnu/bin/powerpc-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BL2348)
|
||||
LINUX_SRC = /home/sample/Customers/BroadLight/bl234x-linux-2.6.21-small-v29
|
||||
CROSS_COMPILE = mips-wrs-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BL23570)
|
||||
LINUX_SRC = /home/FIBERHOME/linux-2.6.34.8
|
||||
CROSS_COMPILE = mips-wrs-linux-gnu-mips_74k_softfp-glibc_small-
|
||||
ARCH:=mips
|
||||
export $ARCH
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(PLATFORM),BLUBB)
|
||||
LINUX_SRC = /home/sample/Customers/BroadLight/UBB/gmp20/linux-2.6.21-small
|
||||
CROSS_COMPILE = mips-wrs-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BLPMP)
|
||||
LINUX_SRC = /home/sample/Customers/BroadLight/UBB/pmp16/bl234x-linux-2.6.21-small-v30.2
|
||||
CROSS_COMPILE = mips-wrs-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),PC)
|
||||
# Linux 2.6
|
||||
LINUX_SRC = /lib/modules/$(shell uname -r)/build
|
||||
# Linux 2.4 Change to your local setting
|
||||
#LINUX_SRC = /usr/src/linux-2.4
|
||||
LINUX_SRC_MODULE = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless/
|
||||
CROSS_COMPILE =
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INTELP6)
|
||||
LINUX_SRC = /tftpboot/IntelCE-20.0.11052.243193/project_build_i686/IntelCE/kernel-20.0.11024.238456/linux-2.6.35
|
||||
CROSS_COMPILE = /tftpboot/IntelCE-20.0.11052.243193/build_i686/i686-linux-elf/bin/i686-cm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IXP)
|
||||
LINUX_SRC = /project/stable/Gmtek/snapgear-uclibc/linux-2.6.x
|
||||
CROSS_COMPILE = arm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_TWINPASS)
|
||||
# Linux 2.6
|
||||
#LINUX_SRC = /lib/modules/$(shell uname -r)/build
|
||||
# Linux 2.4 Change to your local setting
|
||||
LINUX_SRC = /project/stable/twinpass/release/2.0.1/source/kernel/opensource/linux-2.4.31/
|
||||
CROSS_COMPILE = mips-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_DANUBE)
|
||||
LINUX_SRC = /opt/danube/sdk/linux-2.6.16.x
|
||||
CROSS_COMPILE = mips-linux-
|
||||
ROOTDIR = /opt/danube/sdk
|
||||
export ROOTDIR
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_AR9)
|
||||
LINUX_SRC = /root/ar9/xR9_BSP1.2.2.0/source/kernel/opensource/linux-2.6.20/
|
||||
CROSS_COMPILE = /root/ar9/ifx-lxdb26-1.0.2/gcc-3.4.4/toolchain-mips/bin/
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_VR9)
|
||||
LINUX_SRC = /home/public/lantiq/VR9/UGW-4.2/build_dir/linux-ifxcpe_platform_vr9/linux-2.6.20.19
|
||||
CROSS_COMPILE = /home/public/lantiq/VR9/UGW-4.2/staging_dir/toolchain-mips_gcc-3.4.6_uClibc-0.9.29/bin/mips-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BRCM_6358)
|
||||
LINUX_SRC =
|
||||
CROSS_COMPILE =
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_AMAZON_SE)
|
||||
# Linux 2.6
|
||||
#LINUX_SRC = /lib/modules/$(shell uname -r)/build
|
||||
# Linux 2.4 Change to your local setting
|
||||
LINUX_SRC = /backup/ifx/3.6.2.2/source/kernel/opensource/linux-2.4.31
|
||||
#CROSS_COMPILE = mips-linux-
|
||||
#LINUX_SRC = /project/Infineon/3.6.2.2/source/kernel/opensource/linux-2.4.31
|
||||
CROSS_COMPILE = /opt/uclibc-toolchain/ifx-lxdb-1-2-3-external/gcc-3.3.6/toolchain-mips/R0208V35/mips-linux-uclibc/bin/
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),ST)
|
||||
LINUX_SRC = /opt/STM/STLinux-2.2/devkit/sources/kernel/linux0039
|
||||
CROSS_COMPILE = /opt/STM/STLinux-2.2/devkit/sh4/bin/sh4-linux-
|
||||
ARCH := sh
|
||||
export ARCH
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),CAVM_OCTEON)
|
||||
OCTEON_ROOT = /usr/local/Cavium_Networks/OCTEON-SDK
|
||||
LINUX_SRC = $(OCTEON_ROOT)/linux/kernel_2.6/linux
|
||||
CROSS_COMPILE = mips64-octeon-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),CMPC)
|
||||
LINUX_SRC = /opt/fvt_11N_SDK_0807/fvt131x_SDK_11n/linux-2.6.17
|
||||
CROSS_COMPILE =
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),SMDK)
|
||||
LINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung
|
||||
CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),RALINK_3352)
|
||||
LINUX_SRC = /home/sample/3352/RT288x_SDK/source/linux-2.6.21.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),KODAK_DC)
|
||||
SKD_SRC = C:/SigmaTel/DC1250_SDK_v1-9/sdk
|
||||
CROSS_COMPILE = $(cc)
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),DM6446)
|
||||
LINUX_SRC = /home/fonchi/work/soc/ti-davinci
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
ifeq ($(OSABL),YES)
|
||||
LINUX_SRC = $(RT28xx_DIR)/../../../../../build_linux
|
||||
else
|
||||
LINUX_SRC = $(RT28xx_DIR)/../../../../build_linux
|
||||
endif
|
||||
ifeq ($(CROSS_COMPILE),)
|
||||
CROSS_COMPILE=armv7a-mediatek451_001_vfp-linux-gnueabi-
|
||||
endif
|
||||
CC=$(CROSS_COMPILE)gcc
|
||||
$(warning =============================================)
|
||||
$(warning CC=$(CC) for wifi driver)
|
||||
$(warning =============================================)
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),MT53XX)
|
||||
TARGET = LINUX
|
||||
#****** For system auto build ******
|
||||
#LINUX_SRC=$(KERNEL_OBJ_ROOT)/$(KERNEL_VER)/$(KERNEL_CONFIG)_modules
|
||||
#****** For local build ******
|
||||
# uncomment the following lines
|
||||
VM_LINUX_ROOT ?= $(word 1, $(subst /vm_linux/,/vm_linux /, $(shell pwd)))
|
||||
LINUX_ROOT ?= $(VM_LINUX_ROOT)
|
||||
LINUX_SRC=$(VM_LINUX_ROOT)/output/mtk_android/mt5399_cn_android/rel/obj/kernel/chiling/kernel/linux-3.10/mt5399_android_smp_mod_defconfig_modules
|
||||
OBJ_ROOT ?= $(VM_LINUX_ROOT)/output/mtk_android/mt5399_cn_android/rel/obj
|
||||
export KERNEL_OBJ_ROOT=$(LINUX_SRC)/../..
|
||||
ifeq ($(CROSS_COMPILE),)
|
||||
CROSS_COMPILE=/mtkoss/gnuarm/vfp_4.5.1_2.6.27_cortex-a9-rhel4/i686/bin/armv7a-mediatek451_001_vfp-linux-gnueabi-
|
||||
endif
|
||||
ifeq "$(CC)" "gcc"
|
||||
CC ?= $(CROSS_COMPILE)gcc
|
||||
endif
|
||||
$(warning =============================================)
|
||||
$(warning CC=$(CC) for wifi driver LINUX_SRC=$(LINUX_SRC))
|
||||
$(warning TARGET=$(TARGET))
|
||||
$(warning =============================================)
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),NXP_TV550)
|
||||
LINUX_SRC = /data/tv550/kernel/linux-2.6.28.9
|
||||
LINUX_SRC_MODULE = /data/tv550/kernel/linux-2.6.28.9/drivers/net/wireless
|
||||
CROSS_COMPILE = /opt/embeddedalley/nxp_tv550/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),PC_AUTO_BUILD)
|
||||
LINUX_SRC=/proj/srv_wcnautobuild/external/linux-3.10.59/
|
||||
#CROSS_COMPILE=/proj/srv_wcnautobuild/external/gcc-4.9.2/bin/
|
||||
CROSS_COMPILE=
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(PLATFORM),MVL5)
|
||||
LINUX_SRC = /home2/charlestu/AP-VT3426/linux-2.6.18
|
||||
CROSS_COMPILE = /opt/montavista/pro/devkit/arm/v5t_le_mvl5/bin/arm_v5t_le-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),MT7620)
|
||||
LINUX_SRC = /home/share/src/MT7601/AP/RT288x_SDK/source/linux-2.6.36.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),MT7621)
|
||||
LINUX_SRC = /root/SDK_4_2_0_0/RT288x_SDK/source/linux-2.6.36.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc463/usr/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(PLATFORM),MT7628)
|
||||
LINUX_SRC = /root/Working/MT7628_SDK_2013_0912/RT288x_SDK/source/linux-2.6.36.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(PLATFORM),MSTAR)
|
||||
PREALLOC = YES
|
||||
|
||||
#628 TV Platform
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/628/kernel/RedLion/3.1.10/
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/628/kernel/3.10.23/3.10.23/
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/628/kernel/3.1.10_Madison_TVOS/3.1.10/
|
||||
|
||||
#918 TV Android4.3 Platform
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/918_TV/android4.3/kernel/3.1.10_Napoli_tvos/3.1.10/
|
||||
|
||||
#918 Box Android4.4 Platform
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/toolchain/918_Box_android4.4/3.1.10_Napoli_tvos_0616_new_kernel/3.1.10/
|
||||
|
||||
#928 Box Android4.4 Platform
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/928/928_kernel_0716/3.10.23/
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/928/928_kernel_0722/3.10.23/
|
||||
LINUX_SRC = /proj/mtk05650/share/mstar/928/20140710_KERN-3.10.23-00911089/3.10.23/
|
||||
|
||||
#ToolChian Setting
|
||||
#CROSS_COMPILE = /proj/mtk05650/share/mstar/628/toolchain/arm-2012.09/bin/arm-none-linux-gnueabi-
|
||||
CROSS_COMPILE = /proj/mtk05650/share/mstar/toolchain/arm-2010.09/bin/arm-none-linux-gnueabi-
|
||||
#CROSS_COMPILE = /proj/mtk05650/share/mstar/toolchain/918_Box_android4.4/arm-2012.09/bin/arm-none-linux-gnueabi-
|
||||
#CROSS_COMPILE = /proj/mtk05650/share/mstar/toolchain/918_Box_android4.4/arm-2012.09/bin/arm-none-linux-gnueabi-
|
||||
endif
|
||||
|
||||
export OSABL RT28xx_DIR RT28xx_MODE LINUX_SRC CROSS_COMPILE CROSS_COMPILE_INCLUDE PLATFORM RELEASE CHIPSET MODULE RTMP_SRC_DIR LINUX_SRC_MODULE TARGET HAS_WOW_SUPPORT
|
||||
|
||||
# The targets that may be used.
|
||||
PHONY += all build_tools test UCOS THREADX LINUX release prerelease clean uninstall install libwapi osabl sdk_build_tools
|
||||
|
||||
ifeq ($(TARGET),LINUX)
|
||||
all: build_tools $(TARGET) plug_in
|
||||
else
|
||||
all: $(TARGET)
|
||||
endif
|
||||
|
||||
build_tools:
|
||||
$(MAKE) -C tools
|
||||
$(RT28xx_DIR)/tools/bin2h
|
||||
|
||||
sdk_build_tools:
|
||||
if [ -f $(RT28xx_DIR)/eeprom_log ]; then \
|
||||
rm -f $(RT28xx_DIR)/eeprom_log
|
||||
fi
|
||||
echo $(EE_TYPE) >> eeprom_log
|
||||
echo $(CHIPSET) >> eeprom_log
|
||||
if [ -f $(RT28xx_DIR)/eeprom/SA/MT7603E_EEPROM.bin ]; then \
|
||||
echo 'find SA/MT7603E_EEPROM.bin' >> eeprom_log ; \
|
||||
cp -f $(RT28xx_DIR)/eeprom/SA/MT7603E_EEPROM.bin $(RT28xx_DIR)/eeprom/MT7603E_EEPROM.bin ; \
|
||||
else \
|
||||
cp -f $(RT28xx_DIR)/eeprom/$(EE_TYPE)/MT7603E_EEPROM.bin $(RT28xx_DIR)/eeprom/MT7603E_EEPROM.bin ; \
|
||||
fi
|
||||
$(MAKE) -C tools
|
||||
$(RT28xx_DIR)/tools/bin2h
|
||||
# rm -f $(RT28xx_DIR)/eeprom/SA/MT7603E_EEPROM.bin
|
||||
|
||||
test:
|
||||
$(MAKE) -C tools test
|
||||
|
||||
UCOS:
|
||||
$(MAKE) -C os/ucos/ MODE=$(RT28xx_MODE)
|
||||
echo $(RT28xx_MODE)
|
||||
|
||||
ECOS:
|
||||
$(MAKE) -C os/ecos/ MODE=$(RT28xx_MODE)
|
||||
cp -f os/ecos/$(MODULE) $(MODULE)
|
||||
|
||||
THREADX:
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/Threadx -f $(RT28xx_DIR)/os/ThreadX/Makefile
|
||||
|
||||
LINUX:
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
endif
|
||||
|
||||
cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f os/linux/Makefile.4.netif $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
endif
|
||||
|
||||
ifeq ($(RT28xx_MODE),AP)
|
||||
ifneq ($(PLATFORM),BB_SOC)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_ap.o /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)_ap.o /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)_ap.o /tftpboot
|
||||
endif
|
||||
ifeq ($(PLATFORM),INF_AMAZON_SE)
|
||||
cp -f /tftpboot/rt2870ap.o /backup/ifx/build/root_filesystem/lib/modules/2.4.31-Amazon_SE-3.6.2.2-R0416_Ralink/kernel/drivers/net
|
||||
endif
|
||||
endif
|
||||
else
|
||||
ifeq ($(RT28xx_MODE),APSTA)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_apsta.o /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)_apsta.o /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)_apsta.o /tftpboot
|
||||
endif
|
||||
else
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_sta.o /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)_sta.o /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)_sta.o /tftpboot
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
else
|
||||
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f os/linux/Makefile.6.util $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
endif
|
||||
ifeq ($(PREALLOC), YES)
|
||||
cp -f PREALLOC/os/linux/Makefile.6.prealloc PREALLOC/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/PREALLOC/os/linux modules
|
||||
$(SHELL) cp_prealloc.sh
|
||||
endif
|
||||
cp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile
|
||||
ifeq ($(PLATFORM),DM6446)
|
||||
$(MAKE) ARCH=arm CROSS_COMPILE=arm_v5t_le- -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
else
|
||||
ifeq ($(PLATFORM),FREESCALE8377)
|
||||
$(MAKE) ARCH=powerpc CROSS_COMPILE=$(CROSS_COMPILE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
else
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f os/linux/Makefile.6.netif $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
endif
|
||||
|
||||
ifeq ($(RT28xx_MODE),AP)
|
||||
ifneq ($(PLATFORM),BB_SOC)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_ap.ko /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_ap_util.ko /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_ap_net.ko /tftpboot
|
||||
endif
|
||||
else
|
||||
rm -f os/linux/$(MODULE)_ap.ko.lzma
|
||||
/root/bin/lzma e os/linux/$(MODULE)_ap.ko os/linux/$(MODULE)_ap.ko.lzma
|
||||
endif
|
||||
else
|
||||
ifeq ($(RT28xx_MODE),APSTA)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_apsta.ko /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_apsta_util.ko /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_apsta_net.ko /tftpboot
|
||||
endif
|
||||
else
|
||||
ifeq ($(PLATFORM),PC_AUTO_BUILD)
|
||||
else
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_sta.ko /tftpboot
|
||||
endif
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_sta_util.ko /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_sta_net.ko /tftpboot
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
mkdir -p $(RT28xx_DIR)/../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
cp -f $(RT28xx_DIR)/os/linux/mt7603u_sta.ko $(RT28xx_DIR)/../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
endif
|
||||
|
||||
plug_in:
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/tools/plug_in MODULE_FLAGS="$(WFLAGS)"
|
||||
|
||||
release: build_tools
|
||||
$(MAKE) -C $(RT28xx_DIR)/striptool -f Makefile.release clean
|
||||
$(MAKE) -C $(RT28xx_DIR)/striptool -f Makefile.release
|
||||
striptool/striptool.out
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
cp -f tools/osabl_check.sh $(RELEASE)/
|
||||
endif
|
||||
ifeq ($(RELEASE), DPO)
|
||||
gcc -o striptool/banner striptool/banner.c
|
||||
./striptool/banner -b striptool/copyright.gpl -s DPO/ -d DPO_GPL -R
|
||||
./striptool/banner -b striptool/copyright.frm -s DPO_GPL/include/firmware.h
|
||||
endif
|
||||
|
||||
prerelease:
|
||||
ifeq ($(MODULE), 2880)
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.release.2880 prerelease
|
||||
else
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.release prerelease
|
||||
endif
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPB $(RTMP_SRC_DIR)/os/linux/.
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPA $(RTMP_SRC_DIR)/os/linux/.
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPC $(RTMP_SRC_DIR)/os/linux/.
|
||||
ifeq ($(RT28xx_MODE),STA)
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPD $(RTMP_SRC_DIR)/os/linux/.
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPO $(RTMP_SRC_DIR)/os/linux/.
|
||||
endif
|
||||
|
||||
clean:
|
||||
ifeq ($(TARGET), LINUX)
|
||||
cp -f os/linux/Makefile.clean os/linux/Makefile
|
||||
$(MAKE) -C os/linux clean
|
||||
rm -rf os/linux/Makefile
|
||||
ifeq ($(PREALLOC), YES)
|
||||
cp -f PREALLOC/os/linux/Makefile.clean PREALLOC/os/linux/Makefile
|
||||
$(MAKE) -C PREALLOC/os/linux clean
|
||||
rm -rf PREALLOC/os/linux/Makefile
|
||||
endif
|
||||
endif
|
||||
ifeq ($(TARGET), UCOS)
|
||||
$(MAKE) -C os/ucos clean MODE=$(RT28xx_MODE)
|
||||
endif
|
||||
ifeq ($(TARGET), ECOS)
|
||||
$(MAKE) -C os/ecos clean MODE=$(RT28xx_MODE)
|
||||
endif
|
||||
|
||||
uninstall:
|
||||
ifeq ($(TARGET), LINUX)
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 uninstall
|
||||
else
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 uninstall
|
||||
endif
|
||||
endif
|
||||
|
||||
install:
|
||||
ifeq ($(TARGET), LINUX)
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 install
|
||||
else
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 install
|
||||
endif
|
||||
endif
|
||||
|
||||
libwapi:
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
cp -f os/linux/Makefile.libwapi.4 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
else
|
||||
cp -f os/linux/Makefile.libwapi.6 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
endif
|
||||
|
||||
osutil:
|
||||
ifeq ($(OSABL),YES)
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
cp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
else
|
||||
cp -f os/linux/Makefile.6.util $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
cp -f $(RT28xx_DIR)/os/linux/mt7603u_sta.ko $(RT28xx_DIR)/../../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
osnet:
|
||||
ifeq ($(OSABL),YES)
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
cp -f os/linux/Makefile.4.netif $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
else
|
||||
cp -f os/linux/Makefile.6.netif $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
cp -f $(RT28xx_DIR)/os/linux/mt7603u_sta.ko $(RT28xx_DIR)/../../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
osdrv:
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
else
|
||||
cp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/mt7603u_sta.ko $(RT28xx_DIR)/../../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# Declare the contents of the .PHONY variable as phony. We keep that information in a variable
|
||||
.PHONY: $(PHONY)
|
||||
|
||||
|
||||
|
147
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/RT2860AP.dat
Normal file
147
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/RT2860AP.dat
Normal file
@ -0,0 +1,147 @@
|
||||
#The word of "Default" must not be removed
|
||||
Default
|
||||
ed_th_nonCE=52
|
||||
Cts2SelfTh=1500
|
||||
CountryRegion=5
|
||||
CountryRegionABand=7
|
||||
CountryCode=TW
|
||||
BssidNum=1
|
||||
SSID1=RT2860AP1
|
||||
SSID2=
|
||||
SSID3=
|
||||
SSID4=
|
||||
WirelessMode=9
|
||||
TxRate=0
|
||||
Channel=11
|
||||
BasicRate=15
|
||||
BeaconPeriod=100
|
||||
DtimPeriod=1
|
||||
TxPower=100
|
||||
DisableOLBC=0
|
||||
BGProtection=0
|
||||
MaxStaNum=0
|
||||
TxPreamble=0
|
||||
RTSThreshold=2347
|
||||
FragThreshold=2346
|
||||
TxBurst=1
|
||||
PktAggregate=0
|
||||
TurboRate=0
|
||||
WmmCapable=0
|
||||
APSDCapable=0
|
||||
DLSCapable=0
|
||||
APAifsn=3;7;1;1
|
||||
APCwmin=4;4;3;2
|
||||
APCwmax=6;10;4;3
|
||||
APTxop=0;0;94;47
|
||||
APACM=0;0;0;0
|
||||
BSSAifsn=3;7;2;2
|
||||
BSSCwmin=4;4;3;2
|
||||
BSSCwmax=10;10;4;3
|
||||
BSSTxop=0;0;94;47
|
||||
BSSACM=0;0;0;0
|
||||
AckPolicy=0;0;0;0
|
||||
NoForwarding=0
|
||||
NoForwardingBTNBSSID=0
|
||||
HideSSID=0
|
||||
StationKeepAlive=0
|
||||
ShortSlot=1
|
||||
AutoChannelSelect=0
|
||||
IEEE8021X=0
|
||||
IEEE80211H=0
|
||||
CSPeriod=10
|
||||
WirelessEvent=0
|
||||
IdsEnable=0
|
||||
AuthFloodThreshold=32
|
||||
AssocReqFloodThreshold=32
|
||||
ReassocReqFloodThreshold=32
|
||||
ProbeReqFloodThreshold=32
|
||||
DisassocFloodThreshold=32
|
||||
DeauthFloodThreshold=32
|
||||
EapReqFooldThreshold=32
|
||||
PreAuth=0
|
||||
AuthMode=OPEN
|
||||
EncrypType=NONE
|
||||
RekeyInterval=0
|
||||
RekeyMethod=DISABLE
|
||||
PMKCachePeriod=10
|
||||
WPAPSK1=
|
||||
WPAPSK2=
|
||||
WPAPSK3=
|
||||
WPAPSK4=
|
||||
DefaultKeyID=1
|
||||
Key1Type=0
|
||||
Key1Str1=
|
||||
Key1Str2=
|
||||
Key1Str3=
|
||||
Key1Str4=
|
||||
Key2Type=0
|
||||
Key2Str1=
|
||||
Key2Str2=
|
||||
Key2Str3=
|
||||
Key2Str4=
|
||||
Key3Type=0
|
||||
Key3Str1=
|
||||
Key3Str2=
|
||||
Key3Str3=
|
||||
Key3Str4=
|
||||
Key4Type=0
|
||||
Key4Str1=
|
||||
Key4Str2=
|
||||
Key4Str3=
|
||||
Key4Str4=
|
||||
HSCounter=0
|
||||
AccessPolicy0=0
|
||||
AccessControlList0=
|
||||
AccessPolicy1=0
|
||||
AccessControlList1=
|
||||
AccessPolicy2=0
|
||||
AccessControlList2=
|
||||
AccessPolicy3=0
|
||||
AccessControlList3=
|
||||
WdsEnable=0
|
||||
WdsEncrypType=NONE
|
||||
WdsList=
|
||||
WdsKey=
|
||||
RADIUS_Server=192.168.2.3
|
||||
RADIUS_Port=1812
|
||||
RADIUS_Key=ralink
|
||||
own_ip_addr=192.168.5.234
|
||||
EAPifname=br0
|
||||
PreAuthifname=br0
|
||||
HT_HTC=0
|
||||
HT_RDG=0
|
||||
HT_EXTCHA=0
|
||||
HT_LinkAdapt=0
|
||||
HT_OpMode=0
|
||||
HT_MpduDensity=5
|
||||
HT_BW=1
|
||||
HT_AutoBA=1
|
||||
HT_AMSDU=0
|
||||
HT_BAWinSize=64
|
||||
HT_GI=1
|
||||
HT_LDPC=0
|
||||
HT_MCS=33
|
||||
VHT_BW=1
|
||||
VHT_SGI=1
|
||||
VHT_STBC=0
|
||||
VHT_BW_SIGNAL=0
|
||||
VHT_DisallowNonVHT=0
|
||||
VHT_LDPC=0
|
||||
MeshId=MESH
|
||||
MeshAutoLink=1
|
||||
MeshAuthMode=OPEN
|
||||
MeshEncrypType=NONE
|
||||
MeshWPAKEY=
|
||||
MeshDefaultkey=1
|
||||
MeshWEPKEY=
|
||||
WscManufacturer=
|
||||
WscModelName=
|
||||
WscDeviceName=
|
||||
WscModelNumber=
|
||||
WscSerialNumber=
|
||||
RadioOn=1
|
||||
PMFMFPC=0
|
||||
PMFMFPR=0
|
||||
PMFSHA256=0
|
||||
LoadCodeMethod=0
|
||||
ed_th_nonCE=52
|
@ -0,0 +1,19 @@
|
||||
#The word of "Default" must not be removed, maximum 32 cards, 00 ~ 31
|
||||
Default
|
||||
|
||||
#CARDID, MAC, CARDTYPE
|
||||
SELECT=CARDTYPE
|
||||
|
||||
00CARDID=/etc/Wireless/RT2860AP/RT2860AP1.dat
|
||||
01CARDID=/etc/Wireless/RT2860AP/RT2860AP2.dat
|
||||
02CARDID=/etc/Wireless/RT2860AP/RT2860AP3.dat
|
||||
|
||||
00MAC00:0E:2E:C3:D0:48=/etc/Wireless/RT2860AP/RT2860AP1.dat
|
||||
01MAC00:40:F4:FF:AA:40=/etc/Wireless/RT2860AP/RT2860AP2.dat
|
||||
02MAC00:0C:43:10:11:5C=/etc/Wireless/RT2860AP/RT2860AP3.dat
|
||||
|
||||
00CARDTYPEbgn=/etc/Wireless/RT2860AP/RT2860AP1.dat
|
||||
01CARDTYPEbgn=/etc/Wireless/RT2860AP/RT2860AP2.dat
|
||||
02CARDTYPEabgn=/etc/Wireless/RT2860AP/RT2860AP3.dat
|
||||
|
||||
|
3983
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap.c
Normal file
3983
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap.c
Normal file
File diff suppressed because it is too large
Load Diff
724
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_acl_v2.c
Normal file
724
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_acl_v2.c
Normal file
@ -0,0 +1,724 @@
|
||||
|
||||
#ifdef ACL_V2_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
// check http://www.coffer.com/mac_find/ not all can be found, need huawei to refine this table!!
|
||||
OUI_ENTRY OUI_ACL_TABLE[] =
|
||||
{
|
||||
{FBT_IOT_PEER_UNKNOWN, {0x00,0x00,0x00}},
|
||||
|
||||
/*Realtek why need 5 IDs ??, only 3 can be found*/
|
||||
{FBT_IOT_PEER_REALTEK, {0x00,0x48,0x54}}, //first three
|
||||
{FBT_IOT_PEER_REALTEK_92SE, {0x00,0xe0,0x4c}}, //first three
|
||||
{FBT_IOT_PEER_REALTEK_SOFTAP, {0x52,0x54,0x05}}, //first three
|
||||
//{FBT_IOT_PEER_RTK_APCLIENT, {0x00,0x00,0x00}}, //can't be found
|
||||
//{FBT_IOT_PEER_REALTEK_81XX, {0x00,0x00,0x00}}, //can't be found
|
||||
//{FBT_IOT_PEER_REALTEK_WOW, {0x00,0x00,0x00}}, //can't be found
|
||||
|
||||
{FBT_IOT_PEER_BROADCOM, {0x00,0x05,0xb5}},
|
||||
|
||||
{FBT_IOT_PEER_RALINK, {0x00,0x0c,0x43}},
|
||||
|
||||
{FBT_IOT_PEER_ATHEROS, {0x00,0x03,0x7f}},
|
||||
{FBT_IOT_PEER_ATHEROS, {0x00,0x13,0x74}},
|
||||
{FBT_IOT_PEER_ATHEROS, {0x88,0x12,0x4e}},
|
||||
|
||||
/*too many cisco OUIs, only keep 3*/
|
||||
{FBT_IOT_PEER_CISCO, {0x00,0x00,0x0c}},
|
||||
{FBT_IOT_PEER_CISCO, {0x00,0x01,0x42}},
|
||||
{FBT_IOT_PEER_CISCO, {0x00,0x01,0x43}},
|
||||
|
||||
{FBT_IOT_PEER_MERU, {0x00,0x0c,0xe6}},
|
||||
|
||||
{FBT_IOT_PEER_MARVEL, {0x00,0x50,0x43}},
|
||||
|
||||
//{FBT_IOT_PEER_SELF_SOFTAP, {000000}}, // can't be found
|
||||
|
||||
{FBT_IOT_PEER_AIRGO, {0x00,0x0a,0xf5}},
|
||||
|
||||
/*too many cisco OUIs, only keep 3*/
|
||||
{FBT_IOT_PEER_INTEL, {0x00,0x02,0xb3}},
|
||||
{FBT_IOT_PEER_INTEL, {0x00,0x03,0x47}},
|
||||
{FBT_IOT_PEER_INTEL, {0x00,0x04,0x23}},
|
||||
|
||||
/*too many , only keep 1! */
|
||||
{FBT_IOT_PEER_HTC, {0x00,0x04,0x23}},
|
||||
//{FBT_IOT_PEER_MAX, {0x00,0x00,0x00}}, // can't be found
|
||||
};
|
||||
|
||||
INT OUI_ACL_TABLE_NUM = (sizeof(OUI_ACL_TABLE)/sizeof(OUI_ENTRY));
|
||||
|
||||
|
||||
|
||||
VOID ACL_V2_Timeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3);
|
||||
|
||||
|
||||
BUILD_TIMER_FUNCTION(ACL_V2_Timeout);
|
||||
|
||||
|
||||
|
||||
VOID ACL_V2_CtrlInit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
UCHAR APIndex;
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
for (APIndex = 0; APIndex < MAX_MBSSID_NUM(pAd); APIndex++)
|
||||
{
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[APIndex].AccessControlList_V2;
|
||||
|
||||
NdisZeroMemory(pACLCtrl, sizeof(*pACLCtrl));
|
||||
pACLCtrl->BlockTime = 2; //spec is 2 seconds by default
|
||||
|
||||
pACLCtrl->pAd = pAd;
|
||||
|
||||
RTMPInitTimer(pAd, &pACLCtrl->AgeOutTimer,
|
||||
GET_TIMER_FUNCTION(ACL_V2_Timeout), pACLCtrl, FALSE);
|
||||
|
||||
pACLCtrl->AgeOutTimer_Running = FALSE;
|
||||
NdisAllocateSpinLock(pAd, &pACLCtrl->MAC_ListLock);
|
||||
NdisAllocateSpinLock(pAd, &pACLCtrl->OUI_ListLock);
|
||||
|
||||
DlListInit(&pACLCtrl->MAC_List);
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
VOID ACL_V2_CtrlExit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
UINT32 Ret;
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
ACL_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
ACL_OUI_CTRL *pOUIEntry, *pOUITmp;
|
||||
UCHAR APIndex;
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
for (APIndex = 0; APIndex < MAX_MBSSID_NUM(pAd); APIndex++)
|
||||
{
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[APIndex].AccessControlList_V2;
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
DlListDel(&pMACEntry->List);
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
}
|
||||
DlListInit(&pACLCtrl->MAC_List);
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEachSafe(pOUIEntry, pOUITmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
}
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
if(pACLCtrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&pACLCtrl->AgeOutTimer, &Cancelled);
|
||||
pACLCtrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
RTMPReleaseTimer(&pACLCtrl->AgeOutTimer, &Cancelled);
|
||||
|
||||
NdisFreeSpinLock(&pACLCtrl->MAC_ListLock);
|
||||
NdisFreeSpinLock(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
}
|
||||
|
||||
INT Set_ACL_V2_DisConnectSta_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
UCHAR macAddr[MAC_ADDR_LEN];
|
||||
RTMP_STRING *value;
|
||||
INT i;
|
||||
MAC_TABLE_ENTRY *pEntry = NULL;
|
||||
|
||||
if(strlen(arg) != 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
||||
return FALSE;
|
||||
|
||||
for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":"))
|
||||
{
|
||||
if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
||||
return FALSE; /*Invalid */
|
||||
|
||||
AtoH(value, (UCHAR *)&macAddr[i++], 1);
|
||||
}
|
||||
|
||||
pEntry = MacTableLookup(pAd, macAddr);
|
||||
|
||||
|
||||
Set_ACL_V2_AddSTAEntry_Proc(pAd, macAddr);
|
||||
|
||||
if (pEntry)
|
||||
{
|
||||
MlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,PRINT_MAC(macAddr)));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT Set_ACL_V2_DisConnectOUI_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
INT i=0;
|
||||
INT32 Ret;
|
||||
BOOLEAN Cancelled;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_OUI_CTRL *pOUIEntry, *pOUIEntryTmp;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
ULONG Value = (ULONG) simple_strtol(arg, 0, 16);
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
if(pACLCtrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&pACLCtrl->AgeOutTimer, &Cancelled);
|
||||
pACLCtrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
if (Value)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI=0x%08x\n", __FUNCTION__,Value));
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
if(pACLCtrl->OUI_Enable)
|
||||
{
|
||||
DlListForEachSafe(pOUIEntry, pOUIEntryTmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
pACLCtrl->OUI_ListNum --;
|
||||
if(pACLCtrl->OUI_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
}
|
||||
}
|
||||
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
for (i=0; i <OUI_ACL_TABLE_NUM ; i++)
|
||||
{
|
||||
if(Value & OUI_ACL_TABLE[i].ID)
|
||||
{
|
||||
Set_ACL_V2_AddOUIEntry_Proc(pAd, OUI_ACL_TABLE[i].OUI);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
if(pACLCtrl->OUI_Enable)
|
||||
{
|
||||
DlListForEachSafe(pOUIEntry, pOUIEntryTmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
pACLCtrl->OUI_ListNum --;
|
||||
if(pACLCtrl->OUI_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
}
|
||||
}
|
||||
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
}
|
||||
|
||||
i=0;
|
||||
|
||||
//dump all OUI list
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEach(pOUIEntry, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI [%d]=%02x:%02x:%02x\n", __FUNCTION__,i++, pOUIEntry->OUI[0],pOUIEntry->OUI[1],pOUIEntry->OUI[2]));
|
||||
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
if(pACLCtrl->BlockTime)
|
||||
{
|
||||
RTMPSetTimer(&pACLCtrl->AgeOutTimer, pACLCtrl->BlockTime * 1000);
|
||||
pACLCtrl->AgeOutTimer_Running = TRUE;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI count=%d\n", __FUNCTION__,i));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
UINT32 Set_ACL_V2_AddSTAEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pTargetMACAddr)
|
||||
{
|
||||
BOOLEAN find_list = FALSE;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_MAC_CTRL *pMACEntry;
|
||||
ULONG Now32;
|
||||
INT32 Ret;
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
if (pACLCtrl->MAC_ListNum >= (MAX_NUM_OF_ACL_V2_MAC - 1))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN, ("%s : AccessControlList is full, and no more entry can join the list!\n",__FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s\n", __FUNCTION__));
|
||||
|
||||
if(pACLCtrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&pACLCtrl->AgeOutTimer, &Cancelled);
|
||||
pACLCtrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
if (MAC_ADDR_EQUAL(pMACEntry->MACAddr, pTargetMACAddr))
|
||||
{
|
||||
find_list = TRUE;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : duplicate mac =%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,PRINT_MAC(pTargetMACAddr)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
if (find_list == FALSE)
|
||||
os_alloc_mem(NULL, (UCHAR **)&pMACEntry, sizeof(*pMACEntry));
|
||||
|
||||
if (!pMACEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (find_list == FALSE)
|
||||
{
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
NdisMoveMemory(pMACEntry->MACAddr, pTargetMACAddr, 6);
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pMACEntry->SetTime = Now32;
|
||||
|
||||
DlListAddTail(&pACLCtrl->MAC_List, &pMACEntry->List);
|
||||
|
||||
pACLCtrl->MAC_ListNum ++;
|
||||
|
||||
if(pACLCtrl->MAC_ListNum)
|
||||
{
|
||||
pACLCtrl->MAC_Enable = 1;
|
||||
}
|
||||
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pMACEntry->SetTime = Now32;
|
||||
}
|
||||
if(pACLCtrl->BlockTime)
|
||||
{
|
||||
RTMPSetTimer(&pACLCtrl->AgeOutTimer, pACLCtrl->BlockTime * 1000);
|
||||
pACLCtrl->AgeOutTimer_Running = TRUE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT Show_ACL_V2_OUI_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
INT i=0;
|
||||
INT32 Ret;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_OUI_CTRL *pOUIEntry;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
//dump all OUI list
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEach(pOUIEntry, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI [%d]=%02x:%02x:%02x\n", __FUNCTION__,i++, pOUIEntry->OUI[0],pOUIEntry->OUI[1],pOUIEntry->OUI[2]));
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI count=%d\n", __FUNCTION__,i));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT Show_ACL_V2_STAEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
INT i=0;
|
||||
INT32 Ret;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_MAC_CTRL *pMACEntry;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
//dump all OUI list
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC [%d]=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,i++, PRINT_MAC(pMACEntry->MACAddr)));
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC count=%d\n", __FUNCTION__,i));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID Set_ACL_V2_DelSTAEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pTargetMACAddr)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
|
||||
INT32 Ret;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s\n", __FUNCTION__));
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
if (!pMACEntry)
|
||||
break;
|
||||
|
||||
if (MAC_ADDR_EQUAL(pMACEntry->MACAddr, pTargetMACAddr))
|
||||
{
|
||||
DlListDel(&pMACEntry->List);
|
||||
|
||||
pACLCtrl->MAC_ListNum --;
|
||||
|
||||
if(pACLCtrl->MAC_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->MAC_Enable = 0;
|
||||
}
|
||||
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
}
|
||||
|
||||
|
||||
UINT32 Set_ACL_V2_AddOUIEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pTargetOUIAddr)
|
||||
{
|
||||
BOOLEAN find_list = FALSE;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_OUI_CTRL *pOUIEntry;
|
||||
ULONG Now32;
|
||||
INT32 Ret;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
if (pACLCtrl->OUI_ListNum >= (MAX_NUM_OF_ACL_V2_OUI - 1))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN, ("%s : AccessControlList is full, and no more entry can join the list!\n",__FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s\n", __FUNCTION__));
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEach(pOUIEntry, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
if (RTMPEqualMemory(pOUIEntry->OUI, pTargetOUIAddr, OUI_LEN))
|
||||
{
|
||||
find_list = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
if (find_list == FALSE)
|
||||
os_alloc_mem(NULL, (UCHAR **)&pOUIEntry, sizeof(*pOUIEntry));
|
||||
|
||||
if (!pOUIEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
if (find_list == FALSE)
|
||||
{
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
NdisMoveMemory(pOUIEntry->OUI, pTargetOUIAddr, OUI_LEN);
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pOUIEntry->SetTime = Now32;
|
||||
|
||||
DlListAddTail(&pACLCtrl->OUI_List, &pOUIEntry->List);
|
||||
|
||||
pACLCtrl->OUI_ListNum ++;
|
||||
if (pACLCtrl->OUI_ListNum)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 1;
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
}
|
||||
else
|
||||
{ // only update timestamp
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pOUIEntry->SetTime = Now32;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID Set_ACL_V2_DelOUIEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pTargetOUIAddr)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_OUI_CTRL *pOUIEntry, *pOUIEntryTmp;
|
||||
|
||||
INT32 Ret;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s\n", __FUNCTION__));
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
DlListForEachSafe(pOUIEntry, pOUIEntryTmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
if (!pOUIEntry)
|
||||
break;
|
||||
|
||||
if (RTMPEqualMemory(pOUIEntry->OUI, pTargetOUIAddr, OUI_LEN))
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
|
||||
pACLCtrl->OUI_ListNum --;
|
||||
if(pACLCtrl->OUI_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
}
|
||||
|
||||
VOID Set_ACL_V2_EntryExpire_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ULONG Value;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
Value = (ULONG) simple_strtol(arg, 0, 10);
|
||||
pACLCtrl->BlockTime = Value;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : pACLCtrl->BlockTime=%lu\n", __FUNCTION__,pACLCtrl->BlockTime));
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID Show_ACL_V2_EntryExpire_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : pACLCtrl->BlockTime=%lu\n", __FUNCTION__,pACLCtrl->BlockTime));
|
||||
|
||||
}
|
||||
|
||||
BOOLEAN ACL_V2_List_Check(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UCHAR *pAddr,
|
||||
IN UCHAR Apidx)
|
||||
{
|
||||
BOOLEAN Result = TRUE;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_MAC_CTRL *pMACEntry;
|
||||
ACL_OUI_CTRL *pOUIEntry;
|
||||
|
||||
INT32 Ret;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[Apidx].AccessControlList_V2;
|
||||
|
||||
|
||||
check_oui:
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEach(pOUIEntry, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
if (RTMPEqualMemory(pOUIEntry->OUI, pAddr, OUI_LEN))
|
||||
{
|
||||
Result = FALSE;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : hit OUI =%02x:%02x:%02x\n", __FUNCTION__,pOUIEntry->OUI[0],pOUIEntry->OUI[1],pOUIEntry->OUI[2]));
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
|
||||
if (Result == FALSE)
|
||||
goto done;
|
||||
|
||||
|
||||
check_mac:
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
if (MAC_ADDR_EQUAL(pMACEntry->MACAddr, pAddr))
|
||||
{
|
||||
Result = FALSE;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : hit mac =%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,PRINT_MAC(pAddr)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
done:
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
||||
VOID ACL_V2_AgeOut(
|
||||
IN PACL_V2_CTRL pACLCtrl)
|
||||
{
|
||||
ACL_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
ACL_OUI_CTRL *pOUIEntry, *pOUIEntryTmp;
|
||||
|
||||
INT32 Ret;
|
||||
UINT32 Now32;
|
||||
INT i = 0;
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
UCHAR Apidx;
|
||||
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
{
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
if(pACLCtrl->OUI_Enable)
|
||||
{
|
||||
DlListForEachSafe(pOUIEntry, pOUIEntryTmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
if(RTMP_TIME_AFTER(Now32, pOUIEntry->SetTime + (pACLCtrl->BlockTime * OS_HZ)))
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : age OUI[%d] =%02x:%02x:%02x\n", __FUNCTION__, i, pOUIEntry->OUI[0], pOUIEntry->OUI[1], pOUIEntry->OUI[2]));
|
||||
i++;
|
||||
pACLCtrl->OUI_ListNum --;
|
||||
if(pACLCtrl->OUI_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
}
|
||||
}
|
||||
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
|
||||
i=0;
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
if(pACLCtrl->MAC_Enable)
|
||||
{
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
if(RTMP_TIME_AFTER(Now32, pMACEntry->SetTime + (pACLCtrl->BlockTime * OS_HZ)))
|
||||
{
|
||||
DlListDel(&pMACEntry->List);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : age MAC[%d] =%02x:%02x:%02x,%02x:%02x:%02x\n", __FUNCTION__, i, PRINT_MAC(pMACEntry->MACAddr)));
|
||||
i++;
|
||||
|
||||
pACLCtrl->MAC_ListNum --;
|
||||
if(pACLCtrl->MAC_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->MAC_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
}
|
||||
}
|
||||
|
||||
DlListInit(&pACLCtrl->MAC_List);
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void ACL_V2_Timeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl = (ACL_V2_CTRL *)FunctionContext;
|
||||
PRTMP_ADAPTER pAd = pACLCtrl->pAd;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s\n", __FUNCTION__));
|
||||
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s: fRTMP_ADAPTER_HALT_IN_PROGRESS\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
ACL_V2_AgeOut(pACLCtrl);
|
||||
|
||||
}
|
||||
|
||||
#endif /* ACL_V2_SUPPORT */
|
4961
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_apcli.c
Normal file
4961
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_apcli.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,195 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_apcli.c
|
||||
|
||||
Abstract:
|
||||
Support AP-Client function.
|
||||
|
||||
Note:
|
||||
1. Call RT28xx_ApCli_Init() in init function and
|
||||
call RT28xx_ApCli_Remove() in close function
|
||||
|
||||
2. MAC of ApCli-interface is initialized in RT28xx_ApCli_Init()
|
||||
|
||||
3. ApCli index (0) of different rx packet is got in
|
||||
|
||||
4. ApCli index (0) of different tx packet is assigned in
|
||||
|
||||
5. ApCli index (0) of different interface is got in APHardTransmit() by using
|
||||
|
||||
6. ApCli index (0) of IOCTL command is put in pAd->OS_Cookie->ioctl_if
|
||||
|
||||
8. The number of ApCli only can be 1
|
||||
|
||||
9. apcli convert engine subroutines, we should just take care data packet.
|
||||
Revision History:
|
||||
Who When What
|
||||
-------------- ---------- ----------------------------------------------
|
||||
Shiang, Fonchi 02-13-2007 created
|
||||
*/
|
||||
#define RTMP_MODULE_OS
|
||||
|
||||
#ifdef APCLI_SUPPORT
|
||||
|
||||
/*#include "rt_config.h" */
|
||||
#include "rtmp_comm.h"
|
||||
#include "rt_os_util.h"
|
||||
#include "rt_os_net.h"
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Init AP-Client function.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
main_dev_p points to the main BSS network interface
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
1. Only create and initialize virtual network interfaces.
|
||||
2. No main network interface here.
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28xx_ApCli_Init(VOID *pAd, PNET_DEV main_dev_p)
|
||||
{
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevOpHook;
|
||||
|
||||
/* init operation functions */
|
||||
NdisZeroMemory(&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK));
|
||||
netDevOpHook.open = ApCli_VirtualIF_Open;
|
||||
netDevOpHook.stop = ApCli_VirtualIF_Close;
|
||||
netDevOpHook.xmit = rt28xx_send_packets;
|
||||
netDevOpHook.ioctl = rt28xx_ioctl;
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_INIT,
|
||||
0, &netDevOpHook, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Open a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
dev_p which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: open successfully
|
||||
otherwise: open fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT ApCli_VirtualIF_Open(PNET_DEV dev_p)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
/* increase MODULE use count */
|
||||
RT_MOD_INC_USE_COUNT();
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);
|
||||
ASSERT(pAd);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p)));
|
||||
|
||||
if (VIRTUAL_IF_UP(pAd) != 0)
|
||||
return -1;
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_REG(dev_p);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_OPEN, 0, dev_p, 0);
|
||||
|
||||
#ifdef MTFWD
|
||||
RTMP_OS_NETDEV_CARRIER_OFF(dev_p);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Close a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
dev_p which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: close successfully
|
||||
otherwise: close fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT ApCli_VirtualIF_Close(PNET_DEV dev_p)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);
|
||||
ASSERT(pAd);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p)));
|
||||
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_CLOSE, 0, dev_p, 0);
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_DEREG(dev_p);
|
||||
#endif
|
||||
|
||||
VIRTUAL_IF_DOWN(pAd);
|
||||
|
||||
RT_MOD_DEC_USE_COUNT();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Remove ApCli-BSS network interface.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28xx_ApCli_Remove(VOID *pAd)
|
||||
{
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_REMOVE, 0, NULL, 0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
3417
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_assoc.c
Normal file
3417
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_assoc.c
Normal file
File diff suppressed because it is too large
Load Diff
1374
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_auth.c
Normal file
1374
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_auth.c
Normal file
File diff suppressed because it is too large
Load Diff
1563
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_autoChSel.c
Normal file
1563
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_autoChSel.c
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
17758
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_cfg.c
Normal file
17758
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_cfg.c
Normal file
File diff suppressed because it is too large
Load Diff
1890
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_connect.c
Normal file
1890
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_connect.c
Normal file
File diff suppressed because it is too large
Load Diff
4133
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_data.c
Normal file
4133
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_data.c
Normal file
File diff suppressed because it is too large
Load Diff
27
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_dls.c
Normal file
27
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_dls.c
Normal file
@ -0,0 +1,27 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Abstract:
|
||||
|
||||
Handle WMM-DLS state machine.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
|
||||
/* End of ap_dls.c */
|
1775
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_ftkd.c
Normal file
1775
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_ftkd.c
Normal file
File diff suppressed because it is too large
Load Diff
481
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_ids.c
Normal file
481
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_ids.c
Normal file
@ -0,0 +1,481 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_ids.c
|
||||
|
||||
Abstract:
|
||||
monitor intrusion detection condition
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
#ifdef IDS_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
#define IDS_EXEC_INTV 1000 /* 1 sec */
|
||||
|
||||
|
||||
VOID RTMPIdsStart(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
|
||||
if (pAd->ApCfg.IDSTimerRunning == FALSE)
|
||||
{
|
||||
RTMPSetTimer(&pAd->ApCfg.IDSTimer, IDS_EXEC_INTV);
|
||||
pAd->ApCfg.IDSTimerRunning = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
VOID RTMPIdsStop(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
if (pAd->ApCfg.IDSTimerRunning == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&pAd->ApCfg.IDSTimer, &Cancelled);
|
||||
pAd->ApCfg.IDSTimerRunning = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SYSTEM_LOG_SUPPORT
|
||||
VOID RTMPHandleIdsEvent(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT i, j;
|
||||
|
||||
UINT32 FloodFrameCount[IW_FLOOD_EVENT_TYPE_NUM];
|
||||
UINT32 FloodFrameThreshold[IW_FLOOD_EVENT_TYPE_NUM];
|
||||
|
||||
FloodFrameCount[0] = pAd->ApCfg.RcvdAuthCount;
|
||||
FloodFrameCount[1] = pAd->ApCfg.RcvdAssocReqCount;
|
||||
FloodFrameCount[2] = pAd->ApCfg.RcvdReassocReqCount;
|
||||
FloodFrameCount[3] = pAd->ApCfg.RcvdProbeReqCount;
|
||||
FloodFrameCount[4] = pAd->ApCfg.RcvdDisassocCount;
|
||||
FloodFrameCount[5] = pAd->ApCfg.RcvdDeauthCount;
|
||||
FloodFrameCount[6] = pAd->ApCfg.RcvdEapReqCount;
|
||||
|
||||
FloodFrameThreshold[0] = pAd->ApCfg.AuthFloodThreshold;
|
||||
FloodFrameThreshold[1] = pAd->ApCfg.AssocReqFloodThreshold;
|
||||
FloodFrameThreshold[2] = pAd->ApCfg.ReassocReqFloodThreshold;
|
||||
FloodFrameThreshold[3] = pAd->ApCfg.ProbeReqFloodThreshold;
|
||||
FloodFrameThreshold[4] = pAd->ApCfg.DisassocFloodThreshold;
|
||||
FloodFrameThreshold[5] = pAd->ApCfg.DeauthFloodThreshold;
|
||||
FloodFrameThreshold[6] = pAd->ApCfg.EapReqFloodThreshold;
|
||||
|
||||
/* trigger flooding traffic event */
|
||||
for (j = 0; j < IW_FLOOD_EVENT_TYPE_NUM; j++)
|
||||
{
|
||||
if ((FloodFrameThreshold[j] > 0) && (FloodFrameCount[j] > FloodFrameThreshold[j]))
|
||||
{
|
||||
RTMPSendWirelessEvent(pAd, IW_FLOOD_AUTH_EVENT_FLAG + j, NULL, MAX_MBSSID_NUM(pAd), 0);
|
||||
/*DBGPRINT(RT_DEBUG_TRACE, ("flooding traffic event(%d) - %d\n", IW_FLOOD_AUTH_EVENT_FLAG + j, FloodFrameCount[j])); */
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
UINT32 SpoofedFrameCount[IW_SPOOF_EVENT_TYPE_NUM];
|
||||
CHAR RssiOfSpoofedFrame[IW_SPOOF_EVENT_TYPE_NUM];
|
||||
INT k;
|
||||
|
||||
SpoofedFrameCount[0] = pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount;
|
||||
SpoofedFrameCount[1] = pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount;
|
||||
SpoofedFrameCount[2] = pAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount;
|
||||
SpoofedFrameCount[3] = pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount;
|
||||
SpoofedFrameCount[4] = pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount;
|
||||
SpoofedFrameCount[5] = pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount;
|
||||
SpoofedFrameCount[6] = pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount;
|
||||
SpoofedFrameCount[7] = pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount;
|
||||
SpoofedFrameCount[8] = pAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount;
|
||||
SpoofedFrameCount[9] = pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount;
|
||||
|
||||
RssiOfSpoofedFrame[0] = pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid;
|
||||
RssiOfSpoofedFrame[1] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp;
|
||||
RssiOfSpoofedFrame[2] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp;
|
||||
RssiOfSpoofedFrame[3] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp;
|
||||
RssiOfSpoofedFrame[4] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon;
|
||||
RssiOfSpoofedFrame[5] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc;
|
||||
RssiOfSpoofedFrame[6] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth;
|
||||
RssiOfSpoofedFrame[7] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth;
|
||||
RssiOfSpoofedFrame[8] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt;
|
||||
RssiOfSpoofedFrame[9] = pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack;
|
||||
|
||||
/* trigger spoofed attack event */
|
||||
for (k = 0; k < IW_SPOOF_EVENT_TYPE_NUM; k++)
|
||||
{
|
||||
if (SpoofedFrameCount[k] > 0)
|
||||
{
|
||||
RTMPSendWirelessEvent(pAd, IW_CONFLICT_SSID_EVENT_FLAG + k, NULL, i, RssiOfSpoofedFrame[k]);
|
||||
/*DBGPRINT(RT_DEBUG_TRACE, ("spoofed attack event(%d) - %d\n", IW_CONFLICT_SSID_EVENT_FLAG + k, SpoofedFrameCount[k])); */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif /* SYSTEM_LOG_SUPPORT */
|
||||
|
||||
VOID RTMPClearAllIdsCounter(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT i;
|
||||
|
||||
pAd->ApCfg.RcvdAuthCount = 0;
|
||||
pAd->ApCfg.RcvdAssocReqCount = 0;
|
||||
pAd->ApCfg.RcvdReassocReqCount = 0;
|
||||
pAd->ApCfg.RcvdProbeReqCount = 0;
|
||||
pAd->ApCfg.RcvdDisassocCount = 0;
|
||||
pAd->ApCfg.RcvdDeauthCount = 0;
|
||||
pAd->ApCfg.RcvdEapReqCount = 0;
|
||||
pAd->ApCfg.RcvdMaliciousDataCount = 0;
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount = 0;
|
||||
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack = 0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
VOID RTMPIdsPeriodicExec(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext;
|
||||
|
||||
pAd->ApCfg.IDSTimerRunning = FALSE;
|
||||
|
||||
#ifdef SYSTEM_LOG_SUPPORT
|
||||
/* when IDS occured, send out wireless event */
|
||||
if (pAd->CommonCfg.bWirelessEvent)
|
||||
RTMPHandleIdsEvent(pAd);
|
||||
#endif /* SYSTEM_LOG_SUPPORT */
|
||||
|
||||
/* clear all IDS counter */
|
||||
RTMPClearAllIdsCounter(pAd);
|
||||
|
||||
/* set timer */
|
||||
if (pAd->ApCfg.IdsEnable)
|
||||
{
|
||||
RTMPSetTimer(&pAd->ApCfg.IDSTimer, IDS_EXEC_INTV);
|
||||
pAd->ApCfg.IDSTimerRunning = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
This routine is used to check if a rogue AP sent an 802.11 management
|
||||
frame to a client using our BSSID.
|
||||
|
||||
Arguments:
|
||||
pAd - Pointer to our adapter
|
||||
pHeader - Pointer to 802.11 header
|
||||
|
||||
Return Value:
|
||||
TRUE - This is a spoofed frame
|
||||
FALSE - This isn't a spoofed frame
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPSpoofedMgmtDetection(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN HEADER_802_11 *pHeader,
|
||||
IN RX_BLK *rxblk)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
/* Spoofed BSSID detection */
|
||||
if (NdisEqualMemory(pHeader->Addr2, pAd->ApCfg.MBSSID[i].wdev.bssid, MAC_ADDR_LEN))
|
||||
{
|
||||
CHAR RcvdRssi;
|
||||
struct raw_rssi_info rssi_info;
|
||||
|
||||
rssi_info.raw_rssi[0] = rxblk->rx_signal.raw_rssi[0];
|
||||
rssi_info.raw_rssi[1] = rxblk->rx_signal.raw_rssi[1];
|
||||
rssi_info.raw_rssi[2] = rxblk->rx_signal.raw_rssi[2];
|
||||
RcvdRssi = RTMPMaxRssi(pAd,
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2));
|
||||
|
||||
switch (pHeader->FC.SubType)
|
||||
{
|
||||
case SUBTYPE_ASSOC_RSP:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_REASSOC_RSP:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_PROBE_RSP:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_BEACON:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_DISASSOC:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_AUTH:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_DEAUTH:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth = RcvdRssi;
|
||||
break;
|
||||
|
||||
default:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt = RcvdRssi;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
VOID RTMPConflictSsidDetection(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pSsid,
|
||||
IN UCHAR SsidLen,
|
||||
IN CHAR Rssi0,
|
||||
IN CHAR Rssi1,
|
||||
IN CHAR Rssi2)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
/* Conflict SSID detection */
|
||||
if (SSID_EQUAL(pSsid, SsidLen, pAd->ApCfg.MBSSID[i].Ssid, pAd->ApCfg.MBSSID[i].SsidLen))
|
||||
{
|
||||
CHAR RcvdRssi;
|
||||
struct raw_rssi_info rssi_info;
|
||||
|
||||
rssi_info.raw_rssi[0] = Rssi0;
|
||||
rssi_info.raw_rssi[1] = Rssi1;
|
||||
rssi_info.raw_rssi[2] = Rssi2;
|
||||
|
||||
RcvdRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2));
|
||||
|
||||
pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid = RcvdRssi;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN RTMPReplayAttackDetection(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UCHAR *pAddr2,
|
||||
IN RX_BLK *rxblk)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
/* Conflict SSID detection */
|
||||
if (NdisEqualMemory(pAddr2, pAd->ApCfg.MBSSID[i].wdev.bssid, MAC_ADDR_LEN))
|
||||
{
|
||||
CHAR RcvdRssi;
|
||||
struct raw_rssi_info rssi_info;
|
||||
|
||||
rssi_info.raw_rssi[0] = rxblk->rx_signal.raw_rssi[0];
|
||||
rssi_info.raw_rssi[1] = rxblk->rx_signal.raw_rssi[1];
|
||||
rssi_info.raw_rssi[2] = rxblk->rx_signal.raw_rssi[2];
|
||||
|
||||
RcvdRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2));
|
||||
|
||||
pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack = RcvdRssi;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VOID RTMPUpdateStaMgmtCounter(RTMP_ADAPTER *pAd, USHORT type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case SUBTYPE_ASSOC_REQ:
|
||||
pAd->ApCfg.RcvdAssocReqCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_REASSOC_REQ:
|
||||
pAd->ApCfg.RcvdReassocReqCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_PROBE_REQ:
|
||||
pAd->ApCfg.RcvdProbeReqCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_DISASSOC:
|
||||
pAd->ApCfg.RcvdDisassocCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_DEAUTH:
|
||||
pAd->ApCfg.RcvdDeauthCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_AUTH:
|
||||
pAd->ApCfg.RcvdAuthCount ++;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdAssocReqCount=%d\n", pAd->ApCfg.RcvdAssocReqCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdReassocReqCount=%d\n", pAd->ApCfg.RcvdReassocReqCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdProbeReqCount=%d\n", pAd->ApCfg.RcvdProbeReqCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdDisassocCount=%d\n", pAd->ApCfg.RcvdDisassocCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdDeauthCount=%d\n", pAd->ApCfg.RcvdDeauthCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdAuthCount=%d\n", pAd->ApCfg.RcvdAuthCount));
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
VOID rtmp_read_ids_from_file(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
RTMP_STRING *tmpbuf,
|
||||
RTMP_STRING *buffer)
|
||||
{
|
||||
/*IdsEnable */
|
||||
if(RTMPGetKeyParameter("IdsEnable", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
if (simple_strtol(tmpbuf, 0, 10) == 1)
|
||||
pAd->ApCfg.IdsEnable = TRUE;
|
||||
else
|
||||
pAd->ApCfg.IdsEnable = FALSE;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("IDS is %s\n", pAd->ApCfg.IdsEnable ? "enabled" : "disabled"));
|
||||
}
|
||||
|
||||
/*AuthFloodThreshold */
|
||||
if(RTMPGetKeyParameter("AuthFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.AuthFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("AuthFloodThreshold = %d\n", pAd->ApCfg.AuthFloodThreshold));
|
||||
}
|
||||
|
||||
/*AssocReqFloodThreshold */
|
||||
if(RTMPGetKeyParameter("AssocReqFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.AssocReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("AssocReqFloodThreshold = %d\n", pAd->ApCfg.AssocReqFloodThreshold));
|
||||
}
|
||||
|
||||
/*ReassocReqFloodThreshold */
|
||||
if(RTMPGetKeyParameter("ReassocReqFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.ReassocReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ReassocReqFloodThreshold = %d\n", pAd->ApCfg.ReassocReqFloodThreshold));
|
||||
}
|
||||
|
||||
/*ProbeReqFloodThreshold */
|
||||
if(RTMPGetKeyParameter("ProbeReqFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.ProbeReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ProbeReqFloodThreshold = %d\n", pAd->ApCfg.ProbeReqFloodThreshold));
|
||||
}
|
||||
|
||||
/*DisassocFloodThreshold */
|
||||
if(RTMPGetKeyParameter("DisassocFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.DisassocFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("DisassocFloodThreshold = %d\n", pAd->ApCfg.DisassocFloodThreshold));
|
||||
}
|
||||
|
||||
/*DeauthFloodThreshold */
|
||||
if(RTMPGetKeyParameter("DeauthFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.DeauthFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("DeauthFloodThreshold = %d\n", pAd->ApCfg.DeauthFloodThreshold));
|
||||
}
|
||||
|
||||
/*EapReqFloodThreshold */
|
||||
if(RTMPGetKeyParameter("EapReqFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.EapReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("EapReqFloodThreshold = %d\n", pAd->ApCfg.EapReqFloodThreshold));
|
||||
}
|
||||
|
||||
/* DataFloodThreshold */
|
||||
if(RTMPGetKeyParameter("DataFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.DataFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("DataFloodThreshold = %d\n", pAd->ApCfg.DataFloodThreshold));
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* IDS_SUPPORT */
|
454
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_mbss.c
Normal file
454
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_mbss.c
Normal file
@ -0,0 +1,454 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Abstract:
|
||||
|
||||
Support multi-BSS function.
|
||||
|
||||
Note:
|
||||
1. Call RT28xx_MBSS_Init() in init function and
|
||||
call RT28xx_MBSS_Remove() in close function
|
||||
|
||||
2. MAC of different BSS is initialized in APStartUp()
|
||||
|
||||
3. BSS Index (0 ~ 15) of different rx packet is got in
|
||||
|
||||
4. BSS Index (0 ~ 15) of different tx packet is assigned in
|
||||
|
||||
5. BSS Index (0 ~ 15) of different BSS is got in APHardTransmit() by using
|
||||
|
||||
6. BSS Index (0 ~ 15) of IOCTL command is put in pAd->OS_Cookie->ioctl_if
|
||||
|
||||
7. Beacon of different BSS is enabled in APMakeAllBssBeacon() by writing 1
|
||||
to the register MAC_BSSID_DW1
|
||||
|
||||
8. The number of MBSS can be 1, 2, 4, or 8
|
||||
|
||||
***************************************************************************/
|
||||
#ifdef MBSS_SUPPORT
|
||||
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
/* --------------------------------- Public -------------------------------- */
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize Multi-BSS function.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
pDevMain points to the main BSS network interface
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
1. Only create and initialize virtual network interfaces.
|
||||
2. No main network interface here.
|
||||
3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat,
|
||||
it will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again.
|
||||
========================================================================
|
||||
*/
|
||||
VOID MBSS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps)
|
||||
{
|
||||
#define MBSS_MAX_DEV_NUM 32
|
||||
PNET_DEV pDevNew;
|
||||
INT32 IdBss, MaxNumBss;
|
||||
//INT status;
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevHook;
|
||||
|
||||
/* sanity check to avoid redundant virtual interfaces are created */
|
||||
if (pAd->FlgMbssInit != FALSE)
|
||||
return;
|
||||
|
||||
|
||||
MaxNumBss = pAd->ApCfg.BssidNum;
|
||||
if (MaxNumBss > MAX_MBSSID_NUM(pAd))
|
||||
MaxNumBss = MAX_MBSSID_NUM(pAd);
|
||||
|
||||
/* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */
|
||||
for(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++)
|
||||
pAd->ApCfg.MBSSID[IdBss].wdev.if_dev = NULL;
|
||||
|
||||
/* create virtual network interface */
|
||||
for(IdBss=FIRST_MBSSID; IdBss<MaxNumBss; IdBss++)
|
||||
{
|
||||
struct wifi_dev *wdev;
|
||||
UINT32 MC_RowID = 0, IoctlIF = 0;
|
||||
char *dev_name;
|
||||
#ifdef MULTIPLE_CARD_SUPPORT
|
||||
MC_RowID = pAd->MC_RowID;
|
||||
#endif /* MULTIPLE_CARD_SUPPORT */
|
||||
#ifdef HOSTAPD_SUPPORT
|
||||
IoctlIF = pAd->IoctlIF;
|
||||
#endif /* HOSTAPD_SUPPORT */
|
||||
BSS_STRUCT *pMbss;
|
||||
|
||||
dev_name = get_dev_name_prefix(pAd, INT_MBSSID);
|
||||
pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MBSSID, IdBss, sizeof(struct mt_dev_priv), dev_name);
|
||||
#ifdef HOSTAPD_SUPPORT
|
||||
pAd->IoctlIF = IoctlIF;
|
||||
#endif /* HOSTAPD_SUPPORT */
|
||||
if (pDevNew == NULL)
|
||||
{
|
||||
pAd->ApCfg.BssidNum = IdBss; /* re-assign new MBSS number */
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Register MBSSID IF (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew)));
|
||||
}
|
||||
|
||||
pMbss = &pAd->ApCfg.MBSSID[IdBss];
|
||||
wdev = &pAd->ApCfg.MBSSID[IdBss].wdev;
|
||||
wdev->wdev_type = WDEV_TYPE_AP;
|
||||
wdev->func_dev = &pAd->ApCfg.MBSSID[IdBss];
|
||||
wdev->func_idx = IdBss;
|
||||
wdev->sys_handle = (void *)pAd;
|
||||
wdev->if_dev = pDevNew;
|
||||
if (rtmp_wdev_idx_reg(pAd, wdev) < 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Assign wdev idx for %s failed, free net device!\n",
|
||||
RTMP_OS_NETDEV_GET_DEVNAME(pDevNew)));
|
||||
RtmpOSNetDevFree(pDevNew);
|
||||
break;
|
||||
}
|
||||
wdev->tx_pkt_allowed = ApAllowToSendPacket;
|
||||
wdev->tx_pkt_handle = APSendPacket;
|
||||
wdev->wdev_hard_tx = APHardTransmit;
|
||||
|
||||
wdev->rx_pkt_allowed = ap_rx_pkt_allow;
|
||||
wdev->rx_ps_handle = ap_rx_ps_handle;
|
||||
wdev->rx_pkt_foward = ap_rx_foward_handle;
|
||||
|
||||
RTMP_OS_NETDEV_SET_PRIV(pDevNew, pAd);
|
||||
RTMP_OS_NETDEV_SET_WDEV(pDevNew, wdev);
|
||||
|
||||
/* init operation functions and flags */
|
||||
NdisCopyMemory(&netDevHook, pNetDevOps, sizeof(netDevHook));
|
||||
|
||||
netDevHook.priv_flags = INT_MBSSID;
|
||||
netDevHook.needProtcted = TRUE;
|
||||
netDevHook.wdev = wdev;
|
||||
|
||||
/* Init MAC address of virtual network interface */
|
||||
NdisMoveMemory(&netDevHook.devAddr[0], &wdev->bssid[0], MAC_ADDR_LEN);
|
||||
|
||||
/* register this device to OS */
|
||||
/*status =*/ RtmpOSNetDevAttach(pAd->OpMode, pDevNew, &netDevHook);
|
||||
ASSERT(pMbss);
|
||||
if (pMbss) {
|
||||
wdev_bcn_buf_init(pAd, &pMbss->bcn_buf);
|
||||
} else {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():func_dev is NULL!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pAd->FlgMbssInit = TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Remove Multi-BSS network interface.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
FIRST_MBSSID = 1
|
||||
Main BSS is not removed here.
|
||||
========================================================================
|
||||
*/
|
||||
VOID MBSS_Remove(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
struct wifi_dev *wdev;
|
||||
UINT IdBss;
|
||||
BSS_STRUCT *pMbss;
|
||||
|
||||
|
||||
|
||||
for(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++)
|
||||
{
|
||||
wdev = &pAd->ApCfg.MBSSID[IdBss].wdev;
|
||||
pMbss = &pAd->ApCfg.MBSSID[IdBss];
|
||||
if (pMbss) {
|
||||
wdev_bcn_buf_deinit(pAd, &pMbss->bcn_buf);
|
||||
}
|
||||
if (wdev->if_dev)
|
||||
{
|
||||
RtmpOSNetDevProtect(1);
|
||||
RtmpOSNetDevDetach(wdev->if_dev);
|
||||
RtmpOSNetDevProtect(0);
|
||||
rtmp_wdev_idx_unreg(pAd, wdev);
|
||||
RtmpOSNetDevFree(wdev->if_dev);
|
||||
wdev->if_dev = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Get multiple bss idx.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: close successfully
|
||||
otherwise: close fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT32 RT28xx_MBSS_IdxGet(RTMP_ADAPTER *pAd, PNET_DEV pDev)
|
||||
{
|
||||
INT32 BssId = -1;
|
||||
INT32 IdBss;
|
||||
|
||||
|
||||
for(IdBss=0; IdBss<pAd->ApCfg.BssidNum; IdBss++)
|
||||
{
|
||||
if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev == pDev)
|
||||
{
|
||||
BssId = IdBss;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return BssId;
|
||||
}
|
||||
|
||||
#ifdef MT_MAC
|
||||
INT32 mbss_cr_enable(PNET_DEV pDev)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
INT BssId;
|
||||
UINT32 Value = 0;
|
||||
//register for sub Bssid start from 0x603000a0
|
||||
UINT32 bssid_reg_base = LPON_SBTOR1;
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
BssId = RT28xx_MBSS_IdxGet(pAd, pDev);
|
||||
printk("##### %s, BssId = %d\n", __func__, BssId);
|
||||
if (BssId < 0)
|
||||
return -1;
|
||||
|
||||
if (pAd->chipCap.hif_type != HIF_MT)
|
||||
return 0;
|
||||
|
||||
|
||||
if (BssId >= 1) {
|
||||
//if there is any sub bssid is enable. this bit in LPON_SBTOR1 shall be 1 always.
|
||||
RTMP_IO_READ32(pAd, bssid_reg_base, &Value);
|
||||
Value |= SBSS_TBTT0_TSF0_EN;
|
||||
RTMP_IO_WRITE32(pAd, bssid_reg_base, Value);
|
||||
|
||||
RTMP_IO_READ32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), &Value);
|
||||
Value = 0;
|
||||
Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK;
|
||||
Value |= SUB_BSSID0_TIME_OFFSET_n(BssId * (20 + 4096));
|
||||
|
||||
/* SIFS time, 20us, and assume bcn len is 512 byte, tx by 1Mbps.*/
|
||||
Value |= TBTT0_n_INT_EN;
|
||||
Value |= PRE_TBTT0_n_INT_EN;
|
||||
Value |= SBSS_TBTT0_TSF0_EN;
|
||||
|
||||
RTMP_IO_WRITE32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), Value);
|
||||
|
||||
/* Start Beacon Queue */
|
||||
RTMP_IO_READ32(pAd, ARB_BCNQCR0, &Value);
|
||||
Value |= (0x1 << (BssId+15));
|
||||
RTMP_IO_WRITE32(pAd, ARB_BCNQCR0, Value);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT mbss_cr_disable(PNET_DEV pDev)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
INT BssId;
|
||||
UINT32 Value;
|
||||
UINT32 bssid_reg_base = LPON_SBTOR1;
|
||||
UCHAR loop = 0;
|
||||
BOOLEAN any_mbss_enable = FALSE;
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
BssId = RT28xx_MBSS_IdxGet(pAd, pDev);
|
||||
if (BssId < 0)
|
||||
return -1;
|
||||
|
||||
if (pAd->chipCap.hif_type != HIF_MT)
|
||||
return 0;
|
||||
|
||||
for (loop = 1; loop < pAd->ApCfg.BssidNum; loop++) {
|
||||
if (loop == BssId)
|
||||
continue;//skip itself.
|
||||
if (pAd->ApCfg.MBSSID[loop].bcn_buf.bBcnSntReq == TRUE)
|
||||
any_mbss_enable = TRUE;
|
||||
}
|
||||
|
||||
if (BssId >= 1) {
|
||||
RTMP_IO_READ32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), &Value);
|
||||
Value = 0;
|
||||
Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK;
|
||||
Value |= SUB_BSSID0_TIME_OFFSET_n(BssId * (20 + 4096));
|
||||
Value &= ~TBTT0_n_INT_EN;
|
||||
Value &= ~PRE_TBTT0_n_INT_EN;
|
||||
if (any_mbss_enable == TRUE)
|
||||
Value |= SBSS_TBTT0_TSF0_EN;
|
||||
else
|
||||
Value &= ~SBSS_TBTT0_TSF0_EN;
|
||||
RTMP_IO_WRITE32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), Value);
|
||||
RTMP_IO_READ32(pAd, ARB_BCNQCR0, &Value);
|
||||
Value &= ~(0x1 << (BssId+15));
|
||||
RTMP_IO_WRITE32(pAd, ARB_BCNQCR0, Value);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* MT_MAC */
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Open a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: open successfully
|
||||
otherwise: open fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT32 MBSS_Open(PNET_DEV pDev)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
INT BssId;
|
||||
UINT32 u4MaxMBSSIDSize;
|
||||
|
||||
u4MaxMBSSIDSize = sizeof(pAd->ApCfg.MBSSID)/sizeof(pAd->ApCfg.MBSSID[0]);
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
BssId = RT28xx_MBSS_IdxGet(pAd, pDev);
|
||||
if (BssId < 0)
|
||||
return -1;
|
||||
|
||||
if(BssId >= u4MaxMBSSIDSize)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Over buffer size!\n", __FUNCTION__));
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef AIRPLAY_SUPPORT
|
||||
if (AIRPLAY_ON(pAd))
|
||||
pAd->ApCfg.MBSSID[BssId].bcn_buf.bBcnSntReq = TRUE;
|
||||
else
|
||||
pAd->ApCfg.MBSSID[BssId].bcn_buf.bBcnSntReq = FALSE;
|
||||
#else
|
||||
pAd->ApCfg.MBSSID[BssId].bcn_buf.bBcnSntReq = TRUE;
|
||||
#endif /* AIRPLAY_SUPPORT */
|
||||
|
||||
#ifdef BAND_STEERING
|
||||
if(pAd->ApCfg.BandSteering)
|
||||
{
|
||||
PBND_STRG_CLI_TABLE table;
|
||||
table = Get_BndStrgTable(pAd, BssId);
|
||||
if(table)
|
||||
{
|
||||
/* Inform daemon interface ready */
|
||||
BndStrg_SetInfFlags(pAd, &pAd->ApCfg.MBSSID[BssId].wdev, table, TRUE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Close a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: close successfully
|
||||
otherwise: close fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT MBSS_Close(PNET_DEV pDev)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
INT BssId;
|
||||
UINT32 u4MaxMBSSIDSize;
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
BssId = RT28xx_MBSS_IdxGet(pAd, pDev);
|
||||
if (BssId < 0)
|
||||
return -1;
|
||||
|
||||
RTMP_OS_NETDEV_STOP_QUEUE(pDev);
|
||||
|
||||
/* kick out all stas behind the Bss */
|
||||
MbssKickOutStas(pAd, BssId, REASON_DISASSOC_INACTIVE);
|
||||
|
||||
u4MaxMBSSIDSize = sizeof(pAd->ApCfg.MBSSID)/sizeof(pAd->ApCfg.MBSSID[0]);
|
||||
if(BssId >= u4MaxMBSSIDSize)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Over buffer size!\n", __FUNCTION__));
|
||||
return -1;
|
||||
}
|
||||
|
||||
pAd->ApCfg.MBSSID[BssId].bcn_buf.bBcnSntReq = FALSE;
|
||||
|
||||
|
||||
APMakeAllBssBeacon(pAd);
|
||||
APUpdateAllBeaconFrame(pAd);
|
||||
|
||||
#ifdef BAND_STEERING
|
||||
if(pAd->ApCfg.BandSteering)
|
||||
{
|
||||
PBND_STRG_CLI_TABLE table;
|
||||
table = Get_BndStrgTable(pAd, BssId);
|
||||
if(table)
|
||||
{
|
||||
/* Inform daemon interface down */
|
||||
BndStrg_SetInfFlags(pAd, &pAd->ApCfg.MBSSID[BssId].wdev, table, FALSE);
|
||||
}
|
||||
}
|
||||
#endif /* BAND_STEERING */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* MBSS_SUPPORT */
|
||||
|
202
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_mbss_inf.c
Normal file
202
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_mbss_inf.c
Normal file
@ -0,0 +1,202 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Abstract:
|
||||
|
||||
Support multi-BSS function.
|
||||
|
||||
Note:
|
||||
1. Call RT28xx_MBSS_Init() in init function and
|
||||
call RT28xx_MBSS_Remove() in close function
|
||||
|
||||
2. MAC of different BSS is initialized in APStartUp()
|
||||
|
||||
3. BSS Index (0 ~ 15) of different rx packet is got in
|
||||
|
||||
4. BSS Index (0 ~ 15) of different tx packet is assigned in
|
||||
|
||||
5. BSS Index (0 ~ 15) of different BSS is got in APHardTransmit() by using
|
||||
|
||||
6. BSS Index (0 ~ 15) of IOCTL command is put in pAd->OS_Cookie->ioctl_if
|
||||
|
||||
7. Beacon of different BSS is enabled in APMakeAllBssBeacon() by writing 1
|
||||
to the register MAC_BSSID_DW1
|
||||
|
||||
8. The number of MBSS can be 1, 2, 4, or 8
|
||||
|
||||
***************************************************************************/
|
||||
#define RTMP_MODULE_OS
|
||||
|
||||
#ifdef MBSS_SUPPORT
|
||||
|
||||
/*#include "rt_config.h" */
|
||||
#include "rtmp_comm.h"
|
||||
#include "rt_os_util.h"
|
||||
#include "rt_os_net.h"
|
||||
|
||||
|
||||
/* --------------------------------- Public -------------------------------- */
|
||||
NET_DEV_STATS *RT28xx_get_ether_stats(PNET_DEV net_dev);
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize Multi-BSS function.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
pDevMain points to the main BSS network interface
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
1. Only create and initialize virtual network interfaces.
|
||||
2. No main network interface here.
|
||||
3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat,
|
||||
it will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again.
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28xx_MBSS_Init(VOID *pAd, PNET_DEV pDevMain)
|
||||
{
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevHook;
|
||||
|
||||
NdisZeroMemory(&netDevHook, sizeof(netDevHook));
|
||||
netDevHook.open = MBSS_VirtualIF_Open; /* device opem hook point */
|
||||
netDevHook.stop = MBSS_VirtualIF_Close; /* device close hook point */
|
||||
netDevHook.xmit = rt28xx_send_packets; /* hard transmit hook point */
|
||||
netDevHook.ioctl = rt28xx_ioctl; /* ioctl hook point */
|
||||
netDevHook.get_stats = RT28xx_get_ether_stats;
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_INIT,
|
||||
0, &netDevHook, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Remove Multi-BSS network interface.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
FIRST_MBSSID = 1
|
||||
Main BSS is not removed here.
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28xx_MBSS_Remove(VOID *pAd)
|
||||
{
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_REMOVE, 0, NULL, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* --------------------------------- Private -------------------------------- */
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Open a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: open successfully
|
||||
otherwise: open fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT MBSS_VirtualIF_Open(PNET_DEV pDev)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
/* increase MODULE use count */
|
||||
RT_MOD_INC_USE_COUNT();
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> MBSSVirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev)));
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_OPEN, 0, pDev, 0);
|
||||
|
||||
if (VIRTUAL_IF_UP(pAd) != 0)
|
||||
return -1;
|
||||
|
||||
#ifdef MT_MAC
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_CR_ENABLE, 0, pDev, 0);
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_REG(pDev);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
RTMP_OS_NETDEV_START_QUEUE(pDev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Close a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: close successfully
|
||||
otherwise: close fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT MBSS_VirtualIF_Close(PNET_DEV pDev)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> MBSSVirtualIF_close\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev)));
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
|
||||
#ifdef MT_MAC
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_CR_DISABLE, 0, pDev, 0);
|
||||
#endif
|
||||
|
||||
RTMP_OS_NETDEV_STOP_QUEUE(pDev);
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_CLOSE, 0, pDev, 0);
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_DEREG(pDev);
|
||||
#endif
|
||||
VIRTUAL_IF_DOWN(pAd);
|
||||
|
||||
RT_MOD_DEC_USE_COUNT();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* MBSS_SUPPORT */
|
||||
|
533
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_mix_mode.c
Normal file
533
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_mix_mode.c
Normal file
@ -0,0 +1,533 @@
|
||||
#include "rt_config.h"
|
||||
#include "mix_mode.h"
|
||||
|
||||
|
||||
static INT scan_ch_restore_for_MixMode(RTMP_ADAPTER *pAd, UCHAR OpMode)
|
||||
{
|
||||
INT bw, ch;
|
||||
|
||||
|
||||
if (pAd->CommonCfg.BBPCurrentBW != pAd->hw_cfg.bbp_bw)
|
||||
bbp_set_bw(pAd, pAd->hw_cfg.bbp_bw);
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (pAd->hw_cfg.bbp_bw == BW_80)
|
||||
ch = pAd->CommonCfg.vht_cent_ch;
|
||||
else
|
||||
#endif /* DOT11_VHT_AC */
|
||||
if (pAd->hw_cfg.bbp_bw == BW_40)
|
||||
ch = pAd->CommonCfg.CentralChannel;
|
||||
else
|
||||
ch = pAd->CommonCfg.Channel;
|
||||
|
||||
switch(pAd->CommonCfg.BBPCurrentBW)
|
||||
{
|
||||
case BW_80:
|
||||
bw = 80;
|
||||
break;
|
||||
case BW_40:
|
||||
bw = 40;
|
||||
break;
|
||||
case BW_10:
|
||||
bw = 10;
|
||||
break;
|
||||
case BW_20:
|
||||
default:
|
||||
bw =20;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
ASSERT((ch != 0));
|
||||
AsicSwitchChannel(pAd, ch, FALSE);
|
||||
AsicLockChannel(pAd, ch);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to %dMHz channel %d, Total BSS[%02d]\n",
|
||||
bw, ch, pAd->ScanTab.BssNr));
|
||||
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
if (OpMode == OPMODE_AP)
|
||||
{
|
||||
#ifdef APCLI_SUPPORT
|
||||
#ifdef APCLI_AUTO_CONNECT_SUPPORT
|
||||
if (pAd->ApCfg.ApCliAutoConnectRunning == TRUE)
|
||||
{
|
||||
if (!ApCliAutoConnectExec(pAd))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Error in %s\n", __FUNCTION__));
|
||||
}
|
||||
}
|
||||
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
|
||||
#endif /* APCLI_SUPPORT */
|
||||
pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE;
|
||||
RTMPResumeMsduTransmission(pAd);
|
||||
|
||||
/* iwpriv set auto channel selection*/
|
||||
/* scanned all channels*/
|
||||
if (pAd->ApCfg.bAutoChannelAtBootup==TRUE)
|
||||
{
|
||||
pAd->CommonCfg.Channel = SelectBestChannel(pAd, pAd->ApCfg.AutoChannelAlg);
|
||||
pAd->ApCfg.bAutoChannelAtBootup = FALSE;
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
N_ChannelCheck(pAd);
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
APStop(pAd);
|
||||
APStartUp(pAd);
|
||||
}
|
||||
|
||||
if (!((pAd->CommonCfg.Channel > 14) && (pAd->CommonCfg.bIEEE80211H == TRUE) && (pAd->Dot11_H.RDMode != RD_NORMAL_MODE)))
|
||||
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static BOOLEAN MixModeChannelCheck(IN PRTMP_ADAPTER pAd, UCHAR channel, struct wifi_dev *wdev)
|
||||
{
|
||||
|
||||
if(channel == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s pass a invalid channel\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*check channel in channel list*/
|
||||
if(ChannelSanity(pAd, channel) == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("the channel parameter is out of channel list\n"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*check channel & phy mode*/
|
||||
if((channel < 14 && WMODE_CAP_5G(wdev->PhyMode)) ||
|
||||
(channel > 14 && WMODE_CAP_2G(wdev->PhyMode))) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("the channel parameter and phy mode is not matched\n"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static INT MixModeSwitchCH(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UCHAR channel;
|
||||
struct wifi_dev *wdev;
|
||||
struct peer_info *mon_sta_info = &pAd->MixModeCtrl.sta_info[0];
|
||||
|
||||
if(pAd == NULL)
|
||||
return -1;
|
||||
|
||||
channel = pAd->MixModeCtrl.sta_info[0].channel;
|
||||
wdev = pAd->MixModeCtrl.pMixModewdev;
|
||||
|
||||
/*check channel with current band channel*/
|
||||
if(channel == wdev->channel) {
|
||||
DBGPRINT(RT_DEBUG_TRACE,
|
||||
("%s:: current channel is the sniffer set channel %d\n", __FUNCTION__, channel));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Disable BCN */
|
||||
AsicDisableSync(pAd);
|
||||
|
||||
/*need to poll tx Q unitl empty*/
|
||||
|
||||
/* Suspend MSDU transmission here */
|
||||
RTMPSuspendMsduTransmission(pAd);
|
||||
|
||||
bbp_set_bw(pAd, mon_sta_info->bw);
|
||||
|
||||
/*Switch Channel*/
|
||||
AsicSwitchChannel(pAd, mon_sta_info->center_channel, FALSE);
|
||||
AsicLockChannel(pAd, mon_sta_info->center_channel);
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("%s:: switch to channel %d\n", __FUNCTION__, channel));
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static CHAR MixModeCalcAvgRssi(RTMP_ADAPTER *pAd, UCHAR idx)
|
||||
{
|
||||
UCHAR mnt_idx = 0;
|
||||
LONG avgRssi = -127;
|
||||
|
||||
struct peer_info *sta = &pAd->MixModeCtrl.sta_info[mnt_idx];
|
||||
LONG mgmt_rssi = sta->mnt_sta.frm[FC_TYPE_MGMT].rssi;
|
||||
LONG data_rssi = sta->mnt_sta.frm[FC_TYPE_DATA].rssi;
|
||||
LONG cntl_rssi = sta->mnt_sta.frm[FC_TYPE_CNTL].rssi;
|
||||
LONG total = sta->mnt_sta.Count;
|
||||
|
||||
/*
|
||||
* weight * rssi
|
||||
* But need to check vaule
|
||||
* it cannot overflow
|
||||
*/
|
||||
if (total)
|
||||
avgRssi = (mgmt_rssi + data_rssi + cntl_rssi) / total;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("%s:: %02x:%02x:%02x:%02x:%02x:%02x, avgRssi=%ld\n", __FUNCTION__, PRINT_MAC(sta->mac_addr), avgRssi));
|
||||
|
||||
return avgRssi;
|
||||
}
|
||||
|
||||
static INT MixModeSniffer(RTMP_ADAPTER *pAd, UINT8 enable)
|
||||
{
|
||||
if (enable == TRUE)
|
||||
pAd->MixModeCtrl.current_monitor_mode = MIX_MODE_FULL;
|
||||
else if (enable == FALSE)
|
||||
pAd->MixModeCtrl.current_monitor_mode = MIX_MODE_OFF;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("%s(): set Current Monitor Mode = %d\n",
|
||||
__FUNCTION__, pAd->MixModeCtrl.current_monitor_mode));
|
||||
|
||||
switch(pAd->MixModeCtrl.current_monitor_mode)
|
||||
{
|
||||
/*reset to normal */
|
||||
case MIX_MODE_OFF:
|
||||
pAd->ApCfg.BssType = BSS_INFRA;
|
||||
AsicSetRxFilter(pAd);
|
||||
break;
|
||||
|
||||
/*fully report, Enable Rx with promiscuous reception*/
|
||||
case MIX_MODE_FULL:
|
||||
pAd->ApCfg.BssType = BSS_MONITOR;
|
||||
AsicSetRxFilter(pAd);
|
||||
break;
|
||||
default:
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("MIX MODE index ONLY be set to 0 or 2\n"));
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//extern INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode);
|
||||
|
||||
static VOID MixModeRestoreCH(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if(pAd->MixModeCtrl.pMixModewdev != NULL &&
|
||||
(pAd->MixModeCtrl.sta_info[0].channel != (pAd->MixModeCtrl.pMixModewdev)->channel))
|
||||
/*scan ch restore for MixMode will do enable BCN*/
|
||||
scan_ch_restore_for_MixMode(pAd, OPMODE_AP);
|
||||
}
|
||||
|
||||
static VOID MixModeReset(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
pAd->MixModeCtrl.MixModeOn = FALSE;
|
||||
pAd->MixModeCtrl.pMixModewdev = NULL;
|
||||
pAd->MixModeCtrl.MixModeStatMachine.CurrState = MIX_MODE_STATE_INIT;
|
||||
pAd->MixModeCtrl.ioctl_if = -1;
|
||||
}
|
||||
|
||||
static VOID MixModeListenExit(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
BOOLEAN disbleSniffer = FALSE;
|
||||
BOOLEAN mixmode_done = TRUE;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
if(MixModeSniffer(pAd,disbleSniffer) !=0)
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s fail by sniffer mode\n",__FUNCTION__));
|
||||
|
||||
MixModeRestoreCH(pAd);
|
||||
MixModeReset(pAd);
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s::Exit mix mode\n", __FUNCTION__));
|
||||
/* send event to userspace */
|
||||
RtmpOSWrielessEventSend(pAd->net_dev,
|
||||
RT_WLAN_EVENT_CUSTOM,
|
||||
RT_MIX_MODE_EVENT_FLAG,
|
||||
NULL,
|
||||
(char *)&mixmode_done,
|
||||
sizeof(mixmode_done));
|
||||
}
|
||||
|
||||
static VOID MixModeListenCancel(RTMP_ADAPTER *pAd,MLME_QUEUE_ELEM *pElem)
|
||||
{
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
MixModeListenExit(pAd);
|
||||
}
|
||||
|
||||
|
||||
static VOID MixModeListenTimeout(RTMP_ADAPTER *pAd,MLME_QUEUE_ELEM *pElem)
|
||||
{
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
MixModeListenExit(pAd);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static VOID MixModeEnterListen(RTMP_ADAPTER *pAd,MLME_QUEUE_ELEM *pElem)
|
||||
{
|
||||
INT32 ret;
|
||||
BOOLEAN enbleSniffer = TRUE;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
/*switch channel*/
|
||||
ret = MixModeSwitchCH(pAd);
|
||||
if(ret != 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s fail by switch channel\n",__FUNCTION__));
|
||||
MixModeReset(pAd);
|
||||
return;
|
||||
}
|
||||
|
||||
/*enter sniffer mode*/
|
||||
ret = MixModeSniffer(pAd,enbleSniffer);
|
||||
if(ret != 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s fail by sniffer mode\n",__FUNCTION__));
|
||||
MixModeRestoreCH(pAd);
|
||||
MixModeReset(pAd);
|
||||
return;
|
||||
}
|
||||
pAd->MixModeCtrl.MixModeOn = TRUE;
|
||||
pAd->MixModeCtrl.MixModeStatMachine.CurrState = MIX_MODE_STATE_RUNNING;
|
||||
DBGPRINT(RT_DEBUG_OFF, ("pAd->MixModeCtrl.sta_info[0].duration = %d\n", pAd->MixModeCtrl.sta_info[0].duration));
|
||||
RTMPSetTimer(&pAd->MixModeCtrl.MixModeTimer, pAd->MixModeCtrl.sta_info[0].duration);
|
||||
}
|
||||
|
||||
static VOID MixModeStateMachineInit(IN RTMP_ADAPTER *pAd, IN STATE_MACHINE *Sm, OUT STATE_MACHINE_FUNC Trans[])
|
||||
{
|
||||
/*Init*/
|
||||
StateMachineInit(Sm,(STATE_MACHINE_FUNC *)Trans,MIX_MODE_STATE_MAX, MIX_MODE_MSG_MAX, (STATE_MACHINE_FUNC)Drop, MIX_MODE_STATE_INIT, MIX_MODE_STATE_BASE);
|
||||
|
||||
/*Idle*/
|
||||
StateMachineSetAction(Sm, MIX_MODE_STATE_INIT, MIX_MODE_MSG_LISTEN, (STATE_MACHINE_FUNC)MixModeEnterListen);
|
||||
/*Running*/
|
||||
StateMachineSetAction(Sm, MIX_MODE_STATE_RUNNING, MIX_MODE_MSG_CANCLE, (STATE_MACHINE_FUNC)MixModeListenCancel);
|
||||
StateMachineSetAction(Sm, MIX_MODE_STATE_RUNNING, MIX_MODE_MSG_TIMEOUT, (STATE_MACHINE_FUNC)MixModeListenTimeout);
|
||||
}
|
||||
|
||||
|
||||
VOID MixModeTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2, IN PVOID SystemSpecific3)
|
||||
{
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)FunctionContext;
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
MlmeEnqueue(pAd, MIX_MODE_STATE_MACHINE, MIX_MODE_MSG_TIMEOUT, 0, NULL, 0);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
|
||||
VOID MixModeDebugInfo(IN PRTMP_ADAPTER pAd, IN int idx)
|
||||
{
|
||||
MIX_MODE_CTRL *MixModeCtrl = &pAd->MixModeCtrl;
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("MixMode status = %d\nMixMode CurrState = %lu\nMixMode CH = %d\n"
|
||||
"targetMac = %02x:%02x:%02x:%02x:%02x:%02x\nMixMode Duration = %d\n",
|
||||
MixModeCtrl->MixModeOn, MixModeCtrl->MixModeStatMachine.CurrState,
|
||||
MixModeCtrl->sta_info[idx].channel,
|
||||
PRINT_MAC(MixModeCtrl->sta_info[idx].mac_addr),
|
||||
MixModeCtrl->sta_info[idx].duration));
|
||||
|
||||
}
|
||||
|
||||
VOID MixModeProcessData(RTMP_ADAPTER *pAd, void *rxBlk)
|
||||
{
|
||||
RX_BLK *pRxBlk = (RX_BLK*)rxBlk;
|
||||
PHEADER_802_11 pHeader;
|
||||
CHAR avg_rssi;
|
||||
struct peer_info *mon_sta_info = &pAd->MixModeCtrl.sta_info[0];
|
||||
FRAME_CONTROL *fc;
|
||||
struct MNT_STA_INFO *mnt_sta;
|
||||
|
||||
// DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
ASSERT(pRxBlk->pRxPacket);
|
||||
|
||||
pHeader = pRxBlk->pHeader;
|
||||
fc = &pHeader->FC;
|
||||
mnt_sta = &mon_sta_info->mnt_sta;
|
||||
|
||||
// DBGPRINT(RT_DEBUG_OFF, ("mon_sta_info->mac_addr = %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(mon_sta_info->mac_addr)));
|
||||
|
||||
if (NdisEqualMemory(pHeader->Addr2, mon_sta_info->mac_addr, MAC_ADDR_LEN)) {
|
||||
if (fc->Type == FC_TYPE_DATA)
|
||||
Update_Rssi_Sample(pAd, &mon_sta_info->RssiSample, &pRxBlk->rx_signal,
|
||||
pRxBlk->rx_rate.field.MODE, pRxBlk->rx_rate.field.BW);
|
||||
else
|
||||
Update_Rssi_Sample(pAd, &mon_sta_info->RssiSample, &pRxBlk->rx_signal,
|
||||
0, pRxBlk->rx_rate.field.BW);
|
||||
|
||||
avg_rssi = RTMPAvgRssi(pAd, &mon_sta_info->RssiSample);
|
||||
|
||||
if (fc->Type < FC_TYPE_RSVED) {
|
||||
mnt_sta->frm[fc->Type].cnt++;
|
||||
mnt_sta->frm[fc->Type].rssi += avg_rssi;
|
||||
mnt_sta->Count++;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("fctype = %d ,mgmt = %ld , data = %ld , cnt = %ld "
|
||||
"frame FROM %02x:%02x:%02x:%02x:%02x:%02x TO "
|
||||
"%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
fc->Type,
|
||||
mnt_sta->frm[FC_TYPE_MGMT].cnt,
|
||||
mnt_sta->frm[FC_TYPE_DATA].cnt,
|
||||
mnt_sta->frm[FC_TYPE_CNTL].cnt,
|
||||
PRINT_MAC(pHeader->Addr2),
|
||||
PRINT_MAC(pHeader->Addr1)));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* 1. check parameters
|
||||
* 2. check other SMs
|
||||
* 3. run SM
|
||||
*/
|
||||
INT MixModeSet(IN PRTMP_ADAPTER pAd, struct mix_peer_parameter *sta_info, IN UCHAR idx)
|
||||
{
|
||||
POS_COOKIE pObj;
|
||||
struct wifi_dev *wdev;
|
||||
struct peer_info *mon_sta_info = &pAd->MixModeCtrl.sta_info[0];
|
||||
|
||||
if (pAd == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev;
|
||||
|
||||
if (wdev == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
pAd->MixModeCtrl.pMixModewdev = wdev;
|
||||
pAd->MixModeCtrl.ioctl_if = pObj->ioctl_if;
|
||||
|
||||
if (sta_info->mac_addr == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
if (NdisEqualMemory(sta_info->mac_addr, &BROADCAST_ADDR[0], MAC_ADDR_LEN) ||
|
||||
NdisEqualMemory(sta_info->mac_addr, &ZERO_MAC_ADDR[0], MAC_ADDR_LEN)) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s pass a invalid mac %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
__FUNCTION__, PRINT_MAC(sta_info->mac_addr)));
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
NdisZeroMemory(mon_sta_info, sizeof(struct peer_info));
|
||||
NdisCopyMemory(mon_sta_info->mac_addr, sta_info->mac_addr, MAC_ADDR_LEN);
|
||||
|
||||
if (MixModeChannelCheck(pAd, sta_info->channel, wdev))
|
||||
mon_sta_info->channel = sta_info->channel;
|
||||
else
|
||||
return -EFAULT;
|
||||
|
||||
if (sta_info->duration == 0)
|
||||
mon_sta_info->duration = MixModeDefualtListenTime;
|
||||
else
|
||||
mon_sta_info->duration = sta_info->duration;
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (sta_info->channel > 14) {
|
||||
mon_sta_info->bw = BW_80;
|
||||
mon_sta_info->center_channel = vht_cent_ch_freq(pAd, sta_info->channel);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
mon_sta_info->bw = sta_info->bw;
|
||||
mon_sta_info->ch_offset = sta_info->ch_offset;
|
||||
|
||||
if(sta_info->bw == BW_40) {
|
||||
/*check bw & channel*/
|
||||
if ((sta_info->channel < 5 && sta_info->ch_offset == EXTCHA_BELOW)
|
||||
|| (sta_info->channel > 9 && sta_info->ch_offset == EXTCHA_ABOVE)) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s pass a invalid primary channel & second channel\n", __FUNCTION__));
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if(sta_info->ch_offset == EXTCHA_ABOVE)
|
||||
mon_sta_info->center_channel = sta_info->channel + 2;
|
||||
else if(sta_info->ch_offset == EXTCHA_BELOW)
|
||||
mon_sta_info->center_channel = sta_info->channel - 2;
|
||||
} else
|
||||
mon_sta_info->center_channel = sta_info->channel;
|
||||
}
|
||||
|
||||
/*check other SMs like autsel or bgscan etc*/
|
||||
MlmeEnqueue(pAd, MIX_MODE_STATE_MACHINE, MIX_MODE_MSG_LISTEN, 0, NULL, 0);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
INT RTMPIoctlQueryMixModeRssi(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
||||
{
|
||||
INT Status;
|
||||
CHAR avg_rssi;
|
||||
|
||||
avg_rssi = MixModeCalcAvgRssi(pAd, 0);
|
||||
|
||||
wrq->u.data.length = sizeof(avg_rssi);
|
||||
|
||||
Status = copy_to_user(wrq->u.data.pointer, &avg_rssi, wrq->u.data.length);
|
||||
|
||||
if(Status)
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s: copy_to_user() fail\n", __FUNCTION__));
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
VOID MixModeCancel(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
BOOLEAN Cancelled;
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
RTMPCancelTimer(&pAd->MixModeCtrl.MixModeTimer,&Cancelled);
|
||||
|
||||
MlmeEnqueue(pAd, MIX_MODE_STATE_MACHINE, MIX_MODE_MSG_CANCLE, 0, NULL, 0);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
|
||||
VOID MixModeInit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
MixModeReset(pAd);
|
||||
MixModeStateMachineInit(pAd, &pAd->MixModeCtrl.MixModeStatMachine, pAd->MixModeCtrl.MixModeStateFunc);
|
||||
RTMPInitTimer(pAd, &pAd->MixModeCtrl.MixModeTimer, GET_TIMER_FUNCTION(MixModeTimeout), pAd, FALSE);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Enter %s\n", __FUNCTION__));
|
||||
}
|
||||
|
||||
VOID MixModeDel(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
BOOLEAN Cancelled;
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
RTMPReleaseTimer(&pAd->MixModeCtrl.MixModeTimer, &Cancelled);
|
||||
NdisZeroMemory(&pAd->MixModeCtrl.sta_info, sizeof(pAd->MixModeCtrl.sta_info));
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Exit %s\n", __FUNCTION__));
|
||||
}
|
||||
|
769
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_mlme.c
Normal file
769
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_mlme.c
Normal file
@ -0,0 +1,769 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
mlme.c
|
||||
|
||||
Abstract:
|
||||
Major MLME state machiones here
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
John Chang 08-04-2003 created for 11g soft-AP
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef BTCOEX_CONCURRENT
|
||||
extern void MT7662ReceCoexFromOtherCHip(
|
||||
IN UCHAR channel,
|
||||
IN UCHAR centralchannel,
|
||||
IN UCHAR channel_bw
|
||||
);
|
||||
#endif
|
||||
#if defined(MAX_CONTINUOUS_TX_CNT) || defined(NEW_IXIA_METHOD)
|
||||
VOID rtmp_deqmode_detect(RTMP_ADAPTER *pAd);
|
||||
#endif
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
|
||||
int DetectOverlappingPeriodicRound;
|
||||
|
||||
|
||||
#ifdef DOT11N_DRAFT3
|
||||
VOID Bss2040CoexistTimeOut(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
int apidx;
|
||||
PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Bss2040CoexistTimeOut(): Recovery to original setting!\n"));
|
||||
|
||||
/* Recovery to original setting when next DTIM Interval. */
|
||||
pAd->CommonCfg.Bss2040CoexistFlag &= (~BSS_2040_COEXIST_TIMER_FIRED);
|
||||
NdisZeroMemory(&pAd->CommonCfg.LastBSSCoexist2040, sizeof(BSS_2040_COEXIST_IE));
|
||||
pAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC;
|
||||
|
||||
if (pAd->CommonCfg.bBssCoexEnable == FALSE)
|
||||
{
|
||||
/* TODO: Find a better way to handle this when the timer is fired and we disable the bBssCoexEable support!! */
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Bss2040CoexistTimeOut(): bBssCoexEnable is FALSE, return directly!\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)
|
||||
SendBSS2040CoexistMgmtAction(pAd, MCAST_WCID, apidx, 0);
|
||||
|
||||
}
|
||||
#endif /* DOT11N_DRAFT3 */
|
||||
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
|
||||
|
||||
VOID APDetectOverlappingExec(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext;
|
||||
|
||||
if (DetectOverlappingPeriodicRound == 0)
|
||||
{
|
||||
/* switch back 20/40 */
|
||||
if ((pAd->CommonCfg.Channel <=14) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40))
|
||||
{
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((DetectOverlappingPeriodicRound == 25) || (DetectOverlappingPeriodicRound == 1))
|
||||
{
|
||||
if ((pAd->CommonCfg.Channel <=14) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth==BW_40))
|
||||
{
|
||||
SendBeaconRequest(pAd, 1);
|
||||
SendBeaconRequest(pAd, 2);
|
||||
SendBeaconRequest(pAd, 3);
|
||||
}
|
||||
|
||||
}
|
||||
DetectOverlappingPeriodicRound--;
|
||||
}
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine is executed every second -
|
||||
1. Decide the overall channel quality
|
||||
2. Check if need to upgrade the TX rate to any client
|
||||
3. perform MAC table maintenance, including ageout no-traffic clients,
|
||||
and release packet buffer in PSQ is fail to TX in time.
|
||||
==========================================================================
|
||||
*/
|
||||
VOID APMlmePeriodicExec(
|
||||
PRTMP_ADAPTER pAd)
|
||||
{
|
||||
#ifdef A4_CONN
|
||||
UCHAR mbss_idx;
|
||||
#endif
|
||||
/*
|
||||
Reqeust by David 2005/05/12
|
||||
It make sense to disable Adjust Tx Power on AP mode, since we can't
|
||||
take care all of the client's situation
|
||||
ToDo: need to verify compatibility issue with WiFi product.
|
||||
*/
|
||||
|
||||
#ifdef BTCOEX_CONCURRENT
|
||||
MT7662ReceCoexFromOtherCHip(pAd->CommonCfg.Channel,pAd->CommonCfg.CentralChannel,pAd->CommonCfg.BBPCurrentBW);
|
||||
#endif
|
||||
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
if (isCarrierDetectExist(pAd) == TRUE)
|
||||
{
|
||||
PCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;
|
||||
if (pCarrierDetect->OneSecIntCount < pCarrierDetect->CarrierGoneThreshold)
|
||||
{
|
||||
pCarrierDetect->CD_State = CD_NORMAL;
|
||||
pCarrierDetect->recheck = pCarrierDetect->recheck1;
|
||||
if (pCarrierDetect->Debug != RT_DEBUG_TRACE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Carrier gone\n"));
|
||||
/* start all TX actions. */
|
||||
APMakeAllBssBeacon(pAd);
|
||||
APUpdateAllBeaconFrame(pAd);
|
||||
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Carrier gone\n"));
|
||||
}
|
||||
}
|
||||
pCarrierDetect->OneSecIntCount = 0;
|
||||
}
|
||||
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
|
||||
RTMP_CHIP_HIGH_POWER_TUNING(pAd, &pAd->ApCfg.RssiSample);
|
||||
|
||||
|
||||
/* Disable Adjust Tx Power for WPA WiFi-test. */
|
||||
/* Because high TX power results in the abnormal disconnection of Intel BG-STA. */
|
||||
/*#ifndef WIFI_TEST */
|
||||
/* if (pAd->CommonCfg.bWiFiTest == FALSE) */
|
||||
/* for SmartBit 64-byte stream test */
|
||||
/* removed based on the decision of Ralink congress at 2011/7/06 */
|
||||
/* if (pAd->MacTab.Size > 0) */
|
||||
RTMP_CHIP_ASIC_ADJUST_TX_POWER(pAd);
|
||||
/*#endif // WIFI_TEST */
|
||||
|
||||
RTMP_CHIP_ASIC_TEMPERATURE_COMPENSATION(pAd);
|
||||
|
||||
/* walk through MAC table, see if switching TX rate is required */
|
||||
|
||||
/* MAC table maintenance */
|
||||
if (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0)
|
||||
{
|
||||
#if defined(BAND_STEERING) || defined(CUSTOMER_DCC_FEATURE) || defined(WIFI_DIAG)\
|
||||
|| defined(WAPP_SUPPORT)
|
||||
UINT32 msdr9;
|
||||
|
||||
/* NAV, CCA, or TX active timer in unit of TU, used for Measurement. (channel busy time) */
|
||||
RTMP_IO_READ32(pAd, MIB_MSDR9, &msdr9);
|
||||
msdr9 &= 0xFFFFFF;
|
||||
pAd->OneSecChBusyTime = msdr9;
|
||||
#ifdef BAND_STEERING
|
||||
if (pAd->ApCfg.BandSteering)
|
||||
pAd->ApCfg.BndStrgOneSecChBusyTime = (pAd->ApCfg.BndStrgOneSecChBusyTime == 0)? \
|
||||
msdr9 : ((msdr9 + pAd->ApCfg.BndStrgOneSecChBusyTime)>>1);
|
||||
#endif
|
||||
#endif
|
||||
/* one second timer */
|
||||
MacTableMaintenance(pAd);
|
||||
|
||||
#ifdef WH_EZ_SETUP
|
||||
#ifdef NEW_CONNECTION_ALGO
|
||||
if(IS_ADPTR_EZ_SETUP_ENABLED(pAd)) {
|
||||
EzMlmeEnqueue(pAd, EZ_STATE_MACHINE, EZ_PERIODIC_EXEC_REQ, 0, NULL, 0);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_FPGA_MODE
|
||||
if (pAd->fpga_ctl.fpga_tr_stop)
|
||||
{
|
||||
INT enable = FALSE, ctrl_type;
|
||||
|
||||
/* enable/disable tx/rx*/
|
||||
switch (pAd->fpga_ctl.fpga_tr_stop)
|
||||
{
|
||||
case 3: //stop tx + rx
|
||||
ctrl_type = ASIC_MAC_TXRX;
|
||||
break;
|
||||
case 2: // stop rx
|
||||
ctrl_type = ASIC_MAC_RX;
|
||||
break;
|
||||
case 1: // stop tx
|
||||
ctrl_type = ASIC_MAC_TX;
|
||||
break;
|
||||
case 4:
|
||||
default:
|
||||
enable = TRUE;
|
||||
ctrl_type = ASIC_MAC_TXRX;
|
||||
break;
|
||||
}
|
||||
AsicSetMacTxRx(pAd, ctrl_type, enable);
|
||||
}
|
||||
#endif /* CONFIG_FPGA_MODE */
|
||||
|
||||
RTMPMaintainPMKIDCache(pAd);
|
||||
|
||||
#ifdef WDS_SUPPORT
|
||||
WdsTableMaintenance(pAd);
|
||||
#endif /* WDS_SUPPORT */
|
||||
|
||||
|
||||
#ifdef CLIENT_WDS
|
||||
CliWds_ProxyTabMaintain(pAd);
|
||||
#endif /* CLIENT_WDS */
|
||||
#ifdef A4_CONN
|
||||
for(mbss_idx = 0; mbss_idx < pAd->ApCfg.BssidNum; mbss_idx++)
|
||||
a4_proxy_maintain(pAd, mbss_idx);
|
||||
pAd->a4_need_refresh = FALSE;
|
||||
#endif /* A4_CONN */
|
||||
#ifdef WH_EVENT_NOTIFIER
|
||||
//WHCMlmePeriodicExec(pAd); // Arvind : Need to confirm that we have to support this event
|
||||
#endif /* WH_EVENT_NOTIFIER */
|
||||
|
||||
#ifdef WIFI_DIAG
|
||||
DiagApMlmeOneSecProc(pAd);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef AP_SCAN_SUPPORT
|
||||
AutoChannelSelCheck(pAd);
|
||||
#endif /* AP_SCAN_SUPPORT */
|
||||
|
||||
APUpdateCapabilityAndErpIe(pAd);
|
||||
|
||||
#ifdef APCLI_SUPPORT
|
||||
if (pAd->Mlme.OneSecPeriodicRound % 2 == 0)
|
||||
ApCliIfMonitor(pAd);
|
||||
|
||||
if (pAd->Mlme.OneSecPeriodicRound % 2 == 1
|
||||
#ifdef APCLI_AUTO_CONNECT_SUPPORT
|
||||
&& (pAd->ApCfg.ApCliAutoConnectChannelSwitching == FALSE)
|
||||
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
|
||||
) {
|
||||
ApCliIfUp(pAd);
|
||||
}
|
||||
|
||||
{
|
||||
INT loop;
|
||||
ULONG Now32;
|
||||
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
if (pAd->ApCfg.bMACRepeaterEn)
|
||||
{
|
||||
RTMPRepeaterReconnectionCheck(pAd);
|
||||
}
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
for (loop = 0; loop < MAX_APCLI_NUM; loop++)
|
||||
{
|
||||
PAPCLI_STRUCT pApCliEntry = &pAd->ApCfg.ApCliTab[loop];
|
||||
if ((pApCliEntry->Valid == TRUE)
|
||||
&& (pApCliEntry->MacTabWCID < MAX_LEN_OF_MAC_TABLE))
|
||||
{
|
||||
/* update channel quality for Roaming and UI LinkQuality display */
|
||||
MlmeCalculateChannelQuality(pAd,
|
||||
&pAd->MacTab.Content[pApCliEntry->MacTabWCID], Now32);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (pAd->CommonCfg.bHTProtect) {
|
||||
/*APUpdateCapabilityAndErpIe(pAd); */
|
||||
APUpdateOperationMode(pAd);
|
||||
if (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == FALSE)
|
||||
AsicUpdateProtect(pAd, (USHORT)pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode,
|
||||
ALLN_SETPROTECT, FALSE, pAd->MacTab.fAnyStationNonGF);
|
||||
}
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
|
||||
#ifdef A_BAND_SUPPORT
|
||||
if ( (pAd->CommonCfg.Channel > 14)
|
||||
&& (pAd->CommonCfg.bIEEE80211H == 1))
|
||||
{
|
||||
#ifdef DFS_SUPPORT
|
||||
ApRadarDetectPeriodic(pAd);
|
||||
#else
|
||||
pAd->Dot11_H.InServiceMonitorCount++;
|
||||
if (pAd->Dot11_H.RDMode == RD_SILENCE_MODE)
|
||||
{
|
||||
if (pAd->Dot11_H.RDCount++ > pAd->Dot11_H.ChMovingTime)
|
||||
{
|
||||
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
pAd->Dot11_H.RDMode = RD_NORMAL_MODE;
|
||||
}
|
||||
}
|
||||
#endif /* !DFS_SUPPORT */
|
||||
}
|
||||
#endif /* A_BAND_SUPPORT */
|
||||
#ifdef MBO_SUPPORT
|
||||
MboCheckBssTermination(pAd);
|
||||
#endif/* MBO_SUPPORT */
|
||||
#ifdef DOT11R_FT_SUPPORT
|
||||
FT_R1KHInfoMaintenance(pAd);
|
||||
#endif /* DOT11R_FT_SUPPORT */
|
||||
#if defined(MAX_CONTINUOUS_TX_CNT) || defined(NEW_IXIA_METHOD)
|
||||
if(pAd->MonitorFlag == TRUE)
|
||||
rtmp_deqmode_detect(pAd); /* 1s detect*/
|
||||
#endif
|
||||
#ifdef BAND_STEERING
|
||||
BndStrgHeartBeatMonitor(pAd);
|
||||
#endif
|
||||
#ifdef NEW_IXIA_METHOD
|
||||
if (pAd->Mlme.OneSecPeriodicRound % pAd->chkTmr == 0) {
|
||||
if ((txpktdetect2s < pAd->pktthld)
|
||||
&& (rxpktdetect2s < pAd->pktthld)) {/*Threshold*/
|
||||
pAd->tmrlogctrl++;
|
||||
if (pAd->tmrlogctrl <= 1)
|
||||
wifi_txrx_parmtrs_dump(pAd);
|
||||
else
|
||||
pAd->tmrlogctrl = 10;/*prevent pAd->tmrlogctrl overflow*/
|
||||
} else
|
||||
pAd->tmrlogctrl = 0;
|
||||
txpktdetect2s = 0;
|
||||
rxpktdetect2s = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*! \brief To substitute the message type if the message is coming from external
|
||||
* \param *Fr The frame received
|
||||
* \param *Machine The state machine
|
||||
* \param *MsgType the message type for the state machine
|
||||
* \return TRUE if the substitution is successful, FALSE otherwise
|
||||
* \pre
|
||||
* \post
|
||||
*/
|
||||
BOOLEAN APMsgTypeSubst(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PFRAME_802_11 pFrame,
|
||||
OUT INT *Machine,
|
||||
OUT INT *MsgType)
|
||||
{
|
||||
USHORT Seq;
|
||||
#ifdef DOT11_SAE_SUPPORT
|
||||
USHORT Alg;
|
||||
#endif /* DOT11_SAE_SUPPORT */
|
||||
UCHAR EAPType;
|
||||
BOOLEAN Return = FALSE;
|
||||
#ifdef WSC_AP_SUPPORT
|
||||
UCHAR EAPCode;
|
||||
PMAC_TABLE_ENTRY pEntry;
|
||||
#endif /* WSC_AP_SUPPORT */
|
||||
unsigned char hdr_len = LENGTH_802_11;
|
||||
|
||||
#ifdef A4_CONN
|
||||
if ((pFrame->Hdr.FC.FrDs == 1) && (pFrame->Hdr.FC.ToDs == 1))
|
||||
hdr_len = LENGTH_802_11_WITH_ADDR4;
|
||||
#endif
|
||||
/*
|
||||
TODO:
|
||||
only PROBE_REQ can be broadcast, all others must be unicast-to-me && is_mybssid;
|
||||
otherwise, ignore this frame
|
||||
*/
|
||||
|
||||
/* wpa EAPOL PACKET */
|
||||
if (pFrame->Hdr.FC.Type == FC_TYPE_DATA)
|
||||
{
|
||||
#ifdef WSC_AP_SUPPORT
|
||||
WSC_CTRL *wsc_ctrl;
|
||||
/*WSC EAPOL PACKET */
|
||||
pEntry = MacTableLookup(pAd, pFrame->Hdr.Addr2);
|
||||
if (pEntry &&
|
||||
((pEntry->bWscCapable) ||
|
||||
(pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.AuthMode < Ndis802_11AuthModeWPA)))
|
||||
{
|
||||
/*
|
||||
WSC AP only can service one WSC STA in one WPS session.
|
||||
Forward this EAP packet to WSC SM if this EAP packets is from
|
||||
WSC STA that WSC AP services or WSC AP doesn't service any
|
||||
WSC STA now.
|
||||
*/
|
||||
wsc_ctrl = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx].WscControl;
|
||||
if ((MAC_ADDR_EQUAL(wsc_ctrl->EntryAddr, pEntry->Addr) ||
|
||||
MAC_ADDR_EQUAL(wsc_ctrl->EntryAddr, ZERO_MAC_ADDR)) &&
|
||||
IS_ENTRY_CLIENT(pEntry) &&
|
||||
(wsc_ctrl->WscConfMode != WSC_DISABLE))
|
||||
{
|
||||
*Machine = WSC_STATE_MACHINE;
|
||||
EAPType = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + 1);
|
||||
EAPCode = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + 4);
|
||||
Return = WscMsgTypeSubst(EAPType, EAPCode, MsgType);
|
||||
}
|
||||
}
|
||||
#endif /* WSC_AP_SUPPORT */
|
||||
if (!Return)
|
||||
{
|
||||
*Machine = WPA_STATE_MACHINE;
|
||||
EAPType = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + 1);
|
||||
Return = WpaMsgTypeSubst(EAPType, (INT *) MsgType);
|
||||
}
|
||||
return Return;
|
||||
}
|
||||
|
||||
if (pFrame->Hdr.FC.Type != FC_TYPE_MGMT)
|
||||
return FALSE;
|
||||
|
||||
switch (pFrame->Hdr.FC.SubType)
|
||||
{
|
||||
case SUBTYPE_ASSOC_REQ:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_ASSOC_REQ;
|
||||
|
||||
break;
|
||||
/*
|
||||
case SUBTYPE_ASSOC_RSP:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_ASSOC_RSP;
|
||||
break;
|
||||
*/
|
||||
case SUBTYPE_REASSOC_REQ:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_REASSOC_REQ;
|
||||
break;
|
||||
/*
|
||||
case SUBTYPE_REASSOC_RSP:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_REASSOC_RSP;
|
||||
break;
|
||||
*/
|
||||
case SUBTYPE_PROBE_REQ:
|
||||
*Machine = AP_SYNC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_PROBE_REQ;
|
||||
break;
|
||||
|
||||
/* For Active Scan */
|
||||
case SUBTYPE_PROBE_RSP:
|
||||
*Machine = AP_SYNC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_PROBE_RSP;
|
||||
break;
|
||||
case SUBTYPE_BEACON:
|
||||
*Machine = AP_SYNC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_BEACON;
|
||||
break;
|
||||
/*
|
||||
case SUBTYPE_ATIM:
|
||||
*Machine = AP_SYNC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_ATIM;
|
||||
break;
|
||||
*/
|
||||
case SUBTYPE_DISASSOC:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_DISASSOC_REQ;
|
||||
break;
|
||||
case SUBTYPE_AUTH:
|
||||
/* get the sequence number from payload 24 Mac Header + 2 bytes algorithm */
|
||||
#ifdef DOT11_SAE_SUPPORT
|
||||
NdisMoveMemory(&Alg, &pFrame->Octet[0], sizeof(USHORT));
|
||||
#endif /* DOT11_SAE_SUPPORT */
|
||||
NdisMoveMemory(&Seq, &pFrame->Octet[2], sizeof(USHORT));
|
||||
|
||||
*Machine = AP_AUTH_STATE_MACHINE;
|
||||
if (Seq == 1
|
||||
#ifdef DOT11_SAE_SUPPORT
|
||||
|| (Alg == AUTH_MODE_SAE && Seq == 2)
|
||||
#endif /* DOT11_SAE_SUPPORT */
|
||||
)
|
||||
*MsgType = APMT2_PEER_AUTH_REQ;
|
||||
else if (Seq == 3)
|
||||
*MsgType = APMT2_PEER_AUTH_CONFIRM;
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("wrong AUTH seq=%d Octet=%02x %02x %02x %02x %02x %02x %02x %02x\n",
|
||||
Seq,
|
||||
pFrame->Octet[0], pFrame->Octet[1], pFrame->Octet[2], pFrame->Octet[3],
|
||||
pFrame->Octet[4], pFrame->Octet[5], pFrame->Octet[6], pFrame->Octet[7]));
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
case SUBTYPE_DEAUTH:
|
||||
*Machine = AP_AUTH_STATE_MACHINE; /*AP_AUTH_RSP_STATE_MACHINE;*/
|
||||
*MsgType = APMT2_PEER_DEAUTH;
|
||||
break;
|
||||
|
||||
case SUBTYPE_ACTION:
|
||||
case SUBTYPE_ACTION_NO_ACK:
|
||||
*Machine = ACTION_STATE_MACHINE;
|
||||
/* Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support */
|
||||
if ((pFrame->Octet[0]&0x7F) > MAX_PEER_CATE_MSG)
|
||||
{
|
||||
*MsgType = MT2_ACT_INVALID;
|
||||
}
|
||||
else
|
||||
{
|
||||
*MsgType = (pFrame->Octet[0]&0x7F);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Periodic evaluate antenna link status
|
||||
|
||||
Arguments:
|
||||
pAd - Adapter pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID APAsicEvaluateRxAnt(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ULONG TxTotalCnt;
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
if (ATE_ON(pAd))
|
||||
return;
|
||||
#endif /* CONFIG_ATE */
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
if(pAd->CommonCfg.CarrierDetect.CD_State == CD_SILENCE)
|
||||
return;
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
#ifdef GREENAP_SUPPORT
|
||||
if (pAd->ApCfg.bGreenAPActive == TRUE)
|
||||
bbp_set_rxpath(pAd, 1);
|
||||
else
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath);
|
||||
|
||||
TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount +
|
||||
pAd->RalinkCounters.OneSecTxRetryOkCount +
|
||||
pAd->RalinkCounters.OneSecTxFailCount;
|
||||
|
||||
if (TxTotalCnt > 50)
|
||||
{
|
||||
RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 20);
|
||||
pAd->Mlme.bLowThroughput = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300);
|
||||
pAd->Mlme.bLowThroughput = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
After evaluation, check antenna link status
|
||||
|
||||
Arguments:
|
||||
pAd - Adapter pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID APAsicRxAntEvalTimeout(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
CHAR rssi[3], *target_rssi;
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
if (ATE_ON(pAd))
|
||||
return;
|
||||
#endif /* CONFIG_ATE */
|
||||
|
||||
/* if the traffic is low, use average rssi as the criteria */
|
||||
if (pAd->Mlme.bLowThroughput == TRUE)
|
||||
target_rssi = &pAd->ApCfg.RssiSample.LastRssi[0];
|
||||
else
|
||||
target_rssi = &pAd->ApCfg.RssiSample.AvgRssi[0];
|
||||
NdisMoveMemory(&rssi[0], target_rssi, 3);
|
||||
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
if(pAd->Antenna.field.RxPath == 3)
|
||||
{
|
||||
CHAR larger = -127;
|
||||
|
||||
larger = max(rssi[0], rssi[1]);
|
||||
if (pAd->CommonCfg.RxStream >= 3)
|
||||
pAd->Mlme.RealRxPath = 3;
|
||||
else
|
||||
{
|
||||
if (larger > (rssi[2] + 20))
|
||||
pAd->Mlme.RealRxPath = 2;
|
||||
else
|
||||
pAd->Mlme.RealRxPath = 3;
|
||||
}
|
||||
}
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
|
||||
/* Disable the below to fix 1T/2R issue. It's suggested by Rory at 2007/7/11. */
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
#ifdef GREENAP_SUPPORT
|
||||
if (pAd->ApCfg.bGreenAPActive == TRUE)
|
||||
bbp_set_rxpath(pAd, 1);
|
||||
else
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
bbp_set_rxpath(pAd, pAd->Mlme.RealRxPath);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
After evaluation, check antenna link status
|
||||
|
||||
Arguments:
|
||||
pAd - Adapter pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID APAsicAntennaAvg(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR AntSelect,
|
||||
IN SHORT* RssiAvg)
|
||||
{
|
||||
SHORT realavgrssi;
|
||||
LONG realavgrssi1;
|
||||
ULONG recvPktNum = pAd->RxAnt.RcvPktNum[AntSelect];
|
||||
|
||||
realavgrssi1 = pAd->RxAnt.Pair1AvgRssiGroup1[AntSelect];
|
||||
|
||||
if(realavgrssi1 == 0)
|
||||
{
|
||||
*RssiAvg = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
realavgrssi = (SHORT) (realavgrssi1 / recvPktNum);
|
||||
|
||||
pAd->RxAnt.Pair1AvgRssiGroup1[0] = 0;
|
||||
pAd->RxAnt.Pair1AvgRssiGroup1[1] = 0;
|
||||
pAd->RxAnt.Pair1AvgRssiGroup2[0] = 0;
|
||||
pAd->RxAnt.Pair1AvgRssiGroup2[1] = 0;
|
||||
pAd->RxAnt.RcvPktNum[0] = 0;
|
||||
pAd->RxAnt.RcvPktNum[1] = 0;
|
||||
*RssiAvg = realavgrssi - 256;
|
||||
}
|
||||
#if defined(MAX_CONTINUOUS_TX_CNT) || defined(NEW_IXIA_METHOD)
|
||||
BOOLEAN Rtmp_Max_Continuous_Tx_OnOff(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
PMAC_TABLE_ENTRY pEntry = NULL;
|
||||
INT i;
|
||||
CHAR MaxRssi = -127,MinRssi = -127,myAvgRssi = -127; //for RSSI
|
||||
ULONG DataRate=0; //for datarate.
|
||||
for (i=0; i < MAX_LEN_OF_MAC_TABLE; i++)
|
||||
{
|
||||
pEntry = &pAd->MacTab.Content[i];
|
||||
if (!(IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC)))
|
||||
continue;
|
||||
myAvgRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample);// get my rssi average.
|
||||
getRate(pEntry->HTPhyMode, &DataRate);
|
||||
|
||||
if(DataRate < pAd->RateTh)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)Some sta's rate is low. DataRate = %lu\n",__FUNCTION__,__LINE__,DataRate));
|
||||
return FALSE;
|
||||
}
|
||||
if((MaxRssi == -127) && (MinRssi == -127))
|
||||
{
|
||||
MaxRssi= myAvgRssi;
|
||||
MinRssi = myAvgRssi;
|
||||
}
|
||||
else
|
||||
{
|
||||
MaxRssi = RTMPMaxRssi(pAd,MaxRssi,myAvgRssi,0);// find the max rssi in mactable size.
|
||||
MinRssi = RTMPMinRssi(pAd,MinRssi,myAvgRssi,0);// find the min rssi in mactable size.
|
||||
}
|
||||
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)MaxRssi = %-3d,MinRssi = %-3d\n",__FUNCTION__,__LINE__,MaxRssi,MinRssi));
|
||||
if((MaxRssi - MinRssi) < pAd->DeltaRssiTh) /*pAd->DeltaRssiTh default 10 dBm*/
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d) in in in in in in \n",__FUNCTION__,__LINE__));
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VOID rtmp_deqmode_detect(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
if(pAd->MacTab.Size >=5)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d) MacTab.Size = %d\n",__FUNCTION__,__LINE__,pAd->MacTab.Size));
|
||||
if(Rtmp_Max_Continuous_Tx_OnOff(pAd) == TRUE)
|
||||
{
|
||||
pAd->ContinousTxCnt = CONTINUOUS_TX_CNT;/*set tx 21 packets one time*/
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)Countinous to Tx %d Packets\n",__FUNCTION__,__LINE__,pAd->ContinousTxCnt));
|
||||
}
|
||||
else
|
||||
{
|
||||
pAd->ContinousTxCnt = 1; /*default tx 1 packet one time*/
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)tx 1 packet!\n",__FUNCTION__,__LINE__));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)client num = %d\n",__FUNCTION__,__LINE__, pAd->MacTab.Size));
|
||||
pAd->ContinousTxCnt = 1; /*default tx 1 packet one time*/
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -0,0 +1,31 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_nintendo.c
|
||||
|
||||
Abstract:
|
||||
Miniport Query information related subroutines
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
JuemingChen 12-28-2006 created
|
||||
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
309
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_nps.c
Normal file
309
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_nps.c
Normal file
@ -0,0 +1,309 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_nps.c
|
||||
|
||||
Abstract:
|
||||
IEEE 802.11v NPS SoftAP related function
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Carter Chen 08-23-2013 created for 7603 AP
|
||||
*/
|
||||
#ifdef MT_MAC
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
extern VOID write_tmac_info_tim(RTMP_ADAPTER *pAd, INT apidx, UCHAR *tmac_buf, HTTRANSMIT_SETTING *BeaconTransmit, ULONG frmLen);
|
||||
|
||||
BOOLEAN TimTransmitRequired(RTMP_ADAPTER *pAd, INT apidx, BSS_STRUCT *pMbss)
|
||||
{
|
||||
BOOLEAN result = FALSE;
|
||||
TIM_BUF_STRUC *tim_info;
|
||||
|
||||
tim_info = &pMbss->tim_buf;
|
||||
if (tim_info->TimBufIdx >= HW_BEACON_MAX_NUM)
|
||||
return result;
|
||||
|
||||
if (tim_info->bTimSntReq == TRUE)
|
||||
{
|
||||
result = TRUE;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef MT_MAC
|
||||
VOID RT28xx_UpdateTimToAsic(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN INT apidx,
|
||||
IN ULONG FrameLen)
|
||||
{
|
||||
TIM_BUF_STRUC *tim_buf = NULL;
|
||||
UCHAR *buf;
|
||||
INT len;
|
||||
PNDIS_PACKET *pkt = NULL;
|
||||
|
||||
IF_DEV_CONFIG_OPMODE_ON_AP(pAd) {
|
||||
tim_buf = &pAd->ApCfg.MBSSID[apidx].tim_buf;
|
||||
}
|
||||
|
||||
if (!tim_buf) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): bcn_buf is NULL!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
pkt = tim_buf->TimPkt;
|
||||
if (pkt) {
|
||||
buf = (UCHAR *)GET_OS_PKT_DATAPTR(pkt);
|
||||
len = FrameLen + pAd->chipCap.tx_hw_hdr_len;
|
||||
SET_OS_PKT_LEN(pkt, len);
|
||||
|
||||
/* Now do hardware-depened kick out.*/
|
||||
RTMP_SEM_LOCK(&pAd->BcnRingLock);
|
||||
HAL_KickOutMgmtTx(pAd, Q_IDX_BCN, pkt, buf, len);
|
||||
RTMP_SEM_UNLOCK(&pAd->BcnRingLock);
|
||||
} else {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): TimPkt is NULL!\n", __FUNCTION__));
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* MT_MAC */
|
||||
|
||||
VOID write_tmac_info_tim(RTMP_ADAPTER *pAd, INT apidx, UCHAR *tmac_buf, HTTRANSMIT_SETTING *BeaconTransmit, ULONG frmLen)
|
||||
{
|
||||
MAC_TX_INFO mac_info;
|
||||
|
||||
NdisZeroMemory((UCHAR *)&mac_info, sizeof(mac_info));
|
||||
|
||||
mac_info.FRAG = FALSE;
|
||||
mac_info.CFACK = FALSE;
|
||||
mac_info.InsTimestamp = FALSE;
|
||||
mac_info.AMPDU = FALSE;
|
||||
mac_info.BM = 1;
|
||||
mac_info.Ack = FALSE;
|
||||
mac_info.NSeq = TRUE;
|
||||
mac_info.BASize = 0;
|
||||
mac_info.WCID = 0;
|
||||
mac_info.Length = frmLen;
|
||||
mac_info.PID = PID_MGMT;
|
||||
mac_info.TID = 0;
|
||||
mac_info.TxRate = 0;
|
||||
mac_info.Txopmode = IFS_HTTXOP;
|
||||
mac_info.q_idx = Q_IDX_BCN;
|
||||
mac_info.hdr_len = 24;
|
||||
mac_info.bss_idx = apidx;
|
||||
mac_info.SpeEn = 1;
|
||||
mac_info.Preamble = LONG_PREAMBLE;
|
||||
write_tmac_info(pAd, tmac_buf, &mac_info, BeaconTransmit);
|
||||
}
|
||||
|
||||
VOID APMakeBssTimFrame(RTMP_ADAPTER *pAd, INT apidx)
|
||||
{
|
||||
BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx];
|
||||
HEADER_802_11 TimHdr;
|
||||
LARGE_INTEGER FakeTimestamp;
|
||||
ULONG FrameLen = 0;
|
||||
UCHAR *pTimFrame, *ptr, *tmac_info;
|
||||
HTTRANSMIT_SETTING TimTransmit = {.word = 0}; /* MGMT frame PHY rate setting when operatin at HT rate. */
|
||||
//UINT8 TXWISize = pAd->chipCap.TXWISize;
|
||||
UINT8 tx_hw_hdr_len = pAd->chipCap.tx_hw_hdr_len;
|
||||
UCHAR Cat = 11;//Tim Category field
|
||||
UCHAR Act = 0;//Tim Action field
|
||||
UCHAR ChkBcn = 0;//Check Beacon field init from 0.
|
||||
//UCHAR *pTim;
|
||||
//UCHAR ID_1B, TimFirst, TimLast;
|
||||
//UINT i;
|
||||
|
||||
if(!TimTransmitRequired(pAd, apidx, pMbss))
|
||||
return;
|
||||
|
||||
if (pMbss->tim_buf.TimPkt == NULL) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():Invalid TimPkt for MBSS[%d]\n",
|
||||
__func__, apidx));
|
||||
return;
|
||||
}
|
||||
|
||||
tmac_info = (UCHAR *)GET_OS_PKT_DATAPTR(pMbss->tim_buf.TimPkt);
|
||||
pTimFrame = (UCHAR *)(tmac_info + tx_hw_hdr_len);
|
||||
|
||||
ActHeaderInit(pAd,
|
||||
&TimHdr,
|
||||
BROADCAST_ADDR,
|
||||
pMbss->wdev.if_addr,
|
||||
pMbss->wdev.bssid);
|
||||
|
||||
|
||||
MakeOutgoingFrame(pTimFrame, &FrameLen,
|
||||
sizeof(HEADER_802_11), &TimHdr,
|
||||
1, &Cat,
|
||||
1, &Act,
|
||||
1, &ChkBcn,
|
||||
TIMESTAMP_LEN, &FakeTimestamp,
|
||||
END_OF_ARGS);
|
||||
|
||||
TimTransmit.word = 0;
|
||||
|
||||
pMbss->TimIELocationInTim = (UCHAR)FrameLen;
|
||||
|
||||
/*
|
||||
step 2 - update TIM IE
|
||||
TODO: enlarge TIM bitmap to support up to 64 STAs
|
||||
TODO: re-measure if RT2600 TBTT interrupt happens faster than BEACON sent out time
|
||||
*/
|
||||
ptr = pTimFrame + (UCHAR)FrameLen;
|
||||
*ptr = IE_TIM;
|
||||
*(ptr+1) = 0x0e;
|
||||
*(ptr + 2) = pAd->ApCfg.DtimCount;
|
||||
*(ptr + 3) = pAd->ApCfg.DtimPeriod;
|
||||
|
||||
*(ptr + 4) = 0xa0;
|
||||
*(ptr + 5) = 0xa0;
|
||||
*(ptr + 6) = 0xa0;
|
||||
*(ptr + 7) = 0xa0;
|
||||
*(ptr + 8) = 0xa0;
|
||||
*(ptr + 9) = 0xa0;
|
||||
*(ptr + 10) = 0xa0;
|
||||
*(ptr + 11) = 0xa0;
|
||||
*(ptr + 12) = 0xa0;
|
||||
*(ptr + 13) = 0xa0;
|
||||
*(ptr + 14) = 0xa0;
|
||||
*(ptr + 15) = 0xa0;
|
||||
|
||||
|
||||
// /* find the smallest AID (PS mode) */
|
||||
// TimFirst = 0; /* record first TIM byte != 0x00 */
|
||||
// TimLast = 0; /* record last TIM byte != 0x00 */
|
||||
// pTim = pMbss->TimBitmaps;
|
||||
//
|
||||
// for(ID_1B=0; ID_1B<WLAN_MAX_NUM_OF_TIM; ID_1B++)
|
||||
// {
|
||||
// /* get the TIM indicating PS packets for 8 stations */
|
||||
// UCHAR tim_1B = pTim[ID_1B];
|
||||
//
|
||||
// if (ID_1B == 0)
|
||||
// tim_1B &= 0xfe; /* skip bit0 bc/mc */
|
||||
//
|
||||
// if (tim_1B == 0)
|
||||
// continue; /* find next 1B */
|
||||
//
|
||||
// if (TimFirst == 0)
|
||||
// TimFirst = ID_1B;
|
||||
//
|
||||
// TimLast = ID_1B;
|
||||
// }
|
||||
//
|
||||
// /* fill TIM content to beacon buffer */
|
||||
// if (TimFirst & 0x01)
|
||||
// TimFirst --; /* find the even offset byte */
|
||||
//
|
||||
// *(ptr + 1) = 3+(TimLast-TimFirst+1); /* TIM IE length */
|
||||
// *(ptr + 4) = TimFirst;
|
||||
//
|
||||
// for(i=TimFirst; i<=TimLast; i++)
|
||||
// *(ptr + 5 + i - TimFirst) = pTim[i];
|
||||
//
|
||||
// /* bit0 means backlogged mcast/bcast */
|
||||
// /* per spec, this bit in TIM frame shall always 0. */
|
||||
// //TODO: MTK proprietary mechanism.
|
||||
// //if (pAd->ApCfg.DtimCount == 0)
|
||||
// //*(ptr + 4) |= (pMbss->TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] & 0x01);
|
||||
// *(ptr + 4) = 0;
|
||||
|
||||
/* adjust TIM length according to the new TIM */
|
||||
FrameLen += 16;//(2 + *(ptr+1));
|
||||
|
||||
/* When Beacon is use CCK to send, TIM shall use OFDM to send. and it's mandatory. */
|
||||
if (pAd->CommonCfg.Channel <= 14) {
|
||||
TimTransmit.field.MODE = MODE_OFDM;
|
||||
TimTransmit.field.MCS = MCS_RATE_6;
|
||||
}
|
||||
|
||||
write_tmac_info_tim(pAd, apidx, tmac_info, &TimTransmit, FrameLen);
|
||||
|
||||
// asic_write_bcn_buf(pAd,
|
||||
// tmac_info, TXWISize,
|
||||
// pTimFrame, FrameLen,
|
||||
// pAd->BeaconOffset[pMbss->bcn_buf.BcnBufIdx]);
|
||||
|
||||
RT28xx_UpdateTimToAsic(pAd, apidx, FrameLen);
|
||||
|
||||
//+++Add by shiang for debug
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s(): Dump the Beacon Packet of BSS%d!\n", __FUNCTION__, apidx));
|
||||
hex_dump("Initial BeaconBuf", tmac_info, FrameLen + tx_hw_hdr_len);
|
||||
//---Add by shiang for debug
|
||||
}
|
||||
|
||||
static UCHAR GetTimNum(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
int i;
|
||||
int NumTim;
|
||||
TIM_BUF_STRUC *tim_info;
|
||||
|
||||
NumTim = 0;
|
||||
for (i=0; i<pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
tim_info = &pAd->ApCfg.MBSSID[i].tim_buf;
|
||||
if (tim_info->bTimSntReq)
|
||||
{
|
||||
tim_info->TimBufIdx = NumTim;
|
||||
NumTim ++;
|
||||
}
|
||||
}
|
||||
|
||||
return NumTim;
|
||||
}
|
||||
|
||||
VOID APMakeAllTimFrame(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
INT i;
|
||||
//UCHAR NumOfTims;
|
||||
|
||||
/* choose the Beacon number */
|
||||
/*NumOfTims =*/ GetTimNum(pAd);
|
||||
|
||||
for(i=0; i<pAd->ApCfg.BssidNum; i++) {
|
||||
APMakeBssTimFrame(pAd, i);
|
||||
// APMakeBssTimFrame2(pAd, i);//Carter, for test tttt 2 pkt purpose
|
||||
}
|
||||
}
|
||||
|
||||
INT wdev_tim_buf_init(RTMP_ADAPTER *pAd, TIM_BUF_STRUC *tim_info)
|
||||
{
|
||||
//bcn_info->bBcnSntReq = FALSE;
|
||||
tim_info->TimBufIdx = HW_BEACON_MAX_NUM;
|
||||
|
||||
if (!tim_info->TimPkt) {
|
||||
RTMPAllocateNdisPacket(pAd, &tim_info->TimPkt, NULL, 0, NULL, MAX_TIM_SIZE);
|
||||
//NdisAllocateSpinLock(pAd, &bcn_info->bcn_lock);
|
||||
} else {
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():TimPkt is allocated!\n", __func__));
|
||||
|
||||
}
|
||||
// if (!tim_info->TimPkt2) {
|
||||
// RTMPAllocateNdisPacket(pAd, &tim_info->TimPkt2, NULL, NULL, NULL, MAX_TIM_SIZE);
|
||||
//NdisAllocateSpinLock(pAd, &bcn_info->bcn_lock);
|
||||
// } else {
|
||||
// DBGPRINT(RT_DEBUG_OFF, ("%s():TimPkt2 is allocated!\n", __func__));
|
||||
//}
|
||||
tim_info->bTimSntReq = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
#endif /* MT_MAC */
|
923
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_qload.c
Normal file
923
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_qload.c
Normal file
@ -0,0 +1,923 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Abstract:
|
||||
|
||||
Provide information on the current STA population and traffic levels
|
||||
in the QBSS.
|
||||
|
||||
This attribute is available only at a QAP. This attribute, when TRUE,
|
||||
indicates that the QAP implementation is capable of generating and
|
||||
transmitting the QBSS load element in the Beacon and Probe Response frames.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
#ifdef AP_QLOAD_SUPPORT
|
||||
|
||||
typedef struct GNU_PACKED _ELM_QBSS_LOAD{
|
||||
|
||||
UINT8 ElementId;
|
||||
UINT8 Length;
|
||||
|
||||
/* the total number of STAs currently associated with this QBSS */
|
||||
UINT16 StationCount;
|
||||
|
||||
/* defined as the percentage of time, nomalized to 255, the QAP sensed the
|
||||
medium busy, as indicated by either the physical or virtual carrier
|
||||
sense mechanism.
|
||||
This percentage is computed using the formula:
|
||||
((channel busy time / (dot11ChannelUtilizationBeaconIntervals *
|
||||
dot11BeaconPeriod * 1024)) * 255) */
|
||||
UINT8 ChanUtil;
|
||||
|
||||
/* specifies the remaining amount of medium time available via explicit
|
||||
admission control, in units of 32 microsecond periods per 1 second.
|
||||
The field is helpful for roaming non-AP QSTAs to select a QAP that is
|
||||
likely to accept future admission control requests, but it does not
|
||||
represent a guarantee that the HC will admit these requests. */
|
||||
UINT16 AvalAdmCap;
|
||||
|
||||
} ELM_QBSS_LOAD;
|
||||
|
||||
#define ELM_QBSS_LOAD_ID 11
|
||||
#define ELM_QBSS_LOAD_LEN 5
|
||||
|
||||
/*
|
||||
We will send a alarm when channel busy time (primary or secondary) >=
|
||||
Time Threshold and Num Threshold.
|
||||
|
||||
QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD = 0 means alarm function is disabled.
|
||||
|
||||
If you want to enable it, use command
|
||||
"iwpriv ra0 set qloadalarmtimethres=90"
|
||||
*/
|
||||
#define QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD 0 /* unit: % */
|
||||
#define QBSS_LOAD_ALRAM_BUSY_NUM_THRESHOLD 10 /* unit: 1 */
|
||||
|
||||
/* a alarm will not re-issued until QBSS_LOAD_ALARM_DURATION * TBTT */
|
||||
#define QBSS_LOAD_ALARM_DURATION 100 /* unit: TBTT */
|
||||
|
||||
|
||||
static VOID QBSS_LoadAlarmSuspend(
|
||||
IN RTMP_ADAPTER *pAd);
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* handle a alarm */
|
||||
static VOID QBSS_LoadAlarm(
|
||||
IN RTMP_ADAPTER *pAd);
|
||||
static VOID QBSS_LoadAlarmBusyTimeThresholdReset(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UINT32 TimePeriod);
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
|
||||
|
||||
|
||||
/* --------------------------------- Private -------------------------------- */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Handle a alarm.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
You can use different methods to handle QBSS Load alarm here.
|
||||
|
||||
Current methods are:
|
||||
1. Change 20/40 to 20-only.
|
||||
2. Change channel to the clear channel.
|
||||
========================================================================
|
||||
*/
|
||||
static VOID QBSS_LoadAlarm(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
/* suspend alarm until channel switch */
|
||||
QBSS_LoadAlarmSuspend(pAd);
|
||||
|
||||
pAd->phy_ctrl.QloadAlarmNumber ++;
|
||||
|
||||
/* check if we have already been 20M bandwidth */
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
#ifdef DOT11N_DRAFT3
|
||||
if ((pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset != 0) &&
|
||||
(pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth != 0))
|
||||
{
|
||||
MAC_TABLE *pMacTable;
|
||||
UINT32 StaId;
|
||||
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("qbss> Alarm! Change to 20 bw...\n"));
|
||||
|
||||
/* disassociate stations without D3 2040Coexistence function */
|
||||
pMacTable = &pAd->MacTab;
|
||||
|
||||
for(StaId=1; StaId<MAX_LEN_OF_MAC_TABLE; StaId++)
|
||||
{
|
||||
MAC_TABLE_ENTRY *pEntry = &pMacTable->Content[StaId];
|
||||
BOOLEAN bDisconnectSta = FALSE;
|
||||
|
||||
if (!IS_ENTRY_CLIENT(pEntry))
|
||||
continue;
|
||||
|
||||
if (pEntry->Sst != SST_ASSOC)
|
||||
continue;
|
||||
|
||||
if (pEntry->BSS2040CoexistenceMgmtSupport)
|
||||
bDisconnectSta = TRUE;
|
||||
|
||||
if (bDisconnectSta)
|
||||
{
|
||||
/* send wireless event - for ageout */
|
||||
RTMPSendWirelessEvent(pAd, IW_AGEOUT_EVENT_FLAG, pEntry->Addr, 0, 0);
|
||||
|
||||
{
|
||||
PUCHAR pOutBuffer = NULL;
|
||||
NDIS_STATUS NStatus;
|
||||
ULONG FrameLen = 0;
|
||||
HEADER_802_11 DeAuthHdr;
|
||||
USHORT Reason;
|
||||
|
||||
/* send out a DISASSOC request frame */
|
||||
NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
|
||||
if (NStatus != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, (" MlmeAllocateMemory fail ..\n"));
|
||||
/*NdisReleaseSpinLock(&pAd->MacTabLock); */
|
||||
continue;
|
||||
}
|
||||
|
||||
Reason = REASON_DEAUTH_STA_LEAVING;
|
||||
MgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0,
|
||||
pEntry->Addr,
|
||||
pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.if_addr,
|
||||
pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid);
|
||||
MakeOutgoingFrame(pOutBuffer, &FrameLen,
|
||||
sizeof(HEADER_802_11), &DeAuthHdr,
|
||||
2, &Reason,
|
||||
END_OF_ARGS);
|
||||
MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("qbss> Alarm! Deauth the station "
|
||||
"%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
PRINT_MAC(pEntry->Addr)));
|
||||
|
||||
MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* for 11n */
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;
|
||||
|
||||
/* always 20M */
|
||||
pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
|
||||
|
||||
/* mark alarm flag */
|
||||
pAd->phy_ctrl.FlgQloadAlarm = TRUE;
|
||||
|
||||
QBSS_LoadAlarmResume(pAd);
|
||||
}
|
||||
else
|
||||
#endif /* DOT11N_DRAFT3 */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
{
|
||||
/* we are in 20MHz bandwidth so try to switch channel */
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("qbss> Alarm! Switch channel...\n"));
|
||||
|
||||
/* send command to switch channel */
|
||||
RTEnqueueInternalCmd(pAd, CMDTHREAD_CHAN_RESCAN, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Re-calculate busy time threshold.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
TimePeriod - TBTT
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
EX: TBTT=100ms, 90%, pAd->QloadBusyTimeThreshold = 90ms
|
||||
========================================================================
|
||||
*/
|
||||
static VOID QBSS_LoadAlarmBusyTimeThresholdReset(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UINT32 TimePeriod)
|
||||
{
|
||||
pAd->phy_ctrl.QloadBusyTimeThreshold = TimePeriod;
|
||||
pAd->phy_ctrl.QloadBusyTimeThreshold *= pAd->phy_ctrl.QloadAlarmBusyTimeThreshold;
|
||||
pAd->phy_ctrl.QloadBusyTimeThreshold /= 100;
|
||||
pAd->phy_ctrl.QloadBusyTimeThreshold <<= 10; /* translate mini-sec to micro-sec */
|
||||
}
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize ASIC Channel Busy Calculation mechanism.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
Init Condition: WMM must be enabled.
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadInit(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UINT32 IdBss;
|
||||
|
||||
|
||||
/* check whether any BSS enables WMM feature */
|
||||
for(IdBss=0; IdBss<pAd->ApCfg.BssidNum; IdBss++)
|
||||
{
|
||||
if ((pAd->ApCfg.MBSSID[IdBss].wdev.bWmmCapable)
|
||||
#ifdef DOT11K_RRM_SUPPORT
|
||||
|| (IS_RRM_ENABLE(pAd, IdBss))
|
||||
#endif /* DOT11K_RRM_SUPPORT */
|
||||
)
|
||||
{
|
||||
pAd->phy_ctrl.FlgQloadEnable = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pAd->phy_ctrl.FlgQloadEnable == TRUE)
|
||||
{
|
||||
/* default value is 50, please reference to IEEE802.11e 2005 Annex D */
|
||||
pAd->phy_ctrl.QloadChanUtilBeaconInt = 50;
|
||||
}
|
||||
AsicSetChBusyStat(pAd, pAd->phy_ctrl.FlgQloadEnable);
|
||||
|
||||
pAd->phy_ctrl.QloadChanUtilTotal = 0;
|
||||
pAd->phy_ctrl.QloadUpTimeLast = 0;
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
/* clear busy time statistics */
|
||||
NdisZeroMemory(pAd->phy_ctrl.QloadBusyCountPri, sizeof(pAd->phy_ctrl.QloadBusyCountPri));
|
||||
NdisZeroMemory(pAd->phy_ctrl.QloadBusyCountSec, sizeof(pAd->phy_ctrl.QloadBusyCountSec));
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* init threshold before QBSS_LoadAlarmReset */
|
||||
pAd->phy_ctrl.QloadAlarmBusyTimeThreshold = QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD;
|
||||
pAd->phy_ctrl.QloadAlarmBusyNumThreshold = QBSS_LOAD_ALRAM_BUSY_NUM_THRESHOLD;
|
||||
|
||||
QBSS_LoadAlarmReset(pAd);
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Reset alarm function.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadAlarmReset(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.FlgQloadAlarm = FALSE;
|
||||
pAd->phy_ctrl.QloadAlarmDuration = 0;
|
||||
pAd->phy_ctrl.QloadAlarmNumber = 0;
|
||||
|
||||
pAd->phy_ctrl.FlgQloadAlarmIsSuspended = FALSE;
|
||||
|
||||
QBSS_LoadAlarmBusyTimeThresholdReset(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Resume alarm function.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadAlarmResume(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.FlgQloadAlarmIsSuspended = FALSE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Suspend alarm function.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
static VOID QBSS_LoadAlarmSuspend(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.FlgQloadAlarmIsSuspended = TRUE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Get average busy time in current channel.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
average busy time
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
UINT32 QBSS_LoadBusyTimeGet(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
if (pAd->phy_ctrl.QloadChanUtilBeaconCnt == 0)
|
||||
return pAd->phy_ctrl.QloadChanUtilTotal;
|
||||
|
||||
return (pAd->phy_ctrl.QloadChanUtilTotal / pAd->phy_ctrl.QloadChanUtilBeaconCnt);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Check if a alarm is occurred and clear the alarm.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
TRUE - alarm occurs
|
||||
FALSE - no alarm
|
||||
|
||||
Note:
|
||||
We will clear the alarm in the function.
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN QBSS_LoadIsAlarmIssued(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
BOOLEAN FlgQloadAlarm = pAd->phy_ctrl.FlgQloadAlarm;
|
||||
|
||||
pAd->phy_ctrl.FlgQloadAlarm = FALSE;
|
||||
return FlgQloadAlarm;
|
||||
#else
|
||||
|
||||
return FALSE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Check if the busy time is accepted.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
TURE - ok
|
||||
FALSE - fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN QBSS_LoadIsBusyTimeAccepted(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UINT32 BusyTime)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
if (pAd->phy_ctrl.QloadAlarmBusyTimeThreshold == 0)
|
||||
return TRUE; /* always ok */
|
||||
|
||||
if (BusyTime >= pAd->phy_ctrl.QloadBusyTimeThreshold)
|
||||
return FALSE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTSPOT_R2
|
||||
UINT32 QBSS_LoadElementAppend_HSTEST(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
OUT UINT8 *pBeaconBuf,
|
||||
IN UCHAR apidx)
|
||||
{
|
||||
ELM_QBSS_LOAD load, *pLoad = &load;
|
||||
ULONG ElmLen;
|
||||
|
||||
/* check whether channel busy time calculation is enabled */
|
||||
if (pAd->phy_ctrl.FlgQloadEnable == 0)
|
||||
return 0;
|
||||
/* End of if */
|
||||
|
||||
/* init */
|
||||
pLoad->ElementId = ELM_QBSS_LOAD_ID;
|
||||
pLoad->Length = ELM_QBSS_LOAD_LEN;
|
||||
|
||||
pLoad->StationCount = le2cpu16(pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.QLoadStaCnt);
|
||||
pLoad->ChanUtil = pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.QLoadCU;
|
||||
|
||||
/* because no ACM is supported, the available bandwidth is 1 sec */
|
||||
pLoad->AvalAdmCap = le2cpu16(0xffff); /* 0x7a12 * 32us = 1 second */
|
||||
|
||||
|
||||
/* copy the element to the frame */
|
||||
MakeOutgoingFrame(pBeaconBuf, &ElmLen,
|
||||
sizeof(ELM_QBSS_LOAD), pLoad,
|
||||
END_OF_ARGS);
|
||||
|
||||
return ElmLen;
|
||||
} /* End of QBSS_LoadElementAppend */
|
||||
#endif
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Append the QBSS Load element to the beacon frame.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
*pBeaconBuf - the beacon or probe response frame
|
||||
|
||||
Return Value:
|
||||
the element total Length
|
||||
|
||||
Note:
|
||||
Append Condition: You must check whether WMM is enabled before the
|
||||
function is using.
|
||||
========================================================================
|
||||
*/
|
||||
UINT32 QBSS_LoadElementAppend(RTMP_ADAPTER *pAd, UINT8 *pBeaconBuf)
|
||||
{
|
||||
ELM_QBSS_LOAD load, *pLoad = &load;
|
||||
ULONG ElmLen;
|
||||
|
||||
|
||||
/* check whether channel busy time calculation is enabled */
|
||||
if (pAd->phy_ctrl.FlgQloadEnable == 0)
|
||||
return 0;
|
||||
|
||||
/* init */
|
||||
pLoad->ElementId = ELM_QBSS_LOAD_ID;
|
||||
pLoad->Length = ELM_QBSS_LOAD_LEN;
|
||||
|
||||
pLoad->StationCount = le2cpu16(MacTableAssocStaNumGet(pAd));
|
||||
pLoad->ChanUtil = pAd->phy_ctrl.QloadChanUtil;
|
||||
|
||||
/* because no ACM is supported, the available bandwidth is 1 sec */
|
||||
pLoad->AvalAdmCap = le2cpu16(0x7a12); /* 0x7a12 * 32us = 1 second */
|
||||
|
||||
|
||||
/* copy the element to the frame */
|
||||
MakeOutgoingFrame(pBeaconBuf, &ElmLen,
|
||||
sizeof(ELM_QBSS_LOAD), pLoad,
|
||||
END_OF_ARGS);
|
||||
|
||||
return ElmLen;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Update Channel Utilization.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
UpTime - current up time
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
UpTime is used in QLOAD_FUNC_BUSY_TIME_STATS & QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
|
||||
If UpTime != 0, it means that the time period calling the function
|
||||
maybe not TBTT so we need to re-calculate the time period.
|
||||
|
||||
If you call the function in kernel thread, the time period sometimes
|
||||
will not accurate due to kernel thread is not real-time, so we need to
|
||||
recalculate the time period.
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadUpdate(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN ULONG UpTime)
|
||||
{
|
||||
UINT32 ChanUtilNu, ChanUtilDe;
|
||||
UINT32 BusyTime = 0;
|
||||
UINT32 BusyTimeId;
|
||||
UINT32 TimePeriod = pAd->CommonCfg.BeaconPeriod;
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
BOOLEAN FlgIsBusyOverThreshold = FALSE;
|
||||
BOOLEAN FlgIsAlarmNeeded = FALSE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
|
||||
/* check whether channel busy time calculation is enabled */
|
||||
if ((pAd->phy_ctrl.FlgQloadEnable == 0) ||
|
||||
(pAd->phy_ctrl.FlgQloadAlarmIsSuspended == TRUE))
|
||||
return;
|
||||
|
||||
/* calculate new time period if needed */
|
||||
if ((UpTime > 0) &&
|
||||
(pAd->phy_ctrl.QloadUpTimeLast > 0) &&
|
||||
(UpTime > pAd->phy_ctrl.QloadUpTimeLast))
|
||||
{
|
||||
/* re-calculate time period */
|
||||
TimePeriod = (UINT32)(UpTime - pAd->phy_ctrl.QloadUpTimeLast);
|
||||
|
||||
/* translate to mini-second */
|
||||
TimePeriod = (TimePeriod*1000)/OS_HZ;
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* re-calculate QloadBusyTimeThreshold */
|
||||
if (TimePeriod != pAd->phy_ctrl.QloadTimePeriodLast)
|
||||
QBSS_LoadAlarmBusyTimeThresholdReset(pAd, TimePeriod);
|
||||
|
||||
pAd->phy_ctrl.QloadTimePeriodLast = TimePeriod;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
/* update up time */
|
||||
pAd->phy_ctrl.QloadUpTimeLast = UpTime;
|
||||
|
||||
/* do busy time statistics */
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if ((pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset != 0) &&
|
||||
(pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth != 0))
|
||||
{
|
||||
/* in 20MHz, no need to check busy time of secondary channel */
|
||||
BusyTime = AsicGetChBusyCnt(pAd, 1);
|
||||
pAd->phy_ctrl.QloadLatestChannelBusyTimeSec = BusyTime;
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
BusyTimeId = BusyTime >> 10; /* translate us to ms */
|
||||
|
||||
/* ex:95ms, 95*20/100 = 19 */
|
||||
BusyTimeId = (BusyTimeId*QLOAD_BUSY_INTERVALS)/TimePeriod;
|
||||
|
||||
if (BusyTimeId >= QLOAD_BUSY_INTERVALS)
|
||||
BusyTimeId = QLOAD_BUSY_INTERVALS - 1;
|
||||
|
||||
pAd->phy_ctrl.QloadBusyCountSec[BusyTimeId] ++;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
if ((pAd->phy_ctrl.FlgQloadAlarmIsSuspended == FALSE) &&
|
||||
(pAd->phy_ctrl.QloadAlarmBusyTimeThreshold > 0))
|
||||
{
|
||||
/* Alarm is not suspended and is enabled */
|
||||
|
||||
if ((pAd->phy_ctrl.QloadBusyTimeThreshold != 0) &&
|
||||
(BusyTime >= pAd->phy_ctrl.QloadBusyTimeThreshold))
|
||||
{
|
||||
FlgIsBusyOverThreshold = TRUE;
|
||||
}
|
||||
}
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
|
||||
/* do busy time statistics for primary channel */
|
||||
BusyTime = AsicGetChBusyCnt(pAd, 0);
|
||||
pAd->phy_ctrl.QloadLatestChannelBusyTimePri = BusyTime;
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
BusyTimeId = BusyTime >> 10; /* translate us to ms */
|
||||
|
||||
/* ex:95ms, 95*20/100 = 19 */
|
||||
BusyTimeId = (BusyTimeId*QLOAD_BUSY_INTERVALS)/TimePeriod;
|
||||
|
||||
if (BusyTimeId >= QLOAD_BUSY_INTERVALS)
|
||||
BusyTimeId = QLOAD_BUSY_INTERVALS - 1;
|
||||
|
||||
pAd->phy_ctrl.QloadBusyCountPri[BusyTimeId] ++;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
if ((pAd->phy_ctrl.FlgQloadAlarmIsSuspended == FALSE) &&
|
||||
(pAd->phy_ctrl.QloadAlarmBusyTimeThreshold > 0))
|
||||
{
|
||||
/* Alarm is not suspended and is enabled */
|
||||
|
||||
if ((pAd->phy_ctrl.QloadBusyTimeThreshold != 0) &&
|
||||
(BusyTime >= pAd->phy_ctrl.QloadBusyTimeThreshold))
|
||||
{
|
||||
FlgIsBusyOverThreshold = TRUE;
|
||||
}
|
||||
}
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
/* accumulate channel busy time for primary channel */
|
||||
pAd->phy_ctrl.QloadChanUtilTotal += BusyTime;
|
||||
|
||||
/* update new channel utilization for primary channel */
|
||||
if (++pAd->phy_ctrl.QloadChanUtilBeaconCnt >= pAd->phy_ctrl.QloadChanUtilBeaconInt)
|
||||
{
|
||||
ChanUtilNu = pAd->phy_ctrl.QloadChanUtilTotal;
|
||||
ChanUtilNu *= 255;
|
||||
|
||||
ChanUtilDe = pAd->phy_ctrl.QloadChanUtilBeaconInt;
|
||||
|
||||
/*
|
||||
Still use pAd->CommonCfg.BeaconPeriod.
|
||||
Because we change QloadChanUtil not every TBTT.
|
||||
*/
|
||||
ChanUtilDe *= pAd->CommonCfg.BeaconPeriod;
|
||||
|
||||
ChanUtilDe <<= 10; /* ms to us */
|
||||
|
||||
pAd->phy_ctrl.QloadChanUtil = (UINT8)(ChanUtilNu/ChanUtilDe);
|
||||
|
||||
/* re-accumulate channel busy time */
|
||||
pAd->phy_ctrl.QloadChanUtilBeaconCnt = 0;
|
||||
pAd->phy_ctrl.QloadChanUtilTotal = 0;
|
||||
}
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* check if alarm function is enabled */
|
||||
if ((pAd->phy_ctrl.FlgQloadAlarmIsSuspended == FALSE) &&
|
||||
(pAd->phy_ctrl.QloadAlarmBusyTimeThreshold > 0))
|
||||
{
|
||||
/* Alarm is not suspended and is enabled */
|
||||
|
||||
/* check if we need to issue a alarm */
|
||||
if (FlgIsBusyOverThreshold == TRUE)
|
||||
{
|
||||
if (pAd->phy_ctrl.QloadAlarmDuration == 0)
|
||||
{
|
||||
/* last alarm ended so we can check new alarm */
|
||||
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum ++;
|
||||
|
||||
if (pAd->phy_ctrl.QloadAlarmBusyNum >= pAd->phy_ctrl.QloadAlarmBusyNumThreshold)
|
||||
{
|
||||
/*
|
||||
The continued number of busy time >= threshold is larger
|
||||
than number threshold so issuing a alarm.
|
||||
*/
|
||||
FlgIsAlarmNeeded = TRUE;
|
||||
pAd->phy_ctrl.QloadAlarmDuration ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum = 0;
|
||||
|
||||
if (pAd->phy_ctrl.QloadAlarmDuration > 0)
|
||||
{
|
||||
/*
|
||||
New alarm occurs so we can not re-issue new alarm during
|
||||
QBSS_LOAD_ALARM_DURATION * TBTT.
|
||||
*/
|
||||
if (++pAd->phy_ctrl.QloadAlarmDuration >= QBSS_LOAD_ALARM_DURATION)
|
||||
{
|
||||
/* can re-issue next alarm */
|
||||
pAd->phy_ctrl.QloadAlarmDuration = 0;
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (FlgIsAlarmNeeded == TRUE)
|
||||
QBSS_LoadAlarm(pAd);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* clear statistics counts */
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum = 0;
|
||||
pAd->phy_ctrl.QloadAlarmDuration = 0;
|
||||
pAd->phy_ctrl.FlgQloadAlarm = FALSE;
|
||||
}
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Clear QoS Load information.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadStatusClear(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
/* clear busy time statistics */
|
||||
NdisZeroMemory(pAd->phy_ctrl.QloadBusyCountPri, sizeof(pAd->phy_ctrl.QloadBusyCountPri));
|
||||
NdisZeroMemory(pAd->phy_ctrl.QloadBusyCountSec, sizeof(pAd->phy_ctrl.QloadBusyCountSec));
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* clear alarm function variables */
|
||||
pAd->phy_ctrl.QloadChanUtilTotal = 0;
|
||||
pAd->phy_ctrl.FlgQloadAlarm = FALSE;
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum = 0;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Show QoS Load information.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Arg - Input arguments
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT Show_QoSLoad_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
UINT32 BusyTimeId;
|
||||
#ifdef DBG
|
||||
UINT32 Time;
|
||||
Time = pAd->CommonCfg.BeaconPeriod / QLOAD_BUSY_INTERVALS;
|
||||
#endif /* DBG */
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n\tPrimary Busy Time\tTimes\n"));
|
||||
|
||||
for(BusyTimeId=0; BusyTimeId<QLOAD_BUSY_INTERVALS; BusyTimeId++)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t%dms ~ %dms\t\t%d\n",
|
||||
BusyTimeId*Time,
|
||||
(BusyTimeId+1)*Time,
|
||||
pAd->phy_ctrl.QloadBusyCountPri[BusyTimeId]));
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n\tSecondary Busy Time\tTimes\n"));
|
||||
|
||||
for(BusyTimeId=0; BusyTimeId<QLOAD_BUSY_INTERVALS; BusyTimeId++)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t%dms ~ %dms\t\t%d\n",
|
||||
BusyTimeId*Time,
|
||||
(BusyTimeId+1)*Time,
|
||||
pAd->phy_ctrl.QloadBusyCountSec[BusyTimeId]));
|
||||
}
|
||||
#else
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\tBusy time statistics is not included into the driver!\n"));
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Command for QoS Load information clear.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Arg - Input arguments
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT Set_QloadClr_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
QBSS_LoadStatusClear(pAd);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Command for QoS Alarm Time Threshold set.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Arg - Input arguments
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT Set_QloadAlarmTimeThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.QloadAlarmBusyTimeThreshold = (UCHAR)simple_strtol(Arg, 0, 10);
|
||||
|
||||
QBSS_LoadAlarmReset(pAd);
|
||||
|
||||
pAd->phy_ctrl.QloadTimePeriodLast = pAd->CommonCfg.BeaconPeriod;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Command for QoS Alarm Number Threshold set.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Arg - Input arguments
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT Set_QloadAlarmNumThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.QloadAlarmBusyNumThreshold = (UCHAR)simple_strtol(Arg, 0, 10);
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* AP_QLOAD_SUPPORT */
|
||||
|
1027
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_repeater.c
Normal file
1027
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_repeater.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,30 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_sanity.c
|
||||
|
||||
Abstract:
|
||||
Handle association related requests either from WSTA or from local MLME
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
John Chang 08-14-2003 created for 11g soft-AP
|
||||
John Chang 12-30-2004 merge with STA driver for RT2600
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
2296
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_sync.c
Normal file
2296
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_sync.c
Normal file
File diff suppressed because it is too large
Load Diff
1403
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_wds.c
Normal file
1403
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_wds.c
Normal file
File diff suppressed because it is too large
Load Diff
113
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_wds_inf.c
Normal file
113
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_wds_inf.c
Normal file
@ -0,0 +1,113 @@
|
||||
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_wds.c
|
||||
|
||||
Abstract:
|
||||
Support WDS function.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
------ ---------- ----------------------------------------------
|
||||
Fonchi 02-13-2007 created
|
||||
*/
|
||||
#define RTMP_MODULE_OS
|
||||
|
||||
#ifdef WDS_SUPPORT
|
||||
|
||||
/*#include "rt_config.h" */
|
||||
#include "rtmp_comm.h"
|
||||
#include "rt_os_util.h"
|
||||
#include "rt_os_net.h"
|
||||
|
||||
|
||||
NET_DEV_STATS *RT28xx_get_wds_ether_stats(PNET_DEV net_dev);
|
||||
|
||||
|
||||
/* Register WDS interface */
|
||||
VOID RT28xx_WDS_Init(VOID *pAd, PNET_DEV net_dev)
|
||||
{
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevOpHook;
|
||||
|
||||
NdisZeroMemory((PUCHAR)&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK));
|
||||
netDevOpHook.open = WdsVirtualIF_open;
|
||||
netDevOpHook.stop = WdsVirtualIF_close;
|
||||
netDevOpHook.xmit = rt28xx_send_packets;
|
||||
netDevOpHook.ioctl = rt28xx_ioctl;
|
||||
netDevOpHook.get_stats = RT28xx_get_wds_ether_stats;
|
||||
NdisMoveMemory(&netDevOpHook.devAddr[0], RTMP_OS_NETDEV_GET_PHYADDR(net_dev), MAC_ADDR_LEN);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("The new WDS interface MAC = %02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||
PRINT_MAC(netDevOpHook.devAddr)));
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_WDS_INIT,
|
||||
0, &netDevOpHook, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
INT WdsVirtualIF_open(PNET_DEV dev)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
/* increase MODULE use count */
|
||||
RT_MOD_INC_USE_COUNT();
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> VirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(dev)));
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(dev);
|
||||
if (VIRTUAL_IF_UP(pAd) != 0)
|
||||
return -1;
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_REG(dev);
|
||||
#endif
|
||||
RTMP_OS_NETDEV_START_QUEUE(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT WdsVirtualIF_close(PNET_DEV dev)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> VirtualIF_close\n", RTMP_OS_NETDEV_GET_DEVNAME(dev)));
|
||||
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(dev);
|
||||
|
||||
//RTMP_OS_NETDEV_CARRIER_OFF(dev);
|
||||
RTMP_OS_NETDEV_STOP_QUEUE(dev);
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_DEREG(dev);
|
||||
#endif
|
||||
VIRTUAL_IF_DOWN(pAd);
|
||||
|
||||
RT_MOD_DEC_USE_COUNT();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xx_WDS_Remove(VOID *pAd)
|
||||
{
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_WDS_REMOVE, 0, NULL, 0);
|
||||
}
|
||||
|
||||
#endif /* WDS_SUPPORT */
|
1545
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_wpa.c
Normal file
1545
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/ap_wpa.c
Normal file
File diff suppressed because it is too large
Load Diff
1288
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/apcli_assoc.c
Normal file
1288
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/apcli_assoc.c
Normal file
File diff suppressed because it is too large
Load Diff
1132
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/apcli_auth.c
Normal file
1132
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/apcli_auth.c
Normal file
File diff suppressed because it is too large
Load Diff
2105
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/apcli_ctrl.c
Normal file
2105
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/apcli_ctrl.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,144 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
apcli_ctrl.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Fonchi 2006-06-23 modified for rt61-APClinent
|
||||
*/
|
||||
#ifdef APCLI_SUPPORT
|
||||
#ifdef APCLI_LINK_COVER_SUPPORT
|
||||
#include "rt_config.h"
|
||||
|
||||
extern VOID* p5G_pAd;
|
||||
extern VOID* p2G_pAd;
|
||||
|
||||
INT ApcliLinkMonitorThread(
|
||||
IN ULONG Context)
|
||||
{
|
||||
RTMP_ADAPTER *pAd;
|
||||
RTMP_ADAPTER *pAd_other_band;
|
||||
RTMP_OS_TASK *pTask;
|
||||
int status;
|
||||
status = 0;
|
||||
|
||||
pTask = (RTMP_OS_TASK *)Context;
|
||||
pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);
|
||||
|
||||
RtmpOSTaskCustomize(pTask);
|
||||
|
||||
if (p2G_pAd == NULL) {
|
||||
printk("##### no 2G pAd!!!\n");
|
||||
//RtmpOSTaskNotifyToExit(pTask);
|
||||
// return 0;
|
||||
} else if (p5G_pAd == NULL) {
|
||||
printk("##### no 5G pAd!!!\n");
|
||||
//RtmpOSTaskNotifyToExit(pTask);
|
||||
// return 0;
|
||||
}
|
||||
if (p5G_pAd == pAd) {
|
||||
printk("we are 5G interface, wait 2G link update\n");
|
||||
pAd_other_band = p2G_pAd;
|
||||
}
|
||||
else {
|
||||
printk("we are 2G interface, wait 5G link update\n");
|
||||
pAd_other_band = p5G_pAd;
|
||||
}
|
||||
|
||||
while (pTask && !RTMP_OS_TASK_IS_KILLED(pTask) && (pAd_other_band != NULL))
|
||||
{
|
||||
if (RtmpOSTaskWait(pAd, pTask, &status) == FALSE)
|
||||
{
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
|
||||
break;
|
||||
}
|
||||
if (status != 0)
|
||||
break;
|
||||
//TODO: wait_for_completion
|
||||
}
|
||||
|
||||
/* notify the exit routine that we're actually exiting now
|
||||
*
|
||||
* complete()/wait_for_completion() is similar to up()/down(),
|
||||
* except that complete() is safe in the case where the structure
|
||||
* is getting deleted in a parallel mode of execution (i.e. just
|
||||
* after the down() -- that's necessary for the thread-shutdown
|
||||
* case.
|
||||
*
|
||||
* complete_and_exit() goes even further than this -- it is safe in
|
||||
* the case that the thread of the caller is going away (not just
|
||||
* the structure) -- this is necessary for the module-remove case.
|
||||
* This is important in preemption kernels, which transfer the flow
|
||||
* of execution immediately upon a complete().
|
||||
*/
|
||||
printk("<---ApcliLinkMonitorThread\n");
|
||||
|
||||
//if (pTask)
|
||||
// RtmpOSTaskNotifyToExit(pTask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
NDIS_STATUS RtmpApcliLinkTaskInit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
RTMP_OS_TASK *pTask;
|
||||
NDIS_STATUS status;
|
||||
|
||||
printk("##### %s\n", __func__);
|
||||
/* Creat ApCli Link Monitor Thread */
|
||||
pTask = &pAd->apcliLinkTask;
|
||||
RTMP_OS_TASK_INIT(pTask, "LinkMonitorTask", pAd);
|
||||
//status = RtmpOSTaskAttach(pTask, RTPCICmdThread, (ULONG)pTask);
|
||||
status = RtmpOSTaskAttach(pTask, ApcliLinkMonitorThread, (ULONG)pTask);
|
||||
if (status == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
/* printk ("%s: unable to start RTPCICmdThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)); */
|
||||
printk ("%s: Unable to start ApcliLinkMonitorThread!\n", get_dev_name_prefix(pAd, INT_APCLI));
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VOID RtmpApcliLinkTaskExit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
INT ret;
|
||||
|
||||
printk("##### %s\n", __func__);
|
||||
/* Terminate cmdQ thread */
|
||||
RTMP_OS_TASK_LEGALITY(&pAd->apcliLinkTask)
|
||||
{
|
||||
/*RTUSBCMDUp(&pAd->cmdQTask); */
|
||||
ret = RtmpOSTaskKill(&pAd->apcliLinkTask);
|
||||
if (ret == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Kill command task fail!\n"));
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
#endif /* APCLI_LINK_COVER_SUPPORT */
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
1581
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/apcli_sync.c
Normal file
1581
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/apcli_sync.c
Normal file
File diff suppressed because it is too large
Load Diff
551
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/sniffer_mib.c
Normal file
551
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ap/sniffer_mib.c
Normal file
@ -0,0 +1,551 @@
|
||||
|
||||
#ifdef SNIFFER_MIB_CMD
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
VOID sniffer_timeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3);
|
||||
|
||||
BUILD_TIMER_FUNCTION(sniffer_timeout);
|
||||
|
||||
INT sniffer_channel_restore(IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
INT bw, ch;
|
||||
pAd->hw_cfg.bbp_bw = pAd->ApCfg.sniffer_mib_ctrl.bbp_bw;
|
||||
#ifdef DOT11_VHT_AC
|
||||
pAd->CommonCfg.vht_cent_ch = pAd->ApCfg.sniffer_mib_ctrl.vht_cent_ch;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
pAd->CommonCfg.CentralChannel = pAd->ApCfg.sniffer_mib_ctrl.CentralChannel;
|
||||
pAd->CommonCfg.Channel = pAd->ApCfg.sniffer_mib_ctrl.Channel;
|
||||
|
||||
bbp_set_bw(pAd, pAd->hw_cfg.bbp_bw);
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (pAd->hw_cfg.bbp_bw == BW_80)
|
||||
ch = pAd->CommonCfg.vht_cent_ch;
|
||||
else
|
||||
#endif /* DOT11_VHT_AC */
|
||||
if (pAd->hw_cfg.bbp_bw == BW_40)
|
||||
ch = pAd->CommonCfg.CentralChannel;
|
||||
else
|
||||
ch = pAd->CommonCfg.Channel;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ch_restore - End of Monitor, restore to %dMHz channel %d\n",
|
||||
bw, ch));
|
||||
|
||||
ASSERT((ch != 0));
|
||||
AsicSwitchChannel(pAd, ch, FALSE);
|
||||
AsicLockChannel(pAd, ch);
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
void sniffer_timeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl = (SNIFFER_MIB_CTRL *)FunctionContext;
|
||||
PRTMP_ADAPTER pAd = psniffer_mib_ctrl->pAd;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s\n", __FUNCTION__));
|
||||
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s: fRTMP_ADAPTER_HALT_IN_PROGRESS\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
//set back the sniffer mode to off
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
Set_MonitorMode_Proc(pAd,"0");
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
|
||||
//if (psniffer_mib_ctrl->scan_channel != 0) // restore to original channel
|
||||
{
|
||||
//sniffer_channel_restore(pAd);
|
||||
RTEnqueueInternalCmd(pAd, CMDTHREAD_CHAN_RESTORE, NULL, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
VOID vSnifferMacTimeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
INT32 i4AvgRssi = 0;
|
||||
SNIFFER_MAC_CTRL *pMACEntry = (SNIFFER_MAC_CTRL *)FunctionContext;
|
||||
PSNIFFER_MAC_NOTIFY_T pMACEntryNotify = NULL;
|
||||
UCHAR bssid[MAC_ADDR_LEN] = {0}; //report zero bssid, to prevent too many check
|
||||
|
||||
if(pMACEntry == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():%d: pMACEntry is NULL!\n", __FUNCTION__,__LINE__));
|
||||
return;
|
||||
}
|
||||
|
||||
pMACEntryNotify = &pMACEntry->rNotify;
|
||||
if(pMACEntryNotify->i4RxPacketConut > 0)
|
||||
{
|
||||
i4AvgRssi = pMACEntryNotify->i4RssiAccum/pMACEntryNotify->i4RxPacketConut;
|
||||
wext_send_event(pMACEntryNotify->pNetDev,pMACEntry->MACAddr,bssid,pMACEntryNotify->u4Channel,i4AvgRssi,FBT_LINK_STA_FOUND_NOTIFY);
|
||||
|
||||
// Only clear data for next collection.
|
||||
NdisZeroMemory(pMACEntryNotify,sizeof(*pMACEntryNotify));
|
||||
}
|
||||
}
|
||||
BUILD_TIMER_FUNCTION(vSnifferMacTimeout);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
|
||||
VOID sniffer_mib_ctrlInit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
NdisZeroMemory(psniffer_mib_ctrl, sizeof(SNIFFER_MIB_CTRL));
|
||||
psniffer_mib_ctrl->AgeOutTime = 100 ; //set default 100 ms
|
||||
psniffer_mib_ctrl->pAd = pAd;
|
||||
|
||||
RTMPInitTimer(pAd, &psniffer_mib_ctrl->AgeOutTimer,
|
||||
GET_TIMER_FUNCTION(sniffer_timeout), psniffer_mib_ctrl, FALSE);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
|
||||
NdisAllocateSpinLock(pAd, &psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
DlListInit(&psniffer_mib_ctrl->MAC_List);
|
||||
|
||||
psniffer_mib_ctrl->MAC_ListNum = 0 ; // if we don't set MAC to listen, we expect to sniffer all
|
||||
}
|
||||
|
||||
|
||||
VOID sniffer_mib_ctrlExit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
BOOLEAN Cancelled;
|
||||
SNIFFER_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
|
||||
if(psniffer_mib_ctrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
RTMPReleaseTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMPReleaseTimer(&pMACEntry->rNotifyTimer, &Cancelled);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
DlListDel(&pMACEntry->List);
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
}
|
||||
DlListInit(&psniffer_mib_ctrl->MAC_List);
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
NdisFreeSpinLock(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
}
|
||||
|
||||
INT exsta_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
BOOLEAN find_list = FALSE;
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
SNIFFER_MAC_CTRL *pMACEntry;
|
||||
UCHAR macAddr[MAC_ADDR_LEN];
|
||||
RTMP_STRING *value;
|
||||
INT i;
|
||||
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
if (psniffer_mib_ctrl->MAC_ListNum >= (MAX_NUM_OF_SNIFFER_MAC - 1))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN, ("%s : sniffer mac table is full, and no more entry can join the list!\n",__FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if(strlen(arg) != 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
||||
return FALSE;
|
||||
|
||||
for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":"))
|
||||
{
|
||||
if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
||||
return FALSE; /*Invalid */
|
||||
|
||||
AtoH(value, (UCHAR *)&macAddr[i++], 1);
|
||||
}
|
||||
|
||||
//need to cancel timer ?
|
||||
if(psniffer_mib_ctrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
if (MAC_ADDR_EQUAL(pMACEntry->MACAddr, macAddr))
|
||||
{
|
||||
find_list = TRUE;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : duplicate mac =%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,PRINT_MAC(macAddr)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
if (find_list == FALSE)
|
||||
os_alloc_mem(NULL, (UCHAR **)&pMACEntry, sizeof(*pMACEntry));
|
||||
|
||||
if (!pMACEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (find_list == FALSE)
|
||||
{
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
NdisZeroMemory(pMACEntry,sizeof(*pMACEntry));
|
||||
NdisMoveMemory(pMACEntry->MACAddr, macAddr, MAC_ADDR_LEN);
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMPInitTimer(pAd, &pMACEntry->rNotifyTimer, GET_TIMER_FUNCTION(vSnifferMacTimeout), pMACEntry, TRUE);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
DlListAddTail(&psniffer_mib_ctrl->MAC_List, &pMACEntry->List);
|
||||
psniffer_mib_ctrl->MAC_ListNum ++;
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT exsta_list_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
SNIFFER_MAC_CTRL *pMACEntry;
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
INT i=0;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC [%d]=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,i++, PRINT_MAC(pMACEntry->MACAddr)));
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC count=%d\n", __FUNCTION__,i));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT exsta_clear_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
SNIFFER_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
|
||||
if(psniffer_mib_ctrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMPReleaseTimer(&pMACEntry->rNotifyTimer, &Cancelled);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
DlListDel(&pMACEntry->List);
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
}
|
||||
DlListInit(&psniffer_mib_ctrl->MAC_List);
|
||||
|
||||
psniffer_mib_ctrl->MAC_ListNum = 0;
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT set_monitor_channel(IN RTMP_ADAPTER *ad, IN INT bw, IN INT channel, IN INT pri_idx)
|
||||
{
|
||||
UINT8 ext_ch;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): bw = %d, channel = %d, pri_idx = %d\n", __FUNCTION__, bw, channel, pri_idx));
|
||||
|
||||
ad->CommonCfg.Channel = channel;
|
||||
if (bw == BW_40) {
|
||||
if (pri_idx == 0) {
|
||||
ad->CommonCfg.CentralChannel = ad->CommonCfg.Channel + 2;
|
||||
ext_ch = EXTCHA_ABOVE;
|
||||
} else if (pri_idx == 1) {
|
||||
ext_ch = EXTCHA_BELOW;
|
||||
if (channel == 14) {
|
||||
ad->CommonCfg.CentralChannel = ad->CommonCfg.Channel - 1;
|
||||
} else {
|
||||
ad->CommonCfg.CentralChannel = ad->CommonCfg.Channel - 2;
|
||||
}
|
||||
} else {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("pri_idx(%d) is invalid\n"));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (bw == BW_20) {
|
||||
ad->CommonCfg.CentralChannel = channel;
|
||||
} else if ((bw == BW_80) && channel > 14) {
|
||||
#ifdef DOT11_VHT_AC
|
||||
ad->CommonCfg.vht_bw = VHT_BW_80;
|
||||
ad->CommonCfg.vht_cent_ch = vht_cent_ch_freq(ad, ad->CommonCfg.Channel);
|
||||
#endif
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bbp_set_bw(ad, bw);
|
||||
|
||||
/* TX/Rx : control channel setting */
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
if (ad->chipCap.hif_type == HIF_RTMP || ad->chipCap.hif_type == HIF_RLT)
|
||||
rtmp_mac_set_ctrlch(ad, ext_ch);
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) */
|
||||
|
||||
#ifdef MT_MAC
|
||||
if (ad->chipCap.hif_type == HIF_MT)
|
||||
mt_mac_set_ctrlch(ad, ext_ch);
|
||||
#endif /* MT_MAC */
|
||||
|
||||
bbp_set_ctrlch(ad, ext_ch);
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (ad->CommonCfg.BBPCurrentBW == BW_80)
|
||||
ad->hw_cfg.cent_ch = ad->CommonCfg.vht_cent_ch;
|
||||
else
|
||||
#endif /* DOT11_VHT_AC */
|
||||
ad->hw_cfg.cent_ch = ad->CommonCfg.CentralChannel;
|
||||
|
||||
AsicSwitchChannel(ad, ad->hw_cfg.cent_ch, FALSE);
|
||||
AsicLockChannel(ad, ad->hw_cfg.cent_ch);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* trigger sniffer timmer*/
|
||||
INT exsta_scan_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
BOOLEAN Cancelled;
|
||||
ULONG start = 0;
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
SNIFFER_MAC_CTRL *pMACEntry = NULL;
|
||||
PSNIFFER_MAC_NOTIFY_T pMACEntryNotify = NULL;
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
start = simple_strtol(arg, 0, 10);
|
||||
|
||||
if(psniffer_mib_ctrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
if(pMACEntry)
|
||||
{
|
||||
RTMPCancelTimer(&pMACEntry->rNotifyTimer, &Cancelled);
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
}
|
||||
|
||||
if(start)
|
||||
{
|
||||
if (psniffer_mib_ctrl->AgeOutTime)
|
||||
{
|
||||
RTMPSetTimer(&psniffer_mib_ctrl->AgeOutTimer, psniffer_mib_ctrl->AgeOutTime);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = TRUE;
|
||||
|
||||
psniffer_mib_ctrl->bbp_bw = pAd->CommonCfg.BBPCurrentBW;//pAd->hw_cfg.bbp_bw;
|
||||
#ifdef DOT11_VHT_AC
|
||||
psniffer_mib_ctrl->vht_cent_ch = pAd->CommonCfg.vht_cent_ch;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
psniffer_mib_ctrl->CentralChannel = pAd->CommonCfg.CentralChannel;
|
||||
psniffer_mib_ctrl->Channel = pAd->CommonCfg.Channel;
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->bbp_bw=%d,psniffer_mib_ctrl->CentralChannel=%d,psniffer_mib_ctrl->Channel\n",__FUNCTION__,
|
||||
psniffer_mib_ctrl->bbp_bw,psniffer_mib_ctrl->CentralChannel,psniffer_mib_ctrl->Channel));
|
||||
#else /* DOT11_VHT_AC */
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->bbp_bw=%d, psniffer_mib_ctrl->vht_cent_ch=%d,psniffer_mib_ctrl->CentralChannel=%d,psniffer_mib_ctrl->Channel\n",__FUNCTION__,
|
||||
psniffer_mib_ctrl->bbp_bw,psniffer_mib_ctrl->vht_cent_ch,psniffer_mib_ctrl->CentralChannel,psniffer_mib_ctrl->Channel));
|
||||
#endif /* !DOT11_VHT_AC */
|
||||
|
||||
// no cmd to set bw, keep the original bw
|
||||
if (psniffer_mib_ctrl->scan_channel == 0)
|
||||
{
|
||||
;// do nothing, don't switch channel
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pAd->hw_cfg.bbp_bw !=BW_20 )
|
||||
{
|
||||
if (psniffer_mib_ctrl->scan_channel <=7 ) //EXTCHA_ABOVE , ch 1~7 use EXTCHA_ABOVE
|
||||
{
|
||||
set_monitor_channel(pAd,psniffer_mib_ctrl->bbp_bw, psniffer_mib_ctrl->scan_channel, 0);
|
||||
}
|
||||
else // others use EXTCHA_BELOW
|
||||
{
|
||||
set_monitor_channel(pAd,psniffer_mib_ctrl->bbp_bw, psniffer_mib_ctrl->scan_channel, 1);
|
||||
}
|
||||
}
|
||||
else //BW_20 case
|
||||
{
|
||||
set_monitor_channel(pAd,psniffer_mib_ctrl->bbp_bw, psniffer_mib_ctrl->scan_channel, 0);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
if(pMACEntry)
|
||||
{
|
||||
pMACEntryNotify = &pMACEntry->rNotify;
|
||||
NdisZeroMemory(pMACEntryNotify,sizeof(*pMACEntryNotify));
|
||||
RTMPSetTimer(&pMACEntry->rNotifyTimer, SNIFFER_MAC_TIMEOUT);
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
Set_MonitorMode_Proc(pAd,"2");
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->AgeOutTime=%lu, not start timer!\n",__FUNCTION__,psniffer_mib_ctrl->AgeOutTime));
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT set_mib_passive_scan_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
|
||||
ULONG scan_type = (ULONG) simple_strtol(arg, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
if (scan_type == PASSIVE_TYPE)
|
||||
{
|
||||
psniffer_mib_ctrl->scan_type = PASSIVE_TYPE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: not implement yet !, force set to PASSIVE_TYPE\n",__FUNCTION__));
|
||||
psniffer_mib_ctrl->scan_type = PASSIVE_TYPE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->scan_type=%u\n",__FUNCTION__,psniffer_mib_ctrl->scan_type));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT set_mib_scan_interval_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
ULONG interval = (ULONG) simple_strtol(arg, 0, 10);
|
||||
|
||||
psniffer_mib_ctrl->AgeOutTime = interval;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==> psniffer_mib_ctrl->AgeOutTime=%u\n",__FUNCTION__,psniffer_mib_ctrl->AgeOutTime));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT set_mib_scan_scope_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
ULONG scope = (ULONG) simple_strtol(arg, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
if (scope == SCAN_ONE)
|
||||
{
|
||||
psniffer_mib_ctrl->scan_scope = SCAN_ONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: not implement yet !, force set to SCAN_ONE\n",__FUNCTION__));
|
||||
psniffer_mib_ctrl->scan_scope = SCAN_ONE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->scan_scope=%u\n",__FUNCTION__,psniffer_mib_ctrl->scan_scope));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT set_mib_scan_channel_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
ULONG channel;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
channel = (ULONG) simple_strtol(arg, 0, 10);
|
||||
if ((channel>0) && (channel <=14))
|
||||
{
|
||||
psniffer_mib_ctrl->scan_channel = channel;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==> error channel=%u, force set to channel 0\n",__FUNCTION__,channel));
|
||||
psniffer_mib_ctrl->scan_channel = 0; // 0 means current channel
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->scan_channel = %u\n",__FUNCTION__,psniffer_mib_ctrl->scan_channel));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* SNIFFER_MIB_CMD */
|
||||
|
||||
|
1231
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ate/ate_agent.c
Normal file
1231
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ate/ate_agent.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,243 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of MediaTek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of MediaTek, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ate.h
|
||||
*/
|
||||
|
||||
#ifndef __ATE_H__
|
||||
#define __ATE_H__
|
||||
|
||||
#define ATE_ON(_p) ((((_p)->ATECtrl.Mode) & ATE_START) == ATE_START)
|
||||
INT32 ATEInit(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 ATEExit(struct _RTMP_ADAPTER *pAd);
|
||||
|
||||
/*
|
||||
Use bitmap to allow coexist of ATE_TXFRAME
|
||||
and ATE_RXFRAME(i.e.,to support LoopBack mode).
|
||||
*/
|
||||
#define fATE_IDLE (1 << 0)
|
||||
#define fATE_TX_ENABLE (1 << 1)
|
||||
#define fATE_RX_ENABLE (1 << 2)
|
||||
#define fATE_TXCONT_ENABLE (1 << 3)
|
||||
#define fATE_TXCARR_ENABLE (1 << 4)
|
||||
#define fATE_TXCARRSUPP_ENABLE (1 << 5)
|
||||
#define fATE_RESERVED_1 (1 << 6)
|
||||
#define fATE_RFTEST_ENABLE (1 << 7)
|
||||
#define fATE_EXIT (1 << 8)
|
||||
|
||||
/* Stop Transmission */
|
||||
#define ATE_TXSTOP ((~(fATE_TX_ENABLE))&(~(fATE_TXCONT_ENABLE))&(~(fATE_TXCARR_ENABLE))&(~(fATE_TXCARRSUPP_ENABLE)))
|
||||
/* Stop Receiving Frames */
|
||||
#define ATE_RXSTOP (~(fATE_RX_ENABLE))
|
||||
|
||||
|
||||
/* Enter/Reset ATE */
|
||||
#define ATE_START (fATE_IDLE)
|
||||
/* Stop/Exit ATE */
|
||||
#define ATE_STOP (fATE_EXIT)
|
||||
/* Continuous Transmit Frames (without time gap) */
|
||||
#define ATE_TXCONT ((fATE_TX_ENABLE)|(fATE_TXCONT_ENABLE))
|
||||
/* Transmit Carrier */
|
||||
#define ATE_TXCARR ((fATE_TX_ENABLE)|(fATE_TXCARR_ENABLE))
|
||||
/* Transmit Carrier Suppression (information without carrier) */
|
||||
#define ATE_TXCARRSUPP ((fATE_TX_ENABLE)|(fATE_TXCARRSUPP_ENABLE))
|
||||
/* Transmit Frames */
|
||||
#define ATE_TXFRAME (fATE_TX_ENABLE)
|
||||
/* Receive Frames */
|
||||
#define ATE_RXFRAME (fATE_RX_ENABLE)
|
||||
|
||||
|
||||
#define ATE_RFTEST (fATE_RFTEST_ENABLE)
|
||||
|
||||
#define BULK_OUT_LOCK(pLock, IrqFlags) \
|
||||
if(1 /*!(in_interrupt() & 0xffff0000)*/) \
|
||||
RTMP_IRQ_LOCK((pLock), IrqFlags);
|
||||
|
||||
#define BULK_OUT_UNLOCK(pLock, IrqFlags) \
|
||||
if(1 /*!(in_interrupt() & 0xffff0000)*/) \
|
||||
RTMP_IRQ_UNLOCK((pLock), IrqFlags);
|
||||
|
||||
/* ContiTxTone */
|
||||
#define WF0_TX_ONE_TONE_5M 0x0
|
||||
#define WF0_TX_TWO_TONE_5M 0x1
|
||||
#define WF1_TX_ONE_TONE_5M 0x2
|
||||
#define WF1_TX_TWO_TONE_5M 0x3
|
||||
#define WF0_TX_ONE_TONE_10M 0x4
|
||||
#define WF1_TX_ONE_TONE_10M 0x5
|
||||
#define WF0_TX_ONE_TONE_DC 0x6
|
||||
#define WF1_TX_ONE_TONE_DC 0x7
|
||||
|
||||
struct _RTMP_ADAPTER;
|
||||
struct _RX_BLK;
|
||||
|
||||
typedef struct _ATE_OPERATION {
|
||||
INT32 (*ATEStart)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*ATEStop)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*StartTx)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*StartRx)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*StopTx)(struct _RTMP_ADAPTER *pAd, UINT32 Mode);
|
||||
INT32 (*StopRx)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*SetTxPath)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*SetRxPath)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*SetTxPower0)(struct _RTMP_ADAPTER *pAd, CHAR Value);
|
||||
INT32 (*SetTxPower1)(struct _RTMP_ADAPTER *pAd, CHAR Value);
|
||||
INT32 (*SetTxAntenna)(struct _RTMP_ADAPTER *pAd, CHAR Ant);
|
||||
INT32 (*SetRxAntenna)(struct _RTMP_ADAPTER *pAd, CHAR Ant);
|
||||
INT32 (*SetTxFreqOffset)(struct _RTMP_ADAPTER *pAd, UINT32 FreqOffset);
|
||||
INT32 (*SetChannel)(struct _RTMP_ADAPTER *pAd, INT16 Value);
|
||||
INT32 (*SetBW)(struct _RTMP_ADAPTER *pAd, INT16 Value);
|
||||
INT32 (*SampleRssi)(struct _RTMP_ADAPTER *pAd, struct _RX_BLK *pRxBlk);
|
||||
INT32 (*SetAIFS)(struct _RTMP_ADAPTER *pAd, CHAR Value);
|
||||
INT32 (*SetTSSI)(struct _RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting);
|
||||
INT32 (*SetDPD)(struct _RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting);
|
||||
INT32 (*StartTxTone)(struct _RTMP_ADAPTER *pAd, UINT32 Mode);
|
||||
INT32 (*SetTxTonePower)(struct _RTMP_ADAPTER *pAd, INT32 pwr1, INT pwr2);
|
||||
INT32 (*StopTxTone)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*StartContinousTx)(struct _RTMP_ADAPTER *pAd, CHAR WFSel);
|
||||
INT32 (*RfRegWrite)(struct _RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, UINT32 Value);
|
||||
INT32 (*RfRegRead)(struct _RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, UINT32 *Value);
|
||||
INT32 (*GetFWInfo)(struct _RTMP_ADAPTER *pAd, UCHAR *FWInfo);
|
||||
} ATE_OPERATION;
|
||||
|
||||
typedef struct _ATE_CTRL {
|
||||
ATE_OPERATION *ATEOp;
|
||||
#ifdef RTMP_MAC_PCI
|
||||
PVOID AteAllocVa[TX_RING_SIZE];
|
||||
PNDIS_PACKET pAtePacket[TX_RING_SIZE];
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
UINT32 Mode;
|
||||
BOOLEAN PassiveMode;
|
||||
CHAR TxPower0;
|
||||
CHAR TxPower1;
|
||||
CHAR TxPower2;
|
||||
CHAR MinTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */
|
||||
CHAR MaxTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */
|
||||
CHAR TxAntennaSel;
|
||||
CHAR RxAntennaSel;
|
||||
USHORT TxInfoLen;
|
||||
USHORT TxWILen;
|
||||
USHORT QID;
|
||||
UCHAR *TemplateFrame;
|
||||
UCHAR Addr1[MAC_ADDR_LEN];
|
||||
UCHAR Addr2[MAC_ADDR_LEN];
|
||||
UCHAR Addr3[MAC_ADDR_LEN];
|
||||
UCHAR Channel;
|
||||
UCHAR ControlChl;
|
||||
UCHAR BW;
|
||||
UCHAR PhyMode;
|
||||
UCHAR Stbc;
|
||||
UCHAR Sgi;
|
||||
UCHAR Mcs;
|
||||
UCHAR Preamble;
|
||||
UCHAR Payload; /* Payload pattern */
|
||||
BOOLEAN bFixedPayload;
|
||||
UCHAR TxMethod; /* Early chipsets must be applied old TXCONT/TXCARR/TXCARS mechanism. */
|
||||
UINT32 TxLength;
|
||||
UINT32 TxCount;
|
||||
UINT32 TxDoneCount; /* Tx DMA Done */
|
||||
UINT32 RFFreqOffset;
|
||||
UINT32 IPG;
|
||||
BOOLEAN bRxFER; /* Show Rx Frame Error Rate */
|
||||
/* Used when using QA Tool */
|
||||
BOOLEAN bQAEnabled; /* QA is used. */
|
||||
BOOLEAN bQATxStart; /* Have compiled QA in and use it to ATE tx. */
|
||||
BOOLEAN bQARxStart; /* Have compiled QA in and use it to ATE rx. */
|
||||
BOOLEAN bAutoTxAlc; /* Set Auto Tx Alc */
|
||||
BOOLEAN bAutoVcoCal; /* Set Auto VCO periodic calibration. */
|
||||
BOOLEAN bLowTemperature; /* Trigger Temperature Sensor */
|
||||
BOOLEAN bTestTimeReduction; /* Set ATE test time reduction. */
|
||||
#ifdef RTMP_MAC_PCI
|
||||
BOOLEAN bFWLoading; /* Reload firmware when ATE is done. */
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
UINT32 RxTotalCnt;
|
||||
UINT32 RxCntPerSec;
|
||||
|
||||
CHAR LastSNR0; /* last received SNR */
|
||||
CHAR LastSNR1; /* last received SNR for 2nd antenna */
|
||||
CHAR LastSNR2;
|
||||
CHAR LastRssi0; /* last received RSSI */
|
||||
CHAR LastRssi1; /* last received RSSI for 2nd antenna */
|
||||
CHAR LastRssi2; /* last received RSSI for 3rd antenna */
|
||||
CHAR AvgRssi0; /* last 8 frames' average RSSI */
|
||||
CHAR AvgRssi1; /* last 8 frames' average RSSI */
|
||||
CHAR AvgRssi2; /* last 8 frames' average RSSI */
|
||||
SHORT AvgRssi0X8; /* sum of last 8 frames' RSSI */
|
||||
SHORT AvgRssi1X8; /* sum of last 8 frames' RSSI */
|
||||
SHORT AvgRssi2X8; /* sum of last 8 frames' RSSI */
|
||||
UINT32 NumOfAvgRssiSample;
|
||||
UINT32 Default_TX_PIN_CFG;
|
||||
USHORT HLen; /* Header Length */
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
/* Tx frame */
|
||||
USHORT PLen; /* Pattern Length */
|
||||
UCHAR Header[32]; /* Header buffer */
|
||||
UCHAR Pattern[32]; /* Pattern buffer */
|
||||
USHORT DLen; /* Data Length */
|
||||
USHORT seq;
|
||||
UINT32 CID;
|
||||
RTMP_OS_PID AtePid;
|
||||
/* counters */
|
||||
UINT32 U2M;
|
||||
UINT32 OtherData;
|
||||
UINT32 Beacon;
|
||||
UINT32 OtherCount;
|
||||
UINT32 TxAc0;
|
||||
UINT32 TxAc1;
|
||||
UINT32 TxAc2;
|
||||
UINT32 TxAc3;
|
||||
UINT32 TxHCCA;
|
||||
UINT32 TxMgmt;
|
||||
UINT32 RSSI0;
|
||||
UINT32 RSSI1;
|
||||
UINT32 RSSI2;
|
||||
UINT32 SNR0;
|
||||
UINT32 SNR1;
|
||||
UINT32 SNR2;
|
||||
INT32 BF_SNR[3]; /* Last RXWI BF SNR. Units=0.25 dB */
|
||||
/* TxStatus : 0 --> task is idle, 1 --> task is running */
|
||||
UCHAR TxStatus;
|
||||
UINT32 RCPI0;
|
||||
UINT32 RCPI1;
|
||||
UINT32 RCPI2;
|
||||
UINT32 FreqOffsetFromRx;
|
||||
UINT32 RxMacFCSErrCount;
|
||||
UINT32 RxMacMdrdyCount;
|
||||
UINT32 thermal_val;
|
||||
#endif
|
||||
RTMP_OS_COMPLETION cmd_done;
|
||||
ULONG cmd_expire;
|
||||
RALINK_TIMER_STRUCT PeriodicTimer;
|
||||
ULONG OneSecPeriodicRound;
|
||||
ULONG PeriodicRound;
|
||||
OS_NDIS_SPIN_LOCK TssiSemLock;
|
||||
UINT32 tssi0_wf0_cr;
|
||||
UINT32 tssi0_wf1_cr;
|
||||
UINT32 tssi1_wf0_cr;
|
||||
UINT32 tssi1_wf1_cr;
|
||||
UINT32 phy_mux_27;
|
||||
UINT32 rmac_pcr1;
|
||||
UINT32 rmac_pcr;
|
||||
} ATE_CTRL;
|
||||
VOID RtmpDmaEnable(RTMP_ADAPTER *pAd, INT Enable);
|
||||
|
||||
|
||||
VOID ATE_RTUSBBulkOutDataPacket(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR BulkOutPipeId);
|
||||
|
||||
VOID ATE_RTUSBCancelPendingBulkInIRP(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
|
||||
#endif /* __ATE_H__ */
|
@ -0,0 +1,83 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of MediaTek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of MediaTek, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ate_agent.h
|
||||
*/
|
||||
|
||||
#ifndef __ATE_AGENT_H__
|
||||
#define __ATE_AGENT_H__
|
||||
|
||||
struct _RTMP_ADAPTER;
|
||||
|
||||
INT32 SetTxStop(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetRxStop(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 RtmpDoAte(struct _RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, RTMP_STRING *wrq_name);
|
||||
VOID ATE_QA_Statistics(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *pRxWI, RXINFO_STRUC *pRxInfo, PHEADER_802_11 pHeader);
|
||||
|
||||
#ifdef DBG
|
||||
INT32 SetEERead(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetEEWrite(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetBBPRead(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetBBPWrite(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetRFWrite(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
#endif /* DBG */
|
||||
VOID rt_ee_read_all(struct _RTMP_ADAPTER *pAd, UINT16 *Data);
|
||||
VOID rt_ee_write_all(struct _RTMP_ADAPTER pAd, UINT16 *Data);
|
||||
VOID rt_ee_write_bulk(struct _RTMP_ADAPTER pAd, UINT16 *Data, UINT16 offset, UINT16 length);
|
||||
INT32 SetATEDa(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATESa(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEBssid(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEInitChan(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetADCDump(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxPower0(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxPower1(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxPowerEvaluation(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxAntenna(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATERxAntenna(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 Default_Set_ATE_TX_FREQ_OFFSET_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxFreqOffset(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 Default_Set_ATE_TX_BW_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxLength(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxCount(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxMcs(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxStbc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxMode(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxGi(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATERxFer(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEReadRF(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATELoadE2p(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
#ifdef RTMP_EFUSE_SUPPORT
|
||||
INT32 SetATELoadE2pFromBuf(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
#endif /* RTMP_EFUSE_SUPPORT */
|
||||
INT32 SetATEReadE2p(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEAutoAlc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxGi(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETempSensor(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEIpg(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEPayload(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEFixedPayload(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETtr(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEShow(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEHelp(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
VOID ATESampleRssi(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *pRxWI);
|
||||
VOID ATEPeriodicExec(PVOID SystemSpecific1, PVOID FunctionContext,
|
||||
PVOID SystemSpecific2, PVOID SystemSpecific3);
|
||||
INT32 SetATE(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEChannel(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxBw(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 MT_ATEInit(struct _RTMP_ADAPTER *pAd);
|
||||
PNDIS_PACKET ATEPayloadInit(struct _RTMP_ADAPTER *pAd, UINT32 TxIdx);
|
||||
INT32 ATEPayloadAlloc(struct _RTMP_ADAPTER *pAd, UINT32 Index);
|
||||
VOID EEReadAll(struct _RTMP_ADAPTER *pAd, UINT16 *Data);
|
||||
#endif
|
||||
|
@ -0,0 +1,82 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of MediaTek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of MediaTek, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
qa_agent.h
|
||||
*/
|
||||
|
||||
#ifndef __QA_AGENT_H__
|
||||
#define __QA_AGENT_H__
|
||||
|
||||
#define HQA_CMD_MAGIC_NO 0x18142880
|
||||
|
||||
/* RX STAT */
|
||||
#define HQA_RX_STAT_MACFCSERRCNT 0x1
|
||||
#define HQA_RX_STAT_MAC_MDRDYCNT 0x2
|
||||
#define HQA_RX_STAT_PHY_MDRDYCNT 0x3
|
||||
#define HQA_RX_STAT_PHY_FCSERRCNT 0x4
|
||||
#define HQA_RX_STAT_PD 0x5
|
||||
#define HQA_RX_STAT_CCK_SIG_SFD 0x6
|
||||
#define HQA_RX_STAT_OFDM_SIG_TAG 0x7
|
||||
#define HQA_RX_STAT_RSSI 0x8
|
||||
#define HQA_RX_RESET_PHY_COUNT 0x9
|
||||
|
||||
/* FW Event Callback */
|
||||
VOID HQA_GetThermalValue_CB(struct cmd_msg *msg, char *Data, UINT16 Len);
|
||||
|
||||
|
||||
typedef struct _HQA_CMD_FRAME {
|
||||
UINT32 MagicNo;
|
||||
UINT16 Type;
|
||||
UINT16 Id;
|
||||
UINT16 Length;
|
||||
UINT16 Sequence;
|
||||
UCHAR Data[2048];
|
||||
} __attribute__((packed))HQA_CMD_FRAME;
|
||||
|
||||
typedef INT32 (*HQA_CMD_HANDLER)(
|
||||
struct _RTMP_ADAPTER *pAd,
|
||||
RTMP_IOCTL_INPUT_STRUCT *wrq,
|
||||
HQA_CMD_FRAME *HqaCmdFrame);
|
||||
|
||||
typedef struct _HQA_CMD_TABLE{
|
||||
HQA_CMD_HANDLER *CmdSet;
|
||||
UINT32 CmdSetSize;
|
||||
UINT32 CmdOffset;
|
||||
} HQA_CMD_TABLE;
|
||||
|
||||
typedef struct _HQA_RX_STAT{
|
||||
UINT32 MacFCSErr;
|
||||
UINT32 MacMdrdy;
|
||||
UINT32 FCSErr_CCK;
|
||||
UINT32 FCSErr_OFDM;
|
||||
UINT32 CCK_PD;
|
||||
UINT32 OFDM_PD;
|
||||
UINT32 CCK_SIG_Err;
|
||||
UINT32 CCK_SFD_Err;
|
||||
UINT32 OFDM_SIG_Err;
|
||||
UINT32 OFDM_TAG_Err;
|
||||
UINT32 WB_RSSSI0;
|
||||
UINT32 IB_RSSSI0;
|
||||
UINT32 WB_RSSSI1;
|
||||
UINT32 IB_RSSSI1;
|
||||
UINT32 PhyMdrdyCCK;
|
||||
UINT32 PhyMdrdyOFDM;
|
||||
UINT32 DriverRxCount;
|
||||
UINT32 RCPI0;
|
||||
UINT32 RCPI1;
|
||||
UINT32 FreqOffsetFromRX;
|
||||
UINT32 RSSI0;
|
||||
UINT32 RSSI1;
|
||||
} __attribute__((packed))HQA_RX_STAT;
|
||||
|
||||
#endif /* __QA_AGENT_H__ */
|
@ -0,0 +1,799 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2010, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt_ate.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
*/
|
||||
|
||||
#ifndef __RT_ATE_H__
|
||||
#define __RT_ATE_H__
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
#ifndef STATS_COUNT_SUPPORT
|
||||
#error "For ATE support, please set HAS_ATE=y and HAS_STATS_COUNT=y."
|
||||
#endif /* !STATS_COUNT_SUPPORT */
|
||||
#endif /* CONFIG_ATE */
|
||||
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
#include "mac/mac_ral/rtmp_mac.h"
|
||||
#elif defined(MT_MAC)
|
||||
#include "mac/mac_mt/mt_mac.h"
|
||||
#endif
|
||||
#include "phy/phy.h"
|
||||
|
||||
// TODO: shiang-6590, remove it after ATE code is re-organized!!
|
||||
#define BBP_R1 1
|
||||
#define BBP_R3 3
|
||||
#define BBP_R4 4
|
||||
#define BBP_R21 21
|
||||
#define BBP_R22 22
|
||||
#define BBP_R24 24
|
||||
#define BBP_R27 27
|
||||
#define BBP_R50 50
|
||||
#define BBP_R51 51
|
||||
#define BBP_R52 52
|
||||
#define BBP_R60 60
|
||||
#define BBP_R66 66
|
||||
#define BBP_R69 69
|
||||
#define BBP_R70 70
|
||||
#define BBP_R174 174
|
||||
#define BBP_R182 182
|
||||
// TODO: ---End
|
||||
|
||||
typedef struct _ATE_CHIP_STRUCT {
|
||||
/* functions */
|
||||
VOID (*ChannelSwitch)(PRTMP_ADAPTER pAd);
|
||||
INT (*TxPwrHandler)(PRTMP_ADAPTER pAd, char index);
|
||||
INT (*TxPwrEvaluation)(PRTMP_ADAPTER pAd);
|
||||
INT (*TssiCalibration)(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
INT (*ExtendedTssiCalibration)(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
VOID (*RxVGAInit)(PRTMP_ADAPTER pAd);
|
||||
VOID (*AsicSetTxRxPath)(PRTMP_ADAPTER pAd);
|
||||
VOID (*AdjustTxPower)(PRTMP_ADAPTER pAd);
|
||||
VOID (*AsicExtraPowerOverMAC)(PRTMP_ADAPTER pAd);
|
||||
VOID (*AsicCalibration)(PRTMP_ADAPTER pAd, UCHAR ate_mode);
|
||||
VOID (*TemperCompensation)(RTMP_ADAPTER *pAd);
|
||||
|
||||
/* command handlers */
|
||||
INT (*Set_BW_Proc)(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
INT (*Set_FREQ_OFFSET_Proc)(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
/* variables */
|
||||
INT maxTxPwrCnt;
|
||||
BOOLEAN bBBPStoreTXCARR;
|
||||
BOOLEAN bBBPStoreTXCARRSUPP;
|
||||
BOOLEAN bBBPStoreTXCONT;
|
||||
BOOLEAN bBBPLoadATESTOP;
|
||||
|
||||
/* TSSI related */
|
||||
INT32 tssi_slope[2];
|
||||
INT32 tssi_offset[3][2];
|
||||
INT32 pwr_diff_pre[2];
|
||||
INT32 ant_pwr_offset[2];
|
||||
INT32 curr_temperature;
|
||||
}ATE_CHIP_STRUCT, *PATE_CHIP_STRUCT;
|
||||
|
||||
typedef union _CAPTURE_MODE_SHARE_MEMORY {
|
||||
struct
|
||||
{
|
||||
UINT32 LOW_BYTE0:8;
|
||||
UINT32 LOW_BYTE1:8;
|
||||
UINT32 HIGH_BYTE0:8;
|
||||
UINT32 HIGH_BYTE1:8;
|
||||
} field;
|
||||
UINT32 Value;
|
||||
}CAPTURE_MODE_SHARE_MEMORY, *PCAPTURE_MODE_SHARE_MEMORY;
|
||||
|
||||
typedef struct _ATE_INFO {
|
||||
PATE_CHIP_STRUCT pChipStruct;
|
||||
#ifdef RTMP_MAC_PCI
|
||||
PVOID AteAllocVa[TX_RING_SIZE];
|
||||
PNDIS_PACKET pAtePacket[TX_RING_SIZE];
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
UCHAR Mode;
|
||||
BOOLEAN PassiveMode;
|
||||
#ifdef RT3350
|
||||
UCHAR PABias;
|
||||
#endif /* RT3350 */
|
||||
CHAR TxPower0;
|
||||
CHAR TxPower1;
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
CHAR TxPower2;
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
CHAR MinTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */
|
||||
CHAR MaxTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */
|
||||
CHAR TxAntennaSel;
|
||||
CHAR RxAntennaSel;
|
||||
USHORT TxInfoLen;
|
||||
USHORT TxWILen;
|
||||
TXINFO_STRUC TxInfo; /* TxInfo */
|
||||
TXWI_STRUC TxWI; /* TXWI */
|
||||
USHORT QID;
|
||||
UCHAR Addr1[MAC_ADDR_LEN];
|
||||
UCHAR Addr2[MAC_ADDR_LEN];
|
||||
UCHAR Addr3[MAC_ADDR_LEN];
|
||||
UCHAR Channel;
|
||||
UCHAR Payload; /* Payload pattern */
|
||||
BOOLEAN bFixedPayload;
|
||||
UCHAR TxMethod; /* Early chipsets must be applied old TXCONT/TXCARR/TXCARS mechanism. */
|
||||
UINT32 TxLength;
|
||||
UINT32 TxCount;
|
||||
UINT32 TxDoneCount; /* Tx DMA Done */
|
||||
UINT32 RFFreqOffset;
|
||||
UINT32 IPG;
|
||||
BOOLEAN bRxFER; /* Show Rx Frame Error Rate */
|
||||
BOOLEAN bQAEnabled; /* QA is used. */
|
||||
BOOLEAN bQATxStart; /* Have compiled QA in and use it to ATE tx. */
|
||||
BOOLEAN bQARxStart; /* Have compiled QA in and use it to ATE rx. */
|
||||
BOOLEAN bAutoTxAlc; /* Set Auto Tx Alc */
|
||||
BOOLEAN bAutoVcoCal; /* Set Auto VCO periodic calibration. */
|
||||
BOOLEAN bLowTemperature; /* Trigger Temperature Sensor */
|
||||
BOOLEAN bTestTimeReduction; /* Set ATE test time reduction. */
|
||||
#ifdef RTMP_INTERNAL_TX_ALC
|
||||
#if defined(RT3350) || defined(RT3352)
|
||||
BOOLEAN bTSSICalbrEnableG; /* Enable TSSI calibration */
|
||||
CHAR TssiRefPerChannel[CFG80211_NUM_OF_CHAN_2GHZ];
|
||||
CHAR TssiDeltaPerChannel[CFG80211_NUM_OF_CHAN_2GHZ];
|
||||
#endif /* defined(RT3350) || defined(RT3352) */
|
||||
#endif /* RTMP_INTERNAL_TX_ALC */
|
||||
#ifdef RTMP_MAC_PCI
|
||||
BOOLEAN bFWLoading; /* Reload firmware when ATE is done. */
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
UINT32 RxTotalCnt;
|
||||
UINT32 RxCntPerSec;
|
||||
UCHAR forceBBPReg; /* force to not update the specific BBP register, now used for ATE TxBF */
|
||||
|
||||
CHAR LastSNR0; /* last received SNR */
|
||||
CHAR LastSNR1; /* last received SNR for 2nd antenna */
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
CHAR LastSNR2;
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
CHAR LastRssi0; /* last received RSSI */
|
||||
CHAR LastRssi1; /* last received RSSI for 2nd antenna */
|
||||
CHAR LastRssi2; /* last received RSSI for 3rd antenna */
|
||||
CHAR AvgRssi0; /* last 8 frames' average RSSI */
|
||||
CHAR AvgRssi1; /* last 8 frames' average RSSI */
|
||||
CHAR AvgRssi2; /* last 8 frames' average RSSI */
|
||||
SHORT AvgRssi0X8; /* sum of last 8 frames' RSSI */
|
||||
SHORT AvgRssi1X8; /* sum of last 8 frames' RSSI */
|
||||
SHORT AvgRssi2X8; /* sum of last 8 frames' RSSI */
|
||||
UINT32 NumOfAvgRssiSample;
|
||||
UINT32 Default_TX_PIN_CFG;
|
||||
USHORT HLen; /* Header Length */
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
/* Tx frame */
|
||||
USHORT PLen; /* Pattern Length */
|
||||
UCHAR Header[32]; /* Header buffer */
|
||||
UCHAR Pattern[32]; /* Pattern buffer */
|
||||
USHORT DLen; /* Data Length */
|
||||
USHORT seq;
|
||||
UINT32 CID;
|
||||
RTMP_OS_PID AtePid;
|
||||
/* counters */
|
||||
UINT32 U2M;
|
||||
UINT32 OtherData;
|
||||
UINT32 Beacon;
|
||||
UINT32 OtherCount;
|
||||
UINT32 TxAc0;
|
||||
UINT32 TxAc1;
|
||||
UINT32 TxAc2;
|
||||
UINT32 TxAc3;
|
||||
UINT32 TxHCCA;
|
||||
UINT32 TxMgmt;
|
||||
UINT32 RSSI0;
|
||||
UINT32 RSSI1;
|
||||
UINT32 RSSI2;
|
||||
UINT32 SNR0;
|
||||
UINT32 SNR1;
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
UINT32 SNR2;
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
INT32 BF_SNR[3]; /* Last RXWI BF SNR. Units=0.25 dB */
|
||||
/* TxStatus : 0 --> task is idle, 1 --> task is running */
|
||||
UCHAR TxStatus;
|
||||
#ifdef DOT11_VHT_AC
|
||||
UCHAR vht_nss;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
#endif /* CONFIG_QA */
|
||||
RALINK_TIMER_STRUCT PeriodicTimer;
|
||||
ULONG OneSecPeriodicRound;
|
||||
ULONG PeriodicRound;
|
||||
OS_NDIS_SPIN_LOCK TssiSemLock;
|
||||
} ATE_INFO, *PATE_INFO;
|
||||
|
||||
/*
|
||||
Use bitmap to allow coexist of ATE_TXFRAME
|
||||
and ATE_RXFRAME(i.e.,to support LoopBack mode).
|
||||
*/
|
||||
#define fATE_IDLE 0x00
|
||||
#define fATE_TX_ENABLE 0x01
|
||||
#define fATE_RX_ENABLE 0x02
|
||||
#define fATE_TXCONT_ENABLE 0x04
|
||||
#define fATE_TXCARR_ENABLE 0x08
|
||||
#define fATE_TXCARRSUPP_ENABLE 0x10
|
||||
#define fATE_RESERVED_1 0x20
|
||||
#define fATE_RESERVED_2 0x40
|
||||
#define fATE_EXIT 0x80
|
||||
|
||||
/* Enter/Reset ATE */
|
||||
#define ATE_START (fATE_IDLE)
|
||||
/* Stop/Exit ATE */
|
||||
#define ATE_STOP (fATE_EXIT)
|
||||
/* Continuous Transmit Frames (without time gap) */
|
||||
#define ATE_TXCONT ((fATE_TX_ENABLE)|(fATE_TXCONT_ENABLE))
|
||||
/* Transmit Carrier */
|
||||
#define ATE_TXCARR ((fATE_TX_ENABLE)|(fATE_TXCARR_ENABLE))
|
||||
/* Transmit Carrier Suppression (information without carrier) */
|
||||
#define ATE_TXCARRSUPP ((fATE_TX_ENABLE)|(fATE_TXCARRSUPP_ENABLE))
|
||||
/* Transmit Frames */
|
||||
#define ATE_TXFRAME (fATE_TX_ENABLE)
|
||||
/* Receive Frames */
|
||||
#define ATE_RXFRAME (fATE_RX_ENABLE)
|
||||
|
||||
|
||||
#ifdef RTMP_INTERNAL_TX_ALC
|
||||
#define EEPROM_TSSI_ENABLE 0x36
|
||||
#define EEPROM_TSSI_MODE_EXTEND 0x76
|
||||
|
||||
#define ATE_MDSM_NORMAL_TX_POWER 0x00
|
||||
#define ATE_MDSM_DROP_TX_POWER_BY_6dBm 0x01
|
||||
#define ATE_MDSM_DROP_TX_POWER_BY_12dBm 0x02
|
||||
#define ATE_MDSM_ADD_TX_POWER_BY_6dBm 0x03
|
||||
#define ATE_MDSM_BBP_R1_STATIC_TX_POWER_CONTROL_MASK 0x03
|
||||
#endif /* RTMP_INTERNAL_TX_ALC */
|
||||
|
||||
#define LEN_OF_ARG 16
|
||||
#define ATE_ON(_p) (((_p)->ate.Mode) != ATE_STOP)
|
||||
#define TX_METHOD_0 0 /* Early chipsets must be applied this original TXCONT/TXCARR/TXCARS mechanism. */
|
||||
#define TX_METHOD_1 1 /* Default TXCONT/TXCARR/TXCARS mechanism is TX_METHOD_1 */
|
||||
#define ANT_ALL 0
|
||||
#define ANT_0 1
|
||||
#define ANT_1 2
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
#define ANT_2 3
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
|
||||
#define ATE_ASIC_CALIBRATION(__pAd, __ate_mode) \
|
||||
do { \
|
||||
if (__pAd->ate.pChipStruct->AsicCalibration != NULL) \
|
||||
__pAd->ate.pChipStruct->AsicCalibration(__pAd, __ate_mode); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define ATE_MAC_TX_ENABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 2); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
#define ATE_MAC_TX_DISABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 2); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
#define ATE_MAC_RX_ENABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 3); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
#define ATE_MAC_RX_DISABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 3); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1. */
|
||||
#define ATE_MAC_TX_CTS_ENABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 4); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Clear MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 0. */
|
||||
#define ATE_MAC_TX_CTS_DISABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 4); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Clear BBP R22 to reset Tx Mode (bit7~bit0) = 0. */
|
||||
#ifdef RTMP_BBP
|
||||
#define ATE_BBP_RESET_TX_MODE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) &= (0x00); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
#endif /* RTMP_BBP */
|
||||
|
||||
/* Set BBP R22 to start Continuous Tx Mode (bit7) = 1. */
|
||||
#define ATE_BBP_START_CTS_TX_MODE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 7); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Clear BBP R22 to stop Continuous Tx Mode (bit7) = 0. */
|
||||
#define ATE_BBP_STOP_CTS_TX_MODE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 7); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Set BBP R24 to send out Continuous Tx sin wave (bit0) = 1. */
|
||||
#define ATE_BBP_CTS_TX_SIN_WAVE_ENABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 0); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Clear BBP R24 to stop Continuous Tx sin wave (bit0) = 0. */
|
||||
#define ATE_BBP_CTS_TX_SIN_WAVE_DISABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 0); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine sets initial value of VGA in the RX chain.
|
||||
AGC is the abbreviation of "Automatic Gain Controller",
|
||||
while VGA (Variable Gain Amplifier) is a part of AGC loop.
|
||||
(i.e., VGA + level detector + feedback loop = AGC)
|
||||
|
||||
Return:
|
||||
VOID
|
||||
==========================================================================
|
||||
*/
|
||||
#define ATE_CHIP_RX_VGA_GAIN_INIT(__pAd) \
|
||||
if (__pAd->ate.pChipStruct->RxVGAInit != NULL) \
|
||||
__pAd->ate.pChipStruct->RxVGAInit(__pAd)
|
||||
|
||||
#define ATE_CHIP_SET_TX_RX_PATH(__pAd) \
|
||||
if (__pAd->ate.pChipStruct->AsicSetTxRxPath != NULL) \
|
||||
__pAd->ate.pChipStruct->AsicSetTxRxPath(__pAd)
|
||||
|
||||
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#define ATEPCIReadBBPRegister(_A, _I, _pV) \
|
||||
{ \
|
||||
BBP_CSR_CFG_STRUC BbpCsr; \
|
||||
int j, k; \
|
||||
if (!IS_RT65XX(_A)) {\
|
||||
for (j=0; j<MAX_BUSY_COUNT; j++) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, BBP_CSR_CFG, &BbpCsr.word); \
|
||||
if (BbpCsr.field.Busy == BUSY) \
|
||||
{ \
|
||||
continue; \
|
||||
} \
|
||||
BbpCsr.word = 0; \
|
||||
BbpCsr.field.fRead = 1; \
|
||||
BbpCsr.field.BBP_RW_MODE = 1; \
|
||||
BbpCsr.field.Busy = 1; \
|
||||
BbpCsr.field.RegNum = _I; \
|
||||
RTMP_IO_WRITE32(_A, BBP_CSR_CFG, BbpCsr.word); \
|
||||
for (k=0; k<MAX_BUSY_COUNT; k++) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, BBP_CSR_CFG, &BbpCsr.word); \
|
||||
if (BbpCsr.field.Busy == IDLE) \
|
||||
break; \
|
||||
} \
|
||||
if ((BbpCsr.field.Busy == IDLE) && \
|
||||
(BbpCsr.field.RegNum == _I)) \
|
||||
{ \
|
||||
*(_pV) = (UCHAR)BbpCsr.field.Value; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (BbpCsr.field.Busy == BUSY) \
|
||||
{ \
|
||||
DBGPRINT_ERR(("BBP read R%d fail\n", _I)); \
|
||||
*(_pV) = (_A)->BbpWriteLatch[_I]; \
|
||||
} \
|
||||
}\
|
||||
}
|
||||
|
||||
#define ATEPCIWriteBBPRegister(_A, _I, _V) \
|
||||
{ \
|
||||
BBP_CSR_CFG_STRUC BbpCsr; \
|
||||
int BusyCnt; \
|
||||
if (!IS_RT65XX(_A)) {\
|
||||
for (BusyCnt=0; BusyCnt<MAX_BUSY_COUNT; BusyCnt++) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, BBP_CSR_CFG, &BbpCsr.word); \
|
||||
if (BbpCsr.field.Busy == BUSY) \
|
||||
continue; \
|
||||
BbpCsr.word = 0; \
|
||||
BbpCsr.field.fRead = 0; \
|
||||
BbpCsr.field.BBP_RW_MODE = 1; \
|
||||
BbpCsr.field.Busy = 1; \
|
||||
BbpCsr.field.Value = _V; \
|
||||
BbpCsr.field.RegNum = _I; \
|
||||
RTMP_IO_WRITE32(_A, BBP_CSR_CFG, BbpCsr.word); \
|
||||
(_A)->BbpWriteLatch[_I] = _V; \
|
||||
break; \
|
||||
} \
|
||||
if (BusyCnt == MAX_BUSY_COUNT) \
|
||||
{ \
|
||||
DBGPRINT_ERR(("BBP write R%d fail\n", _I)); \
|
||||
} \
|
||||
}\
|
||||
}
|
||||
|
||||
|
||||
#define ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV) ATEPCIReadBBPRegister(_A, _I, _pV)
|
||||
#define ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V) ATEPCIWriteBBPRegister(_A, _I, _V)
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
|
||||
|
||||
INT DefaultATETxPwrHandler(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN char index);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2880)
|
||||
VOID RT28xxATEAsicSwitchChannel(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
INT RT28xxATETxPwrHandler(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN char index);
|
||||
#endif /* defined(RT28xx) || defined(RT2880) */
|
||||
|
||||
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
VOID ATE_QA_Statistics(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN RXWI_STRUC *pRxWI,
|
||||
IN RXINFO_STRUC *pRxInfo,
|
||||
IN PHEADER_802_11 pHeader);
|
||||
|
||||
INT RtmpDoAte(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN RTMP_IOCTL_INPUT_STRUCT *wrq,
|
||||
IN RTMP_STRING *wrq_name);
|
||||
|
||||
INT Set_TxStop_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_RxStop_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#ifdef DBG
|
||||
INT Set_EERead_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_EEWrite_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_BBPRead_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_BBPWrite_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_RFWrite_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* DBG */
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
#ifdef RTMP_RF_RW_SUPPORT
|
||||
#ifdef RLT_RF
|
||||
#define ATE_RF_IO_READ8_BY_REG_ID(_A, _B, _I, _pV) rlt_rf_read(_A, _B, _I, _pV)
|
||||
#define ATE_RF_IO_WRITE8_BY_REG_ID(_A, _B, _I, _V) rlt_rf_write(_A, _B, _I, _V)
|
||||
#endif /* RLT_RF */
|
||||
#ifdef RTMP_RF
|
||||
#define ATE_RF_IO_READ8_BY_REG_ID(_A, _I, _pV) RT30xxReadRFRegister(_A, _I, _pV)
|
||||
#define ATE_RF_IO_WRITE8_BY_REG_ID(_A, _I, _V) RT30xxWriteRFRegister(_A, _I, _V)
|
||||
#endif /* RTMP_RF */
|
||||
#ifdef MT_RF
|
||||
#define ATE_RF_IO_READ8_BY_REG_ID(_A, _I, _pV)
|
||||
#define ATE_RF_IO_WRITE8_BY_REG_ID(_A, _I, _V)
|
||||
#endif /* MT_RF */
|
||||
#endif /* RTMP_RF_RW_SUPPORT */
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
#define SYNC_CHANNEL_WITH_QA(_A, _pV)\
|
||||
if ((_A->bQATxStart == TRUE) || (_A->bQARxStart == TRUE))\
|
||||
{\
|
||||
return;\
|
||||
}\
|
||||
else\
|
||||
*_pV = _A->Channel
|
||||
#else
|
||||
#define SYNC_CHANNEL_WITH_QA(_A, _pV)\
|
||||
*_pV = _A->Channel
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
VOID rt_ee_read_all(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT USHORT *Data);
|
||||
|
||||
VOID rt_ee_write_all(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT *Data);
|
||||
|
||||
VOID rt_ee_write_bulk(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT *Data,
|
||||
IN USHORT offset,
|
||||
IN USHORT length);
|
||||
|
||||
INT Set_ATE_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_DA_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_SA_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_BSSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
INT Set_ATE_CHANNEL_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_INIT_CHAN_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ADCDump_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)
|
||||
INT Set_ATE_TSSI_CALIBRATION_EX_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) */
|
||||
|
||||
#ifdef RTMP_INTERNAL_TX_ALC
|
||||
INT Set_ATE_TSSI_CALIBRATION_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TSSI_CALIBRATION_EX_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
#if defined(RT3350) || defined(RT3352)
|
||||
INT RT335x_Set_ATE_TSSI_CALIBRATION_ENABLE_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
CHAR InsertTssi(
|
||||
IN UCHAR InChannel,
|
||||
IN UCHAR Channel0,
|
||||
IN UCHAR Channel1,
|
||||
IN CHAR Tssi0,
|
||||
IN CHAR Tssi1);
|
||||
|
||||
INT RT335xATETssiCalibrationExtend(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* defined(RT3350) || defined(RT3352) */
|
||||
|
||||
CHAR ATEGetDesiredTSSI(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
#endif /* RTMP_INTERNAL_TX_ALC */
|
||||
|
||||
#ifdef RTMP_TEMPERATURE_CALIBRATION
|
||||
INT Set_ATE_TEMP_CAL_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_SHOW_TSSI_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#endif /* RTMP_TEMPERATURE_CALIBRATION */
|
||||
|
||||
#ifdef RTMP_TEMPERATURE_COMPENSATION
|
||||
|
||||
INT Set_ATE_READ_EXTERNAL_TSSI_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* RTMP_TEMPERATURE_COMPENSATION */
|
||||
|
||||
INT Set_ATE_TX_POWER0_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_POWER1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
INT Set_ATE_TX_POWER2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
|
||||
INT Set_ATE_TX_POWER_EVALUATION_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_Antenna_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_RX_Antenna_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
VOID DefaultATEAsicExtraPowerOverMAC(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
VOID ATEAsicExtraPowerOverMAC(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
#ifdef RT3350
|
||||
INT Set_ATE_PA_Bias_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* RT3350 */
|
||||
|
||||
INT Default_Set_ATE_TX_FREQ_OFFSET_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2880)
|
||||
INT RT28xx_Set_ATE_TX_FREQ_OFFSET_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* defined(RT28xx) || defined(RT2880) */
|
||||
|
||||
|
||||
INT Set_ATE_TX_FREQ_OFFSET_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Default_Set_ATE_TX_BW_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2880)
|
||||
INT RT28xx_Set_ATE_TX_BW_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* defined(RT28xx) || defined(RT2880) */
|
||||
|
||||
|
||||
INT Set_ATE_TX_BW_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_LENGTH_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_COUNT_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_MCS_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_STBC_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_MODE_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_GI_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
INT Set_ATE_RX_FER_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Read_RF_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#if (!defined(RTMP_RF_RW_SUPPORT)) && (!defined(RLT_RF))
|
||||
INT Set_ATE_Write_RF1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Write_RF2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Write_RF3_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Write_RF4_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* (!defined(RTMP_RF_RW_SUPPORT)) && (!defined(RLT_RF)) */
|
||||
|
||||
INT Set_ATE_Load_E2P_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#ifdef RTMP_EFUSE_SUPPORT
|
||||
INT Set_ATE_Load_E2P_From_Buf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* RTMP_EFUSE_SUPPORT */
|
||||
|
||||
INT Set_ATE_Read_E2P_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#ifdef LED_CONTROL_SUPPORT
|
||||
#endif /* LED_CONTROL_SUPPORT */
|
||||
|
||||
INT Set_ATE_AUTO_ALC_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TEMP_SENSOR_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_IPG_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Payload_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Fixed_Payload_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
|
||||
INT Set_ATE_TTR_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Show_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Help_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
VOID DefaultATEAsicAdjustTxPower(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
|
||||
|
||||
|
||||
VOID ATEAsicAdjustTxPower(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
|
||||
VOID ATESampleRssi(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RXWI_STRUC *pRxWI);
|
||||
|
||||
#ifdef RTMP_MAC_PCI
|
||||
NDIS_STATUS ATEPayloadAlloc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 idx);
|
||||
|
||||
PNDIS_PACKET ATEPayloadInit(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 TxIdx);
|
||||
|
||||
NDIS_STATUS TxRingGetReady(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
|
||||
|
||||
INT TxDmaBusy(RTMP_ADAPTER *pAd);
|
||||
INT RxDmaBusy(RTMP_ADAPTER *pAd);
|
||||
|
||||
VOID RtmpDmaEnable(RTMP_ADAPTER *pAd, INT Enable);
|
||||
|
||||
INT ATESetUpFrame(RTMP_ADAPTER *pAd, UINT32 TxIdx);
|
||||
|
||||
|
||||
|
||||
NDIS_STATUS ChipStructAssign(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
NDIS_STATUS ATEInit(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
VOID ReadQATxTypeFromBBP(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
#ifdef RTMP_BBP
|
||||
NDIS_STATUS ATEBBPWriteWithRxChain(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UCHAR bbpId,
|
||||
IN CHAR bbpVal,
|
||||
IN RX_CHAIN_IDX rx_ch_idx);
|
||||
#endif /* RTMP_BBP */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2880)
|
||||
VOID RT28xxATERxVGAInit(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
#endif /* defined(RT28xx) || defined(RT2880) */
|
||||
|
||||
|
||||
|
||||
VOID ATEPeriodicExec(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3);
|
||||
|
||||
VOID ATEAsicSetTxRxPath(RTMP_ADAPTER *pAd);
|
||||
|
||||
VOID RtmpRfIoWrite(RTMP_ADAPTER *pAd);
|
||||
|
||||
VOID ATEAsicSwitchChannel(RTMP_ADAPTER *pAd);
|
||||
|
||||
VOID BbpSoftReset(RTMP_ADAPTER *pAd);
|
||||
|
||||
|
||||
#endif /* __RT_ATE_H__ */
|
||||
|
@ -0,0 +1,179 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2010, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt_qa.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
*/
|
||||
|
||||
#ifndef __RT_QA_H__
|
||||
#define __RT_QA_H__
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
#ifndef CONFIG_ATE
|
||||
#error "For supporting QA GUI, please set HAS_ATE=y and HAS_QA_SUPPORT=y."
|
||||
#endif /* CONFIG_ATE */
|
||||
|
||||
#include "rt_ate.h"
|
||||
|
||||
typedef struct ate_racfghdr {
|
||||
UINT32 magic_no;
|
||||
USHORT command_type;
|
||||
USHORT command_id;
|
||||
USHORT length;
|
||||
USHORT sequence;
|
||||
USHORT status;
|
||||
UCHAR data[2046];
|
||||
} __attribute__((packed))RACFGHDR, *pRACFGHDR;
|
||||
|
||||
/* Stop Transmission */
|
||||
#define ATE_TXSTOP ((~(fATE_TX_ENABLE))&(~(fATE_TXCONT_ENABLE))&(~(fATE_TXCARR_ENABLE))&(~(fATE_TXCARRSUPP_ENABLE)))
|
||||
/* Stop Receiving Frames */
|
||||
#define ATE_RXSTOP (~(fATE_RX_ENABLE))
|
||||
|
||||
/* NOTE : may be different with chipset in the future ++ */
|
||||
#define BBP22_TXFRAME 0x00 /* Transmit Frames */
|
||||
#define BBP22_TXCONT_OR_CARRSUPP 0x80 /* Continuous Transmit or Carrier Suppression */
|
||||
#define BBP22_TXCARR 0xc1 /* Transmit Carrier */
|
||||
#define BBP24_TXCONT 0x00 /* Continuous Transmit */
|
||||
#define BBP24_CARRSUPP 0x01 /* Carrier Suppression */
|
||||
/* NOTE : may be different with chipset in the future -- */
|
||||
|
||||
/* Eth QA RACFG Command */
|
||||
#define RACFG_MAGIC_NO 0x18142880
|
||||
/* command id with Cmd Type == 0x0005(for iNIC)/0x0008(for others) */
|
||||
#define RACFG_CMD_RF_WRITE_ALL 0x0000
|
||||
#define RACFG_CMD_E2PROM_READ16 0x0001
|
||||
#define RACFG_CMD_E2PROM_WRITE16 0x0002
|
||||
#define RACFG_CMD_E2PROM_READ_ALL 0x0003
|
||||
#define RACFG_CMD_E2PROM_WRITE_ALL 0x0004
|
||||
#define RACFG_CMD_IO_READ 0x0005
|
||||
#define RACFG_CMD_IO_WRITE 0x0006
|
||||
#define RACFG_CMD_IO_READ_BULK 0x0007
|
||||
#define RACFG_CMD_BBP_READ8 0x0008
|
||||
#define RACFG_CMD_BBP_WRITE8 0x0009
|
||||
#define RACFG_CMD_BBP_READ_ALL 0x000a
|
||||
#define RACFG_CMD_GET_COUNTER 0x000b
|
||||
#define RACFG_CMD_CLEAR_COUNTER 0x000c
|
||||
|
||||
#define RACFG_CMD_RSV1 0x000d
|
||||
#define RACFG_CMD_RSV2 0x000e
|
||||
#define RACFG_CMD_RSV3 0x000f
|
||||
|
||||
#define RACFG_CMD_TX_START 0x0010
|
||||
#define RACFG_CMD_GET_TX_STATUS 0x0011
|
||||
#define RACFG_CMD_TX_STOP 0x0012
|
||||
#define RACFG_CMD_RX_START 0x0013
|
||||
#define RACFG_CMD_RX_STOP 0x0014
|
||||
#define RACFG_CMD_GET_NOISE_LEVEL 0x0015
|
||||
|
||||
#define RACFG_CMD_ATE_START 0x0080
|
||||
#define RACFG_CMD_ATE_STOP 0x0081
|
||||
|
||||
#define RACFG_CMD_ATE_START_TX_CARRIER 0x0100
|
||||
#define RACFG_CMD_ATE_START_TX_CONT 0x0101
|
||||
#define RACFG_CMD_ATE_START_TX_FRAME 0x0102
|
||||
#define RACFG_CMD_ATE_SET_BW 0x0103
|
||||
#define RACFG_CMD_ATE_SET_TX_POWER0 0x0104
|
||||
#define RACFG_CMD_ATE_SET_TX_POWER1 0x0105
|
||||
#define RACFG_CMD_ATE_SET_FREQ_OFFSET 0x0106
|
||||
#define RACFG_CMD_ATE_GET_STATISTICS 0x0107
|
||||
#define RACFG_CMD_ATE_RESET_COUNTER 0x0108
|
||||
#define RACFG_CMD_ATE_SEL_TX_ANTENNA 0x0109
|
||||
#define RACFG_CMD_ATE_SEL_RX_ANTENNA 0x010a
|
||||
#define RACFG_CMD_ATE_SET_PREAMBLE 0x010b
|
||||
#define RACFG_CMD_ATE_SET_CHANNEL 0x010c
|
||||
#define RACFG_CMD_ATE_SET_ADDR1 0x010d
|
||||
#define RACFG_CMD_ATE_SET_ADDR2 0x010e
|
||||
#define RACFG_CMD_ATE_SET_ADDR3 0x010f
|
||||
#define RACFG_CMD_ATE_SET_RATE 0x0110
|
||||
#define RACFG_CMD_ATE_SET_TX_FRAME_LEN 0x0111
|
||||
#define RACFG_CMD_ATE_SET_TX_FRAME_COUNT 0x0112
|
||||
#define RACFG_CMD_ATE_START_RX_FRAME 0x0113
|
||||
#define RACFG_CMD_ATE_E2PROM_READ_BULK 0x0114
|
||||
#define RACFG_CMD_ATE_E2PROM_WRITE_BULK 0x0115
|
||||
#define RACFG_CMD_ATE_IO_WRITE_BULK 0x0116
|
||||
#define RACFG_CMD_ATE_BBP_READ_BULK 0x0117
|
||||
#define RACFG_CMD_ATE_BBP_WRITE_BULK 0x0118
|
||||
#define RACFG_CMD_ATE_RF_READ_BULK 0x0119
|
||||
#define RACFG_CMD_ATE_RF_WRITE_BULK 0x011a
|
||||
#define RACFG_CMD_ATE_SET_TX_POWER2 0x011b
|
||||
#ifdef RLT_RF
|
||||
#define RACFG_CMD_ATE_RF_READ_BULK_BANK 0x0123
|
||||
#define RACFG_CMD_ATE_RF_WRITE_BULK_BANK 0x0124
|
||||
#endif /* RLT_RF */
|
||||
#define RACFG_CMD_TX_START_V2 0x0125
|
||||
|
||||
|
||||
|
||||
/* QA RACFG Command for ate test from localhost */
|
||||
#define RACFG_CMD_ATE_SHOW_PARAM 0xff00
|
||||
|
||||
/* ATE export paramters to uppler layer */
|
||||
typedef struct __ATE_EX_PARAM
|
||||
{
|
||||
unsigned char mode;
|
||||
char TxPower0;
|
||||
char TxPower1;
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
char TxPower2;
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
char TxAntennaSel;
|
||||
char RxAntennaSel;
|
||||
unsigned char DA[MAC_ADDR_LEN];
|
||||
unsigned char SA[MAC_ADDR_LEN];
|
||||
unsigned char BSSID[MAC_ADDR_LEN];
|
||||
unsigned char MCS;
|
||||
unsigned char PhyMode;
|
||||
BOOLEAN ShortGI;
|
||||
BOOLEAN BW;
|
||||
unsigned int Channel;
|
||||
unsigned int TxLength;
|
||||
unsigned int TxCount;
|
||||
unsigned int RFFreqOffset;
|
||||
unsigned int IPG;
|
||||
unsigned int RxTotalCnt;
|
||||
unsigned int RxCntPerSec;
|
||||
char LastSNR0;
|
||||
char LastSNR1;
|
||||
char LastSNR2;
|
||||
char LastRssi0;
|
||||
char LastRssi1;
|
||||
char LastRssi2;
|
||||
char AvgRssi0;
|
||||
char AvgRssi1;
|
||||
char AvgRssi2;
|
||||
short AvgRssi0X8;
|
||||
short AvgRssi1X8;
|
||||
short AvgRssi2X8;
|
||||
}ATE_EX_PARAM, *pATE_EX_PARAM;
|
||||
|
||||
NDIS_STATUS TXSTOP(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
NDIS_STATUS RXSTOP(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
#endif /* __RT_QA_H__ */
|
@ -0,0 +1,530 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ate_pci.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
*/
|
||||
|
||||
#ifdef RTMP_MAC_PCI
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
/* 802.11 MAC Header, Type:Data, Length:24bytes + 6 bytes QOS/HTC + 2 bytes padding */
|
||||
extern UCHAR TemplateFrame[32];
|
||||
|
||||
INT TxDmaBusy(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT result;
|
||||
WPDMA_GLO_CFG_STRUC GloCfg;
|
||||
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */
|
||||
#elif defined(MT_MAC)
|
||||
RTMP_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */
|
||||
#endif
|
||||
result = (GloCfg.field.TxDMABusy) ? TRUE : FALSE;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
INT RxDmaBusy(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT result;
|
||||
WPDMA_GLO_CFG_STRUC GloCfg;
|
||||
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */
|
||||
#elif defined(MT_MAC)
|
||||
RTMP_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */
|
||||
#endif
|
||||
result = (GloCfg.field.RxDMABusy) ? TRUE : FALSE;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
VOID RtmpDmaEnable(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN INT Enable)
|
||||
{
|
||||
ULONG WaitCnt = 0;
|
||||
|
||||
/* check if DMA is in busy mode or not. */
|
||||
while (TxDmaBusy(pAd) || RxDmaBusy(pAd))
|
||||
{
|
||||
RtmpusecDelay(10);
|
||||
if (WaitCnt++ > 100)
|
||||
break;
|
||||
}
|
||||
|
||||
AsicSetWPDMA(pAd, PDMA_TX_RX, (Enable > 0 ? TRUE : FALSE));
|
||||
|
||||
RtmpOsMsDelay(5);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Write TxWI for ATE mode.
|
||||
|
||||
Return Value:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID ATEWriteTxWI(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN TXWI_STRUC *pOutTxWI,
|
||||
IN BOOLEAN FRAG,
|
||||
IN BOOLEAN CFACK,
|
||||
IN BOOLEAN InsTimestamp,
|
||||
IN BOOLEAN AMPDU,
|
||||
IN BOOLEAN Ack,
|
||||
IN BOOLEAN NSeq, /* HW new a sequence. */
|
||||
IN UCHAR BASize,
|
||||
IN UCHAR WCID,
|
||||
IN ULONG Length,
|
||||
IN UCHAR PID,
|
||||
IN UCHAR TID,
|
||||
IN UCHAR TxRate,
|
||||
IN UCHAR Txopmode,
|
||||
IN BOOLEAN CfAck,
|
||||
IN HTTRANSMIT_SETTING *pTransmit)
|
||||
{
|
||||
TXWI_STRUC TxWI, *pTxWI;
|
||||
UINT8 TXWISize = pAd->chipCap.TXWISize;
|
||||
UCHAR bw;
|
||||
|
||||
/* If CCK or OFDM, BW must be 20 */
|
||||
bw = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);
|
||||
|
||||
OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
|
||||
NdisZeroMemory(&TxWI, TXWISize);
|
||||
pTxWI = &TxWI;
|
||||
|
||||
#ifdef RLT_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RLT) {
|
||||
struct _TXWI_NMAC *txwi_n = (struct _TXWI_NMAC *)pTxWI;
|
||||
|
||||
txwi_n->FRAG= FRAG;
|
||||
txwi_n->CFACK = CFACK;
|
||||
txwi_n->TS= InsTimestamp;
|
||||
txwi_n->AMPDU = AMPDU;
|
||||
txwi_n->ACK = Ack;
|
||||
txwi_n->txop = Txopmode;
|
||||
txwi_n->NSEQ= NSeq;
|
||||
txwi_n->BAWinSize = BASize;
|
||||
txwi_n->wcid = WCID;
|
||||
txwi_n->MPDUtotalByteCnt = Length;
|
||||
txwi_n->BW = bw;
|
||||
txwi_n->ShortGI = pTransmit->field.ShortGI;
|
||||
txwi_n->STBC = pTransmit->field.STBC;
|
||||
txwi_n->MCS = pTransmit->field.MCS;
|
||||
txwi_n->PHYMODE = pTransmit->field.MODE;
|
||||
txwi_n->CFACK = CfAck;
|
||||
txwi_n->MIMOps = 0;
|
||||
txwi_n->MpduDensity = 0;
|
||||
txwi_n->TxPktId = txwi_n->MCS;
|
||||
}
|
||||
#endif /* RLT_MAC */
|
||||
|
||||
#ifdef RTMP_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RTMP) {
|
||||
struct _TXWI_OMAC *txwi_o = (struct _TXWI_OMAC *)pTxWI;
|
||||
|
||||
txwi_o->FRAG= FRAG;
|
||||
txwi_o->CFACK = CFACK;
|
||||
txwi_o->TS= InsTimestamp;
|
||||
txwi_o->AMPDU = AMPDU;
|
||||
txwi_o->ACK = Ack;
|
||||
txwi_o->txop = Txopmode;
|
||||
txwi_o->NSEQ = NSeq;
|
||||
txwi_o->BAWinSize = BASize;
|
||||
txwi_o->wcid = WCID;
|
||||
txwi_o->MPDUtotalByteCnt = Length;
|
||||
txwi_o->BW = bw;
|
||||
txwi_o->ShortGI = pTransmit->field.ShortGI;
|
||||
txwi_o->STBC = pTransmit->field.STBC;
|
||||
txwi_o->MCS = pTransmit->field.MCS;
|
||||
txwi_o->PHYMODE = pTransmit->field.MODE;
|
||||
txwi_o->CFACK = CfAck;
|
||||
txwi_o->MIMOps = 0;
|
||||
txwi_o->MpduDensity = 0;
|
||||
txwi_o->PacketId = txwi_o->MCS;
|
||||
}
|
||||
#endif /* RTMP_MAC */
|
||||
|
||||
NdisMoveMemory(pOutTxWI, &TxWI, TXWISize);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Allocate Frame payload buffer.
|
||||
NOTE:
|
||||
This routine should only be used in ATE mode.
|
||||
==========================================================================
|
||||
*/
|
||||
NDIS_STATUS ATEPayloadAlloc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 idx)
|
||||
{
|
||||
ATE_INFO *pATEInfo = &(pAd->ate);
|
||||
NDIS_PHYSICAL_ADDRESS AllocPa;
|
||||
|
||||
/* alloc buffer for payload */
|
||||
#ifdef CONFIG_QA
|
||||
if ((pATEInfo->bQAEnabled == TRUE) && (pATEInfo->DLen != 0))
|
||||
{
|
||||
pATEInfo->pAtePacket[idx] = RTMP_AllocateRxPacketBuffer(pAd, ((POS_COOKIE)(pAd->OS_Cookie))->pci_dev,
|
||||
pATEInfo->DLen + 0x100, FALSE, &pATEInfo->AteAllocVa[idx], &AllocPa);
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_QA */
|
||||
{
|
||||
pATEInfo->pAtePacket[idx] = RTMP_AllocateRxPacketBuffer(pAd, ((POS_COOKIE)(pAd->OS_Cookie))->pci_dev,
|
||||
pATEInfo->TxLength, FALSE, &pATEInfo->AteAllocVa[idx], &AllocPa);
|
||||
}
|
||||
|
||||
if (pATEInfo->pAtePacket[idx] == NULL)
|
||||
{
|
||||
pATEInfo->TxCount = 0;
|
||||
DBGPRINT_ERR(("%s : fail to alloc packet space.\n", __FUNCTION__));
|
||||
return (NDIS_STATUS_RESOURCES);
|
||||
}
|
||||
|
||||
return (NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Initialize Frame payload.
|
||||
NOTE:
|
||||
This routine should only be used in ATE mode.
|
||||
==========================================================================
|
||||
*/
|
||||
PNDIS_PACKET ATEPayloadInit(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 idx)
|
||||
{
|
||||
ATE_INFO *pATEInfo = &(pAd->ate);
|
||||
RTMP_TX_RING *pTxRing = &pAd->TxRing[QID_AC_BE];
|
||||
PNDIS_PACKET pPacket = pTxRing->Cell[idx].pNdisPacket;
|
||||
PUCHAR pDest = (PUCHAR)pATEInfo->AteAllocVa[idx];
|
||||
UINT pos = 0;
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
if ((pATEInfo->bQATxStart == TRUE) && (pATEInfo->DLen != 0))
|
||||
{
|
||||
GET_OS_PKT_LEN(pPacket) = pATEInfo->DLen;
|
||||
#ifndef LINUX
|
||||
GET_OS_PKT_TOTAL_LEN(pPacket) = pATEInfo->DLen;
|
||||
#endif /* LIMUX */
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_QA */
|
||||
{
|
||||
GET_OS_PKT_LEN(pPacket) = pATEInfo->TxLength - pATEInfo->HLen;
|
||||
#ifndef LINUX
|
||||
GET_OS_PKT_TOTAL_LEN(pPacket) = pATEInfo->TxLength - pATEInfo->HLen;
|
||||
#endif /* LINUX */
|
||||
}
|
||||
|
||||
/* prepare frame payload */
|
||||
#ifdef CONFIG_QA
|
||||
if ((pATEInfo->bQATxStart == TRUE) && (pATEInfo->DLen != 0))
|
||||
{
|
||||
/* copy pattern to payload */
|
||||
if ((pATEInfo->PLen != 0))
|
||||
{
|
||||
for (pos = 0; pos < pATEInfo->DLen; pos += pATEInfo->PLen)
|
||||
{
|
||||
memcpy(GET_OS_PKT_DATAPTR(pPacket) + pos, pATEInfo->Pattern, pATEInfo->PLen);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_QA */
|
||||
{
|
||||
for (pos = 0; pos < GET_OS_PKT_LEN(pPacket); pos++)
|
||||
{
|
||||
if ( pATEInfo->bFixedPayload )
|
||||
{
|
||||
/* default payload is 0xA5 */
|
||||
pDest[pos] = pATEInfo->Payload;
|
||||
}
|
||||
else
|
||||
{
|
||||
pDest[pos] = RandomByte(pAd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return pPacket;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Setup Frame format.
|
||||
NOTE:
|
||||
This routine should only be used in ATE mode.
|
||||
==========================================================================
|
||||
*/
|
||||
INT ATESetUpFrame(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 TxIdx)
|
||||
{
|
||||
PATE_INFO pATEInfo = &(pAd->ate);
|
||||
TXINFO_STRUC *pTxInfo;
|
||||
TXD_STRUC *pTxD;
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
TXD_STRUC *pDestTxD;
|
||||
UCHAR tx_hw_info[TXD_SIZE];
|
||||
#endif /* RT_BIG_ENDIAN */
|
||||
PNDIS_PACKET pPacket=NULL;
|
||||
PUCHAR pDest=NULL;
|
||||
HTTRANSMIT_SETTING TxHTPhyMode;
|
||||
|
||||
RTMP_TX_RING *pTxRing = &pAd->TxRing[QID_AC_BE];
|
||||
TXWI_STRUC *pTxWI = (TXWI_STRUC *)pTxRing->Cell[TxIdx].DmaBuf.AllocVa;
|
||||
PUCHAR pDMAHeaderBufVA = (PUCHAR) pTxRing->Cell[TxIdx].DmaBuf.AllocVa;
|
||||
UINT8 TXWISize = pAd->chipCap.TXWISize;
|
||||
#ifdef CONFIG_QA
|
||||
PHEADER_802_11 pHeader80211;
|
||||
#endif /* CONFIG_QA */
|
||||
UCHAR bw, sgi, stbc, mcs, phy_mode, frag, cfack, ts, ampdu, ack, nseq, bawinsize, pkt_id, txop;
|
||||
USHORT byte_cnt;
|
||||
|
||||
bw = sgi = stbc = mcs = phy_mode = frag = cfack = ts =0;
|
||||
ampdu = ack = nseq = bawinsize = pkt_id = txop = 0;
|
||||
byte_cnt = 0;
|
||||
#ifdef RLT_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RLT)
|
||||
{
|
||||
bw = pATEInfo->TxWI.TXWI_N.BW;
|
||||
sgi = pATEInfo->TxWI.TXWI_N.ShortGI;
|
||||
stbc = pATEInfo->TxWI.TXWI_N.STBC;
|
||||
mcs = pATEInfo->TxWI.TXWI_N.MCS;
|
||||
phy_mode = pATEInfo->TxWI.TXWI_N.PHYMODE;
|
||||
|
||||
frag = pATEInfo->TxWI.TXWI_N.FRAG;
|
||||
cfack = pATEInfo->TxWI.TXWI_N.CFACK,
|
||||
ts = pATEInfo->TxWI.TXWI_N.TS;
|
||||
ampdu = pATEInfo->TxWI.TXWI_N.AMPDU;
|
||||
ack = pATEInfo->TxWI.TXWI_N.ACK;
|
||||
nseq = pATEInfo->TxWI.TXWI_N.NSEQ;
|
||||
bawinsize =pATEInfo->TxWI.TXWI_N.BAWinSize;
|
||||
byte_cnt = pATEInfo->TxWI.TXWI_N.MPDUtotalByteCnt;
|
||||
pkt_id = pATEInfo->TxWI.TXWI_N.TxPktId;
|
||||
txop = pATEInfo->TxWI.TXWI_N.txop;
|
||||
cfack = pATEInfo->TxWI.TXWI_N.CFACK;
|
||||
}
|
||||
#endif /* RLT_MAC */
|
||||
#ifdef RTMP_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RTMP)
|
||||
{
|
||||
bw = pATEInfo->TxWI.TXWI_O.BW;
|
||||
sgi = pATEInfo->TxWI.TXWI_O.ShortGI;
|
||||
stbc = pATEInfo->TxWI.TXWI_O.STBC;
|
||||
mcs = pATEInfo->TxWI.TXWI_O.MCS;
|
||||
phy_mode = pATEInfo->TxWI.TXWI_O.PHYMODE;
|
||||
|
||||
frag = pATEInfo->TxWI.TXWI_O.FRAG;
|
||||
cfack = pATEInfo->TxWI.TXWI_O.CFACK,
|
||||
ts = pATEInfo->TxWI.TXWI_O.TS;
|
||||
ampdu = pATEInfo->TxWI.TXWI_O.AMPDU;
|
||||
ack = pATEInfo->TxWI.TXWI_O.ACK;
|
||||
nseq = pATEInfo->TxWI.TXWI_O.NSEQ;
|
||||
bawinsize =pATEInfo->TxWI.TXWI_O.BAWinSize;
|
||||
byte_cnt = pATEInfo->TxWI.TXWI_O.MPDUtotalByteCnt;
|
||||
pkt_id = pATEInfo->TxWI.TXWI_O.PacketId;
|
||||
txop = pATEInfo->TxWI.TXWI_O.txop;
|
||||
cfack = pATEInfo->TxWI.TXWI_O.CFACK;
|
||||
}
|
||||
#endif /* RTMP_MAC */
|
||||
|
||||
/* fill TxWI */
|
||||
TxHTPhyMode.field.BW = bw;
|
||||
TxHTPhyMode.field.ShortGI = sgi;
|
||||
TxHTPhyMode.field.STBC = stbc;
|
||||
TxHTPhyMode.field.MCS = mcs;
|
||||
TxHTPhyMode.field.MODE = phy_mode;
|
||||
|
||||
if (pATEInfo->bQATxStart == TRUE)
|
||||
{
|
||||
/* always use QID_AC_BE and FIFO_EDCA */
|
||||
ATEWriteTxWI(pAd, pTxWI, frag, cfack,
|
||||
ts, ampdu, ack,
|
||||
nseq, bawinsize, 0,
|
||||
byte_cnt, pkt_id, 0, 0,
|
||||
txop, cfack,
|
||||
&TxHTPhyMode);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
ATEWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
|
||||
4, 0, pATEInfo->TxLength, 0, 0, 0, IFS_HTTXOP, FALSE, &TxHTPhyMode);
|
||||
|
||||
}
|
||||
|
||||
/* fill 802.11 header */
|
||||
#ifdef CONFIG_QA
|
||||
if (pATEInfo->bQATxStart == TRUE)
|
||||
{
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize, pATEInfo->Header, pATEInfo->HLen);
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_QA */
|
||||
{
|
||||
pATEInfo->HLen = LENGTH_802_11;
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize, TemplateFrame, pATEInfo->HLen);
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize + 4, pATEInfo->Addr1, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize + 10, pATEInfo->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize + 16, pATEInfo->Addr3, MAC_ADDR_LEN);
|
||||
}
|
||||
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
RTMPFrameEndianChange(pAd, (((PUCHAR)pDMAHeaderBufVA) + TXWISize), DIR_READ, FALSE);
|
||||
#endif /* RT_BIG_ENDIAN */
|
||||
|
||||
pPacket = ATEPayloadInit(pAd, TxIdx);
|
||||
/* error check */
|
||||
if (pPacket == NULL)
|
||||
{
|
||||
pATEInfo->TxCount = 0;
|
||||
DBGPRINT_ERR(("%s : fail to init frame payload.\n", __FUNCTION__));
|
||||
return -1;
|
||||
}
|
||||
pTxRing->Cell[TxIdx].pNdisPacket = pPacket;
|
||||
|
||||
/* build Tx descriptor */
|
||||
#ifndef RT_BIG_ENDIAN
|
||||
pTxD = (TXD_STRUC *) pTxRing->Cell[TxIdx].AllocVa;
|
||||
pTxInfo = (TXINFO_STRUC *)(pTxRing->Cell[TxIdx].AllocVa + sizeof(TXD_STRUC));
|
||||
#else
|
||||
pDestTxD = (TXD_STRUC *)pTxRing->Cell[TxIdx].AllocVa;
|
||||
NdisMoveMemory(&tx_hw_info[0], (UCHAR *)pDestTxD, TXD_SIZE);
|
||||
pTxD = (TXD_STRUC *)&tx_hw_info[0];
|
||||
pTxInfo = (TXINFO_STRUC *)(&tx_hw_info[0] + sizeof(TXD_STRUC));
|
||||
#endif /* !RT_BIG_ENDIAN */
|
||||
{
|
||||
/* prepare TxD */
|
||||
TX_BLK txblk;
|
||||
txblk.SrcBufLen = GET_OS_PKT_LEN(pATEInfo->pAtePacket[TxIdx]);
|
||||
txblk.pSrcBufData = (PUCHAR)pATEInfo->AteAllocVa[TxIdx];
|
||||
NdisZeroMemory(pTxD, TXD_SIZE);
|
||||
/* build Tx descriptor */
|
||||
pTxD->SDPtr0 = RTMP_GetPhysicalAddressLow (pTxRing->Cell[TxIdx].DmaBuf.AllocPa);
|
||||
pTxD->SDLen0 = TXWISize + pATEInfo->HLen;
|
||||
pTxD->LastSec0 = 0;
|
||||
pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, &txblk, 0, 1, RTMP_PCI_DMA_TODEVICE);
|
||||
pTxD->SDLen1 = GET_OS_PKT_LEN(pATEInfo->pAtePacket[TxIdx]);
|
||||
pTxD->LastSec1 = 1;
|
||||
pTxD->Burst = 0;
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
ral_write_txd(pAd, pTxD, pTxInfo, FALSE, FIFO_EDCA);
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) */
|
||||
#ifdef MT_MAC
|
||||
mt_write_txd(pAd, pTxD);
|
||||
#endif /* MT_MAC */
|
||||
}
|
||||
#ifdef CONFIG_QA
|
||||
if (pATEInfo->bQATxStart == TRUE)
|
||||
{
|
||||
pDest = (PUCHAR)pTxWI;
|
||||
pDest += TXWISize;
|
||||
pHeader80211 = (PHEADER_802_11)pDest;
|
||||
|
||||
/* modify sequence number... */
|
||||
if (pATEInfo->TxDoneCount == 0)
|
||||
pATEInfo->seq = pHeader80211->Sequence;
|
||||
else
|
||||
pHeader80211->Sequence = ++pATEInfo->seq;
|
||||
}
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
RTMPWIEndianChange(pAd, (PUCHAR)pTxWI, TYPE_TXWI);
|
||||
RTMPFrameEndianChange(pAd, (((PUCHAR)pDMAHeaderBufVA) + TXWISize), DIR_WRITE, FALSE);
|
||||
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
|
||||
WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD);
|
||||
#endif /* RT_BIG_ENDIAN */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Tx ring skb hook and ring index setting.
|
||||
NOTE:
|
||||
This routine should only be used in ATE mode.
|
||||
==========================================================================
|
||||
*/
|
||||
NDIS_STATUS TxRingGetReady(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ATE_INFO *pATEInfo = &(pAd->ate);
|
||||
RTMP_TX_RING *pTxRing = &pAd->TxRing[QID_AC_BE];
|
||||
UINT32 TxIdx = 0;
|
||||
UINT32 ring_idx = 0;
|
||||
RTMP_IO_READ32(pAd, pTxRing->hw_didx_addr, &pTxRing->TxDmaIdx);
|
||||
pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx;
|
||||
pTxRing->TxCpuIdx = pTxRing->TxDmaIdx;
|
||||
RTMP_IO_WRITE32(pAd, pTxRing->hw_cidx_addr, pTxRing->TxCpuIdx);
|
||||
|
||||
for (ring_idx = 0; (ring_idx < TX_RING_SIZE) && (ring_idx < pATEInfo->TxCount); ring_idx++)
|
||||
{
|
||||
TxIdx = pTxRing->TxCpuIdx;
|
||||
|
||||
if (ATESetUpFrame(pAd, TxIdx) != 0)
|
||||
{
|
||||
return (NDIS_STATUS_FAILURE);
|
||||
}
|
||||
|
||||
if (((ring_idx + 1) < TX_RING_SIZE) && (ring_idx < pATEInfo->TxCount))
|
||||
{
|
||||
INC_RING_INDEX(pTxRing->TxCpuIdx, TX_RING_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
return (NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
|
@ -0,0 +1,29 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ate_usb.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
*/
|
||||
|
||||
|
1183
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ate/mt_mac/mt_ate.c
Normal file
1183
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ate/mt_mac/mt_ate.c
Normal file
File diff suppressed because it is too large
Load Diff
2094
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ate/qa_agent.c
Normal file
2094
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/ate/qa_agent.c
Normal file
File diff suppressed because it is too large
Load Diff
1389
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/mt7603.c
Normal file
1389
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/mt7603.c
Normal file
File diff suppressed because it is too large
Load Diff
1018
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/mt7628.c
Normal file
1018
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/mt7628.c
Normal file
File diff suppressed because it is too large
Load Diff
1036
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/mt7636.c
Normal file
1036
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/mt7636.c
Normal file
File diff suppressed because it is too large
Load Diff
400
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/rt28xx.c
Normal file
400
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/rt28xx.c
Normal file
@ -0,0 +1,400 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt2860.c
|
||||
|
||||
Abstract:
|
||||
Specific funcitons and variables for RT3070
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifdef RT28xx
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2883)
|
||||
/* Reset the RFIC setting to new series */
|
||||
RTMP_RF_REGS RF2850RegTable[] = {
|
||||
/* ch R1 R2 R3(TX0~4=0) R4*/
|
||||
{1, 0x98402ecc, 0x984c0786, 0x9816b455, 0x9800510b},
|
||||
{2, 0x98402ecc, 0x984c0786, 0x98168a55, 0x9800519f},
|
||||
{3, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800518b},
|
||||
{4, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800519f},
|
||||
{5, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800518b},
|
||||
{6, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800519f},
|
||||
{7, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800518b},
|
||||
{8, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800519f},
|
||||
{9, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800518b},
|
||||
{10, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800519f},
|
||||
{11, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800518b},
|
||||
{12, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800519f},
|
||||
{13, 0x98402ecc, 0x984c079e, 0x98168a55, 0x9800518b},
|
||||
{14, 0x98402ecc, 0x984c07a2, 0x98168a55, 0x98005193},
|
||||
|
||||
/* 802.11 UNI / HyperLan 2*/
|
||||
{36, 0x98402ecc, 0x984c099a, 0x98158a55, 0x980ed1a3},
|
||||
{38, 0x98402ecc, 0x984c099e, 0x98158a55, 0x980ed193},
|
||||
{40, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed183},
|
||||
{44, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed1a3},
|
||||
{46, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed18b},
|
||||
{48, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed19b},
|
||||
{52, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed193},
|
||||
{54, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed1a3},
|
||||
{56, 0x98402ec8, 0x984c068e, 0x98158a55, 0x980ed18b},
|
||||
{60, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed183},
|
||||
{62, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed193},
|
||||
{64, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed1a3}, /* Plugfest#4, Day4, change RFR3 left4th 9->5.*/
|
||||
|
||||
/* 802.11 HyperLan 2*/
|
||||
{100, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed783},
|
||||
|
||||
/* 2008.04.30 modified */
|
||||
/* The system team has AN to improve the EVM value */
|
||||
/* for channel 102 to 108 for the RT2850/RT2750 dual band solution.*/
|
||||
{102, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed793},
|
||||
{104, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed1a3},
|
||||
{108, 0x98402ecc, 0x985c0a32, 0x98578a55, 0x980ed193},
|
||||
|
||||
{110, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed183},
|
||||
{112, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed19b},
|
||||
{116, 0x98402ecc, 0x984c0a3a, 0x98178a55, 0x980ed1a3},
|
||||
{118, 0x98402ecc, 0x984c0a3e, 0x98178a55, 0x980ed193},
|
||||
{120, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed183},
|
||||
{124, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed193},
|
||||
{126, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed15b}, /* 0x980ed1bb->0x980ed15b required by Rory 20070927*/
|
||||
{128, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed1a3},
|
||||
{132, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed18b},
|
||||
{134, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed193},
|
||||
{136, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed19b},
|
||||
{140, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed183},
|
||||
|
||||
/* 802.11 UNII*/
|
||||
{149, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed1a7},
|
||||
{151, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed187},
|
||||
{153, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed18f},
|
||||
{157, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed19f},
|
||||
{159, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed1a7},
|
||||
{161, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed187},
|
||||
{165, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed197},
|
||||
{167, 0x98402ec4, 0x984c03d2, 0x98179855, 0x9815531f},
|
||||
{169, 0x98402ec4, 0x984c03d2, 0x98179855, 0x98155327},
|
||||
{171, 0x98402ec4, 0x984c03d6, 0x98179855, 0x98155307},
|
||||
{173, 0x98402ec4, 0x984c03d6, 0x98179855, 0x9815530f},
|
||||
|
||||
/* Japan*/
|
||||
{184, 0x95002ccc, 0x9500491e, 0x9509be55, 0x950c0a0b},
|
||||
{188, 0x95002ccc, 0x95004922, 0x9509be55, 0x950c0a13},
|
||||
{192, 0x95002ccc, 0x95004926, 0x9509be55, 0x950c0a1b},
|
||||
{196, 0x95002ccc, 0x9500492a, 0x9509be55, 0x950c0a23},
|
||||
{208, 0x95002ccc, 0x9500493a, 0x9509be55, 0x950c0a13},
|
||||
{212, 0x95002ccc, 0x9500493e, 0x9509be55, 0x950c0a1b},
|
||||
{216, 0x95002ccc, 0x95004982, 0x9509be55, 0x950c0a23},
|
||||
|
||||
/* still lack of MMAC(Japan) ch 34,38,42,46*/
|
||||
};
|
||||
UCHAR NUM_OF_2850_CHNL = (sizeof(RF2850RegTable) / sizeof(RTMP_RF_REGS));
|
||||
#endif /* defined(RT28xx) || defined(RT2883) */
|
||||
|
||||
|
||||
VOID RT28xx_ch_tunning(RTMP_ADAPTER *pAd, UINT8 bw)
|
||||
{
|
||||
if (pAd->MACVersion != 0x28600100)
|
||||
return;
|
||||
|
||||
|
||||
if (bw == BW_20)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
|
||||
}
|
||||
else if (bw == BW_40)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n"));
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xx_ChipSwitchChannel(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Channel,
|
||||
IN BOOLEAN bScan)
|
||||
{
|
||||
CHAR TxPwer = 0, TxPwer2 = DEFAULT_RF_TX_POWER; /*Bbp94 = BBPR94_DEFAULT, TxPwer2 = DEFAULT_RF_TX_POWER;*/
|
||||
UCHAR index;
|
||||
UINT32 Value = 0; /*BbpReg, Value;*/
|
||||
UCHAR RFValue = 0;
|
||||
UINT32 i = 0;
|
||||
ULONG R2 = 0, R3 = DEFAULT_RF_TX_POWER, R4 = 0;
|
||||
RTMP_RF_REGS *RFRegTable;
|
||||
CHAR lan_gain;
|
||||
|
||||
|
||||
/* Search Tx power value*/
|
||||
/*
|
||||
We can't use ChannelList to search channel, since some central channl's txpowr doesn't list
|
||||
in ChannelList, so use TxPower array instead.
|
||||
*/
|
||||
for (index = 0; index < MAX_NUM_OF_CHANNELS; index++)
|
||||
{
|
||||
if (Channel == pAd->TxPower[index].Channel)
|
||||
{
|
||||
TxPwer = pAd->TxPower[index].Power;
|
||||
TxPwer2 = pAd->TxPower[index].Power2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (index == MAX_NUM_OF_CHANNELS)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Can't find the Channel#%d \n", __FUNCTION__, Channel));
|
||||
}
|
||||
|
||||
RFRegTable = RF2850RegTable;
|
||||
|
||||
switch (pAd->RfIcType)
|
||||
{
|
||||
case RFIC_2820:
|
||||
case RFIC_2850:
|
||||
case RFIC_2720:
|
||||
case RFIC_2750:
|
||||
for (index = 0; index < NUM_OF_2850_CHNL; index++)
|
||||
{
|
||||
if (Channel == RFRegTable[index].Channel)
|
||||
{
|
||||
R2 = RFRegTable[index].R2;
|
||||
if (pAd->Antenna.field.TxPath == 1)
|
||||
{
|
||||
R2 |= 0x4000; /*If TXpath is 1, bit 14 = 1;*/
|
||||
}
|
||||
|
||||
if ((pAd->Antenna.field.RxPath == 2)
|
||||
#ifdef GREENAP_SUPPORT
|
||||
&& (pAd->ApCfg.bGreenAPActive == FALSE)
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
)
|
||||
{
|
||||
R2 |= 0x40; /*write 1 to off Rxpath.*/
|
||||
}
|
||||
else if ((pAd->Antenna.field.RxPath == 1)
|
||||
#ifdef GREENAP_SUPPORT
|
||||
|| (pAd->ApCfg.bGreenAPActive == TRUE)
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
)
|
||||
{
|
||||
R2 |= 0x20040; /*write 1 to off RxPath*/
|
||||
}
|
||||
|
||||
if (Channel > 14)
|
||||
{
|
||||
/* initialize R3, R4*/
|
||||
R3 = (RFRegTable[index].R3 & 0xffffc1ff);
|
||||
R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->RfFreqOffset << 15);
|
||||
|
||||
/* 5G band power range: 0xF9~0X0F, TX0 Reg3 bit9/TX1 Reg4 bit6="0" means the TX power reduce 7dB*/
|
||||
/*R3*/
|
||||
if ((TxPwer >= -7) && (TxPwer < 0))
|
||||
{
|
||||
TxPwer = (7+TxPwer);
|
||||
|
||||
/* TxPwer is not possible larger than 15 */
|
||||
|
||||
R3 |= (TxPwer << 10);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): TxPwer=%d \n", __FUNCTION__, TxPwer));
|
||||
}
|
||||
else
|
||||
{
|
||||
TxPwer = (TxPwer > 0xF) ? (0xF) : (TxPwer);
|
||||
R3 |= (TxPwer << 10) | (1 << 9);
|
||||
}
|
||||
|
||||
/* R4*/
|
||||
if ((TxPwer2 >= -7) && (TxPwer2 < 0))
|
||||
{
|
||||
TxPwer2 = (7+TxPwer2);
|
||||
|
||||
R4 |= (TxPwer2 << 7);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): TxPwer2=%d \n", __FUNCTION__, TxPwer2));
|
||||
}
|
||||
else
|
||||
{
|
||||
TxPwer2 = (TxPwer2 > 0xF) ? (0xF) : (TxPwer2);
|
||||
R4 |= (TxPwer2 << 7) | (1 << 6);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
R3 = (RFRegTable[index].R3 & 0xffffc1ff) | (TxPwer << 9); /* set TX power0*/
|
||||
R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->RfFreqOffset << 15) | (TxPwer2 <<6);/* Set freq Offset & TxPwr1*/
|
||||
}
|
||||
|
||||
/* Based on BBP current mode before changing RF channel.*/
|
||||
if (!bScan && (pAd->CommonCfg.BBPCurrentBW == BW_40)
|
||||
#ifdef GREENAP_SUPPORT
|
||||
&& (pAd->ApCfg.bGreenAPActive == 0)
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
)
|
||||
{
|
||||
R4 |=0x200000;
|
||||
}
|
||||
|
||||
/* Update variables*/
|
||||
pAd->LatchRfRegs.Channel = Channel;
|
||||
pAd->hw_cfg.lan_gain = GET_LNA_GAIN(pAd);
|
||||
pAd->LatchRfRegs.R1 = RFRegTable[index].R1;
|
||||
pAd->LatchRfRegs.R2 = R2;
|
||||
pAd->LatchRfRegs.R3 = R3;
|
||||
pAd->LatchRfRegs.R4 = R4;
|
||||
|
||||
/* Set RF value 1's set R3[bit2] = [0]*/
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);
|
||||
RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04)));
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);
|
||||
|
||||
RtmpusecDelay(200);
|
||||
|
||||
/* Set RF value 2's set R3[bit2] = [1]*/
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);
|
||||
RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 | 0x04));
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);
|
||||
|
||||
RtmpusecDelay(200);
|
||||
|
||||
/* Set RF value 3's set R3[bit2] = [0]*/
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);
|
||||
RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04)));
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%lu, Pwr1=%lu, %dT) to , R1=0x%08x, R2=0x%08x, R3=0x%08x, R4=0x%08x\n",
|
||||
Channel,
|
||||
pAd->RfIcType,
|
||||
(R3 & 0x00003e00) >> 9,
|
||||
(R4 & 0x000007c0) >> 6,
|
||||
pAd->Antenna.field.TxPath,
|
||||
pAd->LatchRfRegs.R1,
|
||||
pAd->LatchRfRegs.R2,
|
||||
pAd->LatchRfRegs.R3,
|
||||
pAd->LatchRfRegs.R4));
|
||||
break;
|
||||
|
||||
default:
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d : unknown RFIC=%d\n", Channel, pAd->RfIcType));
|
||||
break;
|
||||
}
|
||||
|
||||
/* Change BBP setting during siwtch from a->g, g->a*/
|
||||
lan_gain = pAd->hw_cfg.lan_gain;
|
||||
if (Channel <= 14)
|
||||
{
|
||||
ULONG TxPinCfg = 0x00050F0A; /*Gary 2007/08/09 0x050A0A*/
|
||||
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0);/*(0x44 - lan_gain)); According the Rory's suggestion to solve the middle range issue.*/
|
||||
|
||||
/* Rx High power VGA offset for LNA select*/
|
||||
{
|
||||
if (pAd->NicConfig2.field.ExternalLNAForG)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x84);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50);
|
||||
}
|
||||
}
|
||||
|
||||
/* 5G band selection PIN, bit1 and bit2 are complement*/
|
||||
rtmp_mac_set_band(pAd, BAND_24G);
|
||||
|
||||
/* Turn off unused PA or LNA when only 1T or 1R*/
|
||||
if (pAd->Antenna.field.TxPath == 1)
|
||||
TxPinCfg &= 0xFFFFFFF3;
|
||||
if (pAd->Antenna.field.RxPath == 1)
|
||||
TxPinCfg &= 0xFFFFF3FF;
|
||||
RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);
|
||||
|
||||
filter_coefficient_ctrl(pAd, Channel);
|
||||
}
|
||||
else
|
||||
{
|
||||
ULONG TxPinCfg = 0x00050F05;/*Gary 2007/8/9 0x050505*/
|
||||
UINT8 bbpValue;
|
||||
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0); /*(0x44 - lan_gain)); According the Rory's suggestion to solve the middle range issue. */
|
||||
|
||||
/* Set the BBP_R82 value here */
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0xF2);
|
||||
|
||||
|
||||
/* Rx High power VGA offset for LNA select*/
|
||||
bbpValue = (pAd->NicConfig2.field.ExternalLNAForA) ? 0x46 : 0x50;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, bbpValue);
|
||||
|
||||
/* 5G band selection PIN, bit1 and bit2 are complement*/
|
||||
rtmp_mac_set_band(pAd, BAND_5G);
|
||||
|
||||
/* Turn off unused PA or LNA when only 1T or 1R*/
|
||||
if (pAd->Antenna.field.TxPath == 1)
|
||||
TxPinCfg &= 0xFFFFFFF3;
|
||||
if (pAd->Antenna.field.RxPath == 1)
|
||||
TxPinCfg &= 0xFFFFF3FF;
|
||||
RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);
|
||||
}
|
||||
|
||||
/*
|
||||
On 11A, We should delay and wait RF/BBP to be stable
|
||||
and the appropriate time should be 1000 micro seconds
|
||||
005/06/05 - On 11G, We also need this delay time. Otherwise it's difficult to pass the WHQL.
|
||||
|
||||
*/
|
||||
RtmpusecDelay(1000);
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xx_chip_Init(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
rtmp_phy_probe(pAd);
|
||||
pAd->ChipOps.ChipSwitchChannel = RT28xx_ChipSwitchChannel;
|
||||
}
|
||||
|
||||
#endif /*RT28xx */
|
||||
|
@ -0,0 +1,29 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt65xx.c
|
||||
|
||||
Abstract:
|
||||
Specific funcitons and configurations for RT65xx
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
@ -0,0 +1,539 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt_chip.c
|
||||
|
||||
Abstract:
|
||||
Ralink Wireless driver CHIP related functions
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
BOOLEAN rt28xx_eeprom_read16(RTMP_ADAPTER *pAd, USHORT offset, USHORT *value)
|
||||
{
|
||||
if (pAd->chipOps.eeread) {
|
||||
return pAd->chipOps.eeread(pAd, offset, value);
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
write high memory.
|
||||
if firmware do not support auto high/low memory switching, we should switch to high memory by ourself.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Offset - Memory offsets
|
||||
Value - Written value
|
||||
Unit - Unit in "Byte"
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpChipWriteHighMemory(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN USHORT Offset,
|
||||
IN UINT32 Value,
|
||||
IN UINT8 Unit)
|
||||
{
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
write memory
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Offset - Memory offsets
|
||||
Value - Written value
|
||||
Unit - Unit in "Byte"
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpChipWriteMemory(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN USHORT Offset,
|
||||
IN UINT32 Value,
|
||||
IN UINT8 Unit)
|
||||
{
|
||||
switch(Unit)
|
||||
{
|
||||
case 1:
|
||||
RTMP_IO_WRITE8(pAd, Offset, Value);
|
||||
break;
|
||||
case 2:
|
||||
RTMP_IO_WRITE16(pAd, Offset, Value);
|
||||
break;
|
||||
case 4:
|
||||
RTMP_IO_WRITE32(pAd, Offset, Value);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize specific beacon frame architecture.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpChipBcnSpecInit(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize normal beacon frame architecture.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpChipBcnInit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
|
||||
|
||||
pChipCap->FlgIsSupSpecBcnBuf = FALSE;
|
||||
pChipCap->BcnMaxHwNum = 8;
|
||||
pChipCap->BcnMaxNum = (pChipCap->BcnMaxHwNum - MAX_MESH_NUM - MAX_APCLI_NUM);
|
||||
pChipCap->BcnMaxHwSize = 0x1000;
|
||||
|
||||
pChipCap->BcnBase[0] = 0x7800;
|
||||
pChipCap->BcnBase[1] = 0x7A00;
|
||||
pChipCap->BcnBase[2] = 0x7C00;
|
||||
pChipCap->BcnBase[3] = 0x7E00;
|
||||
pChipCap->BcnBase[4] = 0x7200;
|
||||
pChipCap->BcnBase[5] = 0x7400;
|
||||
pChipCap->BcnBase[6] = 0x5DC0;
|
||||
pChipCap->BcnBase[7] = 0x5BC0;
|
||||
|
||||
/*
|
||||
If the MAX_MBSSID_NUM is larger than 6,
|
||||
it shall reserve some WCID space(wcid 222~253) for beacon frames.
|
||||
- these wcid 238~253 are reserved for beacon#6(ra6).
|
||||
- these wcid 222~237 are reserved for beacon#7(ra7).
|
||||
*/
|
||||
if (pChipCap->BcnMaxNum == 8)
|
||||
pChipCap->WcidHwRsvNum = 222;
|
||||
else if (pChipCap->BcnMaxNum == 7)
|
||||
pChipCap->WcidHwRsvNum = 238;
|
||||
else
|
||||
pChipCap->WcidHwRsvNum = 255;
|
||||
|
||||
pAd->chipOps.BeaconUpdate = RtmpChipWriteMemory;
|
||||
}
|
||||
|
||||
|
||||
#ifdef MT_MAC
|
||||
VOID mt_bcn_buf_init(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
|
||||
pChipCap->FlgIsSupSpecBcnBuf = FALSE;
|
||||
pChipCap->BcnMaxHwNum = 16;
|
||||
pChipCap->BcnMaxNum = 16;
|
||||
|
||||
#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA)
|
||||
pChipCap->WcidHwRsvNum = 20;
|
||||
#else
|
||||
pChipCap->WcidHwRsvNum = 127;
|
||||
#endif /* MT7603_FPGA */
|
||||
pChipCap->BcnMaxHwSize = 0x2000; // useless!!
|
||||
|
||||
pChipCap->BcnBase[0] = 0;
|
||||
pChipCap->BcnBase[1] = 0;
|
||||
pChipCap->BcnBase[2] = 0;
|
||||
pChipCap->BcnBase[3] = 0;
|
||||
pChipCap->BcnBase[4] = 0;
|
||||
pChipCap->BcnBase[5] = 0;
|
||||
pChipCap->BcnBase[6] = 0;
|
||||
pChipCap->BcnBase[7] = 0;
|
||||
pChipCap->BcnBase[8] = 0;
|
||||
pChipCap->BcnBase[9] = 0;
|
||||
pChipCap->BcnBase[10] = 0;
|
||||
pChipCap->BcnBase[11] = 0;
|
||||
pChipCap->BcnBase[12] = 0;
|
||||
pChipCap->BcnBase[13] = 0;
|
||||
pChipCap->BcnBase[14] = 0;
|
||||
pChipCap->BcnBase[15] = 0;
|
||||
|
||||
#ifdef CONFIG_MULTI_CHANNEL
|
||||
/* Record HW Null Frame offset */
|
||||
pAd->NullBufOffset[0] = 0;
|
||||
pAd->NullBufOffset[1] = 0;
|
||||
#endif /* CONFIG_MULTI_CHANNEL */
|
||||
|
||||
pAd->chipOps.BeaconUpdate = NULL;
|
||||
|
||||
// TODO: shiang-7603
|
||||
if (pAd->chipCap.hif_type == HIF_MT) {
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s(%d): Not support for HIF_MT yet!\n",
|
||||
__FUNCTION__, __LINE__));
|
||||
}
|
||||
|
||||
}
|
||||
#endif /* MT_MAC */
|
||||
|
||||
|
||||
#ifdef RLT_MAC
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize specific beacon frame architecture.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID rlt_bcn_buf_init(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
|
||||
pChipCap->FlgIsSupSpecBcnBuf = FALSE;
|
||||
{
|
||||
pChipCap->BcnMaxHwNum = 16;
|
||||
pChipCap->WcidHwRsvNum = 255;
|
||||
}
|
||||
|
||||
/*
|
||||
In 16-MBSS support mode, if AP-Client is enabled,
|
||||
the last 8-MBSS would be occupied for AP-Client using.
|
||||
*/
|
||||
#ifdef APCLI_SUPPORT
|
||||
pChipCap->BcnMaxNum = (8 - MAX_MESH_NUM);
|
||||
#else
|
||||
pChipCap->BcnMaxNum = (pChipCap->BcnMaxHwNum - MAX_MESH_NUM);
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
||||
pChipCap->BcnMaxHwSize = 0x2000;
|
||||
|
||||
pChipCap->BcnBase[0] = 0xc000;
|
||||
pChipCap->BcnBase[1] = 0xc200;
|
||||
pChipCap->BcnBase[2] = 0xc400;
|
||||
pChipCap->BcnBase[3] = 0xc600;
|
||||
pChipCap->BcnBase[4] = 0xc800;
|
||||
pChipCap->BcnBase[5] = 0xca00;
|
||||
pChipCap->BcnBase[6] = 0xcc00;
|
||||
pChipCap->BcnBase[7] = 0xce00;
|
||||
pChipCap->BcnBase[8] = 0xd000;
|
||||
pChipCap->BcnBase[9] = 0xd200;
|
||||
pChipCap->BcnBase[10] = 0xd400;
|
||||
pChipCap->BcnBase[11] = 0xd600;
|
||||
pChipCap->BcnBase[12] = 0xd800;
|
||||
pChipCap->BcnBase[13] = 0xda00;
|
||||
pChipCap->BcnBase[14] = 0xdc00;
|
||||
pChipCap->BcnBase[15] = 0xde00;
|
||||
|
||||
#ifdef CONFIG_MULTI_CHANNEL
|
||||
/* Record HW Null Frame offset */
|
||||
//pAd->NullBufOffset[0] = 0xd000;
|
||||
pAd->NullBufOffset[0] = 0xd000;
|
||||
pAd->NullBufOffset[1] = 0xd200;
|
||||
#endif /* CONFIG_MULTI_CHANNEL */
|
||||
|
||||
pAd->chipOps.BeaconUpdate = RtmpChipWriteMemory;
|
||||
}
|
||||
#endif /* RLT_MAC */
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef HW_ANTENNA_DIVERSITY_SUPPORT
|
||||
UINT32 SetHWAntennaDivsersity(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN BOOLEAN Enable)
|
||||
{
|
||||
if (Enable == TRUE)
|
||||
{
|
||||
UINT8 BBPValue = 0, RFValue = 0;
|
||||
USHORT value;
|
||||
|
||||
// RF_R29 bit7:6
|
||||
RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_GAIN, value);
|
||||
|
||||
RT30xxReadRFRegister(pAd, RF_R29, &RFValue);
|
||||
RFValue &= 0x3f; // clear bit7:6
|
||||
RFValue |= (value << 6);
|
||||
RT30xxWriteRFRegister(pAd, RF_R29, RFValue);
|
||||
|
||||
// BBP_R47 bit7=1
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BBPValue);
|
||||
BBPValue |= 0x80;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BBPValue);
|
||||
|
||||
BBPValue = 0xbe;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, BBPValue);
|
||||
BBPValue = 0xb0;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, BBPValue);
|
||||
BBPValue = 0x23;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, BBPValue);
|
||||
BBPValue = 0x3a;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R153, BBPValue);
|
||||
BBPValue = 0x10;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, BBPValue);
|
||||
BBPValue = 0x3b;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R155, BBPValue);
|
||||
BBPValue = 0x04;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R253, BBPValue);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("HwAnDi> Enable!\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT8 BBPValue = 0;
|
||||
|
||||
/*
|
||||
main antenna: BBP_R152 bit7=1
|
||||
aux antenna: BBP_R152 bit7=0
|
||||
*/
|
||||
if (pAd->FixDefaultAntenna == 0)
|
||||
{
|
||||
/* fix to main antenna */
|
||||
/* do not care BBP R153, R155, R253 */
|
||||
BBPValue = 0x3e;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, BBPValue);
|
||||
BBPValue = 0x30;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, BBPValue);
|
||||
BBPValue = 0x23;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, BBPValue);
|
||||
BBPValue = 0x00;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, BBPValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* fix to aux antenna */
|
||||
/* do not care BBP R153, R155, R253 */
|
||||
BBPValue = 0x3e;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, BBPValue);
|
||||
BBPValue = 0x30;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, BBPValue);
|
||||
BBPValue = 0xa3;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, BBPValue);
|
||||
BBPValue = 0x00;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, BBPValue);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("HwAnDi> Disable!\n"));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif // HW_ANTENNA_DIVERSITY_SUPPORT //
|
||||
|
||||
|
||||
|
||||
|
||||
UINT8 NICGetBandSupported(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
if (BOARD_IS_5G_ONLY(pAd))
|
||||
{
|
||||
return RFIC_5GHZ;
|
||||
}
|
||||
else if (BOARD_IS_2G_ONLY(pAd))
|
||||
{
|
||||
return RFIC_24GHZ;
|
||||
}
|
||||
else if (RFIC_IS_5G_BAND(pAd))
|
||||
{
|
||||
return RFIC_DUAL_BAND;
|
||||
}
|
||||
else
|
||||
return RFIC_24GHZ;
|
||||
}
|
||||
|
||||
|
||||
INT WaitForAsicReady(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
// TODO: shiang-7603
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT AsicGetMacVersion(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UINT32 reg = 0;
|
||||
|
||||
// TODO: shiang-7603
|
||||
if (pAd->chipCap.hif_type == HIF_MT) {
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s(%d): Not support for HIF_MT yet!\n",
|
||||
__FUNCTION__, __LINE__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
reg = MAC_CSR0;
|
||||
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) */
|
||||
|
||||
if (WaitForAsicReady(pAd) == TRUE)
|
||||
{
|
||||
RTMP_IO_READ32(pAd, reg, &pAd->MACVersion);
|
||||
DBGPRINT(RT_DEBUG_OFF, ("MACVersion[Ver:Rev]=0x%08x : 0x%08x\n",
|
||||
pAd->MACVersion, pAd->ChipID));
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s() failed!\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize chip related information.
|
||||
|
||||
Arguments:
|
||||
pCB - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
int RtmpChipOpsHook(VOID *pCB)
|
||||
{
|
||||
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pCB;
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC) || defined(RT65xx)
|
||||
UINT32 MacValue;
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) || defined(RT65xx) */
|
||||
int ret = 0;
|
||||
#ifdef GREENAP_SUPPORT
|
||||
RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
|
||||
/* sanity check */
|
||||
if (WaitForAsicReady(pAd) == FALSE)
|
||||
return -1;
|
||||
|
||||
// TODO: shiang-7603
|
||||
if (IS_MT7603(pAd) || IS_MT7628(pAd)) {
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(%d): Not support for HIF_MT yet!\n",
|
||||
__FUNCTION__, __LINE__));
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
RTMP_IO_READ32(pAd, MAC_CSR0, &MacValue);
|
||||
pAd->MACVersion = MacValue;
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) */
|
||||
}
|
||||
|
||||
if (pAd->MACVersion == 0xffffffff)
|
||||
return -1;
|
||||
|
||||
|
||||
/* default init */
|
||||
RTMP_DRS_ALG_INIT(pAd, RATE_ALG_LEGACY);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef MT7603
|
||||
if (IS_MT7603(pAd)) {
|
||||
mt7603_init(pAd);
|
||||
goto done;
|
||||
}
|
||||
#endif /* MT7603 */
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef GREENAP_SUPPORT
|
||||
#if defined (MT7603) || defined (MT7628)
|
||||
pChipOps->EnableAPMIMOPS = EnableAPMIMOPSv2;
|
||||
pChipOps->DisableAPMIMOPS = DisableAPMIMOPSv2;
|
||||
#else
|
||||
pChipOps->EnableAPMIMOPS = EnableAPMIMOPSv1;
|
||||
pChipOps->DisableAPMIMOPS = DisableAPMIMOPSv1;
|
||||
#endif
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
|
||||
#ifdef RTMP_MAC
|
||||
// TODO: default settings for rest of the chips!! change this to really default chip.
|
||||
RTxx_default_Init(pAd);
|
||||
#endif /* RTMP_MAC */
|
||||
|
||||
/* We depends on RfICType and MACVersion to assign the corresponding operation callbacks. */
|
||||
|
||||
|
||||
|
||||
done:
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Chip specific bbpRegTbSize=%d!\n", pChipCap->bbpRegTbSize));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Chip VCO calibration mode = %d!\n", pChipCap->FlgIsVcoReCalMode));
|
||||
#ifdef DOT11W_PMF_SUPPORT
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("[PMF] Encryption mode = %d\n", pChipCap->FlgPMFEncrtptMode));
|
||||
#endif /* DOT11W_PMF_SUPPORT */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
395
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/rtxx_dft.c
Normal file
395
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/chips/rtxx_dft.c
Normal file
@ -0,0 +1,395 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtxx_dft.c
|
||||
|
||||
Abstract:
|
||||
Ralink Wireless driver chip default init functions
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
|
||||
FREQUENCY_ITEM RtmpFreqItems3020[] =
|
||||
{
|
||||
/* ISM : 2.4 to 2.483 GHz, 11g */
|
||||
/*-CH---N-------R---K-----------*/
|
||||
{1, 241, 2, 2},
|
||||
{2, 241, 2, 7},
|
||||
{3, 242, 2, 2},
|
||||
{4, 242, 2, 7},
|
||||
{5, 243, 2, 2},
|
||||
{6, 243, 2, 7},
|
||||
{7, 244, 2, 2},
|
||||
{8, 244, 2, 7},
|
||||
{9, 245, 2, 2},
|
||||
{10, 245, 2, 7},
|
||||
{11, 246, 2, 2},
|
||||
{12, 246, 2, 7},
|
||||
{13, 247, 2, 2},
|
||||
{14, 248, 2, 4},
|
||||
};
|
||||
|
||||
FREQUENCY_ITEM FreqItems3020_Xtal20M[] =
|
||||
{
|
||||
/*
|
||||
* RF_R08:
|
||||
* <7:0>: pll_N<7:0>
|
||||
*
|
||||
* RF_R09:
|
||||
* <3:0>: pll_K<3:0>
|
||||
* <4>: pll_N<8>
|
||||
* <7:5>pll_N<11:9>
|
||||
*
|
||||
*/
|
||||
/*-CH---N--------R---N[7:4]K[3:0]------*/
|
||||
{1, 0xE2, 2, 0x14},
|
||||
{2, 0xE3, 2, 0x14},
|
||||
{3, 0xE4, 2, 0x14},
|
||||
{4, 0xE5, 2, 0x14},
|
||||
{5, 0xE6, 2, 0x14},
|
||||
{6, 0xE7, 2, 0x14},
|
||||
{7, 0xE8, 2, 0x14},
|
||||
{8, 0xE9, 2, 0x14},
|
||||
{9, 0xEA, 2, 0x14},
|
||||
{10, 0xEB, 2, 0x14},
|
||||
{11, 0xEC, 2, 0x14},
|
||||
{12, 0xED, 2, 0x14},
|
||||
{13, 0xEE, 2, 0x14},
|
||||
{14, 0xF0, 2, 0x18},
|
||||
};
|
||||
|
||||
UCHAR NUM_OF_3020_CHNL = (sizeof(RtmpFreqItems3020) / sizeof(FREQUENCY_ITEM));
|
||||
|
||||
FREQUENCY_ITEM *FreqItems3020 = RtmpFreqItems3020;
|
||||
|
||||
|
||||
#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)
|
||||
|
||||
/* The Tx power tuning entry*/
|
||||
const TX_POWER_TUNING_ENTRY_STRUCT TxPowerTuningTableOrg[] =
|
||||
{
|
||||
/* idxTxPowerTable Tx power control over RF Tx power control over MAC*/
|
||||
/* (zero-based array) { RF R12[4:0]: Tx0 ALC}, {MAC 0x1314~0x1324}*/
|
||||
/* 0 */ {0x00, -15},
|
||||
/* 1 */ {0x01, -15},
|
||||
/* 2 */ {0x00, -14},
|
||||
/* 3 */ {0x01, -14},
|
||||
/* 4 */ {0x00, -13},
|
||||
/* 5 */ {0x01, -13},
|
||||
/* 6 */ {0x00, -12},
|
||||
/* 7 */ {0x01, -12},
|
||||
/* 8 */ {0x00, -11},
|
||||
/* 9 */ {0x01, -11},
|
||||
/* 10 */ {0x00, -10},
|
||||
/* 11 */ {0x01, -10},
|
||||
/* 12 */ {0x00, -9},
|
||||
/* 13 */ {0x01, -9},
|
||||
/* 14 */ {0x00, -8},
|
||||
/* 15 */ {0x01, -8},
|
||||
/* 16 */ {0x00, -7},
|
||||
/* 17 */ {0x01, -7},
|
||||
/* 18 */ {0x00, -6},
|
||||
/* 19 */ {0x01, -6},
|
||||
/* 20 */ {0x00, -5},
|
||||
/* 21 */ {0x01, -5},
|
||||
/* 22 */ {0x00, -4},
|
||||
/* 23 */ {0x01, -4},
|
||||
/* 24 */ {0x00, -3},
|
||||
/* 25 */ {0x01, -3},
|
||||
/* 26 */ {0x00, -2},
|
||||
/* 27 */ {0x01, -2},
|
||||
/* 28 */ {0x00, -1},
|
||||
/* 29 */ {0x01, -1},
|
||||
/* 30 */ {0x00, 0},
|
||||
/* 31 */ {0x01, 0},
|
||||
/* 32 */ {0x02, 0},
|
||||
/* 33 */ {0x03, 0},
|
||||
/* 34 */ {0x04, 0},
|
||||
/* 35 */ {0x05, 0},
|
||||
/* 36 */ {0x06, 0},
|
||||
/* 37 */ {0x07, 0},
|
||||
/* 38 */ {0x08, 0},
|
||||
/* 39 */ {0x09, 0},
|
||||
/* 40 */ {0x0A, 0},
|
||||
/* 41 */ {0x0B, 0},
|
||||
/* 42 */ {0x0C, 0},
|
||||
/* 43 */ {0x0D, 0},
|
||||
/* 44 */ {0x0E, 0},
|
||||
/* 45 */ {0x0F, 0},
|
||||
/* 46 */ {0x0F-1, 1},
|
||||
/* 47 */ {0x0F, 1},
|
||||
/* 48 */ {0x0F-1, 2},
|
||||
/* 49 */ {0x0F, 2},
|
||||
/* 50 */ {0x0F-1, 3},
|
||||
/* 51 */ {0x0F, 3},
|
||||
/* 52 */ {0x0F-1, 4},
|
||||
/* 53 */ {0x0F, 4},
|
||||
/* 54 */ {0x0F-1, 5},
|
||||
/* 55 */ {0x0F, 5},
|
||||
/* 56 */ {0x0F-1, 6},
|
||||
/* 57 */ {0x0F, 6},
|
||||
/* 58 */ {0x0F-1, 7},
|
||||
/* 59 */ {0x0F, 7},
|
||||
/* 60 */ {0x0F-1, 8},
|
||||
/* 61 */ {0x0F, 8},
|
||||
/* 62 */ {0x0F-1, 9},
|
||||
/* 63 */ {0x0F, 9},
|
||||
/* 64 */ {0x0F-1, 10},
|
||||
/* 65 */ {0x0F, 10},
|
||||
/* 66 */ {0x0F-1, 11},
|
||||
/* 67 */ {0x0F, 11},
|
||||
/* 68 */ {0x0F-1, 12},
|
||||
/* 69 */ {0x0F, 12},
|
||||
/* 70 */ {0x0F-1, 13},
|
||||
/* 71 */ {0x0F, 13},
|
||||
/* 72 */ {0x0F-1, 14},
|
||||
/* 73 */ {0x0F, 14},
|
||||
/* 74 */ {0x0F-1, 15},
|
||||
/* 75 */ {0x0F, 15},
|
||||
};
|
||||
#endif /* RTMP_INTERNAL_TX_ALC || RTMP_TEMPERATURE_COMPENSATION */
|
||||
|
||||
|
||||
|
||||
|
||||
static VOID RxSensitivityTuning(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UCHAR R66 = 0x26 + pAd->hw_cfg.lan_gain;
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
if (ATE_ON(pAd))
|
||||
{
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_ATE */
|
||||
{
|
||||
bbp_set_agc(pAd, R66, RX_CHAIN_ALL);
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE,("turn off R17 tuning, restore to 0x%02x\n", R66));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static VOID ChipBBPAdjust(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UCHAR bbp_val;
|
||||
UINT8 rf_bw, ext_ch;
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (get_ht_cent_ch(pAd, &rf_bw, &ext_ch) == FALSE)
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
{
|
||||
rf_bw = BW_20;
|
||||
ext_ch = EXTCHA_NONE;
|
||||
pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
|
||||
}
|
||||
|
||||
bbp_set_bw(pAd, rf_bw);
|
||||
|
||||
/* TX/RX : control channel setting */
|
||||
rtmp_mac_set_ctrlch(pAd, ext_ch);
|
||||
bbp_set_ctrlch(pAd, ext_ch);
|
||||
|
||||
/* request by Gary 20070208 for middle and long range G Band*/
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (rf_bw == BW_40)
|
||||
bbp_val = (pAd->CommonCfg.Channel > 14) ? 0x48 : 0x38;
|
||||
else
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
bbp_val = (pAd->CommonCfg.Channel > 14) ? 0x40 : 0x38;
|
||||
bbp_set_agc(pAd, bbp_val, RX_CHAIN_ALL);
|
||||
|
||||
|
||||
if (pAd->MACVersion == 0x28600100)
|
||||
{
|
||||
#ifdef RT28xx
|
||||
RT28xx_ch_tunning(pAd, BW_40);
|
||||
#endif /* RT28xx */
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x12);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x10);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): BW_%s, ChannelWidth=%d, Channel=%d, ExtChanOffset=%d(%d) \n",
|
||||
__FUNCTION__, (rf_bw == BW_40 ? "40" : "20"),
|
||||
pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth,
|
||||
pAd->CommonCfg.Channel,
|
||||
pAd->CommonCfg.RegTransmitSetting.field.EXTCHA,
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset));
|
||||
|
||||
/* request by Gary 20070208 for middle and long range A Band*/
|
||||
if (pAd->CommonCfg.Channel > 14)
|
||||
bbp_val = 0x1D;
|
||||
else
|
||||
bbp_val = 0x2D;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, bbp_val);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, bbp_val);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, bbp_val);
|
||||
/*RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, bbp_val);*/
|
||||
}
|
||||
|
||||
|
||||
static VOID Default_ChipSwitchChannel(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Channel,
|
||||
IN BOOLEAN bScan)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): dummy channel switch function!\n", __FUNCTION__));
|
||||
|
||||
pAd->LatchRfRegs.Channel = Channel;
|
||||
pAd->hw_cfg.lan_gain = GET_LNA_GAIN(pAd);
|
||||
}
|
||||
|
||||
|
||||
static VOID Default_ChipAGCInit(RTMP_ADAPTER *pAd, UCHAR BandWidth)
|
||||
{
|
||||
UCHAR R66 = 0x30, lan_gain;
|
||||
|
||||
|
||||
lan_gain = pAd->hw_cfg.lan_gain;
|
||||
if (pAd->LatchRfRegs.Channel <= 14)
|
||||
{ // BG band
|
||||
{
|
||||
R66 = 0x2E + lan_gain;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ //A band
|
||||
{
|
||||
if (BandWidth == BW_20)
|
||||
R66 = (UCHAR)(0x32 + (lan_gain * 5) / 3);
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
else
|
||||
R66 = (UCHAR)(0x3A + (lan_gain * 5) / 3);
|
||||
#endif // DOT11_N_SUPPORT //
|
||||
}
|
||||
}
|
||||
bbp_set_agc(pAd, R66, RX_CHAIN_ALL);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static VOID AsicAntennaDefaultReset(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN EEPROM_ANTENNA_STRUC *pAntenna)
|
||||
{
|
||||
{
|
||||
|
||||
pAntenna->word = 0;
|
||||
pAntenna->field.RfIcType = RFIC_2820;
|
||||
pAntenna->field.TxPath = 1;
|
||||
pAntenna->field.RxPath = 2;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", pAntenna->word));
|
||||
}
|
||||
|
||||
|
||||
VOID NetDevNickNameInit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
VOID RTxx_default_Init(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
|
||||
|
||||
/* init default value whatever chipsets */
|
||||
/* default pChipOps content will be 0x00 */
|
||||
pChipCap->bbpRegTbSize = 0;
|
||||
pChipCap->MaxNumOfRfId = 31;
|
||||
pChipCap->MaxNumOfBbpId = 136;
|
||||
pChipCap->SnrFormula = SNR_FORMULA1;
|
||||
pChipCap->RfReg17WtMethod = RF_REG_WT_METHOD_NONE;
|
||||
pChipCap->TXWISize = 16;
|
||||
pChipCap->RXWISize = 16;
|
||||
#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)
|
||||
pChipCap->TxPowerTuningTable_2G = TxPowerTuningTableOrg;
|
||||
#ifdef A_BAND_SUPPORT
|
||||
pChipCap->TxPowerTuningTable_5G = TxPowerTuningTableOrg;
|
||||
#endif /* A_BAND_SUPPORT */
|
||||
#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) */
|
||||
pChipOps->AsicMacInit = NULL;
|
||||
pChipOps->AsicBbpInit = NULL;
|
||||
pChipOps->AsicRfInit = NULL;
|
||||
|
||||
#ifdef RTMP_EFUSE_SUPPORT
|
||||
pChipCap->EFUSE_USAGE_MAP_START = 0x2d0;
|
||||
pChipCap->EFUSE_USAGE_MAP_END = 0x2fc;
|
||||
pChipCap->EFUSE_USAGE_MAP_SIZE = 45;
|
||||
pChipCap->EFUSE_RESERVED_SIZE = pChipCap->EFUSE_USAGE_MAP_SIZE - 5;
|
||||
#endif /* RTMP_EFUSE_SUPPORT */
|
||||
|
||||
pChipCap->VcoPeriod = 10;
|
||||
pChipCap->FlgIsVcoReCalMode = VCO_CAL_DISABLE;
|
||||
pChipCap->WPDMABurstSIZE = 2; /* default 64B */
|
||||
pChipCap->MBSSIDMode = MBSSID_MODE0;
|
||||
|
||||
#ifdef DOT11W_PMF_SUPPORT
|
||||
pChipCap->FlgPMFEncrtptMode = PMF_ENCRYPT_MODE_0;
|
||||
#endif /* DOT11W_PMF_SUPPORT */
|
||||
|
||||
RtmpChipBcnInit(pAd);
|
||||
|
||||
pChipOps->RxSensitivityTuning = RxSensitivityTuning;
|
||||
pChipOps->ChipBBPAdjust = ChipBBPAdjust;
|
||||
pChipOps->ChipSwitchChannel = Default_ChipSwitchChannel;
|
||||
|
||||
/* TX ALC */
|
||||
pChipCap->bTempCompTxALC = FALSE;
|
||||
pChipOps->AsicGetTxPowerOffset = NULL;
|
||||
pChipOps->InitDesiredTSSITable = NULL;
|
||||
pChipOps->AsicTxAlcGetAutoAgcOffset = NULL;
|
||||
pChipOps->AsicExtraPowerOverMAC = NULL;
|
||||
pChipOps->AsicAdjustTxPower = AsicAdjustTxPower;
|
||||
|
||||
pChipOps->ChipAGCInit = Default_ChipAGCInit;
|
||||
pChipOps->AsicAntennaDefaultReset = AsicAntennaDefaultReset;
|
||||
pChipOps->NetDevNickNameInit = NetDevNickNameInit;
|
||||
/* Init value. If pChipOps->AsicResetBbpAgent==NULL, "AsicResetBbpAgent" as default. If your chipset has specific routine, please re-hook it at self init function */
|
||||
pChipOps->AsicResetBbpAgent = NULL;
|
||||
|
||||
pChipOps->InitTemperCompensation = NULL;
|
||||
pChipOps->TemperCompensation = NULL;
|
||||
|
||||
#ifdef RT28xx
|
||||
RT28xx_chip_Init(pAd);
|
||||
#endif /* RT28xx */
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
pChipCap->carrier_func = DISABLE_TONE_RADAR;
|
||||
pChipOps->ToneRadarProgram = NULL;
|
||||
#endif /* CARRIER_DETECTOIN_SUPPORT */
|
||||
#ifdef DFS_SUPPORT
|
||||
pChipCap->DfsEngineNum = 4;
|
||||
#endif /* DFS_SUPPORT */
|
||||
pChipOps->CckMrcStatusCtrl = NULL;
|
||||
pChipOps->RadarGLRTCompensate = NULL;
|
||||
}
|
||||
|
Binary file not shown.
731
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/a4_conn.c
Normal file
731
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/a4_conn.c
Normal file
@ -0,0 +1,731 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2009, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
|
||||
Module Name:
|
||||
a4_conn.c
|
||||
|
||||
Abstract:
|
||||
This is A4 connection function used to process those 4-addr of connected APClient or STA.
|
||||
Used by MWDS and MAP feature
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
*/
|
||||
#ifdef A4_CONN
|
||||
#include "rt_config.h"
|
||||
|
||||
#define ETH_TYPE_VLAN 0x8100
|
||||
#define ETH_TYPE_IPv4 0x0800
|
||||
#define ETH_TYPE_IPv6 0x86dd
|
||||
#define ETH_TYPE_ARP 0x0806
|
||||
#define ETH_TYPE_EAPOL 0x888e
|
||||
#define ETH_TYPE_WAI 0x88b4
|
||||
|
||||
BOOLEAN a4_interface_init(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN BOOLEAN is_ap,
|
||||
IN UCHAR a4_type
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
BOOLEAN add_inf = FALSE;
|
||||
|
||||
if (is_ap) {
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
if (mbss->a4_init == 0) {
|
||||
NdisAllocateSpinLock(adapter, &mbss->a4_entry_lock);
|
||||
DlListInit(&mbss->a4_entry_list);
|
||||
RoutingTabInit(adapter, if_index, ROUTING_ENTRY_A4);
|
||||
add_inf = TRUE;
|
||||
}
|
||||
mbss->a4_init |= (1 << a4_type);
|
||||
}
|
||||
#ifdef APCLI_SUPPORT
|
||||
else {
|
||||
PAPCLI_STRUCT apcli_entry;
|
||||
|
||||
if (if_index >= MAX_APCLI_NUM)
|
||||
return FALSE;
|
||||
apcli_entry = &adapter->ApCfg.ApCliTab[if_index];
|
||||
if (apcli_entry->a4_init == 0)
|
||||
add_inf = TRUE;
|
||||
apcli_entry->a4_init |= (1 << a4_type);
|
||||
}
|
||||
#else
|
||||
else
|
||||
return FALSE;
|
||||
#endif
|
||||
|
||||
if (add_inf)
|
||||
adapter->a4_interface_count++;
|
||||
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("a4_interface_init a4_interface_count: %d\n",
|
||||
adapter->a4_interface_count));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_interface_deinit(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN BOOLEAN is_ap,
|
||||
IN UCHAR a4_type
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL, pConnEntryTmp = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PMAC_TABLE_ENTRY entry = NULL;
|
||||
BOOLEAN delete_inf = FALSE;
|
||||
|
||||
if (is_ap) {
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
if (mbss->a4_init) {
|
||||
a4_entry_list = &mbss->a4_entry_list;
|
||||
DlListForEachSafe(a4_entry, pConnEntryTmp, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry) {
|
||||
entry = &adapter->MacTab.Content[a4_entry->wcid];
|
||||
a4_ap_peer_disable(adapter, entry, a4_type);
|
||||
}
|
||||
}
|
||||
|
||||
mbss->a4_init &= ~(1 << a4_type);
|
||||
if (!mbss->a4_init) {
|
||||
NdisFreeSpinLock(&mbss->a4_entry_lock);
|
||||
RoutingTabDestory(adapter, if_index, ROUTING_ENTRY_A4);
|
||||
delete_inf = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef APCLI_SUPPORT
|
||||
else {
|
||||
PAPCLI_STRUCT apcli_entry;
|
||||
|
||||
if (if_index >= MAX_APCLI_NUM)
|
||||
return FALSE;
|
||||
apcli_entry = &adapter->ApCfg.ApCliTab[if_index];
|
||||
if (apcli_entry->a4_init) {
|
||||
apcli_entry->a4_init &= ~(1 << a4_type);
|
||||
if (!apcli_entry->a4_init)
|
||||
delete_inf = TRUE;
|
||||
}
|
||||
}
|
||||
#else
|
||||
else
|
||||
return FALSE;
|
||||
#endif
|
||||
|
||||
if (delete_inf)
|
||||
adapter->a4_interface_count--;
|
||||
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("a4_interface_init a4_interface_count: %d\n",
|
||||
adapter->a4_interface_count));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT a4_get_entry_count(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index
|
||||
)
|
||||
{
|
||||
int count = 0;
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return 0;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
|
||||
if (!mbss->a4_init)
|
||||
return 0;
|
||||
|
||||
count = DlListLen(&mbss->a4_entry_list);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_lookup_entry_by_wcid(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN UCHAR wcid
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
BOOLEAN found = FALSE;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
a4_entry_list = &mbss->a4_entry_list;
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry &&
|
||||
a4_entry->valid &&
|
||||
(a4_entry->wcid == wcid)) {
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_lookup_entry_by_addr(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN PUCHAR mac_addr
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
PMAC_TABLE_ENTRY entry = NULL;
|
||||
BOOLEAN found = FALSE;
|
||||
|
||||
if ((a4_get_entry_count(adapter, if_index) == 0) ||
|
||||
(mac_addr == NULL))
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
a4_entry_list = &mbss->a4_entry_list;
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry && a4_entry->valid && VALID_WCID(a4_entry->wcid)) {
|
||||
entry = &adapter->MacTab.Content[a4_entry->wcid];
|
||||
|
||||
if (MAC_ADDR_EQUAL(mac_addr, entry->Addr)) {
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
VOID a4_add_entry(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN UCHAR wcid
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
|
||||
if (a4_lookup_entry_by_wcid(adapter, if_index, wcid))
|
||||
return;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
os_alloc_mem(adapter, (UCHAR **)&a4_entry, sizeof(A4_CONNECT_ENTRY));
|
||||
|
||||
if (a4_entry) {
|
||||
NdisZeroMemory(a4_entry, sizeof(A4_CONNECT_ENTRY));
|
||||
a4_entry->valid = 1;
|
||||
a4_entry->wcid = wcid;
|
||||
RTMP_SEM_LOCK(&mbss->a4_entry_lock);
|
||||
DlListAddTail(&mbss->a4_entry_list, &a4_entry->List);
|
||||
RTMP_SEM_UNLOCK(&mbss->a4_entry_lock);
|
||||
} else
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
|
||||
("%s: Fail to alloc memory for pNewConnEntry\n", __func__));
|
||||
}
|
||||
|
||||
|
||||
VOID a4_delete_entry(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN UCHAR wcid
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
a4_entry_list = &mbss->a4_entry_list;
|
||||
RTMP_SEM_LOCK(&mbss->a4_entry_lock);
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry &&
|
||||
a4_entry->valid &&
|
||||
(a4_entry->wcid == wcid)) {
|
||||
DlListDel(&a4_entry->List);
|
||||
os_free_mem(adapter, a4_entry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&mbss->a4_entry_lock);
|
||||
}
|
||||
|
||||
|
||||
VOID a4_proxy_delete(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN PUCHAR mac_addr
|
||||
)
|
||||
{
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return;
|
||||
|
||||
RoutingTabSetOneFree(adapter, if_index, mac_addr, ROUTING_ENTRY_A4);
|
||||
}
|
||||
|
||||
BOOLEAN a4_get_dst_ip(void *pkt, unsigned char *ip)
|
||||
{
|
||||
UCHAR *pSrcBuf;
|
||||
UINT16 TypeLen;
|
||||
UINT32 type_len_idx = 12;
|
||||
UCHAR *ip_header = NULL;
|
||||
|
||||
pSrcBuf = pkt;
|
||||
TypeLen = (pSrcBuf[type_len_idx] << 8) | pSrcBuf[type_len_idx + 1];
|
||||
while (TypeLen == ETH_TYPE_VLAN) {
|
||||
type_len_idx += 2;
|
||||
TypeLen = (pSrcBuf[type_len_idx] << 8) | pSrcBuf[type_len_idx + 1];
|
||||
}
|
||||
if (TypeLen == ETH_TYPE_IPv4) {
|
||||
ip_header = &pSrcBuf[type_len_idx + 2];
|
||||
NdisCopyMemory(ip, ip_header + 16, 4);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOLEAN a4_proxy_lookup(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN PUCHAR mac_addr,
|
||||
IN BOOLEAN update_alive_time,
|
||||
IN BOOLEAN is_rx,
|
||||
OUT UCHAR *wcid
|
||||
)
|
||||
{
|
||||
#ifdef WAPP_SUPPORT
|
||||
UINT8 ip[4] = {0};
|
||||
#endif
|
||||
|
||||
*wcid = 0;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0) {
|
||||
#ifdef WAPP_SUPPORT
|
||||
if (!is_rx && a4_get_dst_ip(mac_addr, ip))
|
||||
wapp_send_a4_entry_missing(adapter, if_index, ip);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (RoutingTabLookup(adapter, if_index, mac_addr, update_alive_time, wcid) != NULL)
|
||||
return TRUE;
|
||||
else {
|
||||
#ifdef WAPP_SUPPORT
|
||||
if (!is_rx && a4_get_dst_ip(mac_addr, ip))
|
||||
wapp_send_a4_entry_missing(adapter, if_index, ip);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID a4_proxy_update(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN UCHAR wcid,
|
||||
IN PUCHAR mac_addr,
|
||||
IN UINT32 ip /* ARP Sender IP*/
|
||||
)
|
||||
{
|
||||
UCHAR proxy_wcid = 0;
|
||||
BOOLEAN found = FALSE;
|
||||
PROUTING_ENTRY routing_entry = NULL;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return;
|
||||
|
||||
if (!VALID_WCID(wcid) || !mac_addr)
|
||||
return;
|
||||
|
||||
routing_entry = RoutingTabLookup(adapter, if_index, mac_addr, TRUE, &proxy_wcid);
|
||||
found = (routing_entry != NULL) ? TRUE : FALSE;
|
||||
|
||||
if (found) {
|
||||
if (ROUTING_ENTRY_TEST_FLAG(routing_entry, ROUTING_ENTRY_A4)) {
|
||||
/* Mean the target change to other ProxyAP */
|
||||
if (proxy_wcid != wcid) {
|
||||
RoutingTabSetOneFree(adapter, if_index, mac_addr, ROUTING_ENTRY_A4);
|
||||
routing_entry = NULL;
|
||||
found = FALSE;
|
||||
}
|
||||
} else {
|
||||
/* Assign A4 falg to this one if found. */
|
||||
SET_ROUTING_ENTRY(routing_entry, ROUTING_ENTRY_A4);
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
/* Allocate a new one if not found. */
|
||||
routing_entry = RoutingTabGetFree(adapter, if_index);
|
||||
|
||||
if (routing_entry) {
|
||||
SET_ROUTING_ENTRY(routing_entry, ROUTING_ENTRY_A4);
|
||||
RoutingEntrySet(adapter, if_index, wcid, mac_addr, routing_entry);
|
||||
}
|
||||
}
|
||||
|
||||
if (routing_entry != NULL && (ip != 0)) /* ARP Sender IP Update*/
|
||||
RoutingTabARPLookupUpdate(adapter, if_index, routing_entry, ip);
|
||||
}
|
||||
|
||||
|
||||
VOID a4_proxy_maintain(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index
|
||||
)
|
||||
{
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return;
|
||||
|
||||
RoutingTabMaintain(adapter, if_index);
|
||||
}
|
||||
|
||||
|
||||
INT a4_hard_transmit(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN struct wifi_dev *wdev,
|
||||
IN PNDIS_PACKET pkt
|
||||
)
|
||||
{
|
||||
INT ret = NDIS_STATUS_SUCCESS;
|
||||
|
||||
if (wdev->tx_pkt_handle)
|
||||
ret = wdev->tx_pkt_handle(adapter, pkt);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
PNDIS_PACKET a4_clone_packet(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PNET_DEV if_dev,
|
||||
IN PNDIS_PACKET pkt
|
||||
)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
PNDIS_PACKET pkt_clone = NULL;
|
||||
|
||||
skb = skb_copy(RTPKT_TO_OSPKT(pkt), GFP_ATOMIC);
|
||||
|
||||
if (skb) {
|
||||
skb->dev = if_dev;
|
||||
pkt_clone = OSPKT_TO_RTPKT(skb);
|
||||
}
|
||||
|
||||
return pkt_clone;
|
||||
}
|
||||
|
||||
void a4_send_clone_pkt(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN PNDIS_PACKET pkt,
|
||||
IN PUCHAR exclude_mac_addr
|
||||
)
|
||||
{
|
||||
struct wifi_dev *wdev = NULL;
|
||||
PNDIS_PACKET pkt_clone = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
PROUTING_ENTRY routing_entry = NULL;
|
||||
PMAC_TABLE_ENTRY entry = NULL;
|
||||
BOOLEAN found = FALSE;
|
||||
UCHAR wcid = 0;
|
||||
#if (defined(WH_EZ_SETUP) && defined(EZ_DUAL_BAND_SUPPORT))
|
||||
struct wifi_dev *ap_wdev = NULL;
|
||||
BOOLEAN drop_pkt_to_dup_ez_apcli = FALSE;
|
||||
#endif
|
||||
|
||||
if (!pkt)
|
||||
return;
|
||||
|
||||
if ((a4_get_entry_count(adapter, if_index) > 0)) {
|
||||
#if (defined(WH_EZ_SETUP) && defined(EZ_DUAL_BAND_SUPPORT))
|
||||
ap_wdev = &adapter->ApCfg.MBSSID[if_index].wdev;
|
||||
|
||||
#endif
|
||||
|
||||
if (exclude_mac_addr) {
|
||||
routing_entry = RoutingTabLookup(adapter, if_index, exclude_mac_addr, FALSE, &wcid);
|
||||
|
||||
if (routing_entry && ROUTING_ENTRY_TEST_FLAG(routing_entry, ROUTING_ENTRY_A4))
|
||||
found = TRUE;
|
||||
else
|
||||
found = FALSE;
|
||||
}
|
||||
|
||||
a4_entry_list = &adapter->ApCfg.MBSSID[if_index].a4_entry_list;
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry && a4_entry->valid && VALID_WCID(a4_entry->wcid)) {
|
||||
if (found && (wcid == a4_entry->wcid))
|
||||
continue;
|
||||
|
||||
entry = &adapter->MacTab.Content[a4_entry->wcid];
|
||||
wdev = entry->wdev;
|
||||
|
||||
#if (defined(WH_EZ_SETUP) && defined(EZ_DUAL_BAND_SUPPORT))
|
||||
|
||||
if ((wdev->enable_easy_setup)
|
||||
#ifdef EZ_API_SUPPORT
|
||||
&& (wdev->ez_security.ez_api_mode != CONNECTION_OFFLOAD)
|
||||
#endif
|
||||
) {
|
||||
/* todo: fill it based on ez_peer_securtity cli_duplicate info */
|
||||
if (drop_pkt_to_dup_ez_apcli && entry->link_duplicate) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
pkt_clone = a4_clone_packet(adapter, wdev->if_dev, pkt);
|
||||
if (pkt_clone == NULL) {
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
|
||||
("%s: Fail to alloc memory for pPacketClone\n", __func__));
|
||||
return;
|
||||
}
|
||||
|
||||
RTMP_SET_PACKET_WCID(pkt_clone, entry->wcid);
|
||||
RTMP_SET_PACKET_WDEV(pkt_clone, wdev->wdev_idx);
|
||||
RTMP_SET_PACKET_MOREDATA(pkt_clone, FALSE);
|
||||
/*RTMP_SET_PACKET_QUEIDX(pPacketClone, QID_AC_BE);*/
|
||||
a4_hard_transmit(adapter, wdev, pkt_clone);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_ap_peer_enable(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PMAC_TABLE_ENTRY entry,
|
||||
IN UCHAR type
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
UCHAR if_index;
|
||||
|
||||
if (!entry || !IS_ENTRY_CLIENT(entry))
|
||||
return FALSE;
|
||||
|
||||
if_index = entry->func_tb_idx;
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
#ifdef WSC_AP_SUPPORT
|
||||
if (mbss &&
|
||||
(mbss->WscControl.WscConfMode != WSC_DISABLE) &&
|
||||
(mbss->WscControl.bWscTrigger == TRUE)) {
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
|
||||
("%s fail due to wps\n", __func__));
|
||||
return FALSE;
|
||||
}
|
||||
#endif /* WSC_AP_SUPPORT */
|
||||
|
||||
if (IS_ENTRY_A4(entry) == FALSE) {
|
||||
/* To check and remove entry which is created from another side. */
|
||||
a4_proxy_delete(adapter, if_index, entry->Addr);
|
||||
a4_add_entry(adapter, if_index, entry->wcid);
|
||||
}
|
||||
|
||||
if (type > GET_ENTRY_A4(entry)) {
|
||||
SET_ENTRY_A4(entry, type);
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("SET_A4_ENTRY type:%d OK!\n", type));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_ap_peer_disable(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PMAC_TABLE_ENTRY entry,
|
||||
IN UCHAR type
|
||||
)
|
||||
{
|
||||
UCHAR if_index;
|
||||
|
||||
if (!entry || !IS_ENTRY_CLIENT(entry))
|
||||
return FALSE;
|
||||
|
||||
if_index = entry->func_tb_idx;
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return FALSE;
|
||||
|
||||
if (type == GET_ENTRY_A4(entry)) {
|
||||
SET_ENTRY_A4(entry, A4_TYPE_NONE);
|
||||
a4_delete_entry(adapter, if_index, entry->wcid);
|
||||
RoutingTabSetAllFree(adapter, if_index, entry->wcid, ROUTING_ENTRY_A4);
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,
|
||||
("a4_ap_peer_disable: Disable A4 for entry : %02x-%02x-%02x-%02x-%02x-%02x\n",
|
||||
PRINT_MAC(entry->Addr)));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
#ifdef APCLI_SUPPORT
|
||||
BOOLEAN a4_apcli_peer_enable(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PAPCLI_STRUCT apcli_entry,
|
||||
IN PMAC_TABLE_ENTRY entry,
|
||||
IN UCHAR type
|
||||
)
|
||||
{
|
||||
if (!apcli_entry || !entry || !IS_ENTRY_APCLI(entry))
|
||||
return FALSE;
|
||||
|
||||
#ifdef WSC_AP_SUPPORT
|
||||
if (((apcli_entry->WscControl.WscConfMode != WSC_DISABLE) &&
|
||||
(apcli_entry->WscControl.bWscTrigger == TRUE)))
|
||||
return FALSE;
|
||||
#endif /* WSC_AP_SUPPORT */
|
||||
|
||||
if (IS_ENTRY_A4(entry) == FALSE)
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN,
|
||||
("%s entry:%02x-%02x-%02x-%02x-%02x-%02x\n",
|
||||
__func__, PRINT_MAC(entry->Addr)));
|
||||
|
||||
if (type > GET_ENTRY_A4(entry)) {
|
||||
SET_APCLI_A4(apcli_entry, type);
|
||||
SET_ENTRY_A4(entry, type);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_apcli_peer_disable(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PAPCLI_STRUCT apcli_entry,
|
||||
IN PMAC_TABLE_ENTRY entry,
|
||||
IN UCHAR type
|
||||
)
|
||||
{
|
||||
|
||||
if (!apcli_entry || !entry)
|
||||
return FALSE;
|
||||
|
||||
if (type == GET_ENTRY_A4(entry)) {
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,
|
||||
("a4_apcli_peer_disable, Disable A4 for entry:%02x-%02x-%02x-%02x-%02x-%02x\n",
|
||||
PRINT_MAC(entry->Addr)));
|
||||
SET_APCLI_A4(apcli_entry, A4_TYPE_NONE);
|
||||
SET_ENTRY_A4(entry, A4_TYPE_NONE);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
||||
|
||||
INT Set_APProxy_Status_Show_Proc(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
POS_COOKIE obj;
|
||||
UCHAR if_index;
|
||||
INT32 i, count = 0;
|
||||
UINT32 ip_addr = 0;
|
||||
ULONG now = 0, AliveTime = 0;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
PROUTING_ENTRY routing_entry = NULL, *routing_entry_list[ROUTING_POOL_SIZE];
|
||||
UCHAR *proxy_mac_addr = NULL, proxy_ip[64];
|
||||
|
||||
obj = (POS_COOKIE) adapter->OS_Cookie;
|
||||
if_index = obj->ioctl_if;
|
||||
|
||||
if ((obj->ioctl_if_type != INT_MBSSID) && (obj->ioctl_if_type != INT_MAIN))
|
||||
return FALSE;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return TRUE;
|
||||
|
||||
a4_entry_list = &adapter->ApCfg.MBSSID[if_index].a4_entry_list;
|
||||
NdisGetSystemUpTime(&now);
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry && a4_entry->valid && VALID_WCID(a4_entry->wcid)) {
|
||||
count = 0;
|
||||
proxy_mac_addr = adapter->MacTab.Content[a4_entry->wcid].Addr;
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
|
||||
("Proxy Mac: %02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||
PRINT_MAC(proxy_mac_addr)));
|
||||
|
||||
if (GetRoutingEntryAll(adapter, if_index, a4_entry->wcid, ROUTING_ENTRY_A4,
|
||||
ROUTING_POOL_SIZE, (ROUTING_ENTRY **)&routing_entry_list, &count)) {
|
||||
for (i = 0; i < count; i++) {
|
||||
routing_entry = (PROUTING_ENTRY)routing_entry_list[i];
|
||||
|
||||
if (!routing_entry)
|
||||
continue;
|
||||
|
||||
if (routing_entry->KeepAliveTime >= now)
|
||||
AliveTime = ((routing_entry->KeepAliveTime - now) / OS_HZ);
|
||||
else
|
||||
AliveTime = 0;
|
||||
|
||||
if (routing_entry->IPAddr != 0) {
|
||||
ip_addr = routing_entry->IPAddr;
|
||||
sprintf(proxy_ip, "%d.%d.%d.%d",
|
||||
(ip_addr & 0xff),
|
||||
((ip_addr & (0xff << 8)) >> 8),
|
||||
((ip_addr & (0xff << 16)) >> 16),
|
||||
((ip_addr & (0xff << 24)) >> 24));
|
||||
} else
|
||||
strcpy(proxy_ip, "0.0.0.0");
|
||||
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
|
||||
("MAC:%02X:%02X:%02X:%02X:%02X:%02X, IP:%s, AgeOut:%lus, Retry:(%d,%d)\n",
|
||||
PRINT_MAC(routing_entry->Mac), proxy_ip, AliveTime,
|
||||
routing_entry->Retry, ROUTING_ENTRY_MAX_RETRY));
|
||||
}
|
||||
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Total Count = %d\n\n", count));
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT Set_APProxy_Refresh_Proc(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN RTMP_STRING * arg)
|
||||
{
|
||||
adapter->a4_need_refresh = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* A4_CONN */
|
1185
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/action.c
Normal file
1185
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/action.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,20 @@
|
||||
#ifdef ALL_NET_EVENT
|
||||
#include "rt_config.h"
|
||||
|
||||
void wext_send_event(PNET_DEV net_dev, const char *peer_mac_addr,
|
||||
const char *bssid, UINT32 channel, INT32 rssi, FBT_NOTIFY_E event_type)
|
||||
{
|
||||
FBT_NOTIFY_ST event_data;
|
||||
|
||||
memcpy(&event_data.FbtNotifyExtApMac, bssid, 6);
|
||||
event_data.FbtChannel = channel;
|
||||
event_data.FbtRSSI = rssi;
|
||||
|
||||
event_data.FbtNotifyType = event_type;
|
||||
memcpy(&event_data.FbtNotifyMac, peer_mac_addr, 6);
|
||||
|
||||
RtmpOSWrielessEventSend(net_dev, RT_WLAN_EVENT_CUSTOM,
|
||||
IW_ALL_NET_EVENT, NULL, (PUCHAR)&event_data, sizeof(event_data));
|
||||
|
||||
}
|
||||
#endif /* ALL_NET_EVENT */
|
2320
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/ba_action.c
Normal file
2320
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/ba_action.c
Normal file
File diff suppressed because it is too large
Load Diff
6977
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/bn_lib.c
Normal file
6977
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/bn_lib.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,192 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
client_wds.c
|
||||
|
||||
Abstract:
|
||||
*/
|
||||
|
||||
|
||||
#ifdef CLIENT_WDS
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
VOID CliWds_ProxyTabInit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT idx;
|
||||
ULONG i;
|
||||
|
||||
NdisAllocateSpinLock(pAd, &pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
os_alloc_mem(pAd, (UCHAR **)&(pAd->ApCfg.pCliWdsEntryPool), sizeof(CLIWDS_PROXY_ENTRY) * CLIWDS_POOL_SIZE);
|
||||
if (pAd->ApCfg.pCliWdsEntryPool)
|
||||
{
|
||||
NdisZeroMemory(pAd->ApCfg.pCliWdsEntryPool, sizeof(CLIWDS_PROXY_ENTRY) * CLIWDS_POOL_SIZE);
|
||||
initList(&pAd->ApCfg.CliWdsEntryFreeList);
|
||||
for (i = 0; i < CLIWDS_POOL_SIZE; i++)
|
||||
insertTailList(&pAd->ApCfg.CliWdsEntryFreeList, (RT_LIST_ENTRY *)(pAd->ApCfg.pCliWdsEntryPool + (ULONG)i));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s Fail to alloc memory for pAd->CommonCfg.pCliWdsEntryPool", __FUNCTION__));
|
||||
}
|
||||
|
||||
for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++)
|
||||
initList(&pAd->ApCfg.CliWdsProxyTb[idx]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
VOID CliWds_ProxyTabDestory(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT idx;
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
|
||||
NdisFreeSpinLock(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++)
|
||||
{
|
||||
pCliWdsEntry =
|
||||
(PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTb[idx].pHead;
|
||||
while(pCliWdsEntry)
|
||||
{
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntryNext = pCliWdsEntry->pNext;
|
||||
CliWdsEntyFree(pAd, pCliWdsEntry);
|
||||
pCliWdsEntry = pCliWdsEntryNext;
|
||||
}
|
||||
}
|
||||
|
||||
if (pAd->ApCfg.pCliWdsEntryPool)
|
||||
os_free_mem(NULL, pAd->ApCfg.pCliWdsEntryPool);
|
||||
pAd->ApCfg.pCliWdsEntryPool = NULL;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
PCLIWDS_PROXY_ENTRY CliWdsEntyAlloc(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
|
||||
RTMP_SEM_LOCK(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
pCliWdsEntry = (PCLIWDS_PROXY_ENTRY)removeHeadList(&pAd->ApCfg.CliWdsEntryFreeList);
|
||||
|
||||
RTMP_SEM_UNLOCK(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
return pCliWdsEntry;
|
||||
}
|
||||
|
||||
|
||||
VOID CliWdsEntyFree(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PCLIWDS_PROXY_ENTRY pCliWdsEntry)
|
||||
{
|
||||
RTMP_SEM_LOCK(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
insertTailList(&pAd->ApCfg.CliWdsEntryFreeList, (RT_LIST_ENTRY *)pCliWdsEntry);
|
||||
|
||||
RTMP_SEM_UNLOCK(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
UCHAR *CliWds_ProxyLookup(RTMP_ADAPTER *pAd, UCHAR *pMac)
|
||||
{
|
||||
UINT8 HashId = (*(pMac + 5) & (CLIWDS_HASH_TAB_SIZE - 1));
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
|
||||
pCliWdsEntry = (PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTb[HashId].pHead;
|
||||
while (pCliWdsEntry)
|
||||
{
|
||||
if (MAC_ADDR_EQUAL(pMac, pCliWdsEntry->Addr))
|
||||
{
|
||||
ULONG Now;
|
||||
NdisGetSystemUpTime(&Now);
|
||||
|
||||
pCliWdsEntry->LastRefTime = Now;
|
||||
if (VALID_WCID(pCliWdsEntry->Aid))
|
||||
return pAd->MacTab.Content[pCliWdsEntry->Aid].Addr;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
pCliWdsEntry = pCliWdsEntry->pNext;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
VOID CliWds_ProxyTabUpdate(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN SHORT Aid,
|
||||
IN PUCHAR pMac)
|
||||
{
|
||||
UINT8 HashId = (*(pMac + 5) & (CLIWDS_HASH_TAB_SIZE - 1));
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
|
||||
if (CliWds_ProxyLookup(pAd, pMac) != NULL)
|
||||
return;
|
||||
|
||||
pCliWdsEntry = CliWdsEntyAlloc(pAd);
|
||||
if (pCliWdsEntry)
|
||||
{
|
||||
ULONG Now;
|
||||
NdisGetSystemUpTime(&Now);
|
||||
|
||||
pCliWdsEntry->Aid = Aid;
|
||||
COPY_MAC_ADDR(&pCliWdsEntry->Addr, pMac);
|
||||
pCliWdsEntry->LastRefTime = Now;
|
||||
pCliWdsEntry->pNext = NULL;
|
||||
insertTailList(&pAd->ApCfg.CliWdsProxyTb[HashId], (RT_LIST_ENTRY *)pCliWdsEntry);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
VOID CliWds_ProxyTabMaintain(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ULONG idx;
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
ULONG Now;
|
||||
|
||||
NdisGetSystemUpTime(&Now);
|
||||
for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++)
|
||||
{
|
||||
pCliWdsEntry = (PCLIWDS_PROXY_ENTRY)(pAd->ApCfg.CliWdsProxyTb[idx].pHead);
|
||||
while(pCliWdsEntry)
|
||||
{
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntryNext = pCliWdsEntry->pNext;
|
||||
if (RTMP_TIME_AFTER(Now, pCliWdsEntry->LastRefTime + (CLI_WDS_ENTRY_AGEOUT * OS_HZ / 1000)))
|
||||
{
|
||||
delEntryList(&pAd->ApCfg.CliWdsProxyTb[idx], (RT_LIST_ENTRY *)pCliWdsEntry);
|
||||
CliWdsEntyFree(pAd, pCliWdsEntry);
|
||||
}
|
||||
pCliWdsEntry = pCliWdsEntryNext;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#endif /* CLIENT_WDS */
|
||||
|
1153
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_aes.c
Normal file
1153
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_aes.c
Normal file
File diff suppressed because it is too large
Load Diff
2771
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_cfg.c
Normal file
2771
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_cfg.c
Normal file
File diff suppressed because it is too large
Load Diff
179
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_cmd.c
Normal file
179
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_cmd.c
Normal file
@ -0,0 +1,179 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_cmd.c
|
||||
|
||||
Abstract:
|
||||
All command related API.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
Paul Lin 06-25-2004 created
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
IRQL =
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTInitializeCmdQ(
|
||||
IN PCmdQ cmdq)
|
||||
{
|
||||
cmdq->head = NULL;
|
||||
cmdq->tail = NULL;
|
||||
cmdq->size = 0;
|
||||
cmdq->CmdQState = RTMP_TASK_STAT_INITED;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
IRQL =
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTThreadDequeueCmd(
|
||||
IN PCmdQ cmdq,
|
||||
OUT PCmdQElmt *pcmdqelmt)
|
||||
{
|
||||
*pcmdqelmt = cmdq->head;
|
||||
|
||||
if (*pcmdqelmt != NULL)
|
||||
{
|
||||
cmdq->head = cmdq->head->next;
|
||||
cmdq->size--;
|
||||
if (cmdq->size == 0)
|
||||
cmdq->tail = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
IRQL =
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
NDIS_STATUS RTEnqueueInternalCmd(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN NDIS_OID Oid,
|
||||
IN PVOID pInformationBuffer,
|
||||
IN UINT32 InformationBufferLength)
|
||||
{
|
||||
NDIS_STATUS status;
|
||||
PCmdQElmt cmdqelmt = NULL;
|
||||
ULONG flag;
|
||||
|
||||
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("--->RTEnqueueInternalCmd - NIC is not exist!!\n"));
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt, sizeof(CmdQElmt));
|
||||
if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL))
|
||||
return (NDIS_STATUS_RESOURCES);
|
||||
NdisZeroMemory(cmdqelmt, sizeof(CmdQElmt));
|
||||
|
||||
if(InformationBufferLength > 0)
|
||||
{
|
||||
status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, InformationBufferLength);
|
||||
if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL))
|
||||
{
|
||||
os_free_mem(pAd, cmdqelmt);
|
||||
return (NDIS_STATUS_RESOURCES);
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength);
|
||||
cmdqelmt->bufferlength = InformationBufferLength;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cmdqelmt->buffer = NULL;
|
||||
cmdqelmt->bufferlength = 0;
|
||||
}
|
||||
|
||||
cmdqelmt->command = Oid;
|
||||
cmdqelmt->CmdFromNdis = FALSE;
|
||||
|
||||
if (cmdqelmt != NULL)
|
||||
{
|
||||
//NdisAcquireSpinLock(&pAd->CmdQLock);
|
||||
RTMP_SPIN_LOCK_IRQSAVE(&pAd->CmdQLock,&flag);
|
||||
if (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT)
|
||||
{
|
||||
EnqueueCmd((&pAd->CmdQ), cmdqelmt);
|
||||
status = NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = NDIS_STATUS_FAILURE;
|
||||
}
|
||||
//NdisReleaseSpinLock(&pAd->CmdQLock);
|
||||
RTMP_SPIN_UNLOCK_IRQRESTORE(&pAd->CmdQLock,&flag);
|
||||
|
||||
if (status == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
if (cmdqelmt->buffer)
|
||||
os_free_mem(pAd, cmdqelmt->buffer);
|
||||
os_free_mem(pAd, cmdqelmt);
|
||||
}
|
||||
else
|
||||
RTCMDUp(&pAd->cmdQTask);
|
||||
}
|
||||
return(NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
|
880
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_cs.c
Normal file
880
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_cs.c
Normal file
@ -0,0 +1,880 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_cs.c
|
||||
|
||||
Abstract:
|
||||
Carrier Sensing related functions
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
---------------------------------------------------------------------
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
static ULONG time[20];
|
||||
static ULONG idle[20];
|
||||
static ULONG busy[20];
|
||||
static ULONG cd_idx=0;
|
||||
|
||||
static void ToneRadarProgram(PRTMP_ADAPTER pAd);
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
static inline VOID CarrierDetectionResetStatus(PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if(pAd->chipCap.carrier_func == TONE_RADAR_V3)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R1, 0x3);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static inline VOID CarrierDetectionStatusGet(PRTMP_ADAPTER pAd,
|
||||
PUINT8 pStatus)
|
||||
{
|
||||
*pStatus = 0;
|
||||
|
||||
if(pAd->chipCap.carrier_func == TONE_RADAR_V3)
|
||||
{
|
||||
UINT32 mac_value = 0;
|
||||
RTMP_BBP_IO_READ32(pAd, TR_R1, &mac_value);
|
||||
*pStatus = (UINT8) mac_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_CARRIER_IO_READ8(pAd, 1, pStatus);
|
||||
}
|
||||
}
|
||||
|
||||
static inline VOID CarrierDetectionEnable(PRTMP_ADAPTER pAd,
|
||||
BOOLEAN bEnable)
|
||||
{
|
||||
if(pAd->chipCap.carrier_func == TONE_RADAR_V3)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R0, bEnable);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 0, bEnable);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Check current CS state, indicating Silient state (carrier exist) or not
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
TRUE if the current state is SILENT state, FALSE other wise
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT isCarrierDetectExist(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if (pAd->CommonCfg.CarrierDetect.CD_State == CD_SILENCE)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Enable or Disable Carrier Detection feature (AP ioctl).
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
Usage:
|
||||
1.) iwpriv ra0 set CarrierDetect=[1/0]
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierDetect_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
UCHAR apidx = pObj->ioctl_if;
|
||||
UINT Enable;
|
||||
|
||||
if (apidx != MAIN_MBSSID)
|
||||
return FALSE;
|
||||
|
||||
Enable = (UINT) simple_strtol(arg, 0, 10);
|
||||
|
||||
pAd->CommonCfg.CarrierDetect.Enable = (BOOLEAN)(Enable == 0 ? FALSE : TRUE);
|
||||
|
||||
RTMP_CHIP_RADAR_GLRT_COMPENSATE(pAd);
|
||||
RTMP_CHIP_CCK_MRC_STATUS_CTRL(pAd);
|
||||
|
||||
if (pAd->CommonCfg.CarrierDetect.Enable == TRUE)
|
||||
CarrierDetectionStart(pAd);
|
||||
else
|
||||
CarrierDetectionStop(pAd);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s:: %s\n", __FUNCTION__,
|
||||
pAd->CommonCfg.CarrierDetect.Enable == TRUE ? "Enable Carrier Detection":"Disable Carrier Detection"));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
When h/w interrupt is not available for CS, this function monitor necessary parameters that determine the CS
|
||||
state periodically. (every 100ms)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID CarrierDetectionPeriodicStateCtrl(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;
|
||||
CD_STATE *pCD_State = &pCarrierDetect->CD_State;
|
||||
ULONG *pOneSecIntCount = &pCarrierDetect->OneSecIntCount;
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
/* Nothing to do in ATE mode */
|
||||
if (ATE_ON(pAd))
|
||||
return;
|
||||
#endif /* CONFIG_ATE */
|
||||
|
||||
// TODO: shiang-7603
|
||||
if (pAd->chipCap.hif_type == HIF_MT) {
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s(%d): Not support for HIF_MT yet!\n",
|
||||
__FUNCTION__, __LINE__));
|
||||
return;
|
||||
}
|
||||
|
||||
if (pCarrierDetect->bCsInit == FALSE)
|
||||
return;
|
||||
|
||||
if (pAd->chipCap.carrier_func == TONE_RADAR_V3)
|
||||
{
|
||||
UINT8 TrStatus = 0;
|
||||
|
||||
CarrierDetectionStatusGet(pAd, &TrStatus);
|
||||
if (TrStatus)
|
||||
{
|
||||
if (*pCD_State == CD_NORMAL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("Carrier Detected ! (TrStatus = 0x%x)\n", TrStatus));
|
||||
*pCD_State = CD_SILENCE;
|
||||
/* stop all TX actions including Beacon sending.*/
|
||||
AsicDisableSync(pAd);
|
||||
}
|
||||
*pOneSecIntCount = pCarrierDetect->CarrierGoneThreshold;
|
||||
CarrierDetectionResetStatus(pAd);
|
||||
|
||||
}
|
||||
else
|
||||
*pOneSecIntCount = 0;
|
||||
|
||||
/*CarrierDetectionResetStatus(pAd);*/
|
||||
}
|
||||
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
|
||||
if (pAd->chipCap.carrier_func == TONE_RADAR_V2)
|
||||
{
|
||||
CARRIER_DETECT_PARAM CarrDetectParam;
|
||||
|
||||
/* tell firmware to prepare Recheck and RadarToneCount */
|
||||
AsicSendCommandToMcu(pAd, CD_CHECKOUT_MCU_CMD, 0xff, 0x00, 0x00, FALSE);
|
||||
/* Debug */
|
||||
if (pAd->CommonCfg.CarrierDetect.Debug == RT_DEBUG_TRACE)
|
||||
{
|
||||
CARRIER_DETECT_DEBUG CarrDetectDebug;
|
||||
RTUSBMultiRead(pAd, 0x4CB0, (PUCHAR) &CarrDetectDebug, sizeof(CarrDetectDebug));
|
||||
printk("delta_div = 0x%02X, rRadarToneCount = %u, Recheck = %u, Criteria = %u, Threshold = 0x%08X, VGA_Mask = 0x%04X\n",
|
||||
CarrDetectDebug.delta_div,
|
||||
CarrDetectDebug.RadarToneCount,
|
||||
CarrDetectDebug.ReCheck,
|
||||
CarrDetectDebug.Criteria << 6, /* ms -> 16us*/
|
||||
CarrDetectDebug.Threshold,
|
||||
CarrDetectDebug.VGA_Mask);
|
||||
}
|
||||
|
||||
RTUSBMultiRead(pAd, RADAR_TONE_COUNT, (PUCHAR) &CarrDetectParam, sizeof(CarrDetectParam));
|
||||
switch(*pCD_State)
|
||||
{
|
||||
case CD_NORMAL:
|
||||
if (CarrDetectParam.ReCheck == 0)
|
||||
{
|
||||
*pCD_State = CD_SILENCE;
|
||||
if (pAd->CommonCfg.CarrierDetect.Debug != RT_DEBUG_TRACE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Carrier Detected\n"));
|
||||
|
||||
/* stop all TX actions including Beacon sending.*/
|
||||
AsicDisableSync(pAd);
|
||||
}
|
||||
else
|
||||
printk("Carrier Detected\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CD_SILENCE:
|
||||
*pOneSecIntCount += CarrDetectParam.RadarToneCount;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
When there is no f/w taking care of CS operation, this function depends on h/w interrupts for every possible carrier
|
||||
tone to judge the CS state
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID RTMPHandleRadarInterrupt(PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UINT32 value, delta;
|
||||
UCHAR bbp=0;
|
||||
PCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;
|
||||
|
||||
if (pAd->chipCap.carrier_func > TONE_RADAR_V2)
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RTMPHandleRadarInterrupt()\n"));
|
||||
RTMP_IO_READ32(pAd, PBF_LIFE_TIMER, &value);
|
||||
RTMP_IO_READ32(pAd, CH_IDLE_STA, &pCarrierDetect->idle_time);
|
||||
pCarrierDetect->busy_time = AsicGetChBusyCnt(pAd, 0);
|
||||
delta = (value >> 4) - pCarrierDetect->TimeStamp;
|
||||
pCarrierDetect->TimeStamp = value >> 4;
|
||||
pCarrierDetect->OneSecIntCount++;
|
||||
|
||||
if(pAd->chipCap.carrier_func==TONE_RADAR_V2)
|
||||
{
|
||||
#ifdef RTMP_BBP
|
||||
CarrierDetectionStatusGet(pAd, &bbp);
|
||||
if (!(bbp & 0x1))
|
||||
return;
|
||||
else
|
||||
#endif /* RTMP_BBP */
|
||||
{
|
||||
UINT32 RadarInt = 0;
|
||||
#ifdef RLT_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RLT)
|
||||
RadarInt = RLT_RadarInt;
|
||||
#endif /* RLT_MAC*/
|
||||
#ifdef RTMP_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RTMP)
|
||||
RadarInt = RTMP_RadarInt;
|
||||
#endif /* RTMP_MAC */
|
||||
/* Disable carrier detection and clear the status bit*/
|
||||
CarrierDetectionEnable(pAd, 0);
|
||||
CarrierDetectionResetStatus(pAd);
|
||||
/* Clear interrupt */
|
||||
RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, RadarInt);
|
||||
}
|
||||
}
|
||||
|
||||
if (pCarrierDetect->Debug)
|
||||
{
|
||||
if (cd_idx < 20)
|
||||
{
|
||||
time[cd_idx] = delta;
|
||||
idle[cd_idx] = pCarrierDetect->idle_time;
|
||||
busy[cd_idx] = pCarrierDetect->busy_time;
|
||||
cd_idx++;
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
pCarrierDetect->Debug = 0;
|
||||
for (i = 0; i < 20; i++)
|
||||
{
|
||||
printk("%3d %4ld %ld %ld\n", i, time[i], idle[i], busy[i]);
|
||||
}
|
||||
cd_idx = 0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (pCarrierDetect->CD_State == CD_NORMAL)
|
||||
{
|
||||
if ((delta < pCarrierDetect->criteria) && (pCarrierDetect->recheck))
|
||||
pCarrierDetect->recheck --;
|
||||
else
|
||||
pCarrierDetect->recheck = pCarrierDetect->recheck1;
|
||||
|
||||
if (pCarrierDetect->recheck == 0)
|
||||
{
|
||||
/* declare carrier sense*/
|
||||
pCarrierDetect->CD_State = CD_SILENCE;
|
||||
|
||||
if (pCarrierDetect->Debug != RT_DEBUG_TRACE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Carrier Detected\n"));
|
||||
|
||||
/* stop all TX actions including Beacon sending.*/
|
||||
AsicDisableSync(pAd);
|
||||
}
|
||||
else
|
||||
{
|
||||
printk("Carrier Detected\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(pAd->chipCap.carrier_func == TONE_RADAR_V2)
|
||||
{
|
||||
CarrierDetectionStatusGet(pAd, &bbp);
|
||||
|
||||
if (bbp & 0x1)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("CS bit not cleared!!!\n"));
|
||||
CarrierDetectionResetStatus(pAd);
|
||||
}
|
||||
/* re-enable carrier detection */
|
||||
CarrierDetectionEnable(pAd, 1);
|
||||
}
|
||||
else if(pAd->chipCap.carrier_func == TONE_RADAR_V1 &&
|
||||
pCarrierDetect->Enable)
|
||||
{
|
||||
ToneRadarProgram(pAd);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Reset CS state to NORMAL state.
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT CarrierDetectReset(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.CD_State = CD_NORMAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Criteria in CS is a timing difference threshold for a pair of carrier tones. This function is a ioctl uesed to adjust the
|
||||
Criteria. (unit: 16us)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierCriteria_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
UINT32 Value;
|
||||
|
||||
Value = simple_strtol(arg, 0, 10);
|
||||
|
||||
pAd->CommonCfg.CarrierDetect.criteria = Value;
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
{
|
||||
USHORT sVal = (USHORT) (Value >> 6); /* convert unit from 16us to ms:(2^4 /2^10) */
|
||||
RTUSBMultiWrite(pAd, CD_CRITERIA, (PUCHAR) &sVal, 2, FALSE);
|
||||
/* send enable cmd to mcu to take effect */
|
||||
AsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);
|
||||
}
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
ReCheck in CS is a value indicating how many continuous incoming carrier tones is enough us to announce that there
|
||||
is carrier tone (and hence enter SILENT state). This function is a ioctl uesed to adjust the ReCheck value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierReCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.recheck1 = simple_strtol(arg, 0, 10);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Set Recheck = %u\n", pAd->CommonCfg.CarrierDetect.recheck1));
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
RTMP_IO_WRITE8(pAd, CD_CHECK_COUNT, pAd->CommonCfg.CarrierDetect.recheck1);
|
||||
/* send enable cmd to mcu to take effect */
|
||||
AsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
CarrierGoneThreshold is used to determine whether we should leave SILENT state. When the number of carrier
|
||||
tones in a certain period of time is less than CarrierGoneThreshold, we should return to NORMAL state. This function
|
||||
is a ioctl uesed to adjust the CarrierGoneThreshold.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierGoneThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.CarrierGoneThreshold = simple_strtol(arg, 0, 10);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Set CarrierGoneThreshold = %u\n", pAd->CommonCfg.CarrierDetect.CarrierGoneThreshold));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Setting up the carrier debug level. set 0 means to turning off the carrier debug
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierDebug_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.Debug = simple_strtol(arg, 0, 10);
|
||||
printk("pAd->CommonCfg.CarrierDetect.Debug = %ld\n", pAd->CommonCfg.CarrierDetect.Debug);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Delta control the delay line characteristic of the cross correlation energy calculation.
|
||||
This function is a ioctl uesed to adjust the Delta value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierDelta_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.delta = simple_strtol(arg, 0, 10);
|
||||
printk("Delta = %d\n", pAd->CommonCfg.CarrierDetect.delta);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To set ON/OFF of the "Not Divide Flag"
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierDivFlag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.div_flag = simple_strtol(arg, 0, 10);
|
||||
printk("DivFlag = %d\n", pAd->CommonCfg.CarrierDetect.div_flag);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Carrier Threshold is the energy threshold for h/w to determine a carrier tone or not.
|
||||
This function is a ioctl uesed to adjust the Threshold value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierThrd_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.threshold = simple_strtol(arg, 0, 10);
|
||||
printk("CarrThrd = %d(0x%x)\n", pAd->CommonCfg.CarrierDetect.threshold, pAd->CommonCfg.CarrierDetect.threshold);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Carrier SymRund is the number of round bits in Radar Symmetric Round Bits Option.
|
||||
This function is a ioctl uesed to adjust the SymRund. (unit: bit)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierSymRund_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.SymRund= simple_strtol(arg, 0, 10);
|
||||
printk("SymRund = %d\n", pAd->CommonCfg.CarrierDetect.SymRund);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Carrier Masks are used to prevent false trigger while doing Rx_PE, Packet_End, and AGC tuning.
|
||||
This function is a ioctl uesed to adjust these three mask. (unit: 100ns)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierMask_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.VGA_Mask = simple_strtol(arg, 0, 10);
|
||||
pAd->CommonCfg.CarrierDetect.Packet_End_Mask = simple_strtol(arg, 0, 10);
|
||||
pAd->CommonCfg.CarrierDetect.Rx_PE_Mask = simple_strtol(arg, 0, 10);
|
||||
printk("CarrMask = %u(%x)\n", pAd->CommonCfg.CarrierDetect.VGA_Mask, pAd->CommonCfg.CarrierDetect.VGA_Mask);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Initialize CS parameters.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID CSInit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;
|
||||
|
||||
pCarrierDetect->TimeStamp = 0;
|
||||
pCarrierDetect->recheck = pCarrierDetect->recheck1;
|
||||
pCarrierDetect->OneSecIntCount = 0;
|
||||
pCarrierDetect->bCsInit = FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To trigger CS start
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID CarrierDetectionStart(PRTMP_ADAPTER pAd)
|
||||
{
|
||||
/*ULONG Value;*/
|
||||
/* Enable Bandwidth usage monitor*/
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("CarrierDetectionStart\n"));
|
||||
/*RTMP_IO_READ32(pAd, CH_TIME_CFG, &Value);*/
|
||||
/*RTMP_IO_WRITE32(pAd, CH_TIME_CFG, Value | 0x1f); */
|
||||
|
||||
/* Init Carrier Detect*/
|
||||
if (pAd->CommonCfg.CarrierDetect.Enable)
|
||||
{
|
||||
CSInit(pAd);
|
||||
ToneRadarProgram(pAd);
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
{
|
||||
USHORT criteria = (USHORT) (pAd->CommonCfg.CarrierDetect.criteria >> 6); /* convert unit from 16us to 1ms:(2^4 /2^10) */
|
||||
RTUSBMultiWrite(pAd, CD_CRITERIA, (PUCHAR) &criteria, 2, FALSE);
|
||||
RTMP_IO_WRITE8(pAd, CD_CHECK_COUNT, pAd->CommonCfg.CarrierDetect.recheck1);
|
||||
AsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);
|
||||
}
|
||||
#else
|
||||
#ifndef MT760x
|
||||
/* trun on interrupt polling for pcie device */
|
||||
if (pAd->infType == RTMP_DEV_INF_PCIE)
|
||||
AsicSendCommandToMcu(pAd, CD_INT_POLLING_CMD, 0xff, 0x01, 0x00, FALSE);
|
||||
#endif /* MT760x */
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
pAd->CommonCfg.CarrierDetect.bCsInit = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To stop CS
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID CarrierDetectionStop(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
CarrierDetectReset(pAd);
|
||||
CarrierDetectionEnable(pAd, 0);
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
/* Stop firmware CS action */
|
||||
AsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x00, 0x00, FALSE);
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To program CS related BBP registers (CS initialization)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
static VOID ToneRadarProgram(PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ULONG threshold;
|
||||
/* if wireless mode is 20Mhz mode, then the threshold should div by 2 */
|
||||
if (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_20)
|
||||
threshold = pAd->CommonCfg.CarrierDetect.threshold >> 1;
|
||||
else
|
||||
threshold = pAd->CommonCfg.CarrierDetect.threshold;
|
||||
/* Call ToneRadarProgram_v1/ToneRadarProgram_v2*/
|
||||
RTMP_CHIP_CARRIER_PROGRAM(pAd, threshold);
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To program CS v1 related BBP registers (CS initialization)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID ToneRadarProgram_v1(PRTMP_ADAPTER pAd, ULONG threshold)
|
||||
{
|
||||
UCHAR bbp;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ToneRadarProgram v1\n"));
|
||||
/* programe delta delay & division bit*/
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0xf0);
|
||||
bbp = pAd->CommonCfg.CarrierDetect.delta << 4;
|
||||
bbp |= (pAd->CommonCfg.CarrierDetect.div_flag & 0x1) << 3;
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, bbp);
|
||||
|
||||
/* program threshold*/
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x34);
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, (threshold & 0xff000000) >> 24);
|
||||
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x24);
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, (threshold & 0xff0000) >> 16);
|
||||
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x14);
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, (threshold & 0xff00) >> 8);
|
||||
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x04);
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, threshold & 0xff);
|
||||
|
||||
/* ToneRadarEnable v1 */
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x05);
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To program CS v2 related BBP registers (CS initialization)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID ToneRadarProgram_v2(PRTMP_ADAPTER pAd, ULONG threshold)
|
||||
{
|
||||
UCHAR bbp;
|
||||
|
||||
/* programe delta delay & division bit*/
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ToneRadarProgram v2\n"));
|
||||
bbp = pAd->CommonCfg.CarrierDetect.delta | \
|
||||
((pAd->CommonCfg.CarrierDetect.SymRund & 0x3) << 4) | \
|
||||
((pAd->CommonCfg.CarrierDetect.div_flag & 0x1) << 6) | \
|
||||
0x80; /* Full 40MHz Detection Mode */
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 5, bbp);
|
||||
|
||||
/* program *_mask*/
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 2, pAd->CommonCfg.CarrierDetect.VGA_Mask);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 3, pAd->CommonCfg.CarrierDetect.Packet_End_Mask);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 4, pAd->CommonCfg.CarrierDetect.Rx_PE_Mask);
|
||||
|
||||
/* program threshold*/
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 6, threshold & 0xff);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 7, (threshold & 0xff00) >> 8);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 8, (threshold & 0xff0000) >> 16);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 9, (threshold & 0xff000000) >> 24);
|
||||
|
||||
/* ToneRadarEnable v2 */
|
||||
CarrierDetectionEnable(pAd, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To program CS v3 related BBP registers (CS initialization)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID ToneRadarProgram_v3(PRTMP_ADAPTER pAd, ULONG threshold)
|
||||
{
|
||||
/*
|
||||
Carrier Sense (Tone Radar) BBP initialization
|
||||
(MT7650 Carrier sense programming guide_v1_20120824.docx)
|
||||
*/
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ToneRadarProgram v3\n"));
|
||||
CarrierDetectionEnable(pAd, 0);
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R2, 0x002d002d);
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R3, 0x0003002d);
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R5, 0x80000000);
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R6, 0x80100000);
|
||||
CarrierDetectionEnable(pAd, 1);
|
||||
}
|
||||
|
||||
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
|
5293
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_data.c
Normal file
5293
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_data.c
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,147 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of MediaTek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of MediaTek, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_data_sdio.c
|
||||
*/
|
||||
|
||||
|
||||
#include "rt_config.h"
|
||||
#include "rtmp.h"
|
||||
|
||||
|
||||
|
||||
USHORT MtSDIO_WriteSubTxResource(struct _RTMP_ADAPTER *pAd, struct _TX_BLK *pTxBlk, BOOLEAN bIsLast, USHORT *freeCnt)
|
||||
{
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
USHORT MtSDIO_WriteFragTxResource(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
UCHAR fragNum,
|
||||
USHORT *freeCnt)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
USHORT MtSDIO_WriteSingleTxResource(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
BOOLEAN bIsLast,
|
||||
USHORT *freeCnt)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
USHORT MtSDIO_WriteMultiTxResource(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
UCHAR frmNum,
|
||||
USHORT *freeCnt)
|
||||
{
|
||||
NDIS_STATUS Status = 0;
|
||||
|
||||
return(Status);
|
||||
}
|
||||
|
||||
|
||||
VOID MtSDIO_FinalWriteTxResource(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
USHORT totalMPDUSize,
|
||||
USHORT TxIdx)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID MtSDIODataLastTxIdx(
|
||||
RTMP_ADAPTER *pAd,
|
||||
UCHAR QueIdx,
|
||||
USHORT TxIdx)
|
||||
{
|
||||
/* DO nothing for USB.*/
|
||||
}
|
||||
|
||||
|
||||
VOID MtSDIODataKickOut(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
UCHAR QueIdx)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int MtSDIOMgmtKickOut(
|
||||
RTMP_ADAPTER *pAd,
|
||||
UCHAR QueIdx,
|
||||
PNDIS_PACKET pPacket,
|
||||
UCHAR *pSrcBufVA,
|
||||
UINT SrcBufLen)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
PNDIS_PACKET GetPacketFromRxRing(
|
||||
RTMP_ADAPTER *pAd,
|
||||
RX_BLK *pRxBlk,
|
||||
BOOLEAN *pbReschedule,
|
||||
UINT32 *pRxPending,
|
||||
UCHAR RxRingNo)
|
||||
|
||||
{
|
||||
UINT8 RXWISize = pAd->chipCap.RXWISize;
|
||||
UINT8 rx_hw_hdr_len = pAd->chipCap.RXWISize;
|
||||
PNDIS_PACKET pRxPacket = pAd->SDIORxPacket;
|
||||
PUCHAR buf = GET_OS_PKT_DATAPTR(pRxPacket);
|
||||
UINT32 len=GET_OS_PKT_LEN(pRxPacket);
|
||||
UINT32 i;
|
||||
|
||||
pRxBlk->Flags = 0;
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s===========start\n",__FUNCTION__));
|
||||
if(!pRxPacket){
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s=====return NULL !!!!!\n",__FUNCTION__));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for(i=0;i<len;i++){
|
||||
// printk("%x,",*(buf+i));
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%x",*(buf+i)));
|
||||
}
|
||||
printk("before parse_rx_packet_type \n");
|
||||
|
||||
|
||||
rx_hw_hdr_len = parse_rx_packet_type(pAd, pRxBlk, pRxPacket);
|
||||
|
||||
if (rx_hw_hdr_len == 0)
|
||||
{
|
||||
pRxBlk->DataSize = 0;
|
||||
}
|
||||
if (RX_BLK_TEST_FLAG(pRxBlk, fRX_CMD_RSP))
|
||||
{
|
||||
RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pRxBlk->pRxPacket = pRxPacket;
|
||||
pRxBlk->pData = (UCHAR *)GET_OS_PKT_DATAPTR(pRxPacket);
|
||||
pRxBlk->pHeader = (HEADER_802_11 *)(pRxBlk->pData);
|
||||
|
||||
return pRxPacket;
|
||||
}
|
||||
|
2677
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_dfs.c
Normal file
2677
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_dfs.c
Normal file
File diff suppressed because it is too large
Load Diff
9797
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_info.c
Normal file
9797
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_info.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,32 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2009, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_loft_cal.c
|
||||
|
||||
Abstract:
|
||||
Tx LOFT calibration and profile related functions
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
3274
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_mac_pci.c
Normal file
3274
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_mac_pci.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,170 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
VOID RT28xx_UpdateBeaconToAsic(
|
||||
RTMP_ADAPTER *pAd,
|
||||
INT apidx,
|
||||
ULONG FrameLen,
|
||||
ULONG UpdatePos)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID RTMPResetTxRxRingMemory(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
VOID RTMPFreeTxRxRingMemory(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UINT32 Index;
|
||||
|
||||
for (Index = 0; Index < NUM_OF_TX_RING; Index++)
|
||||
{
|
||||
NdisFreeSpinLock(&SDIOTxPacketListLock[Index]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS RTMPAllocTxRxRingMemory(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
|
||||
INT32 Index;
|
||||
ULONG ErrorValue = 0;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("-->RTMPAllocTxRxRingMemory\n"));
|
||||
|
||||
|
||||
for (Index = 0; Index < NUM_OF_TX_RING; Index++)
|
||||
{
|
||||
NdisAllocateSpinLock(pAd, &pAd->SDIOTxPacketListLock[Index]);
|
||||
}
|
||||
|
||||
/* Alloc MGMT ring desc buffer except Tx ring allocated eariler */
|
||||
|
||||
|
||||
/* Alloc Beacon ring desc buffer */
|
||||
|
||||
/* Allocate Tx ring descriptor's memory (BMC)*/
|
||||
|
||||
/* Alloc RX ring desc memory except Tx ring allocated eariler */
|
||||
|
||||
|
||||
|
||||
DBGPRINT_S(("<-- RTMPAllocTxRxRingMemory, Status=%x\n", Status));
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS RTMPInitTxRxRingMemory(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
NDIS_STATUS Status;
|
||||
UINT32 Index;
|
||||
unsigned long Flags;
|
||||
|
||||
for (Index = 0; Index < NUM_OF_TX_RING; Index++)
|
||||
{
|
||||
/*
|
||||
* (5 TX rings = 4 ACs + 1 HCCA)
|
||||
*/
|
||||
RTMP_SPIN_LOCK_IRQSAVE(&pAd->SDIOTxPacketListLock[Index], &Flags);
|
||||
DlListInit(&pAd->SDIOTxPacketList[Index]);
|
||||
RTMP_SPIN_UNLOCK_IRQRESTORE(&pAd->SDIOTxPacketListLock[Index], &Flags);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Disable DMA.
|
||||
|
||||
Arguments:
|
||||
*pAd the raxx interface data pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28XXDMADisable(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
/* no use*/
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Enable DMA.
|
||||
|
||||
Arguments:
|
||||
*pAd the raxx interface data pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28XXDMAEnable(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* SDIO Radio on/off Related functions.
|
||||
*
|
||||
********************************************************************/
|
||||
VOID RT28xxSdioMlmeRadioOn(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xxSdioMlmeRadioOFF(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xxSdioAsicRadioOff(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("--> %s\n", __FUNCTION__));
|
||||
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<== %s\n", __FUNCTION__));
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xxSdioAsicRadioOn(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
/* make some traffic to invoke EvtDeviceD0Entry callback function*/
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<== %s\n", __FUNCTION__));
|
||||
}
|
||||
|
||||
|
474
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_mat.c
Normal file
474
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_mat.c
Normal file
@ -0,0 +1,474 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_mat.c
|
||||
|
||||
Abstract:
|
||||
Support Mac Address Translation function.
|
||||
|
||||
Note:
|
||||
MAC Address Translation(MAT) engine subroutines, we should just take care
|
||||
packet to bridge.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------------- ---------- ----------------------------------------------
|
||||
Shiang 02-26-2007 Init version
|
||||
*/
|
||||
|
||||
#ifdef MAT_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
extern MATProtoOps MATProtoIPHandle;
|
||||
extern MATProtoOps MATProtoARPHandle;
|
||||
extern MATProtoOps MATProtoPPPoEDisHandle;
|
||||
extern MATProtoOps MATProtoPPPoESesHandle;
|
||||
extern MATProtoOps MATProtoIPv6Handle;
|
||||
|
||||
extern UCHAR SNAP_802_1H[];
|
||||
extern UCHAR SNAP_BRIDGE_TUNNEL[];
|
||||
|
||||
#define MAX_MAT_NODE_ENTRY_NUM 128 /* We support maximum 128 node entry for our system */
|
||||
#define MAT_NODE_ENTRY_SIZE 40 /*28 // bytes //change to 40 for IPv6Mac Table */
|
||||
|
||||
typedef struct _MATNodeEntry
|
||||
{
|
||||
UCHAR data[MAT_NODE_ENTRY_SIZE];
|
||||
struct _MATNodeEntry *next;
|
||||
}MATNodeEntry, *PMATNodeEntry;
|
||||
|
||||
|
||||
#ifdef KMALLOC_BATCH
|
||||
/*static MATNodeEntry *MATNodeEntryPoll = NULL; */
|
||||
#endif
|
||||
|
||||
static MATProtoTable MATProtoTb[]=
|
||||
{
|
||||
{ETH_P_IP, &MATProtoIPHandle}, /* IP handler */
|
||||
{ETH_P_ARP, &MATProtoARPHandle}, /* ARP handler */
|
||||
{ETH_P_PPP_DISC, &MATProtoPPPoEDisHandle}, /* PPPoE discovery stage handler */
|
||||
{ETH_P_PPP_SES, &MATProtoPPPoESesHandle}, /* PPPoE session stage handler */
|
||||
{ETH_P_IPV6, &MATProtoIPv6Handle}, /* IPv6 handler */
|
||||
};
|
||||
|
||||
#define MAX_MAT_SUPPORT_PROTO_NUM (sizeof(MATProtoTb)/sizeof(MATProtoTable))
|
||||
|
||||
|
||||
/* --------------------------------- Public Function-------------------------------- */
|
||||
NDIS_STATUS MATDBEntryFree(
|
||||
IN MAT_STRUCT *pMatStruct,
|
||||
IN PUCHAR NodeEntry)
|
||||
{
|
||||
#ifdef KMALLOC_BATCH
|
||||
MATNodeEntry *pPtr, *pMATNodeEntryPoll;
|
||||
|
||||
pMATNodeEntryPoll = (MATNodeEntry *)pAd->MatCfg.MATNodeEntryPoll;
|
||||
pPtr = (MATNodeEntry *)NodeEntry;
|
||||
NdisZeroMemory(pPtr, sizeof(MATNodeEntry));
|
||||
if (pMATNodeEntryPoll->next)
|
||||
{
|
||||
pPtr->next = pMATNodeEntryPoll->next;
|
||||
pMATNodeEntryPoll->next = pPtr;
|
||||
} else {
|
||||
pMATNodeEntryPoll->next = pPtr;
|
||||
}
|
||||
#else
|
||||
os_free_mem(NULL, NodeEntry);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
PUCHAR MATDBEntryAlloc(IN MAT_STRUCT *pMatStruct, IN UINT32 size)
|
||||
{
|
||||
#ifdef KMALLOC_BATCH
|
||||
MATNodeEntry *pPtr = NULL, *pMATNodeEntryPoll;
|
||||
pMATNodeEntryPoll = (MATNodeEntry *)pMatStruct->pMATNodeEntryPoll;
|
||||
|
||||
if (pMATNodeEntryPoll->next)
|
||||
{
|
||||
pPtr = pMATNodeEntryPoll->next;
|
||||
pMATNodeEntryPoll->next = pPtr->next;
|
||||
}
|
||||
|
||||
#else
|
||||
UCHAR *pPtr = NULL;
|
||||
|
||||
if (pMatStruct->nodeCount >= 128)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
os_alloc_mem(NULL, (PUCHAR *)&pPtr, size);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return (PUCHAR)pPtr;
|
||||
}
|
||||
|
||||
|
||||
VOID dumpPkt(PUCHAR pHeader, int len)
|
||||
{
|
||||
|
||||
#ifdef DBG
|
||||
int i;
|
||||
RTMP_STRING *tmp;
|
||||
|
||||
tmp = (RTMP_STRING *)pHeader;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("--StartDump\n"));
|
||||
for(i=0;i<len; i++)
|
||||
{
|
||||
if ( (i%16==0) && (i!=0))
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%02x ", tmp[i]& 0xff));
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n--EndDump\n"));
|
||||
#endif /* DBG */
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
For each out-going packet, check the upper layer protocol type if need
|
||||
to handled by our APCLI convert engine. If yes, call corresponding handler
|
||||
to handle it.
|
||||
|
||||
Arguments:
|
||||
pAd =>Pointer to our adapter
|
||||
pPkt =>pointer to the 802.11 header of outgoing packet
|
||||
ifIdx =>Interface Index want to dispatch to.
|
||||
|
||||
Return Value:
|
||||
Success =>
|
||||
TRUE
|
||||
Mapped mac address if found, else return specific default mac address
|
||||
depends on the upper layer protocol type.
|
||||
Error =>
|
||||
FALSE.
|
||||
|
||||
Note:
|
||||
1.the pPktHdr must be a 802.3 packet.
|
||||
2.Maybe we need a TxD arguments?
|
||||
3.We check every packet here including group mac address becasue we need to
|
||||
handle DHCP packet.
|
||||
========================================================================
|
||||
*/
|
||||
PUCHAR MATEngineTxHandle(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PNDIS_PACKET pPkt,
|
||||
IN UINT ifIdx,
|
||||
IN UCHAR OpMode)
|
||||
{
|
||||
PUCHAR pLayerHdr = NULL, pPktHdr = NULL, pMacAddr = NULL;
|
||||
UINT16 protoType, protoType_ori;
|
||||
INT i;
|
||||
struct _MATProtoOps *pHandle = NULL;
|
||||
PUCHAR retSkb = NULL;
|
||||
BOOLEAN bVLANPkt = FALSE;
|
||||
|
||||
|
||||
if(pAd->MatCfg.status != MAT_ENGINE_STAT_INITED)
|
||||
return NULL;
|
||||
|
||||
pPktHdr = GET_OS_PKT_DATAPTR(pPkt);
|
||||
if (!pPktHdr)
|
||||
return NULL;
|
||||
|
||||
protoType_ori = get_unaligned((PUINT16)(pPktHdr + 12));
|
||||
|
||||
/* Get the upper layer protocol type of this 802.3 pkt. */
|
||||
protoType = OS_NTOHS(protoType_ori);
|
||||
|
||||
/* handle 802.1q enabled packet. Skip the VLAN tag field to get the protocol type. */
|
||||
if (protoType == 0x8100)
|
||||
{
|
||||
protoType_ori = get_unaligned((PUINT16)(pPktHdr + 12 + 4));
|
||||
protoType = OS_NTOHS(protoType_ori);
|
||||
bVLANPkt = TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* For differnet protocol, dispatch to specific handler */
|
||||
for (i=0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
if (protoType == MATProtoTb[i].protocol)
|
||||
{
|
||||
pHandle = MATProtoTb[i].pHandle; /* the pHandle must not be null! */
|
||||
pLayerHdr = bVLANPkt ? (pPktHdr + MAT_VLAN_ETH_HDR_LEN) : (pPktHdr + MAT_ETHER_HDR_LEN);
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
#ifdef APCLI_SUPPORT
|
||||
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
|
||||
{
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
UCHAR tempIdx = ifIdx;
|
||||
UCHAR CliIdx = 0xFF;
|
||||
|
||||
if (tempIdx >= 64)
|
||||
{
|
||||
CliIdx = ((tempIdx - 64) % 16);
|
||||
tempIdx = ((tempIdx - 64) / 16);
|
||||
|
||||
pMacAddr = &pAd->ApCfg.ApCliTab[tempIdx].RepeaterCli[CliIdx].CurrentAddress[0];
|
||||
}
|
||||
else
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
pMacAddr = &pAd->ApCfg.ApCliTab[ifIdx].wdev.if_addr[0];
|
||||
}
|
||||
#endif /* APCLI_SUPPORT */
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
|
||||
if (pHandle->tx!=NULL)
|
||||
retSkb = pHandle->tx((PVOID)&pAd->MatCfg, RTPKT_TO_OSPKT(pPkt), pLayerHdr, pMacAddr);
|
||||
|
||||
return retSkb;
|
||||
}
|
||||
}
|
||||
return retSkb;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Depends on the Received packet, check the upper layer protocol type
|
||||
and search for specific mapping table to find out the real destination
|
||||
MAC address.
|
||||
|
||||
Arguments:
|
||||
pAd =>Pointer to our adapter
|
||||
pPkt =>pointer to the 802.11 header of receviced packet
|
||||
infIdx =>Interface Index want to dispatch to.
|
||||
|
||||
Return Value:
|
||||
Success =>
|
||||
Mapped mac address if found, else return specific default mac address
|
||||
depends on the upper layer protocol type.
|
||||
Error =>
|
||||
NULL
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
PUCHAR MATEngineRxHandle(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PNDIS_PACKET pPkt,
|
||||
IN UINT infIdx)
|
||||
{
|
||||
PUCHAR pMacAddr = NULL;
|
||||
PUCHAR pLayerHdr = NULL, pPktHdr = NULL;
|
||||
UINT16 protoType;
|
||||
INT i =0;
|
||||
struct _MATProtoOps *pHandle = NULL;
|
||||
|
||||
|
||||
if(pAd->MatCfg.status != MAT_ENGINE_STAT_INITED)
|
||||
return NULL;
|
||||
|
||||
pPktHdr = GET_OS_PKT_DATAPTR(pPkt);
|
||||
if (!pPktHdr)
|
||||
return NULL;
|
||||
|
||||
/* If it's a multicast/broadcast packet, we do nothing. */
|
||||
if (IS_GROUP_MAC(pPktHdr))
|
||||
return NULL;
|
||||
|
||||
/* Get the upper layer protocol type of this 802.3 pkt and dispatch to specific handler */
|
||||
protoType = OS_NTOHS(get_unaligned((PUINT16)(pPktHdr + 12)));
|
||||
|
||||
for (i=0; i<MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
if (protoType == MATProtoTb[i].protocol)
|
||||
{
|
||||
pHandle = MATProtoTb[i].pHandle; /* the pHandle must not be null! */
|
||||
pLayerHdr = (pPktHdr + MAT_ETHER_HDR_LEN);
|
||||
/* RTMP_SEM_LOCK(&MATDBLock); */
|
||||
if(pHandle->rx!=NULL)
|
||||
pMacAddr = pHandle->rx((PVOID)&pAd->MatCfg, RTPKT_TO_OSPKT(pPkt), pLayerHdr, NULL);
|
||||
/* RTMP_SEM_UNLOCK(&MATDBLock); */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pMacAddr)
|
||||
NdisMoveMemory(pPktHdr, pMacAddr, MAC_ADDR_LEN);
|
||||
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN MATPktRxNeedConvert(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PNET_DEV net_dev)
|
||||
{
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
|
||||
{
|
||||
#ifdef APCLI_SUPPORT
|
||||
int i = 0;
|
||||
|
||||
/* Check if the packet will be send to apcli interface. */
|
||||
while(i<MAX_APCLI_NUM)
|
||||
{
|
||||
/*BSSID match the ApCliBssid ?(from a valid AP) */
|
||||
if ((pAd->ApCfg.ApCliTab[i].Valid == TRUE)
|
||||
&& (net_dev == pAd->ApCfg.ApCliTab[i].wdev.if_dev)
|
||||
#ifdef A4_CONN
|
||||
&& (IS_APCLI_A4(&pAd->ApCfg.ApCliTab[i]) == FALSE)
|
||||
#endif /* A4_CONN */
|
||||
){
|
||||
return TRUE;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
#endif /* APCLI_SUPPORT */
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS MATEngineExit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
struct _MATProtoOps *pHandle = NULL;
|
||||
int i;
|
||||
|
||||
if(pAd->MatCfg.status == MAT_ENGINE_STAT_EXITED)
|
||||
return TRUE;
|
||||
|
||||
/* For each registered protocol, we call it's exit handler. */
|
||||
for (i=0; i<MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
pHandle = MATProtoTb[i].pHandle;
|
||||
if (pHandle->exit!=NULL)
|
||||
pHandle->exit(&pAd->MatCfg);
|
||||
}
|
||||
|
||||
#ifdef KMALLOC_BATCH
|
||||
/* Free the memory used to store node entries. */
|
||||
if (pAd->MatCfg.pMATNodeEntryPoll)
|
||||
{
|
||||
os_free_mem(pAd, pAd->MatCfg.pMATNodeEntryPoll);
|
||||
pAd->MatCfg.pMATNodeEntryPoll = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
pAd->MatCfg.status = MAT_ENGINE_STAT_EXITED;
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS MATEngineInit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
MATProtoOps *pHandle = NULL;
|
||||
int i, status;
|
||||
|
||||
if(pAd->MatCfg.status == MAT_ENGINE_STAT_INITED)
|
||||
return TRUE;
|
||||
|
||||
#ifdef KMALLOC_BATCH
|
||||
/* Allocate memory for node entry, we totally allocate 128 entries and link them together. */
|
||||
os_alloc_mem_suspend(NULL, (UCHAR **)&(pAd->MatCfg.pMATNodeEntryPoll), sizeof(MATNodeEntry) * MAX_MAT_NODE_ENTRY_NUM);
|
||||
if (pAd->MatCfg.pMATNodeEntryPoll != NULL)
|
||||
{
|
||||
MATNodeEntry *pPtr=NULL;
|
||||
|
||||
NdisZeroMemory(pAd->MatCfg.pMATNodeEntryPoll, sizeof(MATNodeEntry) * MAX_MAT_NODE_ENTRY_NUM);
|
||||
pPtr = pAd->MatCfg.pMATNodeEntryPoll;
|
||||
for (i = 0; i < (MAX_MAT_NODE_ENTRY_NUM -1); i++)
|
||||
{
|
||||
pPtr->next = (MATNodeEntry *)(pPtr+1);
|
||||
pPtr = pPtr->next;
|
||||
}
|
||||
pPtr->next = NULL;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* For each specific protocol, call it's init function. */
|
||||
for (i = 0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
pHandle = MATProtoTb[i].pHandle;
|
||||
ASSERT(pHandle);
|
||||
if (pHandle->init != NULL)
|
||||
{
|
||||
status = pHandle->init(&pAd->MatCfg);
|
||||
if (status == FALSE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("MATEngine Init Protocol (0x%x) failed, Stop the MAT Funciton initialization failed!\n", MATProtoTb[i].protocol));
|
||||
goto init_failed;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("MATEngine Init Protocol (0x%04x) success!\n", MATProtoTb[i].protocol));
|
||||
}
|
||||
}
|
||||
|
||||
NdisAllocateSpinLock(pAd, &pAd->MatCfg.MATDBLock);
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
pAd->MatCfg.bMACRepeaterEn = FALSE;
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
pAd->MatCfg.pPriv = (VOID *)pAd;
|
||||
pAd->MatCfg.status = MAT_ENGINE_STAT_INITED;
|
||||
|
||||
return TRUE;
|
||||
|
||||
init_failed:
|
||||
/* For each specific protocol, call it's exit function. */
|
||||
for (i = 0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
if ((pHandle = MATProtoTb[i].pHandle) != NULL)
|
||||
{
|
||||
if (pHandle->exit != NULL)
|
||||
{
|
||||
status = pHandle->exit(&pAd->MatCfg);
|
||||
if (status == FALSE)
|
||||
goto init_failed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef KMALLOC_BATCH
|
||||
if (pAd->MatCfg.pMATNodeEntryPoll)
|
||||
os_free_mem(pAd, pAd->MatCfg.pMATNodeEntryPoll);
|
||||
pAd->MatCfg.status = MAT_ENGINE_STAT_EXITED;
|
||||
#endif /* KMALLOC_BATCH */
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
#endif /* MAT_SUPPORT */
|
||||
|
@ -0,0 +1,807 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_mat_iparp.c
|
||||
|
||||
Abstract:
|
||||
MAT convert engine subroutine for ip base protocols, currently now we
|
||||
just handle IP/ARP protocols.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Shiang 02/26/07 Init version
|
||||
*/
|
||||
#ifdef MAT_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
static NDIS_STATUS MATProto_IP_Init(MAT_STRUCT *pMatCfg);
|
||||
static NDIS_STATUS MATProto_IP_Exit(MAT_STRUCT *pMatCfg);
|
||||
static PUCHAR MATProto_IP_Rx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);
|
||||
static PUCHAR MATProto_IP_Tx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);
|
||||
|
||||
static NDIS_STATUS MATProto_ARP_Init(MAT_STRUCT *pMatCfg);
|
||||
static NDIS_STATUS MATProto_ARP_Exit(MAT_STRUCT *pMatCfg);
|
||||
static PUCHAR MATProto_ARP_Rx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);
|
||||
static PUCHAR MATProto_ARP_Tx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb,PUCHAR pLayerHdr, PUCHAR pMacAddr);
|
||||
|
||||
#define IPV4_ADDR_LEN 4
|
||||
|
||||
#define NEED_UPDATE_IPMAC_TB(Mac, IP) (IS_UCAST_MAC(Mac) && IS_GOOD_IP(IP))
|
||||
|
||||
|
||||
typedef struct _IPMacMappingEntry
|
||||
{
|
||||
UINT ipAddr; /* In network order */
|
||||
UCHAR macAddr[MAC_ADDR_LEN];
|
||||
ULONG lastTime;
|
||||
struct _IPMacMappingEntry *pNext;
|
||||
}IPMacMappingEntry, *PIPMacMappingEntry;
|
||||
|
||||
|
||||
typedef struct _IPMacMappingTable
|
||||
{
|
||||
BOOLEAN valid;
|
||||
IPMacMappingEntry *hash[MAT_MAX_HASH_ENTRY_SUPPORT+1]; /*0~63 for specific station, 64 for broadcast MacAddress */
|
||||
UCHAR curMcastAddr[MAC_ADDR_LEN]; /* The multicast mac addr for currecnt received packet destined to ipv4 multicast addr */
|
||||
}IPMacMappingTable;
|
||||
|
||||
|
||||
struct _MATProtoOps MATProtoIPHandle =
|
||||
{
|
||||
.init = MATProto_IP_Init,
|
||||
.tx = MATProto_IP_Tx,
|
||||
.rx = MATProto_IP_Rx,
|
||||
.exit = MATProto_IP_Exit,
|
||||
};
|
||||
|
||||
struct _MATProtoOps MATProtoARPHandle =
|
||||
{
|
||||
.init = MATProto_ARP_Init,
|
||||
.tx = MATProto_ARP_Tx,
|
||||
.rx = MATProto_ARP_Rx,
|
||||
.exit =MATProto_ARP_Exit,
|
||||
};
|
||||
|
||||
|
||||
VOID dumpIPMacTb(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN int index)
|
||||
{
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
IPMacMappingEntry *pHead;
|
||||
int startIdx, endIdx;
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
if (!pIPMacTable)
|
||||
return;
|
||||
|
||||
if (!pIPMacTable->valid)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():IPMacTable not init yet, so cannot do dump!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if(index < 0)
|
||||
{ /* dump all. */
|
||||
startIdx = 0;
|
||||
endIdx = MAT_MAX_HASH_ENTRY_SUPPORT;
|
||||
}
|
||||
else
|
||||
{ /* dump specific hash index. */
|
||||
startIdx = endIdx = index;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():\n", __FUNCTION__));
|
||||
for(; startIdx<= endIdx; startIdx++)
|
||||
{
|
||||
pHead = pIPMacTable->hash[startIdx];
|
||||
while(pHead)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("IPMac[%d]:\n", startIdx));
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t:IP=0x%x,Mac=%02x:%02x:%02x:%02x:%02x:%02x, lastTime=0x%lx, next=%p\n",
|
||||
pHead->ipAddr, pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],
|
||||
pHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5], pHead->lastTime,
|
||||
pHead->pNext));
|
||||
pHead = pHead->pNext;
|
||||
}
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t----EndOfDump!\n"));
|
||||
|
||||
}
|
||||
|
||||
|
||||
static inline NDIS_STATUS getDstIPFromIpPkt(
|
||||
IN PUCHAR pIpHdr,
|
||||
IN UINT *dstIP)
|
||||
{
|
||||
|
||||
if (!pIpHdr)
|
||||
return FALSE;
|
||||
|
||||
NdisMoveMemory(dstIP, (pIpHdr + 16), 4); /*shift 16 for IP header len before DstIP. */
|
||||
/* DBGPRINT(RT_DEBUG_TRACE, ("%s(): Get the dstIP=0x%x\n", __FUNCTION__, *dstIP)); */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline NDIS_STATUS getSrcIPFromIpPkt(
|
||||
IN PUCHAR pIpHdr,
|
||||
IN UINT *pSrcIP)
|
||||
{
|
||||
|
||||
if (!pIpHdr)
|
||||
return FALSE;
|
||||
|
||||
NdisMoveMemory(pSrcIP, (pIpHdr + 12), 4); /*shift 12 for IP header len before DstIP. */
|
||||
/* DBGPRINT(RT_DEBUG_TRACE, ("%s(): Get the srcIP=0x%x\n", __FUNCTION__, *pSrcIP)); */
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
static NDIS_STATUS IPMacTableUpdate(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PUCHAR pMacAddr,
|
||||
IN UINT ipAddr)
|
||||
{
|
||||
UINT hashIdx;
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
IPMacMappingEntry *pEntry = NULL, *pPrev = NULL, *pNewEntry =NULL;
|
||||
ULONG now;
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
|
||||
if (!pIPMacTable)
|
||||
return FALSE;
|
||||
|
||||
if (!pIPMacTable->valid)
|
||||
return FALSE;
|
||||
|
||||
hashIdx = MAT_IP_ADDR_HASH_INDEX(ipAddr);
|
||||
|
||||
pEntry = pPrev = pIPMacTable->hash[hashIdx];
|
||||
while(pEntry)
|
||||
{
|
||||
NdisGetSystemUpTime(&now);
|
||||
|
||||
/* Find a existed IP-MAC Mapping entry */
|
||||
if (ipAddr == pEntry->ipAddr)
|
||||
{
|
||||
/* DBGPRINT(RT_DEBUG_TRACE, ("%s(): Got the Mac(%02x:%02x:%02x:%02x:%02x:%02x) of mapped IP(%d.%d.%d.%d)\n",
|
||||
__FUNCTION__, pEntry->macAddr[0],pEntry->macAddr[1],pEntry->macAddr[2], pEntry->macAddr[3],pEntry->macAddr[4],
|
||||
pEntry->macAddr[5], (ipAddr>>24) & 0xff, (ipAddr>>16) & 0xff, (ipAddr>>8) & 0xff, ipAddr & 0xff));
|
||||
*/
|
||||
/* compare is useless. So we directly copy it into the entry. */
|
||||
NdisMoveMemory(pEntry->macAddr, pMacAddr, 6);
|
||||
pEntry->lastTime = now;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{ /* handle the age-out situation */
|
||||
/*if ((Now - pEntry->lastTime) > MAT_TB_ENTRY_AGEOUT_TIME) */
|
||||
if (RTMP_TIME_AFTER(now, pEntry->lastTime + MAT_TB_ENTRY_AGEOUT_TIME))
|
||||
{
|
||||
/* Remove the aged entry */
|
||||
if (pEntry == pIPMacTable->hash[hashIdx])
|
||||
{
|
||||
pIPMacTable->hash[hashIdx]= pEntry->pNext;
|
||||
pPrev = pIPMacTable->hash[hashIdx];
|
||||
}
|
||||
else
|
||||
{
|
||||
pPrev->pNext = pEntry->pNext;
|
||||
}
|
||||
MATDBEntryFree(pMatCfg, (PUCHAR)pEntry);
|
||||
|
||||
pEntry = (pPrev == NULL ? NULL: pPrev->pNext);
|
||||
pMatCfg->nodeCount--;
|
||||
}
|
||||
else
|
||||
{
|
||||
pPrev = pEntry;
|
||||
pEntry = pEntry->pNext;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Allocate a new IPMacMapping entry and insert into the hash */
|
||||
pNewEntry = (IPMacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPMacMappingEntry));
|
||||
if (pNewEntry != NULL)
|
||||
{
|
||||
pNewEntry->ipAddr = ipAddr;
|
||||
NdisMoveMemory(pNewEntry->macAddr, pMacAddr, 6);
|
||||
pNewEntry->pNext = NULL;
|
||||
NdisGetSystemUpTime(&pNewEntry->lastTime);
|
||||
|
||||
if (pIPMacTable->hash[hashIdx] == NULL)
|
||||
{ /* Hash list is empty, directly assign it. */
|
||||
pIPMacTable->hash[hashIdx] = pNewEntry;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ok, we insert the new entry into the root of hash[hashIdx] */
|
||||
pNewEntry->pNext = pIPMacTable->hash[hashIdx];
|
||||
pIPMacTable->hash[hashIdx] = pNewEntry;
|
||||
}
|
||||
/*dumpIPMacTb(pMatCfg, hashIdx); //for debug */
|
||||
|
||||
pMatCfg->nodeCount++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
static PUCHAR IPMacTableLookUp(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN UINT ipAddr)
|
||||
{
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
UINT hashIdx, ip;
|
||||
IPMacMappingEntry *pEntry = NULL;
|
||||
PUCHAR pGroupMacAddr;
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
|
||||
if (!pIPMacTable)
|
||||
return NULL;
|
||||
|
||||
if (!pIPMacTable->valid)
|
||||
return NULL;
|
||||
|
||||
/*if multicast ip, need converting multicast group address to ethernet address. */
|
||||
ip = ntohl(ipAddr);
|
||||
if (IS_MULTICAST_IP(ip))
|
||||
{
|
||||
pGroupMacAddr = (PUCHAR)(&pIPMacTable->curMcastAddr);
|
||||
ConvertMulticastIP2MAC((PUCHAR) &ipAddr, (UCHAR **)(&pGroupMacAddr), ETH_P_IP);
|
||||
return pIPMacTable->curMcastAddr;
|
||||
}
|
||||
|
||||
/* Use hash to find out the location of that entry and get the Mac address. */
|
||||
hashIdx = MAT_IP_ADDR_HASH_INDEX(ipAddr);
|
||||
|
||||
/* spin_lock_irqsave(&IPMacTabLock, irqFlag); */
|
||||
pEntry = pIPMacTable->hash[hashIdx];
|
||||
while(pEntry)
|
||||
{
|
||||
if (pEntry->ipAddr == ipAddr)
|
||||
{
|
||||
/* DBGPRINT(RT_DEBUG_TRACE, ("%s(): dstMac=%02x:%02x:%02x:%02x:%02x:%02x for mapped dstIP(%d.%d.%d.%d)\n",
|
||||
__FUNCTION__, pEntry->macAddr[0],pEntry->macAddr[1],pEntry->macAddr[2],
|
||||
pEntry->macAddr[3],pEntry->macAddr[4],pEntry->macAddr[5],
|
||||
(ipAddr>>24) & 0xff, (ipAddr>>16) & 0xff, (ipAddr>>8) & 0xff, ipAddr & 0xff));
|
||||
*/
|
||||
|
||||
/*Update the lastTime to prevent the aging before pDA processed! */
|
||||
NdisGetSystemUpTime(&pEntry->lastTime);
|
||||
|
||||
return pEntry->macAddr;
|
||||
}
|
||||
else
|
||||
pEntry = pEntry->pNext;
|
||||
}
|
||||
|
||||
/*
|
||||
We didn't find any matched Mac address, our policy is treat it as
|
||||
broadcast packet and send to all.
|
||||
*/
|
||||
return pIPMacTable->hash[IPMAC_TB_HASH_INDEX_OF_BCAST]->macAddr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS IPMacTable_RemoveAll(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
IPMacMappingEntry *pEntry;
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
INT i;
|
||||
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
|
||||
if (!pIPMacTable)
|
||||
return TRUE;
|
||||
|
||||
if (pIPMacTable->valid)
|
||||
{
|
||||
pIPMacTable->valid = FALSE;
|
||||
for (i=0; i<IPMAC_TB_HASH_ENTRY_NUM; i++)
|
||||
{
|
||||
while((pEntry = pIPMacTable->hash[i]) != NULL)
|
||||
{
|
||||
pIPMacTable->hash[i] = pEntry->pNext;
|
||||
MATDBEntryFree(pMatCfg, (PUCHAR)pEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s() Set nodeCount to 0,nodeCount = %d\n", __FUNCTION__, pMatCfg->nodeCount));
|
||||
pMatCfg->nodeCount = 0;
|
||||
os_free_mem(NULL, pIPMacTable);
|
||||
pMatCfg->MatTableSet.IPMacTable = NULL;
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS IPMacTable_init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
IPMacMappingEntry *pEntry = NULL;
|
||||
|
||||
|
||||
if (pMatCfg->MatTableSet.IPMacTable != NULL)
|
||||
{
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
}
|
||||
else
|
||||
{
|
||||
os_alloc_mem_suspend(NULL, (UCHAR **)&(pMatCfg->MatTableSet.IPMacTable), sizeof(IPMacMappingTable));
|
||||
if (pMatCfg->MatTableSet.IPMacTable)
|
||||
{
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
NdisZeroMemory(pIPMacTable, sizeof(IPMacMappingTable));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPMacTable_init(): Allocate memory for IPMacTable failed!\n"));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (pIPMacTable->valid == FALSE)
|
||||
{
|
||||
/*Set the last hash entry (hash[64]) as our default broadcast Mac address */
|
||||
pEntry = (IPMacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPMacMappingEntry));
|
||||
if (!pEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPMacTable_init(): Allocate memory for IPMacTable broadcast entry failed!\n"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
NdisZeroMemory(pEntry, sizeof(IPMacMappingEntry));
|
||||
NdisMoveMemory(&pEntry->macAddr[0], &BROADCAST_ADDR[0], 6);
|
||||
pEntry->pNext = NULL;
|
||||
pIPMacTable->hash[IPMAC_TB_HASH_INDEX_OF_BCAST] = pEntry;
|
||||
|
||||
pIPMacTable->valid = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): IPMacTable already inited!\n", __FUNCTION__));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_ARP_Exit(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
INT status;
|
||||
|
||||
status = IPMacTable_RemoveAll(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static PUCHAR MATProto_ARP_Rx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pMacAddr)
|
||||
{
|
||||
PUCHAR pArpHdr = NULL, pRealMac = NULL;
|
||||
PUCHAR tgtMac, tgtIP;
|
||||
BOOLEAN isUcastMac, isGoodIP;
|
||||
|
||||
|
||||
pArpHdr = pLayerHdr;
|
||||
|
||||
/*dumpPkt(RTPKT_TO_OSPKT(pSkb)->data, RTPKT_TO_OSPKT(pSkb)->len); */
|
||||
/* We just take care about the target(Mac/IP address) fields. */
|
||||
tgtMac = pArpHdr + 18;
|
||||
tgtIP = tgtMac + 6;
|
||||
|
||||
/* isUcastMac = !(00:00:00:00:00:00|| mcastMac); */
|
||||
isUcastMac = ((tgtMac[0]|tgtMac[1]|tgtMac[2]|tgtMac[3]|tgtMac[4]|tgtMac[5])!=0);
|
||||
isUcastMac &= ((tgtMac[0] & 0x1)==0);
|
||||
|
||||
/* isGoodIP = ip address is not 0.0.0.0 */
|
||||
isGoodIP = (*(UINT *)tgtIP != 0);
|
||||
|
||||
|
||||
if (isUcastMac && isGoodIP)
|
||||
pRealMac = IPMacTableLookUp(pMatCfg, *(UINT *)tgtIP);
|
||||
|
||||
/*
|
||||
For need replaced mac, we need to replace the targetMAC as correct one to make
|
||||
the real receiver can receive that.
|
||||
*/
|
||||
if (isUcastMac && pRealMac)
|
||||
NdisMoveMemory(tgtMac, pRealMac, MAC_ADDR_LEN);
|
||||
|
||||
if (pRealMac == NULL)
|
||||
pRealMac = &BROADCAST_ADDR[0];
|
||||
/* pRealMac = pIPMacTable->hash[IPMAC_TB_HASH_INDEX_OF_BCAST]->macAddr; */
|
||||
|
||||
return pRealMac;
|
||||
}
|
||||
|
||||
static PUCHAR MATProto_ARP_Tx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pMacAddr)
|
||||
{
|
||||
PUCHAR pSMac, pSIP;
|
||||
BOOLEAN isUcastMac, isGoodIP;
|
||||
NET_PRO_ARP_HDR *arpHdr;
|
||||
//PUCHAR pPktHdr;
|
||||
PNDIS_PACKET newSkb = NULL;
|
||||
|
||||
//pPktHdr = GET_OS_PKT_DATAPTR(pSkb);
|
||||
|
||||
arpHdr = (NET_PRO_ARP_HDR *)pLayerHdr;
|
||||
|
||||
/*
|
||||
Check the arp header.
|
||||
We just handle ether type hardware address and IPv4 internet
|
||||
address type and opcode is ARP reuqest/response.
|
||||
*/
|
||||
if ((arpHdr->ar_hrd != OS_HTONS(ARPHRD_ETHER)) || (arpHdr->ar_pro != OS_HTONS(ETH_P_IP)) ||
|
||||
(arpHdr->ar_op != OS_HTONS(ARPOP_REPLY) && arpHdr->ar_op != OS_HTONS(ARPOP_REQUEST)))
|
||||
return NULL;
|
||||
|
||||
/* We just take care about the sender(Mac/IP address) fields. */
|
||||
pSMac =(PUCHAR)(pLayerHdr + 8);
|
||||
pSIP = (PUCHAR)(pSMac + MAC_ADDR_LEN);
|
||||
|
||||
isUcastMac = IS_UCAST_MAC(pSMac);
|
||||
isGoodIP = IS_GOOD_IP(get_unaligned32((PUINT) pSIP));
|
||||
|
||||
/*
|
||||
DBGPRINT(RT_DEBUG_TRACE,("%s(): ARP Pkt=>senderIP=%d.%d.%d.%d, senderMac=%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
__FUNCTION__, pSIP[0], pSIP[1], pSIP[2], pSIP[3],
|
||||
pSMac[0],pSMac[1],pSMac[2],pSMac[3],pSMac[4],pSMac[5]));
|
||||
*/
|
||||
if (isUcastMac && isGoodIP)
|
||||
IPMacTableUpdate(pMatCfg, pSMac, get_unaligned32((PUINT) pSIP));
|
||||
|
||||
/*
|
||||
For outgoing unicast mac, we need to replace the senderMAC as ourself to make
|
||||
the receiver can send to us.
|
||||
*/
|
||||
if (isUcastMac)
|
||||
{
|
||||
if(OS_PKT_CLONED(pSkb))
|
||||
{
|
||||
newSkb = (PNDIS_PACKET)OS_PKT_COPY(pSkb);
|
||||
if(newSkb)
|
||||
{
|
||||
if (IS_VLAN_PACKET(GET_OS_PKT_DATAPTR(newSkb)))
|
||||
pSMac = (PUCHAR)(GET_OS_PKT_DATAPTR(newSkb) + MAT_VLAN_ETH_HDR_LEN + 8);
|
||||
else
|
||||
pSMac = (PUCHAR)(GET_OS_PKT_DATAPTR(newSkb) + MAT_ETHER_HDR_LEN + 8);
|
||||
}
|
||||
}
|
||||
|
||||
ASSERT(pMacAddr);
|
||||
NdisMoveMemory(pSMac, pMacAddr, MAC_ADDR_LEN);
|
||||
}
|
||||
|
||||
return (PUCHAR)newSkb;
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_ARP_Init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
BOOLEAN status = FALSE;
|
||||
|
||||
status = IPMacTable_init(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_IP_Exit(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
INT status;
|
||||
|
||||
status = IPMacTable_RemoveAll(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static PUCHAR MATProto_IP_Rx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr)
|
||||
{
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) pMatCfg->pPriv;
|
||||
USHORT wcid = 0xFF;
|
||||
PMAC_TABLE_ENTRY pEntry = NULL;
|
||||
PREPEATER_CLIENT_ENTRY pReptEntry = NULL;
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
PUCHAR pMacAddr;
|
||||
UINT dstIP;
|
||||
|
||||
/* Fetch the IP addres from the packet header. */
|
||||
getDstIPFromIpPkt(pLayerHdr, &dstIP);
|
||||
pMacAddr = IPMacTableLookUp(pMatCfg, dstIP);
|
||||
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
if (pAd == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():ERROR! pAd is null!\n", __FUNCTION__));
|
||||
return pMacAddr;
|
||||
}
|
||||
|
||||
wcid = RTMP_GET_PACKET_WCID(pSkb);
|
||||
|
||||
pEntry = &pAd->MacTab.Content[wcid];
|
||||
pReptEntry = &pAd->ApCfg.ApCliTab[pEntry->func_tb_idx].RepeaterCli[pEntry->MatchReptCliIdx];
|
||||
|
||||
if (pAd->ApCfg.bMACRepeaterEn)
|
||||
{
|
||||
if (pEntry->bReptCli)
|
||||
{
|
||||
UINT ip;
|
||||
|
||||
ip = ntohl(dstIP);
|
||||
|
||||
/* avoid duplicate packet in IGMP case */
|
||||
if (IS_MULTICAST_IP(ip))
|
||||
return pReptEntry->OriginalAddress;
|
||||
}
|
||||
|
||||
|
||||
if ((pAd->ApCfg.MACRepeaterOuiMode != 1))
|
||||
{
|
||||
if (pEntry->bReptCli)
|
||||
{
|
||||
PUCHAR pPktHdr, pLayerHdr;
|
||||
|
||||
pPktHdr = GET_OS_PKT_DATAPTR(pSkb);
|
||||
pLayerHdr = (pPktHdr + MAT_ETHER_HDR_LEN);
|
||||
|
||||
/*For UDP packet, we need to check about the DHCP packet. */
|
||||
if (*(pLayerHdr + 9) == 0x11)
|
||||
{
|
||||
PUCHAR pUdpHdr;
|
||||
UINT16 srcPort, dstPort;
|
||||
BOOLEAN bHdrChanged = FALSE;
|
||||
|
||||
pUdpHdr = pLayerHdr + 20;
|
||||
srcPort = OS_NTOHS(get_unaligned((PUINT16)(pUdpHdr)));
|
||||
dstPort = OS_NTOHS(get_unaligned((PUINT16)(pUdpHdr+2)));
|
||||
|
||||
if (srcPort==67 && dstPort==68) /*It's a DHCP packet */
|
||||
{
|
||||
PUCHAR bootpHdr/*, dhcpHdr*/, pCliHwAddr;
|
||||
bootpHdr = pUdpHdr + 8;
|
||||
//dhcpHdr = bootpHdr + 236;
|
||||
pCliHwAddr = (bootpHdr+28);
|
||||
|
||||
if (pReptEntry)
|
||||
NdisMoveMemory(pCliHwAddr, pReptEntry->OriginalAddress, MAC_ADDR_LEN);
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s() MatchAPCLITabIdx = %u\n", __FUNCTION__, pEntry->func_tb_idx));
|
||||
}
|
||||
bHdrChanged = TRUE;
|
||||
}
|
||||
|
||||
if (bHdrChanged == TRUE)
|
||||
NdisZeroMemory((pUdpHdr+6), 2); /*modify the UDP chksum as zero */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
|
||||
return pMacAddr;
|
||||
}
|
||||
|
||||
static UCHAR DHCP_MAGIC[]= {0x63, 0x82, 0x53, 0x63};
|
||||
static PUCHAR MATProto_IP_Tx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr)
|
||||
{
|
||||
PUCHAR pSrcMac;
|
||||
PUCHAR pSrcIP;
|
||||
BOOLEAN needUpdate;
|
||||
PUCHAR pPktHdr;
|
||||
|
||||
pPktHdr = GET_OS_PKT_DATAPTR(pSkb);
|
||||
|
||||
pSrcMac = pPktHdr + 6;
|
||||
pSrcIP = pLayerHdr + 12;
|
||||
|
||||
needUpdate = NEED_UPDATE_IPMAC_TB(pSrcMac, get_unaligned32((PUINT)(pSrcIP)));
|
||||
if (needUpdate)
|
||||
IPMacTableUpdate(pMatCfg, pSrcMac, get_unaligned32((PUINT)(pSrcIP)));
|
||||
|
||||
/*For UDP packet, we need to check about the DHCP packet, to modify the flag of DHCP discovey/request as broadcast. */
|
||||
if (*(pLayerHdr + 9) == 0x11)
|
||||
{
|
||||
PUCHAR udpHdr;
|
||||
UINT16 srcPort, dstPort;
|
||||
BOOLEAN bHdrChanged = FALSE;
|
||||
|
||||
udpHdr = pLayerHdr + 20;
|
||||
srcPort = OS_NTOHS(get_unaligned((PUINT16)(udpHdr)));
|
||||
dstPort = OS_NTOHS(get_unaligned((PUINT16)(udpHdr+2)));
|
||||
|
||||
if (srcPort==68 && dstPort==67) /*It's a DHCP packet */
|
||||
{
|
||||
PUCHAR bootpHdr;
|
||||
UINT16 bootpFlag;
|
||||
PUCHAR dhcpHdr;
|
||||
|
||||
bootpHdr = udpHdr + 8;
|
||||
bootpFlag = OS_NTOHS(get_unaligned((PUINT16)(bootpHdr+10)));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("is bootp packet! bootpFlag=0x%x\n", bootpFlag));
|
||||
dhcpHdr = bootpHdr + 236;
|
||||
|
||||
if (bootpFlag != 0x8000) /*check if it's a broadcast request. */
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("the DHCP flag is a unicast, dhcp_magic=%02x:%02x:%02x:%02x\n",
|
||||
dhcpHdr[0], dhcpHdr[1], dhcpHdr[2], dhcpHdr[3]));
|
||||
if (NdisEqualMemory(dhcpHdr, DHCP_MAGIC, 4))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("dhcp magic macthed!\n"));
|
||||
bootpFlag = OS_HTONS(0x8000);
|
||||
NdisMoveMemory((bootpHdr+10), &bootpFlag, 2); /*Set the bootp flag as broadcast */
|
||||
bHdrChanged = TRUE;
|
||||
}
|
||||
}
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
if (pMatCfg->bMACRepeaterEn)
|
||||
{
|
||||
UCHAR isLinkValid;
|
||||
|
||||
if (RTMPLookupRepeaterCliEntry(pMatCfg->pPriv, FALSE, pDevMacAdr, TRUE, &isLinkValid) != NULL)
|
||||
{
|
||||
NdisMoveMemory((bootpHdr+28), pDevMacAdr, MAC_ADDR_LEN);
|
||||
|
||||
if (NdisEqualMemory(dhcpHdr, DHCP_MAGIC, 4))
|
||||
{
|
||||
PUCHAR pOptCode, pOptLen;
|
||||
UINT16 udpLen;
|
||||
|
||||
udpLen = OS_NTOHS(get_unaligned((PUINT16)(udpHdr+4)));
|
||||
pOptCode = (dhcpHdr + 4);
|
||||
do
|
||||
{
|
||||
pOptLen = pOptCode + 1;
|
||||
if (*pOptCode == 61) /* Client Identifier */
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,
|
||||
("Client Identifier found, change Hardware Address to "
|
||||
"%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
pDevMacAdr[0], pDevMacAdr[1], pDevMacAdr[2],
|
||||
pDevMacAdr[3], pDevMacAdr[4], pDevMacAdr[5]));
|
||||
/* Change Hardware Address */
|
||||
NdisMoveMemory((pOptCode+3), pDevMacAdr, MAC_ADDR_LEN);
|
||||
break;
|
||||
}
|
||||
pOptCode += (2+*pOptLen);
|
||||
}while ((*pOptCode != 0xFF) && ((pOptCode - udpHdr) <= udpLen));
|
||||
}
|
||||
bHdrChanged = TRUE;
|
||||
}
|
||||
}
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
}
|
||||
|
||||
if (bHdrChanged == TRUE)
|
||||
NdisZeroMemory((udpHdr+6), 2); /* Modify the UDP chksum as zero */
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_IP_Init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
BOOLEAN status;
|
||||
|
||||
status = IPMacTable_init(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static inline void IPintToIPstr(int ipint, char Ipstr[20], ULONG BufLen)
|
||||
{
|
||||
int temp = 0;
|
||||
|
||||
temp = ipint & 0x000FF;
|
||||
snprintf(Ipstr, BufLen, "%d.", temp);
|
||||
temp = (ipint>>8) & 0x000FF;
|
||||
snprintf(Ipstr, BufLen, "%s%d.", Ipstr, temp);
|
||||
temp = (ipint>>16) & 0x000FF;
|
||||
snprintf(Ipstr, BufLen, "%s%d.", Ipstr, temp);
|
||||
temp = (ipint>>24) & 0x000FF;
|
||||
snprintf(Ipstr, BufLen, "%s%d", Ipstr, temp);
|
||||
}
|
||||
|
||||
|
||||
VOID getIPMacTbInfo(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN char *pOutBuf,
|
||||
IN ULONG BufLen)
|
||||
{
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
IPMacMappingEntry *pHead;
|
||||
int startIdx, endIdx;
|
||||
char Ipstr[20] = {0};
|
||||
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
if ((!pIPMacTable) || (!pIPMacTable->valid))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s():IPMacTable not init yet!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
/* dump all. */
|
||||
startIdx = 0;
|
||||
endIdx = MAT_MAX_HASH_ENTRY_SUPPORT;
|
||||
|
||||
sprintf(pOutBuf, "\n");
|
||||
sprintf(pOutBuf+strlen(pOutBuf), "%-18s%-20s\n", "IP", "MAC");
|
||||
for(; startIdx< endIdx; startIdx++)
|
||||
{
|
||||
pHead = pIPMacTable->hash[startIdx];
|
||||
while(pHead)
|
||||
{
|
||||
/* if (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30)) */
|
||||
if (RtmpOsCmdDisplayLenCheck(strlen(pOutBuf), 30) == FALSE)
|
||||
break;
|
||||
NdisZeroMemory(Ipstr, 20);
|
||||
IPintToIPstr(pHead->ipAddr, Ipstr, sizeof(Ipstr));
|
||||
sprintf(pOutBuf+strlen(pOutBuf), "%-18s%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
Ipstr, pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],
|
||||
pHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5]);
|
||||
pHead = pHead->pNext;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* MAT_SUPPORT */
|
||||
|
@ -0,0 +1,821 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_mat_ipv6.c
|
||||
|
||||
Abstract:
|
||||
MAT convert engine subroutine for ipv6 base protocols, currently now we
|
||||
just handle IPv6/ICMPv6 packets without Authentication/Encryption headers.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Shiang 06/03/07 Init version
|
||||
*/
|
||||
#ifdef MAT_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
#include "ipv6.h"
|
||||
|
||||
/*#include <asm/checksum.h> */
|
||||
/*#include <net/ip6_checksum.h> */
|
||||
|
||||
const UCHAR IPV6_LOOPBACKADDR[] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
|
||||
|
||||
static NDIS_STATUS MATProto_IPv6_Init(MAT_STRUCT *pMatCfg);
|
||||
static NDIS_STATUS MATProto_IPv6_Exit(MAT_STRUCT *pMatCfg);
|
||||
static PUCHAR MATProto_IPv6_Rx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);
|
||||
static PUCHAR MATProto_IPv6_Tx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);
|
||||
|
||||
#define RT_UDP_HDR_LEN 8
|
||||
|
||||
typedef struct _IPv6MacMappingEntry
|
||||
{
|
||||
UCHAR ipv6Addr[16]; /* In network order */
|
||||
UCHAR macAddr[MAC_ADDR_LEN];
|
||||
ULONG lastTime;
|
||||
struct _IPv6MacMappingEntry *pNext;
|
||||
}IPv6MacMappingEntry, *PIPv6MacMappingEntry;
|
||||
|
||||
|
||||
typedef struct _IPv6MacMappingTable
|
||||
{
|
||||
BOOLEAN valid;
|
||||
IPv6MacMappingEntry *hash[MAT_MAX_HASH_ENTRY_SUPPORT+1]; /*0~63 for specific station, 64 for broadcast MacAddress */
|
||||
UCHAR curMcastAddr[MAC_ADDR_LEN]; /* The multicast mac addr for currecnt received packet destined to ipv6 multicast addr */
|
||||
}IPv6MacMappingTable;
|
||||
|
||||
|
||||
struct _MATProtoOps MATProtoIPv6Handle =
|
||||
{
|
||||
.init = MATProto_IPv6_Init,
|
||||
.tx = MATProto_IPv6_Tx,
|
||||
.rx = MATProto_IPv6_Rx,
|
||||
.exit = MATProto_IPv6_Exit,
|
||||
};
|
||||
|
||||
static inline BOOLEAN needUpdateIPv6MacTB(
|
||||
UCHAR *pMac,
|
||||
RT_IPV6_ADDR *pIPv6Addr)
|
||||
{
|
||||
ASSERT(pIPv6Addr);
|
||||
|
||||
if (isMcastEtherAddr(pMac) || isZeroEtherAddr(pMac))
|
||||
return FALSE;
|
||||
|
||||
/* IPv6 multicast address */
|
||||
if (IS_MULTICAST_IPV6_ADDR(*pIPv6Addr))
|
||||
return FALSE;
|
||||
|
||||
/* unspecified address */
|
||||
if(IS_UNSPECIFIED_IPV6_ADDR(*pIPv6Addr))
|
||||
return FALSE;
|
||||
|
||||
/* loopback address */
|
||||
if (IS_LOOPBACK_IPV6_ADDR(*pIPv6Addr))
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
DBGPRINT(RT_DEBUG_INFO, ("%s(): Good IPv6 unicast addr=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
|
||||
__FUNCTION__, PRINT_IPV6_ADDR(*pIPv6Addr)));
|
||||
*/
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IPv6 Header Format
|
||||
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|Version| Traffic Class | Flow Label |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Payload Length | Next Header | Hop Limit |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| Source Address |
|
||||
+ +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| Destination Address |
|
||||
+ +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
|
||||
ICMPv6 Format:
|
||||
|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Body |
|
||||
+ +
|
||||
| |
|
||||
......
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
|
||||
NDIS_STATUS dumpIPv6MacTb(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN int index)
|
||||
{
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pHead;
|
||||
int startIdx, endIdx;
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if ((!pIPv6MacTable) || (!pIPv6MacTable->valid))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():IPv6MacTable not init yet, so cannot do dump!\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
if(index < 0)
|
||||
{ /* dump all. */
|
||||
startIdx = 0;
|
||||
endIdx = MAT_MAX_HASH_ENTRY_SUPPORT;
|
||||
}
|
||||
else
|
||||
{ /* dump specific hash index. */
|
||||
startIdx = endIdx = index;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():\n", __FUNCTION__));
|
||||
for(; startIdx<= endIdx; startIdx++)
|
||||
{
|
||||
pHead = pIPv6MacTable->hash[startIdx];
|
||||
while(pHead)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("IPv6Mac[%d]:\n", startIdx));
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t:IPv6=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x,Mac=%02x:%02x:%02x:%02x:%02x:%02x, lastTime=0x%lx, next=%p\n",
|
||||
PRINT_IPV6_ADDR(*((RT_IPV6_ADDR *)(&pHead->ipv6Addr[0]))), pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],
|
||||
pHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5], pHead->lastTime, pHead->pNext));
|
||||
pHead = pHead->pNext;
|
||||
}
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t----EndOfDump!\n"));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static NDIS_STATUS IPv6MacTableUpdate(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PUCHAR pMacAddr,
|
||||
IN PCHAR pIPv6Addr)
|
||||
{
|
||||
UINT hashIdx;
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pEntry = NULL, *pPrev = NULL, *pNewEntry =NULL;
|
||||
ULONG now;
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if ((!pIPv6MacTable) || (!pIPv6MacTable->valid))
|
||||
return FALSE;
|
||||
|
||||
hashIdx = MAT_IPV6_ADDR_HASH_INDEX(pIPv6Addr);
|
||||
pEntry = pPrev = pIPv6MacTable->hash[hashIdx];
|
||||
while(pEntry)
|
||||
{
|
||||
NdisGetSystemUpTime(&now);
|
||||
|
||||
/* Find a existed IP-MAC Mapping entry */
|
||||
if (NdisEqualMemory(pIPv6Addr, pEntry->ipv6Addr, IPV6_ADDR_LEN))
|
||||
{
|
||||
|
||||
/* comparison is useless. So we directly copy it into the entry. */
|
||||
NdisMoveMemory(pEntry->macAddr, pMacAddr, 6);
|
||||
NdisGetSystemUpTime(&pEntry->lastTime);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{ /* handle the aging-out situation */
|
||||
if (RTMP_TIME_AFTER(now, (pEntry->lastTime + MAT_TB_ENTRY_AGEOUT_TIME)))
|
||||
{
|
||||
/* Remove the aged entry */
|
||||
if (pEntry == pIPv6MacTable->hash[hashIdx])
|
||||
{
|
||||
pIPv6MacTable->hash[hashIdx]= pEntry->pNext;
|
||||
pPrev = pIPv6MacTable->hash[hashIdx];
|
||||
}
|
||||
else
|
||||
{
|
||||
pPrev->pNext = pEntry->pNext;
|
||||
}
|
||||
MATDBEntryFree(pMatCfg, (PUCHAR)pEntry);
|
||||
|
||||
pEntry = (pPrev == NULL ? NULL: pPrev->pNext);
|
||||
pMatCfg->nodeCount--;
|
||||
}
|
||||
else
|
||||
{
|
||||
pPrev = pEntry;
|
||||
pEntry = pEntry->pNext;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Allocate a new IPv6MacMapping entry and insert into the hash */
|
||||
pNewEntry = (IPv6MacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPv6MacMappingEntry));
|
||||
if (pNewEntry != NULL)
|
||||
{
|
||||
NdisMoveMemory(pNewEntry->ipv6Addr, pIPv6Addr, IPV6_ADDR_LEN);
|
||||
NdisMoveMemory(pNewEntry->macAddr, pMacAddr, 6);
|
||||
pNewEntry->pNext = NULL;
|
||||
NdisGetSystemUpTime(&pNewEntry->lastTime);
|
||||
|
||||
if (pIPv6MacTable->hash[hashIdx] == NULL)
|
||||
{ /* Hash list is empty, directly assign it. */
|
||||
pIPv6MacTable->hash[hashIdx] = pNewEntry;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ok, we insert the new entry into the root of hash[hashIdx] */
|
||||
pNewEntry->pNext = pIPv6MacTable->hash[hashIdx];
|
||||
pIPv6MacTable->hash[hashIdx] = pNewEntry;
|
||||
}
|
||||
/*dumpIPv6MacTb(pMatCfg, hashIdx); //for debug */
|
||||
|
||||
pMatCfg->nodeCount++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPv6MacTableUpdate():Insertion failed!\n"));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
static PUCHAR IPv6MacTableLookUp(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PUCHAR pIPv6Addr)
|
||||
{
|
||||
UINT hashIdx;
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pEntry = NULL;
|
||||
PUCHAR pGroupMacAddr;
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if ((!pIPv6MacTable) ||(!pIPv6MacTable->valid))
|
||||
return NULL;
|
||||
|
||||
/*if IPV6 multicast address, need converting multicast group address to ethernet address. */
|
||||
if (IS_MULTICAST_IPV6_ADDR(*(RT_IPV6_ADDR *)pIPv6Addr))
|
||||
{
|
||||
pGroupMacAddr = (PUCHAR)&pIPv6MacTable->curMcastAddr;
|
||||
ConvertMulticastIP2MAC(pIPv6Addr, (UCHAR **)(&pGroupMacAddr), ETH_P_IPV6);
|
||||
return pIPv6MacTable->curMcastAddr;
|
||||
}
|
||||
|
||||
/* Use hash to find out the location of that entry and get the Mac address. */
|
||||
hashIdx = MAT_IPV6_ADDR_HASH_INDEX(pIPv6Addr);
|
||||
|
||||
/* spin_lock_irqsave(&IPMacTabLock, irqFlag); */
|
||||
pEntry = pIPv6MacTable->hash[hashIdx];
|
||||
while(pEntry)
|
||||
{
|
||||
if (NdisEqualMemory(pEntry->ipv6Addr, pIPv6Addr, IPV6_ADDR_LEN))
|
||||
{
|
||||
|
||||
/*Update the lastTime to prevent the aging before pDA processed! */
|
||||
NdisGetSystemUpTime(&pEntry->lastTime);
|
||||
|
||||
return pEntry->macAddr;
|
||||
}
|
||||
else
|
||||
{
|
||||
pEntry = pEntry->pNext;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
We didn't find any matched Mac address, our policy is treat it as
|
||||
broadcast packet and send to all.
|
||||
*/
|
||||
return pIPv6MacTable->hash[IPV6MAC_TB_HASH_INDEX_OF_BCAST]->macAddr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static inline unsigned short int icmpv6_csum(
|
||||
RT_IPV6_ADDR *saddr,
|
||||
RT_IPV6_ADDR *daddr,
|
||||
USHORT len,
|
||||
UCHAR proto,
|
||||
UCHAR *pICMPMsg)
|
||||
{
|
||||
int carry;
|
||||
UINT32 ulen;
|
||||
UINT32 uproto;
|
||||
int i;
|
||||
unsigned int csum = 0;
|
||||
unsigned short int chksum;
|
||||
|
||||
if (len % 4)
|
||||
return 0;
|
||||
|
||||
for( i = 0; i < 4; i++)
|
||||
{
|
||||
csum += saddr->ipv6_addr32[i];
|
||||
carry = (csum < saddr->ipv6_addr32[i]);
|
||||
csum += carry;
|
||||
}
|
||||
|
||||
for( i = 0; i < 4; i++)
|
||||
{
|
||||
csum += daddr->ipv6_addr32[i];
|
||||
carry = (csum < daddr->ipv6_addr32[i]);
|
||||
csum += carry;
|
||||
}
|
||||
|
||||
ulen = OS_HTONL((UINT32)len);
|
||||
csum += ulen;
|
||||
carry = (csum < ulen);
|
||||
csum += carry;
|
||||
|
||||
uproto = OS_HTONL((UINT32)proto);
|
||||
csum += uproto;
|
||||
carry = (csum < uproto);
|
||||
csum += carry;
|
||||
|
||||
for (i = 0; i < len; i += 4)
|
||||
{
|
||||
csum += get_unaligned32(((UINT32 *)&pICMPMsg[i]));
|
||||
carry = (csum < get_unaligned32(((UINT32 *)&pICMPMsg[i])));
|
||||
csum += carry;
|
||||
}
|
||||
|
||||
while (csum>>16)
|
||||
csum = (csum & 0xffff) + (csum >> 16);
|
||||
|
||||
chksum = ~csum;
|
||||
|
||||
return chksum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static PUCHAR MATProto_IPv6_Rx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr)
|
||||
{
|
||||
|
||||
PUCHAR pMacAddr;
|
||||
PUCHAR pDstIPv6Addr;
|
||||
|
||||
/* Fetch the IPv6 addres from the packet header. */
|
||||
pDstIPv6Addr = (UCHAR *)(&((RT_IPV6_HDR *)pLayerHdr)->dstAddr);
|
||||
|
||||
pMacAddr = IPv6MacTableLookUp(pMatCfg, pDstIPv6Addr);
|
||||
|
||||
return pMacAddr;
|
||||
|
||||
}
|
||||
|
||||
static PNDIS_PACKET ICMPv6_Handle_Tx(
|
||||
IN MAT_STRUCT *pMatSrtuct,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr,
|
||||
IN UINT32 offset)
|
||||
{
|
||||
RT_IPV6_HDR *pIPv6Hdr;
|
||||
RT_ICMPV6_HDR *pICMPv6Hdr;
|
||||
RT_ICMPV6_OPTION_HDR *pOptHdr;
|
||||
|
||||
USHORT payloadLen;
|
||||
UINT32 ICMPOffset = 0, ICMPMsgLen = 0, leftLen;
|
||||
|
||||
PNDIS_PACKET newSkb = NULL;
|
||||
BOOLEAN needModify = FALSE;
|
||||
PUCHAR pSrcMac;
|
||||
|
||||
pIPv6Hdr = (RT_IPV6_HDR *)pLayerHdr;
|
||||
payloadLen = OS_NTOHS(pIPv6Hdr->payload_len);
|
||||
|
||||
pICMPv6Hdr = (RT_ICMPV6_HDR *)(pLayerHdr + offset);
|
||||
ICMPOffset = offset;
|
||||
ICMPMsgLen = payloadLen + IPV6_HDR_LEN - ICMPOffset;
|
||||
|
||||
|
||||
|
||||
leftLen = ICMPMsgLen;
|
||||
switch (pICMPv6Hdr->type)
|
||||
{
|
||||
case ICMPV6_MSG_TYPE_ROUTER_SOLICITATION:
|
||||
offset += ROUTER_SOLICITATION_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the option about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_SRC_LL_ADDR)
|
||||
{
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. Here indicate to the place of src mac. */
|
||||
|
||||
break;
|
||||
} else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ICMPV6_MSG_TYPE_ROUTER_ADVERTISEMENT:
|
||||
offset += ROUTER_ADVERTISEMENT_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the option about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_SRC_LL_ADDR)
|
||||
{
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. Here indicate to the place of src mac. */
|
||||
|
||||
break;
|
||||
} else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ICMPV6_MSG_TYPE_NEIGHBOR_SOLICITATION:
|
||||
offset += NEIGHBOR_SOLICITATION_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the option about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_SRC_LL_ADDR)
|
||||
{
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. Here indicate to the place of src mac. */
|
||||
|
||||
break;
|
||||
} else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ICMPV6_MSG_TYPE_NEIGHBOR_ADVERTISEMENT:
|
||||
offset += NEIGHBOR_ADVERTISEMENT_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the option about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_TGT_LL_ADDR)
|
||||
{
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. */
|
||||
|
||||
break;
|
||||
}else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ICMPV6_MSG_TYPE_REDIRECT:
|
||||
offset += REDIRECT_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the options about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_TGT_LL_ADDR)
|
||||
{
|
||||
/* TODO: Need to check if the TGT_LL_ADDR is the inner MAC. */
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. */
|
||||
|
||||
break;
|
||||
}else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Un-supported ICMPv6 msg type(0x%x)! Ignore it\n", pICMPv6Hdr->type));
|
||||
break;
|
||||
}
|
||||
|
||||
/* We need to handle about the solicitation/Advertisement packets. */
|
||||
if (needModify)
|
||||
{
|
||||
if(OS_PKT_CLONED(pSkb))
|
||||
{
|
||||
newSkb = (PNDIS_PACKET)OS_PKT_COPY(RTPKT_TO_OSPKT(pSkb));
|
||||
if(newSkb) {
|
||||
if (IS_VLAN_PACKET(GET_OS_PKT_DATAPTR(newSkb)))
|
||||
pIPv6Hdr = (RT_IPV6_HDR *)(GET_OS_PKT_DATAPTR(newSkb) + MAT_VLAN_ETH_HDR_LEN);
|
||||
else
|
||||
pIPv6Hdr = (RT_IPV6_HDR *)(GET_OS_PKT_DATAPTR(newSkb) + MAT_ETHER_HDR_LEN);
|
||||
}
|
||||
}
|
||||
|
||||
pICMPv6Hdr = (RT_ICMPV6_HDR *)((PUCHAR)pIPv6Hdr + ICMPOffset);
|
||||
pSrcMac = (PUCHAR)((PUCHAR)pIPv6Hdr + offset);
|
||||
NdisMoveMemory(pSrcMac, pDevMacAdr, MAC_ADDR_LEN);
|
||||
|
||||
/* Now re-calculate the Checksum. */
|
||||
pICMPv6Hdr->chksum = 0;
|
||||
pICMPv6Hdr->chksum = icmpv6_csum(&pIPv6Hdr->srcAddr, &pIPv6Hdr->dstAddr, ICMPMsgLen ,
|
||||
IPV6_NEXT_HEADER_ICMPV6, (PUCHAR)pICMPv6Hdr);
|
||||
}
|
||||
|
||||
return newSkb;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static PUCHAR MATProto_IPv6_Tx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr)
|
||||
{
|
||||
PUCHAR pSrcMac/*, pSrcIP*/;
|
||||
BOOLEAN needUpdate;
|
||||
UCHAR nextProtocol;
|
||||
UINT32 offset;
|
||||
HEADER_802_3 *pEthHdr;
|
||||
RT_IPV6_HDR *pIPv6Hdr;
|
||||
PNDIS_PACKET newSkb = NULL;
|
||||
|
||||
pIPv6Hdr = (RT_IPV6_HDR *)pLayerHdr;
|
||||
pEthHdr = (HEADER_802_3 *)(GET_OS_PKT_DATAPTR(pSkb));
|
||||
|
||||
pSrcMac = (UCHAR *)&pEthHdr->SAAddr2;
|
||||
//pSrcIP = (UCHAR *)&pIPv6Hdr->srcAddr;
|
||||
|
||||
|
||||
|
||||
needUpdate = needUpdateIPv6MacTB(pSrcMac, (RT_IPV6_ADDR *)(&pIPv6Hdr->srcAddr));
|
||||
if (needUpdate)
|
||||
IPv6MacTableUpdate(pMatCfg, pSrcMac, (CHAR *)(&pIPv6Hdr->srcAddr));
|
||||
|
||||
|
||||
/* We need to traverse the whole IPv6 Header and extend headers to check about the ICMPv6 pacekt. */
|
||||
nextProtocol = pIPv6Hdr->nextHdr;
|
||||
offset = IPV6_HDR_LEN;
|
||||
/*DBGPRINT(RT_DEBUG_INFO, ("NextProtocol=0x%x! payloadLen=%d! offset=%d!\n", nextProtocol, payloadLen, offset)); */
|
||||
while(nextProtocol != IPV6_NEXT_HEADER_ICMPV6 &&
|
||||
nextProtocol != IPV6_NEXT_HEADER_UDP &&
|
||||
nextProtocol != IPV6_NEXT_HEADER_TCP &&
|
||||
nextProtocol != IPV6_NEXT_HEADER_NONE)
|
||||
{
|
||||
if(IPv6ExtHdrHandle((RT_IPV6_EXT_HDR *)(pLayerHdr + offset), &nextProtocol, &offset) == FALSE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("IPv6ExtHdrHandle failed!\n"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (nextProtocol)
|
||||
{
|
||||
case IPV6_NEXT_HEADER_ICMPV6:
|
||||
newSkb = ICMPv6_Handle_Tx(pMatCfg, pSkb, pLayerHdr, pDevMacAdr, offset);
|
||||
break;
|
||||
|
||||
case IPV6_NEXT_HEADER_UDP:
|
||||
/*newSkb = DHCPv6_Handle_Tx(pMatStrcut, pSkb, pLayerHdr, pMacAddr, offset); */
|
||||
break;
|
||||
|
||||
case IPV6_NEXT_HEADER_TCP:
|
||||
case IPV6_NEXT_HEADER_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return (PUCHAR)newSkb;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static NDIS_STATUS IPv6MacTable_RemoveAll(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pEntry;
|
||||
UINT32 i;
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if (!pIPv6MacTable)
|
||||
return TRUE;
|
||||
|
||||
if (pIPv6MacTable->valid)
|
||||
{
|
||||
pIPv6MacTable->valid = FALSE;
|
||||
for (i=0; i<IPV6MAC_TB_HASH_ENTRY_NUM; i++)
|
||||
{
|
||||
while((pEntry = pIPv6MacTable->hash[i]) != NULL)
|
||||
{
|
||||
pIPv6MacTable->hash[i] = pEntry->pNext;
|
||||
MATDBEntryFree(pMatCfg, (PUCHAR)pEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
os_free_mem(NULL, pIPv6MacTable);
|
||||
pMatCfg->MatTableSet.IPv6MacTable = NULL;
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS IPv6MacTable_init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
IPv6MacMappingEntry *pEntry = NULL;
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
|
||||
|
||||
if (pMatCfg->MatTableSet.IPv6MacTable != NULL)
|
||||
{
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
}
|
||||
else
|
||||
{
|
||||
os_alloc_mem_suspend(NULL, (UCHAR **)&(pMatCfg->MatTableSet.IPv6MacTable), sizeof(IPv6MacMappingTable));
|
||||
if (pMatCfg->MatTableSet.IPv6MacTable)
|
||||
{
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
NdisZeroMemory(pIPv6MacTable, sizeof(IPv6MacMappingTable));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPMacTable_init(): Allocate memory for IPv6MacTable failed!\n"));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (pIPv6MacTable->valid == FALSE)
|
||||
{
|
||||
/*Set the last hash entry (hash[64]) as our default broadcast Mac address */
|
||||
pEntry = (IPv6MacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPv6MacMappingEntry));
|
||||
if (!pEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPMacTable_init(): Allocate memory for IPMacTable broadcast entry failed!\n"));
|
||||
return FALSE;
|
||||
}
|
||||
NdisZeroMemory(pEntry, sizeof(IPv6MacMappingEntry));
|
||||
NdisMoveMemory(pEntry->macAddr, BROADCAST_ADDR, MAC_ADDR_LEN);
|
||||
pEntry->pNext = NULL;
|
||||
pIPv6MacTable->hash[IPV6MAC_TB_HASH_INDEX_OF_BCAST] = pEntry;
|
||||
|
||||
pIPv6MacTable->valid = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): IPv6MacTable already inited!\n", __FUNCTION__));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_IPv6_Exit(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
INT status;
|
||||
|
||||
status = IPv6MacTable_RemoveAll(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_IPv6_Init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
|
||||
BOOLEAN status = FALSE;
|
||||
|
||||
status = IPv6MacTable_init(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID getIPv6MacTbInfo(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN char *pOutBuf,
|
||||
IN ULONG BufLen)
|
||||
{
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pHead;
|
||||
int startIdx, endIdx;
|
||||
char Ipv6str[40] = {0};
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if ((!pIPv6MacTable) || (!pIPv6MacTable->valid))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s():IPv6MacTable not init yet!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* dump all. */
|
||||
startIdx = 0;
|
||||
endIdx = MAT_MAX_HASH_ENTRY_SUPPORT;
|
||||
|
||||
sprintf(pOutBuf, "\n");
|
||||
sprintf(pOutBuf+strlen(pOutBuf), "%-40s%-20s\n", "IP", "MAC");
|
||||
for(; startIdx< endIdx; startIdx++)
|
||||
{
|
||||
pHead = pIPv6MacTable->hash[startIdx];
|
||||
|
||||
while(pHead)
|
||||
{
|
||||
/* if (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30)) */
|
||||
if (RtmpOsCmdDisplayLenCheck(strlen(pOutBuf), 30) == FALSE)
|
||||
break;
|
||||
NdisZeroMemory(Ipv6str, 40);
|
||||
sprintf(Ipv6str, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x", PRINT_IPV6_ADDR(*((RT_IPV6_ADDR *)(&pHead->ipv6Addr[0]))));
|
||||
sprintf(pOutBuf+strlen(pOutBuf), "%-40s%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
Ipv6str, pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],
|
||||
pHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5]);
|
||||
pHead = pHead->pNext;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* MAT_SUPPORT */
|
||||
|
File diff suppressed because it is too large
Load Diff
5440
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_profile.c
Normal file
5440
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_profile.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,428 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_radar.c
|
||||
|
||||
Abstract:
|
||||
CS/DFS common functions.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
||||
/*----- 802.11H -----*/
|
||||
|
||||
/* Periodic Radar detection, switch channel will occur in RTMPHandleTBTTInterrupt()*/
|
||||
/* Before switch channel, driver needs doing channel switch announcement.*/
|
||||
VOID RadarDetectPeriodic(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT i, ChIdx = 0, bAnyUnavailableChannel = FALSE;
|
||||
|
||||
/*
|
||||
1. APStart(), CalBufTime = 0;
|
||||
2. if bAnyUnavailableChannel, CalBufTime = DEFAULT_CAL_BUF_TIME;
|
||||
3. if Calibrated, CalBufTime = DEFAULT_CAL_BUF_TIME_MAX;
|
||||
*/
|
||||
for (i=0; i<pAd->ChannelListNum; i++)
|
||||
{
|
||||
if (pAd->ChannelList[i].RemainingTimeForUse != 0)
|
||||
{
|
||||
bAnyUnavailableChannel = TRUE;
|
||||
}
|
||||
|
||||
if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
|
||||
{
|
||||
ChIdx = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (bAnyUnavailableChannel)
|
||||
pAd->Dot11_H.CalBufTime = DEFAULT_CAL_BUF_TIME;
|
||||
|
||||
if (pAd->Dot11_H.RDMode == RD_SILENCE_MODE)
|
||||
{
|
||||
/* In Silent Mode, RDCount is use to check with the CAC Time */
|
||||
if (pAd->Dot11_H.RDCount++ > pAd->Dot11_H.ChMovingTime &&
|
||||
pAd->ChannelList[ChIdx].RemainingTimeForUse == 0)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Not found radar signal, start send beacon and radar detection in service monitor\n\n"));
|
||||
pAd->Dot11_H.RDMode = RD_NORMAL_MODE;
|
||||
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
pAd->Dot11_H.RDCount = 0;
|
||||
}
|
||||
}
|
||||
else if (pAd->Dot11_H.RDMode == RD_NORMAL_MODE)
|
||||
{
|
||||
if (!bAnyUnavailableChannel)
|
||||
{
|
||||
pAd->Dot11_H.RDCount++;
|
||||
/* In Normal Mode, RDCount is use to check with the CalBufTime */
|
||||
if ((pAd->Dot11_H.RDCount >= pAd->Dot11_H.CalBufTime))
|
||||
{
|
||||
pAd->Dot11_H.CalBufTime = DEFAULT_CAL_BUF_TIME_MAX;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Radar channel check routine
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
TRUE need to do radar detect
|
||||
FALSE need not to do radar detect
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RadarChannelCheck(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Ch)
|
||||
{
|
||||
INT i;
|
||||
BOOLEAN result = FALSE;
|
||||
|
||||
for (i=0; i<pAd->ChannelListNum; i++)
|
||||
{
|
||||
if (Ch == pAd->ChannelList[i].Channel)
|
||||
{
|
||||
result = pAd->ChannelList[i].DfsReq;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Determine the current radar state
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RadarStateCheck(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
pAd->Dot11_H.CalBufTime = 0;
|
||||
|
||||
if ((pAd->CommonCfg.Channel > 14) &&
|
||||
(pAd->CommonCfg.bIEEE80211H == 1) &&
|
||||
RadarChannelCheck(pAd, pAd->CommonCfg.Channel))
|
||||
{
|
||||
pAd->Dot11_H.RDMode = RD_SILENCE_MODE;
|
||||
pAd->Dot11_H.RDCount = 0;
|
||||
pAd->Dot11_H.InServiceMonitorCount = 0;
|
||||
}
|
||||
else
|
||||
pAd->Dot11_H.RDMode = RD_NORMAL_MODE;
|
||||
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
if ((pAd->CommonCfg.RDDurRegion == JAP)
|
||||
|| (pAd->CommonCfg.RDDurRegion == JAP_W53)
|
||||
|| (pAd->CommonCfg.RDDurRegion == JAP_W56))
|
||||
{
|
||||
|
||||
if ((pAd->CommonCfg.Channel > 14) ||
|
||||
(pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40))
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.Enable = TRUE;
|
||||
}
|
||||
}
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
}
|
||||
|
||||
|
||||
ULONG JapRadarType(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ULONG i;
|
||||
const UCHAR Channel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};
|
||||
|
||||
if (pAd->CommonCfg.RDDurRegion != JAP)
|
||||
{
|
||||
return pAd->CommonCfg.RDDurRegion;
|
||||
}
|
||||
|
||||
for (i=0; i<15; i++)
|
||||
{
|
||||
if (pAd->CommonCfg.Channel == Channel[i])
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < 4)
|
||||
return JAP_W53;
|
||||
else if (i < 15)
|
||||
return JAP_W56;
|
||||
else
|
||||
return JAP; /* W52*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
UCHAR get_channel_by_reference(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT8 mode)
|
||||
{
|
||||
UCHAR ch = 0;
|
||||
INT ch_idx;
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
USHORT min_time = 0xFFFF;
|
||||
/* select channel with least RemainingTimeForUse */
|
||||
for ( ch_idx = 0; ch_idx < pAd->ChannelListNum; ch_idx++)
|
||||
{
|
||||
if (pAd->ChannelList[ch_idx].RemainingTimeForUse < min_time)
|
||||
{
|
||||
min_time = pAd->ChannelList[ch_idx].RemainingTimeForUse;
|
||||
ch = pAd->ChannelList[ch_idx].Channel;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
ch = FirstChannel(pAd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,("%s(): mode = %u, ch = %u\n",
|
||||
__FUNCTION__, mode, ch));
|
||||
return ch;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Channel switching count down process upon radar detection
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID ChannelSwitchingCountDownProc(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s():Channel Switching...(%d/%d)\n",
|
||||
__FUNCTION__, pAd->Dot11_H.CSCount, pAd->Dot11_H.CSPeriod));
|
||||
|
||||
pAd->Dot11_H.CSCount++;
|
||||
if (pAd->Dot11_H.CSCount >= pAd->Dot11_H.CSPeriod)
|
||||
{
|
||||
#ifdef DFS_SUPPORT
|
||||
pAd->CommonCfg.RadarDetect.DFSAPRestart = 1;
|
||||
schedule_dfs_task(pAd);
|
||||
#else
|
||||
APStop(pAd);
|
||||
APStartUp(pAd);
|
||||
#endif /* !DFS_SUPPORT */
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Set channel switch Period
|
||||
Return:
|
||||
TRUE if all parameters are OK, FALSE otherwise
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CSPeriod_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
pAd->Dot11_H.CSPeriod = (USHORT) simple_strtol(arg, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Set_CSPeriod_Proc::(CSPeriod=%d)\n", pAd->Dot11_H.CSPeriod));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
change channel moving time for DFS testing.
|
||||
|
||||
Arguments:
|
||||
pAdapter Pointer to our adapter
|
||||
wrq Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
Usage:
|
||||
1.) iwpriv ra0 set ChMovTime=[value]
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_ChMovingTime_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
USHORT Value;
|
||||
|
||||
Value = (USHORT) simple_strtol(arg, 0, 10);
|
||||
|
||||
pAd->Dot11_H.ChMovingTime = Value;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: %d\n", __FUNCTION__,
|
||||
pAd->Dot11_H.ChMovingTime));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Reset channel block status.
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Not used
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
Usage:
|
||||
1.) iwpriv ra0 set ChMovTime=[value]
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_BlockChReset_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
INT i;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: Reset channel block status.\n", __FUNCTION__));
|
||||
|
||||
for (i=0; i<pAd->ChannelListNum; i++)
|
||||
pAd->ChannelList[i].RemainingTimeForUse = 0;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
#if defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT)
|
||||
|
||||
INT Set_RadarShow_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
#ifdef DFS_SUPPORT
|
||||
UINT8 idx;
|
||||
PRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;
|
||||
PDFS_PROGRAM_PARAM pDfsProgramParam = &pRadarDetect->DfsProgramParam;
|
||||
PDFS_SW_DETECT_PARAM pDfsSwParam = &pRadarDetect->DfsSwParam;
|
||||
PCHAR RDMode[]= {"Normal State", "Switching State", "Silent State"};
|
||||
|
||||
printk("DFSUseTasklet = %d\n", pRadarDetect->use_tasklet);
|
||||
printk("McuRadarDebug = %x\n", (unsigned int)pRadarDetect->McuRadarDebug);
|
||||
printk("PollTime = %d\n", pRadarDetect->PollTime);
|
||||
printk("ChEnable = %d (0x%x)\n", pDfsProgramParam->ChEnable, pDfsProgramParam->ChEnable);
|
||||
printk("DeltaDelay = %d\n", pDfsProgramParam->DeltaDelay);
|
||||
printk("PeriodErr = %d\n", pDfsSwParam->dfs_period_err);
|
||||
printk("MaxPeriod = %d\n", (unsigned int)pDfsSwParam->dfs_max_period);
|
||||
printk("Ch0LErr = %d\n", pDfsSwParam->dfs_width_ch0_err_L);
|
||||
printk("Ch0HErr = %d\n", pDfsSwParam->dfs_width_ch0_err_H);
|
||||
printk("Ch1Shift = %d\n", pDfsSwParam->dfs_width_diff_ch1_Shift);
|
||||
printk("Ch2Shift = %d\n", pDfsSwParam->dfs_width_diff_ch2_Shift);
|
||||
printk("DfsRssiHigh = %d\n", pRadarDetect->DfsRssiHigh);
|
||||
printk("DfsRssiLow = %d\n", pRadarDetect->DfsRssiLow);
|
||||
printk("DfsSwDisable = %u\n", pRadarDetect->bDfsSwDisable);
|
||||
printk("CheckLoop = %d\n", pDfsSwParam->dfs_check_loop);
|
||||
printk("DeclareThres = %d\n", pDfsSwParam->dfs_declare_thres);
|
||||
for (idx=0; idx < pAd->chipCap.DfsEngineNum; idx++)
|
||||
printk("sw_idx[%u] = %u\n", idx, pDfsSwParam->sw_idx[idx]);
|
||||
for (idx=0; idx < pAd->chipCap.DfsEngineNum; idx++)
|
||||
printk("hw_idx[%u] = %u\n", idx, pDfsSwParam->hw_idx[idx]);
|
||||
|
||||
printk("pAd->Dot11_H.ChMovingTime = %d\n", pAd->Dot11_H.ChMovingTime);
|
||||
printk("pAd->Dot11_H.RDMode = %s\n", RDMode[pAd->Dot11_H.RDMode]);
|
||||
printk("pAd->Dot11_H.RDCount = %d\n", pAd->Dot11_H.RDCount);
|
||||
printk("pAd->Dot11_H.CalBufTime = %d\n", pAd->Dot11_H.CalBufTime);
|
||||
#endif /* DFS_SUPPORT */
|
||||
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
printk("pAd->CommonCfg.CarrierDetect.CD_State = %d\n", pAd->CommonCfg.CarrierDetect.CD_State);
|
||||
printk("pAd->CommonCfg.CarrierDetect.criteria = %d\n", pAd->CommonCfg.CarrierDetect.criteria);
|
||||
printk("pAd->CommonCfg.CarrierDetect.Delta = %d\n", pAd->CommonCfg.CarrierDetect.delta);
|
||||
printk("pAd->CommonCfg.CarrierDetect.DivFlag = %d\n", pAd->CommonCfg.CarrierDetect.div_flag);
|
||||
printk("pAd->CommonCfg.CarrierDetect.Threshold = %d(0x%x)\n", pAd->CommonCfg.CarrierDetect.threshold, pAd->CommonCfg.CarrierDetect.threshold);
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Control CCK_MRC Status
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
Return Value:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID CckMrcStatusCtrl(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Enhance DFS/CS when using GLRT.
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
Return Value:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RadarGLRTCompensate(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
#endif /*defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT) */
|
||||
|
2996
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_rf_cal.c
Normal file
2996
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_rf_cal.c
Normal file
File diff suppressed because it is too large
Load Diff
2262
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_sanity.c
Normal file
2262
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_sanity.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,635 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_sync.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
John Chang 2004-09-01 modified for rt2561/2661
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
||||
/*BaSizeArray follows the 802.11n definition as MaxRxFactor. 2^(13+factor) bytes. When factor =0, it's about Ba buffer size =8.*/
|
||||
UCHAR BaSizeArray[4] = {8,16,32,64};
|
||||
|
||||
extern COUNTRY_REGION_CH_DESC Country_Region_ChDesc_2GHZ[];
|
||||
extern UINT16 const Country_Region_GroupNum_2GHZ;
|
||||
extern COUNTRY_REGION_CH_DESC Country_Region_ChDesc_5GHZ[];
|
||||
extern UINT16 const Country_Region_GroupNum_5GHZ;
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Update StaCfg->ChannelList[] according to 1) Country Region 2) RF IC type,
|
||||
and 3) PHY-mode user selected.
|
||||
The outcome is used by driver when doing site survey.
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
==========================================================================
|
||||
*/
|
||||
VOID BuildChannelList(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UCHAR i, j, index=0, num=0;
|
||||
PCH_DESC pChDesc = NULL;
|
||||
BOOLEAN bRegionFound = FALSE;
|
||||
PUCHAR pChannelList = NULL;
|
||||
PUCHAR pChannelListFlag = NULL;
|
||||
|
||||
|
||||
|
||||
NdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));
|
||||
|
||||
/* if not 11a-only mode, channel list starts from 2.4Ghz band*/
|
||||
if (WMODE_CAP_2G(pAd->CommonCfg.PhyMode))
|
||||
{
|
||||
for (i = 0; i < Country_Region_GroupNum_2GHZ; i++)
|
||||
{
|
||||
if ((pAd->CommonCfg.CountryRegion & 0x7f) ==
|
||||
Country_Region_ChDesc_2GHZ[i].RegionIndex)
|
||||
{
|
||||
pChDesc = Country_Region_ChDesc_2GHZ[i].pChDesc;
|
||||
num = TotalChNum(pChDesc);
|
||||
bRegionFound = TRUE;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bRegionFound)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("CountryRegion=%d not support", pAd->CommonCfg.CountryRegion));
|
||||
return;
|
||||
}
|
||||
|
||||
if (num > 0)
|
||||
{
|
||||
os_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR));
|
||||
|
||||
if (!pChannelList)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelList failed\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR));
|
||||
|
||||
if (!pChannelListFlag)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelListFlag failed\n", __FUNCTION__));
|
||||
os_free_mem(NULL, pChannelList);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
pChannelList[i] = GetChannel_2GHZ(pChDesc, i);
|
||||
pChannelListFlag[i] = GetChannelFlag(pChDesc, i);
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
for (j = 0; j < MAX_NUM_OF_CHANNELS; j++)
|
||||
{
|
||||
if (pChannelList[i] == pAd->TxPower[j].Channel)
|
||||
NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER));
|
||||
}
|
||||
|
||||
pAd->ChannelList[index + i].Flags = pChannelListFlag[i];
|
||||
/* TODO: shiang-7603, NdisMoveMemory may replace the
|
||||
* pAd->ChannelList[index+i].Channel as other values!
|
||||
*/
|
||||
pAd->ChannelList[index+i].Channel = pChannelList[i];
|
||||
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel))
|
||||
pAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP;
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (vht80_channel_group(pAd, pAd->ChannelList[index + i].Channel))
|
||||
pAd->ChannelList[index + i].Flags |= CHANNEL_80M_CAP;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
if (!strncmp((RTMP_STRING *) pAd->CommonCfg.CountryCode, "CN", 2))
|
||||
pAd->ChannelList[index+i].MaxTxPwr = pAd->MaxTxPwr;/*for CN CountryCode*/
|
||||
else
|
||||
pAd->ChannelList[index+i].MaxTxPwr = 20;
|
||||
}
|
||||
|
||||
index += num;
|
||||
|
||||
os_free_mem(NULL, pChannelList);
|
||||
os_free_mem(NULL, pChannelListFlag);
|
||||
}
|
||||
bRegionFound = FALSE;
|
||||
num = 0;
|
||||
}
|
||||
|
||||
if (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))
|
||||
{
|
||||
for (i = 0; i < Country_Region_GroupNum_5GHZ; i++)
|
||||
{
|
||||
if ((pAd->CommonCfg.CountryRegionForABand & 0x7f) ==
|
||||
Country_Region_ChDesc_5GHZ[i].RegionIndex)
|
||||
{
|
||||
pChDesc = Country_Region_ChDesc_5GHZ[i].pChDesc;
|
||||
num = TotalChNum(pChDesc);
|
||||
bRegionFound = TRUE;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bRegionFound)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("CountryRegionABand=%d not support", pAd->CommonCfg.CountryRegionForABand));
|
||||
return;
|
||||
}
|
||||
|
||||
if (num > 0)
|
||||
{
|
||||
UCHAR RadarCh[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
UCHAR q=0;
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
os_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR));
|
||||
|
||||
if (!pChannelList)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelList failed\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR));
|
||||
|
||||
if (!pChannelListFlag)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelListFlag failed\n", __FUNCTION__));
|
||||
os_free_mem(NULL, pChannelList);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
pChannelList[i] = GetChannel_5GHZ(pChDesc, i);
|
||||
pChannelListFlag[i] = GetChannelFlag(pChDesc, i);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
if((pAd->CommonCfg.bIEEE80211H == 0)|| ((pAd->CommonCfg.bIEEE80211H == 1) && (pAd->CommonCfg.RDDurRegion != FCC)))
|
||||
{
|
||||
pChannelList[q] = GetChannel_5GHZ(pChDesc, i);
|
||||
pChannelListFlag[q] = GetChannelFlag(pChDesc, i);
|
||||
q++;
|
||||
}
|
||||
/*Based on the requiremnt of FCC, some channles could not be used anymore when test DFS function.*/
|
||||
else if ((pAd->CommonCfg.bIEEE80211H == 1) &&
|
||||
(pAd->CommonCfg.RDDurRegion == FCC) &&
|
||||
(pAd->Dot11_H.bDFSIndoor == 1))
|
||||
{
|
||||
if((GetChannel_5GHZ(pChDesc, i) < 116) || (GetChannel_5GHZ(pChDesc, i) > 128))
|
||||
{
|
||||
pChannelList[q] = GetChannel_5GHZ(pChDesc, i);
|
||||
pChannelListFlag[q] = GetChannelFlag(pChDesc, i);
|
||||
q++;
|
||||
}
|
||||
}
|
||||
else if ((pAd->CommonCfg.bIEEE80211H == 1) &&
|
||||
(pAd->CommonCfg.RDDurRegion == FCC) &&
|
||||
(pAd->Dot11_H.bDFSIndoor == 0))
|
||||
{
|
||||
if((GetChannel_5GHZ(pChDesc, i) < 100) || (GetChannel_5GHZ(pChDesc, i) > 140) )
|
||||
{
|
||||
pChannelList[q] = GetChannel_5GHZ(pChDesc, i);
|
||||
pChannelListFlag[q] = GetChannelFlag(pChDesc, i);
|
||||
q++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
num = q;
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
for (i=0; i<num; i++)
|
||||
{
|
||||
for (j=0; j<MAX_NUM_OF_CHANNELS; j++)
|
||||
{
|
||||
if (pChannelList[i] == pAd->TxPower[j].Channel)
|
||||
NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER));
|
||||
}
|
||||
|
||||
pAd->ChannelList[index + i].Flags = pChannelListFlag[i];
|
||||
/* TODO: shiang-7603, NdisMoveMemory may replace the
|
||||
* pAd->ChannelList[index+i].Channel as other values!
|
||||
*/
|
||||
pAd->ChannelList[index+i].Channel = pChannelList[i];
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel))
|
||||
pAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP;
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (vht80_channel_group(pAd, pAd->ChannelList[index + i].Channel))
|
||||
pAd->ChannelList[index + i].Flags |= CHANNEL_80M_CAP;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
|
||||
for (j=0; j<15; j++)
|
||||
{
|
||||
if (pChannelList[i] == RadarCh[j])
|
||||
pAd->ChannelList[index+i].DfsReq = TRUE;
|
||||
}
|
||||
pAd->ChannelList[index+i].MaxTxPwr = 20;
|
||||
}
|
||||
index += num;
|
||||
|
||||
os_free_mem(NULL, pChannelList);
|
||||
os_free_mem(NULL, pChannelListFlag);
|
||||
}
|
||||
}
|
||||
|
||||
pAd->ChannelListNum = index;
|
||||
DBGPRINT(RT_DEBUG_TRACE,("CountryCode(2.4G/5G)=%d/%d, RFIC=%d, PHY mode=%d, support %d channels\n",
|
||||
pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryRegionForABand, pAd->RfIcType, pAd->CommonCfg.PhyMode, pAd->ChannelListNum));
|
||||
|
||||
|
||||
#ifdef DBG
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SupportedChannelList:\n"));
|
||||
for (i=0; i<pAd->ChannelListNum; i++)
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE,("\tChannel # %d: Pwr0/1 = %d/%d, Flags = %x\n ",
|
||||
pAd->ChannelList[i].Channel,
|
||||
pAd->ChannelList[i].Power,
|
||||
pAd->ChannelList[i].Power2,
|
||||
pAd->ChannelList[i].Flags));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef P2P_CHANNEL_LIST_SEPARATE
|
||||
VOID P2PBuildChannelList(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UCHAR i, index=0, num=0;
|
||||
PCH_DESC pChDesc = NULL;
|
||||
BOOLEAN bRegionFound = FALSE;
|
||||
PCFG80211_CTRL pCfg80211_Ctrl = &pAd->cfg80211_ctrl;
|
||||
|
||||
NdisZeroMemory(pCfg80211_Ctrl->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));
|
||||
|
||||
/* if not 11a-only mode, channel list starts from 2.4Ghz band*/
|
||||
if (WMODE_CAP_2G(pAd->CommonCfg.PhyMode))
|
||||
{
|
||||
for (i = 0; i < Country_Region_GroupNum_2GHZ; i++)
|
||||
{
|
||||
if ((pCfg80211_Ctrl->CountryRegion & 0x7f) ==
|
||||
Country_Region_ChDesc_2GHZ[i].RegionIndex)
|
||||
{
|
||||
pChDesc = Country_Region_ChDesc_2GHZ[i].pChDesc;
|
||||
num = TotalChNum(pChDesc);
|
||||
bRegionFound = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bRegionFound)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s::P2PCountryRegion=%d not support", __FUNCTION__, pCfg80211_Ctrl->CountryRegion));
|
||||
return;
|
||||
}
|
||||
|
||||
if (num > 0)
|
||||
{
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
pCfg80211_Ctrl->ChannelList[i].Channel = GetChannel_2GHZ(pChDesc, i);
|
||||
pCfg80211_Ctrl->ChannelList[i].Flags = GetChannelFlag(pChDesc, i);
|
||||
}
|
||||
|
||||
index += num;
|
||||
}
|
||||
num = 0;
|
||||
}
|
||||
|
||||
if (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))
|
||||
{
|
||||
for (i = 0; i < Country_Region_GroupNum_5GHZ; i++)
|
||||
{
|
||||
if ((pCfg80211_Ctrl->CountryRegionForABand & 0x7f) ==
|
||||
Country_Region_ChDesc_5GHZ[i].RegionIndex)
|
||||
{
|
||||
pChDesc = Country_Region_ChDesc_5GHZ[i].pChDesc;
|
||||
num = TotalChNum(pChDesc);
|
||||
bRegionFound = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bRegionFound)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s::P2PCountryRegionForABand=%d not support", __FUNCTION__, pCfg80211_Ctrl->CountryRegionForABand));
|
||||
return;
|
||||
}
|
||||
|
||||
if (num > 0)
|
||||
{
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
pCfg80211_Ctrl->ChannelList[index + i].Channel = GetChannel_5GHZ(pChDesc, i);
|
||||
pCfg80211_Ctrl->ChannelList[index + i].Flags = GetChannelFlag(pChDesc, i);
|
||||
}
|
||||
|
||||
index += num;
|
||||
}
|
||||
}
|
||||
|
||||
pCfg80211_Ctrl->ChannelListNum = index;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s::Channel list nubmer = %d\n", __FUNCTION__, pCfg80211_Ctrl->ChannelListNum));
|
||||
}
|
||||
#endif /* P2P_CHANNEL_LIST_SEPARATE */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine return the first channel number according to the country
|
||||
code selection and RF IC selection (signal band or dual band). It is called
|
||||
whenever driver need to start a site survey of all supported channels.
|
||||
Return:
|
||||
ch - the first channel number of current country code setting
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
|
||||
==========================================================================
|
||||
*/
|
||||
UCHAR FirstChannel(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
return pAd->ChannelList[0].Channel;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine returns the next channel number. This routine is called
|
||||
during driver need to start a site survey of all supported channels.
|
||||
Return:
|
||||
next_channel - the next channel number valid in current country code setting.
|
||||
Note:
|
||||
return 0 if no more next channel
|
||||
==========================================================================
|
||||
*/
|
||||
UCHAR NextChannel(RTMP_ADAPTER *pAd, UCHAR channel)
|
||||
{
|
||||
int i;
|
||||
UCHAR next_channel = 0;
|
||||
|
||||
#ifdef P2P_CHANNEL_LIST_SEPARATE
|
||||
PCFG80211_CTRL pCfg80211_Ctrl = &pAd->cfg80211_ctrl;
|
||||
#endif /* P2P_CHANNEL_LIST_SEPARATE */
|
||||
|
||||
#ifdef P2P_CHANNEL_LIST_SEPARATE
|
||||
if ((pAd->ScanCtrl.ScanType == SCAN_P2P))
|
||||
{
|
||||
for (i = 0; i < (pCfg80211_Ctrl->ChannelListNum - 1); i++)
|
||||
{
|
||||
if (channel == pCfg80211_Ctrl->ChannelList[i].Channel)
|
||||
{
|
||||
next_channel = pCfg80211_Ctrl->ChannelList[i+1].Channel;
|
||||
return next_channel;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* P2P_CHANNEL_LIST_SEPARATE */
|
||||
|
||||
|
||||
|
||||
|
||||
for (i = 0; i < (pAd->ChannelListNum - 1); i++)
|
||||
{
|
||||
if (channel == pAd->ChannelList[i].Channel)
|
||||
{
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
#ifdef DOT11N_DRAFT3
|
||||
/* Only scan effected channel if this is a SCAN_2040_BSS_COEXIST*/
|
||||
/* 2009 PF#2: Nee to handle the second channel of AP fall into affected channel range.*/
|
||||
if ((pAd->ScanCtrl.ScanType == SCAN_2040_BSS_COEXIST) && (pAd->ChannelList[i+1].Channel >14))
|
||||
{
|
||||
channel = pAd->ChannelList[i+1].Channel;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
#endif /* DOT11N_DRAFT3 */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
{
|
||||
/* Record this channel's idx in ChannelList array.*/
|
||||
next_channel = pAd->ChannelList[i+1].Channel;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return next_channel;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
|
||||
Return:
|
||||
scan_channel - channel to scan.
|
||||
Note:
|
||||
return 0 if no more next channel
|
||||
==========================================================================
|
||||
*/
|
||||
UCHAR RTMPFindScanChannel(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
UINT8 LastScanChannel)
|
||||
{
|
||||
UCHAR scan_channel = 0;
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
#ifdef AP_PARTIAL_SCAN_SUPPORT
|
||||
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
|
||||
{
|
||||
if (pAd->ApCfg.bPartialScanning == TRUE)
|
||||
{
|
||||
scan_channel = FindPartialScanChannel(pAd);
|
||||
return scan_channel;
|
||||
}
|
||||
}
|
||||
#endif /* AP_PARTIAL_SCAN_SUPPORT */
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
if (LastScanChannel == 0)
|
||||
scan_channel = FirstChannel(pAd);
|
||||
else
|
||||
scan_channel = NextChannel(pAd, LastScanChannel);
|
||||
|
||||
return scan_channel;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine is for Cisco Compatible Extensions 2.X
|
||||
Spec31. AP Control of Client Transmit Power
|
||||
Return:
|
||||
None
|
||||
Note:
|
||||
Required by Aironet dBm(mW)
|
||||
0dBm(1mW), 1dBm(5mW), 13dBm(20mW), 15dBm(30mW),
|
||||
17dBm(50mw), 20dBm(100mW)
|
||||
|
||||
We supported
|
||||
3dBm(Lowest), 6dBm(10%), 9dBm(25%), 12dBm(50%),
|
||||
14dBm(75%), 15dBm(100%)
|
||||
|
||||
The client station's actual transmit power shall be within +/- 5dB of
|
||||
the minimum value or next lower value.
|
||||
==========================================================================
|
||||
*/
|
||||
VOID ChangeToCellPowerLimit(RTMP_ADAPTER *pAd, UCHAR AironetCellPowerLimit)
|
||||
{
|
||||
/*
|
||||
valud 0xFF means that hasn't found power limit information
|
||||
from the AP's Beacon/Probe response
|
||||
*/
|
||||
if (AironetCellPowerLimit == 0xFF)
|
||||
return;
|
||||
|
||||
if (AironetCellPowerLimit < 6) /*Used Lowest Power Percentage.*/
|
||||
pAd->CommonCfg.TxPowerPercentage = 6;
|
||||
else if (AironetCellPowerLimit < 9)
|
||||
pAd->CommonCfg.TxPowerPercentage = 10;
|
||||
else if (AironetCellPowerLimit < 12)
|
||||
pAd->CommonCfg.TxPowerPercentage = 25;
|
||||
else if (AironetCellPowerLimit < 14)
|
||||
pAd->CommonCfg.TxPowerPercentage = 50;
|
||||
else if (AironetCellPowerLimit < 15)
|
||||
pAd->CommonCfg.TxPowerPercentage = 75;
|
||||
else
|
||||
pAd->CommonCfg.TxPowerPercentage = 100; /*else used maximum*/
|
||||
|
||||
if (pAd->CommonCfg.TxPowerPercentage > pAd->CommonCfg.TxPowerDefault)
|
||||
pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;
|
||||
|
||||
}
|
||||
|
||||
|
||||
CHAR ConvertToRssi(RTMP_ADAPTER *pAd, struct raw_rssi_info *rssi_info, UCHAR rssi_idx)
|
||||
{
|
||||
UCHAR RssiOffset, LNAGain;
|
||||
CHAR BaseVal;
|
||||
CHAR rssi;
|
||||
|
||||
/* Rssi equals to zero or rssi_idx larger than 3 should be an invalid value*/
|
||||
if (rssi_idx >= 3)
|
||||
return -99;
|
||||
|
||||
rssi = rssi_info->raw_rssi[rssi_idx];
|
||||
|
||||
if (rssi == 0)
|
||||
return -99;
|
||||
|
||||
LNAGain = pAd->hw_cfg.lan_gain;
|
||||
|
||||
if (pAd->LatchRfRegs.Channel > 14)
|
||||
RssiOffset = pAd->ARssiOffset[rssi_idx];
|
||||
else
|
||||
RssiOffset = pAd->BGRssiOffset[rssi_idx];
|
||||
|
||||
BaseVal = -12;
|
||||
|
||||
#if defined (MT7603) || defined (MT7628)
|
||||
if (IS_MT7603(pAd) || IS_MT7628(pAd))
|
||||
return (rssi + (CHAR)RssiOffset - (CHAR)LNAGain);
|
||||
#endif
|
||||
|
||||
|
||||
return (BaseVal - RssiOffset - LNAGain - rssi);
|
||||
}
|
||||
|
||||
|
||||
CHAR ConvertToSnr(RTMP_ADAPTER *pAd, UCHAR Snr)
|
||||
{
|
||||
if (pAd->chipCap.SnrFormula == SNR_FORMULA2)
|
||||
return (Snr * 3 + 8) >> 4;
|
||||
else if (pAd->chipCap.SnrFormula == SNR_FORMULA3)
|
||||
return (Snr * 3 / 16 ); /* * 0.1881 */
|
||||
else
|
||||
return ((0xeb - Snr) * 3) / 16 ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
extern int DetectOverlappingPeriodicRound;
|
||||
|
||||
VOID Handle_BSS_Width_Trigger_Events(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
ULONG Now32;
|
||||
#ifdef WH_EZ_SETUP
|
||||
UCHAR i;
|
||||
#endif
|
||||
#ifdef DOT11N_DRAFT3
|
||||
if (pAd->CommonCfg.bBssCoexEnable == FALSE)
|
||||
return;
|
||||
#endif /* DOT11N_DRAFT3 */
|
||||
|
||||
if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) &&
|
||||
(pAd->CommonCfg.Channel <=14))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Rcv BSS Width Trigger Event: 40Mhz --> 20Mhz \n"));
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pAd->CommonCfg.LastRcvBSSWidthTriggerEventsTime = Now32;
|
||||
pAd->CommonCfg.bRcvBSSWidthTriggerEvents = TRUE;
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;
|
||||
#ifdef WH_EZ_SETUP
|
||||
for(i=0;i<WDEV_NUM_MAX;i++)
|
||||
{
|
||||
struct wifi_dev *wdev;
|
||||
|
||||
wdev = pAd->wdev_list[i];
|
||||
if(!wdev /*|| (wdev->channel != pAd->CommonCfg.Channel)*/) // Arvind : assume only one wdev
|
||||
continue;
|
||||
|
||||
#if defined(EZ_NETWORK_MERGE_SUPPORT)
|
||||
if (IS_EZ_SETUP_ENABLED(wdev) && (wdev->wdev_type == WDEV_TYPE_AP)){
|
||||
EZ_DEBUG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR,("\nHandle_BSS_Width_Trigger_Events: do fallback ****\n"));
|
||||
ez_set_ap_fallback_context(wdev,TRUE, pAd->CommonCfg.Channel);
|
||||
}
|
||||
#endif /* WH_EZ_SETUP */
|
||||
|
||||
}
|
||||
#endif /* WH_EZ_SETUP */
|
||||
|
||||
DetectOverlappingPeriodicRound = 31;
|
||||
}
|
||||
}
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
@ -0,0 +1,929 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_tkip.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Paul Wu 02-25-02 Initial
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
/* Rotation functions on 32 bit values */
|
||||
#define ROL32( A, n ) \
|
||||
( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) )
|
||||
#define ROR32( A, n ) ROL32( (A), 32-(n) )
|
||||
|
||||
UINT Tkip_Sbox_Lower[256] =
|
||||
{
|
||||
0xA5,0x84,0x99,0x8D,0x0D,0xBD,0xB1,0x54,
|
||||
0x50,0x03,0xA9,0x7D,0x19,0x62,0xE6,0x9A,
|
||||
0x45,0x9D,0x40,0x87,0x15,0xEB,0xC9,0x0B,
|
||||
0xEC,0x67,0xFD,0xEA,0xBF,0xF7,0x96,0x5B,
|
||||
0xC2,0x1C,0xAE,0x6A,0x5A,0x41,0x02,0x4F,
|
||||
0x5C,0xF4,0x34,0x08,0x93,0x73,0x53,0x3F,
|
||||
0x0C,0x52,0x65,0x5E,0x28,0xA1,0x0F,0xB5,
|
||||
0x09,0x36,0x9B,0x3D,0x26,0x69,0xCD,0x9F,
|
||||
0x1B,0x9E,0x74,0x2E,0x2D,0xB2,0xEE,0xFB,
|
||||
0xF6,0x4D,0x61,0xCE,0x7B,0x3E,0x71,0x97,
|
||||
0xF5,0x68,0x00,0x2C,0x60,0x1F,0xC8,0xED,
|
||||
0xBE,0x46,0xD9,0x4B,0xDE,0xD4,0xE8,0x4A,
|
||||
0x6B,0x2A,0xE5,0x16,0xC5,0xD7,0x55,0x94,
|
||||
0xCF,0x10,0x06,0x81,0xF0,0x44,0xBA,0xE3,
|
||||
0xF3,0xFE,0xC0,0x8A,0xAD,0xBC,0x48,0x04,
|
||||
0xDF,0xC1,0x75,0x63,0x30,0x1A,0x0E,0x6D,
|
||||
0x4C,0x14,0x35,0x2F,0xE1,0xA2,0xCC,0x39,
|
||||
0x57,0xF2,0x82,0x47,0xAC,0xE7,0x2B,0x95,
|
||||
0xA0,0x98,0xD1,0x7F,0x66,0x7E,0xAB,0x83,
|
||||
0xCA,0x29,0xD3,0x3C,0x79,0xE2,0x1D,0x76,
|
||||
0x3B,0x56,0x4E,0x1E,0xDB,0x0A,0x6C,0xE4,
|
||||
0x5D,0x6E,0xEF,0xA6,0xA8,0xA4,0x37,0x8B,
|
||||
0x32,0x43,0x59,0xB7,0x8C,0x64,0xD2,0xE0,
|
||||
0xB4,0xFA,0x07,0x25,0xAF,0x8E,0xE9,0x18,
|
||||
0xD5,0x88,0x6F,0x72,0x24,0xF1,0xC7,0x51,
|
||||
0x23,0x7C,0x9C,0x21,0xDD,0xDC,0x86,0x85,
|
||||
0x90,0x42,0xC4,0xAA,0xD8,0x05,0x01,0x12,
|
||||
0xA3,0x5F,0xF9,0xD0,0x91,0x58,0x27,0xB9,
|
||||
0x38,0x13,0xB3,0x33,0xBB,0x70,0x89,0xA7,
|
||||
0xB6,0x22,0x92,0x20,0x49,0xFF,0x78,0x7A,
|
||||
0x8F,0xF8,0x80,0x17,0xDA,0x31,0xC6,0xB8,
|
||||
0xC3,0xB0,0x77,0x11,0xCB,0xFC,0xD6,0x3A
|
||||
};
|
||||
|
||||
UINT Tkip_Sbox_Upper[256] =
|
||||
{
|
||||
0xC6,0xF8,0xEE,0xF6,0xFF,0xD6,0xDE,0x91,
|
||||
0x60,0x02,0xCE,0x56,0xE7,0xB5,0x4D,0xEC,
|
||||
0x8F,0x1F,0x89,0xFA,0xEF,0xB2,0x8E,0xFB,
|
||||
0x41,0xB3,0x5F,0x45,0x23,0x53,0xE4,0x9B,
|
||||
0x75,0xE1,0x3D,0x4C,0x6C,0x7E,0xF5,0x83,
|
||||
0x68,0x51,0xD1,0xF9,0xE2,0xAB,0x62,0x2A,
|
||||
0x08,0x95,0x46,0x9D,0x30,0x37,0x0A,0x2F,
|
||||
0x0E,0x24,0x1B,0xDF,0xCD,0x4E,0x7F,0xEA,
|
||||
0x12,0x1D,0x58,0x34,0x36,0xDC,0xB4,0x5B,
|
||||
0xA4,0x76,0xB7,0x7D,0x52,0xDD,0x5E,0x13,
|
||||
0xA6,0xB9,0x00,0xC1,0x40,0xE3,0x79,0xB6,
|
||||
0xD4,0x8D,0x67,0x72,0x94,0x98,0xB0,0x85,
|
||||
0xBB,0xC5,0x4F,0xED,0x86,0x9A,0x66,0x11,
|
||||
0x8A,0xE9,0x04,0xFE,0xA0,0x78,0x25,0x4B,
|
||||
0xA2,0x5D,0x80,0x05,0x3F,0x21,0x70,0xF1,
|
||||
0x63,0x77,0xAF,0x42,0x20,0xE5,0xFD,0xBF,
|
||||
0x81,0x18,0x26,0xC3,0xBE,0x35,0x88,0x2E,
|
||||
0x93,0x55,0xFC,0x7A,0xC8,0xBA,0x32,0xE6,
|
||||
0xC0,0x19,0x9E,0xA3,0x44,0x54,0x3B,0x0B,
|
||||
0x8C,0xC7,0x6B,0x28,0xA7,0xBC,0x16,0xAD,
|
||||
0xDB,0x64,0x74,0x14,0x92,0x0C,0x48,0xB8,
|
||||
0x9F,0xBD,0x43,0xC4,0x39,0x31,0xD3,0xF2,
|
||||
0xD5,0x8B,0x6E,0xDA,0x01,0xB1,0x9C,0x49,
|
||||
0xD8,0xAC,0xF3,0xCF,0xCA,0xF4,0x47,0x10,
|
||||
0x6F,0xF0,0x4A,0x5C,0x38,0x57,0x73,0x97,
|
||||
0xCB,0xA1,0xE8,0x3E,0x96,0x61,0x0D,0x0F,
|
||||
0xE0,0x7C,0x71,0xCC,0x90,0x06,0xF7,0x1C,
|
||||
0xC2,0x6A,0xAE,0x69,0x17,0x99,0x3A,0x27,
|
||||
0xD9,0xEB,0x2B,0x22,0xD2,0xA9,0x07,0x33,
|
||||
0x2D,0x3C,0x15,0xC9,0x87,0xAA,0x50,0xA5,
|
||||
0x03,0x59,0x09,0x1A,0x65,0xD7,0x84,0xD0,
|
||||
0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C
|
||||
};
|
||||
|
||||
|
||||
/* Expanded IV for TKIP function.*/
|
||||
|
||||
typedef struct GNU_PACKED _IV_CONTROL_
|
||||
{
|
||||
union GNU_PACKED
|
||||
{
|
||||
struct GNU_PACKED
|
||||
{
|
||||
UCHAR rc0;
|
||||
UCHAR rc1;
|
||||
UCHAR rc2;
|
||||
|
||||
union GNU_PACKED
|
||||
{
|
||||
struct GNU_PACKED
|
||||
{
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
UCHAR KeyID:2;
|
||||
UCHAR ExtIV:1;
|
||||
UCHAR Rsvd:5;
|
||||
#else
|
||||
UCHAR Rsvd:5;
|
||||
UCHAR ExtIV:1;
|
||||
UCHAR KeyID:2;
|
||||
#endif
|
||||
} field;
|
||||
UCHAR Byte;
|
||||
} CONTROL;
|
||||
} field;
|
||||
|
||||
ULONG word;
|
||||
} IV16;
|
||||
|
||||
ULONG IV32;
|
||||
} TKIP_IV, *PTKIP_IV;
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Convert from UCHAR[] to ULONG in a portable way
|
||||
|
||||
Arguments:
|
||||
pMICKey pointer to MIC Key
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
ULONG RTMPTkipGetUInt32(
|
||||
IN PUCHAR pMICKey)
|
||||
{
|
||||
ULONG res = 0;
|
||||
INT i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
res |= (*pMICKey++) << (8 * i);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Convert from ULONG to UCHAR[] in a portable way
|
||||
|
||||
Arguments:
|
||||
pDst pointer to destination for convert ULONG to UCHAR[]
|
||||
val the value for convert
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipPutUInt32(
|
||||
IN OUT PUCHAR pDst,
|
||||
IN ULONG val)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for(i = 0; i < 4; i++)
|
||||
{
|
||||
*pDst++ = (UCHAR) (val & 0xff);
|
||||
val >>= 8;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Set the MIC Key.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pMICKey pointer to MIC Key
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipSetMICKey(
|
||||
IN PTKIP_KEY_INFO pTkip,
|
||||
IN PUCHAR pMICKey)
|
||||
{
|
||||
/* Set the key */
|
||||
pTkip->K0 = RTMPTkipGetUInt32(pMICKey);
|
||||
pTkip->K1 = RTMPTkipGetUInt32(pMICKey + 4);
|
||||
/* and reset the message */
|
||||
pTkip->L = pTkip->K0;
|
||||
pTkip->R = pTkip->K1;
|
||||
pTkip->nBytesInM = 0;
|
||||
pTkip->M = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Calculate the MIC Value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
uChar Append this uChar
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipAppendByte(
|
||||
IN PTKIP_KEY_INFO pTkip,
|
||||
IN UCHAR uChar)
|
||||
{
|
||||
/* Append the byte to our word-sized buffer */
|
||||
pTkip->M |= (uChar << (8* pTkip->nBytesInM));
|
||||
pTkip->nBytesInM++;
|
||||
/* Process the word if it is full. */
|
||||
if( pTkip->nBytesInM >= 4 )
|
||||
{
|
||||
pTkip->L ^= pTkip->M;
|
||||
pTkip->R ^= ROL32( pTkip->L, 17 );
|
||||
pTkip->L += pTkip->R;
|
||||
pTkip->R ^= ((pTkip->L & 0xff00ff00) >> 8) | ((pTkip->L & 0x00ff00ff) << 8);
|
||||
pTkip->L += pTkip->R;
|
||||
pTkip->R ^= ROL32( pTkip->L, 3 );
|
||||
pTkip->L += pTkip->R;
|
||||
pTkip->R ^= ROR32( pTkip->L, 2 );
|
||||
pTkip->L += pTkip->R;
|
||||
/* Clear the buffer */
|
||||
pTkip->M = 0;
|
||||
pTkip->nBytesInM = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Calculate the MIC Value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pSrc Pointer to source data for Calculate MIC Value
|
||||
Len Indicate the length of the source data
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipAppend(
|
||||
IN PTKIP_KEY_INFO pTkip,
|
||||
IN PUCHAR pSrc,
|
||||
IN UINT nBytes)
|
||||
{
|
||||
/* This is simple */
|
||||
while(nBytes > 0)
|
||||
{
|
||||
RTMPTkipAppendByte(pTkip, *pSrc++);
|
||||
nBytes--;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Get the MIC Value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
the MIC Value is store in pAd->PrivateInfo.MIC
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipGetMIC(
|
||||
IN PTKIP_KEY_INFO pTkip)
|
||||
{
|
||||
/* Append the minimum padding*/
|
||||
RTMPTkipAppendByte(pTkip, 0x5a );
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
/* and then zeroes until the length is a multiple of 4 */
|
||||
while( pTkip->nBytesInM != 0 )
|
||||
{
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
}
|
||||
/* The appendByte function has already computed the result. */
|
||||
RTMPTkipPutUInt32(pTkip->MIC, pTkip->L);
|
||||
RTMPTkipPutUInt32(pTkip->MIC + 4, pTkip->R);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Init MIC Value calculation function which include set MIC key &
|
||||
calculate first 16 bytes (DA + SA + priority + 0)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pTKey Pointer to the Temporal Key (TK), TK shall be 128bits.
|
||||
pDA Pointer to DA address
|
||||
pSA Pointer to SA address
|
||||
pMICKey pointer to MIC Key
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPInitMICEngine(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pKey,
|
||||
IN PUCHAR pDA,
|
||||
IN PUCHAR pSA,
|
||||
IN UCHAR UserPriority,
|
||||
IN PUCHAR pMICKey)
|
||||
{
|
||||
ULONG Priority = UserPriority;
|
||||
|
||||
/* Init MIC value calculation*/
|
||||
RTMPTkipSetMICKey(&pAd->PrivateInfo.Tx, pMICKey);
|
||||
/* DA*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pDA, MAC_ADDR_LEN);
|
||||
/* SA*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSA, MAC_ADDR_LEN);
|
||||
/* Priority + 3 bytes of 0*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, (PUCHAR)&Priority, 4);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Compare MIC value of received MSDU
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pSrc Pointer to the received Plain text data
|
||||
pDA Pointer to DA address
|
||||
pSA Pointer to SA address
|
||||
pMICKey pointer to MIC Key
|
||||
Len the length of the received plain text data exclude MIC value
|
||||
|
||||
Return Value:
|
||||
TRUE MIC value matched
|
||||
FALSE MIC value mismatched
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPTkipCompareMICValue(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pSrc,
|
||||
IN PUCHAR pDA,
|
||||
IN PUCHAR pSA,
|
||||
IN PUCHAR pMICKey,
|
||||
IN UCHAR UserPriority,
|
||||
IN UINT Len)
|
||||
{
|
||||
UCHAR OldMic[8];
|
||||
ULONG Priority = UserPriority;
|
||||
|
||||
/* Init MIC value calculation*/
|
||||
RTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey);
|
||||
/* DA*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pDA, MAC_ADDR_LEN);
|
||||
/* SA*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSA, MAC_ADDR_LEN);
|
||||
/* Priority + 3 bytes of 0*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, (PUCHAR)&Priority, 4);
|
||||
|
||||
/* Calculate MIC value from plain text data*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSrc, Len);
|
||||
|
||||
/* Get MIC valude from received frame*/
|
||||
NdisMoveMemory(OldMic, pSrc + Len, 8);
|
||||
|
||||
/* Get MIC value from decrypted plain data*/
|
||||
RTMPTkipGetMIC(&pAd->PrivateInfo.Rx);
|
||||
|
||||
/* Move MIC value from MSDU, this steps should move to data path.*/
|
||||
/* Since the MIC value might cross MPDUs.*/
|
||||
if(!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8))
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTMPTkipCompareMICValue(): TKIP MIC Error !\n")); /*MIC error.*/
|
||||
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Copy frame from waiting queue into relative ring buffer and set
|
||||
appropriate ASIC register to kick hardware transmit function
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
PNDIS_PACKET Pointer to Ndis Packet for MIC calculation
|
||||
pEncap Pointer to LLC encap data
|
||||
LenEncap Total encap length, might be 0 which indicates no encap
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPCalculateMICValue(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PNDIS_PACKET pPacket,
|
||||
IN PUCHAR pEncap,
|
||||
IN PCIPHER_KEY pKey,
|
||||
IN UCHAR apidx)
|
||||
{
|
||||
PACKET_INFO PacketInfo;
|
||||
PUCHAR pSrcBufVA;
|
||||
UINT SrcBufLen;
|
||||
PUCHAR pSrc;
|
||||
UCHAR UserPriority;
|
||||
UCHAR vlan_offset = 0;
|
||||
|
||||
RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);
|
||||
|
||||
UserPriority = RTMP_GET_PACKET_UP(pPacket);
|
||||
pSrc = pSrcBufVA;
|
||||
|
||||
/* determine if this is a vlan packet */
|
||||
if (((*(pSrc + 12) << 8) + *(pSrc + 13)) == 0x8100)
|
||||
vlan_offset = 4;
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
#ifdef APCLI_SUPPORT
|
||||
/* Start Calculate MIC Value*/
|
||||
if (apidx >= MIN_NET_DEVICE_FOR_APCLI && ((apidx - MIN_NET_DEVICE_FOR_APCLI) < MAX_APCLI_NUM) && (pAd->OpMode == OPMODE_AP))
|
||||
{ /* For packet which need to do MATConvert, we need to use the CurrentAddress of specific ApCli interface.*/
|
||||
RTMPInitMICEngine(
|
||||
pAd,
|
||||
pKey->Key,
|
||||
pSrc,
|
||||
pAd->ApCfg.ApCliTab[apidx-MIN_NET_DEVICE_FOR_APCLI].wdev.if_addr,
|
||||
UserPriority,
|
||||
pKey->TxMic);
|
||||
}
|
||||
else
|
||||
#endif /* APCLI_SUPPORT */
|
||||
#ifdef IGMP_SNOOP_SUPPORT
|
||||
if ((RTMP_GET_PACKET_WCID(pPacket) != MCAST_WCID) && (*pSrc & 0x01) && (pAd->OpMode == OPMODE_AP))
|
||||
{
|
||||
UCHAR wcid = RTMP_GET_PACKET_WCID(pPacket);
|
||||
RTMPInitMICEngine(
|
||||
pAd,
|
||||
pKey->Key,
|
||||
pAd->MacTab.Content[wcid].Addr,
|
||||
pSrc + 6,
|
||||
UserPriority,
|
||||
pKey->TxMic);
|
||||
}
|
||||
else
|
||||
#endif /* IGMP_SNOOP_SUPPORT */
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
{
|
||||
RTMPInitMICEngine(
|
||||
pAd,
|
||||
pKey->Key,
|
||||
pSrc,
|
||||
pSrc + 6,
|
||||
UserPriority,
|
||||
pKey->TxMic);
|
||||
}
|
||||
|
||||
|
||||
if (pEncap != NULL)
|
||||
{
|
||||
/* LLC encapsulation*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pEncap, 6);
|
||||
/* Protocol Type*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc + 12 + vlan_offset, 2);
|
||||
}
|
||||
SrcBufLen -= (14 + vlan_offset);
|
||||
pSrc += (14 + vlan_offset);
|
||||
do
|
||||
{
|
||||
if (SrcBufLen > 0)
|
||||
{
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc, SrcBufLen);
|
||||
}
|
||||
|
||||
break; /* No need handle next packet */
|
||||
|
||||
} while (TRUE);
|
||||
|
||||
/* Compute the final MIC Value*/
|
||||
RTMPTkipGetMIC(&pAd->PrivateInfo.Tx);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************/
|
||||
/* tkip_sbox() */
|
||||
/* Returns a 16 bit value from a 64K entry table. The Table */
|
||||
/* is synthesized from two 256 entry byte wide tables. */
|
||||
/************************************************************/
|
||||
|
||||
UINT tkip_sbox(UINT index)
|
||||
{
|
||||
UINT index_low;
|
||||
UINT index_high;
|
||||
UINT left, right;
|
||||
|
||||
index_low = (index % 256);
|
||||
index_high = ((index >> 8) % 256);
|
||||
|
||||
left = Tkip_Sbox_Lower[index_low] + (Tkip_Sbox_Upper[index_low] * 256);
|
||||
right = Tkip_Sbox_Upper[index_high] + (Tkip_Sbox_Lower[index_high] * 256);
|
||||
|
||||
return (left ^ right);
|
||||
}
|
||||
|
||||
UINT rotr1(UINT a)
|
||||
{
|
||||
unsigned int b;
|
||||
|
||||
if ((a & 0x01) == 0x01)
|
||||
{
|
||||
b = (a >> 1) | 0x8000;
|
||||
}
|
||||
else
|
||||
{
|
||||
b = (a >> 1) & 0x7fff;
|
||||
}
|
||||
b = b % 65536;
|
||||
return b;
|
||||
}
|
||||
|
||||
VOID RTMPTkipMixKey(
|
||||
UCHAR *key,
|
||||
UCHAR *ta,
|
||||
ULONG pnl, /* Least significant 16 bits of PN */
|
||||
ULONG pnh, /* Most significant 32 bits of PN */
|
||||
UCHAR *rc4key,
|
||||
UINT *p1k)
|
||||
{
|
||||
|
||||
UINT tsc0;
|
||||
UINT tsc1;
|
||||
UINT tsc2;
|
||||
|
||||
UINT ppk0;
|
||||
UINT ppk1;
|
||||
UINT ppk2;
|
||||
UINT ppk3;
|
||||
UINT ppk4;
|
||||
UINT ppk5;
|
||||
|
||||
INT i;
|
||||
INT j;
|
||||
|
||||
tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */
|
||||
tsc1 = (unsigned int)(pnh % 65536);
|
||||
tsc2 = (unsigned int)(pnl % 65536); /* lsb */
|
||||
|
||||
/* Phase 1, step 1 */
|
||||
p1k[0] = tsc1;
|
||||
p1k[1] = tsc0;
|
||||
p1k[2] = (UINT)(ta[0] + (ta[1]*256));
|
||||
p1k[3] = (UINT)(ta[2] + (ta[3]*256));
|
||||
p1k[4] = (UINT)(ta[4] + (ta[5]*256));
|
||||
|
||||
/* Phase 1, step 2 */
|
||||
for (i=0; i<8; i++)
|
||||
{
|
||||
j = 2*(i & 1);
|
||||
p1k[0] = (p1k[0] + tkip_sbox( (p1k[4] ^ ((256*key[1+j]) + key[j])) % 65536 )) % 65536;
|
||||
p1k[1] = (p1k[1] + tkip_sbox( (p1k[0] ^ ((256*key[5+j]) + key[4+j])) % 65536 )) % 65536;
|
||||
p1k[2] = (p1k[2] + tkip_sbox( (p1k[1] ^ ((256*key[9+j]) + key[8+j])) % 65536 )) % 65536;
|
||||
p1k[3] = (p1k[3] + tkip_sbox( (p1k[2] ^ ((256*key[13+j]) + key[12+j])) % 65536 )) % 65536;
|
||||
p1k[4] = (p1k[4] + tkip_sbox( (p1k[3] ^ (((256*key[1+j]) + key[j]))) % 65536 )) % 65536;
|
||||
p1k[4] = (p1k[4] + i) % 65536;
|
||||
}
|
||||
|
||||
/* Phase 2, Step 1 */
|
||||
ppk0 = p1k[0];
|
||||
ppk1 = p1k[1];
|
||||
ppk2 = p1k[2];
|
||||
ppk3 = p1k[3];
|
||||
ppk4 = p1k[4];
|
||||
ppk5 = (p1k[4] + tsc2) % 65536;
|
||||
|
||||
/* Phase2, Step 2 */
|
||||
ppk0 = ppk0 + tkip_sbox( (ppk5 ^ ((256*key[1]) + key[0])) % 65536);
|
||||
ppk1 = ppk1 + tkip_sbox( (ppk0 ^ ((256*key[3]) + key[2])) % 65536);
|
||||
ppk2 = ppk2 + tkip_sbox( (ppk1 ^ ((256*key[5]) + key[4])) % 65536);
|
||||
ppk3 = ppk3 + tkip_sbox( (ppk2 ^ ((256*key[7]) + key[6])) % 65536);
|
||||
ppk4 = ppk4 + tkip_sbox( (ppk3 ^ ((256*key[9]) + key[8])) % 65536);
|
||||
ppk5 = ppk5 + tkip_sbox( (ppk4 ^ ((256*key[11]) + key[10])) % 65536);
|
||||
|
||||
ppk0 = ppk0 + rotr1(ppk5 ^ ((256*key[13]) + key[12]));
|
||||
ppk1 = ppk1 + rotr1(ppk0 ^ ((256*key[15]) + key[14]));
|
||||
ppk2 = ppk2 + rotr1(ppk1);
|
||||
ppk3 = ppk3 + rotr1(ppk2);
|
||||
ppk4 = ppk4 + rotr1(ppk3);
|
||||
ppk5 = ppk5 + rotr1(ppk4);
|
||||
|
||||
/* Phase 2, Step 3 */
|
||||
/* Phase 2, Step 3 */
|
||||
|
||||
tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */
|
||||
tsc1 = (unsigned int)(pnh % 65536);
|
||||
tsc2 = (unsigned int)(pnl % 65536); /* lsb */
|
||||
|
||||
rc4key[0] = (tsc2 >> 8) % 256;
|
||||
rc4key[1] = (((tsc2 >> 8) % 256) | 0x20) & 0x7f;
|
||||
rc4key[2] = tsc2 % 256;
|
||||
rc4key[3] = ((ppk5 ^ ((256*key[1]) + key[0])) >> 1) % 256;
|
||||
|
||||
rc4key[4] = ppk0 % 256;
|
||||
rc4key[5] = (ppk0 >> 8) % 256;
|
||||
|
||||
rc4key[6] = ppk1 % 256;
|
||||
rc4key[7] = (ppk1 >> 8) % 256;
|
||||
|
||||
rc4key[8] = ppk2 % 256;
|
||||
rc4key[9] = (ppk2 >> 8) % 256;
|
||||
|
||||
rc4key[10] = ppk3 % 256;
|
||||
rc4key[11] = (ppk3 >> 8) % 256;
|
||||
|
||||
rc4key[12] = ppk4 % 256;
|
||||
rc4key[13] = (ppk4 >> 8) % 256;
|
||||
|
||||
rc4key[14] = ppk5 % 256;
|
||||
rc4key[15] = (ppk5 >> 8) % 256;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
TRUE: Success!
|
||||
FALSE: Decrypt Error!
|
||||
*/
|
||||
BOOLEAN RTMPSoftDecryptTKIP(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pHdr,
|
||||
IN UCHAR UserPriority,
|
||||
IN PCIPHER_KEY pKey,
|
||||
INOUT PUCHAR pData,
|
||||
IN UINT16 *DataByteCnt)
|
||||
{
|
||||
PHEADER_802_11 pFrame;
|
||||
//UINT8 frame_type;
|
||||
//UINT8 frame_subtype;
|
||||
UINT8 from_ds;
|
||||
UINT8 to_ds;
|
||||
//UINT8 a4_exists;
|
||||
//UINT8 qc_exists;
|
||||
UCHAR TA[MAC_ADDR_LEN];
|
||||
UCHAR DA[MAC_ADDR_LEN];
|
||||
UCHAR SA[MAC_ADDR_LEN];
|
||||
UCHAR RC4Key[16];
|
||||
UINT p1k[5]; /*for mix_key;*/
|
||||
ULONG pnl;/* Least significant 16 bits of PN */
|
||||
ULONG pnh;/* Most significant 32 bits of PN */
|
||||
ARC4_CTX_STRUC ARC4_CTX;
|
||||
PUCHAR plaintext_ptr;
|
||||
UINT32 plaintext_len;
|
||||
PUCHAR ciphertext_ptr;
|
||||
UINT32 ciphertext_len;
|
||||
UINT crc32 = 0;
|
||||
UINT trailfcs = 0;
|
||||
UCHAR MIC[8];
|
||||
UCHAR TrailMIC[8];
|
||||
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
RTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);
|
||||
#endif
|
||||
|
||||
if (pKey->KeyLen == 0)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : the key is empty)\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Indicate type and subtype of Frame Control field */
|
||||
//frame_type = (((*pHdr) >> 2) & 0x03);
|
||||
//frame_subtype = (((*pHdr) >> 4) & 0x0f);
|
||||
|
||||
/* Indicate the fromDS and ToDS */
|
||||
from_ds = ((*(pHdr + 1)) & 0x2) >> 1;
|
||||
to_ds = ((*(pHdr + 1)) & 0x1);
|
||||
|
||||
/* decide if the Address 4 exist or QoS exist */
|
||||
//a4_exists = (from_ds & to_ds);
|
||||
//qc_exists = ((frame_subtype == SUBTYPE_QDATA) ||
|
||||
// (frame_subtype == SUBTYPE_QDATA_CFACK) ||
|
||||
// (frame_subtype == SUBTYPE_QDATA_CFPOLL) ||
|
||||
// (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL));
|
||||
|
||||
|
||||
/* pointer to 802.11 header */
|
||||
pFrame = (PHEADER_802_11)pHdr;
|
||||
|
||||
/* Assign DA, SA and TA for TKIP calculation */
|
||||
if (to_ds == 0 && from_ds == 1)
|
||||
{
|
||||
NdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN); /*BSSID */
|
||||
NdisMoveMemory(SA, pFrame->Addr3, MAC_ADDR_LEN);
|
||||
}
|
||||
else if (to_ds == 0 && from_ds == 0 )
|
||||
{
|
||||
NdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
}
|
||||
else if (to_ds == 1 && from_ds == 0)
|
||||
{
|
||||
NdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN);
|
||||
}
|
||||
else if (to_ds == 1 && from_ds == 1)
|
||||
{
|
||||
NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(SA, pFrame->Octet, MAC_ADDR_LEN);
|
||||
}
|
||||
|
||||
pnl = (*(pData)) << 8 | (*(pData + 2));
|
||||
pnh = *((PULONG)(pData + 4));
|
||||
pnh = cpu2le32(pnh);
|
||||
RTMPTkipMixKey(pKey->Key, TA, pnl, pnh, RC4Key, p1k);
|
||||
|
||||
/* skip 8-bytes TKIP IV/EIV header */
|
||||
ciphertext_ptr = pData + LEN_TKIP_IV_HDR;
|
||||
ciphertext_len = *DataByteCnt - LEN_TKIP_IV_HDR;
|
||||
|
||||
/* skip payload length is zero*/
|
||||
if ((*DataByteCnt) <= LEN_TKIP_IV_HDR)
|
||||
return FALSE;
|
||||
|
||||
/* WEP Decapsulation */
|
||||
/* Generate an RC4 key stream */
|
||||
ARC4_INIT(&ARC4_CTX, &RC4Key[0], 16);
|
||||
|
||||
/* Decrypt the TKIP MPDU by ARC4.
|
||||
It shall include plaintext, MIC and ICV.
|
||||
The result output would overwrite the original TKIP IV/EIV header position */
|
||||
ARC4_Compute(&ARC4_CTX, ciphertext_ptr, ciphertext_len, pData);
|
||||
|
||||
/* Point to the decrypted data frame and its length shall exclude ICV length */
|
||||
plaintext_ptr = pData;
|
||||
plaintext_len = ciphertext_len - LEN_ICV;
|
||||
|
||||
/* Extract peer's ICV */
|
||||
NdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV);
|
||||
|
||||
/* Re-computes the ICV and
|
||||
bit-wise compares with the peer's ICV. */
|
||||
crc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len);
|
||||
crc32 ^= 0xffffffff; /* complement */
|
||||
|
||||
if(crc32 != cpu2le32(trailfcs))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("! WEP Data CRC Error !\n")); /*CRC error.*/
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Extract peer's MIC and subtract MIC length from total data length */
|
||||
plaintext_len -= LEN_TKIP_MIC;
|
||||
NdisMoveMemory(TrailMIC, plaintext_ptr + plaintext_len, LEN_TKIP_MIC);
|
||||
RTMPInitMICEngine(pAd, pKey->Key, DA, SA, UserPriority, pKey->RxMic);
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, plaintext_ptr, plaintext_len);
|
||||
RTMPTkipGetMIC(&pAd->PrivateInfo.Tx);
|
||||
NdisMoveMemory(MIC, pAd->PrivateInfo.Tx.MIC, LEN_TKIP_MIC);
|
||||
|
||||
if (!NdisEqualMemory(MIC, TrailMIC, LEN_TKIP_MIC))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("! TKIP MIC Error !\n")); /*MIC error.*/
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Update the total data length */
|
||||
*DataByteCnt = plaintext_len;
|
||||
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
RTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);
|
||||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Use RC4 to protect the Key Data field of EAPoL frame.
|
||||
It's defined in IEEE 802.11i-2004 p.84
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID TKIP_GTK_KEY_WRAP(
|
||||
IN UCHAR *key,
|
||||
IN UCHAR *iv,
|
||||
IN UCHAR *input_text,
|
||||
IN UINT32 input_len,
|
||||
OUT UCHAR *output_text)
|
||||
{
|
||||
UCHAR ekey[LEN_KEY_DESC_IV + LEN_PTK_KEK];
|
||||
/* ARC4_CTX_STRUC ARC4_CTX;*/
|
||||
ARC4_CTX_STRUC *pARC4_CTX = NULL;
|
||||
|
||||
|
||||
/* allocate memory */
|
||||
os_alloc_mem(NULL, (UCHAR **)&pARC4_CTX, sizeof(ARC4_CTX_STRUC));
|
||||
if (pARC4_CTX == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
/* The encryption key is generated by concatenating the
|
||||
EAPOL-Key IV field and the KEK. */
|
||||
NdisMoveMemory(ekey, iv, LEN_KEY_DESC_IV);
|
||||
NdisMoveMemory(&ekey[LEN_KEY_DESC_IV], key, LEN_PTK_KEK);
|
||||
|
||||
/* RC4 stream cipher initialization with the KEK */
|
||||
ARC4_INIT(pARC4_CTX, &ekey[0], LEN_KEY_DESC_IV + LEN_PTK_KEK);
|
||||
|
||||
/* The first 256 octets of the RC4 key stream shall be discarded */
|
||||
ARC4_Discard_KeyLength(pARC4_CTX, 256);
|
||||
|
||||
/* encryption begins using the 257th key stream octet */
|
||||
ARC4_Compute(pARC4_CTX, input_text, input_len, output_text);
|
||||
|
||||
if (pARC4_CTX != NULL)
|
||||
os_free_mem(NULL, pARC4_CTX);
|
||||
}
|
||||
|
||||
VOID TKIP_GTK_KEY_UNWRAP(
|
||||
IN UCHAR *key,
|
||||
IN UCHAR *iv,
|
||||
IN UCHAR *input_text,
|
||||
IN UINT32 input_len,
|
||||
OUT UCHAR *output_text)
|
||||
{
|
||||
TKIP_GTK_KEY_WRAP(key, iv, input_text, input_len, output_text);
|
||||
}
|
||||
|
1197
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_usb_io.c
Normal file
1197
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_usb_io.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,168 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_video.c
|
||||
|
||||
Abstract:
|
||||
Ralink WiFi Driver video mode related subroutines
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
#ifdef VIDEO_TURBINE_SUPPORT
|
||||
|
||||
|
||||
|
||||
BOOLEAN UpdateFromGlobal = FALSE;
|
||||
|
||||
void VideoTurbineUpdate(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if (UpdateFromGlobal == TRUE)
|
||||
{
|
||||
pAd->VideoTurbine.Enable = GLOBAL_AP_VIDEO_CONFIG.Enable;
|
||||
pAd->VideoTurbine.ClassifierEnable = GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable;
|
||||
pAd->VideoTurbine.HighTxMode = GLOBAL_AP_VIDEO_CONFIG.HighTxMode;
|
||||
pAd->VideoTurbine.TxPwr = GLOBAL_AP_VIDEO_CONFIG.TxPwr;
|
||||
pAd->VideoTurbine.VideoMCSEnable = GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable;
|
||||
pAd->VideoTurbine.VideoMCS = GLOBAL_AP_VIDEO_CONFIG.VideoMCS;
|
||||
pAd->VideoTurbine.TxBASize = GLOBAL_AP_VIDEO_CONFIG.TxBASize;
|
||||
pAd->VideoTurbine.TxLifeTimeMode = GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode;
|
||||
pAd->VideoTurbine.TxLifeTime = GLOBAL_AP_VIDEO_CONFIG.TxLifeTime;
|
||||
pAd->VideoTurbine.TxRetryLimit = GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID TxSwQDepthAdjust(IN RTMP_ADAPTER *pAd, IN UINT32 qLen)
|
||||
{
|
||||
ULONG IrqFlags;
|
||||
INT qIdx;
|
||||
QUEUE_HEADER *pTxQ, *pEntry;
|
||||
PNDIS_PACKET pPacket;
|
||||
|
||||
RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
|
||||
pAd->TxSwQMaxLen = qLen;
|
||||
for (qIdx = 0; qIdx < NUM_OF_TX_RING; qIdx++)
|
||||
{
|
||||
pTxQ = &pAd->TxSwQueue[qIdx];
|
||||
while(pTxQ->Number >= pAd->TxSwQMaxLen)
|
||||
{
|
||||
pEntry = RemoveHeadQueue(pTxQ);
|
||||
if (pEntry)
|
||||
{
|
||||
pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():Set TxSwQMaxLen as %d\n",
|
||||
__FUNCTION__, pAd->TxSwQMaxLen));
|
||||
}
|
||||
|
||||
|
||||
VOID VideoTurbineDynamicTune(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if (pAd->VideoTurbine.Enable == TRUE)
|
||||
{
|
||||
UINT32 MacReg = 0;
|
||||
|
||||
{
|
||||
/* Tx retry limit = 2F,1F */
|
||||
RTMP_IO_READ32(pAd, TX_RTY_CFG, &MacReg);
|
||||
MacReg &= 0xFFFF0000;
|
||||
MacReg |= GetAsicVideoRetry(pAd);
|
||||
RTMP_IO_WRITE32(pAd, TX_RTY_CFG, MacReg);
|
||||
}
|
||||
|
||||
pAd->VideoTurbine.TxBASize = GetAsicVideoTxBA(pAd);
|
||||
|
||||
Set_RateAdaptInterval(pAd, "100:50");
|
||||
TxSwQDepthAdjust(pAd, 1024);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT32 MacReg = 0;
|
||||
|
||||
|
||||
/* Default Tx retry limit = 1F,0F */
|
||||
RTMP_IO_READ32(pAd, TX_RTY_CFG, &MacReg);
|
||||
MacReg &= 0xFFFF0000;
|
||||
MacReg |= GetAsicDefaultRetry(pAd);
|
||||
RTMP_IO_WRITE32(pAd, TX_RTY_CFG, MacReg);
|
||||
|
||||
pAd->VideoTurbine.TxBASize = GetAsicDefaultTxBA(pAd);
|
||||
|
||||
/* reset to default rate adaptation simping interval */
|
||||
if ((pAd->ra_interval != DEF_RA_TIME_INTRVAL) ||
|
||||
(pAd->ra_fast_interval != DEF_QUICK_RA_TIME_INTERVAL))
|
||||
Set_RateAdaptInterval(pAd, "500:100");
|
||||
|
||||
TxSwQDepthAdjust(pAd, MAX_PACKETS_IN_QUEUE);
|
||||
}
|
||||
}
|
||||
|
||||
UINT32 GetAsicDefaultRetry(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UINT32 RetryLimit;
|
||||
|
||||
RetryLimit = 0x1F0F;
|
||||
|
||||
return RetryLimit;
|
||||
}
|
||||
|
||||
UCHAR GetAsicDefaultTxBA(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
return pAd->CommonCfg.TxBASize;
|
||||
}
|
||||
|
||||
UINT32 GetAsicVideoRetry(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
return pAd->VideoTurbine.TxRetryLimit;
|
||||
}
|
||||
|
||||
UCHAR GetAsicVideoTxBA(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
return pAd->VideoTurbine.TxBASize;
|
||||
}
|
||||
|
||||
VOID VideoConfigInit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
pAd->VideoTurbine.Enable = FALSE;
|
||||
pAd->VideoTurbine.TxRetryLimit = 0x2F1F;
|
||||
pAd->VideoTurbine.TxBASize = pAd->CommonCfg.TxBASize;
|
||||
}
|
||||
|
||||
#endif /* VIDEO_TURBINE_SUPPORT */
|
||||
|
||||
|
370
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_wep.c
Normal file
370
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_wep.c
Normal file
@ -0,0 +1,370 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_wep.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Paul Wu 10-28-02 Initial
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
UINT FCSTAB_32[256] =
|
||||
{
|
||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
|
||||
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
|
||||
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
|
||||
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
|
||||
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
|
||||
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
|
||||
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
|
||||
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
|
||||
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
|
||||
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
|
||||
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
|
||||
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
|
||||
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
|
||||
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
||||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
|
||||
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
|
||||
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
|
||||
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
|
||||
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
|
||||
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
||||
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
|
||||
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
|
||||
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
|
||||
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
|
||||
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
|
||||
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
|
||||
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
|
||||
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
|
||||
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
||||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
|
||||
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
|
||||
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
|
||||
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
|
||||
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
|
||||
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
|
||||
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
|
||||
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
|
||||
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
|
||||
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
|
||||
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
|
||||
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
||||
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
|
||||
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
|
||||
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
||||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
|
||||
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
|
||||
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
|
||||
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
|
||||
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
|
||||
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
|
||||
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
|
||||
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
|
||||
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
|
||||
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
|
||||
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
|
||||
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
|
||||
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
|
||||
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
|
||||
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
||||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
|
||||
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
|
||||
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||
};
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Calculate a new FCS given the current FCS and the new data.
|
||||
|
||||
Arguments:
|
||||
Fcs the original FCS value
|
||||
Cp pointer to the data which will be calculate the FCS
|
||||
Len the length of the data
|
||||
|
||||
Return Value:
|
||||
UINT - FCS 32 bits
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
UINT RTMP_CALC_FCS32(
|
||||
IN UINT Fcs,
|
||||
IN PUCHAR Cp,
|
||||
IN INT Len)
|
||||
{
|
||||
while (Len--)
|
||||
Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
|
||||
|
||||
return (Fcs);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Init WEP function.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pKey Pointer to the WEP KEY
|
||||
KeyId WEP Key ID
|
||||
KeyLen the length of WEP KEY
|
||||
pDest Pointer to the destination which Encryption data will store in.
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPInitWepEngine(
|
||||
IN PUCHAR pIv,
|
||||
IN PUCHAR pKey,
|
||||
IN UCHAR KeyLen,
|
||||
OUT ARC4_CTX_STRUC *pARC4_CTX)
|
||||
{
|
||||
PUCHAR seed = NULL;
|
||||
UINT8 seed_len;
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&seed, sizeof(UCHAR)*16);
|
||||
if (seed == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: seed Allocate memory fail!!!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
/* WEP seed construction */
|
||||
NdisZeroMemory(seed, 16);
|
||||
NdisMoveMemory(seed, pIv, 3);
|
||||
NdisMoveMemory(&seed[3], pKey, KeyLen);
|
||||
seed_len = 3 + KeyLen;
|
||||
|
||||
/* RC4 uses a pseudo-random number generator (PRNG)
|
||||
to generate a key stream */
|
||||
ARC4_INIT(pARC4_CTX, &seed[0], seed_len);
|
||||
|
||||
os_free_mem(NULL, seed);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Construct WEP IV header.
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
Note:
|
||||
It's a 4-octets header.
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPConstructWEPIVHdr(
|
||||
IN UINT8 key_idx,
|
||||
IN UCHAR *pn,
|
||||
OUT UCHAR *iv_hdr)
|
||||
{
|
||||
NdisZeroMemory(iv_hdr, LEN_WEP_IV_HDR);
|
||||
|
||||
NdisMoveMemory(iv_hdr, pn, LEN_WEP_TSC);
|
||||
|
||||
/* Append key index */
|
||||
iv_hdr[3] = (key_idx << 6);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
WEP MPDU cryptographic encapsulation
|
||||
|
||||
Arguments:
|
||||
pAdapter Pointer to our adapter
|
||||
pSrc Pointer to the received data
|
||||
Len the length of the received data
|
||||
|
||||
Return Value:
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPSoftEncryptWEP(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pIvHdr,
|
||||
IN PCIPHER_KEY pKey,
|
||||
INOUT PUCHAR pData,
|
||||
IN ULONG DataByteCnt)
|
||||
{
|
||||
ARC4_CTX_STRUC *ARC4_CTX = NULL;
|
||||
UINT FCSCRC32;
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&ARC4_CTX, sizeof(ARC4_CTX_STRUC));
|
||||
if (ARC4_CTX == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ARC4_CTX Allocate memory fail!!!\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (pKey->KeyLen == 0)
|
||||
{
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : The key is empty !\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Initialize WEP key stream */
|
||||
RTMPInitWepEngine(pIvHdr,
|
||||
pKey->Key,
|
||||
pKey->KeyLen,
|
||||
ARC4_CTX);
|
||||
|
||||
/* WEP computes the ICV over the plaintext data */
|
||||
FCSCRC32 = RTMP_CALC_FCS32(PPPINITFCS32, pData, DataByteCnt);
|
||||
FCSCRC32 ^= 0xffffffff; /* complement */
|
||||
FCSCRC32 = cpu2le32(FCSCRC32);
|
||||
|
||||
/* Append 4-bytes ICV after the MPDU data */
|
||||
NdisMoveMemory(pData + DataByteCnt, (PUCHAR)&FCSCRC32, LEN_ICV);
|
||||
|
||||
/* Encrypt the MPDU plaintext data and ICV using ARC4 with a seed */
|
||||
ARC4_Compute(ARC4_CTX, pData, DataByteCnt + LEN_ICV, pData);
|
||||
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Decrypt received WEP data
|
||||
|
||||
Arguments:
|
||||
pAdapter Pointer to our adapter
|
||||
pSrc Pointer to the received data
|
||||
Len the length of the received data
|
||||
|
||||
Return Value:
|
||||
TRUE Decrypt WEP data success
|
||||
FALSE Decrypt WEP data failed
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPSoftDecryptWEP(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PCIPHER_KEY pKey,
|
||||
INOUT PUCHAR pData,
|
||||
INOUT UINT16 *DataByteCnt)
|
||||
{
|
||||
/*ARC4_CTX_STRUC ARC4_CTX;*/
|
||||
ARC4_CTX_STRUC *ARC4_CTX = NULL;
|
||||
PUCHAR plaintext_ptr;
|
||||
UINT16 plaintext_len;
|
||||
PUCHAR ciphertext_ptr;
|
||||
UINT16 ciphertext_len;
|
||||
UINT trailfcs;
|
||||
UINT crc32;
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&ARC4_CTX, sizeof(ARC4_CTX_STRUC));
|
||||
if (ARC4_CTX == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ARC4_CTX Allocate memory fail!!!\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (pKey->KeyLen == 0)
|
||||
{
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : The key is not available !\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Initialize WEP key stream */
|
||||
RTMPInitWepEngine(pData,
|
||||
pKey->Key,
|
||||
pKey->KeyLen,
|
||||
ARC4_CTX);
|
||||
|
||||
/* Skip the WEP IV header (4-bytes) */
|
||||
ciphertext_ptr = pData + LEN_WEP_IV_HDR;
|
||||
ciphertext_len = *DataByteCnt - LEN_WEP_IV_HDR;
|
||||
|
||||
/*skip payload length is zero*/
|
||||
if ((*DataByteCnt) <= LEN_WEP_IV_HDR) {
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Decrypt the WEP MPDU. It shall include plaintext and ICV.
|
||||
The result output would overwrite the original WEP IV header position */
|
||||
ARC4_Compute(ARC4_CTX,
|
||||
ciphertext_ptr,
|
||||
ciphertext_len,
|
||||
pData);
|
||||
|
||||
/* Point to the decrypted data frame and its length shall exclude ICV length */
|
||||
plaintext_ptr = pData;
|
||||
plaintext_len = ciphertext_len - LEN_ICV;
|
||||
|
||||
/* Extract peer's the ICV */
|
||||
NdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV);
|
||||
|
||||
/* WEP recomputes the ICV and
|
||||
bit-wise compares it with the decrypted ICV from the MPDU. */
|
||||
crc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len);
|
||||
crc32 ^= 0xffffffff; /* complement */
|
||||
|
||||
if(crc32 != cpu2le32(trailfcs))
|
||||
{
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("! WEP Data CRC Error !\n")); /*CRC error.*/
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Update the total data length */
|
||||
*DataByteCnt = plaintext_len;
|
||||
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
7025
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_wpa.c
Normal file
7025
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/cmm_wpa.c
Normal file
File diff suppressed because it is too large
Load Diff
1599
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/crypt_aes.c
Normal file
1599
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/crypt_aes.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,139 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
Module Name:
|
||||
RC4
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ------------------------------------------
|
||||
Eddy 2009/05/13 ARC4
|
||||
***************************************************************************/
|
||||
|
||||
#include "crypt_arc4.h"
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
ARC4 initialize the key block
|
||||
|
||||
Arguments:
|
||||
pARC4_CTX Pointer to ARC4 CONTEXT
|
||||
Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)
|
||||
KeyLength The length of cipher key in bytes
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID ARC4_INIT (
|
||||
IN ARC4_CTX_STRUC *pARC4_CTX,
|
||||
IN PUCHAR pKey,
|
||||
IN UINT KeyLength)
|
||||
{
|
||||
UINT BlockIndex = 0, SWAPIndex = 0, KeyIndex = 0;
|
||||
UINT8 TempValue = 0;
|
||||
|
||||
/*Initialize the block value*/
|
||||
pARC4_CTX->BlockIndex1 = 0;
|
||||
pARC4_CTX->BlockIndex2 = 0;
|
||||
for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++)
|
||||
pARC4_CTX->KeyBlock[BlockIndex] = (UINT8) BlockIndex;
|
||||
|
||||
/*Key schedule*/
|
||||
for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++)
|
||||
{
|
||||
TempValue = pARC4_CTX->KeyBlock[BlockIndex];
|
||||
KeyIndex = BlockIndex % KeyLength;
|
||||
SWAPIndex = (SWAPIndex + TempValue + pKey[KeyIndex]) & 0xff;
|
||||
pARC4_CTX->KeyBlock[BlockIndex] = pARC4_CTX->KeyBlock[SWAPIndex];
|
||||
pARC4_CTX->KeyBlock[SWAPIndex] = TempValue;
|
||||
} /* End of for */
|
||||
|
||||
} /* End of ARC4_INIT */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
ARC4 encryption/decryption
|
||||
|
||||
Arguments:
|
||||
pARC4_CTX Pointer to ARC4 CONTEXT
|
||||
InputText Input text
|
||||
InputTextLength The length of input text in bytes
|
||||
|
||||
Return Value:
|
||||
OutputBlock Return output text
|
||||
========================================================================
|
||||
*/
|
||||
VOID ARC4_Compute (
|
||||
IN ARC4_CTX_STRUC *pARC4_CTX,
|
||||
IN UINT8 InputBlock[],
|
||||
IN UINT InputBlockSize,
|
||||
OUT UINT8 OutputBlock[])
|
||||
{
|
||||
UINT InputIndex = 0;
|
||||
UINT8 TempValue = 0;
|
||||
|
||||
for (InputIndex = 0; InputIndex < InputBlockSize; InputIndex++)
|
||||
{
|
||||
pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff;
|
||||
TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1];
|
||||
pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff;
|
||||
|
||||
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2];
|
||||
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue;
|
||||
|
||||
TempValue = (TempValue + pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]) & 0xff;
|
||||
OutputBlock[InputIndex] = InputBlock[InputIndex]^pARC4_CTX->KeyBlock[TempValue];
|
||||
|
||||
} /* End of for */
|
||||
} /* End of ARC4_Compute */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Discard the key length
|
||||
|
||||
Arguments:
|
||||
pARC4_CTX Pointer to ARC4 CONTEXT
|
||||
Length Discard the key length
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID ARC4_Discard_KeyLength (
|
||||
IN ARC4_CTX_STRUC *pARC4_CTX,
|
||||
IN UINT Length)
|
||||
{
|
||||
UINT Index = 0;
|
||||
UINT8 TempValue = 0;
|
||||
|
||||
for (Index = 0; Index < Length; Index++)
|
||||
{
|
||||
pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff;
|
||||
TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1];
|
||||
pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff;
|
||||
|
||||
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2];
|
||||
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue;
|
||||
} /* End of for */
|
||||
|
||||
} /* End of ARC4_Discard_KeyLength */
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,551 @@
|
||||
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgment:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgment:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* Mediatek Inc.
|
||||
* 5F., No.5, Taiyuan 1st St., Zhubei City,
|
||||
* Hsinchu County 302, Taiwan, R.O.C.
|
||||
* (c) Copyright 2014, Mediatek, Inc.
|
||||
*
|
||||
* All rights reserved. Mediatek's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Mediatek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Mediatek, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
crypt_bignum.c
|
||||
|
||||
Abstract:
|
||||
BN wrepper for reference OPENSSL funcitons
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ---------------------------------------------
|
||||
Ellis 2018.3.1 Initial version
|
||||
*/
|
||||
#ifdef DOT11_SAE_OPENSSL_BN
|
||||
#include "crypt_bignum.h"
|
||||
#include "rt_config.h"
|
||||
#include <linux/time.h>
|
||||
|
||||
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define DEBUGPRINT(fmt, args...) printk(fmt, ## args)
|
||||
#else
|
||||
#define DEBUGPRINT(fmt, args...) printf(fmt, ## args)
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
VOID Bignum_Print (
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
UINT32 i, j = 0;
|
||||
|
||||
DEBUGPRINT("dmax = %d, top = %d\n", pBI->dmax, pBI->top);
|
||||
|
||||
for (i = pBI->dmax - 1; j < pBI->dmax; i--, j++) {
|
||||
if (j/4 > 0 && j % 4 == 0)
|
||||
DEBUGPRINT("\n");
|
||||
DEBUGPRINT("%02x %02x %02x %02x ", (pBI->d[i] & 0xff000000) >> 24,
|
||||
(pBI->d[i] & 0xff0000) >> 16, (pBI->d[i] & 0xff00) >> 8, (pBI->d[i] & 0xff)) ;
|
||||
}
|
||||
|
||||
DEBUGPRINT("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID Bignum_Init(
|
||||
INOUT BIGNUM **pBI)
|
||||
{
|
||||
if (*pBI == NULL) {
|
||||
*pBI = BN_new();
|
||||
}
|
||||
}
|
||||
|
||||
VOID Bignum_Free(
|
||||
IN BIGNUM **pBI)
|
||||
{
|
||||
if (*pBI != NULL)
|
||||
BN_free(*pBI);
|
||||
*pBI = NULL;
|
||||
}
|
||||
|
||||
UINT32 Bignum_getlen(
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
return pBI->top * 4;
|
||||
}
|
||||
|
||||
INT Bignum_Get_rand_range(IN BIGNUM * range, INOUT BIGNUM * r)
|
||||
{
|
||||
return BN_rand_range(r, (const BIGNUM *)range);
|
||||
}
|
||||
|
||||
VOID Bignum_BI2Bin(
|
||||
IN BIGNUM *pBI,
|
||||
OUT UINT8 *pValue,
|
||||
OUT UINT *Length)
|
||||
{
|
||||
*Length = BN_num_bytes(pBI);
|
||||
BN_bn2bin(pBI, pValue);
|
||||
} /* End of Bignum_BI2Bin */
|
||||
|
||||
|
||||
VOID Bignum_BI2Bin_with_pad(
|
||||
IN BIGNUM *pBI,
|
||||
OUT UINT8 *pValue,
|
||||
IN UINT *Length,
|
||||
IN UINT32 PadLen)
|
||||
{
|
||||
UINT32 num_bytes, offset;
|
||||
|
||||
num_bytes = BN_num_bytes((const BIGNUM *) pBI);
|
||||
|
||||
if (PadLen > num_bytes)
|
||||
offset = PadLen - num_bytes;
|
||||
else
|
||||
offset = 0;
|
||||
|
||||
NdisZeroMemory(pValue, offset);
|
||||
Bignum_BI2Bin(pBI, pValue + offset, Length);
|
||||
*Length += offset;
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Bin2BI(
|
||||
IN UINT8 *pValue,
|
||||
IN UINT Length,
|
||||
OUT BIGNUM **pBI)
|
||||
{
|
||||
if (*pBI)
|
||||
BN_free(*pBI);
|
||||
*pBI = BN_bin2bn(pValue, Length, NULL);
|
||||
} /* End of Bignum_Bin2BI */
|
||||
|
||||
|
||||
VOID Bignum_Copy(
|
||||
IN BIGNUM *pBI_Copied,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result)
|
||||
BN_free(*pBI_Result);
|
||||
*pBI_Result = BN_dup(pBI_Copied);
|
||||
} /* End of Bignum_Copy */
|
||||
|
||||
|
||||
INT Bignum_UnsignedCompare(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand)
|
||||
{
|
||||
return BN_ucmp(pFirstOperand, pSecondOperand);
|
||||
} /* End of Bignum_Compare */
|
||||
|
||||
|
||||
VOID Bignum_Add(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
BN_add(*pBI_Result, pFirstOperand, pSecondOperand);
|
||||
} /* End of Bignum_Add */
|
||||
|
||||
|
||||
VOID Bignum_Sub(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
BN_sub(*pBI_Result, pFirstOperand, pSecondOperand);
|
||||
} /* End of Bignum_Sub */
|
||||
|
||||
VOID Bignum_Mod(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
OUT BIGNUM **pBI_Remainder)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Remainder == NULL)
|
||||
*pBI_Remainder = BN_new();
|
||||
|
||||
BN_mod(*pBI_Remainder, pFirstOperand, pSecondOperand, bnctx);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Mul(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_mul(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P, bnctx);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
|
||||
UCHAR Bignum_is_zero(
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
return (UCHAR)BN_is_zero(pBI);
|
||||
}
|
||||
|
||||
UCHAR Bignum_is_one(
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
return (UCHAR)BN_is_one(pBI);
|
||||
}
|
||||
|
||||
UCHAR Bignum_is_odd(
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
return (UCHAR)BN_is_odd(pBI);
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Mod_Square(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_sqr(*pBI_Result, pFirstOperand, pBI_P, bnctx);
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Add(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_add(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P, bnctx);
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Mod_Sub(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_sub(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P, bnctx);
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Add_quick(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_add_quick(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P);
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Mod_Sub_quick(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_sub_quick(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P);
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Mod_Div(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BIGNUM *tmp = NULL;
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
|
||||
tmp = BN_CTX_get(bnctx);
|
||||
|
||||
BN_mod_inverse(tmp, pSecondOperand, pBI_P, bnctx);
|
||||
|
||||
Bignum_Mod_Mul(pFirstOperand, tmp, pBI_P, pBI_Result);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Tonelli¡VShanks algorithm*/
|
||||
/* reference: https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm */
|
||||
/* pBI_P must be prime */
|
||||
VOID Bignum_Mod_Sqrt(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_sqrt(*pBI_Result, pFirstOperand, pBI_P, bnctx);
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Shift_Right1(
|
||||
IN BIGNUM *pBI,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_copy(*pBI_Result, pBI);
|
||||
BN_div_word(*pBI_Result, 2);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Shift_Left1(
|
||||
IN BIGNUM *pBI,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_mod_lshift1_quick(*pBI_Result, pBI, pBI_P);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Shift_Left(
|
||||
IN BIGNUM *pBI,
|
||||
IN UCHAR bit,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_mod_lshift_quick(*pBI_Result, pBI, bit, pBI_P);
|
||||
}
|
||||
|
||||
|
||||
/* an integer q is called a quadratic residue modulo n if it is congruent to a perfect square modulo n */
|
||||
UCHAR Bignum_is_quadratic_residue(
|
||||
IN BIGNUM *q,
|
||||
IN BIGNUM *prime)
|
||||
{
|
||||
BIGNUM *p = NULL;
|
||||
BIGNUM *res = NULL;
|
||||
UCHAR ret;
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
res = BN_CTX_get(bnctx);
|
||||
|
||||
Bignum_Copy(prime, &p);
|
||||
BN_sub_word(p, 1);
|
||||
Bignum_Shift_Right1(p, &p);
|
||||
BN_mod_exp_mont(res, q, p, prime, bnctx, NULL);
|
||||
ret = Bignum_is_one(res);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
BN_free(p);
|
||||
return ret;
|
||||
}
|
||||
|
||||
VOID Bignum_Add_DW(
|
||||
INOUT BIGNUM *pBI,
|
||||
IN UINT32 value)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_DW(
|
||||
INOUT BIGNUM *pBI,
|
||||
IN UINT32 value,
|
||||
OUT UINT32 *rem)
|
||||
{
|
||||
*rem = pBI->d[0] & (value - 1);
|
||||
pBI->d[0] &= ~(value - 1);
|
||||
}
|
||||
|
||||
VOID Bignum_Montgomery_ExpMod(
|
||||
IN BIGNUM *pBI_G,
|
||||
IN BIGNUM *pBI_E,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_exp_mont(*pBI_Result, pBI_G, pBI_E, pBI_P, bnctx, NULL);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Mul_Inverse(
|
||||
IN BIGNUM *pBI,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_inverse(*pBI_Result, pBI, pBI_P, bnctx);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* End of crypt_Bignum.c */
|
||||
|
||||
#endif /* DOT11_SAE_OPENSSL_BN */
|
@ -0,0 +1,227 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
Module Name:
|
||||
DH
|
||||
|
||||
Abstract:
|
||||
RFC 2631: Diffie-Hellman Key Agreement Method
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ------------------------------------------
|
||||
Eddy 2009/01/21 Create Diffie-Hellman
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#include "crypt_dh.h"
|
||||
#include "crypt_biginteger.h"
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Diffie-Hellman public key generation
|
||||
|
||||
Arguments:
|
||||
GValue Array in UINT8
|
||||
GValueLength The length of G in bytes
|
||||
PValue Array in UINT8
|
||||
PValueLength The length of P in bytes
|
||||
PrivateKey Private key
|
||||
PrivateKeyLength The length of Private key in bytes
|
||||
|
||||
Return Value:
|
||||
PublicKey Public key
|
||||
PublicKeyLength The length of public key in bytes
|
||||
|
||||
Note:
|
||||
Reference to RFC2631
|
||||
PublicKey = G^PrivateKey (mod P)
|
||||
========================================================================
|
||||
*/
|
||||
void DH_PublicKey_Generate (
|
||||
IN UINT8 GValue[],
|
||||
IN UINT GValueLength,
|
||||
IN UINT8 PValue[],
|
||||
IN UINT PValueLength,
|
||||
IN UINT8 PrivateKey[],
|
||||
IN UINT PrivateKeyLength,
|
||||
OUT UINT8 PublicKey[],
|
||||
INOUT UINT *PublicKeyLength)
|
||||
{
|
||||
PBIG_INTEGER pBI_G = NULL;
|
||||
PBIG_INTEGER pBI_P = NULL;
|
||||
PBIG_INTEGER pBI_PrivateKey = NULL;
|
||||
PBIG_INTEGER pBI_PublicKey = NULL;
|
||||
|
||||
/*
|
||||
* 1. Check the input parameters
|
||||
* - GValueLength, PValueLength and PrivateLength must be large than zero
|
||||
* - PublicKeyLength must be large or equal than PValueLength
|
||||
* - PValue must be odd
|
||||
*
|
||||
* - PValue must be prime number (no implement)
|
||||
* - GValue must be greater than 0 but less than the PValue (no implement)
|
||||
*/
|
||||
if (GValueLength == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_PublicKey_Generate: G length is (%d)\n", GValueLength));
|
||||
return;
|
||||
} /* End of if */
|
||||
if (PValueLength == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_PublicKey_Generate: P length is (%d)\n", PValueLength));
|
||||
return;
|
||||
} /* End of if */
|
||||
if (PrivateKeyLength == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_PublicKey_Generate: private key length is (%d)\n", PrivateKeyLength));
|
||||
return;
|
||||
} /* End of if */
|
||||
if (*PublicKeyLength < PValueLength) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_PublicKey_Generate: public key length(%d) must be large or equal than P length(%d)\n",
|
||||
*PublicKeyLength, PValueLength));
|
||||
return;
|
||||
} /* End of if */
|
||||
if (!(PValue[PValueLength - 1] & 0x1)) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_PublicKey_Generate: P value must be odd\n"));
|
||||
return;
|
||||
} /* End of if */
|
||||
|
||||
/*
|
||||
* 2. Transfer parameters to BigInteger structure
|
||||
*/
|
||||
BigInteger_Init(&pBI_G);
|
||||
BigInteger_Init(&pBI_P);
|
||||
BigInteger_Init(&pBI_PrivateKey);
|
||||
BigInteger_Init(&pBI_PublicKey);
|
||||
BigInteger_Bin2BI(GValue, GValueLength, &pBI_G);
|
||||
BigInteger_Bin2BI(PValue, PValueLength, &pBI_P);
|
||||
BigInteger_Bin2BI(PrivateKey, PrivateKeyLength, &pBI_PrivateKey);
|
||||
|
||||
/*
|
||||
* 3. Calculate PublicKey = G^PrivateKey (mod P)
|
||||
* - BigInteger Operation
|
||||
* - Montgomery reduction
|
||||
*/
|
||||
BigInteger_Montgomery_ExpMod(pBI_G, pBI_PrivateKey, pBI_P, &pBI_PublicKey);
|
||||
|
||||
/*
|
||||
* 4. Transfer BigInteger structure to char array
|
||||
*/
|
||||
BigInteger_BI2Bin(pBI_PublicKey, PublicKey, PublicKeyLength);
|
||||
|
||||
BigInteger_Free(&pBI_G);
|
||||
BigInteger_Free(&pBI_P);
|
||||
BigInteger_Free(&pBI_PrivateKey);
|
||||
BigInteger_Free(&pBI_PublicKey);
|
||||
} /* End of DH_PublicKey_Generate */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Diffie-Hellman secret key generation
|
||||
|
||||
Arguments:
|
||||
PublicKey Public key
|
||||
PublicKeyLength The length of Public key in bytes
|
||||
PValue Array in UINT8
|
||||
PValueLength The length of P in bytes
|
||||
PrivateKey Private key
|
||||
PrivateKeyLength The length of Private key in bytes
|
||||
|
||||
Return Value:
|
||||
SecretKey Secret key
|
||||
SecretKeyLength The length of secret key in bytes
|
||||
|
||||
Note:
|
||||
Reference to RFC2631
|
||||
SecretKey = PublicKey^PrivateKey (mod P)
|
||||
========================================================================
|
||||
*/
|
||||
void DH_SecretKey_Generate (
|
||||
IN UINT8 PublicKey[],
|
||||
IN UINT PublicKeyLength,
|
||||
IN UINT8 PValue[],
|
||||
IN UINT PValueLength,
|
||||
IN UINT8 PrivateKey[],
|
||||
IN UINT PrivateKeyLength,
|
||||
OUT UINT8 SecretKey[],
|
||||
INOUT UINT *SecretKeyLength)
|
||||
{
|
||||
PBIG_INTEGER pBI_P = NULL;
|
||||
PBIG_INTEGER pBI_SecretKey = NULL;
|
||||
PBIG_INTEGER pBI_PrivateKey = NULL;
|
||||
PBIG_INTEGER pBI_PublicKey = NULL;
|
||||
|
||||
/*
|
||||
* 1. Check the input parameters
|
||||
* - PublicKeyLength, PValueLength and PrivateLength must be large than zero
|
||||
* - SecretKeyLength must be large or equal than PValueLength
|
||||
* - PValue must be odd
|
||||
*
|
||||
* - PValue must be prime number (no implement)
|
||||
*/
|
||||
if (PublicKeyLength == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_SecretKey_Generate: public key length is (%d)\n", PublicKeyLength));
|
||||
return;
|
||||
} /* End of if */
|
||||
if (PValueLength == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_SecretKey_Generate: P length is (%d)\n", PValueLength));
|
||||
return;
|
||||
} /* End of if */
|
||||
if (PrivateKeyLength == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_SecretKey_Generate: private key length is (%d)\n", PrivateKeyLength));
|
||||
return;
|
||||
} /* End of if */
|
||||
if (*SecretKeyLength < PValueLength) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_SecretKey_Generate: secret key length(%d) must be large or equal than P length(%d)\n",
|
||||
*SecretKeyLength, PValueLength));
|
||||
return;
|
||||
} /* End of if */
|
||||
if (!(PValue[PValueLength - 1] & 0x1)) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("DH_SecretKey_Generate: P value must be odd\n"));
|
||||
return;
|
||||
} /* End of if */
|
||||
|
||||
/*
|
||||
* 2. Transfer parameters to BigInteger structure
|
||||
*/
|
||||
BigInteger_Init(&pBI_P);
|
||||
BigInteger_Init(&pBI_PrivateKey);
|
||||
BigInteger_Init(&pBI_PublicKey);
|
||||
BigInteger_Init(&pBI_SecretKey);
|
||||
|
||||
BigInteger_Bin2BI(PublicKey, PublicKeyLength, &pBI_PublicKey);
|
||||
BigInteger_Bin2BI(PValue, PValueLength, &pBI_P);
|
||||
BigInteger_Bin2BI(PrivateKey, PrivateKeyLength, &pBI_PrivateKey);
|
||||
|
||||
/*
|
||||
* 3. Calculate SecretKey = PublicKey^PrivateKey (mod P)
|
||||
* - BigInteger Operation
|
||||
* - Montgomery reduction
|
||||
*/
|
||||
BigInteger_Montgomery_ExpMod(pBI_PublicKey, pBI_PrivateKey, pBI_P, &pBI_SecretKey);
|
||||
|
||||
/*
|
||||
* 4. Transfer BigInteger structure to char array
|
||||
*/
|
||||
BigInteger_BI2Bin(pBI_SecretKey, SecretKey, SecretKeyLength);
|
||||
|
||||
BigInteger_Free(&pBI_P);
|
||||
BigInteger_Free(&pBI_PrivateKey);
|
||||
BigInteger_Free(&pBI_PublicKey);
|
||||
BigInteger_Free(&pBI_SecretKey);
|
||||
} /* End of DH_SecretKey_Generate */
|
||||
|
@ -0,0 +1,505 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
Module Name:
|
||||
HMAC
|
||||
|
||||
Abstract:
|
||||
FIPS 198: The Keyed-Hash Message Authentication Code (HMAC)
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ------------------------------------------
|
||||
Eddy 2008/11/24 Create HMAC-SHA1, HMAC-SHA256
|
||||
***************************************************************************/
|
||||
|
||||
#include "crypt_hmac.h"
|
||||
|
||||
|
||||
#ifdef HMAC_SHA1_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
HMAC using SHA1 hash function
|
||||
|
||||
Arguments:
|
||||
key Secret key
|
||||
key_len The length of the key in bytes
|
||||
message Message context
|
||||
message_len The length of message in bytes
|
||||
macLen Request the length of message authentication code
|
||||
|
||||
Return Value:
|
||||
mac Message authentication code
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_HMAC_SHA1 (
|
||||
IN const UINT8 Key[],
|
||||
IN UINT KeyLen,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 MAC[],
|
||||
IN UINT MACLen)
|
||||
{
|
||||
SHA1_CTX_STRUC sha_ctx1;
|
||||
SHA1_CTX_STRUC sha_ctx2;
|
||||
UINT8 K0[SHA1_BLOCK_SIZE];
|
||||
UINT8 Digest[SHA1_DIGEST_SIZE];
|
||||
UINT index;
|
||||
|
||||
NdisZeroMemory(&sha_ctx1, sizeof(SHA1_CTX_STRUC));
|
||||
NdisZeroMemory(&sha_ctx2, sizeof(SHA1_CTX_STRUC));
|
||||
/*
|
||||
* If the length of K = B(Block size): K0 = K.
|
||||
* If the length of K > B: hash K to obtain an L byte string,
|
||||
* then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
|
||||
* If the length of K < B: append zeros to the end of K to create a B-byte string K0
|
||||
*/
|
||||
NdisZeroMemory(K0, SHA1_BLOCK_SIZE);
|
||||
if (KeyLen <= SHA1_BLOCK_SIZE)
|
||||
NdisMoveMemory(K0, Key, KeyLen);
|
||||
else
|
||||
RT_SHA1(Key, KeyLen, K0);
|
||||
/* End of if */
|
||||
|
||||
/* Exclusive-Or K0 with ipad */
|
||||
/* ipad: Inner pad; the byte x・36・ repeated B times. */
|
||||
for (index = 0; index < SHA1_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36;
|
||||
/* End of for */
|
||||
|
||||
RT_SHA1_Init(&sha_ctx1);
|
||||
/* H(K0^ipad) */
|
||||
RT_SHA1_Append(&sha_ctx1, K0, sizeof(K0));
|
||||
/* H((K0^ipad)||text) */
|
||||
RT_SHA1_Append(&sha_ctx1, Message, MessageLen);
|
||||
RT_SHA1_End(&sha_ctx1, Digest);
|
||||
|
||||
/* Exclusive-Or K0 with opad and remove ipad */
|
||||
/* opad: Outer pad; the byte x・5c・ repeated B times. */
|
||||
for (index = 0; index < SHA1_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36^0x5c;
|
||||
/* End of for */
|
||||
|
||||
RT_SHA1_Init(&sha_ctx2);
|
||||
/* H(K0^opad) */
|
||||
RT_SHA1_Append(&sha_ctx2, K0, sizeof(K0));
|
||||
/* H( (K0^opad) || H((K0^ipad)||text) ) */
|
||||
RT_SHA1_Append(&sha_ctx2, Digest, SHA1_DIGEST_SIZE);
|
||||
RT_SHA1_End(&sha_ctx2, Digest);
|
||||
|
||||
if (MACLen > SHA1_DIGEST_SIZE)
|
||||
NdisMoveMemory(MAC, Digest, SHA1_DIGEST_SIZE);
|
||||
else
|
||||
NdisMoveMemory(MAC, Digest, MACLen);
|
||||
} /* End of RT_HMAC_SHA1 */
|
||||
#endif /* HMAC_SHA1_SUPPORT */
|
||||
|
||||
|
||||
#ifdef HMAC_SHA256_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
HMAC using SHA256 hash function
|
||||
|
||||
Arguments:
|
||||
key Secret key
|
||||
key_len The length of the key in bytes
|
||||
message Message context
|
||||
message_len The length of message in bytes
|
||||
macLen Request the length of message authentication code
|
||||
|
||||
Return Value:
|
||||
mac Message authentication code
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_HMAC_SHA256 (
|
||||
IN const UINT8 Key[],
|
||||
IN UINT KeyLen,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 MAC[],
|
||||
IN UINT MACLen)
|
||||
{
|
||||
SHA256_CTX_STRUC sha_ctx1;
|
||||
SHA256_CTX_STRUC sha_ctx2;
|
||||
UINT8 K0[SHA256_BLOCK_SIZE];
|
||||
UINT8 Digest[SHA256_DIGEST_SIZE];
|
||||
UINT index;
|
||||
|
||||
NdisZeroMemory(&sha_ctx1, sizeof(SHA256_CTX_STRUC));
|
||||
NdisZeroMemory(&sha_ctx2, sizeof(SHA256_CTX_STRUC));
|
||||
/*
|
||||
* If the length of K = B(Block size): K0 = K.
|
||||
* If the length of K > B: hash K to obtain an L byte string,
|
||||
* then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
|
||||
* If the length of K < B: append zeros to the end of K to create a B-byte string K0
|
||||
*/
|
||||
NdisZeroMemory(K0, SHA256_BLOCK_SIZE);
|
||||
if (KeyLen <= SHA256_BLOCK_SIZE) {
|
||||
NdisMoveMemory(K0, Key, KeyLen);
|
||||
} else {
|
||||
RT_SHA256(Key, KeyLen, K0);
|
||||
}
|
||||
|
||||
/* Exclusive-Or K0 with ipad */
|
||||
/* ipad: Inner pad; the byte x・36・ repeated B times. */
|
||||
for (index = 0; index < SHA256_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36;
|
||||
/* End of for */
|
||||
|
||||
RT_SHA256_Init(&sha_ctx1);
|
||||
/* H(K0^ipad) */
|
||||
RT_SHA256_Append(&sha_ctx1, K0, sizeof(K0));
|
||||
/* H((K0^ipad)||text) */
|
||||
RT_SHA256_Append(&sha_ctx1, Message, MessageLen);
|
||||
RT_SHA256_End(&sha_ctx1, Digest);
|
||||
|
||||
/* Exclusive-Or K0 with opad and remove ipad */
|
||||
/* opad: Outer pad; the byte x・5c・ repeated B times. */
|
||||
for (index = 0; index < SHA256_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36^0x5c;
|
||||
/* End of for */
|
||||
|
||||
RT_SHA256_Init(&sha_ctx2);
|
||||
/* H(K0^opad) */
|
||||
RT_SHA256_Append(&sha_ctx2, K0, sizeof(K0));
|
||||
/* H( (K0^opad) || H((K0^ipad)||text) ) */
|
||||
RT_SHA256_Append(&sha_ctx2, Digest, SHA256_DIGEST_SIZE);
|
||||
RT_SHA256_End(&sha_ctx2, Digest);
|
||||
|
||||
if (MACLen > SHA256_DIGEST_SIZE)
|
||||
NdisMoveMemory(MAC, Digest,SHA256_DIGEST_SIZE);
|
||||
else
|
||||
NdisMoveMemory(MAC, Digest, MACLen);
|
||||
|
||||
} /* End of RT_HMAC_SHA256 */
|
||||
#if defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT)
|
||||
VOID RT_HMAC_SHA256_VECTOR(
|
||||
const UINT8 key[],
|
||||
IN UINT key_len,
|
||||
IN UCHAR element_num,
|
||||
IN const UINT8 *message[],
|
||||
IN UINT *message_len,
|
||||
OUT UINT8 mac[],
|
||||
IN UINT mac_len)
|
||||
{
|
||||
SHA256_CTX_STRUC sha_ctx1;
|
||||
SHA256_CTX_STRUC sha_ctx2;
|
||||
UINT8 K0[SHA256_BLOCK_SIZE];
|
||||
UINT8 Digest[SHA256_DIGEST_SIZE];
|
||||
UINT index;
|
||||
const UCHAR *_addr[6];
|
||||
INT _len[6], i;
|
||||
|
||||
NdisZeroMemory(&sha_ctx1, sizeof(SHA256_CTX_STRUC));
|
||||
NdisZeroMemory(&sha_ctx2, sizeof(SHA256_CTX_STRUC));
|
||||
/*
|
||||
* If the length of K = B(Block size): K0 = K.
|
||||
* If the length of K > B: hash K to obtain an L byte string,
|
||||
* then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
|
||||
* If the length of K < B: append zeros to the end of K to create a B-byte string K0
|
||||
*/
|
||||
NdisZeroMemory(K0, SHA256_BLOCK_SIZE);
|
||||
|
||||
if (key_len <= SHA256_BLOCK_SIZE)
|
||||
NdisMoveMemory(K0, key, key_len);
|
||||
else
|
||||
RT_SHA256(key, key_len, K0);
|
||||
|
||||
/* Exclusive-Or K0 with ipad */
|
||||
/* ipad: Inner pad; the byte x??36?? repeated B times. */
|
||||
for (index = 0; index < SHA256_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36;
|
||||
|
||||
/* End of for */
|
||||
RT_SHA256_Init(&sha_ctx1);
|
||||
/* H(K0^ipad) */
|
||||
|
||||
_addr[0] = K0;
|
||||
_len[0] = sizeof(K0);
|
||||
|
||||
for (i = 0; i < element_num; i++) {
|
||||
_addr[i + 1] = message[i];
|
||||
_len[i + 1] = message_len[i];
|
||||
}
|
||||
|
||||
rt_sha256_vector(element_num + 1, _addr, _len, Digest);
|
||||
/* Exclusive-Or K0 with opad and remove ipad */
|
||||
/* opad: Outer pad; the byte x??5c?? repeated B times. */
|
||||
for (index = 0; index < SHA256_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36^0x5c;
|
||||
|
||||
/* End of for */
|
||||
RT_SHA256_Init(&sha_ctx2);
|
||||
/* H(K0^opad) */
|
||||
RT_SHA256_Append(&sha_ctx2, K0, sizeof(K0));
|
||||
/* H( (K0^opad) || H((K0^ipad)||text) ) */
|
||||
RT_SHA256_Append(&sha_ctx2, Digest, SHA256_DIGEST_SIZE);
|
||||
RT_SHA256_End(&sha_ctx2, Digest);
|
||||
|
||||
if (mac_len > SHA256_DIGEST_SIZE)
|
||||
NdisMoveMemory(mac, Digest, SHA256_DIGEST_SIZE);
|
||||
else
|
||||
NdisMoveMemory(mac, Digest, mac_len);
|
||||
}
|
||||
#endif /* defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT) */
|
||||
#endif /* HMAC_SHA256_SUPPORT */
|
||||
|
||||
#if defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT)
|
||||
#ifdef SHA384_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
HMAC using SHA256 hash function
|
||||
|
||||
Arguments:
|
||||
key Secret key
|
||||
key_len The length of the key in bytes
|
||||
message Message context
|
||||
message_len The length of message in bytes
|
||||
macLen Request the length of message authentication code
|
||||
|
||||
Return Value:
|
||||
mac Message authentication code
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_HMAC_SHA384(
|
||||
IN const UINT8 Key[],
|
||||
IN UINT KeyLen,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 MAC[],
|
||||
IN UINT MACLen)
|
||||
{
|
||||
SHA384_CTX_STRUC sha_ctx1;
|
||||
SHA384_CTX_STRUC sha_ctx2;
|
||||
UINT8 K0[SHA384_BLOCK_SIZE];
|
||||
UINT8 Digest[SHA384_DIGEST_SIZE];
|
||||
UINT index;
|
||||
|
||||
NdisZeroMemory(&sha_ctx1, sizeof(SHA384_CTX_STRUC));
|
||||
NdisZeroMemory(&sha_ctx2, sizeof(SHA384_CTX_STRUC));
|
||||
/*
|
||||
* If the length of K = B(Block size): K0 = K.
|
||||
* If the length of K > B: hash K to obtain an L byte string,
|
||||
* then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
|
||||
* If the length of K < B: append zeros to the end of K to create a B-byte string K0
|
||||
*/
|
||||
NdisZeroMemory(K0, SHA384_BLOCK_SIZE);
|
||||
|
||||
if (KeyLen <= SHA384_BLOCK_SIZE)
|
||||
NdisMoveMemory(K0, Key, KeyLen);
|
||||
else
|
||||
RT_SHA384(Key, KeyLen, K0);
|
||||
|
||||
/* Exclusive-Or K0 with ipad */
|
||||
/* ipad: Inner pad; the byte x 36 repeated B times. */
|
||||
for (index = 0; index < SHA384_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36;
|
||||
|
||||
/* End of for */
|
||||
RT_SHA384_Init(&sha_ctx1);
|
||||
/* H(K0^ipad) */
|
||||
RT_SHA384_Append(&sha_ctx1, K0, sizeof(K0));
|
||||
/* H((K0^ipad)||text) */
|
||||
RT_SHA384_Append(&sha_ctx1, Message, MessageLen);
|
||||
RT_SHA384_End(&sha_ctx1, Digest);
|
||||
|
||||
/* Exclusive-Or K0 with opad and remove ipad */
|
||||
/* opad: Outer pad; the byte x 5c repeated B times. */
|
||||
for (index = 0; index < SHA384_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36^0x5c;
|
||||
|
||||
/* End of for */
|
||||
RT_SHA384_Init(&sha_ctx2);
|
||||
/* H(K0^opad) */
|
||||
RT_SHA384_Append(&sha_ctx2, K0, sizeof(K0));
|
||||
/* H( (K0^opad) || H((K0^ipad)||text) ) */
|
||||
RT_SHA384_Append(&sha_ctx2, Digest, SHA384_DIGEST_SIZE);
|
||||
RT_SHA384_End(&sha_ctx2, Digest);
|
||||
|
||||
if (MACLen > SHA384_DIGEST_SIZE)
|
||||
NdisMoveMemory(MAC, Digest, SHA384_DIGEST_SIZE);
|
||||
else
|
||||
NdisMoveMemory(MAC, Digest, MACLen);
|
||||
} /* End of RT_HMAC_SHA384 */
|
||||
|
||||
VOID RT_HMAC_SHA384_VECTOR(
|
||||
const UINT8 key[],
|
||||
IN UINT key_len,
|
||||
IN UCHAR element_num,
|
||||
IN const UINT8 *message[],
|
||||
IN UINT *message_len,
|
||||
OUT UINT8 mac[],
|
||||
IN UINT mac_len)
|
||||
{
|
||||
SHA384_CTX_STRUC sha_ctx1;
|
||||
SHA384_CTX_STRUC sha_ctx2;
|
||||
UINT8 K0[SHA384_BLOCK_SIZE];
|
||||
UINT8 Digest[SHA384_DIGEST_SIZE];
|
||||
UINT index;
|
||||
const UCHAR *_addr[6];
|
||||
INT _len[6], i;
|
||||
|
||||
NdisZeroMemory(&sha_ctx1, sizeof(SHA384_CTX_STRUC));
|
||||
NdisZeroMemory(&sha_ctx2, sizeof(SHA384_CTX_STRUC));
|
||||
/*
|
||||
* If the length of K = B(Block size): K0 = K.
|
||||
* If the length of K > B: hash K to obtain an L byte string,
|
||||
* then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
|
||||
* If the length of K < B: append zeros to the end of K to create a B-byte string K0
|
||||
*/
|
||||
NdisZeroMemory(K0, SHA384_BLOCK_SIZE);
|
||||
|
||||
if (key_len <= SHA384_BLOCK_SIZE)
|
||||
NdisMoveMemory(K0, key, key_len);
|
||||
else
|
||||
RT_SHA384(key, key_len, K0);
|
||||
|
||||
/* Exclusive-Or K0 with ipad */
|
||||
/* ipad: Inner pad; the byte x??36?? repeated B times. */
|
||||
for (index = 0; index < SHA384_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36;
|
||||
|
||||
/* End of for */
|
||||
RT_SHA384_Init(&sha_ctx1);
|
||||
/* H(K0^ipad) */
|
||||
|
||||
_addr[0] = K0;
|
||||
_len[0] = sizeof(K0);
|
||||
|
||||
for (i = 0; i < element_num; i++) {
|
||||
_addr[i + 1] = message[i];
|
||||
_len[i + 1] = message_len[i];
|
||||
}
|
||||
|
||||
rt_sha384_vector(element_num + 1, _addr, _len, Digest);
|
||||
/* Exclusive-Or K0 with opad and remove ipad */
|
||||
/* opad: Outer pad; the byte x??5c?? repeated B times. */
|
||||
for (index = 0; index < SHA384_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36^0x5c;
|
||||
|
||||
/* End of for */
|
||||
RT_SHA384_Init(&sha_ctx2);
|
||||
/* H(K0^opad) */
|
||||
RT_SHA384_Append(&sha_ctx2, K0, sizeof(K0));
|
||||
/* H( (K0^opad) || H((K0^ipad)||text) ) */
|
||||
RT_SHA384_Append(&sha_ctx2, Digest, SHA384_DIGEST_SIZE);
|
||||
RT_SHA384_End(&sha_ctx2, Digest);
|
||||
|
||||
if (mac_len > SHA384_DIGEST_SIZE)
|
||||
NdisMoveMemory(mac, Digest, SHA384_DIGEST_SIZE);
|
||||
else
|
||||
NdisMoveMemory(mac, Digest, mac_len);
|
||||
}
|
||||
|
||||
#endif /* SHA384_SUPPORT */
|
||||
#endif /* defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT) */
|
||||
|
||||
#ifdef HMAC_MD5_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
HMAC using MD5 hash function
|
||||
|
||||
Arguments:
|
||||
key Secret key
|
||||
key_len The length of the key in bytes
|
||||
message Message context
|
||||
message_len The length of message in bytes
|
||||
macLen Request the length of message authentication code
|
||||
|
||||
Return Value:
|
||||
mac Message authentication code
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_HMAC_MD5(
|
||||
IN const UINT8 Key[],
|
||||
IN UINT KeyLen,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 MAC[],
|
||||
IN UINT MACLen)
|
||||
{
|
||||
MD5_CTX_STRUC md5_ctx1;
|
||||
MD5_CTX_STRUC md5_ctx2;
|
||||
UINT8 K0[MD5_BLOCK_SIZE];
|
||||
UINT8 Digest[MD5_DIGEST_SIZE];
|
||||
UINT index;
|
||||
|
||||
NdisZeroMemory(&md5_ctx1, sizeof(MD5_CTX_STRUC));
|
||||
NdisZeroMemory(&md5_ctx2, sizeof(MD5_CTX_STRUC));
|
||||
/*
|
||||
* If the length of K = B(Block size): K0 = K.
|
||||
* If the length of K > B: hash K to obtain an L byte string,
|
||||
* then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
|
||||
* If the length of K < B: append zeros to the end of K to create a B-byte string K0
|
||||
*/
|
||||
NdisZeroMemory(K0, MD5_BLOCK_SIZE);
|
||||
if (KeyLen <= MD5_BLOCK_SIZE) {
|
||||
NdisMoveMemory(K0, Key, KeyLen);
|
||||
} else {
|
||||
RT_MD5(Key, KeyLen, K0);
|
||||
}
|
||||
|
||||
/* Exclusive-Or K0 with ipad */
|
||||
/* ipad: Inner pad; the byte x・36・ repeated B times. */
|
||||
for (index = 0; index < MD5_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36;
|
||||
/* End of for */
|
||||
|
||||
RT_MD5_Init(&md5_ctx1);
|
||||
/* H(K0^ipad) */
|
||||
RT_MD5_Append(&md5_ctx1, K0, sizeof(K0));
|
||||
/* H((K0^ipad)||text) */
|
||||
RT_MD5_Append(&md5_ctx1, Message, MessageLen);
|
||||
RT_MD5_End(&md5_ctx1, Digest);
|
||||
|
||||
/* Exclusive-Or K0 with opad and remove ipad */
|
||||
/* opad: Outer pad; the byte x・5c・ repeated B times. */
|
||||
for (index = 0; index < MD5_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36^0x5c;
|
||||
/* End of for */
|
||||
|
||||
RT_MD5_Init(&md5_ctx2);
|
||||
/* H(K0^opad) */
|
||||
RT_MD5_Append(&md5_ctx2, K0, sizeof(K0));
|
||||
/* H( (K0^opad) || H((K0^ipad)||text) ) */
|
||||
RT_MD5_Append(&md5_ctx2, Digest, MD5_DIGEST_SIZE);
|
||||
RT_MD5_End(&md5_ctx2, Digest);
|
||||
|
||||
if (MACLen > MD5_DIGEST_SIZE)
|
||||
NdisMoveMemory(MAC, Digest, MD5_DIGEST_SIZE);
|
||||
else
|
||||
NdisMoveMemory(MAC, Digest, MACLen);
|
||||
} /* End of RT_HMAC_SHA256 */
|
||||
#endif /* HMAC_MD5_SUPPORT */
|
||||
|
||||
|
||||
/* End of crypt_hmac.c */
|
||||
|
@ -0,0 +1,356 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
Module Name:
|
||||
MD5
|
||||
|
||||
Abstract:
|
||||
RFC1321: The MD5 Message-Digest Algorithm
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ------------------------------------------
|
||||
Eddy 2008/11/24 Create md5
|
||||
***************************************************************************/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
#ifdef MD5_SUPPORT
|
||||
/*
|
||||
* F, G, H and I are basic MD5 functions.
|
||||
*/
|
||||
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
|
||||
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
|
||||
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
||||
#define I(x, y, z) ((y) ^ ((x) | (~z)))
|
||||
|
||||
#define ROTL(x,n,w) ((x << n) | (x >> (w - n)))
|
||||
#define ROTL32(x,n) ROTL(x,n,32) /* 32 bits word */
|
||||
|
||||
#define ROUND1(a, b, c, d, x, s, ac) { \
|
||||
(a) += F((b),(c),(d)) + (x) + (UINT32)(ac); \
|
||||
(a) = ROTL32((a),(s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
#define ROUND2(a, b, c, d, x, s, ac) { \
|
||||
(a) += G((b),(c),(d)) + (x) + (UINT32)(ac); \
|
||||
(a) = ROTL32((a),(s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
#define ROUND3(a, b, c, d, x, s, ac) { \
|
||||
(a) += H((b),(c),(d)) + (x) + (UINT32)(ac); \
|
||||
(a) = ROTL32((a),(s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
#define ROUND4(a, b, c, d, x, s, ac) { \
|
||||
(a) += I((b),(c),(d)) + (x) + (UINT32)(ac); \
|
||||
(a) = ROTL32((a),(s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
static const UINT32 MD5_DefaultHashValue[4] = {
|
||||
0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL
|
||||
};
|
||||
#endif /* MD5_SUPPORT */
|
||||
|
||||
|
||||
#ifdef MD5_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initial Md5_CTX_STRUC
|
||||
|
||||
Arguments:
|
||||
pMD5_CTX Pointer to Md5_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_MD5_Init (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX)
|
||||
{
|
||||
NdisMoveMemory(pMD5_CTX->HashValue, MD5_DefaultHashValue,
|
||||
sizeof(MD5_DefaultHashValue));
|
||||
NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE);
|
||||
pMD5_CTX->BlockLen = 0;
|
||||
pMD5_CTX->MessageLen = 0;
|
||||
} /* End of RT_MD5_Init */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
MD5 computation for one block (512 bits)
|
||||
|
||||
Arguments:
|
||||
pMD5_CTX Pointer to Md5_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
T[i] := floor(abs(sin(i + 1)) * (2 pow 32)), i is number of round
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_MD5_Hash (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX)
|
||||
{
|
||||
UINT32 X_i;
|
||||
UINT32 X[16];
|
||||
UINT32 a,b,c,d;
|
||||
|
||||
/* Prepare the message schedule, {X_i} */
|
||||
NdisMoveMemory(X, pMD5_CTX->Block, MD5_BLOCK_SIZE);
|
||||
for (X_i = 0; X_i < 16; X_i++)
|
||||
X[X_i] = cpu2le32(X[X_i]); /* Endian Swap */
|
||||
/* End of for */
|
||||
|
||||
/* MD5 hash computation */
|
||||
/* Initialize the working variables */
|
||||
a = pMD5_CTX->HashValue[0];
|
||||
b = pMD5_CTX->HashValue[1];
|
||||
c = pMD5_CTX->HashValue[2];
|
||||
d = pMD5_CTX->HashValue[3];
|
||||
|
||||
/*
|
||||
* Round 1
|
||||
* Let [abcd k s i] denote the operation
|
||||
* a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
|
||||
*/
|
||||
ROUND1(a, b, c, d, X[ 0], 7, 0xd76aa478); /* 1 */
|
||||
ROUND1(d, a, b, c, X[ 1], 12, 0xe8c7b756); /* 2 */
|
||||
ROUND1(c, d, a, b, X[ 2], 17, 0x242070db); /* 3 */
|
||||
ROUND1(b, c, d, a, X[ 3], 22, 0xc1bdceee); /* 4 */
|
||||
ROUND1(a, b, c, d, X[ 4], 7, 0xf57c0faf); /* 5 */
|
||||
ROUND1(d, a, b, c, X[ 5], 12, 0x4787c62a); /* 6 */
|
||||
ROUND1(c, d, a, b, X[ 6], 17, 0xa8304613); /* 7 */
|
||||
ROUND1(b, c, d, a, X[ 7], 22, 0xfd469501); /* 8 */
|
||||
ROUND1(a, b, c, d, X[ 8], 7, 0x698098d8); /* 9 */
|
||||
ROUND1(d, a, b, c, X[ 9], 12, 0x8b44f7af); /* 10 */
|
||||
ROUND1(c, d, a, b, X[10], 17, 0xffff5bb1); /* 11 */
|
||||
ROUND1(b, c, d, a, X[11], 22, 0x895cd7be); /* 12 */
|
||||
ROUND1(a, b, c, d, X[12], 7, 0x6b901122); /* 13 */
|
||||
ROUND1(d, a, b, c, X[13], 12, 0xfd987193); /* 14 */
|
||||
ROUND1(c, d, a, b, X[14], 17, 0xa679438e); /* 15 */
|
||||
ROUND1(b, c, d, a, X[15], 22, 0x49b40821); /* 16 */
|
||||
|
||||
/*
|
||||
* Round 2
|
||||
* Let [abcd k s i] denote the operation
|
||||
* a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s)
|
||||
*/
|
||||
ROUND2(a, b, c, d, X[ 1], 5, 0xf61e2562); /* 17 */
|
||||
ROUND2(d, a, b, c, X[ 6], 9, 0xc040b340); /* 18 */
|
||||
ROUND2(c, d, a, b, X[11], 14, 0x265e5a51); /* 19 */
|
||||
ROUND2(b, c, d, a, X[ 0], 20, 0xe9b6c7aa); /* 20 */
|
||||
ROUND2(a, b, c, d, X[ 5], 5, 0xd62f105d); /* 21 */
|
||||
ROUND2(d, a, b, c, X[10], 9, 0x2441453); /* 22 */
|
||||
ROUND2(c, d, a, b, X[15], 14, 0xd8a1e681); /* 23 */
|
||||
ROUND2(b, c, d, a, X[ 4], 20, 0xe7d3fbc8); /* 24 */
|
||||
ROUND2(a, b, c, d, X[ 9], 5, 0x21e1cde6); /* 25 */
|
||||
ROUND2(d, a, b, c, X[14], 9, 0xc33707d6); /* 26 */
|
||||
ROUND2(c, d, a, b, X[ 3], 14, 0xf4d50d87); /* 27 */
|
||||
ROUND2(b, c, d, a, X[ 8], 20, 0x455a14ed); /* 28 */
|
||||
ROUND2(a, b, c, d, X[13], 5, 0xa9e3e905); /* 29 */
|
||||
ROUND2(d, a, b, c, X[ 2], 9, 0xfcefa3f8); /* 30 */
|
||||
ROUND2(c, d, a, b, X[ 7], 14, 0x676f02d9); /* 31 */
|
||||
ROUND2(b, c, d, a, X[12], 20, 0x8d2a4c8a); /* 32 */
|
||||
|
||||
/*
|
||||
* Round 3
|
||||
* Let [abcd k s t] denote the operation
|
||||
* a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s)
|
||||
*/
|
||||
ROUND3(a, b, c, d, X[ 5], 4, 0xfffa3942); /* 33 */
|
||||
ROUND3(d, a, b, c, X[ 8], 11, 0x8771f681); /* 34 */
|
||||
ROUND3(c, d, a, b, X[11], 16, 0x6d9d6122); /* 35 */
|
||||
ROUND3(b, c, d, a, X[14], 23, 0xfde5380c); /* 36 */
|
||||
ROUND3(a, b, c, d, X[ 1], 4, 0xa4beea44); /* 37 */
|
||||
ROUND3(d, a, b, c, X[ 4], 11, 0x4bdecfa9); /* 38 */
|
||||
ROUND3(c, d, a, b, X[ 7], 16, 0xf6bb4b60); /* 39 */
|
||||
ROUND3(b, c, d, a, X[10], 23, 0xbebfbc70); /* 40 */
|
||||
ROUND3(a, b, c, d, X[13], 4, 0x289b7ec6); /* 41 */
|
||||
ROUND3(d, a, b, c, X[ 0], 11, 0xeaa127fa); /* 42 */
|
||||
ROUND3(c, d, a, b, X[ 3], 16, 0xd4ef3085); /* 43 */
|
||||
ROUND3(b, c, d, a, X[ 6], 23, 0x4881d05); /* 44 */
|
||||
ROUND3(a, b, c, d, X[ 9], 4, 0xd9d4d039); /* 45 */
|
||||
ROUND3(d, a, b, c, X[12], 11, 0xe6db99e5); /* 46 */
|
||||
ROUND3(c, d, a, b, X[15], 16, 0x1fa27cf8); /* 47 */
|
||||
ROUND3(b, c, d, a, X[ 2], 23, 0xc4ac5665); /* 48 */
|
||||
|
||||
/*
|
||||
* Round 4
|
||||
* Let [abcd k s t] denote the operation
|
||||
* a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s)
|
||||
*/
|
||||
ROUND4(a, b, c, d, X[ 0], 6, 0xf4292244); /* 49 */
|
||||
ROUND4(d, a, b, c, X[ 7], 10, 0x432aff97); /* 50 */
|
||||
ROUND4(c, d, a, b, X[14], 15, 0xab9423a7); /* 51 */
|
||||
ROUND4(b, c, d, a, X[ 5], 21, 0xfc93a039); /* 52 */
|
||||
ROUND4(a, b, c, d, X[12], 6, 0x655b59c3); /* 53 */
|
||||
ROUND4(d, a, b, c, X[ 3], 10, 0x8f0ccc92); /* 54 */
|
||||
ROUND4(c, d, a, b, X[10], 15, 0xffeff47d); /* 55 */
|
||||
ROUND4(b, c, d, a, X[ 1], 21, 0x85845dd1); /* 56 */
|
||||
ROUND4(a, b, c, d, X[ 8], 6, 0x6fa87e4f); /* 57 */
|
||||
ROUND4(d, a, b, c, X[15], 10, 0xfe2ce6e0); /* 58 */
|
||||
ROUND4(c, d, a, b, X[ 6], 15, 0xa3014314); /* 59 */
|
||||
ROUND4(b, c, d, a, X[13], 21, 0x4e0811a1); /* 60 */
|
||||
ROUND4(a, b, c, d, X[ 4], 6, 0xf7537e82); /* 61 */
|
||||
ROUND4(d, a, b, c, X[11], 10, 0xbd3af235); /* 62 */
|
||||
ROUND4(c, d, a, b, X[ 2], 15, 0x2ad7d2bb); /* 63 */
|
||||
ROUND4(b, c, d, a, X[ 9], 21, 0xeb86d391); /* 64 */
|
||||
|
||||
/* Compute the i^th intermediate hash value H^(i) */
|
||||
pMD5_CTX->HashValue[0] += a;
|
||||
pMD5_CTX->HashValue[1] += b;
|
||||
pMD5_CTX->HashValue[2] += c;
|
||||
pMD5_CTX->HashValue[3] += d;
|
||||
|
||||
NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE);
|
||||
pMD5_CTX->BlockLen = 0;
|
||||
} /* End of RT_MD5_Hash */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
The message is appended to block. If block size > 64 bytes, the MD5_Hash
|
||||
will be called.
|
||||
|
||||
Arguments:
|
||||
pMD5_CTX Pointer to MD5_CTX_STRUC
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_MD5_Append (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen)
|
||||
{
|
||||
UINT appendLen = 0;
|
||||
UINT diffLen = 0;
|
||||
|
||||
while (appendLen != MessageLen) {
|
||||
diffLen = MessageLen - appendLen;
|
||||
if ((pMD5_CTX->BlockLen + diffLen) < MD5_BLOCK_SIZE) {
|
||||
NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen,
|
||||
Message + appendLen, diffLen);
|
||||
pMD5_CTX->BlockLen += diffLen;
|
||||
appendLen += diffLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen,
|
||||
Message + appendLen, MD5_BLOCK_SIZE - pMD5_CTX->BlockLen);
|
||||
appendLen += (MD5_BLOCK_SIZE - pMD5_CTX->BlockLen);
|
||||
pMD5_CTX->BlockLen = MD5_BLOCK_SIZE;
|
||||
RT_MD5_Hash(pMD5_CTX);
|
||||
} /* End of if */
|
||||
} /* End of while */
|
||||
pMD5_CTX->MessageLen += MessageLen;
|
||||
} /* End of RT_MD5_Append */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
1. Append bit 1 to end of the message
|
||||
2. Append the length of message in rightmost 64 bits
|
||||
3. Transform the Hash Value to digest message
|
||||
|
||||
Arguments:
|
||||
pMD5_CTX Pointer to MD5_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_MD5_End (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
UINT index;
|
||||
UINT64 message_length_bits;
|
||||
|
||||
/* append 1 bits to end of the message */
|
||||
NdisFillMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, 1, 0x80);
|
||||
|
||||
/* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */
|
||||
if (pMD5_CTX->BlockLen > 55)
|
||||
RT_MD5_Hash(pMD5_CTX);
|
||||
/* End of if */
|
||||
|
||||
/* Append the length of message in rightmost 64 bits */
|
||||
message_length_bits = pMD5_CTX->MessageLen*8;
|
||||
message_length_bits = cpu2le64(message_length_bits);
|
||||
NdisMoveMemory(&pMD5_CTX->Block[56], &message_length_bits, 8);
|
||||
RT_MD5_Hash(pMD5_CTX);
|
||||
|
||||
/* Return message digest, transform the UINT32 hash value to bytes */
|
||||
for (index = 0; index < 4;index++)
|
||||
pMD5_CTX->HashValue[index] = cpu2le32(pMD5_CTX->HashValue[index]);
|
||||
/* End of for */
|
||||
NdisMoveMemory(DigestMessage, pMD5_CTX->HashValue, MD5_DIGEST_SIZE);
|
||||
} /* End of RT_MD5_End */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
MD5 algorithm
|
||||
|
||||
Arguments:
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_MD5 (
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
MD5_CTX_STRUC md5_ctx;
|
||||
|
||||
NdisZeroMemory(&md5_ctx, sizeof(MD5_CTX_STRUC));
|
||||
RT_MD5_Init(&md5_ctx);
|
||||
RT_MD5_Append(&md5_ctx, Message, MessageLen);
|
||||
RT_MD5_End(&md5_ctx, DigestMessage);
|
||||
} /* End of RT_MD5 */
|
||||
|
||||
#endif /* MD5_SUPPORT */
|
||||
|
||||
|
||||
/* End of crypt_md5.c */
|
||||
|
@ -0,0 +1,849 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
Module Name:
|
||||
SHA2
|
||||
|
||||
Abstract:
|
||||
FIPS 180-2: Secure Hash Standard (SHS)
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ------------------------------------------
|
||||
Eddy 2008/11/24 Create SHA1
|
||||
Eddy 2008/07/23 Create SHA256
|
||||
***************************************************************************/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
/* Basic operations */
|
||||
#define SHR(x,n) (x >> n) /* SHR(x)^n, right shift n bits , x is w-bit word, 0 <= n <= w */
|
||||
#define ROTR(x,n,w) ((x >> n) | (x << (w - n))) /* ROTR(x)^n, circular right shift n bits , x is w-bit word, 0 <= n <= w */
|
||||
#define ROTL(x,n,w) ((x << n) | (x >> (w - n))) /* ROTL(x)^n, circular left shift n bits , x is w-bit word, 0 <= n <= w */
|
||||
#define ROTR32(x,n) ROTR(x,n,32) /* 32 bits word */
|
||||
#define ROTL32(x,n) ROTL(x,n,32) /* 32 bits word */
|
||||
#if defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT)
|
||||
#define ROTR64(x, n) ROTR(x, n, 64) /* 64 bits word */
|
||||
#define ROTL64(x, n) ROTL(x, n, 64) /* 64 bits word */
|
||||
#endif
|
||||
|
||||
/* Basic functions */
|
||||
#define Ch(x,y,z) ((x & y) ^ ((~x) & z))
|
||||
#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
|
||||
#define Parity(x,y,z) (x ^ y ^ z)
|
||||
|
||||
#ifdef SHA1_SUPPORT
|
||||
/* SHA1 constants */
|
||||
#define SHA1_MASK 0x0000000f
|
||||
static const UINT32 SHA1_K[4] = {
|
||||
0x5a827999UL, 0x6ed9eba1UL, 0x8f1bbcdcUL, 0xca62c1d6UL
|
||||
};
|
||||
static const UINT32 SHA1_DefaultHashValue[5] = {
|
||||
0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL, 0xc3d2e1f0UL
|
||||
};
|
||||
#endif /* SHA1_SUPPORT */
|
||||
|
||||
|
||||
#ifdef SHA256_SUPPORT
|
||||
/* SHA256 functions */
|
||||
#define Zsigma_256_0(x) (ROTR32(x,2) ^ ROTR32(x,13) ^ ROTR32(x,22))
|
||||
#define Zsigma_256_1(x) (ROTR32(x,6) ^ ROTR32(x,11) ^ ROTR32(x,25))
|
||||
#define Sigma_256_0(x) (ROTR32(x,7) ^ ROTR32(x,18) ^ SHR(x,3))
|
||||
#define Sigma_256_1(x) (ROTR32(x,17) ^ ROTR32(x,19) ^ SHR(x,10))
|
||||
/* SHA256 constants */
|
||||
static const UINT32 SHA256_K[64] = {
|
||||
0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
|
||||
0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
|
||||
0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
|
||||
0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
|
||||
0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
|
||||
0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
|
||||
0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
|
||||
0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
|
||||
0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
|
||||
0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
|
||||
0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
|
||||
0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
|
||||
0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
|
||||
0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
|
||||
0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
|
||||
0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
|
||||
};
|
||||
static const UINT32 SHA256_DefaultHashValue[8] = {
|
||||
0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL,
|
||||
0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL
|
||||
};
|
||||
#endif /* SHA256_SUPPORT */
|
||||
|
||||
#if defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT)
|
||||
#ifdef SHA384_SUPPORT
|
||||
/* SHA384 functions */
|
||||
#define Zsigma_512_0(x) (ROTR64(x, 28) ^ ROTR64(x, 34) ^ ROTR64(x, 39))
|
||||
#define Zsigma_512_1(x) (ROTR64(x, 14) ^ ROTR64(x, 18) ^ ROTR64(x, 41))
|
||||
#define Sigma_512_0(x) (ROTR64(x, 1) ^ ROTR64(x, 8) ^ SHR(x, 7))
|
||||
#define Sigma_512_1(x) (ROTR64(x, 19) ^ ROTR64(x, 61) ^ SHR(x, 6))
|
||||
/* SHA384 constants */
|
||||
static const UINT64 SHA384_K[80] = {
|
||||
0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,
|
||||
0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,
|
||||
0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,
|
||||
0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,
|
||||
0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
|
||||
0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,
|
||||
0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,
|
||||
0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,
|
||||
0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,
|
||||
0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
|
||||
0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,
|
||||
0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,
|
||||
0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,
|
||||
0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,
|
||||
0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
|
||||
0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,
|
||||
0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,
|
||||
0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,
|
||||
0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,
|
||||
0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
|
||||
};
|
||||
static const UINT64 SHA384_DefaultHashValue[8] = {
|
||||
0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939,
|
||||
0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4
|
||||
};
|
||||
#endif /* SHA384_SUPPORT */
|
||||
#endif
|
||||
|
||||
#ifdef SHA1_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initial SHA1_CTX_STRUC
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA1_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA1_Init (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX)
|
||||
{
|
||||
NdisMoveMemory(pSHA_CTX->HashValue, SHA1_DefaultHashValue,
|
||||
sizeof(SHA1_DefaultHashValue));
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE);
|
||||
pSHA_CTX->MessageLen = 0;
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of RT_SHA1_Init */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA1 computation for one block (512 bits)
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA1_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA1_Hash (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX)
|
||||
{
|
||||
UINT32 W_i,t;
|
||||
UINT32 W[80];
|
||||
UINT32 a,b,c,d,e,T,f_t = 0;
|
||||
|
||||
/* Prepare the message schedule, {W_i}, 0 < t < 15 */
|
||||
NdisMoveMemory(W, pSHA_CTX->Block, SHA1_BLOCK_SIZE);
|
||||
for (W_i = 0; W_i < 16; W_i++) {
|
||||
W[W_i] = cpu2be32(W[W_i]); /* Endian Swap */
|
||||
} /* End of for */
|
||||
|
||||
for (W_i = 16; W_i < 80; W_i++) {
|
||||
W[W_i] = ROTL32((W[W_i - 3] ^ W[W_i - 8] ^ W[W_i - 14] ^ W[W_i - 16]),1);
|
||||
} /* End of for */
|
||||
|
||||
|
||||
/* SHA256 hash computation */
|
||||
/* Initialize the working variables */
|
||||
a = pSHA_CTX->HashValue[0];
|
||||
b = pSHA_CTX->HashValue[1];
|
||||
c = pSHA_CTX->HashValue[2];
|
||||
d = pSHA_CTX->HashValue[3];
|
||||
e = pSHA_CTX->HashValue[4];
|
||||
|
||||
/* 80 rounds */
|
||||
for (t = 0;t < 20;t++) {
|
||||
f_t = Ch(b,c,d);
|
||||
T = ROTL32(a,5) + f_t + e + SHA1_K[0] + W[t];
|
||||
e = d;
|
||||
d = c;
|
||||
c = ROTL32(b,30);
|
||||
b = a;
|
||||
a = T;
|
||||
} /* End of for */
|
||||
for (t = 20;t < 40;t++) {
|
||||
f_t = Parity(b,c,d);
|
||||
T = ROTL32(a,5) + f_t + e + SHA1_K[1] + W[t];
|
||||
e = d;
|
||||
d = c;
|
||||
c = ROTL32(b,30);
|
||||
b = a;
|
||||
a = T;
|
||||
} /* End of for */
|
||||
for (t = 40;t < 60;t++) {
|
||||
f_t = Maj(b,c,d);
|
||||
T = ROTL32(a,5) + f_t + e + SHA1_K[2] + W[t];
|
||||
e = d;
|
||||
d = c;
|
||||
c = ROTL32(b,30);
|
||||
b = a;
|
||||
a = T;
|
||||
} /* End of for */
|
||||
for (t = 60;t < 80;t++) {
|
||||
f_t = Parity(b,c,d);
|
||||
T = ROTL32(a,5) + f_t + e + SHA1_K[3] + W[t];
|
||||
e = d;
|
||||
d = c;
|
||||
c = ROTL32(b,30);
|
||||
b = a;
|
||||
a = T;
|
||||
} /* End of for */
|
||||
|
||||
|
||||
/* Compute the i^th intermediate hash value H^(i) */
|
||||
pSHA_CTX->HashValue[0] += a;
|
||||
pSHA_CTX->HashValue[1] += b;
|
||||
pSHA_CTX->HashValue[2] += c;
|
||||
pSHA_CTX->HashValue[3] += d;
|
||||
pSHA_CTX->HashValue[4] += e;
|
||||
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE);
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of RT_SHA1_Hash */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
The message is appended to block. If block size > 64 bytes, the SHA1_Hash
|
||||
will be called.
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA1_CTX_STRUC
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA1_Append (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen)
|
||||
{
|
||||
UINT appendLen = 0;
|
||||
UINT diffLen = 0;
|
||||
|
||||
while (appendLen != MessageLen) {
|
||||
diffLen = MessageLen - appendLen;
|
||||
if ((pSHA_CTX->BlockLen + diffLen) < SHA1_BLOCK_SIZE) {
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, diffLen);
|
||||
pSHA_CTX->BlockLen += diffLen;
|
||||
appendLen += diffLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
appendLen += (SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
pSHA_CTX->BlockLen = SHA1_BLOCK_SIZE;
|
||||
RT_SHA1_Hash(pSHA_CTX);
|
||||
} /* End of if */
|
||||
} /* End of while */
|
||||
pSHA_CTX->MessageLen += MessageLen;
|
||||
} /* End of RT_SHA1_Append */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
1. Append bit 1 to end of the message
|
||||
2. Append the length of message in rightmost 64 bits
|
||||
3. Transform the Hash Value to digest message
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA1_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA1_End (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
UINT index;
|
||||
UINT64 message_length_bits;
|
||||
|
||||
/* Append bit 1 to end of the message */
|
||||
NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80);
|
||||
|
||||
/* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */
|
||||
if (pSHA_CTX->BlockLen > 55)
|
||||
RT_SHA1_Hash(pSHA_CTX);
|
||||
/* End of if */
|
||||
|
||||
/* Append the length of message in rightmost 64 bits */
|
||||
message_length_bits = pSHA_CTX->MessageLen*8;
|
||||
message_length_bits = cpu2be64(message_length_bits);
|
||||
NdisMoveMemory(&pSHA_CTX->Block[56], &message_length_bits, 8);
|
||||
RT_SHA1_Hash(pSHA_CTX);
|
||||
|
||||
/* Return message digest, transform the UINT32 hash value to bytes */
|
||||
for (index = 0; index < 5;index++)
|
||||
pSHA_CTX->HashValue[index] = cpu2be32(pSHA_CTX->HashValue[index]);
|
||||
/* End of for */
|
||||
NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA1_DIGEST_SIZE);
|
||||
} /* End of RT_SHA1_End */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA1 algorithm
|
||||
|
||||
Arguments:
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA1 (
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
|
||||
SHA1_CTX_STRUC sha_ctx;
|
||||
|
||||
NdisZeroMemory(&sha_ctx, sizeof(SHA1_CTX_STRUC));
|
||||
RT_SHA1_Init(&sha_ctx);
|
||||
RT_SHA1_Append(&sha_ctx, Message, MessageLen);
|
||||
RT_SHA1_End(&sha_ctx, DigestMessage);
|
||||
} /* End of RT_SHA1 */
|
||||
#endif /* SHA1_SUPPORT */
|
||||
|
||||
|
||||
#ifdef SHA256_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initial SHA256_CTX_STRUC
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA256_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA256_Init (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX)
|
||||
{
|
||||
NdisMoveMemory(pSHA_CTX->HashValue, SHA256_DefaultHashValue,
|
||||
sizeof(SHA256_DefaultHashValue));
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA256_BLOCK_SIZE);
|
||||
pSHA_CTX->MessageLen = 0;
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of RT_SHA256_Init */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA256 computation for one block (512 bits)
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA256_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA256_Hash (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX)
|
||||
{
|
||||
UINT32 W_i,t;
|
||||
UINT32 W[64];
|
||||
UINT32 a,b,c,d,e,f,g,h,T1,T2;
|
||||
|
||||
/* Prepare the message schedule, {W_i}, 0 < t < 15 */
|
||||
NdisMoveMemory(W, pSHA_CTX->Block, SHA256_BLOCK_SIZE);
|
||||
for (W_i = 0; W_i < 16; W_i++)
|
||||
W[W_i] = cpu2be32(W[W_i]); /* Endian Swap */
|
||||
/* End of for */
|
||||
|
||||
/* SHA256 hash computation */
|
||||
/* Initialize the working variables */
|
||||
a = pSHA_CTX->HashValue[0];
|
||||
b = pSHA_CTX->HashValue[1];
|
||||
c = pSHA_CTX->HashValue[2];
|
||||
d = pSHA_CTX->HashValue[3];
|
||||
e = pSHA_CTX->HashValue[4];
|
||||
f = pSHA_CTX->HashValue[5];
|
||||
g = pSHA_CTX->HashValue[6];
|
||||
h = pSHA_CTX->HashValue[7];
|
||||
|
||||
/* 64 rounds */
|
||||
for (t = 0;t < 64;t++) {
|
||||
if (t > 15) /* Prepare the message schedule, {W_i}, 16 < t < 63 */
|
||||
W[t] = Sigma_256_1(W[t-2]) + W[t-7] + Sigma_256_0(W[t-15]) + W[t-16];
|
||||
/* End of if */
|
||||
T1 = h + Zsigma_256_1(e) + Ch(e,f,g) + SHA256_K[t] + W[t];
|
||||
T2 = Zsigma_256_0(a) + Maj(a,b,c);
|
||||
h = g;
|
||||
g = f;
|
||||
f = e;
|
||||
e = d + T1;
|
||||
d = c;
|
||||
c = b;
|
||||
b = a;
|
||||
a = T1 + T2;
|
||||
} /* End of for */
|
||||
|
||||
/* Compute the i^th intermediate hash value H^(i) */
|
||||
pSHA_CTX->HashValue[0] += a;
|
||||
pSHA_CTX->HashValue[1] += b;
|
||||
pSHA_CTX->HashValue[2] += c;
|
||||
pSHA_CTX->HashValue[3] += d;
|
||||
pSHA_CTX->HashValue[4] += e;
|
||||
pSHA_CTX->HashValue[5] += f;
|
||||
pSHA_CTX->HashValue[6] += g;
|
||||
pSHA_CTX->HashValue[7] += h;
|
||||
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA256_BLOCK_SIZE);
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of RT_SHA256_Hash */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
The message is appended to block. If block size > 64 bytes, the SHA256_Hash
|
||||
will be called.
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA256_CTX_STRUC
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA256_Append (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen)
|
||||
{
|
||||
UINT appendLen = 0;
|
||||
UINT diffLen = 0;
|
||||
|
||||
while (appendLen != MessageLen) {
|
||||
diffLen = MessageLen - appendLen;
|
||||
if ((pSHA_CTX->BlockLen + diffLen) < SHA256_BLOCK_SIZE) {
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, diffLen);
|
||||
pSHA_CTX->BlockLen += diffLen;
|
||||
appendLen += diffLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, SHA256_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
appendLen += (SHA256_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
pSHA_CTX->BlockLen = SHA256_BLOCK_SIZE;
|
||||
RT_SHA256_Hash(pSHA_CTX);
|
||||
} /* End of if */
|
||||
} /* End of while */
|
||||
pSHA_CTX->MessageLen += MessageLen;
|
||||
} /* End of RT_SHA256_Append */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
1. Append bit 1 to end of the message
|
||||
2. Append the length of message in rightmost 64 bits
|
||||
3. Transform the Hash Value to digest message
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA256_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA256_End (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
UINT index;
|
||||
UINT64 message_length_bits;
|
||||
|
||||
/* Append bit 1 to end of the message */
|
||||
NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80);
|
||||
|
||||
/* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */
|
||||
if (pSHA_CTX->BlockLen > 55)
|
||||
RT_SHA256_Hash(pSHA_CTX);
|
||||
/* End of if */
|
||||
|
||||
/* Append the length of message in rightmost 64 bits */
|
||||
message_length_bits = pSHA_CTX->MessageLen*8;
|
||||
message_length_bits = cpu2be64(message_length_bits);
|
||||
NdisMoveMemory(&pSHA_CTX->Block[56], &message_length_bits, 8);
|
||||
RT_SHA256_Hash(pSHA_CTX);
|
||||
|
||||
/* Return message digest, transform the UINT32 hash value to bytes */
|
||||
for (index = 0; index < 8;index++)
|
||||
pSHA_CTX->HashValue[index] = cpu2be32(pSHA_CTX->HashValue[index]);
|
||||
/* End of for */
|
||||
NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA256_DIGEST_SIZE);
|
||||
} /* End of RT_SHA256_End */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA256 algorithm
|
||||
|
||||
Arguments:
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA256 (
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
SHA256_CTX_STRUC sha_ctx;
|
||||
|
||||
NdisZeroMemory(&sha_ctx, sizeof(SHA256_CTX_STRUC));
|
||||
RT_SHA256_Init(&sha_ctx);
|
||||
RT_SHA256_Append(&sha_ctx, Message, MessageLen);
|
||||
RT_SHA256_End(&sha_ctx, DigestMessage);
|
||||
} /* End of RT_SHA256 */
|
||||
#if defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT)
|
||||
VOID rt_sha256_vector(
|
||||
IN UCHAR num,
|
||||
IN const unsigned char **message,
|
||||
IN UINT *messageLen,
|
||||
OUT UINT8 *digestmessage)
|
||||
{
|
||||
SHA256_CTX_STRUC sha_ctx;
|
||||
UCHAR i;
|
||||
|
||||
NdisZeroMemory(&sha_ctx, sizeof(SHA256_CTX_STRUC));
|
||||
RT_SHA256_Init(&sha_ctx);
|
||||
for (i = 0; i < num; i++)
|
||||
RT_SHA256_Append(&sha_ctx, message[i], messageLen[i]);
|
||||
RT_SHA256_End(&sha_ctx, digestmessage);
|
||||
}
|
||||
#endif /* defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT) */
|
||||
#endif /* SHA256_SUPPORT */
|
||||
|
||||
#if defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT)
|
||||
#ifdef SHA384_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initial SHA384_CTX_STRUC
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA384_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA384_Init(
|
||||
IN SHA384_CTX_STRUC * pSHA_CTX)
|
||||
{
|
||||
NdisMoveMemory(pSHA_CTX->HashValue, SHA384_DefaultHashValue, sizeof(SHA384_DefaultHashValue));
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA384_BLOCK_SIZE);
|
||||
pSHA_CTX->MessageLen = 0;
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of RT_SHA384_Init */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA384 computation for one block (1024 bits)
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA384_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA384_Hash(
|
||||
IN SHA384_CTX_STRUC * pSHA_CTX)
|
||||
{
|
||||
UINT32 W_i, t;
|
||||
UINT64 W[80];
|
||||
UINT64 a, b, c, d, e, f, g, h, T1, T2;
|
||||
/* Prepare the message schedule, {W_i}, 0 < t < 15 */
|
||||
NdisMoveMemory(W, pSHA_CTX->Block, SHA384_BLOCK_SIZE);
|
||||
|
||||
for (W_i = 0; W_i < 16; W_i++)
|
||||
W[W_i] = cpu2be64(W[W_i]); /* Endian Swap */
|
||||
|
||||
/* End of for */
|
||||
/* SHA384 hash computation */
|
||||
/* Initialize the working variables */
|
||||
a = pSHA_CTX->HashValue[0];
|
||||
b = pSHA_CTX->HashValue[1];
|
||||
c = pSHA_CTX->HashValue[2];
|
||||
d = pSHA_CTX->HashValue[3];
|
||||
e = pSHA_CTX->HashValue[4];
|
||||
f = pSHA_CTX->HashValue[5];
|
||||
g = pSHA_CTX->HashValue[6];
|
||||
h = pSHA_CTX->HashValue[7];
|
||||
|
||||
/* 64 rounds */
|
||||
for (t = 0; t < 80; t++) {
|
||||
if (t > 15) /* Prepare the message schedule, {W_i}, 16 < t < 79 */
|
||||
W[t] = Sigma_512_1(W[t-2]) + W[t-7] + Sigma_512_0(W[t-15]) + W[t-16];
|
||||
|
||||
T1 = h + Zsigma_512_1(e) + Ch(e, f, g) + SHA384_K[t] + W[t];
|
||||
T2 = Zsigma_512_0(a) + Maj(a, b, c);
|
||||
h = g;
|
||||
g = f;
|
||||
f = e;
|
||||
e = d + T1;
|
||||
d = c;
|
||||
c = b;
|
||||
b = a;
|
||||
a = T1 + T2;
|
||||
} /* End of for */
|
||||
|
||||
/* Compute the i^th intermediate hash value H^(i) */
|
||||
pSHA_CTX->HashValue[0] += a;
|
||||
pSHA_CTX->HashValue[1] += b;
|
||||
pSHA_CTX->HashValue[2] += c;
|
||||
pSHA_CTX->HashValue[3] += d;
|
||||
pSHA_CTX->HashValue[4] += e;
|
||||
pSHA_CTX->HashValue[5] += f;
|
||||
pSHA_CTX->HashValue[6] += g;
|
||||
pSHA_CTX->HashValue[7] += h;
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA384_BLOCK_SIZE);
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of RT_SHA384_Hash */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
The message is appended to block. If block size > 128 bytes, the SHA384_Hash
|
||||
will be called.
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA384_CTX_STRUC
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA384_Append(
|
||||
IN SHA384_CTX_STRUC * pSHA_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen)
|
||||
{
|
||||
UINT appendLen = 0;
|
||||
UINT diffLen = 0;
|
||||
|
||||
while (appendLen != MessageLen) {
|
||||
diffLen = MessageLen - appendLen;
|
||||
|
||||
if ((pSHA_CTX->BlockLen + diffLen) < SHA384_BLOCK_SIZE) {
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, diffLen);
|
||||
pSHA_CTX->BlockLen += diffLen;
|
||||
appendLen += diffLen;
|
||||
} else {
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, SHA384_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
appendLen += (SHA384_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
pSHA_CTX->BlockLen = SHA384_BLOCK_SIZE;
|
||||
RT_SHA384_Hash(pSHA_CTX);
|
||||
} /* End of if */
|
||||
} /* End of while */
|
||||
|
||||
pSHA_CTX->MessageLen += MessageLen;
|
||||
} /* End of RT_SHA384_Append */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
1. Append bit 1 to end of the message
|
||||
2. Append the length of message in rightmost 128 bits
|
||||
3. Transform the Hash Value to digest message
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA384_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA384_End(
|
||||
IN SHA384_CTX_STRUC * pSHA_CTX,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
UINT index;
|
||||
UINT64 message_length_bits;
|
||||
/* Append bit 1 to end of the message */
|
||||
NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80);
|
||||
|
||||
/* 119 = 128(SHA256_BLOCK_SIZE) - 16 - 1: append 1 bit(1 byte) and message length (16 bytes) */
|
||||
if (pSHA_CTX->BlockLen > 119)
|
||||
RT_SHA384_Hash(pSHA_CTX);
|
||||
|
||||
/* End of if */
|
||||
/* Append the length of message in rightmost 128 bits */
|
||||
message_length_bits = pSHA_CTX->MessageLen*8;
|
||||
message_length_bits = cpu2be64(message_length_bits);
|
||||
NdisMoveMemory(&pSHA_CTX->Block[120], &message_length_bits, 8);
|
||||
RT_SHA384_Hash(pSHA_CTX);
|
||||
|
||||
/* Return message digest, transform the UINT64 hash value to bytes */
|
||||
for (index = 0; index < 8; index++)
|
||||
pSHA_CTX->HashValue[index] = cpu2be64(pSHA_CTX->HashValue[index]);
|
||||
|
||||
/* End of for */
|
||||
NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA384_DIGEST_SIZE);
|
||||
} /* End of RT_SHA384_End */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA384 algorithm
|
||||
|
||||
Arguments:
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA384(
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
SHA384_CTX_STRUC sha_ctx;
|
||||
|
||||
NdisZeroMemory(&sha_ctx, sizeof(SHA384_CTX_STRUC));
|
||||
RT_SHA384_Init(&sha_ctx);
|
||||
RT_SHA384_Append(&sha_ctx, Message, MessageLen);
|
||||
RT_SHA384_End(&sha_ctx, DigestMessage);
|
||||
} /* End of RT_SHA384 */
|
||||
|
||||
VOID rt_sha384_vector(
|
||||
IN UCHAR num,
|
||||
IN const unsigned char **message,
|
||||
IN UINT *messageLen,
|
||||
OUT UINT8 *digestmessage)
|
||||
{
|
||||
SHA384_CTX_STRUC sha_ctx;
|
||||
UCHAR i;
|
||||
|
||||
NdisZeroMemory(&sha_ctx, sizeof(SHA384_CTX_STRUC));
|
||||
RT_SHA384_Init(&sha_ctx);
|
||||
for (i = 0; i < num; i++)
|
||||
RT_SHA384_Append(&sha_ctx, message[i], messageLen[i]);
|
||||
RT_SHA384_End(&sha_ctx, digestmessage);
|
||||
}
|
||||
|
||||
#endif /* SHA384_SUPPORT */
|
||||
#endif /* defined(DOT11_SAE_SUPPORT) || defined(CONFIG_OWE_SUPPORT) */
|
||||
|
||||
/* End of crypt_sha2.c */
|
||||
|
1178
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/ecc.c
Normal file
1178
package/lean/mt/drivers/mt7603e/src/mt7603_wifi/common/ecc.c
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user